Skip to content

Commit 17a1a24

Browse files
committed
Implement updated fragment metadata footer design.
1 parent 65a97e5 commit 17a1a24

File tree

6 files changed

+100
-89
lines changed

6 files changed

+100
-89
lines changed

tiledb/sm/fragment/fragment_metadata.cc

Lines changed: 67 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,8 @@ void FragmentMetadata::set_tile_global_order_bounds_fixed(
388388
loaded_metadata_ptr_->tile_global_order_max_buffer()[dim].data();
389389
memcpy(&max_data[offset], tile_max.value().data(), fixed_size);
390390
}
391+
392+
has_tile_global_order_bounds_ = true;
391393
}
392394

393395
/**
@@ -1321,7 +1323,7 @@ void FragmentMetadata::store_v15_or_higher(
13211323
}
13221324

13231325
if (!dense_ &&
1324-
version_ >= constants::fragment_metadata_global_order_bounds_version) {
1326+
version_ >= constants::fragment_metadata_data_directory_version) {
13251327
const auto num_dims = array_schema_->dim_num();
13261328
// Store global order mins
13271329
gt_offsets_.tile_global_order_min_offsets_.resize(num_dims);
@@ -1846,6 +1848,10 @@ void FragmentMetadata::write_footer(Serializer& serializer) const {
18461848
write_file_var_sizes(serializer);
18471849
write_file_validity_sizes(serializer);
18481850
write_generic_tile_offsets(serializer);
1851+
1852+
if (version_ >= constants::fragment_metadata_data_directory_version) {
1853+
write_data_directories(serializer);
1854+
}
18491855
}
18501856

18511857
/* ****************************** */
@@ -2395,10 +2401,8 @@ void FragmentMetadata::load_generic_tile_offsets(Deserializer& deserializer) {
23952401
load_generic_tile_offsets_v11(deserializer);
23962402
} else if (version_ >= 12 && version_ < 16) {
23972403
load_generic_tile_offsets_v12_v15(deserializer);
2398-
} else if (version_ >= 16 && version_ < 23) {
2399-
load_generic_tile_offsets_v16_v22(deserializer);
24002404
} else {
2401-
load_generic_tile_offsets_v23_or_higher(deserializer);
2405+
load_generic_tile_offsets_v16_or_higher(deserializer);
24022406
}
24032407
}
24042408

@@ -2552,7 +2556,7 @@ void FragmentMetadata::load_generic_tile_offsets_v12_v15(
25522556
deserializer.read<uint64_t>();
25532557
}
25542558

2555-
void FragmentMetadata::load_generic_tile_offsets_v16_v22(
2559+
void FragmentMetadata::load_generic_tile_offsets_v16_or_higher(
25562560
Deserializer& deserializer) {
25572561
// Load R-Tree offset
25582562
gt_offsets_.rtree_ = deserializer.read<uint64_t>();
@@ -2598,63 +2602,41 @@ void FragmentMetadata::load_generic_tile_offsets_v16_v22(
25982602
gt_offsets_.processed_conditions_offsets_ = deserializer.read<uint64_t>();
25992603
}
26002604

2601-
void FragmentMetadata::load_generic_tile_offsets_v23_or_higher(
2602-
Deserializer& deserializer) {
2603-
// Load R-Tree offset
2604-
gt_offsets_.rtree_ = deserializer.read<uint64_t>();
2605-
2606-
// Load offsets for tile offsets
2607-
auto num = num_dims_and_attrs();
2608-
gt_offsets_.tile_offsets_.resize(num);
2609-
deserializer.read(&gt_offsets_.tile_offsets_[0], num * sizeof(uint64_t));
2610-
2611-
// Load offsets for tile var offsets
2612-
gt_offsets_.tile_var_offsets_.resize(num);
2613-
deserializer.read(&gt_offsets_.tile_var_offsets_[0], num * sizeof(uint64_t));
2605+
void FragmentMetadata::load_data_directories(Deserializer& deserializer) {
2606+
auto count = deserializer.read<uint32_t>();
26142607

2615-
// Load offsets for tile var sizes
2616-
gt_offsets_.tile_var_sizes_.resize(num);
2617-
deserializer.read(&gt_offsets_.tile_var_sizes_[0], num * sizeof(uint64_t));
2618-
2619-
// Load offsets for tile validity offsets
2620-
gt_offsets_.tile_validity_offsets_.resize(num);
2621-
deserializer.read(
2622-
&gt_offsets_.tile_validity_offsets_[0], num * sizeof(uint64_t));
2623-
2624-
// Load offsets for tile min offsets
2625-
gt_offsets_.tile_min_offsets_.resize(num);
2626-
deserializer.read(&gt_offsets_.tile_min_offsets_[0], num * sizeof(uint64_t));
2627-
2628-
// Load offsets for tile max offsets
2629-
gt_offsets_.tile_max_offsets_.resize(num);
2630-
deserializer.read(&gt_offsets_.tile_max_offsets_[0], num * sizeof(uint64_t));
2631-
2632-
if (!dense_) {
2633-
// Load offsets for the tile global order bounds
2634-
const auto num_dims = array_schema_->dim_num();
2635-
gt_offsets_.tile_global_order_min_offsets_.resize(num_dims);
2636-
gt_offsets_.tile_global_order_max_offsets_.resize(num_dims);
2637-
deserializer.read(
2638-
gt_offsets_.tile_global_order_min_offsets_.data(),
2639-
num_dims * sizeof(uint64_t));
2640-
deserializer.read(
2641-
gt_offsets_.tile_global_order_max_offsets_.data(),
2642-
num_dims * sizeof(uint64_t));
2608+
for (uint32_t i = 0; i < count; i++) {
2609+
auto identifier = deserializer.read<DataDirectoryIdentifier>();
2610+
auto data_size = deserializer.read<uint32_t>();
2611+
switch (identifier) {
2612+
case DataDirectoryIdentifier::tile_global_order_offsets:
2613+
if (data_size != 2 * array_schema_->dim_num() * sizeof(uint64_t)) {
2614+
throw FragmentMetadataStatusException(
2615+
"Invalid size of tile global order bound offsets data directory");
2616+
}
2617+
load_tile_global_order_offsets(deserializer);
2618+
has_tile_global_order_bounds_ = true;
2619+
break;
2620+
default:
2621+
// Ignore unknown data directories per the storage format spec.
2622+
deserializer.skip(data_size);
2623+
break;
2624+
}
26432625
}
2626+
}
26442627

2645-
// Load offsets for tile sum offsets
2646-
gt_offsets_.tile_sum_offsets_.resize(num);
2647-
deserializer.read(&gt_offsets_.tile_sum_offsets_[0], num * sizeof(uint64_t));
2648-
2649-
// Load offsets for tile null count offsets
2650-
gt_offsets_.tile_null_count_offsets_.resize(num);
2628+
void FragmentMetadata::load_tile_global_order_offsets(
2629+
Deserializer& deserializer) {
2630+
// Load offsets for the tile global order bounds
2631+
const auto num_dims = array_schema_->dim_num();
2632+
gt_offsets_.tile_global_order_min_offsets_.resize(num_dims);
2633+
gt_offsets_.tile_global_order_max_offsets_.resize(num_dims);
26512634
deserializer.read(
2652-
&gt_offsets_.tile_null_count_offsets_[0], num * sizeof(uint64_t));
2653-
2654-
gt_offsets_.fragment_min_max_sum_null_count_offset_ =
2655-
deserializer.read<uint64_t>();
2656-
2657-
gt_offsets_.processed_conditions_offsets_ = deserializer.read<uint64_t>();
2635+
gt_offsets_.tile_global_order_min_offsets_.data(),
2636+
num_dims * sizeof(uint64_t));
2637+
deserializer.read(
2638+
gt_offsets_.tile_global_order_max_offsets_.data(),
2639+
num_dims * sizeof(uint64_t));
26582640
}
26592641

26602642
void FragmentMetadata::load_array_schema_name(Deserializer& deserializer) {
@@ -2803,6 +2785,10 @@ void FragmentMetadata::load_footer(
28032785

28042786
load_generic_tile_offsets(deserializer);
28052787

2788+
if (version_ >= 23) {
2789+
load_data_directories(deserializer);
2790+
}
2791+
28062792
// If the footer_size is not set lets calculate from how much of the
28072793
// buffer we read
28082794
if (footer_size_ == 0) {
@@ -2883,18 +2869,6 @@ void FragmentMetadata::write_generic_tile_offsets(
28832869
serializer.write(&gt_offsets_.tile_max_offsets_[0], num * sizeof(uint64_t));
28842870
}
28852871

2886-
if (!dense_ &&
2887-
version_ >= constants::fragment_metadata_global_order_bounds_version) {
2888-
// Write the tile global order bound offsets
2889-
const auto num_dims = array_schema_->dim_num();
2890-
serializer.write(
2891-
gt_offsets_.tile_global_order_min_offsets_.data(),
2892-
num_dims * sizeof(uint64_t));
2893-
serializer.write(
2894-
gt_offsets_.tile_global_order_max_offsets_.data(),
2895-
num_dims * sizeof(uint64_t));
2896-
}
2897-
28982872
// Write tile sum offsets
28992873
if (version_ >= 11) {
29002874
serializer.write(&gt_offsets_.tile_sum_offsets_[0], num * sizeof(uint64_t));
@@ -2916,6 +2890,29 @@ void FragmentMetadata::write_generic_tile_offsets(
29162890
}
29172891
}
29182892

2893+
void FragmentMetadata::write_data_directories(Serializer& serializer) const {
2894+
uint32_t count = 0;
2895+
2896+
if (has_tile_global_order_bounds_) {
2897+
count++;
2898+
}
2899+
2900+
serializer.write(count);
2901+
2902+
if (has_tile_global_order_bounds_) {
2903+
serializer.write(DataDirectoryIdentifier::tile_global_order_offsets);
2904+
const auto num_dims = array_schema_->dim_num();
2905+
serializer.write<uint32_t>(2 * num_dims * sizeof(uint64_t));
2906+
2907+
serializer.write(
2908+
gt_offsets_.tile_global_order_min_offsets_.data(),
2909+
num_dims * sizeof(uint64_t));
2910+
serializer.write(
2911+
gt_offsets_.tile_global_order_max_offsets_.data(),
2912+
num_dims * sizeof(uint64_t));
2913+
}
2914+
}
2915+
29192916
void FragmentMetadata::write_array_schema_name(Serializer& serializer) const {
29202917
uint64_t size = array_schema_name_.size();
29212918
if (size == 0) {

tiledb/sm/fragment/fragment_metadata.h

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,13 @@ class FragmentMetadataStatusException : public StatusException {
7272
}
7373
};
7474

75+
/**
76+
* Contains identifiers for fragment metadata footer data directories.
77+
*/
78+
enum class DataDirectoryIdentifier : uint64_t {
79+
tile_global_order_offsets = 0,
80+
};
81+
7582
/** Stores the metadata structures of a fragment. */
7683
class FragmentMetadata {
7784
public:
@@ -947,6 +954,9 @@ class FragmentMetadata {
947954
/** The format version of this metadata. */
948955
uint32_t version_;
949956

957+
/** Whether this metadata contains tile global order bounds. */
958+
bool has_tile_global_order_bounds_ = false;
959+
950960
/** The timestamp range of the fragment. */
951961
std::pair<uint64_t, uint64_t> timestamp_range_;
952962

@@ -1053,15 +1063,19 @@ class FragmentMetadata {
10531063

10541064
/**
10551065
* Loads the generic tile offsets from the buffer. Applicable to
1056-
* versions 16 to 22.
1066+
* versions 16 or higher.
10571067
*/
1058-
void load_generic_tile_offsets_v16_v22(Deserializer& deserializer);
1068+
void load_generic_tile_offsets_v16_or_higher(Deserializer& deserializer);
10591069

10601070
/**
1061-
* Loads the generic tile offsets from the buffer. Applicable to
1062-
* versions 23 or higher.
1071+
* Loads the footer's data directories.
10631072
*/
1064-
void load_generic_tile_offsets_v23_or_higher(Deserializer& deserializer);
1073+
void load_data_directories(Deserializer& deserializer);
1074+
1075+
/**
1076+
* Loads the offsets for the tile global order bounds.
1077+
*/
1078+
void load_tile_global_order_offsets(Deserializer& deserializer);
10651079

10661080
/**
10671081
* Loads the array schema name.
@@ -1209,6 +1223,9 @@ class FragmentMetadata {
12091223
/** Writes the generic tile offsets to the buffer. */
12101224
void write_generic_tile_offsets(Serializer& serializer) const;
12111225

1226+
/** Writes the footer's data directories to the buffer. */
1227+
void write_data_directories(Serializer& serializer) const;
1228+
12121229
/** Writes the array schema name. */
12131230
void write_array_schema_name(Serializer& serializer) const;
12141231

tiledb/sm/fragment/ondemand_fragment_metadata.cc

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,7 @@ void OndemandFragmentMetadata::load_fragment_min_max_sum_null_count(
115115

116116
void OndemandFragmentMetadata::load_fragment_tile_global_order_bounds(
117117
const EncryptionKey& encryption_key) {
118-
if (parent_fragment_.version_ <
119-
constants::fragment_metadata_global_order_bounds_version) {
118+
if (!parent_fragment_.has_tile_global_order_bounds_) {
120119
return;
121120
}
122121

@@ -623,8 +622,7 @@ void OndemandFragmentMetadata::load_tile_max_values(
623622

624623
void OndemandFragmentMetadata::load_tile_global_order_min_values(
625624
const EncryptionKey& encryption_key, unsigned dimension) {
626-
if (parent_fragment_.version_ <
627-
constants::fragment_metadata_global_order_bounds_version) {
625+
if (!parent_fragment_.has_tile_global_order_bounds_) {
628626
return;
629627
}
630628

@@ -648,8 +646,7 @@ void OndemandFragmentMetadata::load_tile_global_order_min_values(
648646

649647
void OndemandFragmentMetadata::load_tile_global_order_max_values(
650648
const EncryptionKey& encryption_key, unsigned dimension) {
651-
if (parent_fragment_.version_ <
652-
constants::fragment_metadata_global_order_bounds_version) {
649+
if (!parent_fragment_.has_tile_global_order_bounds_) {
653650
return;
654651
}
655652

tiledb/sm/misc/constants.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -722,9 +722,9 @@ const format_version_t current_domain_version = 0;
722722
/** The NDRectangle current domain */
723723
const std::string current_domain_ndrectangle_str = "NDRECTANGLE";
724724

725-
/** The lowest version where fragment metadata contains per-tile global order
726-
* bounds */
727-
const format_version_t fragment_metadata_global_order_bounds_version = 23;
725+
/** The lowest version where fragment metadata footer contains extensible data
726+
* directories. */
727+
const format_version_t fragment_metadata_data_directory_version = 23;
728728

729729
/** The maximum size of a tile chunk (unit of compression) in bytes. */
730730
const uint64_t max_tile_chunk_size = 64 * 1024;

tiledb/sm/misc/constants.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -717,9 +717,9 @@ extern const format_version_t current_domain_version;
717717
/** The NDRectangle current_domain */
718718
extern const std::string current_domain_ndrectangle_str;
719719

720-
/** The lowest version where fragment metadata contains per-tile global order
721-
* bounds */
722-
extern const format_version_t fragment_metadata_global_order_bounds_version;
720+
/** The lowest version where fragment metadata footer contains extensible data
721+
* directories. */
722+
extern const format_version_t fragment_metadata_data_directory_version;
723723

724724
/** The maximum size of a tile chunk (unit of compression) in bytes. */
725725
extern const uint64_t max_tile_chunk_size;

tiledb/sm/query/writers/writer_base.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,7 +1069,7 @@ Status WriterBase::write_tiles(
10691069
}
10701070
}
10711071

1072-
if (array_schema_.is_dim(attr)) {
1072+
if (!array_schema_.dense() && array_schema_.is_dim(attr)) {
10731073
if (array_schema_.var_size(attr)) {
10741074
frag_meta->convert_tile_global_order_bounds_sizes_to_offsets(attr);
10751075
}
@@ -1155,7 +1155,7 @@ Status WriterBase::write_tiles(
11551155
frag_meta->set_tile_min(name, tile_id, tile.min());
11561156
frag_meta->set_tile_max(name, tile_id, tile.max());
11571157
}
1158-
if (array_schema_.is_dim(name)) {
1158+
if (!array_schema_.dense() && array_schema_.is_dim(name)) {
11591159
frag_meta->set_tile_global_order_bounds_fixed(name, tile_id, tile);
11601160
}
11611161

0 commit comments

Comments
 (0)