blob: fddafcd903e5fee45ed2af7e6a633a6a6bc3a20a [file] [log] [blame]
/*
*
* Copyright 2017 gRPC authors.
*
* Licensed 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 GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_RETRY_THROTTLE_H
#define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_RETRY_THROTTLE_H
#include <grpc/support/port_platform.h>
#include "src/core/lib/gprpp/ref_counted.h"
namespace grpc_core {
namespace internal {
/// Tracks retry throttling data for an individual server name.
class ServerRetryThrottleData : public RefCounted<ServerRetryThrottleData> {
public:
ServerRetryThrottleData(intptr_t max_milli_tokens, intptr_t milli_token_ratio,
ServerRetryThrottleData* old_throttle_data);
/// Records a failure. Returns true if it's okay to send a retry.
bool RecordFailure();
/// Records a success.
void RecordSuccess();
intptr_t max_milli_tokens() const { return max_milli_tokens_; }
intptr_t milli_token_ratio() const { return milli_token_ratio_; }
private:
// So Delete() can call our private dtor.
template <typename T>
friend void grpc_core::Delete(T*);
~ServerRetryThrottleData();
void GetReplacementThrottleDataIfNeeded(
ServerRetryThrottleData** throttle_data);
const intptr_t max_milli_tokens_;
const intptr_t milli_token_ratio_;
gpr_atm milli_tokens_;
// A pointer to the replacement for this ServerRetryThrottleData entry.
// If non-nullptr, then this entry is stale and must not be used.
// We hold a reference to the replacement.
gpr_atm replacement_ = 0;
};
/// Global map of server name to retry throttle data.
class ServerRetryThrottleMap {
public:
/// Initializes global map of failure data for each server name.
static void Init();
/// Shuts down global map of failure data for each server name.
static void Shutdown();
/// Returns the failure data for \a server_name, creating a new entry if
/// needed.
static RefCountedPtr<ServerRetryThrottleData> GetDataForServer(
const char* server_name, intptr_t max_milli_tokens,
intptr_t milli_token_ratio);
};
} // namespace internal
} // namespace grpc_core
#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_RETRY_THROTTLE_H */