diff --git a/src/main/java/org/whispersystems/textsecuregcm/controllers/KeysController.java b/src/main/java/org/whispersystems/textsecuregcm/controllers/KeysController.java index f242eaa3b..6c850d591 100644 --- a/src/main/java/org/whispersystems/textsecuregcm/controllers/KeysController.java +++ b/src/main/java/org/whispersystems/textsecuregcm/controllers/KeysController.java @@ -16,8 +16,10 @@ */ package org.whispersystems.textsecuregcm.controllers; -import com.codahale.metrics.annotation.Timed; import com.google.common.base.Optional; +import org.skife.jdbi.v2.exceptions.UnableToExecuteStatementException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.whispersystems.textsecuregcm.entities.PreKeyCount; import org.whispersystems.textsecuregcm.federation.FederatedClientManager; import org.whispersystems.textsecuregcm.limits.RateLimiters; @@ -38,6 +40,8 @@ import io.dropwizard.auth.Auth; public class KeysController { + private static final Logger logger = LoggerFactory.getLogger(KeysController.class); + protected final RateLimiters rateLimiters; protected final Keys keys; protected final AccountsManager accounts; @@ -86,8 +90,16 @@ public class KeysController { throw new NoSuchUserException("Target device is inactive."); } - Optional> preKeys = keys.get(number, deviceId); - return new TargetKeys(destination.get(), preKeys); + for (int i=0;i<20;i++) { + try { + Optional> preKeys = keys.get(number, deviceId); + return new TargetKeys(destination.get(), preKeys); + } catch (UnableToExecuteStatementException e) { + logger.info(e.getMessage()); + } + } + + throw new WebApplicationException(Response.status(500).build()); } catch (NumberFormatException e) { throw new WebApplicationException(Response.status(422).build()); }