mongo 2.4.0.rc1 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (128) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/lib/mongo/auth/cr/conversation.rb +1 -1
  5. data/lib/mongo/auth/ldap/conversation.rb +1 -1
  6. data/lib/mongo/auth/scram/conversation.rb +1 -1
  7. data/lib/mongo/auth/x509/conversation.rb +4 -2
  8. data/lib/mongo/client.rb +7 -4
  9. data/lib/mongo/cluster.rb +55 -5
  10. data/lib/mongo/cluster/app_metadata.rb +7 -1
  11. data/lib/mongo/cluster/topology.rb +7 -6
  12. data/lib/mongo/cluster/topology/replica_set.rb +48 -2
  13. data/lib/mongo/cluster/topology/sharded.rb +47 -1
  14. data/lib/mongo/cluster/topology/single.rb +55 -4
  15. data/lib/mongo/cluster/topology/unknown.rb +65 -9
  16. data/lib/mongo/error/invalid_server_preference.rb +3 -1
  17. data/lib/mongo/event.rb +8 -0
  18. data/lib/mongo/event/description_changed.rb +20 -2
  19. data/lib/mongo/event/member_discovered.rb +65 -0
  20. data/lib/mongo/event/primary_elected.rb +3 -1
  21. data/lib/mongo/event/standalone_discovered.rb +1 -1
  22. data/lib/mongo/monitoring.rb +41 -0
  23. data/lib/mongo/monitoring/event.rb +6 -0
  24. data/lib/mongo/monitoring/event/server_closed.rb +46 -0
  25. data/lib/mongo/monitoring/event/server_description_changed.rb +58 -0
  26. data/lib/mongo/monitoring/event/server_opening.rb +46 -0
  27. data/lib/mongo/monitoring/event/topology_changed.rb +46 -0
  28. data/lib/mongo/monitoring/event/topology_closed.rb +41 -0
  29. data/lib/mongo/monitoring/event/topology_opening.rb +41 -0
  30. data/lib/mongo/monitoring/publishable.rb +12 -0
  31. data/lib/mongo/monitoring/sdam_log_subscriber.rb +54 -0
  32. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +30 -0
  33. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +33 -0
  34. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +30 -0
  35. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +40 -0
  36. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +30 -0
  37. data/lib/mongo/server.rb +6 -0
  38. data/lib/mongo/server/connection.rb +1 -1
  39. data/lib/mongo/server/description.rb +23 -3
  40. data/lib/mongo/server/description/inspector.rb +4 -2
  41. data/lib/mongo/server/description/inspector/description_changed.rb +2 -2
  42. data/lib/mongo/server/description/inspector/member_discovered.rb +59 -0
  43. data/lib/mongo/server/description/inspector/primary_elected.rb +2 -0
  44. data/lib/mongo/server_selector.rb +10 -5
  45. data/lib/mongo/server_selector/nearest.rb +1 -1
  46. data/lib/mongo/server_selector/primary_preferred.rb +1 -1
  47. data/lib/mongo/server_selector/secondary.rb +1 -1
  48. data/lib/mongo/server_selector/secondary_preferred.rb +1 -1
  49. data/lib/mongo/server_selector/selectable.rb +24 -12
  50. data/lib/mongo/uri.rb +1 -1
  51. data/lib/mongo/version.rb +1 -1
  52. data/mongo.gemspec +1 -1
  53. data/spec/mongo/auth/cr_spec.rb +6 -1
  54. data/spec/mongo/auth/ldap_spec.rb +6 -1
  55. data/spec/mongo/auth/scram_spec.rb +6 -1
  56. data/spec/mongo/auth/x509/conversation_spec.rb +69 -0
  57. data/spec/mongo/auth/x509_spec.rb +9 -4
  58. data/spec/mongo/client_spec.rb +40 -2
  59. data/spec/mongo/cluster/topology/replica_set_spec.rb +218 -9
  60. data/spec/mongo/cluster/topology/sharded_spec.rb +17 -2
  61. data/spec/mongo/cluster/topology/single_spec.rb +19 -4
  62. data/spec/mongo/cluster/topology/unknown_spec.rb +19 -1
  63. data/spec/mongo/cluster/topology_spec.rb +11 -7
  64. data/spec/mongo/cluster_spec.rb +25 -7
  65. data/spec/mongo/max_staleness_spec.rb +40 -22
  66. data/spec/mongo/monitoring_spec.rb +2 -2
  67. data/spec/mongo/sdam_monitoring_spec.rb +60 -0
  68. data/spec/mongo/sdam_spec.rb +77 -0
  69. data/spec/mongo/server/connection_pool_spec.rb +6 -1
  70. data/spec/mongo/server/connection_spec.rb +6 -1
  71. data/spec/mongo/server/description_spec.rb +90 -1
  72. data/spec/mongo/server_selection_spec.rb +7 -6
  73. data/spec/mongo/server_selector/nearest_spec.rb +7 -7
  74. data/spec/mongo/server_selector/primary_preferred_spec.rb +7 -7
  75. data/spec/mongo/server_selector/primary_spec.rb +4 -4
  76. data/spec/mongo/server_selector/secondary_preferred_spec.rb +6 -6
  77. data/spec/mongo/server_selector/secondary_spec.rb +6 -6
  78. data/spec/mongo/server_selector_spec.rb +8 -0
  79. data/spec/mongo/server_spec.rb +6 -1
  80. data/spec/mongo/uri_spec.rb +4 -4
  81. data/spec/spec_helper.rb +2 -0
  82. data/spec/support/max_staleness/ReplicaSetNoPrimary/Incompatible.yml +4 -4
  83. data/spec/support/max_staleness/ReplicaSetNoPrimary/LastUpdateTime.yml +3 -3
  84. data/spec/support/max_staleness/ReplicaSetNoPrimary/Nearest.yml +3 -3
  85. data/spec/support/max_staleness/ReplicaSetNoPrimary/Nearest2.yml +3 -3
  86. data/spec/support/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml +15 -0
  87. data/spec/support/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred.yml +1 -1
  88. data/spec/support/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred_tags.yml +3 -3
  89. data/spec/support/max_staleness/ReplicaSetNoPrimary/Secondary.yml +3 -3
  90. data/spec/support/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred.yml +1 -1
  91. data/spec/support/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred_tags.yml +3 -3
  92. data/spec/support/max_staleness/ReplicaSetNoPrimary/ZeroMaxStaleness.yml +23 -0
  93. data/spec/support/max_staleness/ReplicaSetWithPrimary/Incompatible.yml +4 -4
  94. data/spec/support/max_staleness/ReplicaSetWithPrimary/LastUpdateTime.yml +5 -5
  95. data/spec/support/max_staleness/ReplicaSetWithPrimary/{ShortHeartbeartShortMaxStaleness2.yml → LongHeartbeat.yml} +4 -4
  96. data/spec/support/max_staleness/ReplicaSetWithPrimary/{ShortHeartbeartShortMaxStaleness.yml → LongHeartbeat2.yml} +6 -10
  97. data/spec/support/max_staleness/ReplicaSetWithPrimary/MaxStalenessTooSmall.yml +3 -2
  98. data/spec/support/max_staleness/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.yml +2 -2
  99. data/spec/support/max_staleness/ReplicaSetWithPrimary/Nearest.yml +3 -3
  100. data/spec/support/max_staleness/ReplicaSetWithPrimary/Nearest2.yml +3 -3
  101. data/spec/support/max_staleness/ReplicaSetWithPrimary/Nearest_tags.yml +3 -3
  102. data/spec/support/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred.yml +2 -2
  103. data/spec/support/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred_incompatible.yml +3 -3
  104. data/spec/support/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred.yml +1 -1
  105. data/spec/support/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags.yml +3 -3
  106. data/spec/support/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags2.yml +3 -3
  107. data/spec/support/max_staleness/ReplicaSetWithPrimary/Secondary_tags.yml +3 -3
  108. data/spec/support/max_staleness/ReplicaSetWithPrimary/Secondary_tags2.yml +3 -3
  109. data/spec/support/max_staleness/ReplicaSetWithPrimary/ZeroMaxStaleness.yml +7 -11
  110. data/spec/support/max_staleness/Sharded/Incompatible.yml +4 -4
  111. data/spec/support/max_staleness/Sharded/SmallMaxStaleness.yml +10 -2
  112. data/spec/support/max_staleness/Single/Incompatible.yml +4 -4
  113. data/spec/support/max_staleness/Single/SmallMaxStaleness.yml +2 -2
  114. data/spec/support/max_staleness/Unknown/SmallMaxStaleness.yml +14 -0
  115. data/spec/support/sdam/rs/primary_mismatched_me.yml +2 -2
  116. data/spec/support/sdam/rs/secondary_mismatched_me.yml +2 -2
  117. data/spec/support/sdam_monitoring.rb +144 -0
  118. data/spec/support/sdam_monitoring/replica_set_with_no_primary.yml +112 -0
  119. data/spec/support/sdam_monitoring/replica_set_with_primary.yml +111 -0
  120. data/spec/support/sdam_monitoring/replica_set_with_removal.yml +106 -0
  121. data/spec/support/sdam_monitoring/required_replica_set.yml +84 -0
  122. data/spec/support/sdam_monitoring/standalone.yml +70 -0
  123. data/spec/support/server_discovery_and_monitoring.rb +34 -1
  124. data/spec/support/server_selection.rb +14 -11
  125. data/spec/support/shared/server_selector.rb +6 -0
  126. metadata +49 -13
  127. metadata.gz.sig +0 -0
  128. data/spec/mongo/server_discovery_and_monitoring_spec.rb +0 -115
@@ -20,15 +20,22 @@ module Mongo
20
20
  #
21
21
  # @since 2.0.0
22
22
  class Single
23
-
24
- # @return [ String ] seed The seed address.
25
- attr_reader :seed
23
+ include Monitoring::Publishable
26
24
 
27
25
  # The display name for the topology.
28
26
  #
29
27
  # @since 2.0.0
30
28
  NAME = 'Single'.freeze
31
29
 
30
+ # @return [ Hash ] options The options.
31
+ attr_reader :options
32
+
33
+ # @return [ String ] seed The seed address.
34
+ attr_reader :seed
35
+
36
+ # @return [ monitoring ] monitoring the monitoring.
37
+ attr_reader :monitoring
38
+
32
39
  # Get the display name.
33
40
  #
34
41
  # @example Get the display name.
@@ -54,16 +61,47 @@ module Mongo
54
61
  # @return [ Single ] The topology.
55
62
  def elect_primary(description, servers); self; end
56
63
 
64
+ # Determine if the topology would select a readable server for the
65
+ # provided candidates and read preference.
66
+ #
67
+ # @example Is a readable server present?
68
+ # topology.has_readable_server?(cluster, server_selector)
69
+ #
70
+ # @param [ Cluster ] cluster The cluster.
71
+ # @param [ ServerSelector ] server_selector The server
72
+ # selector.
73
+ #
74
+ # @return [ true ] A standalone always has a readable server.
75
+ #
76
+ # @since 2.4.0
77
+ def has_readable_server?(cluster, server_selector = nil); true; end
78
+
79
+ # Determine if the topology would select a writable server for the
80
+ # provided candidates.
81
+ #
82
+ # @example Is a writable server present?
83
+ # topology.has_writable_server?(servers)
84
+ #
85
+ # @param [ Cluster ] cluster The cluster.
86
+ #
87
+ # @return [ true ] A standalone always has a writable server.
88
+ #
89
+ # @since 2.4.0
90
+ def has_writable_server?(cluster); true; end
91
+
57
92
  # Initialize the topology with the options.
58
93
  #
59
94
  # @example Initialize the topology.
60
95
  # Single.new(options)
61
96
  #
62
97
  # @param [ Hash ] options The options.
98
+ # @param [ Monitoring ] monitoring The monitoring.
99
+ # @param [ Array<String> ] seeds The seeds.
63
100
  #
64
101
  # @since 2.0.0
65
- def initialize(options, seeds = [])
102
+ def initialize(options, monitoring, seeds = [])
66
103
  @options = options
104
+ @monitoring = monitoring
67
105
  @seed = seeds.first
68
106
  end
69
107
 
@@ -181,6 +219,19 @@ module Mongo
181
219
  #
182
220
  # @since 2.0.6
183
221
  def standalone_discovered; self; end
222
+
223
+ # Publish that a member of this topology was discovered.
224
+ #
225
+ # @example Publish that a member was discovered.
226
+ # topology.member_discovered
227
+ #
228
+ # @since 2.4.0
229
+ def member_discovered
230
+ publish_sdam_event(
231
+ Monitoring::TOPOLOGY_CHANGED,
232
+ Monitoring::Event::TopologyChanged.new(self, self)
233
+ )
234
+ end
184
235
  end
185
236
  end
186
237
  end
@@ -21,6 +21,7 @@ module Mongo
21
21
  # @since 2.0.0
22
22
  class Unknown
23
23
  include Loggable
24
+ include Monitoring::Publishable
24
25
 
25
26
  # The display name for the topology.
26
27
  #
@@ -30,6 +31,9 @@ module Mongo
30
31
  # @return [ Hash ] options The options.
31
32
  attr_reader :options
32
33
 
34
+ # @return [ Monitoring ] monitoring The monitoring.
35
+ attr_reader :monitoring
36
+
33
37
  # Get the display name.
34
38
  #
35
39
  # @example Get the display name.
@@ -55,23 +59,55 @@ module Mongo
55
59
  # @return [ Sharded, ReplicaSet ] The new topology.
56
60
  def elect_primary(description, servers)
57
61
  if description.mongos?
58
- log_debug("Mongos #{description.address.to_s} discovered.")
59
- Sharded.new(options)
62
+ sharded = Sharded.new(options, monitoring)
63
+ topology_changed(sharded)
64
+ sharded
60
65
  else
61
66
  initialize_replica_set(description, servers)
62
67
  end
63
68
  end
64
69
 
70
+ # Determine if the topology would select a readable server for the
71
+ # provided candidates and read preference.
72
+ #
73
+ # @example Is a readable server present?
74
+ # topology.has_readable_server?(cluster, server_selector)
75
+ #
76
+ # @param [ Cluster ] cluster The cluster.
77
+ # @param [ ServerSelector ] server_selector The server
78
+ # selector.
79
+ #
80
+ # @return [ false ] An Unknown topology will never have a readable server.
81
+ #
82
+ # @since 2.4.0
83
+ def has_readable_server?(cluster, server_selector = nil); false; end
84
+
85
+ # Determine if the topology would select a writable server for the
86
+ # provided candidates.
87
+ #
88
+ # @example Is a writable server present?
89
+ # topology.has_writable_server?(servers)
90
+ #
91
+ # @param [ Cluster ] cluster The cluster.
92
+ #
93
+ # @return [ false ] An Unknown topology will never have a writable server.
94
+ #
95
+ # @since 2.4.0
96
+ def has_writable_server?(cluster); false; end
97
+
65
98
  # Initialize the topology with the options.
66
99
  #
67
100
  # @example Initialize the topology.
68
101
  # Unknown.new(options)
69
102
  #
70
103
  # @param [ Hash ] options The options.
104
+ # @param [ Monitoring ] monitoring The monitoring.
105
+ # @param [ Array<String> ] seeds The seeds.
71
106
  #
72
107
  # @since 2.0.0
73
- def initialize(options, seeds = [])
108
+ def initialize(options, monitoring, seeds = [])
74
109
  @options = options
110
+ @monitoring = monitoring
75
111
  @seeds = seeds
76
112
  end
77
113
 
@@ -195,25 +231,45 @@ module Mongo
195
231
  # @since 2.0.6
196
232
  def standalone_discovered
197
233
  if @seeds.size == 1
198
- Single.new(options, @seeds)
234
+ single = Single.new(options, monitoring, @seeds)
235
+ topology_changed(single)
236
+ single
199
237
  else
200
238
  self
201
239
  end
202
240
  end
203
241
 
242
+ # Notify the topology that a member was discovered.
243
+ #
244
+ # @example Notify the topology that a member was discovered.
245
+ # topology.member_discovered
246
+ #
247
+ # @since 2.4.0
248
+ def member_discovered
249
+ publish_sdam_event(
250
+ Monitoring::TOPOLOGY_CHANGED,
251
+ Monitoring::Event::TopologyChanged.new(self, self)
252
+ )
253
+ end
254
+
204
255
  private
205
256
 
206
257
  def initialize_replica_set(description, servers)
207
- log_debug(
208
- "Server #{description.address.to_s} discovered as primary in replica set: " +
209
- "'#{description.replica_set_name}'. Changing topology to replica set."
210
- )
211
258
  servers.each do |server|
212
259
  if server.standalone? && server.address != description.address
213
260
  server.description.unknown!
214
261
  end
215
262
  end
216
- ReplicaSet.new(options.merge(:replica_set => description.replica_set_name))
263
+ replica_set = ReplicaSet.new(options.merge(:replica_set => description.replica_set_name), monitoring)
264
+ topology_changed(replica_set)
265
+ replica_set
266
+ end
267
+
268
+ def topology_changed(new_topology)
269
+ publish_sdam_event(
270
+ Monitoring::TOPOLOGY_CHANGED,
271
+ Monitoring::Event::TopologyChanged.new(self, new_topology)
272
+ )
217
273
  end
218
274
  end
219
275
  end
@@ -33,7 +33,9 @@ module Mongo
33
33
  # Error message for when the max staleness is not at least twice the heartbeat frequency.
34
34
  #
35
35
  # @since 2.4.0
36
- INVALID_MAX_STALENESS = "max_staleness must be at least twice the client's heartbeat frequency.".freeze
36
+ INVALID_MAX_STALENESS = "`max_staleness` value is too small. It must be at least " +
37
+ "`ServerSelector::SMALLEST_MAX_STALENESS_SECONDS` and (the cluster's heartbeat_frequency " +
38
+ "setting + `Cluster::IDLE_WRITE_PERIOD_SECONDS`).".freeze
37
39
 
38
40
  # Error message when max staleness cannot be used because one or more servers has version < 3.4.
39
41
  #
@@ -16,6 +16,7 @@ require 'mongo/event/listeners'
16
16
  require 'mongo/event/publisher'
17
17
  require 'mongo/event/subscriber'
18
18
  require 'mongo/event/primary_elected'
19
+ require 'mongo/event/member_discovered'
19
20
  require 'mongo/event/description_changed'
20
21
  require 'mongo/event/standalone_discovered'
21
22
 
@@ -30,8 +31,15 @@ module Mongo
30
31
  # When a server is elected primary.
31
32
  #
32
33
  # @since 2.0.0
34
+ #
35
+ # @deprecated. Will be removed in 3.0
33
36
  PRIMARY_ELECTED = 'primary_elected'.freeze
34
37
 
38
+ # When a server is discovered to be a member of a topology.
39
+ #
40
+ # @since 2.4.0
41
+ MEMBER_DISCOVERED = 'member_discovered'.freeze
42
+
35
43
  # When a server is to be removed from a cluster.
36
44
  #
37
45
  # @since 2.0.6
@@ -20,10 +20,17 @@ module Mongo
20
20
  #
21
21
  # @since 2.0.6
22
22
  class DescriptionChanged
23
+ include Monitoring::Publishable
23
24
 
24
- # @return [ Mongo::Cluster ] cluster The event publisher.
25
+ # @return [ Mongo::Cluster ] cluster The cluster.
25
26
  attr_reader :cluster
26
27
 
28
+ # @return [ Hash ] options The options.
29
+ attr_reader :options
30
+
31
+ # @return [ Monitoring ] monitoring The monitoring.
32
+ attr_reader :monitoring
33
+
27
34
  # Initialize the new host added event handler.
28
35
  #
29
36
  # @example Create the new handler.
@@ -34,6 +41,8 @@ module Mongo
34
41
  # @since 2.0.0
35
42
  def initialize(cluster)
36
43
  @cluster = cluster
44
+ @options = cluster.options
45
+ @monitoring = cluster.monitoring
37
46
  end
38
47
 
39
48
  # This event publishes an event to add the cluster and logs the
@@ -45,7 +54,16 @@ module Mongo
45
54
  # @param [ Server::Description ] updated The changed description.
46
55
  #
47
56
  # @since 2.0.0
48
- def handle(updated)
57
+ def handle(previous, updated)
58
+ publish_sdam_event(
59
+ Monitoring::SERVER_DESCRIPTION_CHANGED,
60
+ Monitoring::Event::ServerDescriptionChanged.new(
61
+ updated.address,
62
+ cluster.topology,
63
+ previous,
64
+ updated
65
+ )
66
+ )
49
67
  cluster.add_hosts(updated)
50
68
  cluster.remove_hosts(updated)
51
69
  end
@@ -0,0 +1,65 @@
1
+ # Copyright (C) 2015 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ module Event
17
+
18
+ # This handles member discovered events for server descriptions.
19
+ #
20
+ # @since 2.4.0
21
+ class MemberDiscovered
22
+ include Monitoring::Publishable
23
+
24
+ # @return [ Mongo::Cluster ] cluster The cluster.
25
+ attr_reader :cluster
26
+
27
+ # @return [ Hash ] options The options.
28
+ attr_reader :options
29
+
30
+ # @return [ Monitoring ] monitoring The monitoring.
31
+ attr_reader :monitoring
32
+
33
+ # Initialize the new member discovered event handler.
34
+ #
35
+ # @example Create the new handler.
36
+ # MemberDiscovered.new(cluster)
37
+ #
38
+ # @param [ Mongo::Cluster ] cluster The cluster to publish from.
39
+ #
40
+ # @since 2.0.0
41
+ def initialize(cluster)
42
+ @cluster = cluster
43
+ @options = cluster.options
44
+ @monitoring = cluster.monitoring
45
+ end
46
+
47
+ # This event tells the cluster that a member of a topology is discovered.
48
+ #
49
+ # @example Handle the event.
50
+ # member_discovered.handle(previous_description, description)
51
+ #
52
+ # @param [ Server::Description ] previous The previous description of the server.
53
+ # @param [ Server::Description ] updated The updated description of the server.
54
+ #
55
+ # @since 2.4.0
56
+ def handle(previous, updated)
57
+ if updated.primary? || updated.mongos?
58
+ cluster.elect_primary!(updated)
59
+ else
60
+ cluster.member_discovered
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -18,9 +18,11 @@ module Mongo
18
18
  # This handles primary elected events for server descriptions.
19
19
  #
20
20
  # @since 2.0.0
21
+ #
22
+ # @deprecated. Will be removed in 3.0
21
23
  class PrimaryElected
22
24
 
23
- # @return [ Mongo::Cluster ] cluster The event publisher.
25
+ # @return [ Mongo::Cluster ] cluster The cluster.
24
26
  attr_reader :cluster
25
27
 
26
28
  # Initialize the new primary elected event handler.
@@ -20,7 +20,7 @@ module Mongo
20
20
  # @since 2.0.6
21
21
  class StandaloneDiscovered
22
22
 
23
- # @return [ Mongo::Cluster ] cluster The event publisher.
23
+ # @return [ Mongo::Cluster ] cluster The cluster.
24
24
  attr_reader :cluster
25
25
 
26
26
  # Initialize the new standalone discovered event handler.
@@ -15,6 +15,12 @@
15
15
  require 'mongo/monitoring/event'
16
16
  require 'mongo/monitoring/publishable'
17
17
  require 'mongo/monitoring/command_log_subscriber'
18
+ require 'mongo/monitoring/sdam_log_subscriber'
19
+ require 'mongo/monitoring/server_description_changed_log_subscriber'
20
+ require 'mongo/monitoring/server_closed_log_subscriber'
21
+ require 'mongo/monitoring/server_opening_log_subscriber'
22
+ require 'mongo/monitoring/topology_changed_log_subscriber'
23
+ require 'mongo/monitoring/topology_opening_log_subscriber'
18
24
 
19
25
  module Mongo
20
26
 
@@ -28,6 +34,36 @@ module Mongo
28
34
  # @since 2.1.0
29
35
  COMMAND = 'Command'.freeze
30
36
 
37
+ # Server closed topic.
38
+ #
39
+ # @since 2.4.0
40
+ SERVER_CLOSED = 'ServerClosed'.freeze
41
+
42
+ # Server description changed topic.
43
+ #
44
+ # @since 2.4.0
45
+ SERVER_DESCRIPTION_CHANGED = 'ServerDescriptionChanged'.freeze
46
+
47
+ # Server opening topic.
48
+ #
49
+ # @since 2.4.0
50
+ SERVER_OPENING = 'ServerOpening'.freeze
51
+
52
+ # Topology changed topic.
53
+ #
54
+ # @since 2.4.0
55
+ TOPOLOGY_CHANGED = 'TopologyChanged'.freeze
56
+
57
+ # Topology closed topic.
58
+ #
59
+ # @since 2.4.0
60
+ TOPOLOGY_CLOSED = 'TopologyClosed'.freeze
61
+
62
+ # Topology opening topic.
63
+ #
64
+ # @since 2.4.0
65
+ TOPOLOGY_OPENING = 'TopologyOpening'.freeze
66
+
31
67
  @@operation_id = 0
32
68
  @@operation_id_lock = Mutex.new
33
69
 
@@ -101,6 +137,11 @@ module Mongo
101
137
  end
102
138
  end
103
139
  subscribe(COMMAND, CommandLogSubscriber.new(options))
140
+ subscribe(SERVER_OPENING, ServerOpeningLogSubscriber.new(options))
141
+ subscribe(SERVER_CLOSED, ServerClosedLogSubscriber.new(options))
142
+ subscribe(SERVER_DESCRIPTION_CHANGED, ServerDescriptionChangedLogSubscriber.new(options))
143
+ subscribe(TOPOLOGY_OPENING, TopologyOpeningLogSubscriber.new(options))
144
+ subscribe(TOPOLOGY_CHANGED, TopologyChangedLogSubscriber.new(options))
104
145
  end
105
146
  end
106
147