A fresh fix is available at:

http://cr.opensolaris.org/~pavelf/6778894-v2     (yes, the previous and 
fragile v2 workspace is lost)

This fix is short and easy to read.

Performance of the fix is good, I have a setup with 1.000 and 5.000 NFS 
mounts and 14 and 78 autofs mounts.
I was measuring the time of 'umountall -ln'


1)
nfs mounts: 1.000
autofs mounts: 14

time:
real    0m8.071s
user    0m7.233s
sys     0m0.720s

time without the fix:
real    0m1.522s
user    0m0.866s
sys     0m0.721s


2)
nfs mounts: 5.000
autofs mounts: 14

time:
real    2m3.760s
user    2m1.470s
sys     0m2.217s

time without the fix:
real    0m5.312s
user    0m3.385s
sys     0m2.086s


3)
nfs mounts: 1.000
autofs mounts: 78

time:
real    0m8.612s
user    0m7.577s
sys     0m0.972s

time without the fix:
real    0m1.972s
user    0m1.099s
sys     0m0.953s


4)
nfs mounts: 5.000
autofs mounts: 78

time:
real    2m12.247s
user    2m1.785s
sys     0m3.325s


time with the previous fix based on string_grep()
real    2m2.689s
user    2m0.188s
sys     0m2.468s

time without the fix:
real    0m5.429s
user    0m3.390s
sys     0m2.248s




============

Perfomance testing shows that the most important is the number of NFS 
mounts,
number of autos mounts is less important.

The costly operation is the memory allocation for the nfs list at line 288:

      288 +                                NFS_LIST="$NFS_LIST $mountp"


============


For comparison, umountall -rn (unmount only nfs) need also similar time
- again it is also doing lot of  malloc in a loop on line 331

 331                                 fslist="$fslist $mountp"


My fix:
real    2m16.532s
user    1m58.620s
sys     0m41.238s

Original:
real    2m10.853s
user    1m53.127s
sys     0m41.642s




--Pavel


> This is what you added:
>
>       239 +# Find if a given string is in a pipe separated list
>       240 +# Usage: string_grep string pattern
>       241 +# Example:
>       242 +# string_grep /var/tmp "/var/tmp|/net/server.domain|/home/user"
>       243 +string_grep() {
>       244 +        eval "case $1 in '$2') return 0;; esac; return 1"
>       245 +}
>
> Try:
>
> string_grep() {
>       eval "case \"$1\" in $2) return 0;; esac; return 1"
> }
>
>   

The quotes arround  the '$2' were only in my debug workspace and I have 
put it incorrectly to cr.opensolaris.org.
Testing which was done without the quotes showed a problem if a 
mountpoint was "/*" -  it was matching
all mountpoints.

> The difference: a) cause $1 to be quoted in the eval'ed string, b) cause
> $2 not to be so quoted.
>   



Reply via email to