summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoralexvru <[email protected]>2023-08-22 17:04:52 +0300
committeralexvru <[email protected]>2023-08-22 17:44:05 +0300
commite4519ff36a125ba4dc8eb7910427974a5fd34a2c (patch)
tree3fbb5d022d2b0619d67b63a98fbdcb014705d00d
parentd40726ba705519837b014cb71110b86258906f0d (diff)
Propose PDisk metadata vault interface KIKIMR-19031
-rw-r--r--ydb/core/base/blobstorage.h4
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk.h32
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_defs.h8
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_tools.h7
4 files changed, 51 insertions, 0 deletions
diff --git a/ydb/core/base/blobstorage.h b/ydb/core/base/blobstorage.h
index e0aa3e15b6b..4d3dad68997 100644
--- a/ydb/core/base/blobstorage.h
+++ b/ydb/core/base/blobstorage.h
@@ -698,6 +698,8 @@ struct TEvBlobStorage {
EvFormatReencryptionFinish,
EvDetectedPhantomBlobCommitted,
EvGetLogoBlobIndexStatRequest,
+ EvReadMetadata,
+ EvWriteMetadata,
EvYardInitResult = EvPut + 9 * 512, /// 268 636 672
EvLogResult,
@@ -746,6 +748,8 @@ struct TEvBlobStorage {
EvGetLogoBlobResponse,
EvChunkForgetResult,
EvGetLogoBlobIndexStatResponse,
+ EvReadMetadataResult,
+ EvWriteMetadataResult,
// internal proxy interface
EvUnusedLocal1 = EvPut + 10 * 512, // Not used. /// 268 637 184
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk.h b/ydb/core/blobstorage/pdisk/blobstorage_pdisk.h
index d78c6859d43..6064b701275 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk.h
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk.h
@@ -1500,6 +1500,38 @@ struct TEvAskForCutLog : public TEventLocal<TEvAskForCutLog, TEvBlobStorage::EvA
}
};
+struct TEvReadMetadata : TEventLocal<TEvReadMetadata, TEvBlobStorage::EvReadMetadata> {};
+
+struct TEvReadMetadataResult : TEventLocal<TEvReadMetadataResult, TEvBlobStorage::EvReadMetadataResult> {
+ EPDiskMetadataOutcome Outcome;
+ TRcBuf Metadata;
+
+ TEvReadMetadataResult(EPDiskMetadataOutcome outcome)
+ : Outcome(outcome)
+ {}
+
+ TEvReadMetadataResult(TRcBuf&& metadata)
+ : Outcome(EPDiskMetadataOutcome::OK)
+ , Metadata(std::move(metadata))
+ {}
+};
+
+struct TEvWriteMetadata : TEventLocal<TEvWriteMetadata, TEvBlobStorage::EvWriteMetadata> {
+ TRcBuf Metadata;
+
+ TEvWriteMetadata(TRcBuf&& metadata)
+ : Metadata(std::move(metadata))
+ {}
+};
+
+struct TEvWriteMetadataResult : TEventLocal<TEvWriteMetadataResult, TEvBlobStorage::EvWriteMetadataResult> {
+ EPDiskMetadataOutcome Outcome;
+
+ TEvWriteMetadataResult(EPDiskMetadataOutcome outcome)
+ : Outcome(outcome)
+ {}
+};
+
} // NPDisk
} // NKikimr
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_defs.h b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_defs.h
index 7ec5566846f..929e61c840e 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_defs.h
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_defs.h
@@ -33,6 +33,14 @@ namespace NKikimr {
}
};
+ enum class EPDiskMetadataOutcome {
+ OK, // metadata was successfully read/written
+ ERROR, // I/O, locking or some other kind of error has occured
+ UNFORMATTED, // pdisk is not formatted properly
+ METADATA_UNSUPPORTED, // metadata record is unsupported in this PDisk format
+ NO_METADATA, // no metadata record available
+ };
+
typedef TPrintable_ui8 TOwner;
typedef ui64 TOwnerRound;
typedef ui32 TStatusFlags;
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_tools.h b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_tools.h
index b3150e96ae5..cb8ab509075 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_tools.h
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_tools.h
@@ -49,4 +49,11 @@ void FormatPDisk(TString path, ui64 diskSizeBytes, ui32 sectorSizeBytes, ui32 us
bool ReadPDiskFormatInfo(const TString &path, const NPDisk::TMainKey &mainKey, TPDiskInfo &outInfo,
const bool doLock = false, TIntrusivePtr<NPDisk::TSectorMap> sectorMap = nullptr);
+// reads metadata from PDisk (if available)
+NPDisk::EPDiskMetadataOutcome ReadPDiskMetadata(const TString& path, const NPDisk::TKey& key, TRcBuf& metadata);
+
+// updated PDisk metadata (when PDisk is properly formatted and supports metadata vault); size of metadata should not
+// exceed 15 MiB; when function fails (even many times), previusly stored metadata must be kept intact
+NPDisk::EPDiskMetadataOutcome WritePDiskMetadata(const TString& path, const NPDisk::TKey& key, TRcBuf&& metadata);
+
} // NKikimr