0009910: updateFlags is using too much memory
authorPhilipp Schüle <p.schuele@metaways.de>
Wed, 21 May 2014 11:22:35 +0000 (13:22 +0200)
committerPhilipp Schüle <p.schuele@metaways.de>
Wed, 21 May 2014 11:59:30 +0000 (13:59 +0200)
* prevents update of too many flags at once
* adds more logging

https://forge.tine20.org/mantisbt/view.php?id=9910

Change-Id: I8c1bfaf58fbae39f0d3a44ec06917aa137ecc898
Reviewed-on: http://gerrit.tine20.com/customers/668
Tested-by: Jenkins CI (http://ci.tine20.com/)
Reviewed-by: Philipp Schüle <p.schuele@metaways.de>
tine20/Felamimail/Controller/Cache/Message.php

index 1c85dce..c4e82be 100644 (file)
@@ -29,7 +29,7 @@ class Felamimail_Controller_Cache_Message extends Felamimail_Controller_Message
      *
      * @var integer
      */
-    protected $_flagSyncCountPerStep = 200;
+    protected $_flagSyncCountPerStep = 500;
     
     /**
      * max size of message to cache body for
@@ -1154,29 +1154,33 @@ class Felamimail_Controller_Cache_Message extends Felamimail_Controller_Message
         
         $flags = $imap->getChangedFlags($folder->imap_lastmodseq);
         
+        if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__
+            . ' got ' . count($flags) . ' changed flags');
+        if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ 
+            . ' Flags: ' . print_r($flags, true));
+        
         if (! empty($flags)) {
             
-            $filter = new Felamimail_Model_MessageFilter(array(
-                array(
-                    'field' => 'account_id', 'operator' => 'equals', 'value' => $folder->account_id
-                ),
-                array(
-                    'field' => 'folder_id',  'operator' => 'equals', 'value' => $folder->getId()
-                ),
-                array(
-                    'field' => 'messageuid', 'operator' => 'in', 'value' => array_keys($flags)
-                )
-            ));
-            $pagination = new Tinebase_Model_Pagination(array(
-                'start' => 0,
-                'limit' => $this->_flagSyncCountPerStep,
-            ));
-            $messages = $this->_backend->search($filter, $pagination);
-            
-            while (count($messages) > 0) {
+            if (count($flags) <= $this->_flagSyncCountPerStep) {
+                $filter = new Felamimail_Model_MessageFilter(array(
+                    array(
+                        'field' => 'account_id', 'operator' => 'equals', 'value' => $folder->account_id
+                    ),
+                    array(
+                        'field' => 'folder_id',  'operator' => 'equals', 'value' => $folder->getId()
+                    ),
+                    array(
+                        'field' => 'messageuid', 'operator' => 'in', 'value' => array_keys($flags)
+                    )
+                ));
+                $messages = $this->_backend->search($filter);
+                if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ 
+                    . ' got ' . count($messages) . ' messages.');
+                
                 $this->_setFlagsOnCache($flags, $folder, $messages, false);
-                $pagination->start += $this->_flagSyncCountPerStep;
-                $messages = $this->_backend->search($filter, $pagination);
+            } else {
+                if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ .
+                    ' Got too many changed flags. Maybe this is the initial load of the cache. Just updating last mod seq ...');
             }
             
             foreach ($flags as $flag) {