/*
* JBoss, Home of Professional Open Source
* Copyright 2009, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags.
* See the copyright.txt in the distribution for a
* full listing of individual contributors.
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License, v. 2.1.
* This program is distributed in the hope that it will be useful, but WITHOUT A
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public License,
* v.2.1 along with this distribution; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
* (C) 2009,
* @author JBoss Inc.
*/
package org.jboss.jbossts.qa.Utils;
import com.arjuna.ats.arjuna.common.recoveryPropertyManager;
import com.arjuna.ats.arjuna.common.arjPropertyManager;
import java.io.BufferedReader;
import java.io.PrintStream;
import java.io.InputStreamReader;
import java.net.Socket;
/**
* Utility class to hold delay functions for crash recovery tests.
*
* @author Jonathan Halliday (jonathan.halliday@redhat.com) 2009-09
*/
public class CrashRecoveryDelays
{
public static void awaitRecoveryArjunaCore() throws InterruptedException {
doRecovery();
}
public static void awaitRecoveryCR05() throws InterruptedException {
awaitRecovery(2, 1);
}
public static void awaitRecoveryCR07(int num_clients) throws InterruptedException {
awaitRecovery(1, num_clients);
}
public static void awaitRecoveryCR08(int num_clients) throws InterruptedException {
// due to the way CachedRecoveredTransaction/StatusChecker handle TRANSIENT some of these tests need two passes
awaitRecovery(2, num_clients);
}
public static void awaitRecoveryCR09() throws InterruptedException {
awaitRecovery(1, 1);
}
public static void awaitRecoveryCR10() throws InterruptedException {
awaitRecovery(1, 1);
}
public static void awaitRecoveryCR12() throws InterruptedException {
awaitRecovery(2, 1);
}
/*
// old, slow method - sleep long enough to ensure periodic cr will have occurred.
private static void awaitRecovery(int num_cycles, int num_clients) throws InterruptedException
{
// Note: this assumes the client is running with the same config as the rec mgr process.
RecoveryEnvironmentBean recoveryEnvironmentBean = recoveryPropertyManager.getRecoveryEnvironmentBean();
int recoveryCycleTime = recoveryEnvironmentBean.getPeriodicRecoveryPeriod()+recoveryEnvironmentBean.getRecoveryBackoffPeriod();
// this timing may be a little tight on some older/busy systems
// consider increasing the per-client fudge factor a bit...
int delay = ((num_cycles*recoveryCycleTime)+(num_clients*10))*1000;
System.out.println("Sleeping for " + delay + " ms.");
Thread.sleep(delay);
}
*/
private static void awaitRecovery(int num_cycles, int num_clients) throws InterruptedException
{
num_cycles *= getDelayFactor(); // on some machines we may need to wait longer for recovery to complete
for(int i = 0; i < num_cycles; i++) {
if (i != 0)
awaitReplayCompletion(5); // add a delay to accommodate slower test machines
doRecovery();
}
}
// prod the recovery manager via its socket. This avoid any sleep delay.
private static void doRecovery() throws InterruptedException
{
int port = recoveryPropertyManager.getRecoveryEnvironmentBean().getRecoveryPort();
String host = recoveryPropertyManager.getRecoveryEnvironmentBean().getRecoveryAddress();
BufferedReader in = null;
PrintStream out = null;
Socket sckt = null;
try
{
sckt = new Socket(host,port);
in = new BufferedReader(new InputStreamReader(sckt.getInputStream()));
out = new PrintStream(sckt.getOutputStream());
// Output ping message
out.println("SCAN");
out.flush();
// Receive pong message
String inMessage = in.readLine();
if(!inMessage.equals("DONE")) {
System.err.println("Recovery failed with message: "+inMessage);
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
finally
{
try {
if ( in != null )
{
in.close();
}
if ( out != null )
{
out.close();
}
if (sckt != null)
sckt.close();
} catch(Exception e) {}
}
}
/////////////////
public static void awaitReplayCompletionCR01() throws InterruptedException {
awaitReplayCompletion(5); // was 10
}
public static void awaitReplayCompletionCR04() throws InterruptedException {
awaitReplayCompletion(5); // was 10
}
public static void awaitReplayCompletionCR02() throws InterruptedException {
awaitRecovery(1, 1);
//awaitReplayCompletion(5); // was 60
}
public static void awaitReplayCompletionCR02(int scaleFactor) throws InterruptedException {
awaitReplayCompletion(5 * scaleFactor); // was 60
}
public static void awaitReplayCompletionCR05() throws InterruptedException {
awaitRecovery(1, 1);
//awaitReplayCompletion(10); // was 60
}
public static void awaitReplayCompletionCR05(int scaleFactor) throws InterruptedException {
awaitReplayCompletion(10 * scaleFactor); // was 60
}
public static void awaitReplayCompletionCR06() throws InterruptedException {
awaitReplayCompletion(10); // was 5
}
private static void awaitReplayCompletion(int seconds) throws InterruptedException
{
Thread.sleep(getDelayFactor() * seconds * 1000);
}
public static int getDelayFactor() {
if (delayFactor < 0) {
delayFactor = arjPropertyManager.getCoreEnvironmentBean().getTimeoutFactor();
if (delayFactor <= 0)
delayFactor = 1;
System.out.printf("Using timeout delay factor of %d%n", delayFactor);
}
return delayFactor;
}
private static int delayFactor = -1;
}