You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by Arjen van Staalduinen <ar...@gmail.com> on 2009/07/15 15:41:59 UTC

[VFS] How to fix concurrency issues in SftpFileSystem

hello,

I'm trying to create a patch for a concurrency issue I've come across in the
VFS SftpFileSystem, but I'm a bit confused what the general idea of coping
with this kind of problem in VFS is. I see a lot of synchronized blocks that
use the filesystem as a lock object in FileObject implementations including
AbstractFileObject. This is also the case in SftpFileObject in the
doGetInputStream() method. The problem with this kind of perimeter defense
is, that it's easy to open up some hole in the perimeter by accident. That
coupled with the fact that concurrency is not easily tested with
unit/integration tests. There seems to be a hole in this perimeter somewhere
now though, because I'm having concurrency issues with the latest svn
trunk...

In this particular case the problem is in the method getChannel of
SftpFileSystem and more particular this part:

            final ChannelSftp channel;
            if (idleChannel != null)
            {
                channel = idleChannel;
                idleChannel = null;
            }

idleChannel is an instance variable and as you can see, in a multi threaded
scenario this will result in returning the same channel to multiple threads,
leading to all kinds of problems while working with that channel....

Jerome Lacoste already provided a patch a long while ago that would have
fixed this problem in:
https://issues.apache.org/jira/browse/VFS-186

He uses an approach of introducing a new lock object called channelLock and
fixing the concurrency in filesystem itself. He describes that the perimeter
defense approach of synchronizing FileSystem access in FileObject
implementations is less nice in that jira issue as well and I tend to agree.

This patch is however outdated by now...

Is the outdated patch from Jerome enough for a committer to fix the issue?
Or should I get my hands dirty and provide my own solution. I'm kinda
reluctant to do this as I'm not very confident about my understanding of the
full consequences that such a patch would have to other scenarios. As quite
some code already seems dedicated to concurrency issues. I personally I
would make the methods: getChannel(), putChannel()and
doCloseCommunicationLink() synchronized.... But maybe the problem needs to
be fixed in the perimeter defense in AbstractFileObject or SftpFileObject?

Thanks in advance,
Arjen