Print

Print


Dear Xrootd Developers,

I have been reading the source of xrootd's load balancer to try to 
understand what it does and found some lint and a bug.  The line 
numbers are approximate.

src/XrdOlb/XrdOlbConfig.cc:
295:  NoGo = ConfigProc();
This line should be NoGo |= ConfigProc(); (+= would work too). 
Otherwise it trumps the assignment to NoGo a few lines before.  It 
isn't clear that you even need to bother with the ConfigProc call if 
NoGo is already set.

908:  xallow - it appears that if the host/netgroup argument is omitted 
it defaults to host. So in the config file
    allow xyz.stanford.edu
is equivalent to
    allow host xyz.standford.edu
If that is correct, the comment at the start of xallow should point 
that out. The syntax description does indicate that the host/netgroup 
argument is optional, but doesn't state the default.  Another solution 
is to make it mandatory.

1384: there is a comment about xperf calling a program to write values 
into "shared memory". I believe this is out of date, and if so, it is 
misleading. If I read the code correctly, the Meter code just execs the 
monitor process using custom code that looks a lot like a 
reimplementation of popen().

src/XrdOlb/XrdOlbManager.cc
The Snooze method declares maxerrs=3 and later, outside of any loop, 
has "if (!maxerrs--) return 0;" which will never be satisfied, since it 
will always be 3.

The Add_Manager method (line 984?):  The comment before it says 
AddMaster instead of Add_Manager and the epname omits the underscore in 
the method name.

src/XrdOlb/XrdOlbMeter.cc
This #includes <sys/shm.h>. I suspect this is no longer needed. Other 
include files may also be redundant.

src/XrdOuc/XrdOucPthread.cc
At first glance it appears that the code in XrdOucThread_Start() is 
equivalent to
	return pthread_create(tid, NULL, proc, arg);
If that is correct, it will be easier to read if you reduce it to that.

Likewise, the following method  XrdOucThread_Run() would be somewhat 
clearer as
int rc;
if ((rc = XrdOucThread_Start(tid, proc, arg)) == 0) { rc = 
XrdOucThread_Detach(*tid); }
return rc;

utils/fs_stat: I don't know if this script is used for anything 
important, but it goes to much trouble to find the path to the df 
program. It then ignores that knowledge and hardwires /bin/df into the 
command to get the file system status.

General observations:
1. The configuration file-reading code is effectively replicated 4 
times. Presumably there was a time when there were four separate config 
files. It might be better to unify it (since there is now effectively 
only one config file anyway) and make it table-driven for each 
subcomponent so that the code is smaller and more maintainable.
2. There are several unnecessary casts in the code. Casting variables 
of type "char *" to (const char *) when passing them as arguments to 
functions expecting a (const char *) is redundant. (E.g., calls to 
access() frequently have a redundant cast.) I don't find that redundant 
casts improve the readability of the code. I stop to ask why it's there 
since it appears to be unnecessary and wonder what I am missing, but 
others may have a different view of this.

I hope these are helpful.
--
Gregory J. Sharp                   email: [log in to unmask]
Wilson Synchrotron Laboratory      url: 
http://www.lepp.cornell.edu/~gregor
Dryden Rd                          ph:  +1 607 255 4882
Ithaca, NY 14853                   fax: +1 607 255 8062