mirror of
https://github.com/signalapp/Signal-Server
synced 2026-04-22 10:18:04 +01:00
Persist messages in batches.
This commit is contained in:
committed by
Jon Chambers
parent
6041a9d094
commit
fc71ced660
@@ -44,9 +44,8 @@ public class MessagesTest {
|
||||
@Test
|
||||
public void testStore() throws SQLException {
|
||||
Envelope envelope = generateEnvelope();
|
||||
UUID guid = UUID.randomUUID();
|
||||
|
||||
messages.store(guid, envelope, "+14151112222", 1);
|
||||
messages.store(List.of(envelope), "+14151112222", 1);
|
||||
|
||||
PreparedStatement statement = db.getTestDatabase().getConnection().prepareStatement("SELECT * FROM messages WHERE destination = ?");
|
||||
statement.setString(1, "+14151112222");
|
||||
@@ -54,7 +53,7 @@ public class MessagesTest {
|
||||
ResultSet resultSet = statement.executeQuery();
|
||||
assertThat(resultSet.next()).isTrue();
|
||||
|
||||
assertThat(resultSet.getString("guid")).isEqualTo(guid.toString());
|
||||
assertThat(resultSet.getString("guid")).isEqualTo(envelope.getServerGuid());
|
||||
assertThat(resultSet.getInt("type")).isEqualTo(envelope.getType().getNumber());
|
||||
assertThat(resultSet.getString("relay")).isNullOrEmpty();
|
||||
assertThat(resultSet.getLong("timestamp")).isEqualTo(envelope.getTimestamp());
|
||||
@@ -71,36 +70,29 @@ public class MessagesTest {
|
||||
|
||||
@Test
|
||||
public void testLoad() {
|
||||
List<MessageToStore> inserted = new ArrayList<>(50);
|
||||
List<Envelope> inserted = insertRandom("+14151112222", 1);
|
||||
|
||||
for (int i=0;i<50;i++) {
|
||||
MessageToStore message = generateMessageToStore();
|
||||
inserted.add(message);
|
||||
|
||||
messages.store(message.guid, message.envelope, "+14151112222", 1);
|
||||
}
|
||||
|
||||
inserted.sort(Comparator.comparingLong(o -> o.envelope.getTimestamp()));
|
||||
inserted.sort(Comparator.comparingLong(Envelope::getTimestamp));
|
||||
|
||||
List<OutgoingMessageEntity> retrieved = messages.load("+14151112222", 1);
|
||||
|
||||
assertThat(retrieved.size()).isEqualTo(inserted.size());
|
||||
|
||||
for (int i=0;i<retrieved.size();i++) {
|
||||
verifyExpected(retrieved.get(i), inserted.get(i).envelope, inserted.get(i).guid);
|
||||
verifyExpected(retrieved.get(i), inserted.get(i), UUID.fromString(inserted.get(i).getServerGuid()));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void removeBySourceDestinationTimestamp() {
|
||||
List<MessageToStore> inserted = insertRandom("+14151112222", 1);
|
||||
List<MessageToStore> unrelated = insertRandom("+14151114444", 3);
|
||||
MessageToStore toRemove = inserted.remove(new Random(System.currentTimeMillis()).nextInt(inserted.size() - 1));
|
||||
Optional<OutgoingMessageEntity> removed = messages.remove("+14151112222", 1, toRemove.envelope.getSource(), toRemove.envelope.getTimestamp());
|
||||
List<Envelope> inserted = insertRandom("+14151112222", 1);
|
||||
List<Envelope> unrelated = insertRandom("+14151114444", 3);
|
||||
Envelope toRemove = inserted.remove(new Random(System.currentTimeMillis()).nextInt(inserted.size() - 1));
|
||||
Optional<OutgoingMessageEntity> removed = messages.remove("+14151112222", 1, toRemove.getSource(), toRemove.getTimestamp());
|
||||
|
||||
assertThat(removed.isPresent()).isTrue();
|
||||
verifyExpected(removed.get(), toRemove.envelope, toRemove.guid);
|
||||
verifyExpected(removed.get(), toRemove, UUID.fromString(toRemove.getServerGuid()));
|
||||
|
||||
verifyInTact(inserted, "+14151112222", 1);
|
||||
verifyInTact(unrelated, "+14151114444", 3);
|
||||
@@ -108,13 +100,13 @@ public class MessagesTest {
|
||||
|
||||
@Test
|
||||
public void removeByDestinationGuid() {
|
||||
List<MessageToStore> unrelated = insertRandom("+14151113333", 2);
|
||||
List<MessageToStore> inserted = insertRandom("+14151112222", 1);
|
||||
MessageToStore toRemove = inserted.remove(new Random(System.currentTimeMillis()).nextInt(inserted.size() - 1));
|
||||
Optional<OutgoingMessageEntity> removed = messages.remove("+14151112222", toRemove.guid);
|
||||
List<Envelope> unrelated = insertRandom("+14151113333", 2);
|
||||
List<Envelope> inserted = insertRandom("+14151112222", 1);
|
||||
Envelope toRemove = inserted.remove(new Random(System.currentTimeMillis()).nextInt(inserted.size() - 1));
|
||||
Optional<OutgoingMessageEntity> removed = messages.remove("+14151112222", UUID.fromString(toRemove.getServerGuid()));
|
||||
|
||||
assertThat(removed.isPresent()).isTrue();
|
||||
verifyExpected(removed.get(), toRemove.envelope, toRemove.guid);
|
||||
verifyExpected(removed.get(), toRemove, UUID.fromString(toRemove.getServerGuid()));
|
||||
|
||||
verifyInTact(inserted, "+14151112222", 1);
|
||||
verifyInTact(unrelated, "+14151113333", 2);
|
||||
@@ -122,10 +114,10 @@ public class MessagesTest {
|
||||
|
||||
@Test
|
||||
public void removeByDestinationRowId() {
|
||||
List<MessageToStore> unrelatedInserted = insertRandom("+14151111111", 1);
|
||||
List<MessageToStore> inserted = insertRandom("+14151112222", 1);
|
||||
List<Envelope> unrelatedInserted = insertRandom("+14151111111", 1);
|
||||
List<Envelope> inserted = insertRandom("+14151112222", 1);
|
||||
|
||||
inserted.sort(Comparator.comparingLong(o -> o.envelope.getTimestamp()));
|
||||
inserted.sort(Comparator.comparingLong(Envelope::getTimestamp));
|
||||
|
||||
List<OutgoingMessageEntity> retrieved = messages.load("+14151112222", 1);
|
||||
|
||||
@@ -141,9 +133,8 @@ public class MessagesTest {
|
||||
|
||||
@Test
|
||||
public void testLoadEmpty() {
|
||||
List<MessageToStore> inserted = insertRandom("+14151112222", 1);
|
||||
List<OutgoingMessageEntity> loaded = messages.load("+14159999999", 1);
|
||||
assertThat(loaded.isEmpty()).isTrue();
|
||||
insertRandom("+14151112222", 1);
|
||||
assertThat(messages.load("+14159999999", 1).isEmpty()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -151,7 +142,7 @@ public class MessagesTest {
|
||||
insertRandom("+14151112222", 1);
|
||||
insertRandom("+14151112222", 2);
|
||||
|
||||
List<MessageToStore> unrelated = insertRandom("+14151111111", 1);
|
||||
List<Envelope> unrelated = insertRandom("+14151111111", 1);
|
||||
|
||||
messages.clear("+14151112222");
|
||||
|
||||
@@ -163,9 +154,9 @@ public class MessagesTest {
|
||||
@Test
|
||||
public void testClearDestinationDevice() {
|
||||
insertRandom("+14151112222", 1);
|
||||
List<MessageToStore> inserted = insertRandom("+14151112222", 2);
|
||||
List<Envelope> inserted = insertRandom("+14151112222", 2);
|
||||
|
||||
List<MessageToStore> unrelated = insertRandom("+14151111111", 1);
|
||||
List<Envelope> unrelated = insertRandom("+14151111111", 1);
|
||||
|
||||
messages.clear("+14151112222", 1);
|
||||
|
||||
@@ -177,33 +168,32 @@ public class MessagesTest {
|
||||
|
||||
@Test
|
||||
public void testVacuum() {
|
||||
List<MessageToStore> inserted = insertRandom("+14151112222", 2);
|
||||
List<Envelope> inserted = insertRandom("+14151112222", 2);
|
||||
messages.vacuum();
|
||||
verifyInTact(inserted, "+14151112222", 2);
|
||||
}
|
||||
|
||||
private List<MessageToStore> insertRandom(String destination, int destinationDevice) {
|
||||
List<MessageToStore> inserted = new ArrayList<>(50);
|
||||
private List<Envelope> insertRandom(String destination, int destinationDevice) {
|
||||
List<Envelope> inserted = new ArrayList<>(50);
|
||||
|
||||
for (int i=0;i<50;i++) {
|
||||
MessageToStore message = generateMessageToStore();
|
||||
inserted.add(message);
|
||||
|
||||
messages.store(message.guid, message.envelope, destination, destinationDevice);
|
||||
inserted.add(generateEnvelope());
|
||||
}
|
||||
|
||||
messages.store(inserted, destination, destinationDevice);
|
||||
|
||||
return inserted;
|
||||
}
|
||||
|
||||
private void verifyInTact(List<MessageToStore> inserted, String destination, int destinationDevice) {
|
||||
inserted.sort(Comparator.comparingLong(o -> o.envelope.getTimestamp()));
|
||||
private void verifyInTact(List<Envelope> inserted, String destination, int destinationDevice) {
|
||||
inserted.sort(Comparator.comparingLong(Envelope::getTimestamp));
|
||||
|
||||
List<OutgoingMessageEntity> retrieved = messages.load(destination, destinationDevice);
|
||||
|
||||
assertThat(retrieved.size()).isEqualTo(inserted.size());
|
||||
|
||||
for (int i=0;i<retrieved.size();i++) {
|
||||
verifyExpected(retrieved.get(i), inserted.get(i).envelope, inserted.get(i).guid);
|
||||
verifyExpected(retrieved.get(i), inserted.get(i), UUID.fromString(inserted.get(i).getServerGuid()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -220,10 +210,6 @@ public class MessagesTest {
|
||||
assertThat(retrieved.getSourceDevice()).isEqualTo(inserted.getSourceDevice());
|
||||
}
|
||||
|
||||
private MessageToStore generateMessageToStore() {
|
||||
return new MessageToStore(UUID.randomUUID(), generateEnvelope());
|
||||
}
|
||||
|
||||
private Envelope generateEnvelope() {
|
||||
Random random = new Random();
|
||||
byte[] content = new byte[256];
|
||||
@@ -233,6 +219,7 @@ public class MessagesTest {
|
||||
Arrays.fill(legacy, (byte)random.nextInt(255));
|
||||
|
||||
return Envelope.newBuilder()
|
||||
.setServerGuid(UUID.randomUUID().toString())
|
||||
.setSourceDevice(random.nextInt(10000))
|
||||
.setSource("testSource" + random.nextInt())
|
||||
.setTimestamp(serialTimestamp++)
|
||||
@@ -243,14 +230,4 @@ public class MessagesTest {
|
||||
.setServerGuid(UUID.randomUUID().toString())
|
||||
.build();
|
||||
}
|
||||
|
||||
private static class MessageToStore {
|
||||
private final UUID guid;
|
||||
private final Envelope envelope;
|
||||
|
||||
private MessageToStore(UUID guid, Envelope envelope) {
|
||||
this.guid = guid;
|
||||
this.envelope = envelope;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user