Clase: Mongo::Cluster::CursorReaper Privado

Hereda:
Objeto
  • Objeto
Mostrar todo
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.

Desde:

  • 2.3.0

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.

Desde:

  • 2.3.0

1.freeze

Colapso delresumen de atributos de instancia

Colapso del resumen del método de instancia

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.

Parámetros:

  • clúster (Grupo) -

    El cluster.

Desde:

  • 2.3.0



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

#clusterObjeto (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.

Desde:

  • 2.3.0



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_cursorsObjeto 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.

Ejemplos:

Ejecutar operaciones de cursores de eliminación pendientes.

cursor_reaper.kill_cursors

Desde:

  • 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
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

    opciones = {
      API del servidor: Server.opciones[: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: opciones))
      conexión.grupo de conexiones.registrarse(conexión)
    else
      op.ejecutar(Server, context: Operación::Context.Nuevo(opciones: 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_specsObjeto

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`.

Desde:

  • 2.3.0



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.

Ejemplos:

Registrar un cursor como activo.

cursor_reaper.register_cursor(id)

Parámetros:

  • ID. (Entero)

    El id del cursor a registrar como activo.

Desde:

  • 2.3.0



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.

Parámetros:

  • especificación de muerte (Cursor::KillSpec)

    La especificación de muerte.

Desde:

  • 2.3.0



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.

Ejemplos:

Unregister a cursor.

cursor_reaper.unregister_cursor(id)

Parámetros:

  • ID. (Entero)

    El id del cursor que se va a anular el registro.

Desde:

  • 2.3.0



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