Subject: RE: Bindings, Locks, and MOVE

From: "Slein, Judith A" <[email-masked]>
Date: Wed, 15 Sep 1999 13:52:46 -0400

Actually I was confused by thinking that a write lock would prevent a COPY
with Destination being the locked resource.  (So I thought that the COPY
step wouldn't be allowed to happen.)  But I see that the definition of write
lock doesn't address this case.

I do have trouble following your description of the fixup stage, though.  I
take it you don't think we face the awkward situation Kevin described, where
there end up being 2 resources where there used to be only one.  But how do
you avoid this?

Before the MOVE we have:

/a/b.html   /x/y.html         /c/d.html
    \         /                   |
     \       /                    |
      \     /                     |
         R                        S

and user1 has a lock on R through /a/b.html

Now user2 attempts to MOVE /c/d.html to /x/y.html.  First the binding y.html
is removed from collection /x/.  Then S is duplicated, say to S' and a new
binding y.html is created in /x/ to S'.  That's the COPY step.  At this
point we have:

/a/b.html     /x/y.html      /c/d.html
   |             |              |
   |             |              |
   R             S'             S

The DELETE step is to remove the binding d.html from /c/.  It doesn't look
as if there needs to be any fixup, but we do have the awkward result that we
now have 2 resources R and S' where there used to be just R.

--Judy

> -----Original Message-----
> From: Geoffrey M. Clemm [mailto:[email-masked]]
> Sent: Wednesday, September 15, 1999 12:56 PM
> To: [email-masked]
> Subject: Re: Bindings, Locks, and MOVE
> 
> 
> 
>    From: "Slein, Judith A" <[email-masked]>
> 
>    I like everything that you say here, but the MOVE / COPY 
> TO cases raise a
>    red flag for me.  We claim in the bindings spec that the 
> MOVE semantics we
>    present  is equivalent to the COPY + fixup + DELETE 
> semantics defined in RFC
>    2518.  But I doubt it when I look at this case.
> 
> <gmc/> The author of the statement that "MOVE is logically equivalent
> to COPY+fixup+DELETE" (who will remain nameless although we all know
> who he is :-) has publicly renounced this statement.  The problem of
> course is the wonderfully undefined "fixup" stage.  *ANY* semantics is
> acceptable for MOVE, for some definition of "fixup".  So let's see if
> all is well for this case with some suitably defined value of "fixup".
> 
>    Leave aside for a minute intuitions about what should 
> really happen, and
>    just see what would follow from the underlying semantic model:
> 
>    Suppose we define MOVE as "remove the binding identified 
> by the Request-URI
>    and add the binding identified by the Destination header".
> 
>    Now consider your case: /a/b.html and /x/y.html both point 
> to resource R,
>    and I have an exclusive write lock on /a/b.html.  User2 
> tries to MOVE
>    /c/d.html (which points to some other resource S) to 
> /x/y.html.  It seems
>    this should be possible, because all that is happening is 
> that the binding
>    y.html in collection /x/ is being replaced with one that binds to a
>    different resource.  Nothing happens to resource R.
> 
>    But if we use the COPY + fixup + DELETE semantics for 
> MOVE, resource S would
>    have to be duplicated, overwriting R.  And this would not 
> be allowed,
>    because R is locked.
> 
> <gmc/> It doesn't overwrite R.  A COPY to an existing resource will
> either fail (if Overwrite=FALSE) or issue a DELETE on the destination
> of the COPY.  The DELETE of /x/y.html succeeds just fine (since DELETE
> is properly defined to just remove the binding named "y.html" from the
> collection "/x"), the COPY proceeds, and then the "fixup" step
> replaces the binding to the new resource created by the COPY with a
> binding to R, and then a DELETE is issued on the request URL of the
> MOVE, which then deletes the binding named "d.html" from the
> collection "/c".
> 
>    Of course, we can legislate this problem away by, for 
> example, accepting
>    your proposal that a MOVE or COPY like this one fail no 
> matter which
>    semantics you use.  But I'm afraid other cases will turn 
> up that reveal
>    inconsistencies between the 2 models of MOVE.
> 
> <gmc/> I believe there are no inconsistencies here ... just 
> suitably creative
> definitions of "fixup" (:-).
> 
> Cheers,
> Geoff
>

---

From: "Geoffrey M. Clemm" <[email-masked]>
Date: Wed, 15 Sep 1999 17:01:47 -0400

<jas>

<gmc/> That's right.  That's what the "fixup" step takes care of.

   Before the MOVE we have:

<gmc/> Yup.

<gmc/> Yup again.

<gmc>
And that awkward result is exactly what the fixup step "fixes up",
namely before the DELETE on /c/d.html, it issues a DELETE on /x/y.html
and then creates a binding to S named "y.html" in the collection "/x".
So immediately after the fixup step you have:

      |                   \    /
      |                    \  / 
      R                      S

A MOVE at the very least must guarantee that the GUID property of a
resource remains the same after a MOVE, and the only way that can be is
if /x/y.html is mapped to S (and not some copy of S) after the MOVE
successfully completes.
<gmc/>

Cheers,
Geoff