类:Mongo::Cluster::CursorReaper Private

继承:
对象
  • 对象
显示全部
包括:
可重试
定义于:
build/Ruby-driver-v 2.19 /lib/mongo/cluster/reapers/cursor_reaper.rb

Overview

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

一种管理器,它会定期发送终止游标操作,以关闭已进行垃圾收集但未耗尽的游标。

由于:

  • 2.3.0

常量摘要折叠

FREQUENCY =

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

游标回收器发送待处理终止游标操作的默认时间间隔。

由于:

  • 2.3.0

1.冻结

实例属性摘要折叠

实例方法摘要折叠

Retryable 中包含的方法

#read_worker#select_server#write_worker

构造函数详情

#初始化(集群) ⇒ CursorReaper

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

创建游标收割器。

参数:

  • 集群 (集群)

    集群。

由于:

  • 2.3.0



42
43
44
45
46
47
48
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cluster/reapers/cursor_reaper.rb', 第42行

def 初始化(集群)
  @cluster = 集群
  @to_kill = {}
  @active_cursor_ids = .new
  @mutex = 互斥锁.new
  @kill_spec_queue = 队列.new
end

实例属性详细信息

# cluster对象(只读)

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

由于:

  • 2.3.0



50
51
52
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cluster/reapers/cursor_reaper.rb', 第50行

def 集群
  @cluster
end

实例方法详细信息

# kill_cursorsObject也称为: executeflush

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

执行所有待处理的终止游标操作。

例子:

执行待处理的终止游标操作。

cursor_reaper.kill_cursors

由于:

  • 2.3.0



133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cluster/reapers/cursor_reaper.rb', 第133行

def kill_cursors
  # TODO 优化此项以批处理终止游标操作
  # 服务器/ 数据库/ 集合而不是终止每个游标
  # 单独。
  循环 do
    server_address = nil

    kill_spec = @mutex.同步 do
      read_scheduled_kill_specs
      # 查找有计划销毁游标的服务器。
      server_address, specs =
        @to_kill.检测 { |_, specs| specs.任何? }

      if specs.nil?
        # 所有服务器都有空规范,无需执行任何操作。
        return
      end

      # 请注意,这会改变队列中的规范。
      # 如果终止游标操作失败,我们不会尝试
      # 再次终止该游标。
      spec = specs.采取(1).点击 do |位址再呼叫暂存器 (ARR)|
        specs.减去(位址再呼叫暂存器 (ARR))
      end.first

      除非 @active_cursor_ids.包括?(spec.cursor_id)
        # 游标已被终止,通常是因为它已
        # 已迭代完成。 从中删除终止规范
        # 我们的记录,无需执行任何其他工作。
        spec = nil
      end

      spec
    end

    # 如果有一个规范要终止,但其游标已被终止,
    # 查找另一个规范。
    来年 除非 kill_spec

    # 我们还可以将 kill_spec 直接传递到 KillCursors
    # 操作,尽管这会使该操作具有
    # 与所有其他接受哈希值的 API 不同的 API。
    spec = {
      cursor_id: [kill_spec.cursor_id],
      coll_name: kill_spec.coll_name,
      db_name: kill_spec.db_name,
    }
    op = 操作::killCursors.new(spec)

    server = 集群.服务器.检测 do |server|
      server.地址 == server_address
    end

    除非 server
      # TODO 我们目前没有用于该解决的服务器
      # 游标关联于。 我们应该将游标留在
      # 队列稍后(当服务器恢复时)被终止。
      来年
    end

    选项 = {
      server_api: server.选项[:server_api],
      connection_global_id: kill_spec.connection_global_id,
    }
    op.执行(server, 上下文: 操作::上下文.new(选项: 选项))

    if 会话 = kill_spec.会话
      if 会话.隐式?
        会话.end_session
      end
    end
  end
end

# read_scheduled_kill_specs对象

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

读取并解码计划的终止游标操作。

此方法无需锁定即可更改实例变量,因此不是线程安全的。 一般来说,它不应被称为自身,这是“kill_cursor”方法的辅助方法。

由于:

  • 2.3.0



114
115
116
117
118
119
120
121
122
123
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cluster/reapers/cursor_reaper.rb', 第114行

def read_scheduled_kill_specs
  while kill_spec = @kill_spec_queue.Pop(true)
    if @active_cursor_ids.包括?(kill_spec.cursor_id)
      @to_kill[kill_spec.server_address] ||= .new
      @to_kill[kill_spec.server_address] << kill_spec
    end
  end
救援 ThreadError
  # 清空队列,无需执行任何操作。
end

#register_cursor ( ID ) ⇒对象

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

将游标ID 注册为活动游标。

例子:

将游标注册为活动游标。

cursor_reaper.register_cursor(id)

参数:

  • id ( Integer )

    要注册为活动游标的 ID。

由于:

  • 2.3.0



71
72
73
74
75
76
77
78
79
80
81
82
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cluster/reapers/cursor_reaper.rb', 第71行

def register_cursor(id)
  if id.nil?
    提高 ArgumentError, '用 nil cursor_id 调用register_cursor '
  end
  if id == 0
    提高 ArgumentError, '用 cursor_id= 0调用了register_cursor '
  end

  @mutex.同步 do
    @active_cursor_ids << id
  end
end

# schedule_kill_cursor (kill_spec) ⇒对象

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

安排最终执行的终止游标操作。

参数:

由于:

  • 2.3.0



57
58
59
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cluster/reapers/cursor_reaper.rb', 第57行

def schedule_kill_cursor(kill_spec)
  @kill_spec_queue << kill_spec
end

#unregister_cursor(id) ⇒ Object

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

取消注册游标 ID,表示其不再处于活动状态。

例子:

Unregister a cursor.

cursor_reaper.unregister_cursor(id)

参数:

  • id ( Integer )

    要取消注册的游标的 ID。

由于:

  • 2.3.0



94
95
96
97
98
99
100
101
102
103
104
105
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cluster/reapers/cursor_reaper.rb', 第94行

def unregister_cursor(id)
  if id.nil?
    提高 ArgumentError, ' unregister_cursor Called with nil cursor_id '
  end
  if id == 0
    提高 ArgumentError, ' unregister_cursor 使用 cursor_id= 0调用'
  end

  @mutex.同步 do
    @active_cursor_ids.删除(id)
  end
end