summaryrefslogtreecommitdiff
path: root/storage/ndb/tools/old_dirs/ndbnet/lib/NDB/Net/Client.pm
diff options
context:
space:
mode:
Diffstat (limited to 'storage/ndb/tools/old_dirs/ndbnet/lib/NDB/Net/Client.pm')
-rw-r--r--storage/ndb/tools/old_dirs/ndbnet/lib/NDB/Net/Client.pm252
1 files changed, 0 insertions, 252 deletions
diff --git a/storage/ndb/tools/old_dirs/ndbnet/lib/NDB/Net/Client.pm b/storage/ndb/tools/old_dirs/ndbnet/lib/NDB/Net/Client.pm
deleted file mode 100644
index d34a18d63af..00000000000
--- a/storage/ndb/tools/old_dirs/ndbnet/lib/NDB/Net/Client.pm
+++ /dev/null
@@ -1,252 +0,0 @@
-package NDB::Net::Client;
-
-use strict;
-use Carp;
-use POSIX();
-use Socket;
-
-require NDB::Net::Base;
-
-use vars qw(@ISA);
-@ISA = qw(NDB::Net::Base);
-
-# constructors
-
-my $log;
-
-sub initmodule {
- $log = NDB::Util::Log->instance;
-}
-
-my %clientcache = ();
-my $clientid = 0;
-
-NDB::Net::Client->attributes(
- id => sub { /^\d+$/ },
- addtime => sub { /^\d+$/ },
- state => sub { /^(new|input|cmd)$/ },
- socket => sub { ref && $_->isa('NDB::Util::Socket') },
- serversocket => sub { ref && $_->isa('NDB::Util::Socket') },
- serverlock => sub { ref && $_->isa('NDB::Util::Lock') },
- event => sub { ref && $_->isa('NDB::Util::Event') },
- context => sub { defined },
- cmd => sub { ref && $_->isa('NDB::Net::Command') },
-);
-
-sub desc {
- my $client = shift;
- my $id = $client->getid;
- my $fileno = fileno($client->getsocket->getfh);
- return "client $id fd=$fileno";
-}
-
-sub new {
- my $class = shift;
- @_ % 2 == 0 or confess 0+@_;
- my(%attr) = @_;
- my $client = $class->SUPER::new(%attr);
- $client->setid(++$clientid)
- or $log->push, return undef;
- $client->setaddtime(time)
- or $log->push, return undef;
- $client->setstate(q(new))
- or $log->push, return undef;
- $client->setsocket($attr{socket})
- or $log->push, return undef;
- $client->setserversocket($attr{serversocket})
- or $log->push, return undef;
- $client->setserverlock($attr{serverlock})
- or $log->push, return undef;
- $client->setevent($attr{event})
- or $log->push, return undef;
- $client->setcontext($attr{context})
- or $log->push, return undef;
- $log->put("add")->push($client)->info;
- $clientcache{$client->getid} = $client;
- return $client;
-}
-
-sub listall {
- my $class = shift;
- my $list = [];
- for my $id (sort { $a <=> $b } keys %clientcache) {
- my $client = $clientcache{$id};
- push(@$list, $client);
- }
- return $list;
-}
-
-sub exists {
- my $client = shift;
- return exists($clientcache{$client->getid});
-}
-
-sub delete {
- my $client = shift;
- $log->put("delete")->push($client)->info;
- $client->getevent->clear($client->getsocket, 'r');
- $client->getsocket->close;
- delete $clientcache{$client->getid} or confess 'oops';
-}
-
-sub deleteother {
- my $thisclient = shift;
- for my $id (sort { $a <=> $b } keys %clientcache) {
- my $client = $clientcache{$id};
- if ($client ne $thisclient) {
- $client->delete;
- }
- }
-}
-
-sub deleteall {
- my $class = shift;
- for my $id (sort { $a <=> $b } keys %clientcache) {
- my $client = $clientcache{$id};
- $client->delete;
- }
-}
-
-# processing
-
-sub processnew {
- my $client = shift;
- @_ == 0 or confess 0+@_;
- $log->put("process new")->push($client)->debug;
- $client->getevent->set($client->getsocket, 'r');
- $log->attachuser(io => $client->getsocket);
- $client->setstate(q(input))
- or $log->push, return undef;
- return 1;
-}
-
-sub processinput {
- my $client = shift;
- @_ == 0 or confess 0+@_;
- $log->put("process input")->push($client)->debug;
- my $line = $client->getsocket->readline;
- if (! defined($line)) {
- $log->push;
- return undef;
- }
- if (length($line) == 0) {
- if ($client->getsocket->getreadend) {
- $log->put("no command")->push($client);
- return undef;
- }
- $log->put("wait for input")->push($client)->debug;
- return 1;
- }
- $log->put("got line: $line")->push($client)->info;
- $client->getevent->clear($client->getsocket, 'r');
- my $cmd = NDB::Net::Command->new(line => $line)
- or $log->push, return undef;
- $log->put("command received")->push($cmd)->push($client)->debug;
- $client->setcmd($cmd)
- or $log->push, return undef;
- $client->setstate(q(cmd))
- or $log->push, return undef;
- return 1;
-}
-
-sub processcmd {
- my $client = shift;
- @_ == 0 or confess 0+@_;
- $log->put("process cmd")->push($client)->debug;
- my $cmd = $client->getcmd;
- my $context = $client->getcontext;
- my $name_fg = "cmd_" . $cmd->getname . "_fg";
- my $name_bg = "cmd_" . $cmd->getname . "_bg";
- my $fg = $context->can($name_fg);
- my $bg = $context->can($name_bg);
- unless ($fg || $bg) {
- $log->put("%s: unimplemented", $cmd->getname);
- return undef;
- }
- my $ret;
- if ($fg) {
- $log->put($name_fg)->push($cmd)->push($client)->info;
- if (! ref($context)) {
- $ret = &$fg($cmd);
- }
- else {
- $ret = &$fg($context, $cmd);
- }
- defined($ret)
- or $log->push, return undef;
- if (! $bg) {
- $log->push($name_fg)->putvalue($ret)->user;
- return 1;
- }
- }
- if ($bg) {
- $log->put($name_bg)->push($cmd)->push($client)->info;
- my $pid = fork;
- if (! defined($pid)) {
- $log->put("fork failed: $!");
- return undef;
- }
- if ($pid == 0) {
- $client->getserversocket->close;
- $client->getserverlock->close;
- $client->deleteother;
- if (! ref($context)) {
- $ret = &$bg($cmd);
- }
- else {
- $ret = &$bg($context, $cmd);
- }
- if (! $ret) {
- $log->push($client)->error;
- $log->push($name_bg)->putvalue(undef)->user;
- exit(1);
- }
- $log->push($name_bg)->putvalue($ret)->user;
- exit(0);
- }
- }
- return 1;
-}
-
-sub process {
- my $client = shift;
- @_ == 0 or confess 0+@_;
- try: {
- if ($client->getstate eq q(new)) {
- $client->processnew
- or $log->push, last try;
- }
- if ($client->getstate eq q(input)) {
- $client->processinput
- or $log->push, last try;
- }
- if ($client->getstate eq q(cmd)) {
- $client->processcmd
- or $log->push, last try;
- $log->detachuser;
- $client->delete;
- return 1;
- }
- return 1;
- }
- $log->push($client)->error;
- $log->putvalue(undef)->user;
- $log->detachuser;
- $client->delete;
- return undef;
-}
-
-sub processall {
- my $class = shift;
- @_ == 0 or confess 0+@_;
- my $list = $class->listall;
- for my $client (@$list) {
- $client->process;
- }
- while ((my $pid = waitpid(-1, &POSIX::WNOHANG)) > 0) {
- $log->put("harvested pid=$pid")->info;
- }
-}
-
-1;
-# vim:set sw=4: