TT#158252 API GET subscriberpreferences - fix DBI timeout

* Add pref->attribute prefetching.
 * Remove unused contract balance calling.

Change-Id: Idff3893beb42aa72bd04d6248a390ab6c89fe4a1
mr10.4
Oleksandr Duts 4 years ago
parent ebfcc70505
commit a6b5ac98c0

@ -87,53 +87,44 @@ sub GET :Allow {
my ($self, $c) = @_; my ($self, $c) = @_;
my $page = $c->request->params->{page} // 1; my $page = $c->request->params->{page} // 1;
my $rows = $c->request->params->{rows} // 10; my $rows = $c->request->params->{rows} // 10;
$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_rs = $self->item_rs($c, "subscribers"); my $subscribers = NGCP::Panel::Utils::Contract::acquire_contract_rowlocks(c => $c,
(my $total_count, $subscribers_rs, my $subscribers_rows) = $self->paginate_order_collection($c, $subscribers_rs); rs => $subscribers_rs,
my $subscribers = NGCP::Panel::Utils::Contract::acquire_contract_rowlocks(c => $c, contract_id_field => 'contract_id');
rs => $subscribers_rs, my $now = NGCP::Panel::Utils::DateTime::current_local;
contract_id_field => 'contract_id'); my (@embedded, @links);
my $now = NGCP::Panel::Utils::DateTime::current_local; for my $subscriber (@$subscribers) {
my (@embedded, @links, %contract_map); next unless($subscriber->provisioning_voip_subscriber);
for my $subscriber (@$subscribers) { push @embedded, $self->hal_from_item($c, $subscriber, "subscribers");
next unless($subscriber->provisioning_voip_subscriber); push @links, Data::HAL::Link->new(
my $contract = $subscriber->contract; relation => 'ngcp:'.$self->resource_name,
my $balance; $balance = NGCP::Panel::Utils::ProfilePackages::get_contract_balance(c => $c, href => sprintf('%s%d', $self->dispatch_path, $subscriber->id),
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; return;
} }

@ -49,29 +49,21 @@ sub journal_query_params {
sub GET :Allow { sub GET :Allow {
my ($self, $c, $id) = @_; 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);
my $balance = NGCP::Panel::Utils::ProfilePackages::get_contract_balance(c => $c, return unless $self->valid_id($c, $id);
contract => $subscriber->contract, my $subscriber = $self->item_by_id($c, $id, "subscribers");
); #apply underrun lock level return unless $self->resource_exists($c, subscriberpreference => $subscriber);
my $hal = $self->hal_from_item($c, $subscriber, "subscribers");
$guard->commit; #potential db write ops in hal_from my $hal = $self->hal_from_item($c, $subscriber, "subscribers");
my $response = HTTP::Response->new(HTTP_OK, undef, HTTP::Headers->new( my $response = HTTP::Response->new(HTTP_OK, undef, HTTP::Headers->new(
(map { # XXX Data::HAL must be able to generate links with multiple relations (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="(http://purl.org/sipwise/ngcp-api/#rel-resellers)"|rel="item $1"|r
=~ s/rel=self/rel="item self"/r; =~ s/rel=self/rel="item self"/r;
} $hal->http_headers), } $hal->http_headers),
), $hal->as_json); ), $hal->as_json);
$c->response->headers($response->headers); $c->response->headers($response->headers);
$c->response->body($response->content); $c->response->body($response->content);
return;
}
return; return;
} }

@ -329,11 +329,6 @@ sub GET :Allow {
my (@embedded, @links, %contract_map); my (@embedded, @links, %contract_map);
my ($form) = $self->get_form($c); my ($form) = $self->get_form($c);
for my $subscriber (@$subscribers) { 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); my $resource = $self->resource_from_item($c, $subscriber, $form);
push @embedded, $self->hal_from_item($c, $subscriber, $resource, $form); push @embedded, $self->hal_from_item($c, $subscriber, $resource, $form);
push @links, Data::HAL::Link->new( push @links, Data::HAL::Link->new(

@ -163,10 +163,11 @@ sub prepare_resource {
$prefs = $sub_prefs->union($ct_prefs->search({attribute_id => {-not_in => [map {$_->get_column('attribute_id')} $sub_prefs->all]}})); $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->union($dom_prefs->search({attribute_id => {-not_in => [map {$_->get_column('attribute_id')} $prefs->all]}}));
} }
$prefs = $prefs->search({ $prefs = $prefs->search({
}, { }, {
join => 'attribute', prefetch => 'attribute',
order_by => { '-asc' => 'id' }, order_by => { '-asc' => 'me.id' },
}); });
my $resource; my $resource;

Loading…
Cancel
Save