From: John Napiorkowski Date: Thu, 9 Jul 2009 18:06:44 +0000 (+0000) Subject: changed the way transactions are detected for replication to work with the standard... X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=bd5da3696c505d7f014320ef53e477985b5f7b3c;p=dbsrgits%2FDBIx-Class-Historic.git changed the way transactions are detected for replication to work with the standard way to do this, minor doc updates, fix to the force pool so you can force a particular slave, changes to the way the debugging is created --- diff --git a/lib/DBIx/Class/Storage/DBI/Replicated.pm b/lib/DBIx/Class/Storage/DBI/Replicated.pm index 731e16a..8cb0fcd 100644 --- a/lib/DBIx/Class/Storage/DBI/Replicated.pm +++ b/lib/DBIx/Class/Storage/DBI/Replicated.pm @@ -7,11 +7,11 @@ BEGIN { ## use, so we explicitly test for these. my %replication_required = ( - Moose => '0.77', - MooseX::AttributeHelpers => '0.12', - MooseX::Types => '0.10', - namespace::clean => '0.11', - Hash::Merge => '0.11' + 'Moose' => '0.77', + 'MooseX::AttributeHelpers' => '0.12', + 'MooseX::Types' => '0.10', + 'namespace::clean' => '0.11', + 'Hash::Merge' => '0.11' ); my @didnt_load; @@ -612,24 +612,11 @@ writea are sent to the master only sub set_balanced_storage { my $self = shift @_; my $schema = $self->schema; - my $write_handler = $self->schema->storage->balancer; + my $balanced_handler = $self->schema->storage->balancer; - $schema->storage->read_handler($write_handler); + $schema->storage->read_handler($balanced_handler); } -=head2 around: txn_do ($coderef) - -Overload to the txn_do method, which is delegated to whatever the -L is set to. We overload this in order to wrap in inside a -L method. - -=cut - -around 'txn_do' => sub { - my($txn_do, $self, $coderef, @args) = @_; - $self->execute_reliably(sub {$self->$txn_do($coderef, @args)}); -}; - =head2 connected Check that the master and at least one of the replicants is connected. diff --git a/lib/DBIx/Class/Storage/DBI/Replicated/Balancer.pm b/lib/DBIx/Class/Storage/DBI/Replicated/Balancer.pm index 798c0ef..a2d0fbc 100644 --- a/lib/DBIx/Class/Storage/DBI/Replicated/Balancer.pm +++ b/lib/DBIx/Class/Storage/DBI/Replicated/Balancer.pm @@ -169,10 +169,12 @@ the load evenly (hopefully) across existing capacity. around 'select' => sub { my ($select, $self, @args) = @_; - + if (my $forced_pool = $args[-1]->{force_pool}) { delete $args[-1]->{force_pool}; return $self->_get_forced_pool($forced_pool)->select(@args); + } elsif($self->master->{transaction_depth}) { + return $self->master->select(@args); } else { $self->increment_storage; return $self->$select(@args); @@ -189,10 +191,12 @@ the load evenly (hopefully) across existing capacity. around 'select_single' => sub { my ($select_single, $self, @args) = @_; - + if (my $forced_pool = $args[-1]->{force_pool}) { delete $args[-1]->{force_pool}; return $self->_get_forced_pool($forced_pool)->select_single(@args); + } elsif($self->master->{transaction_depth}) { + return $self->master->select_single(@args); } else { $self->increment_storage; return $self->$select_single(@args); @@ -224,7 +228,7 @@ sub _get_forced_pool { return $forced_pool; } elsif($forced_pool eq 'master') { return $self->master; - } elsif(my $replicant = $self->pool->replicants($forced_pool)) { + } elsif(my $replicant = $self->pool->replicants->{$forced_pool}) { return $replicant; } else { $self->master->throw_exception("$forced_pool is not a named replicant."); @@ -233,7 +237,7 @@ sub _get_forced_pool { =head1 AUTHOR -John Napiorkowski +John Napiorkowski =head1 LICENSE diff --git a/lib/DBIx/Class/Storage/DBI/Replicated/WithDSN.pm b/lib/DBIx/Class/Storage/DBI/Replicated/WithDSN.pm index 69a3add..44ad88b 100644 --- a/lib/DBIx/Class/Storage/DBI/Replicated/WithDSN.pm +++ b/lib/DBIx/Class/Storage/DBI/Replicated/WithDSN.pm @@ -31,7 +31,8 @@ Add C to debugging output. around '_query_start' => sub { my ($method, $self, $sql, @bind) = @_; my $dsn = $self->_dbi_connect_info->[0]; - $self->$method("DSN: $dsn SQL: $sql", @bind); + my($op, $rest) = ($sql=~m/^(\w+) (.+)$/); + $self->$method("$op [DSN=$dsn] $rest", @bind); }; =head1 ALSO SEE diff --git a/t/93storage_replication.t b/t/93storage_replication.t index a2463e4..9790416 100644 --- a/t/93storage_replication.t +++ b/t/93storage_replication.t @@ -12,7 +12,7 @@ BEGIN { eval "use DBIx::Class::Storage::DBI::Replicated; use Test::Moose"; plan $@ ? ( skip_all => "Deps not installed: $@" ) - : ( tests => 90 ); + : ( tests => 95 ); } use_ok 'DBIx::Class::Storage::DBI::Replicated::Pool'; @@ -257,6 +257,8 @@ for my $method (qw/by_connect_info by_storage_type/) { => 'configured balancer_type'; } +$replicated->schema->storage->debugcb(sub {my ($ob, $info) = @_; warn "\n\n$ob, $info\n\n"}); + ok $replicated->schema->storage->meta => 'has a meta object'; @@ -296,6 +298,8 @@ is ((grep $_->{master_option}, @all_storage_opts), my @replicant_names = keys %{ $replicated->schema->storage->replicants }; +ok @replicant_names, "found replicant names @replicant_names"; + ## Silence warning about not supporting the is_replicating method if using the ## sqlite dbs. $replicated->schema->storage->debugobj->silence(1) @@ -607,10 +611,10 @@ ok my $transaction = sub { ]); ok my $result = $replicated->schema->resultset('Artist')->find($id) - => 'Found expected artist'; + => "Found expected artist for $id"; ok my $more = $replicated->schema->resultset('Artist')->find(1) - => 'Found expected artist again'; + => 'Found expected artist again for 1'; return ($result, $more); @@ -630,11 +634,14 @@ ok my $transaction = sub { ## Test that asking for single return works { - ok my $return = $replicated->schema->txn_do($transaction, 777) + ok my @return = $replicated->schema->txn_do($transaction, 777) => 'did transaction'; - is $return->id, 777 + is $return[0]->id, 777 => 'first returned value is correct'; + + is $return[1]->id, 1 + => 'second returned value is correct'; } ## Test transaction returning a single value @@ -711,6 +718,19 @@ ok $replicated->schema->resultset('Artist')->find(1) => 'got an artist result via force_pool storage'; } +## Test the force_pool resultset attribute part two. + +{ + ok my $artist_rs = $replicated->schema->resultset('Artist') + => 'got artist resultset'; + + ## Turn on Forced Pool Storage + ok my $reliable_artist_rs = $artist_rs->search(undef, {force_pool=>$replicant_names[0]}) + => 'Created a resultset using force_pool storage'; + + ok my $artist = $reliable_artist_rs->find(2) + => 'got an artist result via force_pool storage'; +} ## Delete the old database files $replicated->cleanup;