From: Dobrica Pavlinusic Date: Sat, 14 Apr 2012 18:47:26 +0000 (+0200) Subject: API workers using Gearman::Driver X-Git-Url: http://git.rot13.org/?p=cloudstore.git;a=commitdiff_plain;h=e8bca9ec3bc5683221540586893bdc155c0fe3b6 API workers using Gearman::Driver --- diff --git a/gearman/api_workers.pl b/gearman/api_workers.pl new file mode 100755 index 0000000..d08b285 --- /dev/null +++ b/gearman/api_workers.pl @@ -0,0 +1,34 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use Gearman::Driver; +use lib '/srv/cloudstore/lib'; + +BEGIN { + $ENV{NAME} ||= $1 if $0 =~ m{([^/]+)$}; + die "no SLICE in enviroment" unless $ENV{SLICE}; +} + +our $log = "$ENV{SLICE}/log/$ENV{NAME}.log", + +my $driver = Gearman::Driver->new( + namespaces => [qw(CloudStore::Gearman)], + configfile => 'config.yaml', + loglevel => 'DEBUG', + logfile => $log, + server => $ENV{GEARMAN} || 'localhost:4730', + interval => 3, + job_runtime_attributes => { + 'CloudStore::Gearman::API::create_user' => { + max_processes => 1, + min_processes => 1, + }, + }, +); + +open(my $pid, '>', "/tmp/$ENV{NAME}.pid"); +print $pid "$$\n"; +close $pid; + +warn localtime() . " STARTED $ENV{NAME} pid $$ log $log\n"; +$driver->run; diff --git a/lib/CloudStore/Gearman/API.pm b/lib/CloudStore/Gearman/API.pm new file mode 100644 index 0000000..0a1d0a0 --- /dev/null +++ b/lib/CloudStore/Gearman/API.pm @@ -0,0 +1,121 @@ +package CloudStore::Gearman::API; +use base qw(Gearman::Driver::Worker); +use Moose; + +=head1 NAME + +Gearman API workers + +=cut + +use Data::Dump qw(dump); +use autodie; + +use lib '/srv/cloudstore/lib'; +use CloudStore::API; +#use WarnColor; + + +use base qw(Gearman::Driver::Worker); + +sub prefix { '' } # don't prefix methods with package + +sub process_name { + my ( $self, $orig, $job_name ) = @_; + warn "# process_name $orig $job_name\n"; + return "$orig ($job_name)"; +} + +sub chomp_work { + my ($self,$work) = @_; + chomp $work; + return $work; +} + +our $api = CloudStore::API->new; + +=head2 create_user "user_id password quota" + +=cut + +sub create_user : Job : Decode(chomp_work) : MinProcesses(1) : MaxProcesses(1) { + my ( $self, $job, $work ) = @_; + + warn "# create_user [$work]\n"; + my ( $email, $password, $quota ) = split(/\s+/,$work,3); + $quota ||= 200000 && warn "default quota"; + $api->create_user( $email, $password, $quota ); +} + +=head2 send_file ~u2001/from.txt#~u2003/dir/new to.txt + +=cut + +sub send_file : Job : Decode(chomp_work) : MaxProcesses(2) { + my ( $self, $job, $work ) = @_; + + warn "# send_file [$work]\n"; + + my ( $from, $to ) = split(/#/,$work,2); + + my $f_uid = $1 if $from =~ s{~(\w+)/}{}; + my $t_uid = $1 if $to =~ s{~(\w+)/}{}; + + warn "send_file $f_uid $from -> $t_uid $to\n"; + + $api->send_file( $f_uid => $from, $t_uid => $to ); +} + +=head2 rename_file ~u2001/old.txt#new.txt + +=cut + +sub rename_file : Job : Decode(chomp_work) : MaxProcesses(2) { + my ( $self, $job, $work ) = @_; + + warn "# rename_file [$work]\n"; + + my ( $from, $to ) = split(/#/,$work,2); + my $login = $1 if $from =~ s{~(\w+)/}{}; + $api->rename_file( $login, $from, $to ); +} + +=head2 delete ~u2001/file_or_dir + +=cut + +sub delete : Job : Decode(chomp_work) : MaxProcesses(2) { + my ( $self, $job, $work ) = @_; + + warn "# delete [$work]\n"; + + my $login = $1 if $work =~ s{~(\w+)}{}; + $api->delete( $login, $work ); + +} + +=head2 file_size ~u2001/foo.txt + +=cut + +sub file_size : Job : Decode(chomp_work) : MaxProcesses(40) { + my ( $self, $job, $work ) = @_; + + warn "# file_size [$work]\n"; + + my $login = $1 if $work =~ s{~(\w+)}{}; + $api->file_size( $login, $work ); +} + +=head2 user_usage u2001 + +=cut + +sub user_usage : Job : Decode(chomp_work) : MaxProcesses(40) { + my ( $self, $job, $work ) = @_; + warn "# usage [$work]\n"; + my $usage = $api->usage( $work ); + return $usage->{_usage}; +} + +1;