<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Oct 26, 2017 at 10:23 PM, Matt Riedemann <span dir="ltr"><<a href="mailto:mriedemos@gmail.com" target="_blank">mriedemos@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Nova has had this long-standing known performance issue if you're filtering a large number of instances by IP. The instance IPs are stored in a JSON blob in the database so we don't do filtering in SQL. We pull the instances out of the database, deserialize the JSON and then apply a regex filter match in the nova-api python code.<br>
<br>
At the Queens PTG we talked about possible ways to fix this and came up with this nova spec:<br>
<br>
<a href="https://specs.openstack.org/openstack/nova-specs/specs/queens/approved/improve-filter-instances-by-ip-performance.html" rel="noreferrer" target="_blank">https://specs.openstack.org/op<wbr>enstack/nova-specs/specs/queen<wbr>s/approved/improve-filter-<wbr>instances-by-ip-performance.<wbr>html</a><br>
<br>
The idea is to have nova get ports from neutron and apply the IP filter in neutron to whittle down the ports, then from that list of ports get the instances to pull out of the nova database.<br>
<br>
One issue that has come up with this is neutron does not currently support regex filters when listing ports. There is an RFE for adding that:<br>
<br>
<a href="https://bugs.launchpad.net/neutron/+bug/1718605" rel="noreferrer" target="_blank">https://bugs.launchpad.net/neu<wbr>tron/+bug/1718605</a><br>
<br>
The proposed neutron implementation is to just do SQL LIKE substring matching in the database.<br>
<br>
However, one issue that has come up is that the compute API accepts a python regex filter and uses re.match():<br>
<br>
<a href="https://github.com/openstack/nova/blob/16.0.0/nova/compute/api.py#L2469" rel="noreferrer" target="_blank">https://github.com/openstack/n<wbr>ova/blob/16.0.0/nova/compute/a<wbr>pi.py#L2469</a><br>
<br>
At least one good thing about that is match() only matches from the beginning of the string unlike search().<br>
<br>
So for example I can filter on "192.16.*[1-5]$" if I wanted to, but that's not going to work with just a LIKE substring filter in SQL.<br>
<br>
The question is, does anyone actually do more than basic substring matching with the IP filter today? Because if we started using neutron, that behavior would be broken. We've never actually documented the match restrictions on the IP filter, but that's not a good reason to break it.<br></blockquote><div><br></div><div>The use-case for us is that it helps us easily identify or find VMs which we get any abuse reports for (or anything we see malicious traffic going to/from).  We usually search for an *exact* match of the IP address as we are simply trying to perform a lookup of instance ID based on the IP address.  Regex matching isn't important in our case.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
One option is to make this configurable such that deployments which rely on the complicated pattern matching can just use the existing nova code despite performance issues. However, that's not interoperable, I hate config-driven API behavior, and it would mean maintaining two code paths in nova, which is also terrible.<br>
<br>
I was trying to think of a way to determine if the IP filter passed to nova is basic or a complicated pattern match and let us decide that way, but I'm not sure if there are good ways to detect that - maybe by simply looking for special characters like (, ), - and $? But then there is [] and we have an IPv6 filter, so that gets messy too...<br>
<br>
For now I'd just like to know if people rely on the regex match or not. Other ideas on how to handle this are appreciated.<span class="HOEnZb"><font color="#888888"><br>
<br>
-- <br>
<br>
Thanks,<br>
<br>
Matt<br>
<br>
______________________________<wbr>______________________________<wbr>______________<br>
OpenStack Development Mailing List (not for usage questions)<br>
Unsubscribe: <a href="http://OpenStack-dev-request@lists.openstack.org?subject:unsubscribe" rel="noreferrer" target="_blank">OpenStack-dev-request@lists.op<wbr>enstack.org?subject:unsubscrib<wbr>e</a><br>
<a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" rel="noreferrer" target="_blank">http://lists.openstack.org/cgi<wbr>-bin/mailman/listinfo/openstac<wbr>k-dev</a><br>
</font></span></blockquote></div><div class="gmail_signature" data-smartmail="gmail_signature"><br></div>
</div></div>