I think half the problem is that someone named the package fslock and not
oslock, so we're stuck asking the wrong question.

If the question is "How do I acquire an OS-level lock for a process?"  The
answer on Windows is "Use a named mutex".  Dave seems to be saying that the
only problem with unix domain sockets is if you try to think about them
like files... which may be a result of us thinking too much about the
solution and not the problem. (again, I'm not an expert, you guys can duke
out what the best solution is)  I think using hackery with the filesystem
locking on Windows is a mistake.

On Tue, Dec 1, 2015 at 4:10 AM roger peppe <roger.pe...@canonical.com>
wrote:

> So I'm with axw on this one - flock seems like it is a reasonable tool for
> the job here. FWIW a Unix domain socket also suffers from the "won't
> work across NFS" problem. Abstract unix domain sockets also
> have the problem that they won't work with long file paths (what
> were they thinking?)
>
> We have been using github.com/camlistore/lock and although it's not
> totally ideal (see https://github.com/camlistore/lock/issues/10 )
> it does the job. Note that it's non-blocking, so a blocking
> layer above it is necessary, for example see the lockFile
> function in
> https://github.com/juju/persistent-cookiejar/blob/master/serialize.go
>
> The Windows named mutex thing does sound interesting because
> it's a blocking API, which is actually what we need. On the other
> hand, under Windows, files opened for writing are locked by default
> anyway, so it might be easier just to leverage that property.
> The camlistore lock code could use some improvement for the
> Windows platform - we could either fork it, or bradfitz would
> probably be amenable to a PR.
>
>   cheers,
>     rog.
>
> On 1 December 2015 at 04:12, Nate Finch <nate.fi...@canonical.com> wrote:
> > I'm not a linux expert, but definitely a named mutex is exactly the
> correct
> > thing to use for Windows.  Using something else for this purpose would be
> > very surprising to a Windows dev and much more likely to be buggy.  I
> don't
> > see any reason we need to use the exact same implementation on all OSes
> if
> > there is something that does exactly the right thing without any
> finagling.
> > FWIW, mutexes do die with the process:
> >
> https://msdn.microsoft.com/en-us/library/windows/desktop/ms682411(v=vs.85).aspx
> >
> > On Mon, Nov 30, 2015 at 8:29 PM Andrew Wilkins
> > <andrew.wilk...@canonical.com> wrote:
> >>
> >> On Tue, Dec 1, 2015 at 9:07 AM David Cheney <david.che...@canonical.com
> >
> >> wrote:
> >>>
> >>> http://0pointer.de/blog/projects/locking.html
> >>>
> >>> In short, opening the same file twice and asserting a lock on it will
> >>> succeed.
> >>
> >>
> >> Thanks. The article is a bit exasperated. Yes, there are problems to be
> >> aware of, but it doesn't make them unusable in all cases.
> >>  - Juju agents don't get installed onto NFS file systems, so doesn't
> >> matter for the agents.
> >>  - We're in full control of the files we're locking, we're not locking
> >> some file like /etc/passwd where some other random bit of code in the
> >> process is going to open/close it and release the lock by accident.
> >>  - We don't need byte-range locking.
> >>
> >> So only the original uncertainty remains: do we care about clients
> running
> >> their home directory on an NFS share, where the NFS *server* is too old
> to
> >> support flock?
> >>
> >> Maybe a named mutex on Windows and a domain socket on *NIX is the way to
> >> go. I'm not dead set on flock; I just want something that is simple,
> robust
> >> and portable.
> >>
> >> Cheers,
> >> Andrew
> >>
> >>> On Tue, Dec 1, 2015 at 12:04 PM, Andrew Wilkins
> >>> <andrew.wilk...@canonical.com> wrote:
> >>> > On Tue, Dec 1, 2015 at 8:57 AM David Cheney
> >>> > <david.che...@canonical.com>
> >>> > wrote:
> >>> >>
> >>> >> fcntl won't work in threaded go applications, it barely works in non
> >>> >> threaded applications.
> >>> >
> >>> >
> >>> > This is news to me. I've used it plenty in the past, in
> multi-threaded
> >>> > programs. Please point me at relevant literature that explains where
> it
> >>> > doesn't work.
> >>> >
> >>> >>
> >>> >> I'm not interested in "doesn't work on windows" arguments. Yes, we
> >>> >> have to support windows, but that doesn't mean we have to be dragged
> >>> >> down to it's lowest common denominator.
> >>> >
> >>> >
> >>> > Agreed, if we're actually crippling anything.
> >>> >
> >>> >>
> >>> >> I think it's fine to develop a lock type that does the best
> available
> >>> >> for each platform using conditional compilation.
> >>> >
> >>> >
> >>> > Again, agreed, but only if there's something to be gained by doing
> >>> > this. I'm
> >>> > still not convinced there is.
> >>> >
> >>> >> On Tue, Dec 1, 2015 at 11:47 AM, Andrew Wilkins
> >>> >> <andrew.wilk...@canonical.com> wrote:
> >>> >> > On Tue, Dec 1, 2015 at 8:03 AM David Cheney
> >>> >> > <david.che...@canonical.com>
> >>> >> > wrote:
> >>> >> >>
> >>> >> >> On Tue, Dec 1, 2015 at 11:00 AM, Andrew Wilkins
> >>> >> >> <andrew.wilk...@canonical.com> wrote:
> >>> >> >> > On Tue, Dec 1, 2015 at 7:57 AM David Cheney
> >>> >> >> > <david.che...@canonical.com>
> >>> >> >> > wrote:
> >>> >> >> >>
> >>> >> >> >> Doesn't look like there is windows support, and it uses fcntl
> >>> >> >> >> (flock)
> >>> >> >> >> under the hood, which is what we have now.
> >>> >> >> >
> >>> >> >> >
> >>> >> >> > flock isn't the problematic thing Tim is talking about.
> >>> >> >> > utils/fslock
> >>> >> >> > attempts to create a directory in a known location, and if it
> >>> >> >> > succeeds,
> >>> >> >> > it
> >>> >> >> > "holds the lock". Unlocking means removing the directory.
> >>> >> >>
> >>> >> >> The problem is if the process dies/exits/goes mental while
> holding
> >>> >> >> the
> >>> >> >> lock we get into this existential gridlock where we're not sure
> if
> >>> >> >> the
> >>> >> >> process _is_ alive, so we shouldn't remove the lock, or the
> process
> >>> >> >> is
> >>> >> >> dead, so we should remove the lock.
> >>> >> >>
> >>> >> >> abstract unix domain sockets do not have this problem on windows;
> >>> >> >> kill
> >>> >> >> the process, file is removed from the abstract namespace.
> >>> >> >
> >>> >> >
> >>> >> > POSIX advisory file locks (flock) do not have this problem either.
> >>> >> > See:
> >>> >> > man(2) fcntl, section "Advisory record locking". When the file
> >>> >> > descriptor is
> >>> >> > closed, the lock is released; file descriptors are closed when the
> >>> >> > process
> >>> >> > dies.
> >>> >> >
> >>> >> > We could build a mutex on top of a unix domain socket, but then
> >>> >> > we'll
> >>> >> > have
> >>> >> > something completely separate for Windows. Shared named mutex? I'm
> >>> >> > not
> >>> >> > convinced the overall solution would be any more robust, and I'm
> >>> >> > pretty
> >>> >> > sure
> >>> >> > it's going to be more complicated. Happy to be proven wrong
> though.
> >>> >> >
> >>> >> >> >
> >>> >> >> > We would have to contribute Windows support, but it's not hard,
> >>> >> >> > I've
> >>> >> >> > done it
> >>> >> >> > before.
> >>> >> >> >
> >>> >> >> >>
> >>> >> >> >> On Tue, Dec 1, 2015 at 10:55 AM, Casey Marshall
> >>> >> >> >> <casey.marsh...@canonical.com> wrote:
> >>> >> >> >> > How about github.com/camlistore/lock ?
> >>> >> >> >> >
> >>> >> >> >> > On Mon, Nov 30, 2015 at 5:43 PM, Tim Penhey
> >>> >> >> >> > <tim.pen...@canonical.com>
> >>> >> >> >> > wrote:
> >>> >> >> >> >>
> >>> >> >> >> >> Hi folks,
> >>> >> >> >> >>
> >>> >> >> >> >> The fslock was a mistake that I added to the codebase some
> >>> >> >> >> >> time
> >>> >> >> >> >> back.
> >>> >> >> >> >> It
> >>> >> >> >> >> provided an overly simplistic solution to a more complex
> >>> >> >> >> >> problem.
> >>> >> >> >> >>
> >>> >> >> >> >> Really the filesystem shouldn't be used as a locking
> >>> >> >> >> >> mechanism.
> >>> >> >> >> >>
> >>> >> >> >> >> Most of the code that exists for the fslock now is working
> >>> >> >> >> >> around
> >>> >> >> >> >> its
> >>> >> >> >> >> deficiencies. Instead we should be looking for a better
> >>> >> >> >> >> replacement.
> >>> >> >> >> >>
> >>> >> >> >> >> Some "features" that were added to fslock were added to
> work
> >>> >> >> >> >> around
> >>> >> >> >> >> the
> >>> >> >> >> >> issue that the lock did not die with the process that
> created
> >>> >> >> >> >> it,
> >>> >> >> >> >> so
> >>> >> >> >> >> some mechanism was needed to determine whether the lock
> >>> >> >> >> >> should be
> >>> >> >> >> >> broken
> >>> >> >> >> >> or not.
> >>> >> >> >> >>
> >>> >> >> >> >> What we really need is a good OS agnostic abstraction that
> >>> >> >> >> >> provides
> >>> >> >> >> >> the
> >>> >> >> >> >> ability to create a "named" lock, acquire the lock, release
> >>> >> >> >> >> the
> >>> >> >> >> >> lock,
> >>> >> >> >> >> and make sure that the lock dies when the process dies, so
> >>> >> >> >> >> another
> >>> >> >> >> >> process that is waiting can acquire the lock. This way no
> >>> >> >> >> >> "BreakLock"
> >>> >> >> >> >> functionality is required, nor do we need to try and do
> think
> >>> >> >> >> >> like
> >>> >> >> >> >> remember which process owns the lock.
> >>> >> >> >> >>
> >>> >> >> >> >> So...
> >>> >> >> >> >>
> >>> >> >> >> >> We have three current operating systems we need to support:
> >>> >> >> >> >>
> >>> >> >> >> >> Linux - Ubuntu and CentOS
> >>> >> >> >> >> MacOS - client only - bit the CLI uses a lock for the local
> >>> >> >> >> >> cache
> >>> >> >> >> >> Windows
> >>> >> >> >> >>
> >>> >> >> >> >> For Linux, and possibly MacOS, flock is a possibility, but
> >>> >> >> >> >> can we
> >>> >> >> >> >> do
> >>> >> >> >> >> better? Is there something that is better suited?
> >>> >> >> >> >>
> >>> >> >> >> >> For Windows, while you can create global semaphores or
> mutex
> >>> >> >> >> >> instances,
> >>> >> >> >> >> I'm not sure of entities that die with the process. Can
> >>> >> >> >> >> people
> >>> >> >> >> >> recommend
> >>> >> >> >> >> solutions?
> >>> >> >> >> >>
> >>> >> >> >> >> Cheers,
> >>> >> >> >> >> Tim
> >>> >> >> >> >>
> >>> >> >> >> >> --
> >>> >> >> >> >> Juju-dev mailing list
> >>> >> >> >> >> Juju-dev@lists.ubuntu.com
> >>> >> >> >> >> Modify settings or unsubscribe at:
> >>> >> >> >> >> https://lists.ubuntu.com/mailman/listinfo/juju-dev
> >>> >> >> >> >
> >>> >> >> >> >
> >>> >> >> >> >
> >>> >> >> >> > --
> >>> >> >> >> > Juju-dev mailing list
> >>> >> >> >> > Juju-dev@lists.ubuntu.com
> >>> >> >> >> > Modify settings or unsubscribe at:
> >>> >> >> >> > https://lists.ubuntu.com/mailman/listinfo/juju-dev
> >>> >> >> >> >
> >>> >> >> >>
> >>> >> >> >> --
> >>> >> >> >> Juju-dev mailing list
> >>> >> >> >> Juju-dev@lists.ubuntu.com
> >>> >> >> >> Modify settings or unsubscribe at:
> >>> >> >> >> https://lists.ubuntu.com/mailman/listinfo/juju-dev
> >>
> >> --
> >> Juju-dev mailing list
> >> Juju-dev@lists.ubuntu.com
> >> Modify settings or unsubscribe at:
> >> https://lists.ubuntu.com/mailman/listinfo/juju-dev
> >
> >
> > --
> > Juju-dev mailing list
> > Juju-dev@lists.ubuntu.com
> > Modify settings or unsubscribe at:
> > https://lists.ubuntu.com/mailman/listinfo/juju-dev
> >
>
-- 
Juju-dev mailing list
Juju-dev@lists.ubuntu.com
Modify settings or unsubscribe at: 
https://lists.ubuntu.com/mailman/listinfo/juju-dev

Reply via email to