[Building Sakai] Proposed API change to reduce cost of resources list view
Stephen Marquard
stephen.marquard at uct.ac.za
Tue Sep 22 10:51:59 PDT 2009
In looking at the case previously where a Resources list view of 1000+ or so items in a site generates a large volume of queries, it seemed that one problem is that the security service caches on the basis of the item reference, whereas in fact the lookup is resolved to finding whether a role has a permission in a set of authzgroups.
If we moved the caching in SecurityService one layer down (or added a layer of caching) it would eliminate duplicate queries for items that resolve to the same set of authzgroups.
I think the introduction of a 'LIKE %' query for authz lookups may well be problematic, and a cure worse than the problem.
Regards
Stephen
>>> Jim Eng <jimeng at umich.edu> 9/22/2009 6:58 PM >>>
The list view in the Resources tool in Sakai 2.x has a column to show
who can see each resource or folder. Potential values include the
entire site, members of particular groups, and the public.
Items at any level may be made public, so the question ("is this item
public?") must be asked for virtually every item in a site.
Determining whether resources and folders are open to the public is
relatively expensive because it must be repeated so often. If a site
contains lots of resources, the expanded view can results in dozens,
hundreds or thousands of queries. The only short cut at this time is
that the query can be avoided for items that are inside a folder that
is public since they will also be public.
The SQL query is against the various realms tables. It asks whether
the anonymous role has the "content.read" permission for the realm
associated with a particular resource or folder (or for the realm of
any folder that contains the item).
We could improve on that if the SecurityService (or
AuthzGroupService?) interface had a method to ask a different
question: Are there any realms within this site for which the
anonymous role has "content.read" permission (and if so, what are they)?
This query would likely be implemented with a SQL "like" operator and
a one-sided wildcard. This is actually a join of information from
three or four tables, but the query would be asking for a list of
sakai_realm.realm_id values like '/content/group/<side-id>/%' (or like
'/content/group-user/<user-id>/%' for workspaces, and it's possible
there are other variations) for which there are entries in the
sakai_realm_rl_fn table where the role_key identifies the anonymous
role and the function_key corresponds to "content.read". The result
would be a list of realm identifiers.
That would allow Content Hosting to get a list of realms (possibly
empty) for items that are public. Content Hosting could then avoid
making dozens or hundreds or thousands of individual queries by
checking that list of public realms. An alternative to adding a
specific API method for this would be to execute that query in the
SecurityService and do some form of caching so the Security Service
could answer this question hundreds of times without doing hundreds of
individual queries.
Thoughts?
Jim
_______________________________________________
sakai-dev mailing list
sakai-dev at collab.sakaiproject.org
http://collab.sakaiproject.org/mailman/listinfo/sakai-dev
TO UNSUBSCRIBE: send email to sakai-dev-unsubscribe at collab.sakaiproject.org with a subject of "unsubscribe"
More information about the sakai-dev
mailing list