Re: Proposal for speeding up TicketAcls
Moritz Lenz <[email protected]> Thu, 12 Dec 2013 18:12:54 +0100
| Newsgroups | gmane.comp.otrs.devel |
|---|---|
| Message-ID | <[email protected]> |
Hi,
On 12/12/2013 09:18 AM, Martin Gruner wrote:
> Hi Moritz,
>
> this sounds great to me.
and it turns out it's not too hard to implement either :-)
See https://github.com/OTRS/otrs/pull/180
> Am 10.12.13 13:58, schrieb Moritz Lenz:
>> Hi all,
>>
>> recently I found out that although we use only very few ACLs, the ACL
>> mechanism slows down our OTRS installation. Part of the problem is that
>> our CustomerUser-backend talks to an external data source, which is
>> slow. But the problem is more general: Lots of data is assembled in
>> Kernel::System::Ticket->TicketACL, which isn't actually used later on.
>> Since ACLs are also checked for ticket lists (like in AgentTicketQueue
>> or AgentTicketSearch), this can be a significant overhead.
>>
>> For normal ACLs, we can easily find out which data they actually use.
>> For ACL modules, I propose we add extra configuration.
>>
>> Before, the configuration of an ACL module looks like this in
>> Kernel::Config:
>>
>> $Self->{'Ticket::Acl::Module'}->{'TheAclModulename'} = {
>> Module => 'Kernel::System::Ticket::Acl::TheAclModule',
>> };
>>
>> If we extend that to something like this:
>>
>> $Self->{'Ticket::Acl::Module'}->{'TheAclModulename'} = {
>> Module => 'Kernel::System::Ticket::Acl::TheAclModule',
>> Checks => ['Owner', 'Queue', 'SLA', 'Ticket'],
>> ReturnType => 'Ticket',
>> ReturnSubType => ['State', 'Service'],
>> };
>>
>> we can apply two optimizations:
>>
>> 1) Only invoke an Acl Module if the ReturnType and ReturnSubType
>> overlap with the TicketAcl params ReturnType and ReturnSubType
>> 2) Only gather data for the requested Checks elements. If for example no
>> Acl and no ACL module depends on the Service or the CustomerUser, than
>> those pieces of infomation don't need to retrieved at all.
>
> Yes. This can be implemented backwards compatible, i. e. if the
> configuration is not present, always run the ACL.
That's how I've done it in
https://github.com/moritz/otrs/commit/e1ccd3f5d8b625580e52c41d21d8846062f9f32f
>> As a further note, most information seems to show up twice in the
>> %Checks argument to the Acl module, for example both as $Checks{Owner}
>> and $Checks{Ticket}{Owner}. To get the desired speedup, a module which
>> only lists the check 'Ticket' would get whatever data TicketGet returns,
>> not the additional data that is currently added in method TicketAcl.
>
> I'm not sure about this one. Let's hear what Carlos Rodriguez has to
> say about it.
I have mitigated possible fallout from this approach by looking a bit
deeper into the ACL. If for example an ACL has
Properties => {
Ticket => {
Queue => ...
}
}
then both the Ticket and the Queue data is fetched. Which makes all the
available ACL unit tests pass.
>> P.S. for the sake of completeness I've gone through Kernel::System::Ticket,
>> and looked up the possible values for Checks, ReturnType and ReturnSubType.
>> Here they are:
>>
>> Checks:
>> CustomerUser
>> DynamicField
>> Frontend
>> Owner
>> Priority
>> Process
>> Queue
>> Responsible
>> Service
>> SLA
>> State
>> Ticket
>> Type
>>
>> ReturnType:
>> Action
>> Ticket
>>
>> ReturnSubType:
>> Type
>> Queue
>> State
>> Service
>> SLA
>> Priority
>>
>
> Nice. Please feel free to add this to the POD, and also to improve the
> existing code where you see fit.
I'll update the documentation a bit.
Cheers,
Moritz
_______________________________________________
OTRS mailing list: dev - Webpage: http://otrs.org/
Archive: http://lists.otrs.org/pipermail/dev
To unsubscribe: http://lists.otrs.org/cgi-bin/listinfo/dev