[pulseaudio-discuss] Pulse-cookie locking in NFS causes 30 second delays

Colin Guthrie gmane at colin.guthr.ie
Fri Aug 19 02:23:34 PDT 2011


'Twas brillig, and David Henningsson at 19/08/11 09:21 did gyre and gimble:
> Hi,
> 
> I came across this bug:
> 
> https://bugs.launchpad.net/ubuntu/+source/pulseaudio/+bug/817269
> 
> Which claims the following (and also offers a patch [1] to fix it). I
> don't know much about file locking or NFS, but maybe someone here knows
> more than I here.
> 
> Quoting the bug:
> 
> Pulseaudio uses a cookie file (normally ~/.pulse-cookie). This file is
> manipulated by the code in src/pulsecore/authkey.c. Currently it does
> this to read the key:
> 1) Open the file
> 2) Acquire a write-lock for the file.
> 3) Read the file.
> 4) If the file is not a good cookie, generate a new cookie and write it
> to the file.
> 5) Close the file.
> 
> If more than one thread is opening the cookie at once, then there is
> contention at step (2) which is rarely necessary. Instead, step (2)
> should acquire only a read-lock, and then step (4) should promote that
> to a write-lock before writing the file.
> 
> This is particularly bad in the case where the .pulse-cookie file is on
> NFS. In that case, the lock contention forces a thirty-second backoff
> from whichever thread gets there second.
> 
> I am happy to work with y'all in engineering a patch for this. It
> requires obviously a change to src/pulsecore/authkey.c, and a
> corresponding one in src/pulsecore/core-util.c where the actual lock
> syscall occurs.
> 
> The following script (if ~ is in NFS) will demonstrate the problem. The
> two pactl processes both try to acquire the lock on the file
> simultaneously, and whichever one loses will take thirty seconds before
> it wins, because of the needless contention (and the unfortunate facts
> of how lockd in NFS works).
> 
> !/bin/bash
> 
> NUM_PROCS=2
> 
> procs=()
> for i in $(seq 1 $NUM_PROCS); do
>   pactl list > /dev/null &
>   procs[$i]=$!
> done
> for i in $(seq 1 $NUM_PROCS); do
>   wait ${procs[$i]}
> done
> 
> 


On first glance, this seems sensible, but I'd like Lennart's comment on
this one as locking is one area I don't feel super confident playing
around with!

Lennart, thoughts? See the link for the proposed patch.

Col



-- 

Colin Guthrie
gmane(at)colin.guthr.ie
http://colin.guthr.ie/

Day Job:
  Tribalogic Limited [http://www.tribalogic.net/]
Open Source:
  Mageia Contributor [http://www.mageia.org/]
  PulseAudio Hacker [http://www.pulseaudio.org/]
  Trac Hacker [http://trac.edgewall.org/]


More information about the pulseaudio-discuss mailing list