The Delta-V Working Group held its first meeting November 9, 1999 at the
Washington, DC IETF. The meeting covered the proposed extensions to WebDAV
to support versioning, activities and parallel development, and
configuration management. The following are the notes from the meeting.
Chair: Jim Amsden
Notetakers: Jim Whitehead, Pete Carlson
Meeting begins with a review by Jim Amsden of the meeting agenda, including
some scoping of the desired discussion for today's session. The approach
taken was to walk through the protocol by showing how the scenarios from
the goals document would be communicated to a WebDAV versioning server. The
purpose was to review the goals and semantics through the scenarios, sketch
how the scenarios are supported by the protocol, and raise any issues. We
intentionally did not cover
- clients that maintain their own workspace
- local and disconnected modes (master mode only)
- dynamic resources
- locking pending resolution of locking semantics on unversioned resources
- leveling or optional features. This will come later after we have a
complete understanding of the full versioning semantics.
First item is a versioning scenario. (The notes from the overheads are
included below). In the scenario, want to:
- create a resource
- update it
- make it a versioned resource
- track its history while making some revisions
Geoff Clemm then presented how the protocol would address this scenario:
- create a resource
PUT /a/x.html
"some text"
PUT /a/x.html
"some more text"
{Creates the resource, then updates it once, but it currently isn't under
version control.}
At this point in time, there is:
resource: /a/x.html
creation date: 11/9/1999 1:25PM
"some more text"
VERSION /a/x.html
This puts the resource under version control
PROPFIND /a/x.html
resource now has a new property (versioned-resource):
resource: /a/x.html
creation date: 11/9/1999 1:25PM
versioned-resource: {some URL "zz157"} <-- the URL where you can
retrieve the entire versioned resource
"some more text"
Need to create a workspace to isolate your changes from those of other
collaborators.
MKRESOURCE /workspaces/geoff_dev
current-label: geoff_dev_lbl
revision selection rule:
This creates a new workspace, where items are assigned the label
"geoff_dev_lbl" and the revision selection rule always picks out the
revision where the label is "geoff_dev_lbl".
--> /workspaces/ was previously created, and established as the place
people store their workspaces.
CHECKOUT /a/x.html
Target-selector: workspace /workspace/geoff_dev
Chris Kaler noted that this checkout will fail, because as of this point,
no label has been set on /a/x.html (wasn't done by VERSION, or by GET).
This leads to some discussion on how to resolve the problem. Two choices,
either have VERSION set a initial label, or can change the revision
selection rule. Geoff proposed to modify the revision selection rule.
Kevin Wiggen noted that the MKRESOURCE didn't specify that it's creating a
workspace resource. So, MKRESOURCE now looks like:
MKRESOURCE /workspaces/geoff_dev
resource-type: workspace
current-label: geoff_dev_lbl
revision selection rule:
What does "zz157" (the URL of the versioned resource) look like?
/zz157:
resource-type: versioned-resource
revisions: /zz157/revisions
Issue: what is inside the "revisions" tag. Is it a collection, or a
report? This has not yet been resolved. (Note: this issue was discussed
and resolved in the breakout session the following day. See the meeting
notes for details.)
Working on the assumption it is a collection:
/zz157/revisions
Further assuming the server names its revisions as "r{version id}", then
the versioned resource now has:
/zz157/revisions/r1 <-- this is the stable, reliable name of the
revision. A GET on this returns revision 1 of /a/x.html
There is also a collection for labeled revisions:
/zz157/labeled_revisions/
At present, since no label has been assigned, this is empty. Return back
to editing.
So, do a PUT to write into the currently checked-out working resource at
/a/x.html. The working resource is part of the workspace, that is, it
lives in /workspaces/geoff_dev/...
PUT /a/x.html
"final text"
Target-selector: workspace /workspace/geoff_dev
Then, check it in:
CHECKIN /a/x.html
Target-selector: workspace /workspace/geoff_dev
The act of checking in the resource sets the label on that revision
(revision 2). Going back to zz157, there are now the following resources
in /zz157/revisions:
/zz157/revisions/r1
"some more text"
/zz157/revisions/r2
"final text"
Also, in /zz157/labeled_revisions/, there is:
/zz157/labeled_revisions/geoff_dev_lbl
This is the same resource as /zz157/revisions/r2.
A question was raised about the use of labels. Are they used to track each
user? Chris Kaler: no, it's more tracking a line of work. Q: So, your
exploiting a side effect of labels here. GC: yes.
Some back and forth on how labels are used, and their role, especially in
keeping clients separate.
Question about what a label really is. Geoff answered by giving details on
exactly how the label is expressed:
labels:
Geoff emphasized that you can have multiple labels set on a resource. More
discussion on uses of labels. Labels are not particularly good for audits.
Q: Can the same label be used across multiple resources? A: yes,
definitely.
This ends the first scenario. Now, move on to a scenario involving
parallel development. Build on the end state of the first scenario:
User Jim checks out a revision of /a/x.html with label geoff_dev_lbl
User Geoff checks out a revision of /a/x.html with label geoff_dev_lbl
Need a new workspace for Jim:
MKRESOURCE /workspaces/jim_dev
resource-type: workspace
current-label: jim_dev_lbl
revision-selection-rule:
CHECKOUT /a/x.html
Target-selector: workspace /workspaces/jim_dev
But, immediately after this, the server sees:
CHECKOUT /a/x.html
Target-selector: workspace /workspaces/geoff_dev
After both checkouts, /zz157/revisions/r2 looks like:
/zz157/revisions/r2
"final text"
labels
workspaces: /workspaces/jim_dev/
/workspaces/geoff_dev/
As each person checks in, the items in workspaces go away, and revisions
are added to the successors list:
successors: /zz157/revisions/r3
/zz157/revisions/r4
Now, we want to:
- retrieve the history listing (list predecessors and successors)
- add/remove labels
At present, to make a history listing, need to go to the versioned resource
and retrieve the URL of its revision collection, and then do a PROPFIND
with Depth to retrieve the predecessor and successor relationships off each
individual resource. Could potentially have an optimization to PROPFIND to
handle the first two retrievals. Also have the option to do a REPORT
method invocation (handles actions that require a lot of computation on the
server), with one report being a history listing. Could also have a
property on the versioned resource that contains the history listing.
Setting a label:
One option is to go into the labeled revisions collection:
/zz157/labeled-revisions/
to add a label called "default":
BIND /zz157/revision/r2
Destination: /zz157/labeled-revisions/default
to change it:
BIND /zz157/revision/r4
Destination: /zz157/labeled-revisions/default
Alternately, could use a "LABEL" method:
LABEL /a/x.html
Label-name: default
Lisa Lippert: For simple clients, needing to understand BIND functionality
may be too much, and labels may be too complex.
GC: Could be quite simple, a client could just think of the BIND as a
"recipe" that they just execute.
LL: If it's so simple, why can't they just do a PROPPATCH?
GC: Could use PROPPATCH {explained a scenario of how to do this}. One
drawback of this approach is if there are a large number of labels on a
revision, then doing a PROPFIND to retrieve this large set of properties,
followed by a PROPPATCH after making a minor modification, could be
inefficient.
JH: Every time you have a list of items that needs to be changed, you run
into the lost update problem where a modification could be made between
PROPFIND and PROPPATCH.
A (many): Yes, this is the case.
Lisa Lippert: Multi-valued properties, in many cases, would be useful if
you could add or remove elements from the list. This will be very useful
in ACLs, since it'll be useful to add/remove access items, especially if
you can't read the items. I'd be happy to work with other people on this.
GC: I'd like to see this too, I certainly like this much better than having
a separate method to add/remove list items for each type of list.
Jim W: Is the BIND side-effect to create a label the only reason why labels
are exposed through the namespace?
GC: No, the main reason is to have a stable URL for "label X of revision R"
to avoid having to create a (revision, label) pair syntax.
Jim Amsden: To finish up, let's request from the WG members their
perceptions of the protocol.
Lisa Lippert: I'm concerned about the complexity of the protocol for simple
authoring clients. Checkin/checkout, and retrieving a history list have to
be really simple.
Yaron Goland: Need to have a document that explains choices, paths not
taken, etc. Design rationale.
GC: Agreed -- weren't you going to write this?
Q: Need to list required metadata fields in the specification.
*** Meeting Adjourned ***
Scenario1:
- create a resource
- update it
- make it a versioned resource
- make some revisions
PUT /a/x.html
"some text"
PUT /a/x.html
"some more text"
VERSION /a/x.html
GET /a/x.html
=>
"some more text"
MKRESOURCE /workspaces/geoff_dev
resource_type: workspace-resource-type
current-label: geoff_dev_lbl
revision-selection-rule:
CHECKOUT /a/x.html
Target-Selector workspace /workspaces/geoff_dev
PUT /a/x.html
Target-Selector workspace /workspaces/geoff_dev
"final text"
CHECKIN /a/x.html
Target-Selector workspace /workspaces/geoff_dev
Scenario 2:
Jim checks out and updates /a/x.html
Geoff checks out and updates /a/x.html
Geoff checks in /a/x.html
Jim checks in /a/x.html
MKRESOURCE /workspaces/jim_dev
resource_type: workspace-resource-type
current-label: jim_dev_lbl
revision-selection-rule:
CHECKOUT /a/x.html
Target-Selector workspace /workspaces/jim_dev
PUT /a/x.html
Target-Selector workspace /workspaces/jim_dev
"Jim's text"
CHECKOUT /a/x.html
Target-Selector workspace /workspaces/geoff_dev
PUT /a/x.html
Target-Selector workspace /workspaces/geoff_dev
"Jim's text"
CHECKIN /a/x.html
Target-Selector workspace /workspaces/geoff_dev
CHECKIN /a/x.html
Target-Selector workspace /workspaces/jim_dev
Scenario 3:
List revisions of /a/x.html
List labeled revisions for /a/x.html
Label revision r1 as "default"
Look at revision r1
PROPFIND /a/x.html
versioned-resource
=>
versioned-resource: /zz157
PROPFIND /zz157
revisions
labeled-revions
=>
revisions: /zz157/revisions
labeled-revisions: /zz157/labeled-revisions
PROPFIND /zz157/revisions
Depth: Infinity
=>
/zz157/revisions/r1 /zz157/revisions/r2 /zz157/revisions/r3
PROPFIND /zz157/labeled-revisions
Depth: Infinity
=>
/zz157/revisions/geoff_dev_lbl /zz157/revisions/jim_dev_lbl
BIND /zz157/revisions/r1
Destination /zz157/labeled-revisions/default
GET /zz157/revisions/r1
=>
"final text"
PROPFIND /zz157/revisions/r1
labels
successors
=>
/zz157/revisions/r2 /zz157/revisions/r3