parent
bc65461ecb
commit
fd662e3401
|
@ -74,6 +74,7 @@ import org.whispersystems.textsecuregcm.util.Constants;
|
||||||
import org.whispersystems.textsecuregcm.util.UrlSigner;
|
import org.whispersystems.textsecuregcm.util.UrlSigner;
|
||||||
import org.whispersystems.textsecuregcm.websocket.WebsocketControllerFactory;
|
import org.whispersystems.textsecuregcm.websocket.WebsocketControllerFactory;
|
||||||
import org.whispersystems.textsecuregcm.workers.DirectoryCommand;
|
import org.whispersystems.textsecuregcm.workers.DirectoryCommand;
|
||||||
|
import org.whispersystems.textsecuregcm.workers.VacuumCommand;
|
||||||
|
|
||||||
import javax.servlet.DispatcherType;
|
import javax.servlet.DispatcherType;
|
||||||
import javax.servlet.FilterRegistration;
|
import javax.servlet.FilterRegistration;
|
||||||
|
@ -101,6 +102,7 @@ public class WhisperServerService extends Application<WhisperServerConfiguration
|
||||||
@Override
|
@Override
|
||||||
public void initialize(Bootstrap<WhisperServerConfiguration> bootstrap) {
|
public void initialize(Bootstrap<WhisperServerConfiguration> bootstrap) {
|
||||||
bootstrap.addCommand(new DirectoryCommand());
|
bootstrap.addCommand(new DirectoryCommand());
|
||||||
|
bootstrap.addCommand(new VacuumCommand());
|
||||||
bootstrap.addBundle(new MigrationsBundle<WhisperServerConfiguration>() {
|
bootstrap.addBundle(new MigrationsBundle<WhisperServerConfiguration>() {
|
||||||
@Override
|
@Override
|
||||||
public DataSourceFactory getDataSourceFactory(WhisperServerConfiguration configuration) {
|
public DataSourceFactory getDataSourceFactory(WhisperServerConfiguration configuration) {
|
||||||
|
|
|
@ -85,6 +85,9 @@ public abstract class Accounts {
|
||||||
return insertStep(account);
|
return insertStep(account);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SqlUpdate("VACUUM accounts")
|
||||||
|
public abstract void vacuum();
|
||||||
|
|
||||||
public static class AccountMapper implements ResultSetMapper<Account> {
|
public static class AccountMapper implements ResultSetMapper<Account> {
|
||||||
@Override
|
@Override
|
||||||
public Account map(int i, ResultSet resultSet, StatementContext statementContext)
|
public Account map(int i, ResultSet resultSet, StatementContext statementContext)
|
||||||
|
|
|
@ -31,8 +31,6 @@ import org.skife.jdbi.v2.sqlobject.Transaction;
|
||||||
import org.skife.jdbi.v2.sqlobject.customizers.Mapper;
|
import org.skife.jdbi.v2.sqlobject.customizers.Mapper;
|
||||||
import org.skife.jdbi.v2.tweak.ResultSetMapper;
|
import org.skife.jdbi.v2.tweak.ResultSetMapper;
|
||||||
import org.whispersystems.textsecuregcm.entities.PreKeyBase;
|
import org.whispersystems.textsecuregcm.entities.PreKeyBase;
|
||||||
import org.whispersystems.textsecuregcm.entities.PreKeyV1;
|
|
||||||
import org.whispersystems.textsecuregcm.entities.PreKeyV2;
|
|
||||||
|
|
||||||
import java.lang.annotation.Annotation;
|
import java.lang.annotation.Annotation;
|
||||||
import java.lang.annotation.ElementType;
|
import java.lang.annotation.ElementType;
|
||||||
|
@ -114,6 +112,9 @@ public abstract class Keys {
|
||||||
else return Optional.absent();
|
else return Optional.absent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SqlUpdate("VACUUM keys")
|
||||||
|
public abstract void vacuum();
|
||||||
|
|
||||||
@BindingAnnotation(PreKeyBinder.PreKeyBinderFactory.class)
|
@BindingAnnotation(PreKeyBinder.PreKeyBinderFactory.class)
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
@Target({ElementType.PARAMETER})
|
@Target({ElementType.PARAMETER})
|
||||||
|
|
|
@ -31,4 +31,7 @@ public interface PendingAccounts {
|
||||||
|
|
||||||
@SqlUpdate("DELETE FROM pending_accounts WHERE number = :number")
|
@SqlUpdate("DELETE FROM pending_accounts WHERE number = :number")
|
||||||
void remove(@Bind("number") String number);
|
void remove(@Bind("number") String number);
|
||||||
|
|
||||||
|
@SqlUpdate("VACUUM pending_accounts")
|
||||||
|
public void vacuum();
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
package org.whispersystems.textsecuregcm.workers;
|
||||||
|
|
||||||
|
import net.sourceforge.argparse4j.inf.Namespace;
|
||||||
|
import org.skife.jdbi.v2.DBI;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.whispersystems.textsecuregcm.WhisperServerConfiguration;
|
||||||
|
import org.whispersystems.textsecuregcm.storage.Accounts;
|
||||||
|
import org.whispersystems.textsecuregcm.storage.Keys;
|
||||||
|
import org.whispersystems.textsecuregcm.storage.PendingAccounts;
|
||||||
|
|
||||||
|
import io.dropwizard.cli.ConfiguredCommand;
|
||||||
|
import io.dropwizard.db.DataSourceFactory;
|
||||||
|
import io.dropwizard.jdbi.ImmutableListContainerFactory;
|
||||||
|
import io.dropwizard.jdbi.ImmutableSetContainerFactory;
|
||||||
|
import io.dropwizard.jdbi.OptionalContainerFactory;
|
||||||
|
import io.dropwizard.jdbi.args.OptionalArgumentFactory;
|
||||||
|
import io.dropwizard.setup.Bootstrap;
|
||||||
|
|
||||||
|
|
||||||
|
public class VacuumCommand extends ConfiguredCommand<WhisperServerConfiguration> {
|
||||||
|
|
||||||
|
private final Logger logger = LoggerFactory.getLogger(DirectoryCommand.class);
|
||||||
|
|
||||||
|
public VacuumCommand() {
|
||||||
|
super("vacuum", "Vacuum Postgres Tables");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void run(Bootstrap<WhisperServerConfiguration> bootstrap,
|
||||||
|
Namespace namespace,
|
||||||
|
WhisperServerConfiguration config)
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
DataSourceFactory dbConfig = config.getDataSourceFactory();
|
||||||
|
DBI dbi = new DBI(dbConfig.getUrl(), dbConfig.getUser(), dbConfig.getPassword());
|
||||||
|
|
||||||
|
dbi.registerArgumentFactory(new OptionalArgumentFactory(dbConfig.getDriverClass()));
|
||||||
|
dbi.registerContainerFactory(new ImmutableListContainerFactory());
|
||||||
|
dbi.registerContainerFactory(new ImmutableSetContainerFactory());
|
||||||
|
dbi.registerContainerFactory(new OptionalContainerFactory());
|
||||||
|
|
||||||
|
Accounts accounts = dbi.onDemand(Accounts.class );
|
||||||
|
Keys keys = dbi.onDemand(Keys.class );
|
||||||
|
PendingAccounts pendingAccounts = dbi.onDemand(PendingAccounts.class);
|
||||||
|
|
||||||
|
logger.warn("Vacuuming accounts...");
|
||||||
|
accounts.vacuum();
|
||||||
|
|
||||||
|
logger.warn("Vacuuming pending_accounts...");
|
||||||
|
pendingAccounts.vacuum();
|
||||||
|
|
||||||
|
logger.warn("Vacuuming keys...");
|
||||||
|
keys.vacuum();
|
||||||
|
|
||||||
|
Thread.sleep(3000);
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue