TT#116150 lock processed cdr record

this is to mitigate occasional deadlocks reported
between rate-o-mat and mediator transactions.

Change-Id: I40ccbb4921bfc85105e64d7b71ea20c67e984373
mr9.4
Rene Krenn 5 years ago
parent 12f79e7d99
commit ecb0af2fe4

@ -171,6 +171,7 @@ my $sth_offpeak;
my $sth_offpeak_subscriber;
my $sth_unrated_cdrs;
my $sth_get_cdr;
my $sth_lock_cdr;
my $sth_update_cdr;
my $sth_create_cdr_fragment;
my $sth_mos_data;
@ -585,9 +586,14 @@ EOS
"SELECT * ".
"FROM accounting.cdr WHERE id = ?"
) or FATAL "Error preparing get cdr statement: ".$acctdbh->errstr;
$sth_lock_cdr = $acctdbh->prepare(
"SELECT id ".
"FROM accounting.cdr WHERE id = ? FOR UPDATE"
) or FATAL "Error preparing lock cdr statement: ".$acctdbh->errstr;
$sth_update_cdr = $acctdbh->prepare(
"UPDATE accounting.cdr SET ".
"UPDATE LOW_PRIORITY accounting.cdr SET ".
"source_carrier_cost = ?, source_reseller_cost = ?, source_customer_cost = ?, ".
"source_carrier_free_time = ?, source_reseller_free_time = ?, source_customer_free_time = ?, ".
"rated_at = ?, rating_status = ?, ".
@ -969,6 +975,18 @@ sub prepare_cdr_col_models {
}
sub lock_cdr {
my $cdr = shift;
my $sth = $sth_lock_cdr;
$sth->execute($cdr->{id})
or FATAL "Error executing cdr row lock selection statement: ".$sth->errstr;
my ($id) = $sth->fetchrow_array;
$sth->finish;
return $id;
}
sub lock_contracts {
my $cdr = shift;
@ -3589,6 +3607,8 @@ sub main {
$t = Time::HiRes::time();
$cdr_id = $cdr->{id};
DEBUG "start rating CDR ID $cdr_id";
begin_transaction($acctdbh);
lock_cdr($cdr);
# required to avoid contract_balances duplications during catchup:
begin_transaction($billdbh,'READ COMMITTED');
# row locks are released upon commit/rollback and have to cover
@ -3597,16 +3617,15 @@ sub main {
# billingdb transaction:
lock_contracts($cdr);
begin_transaction($provdbh);
begin_transaction($acctdbh);
begin_transaction($dupdbh);
INFO $info_prefix."rate CDR ID ".$cdr->{id};
rate_cdr($cdr, $type) && update_cdr($cdr);
# we would need a XA/distributed transaction manager for this:
commit_transaction($acctdbh);
commit_transaction($billdbh);
commit_transaction($provdbh);
commit_transaction($acctdbh);
commit_transaction($dupdbh);
$rated_batch++;
@ -3723,6 +3742,7 @@ sub close_db {
$sth_offpeak_subscriber->finish;
$sth_unrated_cdrs->finish;
$sth_get_cdr->finish;
$sth_lock_cdr->finish;
$sth_update_cdr->finish;
$split_peak_parts and $sth_create_cdr_fragment->finish;
$sth_mos_data->finish;

Loading…
Cancel
Save