X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=lib%2FCloudStore%2FStore.pm;h=1956a732d8200b7dc7873d3c274792f8c65cab60;hb=e566496afecf10279429815772a6ca45eddfdb9d;hp=5b6f693a525c267a6cb0726332bfce3f0dd3d6c1;hpb=82fbeaf7565d417e19fcbe0d2f341a48e455b319;p=cloudstore.git diff --git a/lib/CloudStore/Store.pm b/lib/CloudStore/Store.pm index 5b6f693..1956a73 100644 --- a/lib/CloudStore/Store.pm +++ b/lib/CloudStore/Store.pm @@ -3,7 +3,7 @@ use warnings; use strict; use lib 'lib'; -use base 'CloudStore::MD5sum'; +use base qw(CloudStore::MD5sum); use CloudStore::API; use autodie; @@ -31,6 +31,8 @@ sub new { return $self; } +sub api { $_[0]->{api} } + sub mkbasedir { my $dir = shift; $dir =~ s{/[^/]+$}{}; # strip filename @@ -124,6 +126,7 @@ sub modify_file { $self->md5sum($data)->out( $from_dir . $from ); $self->md5sum($data)->put( $from_dir . $to => $md5 ); + $self->md5sum_close($data); warn "$md5 moved to $from_dir $to"; } @@ -152,7 +155,9 @@ sub new_file { sub removed_file { my ( $self, $data ) = @_; - my $md5 = $self->md5sum($data)->get( $data->{file} ); +=for removed + my $path = $self->blob_path( $data ); + my $md5 = $self->md5_get( $path ); return unless $md5; # directories don't have md5sums my $path = $self->{md5pool} . '/' . $md5; my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, @@ -168,7 +173,9 @@ sub removed_file { warn "# chown $id $gid $path"; } - $self->md5sum($data)->out( $data->{file} ); + $self->api->append_meta('md5sum', $user, 'delete', $data->{file} ); +=cut + } sub make_dir { @@ -248,8 +255,6 @@ sub init_pid_login { sub cleanup_pid { my ( $self, $pid ) = @_; - $self->md5sum_close; - delete $self->{pid}->{$pid}; warn "removed $pid"; } @@ -263,13 +268,18 @@ sub rsync_log { my $pid = $1; $self->cleanup_pid( $pid ); } else { - warn "## rsync_log $data"; + warn "## rsync_log $data" if $ENV{DEBUG}; } } sub blob_path { my ( $self, $data, $path ) = @_; - my $blob = $self->{pid}->{ $data->{pid} }->{dir} || die "no dir for $data->{pid} in ",dump( $self->{pid} ); + my $blob = $self->{pid}->{ $data->{pid} }->{dir}; + if ( ! $blob ) { + warn "ERROR: $data->{pid} not found, possible restart?"; + $self->init_pid_login( $data->{pid}, $data->{login} ); + $blob = $self->{pid}->{ $data->{pid} }->{dir} || die "no dir for ", dump( $self->{pid}->{ $data->{pid} } ); + } $blob .= '/' . ( defined $path ? $path : $data->{file} ); return $blob; } @@ -293,8 +303,10 @@ sub rsync_transfer { } else { die "unknown type $type ", dump $data; } + $self->api->refresh_file_list( $data->{login} ); } elsif ( $data->{itemize} =~ m/\*deleting/ ) { $self->removed_file($data); + $self->api->refresh_file_list( $data->{login} ); } else { warn "IGNORED ",dump($data) if $ENV{DEBUG}; } @@ -315,6 +327,11 @@ sub md5pool { my $md5 = $data->{md5} || die "no md5 in ",dump $data; my $path = $self->blob_path($data); + if ( ! -e $path ) { + warn "ERROR missing path $path"; + return; + } + my $pool_md5 = "$pool/$md5"; if ( -e $pool_md5 ) { @@ -342,7 +359,9 @@ sub md5pool { warn "dedup +++ $md5 $path"; } - $self->md5sum($data)->put( $data->{file} => $md5 ); + $self->md5_set( $path => $md5 ); + + $self->api->append_meta('md5sum', $data->{login}, $md5, $data->{file} ); } my $empty_md5 = " " x 32; @@ -351,18 +370,23 @@ sub dedup { my ( $self, $data, $path ) = @_; if ( $data->{file} =~ /^(.+\/)?md5sum$/ ) { - my $dir = $1; + my $dir = $1 || ''; my $imported = 0; warn "IMPORT ", $data->{file}, "\n"; open(my $md5sum, '<', $path); while(<$md5sum>) { chomp; my ( $md5, $file ) = split(/\s+/,$_,2); - if ( ! -e "$self->{md5path}/$md5" ) { + if ( ! $file ) { + warn "IGNORE $md5 without file\n"; + next; + } + if ( ! -e "$self->{md5pool}/$md5" ) { warn "MISSING $md5 $file\n"; next; } my $new = { + login => $data->{login}, pid => $data->{pid}, file => "$dir$file", md5 => $md5, @@ -375,13 +399,12 @@ sub dedup { $self->md5pool( $new ); } } - print "INFO imported $imported files from ",dump($data); + warn "INFO imported $imported files from ",dump($data); return; # don't put md5sum files into pool } if ( $data->{md5} ne $empty_md5 ) { - $self->md5sum($data)->put( $data->{file} => $data->{md5} ); $self->md5pool( $data ); } else { warn "empty md5", dump $data;