From fb4d41cedb41a341465ccddb6325e8809c17be30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20L=C3=A9aut=C3=A9?= Date: Thu, 30 Oct 2014 21:16:36 -0700 Subject: [PATCH] make the injection gods happy --- .../MetadataStorageActionHandlerFactory.java | 25 +++++++++ .../MetadataStorageActionHandlerTypes.java | 30 +++++++++++ .../overlord/MetadataTaskStorage.java | 40 ++++++++++++-- .../mysql/MySQLMetadataStorageModule.java | 6 ++- .../PostgresMetadataStorageModule.java | 8 +-- .../db/SQLMetadataStorageActionHandler.java | 19 +++---- ...QLMetadataStorageActionHandlerFactory.java | 54 +++++++++++++++++++ .../DerbyMetadataStorageDruidModule.java | 6 ++- .../main/java/io/druid/cli/CliOverlord.java | 20 +------ 9 files changed, 168 insertions(+), 40 deletions(-) create mode 100644 common/src/main/java/io/druid/indexing/overlord/MetadataStorageActionHandlerFactory.java create mode 100644 common/src/main/java/io/druid/indexing/overlord/MetadataStorageActionHandlerTypes.java create mode 100644 server/src/main/java/io/druid/db/SQLMetadataStorageActionHandlerFactory.java diff --git a/common/src/main/java/io/druid/indexing/overlord/MetadataStorageActionHandlerFactory.java b/common/src/main/java/io/druid/indexing/overlord/MetadataStorageActionHandlerFactory.java new file mode 100644 index 00000000000..2575eafae1f --- /dev/null +++ b/common/src/main/java/io/druid/indexing/overlord/MetadataStorageActionHandlerFactory.java @@ -0,0 +1,25 @@ +/* + * 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.indexing.overlord; + +public interface MetadataStorageActionHandlerFactory +{ + public MetadataStorageActionHandler create(MetadataStorageActionHandlerTypes types); +} diff --git a/common/src/main/java/io/druid/indexing/overlord/MetadataStorageActionHandlerTypes.java b/common/src/main/java/io/druid/indexing/overlord/MetadataStorageActionHandlerTypes.java new file mode 100644 index 00000000000..2d510d00ef2 --- /dev/null +++ b/common/src/main/java/io/druid/indexing/overlord/MetadataStorageActionHandlerTypes.java @@ -0,0 +1,30 @@ +/* + * 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.indexing.overlord; + +import com.fasterxml.jackson.core.type.TypeReference; + +public interface MetadataStorageActionHandlerTypes +{ + public TypeReference getTaskType(); + public TypeReference getTaskStatusType(); + public TypeReference getTaskActionType(); + public TypeReference getTaskLockType(); +} diff --git a/indexing-service/src/main/java/io/druid/indexing/overlord/MetadataTaskStorage.java b/indexing-service/src/main/java/io/druid/indexing/overlord/MetadataTaskStorage.java index 72f5d3b1c15..ca1398c7088 100644 --- a/indexing-service/src/main/java/io/druid/indexing/overlord/MetadataTaskStorage.java +++ b/indexing-service/src/main/java/io/druid/indexing/overlord/MetadataTaskStorage.java @@ -19,6 +19,7 @@ package io.druid.indexing.overlord; +import com.fasterxml.jackson.core.type.TypeReference; import com.google.common.base.Function; import com.google.common.base.Optional; import com.google.common.base.Preconditions; @@ -45,6 +46,40 @@ import java.util.Map; public class MetadataTaskStorage implements TaskStorage { + private static final MetadataStorageActionHandlerTypes TASK_TYPES = new MetadataStorageActionHandlerTypes() + { + @Override + public TypeReference getTaskType() + { + return new TypeReference() + { + }; + } + + @Override + public TypeReference getTaskStatusType() + { + return new TypeReference() + { + }; + } + + @Override + public TypeReference getTaskActionType() + { + return new TypeReference() + { + }; + } + + @Override + public TypeReference getTaskLockType() + { + return new TypeReference() + { + }; + } + }; private final MetadataStorageConnector metadataStorageConnector; private final TaskStorageConfig config; private final MetadataStorageActionHandler handler; @@ -55,13 +90,12 @@ public class MetadataTaskStorage implements TaskStorage public MetadataTaskStorage( final MetadataStorageConnector metadataStorageConnector, final TaskStorageConfig config, - final MetadataStorageActionHandler handler + final MetadataStorageActionHandlerFactory factory ) { this.metadataStorageConnector = metadataStorageConnector; this.config = config; - // this is a little janky but haven't figured out how to get Guice to do this yet. - this.handler = (MetadataStorageActionHandler) handler; + this.handler = factory.create(TASK_TYPES); } @LifecycleStart diff --git a/mysql-storage/src/main/java/io/druid/storage/mysql/MySQLMetadataStorageModule.java b/mysql-storage/src/main/java/io/druid/storage/mysql/MySQLMetadataStorageModule.java index b72d5ca2cff..d81b8b691e3 100644 --- a/mysql-storage/src/main/java/io/druid/storage/mysql/MySQLMetadataStorageModule.java +++ b/mysql-storage/src/main/java/io/druid/storage/mysql/MySQLMetadataStorageModule.java @@ -40,6 +40,7 @@ import io.druid.db.SQLMetadataSegmentManagerProvider; import io.druid.db.SQLMetadataSegmentPublisher; import io.druid.db.SQLMetadataSegmentPublisherProvider; import io.druid.db.SQLMetadataStorageActionHandler; +import io.druid.db.SQLMetadataStorageActionHandlerFactory; import io.druid.guice.JsonConfigProvider; import io.druid.guice.LazySingleton; import io.druid.guice.PolyBind; @@ -47,6 +48,7 @@ import io.druid.indexer.MetadataStorageUpdaterJobHandler; import io.druid.indexer.SQLMetadataStorageUpdaterJobHandler; import io.druid.indexing.overlord.IndexerMetadataStorageCoordinator; import io.druid.indexing.overlord.MetadataStorageActionHandler; +import io.druid.indexing.overlord.MetadataStorageActionHandlerFactory; import io.druid.initialization.DruidModule; import io.druid.segment.realtime.SegmentPublisher; import org.skife.jdbi.v2.IDBI; @@ -110,9 +112,9 @@ public class MySQLMetadataStorageModule implements DruidModule .to(SQLMetadataSegmentPublisherProvider.class) .in(LazySingleton.class); - PolyBind.optionBinder(binder, Key.get(MetadataStorageActionHandler.class)) + PolyBind.optionBinder(binder, Key.get(MetadataStorageActionHandlerFactory.class)) .addBinding("mysql") - .to(SQLMetadataStorageActionHandler.class) + .to(SQLMetadataStorageActionHandlerFactory.class) .in(LazySingleton.class); PolyBind.optionBinder(binder, Key.get(IndexerMetadataStorageCoordinator.class)) diff --git a/postgres-storage/src/main/java/io/druid/storage/postgres/PostgresMetadataStorageModule.java b/postgres-storage/src/main/java/io/druid/storage/postgres/PostgresMetadataStorageModule.java index 70e4c29481a..60c59948255 100644 --- a/postgres-storage/src/main/java/io/druid/storage/postgres/PostgresMetadataStorageModule.java +++ b/postgres-storage/src/main/java/io/druid/storage/postgres/PostgresMetadataStorageModule.java @@ -40,6 +40,7 @@ import io.druid.db.SQLMetadataSegmentManagerProvider; import io.druid.db.SQLMetadataSegmentPublisher; import io.druid.db.SQLMetadataSegmentPublisherProvider; import io.druid.db.SQLMetadataStorageActionHandler; +import io.druid.db.SQLMetadataStorageActionHandlerFactory; import io.druid.guice.JsonConfigProvider; import io.druid.guice.LazySingleton; import io.druid.guice.PolyBind; @@ -47,6 +48,7 @@ import io.druid.indexer.MetadataStorageUpdaterJobHandler; import io.druid.indexer.SQLMetadataStorageUpdaterJobHandler; import io.druid.indexing.overlord.IndexerMetadataStorageCoordinator; import io.druid.indexing.overlord.MetadataStorageActionHandler; +import io.druid.indexing.overlord.MetadataStorageActionHandlerFactory; import io.druid.initialization.DruidModule; import io.druid.segment.realtime.SegmentPublisher; import org.skife.jdbi.v2.IDBI; @@ -105,9 +107,9 @@ public class PostgresMetadataStorageModule implements DruidModule .to(SQLMetadataSegmentPublisher.class) .in(LazySingleton.class); - PolyBind.optionBinder(binder, Key.get(MetadataStorageActionHandler.class)) + PolyBind.optionBinder(binder, Key.get(MetadataStorageActionHandlerFactory.class)) .addBinding("postgresql") - .to(SQLMetadataStorageActionHandler.class) + .to(SQLMetadataStorageActionHandlerFactory.class) .in(LazySingleton.class); PolyBind.optionBinder(binder, Key.get(MetadataSegmentPublisherProvider.class)) @@ -132,4 +134,4 @@ public class PostgresMetadataStorageModule implements DruidModule { return dbConnector.getDBI(); } -} \ No newline at end of file +} diff --git a/server/src/main/java/io/druid/db/SQLMetadataStorageActionHandler.java b/server/src/main/java/io/druid/db/SQLMetadataStorageActionHandler.java index 49e798474d7..1f0d9625d4b 100644 --- a/server/src/main/java/io/druid/db/SQLMetadataStorageActionHandler.java +++ b/server/src/main/java/io/druid/db/SQLMetadataStorageActionHandler.java @@ -28,11 +28,12 @@ import com.google.common.base.Predicate; import com.google.common.base.Throwables; import com.google.common.collect.Lists; import com.google.inject.Inject; -import com.google.inject.name.Named; +import com.google.inject.Provider; import com.metamx.common.Pair; import com.metamx.common.RetryUtils; import com.metamx.emitter.EmittingLogger; import io.druid.indexing.overlord.MetadataStorageActionHandler; +import io.druid.indexing.overlord.MetadataStorageActionHandlerTypes; import io.druid.indexing.overlord.TaskExistsException; import org.joda.time.DateTime; import org.skife.jdbi.v2.FoldController; @@ -71,28 +72,22 @@ public class SQLMetadataStorageActionHandler types ) { this.dbi = dbi; this.connector = connector; this.config = config; this.jsonMapper = jsonMapper; - this.taskType = taskType; - this.taskStatusType = taskStatusType; - this.taskActionType = taskActionType; - this.taskLockType = taskLockType; + this.taskType = types.getTaskType(); + this.taskStatusType = types.getTaskStatusType(); + this.taskActionType = types.getTaskActionType(); + this.taskLockType = types.getTaskLockType(); } /** diff --git a/server/src/main/java/io/druid/db/SQLMetadataStorageActionHandlerFactory.java b/server/src/main/java/io/druid/db/SQLMetadataStorageActionHandlerFactory.java new file mode 100644 index 00000000000..8acc8bcc37d --- /dev/null +++ b/server/src/main/java/io/druid/db/SQLMetadataStorageActionHandlerFactory.java @@ -0,0 +1,54 @@ +/* + * 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.db; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.inject.Inject; +import io.druid.indexing.overlord.MetadataStorageActionHandler; +import io.druid.indexing.overlord.MetadataStorageActionHandlerFactory; +import io.druid.indexing.overlord.MetadataStorageActionHandlerTypes; +import org.skife.jdbi.v2.IDBI; + +public class SQLMetadataStorageActionHandlerFactory implements MetadataStorageActionHandlerFactory +{ + private final IDBI dbi; + private final SQLMetadataConnector connector; + private final MetadataStorageTablesConfig config; + private final ObjectMapper jsonMapper; + + @Inject + public SQLMetadataStorageActionHandlerFactory( + IDBI dbi, + SQLMetadataConnector connector, + MetadataStorageTablesConfig config, + ObjectMapper jsonMapper + ) + { + this.dbi = dbi; + this.connector = connector; + this.config = config; + this.jsonMapper = jsonMapper; + } + + public MetadataStorageActionHandler create(MetadataStorageActionHandlerTypes types) + { + return new SQLMetadataStorageActionHandler<>(dbi, connector, config, jsonMapper, types); + } +} diff --git a/server/src/main/java/io/druid/guice/DerbyMetadataStorageDruidModule.java b/server/src/main/java/io/druid/guice/DerbyMetadataStorageDruidModule.java index 7981cf19972..622947ad9ef 100644 --- a/server/src/main/java/io/druid/guice/DerbyMetadataStorageDruidModule.java +++ b/server/src/main/java/io/druid/guice/DerbyMetadataStorageDruidModule.java @@ -39,10 +39,12 @@ import io.druid.db.DerbyConnector; import io.druid.db.SQLMetadataStorageActionHandler; import io.druid.db.SQLMetadataSegmentPublisher; import io.druid.db.SQLMetadataSegmentPublisherProvider; +import io.druid.db.SQLMetadataStorageActionHandlerFactory; import io.druid.indexer.SQLMetadataStorageUpdaterJobHandler; import io.druid.indexer.MetadataStorageUpdaterJobHandler; import io.druid.indexing.overlord.IndexerMetadataStorageCoordinator; import io.druid.indexing.overlord.MetadataStorageActionHandler; +import io.druid.indexing.overlord.MetadataStorageActionHandlerFactory; import io.druid.segment.realtime.SegmentPublisher; import org.skife.jdbi.v2.IDBI; @@ -136,9 +138,9 @@ public class DerbyMetadataStorageDruidModule implements Module .to(IndexerSQLMetadataStorageCoordinator.class) .in(LazySingleton.class); - PolyBind.optionBinder(binder, Key.get(MetadataStorageActionHandler.class)) + PolyBind.optionBinder(binder, Key.get(MetadataStorageActionHandlerFactory.class)) .addBinding("derby") - .to(SQLMetadataStorageActionHandler.class) + .to(SQLMetadataStorageActionHandlerFactory.class) .in(LazySingleton.class); PolyBind.optionBinder(binder, Key.get(MetadataStorageUpdaterJobHandler.class)) diff --git a/services/src/main/java/io/druid/cli/CliOverlord.java b/services/src/main/java/io/druid/cli/CliOverlord.java index ef5a44c45ed..becf4faf7e4 100644 --- a/services/src/main/java/io/druid/cli/CliOverlord.java +++ b/services/src/main/java/io/druid/cli/CliOverlord.java @@ -25,6 +25,7 @@ import com.google.inject.Binder; import com.google.inject.Injector; import com.google.inject.Key; import com.google.inject.Module; +import com.google.inject.Provider; import com.google.inject.TypeLiteral; import com.google.inject.multibindings.MapBinder; import com.google.inject.name.Names; @@ -58,6 +59,7 @@ import io.druid.indexing.common.tasklogs.TaskRunnerTaskLogStreamer; import io.druid.indexing.overlord.ForkingTaskRunnerFactory; import io.druid.indexing.overlord.HeapMemoryTaskStorage; import io.druid.indexing.overlord.IndexerMetadataStorageCoordinator; +import io.druid.indexing.overlord.MetadataStorageActionHandlerTypes; import io.druid.indexing.overlord.MetadataTaskStorage; import io.druid.indexing.overlord.RemoteTaskRunnerFactory; import io.druid.indexing.overlord.TaskLockbox; @@ -185,24 +187,6 @@ public class CliOverlord extends ServerRunnable storageBinder.addBinding("db").to(MetadataTaskStorage.class).in(ManageLifecycle.class); binder.bind(MetadataTaskStorage.class).in(LazySingleton.class); - - // gotta love type erasure - binder.bind(TypeReference.class).annotatedWith(Names.named("taskType")).toInstance( - new TypeReference() - { - } - ); - binder.bind(TypeReference.class).annotatedWith(Names.named("taskStatusType")).toInstance(new TypeReference(){}); - binder.bind(TypeReference.class).annotatedWith(Names.named("taskActionType")).toInstance( - new TypeReference() - { - } - ); - binder.bind(TypeReference.class).annotatedWith(Names.named("taskLockType")).toInstance( - new TypeReference() - { - } - ); } private void configureRunners(Binder binder)