/* * Copyright © 2016 Cask Data, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package co.cask.cdap.data.tools; import co.cask.cdap.common.ServiceUnavailableException; import co.cask.cdap.common.conf.CConfiguration; import co.cask.cdap.common.guice.ConfigModule; import co.cask.cdap.common.guice.DiscoveryRuntimeModule; import co.cask.cdap.common.guice.IOModule; import co.cask.cdap.common.guice.KafkaClientModule; import co.cask.cdap.common.guice.LocationRuntimeModule; import co.cask.cdap.common.guice.ZKClientModule; import co.cask.cdap.common.utils.Tasks; import co.cask.cdap.data.runtime.DataFabricModules; import co.cask.cdap.data.runtime.DataSetServiceModules; import co.cask.cdap.data.runtime.DataSetsModules; import co.cask.cdap.data2.datafabric.dataset.RemoteDatasetFramework; import co.cask.cdap.data2.datafabric.dataset.service.DatasetService; import co.cask.cdap.data2.datafabric.dataset.service.executor.DatasetOpExecutorService; import co.cask.cdap.data2.dataset2.DatasetFramework; import co.cask.cdap.explore.guice.ExploreClientModule; import co.cask.cdap.metrics.guice.MetricsClientRuntimeModule; import co.cask.cdap.proto.Id; import co.cask.cdap.store.guice.NamespaceStoreModule; import com.google.common.base.Throwables; import com.google.common.util.concurrent.AbstractIdleService; import com.google.inject.Guice; import com.google.inject.Inject; import com.google.inject.Injector; import org.apache.hadoop.conf.Configuration; import org.apache.twill.zookeeper.ZKClientService; import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; /** * Provides a {@link DatasetService} which uses {@link RemoteDatasetFramework}. * This is used to independently start a remote dataset service during upgrade. This is needed to perform upgrade steps * which needs access to user datasets. * Note: This should not be used outside upgrade tool. */ public class DatasetServiceManager extends AbstractIdleService { private final DatasetService datasetService; private final ZKClientService zkClientService; private final DatasetFramework datasetFramework; private final DatasetOpExecutorService datasetOpExecutorService; @Inject DatasetServiceManager(CConfiguration cConf, Configuration hConf) { Injector injector = createInjector(cConf, hConf); this.datasetService = injector.getInstance(DatasetService.class); this.zkClientService = injector.getInstance(ZKClientService.class); this.datasetFramework = injector.getInstance(DatasetFramework.class); this.datasetOpExecutorService = injector.getInstance(DatasetOpExecutorService.class); } public DatasetFramework getDSFramework() { return datasetFramework; } @Override protected void startUp() throws Exception { if (!zkClientService.isRunning()) { zkClientService.startAndWait(); } datasetOpExecutorService.startAndWait(); datasetService.startAndWait(); // wait 5 minutes for DatasetService to start up Tasks.waitFor(true, new Callable<Boolean>() { @Override public Boolean call() throws Exception { try { getDSFramework().getInstances(Id.Namespace.DEFAULT); return true; } catch (ServiceUnavailableException sue) { return false; } } }, 5, TimeUnit.MINUTES, 10, TimeUnit.SECONDS); } @Override protected void shutDown() throws Exception { try { datasetService.stopAndWait(); datasetOpExecutorService.startAndWait(); zkClientService.stopAndWait(); } catch (Throwable e) { throw Throwables.propagate(e); } } private Injector createInjector(CConfiguration cConf, Configuration hConf) { return Guice.createInjector( new ConfigModule(cConf, hConf), new ZKClientModule(), new LocationRuntimeModule().getDistributedModules(), new IOModule(), new KafkaClientModule(), new DiscoveryRuntimeModule().getDistributedModules(), new DataSetServiceModules().getDistributedModules(), new DataFabricModules().getDistributedModules(), new DataSetsModules().getDistributedModules(), new MetricsClientRuntimeModule().getDistributedModules(), new ExploreClientModule(), new NamespaceStoreModule().getDistributedModules() ); } }