Skip to content

Commit d391375

Browse files
committed
Fix lifetime issues and some namings
1 parent 88c0ecb commit d391375

File tree

4 files changed

+74
-27
lines changed

4 files changed

+74
-27
lines changed

tiledb/sm/query/readers/result_tile.cc

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,16 @@ ResultTile::ResultTile(
9191
coord_func_ = &ResultTile::zipped_coord;
9292
}
9393

94+
ResultTile::~ResultTile() {
95+
try {
96+
// Wait for all tasks to be done
97+
wait_all_attrs();
98+
wait_all_coords();
99+
} catch (...) {
100+
return;
101+
}
102+
}
103+
94104
/* ****************************** */
95105
/* API */
96106
/* ****************************** */
@@ -130,7 +140,7 @@ void ResultTile::erase_tile(const std::string& name) {
130140

131141
// Handle attribute tile
132142
for (auto& at : attr_tiles_) {
133-
if (at.first == name) {
143+
if (at.second.has_value() && at.first == name) {
134144
at.second.reset();
135145
return;
136146
}
@@ -262,8 +272,32 @@ ResultTile::TileTuple* ResultTile::tile_tuple(const std::string& name) {
262272
}
263273

264274
void ResultTile::wait_all_coords() const {
265-
for (auto& coord_tile : coord_tiles_) {
266-
coord_tile.second->fixed_tile().data_as<char>();
275+
for (auto& at : coord_tiles_) {
276+
auto& tile_tuple = at.second;
277+
if (tile_tuple.has_value()) {
278+
tile_tuple.value().fixed_tile().data();
279+
if (tile_tuple.value().var_tile_opt().has_value()) {
280+
tile_tuple.value().var_tile_opt().value().data();
281+
}
282+
if (tile_tuple.value().validity_tile_opt().has_value()) {
283+
tile_tuple.value().validity_tile_opt().value().data();
284+
}
285+
}
286+
}
287+
}
288+
289+
void ResultTile::wait_all_attrs() const {
290+
for (auto& at : attr_tiles_) {
291+
const auto& tile_tuple = at.second;
292+
if (tile_tuple.has_value()) {
293+
tile_tuple.value().fixed_tile().data();
294+
if (tile_tuple.value().var_tile_opt().has_value()) {
295+
tile_tuple.value().var_tile_opt().value().data();
296+
}
297+
if (tile_tuple.value().validity_tile_opt().has_value()) {
298+
tile_tuple.value().validity_tile_opt().value().data();
299+
}
300+
}
267301
}
268302
}
269303

tiledb/sm/query/readers/result_tile.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,16 @@ class ResultTile {
396396
return validity_tile_.value();
397397
}
398398

399+
/** @returns Var tile. */
400+
const std::optional<Tile>& var_tile_opt() const {
401+
return var_tile_;
402+
}
403+
404+
/** @returns Validity tile. */
405+
const std::optional<Tile>& validity_tile_opt() const {
406+
return validity_tile_;
407+
}
408+
399409
/** @returns Fixed tile. */
400410
const Tile& fixed_tile() const {
401411
return fixed_tile_;
@@ -457,7 +467,7 @@ class ResultTile {
457467
DISABLE_MOVE_AND_MOVE_ASSIGN(ResultTile);
458468

459469
/** Default destructor. */
460-
~ResultTile() = default;
470+
virtual ~ResultTile();
461471

462472
/* ********************************* */
463473
/* API */
@@ -746,6 +756,9 @@ class ResultTile {
746756
/* Waits for all coord tiles results to be available */
747757
void wait_all_coords() const;
748758

759+
/* Waits for all attr tiles results to be available */
760+
void wait_all_attrs() const;
761+
749762
protected:
750763
/* ********************************* */
751764
/* PROTECTED ATTRIBUTES */

tiledb/sm/tile/tile.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -112,14 +112,14 @@ TileBase::TileBase(
112112
const uint64_t cell_size,
113113
const uint64_t size,
114114
tdb::pmr::memory_resource* resource,
115-
const bool ignore_tasks)
115+
const bool skip_waiting_on_io_task)
116116
: resource_(resource)
117117
, data_(tdb::pmr::make_unique<std::byte>(resource_, size))
118118
, size_(size)
119119
, cell_size_(cell_size)
120120
, format_version_(format_version)
121121
, type_(type)
122-
, ignore_tasks_(ignore_tasks) {
122+
, skip_waiting_on_io_task_(skip_waiting_on_io_task) {
123123
/*
124124
* We can check for a bad allocation after initialization without risk
125125
* because none of the other member variables use its value for their own
@@ -211,7 +211,7 @@ WriterTile::WriterTile(
211211

212212
void TileBase::read(
213213
void* const buffer, const uint64_t offset, const uint64_t nbytes) const {
214-
if (!ignore_tasks_) {
214+
if (!skip_waiting_on_io_task_) {
215215
if (unfilter_data_compute_task_.valid()) {
216216
throw_if_not_ok(unfilter_data_compute_task_.wait());
217217
} else {
@@ -312,7 +312,7 @@ void WriterTile::write_var(const void* data, uint64_t offset, uint64_t nbytes) {
312312

313313
uint64_t Tile::load_chunk_data(
314314
ChunkData& unfiltered_tile, uint64_t expected_original_size) {
315-
// std::scoped_lock<std::recursive_mutex> lock{filtered_data_io_task_mtx_};
315+
std::scoped_lock<std::recursive_mutex> lock{filtered_data_io_task_mtx_};
316316
assert(filtered());
317317

318318
Deserializer deserializer(filtered_data(), filtered_size());

tiledb/sm/tile/tile.h

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -62,23 +62,28 @@ class TileBase {
6262
* @param cell_size The cell size.
6363
* @param size The size of the tile.
6464
* @param resource The memory resource to use.
65-
* @param data_io_task The I/O task to wait on for data to be valid.
65+
* @param skip_waiting_on_io_task whether to skip waiting on I/O tasks and
66+
* directly access data() or block. By default is false, so by default we
67+
* block waiting. Used when we create generic tiles or in testing.
6668
*/
6769
TileBase(
6870
const format_version_t format_version,
6971
const Datatype type,
7072
const uint64_t cell_size,
7173
const uint64_t size,
7274
tdb::pmr::memory_resource* resource,
73-
const bool ignore_tasks = false);
75+
const bool skip_waiting_on_io_task = false);
7476

7577
DISABLE_COPY_AND_COPY_ASSIGN(TileBase);
7678
DISABLE_MOVE_AND_MOVE_ASSIGN(TileBase);
7779

78-
~TileBase() {
79-
// TODO: destructor should not throw, catch any exceptions
80+
virtual ~TileBase() {
8081
if (unfilter_data_compute_task_.valid()) {
81-
auto st = unfilter_data_compute_task_.wait();
82+
try {
83+
auto st = unfilter_data_compute_task_.wait();
84+
} catch (...) {
85+
return;
86+
}
8287
}
8388
}
8489

@@ -118,7 +123,7 @@ class TileBase {
118123

119124
/** Returns the internal buffer. */
120125
inline void* data() const {
121-
if (!ignore_tasks_) {
126+
if (!skip_waiting_on_io_task_) {
122127
if (unfilter_data_compute_task_.valid()) {
123128
throw_if_not_ok(unfilter_data_compute_task_.wait());
124129
} else {
@@ -193,18 +198,12 @@ class TileBase {
193198
/** The tile data type. */
194199
Datatype type_;
195200

196-
const bool ignore_tasks_;
201+
/** Whether to block waiting for io data to be ready before accessing data()
202+
*/
203+
const bool skip_waiting_on_io_task_;
197204

198205
/** Compute task to check and block on if unfiltered data is ready. */
199206
mutable ThreadPool::SharedTask unfilter_data_compute_task_;
200-
201-
/**
202-
* Lock for checking task, since this tile can be used by multiple threads.
203-
* The ThreadPool::SharedTask lets multiple threads copy the task, but it
204-
* doesn't let multiple threads access a single task itself. Due to this we
205-
* need a mutext since the tile will be accessed by multiple threads.
206-
*/
207-
mutable std::recursive_mutex unfilter_data_compute_task_mtx_;
208207
};
209208

210209
/**
@@ -285,9 +284,12 @@ class Tile : public TileBase {
285284
DISABLE_COPY_AND_COPY_ASSIGN(Tile);
286285

287286
~Tile() {
288-
// TODO: destructor should not throw, catch any exceptions
289287
if (unfilter_data_compute_task_.valid()) {
290-
auto st = unfilter_data_compute_task_.wait();
288+
try {
289+
auto st = unfilter_data_compute_task_.wait();
290+
} catch (...) {
291+
return;
292+
}
291293
}
292294
}
293295

@@ -519,7 +521,6 @@ class WriterTile : public TileBase {
519521
* @param cell_size The cell size.
520522
* @param size The size of the tile.
521523
* @param memory_tracker The memory tracker to use.
522-
* @param data_io_task The I/O task to wait on for data to be valid.
523524
*/
524525
WriterTile(
525526
const format_version_t format_version,
@@ -536,7 +537,6 @@ class WriterTile : public TileBase {
536537
* @param cell_size The cell size.
537538
* @param size The size of the tile.
538539
* @param resource The memory resource to use.
539-
* @param data_io_task The I/O task to wait on for data to be valid.
540540
*/
541541
WriterTile(
542542
const format_version_t format_version,

0 commit comments

Comments
 (0)