You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@slider.apache.org by go...@apache.org on 2016/08/25 20:20:00 UTC
[31/46] incubator-slider git commit: SLIDER-1165 Create
yarn-native-services branch on Slider corresponding to the
yarn-native-services branch on Hadoop
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/core/launch/LaunchedApplication.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/core/launch/LaunchedApplication.java b/slider-core/src/main/java/org/apache/slider/core/launch/LaunchedApplication.java
deleted file mode 100644
index 632e3fd..0000000
--- a/slider-core/src/main/java/org/apache/slider/core/launch/LaunchedApplication.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * 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.slider.core.launch;
-
-import org.apache.hadoop.yarn.api.protocolrecords.KillApplicationResponse;
-import org.apache.hadoop.yarn.api.records.ApplicationId;
-import org.apache.hadoop.yarn.api.records.ApplicationReport;
-import org.apache.hadoop.yarn.api.records.YarnApplicationState;
-import org.apache.hadoop.yarn.exceptions.YarnException;
-import org.apache.slider.client.SliderYarnClientImpl;
-import org.apache.slider.common.tools.Duration;
-
-import java.io.IOException;
-
-/**
- * Launched App with logic around it.
- */
-public class LaunchedApplication {
-
- protected final ApplicationId applicationId;
- protected final SliderYarnClientImpl yarnClient;
-
- public LaunchedApplication(ApplicationId applicationId,
- SliderYarnClientImpl yarnClient) {
- assert applicationId != null;
- assert yarnClient != null;
- this.applicationId = applicationId;
- this.yarnClient = yarnClient;
- }
-
- public LaunchedApplication(SliderYarnClientImpl yarnClient,
- ApplicationReport report) {
- this.yarnClient = yarnClient;
- this.applicationId = report.getApplicationId();
- }
-
- public ApplicationId getApplicationId() {
- return applicationId;
- }
-
- /**
- * Monitor the submitted application for reaching the requested state.
- * Will also report if the app reaches a later state (failed, killed, etc)
- * Kill application if duration!= null & time expires.
- * @param duration how long to wait -must be more than 0
- * @param desiredState desired state.
- * @return the application report -null on a timeout
- * @throws YarnException
- * @throws IOException
- */
- public ApplicationReport monitorAppToState(YarnApplicationState desiredState, Duration duration)
- throws YarnException, IOException {
- return yarnClient.monitorAppToState(applicationId, desiredState, duration);
- }
-
- /**
- * Kill the submitted application by sending a call to the ASM
- * @throws YarnException
- * @throws IOException
- */
- public boolean forceKill(String reason)
- throws YarnException, IOException {
- if (applicationId != null) {
- yarnClient.killRunningApplication(applicationId, reason);
- return true;
- }
- return false;
- }
-
- /**
- * Kill the application
- * @return the response
- * @throws YarnException YARN problems
- * @throws IOException IO problems
- */
- public KillApplicationResponse kill(String reason) throws
- YarnException,
- IOException {
- return yarnClient.killRunningApplication(applicationId, reason);
- }
-
- /**
- * Get the application report of this application
- * @return an application report
- * @throws YarnException
- * @throws IOException
- */
- public ApplicationReport getApplicationReport()
- throws YarnException, IOException {
- return yarnClient.getApplicationReport(applicationId);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/core/launch/RunningApplication.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/core/launch/RunningApplication.java b/slider-core/src/main/java/org/apache/slider/core/launch/RunningApplication.java
deleted file mode 100644
index 14c522c..0000000
--- a/slider-core/src/main/java/org/apache/slider/core/launch/RunningApplication.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * 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.slider.core.launch;
-
-import org.apache.hadoop.yarn.api.records.ApplicationReport;
-import org.apache.hadoop.yarn.exceptions.YarnException;
-import org.apache.slider.api.SliderClusterProtocol;
-import org.apache.slider.client.SliderYarnClientImpl;
-import org.apache.slider.common.SliderExitCodes;
-import org.apache.slider.core.exceptions.SliderException;
-import org.apache.slider.server.appmaster.rpc.RpcBinder;
-
-import java.io.IOException;
-
-import static org.apache.slider.common.Constants.CONNECT_TIMEOUT;
-import static org.apache.slider.common.Constants.RPC_TIMEOUT;
-
-/**
- * A running application built from an app report. This one
- * can be talked to
- */
-public class RunningApplication extends LaunchedApplication {
-
- private final ApplicationReport applicationReport;
- public RunningApplication(SliderYarnClientImpl yarnClient,
- ApplicationReport applicationReport) {
- super(yarnClient, applicationReport);
- this.applicationReport = applicationReport;
- }
-
- public ApplicationReport getApplicationReport() {
- return applicationReport;
- }
-
-
- /**
- * Connect to a Slider AM
- * @param app application report providing the details on the application
- * @return an instance
- * @throws YarnException
- * @throws IOException
- */
- public SliderClusterProtocol connect(ApplicationReport app) throws
- YarnException,
- IOException {
-
- try {
- return RpcBinder.getProxy(yarnClient.getConfig(),
- yarnClient.getRmClient(),
- app,
- CONNECT_TIMEOUT,
- RPC_TIMEOUT);
- } catch (InterruptedException e) {
- throw new SliderException(SliderExitCodes.EXIT_TIMED_OUT,
- e,
- "Interrupted waiting for communications with the Application Master");
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/core/launch/SerializedApplicationReport.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/core/launch/SerializedApplicationReport.java b/slider-core/src/main/java/org/apache/slider/core/launch/SerializedApplicationReport.java
deleted file mode 100644
index 8e0ef5a..0000000
--- a/slider-core/src/main/java/org/apache/slider/core/launch/SerializedApplicationReport.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * 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.slider.core.launch;
-
-import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
-import org.apache.hadoop.yarn.api.records.ApplicationReport;
-import org.apache.hadoop.yarn.api.records.FinalApplicationStatus;
-import org.apache.slider.core.persist.ApplicationReportSerDeser;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-
-import java.io.IOException;
-
-/**
- * Serialized form of an application report which can be persisted
- * and then parsed. It can not be converted back into a
- * real YARN application report
- *
- * Useful for testing
- */
-
-@JsonIgnoreProperties(ignoreUnknown = true)
-@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
-
-public class SerializedApplicationReport {
-
- public String applicationId;
- public String applicationAttemptId;
- public String name;
- public String applicationType;
- public String user;
- public String queue;
- public String host;
- public Integer rpcPort;
- public String state;
- public String diagnostics;
- public String url;
- /**
- * This value is non-null only when a report is generated from a submission context.
- * The YARN {@link ApplicationReport} structure does not propagate this value
- * from the RM.
- */
- public Long submitTime;
- public Long startTime;
- public Long finishTime;
- public String finalStatus;
- public String origTrackingUrl;
- public Float progress;
-
- public SerializedApplicationReport() {
- }
-
- public SerializedApplicationReport(ApplicationReport report) {
- this.applicationId = report.getApplicationId().toString();
- ApplicationAttemptId attemptId = report.getCurrentApplicationAttemptId();
- this.applicationAttemptId = attemptId != null ? attemptId.toString() : "N/A";
- this.name = report.getName();
- this.applicationType = report.getApplicationType();
- this.user = report.getUser();
- this.queue = report.getQueue();
- this.host = report.getHost();
- this.rpcPort = report.getRpcPort();
- this.state = report.getYarnApplicationState().toString();
- this.diagnostics = report.getDiagnostics();
- this.startTime = report.getStartTime();
- this.finishTime = report.getFinishTime();
- FinalApplicationStatus appStatus = report.getFinalApplicationStatus();
- this.finalStatus = appStatus == null ? "" : appStatus.toString();
- this.progress = report.getProgress();
- this.url = report.getTrackingUrl();
- this.origTrackingUrl= report.getOriginalTrackingUrl();
- }
-
- @Override
- public String toString() {
- try {
- return ApplicationReportSerDeser.toString(this);
- } catch (IOException e) {
- return super.toString();
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/core/main/ExitCodeProvider.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/core/main/ExitCodeProvider.java b/slider-core/src/main/java/org/apache/slider/core/main/ExitCodeProvider.java
deleted file mode 100644
index 503b9b9..0000000
--- a/slider-core/src/main/java/org/apache/slider/core/main/ExitCodeProvider.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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.slider.core.main;
-
-/**
- * Get the exit code of an exception. Making it an interface allows
- * us to retrofit exit codes onto existing classes
- */
-public interface ExitCodeProvider {
-
- /**
- * Method to get the exit code
- * @return the exit code
- */
- int getExitCode();
-}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/core/main/IrqHandler.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/core/main/IrqHandler.java b/slider-core/src/main/java/org/apache/slider/core/main/IrqHandler.java
deleted file mode 100644
index 42442d1..0000000
--- a/slider-core/src/main/java/org/apache/slider/core/main/IrqHandler.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * 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.slider.core.main;
-
-import sun.misc.Signal;
-import sun.misc.SignalHandler;
-
-import java.io.IOException;
-
-/**
- * This class bundles up all the compiler warnings about abuse of sun.misc
- * interrupt handling code
- * into one place.
- */
-@SuppressWarnings("UseOfSunClasses")
-public final class IrqHandler implements SignalHandler {
-
- public static final String CONTROL_C = "INT";
- public static final String SIGTERM = "TERM";
-
- private final String name;
- private final Interrupted handler;
-
- /**
- * Create an IRQ handler bound to the specific interrupt
- * @param name signal name
- * @param handler handler
- * @throws IOException
- */
- public IrqHandler(String name, Interrupted handler) throws IOException {
- this.handler = handler;
- this.name = name;
- try {
- Signal.handle(new Signal(name), this);
- } catch (IllegalArgumentException e) {
- throw new IOException(
- "Could not set handler for signal \"" + name + "\"."
- + "This can happen if the JVM has the -Xrs set.",
- e);
- }
- }
-
- @Override
- public String toString() {
- return "IrqHandler for signal " + name ;
- }
-
- /**
- * Handler for the JVM API for signal handling
- * @param signal signal raised
- */
-// @Override
- public void handle(Signal signal) {
- InterruptData data = new InterruptData(signal.getName(), signal.getNumber());
- handler.interrupted(data);
- }
-
- /**
- * Interrupt data to pass on.
- */
- public static class InterruptData {
- public final String name;
- public final int number;
-
- public InterruptData(String name, int number) {
- this.name = name;
- this.number = number;
- }
-
- @Override
- public String toString() {
- return "signal " + name + '(' + number + ')';
- }
- }
-
- /**
- * Callback on interruption
- */
- public interface Interrupted {
-
- /**
- * Handle an interrupt
- * @param interruptData data
- */
- void interrupted(InterruptData interruptData);
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/core/main/LauncherExitCodes.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/core/main/LauncherExitCodes.java b/slider-core/src/main/java/org/apache/slider/core/main/LauncherExitCodes.java
deleted file mode 100644
index 83e89f0..0000000
--- a/slider-core/src/main/java/org/apache/slider/core/main/LauncherExitCodes.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * 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.slider.core.main;
-
-/*
- * Common Exit codes
- * <p>
- * Exit codes from 64 up are application specific.
- * <p>
- * Many of the exit codes are designed to resemble HTTP error codes,
- * squashed into a single byte. e.g 44 , "not found" is the equivalent
- * of 404
- * <pre>
- * 0-10: general command issues
- * 30-39: equivalent to the 3XX responses, where those responses are
- * considered errors by the application.
- * 40-49: request-related errors
- * 50-59: server-side problems. These may be triggered by the request.
- * 64- : application specific error codes
- * </pre>
- */
-public interface LauncherExitCodes {
-
- /**
- * 0: success
- */
- int EXIT_SUCCESS = 0;
-
- /**
- * -1: generic "false" response. The operation worked but
- * the result was not true
- */
- int EXIT_FALSE = -1;
-
- /**
- * Exit code when a client requested service termination: {@value}
- */
- int EXIT_CLIENT_INITIATED_SHUTDOWN = 1;
-
- /**
- * Exit code when targets could not be launched: {@value}
- */
- int EXIT_TASK_LAUNCH_FAILURE = 2;
-
- /**
- * Exit code when a control-C, kill -3, signal was picked up: {@value}
- */
- int EXIT_INTERRUPTED = 3;
-
- /**
- * Exit code when a usage message was printed: {@value}
- */
- int EXIT_USAGE = 4;
-
- /**
- * Exit code when something happened but we can't be specific: {@value}
- */
- int EXIT_OTHER_FAILURE = 5;
-
- /**
- * Exit code on connectivity problems: {@value}
- */
- int EXIT_MOVED = 31;
-
- /**
- * found: {@value}.
- * <p>
- * This is low value as in HTTP it is normally a success/redirect;
- * whereas on the command line 0 is the sole success code.
- * <p>
- * <code>302 Found</code>
- */
- int EXIT_FOUND = 32;
-
- /**
- * Exit code on a request where the destination has not changed
- * and (somehow) the command specified that this is an error.
- * That is, this exit code is somehow different from a "success"
- * : {@value}
- * <p>
- * <code>304 Not Modified </code>
- */
- int EXIT_NOT_MODIFIED = 34;
-
- /**
- * Exit code when the command line doesn't parse: {@value}, or
- * when it is otherwise invalid.
- * <p>
- * <code>400 BAD REQUEST</code>
- */
- int EXIT_COMMAND_ARGUMENT_ERROR = 40;
-
- /**
- * The request requires user authentication: {@value}
- * <p>
- * <code>401 Unauthorized</code>
- */
- int EXIT_UNAUTHORIZED = 41;
-
- /**
- * Forbidden action: {@value}
- * <p>
- * <code>403: Forbidden</code>
- */
- int EXIT_FORBIDDEN = 43;
-
- /**
- * Something was not found: {@value}
- * <p>
- * <code>404: NOT FOUND</code>
- */
- int EXIT_NOT_FOUND = 44;
-
- /**
- * The operation is not allowed: {@value}
- * <p>
- * <code>405: NOT ALLOWED</code>
- */
- int EXIT_OPERATION_NOT_ALLOWED = 45;
-
- /**
- * The command is somehow not acceptable: {@value}
- * <p>
- * <code>406: NOT ACCEPTABLE</code>
- */
- int EXIT_NOT_ACCEPTABLE = 46;
-
- /**
- * Exit code on connectivity problems: {@value}
- * <p>
- * <code>408: Request Timeout</code>
- */
- int EXIT_CONNECTIVITY_PROBLEM = 48;
-
- /**
- * The request could not be completed due to a conflict with the current
- * state of the resource. {@value}
- * <p>
- * <code>409: conflict</code>
- */
- int EXIT_CONFLICT = 49;
-
- /**
- * internal error: {@value}
- * <p>
- * <code>500 Internal Server Error</code>
- */
- int EXIT_INTERNAL_ERROR = 50;
-
- /**
- * Unimplemented feature: {@value}
- * <p>
- * <code>501: Not Implemented</code>
- */
- int EXIT_UNIMPLEMENTED = 51;
-
- /**
- * Service Unavailable; it may be available later: {@value}
- * <p>
- * <code>503 Service Unavailable</code>
- */
- int EXIT_SERVICE_UNAVAILABLE = 53;
-
- /**
- * The application does not support, or refuses to support this version: {@value}.
- * If raised, this is expected to be raised server-side and likely due
- * to client/server version incompatibilities.
- * <p>
- * <code> 505: Version Not Supported</code>
- */
- int EXIT_UNSUPPORTED_VERSION = 55;
-
- /**
- * Exit code when an exception was thrown from the service: {@value}
- * <p>
- * <code>5XX</code>
- */
- int EXIT_EXCEPTION_THROWN = 56;
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/core/main/RunService.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/core/main/RunService.java b/slider-core/src/main/java/org/apache/slider/core/main/RunService.java
deleted file mode 100644
index c3a1d0e..0000000
--- a/slider-core/src/main/java/org/apache/slider/core/main/RunService.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 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.slider.core.main;
-
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.service.Service;
-
-/**
- * An interface which services can implement to have their
- * execution managed by the ServiceLauncher.
- * The command line options will be passed down before the
- * {@link Service#init(Configuration)} operation is invoked via an
- * invocation of {@link RunService#bindArgs(Configuration, String...)}
- * After the service has been successfully started via {@link Service#start()}
- * the {@link RunService#runService()} method is called to execute the
- * service. When this method returns, the service launcher will exit, using
- * the return code from the method as its exit option.
- */
-public interface RunService extends Service {
-
- /**
- * Propagate the command line arguments.
- * This method is called before {@link Service#init(Configuration)};
- * the configuration that is returned from this operation
- * is the one that is passed on to the init operation.
- * This permits implemenations to change the configuration before
- * the init operation.n
- *
- *
- * @param config the initial configuration build up by the
- * service launcher.
- * @param args argument list list of arguments passed to the command line
- * after any launcher-specific commands have been stripped.
- * @return the configuration to init the service with. This MUST NOT be null.
- * Recommended: pass down the config parameter with any changes
- * @throws Exception any problem
- */
- Configuration bindArgs(Configuration config, String... args) throws Exception;
-
- /**
- * Run a service. This called after {@link Service#start()}
- * @return the exit code
- * @throws Throwable any exception to report
- */
- int runService() throws Throwable ;
-}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/core/main/ServiceLaunchException.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/core/main/ServiceLaunchException.java b/slider-core/src/main/java/org/apache/slider/core/main/ServiceLaunchException.java
deleted file mode 100644
index 27813b7..0000000
--- a/slider-core/src/main/java/org/apache/slider/core/main/ServiceLaunchException.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * 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.slider.core.main;
-
-
-import org.apache.hadoop.yarn.exceptions.YarnException;
-
-/**
- * A service launch exception that includes an exit code;
- * when caught by the ServiceLauncher, it will convert that
- * into a process exit code.
- */
-public class ServiceLaunchException extends YarnException
- implements ExitCodeProvider, LauncherExitCodes {
-
- private final int exitCode;
-
- /**
- * Create an exception with the specific exit code
- * @param exitCode exit code
- * @param cause cause of the exception
- */
- public ServiceLaunchException(int exitCode, Throwable cause) {
- super(cause);
- this.exitCode = exitCode;
- }
-
- /**
- * Create an exception with the specific exit code and text
- * @param exitCode exit code
- * @param message message to use in exception
- */
- public ServiceLaunchException(int exitCode, String message) {
- super(message);
- this.exitCode = exitCode;
- }
-
- /**
- * Create an exception with the specific exit code, text and cause
- * @param exitCode exit code
- * @param message message to use in exception
- * @param cause cause of the exception
- */
- public ServiceLaunchException(int exitCode, String message, Throwable cause) {
- super(message, cause);
- this.exitCode = exitCode;
- }
-
- /**
- * Get the exit code
- * @return the exit code
- */
- @Override
- public int getExitCode() {
- return exitCode;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/core/main/ServiceLauncher.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/core/main/ServiceLauncher.java b/slider-core/src/main/java/org/apache/slider/core/main/ServiceLauncher.java
deleted file mode 100644
index f192ec8..0000000
--- a/slider-core/src/main/java/org/apache/slider/core/main/ServiceLauncher.java
+++ /dev/null
@@ -1,642 +0,0 @@
-/*
- * 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.slider.core.main;
-
-import com.google.common.base.Preconditions;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.net.NetUtils;
-import org.apache.hadoop.service.Service;
-import org.apache.hadoop.util.ExitUtil;
-import org.apache.hadoop.util.ShutdownHookManager;
-import org.apache.hadoop.util.VersionInfo;
-import org.apache.hadoop.yarn.YarnUncaughtExceptionHandler;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.net.MalformedURLException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-/**
- * A class to launch any service by name.
- *
- * It's designed to be subclassed for custom entry points.
- *
- *
- * Workflow
- * <ol>
- * <li>An instance of the class is created</li>
- * <li>If it implements RunService, it is given the binding args off the CLI</li>
- * <li>Its service.init() and service.start() methods are called.</li>
- * <li>If it implements RunService, runService() is called and its return
- * code used as the exit code.</li>
- * <li>Otherwise: it waits for the service to stop, assuming in its start() method
- * it begins work</li>
- * <li>If an exception returned an exit code, that becomes the exit code of the
- * command.</li>
- * </ol>
- * Error and warning messages are logged to stderr. Why? If the classpath
- * is wrong & logger configurations not on it, then no error messages by
- * the started app will be seen and the caller is left trying to debug
- * using exit codes.
- *
- */
-@SuppressWarnings("UseOfSystemOutOrSystemErr")
-public class ServiceLauncher<S extends Service>
- implements LauncherExitCodes, IrqHandler.Interrupted,
- Thread.UncaughtExceptionHandler {
- private static final Logger LOG = LoggerFactory.getLogger(
- ServiceLauncher.class);
-
- protected static final int PRIORITY = 30;
-
- public static final String NAME = "ServiceLauncher";
-
- /**
- * Name of the "--conf" argument.
- */
- public static final String ARG_CONF = "--conf";
-
- public static final String USAGE_MESSAGE =
- "Usage: " + NAME + " classname [" + ARG_CONF +
- "<conf file>] <service arguments> | ";
- static final int SHUTDOWN_TIME_ON_INTERRUPT = 30 * 1000;
-
- private volatile S service;
- private int serviceExitCode;
- @SuppressWarnings("MismatchedQueryAndUpdateOfCollection")
- private final List<IrqHandler> interruptHandlers = new ArrayList<>(1);
- private Configuration configuration;
- private String serviceClassName;
- private static AtomicBoolean signalAlreadyReceived = new AtomicBoolean(false);
-
-
- /**
- * Create an instance of the launcher
- * @param serviceClassName classname of the service
- */
- public ServiceLauncher(String serviceClassName) {
- this.serviceClassName = serviceClassName;
- }
-
- /**
- * Get the service. Null until and unless
- * {@link #launchService(Configuration, String[], boolean)} has completed
- * @return the service
- */
- public S getService() {
- return service;
- }
-
- /**
- * Get the configuration constructed from the command line arguments
- * @return the configuration used to create the service
- */
- public Configuration getConfiguration() {
- return configuration;
- }
-
- /**
- * The exit code from a successful service execution
- * @return the exit code.
- */
- public int getServiceExitCode() {
- return serviceExitCode;
- }
-
- @Override
- public String toString() {
- return "ServiceLauncher for " + serviceClassName;
- }
-
- /**
- * Launch the service, by creating it, initing it, starting it and then
- * maybe running it. {@link RunService#bindArgs(Configuration, String...)} is invoked
- * on the service between creation and init.
- *
- * All exceptions that occur are propagated upwards.
- *
- * If the method returns a status code, it means that it got as far starting
- * the service, and if it implements {@link RunService}, that the
- * method {@link RunService#runService()} has completed.
- *
- * At this point, the service is returned by {@link #getService()}.
- *
- * @param conf configuration
- * @param processedArgs arguments after the configuration parameters
- * have been stripped out.
- * @param addProcessHooks should process failure handlers be added to
- * terminate this service on shutdown. Tests should set this to false.
- * @throws ClassNotFoundException classname not on the classpath
- * @throws IllegalAccessException not allowed at the class
- * @throws InstantiationException not allowed to instantiate it
- * @throws InterruptedException thread interrupted
- * @throws Throwable any other failure
- */
- public int launchService(Configuration conf,
- String[] processedArgs,
- boolean addProcessHooks)
- throws Throwable {
-
- instantiateService(conf);
-
- // add any process shutdown hooks
- if (addProcessHooks) {
- ServiceShutdownHook shutdownHook = new ServiceShutdownHook(service);
- ShutdownHookManager.get().addShutdownHook(shutdownHook, PRIORITY);
- }
- RunService runService = null;
-
- if (service instanceof RunService) {
- //if its a runService, pass in the conf and arguments before init)
- runService = (RunService) service;
- configuration = runService.bindArgs(configuration, processedArgs);
- Preconditions.checkNotNull(configuration,
- "null configuration returned by bindArgs()");
- }
-
- //some class constructors init; here this is picked up on.
- if (!service.isInState(Service.STATE.INITED)) {
- service.init(configuration);
- }
- service.start();
- int exitCode = EXIT_SUCCESS;
- if (runService != null) {
- //assume that runnable services are meant to run from here
- exitCode = runService.runService();
- LOG.debug("Service exited with exit code {}", exitCode);
-
- } else {
- //run the service until it stops or an interrupt happens on a different thread.
- LOG.debug("waiting for service threads to terminate");
- service.waitForServiceToStop(0);
- }
- //exit
- serviceExitCode = exitCode;
- return serviceExitCode;
- }
-
- /**
- * Instantiate the service defined in <code>serviceClassName</code>
- * . Sets the <code>configuration</code> field
- * to the configuration, and <code>service</code> to the service.
- *
- * @param conf configuration to use
- * @throws ClassNotFoundException classname not on the classpath
- * @throws IllegalAccessException not allowed at the class
- * @throws InstantiationException not allowed to instantiate it
- */
- @SuppressWarnings("unchecked")
- public Service instantiateService(Configuration conf)
- throws ClassNotFoundException, InstantiationException, IllegalAccessException,
- ExitUtil.ExitException, NoSuchMethodException, InvocationTargetException {
- Preconditions.checkArgument(conf != null, "null conf");
- configuration = conf;
-
- //Instantiate the class -this requires the service to have a public
- // zero-argument constructor
- Class<?> serviceClass =
- this.getClass().getClassLoader().loadClass(serviceClassName);
- Object instance = serviceClass.getConstructor().newInstance();
- if (!(instance instanceof Service)) {
- //not a service
- throw new ExitUtil.ExitException(EXIT_COMMAND_ARGUMENT_ERROR,
- "Not a Service class: " + serviceClassName);
- }
-
- service = (S) instance;
- return service;
- }
-
- /**
- * Register this class as the handler for the control-C interrupt.
- * Can be overridden for testing.
- */
- protected void registerInterruptHandler() {
- try {
- interruptHandlers.add(new IrqHandler(IrqHandler.CONTROL_C, this));
- interruptHandlers.add(new IrqHandler(IrqHandler.SIGTERM, this));
- } catch (IOException e) {
- error("Signal handler setup failed : {}" + e, e);
- }
- }
-
- /**
- * The service has been interrupted -try to shut down the service.
- * Give the service time to do this before the exit operation is called
- * @param interruptData the interrupted data.
- */
- @Override
- public void interrupted(IrqHandler.InterruptData interruptData) {
- String message = "Service interrupted by " + interruptData.toString();
- warn(message);
- if (!signalAlreadyReceived.compareAndSet(false, true)) {
- warn("Repeated interrupt: escalating to a JVM halt");
- // signal already received. On a second request to a hard JVM
- // halt and so bypass any blocking shutdown hooks.
- ExitUtil.halt(EXIT_INTERRUPTED, message);
- }
- int shutdownTimeMillis = SHUTDOWN_TIME_ON_INTERRUPT;
- //start an async shutdown thread with a timeout
- ServiceForcedShutdown forcedShutdown =
- new ServiceForcedShutdown(shutdownTimeMillis);
- Thread thread = new Thread(forcedShutdown);
- thread.setDaemon(true);
- thread.start();
- //wait for that thread to finish
- try {
- thread.join(shutdownTimeMillis);
- } catch (InterruptedException ignored) {
- //ignored
- }
- if (!forcedShutdown.isServiceStopped()) {
- warn("Service did not shut down in time");
- }
- exit(EXIT_INTERRUPTED, message);
- }
-
- /**
- * Uncaught exception handler.
- * If an error is raised: shutdown
- * The state of the system is unknown at this point -attempting
- * a clean shutdown is dangerous. Instead: exit
- * @param thread thread that failed
- * @param exception exception
- */
- @Override
- public void uncaughtException(Thread thread, Throwable exception) {
- if (ShutdownHookManager.get().isShutdownInProgress()) {
- LOG.error("Thread {} threw an error during shutdown: {}.",
- thread.toString(),
- exception,
- exception);
- } else if (exception instanceof Error) {
- try {
- LOG.error("Thread {} threw an error: {}. Shutting down",
- thread.toString(),
- exception,
- exception);
- } catch (Throwable err) {
- // We don't want to not exit because of an issue with logging
- }
- if (exception instanceof OutOfMemoryError) {
- // After catching an OOM java says it is undefined behavior, so don't
- // even try to clean up or we can get stuck on shutdown.
- try {
- System.err.println("Halting due to Out Of Memory Error...");
- } catch (Throwable err) {
- // Again we don't want to exit because of logging issues.
- }
- ExitUtil.halt(EXIT_EXCEPTION_THROWN);
- } else {
- // error other than OutOfMemory
- exit(convertToExitException(exception));
- }
- } else {
- // simple exception in a thread. There's a policy decision here:
- // terminate the service vs. keep going after a thread has failed
- LOG.error("Thread {} threw an exception: {}",
- thread.toString(),
- exception,
- exception);
- }
- }
-
- /**
- * Print a warning: currently this goes to stderr
- * @param text
- */
- protected void warn(String text) {
- System.err.println(text);
- }
-
- /**
- * Report an error. The message is printed to stderr; the exception
- * is logged via the current logger.
- * @param message message for the user
- * @param thrown the exception thrown
- */
- protected void error(String message, Throwable thrown) {
- String text = "Exception: " + message;
- warn(text);
- LOG.error(text, thrown);
- }
-
- /**
- * Exit the code.
- * This is method can be overridden for testing, throwing an
- * exception instead. Any subclassed method MUST raise an
- * <code>ExitUtil.ExitException</code> instance.
- * The service launcher code assumes that after this method is invoked,
- * no other code in the same method is called.
- * @param exitCode code to exit
- */
- protected void exit(int exitCode, String message) {
- ExitUtil.terminate(exitCode, message);
- }
-
- /**
- * Exit off an exception. This can be subclassed for testing
- * @param ee exit exception
- */
- protected void exit(ExitUtil.ExitException ee) {
- ExitUtil.terminate(ee.status, ee);
- }
-
- /**
- * Get the service name via {@link Service#getName()}.
- * If the service is not instantiated, the classname is returned instead.
- * @return the service name
- */
- public String getServiceName() {
- Service s = service;
- String name = null;
- if (s != null) {
- try {
- name = s.getName();
- } catch (Exception ignored) {
- // ignored
- }
- }
- if (name != null) {
- return "service " + name;
- } else {
- return "service classname " + serviceClassName;
- }
- }
-
- /**
- * Parse the command line, building a configuration from it, then
- * launch the service and wait for it to finish. finally, exit
- * passing the status code to the #exit(int) method.
- * @param args arguments to the service. arg[0] is
- * assumed to be the service classname and is automatically
- */
- public void launchServiceAndExit(List<String> args) {
-
- registerInterruptHandler();
- //Currently the config just the default
- Configuration conf = new Configuration();
- String[] processedArgs = extractConfigurationArgs(conf, args);
- ExitUtil.ExitException ee = launchServiceRobustly(conf, processedArgs);
- System.out.flush();
- System.err.flush();
- exit(ee);
- }
-
- /**
- * Extract the configuration arguments and apply them to the configuration,
- * building an array of processed arguments to hand down to the service.
- *
- * @param conf configuration to update
- * @param args main arguments. args[0] is assumed to be the service
- * classname and is skipped
- * @return the processed list.
- */
- public static String[] extractConfigurationArgs(Configuration conf,
- List<String> args) {
-
- //convert args to a list
- int argCount = args.size();
- if (argCount <= 1 ) {
- return new String[0];
- }
- List<String> argsList = new ArrayList<String>(argCount);
- ListIterator<String> arguments = args.listIterator();
- //skip that first entry
- arguments.next();
- while (arguments.hasNext()) {
- String arg = arguments.next();
- if (arg.equals(ARG_CONF)) {
- //the argument is a --conf file tuple: extract the path and load
- //it in as a configuration resource.
-
- //increment the loop iterator
- if (!arguments.hasNext()) {
- //overshot the end of the file
- exitWithMessage(EXIT_COMMAND_ARGUMENT_ERROR,
- ARG_CONF + ": missing configuration file after ");
- }
- File file = new File(arguments.next());
- if (!file.exists()) {
- exitWithMessage(EXIT_COMMAND_ARGUMENT_ERROR,
- ARG_CONF + ": configuration file not found: " + file);
- }
- try {
- conf.addResource(file.toURI().toURL());
- } catch (MalformedURLException e) {
- LOG.debug("File {} cannot be converted to URL", file, e);
- exitWithMessage(EXIT_COMMAND_ARGUMENT_ERROR,
- ARG_CONF + ": configuration file path invalid: " + file);
- }
- } else {
- argsList.add(arg);
- }
- }
- String[] processedArgs = new String[argsList.size()];
- argsList.toArray(processedArgs);
- return processedArgs;
- }
-
- /**
- * Launch a service catching all exceptions and downgrading them to exit codes
- * after logging.
- * @param conf configuration to use
- * @param processedArgs command line after the launcher-specific arguments have
- * been stripped out
- * @return an exit exception, which will have a status code of 0 if it worked
- */
- public ExitUtil.ExitException launchServiceRobustly(Configuration conf,
- String[] processedArgs) {
- ExitUtil.ExitException exitException;
- try {
- int exitCode = launchService(conf, processedArgs, true);
- if (service != null) {
- Throwable failure = service.getFailureCause();
- if (failure != null) {
- //the service exited with a failure.
- //check what state it is in
- Service.STATE failureState = service.getFailureState();
- if (failureState == Service.STATE.STOPPED) {
- //the failure occurred during shutdown, not important enough to bother
- //the user as it may just scare them
- LOG.debug("Failure during shutdown:{} ", failure, failure);
- } else {
- //throw it for the catch handlers to deal with
- throw failure;
- }
- }
- }
- exitException = new ExitUtil.ExitException(exitCode,
- "In " + serviceClassName);
- // either the service succeeded, or an error raised during shutdown,
- // which we don't worry that much about
- } catch (ExitUtil.ExitException ee) {
- exitException = ee;
- } catch (Throwable thrown) {
- exitException = convertToExitException(thrown);
- }
- return exitException;
- }
-
- /**
- * Convert the exception to one that can be handed off to ExitUtils;
- * if it is of the write type it is passed throw as is. If not, a
- * new exception with the exit code {@link #EXIT_EXCEPTION_THROWN}
- * is created, with the argument <code>thrown</code> as the inner cause
- * @param thrown the exception thrown
- * @return an exception to terminate the process with
- */
- protected ExitUtil.ExitException convertToExitException(Throwable thrown) {
- ExitUtil.ExitException exitException;
- int exitCode;
- String message = thrown.getMessage();
- if (message == null) {
- message = thrown.toString();
- }
- if (thrown instanceof ExitCodeProvider) {
- exitCode = ((ExitCodeProvider) thrown).getExitCode();
- if (LOG.isDebugEnabled()) {
- LOG.debug("While running {}: {}", getServiceName(), message, thrown);
- }
- LOG.error(message);
- } else {
- // not any of the service launcher exceptions -assume something worse
- error(message, thrown);
- exitCode = EXIT_EXCEPTION_THROWN;
- }
- exitException = new ExitUtil.ExitException(exitCode, message);
- exitException.initCause(thrown);
- return exitException;
- }
-
-
- /**
- * Build a log message for starting up and shutting down.
- * This was grabbed from the ToolRunner code.
- * @param classname the class of the server
- * @param args arguments
- */
- public static String startupShutdownMessage(String classname,
- List<String> args) {
- final String hostname = NetUtils.getHostname();
-
- return toStartupShutdownString("STARTUP_MSG: ", new String[]{
- "Starting " + classname,
- " host = " + hostname,
- " args = " + args,
- " version = " + VersionInfo.getVersion(),
- " classpath = " + System.getProperty("java.class.path"),
- " build = " + VersionInfo.getUrl() + " -r "
- + VersionInfo.getRevision()
- + "; compiled by '" + VersionInfo.getUser()
- + "' on " + VersionInfo.getDate(),
- " java = " + System.getProperty("java.version")
- });
- }
-
- /**
- * Exit with a printed message
- * @param status status code
- * @param message message
- */
- private static void exitWithMessage(int status, String message) {
- System.err.println(message);
- ExitUtil.terminate(status);
- }
-
- private static String toStartupShutdownString(String prefix, String[] msg) {
- StringBuilder b = new StringBuilder(prefix);
- b.append("\n/************************************************************");
- for (String s : msg) {
- b.append("\n").append(prefix).append(s);
- }
- b.append("\n************************************************************/");
- return b.toString();
- }
-
- /**
- * forced shutdown runnable.
- */
- protected class ServiceForcedShutdown implements Runnable {
-
- private final int shutdownTimeMillis;
- private boolean serviceStopped;
-
- public ServiceForcedShutdown(int shutdownTimeoutMillis) {
- this.shutdownTimeMillis = shutdownTimeoutMillis;
- }
-
- @Override
- public void run() {
- if (service != null) {
- service.stop();
- serviceStopped = service.waitForServiceToStop(shutdownTimeMillis);
- } else {
- serviceStopped = true;
- }
- }
-
- private boolean isServiceStopped() {
- return serviceStopped;
- }
- }
-
- /**
- * The real main function, which takes the arguments as a list
- * arg 0 must be the service classname
- * @param argsList the list of arguments
- */
- public static void serviceMain(List<String> argsList) {
- if (argsList.isEmpty()) {
- exitWithMessage(EXIT_USAGE, USAGE_MESSAGE);
- } else {
- String serviceClassName = argsList.get(0);
-
- if (LOG.isDebugEnabled()) {
- LOG.debug(startupShutdownMessage(serviceClassName, argsList));
- StringBuilder builder = new StringBuilder();
- for (String arg : argsList) {
- builder.append('"').append(arg).append("\" ");
- }
- LOG.debug(builder.toString());
- }
- Thread.setDefaultUncaughtExceptionHandler(
- new YarnUncaughtExceptionHandler());
-
- ServiceLauncher serviceLauncher = new ServiceLauncher<>(serviceClassName);
- serviceLauncher.launchServiceAndExit(argsList);
- }
- }
-
- /**
- * This is the main entry point for the service launcher.
- * @param args command line arguments.
- */
- public static void main(String[] args) {
- List<String> argsList = Arrays.asList(args);
- serviceMain(argsList);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/core/main/ServiceShutdownHook.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/core/main/ServiceShutdownHook.java b/slider-core/src/main/java/org/apache/slider/core/main/ServiceShutdownHook.java
deleted file mode 100644
index de55789..0000000
--- a/slider-core/src/main/java/org/apache/slider/core/main/ServiceShutdownHook.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * 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.slider.core.main;
-
-import org.apache.hadoop.service.Service;
-import org.apache.hadoop.util.ShutdownHookManager;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.lang.ref.WeakReference;
-
-/**
- * JVM Shutdown hook for Service which will stop the
- * Service gracefully in case of JVM shutdown.
- * This hook uses a weak reference to the service, so
- * does not cause services to be retained after they have
- * been stopped and deferenced elsewhere.
- */
-public class ServiceShutdownHook implements Runnable {
- private static final Logger LOG = LoggerFactory.getLogger(
- ServiceShutdownHook.class);
-
- private final WeakReference<Service> serviceRef;
- private Runnable hook;
-
- public ServiceShutdownHook(Service service) {
- serviceRef = new WeakReference<>(service);
- }
-
- public void register(int priority) {
- unregister();
- hook = this;
- ShutdownHookManager.get().addShutdownHook(hook, priority);
- }
-
- public synchronized void unregister() {
- if (hook != null) {
- try {
- ShutdownHookManager.get().removeShutdownHook(hook);
- } catch (IllegalStateException e) {
- LOG.info("Failed to unregister shutdown hook: {}", e, e);
- }
- hook = null;
- }
- }
-
- @Override
- public void run() {
- Service service;
- synchronized (this) {
- service = serviceRef.get();
- serviceRef.clear();
- }
- if (service == null) {
- return;
- }
- try {
- // Stop the Service
- service.stop();
- } catch (Throwable t) {
- LOG.info("Error stopping {}", service.getName(), t);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/core/persist/AggregateConfSerDeser.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/core/persist/AggregateConfSerDeser.java b/slider-core/src/main/java/org/apache/slider/core/persist/AggregateConfSerDeser.java
deleted file mode 100644
index 90537b6..0000000
--- a/slider-core/src/main/java/org/apache/slider/core/persist/AggregateConfSerDeser.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.slider.core.persist;
-
-import org.apache.slider.core.conf.AggregateConf;
-import org.codehaus.jackson.JsonGenerationException;
-import org.codehaus.jackson.JsonParseException;
-import org.codehaus.jackson.map.JsonMappingException;
-
-import java.io.IOException;
-
-/**
- * Conf tree to JSON binding
- */
-public class AggregateConfSerDeser extends JsonSerDeser<AggregateConf> {
- public AggregateConfSerDeser() {
- super(AggregateConf.class);
- }
-
-
- private static final AggregateConfSerDeser
- staticinstance = new AggregateConfSerDeser();
-
- /**
- * Convert a tree instance to a JSON string -sync access to a shared ser/deser
- * object instance
- * @param instance object to convert
- * @return a JSON string description
- * @throws JsonParseException parse problems
- * @throws JsonMappingException O/J mapping problems
- */
- public static String toString(AggregateConf instance) throws IOException,
- JsonGenerationException,
- JsonMappingException {
- synchronized (staticinstance) {
- return staticinstance.toJson(instance);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/core/persist/AppDefinitionPersister.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/core/persist/AppDefinitionPersister.java b/slider-core/src/main/java/org/apache/slider/core/persist/AppDefinitionPersister.java
deleted file mode 100644
index 7fb3158..0000000
--- a/slider-core/src/main/java/org/apache/slider/core/persist/AppDefinitionPersister.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- * 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.slider.core.persist;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.io.Files;
-import org.apache.commons.lang.StringUtils;
-import org.apache.hadoop.fs.Path;
-import org.apache.slider.common.SliderKeys;
-import org.apache.slider.common.params.AbstractClusterBuildingActionArgs;
-import org.apache.slider.common.params.Arguments;
-import org.apache.slider.common.tools.SliderFileSystem;
-import org.apache.slider.common.tools.SliderUtils;
-import org.apache.slider.core.conf.ConfTreeOperations;
-import org.apache.slider.core.exceptions.BadCommandArgumentsException;
-import org.apache.slider.core.exceptions.BadConfigException;
-import org.apache.slider.providers.agent.AgentKeys;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Class to prepare and persist app and add-on definitions.
- *
- * In this case, the app definition and add-on definitions are auto-inferred from the user input rather than explicit
- * inclusion of application package in the config.
- *
- * Processing an app definition involves one or more of the following: - modify appConfig - package definition into a
- * temporary folder - upload to HDFS
- *
- * This class keeps track of all the required operations and allows them to be invoked by build operation
- */
-public class AppDefinitionPersister {
- private static final Logger log =
- LoggerFactory.getLogger(AppDefinitionPersister.class);
-
- private final SliderFileSystem sliderFileSystem;
- private List<AppDefinition> appDefinitions;
-
- public AppDefinitionPersister(SliderFileSystem sliderFileSystem) {
- this.sliderFileSystem = sliderFileSystem;
- appDefinitions = new ArrayList<>();
- }
-
-
- /**
- * Process the application package or folder by copying it to the cluster path
- *
- * @param appDefinition details of application package
- *
- * @throws BadConfigException
- * @throws IOException
- */
- private void persistDefinitionPackageOrFolder(AppDefinition appDefinition)
- throws BadConfigException, IOException {
- if (!appDefinition.appDefPkgOrFolder.canRead()) {
- throw new BadConfigException("Pkg/Folder cannot be accessed - "
- + appDefinition.appDefPkgOrFolder.getAbsolutePath());
- }
-
- File src = appDefinition.appDefPkgOrFolder;
- String targetName = appDefinition.pkgName;
- log.debug("Package name: " + targetName);
- if (appDefinition.appDefPkgOrFolder.isDirectory()) {
- log.info("Processing app package/folder {} for {}",
- appDefinition.appDefPkgOrFolder.getAbsolutePath(),
- appDefinition.pkgName);
- File tmpDir = Files.createTempDir();
- File zipFile = new File(tmpDir.getCanonicalPath(), File.separator + appDefinition.pkgName);
- SliderUtils.zipFolder(appDefinition.appDefPkgOrFolder, zipFile);
- src = zipFile;
- }
-
- sliderFileSystem.getFileSystem().copyFromLocalFile(
- false,
- false,
- new Path(src.toURI()),
- new Path(appDefinition.targetFolderInFs, targetName));
- }
-
- public void persistPackages() throws BadConfigException, IOException {
- for (AppDefinition appDefinition : appDefinitions) {
- persistDefinitionPackageOrFolder(appDefinition);
- }
- }
-
- public void processSuppliedDefinitions(String clustername,
- AbstractClusterBuildingActionArgs buildInfo,
- ConfTreeOperations appConf)
- throws BadConfigException, IOException, BadCommandArgumentsException {
- // if metainfo is provided add to the app instance
- if (buildInfo.appMetaInfo != null || buildInfo.appMetaInfoJson != null) {
- if (buildInfo.appMetaInfo != null && buildInfo.appMetaInfoJson != null) {
- throw new BadConfigException("Both %s and %s cannot be specified",
- Arguments.ARG_METAINFO, Arguments.ARG_METAINFO_JSON);
- }
-
- // Now we know that only one of either file or JSON is used
- boolean isFileUsed = buildInfo.appMetaInfo != null ? true : false;
- String argUsed = isFileUsed ? Arguments.ARG_METAINFO
- : Arguments.ARG_METAINFO_JSON;
-
- if (buildInfo.appDef != null) {
- throw new BadConfigException("Both %s and %s cannot be specified",
- argUsed, Arguments.ARG_APPDEF);
- }
- if (SliderUtils.isSet(appConf.getGlobalOptions().get(AgentKeys.APP_DEF))) {
- throw new BadConfigException(
- "%s cannot not be set if %s is specified in the cmd line ",
- AgentKeys.APP_DEF, argUsed);
- }
-
- if (isFileUsed) {
- if (!buildInfo.appMetaInfo.canRead() || !buildInfo.appMetaInfo.isFile()) {
- throw new BadConfigException(
- "Path specified with %s either cannot be read or is not a file",
- Arguments.ARG_METAINFO);
- }
- } else {
- if (StringUtils.isEmpty(buildInfo.appMetaInfoJson.trim())) {
- throw new BadConfigException("Empty string specified with %s",
- Arguments.ARG_METAINFO_JSON);
- }
- }
-
- File tempDir = Files.createTempDir();
- File pkgSrcDir = new File(tempDir, "default");
- pkgSrcDir.mkdirs();
- File destMetaInfo = new File(pkgSrcDir, "metainfo.json");
- if (isFileUsed) {
- if (buildInfo.appMetaInfo.getName().endsWith(".xml")) {
- Files.copy(buildInfo.appMetaInfo, new File(pkgSrcDir, "metainfo.xml"));
- } else {
- Files.copy(buildInfo.appMetaInfo, destMetaInfo);
- }
- } else {
- Files.write(
- buildInfo.appMetaInfoJson.getBytes(Charset.forName("UTF-8")),
- destMetaInfo);
- }
-
- Path appDirPath = sliderFileSystem.buildAppDefDirPath(clustername);
- log.info("Using default app def path {}", appDirPath.toString());
-
- appDefinitions.add(new AppDefinition(appDirPath, pkgSrcDir,
- SliderKeys.DEFAULT_APP_PKG));
- Path appDefPath = new Path(appDirPath, SliderKeys.DEFAULT_APP_PKG);
- appConf.getGlobalOptions().set(AgentKeys.APP_DEF, appDefPath);
- log.info("Setting app package to {}.", appDefPath);
- }
-
- if (buildInfo.appDef != null) {
- if (SliderUtils.isSet(appConf.getGlobalOptions().get(AgentKeys.APP_DEF))) {
- throw new BadConfigException("application.def must not be set if --appdef is provided.");
- }
-
- if (!buildInfo.appDef.exists()) {
- throw new BadConfigException("--appdef is not a valid path.");
- }
-
- Path appDirPath = sliderFileSystem.buildAppDefDirPath(clustername);
- appDefinitions.add(new AppDefinition(appDirPath, buildInfo.appDef, SliderKeys.DEFAULT_APP_PKG));
- Path appDefPath = new Path(appDirPath, SliderKeys.DEFAULT_APP_PKG);
- appConf.getGlobalOptions().set(AgentKeys.APP_DEF, appDefPath);
- log.info("Setting app package to {}.", appDefPath);
- }
-
- if (buildInfo.addonDelegate.getAddonMap().size() > 0) {
- if (SliderUtils.isUnset(appConf.getGlobalOptions().get(AgentKeys.APP_DEF))) {
- throw new BadConfigException("addon package can only be specified if main app package is specified.");
- }
-
- List<String> addons = new ArrayList<String>();
- Map<String, String> addonMap = buildInfo.addonDelegate.getAddonMap();
- for (String key : addonMap.keySet()) {
- File defPath = new File(addonMap.get(key));
- if (SliderUtils.isUnset(addonMap.get(key))) {
- throw new BadConfigException("Invalid path for addon package " + key);
- }
-
- if (!defPath.exists()) {
- throw new BadConfigException("addon folder or package path is not valid.");
- }
-
- Path addonPath = sliderFileSystem.buildAddonDirPath(clustername, key);
- String addonPkgName = "addon_" + key + ".zip";
-
- log.debug(
- "addonMap.get(key): {} addonPath: {} defPath: {} addonPkgName: {}",
- addonMap.get(key), addonPath, defPath, addonPkgName);
-
- appDefinitions.add(new AppDefinition(addonPath, defPath, addonPkgName));
- String addOnKey = AgentKeys.ADDON_PREFIX + key;
- Path addonPkgPath = new Path(addonPath, addonPkgName);
- log.info("Setting addon package {} to {}.", addOnKey, addonPkgPath);
- appConf.getGlobalOptions().set(addOnKey, addonPkgPath);
- addons.add(addOnKey);
- }
-
- String existingList = appConf.getGlobalOptions().get(AgentKeys.ADDONS);
- if (SliderUtils.isUnset(existingList)) {
- existingList = "";
- }
- appConf.getGlobalOptions().set(AgentKeys.ADDONS, existingList + StringUtils.join(addons, ","));
- }
- }
-
-
- @VisibleForTesting
- public List<AppDefinitionPersister.AppDefinition> getAppDefinitions() {
- return appDefinitions;
- }
-
- // Helper class to hold details for the app and addon packages
- public class AppDefinition {
- // The target folder where the package will be stored
- public Path targetFolderInFs;
- // The on disk location of the app def package or folder
- public File appDefPkgOrFolder;
- // Package name
- public String pkgName;
-
- public AppDefinition(Path targetFolderInFs, File appDefPkgOrFolder, String pkgName) {
- this.targetFolderInFs = targetFolderInFs;
- this.appDefPkgOrFolder = appDefPkgOrFolder;
- this.pkgName = pkgName;
- }
-
- @Override
- public String toString() {
- return new StringBuilder().append("targetFolderInFs").append(" : ").append(targetFolderInFs.toString())
- .append(", ")
- .append("appDefPkgOrFolder").append(" : ").append(appDefPkgOrFolder.toString())
- .append(", ")
- .append("pkgName").append(" : ").append(pkgName).toString();
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/core/persist/ApplicationReportSerDeser.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/core/persist/ApplicationReportSerDeser.java b/slider-core/src/main/java/org/apache/slider/core/persist/ApplicationReportSerDeser.java
deleted file mode 100644
index a8c72ce..0000000
--- a/slider-core/src/main/java/org/apache/slider/core/persist/ApplicationReportSerDeser.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * 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.slider.core.persist;
-
-import org.apache.slider.core.launch.SerializedApplicationReport;
-import org.codehaus.jackson.JsonGenerationException;
-import org.codehaus.jackson.JsonParseException;
-import org.codehaus.jackson.map.JsonMappingException;
-
-import java.io.IOException;
-
-/**
- * Persistence of {@link SerializedApplicationReport}
- *
- */
-public class ApplicationReportSerDeser
- extends JsonSerDeser<SerializedApplicationReport> {
- public ApplicationReportSerDeser() {
- super(SerializedApplicationReport.class);
- }
-
-
- private static final ApplicationReportSerDeser
- staticinstance = new ApplicationReportSerDeser();
-
- /**
- * Convert an instance to a JSON string -sync access to a shared ser/deser
- * object instance
- * @param instance object to convert
- * @return a JSON string description
- * @throws JsonParseException parse problems
- * @throws JsonMappingException O/J mapping problems
- */
- public static String toString(SerializedApplicationReport instance)
- throws IOException, JsonGenerationException, JsonMappingException {
- synchronized (staticinstance) {
- return staticinstance.toJson(instance);
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/core/persist/ConfPersister.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/core/persist/ConfPersister.java b/slider-core/src/main/java/org/apache/slider/core/persist/ConfPersister.java
deleted file mode 100644
index 9759205..0000000
--- a/slider-core/src/main/java/org/apache/slider/core/persist/ConfPersister.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * 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.slider.core.persist;
-
-import com.google.common.annotations.VisibleForTesting;
-import org.apache.hadoop.fs.FileAlreadyExistsException;
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.fs.Path;
-import org.apache.slider.common.tools.CoreFileSystem;
-import org.apache.slider.core.conf.AggregateConf;
-import org.apache.slider.core.exceptions.SliderException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.Date;
-
-/**
- * Class to implement persistence of a configuration.
- *
- * This code contains the logic to acquire and release locks.
- * # writelock MUST be acquired exclusively for writes. This is done
- * by creating the file with no overwrite
- * # shared readlock MUST be acquired for reads. This is done by creating the readlock
- * file with overwrite forbidden -but treating a failure as a sign that
- * the lock exists, and therefore the operation can continue.
- * # releaselock is only released if the client created it.
- * # after acquiring either lock, client must check for the alternate lock
- * existing. If it is, release lock and fail.
- *
- * There's one small race here: multiple readers; first reader releases lock
- * while second is in use.
- *
- * Strict Fix: client checks for readlock after read completed.
- * If it is not there, problem: fail. But this massively increases the risk of
- * false negatives.
- *
- * This isn't 100% perfect, because of the condition where the owner releases
- * a lock, a writer grabs its lock & writes to it, the reader gets slightly
- * contaminated data:
- * own-share-delete-write-own-release(shared)-delete
- *
- * We are assuming that the rate of change is low enough that this is rare, and
- * of limited damage.
- *
- * ONCE A CLUSTER IS RUNNING, ONLY THE AM MAY PERSIST UPDATES VIA ITS APIs
- *
- * That is: outside the AM, a writelock MUST only be acquired after verifying there is no
- * running application.
- */
-public class ConfPersister {
- private static final Logger log =
- LoggerFactory.getLogger(ConfPersister.class);
-
-
- private final ConfTreeSerDeser confTreeSerDeser = new ConfTreeSerDeser();
-
- private final CoreFileSystem coreFS;
- private final FileSystem fileSystem;
- private final Path persistDir;
- private final Path internal, resources, app_conf;
- private final Path writelock, readlock;
-
- public ConfPersister(CoreFileSystem coreFS, Path persistDir) {
- this.coreFS = coreFS;
- this.persistDir = persistDir;
- internal = new Path(persistDir, Filenames.INTERNAL);
- resources = new Path(persistDir, Filenames.RESOURCES);
- app_conf = new Path(persistDir, Filenames.APPCONF);
- writelock = new Path(persistDir, Filenames.WRITELOCK);
- readlock = new Path(persistDir, Filenames.READLOCK);
- fileSystem = coreFS.getFileSystem();
- }
-
- /**
- * Get the target directory
- * @return the directory for persistence
- */
- public Path getPersistDir() {
- return persistDir;
- }
-
- /**
- * Make the persistent directory
- * @throws IOException IO failure
- */
- public void mkPersistDir() throws IOException {
- coreFS.getFileSystem().mkdirs(persistDir);
- }
-
- @Override
- public String toString() {
- return "Persister to " + persistDir;
- }
-
- /**
- * Acquire the writelock
- * @throws IOException IO
- * @throws LockAcquireFailedException
- */
- @VisibleForTesting
- void acquireWritelock() throws IOException,
- LockAcquireFailedException {
- mkPersistDir();
- long now = System.currentTimeMillis();
- try {
- coreFS.cat(writelock, false, new Date(now).toGMTString());
- } catch (FileAlreadyExistsException e) {
- // filesystems should raise this (HDFS does)
- throw new LockAcquireFailedException(writelock);
- } catch (IOException e) {
- // some filesystems throw a generic IOE
- throw new LockAcquireFailedException(writelock, e);
- }
- //here the lock is acquired, but verify there is no readlock
- boolean lockFailure;
- try {
- lockFailure = readLockExists();
- } catch (IOException e) {
- lockFailure = true;
- }
- if (lockFailure) {
- releaseWritelock();
- throw new LockAcquireFailedException(readlock);
- }
- }
-
- @VisibleForTesting
- boolean readLockExists() throws IOException {
- return fileSystem.exists(readlock);
- }
-
- /**
- * Release the writelock if it is present.
- * IOExceptions are logged
- */
- @VisibleForTesting
- boolean releaseWritelock() {
- try {
- return fileSystem.delete(writelock, false);
- } catch (IOException e) {
- log.warn("IOException releasing writelock {} ", writelock, e);
- }
- return false;
- }
-
- /**
- * Acquire the writelock
- * @throws IOException IO
- * @throws LockAcquireFailedException
- * @throws FileNotFoundException if the target dir does not exist.
- */
- @VisibleForTesting
- boolean acquireReadLock() throws FileNotFoundException,
- IOException,
- LockAcquireFailedException {
- if (!coreFS.getFileSystem().exists(persistDir)) {
- // the dir is not there, so the data is not there, so there
- // is nothing to read
- throw new FileNotFoundException(persistDir.toString());
- }
- long now = System.currentTimeMillis();
- boolean owner;
- try {
- coreFS.cat(readlock, false, new Date(now).toGMTString());
- owner = true;
- } catch (IOException e) {
- owner = false;
- }
- //here the lock is acquired, but verify there is no readlock
- boolean lockFailure;
- try {
- lockFailure = writelockExists();
- } catch (IOException e) {
- lockFailure = true;
- }
- if (lockFailure) {
- releaseReadlock(owner);
- throw new LockAcquireFailedException(writelock);
- }
- return owner;
- }
-
- @VisibleForTesting
- boolean writelockExists() throws IOException {
- return fileSystem.exists(writelock);
- }
-
- /**
- * Release the writelock if it is present.
- * IOExceptions are downgraded to failures
- * @return true if the lock was present and then released
- */
- @VisibleForTesting
- boolean releaseReadlock(boolean owner) {
- if (owner) {
- try {
- return fileSystem.delete(readlock, false);
- } catch (IOException e) {
- log.warn("IOException releasing writelock {} ", readlock, e);
- }
- }
- return false;
- }
-
- private void saveConf(AggregateConf conf) throws IOException {
- confTreeSerDeser.save(fileSystem, internal, conf.getInternal(), true);
- confTreeSerDeser.save(fileSystem, resources, conf.getResources(), true);
- confTreeSerDeser.save(fileSystem, app_conf, conf.getAppConf(), true);
- }
-
- private void loadConf(AggregateConf conf) throws IOException {
- conf.setInternal(confTreeSerDeser.load(fileSystem, internal));
- conf.setResources(confTreeSerDeser.load(fileSystem, resources));
- conf.setAppConf(confTreeSerDeser.load(fileSystem, app_conf));
- }
-
-
- private void maybeExecLockHeldAction(LockHeldAction action) throws
- IOException,
- SliderException {
- if (action != null) {
- action.execute();
- }
- }
-
- /**
- * Save the configuration
- * @param conf configuration to fill in
- * @param action
- * @throws IOException IO problems
- * @throws LockAcquireFailedException the lock could not be acquired
- */
- public void save(AggregateConf conf, LockHeldAction action) throws
- IOException,
- SliderException,
- LockAcquireFailedException {
- acquireWritelock();
- try {
- saveConf(conf);
- maybeExecLockHeldAction(action);
- } finally {
- releaseWritelock();
- }
- }
-
- /**
- * Load the configuration. If a lock failure is raised, the
- * contents of the configuration MAY have changed -lock race conditions
- * are looked for on exit
- * @param conf configuration to fill in
- * @throws IOException IO problems
- * @throws LockAcquireFailedException the lock could not be acquired
- */
- public void load(AggregateConf conf) throws
- FileNotFoundException,
- IOException,
- SliderException,
- LockAcquireFailedException {
- boolean owner = acquireReadLock();
- try {
- loadConf(conf);
- } finally {
- releaseReadlock(owner);
- }
- }
-
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/core/persist/ConfTreeSerDeser.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/core/persist/ConfTreeSerDeser.java b/slider-core/src/main/java/org/apache/slider/core/persist/ConfTreeSerDeser.java
deleted file mode 100644
index 8271ef1..0000000
--- a/slider-core/src/main/java/org/apache/slider/core/persist/ConfTreeSerDeser.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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.slider.core.persist;
-
-import org.apache.slider.core.conf.ConfTree;
-import org.codehaus.jackson.JsonGenerationException;
-import org.codehaus.jackson.JsonParseException;
-import org.codehaus.jackson.map.JsonMappingException;
-
-import java.io.IOException;
-
-/**
- * Conf tree to JSON binding
- */
-public class ConfTreeSerDeser extends JsonSerDeser<ConfTree> {
- public ConfTreeSerDeser() {
- super(ConfTree.class);
- }
-
-
- private static final ConfTreeSerDeser staticinstance = new ConfTreeSerDeser();
-
- /**
- * Convert a tree instance to a JSON string -sync access to a shared ser/deser
- * object instance
- * @param instance object to convert
- * @return a JSON string description
- * @throws JsonParseException parse problems
- * @throws JsonMappingException O/J mapping problems
- */
- public static String toString(ConfTree instance) throws IOException,
- JsonGenerationException,
- JsonMappingException {
- synchronized (staticinstance) {
- return staticinstance.toJson(instance);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/core/persist/Filenames.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/core/persist/Filenames.java b/slider-core/src/main/java/org/apache/slider/core/persist/Filenames.java
deleted file mode 100644
index 06ecc51..0000000
--- a/slider-core/src/main/java/org/apache/slider/core/persist/Filenames.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * 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.slider.core.persist;
-
-public interface Filenames {
-
- String RESOURCES = "resources.json";
- String APPCONF = "app_config.json";
- String INTERNAL = "internal.json";
- String WRITELOCK = "writelock";
- String READLOCK = "readlock";
-}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/core/persist/InstancePaths.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/core/persist/InstancePaths.java b/slider-core/src/main/java/org/apache/slider/core/persist/InstancePaths.java
deleted file mode 100644
index 3505ac3..0000000
--- a/slider-core/src/main/java/org/apache/slider/core/persist/InstancePaths.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * 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.slider.core.persist;
-
-import org.apache.hadoop.fs.Path;
-import org.apache.slider.common.SliderKeys;
-
-/**
- * Build up all the paths of an instance relative to the supplied instance
- * directory.
- */
-public class InstancePaths {
-
- public final Path instanceDir;
- public final Path snapshotConfPath;
- public final Path generatedConfPath;
- public final Path historyPath;
- public final Path dataPath;
- public final Path tmpPath;
- public final Path tmpPathAM;
- public final Path appDefPath;
- public final Path addonsPath;
-
- public InstancePaths(Path instanceDir) {
- this.instanceDir = instanceDir;
- snapshotConfPath =
- new Path(instanceDir, SliderKeys.SNAPSHOT_CONF_DIR_NAME);
- generatedConfPath =
- new Path(instanceDir, SliderKeys.GENERATED_CONF_DIR_NAME);
- historyPath = new Path(instanceDir, SliderKeys.HISTORY_DIR_NAME);
- dataPath = new Path(instanceDir, SliderKeys.DATA_DIR_NAME);
- tmpPath = new Path(instanceDir, SliderKeys.TMP_DIR_PREFIX);
- tmpPathAM = new Path(tmpPath, SliderKeys.AM_DIR_PREFIX);
- appDefPath = new Path(tmpPath, SliderKeys.APP_DEF_DIR);
- addonsPath = new Path(tmpPath, SliderKeys.ADDONS_DIR);
- }
-
- @Override
- public String toString() {
- return "instance at " + instanceDir;
- }
-}