[horde] Horde 3.1, memcache sessionhandler, sidebar, and flock()
Chris Stromsoe
cbs at cts.ucla.edu
Sat Dec 30 04:59:36 PST 2006
On Sat, 30 Dec 2006, Chris Stromsoe wrote:
> On Sat, 30 Dec 2006, Chris Stromsoe wrote:
>
>> The call to "$GLOBALS['kronolith_shares']->addShare($share);" returns
>> the results of "$this->_datatree->add($share);"
>>
>> That calls exists() from DataTree.php, which calls _load() from
>> DataTree/sql.php. _load() runs the query
>>
>> SELECT c.datatree_id, c.datatree_name, c.datatree_parents,
>> c.datatree_order
>> FROM horde_datatree c
>> WHERE c.group_uid = 'horde.shares.kronolith'
>>
>> and then calls DB::getAll(), which loads the results by looping over all
>> 13,000+ of the entries. I added time() calls into DB/common.php around the
>> block that loops loading the rows, and I'm timing it at 175s to complete.
>
>
> Now I'm really confused. The code block in base.php that I'm looking at
> looks like this:
>
> /* If the user's personal calendar doesn't exist, then create it. */
> Horde::logMessage("time " . time(), __FILE__, __LINE__, PEAR_LOG_ERR);
> if (!$GLOBALS['kronolith_shares']->exists(Auth::getAuth())) {
> Horde::logMessage("time " . time(), __FILE__, __LINE__, PEAR_LOG_ERR);
> require_once 'Horde/Identity.php';
> $identity = &Identity::singleton();
> $name = $identity->getValue('fullname');
> if (trim($name) == '') {
> $name = Auth::removeHook(Auth::getAuth());
> }
>
> $share =
> &$GLOBALS['kronolith_shares']->newShare(Auth::getAuth());
> $share->set('name', sprintf(_("%s's Calendar"), $name));
> Horde::logMessage("time " . time(), __FILE__, __LINE__, PEAR_LOG_ERR);
> $GLOBALS['kronolith_shares']->addShare($share);
> Horde::logMessage("time " . time(), __FILE__, __LINE__, PEAR_LOG_ERR);
> $GLOBALS['all_calendars'][Auth::getAuth()] = &$share;
>
>
> The call to ->exists goes through the above mentioned code path. It runs the
> same query and loads the same 13k+ entries. It completes in 2s according to
> the elapsed time() calls.
>
> The call to ->addShare() ends up calling ->exists(), which runs the above
> query. Only it takes 175s to complete. I added additional time() logging
> into the getAll() from PEAR DB to verify.
>
>
> If I add more calls to ->exists, for example, changing the code to read:
>
> /* If the user's personal calendar doesn't exist, then create it. */
> Horde::logMessage("time " . time(), __FILE__, __LINE__, PEAR_LOG_ERR);
> if (!$GLOBALS['kronolith_shares']->exists(Auth::getAuth())) {
> Horde::logMessage("time " . time(), __FILE__, __LINE__, PEAR_LOG_ERR);
> $GLOBALS['kronolith_shares']->exists(Auth::getAuth());
> Horde::logMessage("time " . time(), __FILE__, __LINE__, PEAR_LOG_ERR);
>
> require_once 'Horde/Identity.php';
> $identity = &Identity::singleton();
> $name = $identity->getValue('fullname');
> if (trim($name) == '') {
> $name = Auth::removeHook(Auth::getAuth());
> }
>
> $share =
> &$GLOBALS['kronolith_shares']->newShare(Auth::getAuth());
> $share->set('name', sprintf(_("%s's Calendar"), $name));
> Horde::logMessage("time " . time(), __FILE__, __LINE__, PEAR_LOG_ERR);
> $GLOBALS['kronolith_shares']->addShare($share);
> Horde::logMessage("time " . time(), __FILE__, __LINE__, PEAR_LOG_ERR);
> $GLOBALS['all_calendars'][Auth::getAuth()] = &$share;
>
One final oddity:
If I remove the first explicit call to ->exists() and change the code so
that it reads:
/* If the user's personal calendar doesn't exist, then create it. */
Horde::logMessage("time " . time(), __FILE__, __LINE__, PEAR_LOG_ERR);
if (1) {
Horde::logMessage("time " . time(), __FILE__, __LINE__, PEAR_LOG_ERR);
require_once 'Horde/Identity.php';
$identity = &Identity::singleton();
$name = $identity->getValue('fullname');
if (trim($name) == '') {
$name = Auth::removeHook(Auth::getAuth());
}
$share = &$GLOBALS['kronolith_shares']->newShare(Auth::getAuth());
$share->set('name', sprintf(_("%s's Calendar"), $name));
Horde::logMessage("time " . time(), __FILE__, __LINE__, PEAR_LOG_ERR);
$GLOBALS['kronolith_shares']->addShare($share);
Horde::logMessage("time " . time(), __FILE__, __LINE__, PEAR_LOG_ERR);
$GLOBALS['all_calendars'][Auth::getAuth()] = &$share;
to unconditionally run the block, ->addShares() returns in 37s instead of
175s.
-Chris
>
>
> Inserting the additional call to ->exists() adds another 175s to the call
> time.
>
>
> I've built a stand-alone file using DB to execute the same query, but can't
> duplicate the behavior.
>
> For reference, this is horde stable, kronolith stable, postgres 8.2, php
> 5.2.0, and DB 1.7.6. I am not familiar enough with the PEAR DB code, let
> alone how horde is using it to know where to look next. Any ideas?
>
>
>
> -Chris
>
More information about the horde
mailing list