Skip to content

Commit

Permalink
docs(pubsub): document RetryPolicy interface (#12030)
Browse files Browse the repository at this point in the history
  • Loading branch information
coryan authored Jul 6, 2023
1 parent 8339831 commit f583e3f
Showing 1 changed file with 123 additions and 11 deletions.
134 changes: 123 additions & 11 deletions google/cloud/pubsub/retry_policy.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
#include "google/cloud/pubsub/version.h"
#include "google/cloud/internal/retry_policy_impl.h"
#include "google/cloud/status.h"
#include <chrono>
#include <memory>

namespace google {
namespace cloud {
Expand All @@ -40,19 +42,129 @@ GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END
namespace pubsub {
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN

/// The base class for retry policies.
using RetryPolicy = ::google::cloud::internal::TraitBasedRetryPolicy<
pubsub_internal::RetryTraits>;
/// The base class for the Pub/Sub library retry policies.
class RetryPolicy : public google::cloud::RetryPolicy {
public:
/// Creates a new instance of the policy, reset to the initial state.
virtual std::unique_ptr<RetryPolicy> clone() const = 0;
};

/**
* A retry policy based on counting errors.
*
* This policy stops retrying if:
* - An RPC returns a non-transient error.
* - More than a prescribed number of transient failures is detected.
*
* In this class the following status codes are treated as transient errors:
* - [`kAborted`](@ref google::cloud::StatusCode)
* - [`kInternal`](@ref google::cloud::StatusCode)
* - [`kUnavailable`](@ref google::cloud::StatusCode)
* - [`kResourceExhausted`](@ref google::cloud::StatusCode)
*/
class LimitedErrorCountRetryPolicy : public RetryPolicy {
public:
/**
* Create an instance that tolerates up to @p maximum_failures transient
* errors.
*
* @note Disable the retry loop by providing an instance of this policy with
* @p maximum_failures == 0.
*/
explicit LimitedErrorCountRetryPolicy(int maximum_failures)
: impl_(maximum_failures) {}

LimitedErrorCountRetryPolicy(LimitedErrorCountRetryPolicy&& rhs) noexcept
: LimitedErrorCountRetryPolicy(rhs.maximum_failures()) {}
LimitedErrorCountRetryPolicy(LimitedErrorCountRetryPolicy const& rhs) noexcept
: LimitedErrorCountRetryPolicy(rhs.maximum_failures()) {}

int maximum_failures() const { return impl_.maximum_failures(); }

bool OnFailure(Status const& s) override { return impl_.OnFailure(s); }
bool IsExhausted() const override { return impl_.IsExhausted(); }
bool IsPermanentFailure(Status const& s) const override {
return impl_.IsPermanentFailure(s);
}
std::unique_ptr<RetryPolicy> clone() const override {
return std::make_unique<LimitedErrorCountRetryPolicy>(
impl_.maximum_failures());
}

// This is provided only for backwards compatibility.
using BaseType = RetryPolicy;

private:
google::cloud::internal::LimitedErrorCountRetryPolicy<
pubsub_internal::RetryTraits>
impl_;
};

/**
* A retry policy based on elapsed time.
*
* This policy stops retrying if:
* - An RPC returns a non-transient error.
* - The elapsed time in the retry loop exceeds a prescribed duration.
*
* In this class the following status codes are treated as transient errors:
* - [`kAborted`](@ref google::cloud::StatusCode)
* - [`kInternal`](@ref google::cloud::StatusCode)
* - [`kUnavailable`](@ref google::cloud::StatusCode)
* - [`kResourceExhausted`](@ref google::cloud::StatusCode)
*/
class LimitedTimeRetryPolicy : public RetryPolicy {
public:
/**
* Constructor given a `std::chrono::duration<>` object.
*
* @tparam DurationRep a placeholder to match the `Rep` tparam for
* @p maximum_duration's type. The semantics of this template parameter
* are documented in `std::chrono::duration<>`. In brief, the underlying
* arithmetic type used to store the number of ticks. For our purposes it
* is simply a formal parameter.
* @tparam DurationPeriod a placeholder to match the `Period` tparam for
* @p maximum_duration's type. The semantics of this template parameter
* are documented in `std::chrono::duration<>`. In brief, the length of
* the tick in seconds, expressed as a `std::ratio<>`. For our purposes it
* is simply a formal parameter.
* @param maximum_duration the maximum time allowed before the policy expires,
* while the application can express this time in any units they desire,
* the class truncates to milliseconds.
*
* @see https://en.cppreference.com/w/cpp/chrono/duration for more details
* about `std::chrono::duration`.
*/
template <typename DurationRep, typename DurationPeriod>
explicit LimitedTimeRetryPolicy(
std::chrono::duration<DurationRep, DurationPeriod> maximum_duration)
: impl_(maximum_duration) {}

/// A retry policy that limits based on time.
using LimitedTimeRetryPolicy =
::google::cloud::internal::LimitedTimeRetryPolicy<
pubsub_internal::RetryTraits>;
LimitedTimeRetryPolicy(LimitedTimeRetryPolicy&& rhs) noexcept
: LimitedTimeRetryPolicy(rhs.maximum_duration()) {}
LimitedTimeRetryPolicy(LimitedTimeRetryPolicy const& rhs) noexcept
: LimitedTimeRetryPolicy(rhs.maximum_duration()) {}

/// A retry policy that limits the number of times a request can fail.
using LimitedErrorCountRetryPolicy =
google::cloud::internal::LimitedErrorCountRetryPolicy<
pubsub_internal::RetryTraits>;
std::chrono::milliseconds maximum_duration() const {
return impl_.maximum_duration();
}

bool OnFailure(Status const& s) override { return impl_.OnFailure(s); }
bool IsExhausted() const override { return impl_.IsExhausted(); }
bool IsPermanentFailure(Status const& s) const override {
return impl_.IsPermanentFailure(s);
}
std::unique_ptr<RetryPolicy> clone() const override {
return std::make_unique<LimitedTimeRetryPolicy>(impl_.maximum_duration());
}

// This is provided only for backwards compatibility.
using BaseType = RetryPolicy;

private:
google::cloud::internal::LimitedTimeRetryPolicy<pubsub_internal::RetryTraits>
impl_;
};

GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END
} // namespace pubsub
Expand Down

0 comments on commit f583e3f

Please sign in to comment.