You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@river.apache.org by pe...@apache.org on 2013/04/21 09:53:25 UTC
svn commit: r1470272 [2/2] - in /river/jtsk/skunk/qa_refactor/trunk: qa/
qa/src/com/sun/jini/test/impl/outrigger/leasing/
qa/src/com/sun/jini/test/share/ src/com/sun/jini/mahalo/
src/com/sun/jini/outrigger/ src/com/sun/jini/outrigger/snaplogstore/ src/...
Modified: river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/TypeTree.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/TypeTree.java?rev=1470272&r1=1470271&r2=1470272&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/TypeTree.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/TypeTree.java Sun Apr 21 07:53:23 2013
@@ -66,9 +66,14 @@ class TypeTree {
* An iterator that will walk through a list of known types.
*/
// @see #RandomizedIterator
- private abstract class TypeTreeIterator implements Iterator {
+ private static abstract class TypeTreeIterator implements Iterator {
protected int cursor; // the current position in the list
- protected Object[] typearray; // the list of types as an array
+ protected final Object[] typearray; // the list of types as an array
+
+ protected TypeTreeIterator (Object [] types){
+ cursor = 0;
+ typearray = types;
+ }
// inherit doc comment
public boolean hasNext() {
@@ -112,14 +117,13 @@ class TypeTree {
* maintains a randomized list of subtypes for the given
* <code>className</code>, including the class itself.
*/
- class RandomizedIterator extends TypeTreeIterator {
+ static class RandomizedIterator extends TypeTreeIterator {
/**
* Create a new <code>RandomizedIterator</code> for the given
* class.
*/
- RandomizedIterator(String className) {
- super();
- init(className);
+ RandomizedIterator(String className, TypeTree tree) {
+ super(init(className, tree));
}
@@ -127,12 +131,12 @@ class TypeTree {
* Traverse the given type tree and add to the list all the
* subtypes encountered within.
*/
- private void walkTree(Collection children, Collection list) {
+ private static void walkTree(Collection children, Collection list, TypeTree tree) {
if (children != null) {
list.addAll(children);
Object[] kids = children.toArray();
for (int i = 0; i< kids.length; i++) {
- walkTree(classVector((String)kids[i]), list);
+ walkTree(tree.classVector((String)kids[i]), list, tree);
}
}
}
@@ -141,9 +145,9 @@ class TypeTree {
* Set up this iterator to walk over the subtypes of this class,
* including the class itself. It then randomizes the list.
*/
- private void init(String className) {
- Collection types = new ArrayList();
-
+ private static Object [] init(String className, TypeTree tree) {
+ Collection<String> types = new ArrayList<String>();
+ Object [] typearray;
if (className.equals(EntryRep.matchAnyClassName())) {
// handle "match any" specially" -- search from ROOT
// Simplification suggested by
@@ -155,7 +159,7 @@ class TypeTree {
}
// add all subclasses
- walkTree(classVector(className), types);
+ walkTree(tree.classVector(className), types, tree);
// Convert it to an array and then randomize
typearray = types.toArray();
@@ -168,6 +172,7 @@ class TypeTree {
typearray[i] = typearray[randnum];
typearray[randnum] = tmpobj;
}
+ return typearray;
}
}
@@ -179,7 +184,7 @@ class TypeTree {
* instances of the class that named, in a random ordering.
*/
Iterator subTypes(String className) {
- return new RandomizedIterator(className);
+ return new RandomizedIterator(className, this);
}
/**
Modified: river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/WrittenEntry.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/WrittenEntry.java?rev=1470272&r1=1470271&r2=1470272&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/WrittenEntry.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/WrittenEntry.java Sun Apr 21 07:53:23 2013
@@ -40,13 +40,13 @@ package com.sun.jini.outrigger;
// @see OutriggerServerImpl#getMatch(EntryRep,Transaction,long,boolean,boolean,RemoteEventListener,long)
class WrittenEntry {
/** The time at which this entry was written. */
- private long timestamp;
+ private final long timestamp;
/** The next node in the list. */
- private WrittenEntry next;
+ private volatile WrittenEntry next;
/** The EntryRep this node refers to. */
- private EntryRep rep;
+ private final EntryRep rep;
/**
* Create a new time-stamped entry for the given EntryRep. The comment
Modified: river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/BackEnd.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/BackEnd.java?rev=1470272&r1=1470271&r2=1470272&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/BackEnd.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/BackEnd.java Sun Apr 21 07:53:23 2013
@@ -39,6 +39,9 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Observable;
import java.util.Observer;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -59,19 +62,16 @@ class BackEnd implements Observer {
// The following data represent the persistent
// state.
- private Long sessionId;
- private StoredObject joinState;
- private Map entries;
- private Map registrations;
- private Map pendingTxns;
- private byte topUuid[];
- private LastLog lastLog;
-
- /** Number of times to attempt to restart the consumer thread. */
- private int retry = 3;
+ private final AtomicLong sessionId;
+ private volatile StoredObject joinState;
+ private final Map<ByteArrayWrapper,Resource> entries;
+ private final Map<ByteArrayWrapper,Registration> registrations;
+ private final Map<Long,PendingTxn> pendingTxns;
+ private volatile byte topUuid[];
+ private volatile LastLog lastLog;
/** Snapshot object */
- private SnapshotFile snapshotFile;
+ private volatile SnapshotFile snapshotFile;
/** Keep logs and snapshot tied, though not necessary */
private final int SNAPSHOT_VERSION = LogFile.LOG_VERSION;
@@ -79,17 +79,17 @@ class BackEnd implements Observer {
/**
* The base name for the log files.
*/
- private String logFileBase;
+ private final String logFileBase;
/**
* The base name for the snapshot files
*/
- private String snapshotFileBase;
+ private final String snapshotFileBase;
/**
* Log file consumer thread.
*/
- private ConsumerThread consumer;
+ private final ConsumerThread consumer;
/** Max time to wait for the consumer thread to die on destroy */
private final static long WAIT_FOR_THREAD = 1 * TimeConstants.MINUTES;
@@ -104,6 +104,11 @@ class BackEnd implements Observer {
BackEnd(String path) {
logFileBase = new File(path, LogFile.LOG_TYPE).getAbsolutePath();
snapshotFileBase = new File(path, "Snapshot.").getAbsolutePath();
+ consumer = new ConsumerThread();
+ entries = new ConcurrentHashMap<ByteArrayWrapper,Resource>();
+ registrations = new ConcurrentHashMap<ByteArrayWrapper,Registration>();
+ pendingTxns = new ConcurrentHashMap<Long,PendingTxn>();
+ sessionId = new AtomicLong();
}
/**
@@ -206,10 +211,7 @@ class BackEnd implements Observer {
if (snapshot[0] == null) {
// no snapshot, initialize fields and return
- sessionId = null;
- entries = new HashMap();
- registrations = new HashMap();
- pendingTxns = new HashMap();
+
topUuid = null;
lastLog = null;
return;
@@ -225,11 +227,14 @@ class BackEnd implements Observer {
"Wrong file version:" + version, null);
}
- sessionId = (Long)in.readObject();
+ sessionId.set(((Long)in.readObject()).longValue());
joinState = (StoredObject)in.readObject();
- entries = (Map)in.readObject();
- registrations = (Map)in.readObject();
- pendingTxns = (Map)in.readObject();
+ entries.clear();
+ entries.putAll((Map<ByteArrayWrapper,Resource>)in.readObject());
+ registrations.clear();
+ registrations.putAll((Map<ByteArrayWrapper,Registration>)in.readObject());
+ pendingTxns.clear();
+ pendingTxns.putAll((Map)in.readObject());
topUuid = (byte[])in.readObject();
lastLog = (LastLog)in.readObject();
in.close();
@@ -244,7 +249,7 @@ class BackEnd implements Observer {
// Create and start the log consumer thread
//
- consumer = new ConsumerThread();
+
consumer.start();
}
@@ -255,7 +260,6 @@ class BackEnd implements Observer {
*/
private class ConsumerThread extends Thread {
- private boolean more = false;
volatile private boolean interrupted = false;
ConsumerThread() {}
@@ -269,23 +273,21 @@ class BackEnd implements Observer {
// to process. LogOutputFile is created after
// setup returns.
//
- synchronized(this) {
- while (!more)
- wait();
- more = false;
- }
-
- // There is a small window between the wait and
- // the consumeLogs where update can be called,
- // setting more to true and yet consumeLogs
- // actually consumes the log file that caused the
- // update. This unlikely situation is ok since
- // consumeLogs does the right thing if there are
- // no logs to process We could sync around
- // consumeLogs but we don't want LogOutputFile to
- // wait.
- //
- consumeLogs(false);
+ synchronized(this) {
+ wait();
+ }
+
+ // There is a small window between the wait and
+ // the consumeLogs where update can be called,
+ // setting more to true and yet consumeLogs
+ // actually consumes the log file that caused the
+ // update. This unlikely situation is ok since
+ // consumeLogs does the right thing if there are
+ // no logs to process We could sync around
+ // consumeLogs but we don't want LogOutputFile to
+ // wait.
+ //
+ consumeLogs(false);
}
} catch (InterruptedException exit) {}
}
@@ -293,7 +295,7 @@ class BackEnd implements Observer {
// Cause the thread to consume a log file.
//
synchronized private void update() {
- more = true; // For the case it is processing log files
+ // For the case it is processing log files
notify(); // For the case is it waiting
}
@@ -313,16 +315,8 @@ class BackEnd implements Observer {
public void update(Observable source, Object arg) {
if (!consumer.isAlive()) {
- if (retry > 0) {
- logger.log(Level.INFO,
- "Consumer thread died, attempting restart");
- retry--;
- startConsumer();
- } else {
- logger.log(Level.SEVERE,
- "Consumer thread no longer running");
- return;
- }
+ logger.log(Level.SEVERE, "Consumer thread no longer running");
+ return;
}
consumer.update();
}
@@ -410,7 +404,7 @@ class BackEnd implements Observer {
* only used during recovery after a restart.
*/
void bootOp(long time, long session) {
- sessionId = Long.valueOf(session);
+ sessionId.set(session);
if (logger.isLoggable(Level.FINE))
logger.log(Level.FINE, "bootOp({0})", new Date(time));
}
@@ -602,11 +596,12 @@ class BackEnd implements Observer {
ObjectOutputStream out = snapshotFile.next();
out.writeInt(SNAPSHOT_VERSION);
- out.writeObject(sessionId);
+ out.writeObject(sessionId.get());
out.writeObject(joinState);
- out.writeObject(entries);
- out.writeObject(registrations);
- out.writeObject(pendingTxns);
+ // Serial form of maps is HashMap, cannot be changed.
+ out.writeObject(new HashMap(entries));
+ out.writeObject(new HashMap(registrations));
+ out.writeObject(new HashMap(pendingTxns));
out.writeObject(topUuid);
out.writeObject(lastLog);
snapshotFile.commit();
@@ -629,8 +624,8 @@ class BackEnd implements Observer {
* before the file was unlinked.
*/
private static class LastLog implements Serializable {
- private String logFile;
- private long timeStamp;
+ private final String logFile;
+ private final long timeStamp;
LastLog(String path) {
logFile = path;
Modified: river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/BaseObject.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/BaseObject.java?rev=1470272&r1=1470271&r2=1470272&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/BaseObject.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/BaseObject.java Sun Apr 21 07:53:23 2013
@@ -37,7 +37,7 @@ import net.jini.space.InternalSpaceExcep
class BaseObject implements StoredObject, Serializable {
static final long serialVersionUID = -400804064969360164L;
- private byte[] blob;
+ private final byte[] blob;
BaseObject(StorableObject object) {
try {
Modified: river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/ByteArrayWrapper.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/ByteArrayWrapper.java?rev=1470272&r1=1470271&r2=1470272&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/ByteArrayWrapper.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/ByteArrayWrapper.java Sun Apr 21 07:53:23 2013
@@ -36,10 +36,10 @@ import net.jini.id.UuidFactory;
*/
class ByteArrayWrapper implements Serializable {
/** The 16 bytes being wrapped */
- private byte[] uuid;
+ private final byte[] uuid;
/** A 32 bit hash of uuid */
- private int hash;
+ private final int hash;
/**
* Create a new <code>ByteArrayWrapper</code> that
Modified: river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/LogFile.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/LogFile.java?rev=1470272&r1=1470271&r2=1470272&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/LogFile.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/LogFile.java Sun Apr 21 07:53:23 2013
@@ -46,13 +46,13 @@ class LogFile {
/**
* The directory in which the log files live.
*/
- protected File baseDir;
+ protected volatile File baseDir;
/**
* The base part of the file name (e.g., <code>"log."</code> for
* <code>"log.0"</code>, <code>"log.1"</code>, ...)
*/
- protected String baseFile;
+ protected volatile String baseFile;
/**
* The type of log stream
Modified: river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/LogInputFile.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/LogInputFile.java?rev=1470272&r1=1470271&r2=1470272&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/LogInputFile.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/LogInputFile.java Sun Apr 21 07:53:23 2013
@@ -42,7 +42,7 @@ import net.jini.space.InternalSpaceExcep
* @see LogOutputFile
*/
class LogInputFile extends LogFile {
- private File file; // the current log file
+ private final File file; // the current log file
private static final long intBytes = 4;
@@ -86,8 +86,8 @@ class LogInputFile extends LogFile {
* @see LogInputFileIterator#next
*/
private static class LogInputFileIterator implements Iterator {
- private LogFile baseLogFile;
- private Iterator fileList;
+ private final LogFile baseLogFile;
+ private final Iterator fileList;
/**
* Create a new <code>LogInputFileIterator</code> object
Modified: river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/LogOutputFile.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/LogOutputFile.java?rev=1470272&r1=1470271&r2=1470272&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/LogOutputFile.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/LogOutputFile.java Sun Apr 21 07:53:23 2013
@@ -54,20 +54,20 @@ import net.jini.space.InternalSpaceExcep
* @see java.util.Observable
*/
class LogOutputFile extends LogFile implements LogOps {
- private RandomAccessFile logFile = null;// the current output log file
- private FileDescriptor logFD; // the current log file descriptor
- private ObjectOutputStream out; // objects written
- private int suffix; // the current suffix number
- private int opCnt; // number of ops on current file
- private int maxOps; // max ops to allow in file
- private Observable observable;// handle Observer/Observable
+ private volatile RandomAccessFile logFile = null;// the current output log file
+ private volatile FileDescriptor logFD; // the current log file descriptor
+ private volatile ObjectOutputStream out; // objects written
+ private volatile int suffix; // the current suffix number
+ private volatile int opCnt; // number of ops on current file
+ private volatile int maxOps; // max ops to allow in file
+ private volatile Observable observable;// handle Observer/Observable
- private long logBytes = 0;
+ private volatile long logBytes = 0;
private final byte[] intBuf = new byte[4];
private final byte[] zeroBuf = new byte[4];
- private long deferedUpdateLength = 0;
- private long deferedPosition = 0;
+ private volatile long deferedUpdateLength = 0;
+ private volatile long deferedPosition = 0;
private static final long intBytes = 4;
Modified: river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/LogOutputStream.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/LogOutputStream.java?rev=1470272&r1=1470271&r2=1470272&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/LogOutputStream.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/LogOutputStream.java Sun Apr 21 07:53:23 2013
@@ -34,7 +34,7 @@ import java.io.RandomAccessFile;
*/
public class LogOutputStream extends OutputStream {
- private RandomAccessFile raf;
+ private final RandomAccessFile raf;
/**
* Creates an output file with the specified <code>RandomAccessFile</code>
Modified: river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/LogStore.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/LogStore.java?rev=1470272&r1=1470271&r2=1470272&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/LogStore.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/LogStore.java Sun Apr 21 07:53:23 2013
@@ -39,10 +39,10 @@ import net.jini.space.InternalSpaceExcep
* @see com.sun.jini.outrigger.OutriggerServerImpl
*/
public class LogStore implements Store {
- private LogOutputFile log;
+ private volatile LogOutputFile log;
private final String path;
- private BackEnd be;
- private int maxOps;
+ private final BackEnd be;
+ private final int maxOps;
/** Logger for logging persistent store related information */
private static final Logger logger =
Modified: river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/PendingTxn.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/PendingTxn.java?rev=1470272&r1=1470271&r2=1470272&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/PendingTxn.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/PendingTxn.java Sun Apr 21 07:53:23 2013
@@ -51,7 +51,7 @@ class PendingTxn implements Serializable
/** An object that represents a pending write. */
static class WriteOp extends PendingOp implements Serializable {
- Resource entry;
+ final Resource entry;
WriteOp(Resource entry) {
this.entry = entry;
@@ -64,7 +64,7 @@ class PendingTxn implements Serializable
/** An object that represents a pending take. */
static class TakeOp extends PendingOp implements Serializable {
- byte cookie[];
+ final byte cookie[];
TakeOp(byte cookie[]) {
this.cookie = cookie;
@@ -75,10 +75,10 @@ class PendingTxn implements Serializable
}
}
- private long id; // the transaction ID
- private int state; // current state
- private Hashtable ops; // list of pending operations
- private StoredObject transaction; // the transaction object
+ private final long id; // the transaction ID
+ private volatile int state; // current state
+ private final Hashtable ops; // list of pending operations
+ private volatile StoredObject transaction; // the transaction object
// itself
/**
* Create a new <code>PendingTxn</code> for the given <code>id</code>.
Modified: river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/Registration.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/Registration.java?rev=1470272&r1=1470271&r2=1470272&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/Registration.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/Registration.java Sun Apr 21 07:53:23 2013
@@ -27,9 +27,9 @@ import com.sun.jini.outrigger.StorableRe
class Registration extends Resource {
static final long serialVersionUID = 2L;
- private BaseObject[] templates;
+ private final BaseObject[] templates;
- private String type;
+ private final String type;
Registration(StorableResource chit, String type, StorableObject[] ts) {
super(chit);
Modified: river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/Resource.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/Resource.java?rev=1470272&r1=1470271&r2=1470272&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/Resource.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/Resource.java Sun Apr 21 07:53:23 2013
@@ -34,8 +34,8 @@ import java.util.Arrays;
class Resource extends BaseObject implements StoredResource {
static final long serialVersionUID = -4248052947306243840L;
- private byte[] cookie;
- private long expiration;
+ private final byte[] cookie;
+ private volatile long expiration;
Resource(StorableResource resource) {
super(resource);
Modified: river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/SnapshotFile.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/SnapshotFile.java?rev=1470272&r1=1470271&r2=1470272&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/SnapshotFile.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/outrigger/snaplogstore/SnapshotFile.java Sun Apr 21 07:53:23 2013
@@ -35,11 +35,11 @@ import net.jini.space.InternalSpaceExcep
* @author Sun Microsystems, Inc.
*/
class SnapshotFile extends LogFile {
- private RandomAccessFile snapshotFile = null;// current snapshot file
- private String fileName = null; // current snapshot file name
- private String previousFilename = null; // previous snapshot
- private ObjectOutputStream out; // current snapshot stream
- private int suffix; // the current suffix number
+ private volatile RandomAccessFile snapshotFile = null;// current snapshot file
+ private volatile String fileName = null; // current snapshot file name
+ private volatile String previousFilename = null; // previous snapshot
+ private volatile ObjectOutputStream out; // current snapshot stream
+ private volatile int suffix; // the current suffix number
/** Logger for logging persistent store related information */
private static final Logger logger =
Modified: river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/thread/RetryTask.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/thread/RetryTask.java?rev=1470272&r1=1470271&r2=1470272&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/thread/RetryTask.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/thread/RetryTask.java Sun Apr 21 07:53:23 2013
@@ -62,16 +62,17 @@ import com.sun.jini.constants.TimeConsta
* @see WakeupManager
*/
import com.sun.jini.thread.WakeupManager.Ticket;
+import java.util.concurrent.atomic.AtomicInteger;
public abstract class RetryTask implements TaskManager.Task, TimeConstants {
private final TaskManager manager; // the TaskManager for this task
- private RetryTime retry; // the retry object for this task
- private boolean cancelled; // have we been cancelled?
- private boolean complete; // have we completed successfully?
- private Ticket ticket; // the WakeupManager ticket
- private long startTime; // the time when we were created or
+ private volatile RetryTime retry; // the retry object for this task
+ private volatile boolean cancelled; // have we been cancelled?
+ private volatile boolean complete; // have we completed successfully?
+ private volatile Ticket ticket; // the WakeupManager ticket
+ private volatile long startTime; // the time when we were created or
// last reset
- private int attempt; // the current attempt number
+ private final AtomicInteger attempt; // the current attempt number
private final WakeupManager wakeup; // WakeupManager for retry scheduling
/**
@@ -102,6 +103,7 @@ public abstract class RetryTask implemen
public RetryTask(TaskManager manager, WakeupManager wakeupManager) {
this.manager = manager;
this.wakeup = wakeupManager;
+ attempt = new AtomicInteger();
reset();
}
@@ -122,11 +124,9 @@ public abstract class RetryTask implemen
* @see #tryOnce
* @see #startTime
*/
- public void run() {
- synchronized (this) { // avoid retry if cancelled
- if (cancelled) // if they cancelled
- return; // do nothing
- }
+ public void run() { // avoid retry if cancelled
+ if (cancelled) return; // do nothing
+
boolean success = false;
try {
@@ -136,26 +136,29 @@ public abstract class RetryTask implemen
if (t instanceof Error) throw (Error) t;
if (t instanceof RuntimeException) throw (RuntimeException) t;
}
-
- synchronized (this) {
- if (!success) { // if at first we don't succeed ...
- attempt++;
- long at = retryTime(); // ... try, try again
-
- if (logger.isLoggable(Level.FINEST)) {
- logger.log(Level.FINEST, "retry of {0} in {1} ms",
- new Object[]{this,
- Long.valueOf(at - System.currentTimeMillis())});
- }
-
- if (retry == null) // only create it if we need to
- retry = new RetryTime();
- ticket = wakeup.schedule(at, retry);
- } else {
- complete = true;
- notifyAll(); // see waitFor()
- }
- }
+ if (!success) { // if at first we don't succeed ...
+ attempt.incrementAndGet();
+ long at = retryTime(); // ... try, try again
+
+ if (logger.isLoggable(Level.FINEST)) {
+ logger.log(Level.FINEST, "retry of {0} in {1} ms",
+ new Object[]{this,
+ Long.valueOf(at - System.currentTimeMillis())});
+ }
+
+ if (retry == null) // only create it if we need to
+ retry = new RetryTime();
+ ticket = wakeup.schedule(at, retry);
+ } else {
+ complete = true;
+ // Notify was here, however I noticed that during some tests,
+ // the wakeup manager task was scheduled after cancelling.
+ synchronized (this){
+ notifyAll();
+ } // see waitFor()
+ }
+
+
}
/**
@@ -173,7 +176,8 @@ public abstract class RetryTask implemen
* not own the lock the result is undefined and could result in an
* exception.
*/
- public synchronized long retryTime() {
+ public long retryTime() {
+ int attempt = this.attempt.get();
int index = (attempt < delays.length ? attempt : delays.length - 1);
return delays[index] + System.currentTimeMillis();
}
@@ -182,15 +186,15 @@ public abstract class RetryTask implemen
* Return the time this task was created, or the last
* time {@link #reset reset} was called.
*/
- public synchronized long startTime() {
+ public long startTime() {
return startTime;
}
/**
* Return the attempt number, starting with zero.
*/
- public synchronized int attempt() {
- return attempt;
+ public int attempt() {
+ return attempt.get();
}
/**
@@ -200,17 +204,19 @@ public abstract class RetryTask implemen
* unless a subclass overrides this to do so. Any override of this
* method should invoke <code>super.cancel()</code>.
*/
- public synchronized void cancel() {
+ public void cancel() {
cancelled = true;
- if (ticket != null)
- wakeup.cancel(ticket);
- notifyAll(); // see waitFor()
+ Ticket ticket = this.ticket;
+ if (ticket != null) wakeup.cancel(ticket);
+ synchronized (this) {
+ notifyAll(); // see waitFor()
+ }
}
/**
* Return <code>true</code> if <code>cancel</code> has been invoked.
*/
- public synchronized boolean cancelled() {
+ public boolean cancelled() {
return cancelled;
}
@@ -218,26 +224,30 @@ public abstract class RetryTask implemen
* Return <code>true</code> if <code>tryOnce</code> has returned
* successfully.
*/
- public synchronized boolean complete() {
+ public boolean complete() {
return complete;
}
- public synchronized boolean waitFor() throws InterruptedException {
- while (!cancelled && !complete)
- wait();
- return complete;
+ public boolean waitFor() throws InterruptedException {
+
+ while (!cancelled && !complete)
+ synchronized (this){
+ wait();
+ }
+ return complete;
+
}
/**
* Reset values for a new use of this task.
*/
- public synchronized void reset() {
+ public void reset() {
cancel(); // remove from the wakeup queue
startTime = System.currentTimeMillis();
cancelled = false;
complete = false;
ticket = null;
- attempt = 0;
+ attempt.set(0);
}
/**
@@ -251,9 +261,7 @@ public abstract class RetryTask implemen
* Time to retry the task.
*/
public void run() {
- synchronized (RetryTask.this) {
- ticket = null;
- }
+ ticket = null;
manager.add(RetryTask.this);
}
};
Modified: river/jtsk/skunk/qa_refactor/trunk/src/net/jini/core/transaction/TransactionException.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/net/jini/core/transaction/TransactionException.java?rev=1470272&r1=1470271&r2=1470272&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/src/net/jini/core/transaction/TransactionException.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/src/net/jini/core/transaction/TransactionException.java Sun Apr 21 07:53:23 2013
@@ -41,4 +41,8 @@ public class TransactionException extend
public TransactionException() {
super();
}
+
+ public TransactionException(String desc, Throwable cause){
+ super(desc, cause);
+ }
}
Modified: river/jtsk/skunk/qa_refactor/trunk/src/net/jini/core/transaction/UnknownTransactionException.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/net/jini/core/transaction/UnknownTransactionException.java?rev=1470272&r1=1470271&r2=1470272&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/src/net/jini/core/transaction/UnknownTransactionException.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/src/net/jini/core/transaction/UnknownTransactionException.java Sun Apr 21 07:53:23 2013
@@ -45,4 +45,8 @@ public class UnknownTransactionException
public UnknownTransactionException() {
super();
}
+
+ public UnknownTransactionException(String desc, Throwable cause){
+ super(desc, cause);
+ }
}