On Sep 4, 4:06 pm, Iñaki Baz Castillo <[email protected]> wrote:
> El Sábado, 5 de Septiembre de 2009, Iñaki Baz Castillo escribió:
> > El Sábado, 5 de Septiembre de 2009, Iñaki Baz Castillo escribió:
> > > El Sábado, 5 de Septiembre de 2009, Jeremy Evans escribió:
> > > > The patch athttp://pastie.org/606419.txtshould fix this error.
>
> > > Applied, but still happens:
>
> > >   Mysql::Error: Can't connect to local MySQL server through socket
> > >   '/var/run/mysqld/mysqld.sock' (2)
>
> > I think it occurs when I call to ps#call (prepared stament) while the MySQL
> >  is restarting/stopped.

Is that not wrapped in a Sequel::DatabaseError (or a subclass)
instance?

> Yes, the bug must be there. Please note what me app logs say:
>
> - I run my app so DB.set is called:
>
> I 2009-09-05 01:00:03 [6441]  INFO : Setting DB prepared staments
> D 2009-09-05 01:00:03 [6441] DEBUG : DB: ds_get_document.prepare
> I 2009-09-05 01:00:03 [6441]  INFO : Done
>
> - At this point my app is running as well MySQL. A request arrives so my app
> does a select using the prepared stament.
>
> D 2009-09-05 01:00:26 [6441] DEBUG : DB: ps_get_document.call
>
> - Now I stop MySQL. A new request arrives:
>
> D 2009-09-05 01:00:35 [6441] DEBUG : DB: ps_get_document.call
> F 2009-09-05 01:00:35 [6441] FATAL : Mysql::Error: Can't connect to local
> MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
>
> - I rescue the error (any error for now) so call again to DB.set:
>
> I 2009-09-05 01:00:35 [6441]  INFO : Setting DB prepared staments             
>                                            
> D 2009-09-05 01:00:35 [6441] DEBUG : DB: ds_get_document.prepare
> I 2009-09-05 01:00:35 [6441]  INFO : Done
>
> - MySQL still down and a new request arrives:
>
> D 2009-09-05 01:00:44 [6441] DEBUG : DB: ps_get_document.call
> F 2009-09-05 01:00:44 [6441] FATAL : Sequel::DatabaseConnectionError:
> Mysql::Error Can't connect to local MySQL server through socket
> '/var/run/mysqld/mysqld.sock' (2)
>
> - Again DB.set is called.
>
> I 2009-09-05 01:00:44 [6441]  INFO : Setting DB prepared staments
> D 2009-09-05 01:00:44 [6441] DEBUG : DB: ds_get_document.prepare
> I 2009-09-05 01:00:44 [6441]  INFO : Done
>
> - MySQL is up again. A new request arrives (and now it works):
>
> D 2009-09-05 01:00:55 [6441] DEBUG : DB: ps_get_document.call

That's the changed behavior.  Before, when the MySQL server was up
again, the connection still thought the statement had already been
prepared.  Now it knows that it hasn't, so it prepares the statement
first before executing it.

I can't replicate your issue:

$ ruby -I lib bin/sequel -E mysql://root:r...@localhost/test
Your database is stored in DB...
irb(main):001:0> ps = DB['SELECT 1'].prepare(:first, :a)
=> <Sequel::MySQL::Dataset/PreparedStatement "SELECT 1">
irb(main):002:0> ps.call({})
I, [2009-09-04T15:56:13.020397 #23364]  INFO -- : PREPARE a FROM
'SELECT 1'
I, [2009-09-04T15:56:13.020999 #23364]  INFO -- : EXECUTE a
=> {:"1"=>1}
irb(main):003:0>
irb(main):004:0* ps.call({})
I, [2009-09-04T15:56:21.646780 #23364]  INFO -- : EXECUTE a
=> {:"1"=>1}
irb(main):005:0> [2] + Suspended            ruby -I lib bin/sequel -E
mysql://root:r...@loc
$ sudo mysqladmin --user root -p shutdown
Password:
Enter password:
$ fg
ruby -I lib bin/sequel -E mysql://root:r...@loc
irb(main):005:0> ps.call({})
I, [2009-09-04T15:57:17.794880 #23364]  INFO -- : EXECUTE a
Sequel::DatabaseDisconnectError: Mysql::Error: Can't connect to local
MySQL server through socket '/var/run/mysql/mysql.sock' (2)
        from ./lib/sequel/adapters/mysql.rb:157:in `query'
        from ./lib/sequel/adapters/mysql.rb:157:in `_execute'
        from ./lib/sequel/adapters/mysql.rb:234:in
`execute_prepared_statement'
        from ./lib/sequel/connection_pool.rb:112:in `hold'
        from ./lib/sequel/database.rb:482:in `synchronize'
        from ./lib/sequel/adapters/mysql.rb:221:in
`execute_prepared_statement'
        from ./lib/sequel/adapters/mysql.rb:136:in `execute'
        from ./lib/sequel/dataset.rb:334:in `execute'
        from ./lib/sequel/adapters/mysql.rb:359:in `execute'
        from ./lib/sequel/adapters/mysql.rb:271:in `execute'
        from ./lib/sequel/adapters/mysql.rb:315:in `fetch_rows'
        from ./lib/sequel/dataset.rb:189:in `each'
        from ./lib/sequel/dataset/convenience.rb:196:in
`single_record'
        from ./lib/sequel/dataset/convenience.rb:59:in `first'
        from ./lib/sequel/dataset/prepared_statements.rb:118:in `run'
        from ./lib/sequel/dataset/prepared_statements.rb:24:in `call'
        from (irb):5irb(main):006:0> ps.call({})
Sequel::DatabaseConnectionError: Mysql::Error: Can't connect to local
MySQL server through socket '/var/run/mysql/mysql.sock' (2)
        from ./lib/sequel/adapters/mysql.rb:101:in `real_connect'
        from ./lib/sequel/adapters/mysql.rb:101:in `connect'
        from ./lib/sequel/database.rb:93:in `initialize'
        from ./lib/sequel/connection_pool.rb:169:in `call'
        from ./lib/sequel/connection_pool.rb:169:in `make_new'
        from ./lib/sequel/connection_pool.rb:156:in `available'
        from ./lib/sequel/connection_pool.rb:147:in `acquire'
        from ./lib/sequel/connection_pool.rb:146:in `synchronize'
        from ./lib/sequel/connection_pool.rb:146:in `acquire'
        from ./lib/sequel/connection_pool.rb:102:in `hold'
        from ./lib/sequel/database.rb:482:in `synchronize'
        from ./lib/sequel/adapters/mysql.rb:221:in
`execute_prepared_statement'
        from ./lib/sequel/adapters/mysql.rb:136:in `execute'
        from ./lib/sequel/dataset.rb:334:in `execute'
        from ./lib/sequel/adapters/mysql.rb:359:in `execute'
        from ./lib/sequel/adapters/mysql.rb:271:in `execute'
        from ./lib/sequel/adapters/mysql.rb:315:in `fetch_rows'
        from ./lib/sequel/dataset.rb:189:in `each'
        from ./lib/sequel/dataset/convenience.rb:196:in
`single_record'
        from ./lib/sequel/dataset/convenience.rb:59:in `first'
        from ./lib/sequel/dataset/prepared_statements.rb:118:in `run'
        from ./lib/sequel/dataset/prepared_statements.rb:24:in `call'
        from (irb):6irb(main):007:0> [2] + Suspended            ruby -
I lib bin/sequel -E mysql://root:r...@loc
$ fg %1
sudo mysqld_safe > /dev/null 2>&1
$ sudo mysqld_safe > /dev/null 2>&1
^Z[1] + Suspended            sudo mysqld_safe > /dev/null 2>&1
$ bg
[1] sudo mysqld_safe > /dev/null 2>&1
$ fg %2
ruby -I lib bin/sequel -E mysql://root:r...@loc
ps.call({})
I, [2009-09-04T15:57:55.261062 #23364]  INFO -- : PREPARE a FROM
'SELECT 1'
I, [2009-09-04T15:57:55.261715 #23364]  INFO -- : EXECUTE a
=> {:"1"=>1}
irb(main):008:0> ps.call({})
I, [2009-09-04T15:57:57.052248 #23364]  INFO -- : EXECUTE a
=> {:"1"=>1}
irb(main):009:0>


The difference could be due to the fact that I just committed an
exception related change to the master branch.  Please try with the
master branch and let me know your results.  If you find that there is
still a situation where the Mysql::Error is not being wrapped in a
Sequel::DatabaseError, please post an example with a backtrace so I
can track it down.

Thanks,
Jeremy
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sequel-talk" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/sequel-talk?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to