diff --git a/lib/NGCP/Panel/Controller/API/SubscriberPreferencesItem.pm b/lib/NGCP/Panel/Controller/API/SubscriberPreferencesItem.pm index 127d18b572..d47e3c8f64 100644 --- a/lib/NGCP/Panel/Controller/API/SubscriberPreferencesItem.pm +++ b/lib/NGCP/Panel/Controller/API/SubscriberPreferencesItem.pm @@ -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, diff --git a/lib/NGCP/Panel/Controller/API/SubscribersItem.pm b/lib/NGCP/Panel/Controller/API/SubscribersItem.pm index ea7dc781b4..d2b4c69ca5 100644 --- a/lib/NGCP/Panel/Controller/API/SubscribersItem.pm +++ b/lib/NGCP/Panel/Controller/API/SubscribersItem.pm @@ -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( diff --git a/lib/NGCP/Panel/Utils/Contract.pm b/lib/NGCP/Panel/Utils/Contract.pm index 1008c3b24a..4863208d0d 100644 --- a/lib/NGCP/Panel/Utils/Contract.pm +++ b/lib/NGCP/Panel/Utils/Contract.pm @@ -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({ diff --git a/lib/NGCP/Panel/Utils/ProfilePackages.pm b/lib/NGCP/Panel/Utils/ProfilePackages.pm index 5d1a31185a..69e0444f6f 100644 --- a/lib/NGCP/Panel/Utils/ProfilePackages.pm +++ b/lib/NGCP/Panel/Utils/ProfilePackages.pm @@ -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);