/[Sack]/trunk/lib/Sack/Client.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /trunk/lib/Sack/Client.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 276 - (show annotations)
Fri Apr 30 14:34:49 2010 UTC (14 years ago) by dpavlin
File size: 2681 byte(s)
pass sack_port as second argument to client

bin/split.sh can again start two nodes on localhost
1 #!/usr/bin/perl
2
3 package Sack::Client;
4
5 use warnings;
6 use strict;
7
8 use IO::Socket::INET;
9 use IO::Select;
10 use Storable qw();
11
12 use lib '/srv/Sack/lib';
13 use Data::Dump qw(dump);
14 use Sack::View;
15
16 my ( $port, $sack_port ) = @ARGV;
17 $sack_port ||= $ENV{SACK_PORT} || $port;
18 my $debug = 0;
19 my $data_path = "/tmp/sack.data.$port";
20
21 my $sock = IO::Socket::INET->new(
22 PeerAddr => '127.0.0.1',
23 PeerPort => $sack_port,
24 Proto => 'tcp',
25 ) || die "127.0.0.1:$sack_port -- $!";
26
27 my $sel = IO::Select->new($sock);
28 $sel->add($sock);
29
30 my $data = Storable::retrieve $data_path if -e $data_path;
31
32 sub proc {
33 local $/ = undef;
34 open(my $fh, '<', '/proc/' . shift);
35 <$fh>;
36 }
37
38 while (1) {
39 for my $sock ($sel->can_read(1)) {
40 my $request = eval { Storable::fd_retrieve($sock) };
41 if ( $@ ) {
42 warn "[$port] EXIT $@\n";
43 exit;
44 }
45 warn "[$port] <<<< ", dump( keys %$request ), $/ if $debug;
46 my $response = { port => $port };
47 if ( $request->{ping} ) {
48 $response->{ping} = 'pong';
49 $response->{proc}->{$_} = proc $_ foreach ( 'loadavg', 'meminfo', "$$/status" );
50 } elsif ( $request->{load} ) {
51 $response->{load} = 'shard';
52 } elsif ( $request->{bulk_load} ) {
53 foreach my $shard ( @{ $request->{bulk_load} } ) {
54 warn "[$port] <<<< shard $shard\n";
55 $data->{ $shard } = Storable::fd_retrieve( $sock );
56 }
57 } elsif ( defined $request->{shard} ) {
58 $data->{ $request->{path} } = $request->{shard};
59 $response->{load} = 'shard';
60 $response->{shard} = $request->{path};
61 } elsif ( my $view = $request->{view} ) {
62 Sack::View->code( $request->{code} );
63 foreach my $path ( keys %$data ) {
64 warn "view $view @ $path\n";
65 die "data->{$path} not array but ",dump( $data->{$path} ) unless ref $data->{$path} eq 'ARRAY';
66 my $affected = Sack::View->on_shard( $data->{$path} );
67 $response->{on_shard}->{$path} = $affected;
68 }
69 $response->{out} = Sack::View->out;
70 $response->{view} = $view;
71 } elsif ( my $eval = $request->{eval} ) {
72 my $v = eval $eval;
73 $response->{eval} = $eval;
74 $response->{value} = $v;
75 warn "[$port] EVAL $eval = ", dump( $v ),$/;
76 } elsif ( $request->{clean} ) {
77 $data = {};
78 foreach ( glob '/tmp/sack.data.*' ) {
79 unlink $_;
80 push @{ $response->{unlink} }, $_;
81 }
82 warn "[$port] clean\n";
83 } elsif ( $request->{save} ) {
84 Storable::store( $data, $data_path );
85 warn "[$port] saved $data_path ", -s $data_path, " bytes\n";
86 $response->{saved}->{$data_path} = -s $data_path;
87 } elsif ( $request->{exit} ) {
88 warn "[$port] exit\n";
89 } else {
90 $response->{error}->{request} = $request;
91 }
92 Storable::store_fd( $response, $sock );
93 warn "[$port] >>>> ", dump($response), $/ if $debug;
94 }
95 }

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26