/[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 274 - (show annotations)
Wed Apr 28 19:09:54 2010 UTC (14 years, 1 month ago) by dpavlin
File size: 2599 byte(s)
collect /proc statistics from nodes

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

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26