Realtime: crash : l'emplacement de réplication existe déjà

Créé le 9 mars 2020  ·  9Commentaires  ·  Source: 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

Commentaire le plus utile

Incroyable, merci pour les étapes de réplication @kwakwaversal. rend cela plus facile à résoudre.

Nous venons juste de terminer notre journée de démonstration YC, mais je vais m'y lancer dès que cela est humainement possible

Tous les 9 commentaires

Je suppose que nous avons juste besoin d'attraper l'exception et de l'ignorer, en supposant que le slot de réplication existe déjà ?

il y a 6 minutes
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) faire
https://github.com/supabase/realtime|supabase/realtime supabase/realtime | Ajouté par GitHub

il y a 5 minutes
nous pouvons en fait transmettre un identifiant unique 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, :temporary))
https://github.com/supabase/realtime|supabase/realtime supabase/realtime | Ajouté par GitHub

@kiwicopple Je pense que nous avons corrigé celui-ci?

Je pense que c'était celui que vous voyiez en local seulement? Je ne me souviens pas l'avoir réellement réparé, mais je ne l'ai pas non plus vu et je ne saurais pas non plus comment le reproduire.

Si vous êtes satisfait, nous pouvons le fermer et le visiter à nouveau si jamais nous le revoyons

Pour référence, ce bogue existe toujours et il peut être facilement répliqué.

Construisez la dernière image Docker à l'aide du Dockerfile qui fait partie de ce référentiel et ajoutez-y une variable d'environnement SLOT_NAME .

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

Arrêtez le conteneur. Ensuite, réexécutez la commande Docker ci-dessus.

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 je change la ligne sur https://github.com/supabase/realtime/blob/master/server/lib/adapters/postgres/epgsql_implementation.ex#L75 en {name, "SELECT 1"} _after_ le slot de réplication nommé "COOL" a été créé. Cela fonctionne comme prévu. Je suppose que la logique de cette section est fausse, mais je ne comprends pas assez Elixir pour fournir un correctif, j'en ai peur.

Incroyable, merci pour les étapes de réplication @kwakwaversal. rend cela plus facile à résoudre.

Nous venons juste de terminer notre journée de démonstration YC, mais je vais m'y lancer dès que cela est humainement possible

@kiwicopple Il s'agit d'un problème permanent avec, par exemple, les tâches ECS dans AWS, lorsque la nouvelle a démarré avant que l'ancienne ne soit tuée. L'ancien n'a pas publié l'identifiant de l'emplacement de réplication, tandis que le nouveau essaie de le réclamer.

:tada: Ce problème a été résolu dans la version 0.7.9 :tada:

La version est disponible sur la version GitHub

Votre bot sémantique :package::rocket:

Hey @kwakwaversal grâce à votre message celui-ci est maintenant corrigé. Le problème est que Postgres stocke les emplacements en minuscules :

image

J'ai mis à jour la dernière version pour convertir la variable SLOT_NAME en minuscules avant de vérifier s'il existe un emplacement existant

Vous pouvez vérifier sur la version 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

N'hésitez pas à rouvrir si cela ne fonctionne pas pour vous !

Cette page vous a été utile?
0 / 5 - 0 notes