Commit 28f27a9296ab3c0210aa471c26f675a5d81c33dd
1 parent
2932cb6f
Exists in
master
and in
1 other branch
Fix GtalkService Keeaplive-Thread leak
The GoogleTalk/Jabber Notification Service was leaking keepalive threads, because xmpp4r creates an internal keealive thread on connect that is only cleaned up when closing the client. This lead to workers quickly running out of threads and throwing exceptions like `ThreadError: can't alloc thread`.
Showing
2 changed files
with
7 additions
and
0 deletions
Show diff stats
app/models/notification_services/gtalk_service.rb
... | ... | @@ -53,6 +53,8 @@ class NotificationServices::GtalkService < NotificationService |
53 | 53 | # post the issue to the xmpp room(s) |
54 | 54 | send_to_users(client, message) unless user_id.blank? |
55 | 55 | send_to_muc(client, message) unless room_id.blank? |
56 | + ensure | |
57 | + client.close unless client.nil? | |
56 | 58 | end |
57 | 59 | |
58 | 60 | private | ... | ... |
spec/models/notification_service/gtalk_service_spec.rb
... | ... | @@ -28,6 +28,7 @@ describe NotificationService::GtalkService do |
28 | 28 | |
29 | 29 | #assert |
30 | 30 | expect(gtalk).to receive(:send).exactly(2).times.with(message) |
31 | + expect(gtalk).to receive(:close) | |
31 | 32 | |
32 | 33 | notification_service.create_notification(problem) |
33 | 34 | end |
... | ... | @@ -57,6 +58,7 @@ describe NotificationService::GtalkService do |
57 | 58 | expect(Jabber::Message).to receive(:new).with("fourth@domain.org", @error_msg) |
58 | 59 | expect(Jabber::MUC::SimpleMUCClient).to_not receive(:new) |
59 | 60 | expect(@gtalk).to receive(:send).exactly(4).times |
61 | + expect(@gtalk).to receive(:close) | |
60 | 62 | |
61 | 63 | @notification_service.user_id = "first@domain.org,second@domain.org, third@domain.org , fourth@domain.org " |
62 | 64 | @notification_service.room_id = "" |
... | ... | @@ -69,6 +71,7 @@ describe NotificationService::GtalkService do |
69 | 71 | expect(Jabber::Message).to receive(:new).with("fourth@domain.org", @error_msg) |
70 | 72 | expect(Jabber::MUC::SimpleMUCClient).to_not receive(:new) |
71 | 73 | expect(@gtalk).to receive(:send).exactly(4).times |
74 | + expect(@gtalk).to receive(:close) | |
72 | 75 | |
73 | 76 | @notification_service.user_id = "first@domain.org;second@domain.org; third@domain.org ; fourth@domain.org " |
74 | 77 | @notification_service.room_id = "" |
... | ... | @@ -81,6 +84,7 @@ describe NotificationService::GtalkService do |
81 | 84 | expect(Jabber::Message).to receive(:new).with("fourth@domain.org", @error_msg) |
82 | 85 | expect(Jabber::MUC::SimpleMUCClient).to_not receive(:new) |
83 | 86 | expect(@gtalk).to receive(:send).exactly(4).times |
87 | + expect(@gtalk).to receive(:close) | |
84 | 88 | |
85 | 89 | @notification_service.user_id = "first@domain.org second@domain.org third@domain.org fourth@domain.org " |
86 | 90 | @notification_service.room_id = "" |
... | ... | @@ -117,6 +121,7 @@ describe NotificationService::GtalkService do |
117 | 121 | |
118 | 122 | #assert |
119 | 123 | expect(gtalk).to receive(:send).with(message) |
124 | + expect(gtalk).to receive(:close) | |
120 | 125 | |
121 | 126 | notification_service.create_notification(problem) |
122 | 127 | end | ... | ... |