nyara icon indicating copy to clipboard operation
nyara copied to clipboard

用 Mongoid 遇到一个奇怪的问题,不知道是不是谁引起的

Open huacnlee opened this issue 12 years ago • 1 comments

这个错误是偶尔发生的,并且好像只有在 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

huacnlee avatar Aug 20 '13 06:08 huacnlee

略诡异, 有可能是因为 TCPSocket 的 monkey patch, 但这个只影响 send / recv, 不会搞坏 IO 对象的其它方法才对...

这样 monkey 一下会有问题不?

...
rescue IOError
  false
rescue Errno::EBADF
  false
end

luikore avatar Aug 20 '13 07:08 luikore