summaryrefslogtreecommitdiffstats
path: root/src/H5FDonion_index.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5FDonion_index.h')
-rw-r--r--src/H5FDonion_index.h150
1 files changed, 150 insertions, 0 deletions
diff --git a/src/H5FDonion_index.h b/src/H5FDonion_index.h
new file mode 100644
index 0000000..16e461b
--- /dev/null
+++ b/src/H5FDonion_index.h
@@ -0,0 +1,150 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group. *
+ * All rights reserved. *
+ * *
+ * This file is part of HDF5. The full HDF5 copyright notice, including *
+ * terms governing use, modification, and redistribution, is contained in *
+ * the COPYING file, which can be found at the root of the source code *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases. *
+ * If you do not have access to either file, you may request a copy from *
+ * help@hdfgroup.org. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef H5FDonion_index_H
+#define H5FDonion_index_H
+
+#define H5FD_ONION_ARCHIVAL_INDEX_VERSION_CURR 1
+
+/* Number of bytes to encode fixed-size components */
+#define H5FD_ONION_ENCODED_SIZE_INDEX_ENTRY 20
+#define H5FD_ONION_ENCODED_SIZE_RECORD_POINTER 20
+#define H5FD_ONION_ENCODED_SIZE_REVISION_RECORD 68
+
+#define H5FD_ONION_REVISION_INDEX_HASH_CHAIN_NODE_VERSION_CURR 1
+#define H5FD_ONION_REVISION_INDEX_STARTING_SIZE_LOG2 10 /* 2^n slots */
+#define H5FD_ONION_REVISION_INDEX_VERSION_CURR 1
+
+#define H5FD_ONION_REVISION_RECORD_SIGNATURE "ORRS"
+#define H5FD_ONION_REVISION_RECORD_VERSION_CURR 1
+
+/*
+ * Onion Virtual File Driver (VFD)
+ *
+ * Purpose: Interface for the archival and revision indexes
+ */
+
+/*-----------------------------------------------------------------------------
+ *
+ * Structure H5FD__onion_index_entry
+ *
+ * Purpose: Map a page in the logical file to a 'physical address' in the
+ * onion file.
+ *
+ * logical_page:
+ *
+ * Page 'id' in the logical file.
+ *
+ * phys_addr:
+ *
+ * Address/offset of start of page in the onion file.
+ *
+ *-----------------------------------------------------------------------------
+ */
+typedef struct H5FD_onion_index_entry_t {
+ uint64_t logical_page;
+ haddr_t phys_addr;
+} H5FD_onion_index_entry_t;
+
+/*-----------------------------------------------------------------------------
+ *
+ * Structure H5FD__onion_archival_index
+ *
+ * Purpose: Encapsulate archival index and associated data.
+ * Convenience structure with sanity-checking components.
+ *
+ * version: Future-proofing identifier. Informs struct membership.
+ * Must equal H5FD_ONION_ARCHIVAL_INDEX_VERSION_CURR to be
+ * considered valid.
+ *
+ * page_size: Interval to which the `logical_page` component of each list
+ * entry must align.
+ * Value is taken from the onion history data; must not change
+ * following onionization or file or creation of onion file.
+ *
+ * n_entries: Number of entries in the list.
+ *
+ * list: Pointer to array of archival index entries.
+ * Cannot be NULL.
+ * Entries must be sorted by `logical_page_id` in ascending order.
+ *
+ *-----------------------------------------------------------------------------
+ */
+typedef struct H5FD_onion_archival_index_t {
+ uint8_t version;
+ uint32_t page_size_log2;
+ uint64_t n_entries;
+ H5FD_onion_index_entry_t *list;
+} H5FD_onion_archival_index_t;
+
+/* data structure for storing index entries at a hash key collision */
+/* version 1 implements a singly-linked list */
+typedef struct H5FD_onion_revision_index_hash_chain_node_t H5FD_onion_revision_index_hash_chain_node_t;
+struct H5FD_onion_revision_index_hash_chain_node_t {
+ uint8_t version;
+ H5FD_onion_index_entry_t entry_data;
+ H5FD_onion_revision_index_hash_chain_node_t *next;
+};
+
+typedef struct H5FD_onion_revision_index_t {
+ uint8_t version;
+ uint32_t page_size_log2;
+ uint64_t n_entries; /* count of all entries in table */
+ uint64_t _hash_table_size; /* 'slots' in hash table */
+ uint64_t _hash_table_size_log2; /* 2^(n) -> 'slots' in hash table */
+ uint64_t _hash_table_n_keys_populated; /* count of slots not NULL */
+ H5FD_onion_revision_index_hash_chain_node_t **_hash_table;
+} H5FD_onion_revision_index_t;
+
+/* In-memory representation of the on-store revision record.
+ */
+typedef struct H5FD_onion_revision_record_t {
+ uint8_t version;
+ uint64_t revision_num;
+ uint64_t parent_revision_num;
+ char time_of_creation[16];
+ uint64_t logical_eof;
+ H5FD_onion_archival_index_t archival_index;
+ uint32_t comment_size;
+ char *comment;
+ uint32_t checksum;
+} H5FD_onion_revision_record_t;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+H5_DLL herr_t H5FD__onion_ingest_revision_record(H5FD_onion_revision_record_t *r_out, H5FD_t *raw_file,
+ const H5FD_onion_history_t *history, uint64_t revision_num);
+
+H5_DLL hbool_t H5FD__onion_archival_index_is_valid(const H5FD_onion_archival_index_t *);
+H5_DLL int H5FD__onion_archival_index_find(const H5FD_onion_archival_index_t *, uint64_t,
+ const H5FD_onion_index_entry_t **);
+
+H5_DLL H5FD_onion_revision_index_t *H5FD__onion_revision_index_init(uint32_t page_size);
+H5_DLL herr_t H5FD__onion_revision_index_destroy(H5FD_onion_revision_index_t *);
+H5_DLL herr_t H5FD__onion_revision_index_insert(H5FD_onion_revision_index_t *,
+ const H5FD_onion_index_entry_t *);
+H5_DLL int H5FD__onion_revision_index_find(const H5FD_onion_revision_index_t *, uint64_t,
+ const H5FD_onion_index_entry_t **);
+
+H5_DLL herr_t H5FD__onion_merge_revision_index_into_archival_index(const H5FD_onion_revision_index_t *,
+ H5FD_onion_archival_index_t *);
+
+H5_DLL size_t H5FD__onion_revision_record_decode(unsigned char *buf, H5FD_onion_revision_record_t *record);
+H5_DLL size_t H5FD__onion_revision_record_encode(H5FD_onion_revision_record_t *record, unsigned char *buf,
+ uint32_t *checksum);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* H5FDonion_index_H */