Realtime: Connexion interrompue en temps réel par intermittence

Créé le 25 févr. 2020  ·  5Commentaires  ·  Source: supabase/realtime

Exécution du script de test dans supabase-js https://github.com/supabase/supabase/blob/master/libraries/supabase-js/test/integration/testRealtime.js

J'obtiens des erreurs intermittentes Network timeout. Still waiting... et REALTIME DISCONNECTED

Lorsque j'inspecte les journaux du serveur, quelques erreurs sont enregistrées:

127.0.0.1 - - [25/Feb/2020:17:26:17 +0000] "POST /messages HTTP/1.1" 201 - "" ""
17:26:18.082 [info] "realtime:public"
17:26:18.082 [info] "realtime:public:messages"
17:26:18.083 [info] "realtime:public:messages:channel_id=eq.1"
17:26:18.085 [error] GenServer #PID<0.2564.0> terminating
** (ArgumentError) argument error
    :erlang.bit_size(nil)
    (realtime) anonymous fn/3 in Realtime.Replication.notify_subscribers/1
    (elixir) lib/enum.ex:789: anonymous fn/3 in Enum.each/2
    (stdlib) maps.erl:232: :maps.fold_1/3
    (elixir) lib/enum.ex:1964: Enum.each/2
    (realtime) lib/realtime/replication.ex:237: anonymous fn/3 in Realtime.Replication.notify_subscribers/1
    (elixir) lib/enum.ex:1948: Enum."-reduce/3-lists^foldl/2-0-"/3
    (realtime) lib/realtime/replication.ex:217: Realtime.Replication.notify_subscribers/1
Last message: {:epgsql, #PID<0.2565.0>, {:x_log_data, 23616408, 23616408, <<67, 0, 0, 0, 0, 0, 1, 104, 91, 104, 0, 0, 0, 0, 1, 104, 91, 152, 0, 2, 66, 104, 141, 229, 100, 110>>}}

et

17:26:18.151 [info] CONNECTED TO RealtimeWeb.UserSocket in 178µs
  Transport: :websocket
  Serializer: Phoenix.Socket.V1.JSONSerializer
  Connect Info: %{}
  Parameters: %{"vsn" => "1.0.0"}
17:26:18.153 [error] GenServer #PID<0.2569.0> terminating
** (KeyError) key :record not found in: %Realtime.Adapters.Changes.DeletedRecord{columns: [%Realtime.Decoder.Messages.Relation.Column{flags: [:key], name: "id", type: "int8", type_modifier: 4294967295}, %Realtime.Decoder.Messages.Relation.Column{flags: [:key], name: "inserted_at", type: "timestamp", type_modifier: 4294967295}, %Realtime.Decoder.Messages.Relation.Column{flags: [:key], name: "updated_at", type: "timestamp", type_modifier: 4294967295}, %Realtime.Decoder.Messages.Relation.Column{flags: [:key], name: "data", type: "jsonb", type_modifier: 4294967295}, %Realtime.Decoder.Messages.Relation.Column{flags: [:key], name: "message", type: "text", type_modifier: 4294967295}, %Realtime.Decoder.Messages.Relation.Column{flags: [:key], name: "user_id", type: "int8", type_modifier: 4294967295}, %Realtime.Decoder.Messages.Relation.Column{flags: [:key], name: "channel_id", type: "int8", type_modifier: 4294967295}], commit_timestamp: ~U[2020-02-25 17:26:18Z], old_record: %{"channel_id" => "1", "data" => nil, "id" => "23", "inserted_at" => "2020-02-25 17:26:18.071593", "message" => "delete test", "updated_at" => "2020-02-25 17:26:18.071593", "user_id" => "1"}, schema: "public", table: "messages", type: "DELETE"}
    (realtime) lib/realtime/replication.ex:237: anonymous fn/3 in Realtime.Replication.notify_subscribers/1
    (elixir) lib/enum.ex:1948: Enum."-reduce/3-lists^foldl/2-0-"/3
    (realtime) lib/realtime/replication.ex:217: Realtime.Replication.notify_subscribers/1
    (realtime) lib/realtime/replication.ex:82: Realtime.Replication.process_message/2
    (realtime) lib/realtime/replication.ex:54: Realtime.Replication.handle_info/2
    (stdlib) gen_server.erl:637: :gen_server.try_dispatch/4
    (stdlib) gen_server.erl:711: :gen_server.handle_msg/6
    (stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
Last message: {:epgsql, #PID<0.2570.0>, {:x_log_data, 23616632, 23616632, <<67, 0, 0, 0, 0, 0, 1, 104, 92, 72, 0, 0, 0, 0, 1, 104, 92, 120, 0, 2, 66, 104, 141, 229, 243, 123>>}}

Je ne sais pas si ceux-ci sont responsables mais valent probablement la peine d'être nettoyés de toute façon

bug

Commentaire le plus utile

corrigé dans 0.7.2

Tous les 5 commentaires

Dubugged ces un peu
Je pense que le coupable est cette ligne .

Comme DELETE, les transactions n'ont pas de change.record à énumérer (sauf si l'utilisateur a défini REPLICA IDENTITY FULL dans postgres). Il a cependant le "old_record" (je pense), donc nous pourrions être en mesure d'énumérer à la place

Cela semble bon. Le correctif pour l'autre problème consiste simplement à envelopper ce bloc avec un if change.record

image

La raison pour laquelle (je pense) est que cette fonction est appelée lorsque la réplication démarre et qu'il n'y a pas de changements réels dans la transaction.

Testons vos modifications pour le moment. Avez-vous besoin de moi pour pousser vers Docker Hub?

la dernière chose à corriger est 04:33:14.166 [error] GenServer #PID<0.2513.0> terminating ** (KeyError) key :record not found in: %Realtime.Adapters.Changes.DeletedRecord{columns: [%Realtime.Decoder.Messages.Relation.Column{flags: [:key], name: "id", type: "int8", type_modifier: 4294967295}, %Realtime.Decoder.Messages.Relation.Column{flags: [:key], name: "inserted_at", type: "timestamp", type_modifier: 4294967295}, %Realtime.Decoder.Messages.Relation.Column{flags: [:key], name: "updated_at", type: "timestamp", type_modifier: 4294967295}, %Realtime.Decoder.Messages.Relation.Column{flags: [:key], name: "data", type: "jsonb", type_modifier: 4294967295}, %Realtime.Decoder.Messages.Relation.Column{flags: [:key], name: "message", type: "text", type_modifier: 4294967295}, %Realtime.Decoder.Messages.Relation.Column{flags: [:key], name: "user_id", type: "int8", type_modifier: 4294967295}, %Realtime.Decoder.Messages.Relation.Column{flags: [:key], name: "channel_id", type: "int8", type_modifier: 4294967295}], commit_timestamp: ~U[2020-03-16 04:33:14Z], old_record: %{"channel_id" => "1", "data" => nil, "id" => "50", "inserted_at" => "2020-03-16 04:33:14.144909", "message" => "delete test", "updated_at" => "2020-03-16 04:33:14.144909", "user_id" => "1"}, schema: "public", table: "messages", type: "DELETE"}

oh désolé je viens de voir que vous avez déjà publié le correctif ci-dessus, apportera le changement maintenant, j'ai testé le correctif précédent et cela fonctionne bien

corrigé dans 0.7.2

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