Bert, Philip, This may still be a bit rough, but your comments and questions would be much appreciated.
-Hyrum On Nov 30, 2009, at 3:07 PM, hwri...@apache.org wrote: > Author: hwright > Date: Mon Nov 30 21:07:51 2009 > New Revision: 885583 > > URL: http://svn.apache.org/viewvc?rev=885583&view=rev > Log: > Add some thoughts about working copy locking in wc-ng. > > * notes/wc-ng/locking: > New. > > Added: > subversion/trunk/notes/wc-ng/locking (with props) > > Added: subversion/trunk/notes/wc-ng/locking > URL: > http://svn.apache.org/viewvc/subversion/trunk/notes/wc-ng/locking?rev=885583&view=auto > ============================================================================== > --- subversion/trunk/notes/wc-ng/locking (added) > +++ subversion/trunk/notes/wc-ng/locking Mon Nov 30 21:07:51 2009 > @@ -0,0 +1,115 @@ > + -*- Text -*- > + > + > +Introduction > +============ > +One of the major performance problems with the first-generation working copy > +library was the locking strategy. Each directory could have a write or read > +lock, which excluded other processes from performing certain actions on > +that directory. > + > +The locks were implemented as physical `lock' files which had to be placed > and > +removed in the administrative area of each directory. For many operations, > +this necessitated a crawl of the working copy to lock or unlock various > +directories, even if those directories would never be touched by the > operation. > +For working copies of even modest size, these crawls could easily dominate > the > +running time of the client, and were made even worse by high-latency > +filesystems, such as NFS. > + > +By centralizing the working copy metadata as part of wc-ng, we can also > +centralize our locking strategy and take advantage of the transaction and > +locking primitives of the underlying sqlite database, while still maintaining > +backward compatibility. This document describes the proposed implementation > +guidelines for working copy locking in wc-ng. > + > + > +Overview > +======== > +Even with the addition of SQLite and its locking and transaction > +capabilities, there are still instances where we will need to maintain our > +own locks on the working copy. It is expected, though, that these > +occasions are much fewer than in the old working copy library. > + > +This document deals specifically with write locks, which prevent multiple > +processes from concurrently writing to the working copy metadata. The > +sqlite transaction mechanism is used to ensure that the database is kept > +consistent between calls to wc_db APIs. Thus, all readers at whatever point > +they read the database will be shown a consistent view of the metadata, so > +read locks are not needed for wc-ng. > + > + > +Types of Locks > +============== > +There are two type of locks in the working copy: logical and explicit. > +Logical locks are what API consumers are referring to when they ask "is PATH > +locked?" Explicit locks are the actual artifacts that are persisted which > +the wc_db APIs can use to deduce logical locks. In wc-1, logical and > explicit > +locks were the same, but wc-ng adds the notion of lock inheritance, allowing > +a single explicit lock to logically lock an entire subtree. > + > + > +How Locks are Stored > +==================== > +As of working copy format 15, locks are currently indicated as row in the > +WC_LOCK table in the sqlite database. This table has the following schema: > + > + CREATE TABLE WC_LOCK ( > + /* specifies the location of this node in the local filesystem */ > + wc_id INTEGER NOT NULL REFERENCES WCROOT (id), > + local_dir_relpath TEXT NOT NULL, > + > + PRIMARY KEY (wc_id, local_dir_relpath) > + ); > + > +[ It is anticipated that future versions of the schema will add a > LOCKED_LEVELS > + column, so that column will be described below. ] > + > +An entry in the WC_LOCK table is equivalent to an explicit lock, and must > +exist prior to several wc_db APIs which require persistent write access. In > +order to accommodate backward compatibility, the LOCKED_LEVELS column can be > +used to limit the depth of the logical lock specified by the explicit lock. > +If the value is zero or positive, that number of directories below > +LOCAL_DIR_RELPATH at to be locked. It is anticipated that this column will > be > +'-1' (lock to infinite depth) for all locks created through the wc_db APIs. > + > + > +Using Locks > +=========== > +There are two kinds of operations which in wc_db APIs that need different > kinds > +of write checks: > + > +Atomic Operations > +----------------- > +WC-NG operations that can operate without outside knowledge learned before > +the operation. > + > +These functions that are just one sqlite transaction by itself, just need to > +make sure nobody else has a write lock. Having a write lock is not required > +for operations like just changing the actual properties on a node. Of course > +nobody else can own a write lock, or it might change the properties after > +sending the commit data, but before moving the data to the base_node table. > + > +In a centralized metadata scheme, it is easy to check that nobody else has > +a write lock. (Checking if we ourselves have a write lock ourself is just a > +memory lookup of course). > + > +Partial Operations > +------------------ > +These operations rely on data read before the wc_db operation and only work > +correctly if the data didn't change since reading. All entry based > operations > +are in this category and the WC-NG work tries to redesign several of these > +operation to the first class of operations. > + > + > +APIs > +---- > +wc_db will provide several APIs to acquire, release and check locks. These > +APIs are still under consideration. > + > + > +Backward Compatibility > +====================== > +This proposed write lock scheme will be fully backward compatible, thanks to > +the LOCKED_LEVELS column. This allows old-style access batons to utilize the > +new locking mechanisms internally and be compatible with processes using the > +new APIs. > > Propchange: subversion/trunk/notes/wc-ng/locking > ------------------------------------------------------------------------------ > svn:eol-style = native > >