TT#78153 fix _item_by_aor for redis

- prevent unneccesary redis "scan"s
- avoid filter/scan (iterating all registrations) by properly
un-aliasing filednames
- ignore any registration of subs that no longer exists
- apply the fixes for ->search(), but also ->find()

Change-Id: I32c89482fc06e76b0369034cd8f3eda24ebbe1bf
changes/73/38573/6
Rene Krenn 6 years ago
parent 40417637ed
commit adabbf084b

@ -58,8 +58,8 @@ sub _item_rs {
join => [@joins,'subscriber'],
});
} elsif($c->user->roles eq "reseller" || $c->user->roles eq "ccare") {
$item_rs = $item_rs->search({
'contact.reseller_id' => $c->user->reseller_id
$item_rs = $item_rs->search({
'contact.reseller_id' => $c->user->reseller_id
},{
join => [@joins, { 'subscriber' => { 'voip_subscriber' => { 'contract' => 'contact' }}} ],
});
@ -135,7 +135,7 @@ sub resource_from_item {
sub item_by_id {
my ($self, $c, $id) = @_;
my $item_rs = $self->item_rs($c);
return $item_rs->find($id);
}
@ -190,7 +190,7 @@ sub _item_by_aor {
my $domain = $sub->provisioning_voip_subscriber->domain->domain;
return $self->item_rs($c)->search({
my $filter = {
'me.contact' => $contact,
'me.username' => $sub->provisioning_voip_subscriber->username,
$c->config->{redis}->{usrloc}
@ -200,7 +200,17 @@ sub _item_by_aor {
: ($c->config->{features}->{multidomain}
? ('me.domain' => $domain)
: ('me.domain' => undef))
})->first;
};
if ($c->config->{redis}->{usrloc}) {
if ($c->user->roles eq "admin") {
} elsif ($c->user->roles eq "reseller") {
$filter->{reseller_id} = $c->user->reseller_id;
}
return NGCP::Panel::Utils::Subscriber::get_subscriber_location_rs($c, $filter)->first;
} else {
return $self->item_rs($c)->search($filter)->first;
}
}
sub update_item {
@ -227,7 +237,7 @@ sub update_item {
$values->{flags} = 0;
$values->{cflags} = 0;
$values->{cflags} |= 64 if($values->{nat});
NGCP::Panel::Utils::Kamailio::create_location($c,
$sub->provisioning_voip_subscriber,
$values

@ -73,6 +73,7 @@ sub find {
my ($self, $filter) = @_;
my $id;
$filter = $self->_unalias($filter);
if (ref $filter eq "") {
$id = $filter;
$filter = { id => $id };
@ -85,6 +86,7 @@ sub find {
my %entry = $self->_redis->hgetall($self->usrloc_path.":entry::$id");
$entry{id} = $entry{ruid};
return unless $entry{id};
# deflate expires column
if ($entry{expires}) {
$entry{expires} = strftime("%Y-%m-%d %H:%M:%S", localtime($entry{expires}));
@ -96,6 +98,7 @@ sub find {
'+select' => ['reseller.id'],
'+as' => ['reseller_id']
})->first;
return unless $subscribers_reseller;
if (exists $filter->{reseller_id} && $filter->{reseller_id} != $subscribers_reseller->get_column('reseller_id')) {
return;
}
@ -106,6 +109,7 @@ sub search {
my ($self, $filter, $opt) = @_;
$filter //= {};
$filter = $self->_unalias($filter // {});
my $new_rs = $self->meta->clone_object($self);
unless ($new_rs->_query_done) {
if ($filter->{id}) {
@ -165,19 +169,19 @@ sub _rows_from_mapkey {
foreach my $key (@{ $keys }) {
my %entry = $self->_redis->hgetall($key);
$entry{id} = $entry{ruid};
next unless $entry{id};
next unless $entry{id};
# deflate expires column
if ($entry{expires}) {
$entry{expires} = strftime("%Y-%m-%d %H:%M:%S", localtime($entry{expires}));
} else {
$entry{expires} = "1970-01-01 00:00:00";
}
my $subscribers_reseller = $self->_c->model('DB')->resultset('provisioning_voip_subscribers')->search({username => $entry{username}}, {
join => { 'contract' => { 'contact' => 'reseller' } },
'+select' => ['reseller.id'],
'+as' => ['reseller_id']
})->first;
return unless $subscribers_reseller;
if (exists $filter->{reseller_id} && $filter->{reseller_id} != $subscribers_reseller->get_column('reseller_id')) {
next;
}
@ -265,4 +269,19 @@ sub _scan {
return 1;
}
sub _unalias {
my ($self,$filter) = @_;
if ('HASH' eq ref $filter) {
my %unaliased_filter = ();
my $source_alias = $self->current_source_alias();
foreach my $key (keys %$filter) {
my $k = $key;
$k =~ s/^$source_alias\.//;
$unaliased_filter{$k} = $filter->{$key};
}
$filter = \%unaliased_filter;
}
return $filter;
}
1;

@ -48,7 +48,7 @@ sub get_subscriber_location_rs {
}
$redis->select($c->config->{redis}->{usrloc_db});
my $rs = NGCP::Panel::Utils::RedisLocationResultSet->new(_redis => $redis, _c => $c);
$rs = $rs->search($filter);
$rs = $rs->search($filter) if $filter;
return $rs;
} catch($e) {
$c->log->error("Failed to fetch location information from redis: $e");

Loading…
Cancel
Save