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]

Reply via email to