/[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 225 - (show annotations)
Mon Nov 23 19:13:56 2009 UTC (14 years, 7 months ago) by dpavlin
File size: 1707 byte(s)
don't die on client socket errors

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
18 my $sock = IO::Socket::INET->new(
19 PeerAddr => '127.0.0.1',
20 PeerPort => $port,
21 Proto => 'tcp',
22 ) || die $!;
23
24 my $sel = IO::Select->new($sock);
25 $sel->add($sock);
26
27 my $data;
28
29 while (1) {
30 for my $sock ($sel->can_read(1)) {
31 my $request = eval { Storable::fd_retrieve($sock) };
32 if ( $@ ) {
33 warn "[$port] FATAL: $@\n";
34 next;
35 }
36 warn "[$port] <<<< ", dump( keys %$request ), $/;
37 my $response = { port => $port };
38 if ( $request->{ping} ) {
39 $response->{ping} = 'pong';
40 } elsif ( $request->{load} ) {
41 $response->{load} = 'shard';
42 } elsif ( defined $request->{shard} ) {
43 $data->{ $request->{path} } = $request->{shard};
44 $response->{load} = 'shard';
45 $response->{shard} = $request->{path};
46 } elsif ( my $code = $request->{view} ) {
47 Sack::View->code( $code );
48 foreach my $path ( keys %$data ) {
49 warn "view $request->{path} on shard $path\n";
50 die "data->{$path} not array but ",dump( $data->{$path} ) unless ref $data->{$path} eq 'ARRAY';
51 Sack::View->on_shard( $data->{$path} );
52 push @{ $response->{on_shard} }, $path;
53 }
54 $response->{out} = Sack::View->out;
55 } elsif ( defined $request->{debug} ) {
56 if ( my $eval = $request->{debug} ) {
57 warn "EVAL $eval ", dump( eval($eval) );
58 } else {
59 warn "XX data ", dump $data;
60 }
61 } elsif ( $request->{clean} ) {
62 $data = {};
63 } else {
64 $response->{error}->{unknown} = $request;
65 }
66 Storable::store_fd( $response, $sock );
67 warn "[$port] >>>> ", dump($response), $/;
68 }
69 }

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26