Skip to content

Commit 39c665a

Browse files
authored
Add requested sizes to memory exceptions and logs. (#5346)
This adds some more context to exceptions and logging when hitting cases where we have exceeded memory budgets. --- TYPE: NO_HISTORY DESC: Add requested sizes to memory exceptions and logs.
1 parent ae4c9a1 commit 39c665a

File tree

6 files changed

+148
-123
lines changed

6 files changed

+148
-123
lines changed

test/src/unit-dense-reader.cc

Lines changed: 35 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ struct CDenseFx {
125125
std::string expected_error = std::string());
126126
void reset_config();
127127
void update_config();
128+
void check_last_error(std::string expected_error);
128129

129130
CDenseFx();
130131
~CDenseFx();
@@ -189,6 +190,16 @@ void CDenseFx::update_config() {
189190
tiledb_config_free(&config);
190191
}
191192

193+
void CDenseFx::check_last_error(std::string expected_error) {
194+
tiledb_error_t* err = NULL;
195+
tiledb_ctx_get_last_error(ctx_, &err);
196+
// Retrieve the error message by invoking `tiledb_error_message`.
197+
const char* msg;
198+
tiledb_error_message(err, &msg);
199+
CHECK_THAT(
200+
std::string(msg), Catch::Matchers::ContainsSubstring(expected_error));
201+
}
202+
192203
void CDenseFx::create_default_array_1d() {
193204
int domain[] = {1, 200};
194205
int tile_extent = 10;
@@ -516,13 +527,7 @@ void CDenseFx::read(
516527
CHECK(rc == TILEDB_OK);
517528
} else {
518529
CHECK(rc == TILEDB_ERR);
519-
tiledb_error_t* err = NULL;
520-
tiledb_ctx_get_last_error(ctx_, &err);
521-
522-
// Retrieve the error message by invoking `tiledb_error_message`.
523-
const char* msg;
524-
tiledb_error_message(err, &msg);
525-
CHECK(expected_error == std::string(msg));
530+
check_last_error(expected_error);
526531
}
527532

528533
// Check the internal loop count against expected value.
@@ -644,13 +649,7 @@ void CDenseFx::read_strings(
644649
CHECK(rc == TILEDB_OK);
645650
} else {
646651
CHECK(rc == TILEDB_ERR);
647-
tiledb_error_t* err = NULL;
648-
tiledb_ctx_get_last_error(ctx_, &err);
649-
650-
// Retrieve the error message by invoking `tiledb_error_message`.
651-
const char* msg;
652-
tiledb_error_message(err, &msg);
653-
CHECK(expected_error == std::string(msg));
652+
check_last_error(expected_error);
654653
}
655654

656655
if (rc == TILEDB_OK) {
@@ -820,16 +819,7 @@ void CDenseFx::read_fixed_strings(
820819
CHECK(rc == TILEDB_OK);
821820
} else {
822821
CHECK(rc == TILEDB_ERR);
823-
824-
if (rc == TILEDB_ERR) {
825-
tiledb_error_t* err = NULL;
826-
tiledb_ctx_get_last_error(ctx_, &err);
827-
828-
// Retrieve the error message by invoking `tiledb_error_message`.
829-
const char* msg;
830-
tiledb_error_message(err, &msg);
831-
CHECK(expected_error == std::string(msg));
832-
}
822+
check_last_error(expected_error);
833823
}
834824

835825
if (rc == TILEDB_OK) {
@@ -919,7 +909,8 @@ TEST_CASE_METHOD(
919909
data_r,
920910
&data_r_size,
921911
0,
922-
"DenseReader: Cannot load tile offsets, increase memory budget");
912+
"DenseReader: Cannot load tile offsets");
913+
check_last_error("increase memory budget");
923914
}
924915

925916
TEST_CASE_METHOD(
@@ -979,16 +970,16 @@ TEST_CASE_METHOD(
979970
tile_upper_memory_limit_ = "50";
980971
update_config();
981972

982-
std::string error_expected =
983-
use_qc ?
984-
"DenseReader: Cannot process a single tile because of query "
985-
"condition, increase memory budget" :
986-
"DenseReader: Cannot process a single tile, increase memory budget";
973+
std::string error_expected = use_qc ?
974+
"DenseReader: Cannot process a single tile "
975+
"because of query condition" :
976+
"DenseReader: Cannot process a single tile";
987977

988978
// Try to read.
989979
int data_r[20] = {0};
990980
uint64_t data_r_size = sizeof(data_r);
991981
read(subarray, data_r, &data_r_size, use_qc, error_expected);
982+
check_last_error("increase memory budget");
992983
}
993984

994985
TEST_CASE_METHOD(
@@ -1063,10 +1054,9 @@ TEST_CASE_METHOD(
10631054
update_config();
10641055

10651056
std::string error_expected =
1066-
use_qc ?
1067-
"DenseReader: Cannot process a single tile because of query "
1068-
"condition, increase memory budget" :
1069-
"DenseReader: Cannot process a single tile, increase memory budget";
1057+
use_qc ? "DenseReader: Cannot process a single tile because of query "
1058+
"condition" :
1059+
"DenseReader: Cannot process a single tile";
10701060

10711061
// Try to read.
10721062
char data_r[NUM_CELLS * 2] = {0};
@@ -1081,6 +1071,7 @@ TEST_CASE_METHOD(
10811071
&offsets_r_size,
10821072
use_qc,
10831073
error_expected);
1074+
check_last_error("increase memory budget");
10841075
}
10851076

10861077
TEST_CASE_METHOD(
@@ -1243,7 +1234,8 @@ TEST_CASE_METHOD(
12431234
true,
12441235
true,
12451236
"DenseReader: Cannot process a single tile because of query "
1246-
"condition, increase memory budget");
1237+
"condition");
1238+
check_last_error("increase memory budget");
12471239
}
12481240

12491241
TEST_CASE_METHOD(
@@ -1300,7 +1292,8 @@ TEST_CASE_METHOD(
13001292
0,
13011293
false,
13021294
false,
1303-
"DenseReader: Cannot process a single tile, increase memory budget");
1295+
"DenseReader: Cannot process a single tile");
1296+
check_last_error("increase memory budget");
13041297

13051298
// Now read with QC set for a1 only.
13061299
read_fixed_strings(
@@ -1314,7 +1307,8 @@ TEST_CASE_METHOD(
13141307
0,
13151308
true,
13161309
false,
1317-
"DenseReader: Cannot process a single tile, increase memory budget");
1310+
"DenseReader: Cannot process a single tile");
1311+
check_last_error("increase memory budget");
13181312

13191313
// Now read with QC set for a2 only.
13201314
read_fixed_strings(
@@ -1328,7 +1322,8 @@ TEST_CASE_METHOD(
13281322
0,
13291323
false,
13301324
true,
1331-
"DenseReader: Cannot process a single tile, increase memory budget");
1325+
"DenseReader: Cannot process a single tile");
1326+
check_last_error("increase memory budget");
13321327

13331328
// Now read with QC set for a1 and a2, should fail.
13341329
read_fixed_strings(
@@ -1343,7 +1338,8 @@ TEST_CASE_METHOD(
13431338
true,
13441339
true,
13451340
"DenseReader: Cannot process a single tile because of query "
1346-
"condition, increase memory budget");
1341+
"condition");
1342+
check_last_error("increase memory budget");
13471343
}
13481344

13491345
#define LARGE_NUM_CELLS 50

tiledb/sm/query/readers/dense_reader.cc

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,10 @@ Status DenseReader::dense_read() {
330330
if (total_tile_offsets_sizes >
331331
memory_budget_ - array_memory_tracker_->get_memory_usage()) {
332332
throw DenseReaderException(
333-
"Cannot load tile offsets, increase memory budget");
333+
"Cannot load tile offsets requiring " +
334+
std::to_string(total_tile_offsets_sizes) +
335+
" bytes, increase memory budget (" + std::to_string(memory_budget_) +
336+
")");
334337
}
335338

336339
auto&& [names, var_names] = field_names_to_process(qc_loaded_attr_names_set_);
@@ -959,7 +962,11 @@ DenseReader::compute_result_space_tiles(
959962
// If a single tile doesn't fit in the available memory, we can't proceed.
960963
if (total_memory > available_memory) {
961964
throw DenseReaderException(
962-
"Cannot process a single tile, increase memory budget");
965+
"Cannot process a single tile requiring " +
966+
std::to_string(total_memory) + " bytes with " +
967+
std::to_string(available_memory) +
968+
" available, increase memory budget (" +
969+
std::to_string(memory_budget_) + ")");
963970
}
964971
}
965972

tiledb/sm/query/readers/ordered_dim_label_reader.cc

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,7 @@ uint64_t OrderedDimLabelReader::create_result_tiles() {
491491

492492
// Process ranges one by one.
493493
for (uint64_t r = 0; r < ranges_.size(); r++) {
494-
// Add tiles for each fragments.
494+
// Add tiles for each fragment.
495495
for (unsigned f = 0; f < fragment_metadata_.size(); f++) {
496496
// Add the tiles for the start/end range.
497497
for (uint8_t range_index = 0; range_index < 2; range_index++) {
@@ -524,7 +524,10 @@ uint64_t OrderedDimLabelReader::create_result_tiles() {
524524
} else {
525525
if (r == 0) {
526526
throw OrderedDimLabelReaderException(
527-
"Can't process a single range, increase memory budget");
527+
"Can't process a single range requiring " +
528+
std::to_string(tile_size) +
529+
" bytes, increase memory budget(" +
530+
std::to_string(memory_budget_) + ")");
528531
}
529532
return r;
530533
}

0 commit comments

Comments
 (0)