模块:Mongo::Retryable

扩展方式:
可转发
包含在:
Cluster::CursorReaper Collection Collection::View::Aggregation::Behavior Collection::View::ChangeStream Collection::View::MapReduce Cursor Database Database::View Index::View SearchIndex: :View Server::Connection Session
定义于:
lib/ Mongo/retryable.rb,
lib/ Mongo/retryable/base_worker.rb,
lib/ Mongo/retryable/read_worker.rb,
lib/ Mongo/retryable/back压.rb,
lib/ Mongo/retryable/retry_policy.rb,
lib/ Mongo/retryable/write_worker.rb

Overview

定义有关重试操作的基本行为。

由于:

  • 2.1.0

在命名空间下定义

模块: 背压 类: BaseWorkerReadWorkerRetryPolicyWriteWorker

实例方法摘要折叠

实例方法详细信息

# read_worker对象

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

注意:

这只是一个公共方法,因此测试可以基于它添加期望。

返回用于处理可重试读取的读取工作线程。

由于:

  • 2.1.0



86
87
88
# File 'lib/ Mongo/retryable.rb', line 86

def read_worker
  @read_worker ||= ReadWorker.new(self)
end

#select_server(集群, server_selector, session, failed_server = nil, error: nil, timeout: nil) ⇒ Mongo::服务器

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

这是一种单独的方法,使测试套件可以断言在重试尝试期间已执行服务器选择。

这是一个公共方法,因此可以根据需要通过读取和写入工作线程委托进行访问。

返回:

由于:

  • 2.1.0



49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/ Mongo/retryable.rb', line 49

def select_server(集群, server_selector, 会话, failed_server = nil, 错误: nil, timeout: nil)
  deprioritized = if failed_server && deprioritize_server?(集群, 错误)
                    [ failed_server ]
                  else
                    []
                  end
  server_selector.select_server(
    集群,
    nil,
    会话,
    取消优先级: deprioritized,
    timeout: 超时
  )
end

#with_overload_retry (context: nil, retry_enabled: true) ⇒ 对象

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

使用重载重试逻辑包装操作。出现过载错误 (SystemOverloadedError + RetryableError),使用指数退避重试区块,最多 MAX_RETRIES 次。

该区块应包括服务器选择,以便在重试时重新完成。对于游标操作 (getMore),由于游标已固定,因此会重复使用同一服务器。

参数:

  • 上下文 (Operation::Context | nil) (默认为: nil

    CSOT 截止时间检查的操作上下文。

  • retry_enabled ( true | false ) (默认为: true

    是否允许过载重试。如果为 false,则立即引发重载错误而不重试(在禁用 retryReads/retryWrites 时使用)。

返回:

  • ( Object )

    区块的结果。

由于:

  • 2.1.0



117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# File 'lib/ Mongo/retryable.rb', line 117

def with_overload_retry(上下文: nil, retry_enabled: true)
  return 产量 除非 retry_enabled

  error_count = 0
  循环 do
    结果 = 产量

    return 结果
  救援 错误::超时错误
    提高
  救援 错误::OperationFailure::家庭情况 => e
    提高 e 除非 e.标签?('SystemOverloadedError') && e.标签?('RetryableError')

    error_count += 1
    policy = 客户端.retry_policy
    延迟 = policy.backoff_delay(error_count)
    提高 e 除非 policy.should_retry_overload?(error_count, 延迟, 上下文: 上下文)

    记录器.记录器.WARN("过载重试由于以下原因:#{e..name}: #{e.message}")
    睡眠(延迟)
  end
end

# write_worker对象

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

注意:

这只是一个公共方法,因此测试可以基于它添加期望。

返回用于处理可重试写入的写入工作线程。

由于:

  • 2.1.0



96
97
98
# File 'lib/ Mongo/retryable.rb', line 96

def write_worker
  @write_worker ||= WriteWorker.new(self)
end