/**
* 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.hcatalog.templeton;
import java.io.IOException;
import java.util.ArrayList;
import java.util.concurrent.TimeoutException;
import org.eclipse.jetty.http.HttpStatus;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import static org.junit.Assert.assertTrue;
/*
* Test submission of concurrent job requests with the controlled number of concurrent
* Requests. Verify that we get busy exception and appropriate message.
*/
public class TestConcurrentJobRequestsThreads extends ConcurrentJobRequestsTestBase {
private static AppConfig config;
private static QueueStatusBean statusBean;
@Rule
public ExpectedException exception = ExpectedException.none();
@BeforeClass
public static void setUp() {
final String[] args = new String[] {};
Main main = new Main(args);
config = main.getAppConfigInstance();
config.setInt(AppConfig.JOB_STATUS_MAX_THREADS, 5);
config.setInt(AppConfig.JOB_LIST_MAX_THREADS, 5);
config.setInt(AppConfig.JOB_SUBMIT_MAX_THREADS, 5);
statusBean = new QueueStatusBean("job_1000", "Job not found");
}
@Test
public void ConcurrentJobsStatusTooManyRequestsException() {
try {
JobRunnable jobRunnable = ConcurrentJobsStatus(6, config, false, false,
statusJobHelper.getDelayedResonseAnswer(4, statusBean));
assertTrue(jobRunnable.exception != null);
assertTrue(jobRunnable.exception instanceof TooManyRequestsException);
TooManyRequestsException ex = (TooManyRequestsException)jobRunnable.exception;
assertTrue(ex.httpCode == TooManyRequestsException.TOO_MANY_REQUESTS_429);
String expectedMessage = "Unable to service the status job request as templeton service is busy "
+ "with too many status job requests. Please wait for some time before "
+ "retrying the operation. Please refer to the config "
+ "templeton.parallellism.job.status to configure concurrent requests.";
assertTrue(jobRunnable.exception.getMessage().contains(expectedMessage));
/*
* Verify that new job requests have no issues.
*/
jobRunnable = ConcurrentJobsStatus(5, config, false, false,
statusJobHelper.getDelayedResonseAnswer(4, statusBean));
assertTrue(jobRunnable.exception == null);
} catch (Exception e) {
assertTrue(false);
}
}
@Test
public void ConcurrentListJobsTooManyRequestsException() {
try {
JobRunnable jobRunnable = ConcurrentListJobs(6, config, false, false,
listJobHelper.getDelayedResonseAnswer(4, new ArrayList<JobItemBean>()));
assertTrue(jobRunnable.exception != null);
assertTrue(jobRunnable.exception instanceof TooManyRequestsException);
TooManyRequestsException ex = (TooManyRequestsException)jobRunnable.exception;
assertTrue(ex.httpCode == TooManyRequestsException.TOO_MANY_REQUESTS_429);
String expectedMessage = "Unable to service the list job request as templeton service is busy "
+ "with too many list job requests. Please wait for some time before "
+ "retrying the operation. Please refer to the config "
+ "templeton.parallellism.job.list to configure concurrent requests.";
assertTrue(jobRunnable.exception.getMessage().contains(expectedMessage));
/*
* Verify that new job requests have no issues.
*/
jobRunnable = ConcurrentListJobs(5, config, false, false,
listJobHelper.getDelayedResonseAnswer(4, new ArrayList<JobItemBean>()));
assertTrue(jobRunnable.exception == null);
} catch (Exception e) {
assertTrue(false);
}
}
@Test
public void ConcurrentSubmitJobsTooManyRequestsException() {
try {
JobRunnable jobRunnable = SubmitConcurrentJobs(6, config, false, false,
submitJobHelper.getDelayedResonseAnswer(4, 0),
killJobHelper.getDelayedResonseAnswer(0, statusBean), "job_1000");
assertTrue(jobRunnable.exception != null);
assertTrue(jobRunnable.exception instanceof TooManyRequestsException);
TooManyRequestsException ex = (TooManyRequestsException)jobRunnable.exception;
assertTrue(ex.httpCode == TooManyRequestsException.TOO_MANY_REQUESTS_429);
String expectedMessage = "Unable to service the submit job request as templeton service is busy "
+ "with too many submit job requests. Please wait for some time before "
+ "retrying the operation. Please refer to the config "
+ "templeton.parallellism.job.submit to configure concurrent requests.";
assertTrue(jobRunnable.exception.getMessage().contains(expectedMessage));
/*
* Verify that new job requests have no issues.
*/
jobRunnable = SubmitConcurrentJobs(5, config, false, false,
submitJobHelper.getDelayedResonseAnswer(4, 0),
killJobHelper.getDelayedResonseAnswer(0, statusBean), "job_1000");
assertTrue(jobRunnable.exception == null);
} catch (Exception e) {
assertTrue(false);
}
}
}