MT#63706 skip_locked for GET /api/subscriber/id

while acquiring locks is skipped meanwhile for
collections eg. a GET /api/subscribers/, timeouts
were still reported for individual GET /api/subscriber/id
requests.

this change adds logic to skip acquiring locks for
GET /apu/subscribers/id and GET /api/subsriberpreferences/id.

Change-Id: I0b739dd42947e30938e84b1339ba9b7535da8cb8
(cherry picked from commit 73664f29ba)
(cherry picked from commit 340f92caac)
mr12.5.1
Rene Krenn 3 months ago
parent 01ad1e7221
commit 85646e4b97

@ -61,6 +61,7 @@ sub GET :Allow {
my $balance = NGCP::Panel::Utils::ProfilePackages::get_contract_balance(c => $c,
contract => $subscriber->contract,
skip_locked => ($c->request->header('X-Delay-Commit') ? 0 : 1),
); #apply underrun lock level
my $hal = $self->hal_from_item($c, $subscriber, "subscribers");
$guard->commit; #potential db write ops in hal_from
@ -110,6 +111,7 @@ sub PATCH :Allow {
last unless $self->resource_exists($c, subscriberpreferences => $subscriber);
my $balance = NGCP::Panel::Utils::ProfilePackages::get_contract_balance(c => $c,
contract => $subscriber->contract,
skip_locked => ($c->request->header('X-Delay-Commit') ? 0 : 1),
); #apply underrun lock level
my $old_resource = $self->get_resource($c, $subscriber, "subscribers");
@ -167,6 +169,7 @@ sub PUT :Allow {
last unless $self->resource_exists($c, systemcontact => $subscriber);
my $balance = NGCP::Panel::Utils::ProfilePackages::get_contract_balance(c => $c,
contract => $subscriber->contract,
skip_locked => ($c->request->header('X-Delay-Commit') ? 0 : 1),
); #apply underrun lock level
my $resource = $self->get_valid_put_data(
c => $c,

@ -49,9 +49,9 @@ sub GET :Allow {
last unless $self->resource_exists($c, subscriber => $subscriber);
my $balance = NGCP::Panel::Utils::ProfilePackages::get_contract_balance(c => $c,
contract => $subscriber->contract,
); #apply underrun lock level
contract => $subscriber->contract,
skip_locked => ($c->request->header('X-Delay-Commit') ? 0 : 1),
); #apply underrun lock level
my ($form) = $self->get_form($c);
my $resource = $self->resource_from_item($c, $subscriber, $form);
@ -99,6 +99,7 @@ sub PUT :Allow {
last unless $self->resource_exists($c, subscriber => $subscriber);
my $balance = NGCP::Panel::Utils::ProfilePackages::get_contract_balance(c => $c,
contract => $subscriber->contract,
skip_locked => ($c->request->header('X-Delay-Commit') ? 0 : 1),
); #apply underrun lock level
$c->stash->{subscriber} = $subscriber; # password validation
my $resource = $self->get_valid_put_data(
@ -154,6 +155,7 @@ sub PATCH :Allow {
last unless $self->resource_exists($c, subscriber => $subscriber);
my $balance = NGCP::Panel::Utils::ProfilePackages::get_contract_balance(c => $c,
contract => $subscriber->contract,
skip_locked => ($c->request->header('X-Delay-Commit') ? 0 : 1),
); #apply underrun lock level
$c->stash->{subscriber} = $subscriber; # password validation
my $json = $self->get_valid_patch_data(

@ -524,6 +524,14 @@ sub acquire_contract_rowlocks {
my @contract_ids_to_lock = keys %contract_id_map;
my ($t1,$t2) = (time,undef);
if (defined $contract_id && !defined $rs_result && !defined $contract_ids) {
if ($c and $c->stash->{catchup_contract_ids}) {
#if (exists $c->stash->{catchup_contract_ids}->{$contract_id}) {
my $contract = $schema->resultset('contracts')->find({
id => $contract_id
},undef);
return $contract;
#}
}
$c->log->debug('contract ID to be locked: ' . $contract_id) if $c;
my $contract = $schema->resultset('contracts')->find({
id => $contract_id
@ -538,6 +546,18 @@ sub acquire_contract_rowlocks {
return $contract;
} elsif ((scalar @contract_ids_to_lock) > 0) {
@contract_ids_to_lock = sort { $a <=> $b } @contract_ids_to_lock; #"Access your tables and rows in a fixed order."
if ($c and $c->stash->{catchup_contract_ids}) {
#if (exists $c->stash->{catchup_contract_ids}->{$contract_id}) {
my @contracts = $schema->resultset('contracts')->search({
id => { -in => [ @contract_ids_to_lock ] }
},undef)->all;
if (defined $contract_ids || defined $contract_id) {
return [ @contracts ];
} else {
return $rs_result;
}
#}
}
my $contract_ids_label = join(', ',@contract_ids_to_lock);
$c->log->debug('contract IDs to be locked: ' . $contract_ids_label) if $c;
my @contracts = $schema->resultset('contracts')->search({

@ -214,7 +214,7 @@ sub _create_next_balance {
sub catchup_contract_balances {
my %params = @_;
my($c,$contract,$old_package,$now,$suppress_underrun,$is_create_next,$last_notopup_discard_intervals,$last_carry_over_mode,$topup_amount,$profiles_added) = @params{qw/c contract old_package now suppress_underrun is_create_next last_notopup_discard_intervals last_carry_over_mode topup_amount profiles_added/};
my($c,$contract,$old_package,$now,$suppress_underrun,$is_create_next,$last_notopup_discard_intervals,$last_carry_over_mode,$topup_amount,$profiles_added,$skip_locked) = @params{qw/c contract old_package now suppress_underrun is_create_next last_notopup_discard_intervals last_carry_over_mode topup_amount profiles_added skip_locked/};
return unless $contract;
if ($c->stash->{catchup_contract_ids}) {
@ -222,7 +222,12 @@ sub catchup_contract_balances {
}
my $schema = $c->model('DB');
$contract = NGCP::Panel::Utils::Contract::acquire_contract_rowlocks(c => $c, schema => $schema, contract_id => $contract->id);
$contract = NGCP::Panel::Utils::Contract::acquire_contract_rowlocks(
c => $c,
schema => $schema,
contract_id => $contract->id,
skip_locked => $skip_locked,
);
$now //= NGCP::Panel::Utils::DateTime::set_local_tz($contract->modify_timestamp);
$old_package = $contract->profile_package if !exists $params{old_package};
my $contract_create = NGCP::Panel::Utils::DateTime::set_local_tz($contract->create_timestamp // $contract->modify_timestamp);

Loading…
Cancel
Save