[GRASS-dev] Re: [GRASS GIS] #226: WinGRASS fails to create .gislock
opening a mapset
GRASS GIS
trac at osgeo.org
Fri Dec 16 04:57:32 EST 2011
#226: WinGRASS fails to create .gislock opening a mapset
----------------------------+-----------------------------------------------
Reporter: msieczka | Owner: grass-dev@…
Type: defect | Status: new
Priority: major | Milestone: 6.4.2
Component: Default | Version: svn-develbranch6
Keywords: wingrass, qgis | Platform: MSWindows XP
Cpu: All |
----------------------------+-----------------------------------------------
Comment(by mmetz):
Replying to [comment:12 glynn]:
> Replying to [comment:11 mmetz]:
>
> The existing code won't work in its entirety on Windows. As Windows
systems aren't generally multi-user, simply ignoring the entire locking
issue was the easiest solution.
But GRASS databases and locations are multi-user by design, the system
used to access a mapset may or may not be single-user, that would not
matter if the GRASS database is somewhere on a network.
>
> > Under Linux, assume the following scenario: a group of people are
working from different machines on the same location, different mapsets.
The location is on a network drive accessible by everyone. Now g.mapset
mapset=othermapset using lock (GIS_LOCK) checks if it could kill the pid
written in .gislock. But if the pid in .gislock has been written by a
different machine/system, then the pid in .gislock has nothing to do with
the pid's available to lock, and the kill()-test is complete moot. Right?
>
> The purpose of the kill() test is to check whether the .gislock file is
"stale", i.e. whether the session which created the .gislock file
terminated without removing it. If kill() fails with ESRCH, the PID stored
in the .gislock file doesn't refer to an existing process on the local
system, so the lock is assumed to be stale and is ignored. This test isn't
particularly reliable; it will consider the lock as stale if it was
created by a session on another machine, even if that session is still
alive, and will consider the lock as alive if the session has terminated
but its PID is now used by another process.
Sounds like using PID is not a reliable solution, this can easily result
in both false positives and false negatives.
>
> > Therefore I would suggest to skip the find_process() step and assume
that a mapset is locked as long as the file .gislock exists.
>
> That would avoid the issue with the lock file being considered stale due
to having been created on a different system. OTOH, it would require stale
lock files to always be removed manually. If that is considered a problem,
writing a hostname along with the PID would solve the first issue without
abandoning automatic removal on non-shared filesystems.
I don't see an easy way for reliable automated handling based on GIS_LOCK
and the PID in .gis_lock, because a lock may be removed even though it is
alive or be not removed even though it is stale. How about avoiding PID
altogether and writing 'user at host' to .gislock? Currently, in trunk, the
wxGUI asks at startup if an existing lock should really, really be
removed. Starting trunk in text mode silently removes any gislock (needs
to be fixed). How about a new flag for yes-I-know_what-I'm-doing to try to
force remove an existing lock both at startup and for g.mapset?
Markus M
--
Ticket URL: <http://trac.osgeo.org/grass/ticket/226#comment:13>
GRASS GIS <http://grass.osgeo.org>
More information about the grass-dev
mailing list