Rev 607: merge from Ronnie in http://samba.org/~tridge/3_0-ctdb
tridge at samba.org
tridge at samba.org
Mon Aug 20 00:21:56 GMT 2007
------------------------------------------------------------
revno: 607
revision-id: tridge at samba.org-20070820002154-hh2wpibu9vk0ixcy
parent: tridge at samba.org-20070816043152-3coxvj92k9i1pfse
parent: sahlberg at ronnie-20070819214632-kae72z93iqy5wh2c
committer: Andrew Tridgell <tridge at samba.org>
branch nick: s3-ctdb-tridge
timestamp: Mon 2007-08-20 10:21:54 +1000
message:
merge from Ronnie
modified:
source/smbd/server.c server.c-20070210173807-1wjifrbwaz6xnmgl-1036
------------------------------------------------------------
revno: 606.1.3
merged: sahlberg at ronnie-20070819214632-kae72z93iqy5wh2c
parent: sahlberg at ronnie-20070819211411-w2me4w802oo60znc
committer: Ronnie Sahlberg <sahlberg at ronnie>
branch nick: 3_0-ctdb
timestamp: Mon 2007-08-20 07:46:32 +1000
message:
use the exit status of a terminated child smbd to determine whether we
need to revalidate all locks or not
------------------------------------------------------------
revno: 606.1.2
merged: sahlberg at ronnie-20070819211411-w2me4w802oo60znc
parent: root at ronnie-20070817014017-1zcunbbaenbuoukm
committer: Ronnie Sahlberg <sahlberg at ronnie>
branch nick: 3_0-ctdb
timestamp: Mon 2007-08-20 07:14:11 +1000
message:
revert the brwriter tdb changes
and try to solve the issue differently
------------------------------------------------------------
revno: 606.1.1
merged: root at ronnie-20070817014017-1zcunbbaenbuoukm
parent: tridge at samba.org-20070816043152-3coxvj92k9i1pfse
committer: root <root at ronnie>
branch nick: 3_0-ctdb
timestamp: Fri 2007-08-17 11:40:17 +1000
message:
create a new tdb 'brwriters' that stores a record for each process/smbd that
has performed read/write operations to the br database.
this allows the parent smbd process to know when a child has terminated
without doing any byte range locking (and thus we can skip doing any brl
revalidation)
or when a child has performed brl operations in which case we have to perform
the expensive revalidation process.
since clients today try both port 139 and 445 simultaneously this means that
at least half of all samba daemons will never perform any br locking at
all and just by doing this we avoid revalidation in 50% of the cases
=== modified file 'source/smbd/server.c'
--- a/source/smbd/server.c 2007-08-16 04:31:52 +0000
+++ b/source/smbd/server.c 2007-08-19 21:46:32 +0000
@@ -261,15 +261,19 @@
num_children += 1;
}
-static void remove_child_pid(pid_t pid)
+static void remove_child_pid(pid_t pid, BOOL unclean_shutdown)
{
struct child_pid *child;
- /* a child terminated so tickle all processes to see if they can
- grab any of the pending locks
- */
- message_send_pid(procid_self(), MSG_SMB_BRL_VALIDATE, NULL, 0, False);
- message_send_all(MSG_SMB_UNLOCK, NULL, 0, False, NULL);
+
+ if (unclean_shutdown) {
+ /* a child terminated uncleanly so tickle all processes to see
+ if they can grab any of the pending locks
+ */
+ message_send_pid(procid_self(), MSG_SMB_BRL_VALIDATE,
+ NULL, 0, False);
+ message_send_all(MSG_SMB_UNLOCK, NULL, 0, False, NULL);
+ }
if (lp_max_smbd_processes() == 0) {
@@ -387,10 +391,27 @@
if (got_sig_cld) {
pid_t pid;
+ int status;
+
got_sig_cld = False;
- while ((pid = sys_waitpid(-1, NULL, WNOHANG)) > 0) {
- remove_child_pid(pid);
+ while ((pid = sys_waitpid(-1, &status, WNOHANG)) > 0) {
+ BOOL unclean_shutdown = False;
+
+ /* If the child terminated normally, assume
+ it was an unclean shutdown unless the
+ status is 0
+ */
+ if (WIFEXITED(status)) {
+ unclean_shutdown = WEXITSTATUS(status);
+ }
+ /* If the child terminated due to a signal
+ we always assume it was unclean.
+ */
+ if (WIFSIGNALED(status)) {
+ unclean_shutdown = True;
+ }
+ remove_child_pid(pid, unclean_shutdown);
}
}
More information about the samba-cvs
mailing list