Home | History | Annotate | Download | only in client_channel
      1 /*
      2  *
      3  * Copyright 2017 gRPC authors.
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  *
     17  */
     18 
     19 #ifndef GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_RETRY_THROTTLE_H
     20 #define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_RETRY_THROTTLE_H
     21 
     22 #include <grpc/support/port_platform.h>
     23 
     24 #include "src/core/lib/gprpp/ref_counted.h"
     25 
     26 namespace grpc_core {
     27 namespace internal {
     28 
     29 /// Tracks retry throttling data for an individual server name.
     30 class ServerRetryThrottleData : public RefCounted<ServerRetryThrottleData> {
     31  public:
     32   ServerRetryThrottleData(intptr_t max_milli_tokens, intptr_t milli_token_ratio,
     33                           ServerRetryThrottleData* old_throttle_data);
     34 
     35   /// Records a failure.  Returns true if it's okay to send a retry.
     36   bool RecordFailure();
     37 
     38   /// Records a success.
     39   void RecordSuccess();
     40 
     41   intptr_t max_milli_tokens() const { return max_milli_tokens_; }
     42   intptr_t milli_token_ratio() const { return milli_token_ratio_; }
     43 
     44  private:
     45   // So Delete() can call our private dtor.
     46   template <typename T>
     47   friend void grpc_core::Delete(T*);
     48 
     49   ~ServerRetryThrottleData();
     50 
     51   void GetReplacementThrottleDataIfNeeded(
     52       ServerRetryThrottleData** throttle_data);
     53 
     54   const intptr_t max_milli_tokens_;
     55   const intptr_t milli_token_ratio_;
     56   gpr_atm milli_tokens_;
     57   // A pointer to the replacement for this ServerRetryThrottleData entry.
     58   // If non-nullptr, then this entry is stale and must not be used.
     59   // We hold a reference to the replacement.
     60   gpr_atm replacement_ = 0;
     61 };
     62 
     63 /// Global map of server name to retry throttle data.
     64 class ServerRetryThrottleMap {
     65  public:
     66   /// Initializes global map of failure data for each server name.
     67   static void Init();
     68   /// Shuts down global map of failure data for each server name.
     69   static void Shutdown();
     70 
     71   /// Returns the failure data for \a server_name, creating a new entry if
     72   /// needed.
     73   static RefCountedPtr<ServerRetryThrottleData> GetDataForServer(
     74       const char* server_name, intptr_t max_milli_tokens,
     75       intptr_t milli_token_ratio);
     76 };
     77 
     78 }  // namespace internal
     79 }  // namespace grpc_core
     80 
     81 #endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_RETRY_THROTTLE_H */
     82