fix Derby instantiation

This commit is contained in:
Xavier Léauté 2014-11-10 16:55:53 -08:00
parent 8cbd21af90
commit 59f093882d
15 changed files with 121 additions and 56 deletions

View File

@ -43,9 +43,6 @@ public class MetadataStorageConnectorConfig
@JsonProperty @JsonProperty
private String password = null; private String password = null;
@JsonProperty
private String validationQuery = "SELECT 1";
public boolean isCreateTables() public boolean isCreateTables()
{ {
return createTables; return createTables;
@ -66,7 +63,6 @@ public class MetadataStorageConnectorConfig
if (connectURI == null) { if (connectURI == null) {
return String.format("jdbc:derby://%s:%s/druid;create=true", host, port); return String.format("jdbc:derby://%s:%s/druid;create=true", host, port);
} }
return connectURI; return connectURI;
} }
@ -80,20 +76,14 @@ public class MetadataStorageConnectorConfig
return password; return password;
} }
public String getValidationQuery()
{
return validationQuery;
}
@Override @Override
public String toString() public String toString()
{ {
return "DbConnectorConfig{" + return "DbConnectorConfig{" +
"createTables=" + createTables + "createTables=" + createTables +
", connectURI='" + connectURI + '\'' + ", connectURI='" + getConnectURI() + '\'' +
", user='" + user + '\'' + ", user='" + user + '\'' +
", password=****" + ", password=****" +
", validationQuery='" + validationQuery + '\'' +
'}'; '}';
} }
} }

View File

@ -72,7 +72,7 @@ public class MySQLConnector extends SQLMetadataConnector
} }
@Override @Override
protected boolean tableExists(Handle handle, String tableName) public boolean tableExists(Handle handle, String tableName)
{ {
return !handle.createQuery("SHOW tables LIKE :tableName") return !handle.createQuery("SHOW tables LIKE :tableName")
.bind("tableName", tableName) .bind("tableName", tableName)

View File

@ -65,7 +65,7 @@ public class PostgreSQLConnector extends SQLMetadataConnector
} }
@Override @Override
protected boolean tableExists(final Handle handle, final String tableName) public boolean tableExists(final Handle handle, final String tableName)
{ {
return !handle.createQuery( return !handle.createQuery(
"SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = 'public' AND tablename LIKE :tableName" "SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = 'public' AND tablename LIKE :tableName"

View File

@ -25,7 +25,6 @@ import com.google.inject.Module;
import io.druid.indexer.MetadataStorageUpdaterJobHandler; import io.druid.indexer.MetadataStorageUpdaterJobHandler;
import io.druid.indexer.SQLMetadataStorageUpdaterJobHandler; import io.druid.indexer.SQLMetadataStorageUpdaterJobHandler;
import io.druid.indexing.overlord.IndexerMetadataStorageCoordinator; import io.druid.indexing.overlord.IndexerMetadataStorageCoordinator;
import io.druid.metadata.MetadataStorage;
import io.druid.metadata.MetadataStorageActionHandlerFactory; import io.druid.metadata.MetadataStorageActionHandlerFactory;
import io.druid.metadata.IndexerSQLMetadataStorageCoordinator; import io.druid.metadata.IndexerSQLMetadataStorageCoordinator;
import io.druid.metadata.MetadataRuleManager; import io.druid.metadata.MetadataRuleManager;
@ -35,6 +34,8 @@ import io.druid.metadata.MetadataSegmentManagerProvider;
import io.druid.metadata.MetadataSegmentPublisher; import io.druid.metadata.MetadataSegmentPublisher;
import io.druid.metadata.MetadataSegmentPublisherProvider; import io.druid.metadata.MetadataSegmentPublisherProvider;
import io.druid.metadata.MetadataStorageConnector; import io.druid.metadata.MetadataStorageConnector;
import io.druid.metadata.MetadataStorageProvider;
import io.druid.metadata.NoopMetadataStorageProvider;
import io.druid.metadata.SQLMetadataConnector; import io.druid.metadata.SQLMetadataConnector;
import io.druid.metadata.SQLMetadataRuleManager; import io.druid.metadata.SQLMetadataRuleManager;
import io.druid.metadata.SQLMetadataRuleManagerProvider; import io.druid.metadata.SQLMetadataRuleManagerProvider;
@ -64,7 +65,11 @@ public class SQLMetadataStorageDruidModule implements Module
binder, PROPERTY, Key.get(MetadataStorageConnector.class), null, defaultPropertyValue binder, PROPERTY, Key.get(MetadataStorageConnector.class), null, defaultPropertyValue
); );
PolyBind.createChoiceWithDefault( PolyBind.createChoiceWithDefault(
binder, PROPERTY, Key.get(MetadataStorage.class), Key.get(MetadataStorage.class), defaultPropertyValue binder,
PROPERTY,
Key.get(MetadataStorageProvider.class),
Key.get(NoopMetadataStorageProvider.class),
defaultPropertyValue
); );
PolyBind.createChoiceWithDefault( PolyBind.createChoiceWithDefault(
binder, PROPERTY, Key.get(SQLMetadataConnector.class), null, defaultPropertyValue binder, PROPERTY, Key.get(SQLMetadataConnector.class), null, defaultPropertyValue

View File

@ -36,7 +36,7 @@ import io.druid.curator.CuratorModule;
import io.druid.curator.discovery.DiscoveryModule; import io.druid.curator.discovery.DiscoveryModule;
import io.druid.guice.AWSModule; import io.druid.guice.AWSModule;
import io.druid.guice.AnnouncerModule; import io.druid.guice.AnnouncerModule;
import io.druid.guice.DerbyMetadataStorageDruidModule; import io.druid.metadata.storage.derby.DerbyMetadataStorageDruidModule;
import io.druid.guice.DruidProcessingModule; import io.druid.guice.DruidProcessingModule;
import io.druid.guice.DruidSecondaryModule; import io.druid.guice.DruidSecondaryModule;
import io.druid.guice.ExtensionsConfig; import io.druid.guice.ExtensionsConfig;

View File

@ -2,9 +2,8 @@ package io.druid.metadata;
import com.metamx.common.lifecycle.LifecycleStart; import com.metamx.common.lifecycle.LifecycleStart;
import com.metamx.common.lifecycle.LifecycleStop; import com.metamx.common.lifecycle.LifecycleStop;
import io.druid.guice.ManageLifecycle;
/**
*/
public abstract class MetadataStorage public abstract class MetadataStorage
{ {
@LifecycleStart @LifecycleStart

View File

@ -0,0 +1,26 @@
/*
* Druid - a distributed column store.
* Copyright (C) 2014 Metamarkets Group Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package io.druid.metadata;
import com.google.inject.Provider;
public interface MetadataStorageProvider extends Provider<MetadataStorage>
{
}

View File

@ -1,6 +1,6 @@
/* /*
* Druid - a distributed column store. * Druid - a distributed column store.
* Copyright (C) 2012, 2013 Metamarkets Group Inc. * Copyright (C) 2014 Metamarkets Group Inc.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -19,29 +19,11 @@
package io.druid.metadata; package io.druid.metadata;
import com.google.api.client.repackaged.com.google.common.base.Throwables; public class NoopMetadataStorageProvider implements MetadataStorageProvider
import org.skife.jdbi.v2.tweak.ConnectionFactory;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DerbyConnectionFactory implements ConnectionFactory
{ {
final private String dbName; @Override
public MetadataStorage get()
public DerbyConnectionFactory(String dbName) { {
this.dbName = dbName; return new MetadataStorage() {};
}
public Connection openConnection() throws SQLException {
final String nsURL=String.format("jdbc:derby://localhost:1527/%s;create=true", dbName);
try {
Class.forName("org.apache.derby.jdbc.ClientDriver");
} catch (Exception e) {
throw Throwables.propagate(e);
}
return DriverManager.getConnection(nsURL);
} }
} }

View File

@ -75,7 +75,9 @@ public abstract class SQLMetadataConnector implements MetadataStorageConnector
*/ */
protected abstract String getSerialType(); protected abstract String getSerialType();
protected abstract boolean tableExists(Handle handle, final String tableName); public String getValidationQuery() { return "SELECT 1"; }
public abstract boolean tableExists(Handle handle, final String tableName);
protected boolean isTransientException(Throwable e) { protected boolean isTransientException(Throwable e) {
return false; return false;
@ -367,7 +369,7 @@ public abstract class SQLMetadataConnector implements MetadataStorageConnector
String uri = connectorConfig.getConnectURI(); String uri = connectorConfig.getConnectURI();
dataSource.setUrl(uri); dataSource.setUrl(uri);
dataSource.setValidationQuery(connectorConfig.getValidationQuery()); dataSource.setValidationQuery(getValidationQuery());
dataSource.setTestOnBorrow(true); dataSource.setTestOnBorrow(true);
return dataSource; return dataSource;

View File

@ -17,10 +17,13 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/ */
package io.druid.metadata; package io.druid.metadata.storage.derby;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import com.google.inject.Inject; import com.google.inject.Inject;
import io.druid.metadata.MetadataStorageConnectorConfig;
import io.druid.metadata.MetadataStorageTablesConfig;
import io.druid.metadata.SQLMetadataConnector;
import org.apache.commons.dbcp2.BasicDataSource; import org.apache.commons.dbcp2.BasicDataSource;
import org.skife.jdbi.v2.DBI; import org.skife.jdbi.v2.DBI;
import org.skife.jdbi.v2.Handle; import org.skife.jdbi.v2.Handle;
@ -53,7 +56,7 @@ public class DerbyConnector extends SQLMetadataConnector
} }
@Override @Override
protected boolean tableExists(Handle handle, String tableName) public boolean tableExists(Handle handle, String tableName)
{ {
return !handle.createQuery("select * from SYS.SYSTABLES where tablename = :tableName") return !handle.createQuery("select * from SYS.SYSTABLES where tablename = :tableName")
.bind("tableName", tableName.toUpperCase()) .bind("tableName", tableName.toUpperCase())
@ -69,4 +72,7 @@ public class DerbyConnector extends SQLMetadataConnector
@Override @Override
public DBI getDBI() { return dbi; } public DBI getDBI() { return dbi; }
@Override
public String getValidationQuery() { return "VALUES 1"; }
} }

View File

@ -17,20 +17,26 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/ */
package io.druid.metadata; package io.druid.metadata.storage.derby;
import com.google.common.base.Throwables; import com.google.common.base.Throwables;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.metamx.common.lifecycle.LifecycleStart; import com.metamx.common.lifecycle.LifecycleStart;
import com.metamx.common.lifecycle.LifecycleStop; import com.metamx.common.lifecycle.LifecycleStop;
import com.metamx.common.logger.Logger;
import io.druid.guice.ManageLifecycle;
import io.druid.metadata.MetadataStorage;
import io.druid.metadata.MetadataStorageConnectorConfig;
import org.apache.derby.drda.NetworkServerControl; import org.apache.derby.drda.NetworkServerControl;
import java.net.InetAddress; import java.net.InetAddress;
/**
*/ @ManageLifecycle
public class DerbyMetadataStorage extends MetadataStorage public class DerbyMetadataStorage extends MetadataStorage
{ {
private static final Logger log = new Logger(DerbyMetadataStorage.class);
private final NetworkServerControl server; private final NetworkServerControl server;
@Inject @Inject
@ -50,6 +56,7 @@ public class DerbyMetadataStorage extends MetadataStorage
public void start() public void start()
{ {
try { try {
log.info("Starting Derby Metadata Storage");
server.start(null); server.start(null);
} }
catch (Exception e) { catch (Exception e) {

View File

@ -17,14 +17,15 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/ */
package io.druid.guice; package io.druid.metadata.storage.derby;
import com.google.inject.Binder; import com.google.inject.Binder;
import com.google.inject.Key; import com.google.inject.Key;
import io.druid.metadata.DerbyConnector; import io.druid.guice.LazySingleton;
import io.druid.metadata.DerbyMetadataStorage; import io.druid.guice.PolyBind;
import io.druid.metadata.MetadataStorage; import io.druid.guice.SQLMetadataStorageDruidModule;
import io.druid.metadata.MetadataStorageConnector; import io.druid.metadata.MetadataStorageConnector;
import io.druid.metadata.MetadataStorageProvider;
import io.druid.metadata.SQLMetadataConnector; import io.druid.metadata.SQLMetadataConnector;
public class DerbyMetadataStorageDruidModule extends SQLMetadataStorageDruidModule public class DerbyMetadataStorageDruidModule extends SQLMetadataStorageDruidModule
@ -42,9 +43,9 @@ public class DerbyMetadataStorageDruidModule extends SQLMetadataStorageDruidModu
createBindingChoices(binder, TYPE); createBindingChoices(binder, TYPE);
super.configure(binder); super.configure(binder);
PolyBind.optionBinder(binder, Key.get(MetadataStorage.class)) PolyBind.optionBinder(binder, Key.get(MetadataStorageProvider.class))
.addBinding(TYPE) .addBinding(TYPE)
.to(DerbyMetadataStorage.class) .to(DerbyMetadataStorageProvider.class)
.in(LazySingleton.class); .in(LazySingleton.class);
PolyBind.optionBinder(binder, Key.get(MetadataStorageConnector.class)) PolyBind.optionBinder(binder, Key.get(MetadataStorageConnector.class))

View File

@ -0,0 +1,42 @@
/*
* Druid - a distributed column store.
* Copyright (C) 2014 Metamarkets Group Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package io.druid.metadata.storage.derby;
import com.google.inject.Inject;
import io.druid.metadata.MetadataStorage;
import io.druid.metadata.MetadataStorageConnectorConfig;
import io.druid.metadata.MetadataStorageProvider;
public class DerbyMetadataStorageProvider implements MetadataStorageProvider
{
private final DerbyMetadataStorage storage;
@Inject
public DerbyMetadataStorageProvider(MetadataStorageConnectorConfig config)
{
this.storage = new DerbyMetadataStorage(config);
}
@Override
public MetadataStorage get()
{
return storage;
}
}

View File

@ -20,6 +20,7 @@
package io.druid.metadata; package io.druid.metadata;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import io.druid.metadata.storage.derby.DerbyConnector;
import org.junit.Assert; import org.junit.Assert;
import org.skife.jdbi.v2.DBI; import org.skife.jdbi.v2.DBI;
import org.skife.jdbi.v2.exceptions.UnableToObtainConnectionException; import org.skife.jdbi.v2.exceptions.UnableToObtainConnectionException;

View File

@ -42,6 +42,7 @@ import io.druid.metadata.MetadataSegmentManager;
import io.druid.metadata.MetadataSegmentManagerConfig; import io.druid.metadata.MetadataSegmentManagerConfig;
import io.druid.metadata.MetadataSegmentManagerProvider; import io.druid.metadata.MetadataSegmentManagerProvider;
import io.druid.metadata.MetadataStorage; import io.druid.metadata.MetadataStorage;
import io.druid.metadata.MetadataStorageProvider;
import io.druid.server.coordinator.DruidCoordinator; import io.druid.server.coordinator.DruidCoordinator;
import io.druid.server.coordinator.DruidCoordinatorConfig; import io.druid.server.coordinator.DruidCoordinatorConfig;
import io.druid.server.coordinator.LoadQueueTaskMaster; import io.druid.server.coordinator.LoadQueueTaskMaster;
@ -94,7 +95,9 @@ public class CliCoordinator extends ServerRunnable
ConfigProvider.bind(binder, DruidCoordinatorConfig.class); ConfigProvider.bind(binder, DruidCoordinatorConfig.class);
binder.bind(MetadataStorage.class).in(ManageLifecycle.class); binder.bind(MetadataStorage.class)
.toProvider(MetadataStorageProvider.class)
.in(ManageLifecycle.class);
JsonConfigProvider.bind(binder, "druid.manager.segments", MetadataSegmentManagerConfig.class); JsonConfigProvider.bind(binder, "druid.manager.segments", MetadataSegmentManagerConfig.class);
JsonConfigProvider.bind(binder, "druid.manager.rules", MetadataRuleManagerConfig.class); JsonConfigProvider.bind(binder, "druid.manager.rules", MetadataRuleManagerConfig.class);
@ -114,6 +117,7 @@ public class CliCoordinator extends ServerRunnable
binder.bind(DruidCoordinator.class); binder.bind(DruidCoordinator.class);
LifecycleModule.register(binder, MetadataStorage.class);
LifecycleModule.register(binder, DruidCoordinator.class); LifecycleModule.register(binder, DruidCoordinator.class);
binder.bind(JettyServerInitializer.class) binder.bind(JettyServerInitializer.class)