From 1e5966ad993b4feaf4f687032d7239dd883d99a8 Mon Sep 17 00:00:00 2001 From: Leigh B Stoller Date: Thu, 11 Oct 2018 06:50:00 -0600 Subject: [PATCH] Fix discrepancy between TBSetNodeEventState() and Node->SetEventState(); both send an event for stated to pick up, but the later also immediately updates the DB while the former does not. This can lead to lost or out of sync stated events. --- db/Node.pm.in | 32 ++++++++++++++++++-------------- db/libdb.pm.in | 20 +++----------------- 2 files changed, 21 insertions(+), 31 deletions(-) diff --git a/db/Node.pm.in b/db/Node.pm.in index d4e33be26..da9998c22 100755 --- a/db/Node.pm.in +++ b/db/Node.pm.in @@ -2297,11 +2297,13 @@ sub GetBootLog($$) } # -# Set event state for a node. +# Set event state for a node. Note that we do not change the DB here, +# but let stated do that. If stated dies ... # -sub SetEventState($$) +sub SetEventState($$;$) { - my ($self, $state) = @_; + my ($self, $state, $fatal) = @_; + my $rval; require event; # Must be a real reference. @@ -2310,17 +2312,19 @@ sub SetEventState($$) my $node_id = $self->node_id(); - # - # If using the event system, we send out an event for the state daemon to - # pick up. Otherwise, we just set the state in the database ourselves - # - return event::EventSendFatal(objtype => TBDB_TBEVENT_NODESTATE, - objname => $node_id, - eventtype => $state, - host => $BOSSNODE); - - return $self->Update({"eventstate" => $state, - "state_timestamp" => time()}); + if (!defined($fatal) || $fatal) { + $rval = event::EventSendFatal(objtype => TBDB_TBEVENT_NODESTATE, + objname => $node_id, + eventtype => $state, + host => $BOSSNODE); + } + else { + $rval = event::EventSendWarn(objtype => TBDB_TBEVENT_NODESTATE, + objname => $node_id, + eventtype => $state, + host => $BOSSNODE); + } + return ($rval == 1 ? 0 : -1); } sub ResetStartStatus($) diff --git a/db/libdb.pm.in b/db/libdb.pm.in index d96198b51..3f08c1d5c 100644 --- a/db/libdb.pm.in +++ b/db/libdb.pm.in @@ -940,24 +940,10 @@ sub TBSetNodeEventState($$;$) { my ($node, $state, $fatal) = @_; - # - # If using the event system, we send out an event for the state daemon to - # pick up. Otherwise, we just set the state in the database ourselves - # - require event; - - if (!defined($fatal) || $fatal) { - return event::EventSendFatal(objtype => TBDB_TBEVENT_NODESTATE, - objname => $node, - eventtype => $state, - host => $BOSSNODE); - } - else { - return event::EventSendWarn(objtype => TBDB_TBEVENT_NODESTATE, - objname => $node, - eventtype => $state, - host => $BOSSNODE); + if (!ref($node)) { + $node = LocalNodeLookup($node); } + return $node->SetEventState($state, $fatal); } # -- GitLab