You are viewing a plain text version of this content. The canonical link for it is here.
Posted to slide-dev@jakarta.apache.org by re...@apache.org on 2001/08/30 16:56:58 UTC
cvs commit: jakarta-slide/src/share/org/apache/slide/store AbstractStore.java
remm 01/08/30 07:56:58
Modified: src/share/org/apache/slide/store AbstractStore.java
Log:
- Add a new flag in the SlideToken, called 'ForceStoreEnlistment', which can
be used to tell Slide to always enlist the store on every operation (incl reads).
Of course, that will have a huge impact on performance, so it is only to be
used in some critical code sections (where it is very important to avoid
dirty reads).
- Untested at the moment, but portions of the WebDAV servlet will be modified
to use that feature.
- There's a problem with the Uri cache and this. Either the Uri will have to be
fast cloned, and / or the mapping algorithm should be rewritten to something
efficient.
Revision Changes Path
1.18 +127 -16 jakarta-slide/src/share/org/apache/slide/store/AbstractStore.java
Index: AbstractStore.java
===================================================================
RCS file: /home/cvs/jakarta-slide/src/share/org/apache/slide/store/AbstractStore.java,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- AbstractStore.java 2001/07/25 18:07:41 1.17
+++ AbstractStore.java 2001/08/30 14:56:57 1.18
@@ -1,7 +1,7 @@
/*
- * $Header: /home/cvs/jakarta-slide/src/share/org/apache/slide/store/AbstractStore.java,v 1.17 2001/07/25 18:07:41 dirkv Exp $
- * $Revision: 1.17 $
- * $Date: 2001/07/25 18:07:41 $
+ * $Header: /home/cvs/jakarta-slide/src/share/org/apache/slide/store/AbstractStore.java,v 1.18 2001/08/30 14:56:57 remm Exp $
+ * $Revision: 1.18 $
+ * $Date: 2001/08/30 14:56:57 $
*
* ====================================================================
*
@@ -89,7 +89,7 @@
* Abstract implementation of a store. Handles all caching operations.
*
* @author <a href="mailto:remm@apache.org">Remy Maucherat</a>
- * @version $Revision: 1.17 $
+ * @version $Revision: 1.18 $
*/
public abstract class AbstractStore extends AbstractSimpleService
implements Store {
@@ -486,7 +486,24 @@
*/
public ObjectNode retrieveObject(Uri uri)
throws ServiceAccessException, ObjectNotFoundException {
- ObjectNode objectNode = nodeStore.retrieveObject(uri);
+ ObjectNode objectNode = null;
+ if (isForceStoreEnlistment(uri)) {
+ enlist(nodeStore);
+ try {
+ objectNode = nodeStore.retrieveObject(uri);
+ } catch (ServiceAccessException e) {
+ delist(nodeStore, false);
+ throw e;
+ } catch (ObjectNotFoundException e) {
+ // Note : Failed reads aren't considered fatal (ie, the
+ // transaction won't be always rolledback when committed)
+ delist(nodeStore);
+ throw e;
+ }
+ delist(nodeStore);
+ } else {
+ objectNode = nodeStore.retrieveObject(uri);
+ }
objectNode.validate(uri.toString());
return objectNode;
}
@@ -637,7 +654,20 @@
public Enumeration enumeratePermissions(Uri uri)
throws ServiceAccessException {
// TODO : The vectors elements MUST be cloned
- return securityStore.enumeratePermissions(uri);
+ if (isForceStoreEnlistment(uri)) {
+ enlist(securityStore);
+ Enumeration permissions = null;
+ try {
+ permissions = securityStore.enumeratePermissions(uri);
+ } catch (ServiceAccessException e) {
+ delist(securityStore, false);
+ throw e;
+ }
+ delist(securityStore);
+ return permissions;
+ } else {
+ return securityStore.enumeratePermissions(uri);
+ }
}
@@ -742,7 +772,20 @@
*/
public Enumeration enumerateLocks(Uri uri)
throws ServiceAccessException {
- return lockStore.enumerateLocks(uri);
+ if (isForceStoreEnlistment(uri)) {
+ enlist(lockStore);
+ Enumeration locks = null;
+ try {
+ locks = lockStore.enumerateLocks(uri);
+ } catch (ServiceAccessException e) {
+ delist(lockStore, false);
+ throw e;
+ }
+ delist(lockStore);
+ return locks;
+ } else {
+ return lockStore.enumerateLocks(uri);
+ }
}
@@ -756,10 +799,27 @@
*/
public NodeRevisionDescriptors retrieveRevisionDescriptors(Uri uri)
throws ServiceAccessException, RevisionDescriptorNotFoundException {
- NodeRevisionDescriptors tempDescriptors =
- revisionDescriptorsStore.retrieveRevisionDescriptors(uri);
- tempDescriptors.validate(uri.toString());
- return tempDescriptors;
+ NodeRevisionDescriptors revisionDescriptors = null;
+ if (isForceStoreEnlistment(uri)) {
+ enlist(revisionDescriptorsStore);
+ try {
+ revisionDescriptors =
+ revisionDescriptorsStore.retrieveRevisionDescriptors(uri);
+ } catch (ServiceAccessException e) {
+ delist(revisionDescriptorsStore, false);
+ throw e;
+ } catch (RevisionDescriptorNotFoundException e) {
+ // Normal read failures aren't considered fatal
+ delist(revisionDescriptorsStore);
+ throw e;
+ }
+ delist(revisionDescriptorsStore);
+ } else {
+ revisionDescriptors =
+ revisionDescriptorsStore.retrieveRevisionDescriptors(uri);
+ }
+ revisionDescriptors.validate(uri.toString());
+ return revisionDescriptors;
}
@@ -842,9 +902,27 @@
public NodeRevisionDescriptor retrieveRevisionDescriptor
(Uri uri, NodeRevisionNumber revisionNumber)
throws ServiceAccessException, RevisionDescriptorNotFoundException {
- NodeRevisionDescriptor revisionDescriptor =
- revisionDescriptorStore.retrieveRevisionDescriptor
- (uri, revisionNumber);
+ NodeRevisionDescriptor revisionDescriptor = null;
+ if (isForceStoreEnlistment(uri)) {
+ enlist(revisionDescriptorsStore);
+ try {
+ revisionDescriptor =
+ revisionDescriptorStore.retrieveRevisionDescriptor
+ (uri, revisionNumber);
+ } catch (ServiceAccessException e) {
+ delist(revisionDescriptorsStore, false);
+ throw e;
+ } catch (RevisionDescriptorNotFoundException e) {
+ // Normal read failures aren't considered fatal
+ delist(revisionDescriptorsStore);
+ throw e;
+ }
+ delist(revisionDescriptorsStore);
+ } else {
+ revisionDescriptor =
+ revisionDescriptorStore.retrieveRevisionDescriptor
+ (uri, revisionNumber);
+ }
revisionDescriptor.validate();
return revisionDescriptor;
}
@@ -931,8 +1009,26 @@
public NodeRevisionContent retrieveRevisionContent
(Uri uri, NodeRevisionDescriptor revisionDescriptor)
throws ServiceAccessException, RevisionNotFoundException {
- NodeRevisionContent revisionContent =
- contentStore.retrieveRevisionContent(uri, revisionDescriptor);
+ NodeRevisionContent revisionContent = null;
+ if (isForceStoreEnlistment(uri)) {
+ enlist(contentStore);
+ try {
+ revisionContent =
+ contentStore.retrieveRevisionContent
+ (uri, revisionDescriptor);
+ } catch (ServiceAccessException e) {
+ delist(contentStore, false);
+ throw e;
+ } catch (RevisionNotFoundException e) {
+ // Normal read failures aren't considered fatal
+ delist(contentStore);
+ throw e;
+ }
+ delist(contentStore);
+ } else {
+ revisionContent =
+ contentStore.retrieveRevisionContent(uri, revisionDescriptor);
+ }
revisionContent.validate();
return revisionContent;
}
@@ -1016,6 +1112,21 @@
// ------------------------------------------------------ Protected Methods
+
+
+ /**
+ * Return true if the store should also be enlisted for a read operation.
+ */
+ protected boolean isForceStoreEnlistment(Uri uri) {
+
+ SlideToken token = uri.getToken();
+
+ if (token == null)
+ return false;
+
+ return token.isForceStoreEnlistment();
+
+ }
/**