[rancid] control_rancid slow start

Robert Drake rdrake at direcpath.com
Tue Aug 16 06:50:35 UTC 2016

On 11/12/2014 8:23 PM, heasley wrote:
>> If I comment the following code out it runs in less than 3 seconds:
>> # check for 'up' routers missing in RCS.  no idea how this happens to
>> some folks
>> for router in `cut -d\; -f1 ../routers.up` ; do
>>       if [ $RCSSYS = cvs ] ; then
>>       cvs status $router | grep -i 'status: unknown' > /dev/null 2>&1
>>       else
>>       svn status $router | grep '^?' > /dev/null 2>&1
>>       fi
>>       if [ $? -eq 0 ] ; then
>>       touch $router
>>       if [ $RCSSYS = cvs ] ; then
>>           cvs add -ko $router
>>       else
>>           svn add $router
>>       fi
>>       echo "$RCSSYS added missing router $router"
>>       fi
>> done
>> Possible better option would be this (I think this will work with svn
>> but I don't have a tree to test it on):
>>    cut -d: -f1 ../routers.up | xargs cvs status | grep -i 'status: unknown'
>> Example test case:
>>    (echo test ; cut -d: -f1 ../routers.up) | xargs cvs status | grep -i
>> 'status: unknown'
>> cvs status: nothing known about test
>> File: no file test              Status: Unknown
> that doesnt quite work for non-existent files.
The test case shows it does work for non-existent files.  "test" is a 
non-existent file.  Unless I'm mistaken about what you mean by that.  
Depending on where the file is non-existent, you can grep two different 

File exists on disk in the configs/ dir but it's not in CVS:

       cut -d\; -f1 ../routers.up | xargs cvs status 2>&1 | grep 'Status: Unknown' | awk '{print $2}' | xargs cvs add -ko

Router name exists is routers.up, file does not exist in configs/ dir or in CVS:

       cut -d\; -f1 ../routers.up | xargs cvs status 2>&1 | grep 'cvs status: nothing' | awk '{print $6}' | xargs cvs add -ko

If you need to do two operations, touch + cvs add then you've got a 
choice.  You could put the output of the pipe into a temp file, then run 
cat $TEMPFILE | xargs touch && cat $TEMPFILE | xargs cvs add -ko, or you 
could take advantage of magic xargs flags to do something like:

       cut -d\; -f1 ../routers.up | xargs cvs status 2>&1 | grep 'cvs status: nothing' | awk '{print $6}' | xargs -I % sh -c 'touch %; cvs add -ko %'

Rather than going this route I think I would have two pipelines. The 
first part dumps into a tempfile based on what RCS is running, and the 
second part (touch/add/commit) is also broken out with a second case 
statement that tells it what to do.

In almost every case in control_rancid for loops are going to be slower 
than a pipeline due to the nature of shell scripting.  In most cases it 
doesn't matter because the potential work is not that high, but in the 
cases where you might need to run a cvs command 1000 times, it's much 
better to run it once or twice on a long list of files.

More information about the Rancid-discuss mailing list