| 2589 | |
| 2590 | |
| 2591 | size_t Query_cache::init_cache() |
| 2592 | { |
| 2593 | size_t mem_bin_count, num, step; |
| 2594 | size_t mem_bin_size, prev_size, inc; |
| 2595 | size_t max_mem_bin_size, approx_additional_data_size; |
| 2596 | int align; |
| 2597 | |
| 2598 | DBUG_ENTER("Query_cache::init_cache"); |
| 2599 | |
| 2600 | approx_additional_data_size = (sizeof(Query_cache) + |
| 2601 | sizeof(uchar*)*(def_query_hash_size+ |
| 2602 | def_table_hash_size)); |
| 2603 | if (query_cache_size < approx_additional_data_size) |
| 2604 | goto err; |
| 2605 | |
| 2606 | query_cache_size-= approx_additional_data_size; |
| 2607 | align= query_cache_size % ALIGN_SIZE(1); |
| 2608 | if (align) |
| 2609 | { |
| 2610 | query_cache_size-= align; |
| 2611 | approx_additional_data_size+= align; |
| 2612 | } |
| 2613 | |
| 2614 | /* |
| 2615 | Count memory bins number. |
| 2616 | Check section 6. in start comment for the used algorithm. |
| 2617 | */ |
| 2618 | |
| 2619 | max_mem_bin_size = query_cache_size >> QUERY_CACHE_MEM_BIN_FIRST_STEP_PWR2; |
| 2620 | mem_bin_count = (uint) ((1 + QUERY_CACHE_MEM_BIN_PARTS_INC) * |
| 2621 | QUERY_CACHE_MEM_BIN_PARTS_MUL); |
| 2622 | mem_bin_num = 1; |
| 2623 | mem_bin_steps = 1; |
| 2624 | mem_bin_size = max_mem_bin_size >> QUERY_CACHE_MEM_BIN_STEP_PWR2; |
| 2625 | prev_size = 0; |
| 2626 | if (mem_bin_size <= min_allocation_unit) |
| 2627 | { |
| 2628 | DBUG_PRINT("qcache", ("too small query cache => query cache disabled")); |
| 2629 | // TODO here (and above) should be warning in 4.1 |
| 2630 | goto err; |
| 2631 | } |
| 2632 | while (mem_bin_size > min_allocation_unit) |
| 2633 | { |
| 2634 | mem_bin_num += mem_bin_count; |
| 2635 | prev_size = mem_bin_size; |
| 2636 | mem_bin_size >>= QUERY_CACHE_MEM_BIN_STEP_PWR2; |
| 2637 | mem_bin_steps++; |
| 2638 | mem_bin_count += QUERY_CACHE_MEM_BIN_PARTS_INC; |
| 2639 | mem_bin_count = (uint) (mem_bin_count * QUERY_CACHE_MEM_BIN_PARTS_MUL); |
| 2640 | |
| 2641 | // Prevent too small bins spacing |
| 2642 | if (mem_bin_count > (mem_bin_size >> QUERY_CACHE_MEM_BIN_SPC_LIM_PWR2)) |
| 2643 | mem_bin_count= (mem_bin_size >> QUERY_CACHE_MEM_BIN_SPC_LIM_PWR2); |
| 2644 | } |
| 2645 | inc = (prev_size - mem_bin_size) / mem_bin_count; |
| 2646 | mem_bin_num += (mem_bin_count - (min_allocation_unit - mem_bin_size)/inc); |
| 2647 | mem_bin_steps++; |
| 2648 | additional_data_size = ((mem_bin_num+1) * |
nothing calls this directly
no test coverage detected