gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:38:54 25 4
gpt4 key购买 nike

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

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

  • 这三个组件通过 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com