blob: f3b0c3008b0d4b2ff5d492142a17ab7e9ec8fa47 [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.hadoop.service;
import java.util.ArrayList;
import java.util.List;
import org.apache.hadoop.service.Service;
import org.apache.hadoop.service.ServiceStateChangeListener;
/**
* A state change listener that logs the number of state change events received,
* and the last state invoked.
*
* It can be configured to fail during a state change event
*/
public class BreakableStateChangeListener
implements ServiceStateChangeListener {
private final String name;
private int eventCount;
private int failureCount;
private Service lastService;
private Service.STATE lastState = Service.STATE.NOTINITED;
//no callbacks are ever received for this event, so it
//can be used as an 'undefined'.
private Service.STATE failingState = Service.STATE.NOTINITED;
private List<Service.STATE> stateEventList = new ArrayList<Service.STATE>(4);
public BreakableStateChangeListener() {
this( "BreakableStateChangeListener");
}
public BreakableStateChangeListener(String name) {
this.name = name;
}
@Override
public synchronized void stateChanged(Service service) {
eventCount++;
lastService = service;
lastState = service.getServiceState();
stateEventList.add(lastState);
if (lastState == failingState) {
failureCount++;
throw new BreakableService.BrokenLifecycleEvent(service,
"Failure entering "
+ lastState
+ " for "
+ service.getName());
}
}
public synchronized int getEventCount() {
return eventCount;
}
public synchronized Service getLastService() {
return lastService;
}
public synchronized Service.STATE getLastState() {
return lastState;
}
public synchronized void setFailingState(Service.STATE failingState) {
this.failingState = failingState;
}
public synchronized int getFailureCount() {
return failureCount;
}
public List<Service.STATE> getStateEventList() {
return stateEventList;
}
@Override
public synchronized String toString() {
String s =
name + " - event count = " + eventCount + " last state " + lastState;
StringBuilder history = new StringBuilder(stateEventList.size()*10);
for (Service.STATE state: stateEventList) {
history.append(state).append(" ");
}
return s + " [ " + history + "]";
}
}