PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
hsm_types.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2021-2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
17#pragma once
18
19#include <chrono>
20#include <cstddef>
21#include <optional>
22#include <string>
23#include <string_view>
24#include <vector>
25
26namespace kcenon::pacs::storage {
27
37enum class storage_tier {
39 hot,
40
42 warm,
43
45 cold
46};
47
53[[nodiscard]] constexpr auto to_string(storage_tier tier) noexcept
54 -> std::string_view {
55 switch (tier) {
57 return "hot";
59 return "warm";
61 return "cold";
62 }
63 return "unknown";
64}
65
71[[nodiscard]] constexpr auto storage_tier_from_string(std::string_view str)
72 -> std::optional<storage_tier> {
73 if (str == "hot") {
74 return storage_tier::hot;
75 }
76 if (str == "warm") {
77 return storage_tier::warm;
78 }
79 if (str == "cold") {
80 return storage_tier::cold;
81 }
82 return std::nullopt;
83}
84
105 std::chrono::days hot_to_warm{30};
106
109 std::chrono::days warm_to_cold{365};
110
113 bool auto_migrate{true};
114
118 std::size_t min_migration_size{0};
119
123 std::size_t max_instances_per_cycle{100};
124
127 std::size_t max_bytes_per_cycle{10ULL * 1024 * 1024 * 1024};
128
132 [[nodiscard]] auto operator==(const tier_policy& other) const noexcept
133 -> bool = default;
134};
135
144 std::string sop_instance_uid;
145
148
150 std::chrono::system_clock::time_point stored_at{
151 std::chrono::system_clock::now()};
152
155 std::optional<std::chrono::system_clock::time_point> last_accessed;
156
158 std::size_t size_bytes{0};
159
162
165
170 [[nodiscard]] auto age() const -> std::chrono::system_clock::duration {
171 return std::chrono::system_clock::now() - stored_at;
172 }
173
178 [[nodiscard]] auto time_since_access() const
179 -> std::chrono::system_clock::duration {
180 if (last_accessed.has_value()) {
181 return std::chrono::system_clock::now() - *last_accessed;
182 }
183 return age();
184 }
185
192 [[nodiscard]] auto should_migrate(const tier_policy& policy,
193 storage_tier target_tier) const -> bool {
194 // Can only migrate to a "colder" tier
195 if (target_tier <= current_tier) {
196 return false;
197 }
198
199 // Check size threshold
200 if (size_bytes < policy.min_migration_size) {
201 return false;
202 }
203
204 auto time_inactive = time_since_access();
205
206 // Check if instance has been inactive long enough
208 target_tier == storage_tier::warm) {
209 return time_inactive >= policy.hot_to_warm;
210 }
211
213 target_tier == storage_tier::cold) {
214 return time_inactive >= policy.warm_to_cold;
215 }
216
217 // Hot directly to cold (must meet both thresholds)
219 target_tier == storage_tier::cold) {
220 return time_inactive >= (policy.hot_to_warm + policy.warm_to_cold);
221 }
222
223 return false;
224 }
225};
226
232 std::size_t instances_migrated{0};
233
235 std::size_t bytes_migrated{0};
236
238 std::chrono::milliseconds duration{0};
239
241 std::vector<std::string> failed_uids;
242
244 std::size_t instances_skipped{0};
245
250 [[nodiscard]] auto is_success() const noexcept -> bool {
251 return failed_uids.empty();
252 }
253
257 [[nodiscard]] auto total_processed() const noexcept -> std::size_t {
259 }
260};
261
267 std::size_t instance_count{0};
268
270 std::size_t total_bytes{0};
271
273 std::size_t study_count{0};
274
276 std::size_t series_count{0};
277};
278
285
288
291
295 [[nodiscard]] auto total_instances() const noexcept -> std::size_t {
297 }
298
302 [[nodiscard]] auto total_bytes() const noexcept -> std::size_t {
304 }
305};
306
307} // namespace kcenon::pacs::storage
constexpr auto storage_tier_from_string(std::string_view str) -> std::optional< storage_tier >
Parse storage_tier from string.
Definition hsm_types.h:71
storage_tier
Storage tier classification.
Definition hsm_types.h:37
@ hot
Hot tier - Recent, frequently accessed data (SSD/NVMe)
@ cold
Cold tier - Archive, rarely accessed data (S3/Glacier)
@ warm
Warm tier - Older, occasionally accessed data (HDD)
auto to_string(annotation_type type) -> std::string
Convert annotation_type to string.
Combined statistics for all HSM tiers.
Definition hsm_types.h:282
tier_statistics cold
Statistics for cold tier.
Definition hsm_types.h:290
auto total_bytes() const noexcept -> std::size_t
Get total bytes across all tiers.
Definition hsm_types.h:302
tier_statistics warm
Statistics for warm tier.
Definition hsm_types.h:287
tier_statistics hot
Statistics for hot tier.
Definition hsm_types.h:284
auto total_instances() const noexcept -> std::size_t
Get total instance count across all tiers.
Definition hsm_types.h:295
Result of a migration operation.
Definition hsm_types.h:230
std::chrono::milliseconds duration
Duration of the migration operation.
Definition hsm_types.h:238
std::size_t bytes_migrated
Total bytes migrated.
Definition hsm_types.h:235
auto is_success() const noexcept -> bool
Check if the migration was completely successful.
Definition hsm_types.h:250
std::size_t instances_migrated
Number of instances successfully migrated.
Definition hsm_types.h:232
std::size_t instances_skipped
Number of instances that were skipped (not eligible)
Definition hsm_types.h:244
std::vector< std::string > failed_uids
SOP Instance UIDs that failed to migrate.
Definition hsm_types.h:241
auto total_processed() const noexcept -> std::size_t
Get the total number of instances processed.
Definition hsm_types.h:257
Metadata for tracking instance tier location.
Definition hsm_types.h:142
auto should_migrate(const tier_policy &policy, storage_tier target_tier) const -> bool
Check if instance is eligible for migration to a target tier.
Definition hsm_types.h:192
std::size_t size_bytes
Size of the instance in bytes.
Definition hsm_types.h:158
auto time_since_access() const -> std::chrono::system_clock::duration
Get the time since last access.
Definition hsm_types.h:178
std::string series_instance_uid
Series Instance UID (for grouping migrations)
Definition hsm_types.h:164
std::string study_instance_uid
Study Instance UID (for grouping migrations)
Definition hsm_types.h:161
std::string sop_instance_uid
SOP Instance UID of the DICOM instance.
Definition hsm_types.h:144
std::optional< std::chrono::system_clock::time_point > last_accessed
Timestamp of last access (retrieve operation) nullopt if never accessed after initial storage.
Definition hsm_types.h:155
auto age() const -> std::chrono::system_clock::duration
Get the age of the instance (time since storage)
Definition hsm_types.h:170
std::chrono::system_clock::time_point stored_at
Timestamp when instance was stored.
Definition hsm_types.h:150
storage_tier current_tier
Current storage tier.
Definition hsm_types.h:147
std::chrono::days hot_to_warm
Time threshold for migrating from hot to warm tier Default: 30 days.
Definition hsm_types.h:105
auto operator==(const tier_policy &other) const noexcept -> bool=default
Check if two policies are equal.
std::size_t max_bytes_per_cycle
Maximum bytes to migrate per cycle Default: 10 GB.
Definition hsm_types.h:127
std::chrono::days warm_to_cold
Time threshold for migrating from warm to cold tier Default: 365 days (1 year)
Definition hsm_types.h:109
std::size_t min_migration_size
Minimum size in bytes for an instance to be considered for migration Smaller instances may not be wor...
Definition hsm_types.h:118
bool auto_migrate
Enable automatic background migration When false, migration must be triggered manually.
Definition hsm_types.h:113
std::size_t max_instances_per_cycle
Maximum number of instances to migrate per cycle Prevents overwhelming the storage system Default: 10...
Definition hsm_types.h:123
Statistics for a single storage tier.
Definition hsm_types.h:265
std::size_t instance_count
Number of instances in this tier.
Definition hsm_types.h:267
std::size_t series_count
Number of unique series in this tier.
Definition hsm_types.h:276
std::size_t total_bytes
Total bytes stored in this tier.
Definition hsm_types.h:270
std::size_t study_count
Number of unique studies in this tier.
Definition hsm_types.h:273