2016-11-08 4 views
0

У меня есть функция, которая порождает процесс, который выполняет запрос, как так:Postgres отключается при запуске запроса внутри порожденного процесса?

def trigger_schedule(u = %User{}) do 
    spawn(fn -> 
     (Repo.preload(p, :tasks)).tasks 
     |> Enum.map(fn ts -> trigger_schedule(ts) end) 
    end) 
    u 
    end 

Этот код запускается определенными действиями, и просто означало, чтобы работать в фоновом режиме. Тем не менее, когда я запускаю тесты, я начинаю видеть это:

00:37:33.324 [error] Postgrex.Protocol (#PID<0.789.0>) disconnected: ** (DBConnection.ConnectionError) owner #PID<0.1531.0> exited while client #PID<0.1533.0> is still running with: shutdown 

выполняет запросы внутри spaned функции не собственно, и есть способ обойти эту ошибку? Я предполагаю, что это имеет какое-то отношение к пулу соединений PG ...

ответ

0

Вы получаете эту ошибку из-за возможности подключения Ecto 2.0 Connection Ownership. Проблема заключается в том, что процесс, владеющий соединением (то есть процессом тестирования), выходит из процесса, выполняющего запрос (в spawn).

Я предполагаю, что вы выполняете свои тесты асинхронно. Если вы используете Phoenix и ModelCase, у вас, вероятно, есть :ok = Ecto.Adapters.SQL.Sandbox.checkout(YourApp.Repo). Самое простое решение - не использовать async: true в ваших тестах.

Вы также можете попробовать вручную разрешить другой процесс, чтобы получить доступ к БД с Ecto.Adapters.SQL.Sandbox.allow(Repo, self(), process_pid), но вы должны знать PID процесса, который я не уверен, что это возможно, так как ваша trigger_schedule функция возвращает пользователю, а не ФИД.