ozeigermann 2004/04/08 03:31:08
Modified: src/stores/org/apache/slide/store/txfile
XMLResourceDescriptor.java
TxXMLFileDescriptorsStore.java
Log:
Speedup:
Step #1 to reduce file access in file store. This effects reading, not writing.
Writing will be step #2.
Revision Changes Path
1.10 +15 -36
jakarta-slide/src/stores/org/apache/slide/store/txfile/XMLResourceDescriptor.java
Index: XMLResourceDescriptor.java
===================================================================
RCS file:
/home/cvs/jakarta-slide/src/stores/org/apache/slide/store/txfile/XMLResourceDescriptor.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- XMLResourceDescriptor.java 26 Feb 2004 15:45:55 -0000 1.9
+++ XMLResourceDescriptor.java 8 Apr 2004 10:31:08 -0000 1.10
@@ -71,6 +71,7 @@
protected final String loadPath;
protected StoreLogger logger;
protected SimpleDateFormat dateFormat;
+ protected boolean registeredForSaving = false;
/** Stored object.*/
protected ObjectNode object;
@@ -318,26 +319,6 @@
*/
public void storeObject(ObjectNode aObject) throws ServiceAccessException,
ObjectNotFoundException {
object = aObject.cloneObject();
- save();
- }
-
- /**
- * Create a new object in the Descriptors Store.
- *
- * @param object SlideObject
- * @exception ServiceAccessException Error accessing the Descriptors Store
- * @exception ObjectAlreadyExistsException An object already exists
- * at this Uri
- */
- public void createObject(ObjectNode aObject) throws ServiceAccessException,
ObjectAlreadyExistsException {
- try {
- if (object.getUri().equals(uri.toString())) {
- throw new ObjectAlreadyExistsException(uri.toString());
- }
- storeObject(aObject);
- } catch (ObjectNotFoundException e) {
- // Never happens
- }
}
/**
@@ -361,7 +342,6 @@
if (permissions == null)
permissions = new Vector();
permissions.addElement(permission.cloneObject());
- save();
}
/**
@@ -373,7 +353,6 @@
public void revokePermission(NodePermission permission) throws
ObjectNotFoundException, ServiceAccessException {
if (permissions != null)
permissions.removeElement(permission);
- save();
}
/**
@@ -385,7 +364,6 @@
public void revokePermissions() throws ObjectNotFoundException,
ServiceAccessException {
if (permissions != null)
permissions.removeAllElements();
- save();
}
/**
@@ -410,7 +388,6 @@
if (locks == null)
locks = new Vector();
locks.addElement(lock.cloneObject());
- save();
}
/**
@@ -428,7 +405,6 @@
throw new LockTokenNotFoundException(lock);
}
locks.addElement(lock.cloneObject());
- save();
}
/**
@@ -447,7 +423,6 @@
if (!wasPresent) {
throw new LockTokenNotFoundException(lock);
}
- save();
}
/**
@@ -487,7 +462,6 @@
public void createRevisionDescriptors(NodeRevisionDescriptors
aRevisionDescriptors)
throws ObjectNotFoundException, ServiceAccessException {
revisionDescriptors = aRevisionDescriptors.cloneObject();
- save();
}
/**
@@ -504,7 +478,6 @@
throw new RevisionDescriptorNotFoundException(uri.toString());
}
revisionDescriptors = aRevisionDescriptors.cloneObject();
- save();
}
/**
@@ -514,7 +487,6 @@
*/
public void removeRevisionDescriptors() throws ObjectNotFoundException,
ServiceAccessException {
revisionDescriptors = null;
- save();
}
/**
@@ -547,7 +519,6 @@
descriptor = new Hashtable();
descriptor.put(aRevisionDescriptor.getRevisionNumber().toString(),
aRevisionDescriptor.cloneObject());
- save();
}
/**
@@ -565,7 +536,6 @@
throw new RevisionDescriptorNotFoundException(uri.toString());
}
descriptor.put(key, aRevisionDescriptor.cloneObject());
- save();
}
/**
@@ -579,7 +549,6 @@
return;
descriptor.remove(number.toString());
- save();
}
// -------------- PART TAKE OVER FROM AbstractUriProperties END --------------
@@ -616,6 +585,14 @@
}
}
+ public void registerForSaving() {
+ registeredForSaving = true;
+ }
+
+ public boolean isRegisteredForSaving() {
+ return registeredForSaving;
+ }
+
/**
* Creates this descriptor in the resource manager.
*
@@ -773,7 +750,9 @@
object = null;
permissions = new Vector();
locks = new Vector();
- revisionDescriptors = new NodeRevisionDescriptors();
+ revisionDescriptors =
+ new NodeRevisionDescriptors(uri, null, new Hashtable(), new
Hashtable(), new Hashtable(), false);
+
descriptor = new Hashtable();
}
1.9 +113 -6
jakarta-slide/src/stores/org/apache/slide/store/txfile/TxXMLFileDescriptorsStore.java
Index: TxXMLFileDescriptorsStore.java
===================================================================
RCS file:
/home/cvs/jakarta-slide/src/stores/org/apache/slide/store/txfile/TxXMLFileDescriptorsStore.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- TxXMLFileDescriptorsStore.java 26 Feb 2004 15:28:20 -0000 1.8
+++ TxXMLFileDescriptorsStore.java 8 Apr 2004 10:31:08 -0000 1.9
@@ -25,14 +25,23 @@
import org.apache.slide.common.*;
import org.apache.slide.store.*;
+import org.apache.slide.store.txfile.rm.ResourceManagerException;
import org.apache.slide.structure.*;
import org.apache.slide.security.*;
+import org.apache.slide.util.XidWrapper;
+import org.apache.slide.util.logger.Logger;
import org.apache.slide.lock.*;
import org.apache.slide.content.*;
+import java.util.Collection;
import java.util.Enumeration;
+import java.util.HashMap;
import java.util.Hashtable;
+import java.util.Map;
+
+import javax.transaction.xa.XAException;
+import javax.transaction.xa.Xid;
/**
* Transactional descriptors file store.
@@ -80,6 +89,7 @@
public void storeObject(Uri uri, ObjectNode object) throws
ServiceAccessException, ObjectNotFoundException {
XMLResourceDescriptor xfd = getFileDescriptor(uri);
xfd.storeObject(object);
+ xfd.save();
}
public void createObject(Uri uri, ObjectNode object) throws
ServiceAccessException, ObjectAlreadyExistsException {
@@ -87,6 +97,7 @@
XMLResourceDescriptor xfd = getFileDescriptor(uri);
xfd.create();
xfd.storeObject(object);
+ xfd.save();
} catch (ObjectNotFoundException e) {
// should not happen, if it does, it is an error inside this store:
throwInternalError("Newly created file vanished");
@@ -108,6 +119,7 @@
try {
XMLResourceDescriptor xfd = getFileDescriptor(uri);
xfd.grantPermission(permission);
+ xfd.save();
} catch (ObjectNotFoundException e) {
throwInternalError(e);
}
@@ -117,6 +129,7 @@
try {
XMLResourceDescriptor xfd = getFileDescriptor(uri);
xfd.revokePermission(permission);
+ xfd.save();
} catch (ObjectNotFoundException e) {
throwInternalError(e);
}
@@ -126,6 +139,7 @@
try {
XMLResourceDescriptor xfd = getFileDescriptor(uri);
xfd.revokePermissions();
+ xfd.save();
} catch (ObjectNotFoundException e) {
throwInternalError(e);
}
@@ -151,6 +165,7 @@
try {
XMLResourceDescriptor xfd = getFileDescriptor(uri);
xfd.putLock(lock);
+ xfd.save();
} catch (ObjectNotFoundException e) {
throwInternalError(e);
}
@@ -160,6 +175,7 @@
try {
XMLResourceDescriptor xfd = getFileDescriptor(uri);
xfd.renewLock(lock);
+ xfd.save();
} catch (ObjectNotFoundException e) {
throwInternalError(e);
}
@@ -169,6 +185,7 @@
try {
XMLResourceDescriptor xfd = getFileDescriptor(uri);
xfd.removeLock(lock);
+ xfd.save();
} catch (ObjectNotFoundException e) {
throw new LockTokenNotFoundException(lock);
}
@@ -209,6 +226,7 @@
try {
XMLResourceDescriptor xfd = getFileDescriptor(uri);
xfd.createRevisionDescriptors(revisionDescriptors);
+ xfd.save();
} catch (ObjectNotFoundException e) {
throwInternalError(e);
}
@@ -219,6 +237,7 @@
try {
XMLResourceDescriptor xfd = getFileDescriptor(uri);
xfd.storeRevisionDescriptors(revisionDescriptors);
+ xfd.save();
} catch (ObjectNotFoundException e) {
throw new RevisionDescriptorNotFoundException(uri.toString());
}
@@ -228,6 +247,7 @@
try {
XMLResourceDescriptor xfd = getFileDescriptor(uri);
xfd.removeRevisionDescriptors();
+ xfd.save();
} catch (ObjectNotFoundException e) {
throwInternalError(e);
}
@@ -254,6 +274,7 @@
try {
XMLResourceDescriptor xfd = getFileDescriptor(uri);
xfd.createRevisionDescriptor(revisionDescriptor);
+ xfd.save();
} catch (ObjectNotFoundException e) {
throwInternalError(e);
}
@@ -264,6 +285,7 @@
try {
XMLResourceDescriptor xfd = getFileDescriptor(uri);
xfd.storeRevisionDescriptor(revisionDescriptor);
+ xfd.save();
} catch (ObjectNotFoundException e) {
throw new RevisionDescriptorNotFoundException(uri.toString());
}
@@ -273,6 +295,7 @@
try {
XMLResourceDescriptor xfd = getFileDescriptor(uri);
xfd.removeRevisionDescriptor(number);
+ xfd.save();
} catch (ObjectNotFoundException e) {
throwInternalError(e);
}
@@ -282,6 +305,56 @@
return "TxXMLFileDescriptorsStore at " + storeDir + " working on " +
workDir;
}
+ public synchronized void start(Xid xid, int flags) throws XAException {
+ Xid txId = XidWrapper.wrap(xid);
+ getLogger().log(
+ "Thread "
+ + Thread.currentThread()
+ + " starts work on behalf of transaction branch "
+ + txId
+ + " with flags "
+ + flags,
+ LOG_CHANNEL,
+ Logger.DEBUG);
+
+ switch (flags) {
+ // a new transaction
+ case TMNOFLAGS :
+ getLogger().log("Starting new transaction branch", LOG_CHANNEL,
Logger.DEBUG);
+ if (getActiveTxId() != null) {
+ throw new XAException(XAException.XAER_INVAL);
+ }
+ try {
+ rm.startTransaction(txId);
+ TxContext txContext = new TxContext(txId);
+ activeTransactionBranch.set(txContext);
+ } catch (ResourceManagerException e) {
+ throwXAException(e);
+ }
+ break;
+ case TMJOIN :
+ getLogger().log("Thread of control joins known transaction branch",
LOG_CHANNEL, Logger.DEBUG);
+ if (getActiveTxId() != null) {
+ throw new XAException(XAException.XAER_INVAL);
+ }
+ try {
+ if (rm.getTransactionState(txId) == STATUS_NO_TRANSACTION) {
+ throw new XAException(XAException.XAER_INVAL);
+ }
+ } catch (ResourceManagerException e) {
+ throwXAException(e);
+ }
+ TxContext txContext = new TxContext(txId);
+ activeTransactionBranch.set(txContext);
+ activeTransactionBranch.set(txId);
+ break;
+ case TMRESUME :
+ getLogger().log("Thread of control resume work on known transaction
branch", LOG_CHANNEL, Logger.DEBUG);
+ // XXX we do not suspend, so we do not resume
+ break;
+ }
+ }
+
/*
* --- XMLFileDescriptor access and caching methods ---
*
@@ -292,8 +365,42 @@
* Either returns a cached file descriptor or loads it from DB
*/
protected XMLResourceDescriptor getFileDescriptor(Uri uri) throws
ServiceAccessException, ObjectNotFoundException {
- Object txId = getActiveTxId();
- XMLResourceDescriptor xfd = new XMLResourceDescriptor(uri, this, rm, txId,
characterEncoding);
+ TxContext txContext = (TxContext) getActiveTxId();
+ XMLResourceDescriptor xfd;
+ if (txContext != null) {
+ xfd = txContext.lookup(uri);
+ if (xfd == null) {
+ Object txId = txContext.xid;
+ xfd = new XMLResourceDescriptor(uri, this, rm, txId,
characterEncoding);
+ if (txId != null) {
+ txContext.register(uri, xfd);
+ }
+ }
+ } else {
+ xfd = new XMLResourceDescriptor(uri, this, rm, null, characterEncoding);
+ }
return xfd;
}
-}
\ No newline at end of file
+
+ private static class TxContext {
+ public Xid xid;
+ public Map descriptors = new HashMap();
+
+ public TxContext(Xid xid) {
+ this.xid = xid;
+ }
+
+ public void register(Uri uri, XMLResourceDescriptor xfd) {
+ descriptors.put(uri, xfd);
+ }
+
+ public XMLResourceDescriptor lookup(Uri uri) {
+ return (XMLResourceDescriptor) descriptors.get(uri);
+ }
+
+ public Collection list() {
+ return descriptors.values();
+ }
+
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]