PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
hsm_storage.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
18#pragma once
19
20#include "hsm_types.h"
21#include "storage_interface.h"
22
23#include <memory>
24#include <shared_mutex>
25#include <unordered_map>
26
27namespace kcenon::pacs::storage {
28
47
88public:
89 // =========================================================================
90 // Construction
91 // =========================================================================
92
106 hsm_storage(std::unique_ptr<storage_interface> hot_tier,
107 std::unique_ptr<storage_interface> warm_tier,
108 std::unique_ptr<storage_interface> cold_tier,
109 const hsm_storage_config& config = {});
110
114 ~hsm_storage() override = default;
115
117 hsm_storage(const hsm_storage&) = delete;
119
123
124 // =========================================================================
125 // storage_interface Implementation
126 // =========================================================================
127
137 [[nodiscard]] auto store(const core::dicom_dataset& dataset)
138 -> VoidResult override;
139
149 [[nodiscard]] auto retrieve(std::string_view sop_instance_uid)
150 -> Result<core::dicom_dataset> override;
151
160 [[nodiscard]] auto remove(std::string_view sop_instance_uid)
161 -> VoidResult override;
162
169 [[nodiscard]] auto exists(std::string_view sop_instance_uid) const
170 -> bool override;
171
180 [[nodiscard]] auto find(const core::dicom_dataset& query)
182
188 [[nodiscard]] auto get_statistics() const -> storage_statistics override;
189
197 [[nodiscard]] auto verify_integrity() -> VoidResult override;
198
199 // =========================================================================
200 // HSM-specific Operations
201 // =========================================================================
202
209 [[nodiscard]] auto get_tier(std::string_view sop_instance_uid) const
210 -> std::optional<storage_tier>;
211
218 [[nodiscard]] auto get_tier_metadata(std::string_view sop_instance_uid) const
219 -> std::optional<tier_metadata>;
220
231 [[nodiscard]] auto migrate(std::string_view sop_instance_uid,
232 storage_tier target_tier) -> VoidResult;
233
243 [[nodiscard]] auto get_migration_candidates(storage_tier from_tier,
244 storage_tier to_tier) const
245 -> std::vector<tier_metadata>;
246
254 [[nodiscard]] auto run_migration_cycle() -> migration_result;
255
261 [[nodiscard]] auto get_tier_policy() const -> tier_policy;
262
268 void set_tier_policy(const tier_policy& policy);
269
275 [[nodiscard]] auto get_hsm_statistics() const -> hsm_statistics;
276
283 [[nodiscard]] auto get_tier_storage(storage_tier tier) const
285
286private:
287 // =========================================================================
288 // Internal Helper Methods
289 // =========================================================================
290
296 [[nodiscard]] auto find_tier(std::string_view sop_instance_uid) const
297 -> std::optional<storage_tier>;
298
304 [[nodiscard]] auto get_storage(storage_tier tier) const
306
313 void update_metadata(std::string_view sop_instance_uid, storage_tier tier,
314 const core::dicom_dataset& dataset);
315
320 void update_access_time(std::string_view sop_instance_uid);
321
326 void remove_metadata(std::string_view sop_instance_uid);
327
335 [[nodiscard]] auto migrate_instance(std::string_view uid,
336 storage_tier from_tier,
337 storage_tier to_tier) -> VoidResult;
338
339 // =========================================================================
340 // Member Variables
341 // =========================================================================
342
344 std::unique_ptr<storage_interface> hot_tier_;
345
348
351
354
356 std::unordered_map<std::string, tier_metadata> metadata_index_;
357
359 mutable std::shared_mutex mutex_;
360};
361
362} // namespace kcenon::pacs::storage
~hsm_storage() override=default
Destructor.
auto get_tier(std::string_view sop_instance_uid) const -> std::optional< storage_tier >
Get the current tier of an instance.
std::unique_ptr< storage_interface > warm_tier_
Warm tier storage backend (may be nullptr)
std::shared_mutex mutex_
Mutex for thread-safe access.
std::unordered_map< std::string, tier_metadata > metadata_index_
Tier metadata index (SOP Instance UID -> metadata)
auto migrate(std::string_view sop_instance_uid, storage_tier target_tier) -> VoidResult
Manually migrate an instance to a different tier.
void update_metadata(std::string_view sop_instance_uid, storage_tier tier, const core::dicom_dataset &dataset)
Update tier metadata after store/retrieve.
void update_access_time(std::string_view sop_instance_uid)
Update last access time for an instance.
auto get_tier_policy() const -> tier_policy
Get the current tier policy.
auto retrieve(std::string_view sop_instance_uid) -> Result< core::dicom_dataset > override
Retrieve a DICOM dataset by SOP Instance UID.
auto migrate_instance(std::string_view uid, storage_tier from_tier, storage_tier to_tier) -> VoidResult
Migrate a single instance between tiers.
hsm_storage & operator=(const hsm_storage &)=delete
void remove_metadata(std::string_view sop_instance_uid)
Remove tier metadata.
auto remove(std::string_view sop_instance_uid) -> VoidResult override
Remove a DICOM dataset from all tiers.
std::unique_ptr< storage_interface > hot_tier_
Hot tier storage backend.
auto get_tier_metadata(std::string_view sop_instance_uid) const -> std::optional< tier_metadata >
Get tier metadata for an instance.
auto run_migration_cycle() -> migration_result
Run a single migration cycle.
auto verify_integrity() -> VoidResult override
Verify storage integrity across all tiers.
auto find_tier(std::string_view sop_instance_uid) const -> std::optional< storage_tier >
Find which tier contains an instance.
hsm_storage(std::unique_ptr< storage_interface > hot_tier, std::unique_ptr< storage_interface > warm_tier, std::unique_ptr< storage_interface > cold_tier, const hsm_storage_config &config={})
Construct HSM storage with three tier backends.
void set_tier_policy(const tier_policy &policy)
Set the tier policy.
hsm_storage_config config_
HSM configuration.
hsm_storage(const hsm_storage &)=delete
Non-copyable (contains mutex and unique_ptr)
auto exists(std::string_view sop_instance_uid) const -> bool override
Check if a DICOM instance exists in any tier.
auto get_storage(storage_tier tier) const -> storage_interface *
Get the storage backend for a tier.
auto get_tier_storage(storage_tier tier) const -> storage_interface *
Get the storage backend for a specific tier.
auto get_migration_candidates(storage_tier from_tier, storage_tier to_tier) const -> std::vector< tier_metadata >
Get instances eligible for migration.
hsm_storage(hsm_storage &&)=delete
Non-movable (contains mutex)
auto get_hsm_statistics() const -> hsm_statistics
Get HSM-specific statistics.
auto find(const core::dicom_dataset &query) -> Result< std::vector< core::dicom_dataset > > override
Find DICOM datasets matching query criteria across all tiers.
hsm_storage & operator=(hsm_storage &&)=delete
auto store(const core::dicom_dataset &dataset) -> VoidResult override
Store a DICOM dataset to the hot tier.
std::unique_ptr< storage_interface > cold_tier_
Cold tier storage backend (may be nullptr)
auto get_statistics() const -> storage_statistics override
Get combined storage statistics from all tiers.
Types for Hierarchical Storage Management (HSM)
storage_tier
Storage tier classification.
Definition hsm_types.h:37
Abstract storage interface for DICOM persistent storage backends.
Combined statistics for all HSM tiers.
Definition hsm_types.h:282
Configuration for HSM storage.
Definition hsm_storage.h:32
bool track_access_time
Whether to track access times for migration decisions When true, retrieves update the last_accessed t...
Definition hsm_storage.h:38
bool verify_after_migration
Whether to verify data integrity after migration.
Definition hsm_storage.h:41
tier_policy policy
Tier migration policy.
Definition hsm_storage.h:34
bool delete_after_migration
Whether to remove source after successful migration When false, data is copied (not moved) between ti...
Definition hsm_storage.h:45
Result of a migration operation.
Definition hsm_types.h:230
Metadata for tracking instance tier location.
Definition hsm_types.h:142
std::string_view uid