/*
* Copyright 2009 Udai Gupta, Ralf Joachim
*
* Licensed 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.castor.cpa.test.test07;
import java.util.Random;
import junit.framework.Assert;
import org.exolab.castor.jdo.Database;
import org.exolab.castor.jdo.JDOManager;
import org.exolab.castor.jdo.LockNotGrantedException;
import org.exolab.castor.jdo.ObjectNotFoundException;
import org.exolab.castor.jdo.PersistenceException;
import org.exolab.castor.jdo.TransactionAbortedException;
import org.junit.Ignore;
/**
* Multiple read threads are created and continuously read the data
* objects that is modifing by the WriteThread. A read threads does
* not modify the data objects but commit the transaction. It gives
* stress to Castor JDO and intend to test if the right behavior is
* not affect by stress.
*/
@Ignore
public class ReadThread extends Thread {
private CreateDeleteThread _other;
private Database _db;
private int _trials;
private boolean _isDone;
private Random _random;
ReadThread(final TestCacheLeakage parent,
final CreateDeleteThread other,
final JDOManager jdo, final int trials) throws Exception {
_other = other;
_db = jdo.getDatabase();
_trials = trials;
_random = new Random();
}
public void run() {
boolean succeed;
int trials = 0;
try {
for (int i = 0; i < _trials && !_other.isDone(); i++) {
try {
// loads it and releases it
_db.begin();
succeed = false;
trials = 0;
while (!succeed && !_other.isDone()
&& trials < CreateDeleteThread.NUM_OF_RETRIAL) {
trials++;
try {
_db.load(TestCacheLeakage.getClassType(), Race.DEFAULT_ID,
Database.SHARED);
// may throw ObjectNotFoundException
// or LockNotGrantedException
_db.commit();
succeed = true;
} catch (LockNotGrantedException ex) {
succeed = false;
sleep(trials);
} catch (ObjectNotFoundException ex) {
succeed = false;
sleep(trials);
} catch (TransactionAbortedException ex) {
succeed = false;
sleep(trials);
}
}
if (_db.isActive()) { _db.rollback(); }
} catch (Exception ex) {
Assert.fail(ex.toString());
}
}
} finally {
_isDone = true;
try {
_db.close();
} catch (PersistenceException ex) {
Assert.fail(ex.toString());
}
}
}
private void sleep(final int trials) throws InterruptedException {
// ethernet way of retry
Thread.sleep((long) ((CreateDeleteThread.SLEEP_BASE_TIME ^ trials)
* _random.nextDouble()));
}
public boolean isDone() {
return _isDone;
}
}