nyara
nyara copied to clipboard
用 Mongoid 遇到一个奇怪的问题,不知道是不是谁引起的
这个错误是偶尔发生的,并且好像只有在 production 环境下面才会有
Errno::EBADF: Bad file descriptor
/home/huacnlee/.rvm/gems/ruby-2.0.0-p247/gems/moped-1.5.0/lib/moped/sockets/connectable.rb:16:in `select'
/home/huacnlee/.rvm/gems/ruby-2.0.0-p247/gems/moped-1.5.0/lib/moped/sockets/connectable.rb:16:in `alive?'
/home/huacnlee/.rvm/gems/ruby-2.0.0-p247/gems/moped-1.5.0/lib/moped/connection.rb:201:in `with_connection'
/home/huacnlee/.rvm/gems/ruby-2.0.0-p247/gems/moped-1.5.0/lib/moped/connection.rb:155:in `write'
/home/huacnlee/.rvm/gems/ruby-2.0.0-p247/gems/moped-1.5.0/lib/moped/node.rb:583:in `block (2 levels) in flush'
/home/huacnlee/.rvm/gems/ruby-2.0.0-p247/gems/moped-1.5.0/lib/moped/node.rb:150:in `ensure_connected'
/home/huacnlee/.rvm/gems/ruby-2.0.0-p247/gems/moped-1.5.0/lib/moped/node.rb:582:in `block in flush'
/home/huacnlee/.rvm/gems/ruby-2.0.0-p247/gems/moped-1.5.0/lib/moped/node.rb:597:in `logging'
/home/huacnlee/.rvm/gems/ruby-2.0.0-p247/gems/moped-1.5.0/lib/moped/node.rb:581:in `flush'
/home/huacnlee/.rvm/gems/ruby-2.0.0-p247/gems/moped-1.5.0/lib/moped/node.rb:570:in `process'
/home/huacnlee/.rvm/gems/ruby-2.0.0-p247/gems/moped-1.5.0/lib/moped/node.rb:370:in `query'
/home/huacnlee/.rvm/gems/ruby-2.0.0-p247/gems/moped-1.5.0/lib/moped/session/context.rb:44:in `block in query'
/home/huacnlee/.rvm/gems/ruby-2.0.0-p247/gems/moped-1.5.0/lib/moped/session/context.rb:105:in `block in with_node'
/home/huacnlee/.rvm/gems/ruby-2.0.0-p247/gems/moped-1.5.0/lib/moped/cluster.rb:251:in `with_secondary'
/home/huacnlee/.rvm/gems/ruby-2.0.0-p247/gems/moped-1.5.0/lib/moped/session/context.rb:104:in `with_node'
/home/huacnlee/.rvm/gems/ruby-2.0.0-p247/gems/moped-1.5.0/lib/moped/session/context.rb:43:in `query'
/home/huacnlee/.rvm/gems/ruby-2.0.0-p247/gems/moped-1.5.0/lib/moped/query.rb:115:in `first'
/home/huacnlee/.rvm/gems/ruby-2.0.0-p247/gems/mongoid-3.1.4/lib/mongoid/contextual/mongo.rb:196:in `block in first'
/home/huacnlee/.rvm/gems/ruby-2.0.0-p247/gems/mongoid-3.1.4/lib/mongoid/contextual/mongo.rb:506:in `with_sorting'
/home/huacnlee/.rvm/gems/ruby-2.0.0-p247/gems/mongoid-3.1.4/lib/mongoid/contextual/mongo.rb:195:in `first'
/home/huacnlee/.rvm/gems/ruby-2.0.0-p247/gems/mongoid-3.1.4/lib/mongoid/contextual.rb:19:in `first'
/home/huacnlee/www/iPress/app/controllers/application_controller.rb:7:in `current_user'
layouts/application.erb:41:in `render'
(eval):2:in `call'
(eval):2:in `layout'
/home/huacnlee/.rvm/gems/ruby-2.0.0-p247/bundler/gems/nyara-86ddc80c7203/lib/nyara/view.rb:323:in `call'
/home/huacnlee/.rvm/gems/ruby-2.0.0-p247/bundler/gems/nyara-86ddc80c7203/lib/nyara/view.rb:323:in `render'
/home/huacnlee/.rvm/gems/ruby-2.0.0-p247/bundler/gems/nyara-86ddc80c7203/lib/nyara/controller.rb:609:in `render'
/home/huacnlee/www/iPress/app/controllers/posts_controller.rb:15:in `block in <class:PostsController>'
(eval):2:in `__nyara_tmp_action'
/home/huacnlee/.rvm/gems/ruby-2.0.0-p247/bundler/gems/nyara-86ddc80c7203/lib/nyara/controller.rb:223:in `dispatch'
application_controller.rb
def current_user
@current_user ||= User.where(:_id => session[:user_id]).first
end
moped 里面出错的行 Kernel::select([ self ], nil, [ self ], 0):
def alive?
if Kernel::select([ self ], nil, [ self ], 0)
!eof? rescue false
else
true
end
rescue IOError
false
end
略诡异, 有可能是因为 TCPSocket 的 monkey patch, 但这个只影响 send / recv, 不会搞坏 IO 对象的其它方法才对...
这样 monkey 一下会有问题不?
...
rescue IOError
false
rescue Errno::EBADF
false
end