In 1.6 wc locks were associated with access batons and when an access
baton was opened a pool cleanup handler was installed to ensure that
the baton was closed. The pool cleanup handler would remove any lock
associated with the access baton provided there were no log files in
the directory. Code was typically:
svn_wc_adm_access_t *adm_access;
SVN_ERR(svn_wc_adm_open3(&adm_access, ... pool));
SVN_ERR(svn_wc_foo(adm_access, ... pool));
SVN_ERR(svn_wc_adm_close(adm_access));
If svn_wc_foo completes without error then svn_wc_adm_close is called
which removes the locks unconditionally. If svn_wc_foo returns an
error then svn_wc_adm_close doesn't get called, and when the pool is
finally cleared the pool cleanup handler will leave or remove the lock
depending on whether cleanup is required.
The locks in wc-ng don't have the same behaviour, they only get
removed by an explict svn_wc__release_write_lock call. If the code
above is simply converted to wc-ng code then an error from svn_wc_foo
will leave the working copy locked; that's what happens when I try to
convert libsvn_client/copy.c. The client code can be modifed to work
around this in various ways but I don't think it's a good idea to
require the client code to do this.
I think svn_wc__acquire_write_lock should associate the lock with a
pool and install a pool cleanup handler that removes the lock if the
workqueue is empty. I don't think it makes sense to use the db
context state_pool since applications may want to reuse the context
for multiple operations; the pool lifetime is too long. I think it
should be a pool passed in to svn_wc__acquire_write_lock so that the
caller can control the lifetime of the lock.
--
Philip
Received on 2009-12-21 18:17:23 CET