paho-mqtt 1.0.9 → 1.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f39a0f32404a6bd397f11413d0ac5630ac629dca3821bde3a8213e59f2f458ac
4
- data.tar.gz: a3a47027e5ff76e97dfc3ea32479b0149eb7be1683e901b80b6021a2478d5d4d
3
+ metadata.gz: aeeb9db2020a2162a6f5581da55c235db4fc26e9cf6786729b5c40352b3560fd
4
+ data.tar.gz: 68241bd854291fc771c7bdfc90d9c31dffe027c7987383cb5bb06b0e1c871a8f
5
5
  SHA512:
6
- metadata.gz: 926e0d70043c9cc1b60fbaceec3c354c3d48f632aac6d92d22b7662d220f90ca4a1bc1a753cb16e9571128201de253a69388f86ca224caae0f5ac09709de97a9
7
- data.tar.gz: cf753442885c0005ededac63b1517ebe51b10e74725429f834ab4a65cb0710fdf8e83ba9cec4272e7e91c79a470080eba26a31c09e05f838743f978d1b056b42
6
+ metadata.gz: 802ee8ab38a2afeb1af1ee350278bf8a7b10fd1904ec062baf1e9a0d38dda796da4ced668b7e497888aabc62654368afaf3445096f8cde2a29c2ed59b44496a2
7
+ data.tar.gz: 17c1ca5fb822a9f1f0f42cdf8f0a02ab9fc4c455da9d7d062fcbbd0a439604cd2bbfadf8644377a28828a89285c33251140cff15ab491fa279a4eba7c4cf04bc
@@ -25,18 +25,17 @@ module PahoMqtt
25
25
  # Default connection setup
26
26
  DEFAULT_SSL_PORT = 8883
27
27
  DEFAULT_PORT = 1883
28
- SELECT_TIMEOUT = 0
29
- LOOP_TEMPO = 0.005
28
+ SELECT_TIMEOUT = 0.002
30
29
 
31
30
  # MAX size of queue
32
31
  MAX_SUBACK = 10
33
32
  MAX_UNSUBACK = 10
34
- MAX_READ = 50
33
+ MAX_READ = 100
35
34
  MAX_PUBACK = 100
36
35
  MAX_PUBREC = 100
37
36
  MAX_PUBREL = 100
38
37
  MAX_PUBCOMP = 100
39
- MAX_WRITING = MAX_PUBACK + MAX_PUBREC + MAX_PUBREL + MAX_PUBCOMP
38
+ MAX_WRITING = 1000
40
39
 
41
40
  # Connection states values
42
41
  MQTT_CS_NEW = 0
@@ -163,15 +163,15 @@ module PahoMqtt
163
163
  end
164
164
 
165
165
  def loop_read(max_packet=MAX_READ)
166
- max_packet.times do
167
- begin
166
+ begin
167
+ max_packet.times do
168
168
  @handler.receive_packet
169
- rescue ReadingException
170
- if check_persistence
171
- reconnect
172
- else
173
- raise ReadingException
174
- end
169
+ end
170
+ rescue ReadingException
171
+ if check_persistence
172
+ reconnect
173
+ else
174
+ raise ReadingException
175
175
  end
176
176
  end
177
177
  end
@@ -180,7 +180,6 @@ module PahoMqtt
180
180
  loop_read
181
181
  loop_write
182
182
  loop_misc
183
- sleep LOOP_TEMPO
184
183
  end
185
184
 
186
185
  def loop_misc
@@ -238,7 +237,6 @@ module PahoMqtt
238
237
  MQTT_ERR_SUCCESS
239
238
  rescue ProtocolViolation
240
239
  PahoMqtt.logger.error("Subscribe topics need one topic or a list of topics.") if PahoMqtt.logger?
241
- disconnect(false)
242
240
  raise ProtocolViolation
243
241
  end
244
242
  end
@@ -252,7 +250,6 @@ module PahoMqtt
252
250
  MQTT_ERR_SUCCESS
253
251
  rescue ProtocolViolation
254
252
  PahoMqtt.logger.error("Unsubscribe need at least one topic.") if PahoMqtt.logger?
255
- disconnect(false)
256
253
  raise ProtocolViolation
257
254
  end
258
255
  end
@@ -41,7 +41,6 @@ module PahoMqtt
41
41
  connect_timeout = Time.now + @ack_timeout
42
42
  while (Time.now <= connect_timeout) && !is_connected? do
43
43
  @cs = @handler.receive_packet
44
- sleep 0.0001
45
44
  end
46
45
  unless is_connected?
47
46
  PahoMqtt.logger.warn("Connection failed. Couldn't recieve a Connack packet from: #{@host}.") if PahoMqtt.logger?
@@ -144,22 +143,16 @@ module PahoMqtt
144
143
  MQTT_ERR_SUCCESS
145
144
  end
146
145
 
147
- def send_pingreq
148
- packet = PahoMqtt::Packet::Pingreq.new
149
- @sender.send_packet(packet)
150
- MQTT_ERR_SUCCESS
151
- end
152
-
153
146
  def check_keep_alive(persistent, last_ping_resp, keep_alive)
154
147
  now = Time.now
155
148
  timeout_req = (@sender.last_ping_req + (keep_alive * 0.7).ceil)
156
149
  if timeout_req <= now && persistent
157
150
  PahoMqtt.logger.debug("Checking if server is still alive...") if PahoMqtt.logger?
158
- send_pingreq
151
+ @sender.send_pingreq
159
152
  end
160
153
  timeout_resp = last_ping_resp + (keep_alive * 1.1).ceil
161
154
  if timeout_resp <= now
162
- PahoMqtt.logger.debug("No activity period over timeout, disconnecting from #{@host}.") if PahoMqtt.logger?
155
+ PahoMqtt.logger.debug("No activity is over timeout, disconnecting from #{@host}.") if PahoMqtt.logger?
163
156
  @cs = MQTT_CS_DISCONNECT
164
157
  end
165
158
  @cs
@@ -40,4 +40,10 @@ module PahoMqtt
40
40
 
41
41
  class LowVersionException < Exception
42
42
  end
43
+
44
+ class FullWritingException < Exception
45
+ end
46
+
47
+ class FullQueueException < Exception
48
+ end
43
49
  end
@@ -36,7 +36,7 @@ module PahoMqtt
36
36
  end
37
37
 
38
38
  def receive_packet
39
- result = IO.select([@socket], [], [], SELECT_TIMEOUT) unless @socket.nil? || @socket.closed?
39
+ result = IO.select([@socket], nil, nil, SELECT_TIMEOUT) unless @socket.nil? || @socket.closed?
40
40
  unless result.nil?
41
41
  packet = PahoMqtt::Packet::Base.read(@socket)
42
42
  unless packet.nil?
@@ -86,7 +86,7 @@ module PahoMqtt
86
86
  handle_connack_accepted(packet.session_present)
87
87
  else
88
88
  PahoMqtt.logger.warm(packet.return_msg) if PahoMqtt.logger?
89
- MQTT_CS_DISCONNECTED
89
+ MQTT_CS_DISCONNECT
90
90
  end
91
91
  @on_connack.call(packet) unless @on_connack.nil?
92
92
  MQTT_CS_CONNECTED
@@ -41,26 +41,30 @@ module PahoMqtt
41
41
  )
42
42
  case qos
43
43
  when 1
44
- @puback_mutex.synchronize do
45
- if @waiting_puback.length >= MAX_PUBACK
46
- PahoMqtt.logger.error('PUBACK queue is full, could not send with qos=1') if PahoMqtt.logger?
47
- return MQTT_ERR_FAIL
48
- end
49
- @waiting_puback.push(:id => new_id, :packet => packet, :timestamp => Time.now)
50
- end
44
+ push_queue(@waiting_puback, @puback_mutex, MAX_PUBACK, packet, new_id)
51
45
  when 2
52
- @pubrec_mutex.synchronize do
53
- if @waiting_pubrec.length >= MAX_PUBREC
54
- PahoMqtt.logger.error('PUBREC queue is full, could not send with qos=2') if PahoMqtt.logger?
55
- return MQTT_ERR_FAIL
56
- end
57
- @waiting_pubrec.push(:id => new_id, :packet => packet, :timestamp => Time.now)
58
- end
46
+ push_queue(@waiting_pubrec, @pubrec_mutex, MAX_PUBREC, packet, new_id)
59
47
  end
60
48
  @sender.append_to_writing(packet)
61
49
  MQTT_ERR_SUCCESS
62
50
  end
63
51
 
52
+ def push_queue(waiting_queue, queue_mutex, max_packet, packet, new_id)
53
+ begin
54
+ if waiting_queue.length >= max_packet
55
+ raise FullQueueException
56
+ end
57
+ queue_mutex.synchronize do
58
+ waiting_queue.push(:id => new_id, :packet => packet, :timestamp => Time.now)
59
+ end
60
+ rescue FullQueueException
61
+ PahoMqtt.logger.error("#{packet.type_name} queue is full") if PahoMqtt.logger?
62
+ sleep SELECT_TIMEOUT
63
+ retry
64
+ end
65
+ MQTT_ERR_SUCCESS
66
+ end
67
+
64
68
  def do_publish(qos, packet_id)
65
69
  case qos
66
70
  when 0
@@ -94,14 +98,7 @@ module PahoMqtt
94
98
  packet = PahoMqtt::Packet::Pubrec.new(
95
99
  :id => packet_id
96
100
  )
97
- @pubrel_mutex.synchronize do
98
- if @waiting_pubrel.length >= MAX_PUBREL
99
- PahoMqtt.logger.error('PUBREL queue is full, could not acknowledge qos=2') if PahoMqtt.logger?
100
- return MQTT_ERR_FAIL
101
- end
102
- @waiting_pubrel.push(:id => packet_id , :packet => packet, :timestamp => Time.now)
103
- end
104
- @sender.append_to_writing(packet)
101
+ push_queue(@waiting_pubrel, @pubrel_mutex, MAX_PUBREL, packet, packet_id)
105
102
  MQTT_ERR_SUCCESS
106
103
  end
107
104
 
@@ -117,15 +114,7 @@ module PahoMqtt
117
114
  packet = PahoMqtt::Packet::Pubrel.new(
118
115
  :id => packet_id
119
116
  )
120
- @pubcomp_mutex.synchronize do
121
- if @waiting_pubcomp.length >= MAX_PUBCOMP
122
- PahoMqtt.logger.error('PUBCOMP queue is full, could not acknowledge qos=2') if PahoMqtt.logger?
123
- return MQTT_ERR_FAIL
124
- end
125
- @waiting_pubcomp.push(:id => packet_id, :packet => packet, :timestamp => Time.now)
126
- end
127
- @sender.append_to_writing(packet)
128
- MQTT_ERR_SUCCESS
117
+ push_queue(@waiting_pubcomp, @pubcomp_mutex, MAX_PUBCOMP, packet, packet_id)
129
118
  end
130
119
 
131
120
  def do_pubrel(packet_id)
@@ -34,14 +34,31 @@ module PahoMqtt
34
34
  @socket.write(packet.to_s) unless @socket.nil? || @socket.closed?
35
35
  @last_ping_req = Time.now
36
36
  MQTT_ERR_SUCCESS
37
- rescue StandardError
38
- raise WritingException
39
37
  end
38
+ rescue StandardError
39
+ raise WritingException
40
+ rescue IO::WaitWritable
41
+ IO.select(nil, [@socket], nil, SELECT_TIMEOUT)
42
+ retry
43
+ end
44
+
45
+ def send_pingreq
46
+ send_packet(PahoMqtt::Packet::Pingreq.new)
40
47
  end
41
48
 
42
49
  def append_to_writing(packet)
43
- @writing_mutex.synchronize do
44
- @writing_queue.push(packet) unless @writing_queue.length >= MAX_WRITING
50
+ begin
51
+ if @writing_queue.length <= MAX_WRITING
52
+ @writing_mutex.synchronize do
53
+ @writing_queue.push(packet)
54
+ end
55
+ else
56
+ PahoMqtt.logger.error('Writing queue is full slowing down') if PahoMqtt.logger?
57
+ raise FullWritingException
58
+ end
59
+ rescue FullWritingException
60
+ sleep SELECT_TIMEOUT
61
+ retry
45
62
  end
46
63
  MQTT_ERR_SUCCESS
47
64
  end
@@ -124,7 +124,6 @@ module PahoMqtt
124
124
  :id => new_id,
125
125
  :topics => topics
126
126
  )
127
-
128
127
  @sender.append_to_writing(packet)
129
128
  @unsuback_mutex.synchronize do
130
129
  if @waiting_suback.length >= MAX_UNSUBACK
@@ -1,3 +1,3 @@
1
1
  module PahoMqtt
2
- VERSION = "1.0.9"
2
+ VERSION = "1.0.10"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: paho-mqtt
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.9
4
+ version: 1.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pierre Goudet
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-05-11 00:00:00.000000000 Z
11
+ date: 2018-05-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler