3
0
mirror of https://github.com/pragma-/pbot.git synced 2024-11-19 10:29:30 +01:00

Compiler VM now resets after each execution

This commit is contained in:
Pragmatic Software 2017-09-07 17:51:13 -07:00
parent 7792fd9bb0
commit 6fb1c3a142

View File

@ -10,6 +10,7 @@ use strict;
use IO::Socket; use IO::Socket;
use Net::hostent; use Net::hostent;
use IPC::Shareable; use IPC::Shareable;
use Time::HiRes qw/gettimeofday/;
my $SERVER_PORT = 9000; my $SERVER_PORT = 9000;
my $MONITOR_PORT = 3335; my $MONITOR_PORT = 3335;
@ -127,6 +128,8 @@ sub compiler_server {
tie $heartbeat, 'IPC::Shareable', 'dat1', { create => 1 }; tie $heartbeat, 'IPC::Shareable', 'dat1', { create => 1 };
tie $running, 'IPC::Shareable', 'dat2', { create => 1 }; tie $running, 'IPC::Shareable', 'dat2', { create => 1 };
my $last_wait = 0;
while(1) { while(1) {
$running = 1; $running = 1;
$heartbeat = 0; $heartbeat = 0;
@ -142,27 +145,55 @@ sub compiler_server {
tie $running, 'IPC::Shareable', 'dat2', { create => 1 }; tie $running, 'IPC::Shareable', 'dat2', { create => 1 };
$heartbeat_monitor = undef; $heartbeat_monitor = undef;
while(not $heartbeat_monitor) { my $attempts = 0;
while((not $heartbeat_monitor) and $attempts < 5) {
print "Connecting to heartbeat ..."; print "Connecting to heartbeat ...";
$heartbeat_monitor = IO::Socket::INET->new(PeerAddr => '127.0.0.1', PeerPort => $HEARTBEAT_PORT, Proto => 'tcp', Type => SOCK_STREAM); $heartbeat_monitor = IO::Socket::INET->new(PeerAddr => '127.0.0.1', PeerPort => $HEARTBEAT_PORT, Proto => 'tcp', Type => SOCK_STREAM);
if(not $heartbeat_monitor) { if(not $heartbeat_monitor) {
print " failed.\n"; print " failed.\n";
++$attempts;
sleep 2; sleep 2;
} else { } else {
print " success!\n"; print " success!\n";
} }
} }
#print "child: running: $running\n"; if ($attempts >= 5) {
print "heart not beating... restarting\n";
$heartbeat = -1;
sleep 5;
next;
}
print "child: running: $running\n";
while($running and <$heartbeat_monitor>) { while($running and <$heartbeat_monitor>) {
$heartbeat = 1; $heartbeat = 1;
#print "child: got heartbeat\n"; #print "child: got heartbeat\n";
} }
#print "child no longer running\n"; print "child no longer running\n";
exit; exit;
} else { } else {
while ($heartbeat <= 0) {
if ($heartbeat == -1) {
print "heartbeat died\n";
last;
}
print "sleeping for heartbeat...\n";
sleep 1;
}
if ($heartbeat == -1) {
print "fucking dead, restarting\n";
waitpid $heartbeat_pid, 0;
vm_stop $vm_pid;
next;
}
print "K, got heartbeat, here we go...\n";
if(not defined $server) { if(not defined $server) {
print "Starting compiler server on port $SERVER_PORT\n"; print "Starting compiler server on port $SERVER_PORT\n";
$server = server_listen($SERVER_PORT); $server = server_listen($SERVER_PORT);
@ -170,7 +201,7 @@ sub compiler_server {
print "Compiler server already listening on port $SERVER_PORT\n"; print "Compiler server already listening on port $SERVER_PORT\n";
} }
#print "parent: running: $running\n"; print "parent: running: $running\n";
while ($running and my $client = $server->accept()) { while ($running and my $client = $server->accept()) {
$client->autoflush(1); $client->autoflush(1);
@ -196,9 +227,10 @@ sub compiler_server {
print "got: [$line]\n"; print "got: [$line]\n";
if($line =~ m/^compile:end$/) { if($line =~ m/^compile:end$/) {
if($heartbeat == 0) { if($heartbeat <= 0) {
print "No heartbeat yet, ignoring compile attempt.\n"; print "No heartbeat yet, ignoring compile attempt.\n";
print $client "$nick: Recovering from previous snippet, please wait.\n"; print $client "$nick: Recovering from previous snippet, please wait.\n" if gettimeofday - $last_wait > 60;
$last_wait = gettimeofday;
last; last;
} }
@ -233,7 +265,7 @@ sub compiler_server {
$ret = -14 if $killed; $ret = -14 if $killed;
# child exit # child exit
# print "child exit\n"; print "child exit\n";
exit $ret; exit $ret;
} }
@ -256,14 +288,14 @@ sub compiler_server {
close $client; close $client;
#next unless ($timed_out or $killed); #next unless ($timed_out or $killed);
next unless $timed_out; #next unless $timed_out;
print "stopping vm $vm_pid\n"; print "stopping vm $vm_pid\n";
vm_stop $vm_pid; vm_stop $vm_pid;
$running = 0; $running = 0;
last; last;
} }
#print "Compiler server no longer running, restarting...\n"; print "Compiler server no longer running, restarting...\n";
} }
waitpid($heartbeat_pid, 0); waitpid($heartbeat_pid, 0);
} }