diff --git a/xCAT-openbmc-py/lib/python/agent/xcatagent/server.py b/xCAT-openbmc-py/lib/python/agent/xcatagent/server.py index 56b234f2b..30f9d0f4d 100644 --- a/xCAT-openbmc-py/lib/python/agent/xcatagent/server.py +++ b/xCAT-openbmc-py/lib/python/agent/xcatagent/server.py @@ -129,6 +129,6 @@ class Server(object): t.start() def start(self): - if not self.standalone and self.lockfile: + if not self.standalone: self.keep_peer_alive() self.server.serve_forever() diff --git a/xCAT-server/lib/perl/xCAT/OPENBMC.pm b/xCAT-server/lib/perl/xCAT/OPENBMC.pm index c21fd1f8c..bc583ee87 100644 --- a/xCAT-server/lib/perl/xCAT/OPENBMC.pm +++ b/xCAT-server/lib/perl/xCAT/OPENBMC.pm @@ -25,8 +25,8 @@ use xCAT_monitoring::monitorctrl; use xCAT::TableUtils; my $LOCK_DIR = "/var/lock/xcat/"; -my $LOCK_PATH = "/var/lock/xcat/agent.lock"; -my $AGENT_SOCK_PATH = "/var/run/xcat/agent.sock"; +my $LOCK_PATH = "/var/lock/xcat/agent-$$.lock"; +my $AGENT_SOCK_PATH = "/var/run/xcat/agent-$$.sock"; my $PYTHON_LOG_PATH = "/var/log/xcat/agent.log"; my $PYTHON_AGENT_FILE = "/opt/xcat/lib/python/agent/agent.py"; my $MSG_TYPE = "message"; @@ -64,10 +64,10 @@ sub send_request { sub acquire_lock { mkpath($LOCK_DIR); # always create a new lock file - unlink($LOCK_PATH . $$); - open($lock_fd, ">>", $LOCK_PATH . $$) or return undef; + unlink($LOCK_PATH); + open($lock_fd, ">>", $LOCK_PATH) or return undef; flock($lock_fd, LOCK_EX) or return undef; - return $LOCK_PATH . $$; + return $lock_fd; } sub exists_python_agent { @@ -76,10 +76,13 @@ sub exists_python_agent { } return 0; } +sub python_agent_reaper { + unlink($LOCK_PATH); + unlink($AGENT_SOCK_PATH); +} sub start_python_agent { - my $lockfile = acquire_lock(); - if (!defined($lockfile)) { + if (!defined(acquire_lock())) { xCAT::MsgUtils->message("S", "start_python_agent() Error: Failed to acquire lock"); return undef; } @@ -91,18 +94,18 @@ sub start_python_agent { return undef; } elsif ($pid){ - open($fd, '>', $AGENT_SOCK_PATH . $pid) && close($fd); + open($fd, '>', $AGENT_SOCK_PATH) && close($fd); + $SIG{INT} = $SIG{TERM} = \&python_agent_reaper; return $pid; } $SIG{CHLD} = 'DEFAULT'; if (!$pid) { - # child open($fd, ">>", $PYTHON_LOG_PATH) && close($fd); open(STDOUT, '>>', $PYTHON_LOG_PATH) or die("open: $!"); open(STDERR, '>>&', \*STDOUT) or die("open: $!"); - my @args = ( "$PYTHON_AGENT_FILE --sock $AGENT_SOCK_PATH$$ --lockfile $lockfile" ); + my @args = ( "$PYTHON_AGENT_FILE --sock $AGENT_SOCK_PATH --lockfile $LOCK_PATH" ); my $ret = exec @args; if (!defined($ret)) { xCAT::MsgUtils->message("S", "start_python_agent() Error: Failed to start the xCAT Python agent."); @@ -139,7 +142,7 @@ sub submit_agent_request { my $sock; my $retry = 0; while($retry < 30) { - $sock = IO::Socket::UNIX->new(Peer => $AGENT_SOCK_PATH . $pid, Type => SOCK_STREAM, Timeout => 10, Blocking => 1); + $sock = IO::Socket::UNIX->new(Peer => $AGENT_SOCK_PATH, Type => SOCK_STREAM, Timeout => 10, Blocking => 1); if (!defined($sock)) { sleep(0.1); } else { @@ -148,7 +151,7 @@ sub submit_agent_request { $retry++; } if (!defined($sock)) { - xCAT::MsgUtils->message("E", { data => ["OpenBMC management is using a Python framework. An error has occurred when trying to create socket $AGENT_SOCK_PATH$pid."] }, $callback); + xCAT::MsgUtils->message("E", { data => ["OpenBMC management is using a Python framework. An error has occurred when trying to create socket $AGENT_SOCK_PATH."] }, $callback); kill('TERM', $pid); return; } @@ -209,8 +212,7 @@ sub wait_agent { xCAT::MsgUtils->message("E", { data => ["Agent exited unexpectedly. See $PYTHON_LOG_PATH for details."] }, $callback); xCAT::MsgUtils->message("I", { data => ["To revert to Perl framework: chdef -t site clustersite openbmcperl=ALL"] }, $callback); } - unlink($AGENT_SOCK_PATH . $pid); - unlink($LOCK_PATH . $$); + python_agent_reaper(); } #--------------------------------------------------------------------------------