blob: d1730321b256b339300a4846a8ccd955f1f51ba2 [file] [log] [blame]
A Functional Specification for "Locking"
This document describes the features of a new locking system for
Subversion. It attempts to avoid specific design and implementation
choices wherever possible.
A separate document will outline a proposed implementation for this
specification.
I. Introduction
A. Goals
1. Provide a mechanism to ensure that a user has exclusive
rights to commit changes to a file from a particular working
copy.
2. Provide a communication mechanism to decrease the chances of
a user wasting time working on a file locked by someone else.
B. Summary
We recommend implementing a lightweight locking mechanism.
Teach the server to track and enforce exclusive write locks.
Provide means for repository administrators to manipulate locks
and enforce locking policies. Provide a series of client
commands for creating, removing, breaking, and stealing locks.
Lastly, create a new property to communicate that a path must be
locked before committing.
Note that Subversion is still an inherently concurrent system.
The ability to lock paths is optional, and can even be prevented
by the repository administrator.
II. New Client Behaviors
A. Overview
1. Definition of "lock"
A lock grants one user the exclusive right to change a
certain file from a specific working copy.
2. Lock restrictions
If a file is locked, the owner of the lock has the exclusive
right to change the file's text and properties, to delete the
file, and to move the file.
The restriction on moving or deleting a locked file is a
restriction on changing its full path name in any way,
including by moving or renaming or deleting any of its
parent directories.
(A locked file can still be read and copied, and any copy of it
will not automatically be locked.)
B. Client requirements for locking
1. Enforcement system
It must be possible to declare that certain files absolutely
require locks before committing.
2. Communication system
There must be a system in place that tells users when locking
is necessary; ideally, it would prevent a user from
beginning work in the first place. If a lock already exists,
a user should be able to see who created it, when, and why.
C. Lock manipulation via client
1. Lock Representations in the Working Copy
In order to associate a lock with a particular working copy,
the working copy must store some representation of the lock,
and occasionally synchronize this with the repository's
master list of locks.
Because locks can be broken or stolen, it is possible for a
working copy's lock representation to become "defunct". A
defunct lock cannot be used or released--it is useless and is
cleaned up when the client next synchronizes with the server.
2. Actions
This section defines specific terminology to describe the
kind of lock-related actions that a Subversion client can
perform.
a. Creating a lock
To lock a file:
- A user must be authenticated to the server
- The file must not already be locked.
Upon successfully locking a file, the working copy retains
a representation of the lock.
b. Using a lock
To make use of a lock, two forms of authentication must be
provided to the server:
- The authenticated username that owns the lock
- A non-defunct lock representation
If either of these forms of authentication are missing or
incorrect, the lock cannot be used.
1. Using a lock to Commit
Upon successful commit, a locked file is released by
default. The Subversion client provides an option to
retain the lock after commit.
2. Releasing a lock
After successful release, the representation of the lock
is removed from both the working copy and the server.
c. Breaking a lock
"Breaking" a lock is a means of releasing a lock when:
- The authenticated username is not the same as the
lock owner, or
- The working-copy lock representation is unavailable.
(e.g. Harry locks file foo and is suddenly laid off.
Sally decides to clean up his mess and breaks the lock on
foo, without using Harry's username or lock
representation.)
d. Stealing a lock
"Stealing" a lock is a means of creating a lock when:
- The file is locked by you, but you don't have a
representation of the lock in your current working
copy, or
- The file is locked by someone else.
In order to steal a lock, a user must be authenticated to
the server.
(e.g. Harry locks file foo and goes on vacation. Sally
needs to make changes to foo and obtains a lock on foo by
stealing Harry's lock, without using Harry's username or
lock representation.)
e. Discovering/examining locks
The Subversion client provides interfaces to answer the
following questions:
- Ask working copy to display all lock representations
- Examine a particular lock representation
- Ask server to list all locks underneath a given path,
optionally displaying all attributes of the locks
(Possibly able to restrict this query to a single user)
- Ask server whether a given file is locked
III. New Server Behaviors
A. Overview
1. Definition of a lock
As noted in section II.A.1, a lock grants one user the
exclusive right to change a certain file from a specific
working copy.
2. Attributes of a lock
A lock is an immutable data object. It must contain: a
unique identifier, the path being locked, the username that
owns the lock, and a creation timestamp. A lock comment is
optional.
3. Lock Restrictions
See II.A.2 for details. The server will enforce these
behaviors.
B. Tracking locks
The Subversion server holds the master list of all locks for a
repository. It responds to client requests to create, release,
break and steal locks.
When a client asks about a lock, the server reports whether the
lock is valid or is defunct (i.e. the server no longer has a
lock corresponding to the lock representation in question).
When a client creates or steals a lock, the server returns a
lock representation.
C. Enforcement
During a commit, the server checks for locks the same way that
it checks for out-of-dateness.
As each changed path arrives, the server checks to see if the
path is locked. If the path is locked, the server makes certain
that the correct username and lock representation have been
presented by the client. If not, the entire commit is rejected
immediately.
In addition, the server re-checks and enforces locks during
commit finalization.
D. Configurable Mechanisms
The server provides mechanisms to enable diverse administrative
locking policies, including:
1. Allow or disallow creating, breaking, and stealing of locks
based on specific criteria (e.g. username, path, etc.)
2. Perform tasks after creating, breaking, and stealing a lock
(e.g. sending email, collecting stats, etc.)
E. Lock manipulation with svnadmin
1. Discovering locks
svnadmin provides interfaces to answer the following
questions:
- List all locks in a repository underneath a given path
(Possibly able to restrict this query to a single user)
- Ask whether a given repository file is locked
2. Unconditional release of locks
svnadmin provides an interface to unconditionally release a
specific lock.