Skip to content

Commit 0da5c1a

Browse files
authored
Make sure buffer is large enough for fragment consolidation buffers. (#4632)
--- TYPE: NO_HISTORY DESC: Make sure buffer is large enough for fragment consolidation buffers.
1 parent 08d2774 commit 0da5c1a

File tree

1 file changed

+23
-11
lines changed

1 file changed

+23
-11
lines changed

tiledb/sm/consolidator/fragment_consolidator.cc

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -136,28 +136,40 @@ void FragmentConsolidationWorkspace::resize_buffers(
136136
total_budget = config.buffer_size_ * buffer_num;
137137
}
138138

139-
// Make sure the buffers and sizes vectors are large enough.
140-
if (buffer_num > buffers_.size()) {
141-
buffers_.resize(buffer_num);
142-
sizes_.resize(buffer_num);
143-
}
144-
145-
// Create buffers.
139+
// Calculate the size of individual buffers by assigning a weight based
140+
// percentage of the total buffer size.
146141
auto total_weights = std::accumulate(
147142
buffer_weights.begin(), buffer_weights.end(), static_cast<size_t>(0));
148143

149-
// Allocate space for each buffer.
150144
uint64_t adjusted_budget = total_budget / total_weights * total_weights;
151145

152-
if (std::max<uint64_t>(1, adjusted_budget) > backing_buffer_.size()) {
153-
backing_buffer_.resize(std::max<uint64_t>(1, adjusted_budget));
146+
if (buffer_num > buffers_.size()) {
147+
sizes_.resize(buffer_num);
154148
}
155149

156-
// Finally allocate spans for the buffers.
157150
size_t offset = 0;
158151
for (unsigned i = 0; i < buffer_num; ++i) {
159152
sizes_[i] = std::max<uint64_t>(
160153
1, adjusted_budget * buffer_weights[i] / total_weights);
154+
offset += sizes_[i];
155+
}
156+
157+
// Total size is the final offset value
158+
size_t final_budget = offset;
159+
160+
// Ensure that our backing buffer is large enough to reference the final
161+
// budget number of bytes.
162+
if (final_budget > backing_buffer_.size()) {
163+
backing_buffer_.resize(final_budget);
164+
}
165+
166+
// Finally, update our spans referencing the backing buffer.
167+
if (buffer_num > buffers_.size()) {
168+
buffers_.resize(buffer_num);
169+
}
170+
171+
offset = 0;
172+
for (unsigned i = 0; i < buffer_num; ++i) {
161173
buffers_[i] = span(&(backing_buffer_[offset]), sizes_[i]);
162174
offset += sizes_[i];
163175
}

0 commit comments

Comments
 (0)