Clase: Mongo::Cluster::CursorReaper Privado
- Hereda:
-
Objeto
- Objeto
- Mongo::Cluster::CursorReaper
- Incluye:
- Reutilizable
- Definido en:
- lib/mongo/cluster/reapers/cursor_reaper.rb
Overview
Esta clase forma parte de una API privada. Debe evitar usarla siempre que sea posible, ya que podría eliminarse o modificarse en el futuro.
Un administrador que envía operaciones de eliminación de cursores a intervalos regulares para cerrar los cursores que han sido recolectados como basura sin agotarse.
Colapso delresumen constante
- FRECUENCIA =
Esta constante forma parte de una API privada. Debe evitar usarla siempre que sea posible, ya que podría eliminarse o modificarse en el futuro.
El intervalo de tiempo predeterminado para que el segador de cursor envíe operaciones de eliminación de cursores pendientes.
1.freeze
Colapso delresumen de atributos de instancia
- #cluster ⇒ Object solo lectura privada
Colapso del resumen del método de instancia
-
#initialize(cluster) ⇒ CursorReaper
constructor
privada
Crea un cursor segador.
-
#kill_cursors ⇒ Objeto (también: #execute, #flush)
privada
Ejecutar todas las operaciones de cursor de eliminación pendientes.
-
#read_scheduled_kill_specs ⇒ Objeto
privada
Leer y decodificar operaciones de cursores de eliminación programadas.
-
#register_cursor(id) ⇒ Objeto
privada
Registra un ID de cursor como activo.
-
#schedule_kill_cursor(kill_spec) ⇒ Objeto
privada
Programe una operación de eliminación de cursores para que finalmente se ejecute.
-
#unregister_cursor(id) ⇒ Object
privada
Anular el registro de un ID de cursor, indicando que ya no está activo.
Métodos incluidos en Retryable
#trabajador_de_lectura, #servidor_de_selección, #trabajador_de_escritura
Detalles del constructor
#initialize(cluster) ⇒ CursorReaper
Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
Crea un cursor segador.
42 43 44 45 46 47 48 |
# Archivo 'lib/mongo/cluster/reapers/cursor_reaper.rb', línea 42 def inicializar(clúster) @cluster = clúster @para_matar = {} @active_cursor_ids = Configura.Nuevo @mutex = Mutex.Nuevo @kill_spec_queue = Queue.Nuevo end |
Detalles de los atributos de instancia
#cluster ⇒ Objeto (solo lectura)
Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
50 51 52 |
# Archivo 'lib/mongo/cluster/reapers/cursor_reaper.rb', línea 50 def clúster @cluster end |
Detalles del método de instancia
#kill_cursors ⇒ Objeto También conocido como: ejecutar, vaciar
Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
Ejecutar todas las operaciones de cursor de eliminación pendientes.
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 206 207 208 209 210 |
# Archivo 'lib/mongo/cluster/reapers/cursor_reaper.rb', línea 133 def matar_cursores # TODO optimizar esto para agrupar las operaciones de finalización de cursor para el mismo # servidor/base de datos/colección en lugar de terminar cada cursor # individualmente. bucle hacer dirección del servidor = nulo especificación de muerte = @mutex.sincronizar hacer leer_especificaciones_de_eliminación_programadas # Busque un servidor que tenga cursores programados para su destrucción. dirección del servidor, Especificaciones = @para_matar.detectar { |_, Especificaciones| Especificaciones.any? } Si Especificaciones.nil? # Todos los servidores tienen especificaciones vacías, no hay nada que hacer. return end # Tenga en cuenta que esto muta la especificación en la cola. # Si la operación de matar el cursor falla, no intentamos # mata ese cursor de nuevo. especulación = Especificaciones.tomar(1).grifo hacer |arr| Especificaciones.sustraer(arr) end.primera a no ser que @active_cursor_ids.¿incluir?(especulación.cursor_id) # El cursor ya fue eliminado, generalmente porque tiene # se ha iterado hasta completarse. Remover la especificación kill de # nuestros registros sin hacer más trabajo. especulación = nulo end especulación end # Si había una especificación a eliminar pero ya se había eliminado su cursor, # busque otra especificación. siguiente a no ser que especificación de muerte # También podríamos pasar kill_spec directamente a KillCursors # operación, aunque esto haría que esa operación tuviera un # API diferente a todas las demás que aceptan hashes. especulación = { cursor_ids: [especificación de muerte.cursor_id], nombre_coll: especificación de muerte.nombre_coll, nombre_base_datos: especificación de muerte.nombre_base_datos, } op = Operación::Matar cursores.Nuevo(especulación) Server = clúster.servidores.detectar hacer |Server| Server.dirección == dirección del servidor end a no ser que Server # TODO Actualmente no tenemos un servidor para la dirección que # cursor está asociado con. Debemos dejar el cursor en el # cola para ser eliminada más tarde (cuando el servidor vuelva a estar en línea). siguiente end = { API del servidor: Server.[:server_api], id_global_de_conexión: especificación de muerte.id_global_de_conexión, } Si conexión = especificación de muerte.conexión op.ejecutar_con_conexión(conexión, context: Operación::Context.Nuevo(opciones: )) conexión.grupo de conexiones.registrarse(conexión) else op.ejecutar(Server, context: Operación::Context.Nuevo(opciones: )) end Si sesión = especificación de muerte.sesión Si sesión.implicit? sesión.fin_sesión end end end end |
#read_scheduled_kill_specs ⇒ Objeto
Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
Leer y decodificar operaciones de cursores de eliminación programadas.
Este método muta las variables de instancia sin bloqueo, por lo que no es seguro para subprocesos. En general, no debe llamarse a sí mismo, esto es un asistente para el método ‘kill_cursor`.
114 115 116 117 118 119 120 121 122 123 |
# Archivo 'lib/mongo/cluster/reapers/cursor_reaper.rb', línea 114 def leer_especificaciones_de_eliminación_programadas mientras especificación de muerte = @kill_spec_queue.pop(true) Si @active_cursor_ids.¿incluir?(especificación de muerte.cursor_id) @para_matar[especificación de muerte.dirección del servidor] ||= Configura.Nuevo @para_matar[especificación de muerte.dirección del servidor] << especificación de muerte end end rescate Error de hilo # Cola vacía, nada que hacer. end |
#register_cursor(id) ⇒ Objeto
Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
Registra un ID de cursor como activo.
71 72 73 74 75 76 77 78 79 80 81 82 |
# Archivo 'lib/mongo/cluster/reapers/cursor_reaper.rb', línea 71 def register_cursor(ID.) Si ID..nil? propagar ArgumentError, 'register_cursor llamado con cursor_id nulo' end Si ID. == 0 propagar ArgumentError, 'register_cursor llamado con cursor_id=0 ' end @mutex.sincronizar hacer @active_cursor_ids << ID. end end |
#schedule_kill_cursor(kill_spec) ⇒ Objeto
Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
Programe una operación de eliminación de cursores para que finalmente se ejecute.
57 58 59 |
# Archivo 'lib/mongo/cluster/reapers/cursor_reaper.rb', línea 57 def programar_matar_cursor(especificación de muerte) @kill_spec_queue << especificación de muerte end |
#unregister_cursor(id) ⇒ Object
Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
Anular el registro de un ID de cursor, indicando que ya no está activo.
94 95 96 97 98 99 100 101 102 103 104 105 |
# Archivo 'lib/mongo/cluster/reapers/cursor_reaper.rb', línea 94 def unregister_cursor(ID.) Si ID..nil? propagar ArgumentError, 'unregister_cursor llamado con cursor_id nulo' end Si ID. == 0 propagar ArgumentError, 'unregister_cursor llamado con cursor_id=0 ' end @mutex.sincronizar hacer @active_cursor_ids.borrar(ID.) end end |