From e2a9dcac3b97254fc0a64ce3e2bf1ce582ce8162 Mon Sep 17 00:00:00 2001 From: Mark Wells Date: Wed, 16 Nov 2016 14:07:57 -0800 Subject: [PATCH] lock table for tax district updates, #73185 --- FS/FS/Cron/tax_rate_update.pm | 1 + FS/FS/geocode_Mixin.pm | 12 +++++++++--- FS/bin/freeside-upgrade | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/FS/FS/Cron/tax_rate_update.pm b/FS/FS/Cron/tax_rate_update.pm index 2c021b80e..b6ac63c2e 100755 --- a/FS/FS/Cron/tax_rate_update.pm +++ b/FS/FS/Cron/tax_rate_update.pm @@ -40,6 +40,7 @@ sub tax_rate_update { my $taxname = $conf->config('tax_district_taxname') || ''; + FS::cust_main_county->lock_table; if ($method eq 'wa_sales') { # download the update file my $now = DateTime->now; diff --git a/FS/FS/geocode_Mixin.pm b/FS/FS/geocode_Mixin.pm index 46f8128aa..ef16e741d 100644 --- a/FS/FS/geocode_Mixin.pm +++ b/FS/FS/geocode_Mixin.pm @@ -260,6 +260,7 @@ sub process_district_update { die $@ if $@; die "$class has no location data" if !$class->can('location_hash'); + my $error; my $conf = FS::Conf->new; my $method = $conf->config('tax_district_method') or return; #nothing to do if null @@ -269,9 +270,11 @@ sub process_district_update { my $tax_info = get_district({ $self->location_hash }, $method); return unless $tax_info; - $self->set('district', $tax_info->{'district'} ); - my $error = $self->replace; - die $error if $error; + if ($self->district ne $tax_info->{'district'}) { + $self->set('district', $tax_info->{'district'} ); + $error = $self->replace; + die $error if $error; + } my %hash = map { $_ => uc( $tax_info->{$_} ) } qw( district city county state country ); @@ -281,6 +284,9 @@ sub process_district_update { my $taxname = $conf->config('tax_district_taxname'); # there must be exactly one cust_main_county for each district+taxclass. # do NOT exclude taxes that are zero. + + # mutex here so that concurrent queue jobs can't make duplicates. + FS::cust_main_county->lock_table; foreach my $taxclass (@classes) { my @existing = qsearch('cust_main_county', { %hash, diff --git a/FS/bin/freeside-upgrade b/FS/bin/freeside-upgrade index 77087c373..ffd574eea 100755 --- a/FS/bin/freeside-upgrade +++ b/FS/bin/freeside-upgrade @@ -298,7 +298,7 @@ print "\n" if $DRY_RUN; if ( $dbh->{Driver}->{Name} =~ /^mysql/i && ! $opt_s ) { - foreach my $table (qw( svc_acct svc_phone )) { + foreach my $table (qw( svc_acct svc_phone cust_main_county )) { my $sth = $dbh->prepare( "SELECT COUNT(*) FROM duplicate_lock WHERE lockname = '$table'" -- 2.11.0