blob: cd54c6506090c9de7fe2f78e5fe302a953a3ccc9 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
#ifndef IMPALA_RUNTIME_BUFFERPOOL_RESERVATION_UTIL_H_
#define IMPALA_RUNTIME_BUFFERPOOL_RESERVATION_UTIL_H_
#include <stdint.h>
namespace impala {
/// Utility code related to buffer reservations.
class ReservationUtil {
public:
/// There are currently two classes of memory: reserved memory (i.e. memory that is
/// reserved with reservation trackers/allocated by the buffer pool), and unreserved
/// memory (i.e. everything else; code that hasn't yet been updated to use reserved
/// memory). Eventually, all memory should be in the former category, but each operator
/// must be converted to use reserved memory and that work is ongoing. See IMPALA-4834.
/// In the meantime, the system memory must be shared between these two classes of
/// memory. RESERVATION_MEM_FRACTION and RESERVATION_MEM_MIN_REMAINING are used to
/// determine an upper bound on reserved memory for a query. Operators operate reliably
/// when they are using bounded reserved memory (e.g. staying under a limit by
/// spilling), but will generally fail if they hit a limit when trying to allocate
/// unreserved memory. Thus we need to ensure there is always space left in the query
/// memory limit for unreserved memory.
/// The fraction of the query mem limit that is used as the maximum buffer reservation
/// limit, i.e. the bound on reserved memory. It is expected that unreserved memory
/// (i.e. not accounted by buffer reservation trackers) stays within
/// (1 - RESERVATION_MEM_FRACTION).
/// TODO: remove once all operators use buffer reservations.
static const double RESERVATION_MEM_FRACTION;
/// The minimum amount of memory that should be left after buffer reservations, i.e.
/// this is the minimum amount of memory that should be left for unreserved memory.
/// TODO: remove once all operators use buffer reservations.
static const int64_t RESERVATION_MEM_MIN_REMAINING;
/// Helper function to get the query buffer reservation limit (in bytes) given a query
/// mem_limit. In other words, this determines the maximum portion of the mem_limit
/// that should go to reserved memory. The limit on reservations is computed as:
/// min(query_limit * RESERVATION_MEM_FRACTION,
/// query_limit - RESERVATION_MEM_MIN_REMAINING)
/// TODO: remove once all operators use buffer reservations.
static int64_t GetReservationLimitFromMemLimit(int64_t mem_limit);
/// Helper function to get the minimum query mem_limit (in bytes) that will be large
/// enough for a buffer reservation of size 'buffer_reservation' bytes. In other words,
/// this determines the minimum mem_limit that will be large enough to accomidate
/// 'buffer_reservation' reserved memory, as well as some amount of unreserved memory
/// (determined by a heuristic).
/// The returned mem_limit X satisfies:
/// buffer_reservation <= GetReservationLimitFromMemLimit(X)
/// TODO: remove once all operators use buffer reservations.
static int64_t GetMinMemLimitFromReservation(int64_t buffer_reservation);
};
}
#endif