#!/bin/bash # function to acquire to flock on a local file # Usage # flock [-e|-x|-w] # Return # non-zero in case of errors # flock_fd variable will contain the fd function flock { [ -z "$1" ] && return local file="" timeout=20 mode="-x" while ! [ -z "$1" ]; do case "$1" in -x) mode="-x" shift ;; -s) mode="-s" shift ;; -w) timeout=$2 shift shift ;; *) file=$1 ;; esac ! [ -z "$file" ] && break done [ -z "$file" ] && return 1 ! [ -f "$file" ] && touch $file ! [ -f "$file" ] && return 1 local freefd=`ls /proc/$$/fd | sort -n | awk 'BEGIN{count=0} {if($1 != count) {print count; exit} else {count++}}'` let freefd=$freefd+1 eval "exec $freefd>>$file" [ $? -ne 0 ] && return 1 flock $mode -w $timeout $freefd local ret=$? if [ $ret -eq 0 ]; then flock_fd=$freefd else eval "exec $freefd>&-" fi return $ret } # function to unlock a local flock # Usage # flock_unlock # Return # non-zero in case of errors function flock_unlock { # close the file, it would remove the locks [ -z "$1" ] && return 1 eval "exec $1>&-" return 0 }
Tuesday, November 15, 2011
Script to dynamically choose fd for a flock
This is a sample script which automatically chooses a unused fd, opens the requested lock file with that fd and acquires a lock on that file
SLES11SP1 pure-ftpd performance poor, uses mmap instead of sendfile
The default pure-ftpd that is available with SLES11SP1 seems to be using mmap for download instead of the preferred sendfile()
When you install the source rpm for pure-ftpd you would see that sendfile code is there with proper flags, and pure-ftpd does not seem to use it
If you check the pure-ftpd binary for any references to sendfile() in pure-ftpd binary, then there won't be any
When you look deeper into the code there is a bug in src/ftpd.h of pure-ftpd bundled with SLES11SP1 which causes mmap to be used instead of the preferred sendfile()
Install the source rpm and check the sources and Create the source tree for the package. Unpack the source tar ball and apply patches
Once the sources the sources are installed, if we look at how sendfile can be enabled from Makefile/configure scripts
But the ftp sources in src/ directory
The configure/makefile scripts use SENDFILE64_LINUX, whereas the ftp sources use SENDFILE_LINUX64. Due to this incorrect macro variable name being used in sources, even though sendfile is enabled from configure/makefile level, the code generated with SLES11SP1 does not use sendfile().
http://bradthemad.org/tech/notes/patching_rpms.php contains details of how to make changes to the package and rebuild the rpm
When you install the source rpm for pure-ftpd you would see that sendfile code is there with proper flags, and pure-ftpd does not seem to use it
If you check the pure-ftpd binary for any references to sendfile() in pure-ftpd binary, then there won't be any
$ nm /usr/sbin/pure-ftpd | grep sendfile
When you look deeper into the code there is a bug in src/ftpd.h of pure-ftpd bundled with SLES11SP1 which causes mmap to be used instead of the preferred sendfile()
Install the source rpm and check the sources and Create the source tree for the package. Unpack the source tar ball and apply patches
$ rpm -ivh pure-ftpd-1.0.21-183.11.2.src.rpm
$ cd /usr/src/packages $ rpmbuild -bp SPECS/pure-ftpd.spec
Once the sources the sources are installed, if we look at how sendfile can be enabled from Makefile/configure scripts
# grep SENDFILE * | grep LINUX | grep 64 config.h.in:#undef SENDFILE64_LINUX configure:#define SENDFILE64_LINUX configure.ac: AC_DEFINE(SENDFILE64_LINUX,,[define if you have a linuxish sendfile64])
But the ftp sources in src/ directory
# grep SENDFILE * | grep LINUX | grep 64 ftpd.h:# undef SENDFILE64_LINUX ftpd.h: defined(SENDFILE_HPUX) || defined(SENDFILE64_LINUX) ftpd.h.orig:# undef SENDFILE_LINUX64 ftpd.h.orig: defined(SENDFILE_HPUX) || defined(SENDFILE_LINUX64)
The configure/makefile scripts use SENDFILE64_LINUX, whereas the ftp sources use SENDFILE_LINUX64. Due to this incorrect macro variable name being used in sources, even though sendfile is enabled from configure/makefile level, the code generated with SLES11SP1 does not use sendfile().
http://bradthemad.org/tech/notes/patching_rpms.php contains details of how to make changes to the package and rebuild the rpm
Thursday, November 3, 2011
A burn production: Never Extinguish
A burn production: Never Extinguish from Burn on Vimeo.
Tech to Improve Your Video Productions
Tuesday, November 1, 2011
TEDx in a Box
TEDx in a Box from IDEO.org on Vimeo.
Greenpeace - Ocean Action
Greenpeace - Ocean Action from Jens Blank on Vimeo.
Subscribe to:
Posts (Atom)