클래스: Mongo::Cluster::CursorReaper Private

상속:
객체
  • 객체
모두 표시
다음을 포함합니다.
재시도 가능
다음에 정의됨:
build/ruby-driver-v2.19/lib/mongo/cluster/reapers/cursor_reaper.rb

개요

이 클래스는 비공개 API의 일부입니다. 이 클래스는 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

가비지 수집된 커서를 소진되지 않고 닫을 수 있도록 킬 커서(kill cursor) 작업을 정기적으로 전송하는 관리자입니다.

이후:

  • 2.3.0

상수 요약 접기

FREQUENCY =

이 상수는 비공개 API의 일부입니다. 이 상수는 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

커서 리퍼가 보류 중인 커서 종료 작업을 보내는 기본값 시간 간격입니다.

이후:

  • 2.3.0

1.동결

인스턴스 속성 요약 접기

인스턴스 메서드 요약 접기

Retryable에 포함된 메서드

#read_Worker, #select_server, #write_Worker

생성자 세부 정보

#initialize(cluster) ⇒ CursorReaper

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

커서 리퍼를 만듭니다.

매개변수:

이후:

  • 2.3.0



42
43
44
45
46
47
48
# 파일 'build/ruby-driver-v2.19/lib/mongo/cluster/reapers/cursor_reaper.rb', 줄 42

def 초기화(cluster)
  @cluster = cluster
  @to_kill = {}
  @active_cursor_ids = 세트.신규
  @mutex = 뮤텍스.신규
  @kill_spec_queue = 대기열.신규
end

인스턴스 속성 세부 정보

#cluster객체 (읽기 전용)

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

이후:

  • 2.3.0



50
51
52
# 파일 'build/ruby-driver-v2.19/lib/mongo/cluster/reapers/cursor_reaper.rb', 줄 50

def cluster
  @cluster
end

인스턴스 메서드 세부 정보

#kill_cursors객체 ~ 라고도 함: 실행, 플러시

이 메서드는 비공개 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
# 파일 'build/ruby-driver-v2.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, 사양 =
        @to_kill.감지 { |_, 사양| 사양.어떤? }

      만약 사양.nil?
        # 모든 서버의 사양이 비어 있으며 할 일이 없습니다.
        반환
      end

      # 이렇게 하면 대기열의 사양이 변경됩니다.
      # 커서 죽이기 작업이 실패하면 다음을 시도하지 않습니다.
      # 해당 커서 를 다시 종료합니다.
      사양 = 사양.가져(1). do |arr|
        사양.빼기(arr)
      end.first

      하지 않는 한 @active_cursor_ids.포함?(사양.cursor_id)
        # 커서는 이미 종료되었으며, 일반적으로 다음과 같은 이유로 인해
        # 이 반복되어 완료되었습니다. 다음에서 킬 사양 제거
        # 더 이상 작업을 수행하지 않고도 기록을 저장할 수 있습니다.
        사양 = nil
      end

      사양
    end

    # 종료할 사양이 있었지만 해당 커서가 이미 종료된 경우,
    # 다른 사양을 찾습니다.
    다음 하지 않는 한 kill_spec

    # kill_spec을 직접 KillCursors에 전달할 수도 있습니다.
    # 작업, 하지만 이렇게 하면 해당 작업이
    # 해시를 허용하는 다른 모든 API와 다른 API.
    사양 = {
      cursor_ids: [kill_spec.cursor_id],
      coll_name: kill_spec.coll_name,
      db_name: kill_spec.db_name,
    }
    op = 작업::killCursors.신규(사양)

    서버 = cluster.서버.감지 do |서버|
      서버.주소 == server_address
    end

    하지 않는 한 서버
      # TODO 현재 해당 주소 에 대한 서버 가 없습니다.
      # 커서가 연결되어 있습니다. 커서를 다음 위치에 두어야 합니다.
      # 나중에 (서버가 다시 돌아올 때) 종료될 대기열입니다.
      다음
    end

    옵션 = {
      server_api: 서버.옵션[:server_api],
      connection_global_id: kill_spec.connection_global_id,
    }
    op.실행(서버, 컨텍스트: 작업::Context.신규(옵션: 옵션))

    만약 Session = kill_spec.Session
      만약 Session.암시적?
        Session.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
# 파일 'build/ruby-driver-v2.19/lib/mongo/cluster/reapers/cursor_reaper.rb', 줄 114

def read_scheduled_kill_specs
  동안 kill_spec = @kill_spec_queue.(true)
    만약 @active_cursor_ids.포함?(kill_spec.cursor_id)
      @to_kill[kill_spec.server_address] ||= 세트.신규
      @to_kill[kill_spec.server_address] << kill_spec
    end
  end
구출 ThreadError
  # 대기열이 비어 있으면 할 일이 없습니다.
end

#Register_cursor(ID) ⇒ 객체

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

커서 ID를 활성으로 등록합니다.

예시:

커서를 활성으로 등록합니다.

cursor_reaper.register_cursor(id)

매개변수:

  • id (정수)

    활성 상태로 등록할 커서의 ID입니다.

이후:

  • 2.3.0



71
72
73
74
75
76
77
78
79
80
81
82
# 파일 'build/ruby-driver-v2.19/lib/mongo/cluster/reapers/cursor_reaper.rb', 줄 71

def register_cursor(id)
  만약 id.nil?
    올리다 ArgumentError, 'nil cursor_id로 'register_cursor가 호출됨'
  end
  만약 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
# 파일 'build/ruby-driver-v2.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 (정수)

    등록을 취소할 커서 의 ID입니다.

이후:

  • 2.3.0



94
95
96
97
98
99
100
101
102
103
104
105
# 파일 'build/ruby-driver-v2.19/lib/mongo/cluster/reapers/cursor_reaper.rb', 줄 94

def unregister_cursor(id)
  만약 id.nil?
    올리다 ArgumentError, 'nil cursor_id로 unregister_cursor가 호출됨'
  end
  만약 id == 0
    올리다 ArgumentError, 'unregister_cursor가 cursor_id=0 (으)로 호출되었습니다.'
  end

  @mutex.동기화 do
    @active_cursor_ids.삭제(id)
  end
end