diff --git a/rate-o-mat.pl b/rate-o-mat.pl index d48c756..9accc9e 100755 --- a/rate-o-mat.pl +++ b/rate-o-mat.pl @@ -289,7 +289,9 @@ sub connect_billdbh { FATAL "Error connecting to db: ".$DBI::errstr unless defined($billdbh); - $billdbh->do("SET SESSION binlog_format = 'STATEMENT'") or WARNING 'error setting session binlog_format'; + if ($multi_master) { + $billdbh->do("SET SESSION binlog_format = 'STATEMENT'") or WARNING 'error setting session binlog_format'; + } $billdbh->do('SET time_zone = ?',undef,$connection_timezone) or FATAL 'error setting connection timezone' if $connection_timezone; INFO "Successfully connected to billing db..."; @@ -304,7 +306,9 @@ sub connect_acctdbh { FATAL "Error connecting to db: ".$DBI::errstr unless defined($acctdbh); - $acctdbh->do("SET SESSION binlog_format = 'STATEMENT'") or WARNING 'error setting session binlog_format'; + if ($multi_master) { + $acctdbh->do("SET SESSION binlog_format = 'STATEMENT'") or WARNING 'error setting session binlog_format'; + } $acctdbh->do('SET time_zone = ?',undef,$connection_timezone) or FATAL 'error setting connection timezone' if $connection_timezone; INFO "Successfully connected to accounting db..."; @@ -325,7 +329,6 @@ sub connect_provdbh { FATAL "Error connecting to db: ".$DBI::errstr unless defined($provdbh); - $provdbh->do("SET SESSION binlog_format = 'STATEMENT'") or WARNING 'error setting session binlog_format'; $provdbh->do('SET time_zone = ?',undef,$connection_timezone) or FATAL 'error setting connection timezone' if $connection_timezone; INFO "Successfully connected to provisioning db..."; @@ -2040,15 +2043,18 @@ sub check_shutdown { sub get_unrated_cdrs { my $r_cdrs = shift; + my @cdrs; + my $nodename; + my $sth = $sth_unrated_cdrs; $sth->execute or die("Error executing unrated cdr statement: ".$sth->errstr); - my @cdrs = (); - - my $nodename = get_hostname(); + @cdrs = (); + $nodename = get_hostname(); #set to undef if corosync reports there is no other working node left: - #$nodename = undef + #$nodename = undef; + my $cnt = 0; while (my $cdr = $sth->fetchrow_hashref()) { if (not $multi_master or not length($nodename) or $nodename eq 'spce') { push(@cdrs,$cdr); @@ -2073,6 +2079,7 @@ sub get_unrated_cdrs { INFO "Unknown hostname '$nodename'"; } check_shutdown() and return 0; + $cnt++; } # the while above may have been interrupted because there is no @@ -2081,6 +2088,10 @@ sub get_unrated_cdrs { die("Error fetching unrated cdr's: ". $sth->errstr) if $sth->err; $sth->finish; + if ($cnt > 0 and (scalar @cdrs) == 0) { + + } + if ($shuffle_batch) { # if concurrent rate-o-mat instances grab the same cdr batch, there # can be a contention due to waits on same caller/callee contract @@ -3681,7 +3692,11 @@ sub main { next CDR; } # required to avoid contract_balances duplications during catchup: - begin_transaction($billdbh,'READ COMMITTED'); + if ($multi_master) { + begin_transaction($billdbh); + } else { + begin_transaction($billdbh, 'READ COMMITTED'); + } # row locks are released upon commit/rollback and have to cover # the whole transaction. thus locking contract rows for preventing # concurrent catchups will be our very first SQL statement in the