小编use*_*596的帖子

如何描述我的rspec测试以找到最大的记忆猪?

我们使用circleci作为部署过程的一部分.Circleci运行我们的3000次测试,有时会因为达到4 GB的内存限制而失败.看起来我们的一些测试正在创建大量对象并耗尽大量内存.我只是不知道哪些是.

有没有一种简单的方法可以分析用于给定测试的内存?如果我知道如何做到这一点,我可以轻松地遍历每个测试并运行它,看看它使用了多少内存.

ruby profiling rspec ruby-on-rails

9
推荐指数
1
解决办法
1478
查看次数

ActiveRecord find_or_initialize_by 竞争条件

我有一个场景,其中 2 个 db 连接可能都运行 Model.find_or_initialize_by(params) 并引发错误:PG::UniqueViolation: ERROR:重复键值违反唯一约束

我想更新我的代码,以便它可以优雅地从中恢复。就像是:

record = nil

begin
  record = Model.find_or_initialize_by(params)
rescue ActiveRecord::RecordNotUnique
  record = Model.where(params).first
end

return record
Run Code Online (Sandbox Code Playgroud)

问题是在我的本地机器上没有一个好的/简单的方法来重现这个,所以我不确定我的修复是否真的有效。

所以我想我会有点创意并尝试连续调用 create 2 次(本地),然后应该引发PG::UniqueViolation: ERROR,然后我可以从中拯救并确保一切都得到妥善处理。

但我收到此错误: PG::InFailedSqlTransaction: ERROR: current transaction is aborted, commands waiting until end of transaction block

即使我将所有内容都包装在单个事务块中,我也会收到此错误

record = nil

Model.transaction do
  record = Model.create(params)
end

begin
  Model.transaction do
    record = Model.create(params)
  end
rescue ActiveRecord::RecordNotUnique
end

Model.transaction do
  record = Model.where(params).first
end

return record
Run Code Online (Sandbox Code Playgroud)

我的问题:

  • 优雅地处理我在本文开头提到的竞争条件的正确方法是什么?
  • 我如何在本地测试这个?

我想我在这里可能遗漏了一些简单的东西,但已经晚了,也许我没有想得太清楚。

我正在运行 …

postgresql activerecord

1
推荐指数
1
解决办法
2240
查看次数