Send delivery receipts asynchronously

This commit is contained in:
Chris Eager 2022-03-11 13:46:59 -08:00 committed by Chris Eager
parent b608ece57e
commit 7c9ae3561d
2 changed files with 23 additions and 12 deletions

View File

@ -399,6 +399,8 @@ public class WhisperServerService extends Application<WhisperServerConfiguration
minThreads(availableProcessors). // mostly this is IO bound so tying to number of processors is tenuous at best minThreads(availableProcessors). // mostly this is IO bound so tying to number of processors is tenuous at best
allowCoreThreadTimeOut(true). allowCoreThreadTimeOut(true).
build(); build();
ExecutorService receiptSenderExecutor = environment.lifecycle()
.executorService(name(getClass(), "receiptSender-%d")).maxThreads(16).minThreads(16).build();
StripeManager stripeManager = new StripeManager(config.getStripe().getApiKey(), stripeExecutor, StripeManager stripeManager = new StripeManager(config.getStripe().getApiKey(), stripeExecutor,
config.getStripe().getIdempotencyKeyGenerator(), config.getStripe().getBoostDescription()); config.getStripe().getIdempotencyKeyGenerator(), config.getStripe().getBoostDescription());
@ -468,7 +470,7 @@ public class WhisperServerService extends Application<WhisperServerConfiguration
TwilioSmsSender twilioSmsSender = new TwilioSmsSender(config.getTwilioConfiguration(), dynamicConfigurationManager); TwilioSmsSender twilioSmsSender = new TwilioSmsSender(config.getTwilioConfiguration(), dynamicConfigurationManager);
SmsSender smsSender = new SmsSender(twilioSmsSender); SmsSender smsSender = new SmsSender(twilioSmsSender);
MessageSender messageSender = new MessageSender(apnFallbackManager, clientPresenceManager, messagesManager, gcmSender, apnSender, pushLatencyManager); MessageSender messageSender = new MessageSender(apnFallbackManager, clientPresenceManager, messagesManager, gcmSender, apnSender, pushLatencyManager);
ReceiptSender receiptSender = new ReceiptSender(accountsManager, messageSender); ReceiptSender receiptSender = new ReceiptSender(accountsManager, messageSender, receiptSenderExecutor);
TurnTokenGenerator turnTokenGenerator = new TurnTokenGenerator(config.getTurnConfiguration()); TurnTokenGenerator turnTokenGenerator = new TurnTokenGenerator(config.getTurnConfiguration());
RecaptchaClient recaptchaClient = new RecaptchaClient( RecaptchaClient recaptchaClient = new RecaptchaClient(
config.getRecaptchaConfiguration().getProjectPath(), config.getRecaptchaConfiguration().getProjectPath(),

View File

@ -1,11 +1,13 @@
/* /*
* Copyright 2013-2021 Signal Messenger, LLC * Copyright 2013-2022 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only * SPDX-License-Identifier: AGPL-3.0-only
*/ */
package org.whispersystems.textsecuregcm.push; package org.whispersystems.textsecuregcm.push;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.whispersystems.textsecuregcm.auth.AuthenticatedAccount; import org.whispersystems.textsecuregcm.auth.AuthenticatedAccount;
@ -17,20 +19,23 @@ import org.whispersystems.textsecuregcm.storage.Device;
public class ReceiptSender { public class ReceiptSender {
private final MessageSender messageSender; private final MessageSender messageSender;
private final AccountsManager accountManager; private final AccountsManager accountManager;
private final ExecutorService executor;
private static final Logger logger = LoggerFactory.getLogger(ReceiptSender.class); private static final Logger logger = LoggerFactory.getLogger(ReceiptSender.class);
public ReceiptSender(final AccountsManager accountManager, final MessageSender messageSender) { public ReceiptSender(final AccountsManager accountManager, final MessageSender messageSender,
final ExecutorService executor) {
this.accountManager = accountManager; this.accountManager = accountManager;
this.messageSender = messageSender; this.messageSender = messageSender;
this.executor = executor;
} }
public void sendReceipt(AuthenticatedAccount source, UUID destinationUuid, long messageId) throws NoSuchUserException { public CompletableFuture<Void> sendReceipt(AuthenticatedAccount source, UUID destinationUuid, long messageId) throws NoSuchUserException {
final Account sourceAccount = source.getAccount(); final Account sourceAccount = source.getAccount();
if (sourceAccount.getUuid().equals(destinationUuid)) { if (sourceAccount.getUuid().equals(destinationUuid)) {
return; return CompletableFuture.completedFuture(null);
} }
final Account destinationAccount = accountManager.getByAccountIdentifier(destinationUuid) final Account destinationAccount = accountManager.getByAccountIdentifier(destinationUuid)
@ -45,12 +50,16 @@ public class ReceiptSender {
.setTimestamp(messageId) .setTimestamp(messageId)
.setType(Envelope.Type.SERVER_DELIVERY_RECEIPT); .setType(Envelope.Type.SERVER_DELIVERY_RECEIPT);
for (final Device destinationDevice : destinationAccount.getDevices()) { return CompletableFuture.runAsync(() -> {
try { for (final Device destinationDevice : destinationAccount.getDevices()) {
messageSender.sendMessage(destinationAccount, destinationDevice, message.build(), false); try {
} catch (final NotPushRegisteredException e) { messageSender.sendMessage(destinationAccount, destinationDevice, message.build(), false);
logger.info("User no longer push registered for delivery receipt: " + e.getMessage()); } catch (final NotPushRegisteredException e) {
logger.info("User no longer push registered for delivery receipt: " + e.getMessage());
} catch (final Exception e) {
logger.warn("Could not send delivery receipt", e);
}
} }
} }, executor);
} }
} }