Re: Versioning spec review - 02.3

jamsden@us.ibm.com
Tue, 26 Oct 1999 09:20:28 -0400


From: jamsden@us.ibm.com
To: ietf-dav-versioning@w3.org
Message-ID: <85256816.0049881A.00@d54mta03.raleigh.ibm.com>
Date: Tue, 26 Oct 1999 09:20:28 -0400
Subject: Re: Versioning spec review - 02.3



See <jra> tags below. This thread is getting long. Sorry for the continuing
detail.





"Geoffrey M. Clemm" <geoffrey.clemm@rational.com> on 10/25/99 05:41:31 PM

To:   w3c-dist-auth@w3.org
cc:

Subject:  Re: Versioning spec review - 02.3




   From: jamsden@us.ibm.com

   Last paragraph: How about using components of versioning support instead
of
      "levels"?

In the latest rev of the spec, the versioning options fell quite naturally
into 3 levels, so given the client-side advantages of having 3 levels of
support vs. multiple orthogonal versioning options, I'd like to go with
levels, if at all possible.
<jra>
We went to a lot of trouble trying to establish levels only to eliminate
the concept in Concord. It seems too bad to reintroduce them now. I hope we
don't go over that same ground again. I wasn't helpful getting the
versioning semantics down.
</jra>


   B.T.W., this isn't mentioned in the
   semantics of CHECKIN. Looks like mutable revisions are missing from
   CHECKIN although the postconditions mentions the concept.

Do you mean something like "If DAV:overwrite=T then the server MUST
support DAV:overwrite having the value T"? (:-)
<jra>
No, I mean we need to say that the server can fail the operation or
overwrite the revision. I don't remember seeing this in the postconditions
of CHECKIN.
</jra>

   <jra> What is the URL for the baseline? Is it something the server
   generated, or is it derived from the associated collection.

All baselines for a particular versioned collection can be found in
the DAV:baselines collection of that versioned collection.  The
server generates the URL of that collection, and generates the
name for a baseline in that collection.
<jra>
So baselines don't have human meaningful names or labels? How will a user
distinguish one fron another?
</jra>

   The
   protocol doesn't say how a baseline is created, or how this URL is
   derived. Did I miss this? I don't see anything in CHECKIN.

I took that out, since I agree with your contention that it doesn't
properly
belong in CHECKIN.  So you now just create baselines with the MKRESOURCE
command.  There's a ToDo note in the draft saying this should be explicitly
mentioned in the MKRESOURCE method description.
<jra>
I don't recall MKRESOURCE mentioning creating baselines, or the semantics
of how one was created. Does the collection have to be checked in? Can it
have working resources in this or any other workspace? How is the baseline
identified or distinguished from another baseline?
</jra>

   In any case, any place where a specific revision is required, but
   revision id must be specified. For example, putting a configuration in
   the RSR. The same must be true of baselines.

Baselines and revisions are indicated in RSR's by their URL's.  We
could allow alternative compound notations as well, but is there
a compelling reason to do so (it does add complexity).
<jra>
So the human meaningful name (its human URL and revision id) for a revision
can't be used in the RSR? If we had a method for setting the RSR, the
server could  translate human names into revision URLs and back.
</jra>

   How is constraining a "property collection" any harder than
   constraining a method?  You write down the constraint, and servers and
   clients must follow it.

   <jra> A method can define specific semantics that are supported. It
   doesn't have to list a bunch of things you can't specify.
   </jra>

I had no trouble specifying the appropriate constraints on the
appropriate properties in the protocol.  Live properties commonly have
their values constrained by the server, so this is nothing unusual for
WebDAV.
<jra>
Its not just the properties you're describing, its the use of the PROPPATCH
and BIND methods too. For example, adding a revision to a configuration
with BIND. BIND has a set of semantics of its own, but binding a revision
to a configuration has more semantics. Similarly, CHECKOUT with a
propertyupdate for setting the checkin policy should not be allowed to do a
general PROPPATCH. It should only set checkin policy so the CHECKOUT method
can determine if it should fail or succeed depending on whether the
proposed checkin policy can be met.
</jra>

   having a downlevel lock check out the resource into the default
   workspace has the right semantics for down level clients working
   against auto-versioned resources ... the PUT that would auto- version
   fails because the resource is already checked out into the default
   workspace.

   <jra> Nice idea, but I think it overloads lock too much. Another
   way to look at it (from the point of view of a non-versioning aware
   client) is the lock prevents anyone else from checking out the
   revision. So the down-level client locks, does a bunch of PUTs knowing
   that no-one else can change the resource, and then does an
   unlock. Each PUT still does a CHECKOUT/PUT/CHECKIN, but only the
   down-level client can directly or indirectly checkout the
   revision. The effect is the same, but this keeps lock out of
   checkout/checkin which might be a good thing.
   </jra>

One of the bad things about creating a new revision on every downlevel
PUT is that it fills the history of a resource with "non-interesting"
revisions, but we have to do it to prevent lost updates.  In contrast,
a LOCK/UNLOCK request gives us exactly the information we need to
implement a more intelligent revision creation policy.  To not take
advantage of this information when designing the protocol strikes me
as remiss.

   <jra>
   Lock is an access control mechanism. We've already got the method and
   need to have it mean something. This is just an attempt to do
   something reasonable. If we want to keep locking optional though,
   we'll have to make sure none of this functionality is required.
   </jra>

Current WebDAV locking (with lock tokens) are good for some things,
but any time it is not reasonable to expect a client to hold and
remember a lock token, WebDAV locks are not appropriate.  It is better
to just have the protocol treat the operation as undefined or an
error, rather than increase the complexity of the protocol (and of
servers that implement it) with functionality that is not useful.
<jra>
I don't think this increases the complexity. Disallowing the method for
special cases also increases complexity.
</jra>

   Marshalling, how is the Target-Selector overridden with a
   specific label or id?

   It isn't.  The Target-Selector with a label or id is just for folks with
   lightweight workspaces that don't have rsr's.  For folks with
workspaces,
   overriding with a specific label is far less common, and can be done by
   accessing the DAV:revisions or DAV:revision-labels collections.

   <jra>
   Two problems: if the Target-Selector is just a label, what is used to
   select the collection revisions in the URL path?

Core and Activity versioning servers will not be generating versioned
collections, so there will be no collection revisions in the URL path.
Versioned-Collection servers will provide repositories, which are
required to be located in a non-versioned part of the namespace
(i.e. under no versioned collections).  In either case, the
DAV:revision-labels
collection will have no collection revisions in its URL path, so no
collection revision selection is required.
<jra>
I'm missing something. If you have a bunch of versioned collections in a
hierarchy, and you want to access a specific revision of a member of one of
them, then you need two things: the workspace to use to select the righ
revisions of versioned collections along the path, and a revision name to
select the specific revision of the member versioned resource. We don't
want to require users to us repository and server implemented URLs for
this.
</jra>

   Second, folks with
   workspaces will override with a specific label LOTS of times to do
   compares, browse old versions, prepare for merging, look at what other
   people are doing, etc.

The DAV:revision-labels collection is there to give clients easy access
to any revision by using a label.  No need for a specific header, and
suitable for use in any context where a URL can be specified (as opposed
to the Target-Selector, which just works for a Request-URL).
<jra>
It is not acceptible to require clients to translate URL and revision names
into server generated revision URLs for this operation. The client should
always be able to use the name they know a revision by to access that
revision.
</jra>

   CHECKIN is doing PROPPATCH work. This is not a propertyupdate, its a
   set of parameters for the CHECKIN method. We should not reuse the
   propertyupdate, but rather create a new element, specific to the
   method. Otherwise we have to specify a whole bunch of restrictions
   about what can go in the propertyupdate.

Not if we place no restrictions on what can go in the property-update.
Note that I'm happy to say no specification of the DAV:checkin-policy
in a CHECKOUT request, but if we *do* allow it, I believe that the
most appropriate way is to allow CHECKOUT to do an arbitrary PROPPATCH
to "initialize" the new working resource.  Think of CHECKOUT as a
"MKRESOURCE" for working resources.
<jra>
Can't agree with this. CHECKOUT creates a working resource that is a copy
of the checked out revision, there is no need to "initialize" it any
further. Second, the CHECKOUT should succeed or fail based on checkout
semantics, not property updates. This is way too much coupling and will
make the method difficult to describe and implement. Finally, I still think
it is entirely unnecessary for checkout to do anything with checkin
semantics. If a client wants to perform these policy checks or property
updates, let it do it after the checkout, and do an uncheckout if they
can't get the checkin they want. We need to simplify these methods, and
this would be a good place to start. We have no use case requiring this,
and I think it is unnecessary semantics optimization.
</jra>

   I don't think we need two ways of updating properties on a resource,
   PROPPATCH and CHECKIN. You say later on that some of the properties
   are not actually saved. This is even worse. Method parameters should
   be coupled with the method, not the resource.

We already have two: PROPATCH and MKRESOURCE.  So if we add a third,
there is at least precedent.
<jra>
But we have an issue to get rid of MKRESOURCE for this very reason.
Besides, the point of MKRESOURCE is to support resource creation as a first
class operation rather than a side effect of PUT.
</jra>

   Having "uncheckout" as an option to CHECKIN is reasonable because
   they are logically very similar in basic intent (i.e. "I'm done
   with this resource").  We already have DAV:overwrite which doesn't
create
   a new revision, and DAV:identical-uncheckout which only creates a new
   revision if it has changed, so DAV:uncheckout seems to fit in very
smoothly.

   <jra> But I think the intent of the two methods is the exact
   opposite. The intent of CHECKIN is to create a new revision an
   preserve changes unless perhaps there's no need to because there were
   no changes. The intent of UNCHECKOUT is to ensure a new revision is
   not created, and the changes are lost. Coupling these two concepts in
   the same method seems wrong. This is taking control couples too far.

Both DAV:overwrite and DAV:indentical-uncheckout conflict with your
description of the intent of CHECKIN.  One never creates a new revision,
and the other only sometimes creates a new revision.
<jra>
But they don't conflict, they are an optimization of creating new revisions
by avoiding creating revisions that have no changes.
</jra>

      Notice that most of these
      checkin policies could be marshalled in simple headers.

   So we could use up the single header namespace, instead of using XML
   which has user-defined namespaces ? (:-)

   <jra> Since we own headers, there is no namespace issue.

This "we" is a very diverse group (i.e. everyone proposing extensions
to HTTP) with overlapping needs/interests.  Using up a name that is
"global" to this group is, in my opinion, a very significant issue.
After all, we've already made life difficult for the archery extension
group by defining the semantics of "Target-Selector" (:-).
<jra>
Namespaces are being added to HTTP, and I don't think there are so many
changes happening that we can coordinate our headers. Besides, its the use
of the header on a method that is method specific, not the header itself.
The fact that the archery team uses Target-Selector on their method to mean
something else is of no consequence. Its confusing, but doesn't hurt
anything.
</jra>

      7. The paragraph about Target-Selector specfies a revision id or
label is
      incorrect. The selector "self" cannot be applied to collections on
the path
      because its a revision of the collection that's needed, not the
versioned
      collection as a whole.

   And if so, it will "correctly" return an error (you should be using a
workspace
   to look at things in versioned collections).

   <jra>
   But down-level clients can't do this.
   </jra>

Down-level clients won't be issuing requests with Target-Selector headers.
<jra>
We're back to the same issue as above: how does one override the workspace
when the revision requested is in a revision of a versioned collection. You
need the workspace to get the revision of the collection, and the
Revision-Selector to get the revision. You're right, this has nothing to do
with down-level clients.
</jra>

Cheers,
Geoff