Skip to content

Commit 47b3eb8

Browse files
Abigale KimKiterLuc
andauthored
Remove serialization non C.41 constructors from index_read_state_from_capnp. (#4670)
Made index_read_state_from_capnp C41 compliant. --- TYPE: NO_HISTORY DESC: Remove serialization non C.41 constructors from index_read_state_from_capnp --------- Co-authored-by: KiterLuc <[email protected]>
1 parent 4c6d530 commit 47b3eb8

File tree

7 files changed

+142
-74
lines changed

7 files changed

+142
-74
lines changed

tiledb/sm/query/readers/sparse_global_order_reader.cc

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ SparseGlobalOrderReader<BitmapType>::SparseGlobalOrderReader(
9494

9595
template <class BitmapType>
9696
bool SparseGlobalOrderReader<BitmapType>::incomplete() const {
97-
return !read_state_.done_adding_result_tiles_ ||
97+
return !read_state_.done_adding_result_tiles() ||
9898
memory_used_for_coords_total_ != 0;
9999
}
100100

@@ -131,7 +131,7 @@ Status SparseGlobalOrderReader<BitmapType>::dowork() {
131131

132132
// Handle empty array.
133133
if (fragment_metadata_.empty()) {
134-
read_state_.done_adding_result_tiles_ = true;
134+
read_state_.set_done_adding_result_tiles(true);
135135
return Status::Ok();
136136
}
137137

@@ -416,7 +416,7 @@ SparseGlobalOrderReader<BitmapType>::create_result_tiles(
416416
auto tile_num = fragment_metadata_[f]->tile_num();
417417

418418
// Figure out the start index.
419-
auto start = read_state_.frag_idx_[f].tile_idx_;
419+
auto start = read_state_.frag_idx()[f].tile_idx_;
420420
if (!result_tiles[f].empty()) {
421421
start = std::max(start, result_tiles[f].back().tile_idx() + 1);
422422
}
@@ -470,7 +470,7 @@ SparseGlobalOrderReader<BitmapType>::create_result_tiles(
470470
logger_->debug("All result tiles loaded");
471471
}
472472

473-
read_state_.done_adding_result_tiles_ = done_adding_result_tiles;
473+
read_state_.set_done_adding_result_tiles(done_adding_result_tiles);
474474

475475
// Return the list of tiles added.
476476
std::vector<ResultTile*> created_tiles;
@@ -789,8 +789,8 @@ bool SparseGlobalOrderReader<BitmapType>::add_next_cell_to_queue(
789789
// Increment the tile index, which should clear all tiles in
790790
// end_iteration.
791791
if (!result_tiles[frag_idx].empty()) {
792-
read_state_.frag_idx_[frag_idx].tile_idx_++;
793-
read_state_.frag_idx_[frag_idx].cell_idx_ = 0;
792+
uint64_t new_tile_idx = read_state_.frag_idx()[frag_idx].tile_idx_ + 1;
793+
read_state_.set_frag_idx(frag_idx, FragIdx(new_tile_idx, 0));
794794
}
795795

796796
// This fragment has more tiles potentially.
@@ -876,11 +876,11 @@ void SparseGlobalOrderReader<BitmapType>::compute_hilbert_values(
876876
template <class BitmapType>
877877
void SparseGlobalOrderReader<BitmapType>::update_frag_idx(
878878
GlobalOrderResultTile<BitmapType>* tile, uint64_t c) {
879-
auto& frag_idx = read_state_.frag_idx_[tile->frag_idx()];
879+
auto& frag_idx = read_state_.frag_idx()[tile->frag_idx()];
880880
auto t = tile->tile_idx();
881881
if ((t == frag_idx.tile_idx_ && c > frag_idx.cell_idx_) ||
882882
t > frag_idx.tile_idx_) {
883-
frag_idx = FragIdx(t, c);
883+
read_state_.set_frag_idx(tile->frag_idx(), FragIdx(t, c));
884884
}
885885
}
886886

@@ -932,8 +932,8 @@ SparseGlobalOrderReader<BitmapType>::merge_result_cell_slabs(
932932

933933
// Add the tile to the queue.
934934
uint64_t cell_idx =
935-
read_state_.frag_idx_[f].tile_idx_ == rt_it[f]->tile_idx() ?
936-
read_state_.frag_idx_[f].cell_idx_ :
935+
read_state_.frag_idx()[f].tile_idx_ == rt_it[f]->tile_idx() ?
936+
read_state_.frag_idx()[f].cell_idx_ :
937937
0;
938938
GlobalOrderResultCoords rc(&*(rt_it[f]), cell_idx);
939939
bool res = add_next_cell_to_queue(
@@ -1716,8 +1716,9 @@ SparseGlobalOrderReader<BitmapType>::respect_copy_memory_budget(
17161716
while (result_cell_slabs.size() > max_cs_idx) {
17171717
// Revert progress for this slab in read state, and pop it.
17181718
auto& last_rcs = result_cell_slabs.back();
1719-
read_state_.frag_idx_[last_rcs.tile_->frag_idx()] =
1720-
FragIdx(last_rcs.tile_->tile_idx(), last_rcs.start_);
1719+
read_state_.set_frag_idx(
1720+
last_rcs.tile_->frag_idx(),
1721+
FragIdx(last_rcs.tile_->tile_idx(), last_rcs.start_));
17211722
result_cell_slabs.pop_back();
17221723
}
17231724

@@ -1758,8 +1759,9 @@ SparseGlobalOrderReader<BitmapType>::compute_var_size_offsets(
17581759
while (query_buffer.original_buffer_var_size_ < new_var_buffer_size) {
17591760
// Revert progress for this slab in read state, and pop it.
17601761
auto& last_rcs = result_cell_slabs.back();
1761-
read_state_.frag_idx_[last_rcs.tile_->frag_idx()] =
1762-
FragIdx(last_rcs.tile_->tile_idx(), last_rcs.start_);
1762+
read_state_.set_frag_idx(
1763+
last_rcs.tile_->frag_idx(),
1764+
FragIdx(last_rcs.tile_->tile_idx(), last_rcs.start_));
17631765
result_cell_slabs.pop_back();
17641766

17651767
// Update the new var buffer size.
@@ -1787,8 +1789,10 @@ SparseGlobalOrderReader<BitmapType>::compute_var_size_offsets(
17871789
new_var_buffer_size = ((OffType*)query_buffer.buffer_)[total_cells];
17881790

17891791
// Update the cell progress.
1790-
read_state_.frag_idx_[last_rcs.tile_->frag_idx()] =
1791-
FragIdx(last_rcs.tile_->tile_idx(), last_rcs.start_ + last_rcs.length_);
1792+
read_state_.set_frag_idx(
1793+
last_rcs.tile_->frag_idx(),
1794+
FragIdx(
1795+
last_rcs.tile_->tile_idx(), last_rcs.start_ + last_rcs.length_));
17921796

17931797
// Remove empty cell slab.
17941798
if (last_rcs.length_ == 0) {
@@ -2192,7 +2196,7 @@ void SparseGlobalOrderReader<BitmapType>::end_iteration(
21922196
storage_manager_->compute_tp(), 0, fragment_num, [&](uint64_t f) {
21932197
while (!result_tiles[f].empty() &&
21942198
result_tiles[f].front().tile_idx() <
2195-
read_state_.frag_idx_[f].tile_idx_) {
2199+
read_state_.frag_idx()[f].tile_idx_) {
21962200
remove_result_tile(f, result_tiles[f].begin(), result_tiles);
21972201
}
21982202

tiledb/sm/query/readers/sparse_index_reader_base.cc

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ SparseIndexReaderBase::SparseIndexReaderBase(
7070
StrategyParams& params,
7171
bool include_coords)
7272
: ReaderBase(stats, logger, params)
73+
, read_state_(array_->fragment_metadata().size())
7374
, tmp_read_state_(array_->fragment_metadata().size())
7475
, memory_budget_(config_, reader_string)
7576
, include_coords_(include_coords)
@@ -131,13 +132,13 @@ SparseIndexReaderBase::SparseIndexReaderBase(
131132
/* PROTECTED METHODS */
132133
/* ****************************** */
133134

134-
const typename SparseIndexReaderBase::ReadState*
135+
const typename SparseIndexReaderBase::ReadState&
135136
SparseIndexReaderBase::read_state() const {
136-
return &read_state_;
137+
return read_state_;
137138
}
138139

139-
typename SparseIndexReaderBase::ReadState* SparseIndexReaderBase::read_state() {
140-
return &read_state_;
140+
void SparseIndexReaderBase::set_read_state(ReadState read_state) {
141+
read_state_ = std::move(read_state);
141142
}
142143

143144
uint64_t SparseIndexReaderBase::available_memory() {
@@ -319,11 +320,10 @@ Status SparseIndexReaderBase::load_initial_data() {
319320
}
320321

321322
auto timer_se = stats_->start_timer("load_initial_data");
322-
read_state_.done_adding_result_tiles_ = false;
323+
read_state_.set_done_adding_result_tiles(false);
323324

324325
// For easy reference.
325326
const auto dim_num = array_schema_.dim_num();
326-
auto fragment_num = fragment_metadata_.size();
327327

328328
// Load delete conditions.
329329
auto&& [st, conditions, update_values] =
@@ -366,9 +366,6 @@ Status SparseIndexReaderBase::load_initial_data() {
366366
}
367367
}
368368

369-
// Make sure there is enough space for tiles data.
370-
read_state_.frag_idx_.resize(fragment_num);
371-
372369
// Calculate ranges of tiles in the subarray, if set.
373370
if (subarray_.is_set()) {
374371
// At this point, full memory budget is available.
@@ -385,7 +382,7 @@ Status SparseIndexReaderBase::load_initial_data() {
385382
// below.
386383
RETURN_NOT_OK(subarray_.precompute_all_ranges_tile_overlap(
387384
storage_manager_->compute_tp(),
388-
read_state_.frag_idx_,
385+
read_state_.frag_idx(),
389386
&tmp_read_state_));
390387

391388
if (tmp_read_state_.memory_used_tile_ranges() >

tiledb/sm/query/readers/sparse_index_reader_base.h

Lines changed: 75 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -296,11 +296,79 @@ class SparseIndexReaderBase : public ReaderBase {
296296
* it is really required to determine if a query is incomplete from the client
297297
* side of a cloud request.
298298
*/
299-
struct ReadState {
299+
class ReadState {
300+
public:
301+
/* ********************************* */
302+
/* CONSTRUCTORS & DESTRUCTORS */
303+
/* ********************************* */
304+
305+
/** Delete default constructor. */
306+
ReadState() = delete;
307+
308+
/** Constructor.
309+
* @param frag_idxs_len The length of the fragment index vector.
310+
*/
311+
ReadState(size_t frag_idxs_len)
312+
: frag_idx_(frag_idxs_len) {
313+
}
314+
315+
/** Constructor used in deserialization. */
316+
ReadState(std::vector<FragIdx>&& frag_idx, bool done_adding_result_tiles)
317+
: frag_idx_(std::move(frag_idx))
318+
, done_adding_result_tiles_(done_adding_result_tiles) {
319+
}
320+
321+
/* ********************************* */
322+
/* API */
323+
/* ********************************* */
324+
325+
/**
326+
* Return whether the tiles that will be processed are loaded in memory.
327+
* @return Done adding result tiles.
328+
*/
329+
inline bool done_adding_result_tiles() const {
330+
return done_adding_result_tiles_;
331+
}
332+
333+
/**
334+
* Sets the flag that determines whether the tiles that will be processed
335+
* are loaded in memory.
336+
* @param done_adding_result_tiles Done adding result tiles.
337+
*/
338+
inline void set_done_adding_result_tiles(bool done_adding_result_tiles) {
339+
done_adding_result_tiles_ = done_adding_result_tiles;
340+
}
341+
342+
/**
343+
* Sets a value in the fragment index vector.
344+
* @param idx The index of the vector.
345+
* @param val The value to set frag_idx[idx] to.
346+
*/
347+
inline void set_frag_idx(uint64_t idx, FragIdx val) {
348+
if (idx >= frag_idx_.size()) {
349+
throw std::runtime_error(
350+
"ReadState::set_frag_idx: idx greater than frag_idx_'s size.");
351+
}
352+
frag_idx_[idx] = std::move(val);
353+
}
354+
355+
/**
356+
* Returns a read-only version of the fragment index vector.
357+
* @return The fragment index vector.
358+
*/
359+
const std::vector<FragIdx>& frag_idx() const {
360+
return frag_idx_;
361+
}
362+
363+
/* ********************************* */
364+
/* PRIVATE ATTRIBUTES */
365+
/* ********************************* */
366+
367+
private:
300368
/** The tile index inside of each fragments. */
301369
std::vector<FragIdx> frag_idx_;
302370

303-
/** Is the reader done with the query. */
371+
/** Have all tiles to be processed been loaded in memory? */
304372
bool done_adding_result_tiles_;
305373
};
306374

@@ -506,16 +574,16 @@ class SparseIndexReaderBase : public ReaderBase {
506574
/**
507575
* Returns the current read state.
508576
*
509-
* @return pointer to the read state.
577+
* @return const reference to the read state.
510578
*/
511-
const ReadState* read_state() const;
579+
const ReadState& read_state() const;
512580

513581
/**
514-
* Returns the current read state.
582+
* Sets the new read state. Used only for deserialization.
515583
*
516-
* @return pointer to the read state.
584+
* @param read_state New read_state value.
517585
*/
518-
ReadState* read_state();
586+
void set_read_state(ReadState read_state);
519587

520588
protected:
521589
/* ********************************* */

0 commit comments

Comments
 (0)