[dev] Fix kronolith-agenda script
Gonçalo Queirós
goncalo.queiros at portugalmail.net
Thu Mar 22 23:03:47 UTC 2012
On 03/21/2012 11:40 AM, Gonçalo Queirós wrote:
> Citando Jan Schneider <jan at horde.org>:
>> Zitat von Gonçalo Queirós <goncalo.queiros at portugalmail.net>:
>>> Hi there dev.
>>>
>>> We were trying to use the kronolith-agenda script to send daily
>>> agendas to
>>> everyone on our service, but the problem is that we currently
>>> have more
>>> than 350.000 shares and the script just runs out of memory, even
>>> with 2Gb!
>>>
>>> Looking at the script more closely, we think there's a way to
>>> make the
>>> script work, regardless of the number of shares on the system,
>>> but we would
>>> like your opinion on that before coming out with a patch.
>>>
>>> Current script:
>>> 1 - Get every calendar share
>>> 2 - For every share, list its events, to check if it has any
>>> event to the
>>> current day
>> This is not correct, there is no such step
> Sorry, was debugging on my own code ;-)
>>
>>> 3 - For the remaining list get all users that have access to the
>>> calendars
>>> 4 - For every user, check if he desires to receive the daily
>>> agenda (pref)
>>> 5 - For every user that wants to receive the daily agenda, get his
>>> calendars
>>> 6 - Again for every calendar get the ones that have any event to the
>>> current day
>>> 7 - Send the email if there's any calendar left
>>>
>>> For our installation the current script stops on the first step,
>>> because
>>> it runs out of memory.
>>> We thought on creating sub-sets for the shares, but the problem
>>> is that we
>>> only know the full agenda of a user after we analyze all shares
>>> he has
>>> access to.
>>>
>>> What we propose:
>>> 1 - Get every users that desire to receive the daily agenda (pref)
>> That's exactly what steps 1, 3, and 4 do.
> I know, the difference is that instead of asking for all the shares, we
> could ask directly for all the users that wan't to receive an agenda, so
> we could eventually narrow the search.
> Also, knowing the user instead of the calendars allows us to immediately
> send the user his agenda, which will free the memory when the loop for
> that user ends.
>>> 2 - execute the steps 5,6,7 of the original script
>>>
>>> In the worst case scenario this script will still perform better
>>> than the
>>> current one, because it doesn't have the first 3 steps.
>>> With this approach we can create sub-sets of users which will
>>> allow the
>>> script to run until the end without running out of memory (even
>>> if this is
>>> a long process, it will execute)
>>>
>>> Problems:
>>> We don't think there's currently a method to retrieve all prefs
>>> from the
>>> backed by its name. Maybe we need to create it, and state that
>>> this is for
>>> admin purposes only and shouldn't be called by the user-level
>>> code (just
>>> like the listAllShares method from Horde_Share_Sql).
>>> Currently the pref_name column is not indexed, so we expect slow
>>> queries.
>>> The fix for that is obvious.
>> The problem is that not all backends support listing preference
>> details for others than the current user. On the other hand, those
>> backends are already missing some features anyway, and we already
>> have a listScopes() method that is only implemented in a few backends
>> too. In the end this might be an option.
>> Actually, since the same script already requires the preference
>> backend to return any user's preference, this would be a safe approach.
>>
>> Another approach would be do take a further look at why
>> listAllShares() exceeds memory. Well, there is not much to look
>> actually when creating 350.000+ share objects and then attempting to
>> sort them. Alternatively we could implement an Iterator interface in
>> the share drivers and only receive the shares one by one while
>> looping them.
>>
>> Jan.
>>
>> --
>> The Horde Project
>> http://www.horde.org/
>>
>>
>> --
>> Horde developers mailing list
>> Frequently Asked Questions: http://horde.org/faq/To unsubscribe,
>> mail: dev-unsubscribe at lists.horde.org
> If you iterate the shares one by one i think you will end up with a
> similar problem, because you can't send an agenda before you have all the
> events from all the calendars that a user has access to. So you would
> probably end up again with the 350.000+ shares on memory.
>
> Will try to produce a patch and submit for your appreciation.
Jan, attached is a first preview patch, so you can see if things are
going in the desired direction.
Returning a class that implements the ArrayAccess allows backward
compatibility, but unfortunately, any array_ like function (array_merge,
array_keys, etc) don't work, so a bit more of refactor is needed.
One thing that needs to be done is move the Horde_Share_List factory to
an injector (if I understand the injectors correctly), but for now I
instantiated the objects inside the Horde_Share_Sql directly.
Another problem I found was that Horde_Shares can have callbacks for
listings, so for now I create the new Horde_Share_List object and if the
callback is active, that object is sent to the callback. This might
brake up for users that rely on array_ like functions, because as stated
above they wont work now.
What do you devs think?
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: share_list_patch.txt
URL: <http://lists.horde.org/archives/dev/attachments/20120322/fcabe0f4/attachment-0001.txt>
More information about the dev
mailing list