| 331 | } // namespace |
| 332 | |
| 333 | int64_t GraphCapacityController::ensure_prepared(IGraphCapacityAdapter & adapter, int64_t request_size) const { |
| 334 | const auto prepared_capacities = sorted_prepared_capacities(adapter); |
| 335 | int64_t selected_capacity = 0; |
| 336 | switch (mode_) { |
| 337 | case GraphCapacityMode::Fixed: { |
| 338 | selected_capacity = adapter.fixed_capacity(); |
| 339 | if (selected_capacity <= 0) { |
| 340 | throw std::runtime_error("fixed graph capacity must be positive"); |
| 341 | } |
| 342 | if (request_size > 0 && request_size > selected_capacity) { |
| 343 | throw std::runtime_error("request exceeds fixed graph capacity"); |
| 344 | } |
| 345 | break; |
| 346 | } |
| 347 | case GraphCapacityMode::Tiered: |
| 348 | if (request_size <= 0) { |
| 349 | selected_capacity = adapter.base_capacity(); |
| 350 | break; |
| 351 | } |
| 352 | selected_capacity = select_smallest_prepared_fitting_capacity(prepared_capacities, request_size); |
| 353 | if (selected_capacity == 0) { |
| 354 | selected_capacity = adapter.canonical_capacity_for_request(request_size); |
| 355 | } |
| 356 | break; |
| 357 | case GraphCapacityMode::Grow: |
| 358 | if (request_size <= 0) { |
| 359 | selected_capacity = prepared_capacities.empty() ? adapter.base_capacity() : prepared_capacities.back(); |
| 360 | break; |
| 361 | } |
| 362 | selected_capacity = prepared_capacities.empty() ? 0 : prepared_capacities.back(); |
| 363 | if (selected_capacity < request_size) { |
| 364 | selected_capacity = adapter.canonical_capacity_for_request(request_size); |
| 365 | } |
| 366 | break; |
| 367 | case GraphCapacityMode::Double: |
| 368 | if (request_size <= 0) { |
| 369 | selected_capacity = prepared_capacities.empty() ? adapter.base_capacity() : prepared_capacities.back(); |
| 370 | break; |
| 371 | } |
| 372 | selected_capacity = prepared_capacities.empty() ? 0 : prepared_capacities.back(); |
| 373 | if (selected_capacity < request_size) { |
| 374 | selected_capacity = adapter.canonical_capacity_for_request(checked_double_capacity_request(request_size)); |
| 375 | } |
| 376 | break; |
| 377 | case GraphCapacityMode::Unsupported: |
| 378 | throw std::runtime_error("graph capacity mode is unsupported"); |
| 379 | } |
| 380 | if (selected_capacity <= 0) { |
| 381 | throw std::runtime_error("graph capacity selection must be positive"); |
| 382 | } |
| 383 | if (std::find(prepared_capacities.begin(), prepared_capacities.end(), selected_capacity) == prepared_capacities.end()) { |
| 384 | adapter.prepare_capacity(selected_capacity); |
| 385 | } |
| 386 | return selected_capacity; |
| 387 | } |
| 388 | |
| 389 | int64_t GraphCapacityController::select_capacity_for_run( |
| 390 | const IGraphCapacityAdapter & adapter, |
no test coverage detected