Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

weird bug: apply_for_references breaks under certain conditions #244

Closed
janmeier opened this issue Nov 13, 2024 · 5 comments · Fixed by #245
Closed

weird bug: apply_for_references breaks under certain conditions #244

janmeier opened this issue Nov 13, 2024 · 5 comments · Fixed by #245
Assignees
Labels
bug Something isn't working

Comments

@janmeier
Copy link
Contributor

First of all, thank you for your hard work, and your quick response to issues!

So, I have been debugging this super weird issue, which seems to be specfic to something in our schema most of the afternoon. I managed to boil it down to a very small subset of data, but I have no idea why it happens!

Under certain conditions, apply_for_references to does not work.

Given the following config file:

common:
  tmp_dir: '/tmp'

log:
  level: debug

storage:
  directory:
    path: /tmp/dumps

dump:
  transformation:
    - schema: public
      name: users
      transformers:
        - name: RandomUuid
          apply_for_references: true
          params:
            column: "user_id"
            engine: "hash"

And the schema from the example on simple references. I've added one table, plus some seed data from our setup. The seed data is what actually makes this break!

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
 CREATE TABLE users
(
    user_id  UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    username VARCHAR(50) NOT NULL
);

CREATE TABLE orders
(
    order_id   UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    user_id    UUID REFERENCES users (user_id),
    order_date DATE NOT NULL
);


CREATE TABLE public."foo" (
    id uuid NOT NULL default uuid_generate_v4(),
    locale text NOT NULL,
    subject character varying(100) NOT NULL,
    body text NOT NULL
);

INSERT INTO users (username)
VALUES ('john_doe');
INSERT INTO users (username)
VALUES ('jane_smith');

INSERT INTO orders (user_id, order_date)
VALUES ((SELECT user_id FROM users WHERE username = 'john_doe'), '2024-10-31'),
       ((SELECT user_id FROM users WHERE username = 'jane_smith'), '2024-10-30');

insert into public."foo" (locale, subject, body) values 
('da-DK', 'Opsæt din konto hos {{coachName}}',' Hej {{firstName}},\n\nSå er vi klar til at tage første skridt.\nTryk på følgende link for at få adgang til din side:\n[{{{accessLink}}}]({{{accessLink}}})\n\nMed venlig hilsen\n{{coachName}}'),
('da-DK', 'Kvittering på {{productName}}', 'Hej {{firstName}},\n\nHermed en kvittering på din bestilling af {{productName}}\n\n- Total beløb: {{paymentAmount}}\n- Dato for køb: {{paymentDate}}\n\nBeløbet vil ikke blive trukket på din konto før den er fremsendt til dig.\n\nInden for et par dage vil jeg sende det din vej på samme e-mail, som du har modtaget denne kvittering på.\n\nRigtig god dag\n{{coachName}}'),
('en-US', 'Kvittering på {{productName}}', 'Hej {{firstName}},\n\nHermed en kvittering på din bestilling af {{productName}}\n\n- Total beløb: {{paymentAmount}}\n- Dato for køb: {{paymentDate}}\n\nBeløbet vil ikke blive trukket på din konto før den er fremsendt til dig.\n\nInden for et par dage vil jeg sende det din vej på samme e-mail, som du har modtaget denne kvittering på.\n\nRigtig god dag\n{{coachName}}'),
('sv-SE', 'Kvittering på {{productName}}', 'Hej {{firstName}},\n\nHermed en kvittering på din bestilling af {{productName}}\n\n- Total beløb: {{paymentAmount}}\n- Dato for køb: {{paymentDate}}\n\nBeløbet vil ikke blive trukket på din konto før den er fremsendt til dig.\n\nInden for et par dage vil jeg sende det din vej på samme e-mail, som du har modtaget denne kvittering på.\n\nRigtig god dag\n{{coachName}}'),
('fr-FR', 'Reçu de paiement pour le {{productName}}', 'Bonjour {{firstName}},\n\nCeci est le reçu de paiement pour votre commande du  {{productName}}\n\n- Montant total: {{paymentAmount}}\n- Date d''achat: {{paymentDate}}\n\nVous ne serez pas facturé avant que le produit ne vous soit envoyé.\n\nDans quelques jours je vous l''enverrai sur cette adresse e-mail.\n\n\nBien cordialement\n{{coachName}}'),
('de-DE', 'Bestellung eines {{productName}}', 'Hallo {{firstName}},\n\nAnbei findest du die Übersicht deiner Bestellung über einen {{productName}}\n\n- Gesamtbetrag: {{paymentAmount}}\n- Datum der Bestellung: {{paymentDate}}\n\nDir wird nichts in Rechnung gestellt, bevor du deinen Plan erhalten hast.\nIch werde dir in wenigen Tagen eine Bestätigung über diese E-Mail Adresse zukommen lassen. \n\nBeste Grüße, \n{{coachName}}'),
('es-MX', 'Recibo de {{productName}}', 'Hola, {{firstName}}, \n\nEste es el recibo de tu pedido de un {{productName}} \n\n- Importe total: {{paymentAmount}} \n- Fecha de compra: {{paymentDate}} \n\nNo se te realizará el cargo hasta que se te envíe el producto.\n\nLo recibirás dentro de pocos días en este mismo correo electrónico. \n\nSaludos, \n{{coachName}}\n'),
('da-DK', 'Din kostplan','Hej {{firstName}},\n\nDin kostplan er nu sammensat - du finder den vedhæftet som pdf.\n\nDu kan downloade og printe den, lige til at hænge på køleskabet.\nDu kan selvfølgelig også tilgå den via din smartphone, så du altid har den ved din side.\n\nJeg håber, at du bliver rigtig glad for planen. Følger du den, er jeg sikker på, du vil opleve gode resultater.\nIgen tak fordi du bestilte en kostplan hos mig.\n\nMed venlig hilsen\n{{coachName}}'),
('en-US', 'Din kostplan','Hej {{firstName}},\n\nDin kostplan er nu sammensat - du finder den vedhæftet som pdf.\n\nDu kan downloade og printe den, lige til at hænge på køleskabet.\nDu kan selvfølgelig også tilgå den via din smartphone, så du altid har den ved din side.\n\nJeg håber, at du bliver rigtig glad for planen. Følger du den, er jeg sikker på, du vil opleve gode resultater.\nIgen tak fordi du bestilte en kostplan hos mig.\n\nMed venlig hilsen\n{{coachName}}'),
('sv-SE', 'Din kostplan','Hej {{firstName}},\n\nDin kostplan er nu sammensat - du finder den vedhæftet som pdf.\n\nDu kan downloade og printe den, lige til at hænge på køleskabet.\nDu kan selvfølgelig også tilgå den via din smartphone, så du altid har den ved din side.\n\nJeg håber, at du bliver rigtig glad for planen. Følger du den, er jeg sikker på, du vil opleve gode resultater.\nIgen tak fordi du bestilte en kostplan hos mig.\n\nMed venlig hilsen\n{{coachName}}'),
('fr-FR', 'Votre programme alimentaire','Bonjour {{firstName}},\n\nVotre programme alimentaire est maintenant prêt - il est joint à cet email en format PDF.\nVous pouvez le télécharger et l''imprimer puis l''accrocher facilement à votre réfrigérateur.\nVous pouvez également y accéder directement depuis votre portable.\n\nJ''espère vraiment que vous apprécierez de suivre ce plan. Si vous vous y tenez, je suis sûr que vous obtiendrez d''excellents résultats.\n\nMerci d''avoir passé votre commande.\n\nBien cordialement\n{{coachName}}\n'),
('de-DE', 'Dein Ernährungsplan','Hallo {{firstName}},\n\nDein Ernährungsplan ist fertig und steht für dich bereit. Du findest ihn in der angehängten PDF. Du kannst das Dokument einfach herunterladen und ausdrucken, oder über dein Smartphone darauf zugreifen.\n\nIch hoffe sehr, dass du den Ernährungsplan genießt. Wenn du dich so gut es geht an den Plan hältst, bin ich zuversichtlich, dass du großartige Ergebnisse erzielen wirst\n\n\nVielen Dank für deine Bestellung.\n\nBeste Grüße, \n{{coachName}}'),
('es-MX', 'Tu plan alimenticio','Hola, {{firstName}}, \n\nTu plan alimenticio está listo; está adjunto como PDF. Puedes descargarlo e imprimirlo y colgarlo fácilmente en tu refrigerador. También puedes acceder a él directamente desde tu smartphone. \n\nEspero que te guste el plan alimenticio. Si lo sigues, sin duda conseguirás grandes resultados. \n\nGracias por hacer tu pedido. \n\nSaludos, \n{{coachName}}'),
('da-DK', 'Dit træningsprogram','Hej {{firstName}},\n\nDit træningsprogram er nu sammensat - du finder det vedhæftet som pdf.\n\nDu kan downloade og printe det, lige til at hænge på køleskabet.\nDu kan selvfølgelig også tilgå det via din smartphone, så du altid har det ved din side.\n\nJeg håber, at du bliver rigtig glad for programmet. Følger du det, er jeg sikker på, du vil opleve gode resultater.\nIgen tak fordi du bestilte et træningsprogram hos mig.\n\nMed venlig hilsen\n{{coachName}}'),
('en-US', 'Dit træningsprogram','Hej {{firstName}},\n\nDit træningsprogram er nu sammensat - du finder det vedhæftet som pdf.\n\nDu kan downloade og printe det, lige til at hænge på køleskabet.\nDu kan selvfølgelig også tilgå det via din smartphone, så du altid har det ved din side.\n\nJeg håber, at du bliver rigtig glad for programmet. Følger du det, er jeg sikker på, du vil opleve gode resultater.\nIgen tak fordi du bestilte et træningsprogram hos mig.\n\nMed venlig hilsen\n{{coachName}}'),
('sv-SE', 'Dit træningsprogram','Hej {{firstName}},\n\nDit træningsprogram er nu sammensat - du finder det vedhæftet som pdf.\n\nDu kan downloade og printe det, lige til at hænge på køleskabet.\nDu kan selvfølgelig også tilgå det via din smartphone, så du altid har det ved din side.\n\nJeg håber, at du bliver rigtig glad for programmet. Følger du det, er jeg sikker på, du vil opleve gode resultater.\nIgen tak fordi du bestilte et træningsprogram hos mig.\n\nMed venlig hilsen\n{{coachName}}'),
('fr-FR', 'Votre programme d''entraînement','Bonjour {{firstName}},\n\nVotre programme d''entraînement est maintenant prêt - il est joint à cet email en format PDF.\nVous pouvez le télécharger et l''imprimer afin de le transporter avec vous.\nVous pouvez également y accéder directement depuis votre portable.\n\nJ''espère vraiment que vous apprécierez de suivre ce plan. Si vous vous y tenez, je suis sûr que vous obtiendrez d''excellents résultats.\n\nMerci d''avoir passé votre commande.\n\nBien cordialement\n{{coachName}})');

Running a dump + restore results in the following error, because the user_id column of the orders table is not transformed

Stderr="pg_restore: error: could not execute query: ERROR:  insert or update on table \"orders\" violates foreign key constraint \"orders_user_id_fkey\"" pid=17534
Stderr="DETAIL:  Key (user_id)=(b8981d9b-698b-4873-a4a9-4ee8fb340885) is not present in table \"users\"." pid=17534
Stderr="Command was: ALTER TABLE ONLY public.orders" pid=17534
Stderr="    ADD CONSTRAINT orders_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(user_id);" pid=17534

This is happening for me on postgres 15.3 running on docker on OSX. I've tested postgres 16, and the same issues appears.

I've been tearing my hair out, and I have no idea how this happens. I really have you can reproduce it 😅

@wwoytenko
Copy link
Contributor

Hi! Thank you so much for your kind words. I really appreciate it. I’ll look into this issue later this week. Thank you for detailed description it definitely will help.

@wwoytenko wwoytenko self-assigned this Nov 16, 2024
@wwoytenko
Copy link
Contributor

Good news! I was able to reproduce the bug and am currently exploring it.

@janmeier
Copy link
Contributor Author

Glad to hear it! I thought I was going crazy trying to debug it 🙈

@wwoytenko
Copy link
Contributor

I was able to fix the issue #245. The problem was that the table graph used a shared tables list, which was later sorted by the table size scoring function. I resolved it by clonning the list. A regression test has also been added using sample provided by you. Thank you so much.

wwoytenko added a commit that referenced this issue Nov 16, 2024
Closes #244

- Fixed an issue where the table graph used a shared tables list, which was later sorted by the table size scoring function.
- Added a regression test for RuntimeContext to ensure proper functionality.
- Deleted commented code

Co-authored-by: Jan Aagaard Meier <janzeh@gmail.com>
@wwoytenko
Copy link
Contributor

Published in v0.2.4. I hope it fixes the issue.
https://github.com/GreenmaskIO/greenmask/releases/tag/v0.2.4

@wwoytenko wwoytenko added the bug Something isn't working label Nov 16, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants