Committer: ailyin
LJSUP-10483 (Selfpromo delivery mechanics is broken)U trunk/cgi-bin/LJ/Pay/Payment/PayItem/SelfPromo.pm U trunk/cgi-bin/LJ/Pay/SelfPromo.pm
Modified: trunk/cgi-bin/LJ/Pay/Payment/PayItem/SelfPromo.pm =================================================================== --- trunk/cgi-bin/LJ/Pay/Payment/PayItem/SelfPromo.pm 2011-11-22 14:52:45 UTC (rev 11202) +++ trunk/cgi-bin/LJ/Pay/Payment/PayItem/SelfPromo.pm 2011-11-23 14:25:49 UTC (rev 11203) @@ -70,6 +70,11 @@ sub _deliver_item { my ( $self, $payment, $buyer_u, $rcpt_u, $note_rec_change ) = @_; + # if we cannot get a lock straight away, let this be delivered later; + # resolves race condition with ljmaint.pl and webs trying to deliver + # the same item simultaneously + return if LJ::Pay::SelfPromo->lock_taken_elsewhere; + # this should be temporary until we l10n the shop my $lang = ($rcpt_u && $rcpt_u->prop('browselang')) ? $rcpt_u->prop('browselang') : $LJ::DEFAULT_LANG; my $ml = sub { Modified: trunk/cgi-bin/LJ/Pay/SelfPromo.pm =================================================================== --- trunk/cgi-bin/LJ/Pay/SelfPromo.pm 2011-11-22 14:52:45 UTC (rev 11202) +++ trunk/cgi-bin/LJ/Pay/SelfPromo.pm 2011-11-23 14:25:49 UTC (rev 11203) @@ -563,8 +563,6 @@ my $row = LJ::MemCache::get_or_set( $class->memcache_key, sub { - my $dbh = LJ::get_db_writer(); - my $res = $class->find_promos( { 'require_active' => 1, 'return_rows' => 1 } ); @@ -585,8 +583,6 @@ } return do { - my $dbh = LJ::get_db_writer(); - my $promos = $class->find_promos( { 'promoid' => $promoid } ); return unless @$promos; @@ -875,6 +871,14 @@ return LJ::Pay::SelfPromo::Lock->new; } +sub lock_taken { + return LJ::Pay::SelfPromo::Lock->taken; +} + +sub lock_taken_elsewhere { + return LJ::Pay::SelfPromo::Lock->taken_elsewhere; +} + # supported opts: entry_url, event, reason, details sub log { my ( $class, $promoter, %opts ) = @_; @@ -955,7 +959,8 @@ return if $locked; - LJ::get_lock( LJ::get_db_writer(), 'global', 'selfpromo' ); + die "Can't get lock" + unless LJ::get_lock( LJ::get_db_writer(), 'global', 'selfpromo' ); $locked = 1; return bless {}, $class; @@ -973,6 +978,17 @@ $locked = 0; } +sub taken { + my ($class) = @_; + return LJ::lock_taken( LJ::get_db_writer(), 'global', 'selfpromo' ); +} + +sub taken_elsewhere { + my ($class) = @_; + + return !$locked && $class->taken; +} + 1; __END__