| 1435 | } |
| 1436 | |
| 1437 | int Sorter::MaxRunsInNextMerge() const { |
| 1438 | int num_available_buffers = buffer_pool_client_->GetUnusedReservation() / page_len_; |
| 1439 | DCHECK_GE(num_available_buffers, ComputeMinReservation() / page_len_); |
| 1440 | int num_runs_in_one_merge = 0; |
| 1441 | int num_required_buffers = 0; |
| 1442 | |
| 1443 | for (int i = 0; i < sorted_runs_.size(); ++i) { |
| 1444 | int num_buffers_for_this_run = (sorted_runs_[i]->HasVarLenPages()) ? 2 : 1; |
| 1445 | |
| 1446 | if (num_required_buffers + num_buffers_for_this_run <= num_available_buffers) { |
| 1447 | num_required_buffers += num_buffers_for_this_run; |
| 1448 | ++num_runs_in_one_merge; |
| 1449 | } else { |
| 1450 | // Not enough buffers to merge all the runs in one final merge. Intermediate merge |
| 1451 | // is required. |
| 1452 | // Increasing the required buffers count to include the result run of the |
| 1453 | // intermediate merge. |
| 1454 | num_required_buffers += |
| 1455 | (output_row_desc_->tuple_descriptors()[0]->HasVarlenSlots()) ? 2 : 1; |
| 1456 | // Have to reduce the number of runs for this merge to fit in the available buffer |
| 1457 | // pool memory. |
| 1458 | for (int j = i - 1; j >= 0; --j) { |
| 1459 | num_required_buffers -= sorted_runs_[j]->HasVarLenPages() ? 2 : 1; |
| 1460 | --num_runs_in_one_merge; |
| 1461 | if (num_required_buffers <= num_available_buffers) break; |
| 1462 | } |
| 1463 | DCHECK_LE(num_required_buffers, num_available_buffers); |
| 1464 | break; |
| 1465 | } |
| 1466 | } |
| 1467 | |
| 1468 | DCHECK_GT(num_runs_in_one_merge, 1); |
| 1469 | return num_runs_in_one_merge; |
| 1470 | } |
| 1471 | |
| 1472 | void Sorter::TryToIncreaseMemAllocationForMerge() { |
| 1473 | int pages_needed_for_full_merge = 0; |
nothing calls this directly
no test coverage detected