[ 
https://issues.apache.org/jira/browse/JCR-4954?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17776110#comment-17776110
 ] 

Manfred Baedke commented on JCR-4954:
-------------------------------------

I do not understand this call stack from server B:


{code:java}
bstractWebdavServlet.doPropFind -> LOCKDISCOVERY
                                                                                
                                                                                
                                                                                
                                                                                
                                        
org.apache.jackrabbit.webdav.jcr.AbstractResource.initProperties
                                                                                
                                                                                
                                                                                
                                                                                
                                                properties.add(new 
LockDiscovery(getLocks()));
                                                                                
                                                                                
                                                                                
                                                                                
                                                
org.apache.jackrabbit.webdav.jcr.AbstractResource.getLocks
                                                                                
                                                                                
                                                                                
                                                                                
                                                        // write lock (either 
exclusive or session-scoped).
                                                                                
                                                                                
                                                                                
                                                                                
                                                        getLock(Type.WRITE, 
Scope.EXCLUSIVE);
                                                                                
                                                                                
                                                                                
                                                                                
                                                                
org.apache.jackrabbit.webdav.jcr.DefaultItemCollection.getLock
                                                                                
                                                                                
                                                                                
                                                                                
                                                                jcrLock -> 
org.apache.jackrabbit.core.lock.XALockImpl
                                                                                
                                                                                
                                                                                
                                                                                
                                                                ActiveLock lock 
= new JcrActiveLock(jcrLock);
                                                                                
                                                                                
                                                                                
                                                                                
                                        
org.apache.jackrabbit.webdav.jcr.lock.JcrActiveLock.toXml
                                                                                
                                                                                
                                                                                
                                                                                
                                                
org.apache.jackrabbit.webdav.jcr.lock.JcrActiveLock.getToken
                                                                                
                                                                                
                                                                                
                                                                                
                                                LockTokenMapper.getDavLocktoken
                                                                                
                                                                                
                                                                                
                                                                                
                                                        return SESSPREFIX + 
Text.escape(lock.getNode().getIdentifier());
                                                                                
                                                                                
                                                                                
                                                                                
                                                        
//opaquelocktoken:4403ef44-4124-11e1-b965-00059
{code}

How does AbstractResource.getLock(Type.WRITE, Scope.EXCLUSIVE) ever get called? 
If it's a DefaultItemCollection, as the call stack implies, then 
DefaultItemCollection.getLock(Type.WRITE, Scope.EXCLUSIVE) will be called, 
which will never delegate to the  super type in case of a Write Lock.


> Problem with WebDav Client and Repository Server Deployment Model
> -----------------------------------------------------------------
>
>                 Key: JCR-4954
>                 URL: https://issues.apache.org/jira/browse/JCR-4954
>             Project: Jackrabbit Content Repository
>          Issue Type: Bug
>          Components: jackrabbit-jcr-server, jackrabbit-webdav
>            Reporter: Claus Köll
>            Assignee: Manfred Baedke
>            Priority: Major
>             Fix For: 2.22
>
>         Attachments: Call-Hierarchy.txt
>
>
> We have one WebApp where we have deployed the SimpleWebDavServlet 
> (WebDav-WebApp). From there we connect to a other WebApp where we have 
> exposed a Repository through DavEx 
> (org.apache.jackrabbit.server.remoting.davex.JcrRemotingServlet)
> and also the RMI-Layer by the RMI Registry (Repository-WebApp)
> Until now we connected over RMI but now we tried to switch to DavEx. The 
> Problem is, that we are now unable to unlock a opened WebDav Document.
> The Lock Request in the Repository-WebApp adds a Reference (LockToken) to the 
> DavSession so a future Requests can obtain the same DavSession to perform the 
> unlock.
> https://github.com/apache/jackrabbit/blob/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/DefaultItemCollection.java#L700
> The Reference (Locktoken) looks like 
> opaquelocktoken:dccce564-412e-11e1-b969-00059a3c7a00:0089610c-02e5-43cd-bfec-3a90361350f4-0
> It will be generated by the LockTokenMapper 
> https://github.com/apache/jackrabbit/blob/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/lock/LockTokenMapper.java#L53
> In the WebDav-WebApp the HeaderLockToken will be stored in this format
> opaquelocktoken:dccce564-412e-11e1-b969-00059a3c7a00:opaquelocktoken%3a4403ef44-4124-11e1-b965-00059a3c7a00%3a0089610c-02e5-43cd-bfec-3a90361350f4
> As you can see it will be double wrapped. That's not really a Problem because 
> on unlock the WebDav-WebApp removes the prefix
> opaquelocktoken:dccce564-412e-11e1-b969-00059a3c7a00:
> Finally this locktoken will be send from the WebDav-App to the 
> Repository-WebApp
> opaquelocktoken:4403ef44-4124-11e1-b965-00059a3c7a00:0089610c-02e5-43cd-bfec-3a90361350f4
> On the Repository-WebApp the JCRWebdavServer will look for a DavSession in 
> the Cache based on the lockToken
> https://github.com/apache/jackrabbit/blob/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/jcr/JCRWebdavServer.java#L210
> So the problem is that the DavSession whitch have created the Lock, is stored 
> with a lockToken that do not match with the incoming lockToken
> Cache-Key-Token: 
> opaquelocktoken:dccce564-412e-11e1-b969-00059a3c7a00:0089610c-02e5-43cd-bfec-3a90361350f4-0
> Incoming-Token:  
> opaquelocktoken:4403ef44-4124-11e1-b965-00059a3c7a00:0089610c-02e5-43cd-bfec-3a90361350f4
> The DavSession-Cache Key is taken from the LockInfo (LockTokenCheckDigit is 
> present)
> https://github.com/apache/jackrabbit/blob/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/LockInfo.java#L118
> Maybe someone which is familiar with the code of LockTokenMapper can explain 
> the two different Scopes (SESSIONSCOPED/OPENSCOPED)
> One possible solution could be to change the code in the LockTokenMapper to 
> always return the Node Identifier with the same SCOPE-PREFIX?



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to