调试 Rspec Postgres 锁定

Debugging Rspec Postgres lockups

提问人:user2936314 提问时间:9/19/2014 更新时间:8/13/2021 访问量:760

问:

我正在尝试测试一个使用 的应用程序,它基本上包括对几乎每个请求(以验证和更新用户访问令牌)的几个额外的数据库读/写。gem devise_token_auth

一切正常,除了测试包含多个额外数据库读/写的控制器操作时。在这些情况下,终端会锁定,我被迫通过活动监视器终止 ruby 进程。

有时我会收到这样的错误消息:

ruby /Users/evan/.rvm/gems/ruby-2.1.1/bin/rspec spec/controllers/api/v1/messages_controller_spec.rb(1245,0x7fff792bf310) malloc: *** error for object 0x7ff15fb73c00: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6

我不知道如何解释这一点。我 90% 确定问题是由于这个 gem 以及它在每次请求时导致的额外数据库活动造成的,因为当我恢复到以前的、强度较低的身份验证时,所有问题都消失了。我还通过给 postgres 一些额外的时间进行违规测试来控制事情:

after :each do
  sleep 2
end

这适用于所有情况,但有一种情况除外,它需要在 之前超时,否则会抛出此错误:expect

Failure/Error: expect(@user1.received_messages.first.read?).to eq true
     ActiveRecord::StatementInvalid:
       PG::UnableToSend: another command is already in progress
       : SELECT  "messages".* FROM "messages"  WHERE "messages"."receiver_id" = $1  ORDER BY "messages"."id" ASC LIMIT 1

对我来说,这再次指向了数据库问题。

我还能做些什么来追踪/控制这些错误吗?我应该研究任何 rspec 设置吗?

Ruby-on-Rails PostgreSQL rspec

评论

0赞 ardavis 10/17/2014
从那以后你有没有找到任何线索?我们在 Cucumber 上也遇到了类似的问题。
1赞 user2936314 10/21/2014
不,删除了导致问题的库
0赞 Anthony E 4/1/2016
您确定一次只运行一个 RSpec 进程吗?此问题是否同时出现在功能和型号规范中?

答:

0赞 David Hempy 8/13/2021 #1

如果您正在运行并行 rspec 任务,则可能会触发此任务。当我们遇到这样的问题时,我们使用标记强制这些测试在 CI 中 rspec 的单个非并行实例中运行。

尝试这样的事情:

  context 'when both records get updated in one job', non_parallel do
    it { is_expected.to eq 2 }
  end

然后在 non_parallel 标签上单独调用 rspec:

  rspec --tag non_parallel

为了提高性能,大部分测试(未标记 non_parallel)仍然可以在 CI 解决方案(例如 Jenkins)中并行运行。

当然,使用这种创可贴时要小心。最好在代码中识别哪些内容是不安全的,因为这种竞争可能发生在现实世界中。