docker - 在容器化的 elixir 1.6.1 中运行 phoenix 测试的 DB Ownership 进程错误

标签 docker elixir ecto drone.io

我有一个由以下人员组成的伞式项目:

  • 网关-凤凰应用
  • 核心 - 业务模型层通知专用应用程序,用于发送短信、电子邮件等……用户
  • 用户管理、角色系统和身份验证。

  • 这三个组件通过 AMQP 连接,因此它们可以在它们之间发送和接收消息。

    我们正在使用 Docker,以及托管在谷歌云的 kubernetes 引擎上的drone.io。所以,发生的事情是应用程序在运行我的测试时随机引发以下异常:
    {\"status\":\"error\",\"message\":\"%DBConnection.OwnershipError{message: \\\"cannot find ownership process for #PID<0.716.0>.\\\\n\\\\nWhen using ownership, you must manage connections in one\\\\nof the four ways:\\\\n\\\\n* By explicitly checking out a connection\\\\n* By explicitly allowing a spawned process\\\\n* By running the pool in shared mode\\\\n* By using :caller option with allowed process\\\\n\\\\nThe first two options require every new process to explicitly\\\\ncheck a connection out or be allowed by calling checkout or\\\\nallow respectively.\\\\n\\\\nThe third option requires a {:shared, pid} mode to be set.\\\\nIf using shared mode in tests, make sure your tests are not\\\\nasync.\\\\n\\\\nThe fourth option requires [caller: pid] to be used when\\\\nchecking out a connection from the pool. The caller process\\\\nshould already be allowed on a connection.\\\\n\\\\nIf you are reading this error, it means you have not done one\\\\nof the steps above or that the owner process has crashed.\\\\n\\\\nSee Ecto.Adapters.SQL.Sandbox docs for more information.\\\"}\",\"code\":0}"
    

    这是一个 Json,因为我们在测试中交换 amqp 消息,例如:
    # Given the module FindUserByEmail
    def Users.Services.FindUserByEmail do  
        use GenAMQP.Server, event: "find_user_by_email", conn_name: 
            Application.get_env(:gen_amqp, :conn_name)
    
        alias User.Repo
        alias User.Models.User, as: UserModel
    
        def execute(payload) do
          %{ "email" => email } = Poison.decode!(payload)
    
          resp =
              case Repo.get_by(UserModel, email: email) do
                  %UserModel{} = user -> %{status: :ok, response: user}
                  nil -> ErrorHelper.err(2011)
                  true -> ErrorHelper.err(2012)
                  {:error, %Ecto.Changeset{} = changeset} -> ViewHelper.translate_errors(changeset)
              end
    
          {:reply, Poison.encode!(resp)}
      end
    end
    
    # and the test
    defmodule Users.Services.FindUserByEmailTest do
      use User.ModelCase
      alias GenAMQP.Client
    
      def execute(payload) do
          resp = Client.call_with_conn(@conn_name, "find_user_by_email", payload)
          data = Poison.decode!(resp, keys: :atoms)
    
          assert data.status == "ok"
      end
    end
    

    以下详细说明了我的 .drone.yaml 文件:
    pipeline:
    unit-tests:
    image: bitwalker/alpine-elixir-phoenix:1.6.1
    environment:
        RABBITCONN: amqp://user:pass@localhost:0000/unit_testing
        DATABASE_URL: ecto://username:password@postgres/testing
    commands:
        - mix local.hex --force && mix local.rebar --force
        - mix deps.get
        - mix compile --force
        - mix test
    
    mix.exs每个应用程序中的文件都包含以下别名
    defp aliases do
        [
            "test": ["ecto.create", "ecto.migrate", "test"]
        ]
    end
    

    我们所有的model_case文件包含此配置:
    setup tags do
        :ok = Sandbox.checkout(User.Repo)
    
        unless tags[:async] do
            Sandbox.mode(User.Repo, {:shared, self()})
        end
    
        :ok
    end
    

    我该如何调试呢?它仅在测试容器内的代码时发生。这个问题会与容器的资源有关吗?

    任何提示或提示将不胜感激。

    最佳答案

    尝试设置onwership_timeouttimeout到您的config/tests.exs 中的大量数据

    config :app_name, User.Repo,
    adapter: Ecto.Adapters.Postgres,
      username: ...,
      password: ...,
      database: ...,
      hostname: ...,
      pool: Ecto.Adapters.SQL.Sandbox,
      timeout: 120_000, # i think the default is 5000
      pool_timeout: 120_000,
      ownership_timeout: 120_000 #i think the default is 5000
    

    关于docker - 在容器化的 elixir 1.6.1 中运行 phoenix 测试的 DB Ownership 进程错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49502040/

    相关文章:

    json - 提交AWS Batch作业时出现CannotStartContainerError

    elixir - "protocol String.Chars not implemented "即使我 'm using "检查”

    elixir - 在 Elixir 中模拟三元运算符

    Elixir Phoenix Flash消息不显示

    associations - Ecto 与多个计划的关联

    docker - Cypress 测试失败,docker 出现 "out of memory"错误

    docker - Killall -9 在 docker 里面?

    docker - 如何一次编辑kubernetes的所有部署

    postgresql - 在 Phoenix 中使用 PostgreSQL array_to_string

    postgresql - Ecto - 在单个查询中返回带有按日期分组的时间戳的记录