类:Mongo::Retryable::WriteWorker Private
- 继承:
-
BaseWorker
- 对象
- BaseWorker
- Mongo::Retryable::WriteWorker
- 定义于:
- build/Ruby-driver-v 2.19 /lib/mongo/retryable/write_worker.rb
Overview
此类是私有 API 的一部分。 应尽可能避免使用此类,因为它将来可能会被删除或更改。
实现有关重试写入操作的逻辑。
实例属性摘要
从BaseWorker继承的属性
实例方法摘要折叠
-
# nro_write_with_retry (write_concern, context:) {|connection, txn_num, context| ... } ⇒ 对象
private
可重试写入包装器,适用于不支持现代可重试写入的操作。
-
# retry_write_allowed? (session, write_concern) ⇒ true | false
private
查询会话和写关注是否支持重试写入。
-
# write_with_retry (write_concern,ending_transaction: false, context:, &block) {|connection, txn_num, context| ... } ⇒ 结果
private
通过一次或多次让出传递的区块来实现写入重试功能。
从BaseWorker继承的方法
构造函数详情
该类从Mongo::Retryable::BaseWorker继承了一个构造函数
实例方法详细信息
# nro_write_with_retry (write_concern, context:) {|connection, txn_num, context| ... } ⇒对象
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
可重试写入包装器,适用于不支持现代可重试写入的操作。
如果驾驶员配置为使用现代可重试写入,则此方法只会让出传递的区块一次,因此不会重试任何写入。
如果驾驶员配置为使用传统可重试写入,则此方法将委托给使用传统逻辑执行写入重试的legacy_write_with_retry。
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
# File ' 构建/ruby-driver-v2.19/lib/ mongo /retryable/write_worker.rb', 第103行 def nro_write_with_retry(write_concern, 上下文:, 和块) 会话 = 上下文.会话 server = select_server(集群, ServerSelector.主节点, 会话) if 会话&。客户端.[:retry_writes] 开始 server.with_connection(connection_global_id: 上下文.connection_global_id) do |连接| 产量 连接, nil, 上下文 end 救援 *retryable_exceptions, 错误::PoolError, 错误::OperationFailure => e e.add_note('已禁用重试') 提高 e end else legacy_write_with_retry(server, 上下文: 上下文, 和块) end end |
# retry_write_allowed? (session, write_concern) ⇒ true | false
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
查询会话和写关注是否支持重试写入。
129 130 131 132 133 134 135 136 137 |
# File ' 构建/ruby-driver-v2.19/lib/ mongo /retryable/write_worker.rb', 第129行 def retry_write_allowed?(会话, write_concern) return false 除非 会话&。retry_writes? if write_concern.nil? true else writeConcern.获取(write_concern).已确认? end end |
# write_with_retry (write_concern,ending_transaction: false, context:, &block) {|connection, txn_num, context| ... } ⇒结果
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
注意:
这只在非主节点故障时重试操作,因为这是我们可以确定尚未发生部分写入的唯一情况。
通过一次或多次让出传递的区块来实现写入重试功能。
如果提供了会话(因此,部署支持会话),并且在客户端上启用了新式重试写入,则会调用新式重试逻辑。 否则,将调用传统重试逻辑。
如果ending_transaction参数为true,表示正在提交或中止事务,则该操作只执行一次。 请注意,由于事务需要会话,因此如果ending_transaction 为 true 且会话为 nil,则此方法将引发 ArgumentError。
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File ' 构建/ruby-driver-v2.19/lib/ mongo /retryable/write_worker.rb', 第65行 def write_with_retry(write_concern, ending_transaction: false, 上下文:, 和块) 会话 = 上下文.会话 确保有效状态!(ending_transaction, 会话) 除非 ending_transaction || retry_write_allowed?(会话, write_concern) return legacy_write_with_retry(nil, 上下文: 上下文, 和块) end # 如果我们在这里,会话不为零。 为 nil 的会话会产生 # retry_write_allowed 失败?检查。 server = select_server(集群, ServerSelector.主节点, 会话) 除非 ending_transaction || server.retry_writes? return legacy_write_with_retry(server, 上下文: 上下文, 和块) end modern_write_with_retry(会话, server, 上下文, 和块) end |