blob: 1b68ea48b4b6ffbe692176e7cbb22c3082674df3 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.hive.service;
import org.apache.hadoop.hive.conf.HiveConf;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* ServiceOperations.
*
*/
public final class ServiceOperations {
private static final Logger LOG = LoggerFactory.getLogger(AbstractService.class);
private ServiceOperations() {
}
/**
* Verify that that a service is in a given state.
* @param state the actual state a service is in
* @param expectedState the desired state
* @throws IllegalStateException if the service state is different from
* the desired state
*/
public static void ensureCurrentState(Service.STATE state,
Service.STATE expectedState) {
if (state != expectedState) {
throw new IllegalStateException("For this operation, the " +
"current service state must be "
+ expectedState
+ " instead of " + state);
}
}
/**
* Initialize a service.
* <br>
* The service state is checked <i>before</i> the operation begins.
* This process is <i>not</i> thread safe.
* @param service a service that must be in the state
* {@link Service.STATE#NOTINITED}
* @param configuration the configuration to initialize the service with
* @throws RuntimeException on a state change failure
* @throws IllegalStateException if the service is in the wrong state
*/
public static void init(Service service, HiveConf configuration) {
Service.STATE state = service.getServiceState();
ensureCurrentState(state, Service.STATE.NOTINITED);
service.init(configuration);
}
/**
* Start a service.
* <br>
* The service state is checked <i>before</i> the operation begins.
* This process is <i>not</i> thread safe.
* @param service a service that must be in the state
* {@link Service.STATE#INITED}
* @throws RuntimeException on a state change failure
* @throws IllegalStateException if the service is in the wrong state
*/
public static void start(Service service) {
Service.STATE state = service.getServiceState();
ensureCurrentState(state, Service.STATE.INITED);
service.start();
}
/**
* Initialize then start a service.
* <br>
* The service state is checked <i>before</i> the operation begins.
* This process is <i>not</i> thread safe.
* @param service a service that must be in the state
* {@link Service.STATE#NOTINITED}
* @param configuration the configuration to initialize the service with
* @throws RuntimeException on a state change failure
* @throws IllegalStateException if the service is in the wrong state
*/
public static void deploy(Service service, HiveConf configuration) {
init(service, configuration);
start(service);
}
/**
* Stop a service.
* <br>Do nothing if the service is null or not
* in a state in which it can be/needs to be stopped.
* <br>
* The service state is checked <i>before</i> the operation begins.
* This process is <i>not</i> thread safe.
* @param service a service or null
*/
public static void stop(Service service) {
if (service != null) {
Service.STATE state = service.getServiceState();
if (state == Service.STATE.STARTED) {
service.stop();
}
}
}
/**
* Stop a service; if it is null do nothing. Exceptions are caught and
* logged at warn level. (but not Throwables). This operation is intended to
* be used in cleanup operations
*
* @param service a service; may be null
* @return any exception that was caught; null if none was.
*/
public static Exception stopQuietly(Service service) {
try {
stop(service);
} catch (Exception e) {
LOG.warn("When stopping the service " + service.getName()
+ " : " + e,
e);
return e;
}
return null;
}
}