Realtime: bloqueo: la ranura de replicación ya existe

Creado en 9 mar. 2020  ·  9Comentarios  ·  Fuente: supabase/realtime

07:19:50.702 [info] Running RealtimeWeb.Endpoint with cowboy 2.6.3 at :::4000 (http)
07:19:50.703 [info] Access RealtimeWeb.Endpoint at http://localhost:4000
07:19:50.799 [info] Application realtime exited: Realtime.Application.start(:normal, []) returned an error: shutdown: failed to start child: Realtime.Replication
    ** (EXIT) an exception was raised:
        ** (MatchError) no match of right hand side value: {:error, {:error, :error, "42710", :duplicate_object, "replication slot \"pid0_2356_0\" already exists", [file: "slot.c", line: "251", routine: "ReplicationSlotCreate", severity: "ERROR"]}}
            (realtime) lib/adapters/postgres/epgsql_implementation.ex:24: Realtime.Adapters.Postgres.EpgsqlImplementation.init/1
            (stdlib) gen_server.erl:374: :gen_server.init_it/2
            (stdlib) gen_server.erl:342: :gen_server.init_it/6
            (stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
Kernel pid terminated (application_controller) ({application_start_failure,realtime,{{shutdown,{failed_to_start_child,'Elixir.Realtime.Replication',{{badmatch,{error,{error,error,<<"42710">>,duplicate
{"Kernel pid terminated",application_controller,"{application_start_failure,realtime,{{shutdown,{failed_to_start_child,'Elixir.Realtime.Replication',{{badmatch,{error,{error,error,<<\"42710\">>,duplicate_object,<<\"replication slot \\"pid0_2356_0\\" already exists\">>,[{file,<<\"slot.c\">>},{line,<<\"251\">>},{routine,<<\"ReplicationSlotCreate\">>},{severity,<<\"ERROR\">>}]}}},[{'Elixir.Realtime.Adapters.Postgres.EpgsqlImplementation',init,1,[{file,\"lib/adapters/postgres/epgsql_implementation.ex\"},{line,24}]},{gen_server,init_it,2,[{file,\"gen_server.erl\"},{line,374}]},{gen_server,init_it,6,[{file,\"gen_server.erl\"},{line,342}]},{proc_lib,init_p_do_apply,3,[{file,\"proc_lib.erl\"},{line,249}]}]}}},{'Elixir.Realtime.Application',start,[normal,[]]}}}"}
Crash dump is being written to: erl_crash.dump...done
alpha released

Comentario más útil

Increíble, gracias por los pasos de replicación @kwakwaversal. hace que esto sea más fácil de resolver.

Estamos terminando nuestro día de demostración de YC, pero entraré en esto tan pronto como sea humanamente posible.

Todos 9 comentarios

Supongo que solo necesitamos capturar la excepción e ignorarla, asumiendo que la ranura de replicación ya existe.

Paul Copplestone hace 6 minutos
https://github.com/supabase/realtime/blob/04d7c1e27d8b66e9c9e6e805b6d52a256ffb4011/server/lib/adapters/postgres/epgsql_implementation.ex#L56
server / lib / adapters / postgres / epgsql_implementation.ex: 56
defp create_replication_slot (epgsql_pid, slot) hacer
https://github.com/supabase/realtime|supabase/realtime supabase / realtime | Agregado por GitHub

Paul Copplestone hace 5 minutos
de hecho, podemos pasar una ID única https://github.com/supabase/realtime/blob/04d7c1e27d8b66e9c9e6e805b6d52a256ffb4011/server/lib/adapters/postgres/epgsql_implementation.ex#L25
server / lib / adapters / postgres / epgsql_implementation.ex: 25
create_replication_slot (epgsql_pid, Keyword.get (config,: slot,: temporal))
https://github.com/supabase/realtime|supabase/realtime supabase / realtime | Agregado por GitHub

@kiwicopple ¿Creo que

¿Creo que era uno que estabas viendo solo en local? No recuerdo haberlo arreglado realmente, pero tampoco lo he visto y tampoco sabría cómo replicarlo.

Si está contento, podemos cerrarlo y visitarlo nuevamente si alguna vez lo volvemos a ver.

Como referencia, este error todavía existe y se puede replicar fácilmente.

Cree la última imagen de Docker usando Dockerfile que es parte de este repositorio y agregue una variable SLOT_NAME env.

docker run \
  -e DB_HOST='docker.for.mac.host.internal' \
  -e DB_NAME='postgres' \
  -e DB_USER='postgres' \
  -e DB_PASSWORD='postgres' \
  -e DB_PORT=5432 \
  -e PORT=4000 \
  -e HOSTNAME='localhost' \
  -e SECRET_KEY_BASE='SOMETHING_SUPER_SECRET' \
  -e SLOT_NAME='COOL' \
  -p 4000:4000 \
  supabase/realtime

Detenga el contenedor. Luego, vuelva a ejecutar el comando de Docker anterior.

2020-08-25 22:41:59.295 [info] Running RealtimeWeb.Endpoint with cowboy 2.6.3 at :::4000 (http)
2020-08-25 22:41:59.295 [info] Access RealtimeWeb.Endpoint at http://localhost:4000
2020-08-25 22:41:59.317 [info] Application realtime exited: Realtime.Application.start(:normal, []) returned an error: shutdown: failed to start child: Realtime.Replication
    ** (EXIT) an exception was raised:
        ** (MatchError) no match of right hand side value: {:error, {:error, :error, "42710", :duplicate_object, "replication slot \"cool\" already exists", [file: "slot.c", line: "253", routine: "ReplicationSlotCreate", severity: "ERROR"]}}
            (realtime) lib/adapters/postgres/epgsql_implementation.ex:24: Realtime.Adapters.Postgres.EpgsqlImplementation.init/1
            (stdlib) gen_server.erl:374: :gen_server.init_it/2
            (stdlib) gen_server.erl:342: :gen_server.init_it/6
            (stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
{"Kernel pid terminated",application_controller,"{application_start_failure,realtime,{{shutdown,{failed_to_start_child,'Elixir.Realtime.Replication',{{badmatch,{error,{error,error,<<\"42710\">>,duplicate_object,<<\"replication slot \\"cool\\" already exists\">>,[{file,<<\"slot.c\">>},{line,<<\"253\">>},{routine,<<\"ReplicationSlotCreate\">>},{severity,<<\"ERROR\">>}]}}},[{'Elixir.Realtime.Adapters.Postgres.EpgsqlImplementation',init,1,[{file,\"lib/adapters/postgres/epgsql_implementation.ex\"},{line,24}]},{gen_server,init_it,2,[{file,\"gen_server.erl\"},{line,374}]},{gen_server,init_it,6,[{file,\"gen_server.erl\"},{line,342}]},{proc_lib,init_p_do_apply,3,[{file,\"proc_lib.erl\"},{line,249}]}]}}},{'Elixir.Realtime.Application',start,[normal,[]]}}}"}
Kernel pid terminated (application_controller) ({application_start_failure,realtime,{{shutdown,{failed_to_start_child,'Elixir.Realtime.Replication',{{badmatch,{error,{error,error,<<"42710">>,duplicate

Si cambio la línea en https://github.com/supabase/realtime/blob/master/server/lib/adapters/postgres/epgsql_implementation.ex#L75 a {name, "SELECT 1"} _after_ la ranura de replicación denominada "COOL" Ha sido creado. Funciona como se esperaba. Supongo que la lógica en esta sección es incorrecta, pero me temo que no entiendo Elixir lo suficiente como para proporcionar un parche.

Increíble, gracias por los pasos de replicación @kwakwaversal. hace que esto sea más fácil de resolver.

Estamos terminando nuestro día de demostración de YC, pero entraré en esto tan pronto como sea humanamente posible.

@kiwicopple Este es un problema continuo con, por ejemplo, las tareas de ECS en AWS, cuando la nueva ha comenzado antes de que se elimine la anterior. El antiguo no ha publicado el ID de la ranura de replicación, mientras que el nuevo está intentando reclamarlo.

: tada: este problema se ha resuelto en la versión 0.7.9: tada:

La versión está disponible en la versión de GitHub.

Su bot de lanzamiento semántico : paquete :: rocket:

Hola @kwakwaversal gracias a tu mensaje, este ahora está arreglado. El problema es que Postgres almacena las ranuras en minúsculas:

image

Actualicé la última versión para convertir SLOT_NAME var a minúsculas antes de verificar si hay una ranura existente

Puede verificar en la versión 0.7.9:

docker pull supabase/realtime:v0.7.9

docker run \
  -e DB_HOST='docker.for.mac.host.internal' \
  -e DB_NAME='postgres' \
  -e DB_USER='postgres' \
  -e DB_PASSWORD='postgres' \
  -e DB_PORT=5432 \
  -e PORT=4000 \
  -e HOSTNAME='localhost' \
  -e SECRET_KEY_BASE='SOMETHING_SUPER_SECRET' \
  -e SLOT_NAME='COOL' \
  -p 4000:4000 \
  supabase/realtime:v0.7.9

¡Siéntete libre de volver a abrir si no te funciona!

¿Fue útil esta página
0 / 5 - 0 calificaciones