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

L edited comment on VFS-640 at 8/24/17 7:19 AM:
------------------------------------------------

Avoiding slow connection would be nice but unfortunately we do not have that 
luxury.

I have created a patch for our internal use, see attachment. Some notes:
# The patch is based on 2.1 release and not on trunk.
# I tried to keep the code style but I did not verify it.
# It is indeed a lock keyed by the same key as the FileSystem. Its lifetime is 
almost the same as lifetime of the corresponding FileSystem: it is created 
before the FileSystem but is normally destroyed together with the FileSystem in 
AbstractFileProvider.closeFileSystem()
# The lock is ref-counted to support scenarios when creating a FileSystem 
fails. In this case the lock is destroyed when ref count goes to 0.
# All the lock management happens under in AbstractFileProvider synchronized 
(fileSystems), no new synchronization objects are created.
# There is no deadlock. There are only two lock patterns: either "synchronized 
(fileSystems)" or "synchronized (newLock), synchronized (fileSystems)"
# There is also a test (ParallelConnTest.java). The test has two methods, to 
test the sequential behavior (the same key) and the parallel behavior 
(different keys).



was (Author: klv_m72):
Avoiding slow connection would be nice but unfortunately we do not have that 
luxury.

I have created a patch for our internal use, see attachment. Some notes:
# The patch is based on 2.1 release and not on trunk.
# I tried to keep the code style but I did not verify it.
# It is indeed a lock keyed by the same key as the FileSystem. Its lifetime is 
almost the same as lifetime of the corresponding FileSystem: it is created 
before the FileSystem but is normally destroyed together with the FileSystem in 
AbstractFileProvider.closeFileSystem()
# The lock is ref-counted to support scenarios when creating a FileSystem 
fails. In this case the lock is destroyed when ref count goes to 0.
# All the lock management happens under in AbstractFileProvider synchronized 
(fileSystems), no new synchronization objects are created.
# There is no deadlock. There are only two lock patterns: either "synchronized 
(fileSystems)" or "synchronized (newLock), synchronized (fileSystems)"


> Synchronized AbstractOriginatingFileProvider.getFileSystem is too broad
> -----------------------------------------------------------------------
>
>                 Key: VFS-640
>                 URL: https://issues.apache.org/jira/browse/VFS-640
>             Project: Commons VFS
>          Issue Type: Bug
>    Affects Versions: 2.0, 2.1
>            Reporter: L
>         Attachments: ParallelConnTest.java, patch_VFS640.diff
>
>
> Currently (rev. 1802455) this method looks like this:
> {code:java}
>     protected synchronized FileSystem getFileSystem(final FileName rootName, 
> final FileSystemOptions fileSystemOptions)
>         throws FileSystemException
>     {
>         FileSystem fs = findFileSystem(rootName, fileSystemOptions);
>         if (fs == null)
>         {
>             // Need to create the file system, and cache it
>             fs = doCreateFileSystem(rootName, fileSystemOptions);
>             addFileSystem(rootName, fs);
>         }
>         return fs;
>     }
> {code}
> Given that there is a single instance of a provider per scheme, a very slow 
> server that is being accessed first time will block *all* other threads 
> trying to access some other resources via the same provider.
> We have a server that takes sometimes 20-30 seconds in doCreateFileSystem. We 
> do not mind the thread trying to access this method taking that long, but 
> because of that "synchronized" we end up having multiple threads accessing 
> unrelated servers for the same scheme blocked.
> PS. Actually, it is not only AbstractOriginatingFileProvider. The same 
> "provider-scoped" lock is present in AbstractLayeredFileProvider, 
> TemporaryFileProvider, and UrlFileProvider



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to