loadparm in Samba4

tridge at samba.org tridge at samba.org
Sat Sep 16 15:17:22 GMT 2006


I hit a snag with the new parameter handling code in Samba4. A lot of
hosts in the build farm are currently failing the test_simple.sh test
(which tests BASE-RW1 against the simple ntvfs backend), because the
CHECK_READ_ONLY() check in each function in that backend is returning
'true', even though we have 'read only = no' in smb.conf.

It turned out that the problem was the change to a real bool type, and
the call to set_boolean() in loadparm.c. On big-endian hosts where
sizeof(int) != sizeof(BOOL) it broke. It should be fixed now.

Anyway, this prompted me to take a closer look at the new share
parameter code, and I'm concerned about the speed.

In the old code, doing something like lp_readonly() involved maybe a
couple of dozen machine instructions. It was just a function call and
a pointer defer to return an integer. Very fast!

In the new code, the CHECK_READ_ONLY() test does the following:

 - deref two pointers in getting ntvfs->ctx->config
 - deref 3 more pointers in getting to scfg->ctx->ops->bool_option()
 - 1 strchr() call to look for a ':'
 - 3 strcmp calls to find the lp_readonly() function
 - finally the dereference is done

this is way too slow! 

If we convert all our code to preload parameters the way the posix
backend does (filling in pvfs_setup_options()) then the speed is OK,
but I think we still have a lot of places where we do simple loadparm
checks at runtime. Innocuous looking macros like CHECK_READ_ONLY() in
the simple backend now expand to some very slow code.

I think we need to either make these common calls much faster, or make
a concerted effort to get rid of any frequent calls to loadparm

Cheers, Tridge

More information about the samba-technical mailing list