@@ -29,11 +29,11 @@ module LavinMQ
2929 end
3030
3131 getter vhosts, users, data_dir, parameters, authenticator
32- getter? closed, flow
32+ getter? flow
3333 include ParameterTarget
3434
3535 @start = Time .instant
36- @closed = false
36+ @closed = BoolChannel .new( false )
3737 @flow = true
3838 @listeners = Hash (Socket ::Server , Protocol ).new # Socket => protocol
3939 @connection_factories = Hash (Protocol , ConnectionFactory ).new
@@ -46,6 +46,7 @@ module LavinMQ
4646 Schema .migrate(@data_dir , @replicator )
4747 @users = Auth ::UserStore .new(@data_dir , @replicator )
4848 @vhosts = VHostStore .new(@data_dir , @users , @replicator )
49+ @vhosts .load!
4950 @mqtt_brokers = MQTT ::Brokers .new(@vhosts , @replicator )
5051 @parameters = ParameterStore (Parameter ).new(@data_dir , " parameters.json" , @replicator )
5152 @authenticator = Auth ::Chain .create(@config , @users )
@@ -57,6 +58,10 @@ module LavinMQ
5758 spawn stats_loop, name: " Server#stats_loop"
5859 end
5960
61+ def closed ?
62+ @closed .value
63+ end
64+
6065 def followers
6166 @replicator .try(& .followers) || Array (Clustering ::Follower ).new
6267 end
@@ -80,8 +85,7 @@ module LavinMQ
8085 end
8186
8287 def stop
83- return if @closed
84- @closed = true
88+ return if @closed .swap(true )
8589 @vhosts .close
8690 @replicator .try & .clear
8791 @authenticator .try & .cleanup
@@ -95,11 +99,12 @@ module LavinMQ
9599 @users = Auth ::UserStore .new(@data_dir , @replicator )
96100 @authenticator = Auth ::Chain .create(@config , @users )
97101 @vhosts = VHostStore .new(@data_dir , @users , @replicator )
102+ @vhosts .load!
98103 @connection_factories [Protocol ::AMQP ] = AMQP ::ConnectionFactory .new(@authenticator , @vhosts )
99104 @connection_factories [Protocol ::MQTT ] = MQTT ::ConnectionFactory .new(@authenticator , @mqtt_brokers , @config )
100105 @parameters = ParameterStore (Parameter ).new(@data_dir , " parameters.json" , @replicator )
101106 apply_parameter
102- @closed = false
107+ @closed .set( false )
103108 Fiber .yield
104109 end
105110
@@ -112,7 +117,7 @@ module LavinMQ
112117 Log .info { " Listening for #{ protocol } on #{ s.local_address } " }
113118 loop do
114119 client = s.accept? || break
115- next client.close if @ closed
120+ next client.close if closed?
116121 accept_tcp(client, protocol)
117122 end
118123 rescue ex : IO ::Error
@@ -162,7 +167,7 @@ module LavinMQ
162167 Log .info { " Listening for #{ protocol } on #{ s.local_address } " }
163168 loop do # do not try to use while
164169 client = s.accept? || break
165- next client.close if @ closed
170+ next client.close if closed?
166171 accept_unix(client, protocol)
167172 end
168173 rescue ex : IO ::Error
@@ -198,7 +203,7 @@ module LavinMQ
198203 Log .info { " Listening for #{ protocol } on #{ s.local_address } (TLS)" }
199204 loop do # do not try to use while
200205 client = s.accept? || break
201- next client.close if @ closed
206+ next client.close if closed?
202207 accept_tls(client, context, protocol)
203208 end
204209 rescue ex : IO ::Error | OpenSSL ::Error
@@ -255,7 +260,7 @@ module LavinMQ
255260 end
256261
257262 def close
258- @closed = true
263+ @closed .set( true )
259264 Log .debug { " Closing listeners" }
260265 @listeners .each_key & .close
261266 Log .debug { " Closing vhosts" }
0 commit comments