/**
* 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.hive.metastore;
import org.apache.hadoop.hive.metastore.api.MetaException;
import org.junit.Assert;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Test the Deadline class used for long running requests.
*/
public class TestDeadline {
private static final Logger LOG = LoggerFactory.getLogger(TestDeadline.class);
private long timeout = 1000;
private long resetTimeout = 200;
private long duration = 500;
private boolean isFailed;
private String errorMsg;
@Test
public void testDeadline() throws Exception {
isFailed = false;
errorMsg = "";
Thread threadTimeout = new Thread(createRunnable());
threadTimeout.setDaemon(true);
threadTimeout.start();
threadTimeout.join(60000);
if (isFailed) {
Assert.fail(errorMsg);
}
}
private Runnable createRunnable() {
return new Runnable() {
@Override
public void run() {
Deadline.registerIfNot(timeout);
try {
// normal
start();
try {
Deadline.checkTimeout();
} catch (MetaException e) {
failInThread("should not timeout", e);
return;
}
Deadline.stopTimer();
// normal. Check stopTimer() works.
start();
try {
Deadline.checkTimeout();
} catch (MetaException e) {
failInThread("should not timeout", e);
return;
}
Deadline.stopTimer();
// reset
Deadline.resetTimeout(resetTimeout);
// timeout
start();
try {
Deadline.checkTimeout();
failInThread("should timeout.", null);
return;
} catch (MetaException e) {
if (e.getCause() instanceof DeadlineException) {
Deadline.clear();
} else {
failInThread("new MetaException failed.", e);
return;
}
}
if (Deadline.getCurrentDeadline() != null) {
failInThread("the threadlocal object should be removed after timeout.", null);
}
} catch (MetaException e) {
failInThread("error happens in start, end, or reset. Check the exception.", e);
}
}
};
}
private void start() throws MetaException {
Deadline.startTimer("test");
try {
Thread.sleep(duration);
} catch (InterruptedException e) {
failInThread("Odd. Sleeping thread is interrupted.", e);
}
}
private void failInThread(String msg, Exception e) {
isFailed = true;
if (e != null) {
LOG.error(msg, e);
errorMsg = msg + ": " + e.getMessage();
} else {
LOG.error(msg);
errorMsg = msg;
}
}
}