From d7c73916444fd9eccdc0c3e448301baeaee1b08a Mon Sep 17 00:00:00 2001 From: Kirill Solomko Date: Wed, 30 Mar 2022 15:24:54 +0200 Subject: [PATCH] Revert "TT#158252 API GET subscriberpreferences - fix DBI timeout" This reverts commit a6b5ac98c00154454a49ab2a571241539821bd82. Change-Id: Ie9c70a0821db61cb2bc1634d54ae0f6d3a096a92 --- .../Controller/API/SubscriberPreferences.pm | 81 ++++++++++--------- .../API/SubscriberPreferencesItem.pm | 36 +++++---- lib/NGCP/Panel/Controller/API/Subscribers.pm | 5 ++ lib/NGCP/Panel/Utils/Preferences.pm | 5 +- 4 files changed, 74 insertions(+), 53 deletions(-) diff --git a/lib/NGCP/Panel/Controller/API/SubscriberPreferences.pm b/lib/NGCP/Panel/Controller/API/SubscriberPreferences.pm index d78b4bf94b..9ad9fa039b 100644 --- a/lib/NGCP/Panel/Controller/API/SubscriberPreferences.pm +++ b/lib/NGCP/Panel/Controller/API/SubscriberPreferences.pm @@ -87,44 +87,53 @@ sub GET :Allow { my ($self, $c) = @_; my $page = $c->request->params->{page} // 1; my $rows = $c->request->params->{rows} // 10; - - my $subscribers_rs = $self->item_rs($c, "subscribers"); - (my $total_count, $subscribers_rs, my $subscribers_rows) = $self->paginate_order_collection($c, $subscribers_rs); - my $subscribers = NGCP::Panel::Utils::Contract::acquire_contract_rowlocks(c => $c, - rs => $subscribers_rs, - contract_id_field => 'contract_id'); - my $now = NGCP::Panel::Utils::DateTime::current_local; - my (@embedded, @links); - for my $subscriber (@$subscribers) { - next unless($subscriber->provisioning_voip_subscriber); - push @embedded, $self->hal_from_item($c, $subscriber, "subscribers"); - push @links, Data::HAL::Link->new( - relation => 'ngcp:'.$self->resource_name, - href => sprintf('%s%d', $self->dispatch_path, $subscriber->id), + $c->model('DB')->set_transaction_isolation('READ COMMITTED'); + my $guard = $c->model('DB')->txn_scope_guard; + { + my $subscribers_rs = $self->item_rs($c, "subscribers"); + (my $total_count, $subscribers_rs, my $subscribers_rows) = $self->paginate_order_collection($c, $subscribers_rs); + my $subscribers = NGCP::Panel::Utils::Contract::acquire_contract_rowlocks(c => $c, + rs => $subscribers_rs, + contract_id_field => 'contract_id'); + my $now = NGCP::Panel::Utils::DateTime::current_local; + my (@embedded, @links, %contract_map); + for my $subscriber (@$subscribers) { + next unless($subscriber->provisioning_voip_subscriber); + my $contract = $subscriber->contract; + my $balance; $balance = NGCP::Panel::Utils::ProfilePackages::get_contract_balance(c => $c, + contract => $contract, + now => $now) if !exists $contract_map{$contract->id}; #apply underrun lock level + $contract_map{$contract->id} = 1; + push @embedded, $self->hal_from_item($c, $subscriber, "subscribers"); + push @links, Data::HAL::Link->new( + relation => 'ngcp:'.$self->resource_name, + href => sprintf('%s%d', $self->dispatch_path, $subscriber->id), + ); + } + $self->delay_commit($c,$guard); + push @links, + Data::HAL::Link->new( + relation => 'curies', + href => 'http://purl.org/sipwise/ngcp-api/#rel-{rel}', + name => 'ngcp', + templated => true, + ), + Data::HAL::Link->new(relation => 'profile', href => 'http://purl.org/sipwise/ngcp-api/'), + $self->collection_nav_links($c, $page, $rows, $total_count, $c->request->path, $c->request->query_params); + + my $hal = Data::HAL->new( + embedded => [@embedded], + links => [@links], ); + $hal->resource({ + total_count => $total_count, + }); + my $response = HTTP::Response->new(HTTP_OK, undef, + HTTP::Headers->new($hal->http_headers(skip_links => 1)), $hal->as_json); + $c->response->headers($response->headers); + $c->response->body($response->content); + return; } - - push @links, - Data::HAL::Link->new( - relation => 'curies', - href => 'http://purl.org/sipwise/ngcp-api/#rel-{rel}', - name => 'ngcp', - templated => true, - ), - Data::HAL::Link->new(relation => 'profile', href => 'http://purl.org/sipwise/ngcp-api/'), - $self->collection_nav_links($c, $page, $rows, $total_count, $c->request->path, $c->request->query_params); - - my $hal = Data::HAL->new( - embedded => [@embedded], - links => [@links], - ); - $hal->resource({ - total_count => $total_count, - }); - my $response = HTTP::Response->new(HTTP_OK, undef, - HTTP::Headers->new($hal->http_headers(skip_links => 1)), $hal->as_json); - $c->response->headers($response->headers); - $c->response->body($response->content); return; } diff --git a/lib/NGCP/Panel/Controller/API/SubscriberPreferencesItem.pm b/lib/NGCP/Panel/Controller/API/SubscriberPreferencesItem.pm index 2017ee5515..273b65063c 100644 --- a/lib/NGCP/Panel/Controller/API/SubscriberPreferencesItem.pm +++ b/lib/NGCP/Panel/Controller/API/SubscriberPreferencesItem.pm @@ -49,21 +49,29 @@ sub journal_query_params { sub GET :Allow { my ($self, $c, $id) = @_; + $c->model('DB')->set_transaction_isolation('READ COMMITTED'); + my $guard = $c->model('DB')->txn_scope_guard; + { + last unless $self->valid_id($c, $id); + my $subscriber = $self->item_by_id($c, $id, "subscribers"); + last unless $self->resource_exists($c, subscriberpreference => $subscriber); - return unless $self->valid_id($c, $id); - my $subscriber = $self->item_by_id($c, $id, "subscribers"); - return unless $self->resource_exists($c, subscriberpreference => $subscriber); - - my $hal = $self->hal_from_item($c, $subscriber, "subscribers"); - - my $response = HTTP::Response->new(HTTP_OK, undef, HTTP::Headers->new( - (map { # XXX Data::HAL must be able to generate links with multiple relations - s|rel="(http://purl.org/sipwise/ngcp-api/#rel-resellers)"|rel="item $1"|r - =~ s/rel=self/rel="item self"/r; - } $hal->http_headers), - ), $hal->as_json); - $c->response->headers($response->headers); - $c->response->body($response->content); + my $balance = NGCP::Panel::Utils::ProfilePackages::get_contract_balance(c => $c, + contract => $subscriber->contract, + ); #apply underrun lock level + my $hal = $self->hal_from_item($c, $subscriber, "subscribers"); + $guard->commit; #potential db write ops in hal_from + + my $response = HTTP::Response->new(HTTP_OK, undef, HTTP::Headers->new( + (map { # XXX Data::HAL must be able to generate links with multiple relations + s|rel="(http://purl.org/sipwise/ngcp-api/#rel-resellers)"|rel="item $1"|r + =~ s/rel=self/rel="item self"/r; + } $hal->http_headers), + ), $hal->as_json); + $c->response->headers($response->headers); + $c->response->body($response->content); + return; + } return; } diff --git a/lib/NGCP/Panel/Controller/API/Subscribers.pm b/lib/NGCP/Panel/Controller/API/Subscribers.pm index 6c930dbbbc..3e41e99ca5 100644 --- a/lib/NGCP/Panel/Controller/API/Subscribers.pm +++ b/lib/NGCP/Panel/Controller/API/Subscribers.pm @@ -329,6 +329,11 @@ sub GET :Allow { my (@embedded, @links, %contract_map); my ($form) = $self->get_form($c); for my $subscriber (@$subscribers) { + my $contract = $subscriber->contract; + NGCP::Panel::Utils::ProfilePackages::get_contract_balance(c => $c, + contract => $contract, + now => $now) if !exists $contract_map{$contract->id}; #apply underrun lock level + $contract_map{$contract->id} = 1; my $resource = $self->resource_from_item($c, $subscriber, $form); push @embedded, $self->hal_from_item($c, $subscriber, $resource, $form); push @links, Data::HAL::Link->new( diff --git a/lib/NGCP/Panel/Utils/Preferences.pm b/lib/NGCP/Panel/Utils/Preferences.pm index b2550fdfc0..8e800b3309 100644 --- a/lib/NGCP/Panel/Utils/Preferences.pm +++ b/lib/NGCP/Panel/Utils/Preferences.pm @@ -163,11 +163,10 @@ sub prepare_resource { $prefs = $sub_prefs->union($ct_prefs->search({attribute_id => {-not_in => [map {$_->get_column('attribute_id')} $sub_prefs->all]}})); $prefs = $prefs->union($dom_prefs->search({attribute_id => {-not_in => [map {$_->get_column('attribute_id')} $prefs->all]}})); } - $prefs = $prefs->search({ }, { - prefetch => 'attribute', - order_by => { '-asc' => 'me.id' }, + join => 'attribute', + order_by => { '-asc' => 'id' }, }); my $resource;