Rails应用程序无法为Dalli memcache制作ActiveRecord对象数组

时间:2013-07-08 21:34:35

标签: ruby-on-rails-3.2 marshalling passenger dalli

我正在尝试memcache一个ActiveRecord结果数组,我已根据一些复杂的业务规则手动过滤。在今天升级之后,基于Dalli尝试序列化数组并因以下错误而失败,我收到了一个令人讨厌的错误:

  

密钥的编组错误    '工况的/指数/ 1570 /真/ C1 ...:MD5:64db5952f959c45126399dd4cb113f86':   无法转储UNIXSocket

     

in ... / gems / dalli-2.6.4 / lib / dalli / server.rb:397:in`dump'

在从Ruby 1.9.3升级到Ruby 2.0.0以及相关的Passenger升级到4.0.7(之前的4.0.5)之前,没有发生这种情况。

环境:

  • Ruby 2.0.0-p247
  • Rails 3.2.13
  • Dalli gem 2.6.4
  • Passenger 4.0.7

代码片段,消除了与此问题无关的许多复杂性

# The query and filter
def do_query

  workcases = Workcase.all(:select=>"#{straight_join} distinct 
   workcases.id, workcases.caseId, workcases.subject  
   service_case_types.primary_level, service_case_types.hide_in_result_list #{extra_fields}", 
   :conditions => conditions, :joins=>joins, :order=>order   ) 

  for workcase in workcases
    if user.can_view_workcase?(workcase, options)
      workcases_filtered << workcase 
      res_count+=1
    end
    break if limit && res_count >= limit
  end

  workcases_filtered
end

# In the Controller
def index
  ...
  @workcases = Rails.cache.fetch(cid, :expires_in=>expires) do
    Rails.logger.info "Populating cache for workcases in search"
      ActiveRecord::Base.uncached do
        Workcase.do_query(@user, in_summary_list, order, nil, true, !@show_deleted_items, condition_ary, @list_limit, {:service_id=>service_id, :case_type_id=>case_type_id})            
    end
  end
  ...
end

将完整查询结果集推送到缓存中的原因是运行业务逻辑以过滤数据库结果以处理复杂的用户安全性/访问控制要求所花费的时间。所以,我知道这可能不是Rails中缓存的首选使用,但直到昨天它才像梦一样工作。我真的不是在寻找像'只是缓存主键'这样的答案,因为我根本不会打扰缓存。

额外注意事项:

我试图回滚到Ruby 1.9.3(使用RVM,并重新绑定应用程序)并且错误没有消失。在我的开发环境中,使用Webrick和其他等效的ruby和gem版本我没有看到这个错误。

我想知道:

  • UNIXSocket来自哪里?
  • 任何线索如何调试这个(我已经查看了缓存的实例,并且那里没有过程
  • 是否存在突然出现在Marshal或Dalli中的关联或联接问题
  • 乘客会影响Dalli和/或Marshal的运作吗?

事实上,任何想法都会受到赞赏。

修改

我试图回到乘客宝石的早期版本,但没有帮助。我还尝试使用早期版本的Ruby 1.9.3的rvm,但也没有解决它。我不相信Dalli宝石在更新之间发生了变化。

另请注意,其他查询正在成功写入memcache。

0 个答案:

没有答案