Hello everybody again,

Unfortunately I forgot to add CC to group, so we were discussing problem
with Саша privately :)) But he mentioned that there left only two of us,
so I'm repeating abridged summary of discussion.

First of all, I successfully repeated error mentioned by Саша. It do not
related with database engine (so I was able to successfully repeat it
with both MyISAM and InnoDB).

I was keeping track of connections, while storming a server. And indeed
there were only ONE connection to the database. But after a 'storm' (in
fact 5-10 rapidly repeated requests was enough) server became down. I'll
explain in details a little bit later. Here's dummy stormer in Ruby I
was using to reproduce an error:


require 'rubygems'
require 'httpclient'

client = HTTPClient.new
uri    = 'http://localhost/zfw'
status = 'ACTIVE'

(1..128).each do
 status = ('ACTIVE' == status) ? 'INACTIVE' : 'ACTIVE'
 client.post(uri, { 'status' => status }
end


So after running this stormer, assuming 'http://localhost/zfw' is an
index action of index controller of our application which selects rows
from database (there were only 32 rows total in database on testing),
index action started throw Zend_Db_Adapter_Mysqli_Exception all the
time (until I have restarted Apache2 server). This exception had empty
message. Here's a trace:

#0 /var/www/zfw-app/library/Zend/Db/Adapter/Abstract.php(304):
Zend_Db_Adapter_Mysqli->_connect()
#1 /var/www/zfw-app/library/Zend/Db/Adapter/Mysqli.php(194):
Zend_Db_Adapter_Abstract->getConnection()
#2 /var/www/zfw-app/library/Zend/Db/Table/Abstract.php(823):
Zend_Db_Adapter_Mysqli->describeTable('automobili_news', NULL)
#3 /var/www/zfw-app/library/Zend/Db/Table/Abstract.php(862):
Zend_Db_Table_Abstract->_setupMetadata()
#4 /var/www/zfw-app/library/Zend/Db/Table/Abstract.php(969):
Zend_Db_Table_Abstract->_setupPrimaryKey()
#5 /var/www/zfw-app/library/Zend/Db/Table/Select.php(100):
Zend_Db_Table_Abstract->info()
#6 /var/www/zfw-app/library/Zend/Db/Table/Select.php(78):
Zend_Db_Table_Select->setTable(Object(Automobili_Model_Table_News))
#7 /var/www/zfw-app/library/Zend/Db/Table/Abstract.php(1005):
Zend_Db_Table_Select->__construct(Object(Automobili_Model_Table_News))
#8 /var/www/zfw-app/application/controllers/IndexController.php(14):
Zend_Db_Table_Abstract->select()
#9 /var/www/zfw-app/library/Zend/Controller/Action.php(513):
IndexController->indexAction()
#10 /var/www/zfw-app/library/Zend/Controller/Dispatcher/Standard.php(289):
Zend_Controller_Action->dispatch('indexAction')
#11 /var/www/zfw-app/library/Zend/Controller/Front.php(954):
Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http),
Object(Zend_Controller_Response_Http))
#12 /var/www/zfw-app/library/Zend/Application/Bootstrap/Bootstrap.php(97):
Zend_Controller_Front->dispatch()
#13 /var/www/zfw-app/library/Zend/Application.php(366):
Zend_Application_Bootstrap_Bootstrap->run()
#14 /var/www/zfw-app/public/index.php(26): Zend_Application->run()
#15 {main}


For those who are interested in details I have attached an xdebug
trace as an attachment (trace.xt.gz) and xdebug profiler data
(cachegrind.out.gz).

After all I have switched config to use pdo_mysql instead of mysqli and
was able to run my (previously described) stormer without any problems
even with 1024 requests. So I guess there's something wrong with mysqli
adapter (of PHP).


2010/5/25 Саша Стаменковић <[email protected]>:
> Zend_Db_Statement ин setFetchMode() calls $this->closeCursor(); only in
> default case fro $mode ?!
>
> Regards,
> Saša Stamenković
>
>
> On Tue, May 25, 2010 at 11:40 AM, Саша Стаменковић <[email protected]>
> wrote:
>>
>> Cache can be the temporary fix.
>>
>> Regards,
>> Saša Stamenković
>>
>>
>> On Tue, May 25, 2010 at 11:35 AM, Саша Стаменковић <[email protected]>
>> wrote:
>>>
>>> I found where the problem was!
>>> $newsTable->publishNews($ids);
>>> foreach ($newsTable->fetchNewsByIds($ids) as $news) {
>>> $news->publishOnTwitter();
>>> }
>>> Row have this publish on twitter method, which shouldn't have nothing to
>>> do with the problem - WRONG! It has. When I post it on twitter, a great
>>> amount of traffic is generated, people are opening concrete news and break
>>> my limit of 15 connections.
>>> Looks like I need more connections, heh.
>>> Regards,
>>> Saša Stamenković
>>>
>>>
>>> On Tue, May 25, 2010 at 10:57 AM, Саша Стаменковић <[email protected]>
>>> wrote:
>>>>
>>>> BTW, my limit is not
>>>> mysqli.max_links = 15
>>>> its a property of mysql.user table, MAX_USER_CONNECTIONS.
>>>> http://dev.mysql.com/doc/refman/5.1/en/user-resources.html
>>>>
>>>> Regards,
>>>> Saša Stamenković
>>>>
>>>>
>>>> On Mon, May 24, 2010 at 11:44 PM, Aleksey Zapparov <[email protected]>
>>>> wrote:
>>>>>
>>>>> Hello,
>>>>>
>>>>> Was not able to wait until tomorow to test on FreeBSD as it was really
>>>>> interesting for will it work or not. And it does. Here's mysqli config
>>>>> of my
>>>>> php.ini on FreeBSD:
>>>>>
>>>>> mysqli.max_links = 15
>>>>> mysqli.default_port = 3306
>>>>> mysqli.default_socket =
>>>>> mysqli.default_host =
>>>>> mysqli.default_user =
>>>>> mysqli.default_pw =
>>>>> mysqli.reconnect = Off
>>>>>
>>>>> You can see it's working at: http://sandbox.ixti.ru/zfw/ (it will be
>>>>> available
>>>>> at least until 27th of May 2010).
>>>>>
>>>>>
>>>>> 2010/5/24 Aleksey Zapparov <[email protected]>:
>>>>> > Hello,
>>>>> >
>>>>> > I guess you are doing something wrong. I have just build up a little
>>>>> > app from
>>>>> > scratch with zf tool (attachment app.tar.gz) which simply "batch"
>>>>> > updates
>>>>> > 32 rows with new status - very dumy logic in controller:
>>>>> >
>>>>> >    $news = new Automobili_Model_Table_News();
>>>>> >    $ids  = range(1,32);
>>>>> >
>>>>> >    $news->update(
>>>>> >        array('status' => $status),
>>>>> >        $news->getAdapter()->quoteInto('id IN (?)', $ids,
>>>>> > Zend_Db::INT_TYPE)
>>>>> >    );
>>>>> >
>>>>> > And it works good for me at least on my GNU/Linux.
>>>>> > Here's my php.ini (section of MySQLi):
>>>>> >
>>>>> > mysqli.max_persistent = 15
>>>>> > mysqli.allow_persistent = Off
>>>>> > mysqli.max_links = 15
>>>>> > mysqli.cache_size = 2000
>>>>> > mysqli.default_port = 3306
>>>>> > mysqli.default_socket =
>>>>> > mysqli.default_host =
>>>>> > mysqli.default_user =
>>>>> > mysqli.default_pw =
>>>>> > mysqli.reconnect = Off
>>>>> >
>>>>> >
>>>>> > I have a FreeBSD running host so tomorow I'm gonna check this app
>>>>> > against
>>>>> > it. Anyway you can try my dummy app by yourself (I've removed some
>>>>> > portion
>>>>> > from your News table class (which was referring to another model) to
>>>>> > be able
>>>>> > run this code).
>>>>> >
>>>>> > Attached files are:
>>>>> > app.tar.gz - Application itself
>>>>> > dump.sql.gz - MySQL dump of table (I have used to test)
>>>>> >
>>>>> >
>>>>> > 2010/5/24 Саша Стаменковић <[email protected]>:
>>>>> >> Okay, I'm using one connection, one db, one adapter, but still, I
>>>>> >> have
>>>>> >> problems. I'm pretty sure I'm using it right, because I'm using it
>>>>> >> like it
>>>>> >> says in the doc.
>>>>> >> The problem is, I can exec up to 15 queries in the row, and this
>>>>> >> quoteInto
>>>>> >> with array param is hitting my limits.
>>>>> >> I can send you my code on private mail Thomas.
>>>>> >>
>>>>> >> Regards,
>>>>> >> Saša Stamenković
>>>>> >>
>>>>> >>
>>>>> >> On Mon, May 24, 2010 at 9:27 PM, Thomas D. <[email protected]>
>>>>> >> wrote:
>>>>> >>>
>>>>> >>> Hi,
>>>>> >>>
>>>>> >>> Саша Стаменковић wrote:
>>>>> >>> > Sure, when you have unlimited number of db operation over
>>>>> >>> > a period of time. I'll come up with my own offline quoting.
>>>>> >>>
>>>>> >>> Seems like you are missing one fact all over the time:
>>>>> >>> That quoting would use a connection to a database server, isn't a
>>>>> >>> problem,
>>>>> >>> because Zend_Db_* would use one connection across every component.
>>>>> >>> Only if
>>>>> >>> you are working with multiple databases, it might be a problem,
>>>>> >>> because you
>>>>> >>> would have one adapter per database (=nAdapter * 1 Connection = n
>>>>> >>> connections)...
>>>>> >>>
>>>>> >>> So again:
>>>>> >>> When you are working with just *one* database, everything should
>>>>> >>> work
>>>>> >>> fine.
>>>>> >>> If not, *you* are doing something wrong.
>>>>> >>>
>>>>> >>> Doing your own quoting is everything but not safe. You should use
>>>>> >>> the
>>>>> >>> adapter's escape function, if your application should be safe.
>>>>> >>>
>>>>> >>>
>>>>> >>> --
>>>>> >>> Regards,
>>>>> >>> Thomas
>>>>> >>>
>>>>> >>>
>>>>> >>
>>>>> >>
>>>>> >
>>>>> >
>>>>> >
>>>>> > --
>>>>> > Sincerely yours,
>>>>> > Aleksey V. Zapparov A.K.A. ixti
>>>>> > FSF Member #7118
>>>>> > Mobile Phone: +34 617 179 344
>>>>> > Homepage: http://www.ixti.ru
>>>>> > JID: [email protected]
>>>>> >
>>>>> > *Origin: Happy Hacking!
>>>>> >
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Sincerely yours,
>>>>> Aleksey V. Zapparov A.K.A. ixti
>>>>> FSF Member #7118
>>>>> Mobile Phone: +34 617 179 344
>>>>> Homepage: http://www.ixti.ru
>>>>> JID: [email protected]
>>>>>
>>>>> *Origin: Happy Hacking!
>>>>
>>>
>>
>
>



-- 
Sincerely yours,
Aleksey V. Zapparov A.K.A. ixti
FSF Member #7118
Mobile Phone: +34 617 179 344
Homepage: http://www.ixti.ru
JID: [email protected]

*Origin: Happy Hacking!

Reply via email to