diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/SignedPreKey.java b/src/main/java/org/whispersystems/textsecuregcm/entities/SignedPreKey.java index 1399f2b79..7d04e49d2 100644 --- a/src/main/java/org/whispersystems/textsecuregcm/entities/SignedPreKey.java +++ b/src/main/java/org/whispersystems/textsecuregcm/entities/SignedPreKey.java @@ -5,7 +5,7 @@ import org.hibernate.validator.constraints.NotEmpty; import java.io.Serializable; -public class SignedPreKey extends PreKeyV2 implements Serializable { +public class SignedPreKey extends PreKeyV2 { @JsonProperty @NotEmpty diff --git a/src/main/java/org/whispersystems/textsecuregcm/providers/MemcacheHealthCheck.java b/src/main/java/org/whispersystems/textsecuregcm/providers/MemcacheHealthCheck.java index f6915a7e7..b28fadc2a 100644 --- a/src/main/java/org/whispersystems/textsecuregcm/providers/MemcacheHealthCheck.java +++ b/src/main/java/org/whispersystems/textsecuregcm/providers/MemcacheHealthCheck.java @@ -45,6 +45,8 @@ public class MemcacheHealthCheck extends HealthCheck { return Result.unhealthy("Fetch failed"); } + this.client.delete("HEALTH" + random); + return Result.healthy(); } diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/Account.java b/src/main/java/org/whispersystems/textsecuregcm/storage/Account.java index 5d8f5c9c1..b7ea1743f 100644 --- a/src/main/java/org/whispersystems/textsecuregcm/storage/Account.java +++ b/src/main/java/org/whispersystems/textsecuregcm/storage/Account.java @@ -26,9 +26,9 @@ import java.io.Serializable; import java.util.LinkedList; import java.util.List; -public class Account implements Serializable { +public class Account { - public static final int MEMCACHE_VERION = 4; + public static final int MEMCACHE_VERION = 5; @JsonIgnore private long id; diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java b/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java index fdfe7b13f..60b45b789 100644 --- a/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java +++ b/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java @@ -17,19 +17,27 @@ package org.whispersystems.textsecuregcm.storage; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.base.Optional; import net.spy.memcached.MemcachedClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.whispersystems.textsecuregcm.entities.ClientContact; import org.whispersystems.textsecuregcm.util.Util; +import java.io.IOException; import java.util.Iterator; import java.util.List; public class AccountsManager { + private final Logger logger = LoggerFactory.getLogger(AccountsManager.class); + private final Accounts accounts; private final MemcachedClient memcachedClient; private final DirectoryManager directory; + private final ObjectMapper mapper; public AccountsManager(Accounts accounts, DirectoryManager directory, @@ -38,6 +46,7 @@ public class AccountsManager { this.accounts = accounts; this.directory = directory; this.memcachedClient = memcachedClient; + this.mapper = new ObjectMapper(); } public long getCount() { @@ -54,40 +63,28 @@ public class AccountsManager { public void create(Account account) { accounts.create(account); - - if (memcachedClient != null) { - memcachedClient.set(getKey(account.getNumber()), 0, account); - } - + memcacheSet(account.getNumber(), account); updateDirectory(account); } public void update(Account account) { - if (memcachedClient != null) { - memcachedClient.set(getKey(account.getNumber()), 0, account); - } - + memcacheSet(account.getNumber(), account); accounts.update(account); updateDirectory(account); } public Optional get(String number) { - Account account = null; + Optional account = memcacheGet(number); - if (memcachedClient != null) { - account = (Account)memcachedClient.get(getKey(number)); - } + if (!account.isPresent()) { + account = Optional.fromNullable(accounts.get(number)); - if (account == null) { - account = accounts.get(number); - - if (account != null && memcachedClient != null) { - memcachedClient.set(getKey(number), 0, account); + if (account.isPresent()) { + memcacheSet(number, account.get()); } } - if (account != null) return Optional.of(account); - else return Optional.absent(); + return account; } public boolean isRelayListed(String number) { @@ -111,4 +108,30 @@ public class AccountsManager { return Account.class.getSimpleName() + Account.MEMCACHE_VERION + number; } + private void memcacheSet(String number, Account account) { + if (memcachedClient != null) { + try { + String json = mapper.writeValueAsString(account); + memcachedClient.set(getKey(number), 0, json); + } catch (JsonProcessingException e) { + throw new IllegalArgumentException(e); + } + } + } + + private Optional memcacheGet(String number) { + if (memcachedClient == null) return Optional.absent(); + + try { + String json = (String)memcachedClient.get(getKey(number)); + + if (json != null) return Optional.of(mapper.readValue(json, Account.class)); + else return Optional.absent(); + + } catch (IOException e) { + logger.warn("AccountsManager", "Deserialization error", e); + return Optional.absent(); + } + } + } diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/Device.java b/src/main/java/org/whispersystems/textsecuregcm/storage/Device.java index c75aa5b6b..e5f8691c6 100644 --- a/src/main/java/org/whispersystems/textsecuregcm/storage/Device.java +++ b/src/main/java/org/whispersystems/textsecuregcm/storage/Device.java @@ -24,7 +24,7 @@ import org.whispersystems.textsecuregcm.util.Util; import java.io.Serializable; -public class Device implements Serializable { +public class Device { public static final long MASTER_ID = 1; diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/PendingAccountsManager.java b/src/main/java/org/whispersystems/textsecuregcm/storage/PendingAccountsManager.java index a6eddf026..db95f5f50 100644 --- a/src/main/java/org/whispersystems/textsecuregcm/storage/PendingAccountsManager.java +++ b/src/main/java/org/whispersystems/textsecuregcm/storage/PendingAccountsManager.java @@ -34,35 +34,46 @@ public class PendingAccountsManager { } public void store(String number, String code) { - if (memcachedClient != null) { - memcachedClient.set(MEMCACHE_PREFIX + number, 0, code); - } - + memcacheSet(number, code); pendingAccounts.insert(number, code); } public void remove(String number) { - if (memcachedClient != null) - memcachedClient.delete(MEMCACHE_PREFIX + number); + memcacheDelete(number); pendingAccounts.remove(number); } public Optional getCodeForNumber(String number) { - String code = null; + Optional code = memcacheGet(number); - if (memcachedClient != null) { - code = (String)memcachedClient.get(MEMCACHE_PREFIX + number); - } + if (!code.isPresent()) { + code = Optional.fromNullable(pendingAccounts.getCodeForNumber(number)); - if (code == null) { - code = pendingAccounts.getCodeForNumber(number); - - if (code != null && memcachedClient != null) { - memcachedClient.set(MEMCACHE_PREFIX + number, 0, code); + if (code.isPresent()) { + memcacheSet(number, code.get()); } } - if (code != null) return Optional.of(code); - else return Optional.absent(); + return code; + } + + private void memcacheSet(String number, String code) { + if (memcachedClient != null) { + memcachedClient.set(MEMCACHE_PREFIX + number, 0, code); + } + } + + private Optional memcacheGet(String number) { + if (memcachedClient != null) { + return Optional.fromNullable((String)memcachedClient.get(MEMCACHE_PREFIX + number)); + } else { + return Optional.absent(); + } + } + + private void memcacheDelete(String number) { + if (memcachedClient != null) { + memcachedClient.delete(MEMCACHE_PREFIX + number); + } } } diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/PendingDevicesManager.java b/src/main/java/org/whispersystems/textsecuregcm/storage/PendingDevicesManager.java index 3a571f97a..4222ee570 100644 --- a/src/main/java/org/whispersystems/textsecuregcm/storage/PendingDevicesManager.java +++ b/src/main/java/org/whispersystems/textsecuregcm/storage/PendingDevicesManager.java @@ -34,37 +34,47 @@ public class PendingDevicesManager { } public void store(String number, String code) { - if (memcachedClient != null) { - memcachedClient.set(MEMCACHE_PREFIX + number, 0, code); - } - + memcacheSet(number, code); pendingDevices.insert(number, code); } public void remove(String number) { - if (memcachedClient != null) { - memcachedClient.delete(MEMCACHE_PREFIX + number); - } - + memcacheDelete(number); pendingDevices.remove(number); } public Optional getCodeForNumber(String number) { - String code = null; + Optional code = memcacheGet(number); - if (memcachedClient != null) { - code = (String)memcachedClient.get(MEMCACHE_PREFIX + number); - } + if (!code.isPresent()) { + code = Optional.fromNullable(pendingDevices.getCodeForNumber(number)); - if (code == null) { - code = pendingDevices.getCodeForNumber(number); - - if (code != null && memcachedClient != null) { - memcachedClient.set(MEMCACHE_PREFIX + number, 0, code); + if (code.isPresent()) { + memcacheSet(number, code.get()); } } - if (code != null) return Optional.of(code); - else return Optional.absent(); + return code; } + + private void memcacheSet(String number, String code) { + if (memcachedClient != null) { + memcachedClient.set(MEMCACHE_PREFIX + number, 0, code); + } + } + + private Optional memcacheGet(String number) { + if (memcachedClient != null) { + return Optional.fromNullable((String)memcachedClient.get(MEMCACHE_PREFIX + number)); + } else { + return Optional.absent(); + } + } + + private void memcacheDelete(String number) { + if (memcachedClient != null) { + memcachedClient.delete(MEMCACHE_PREFIX + number); + } + } + }