Zend Framework

setDefaultMetadataCache throw exception after restart the memcached

Details

  • Type: Bug Bug
  • Status: Closed Closed
  • Priority: Trivial Trivial
  • Resolution: Fixed
  • Affects Version/s: 1.6.2
  • Fix Version/s: 1.10.2
  • Component/s: Zend_Db_Table
  • Labels:
    None
  • Fix Version Priority:
    Should Have

Description

Fatal error: Uncaught exception 'Zend_Db_Table_Exception' with message 'Failed saving metadata to 
metadataCache' in /var/www/ZENDIR/Zend/Db/Table/Abstract.php:635 Stack trace: 
#0 /var/www/ZENDIR/Zend/Db/Table/Abstract.php(540): Zend_Db_Table_Abstract->_setupMetadata() 
#1 /var/www/ZENDIR/Zend/Db/Table/Abstract.php(268): Zend_Db_Table_Abstract->_setup() 
#2 /var/www/prcms/application/Initializer.php(155): Zend_Db_Table_Abstract->__construct() 
#3 /var/www/prcms/application/Initializer.php(55): Initializer->initSite() 
#4 /var/www/prcms/application/bootstrap.php(31): Initializer->__construct('testing') 
#5 /var/www/prcms/public/index.php(2): require('/var/www/prcms/...') 
#6 {main} thrown in /var/www/ZENDIR/Zend/Db/Table/Abstract.php on line 635

ENV:
1) Linux lamp 2.6.18-4-686 #1 SMP Mon Mar 26 17:17:36 UTC 2007 i686 GNU/Linux
2) apache-2.2.6
3) php-5.2.3
4) memcached-1.2.4 (should also affect latest stable version)
5) ZendFramework: 1.6.2 (after checked the latest trunk code, the problem hasnot fixed yet)

Our system use memcached as the cache storage, the connection is persistent. This bug hasnot occured under non-persistent Memcached circumstance

So the description below under persistent connection. (<persistent>1</persistent>)
After restart the Memcached, function save frequently returns false;

Zend/Db/Table/Abstract.php
            if (null !== $this->_metadataCache && !$this->_metadataCache->save($metadata, $cacheId)) {
                /**
                 * @see Zend_Db_Table_Exception
                 */
                require_once 'Zend/Db/Table/Exception.php';
                throw new Zend_Db_Table_Exception('Failed saving metadata to metadataCache');
            }

So if $this->_metadataCache->save($metadata, $cacheId)) return false, then the exception threw

Activity

Hide
Ken Chou added a comment -

Agree.
This is not a crit error for Zend_Db_Table and need no exception to throw.

Show
Ken Chou added a comment - Agree. This is not a crit error for Zend_Db_Table and need no exception to throw.
Hide
chocobn added a comment -

same error
if memached is not reachable, throw an exception

Show
chocobn added a comment - same error if memached is not reachable, throw an exception
Hide
Ralph Schindler added a comment -

Formatted error.
Marked as trivial since a suggested fix is supplied.
Marked as "should have" for "next mini release"

Show
Ralph Schindler added a comment - Formatted error. Marked as trivial since a suggested fix is supplied. Marked as "should have" for "next mini release"
Hide
Ludwig Ruderstaller added a comment -

why isnt this fixed in current versions ?

at least seems this way in 1.9.0

restart memcached
error -> reload -> working -> reload -> error

Show
Ludwig Ruderstaller added a comment - why isnt this fixed in current versions ? at least seems this way in 1.9.0 restart memcached error -> reload -> working -> reload -> error
Hide
Ludwig Ruderstaller added a comment -

should take a look at the datestamps of the comments... nevermind.

Show
Ludwig Ruderstaller added a comment - should take a look at the datestamps of the comments... nevermind.
Hide
Ralph Schindler added a comment -

Digging into this, is an exception not what we want here? It seems like if you ask it to use a cache, and the cache fails at saving, shouldnt an exception be thrown? Is this perhaps a situation that should be taken care of before table metadataSetup(), like in the bootstrap? Perhaps the bootstrap should detect if memcached is not available?

-ralph

Show
Ralph Schindler added a comment - Digging into this, is an exception not what we want here? It seems like if you ask it to use a cache, and the cache fails at saving, shouldnt an exception be thrown? Is this perhaps a situation that should be taken care of before table metadataSetup(), like in the bootstrap? Perhaps the bootstrap should detect if memcached is not available? -ralph
Hide
Valera Leontyev added a comment -

Is it possible situation when memcached server fails after connection setting up? Yes. In that case if exception will be thrown we'll get unwanted break up. I want to see my scripts still working fine even in the case memcached doesn't work properly.

Show
Valera Leontyev added a comment - Is it possible situation when memcached server fails after connection setting up? Yes. In that case if exception will be thrown we'll get unwanted break up. I want to see my scripts still working fine even in the case memcached doesn't work properly.
Hide
Michael Rehbein added a comment -

If we really need to know the cache failed, wouldn't a throw from Zend_Cache be a better place then a throw from Zend_Db?

Alternatively, couldn't it just be a trigger_error(...., Notice) rather then a throw?

Show
Michael Rehbein added a comment - If we really need to know the cache failed, wouldn't a throw from Zend_Cache be a better place then a throw from Zend_Db? Alternatively, couldn't it just be a trigger_error(...., Notice) rather then a throw?
Hide
Valera Leontyev added a comment -

Really, notice is the best way to keep a web-master informed about cache subsystem problems and not to interrupt normal code execution later on.

Show
Valera Leontyev added a comment - Really, notice is the best way to keep a web-master informed about cache subsystem problems and not to interrupt normal code execution later on.
Hide
Ludwig Ruderstaller added a comment -

the really strange part of this is the error comes and goes.

Restart memcached -> access the page -> error -> reload -> working -> reload -> working or error

after a few minutes (dont know on what it depends) no errors are thrown.. until the next memcached restart.

What i have to try sometimes is what if you configure more than one memcached server will a error thrown wenn only one of them is restarted.

In general i would also suggest to trigger a notice, a cache failure is not allowed to stop a, besides this, working page.

Show
Ludwig Ruderstaller added a comment - the really strange part of this is the error comes and goes. Restart memcached -> access the page -> error -> reload -> working -> reload -> working or error after a few minutes (dont know on what it depends) no errors are thrown.. until the next memcached restart. What i have to try sometimes is what if you configure more than one memcached server will a error thrown wenn only one of them is restarted. In general i would also suggest to trigger a notice, a cache failure is not allowed to stop a, besides this, working page.
Hide
Ralph Schindler added a comment -

If the memcached server is not available, it seems like Zend_Cache should throw an exception, no?

Then, when inside Zend_Db_Table, it should treat Zend_Cache as a (effectively) /dev/null cache, thus, it will always have to do the lookup on the metadata.

Or am I missing something?

Show
Ralph Schindler added a comment - If the memcached server is not available, it seems like Zend_Cache should throw an exception, no? Then, when inside Zend_Db_Table, it should treat Zend_Cache as a (effectively) /dev/null cache, thus, it will always have to do the lookup on the metadata. Or am I missing something?
Hide
Ken Chou added a comment -

That's right.
Cache should be used to improve the performance of process, should not break the process.
The current version, even if we caught the exception thrown within Zend_Db_Table, we can not return to run as no cache.

Show
Ken Chou added a comment - That's right. Cache should be used to improve the performance of process, should not break the process. The current version, even if we caught the exception thrown within Zend_Db_Table, we can not return to run as no cache.
Hide
Michael Rehbein added a comment -

Patch contains:

Changed throw to E_USER_NOTICE on metaCache save fail
Updated test suite to match

Show
Michael Rehbein added a comment - Patch contains: Changed throw to E_USER_NOTICE on metaCache save fail Updated test suite to match
Hide
Juraj Seffer added a comment -

I have not been able to find out what's causing the exception to be thrown, I initialise the cache in my bootstrap like this:

protected function _initDbTableCache() { $cache = Zend_Cache::factory('Core', 'File', array('automatic_serialization' => true), array('cache_dir' => APPLICATION_PATH . '/cache') ); Zend_Db_Table_Abstract::setDefaultMetadataCache($cache); }

but every now and then, it throws an exception.

Show
Juraj Seffer added a comment - I have not been able to find out what's causing the exception to be thrown, I initialise the cache in my bootstrap like this: protected function _initDbTableCache() { $cache = Zend_Cache::factory('Core', 'File', array('automatic_serialization' => true), array('cache_dir' => APPLICATION_PATH . '/cache') ); Zend_Db_Table_Abstract::setDefaultMetadataCache($cache); } but every now and then, it throws an exception.
Hide
Bryan added a comment -

I have the same setup setup as Juraj. Since updating to 10.0.2, a notice is thrown instead of an exception. This is nice, but I don't know why its being thrown. I'm guessing that it throws whenever the cache is old, but I need to setup better logs to see if this is really the case.

Any ideas for pinpointing the problem?

Show
Bryan added a comment - I have the same setup setup as Juraj. Since updating to 10.0.2, a notice is thrown instead of an exception. This is nice, but I don't know why its being thrown. I'm guessing that it throws whenever the cache is old, but I need to setup better logs to see if this is really the case. Any ideas for pinpointing the problem?
Hide
Michael Kliewe added a comment -

I have a similar problem with memcached as metadatacache. I use the Zend_Session_SaveHandler_DbTable, and from time to time I get an exception saying that saving metadata failed (because Zend_Db_Table is used to save session data). As a result session_start() does not work. See log below.

I will now try to use a "non-persistent" connection to memcached.

I also had the problem in the past with restarting memcached:
Restart memcached -> access the page -> error -> reload -> working -> reload -> working or error
Since it is not an exception anymore the problem is gone.

[12-May-2010 10:12:05] PHP Fatal error: Uncaught exception 'Zend_Session_Exception' with message 'Zend_Session::start() - /home/user/workspace/ZendFramework-1.10.3/library/Zend/Db/Table/Abstract.php(Line:826): Error #1024 Failed saving metadata to metadataCache Array' in /home/user/workspace/ZendFramework-1.10.3/library/Zend/Session.php:493
Stack trace:
#0 /home/user/workspace/Project/application/Bootstrap.php(286): Zend_Session::start()
#1 /home/user/workspace/ZendFramework-1.10.3/library/Zend/Application/Bootstrap/BootstrapAbstract.php(665): Bootstrap->_initSession()
#2 /home/user/workspace/ZendFramework-1.10.3/library/Zend/Application/Bootstrap/BootstrapAbstract.php(618): Zend_Application_Bootstrap_BootstrapAbstract->_executeResource('session')
#3 /home/user/workspace/ZendFramework-1.10.3/library/Zend/Application/Bootstrap/BootstrapAbstract.php(582): Zend_Application_Bootstrap_BootstrapAbstract->_bootstrap(NULL)
#4 /home/user/workspace/Ze in /home/user/workspace/ZendFramework-1.10.3/library/Zend/Session.php on line 493

Show
Michael Kliewe added a comment - I have a similar problem with memcached as metadatacache. I use the Zend_Session_SaveHandler_DbTable, and from time to time I get an exception saying that saving metadata failed (because Zend_Db_Table is used to save session data). As a result session_start() does not work. See log below. I will now try to use a "non-persistent" connection to memcached. I also had the problem in the past with restarting memcached: Restart memcached -> access the page -> error -> reload -> working -> reload -> working or error Since it is not an exception anymore the problem is gone.
[12-May-2010 10:12:05] PHP Fatal error: Uncaught exception 'Zend_Session_Exception' with message 'Zend_Session::start() - /home/user/workspace/ZendFramework-1.10.3/library/Zend/Db/Table/Abstract.php(Line:826): Error #1024 Failed saving metadata to metadataCache Array' in /home/user/workspace/ZendFramework-1.10.3/library/Zend/Session.php:493 Stack trace: #0 /home/user/workspace/Project/application/Bootstrap.php(286): Zend_Session::start() #1 /home/user/workspace/ZendFramework-1.10.3/library/Zend/Application/Bootstrap/BootstrapAbstract.php(665): Bootstrap->_initSession() #2 /home/user/workspace/ZendFramework-1.10.3/library/Zend/Application/Bootstrap/BootstrapAbstract.php(618): Zend_Application_Bootstrap_BootstrapAbstract->_executeResource('session') #3 /home/user/workspace/ZendFramework-1.10.3/library/Zend/Application/Bootstrap/BootstrapAbstract.php(582): Zend_Application_Bootstrap_BootstrapAbstract->_bootstrap(NULL) #4 /home/user/workspace/Ze in /home/user/workspace/ZendFramework-1.10.3/library/Zend/Session.php on line 493

People

Vote (5)
Watch (10)

Dates

  • Created:
    Updated:
    Resolved:

Time Tracking

Estimated:
30m
Original Estimate - 30 minutes
Remaining:
30m
Remaining Estimate - 30 minutes
Logged:
Not Specified
Time Spent - Not Specified