Juan Ramos created GEODE-7283:
---------------------------------

             Summary: OQL Method Authorizer in Query Execution Context
                 Key: GEODE-7283
                 URL: https://issues.apache.org/jira/browse/GEODE-7283
             Project: Geode
          Issue Type: Improvement
          Components: querying
            Reporter: Juan Ramos


When using security, the OQL method authorizer is instantiated multiple times 
during the OQL execuion, incurring into a waste of time and resources.
The authorizer is obtained through the 
{{queryContext.getCache().getQueryService().getMethodInvocationAuthorizer()}} 
method, which basically creates a new instance of the {{DefaultQueryService}} 
and, also, a new instance of the {{MethodInvocationAuthorizer}} configured:

{code:title=DefaultQueryService.java|borderStyle=solid}
public DefaultQueryService(InternalCache cache) {
  if (cache == null)
      throw new IllegalArgumentException("cache must not be null");

  this.cache = cache;
  if (!cache.getSecurityService().isIntegratedSecurity() || 
ALLOW_UNTRUSTED_METHOD_INVOCATION) {
    // A no-op authorizer, allow method invocation
    this.methodInvocationAuthorizer = ((Method m, Object t) -> true);
  } else {
    this.methodInvocationAuthorizer = new RestrictedMethodAuthorizer(cache);
  }
}
{code}

When using implicit method invocation, the above implies that the authorizer 
will be created X times per query, being X the amount of attributes accessed 
per object multiplied by the amount of objects traversed by the query. As an 
example, if we have a region with 100 entries (entry has a non-public {{name}} 
attribute with a public {{getName()}} accessor) and we execute {{SELECT o.name 
FROM /Region o}}, the {{MethodInvocationAuthorizer}} will be instantiated 100 
times.
When using explicit method invocation things are "better": the 
{{MethodInvocationAuthorizer}} is only created once for every new (unknown) 
method during the lifetime of the Geode member, and that's basically because 
the {{MethodDispatch}} class is internally cached and it also has the 
{{MethodInvocationAuthorizer}} used when it was created stored internally. This 
incurs into another problem: once a {{MethodDispatch}} is created, the 
{{MethodInvocationAuthorizer}} can't be changed, the user needs to restart the 
member in order to clear the cache ({{CompiledOperation}}) and force the query 
engine to execute a new lookup of the now unknown method (which must also be 
done through the API when implementing GEODE-6991, otherwise changes won't be 
applied).
The {{MethodInvocationAuthorizer}} should be unique and unchangeable during the 
execution of a particular query on a particular member, so we should 
investigate whether it would make sense to create it only once a the beginning 
of the query execution and have it directly available as part of the 
{{QueryExecutionContext}}.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to