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
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 :
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 !
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