类:Mongo::Cluster::CursorReaper Private

继承:
对象
  • 对象
显示全部
包括:
可重试
定义于:
lib/ Mongo/ 集群/reapers/cursor_reaper.rb

Overview

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

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

由于:

  • 2.3.0

常量摘要折叠

FREQUENCY =

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

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

由于:

  • 2.3.0

1

实例属性摘要折叠

实例方法摘要折叠

Retryable 中包含的方法

#read_worker#select_server#with_overload_retry#write_worker

构造函数详情

#初始化(集群) ⇒ CursorReaper

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

创建游标收割器。

参数:

  • 集群 (集群)

    集群。

由于:

  • 2.3.0



39
40
41
42
43
44
45
# File 'lib/ Mongo/ 集群/reapers/cursor_reaper.rb', line 39

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

实例属性详细信息

# cluster对象(只读)

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

由于:

  • 2.3.0



47
48
49
# File 'lib/ Mongo/ 集群/reapers/cursor_reaper.rb', line 47

def 集群
  @cluster
end

实例方法详细信息

# kill_cursorsObject也称为: executeflush

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

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

例子:

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

cursor_reaper.kill_cursors

由于:

  • 2.3.0



126
127
128
129
130
131
132
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
# File 'lib/ Mongo/ 集群/reapers/cursor_reaper.rb', line 126

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
      # 此游标的服务器已消失 --- 可能是暂时消失,
      # 也许是永久的,但我们不知道。要防止连接
      # 如果发生永久故障,我们会静默地进行泄漏
      # 删除此 killspec 并继续。
      来年
    end

    选项 = {
      server_api: server.选项[:server_api],
      connection_global_id: kill_spec.connection_global_id,
    }
    if 连接 = kill_spec.连接
      op.execute_with_connection(连接, 上下文: 操作::上下文.new(选项: 选项))
      连接.connection_pool.check_in(连接)
    else
      op.执行(server, 上下文: 操作::上下文.new(选项: 选项))
    end

    来年 除非 会话 = kill_spec.会话

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

# read_scheduled_kill_specs对象

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

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

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

由于:

  • 2.3.0



103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/ Mongo/ 集群/reapers/cursor_reaper.rb', line 103

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
    elsif (会话 = kill_spec.会话) && 会话.隐式?
      # 游标已关闭;立即结束会话以发布
      # 引用,而不是等待 kill_spec 超出范围。
      会话.end_session
    end
  end
救援 ThreadError
  # 清空队列,无需执行任何操作。
end

#register_cursor ( ID ) ⇒对象

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

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

例子:

将游标注册为活动游标。

cursor_reaper.register_cursor(id)

参数:

  • id ( Integer )

    要注册为活动游标的 ID。

引发:

  • ( ArgumentError )

由于:

  • 2.3.0



68
69
70
71
72
73
74
75
# File 'lib/ Mongo/ 集群/reapers/cursor_reaper.rb', line 68

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

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

# schedule_kill_cursor (kill_spec) ⇒对象

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

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

参数:

由于:

  • 2.3.0



54
55
56
# File 'lib/ Mongo/ 集群/reapers/cursor_reaper.rb', line 54

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。

引发:

  • ( ArgumentError )

由于:

  • 2.3.0



87
88
89
90
91
92
93
94
# File 'lib/ Mongo/ 集群/reapers/cursor_reaper.rb', line 87

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

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