/[Sack]/trunk/lib/Sack/View.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

Annotation of /trunk/lib/Sack/View.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 162 - (hide annotations)
Fri Oct 30 14:53:22 2009 UTC (14 years, 7 months ago) by dpavlin
Original Path: trunk/lib/Sack/Node.pm
File size: 2811 byte(s)
cleanup scoping of $out and $rec

1 dpavlin 92 package Sack::Node;
2    
3     use warnings;
4     use strict;
5    
6     use IO::Socket::INET;
7     use File::Slurp;
8     use Carp qw(confess);
9     use Data::Dump qw(dump);
10     use Storable;
11 dpavlin 93 use Time::HiRes qw(time);
12 dpavlin 92
13 dpavlin 102 use lib 'lib';
14 dpavlin 127 use base qw(Sack::Pid);
15 dpavlin 102 use Sack::Color;
16 dpavlin 142 use Sack;
17 dpavlin 92
18     sub new {
19     my $class = shift;
20     my $port = shift;
21     my $self = bless { port => $port }, $class;
22    
23 dpavlin 127 $self->port_pid( $port );
24 dpavlin 92
25     my $sock = IO::Socket::INET->new(
26     Listen => SOMAXCONN,
27     LocalAddr => '127.0.0.1',
28     LocalPort => $port,
29     Proto => 'tcp',
30     Reuse => 1,
31     ) or die "[$port] die $!";
32    
33 dpavlin 127 my $client;
34 dpavlin 92
35 dpavlin 127 while ( 1 ) {
36 dpavlin 92
37 dpavlin 127 if ( ! $client ) {
38 dpavlin 142 warn "[$port] accept $Sack::VERSION\n";
39 dpavlin 127 $client = $sock->accept();
40     warn "[$port] connect from ", $client->peerhost, $/;
41     }
42 dpavlin 92
43 dpavlin 142 my $data = Storable::fd_retrieve( $client );
44 dpavlin 92
45 dpavlin 127 if ( defined $data->{data} ) {
46 dpavlin 142 warn "# [$port] <<<< data\n" if $self->{debug};
47 dpavlin 127 } else {
48 dpavlin 142 warn "# [$port] <<<< ", dump( $data ), $/ if $self->{debug};
49 dpavlin 127 }
50 dpavlin 92
51     my $result;
52    
53     if ( $data->{view} ) {
54 dpavlin 116 $result = $self->view( $data->{view} );
55 dpavlin 92 } elsif ( $data->{data} ) {
56     $self->{data} = delete $data->{data};
57 dpavlin 119 $result = { data => 'loaded' };
58 dpavlin 92 } elsif ( $data->{exit} ) {
59 dpavlin 127 warn "[$port] exit\n";
60 dpavlin 119 close $sock;
61 dpavlin 92 exit;
62 dpavlin 119 } elsif ( $data->{restart} ) {
63     warn "[$port] restart";
64     close $sock;
65     exec "$0 $port";
66     } elsif ( $data->{info} ) {
67     $result = {
68 dpavlin 142 version => $Sack::VERSION,
69 dpavlin 119 size => $#{ $self->{data} } + 1,
70 dpavlin 127 reports => $self->{reports},
71 dpavlin 119 };
72     } elsif ( my $sh = delete $data->{sh} ) {
73     $result = { sh => scalar `$sh` };
74 dpavlin 142 } elsif ( defined $data->{debug} ) {
75 dpavlin 161 $result = { debug => $self->{debug} = $data->{debug} };
76 dpavlin 92 } else {
77     warn "[$port] UNKNOWN ", dump( $data ), $/;
78 dpavlin 161 $result = { 'error' => 'unknown', data => $data };
79 dpavlin 92 }
80    
81 dpavlin 161 $result = { 'error' => 'result not reference', result => $result, data => $data } unless ref($result);
82    
83 dpavlin 127 warn "# [$port] >>>>\n";
84 dpavlin 92 Storable::store_fd( $result => $client );
85     }
86    
87     }
88    
89     sub view {
90     my ( $self, $code ) = @_;
91    
92     my $affected = 0;
93 dpavlin 93 my $start_t = time;
94 dpavlin 92
95 dpavlin 162 my $out;
96    
97     my $coderef = eval "sub { my \$rec = \$_[0]; $code }";
98 dpavlin 92 if ( $@ ) {
99     warn "ABORT code: $@";
100     return;
101     }
102    
103    
104     foreach my $pos ( 0 .. $#{ $self->{data} } ) {
105 dpavlin 162 if ( ! defined $self->{data}->[$pos] ) {
106 dpavlin 92 print STDERR "END @ $pos";
107     last;
108     }
109    
110 dpavlin 162 eval { $coderef->( $self->{data}->[$pos] ) };
111    
112 dpavlin 92 if ( $@ ) {
113     warn "ABORT $pos $@\n";
114     last;
115     } else {
116     $affected++;
117     }
118    
119     $pos % 10000 == 0 ? print STDERR $pos :
120     $pos % 1000 == 0 ? print STDERR "." : 0 ;
121     };
122    
123 dpavlin 93 my $dt = time - $start_t;
124 dpavlin 116 my $report = [ $self->{port}, $affected, $dt, $affected / $dt ];
125 dpavlin 93 warn sprintf "[%d] %d affected in %1.4fs %.2f/s\n", @$report;
126 dpavlin 92
127 dpavlin 127 push @{ $self->{reports} }, "$affected in ${dt}s";
128    
129 dpavlin 162 warn "[$self->{port}] out ", dump( $out ),$/ if $self->{debug};
130 dpavlin 93
131 dpavlin 116 return {
132     out => $out,
133     };
134 dpavlin 92 }
135    
136     1;

  ViewVC Help
Powered by ViewVC 1.1.26