aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChristian Schneppe <christian@pix-art.de>2019-07-01 08:46:00 +0200
committerChristian Schneppe <christian@pix-art.de>2019-07-01 08:46:00 +0200
commit686c4da2b0952973c736073826a580c276b10f87 (patch)
tree03329aa7a039dc73cdc5140a5b50ee20d5c9b817 /src
parent037932dc02ff27cd452cd37378aa66d0bfcd5d7f (diff)
rate limit muc pings / joins. never run two pings at same time
Diffstat (limited to 'src')
-rw-r--r--src/main/java/de/pixart/messenger/entities/Account.java1
-rw-r--r--src/main/java/de/pixart/messenger/services/XmppConnectionService.java30
2 files changed, 27 insertions, 4 deletions
diff --git a/src/main/java/de/pixart/messenger/entities/Account.java b/src/main/java/de/pixart/messenger/entities/Account.java
index c2c5e90c8..0b1f8e4ad 100644
--- a/src/main/java/de/pixart/messenger/entities/Account.java
+++ b/src/main/java/de/pixart/messenger/entities/Account.java
@@ -73,6 +73,7 @@ public class Account extends AbstractEntity implements AvatarService.Avatarable
public List<Conversation> pendingConferenceJoins = new CopyOnWriteArrayList<>();
public List<Conversation> pendingConferenceLeaves = new CopyOnWriteArrayList<>();
public final Set<Conversation> inProgressConferenceJoins = new HashSet<>();
+ public final Set<Conversation> inProgressConferencePings = new HashSet<>();
protected Jid jid;
protected String password;
protected int options = 0;
diff --git a/src/main/java/de/pixart/messenger/services/XmppConnectionService.java b/src/main/java/de/pixart/messenger/services/XmppConnectionService.java
index ff96f255d..b75dd0225 100644
--- a/src/main/java/de/pixart/messenger/services/XmppConnectionService.java
+++ b/src/main/java/de/pixart/messenger/services/XmppConnectionService.java
@@ -326,6 +326,12 @@ public class XmppConnectionService extends Service {
}
account.getRoster().clearPresences();
+ synchronized (account.inProgressConferenceJoins) {
+ account.inProgressConferenceJoins.clear();
+ }
+ synchronized (account.inProgressConferencePings) {
+ account.inProgressConferencePings.clear();
+ }
mJingleConnectionManager.cancelInTransmission();
mQuickConversationsService.considerSyncBackground(false);
fetchRosterFromServer(account);
@@ -2738,21 +2744,37 @@ public class XmppConnectionService extends Service {
}
public void mucSelfPingAndRejoin(final Conversation conversation) {
+ final Account account = conversation.getAccount();
+ synchronized (account.inProgressConferenceJoins) {
+ if (account.inProgressConferenceJoins.contains(conversation)) {
+ Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": canceling muc self ping because join is already under way");
+ return;
+ }
+ }
+ synchronized (account.inProgressConferencePings) {
+ if (!account.inProgressConferencePings.add(conversation)) {
+ Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": canceling muc self ping because ping is already under way");
+ return;
+ }
+ }
final Jid self = conversation.getMucOptions().getSelf().getFullJid();
final IqPacket ping = new IqPacket(IqPacket.TYPE.GET);
ping.setTo(self);
ping.addChild("ping", Namespace.PING);
- sendIqPacket(conversation.getAccount(), ping, (account, response) -> {
+ sendIqPacket(conversation.getAccount(), ping, (a, response) -> {
if (response.getType() == IqPacket.TYPE.ERROR) {
Element error = response.findChild("error");
if (error == null || error.hasChild("service-unavailable") || error.hasChild("feature-not-implemented") || error.hasChild("item-not-found")) {
- Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": ping to " + self + " came back as ignorable error");
+ Log.d(Config.LOGTAG, a.getJid().asBareJid() + ": ping to " + self + " came back as ignorable error");
} else {
- Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": ping to " + self + " failed. attempting rejoin");
+ Log.d(Config.LOGTAG, a.getJid().asBareJid() + ": ping to " + self + " failed. attempting rejoin");
joinMuc(conversation);
}
} else if (response.getType() == IqPacket.TYPE.RESULT) {
- Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": ping to " + self + " came back fine");
+ Log.d(Config.LOGTAG, a.getJid().asBareJid() + ": ping to " + self + " came back fine");
+ }
+ synchronized (account.inProgressConferencePings) {
+ account.inProgressConferencePings.remove(conversation);
}
});
}