[linux-l] Lock-Dateien vs. Lock-Verzeichnisse

Benjamin Schieder blindcoder at scavenger.homeip.net
Mo Jul 17 07:02:44 CEST 2006


On 17.07.2006 11:30:31, Peter Ross wrote:
> BTW: mkdir und open sind beide in der libc und auf Kernelebene tut mkdir 
> das Gleiche wie open - testen, ob das Directory existiert und dann ein 
> Directory anlegen.

Ja, aber das ist in Ordnung so. Beim Locking geht es ja nur darum, dass
der Prozess, welcher einen Lock haben will, zwischen dem Oeffnen des Locks
und der Ueberpruefung des Locks nicht unterbrochen wird.
Irgendwo im Netz(TM) hab ich mal was gefunden, wie man Locks nicht-atomar
IMO vernuenftig umsetzt und das fuer exklusive und nicht-exklusive Locks
erweitert. Kurzer Ausschnitt (bash):

getlock_exclusive() { # {{{
        if [ -n "${1}" ] ; then
                stalelock_exclusive "${1}"		# check for stale lockfiles
                stalelock_shared "${1}"
                if [ -f "${1}.lock" ] && [ ! -w "${1}.lock" ] ; then
                        error "Can't write lockfile ${1}.lock!"
                        exit 1	# yes, the whole script dies
                fi
                if [ -e "${1}.lock" ] ; then
                        read pid < ${1}.lock
                        if [ ${pid} -ne ${$} ] ; then
                                return 1	# we don't have the lock
                        fi
                else
                        echo "${$}" >>${1}.lock	# we hope that this is atomic
                fi
                read pid < ${1}.lock	# but we don't rely on it
                if [ ${pid} -eq ${$} ] ; then
                        for x in ${1}.shared* ; do
                                [ -f "${x}" ] || continue
                                return 1 # as long as a shared lock exists, exclusive ones aren't granted
                        done
                        return 0
                else
                        return 1
                fi
        fi
} # }}}


getlock_shared() { # {{{
        if [ -n "${1}" ] ; then
                stalelock_exclusive "${1}"
                stalelock_shared "${1}"
                [ -e "${1}.lock" ] && return 1 # no shared locks with an exclusive one in place
                echo "${$}" >> "${1}.shared_${$}"
                return 0
        fi
} # }}}


Das Ganze funktioniert so:
Fuer einen exklusiven Lock wird in die Datei ${1}.lock die eigene PID
geschrieben (angehaengt, nicht ueberschrieben). Danach wird die erste Zeile
von ${1}.lock mit der aktuellem PID verglichen. Stimmen sie ueberein, gehoert
der Lock uns. Andernfalls war ein anderer Prozess schneller.

Ja, das Ganze haut ueber NFS nicht hin und auch nicht ueber Programmgrenzen
hinweg. Aber da ich das auch nicht benoetige in meiner Scriptsammlung kann
ich damit leben.


Gruesse,
	Benjamin
-- 
Benjamin 'blindCoder' Schieder
Registered Linux User #289529: http://counter.li.org
finger blindcoder at scavenger.homeip.net | gpg --import
-- 
/lusr/bin/brain: received signal: SIGIDIOT
-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : nicht verfügbar
Dateityp    : application/pgp-signature
Dateigröße  : 189 bytes
Beschreibung: nicht verfügbar
URL         : <https://mlists.in-berlin.de/pipermail/linux-l-mlists.in-berlin.de/attachments/20060717/f046b88e/attachment.sig>


Mehr Informationen über die Mailingliste linux-l