>>>>> On Fri, 15 Jan 2021 11:11:15 -0500, Phil Stracchino said:
> 
> On 1/15/21 9:54 AM, Phil Stracchino wrote:
> > I will TRY to find time to look at the code and see whether I can patch
> > it myself and test.  I might get time today or this weekend.
> 
> Actually, I managed to fit in a look right now.  I've now rebuilt with
> the following patch:
> 
> _____
> 
> --- src/cats/sql_create.c.orig  2020-12-10 08:26:39.000000000 -0500
> +++ src/cats/sql_create.c       2021-01-15 10:31:47.537191261 -0500
> @@ -581,11 +581,15 @@
>           return 1;
>        }
>        sql_free_result();
>     }
> 
> -   Mmsg(cmd, "INSERT INTO Path (Path) VALUES ('%s')", esc_name);
> +/**
> + * Use INSERT IGNORE or REPLACE INTO here to avoid failure in the
> + * event of a race condition between jobs
> + */
> +   Mmsg(cmd, "INSERT IGNORE INTO Path (Path) VALUES ('%s')", esc_name);
> 
>     if ((ar->PathId = sql_insert_autokey_record(cmd, NT_("Path"))) == 0) {
>        Mmsg2(&errmsg, _("Create db Path record %s failed. ERR=%s\n"),
>           cmd, sql_strerror());
>        Jmsg(jcr, M_FATAL, 0, "%s", errmsg);
> @@ -1006,11 +1010,15 @@
>           return ar->FilenameId > 0;
>        }
>        sql_free_result();
>     }
> 
> -   Mmsg(cmd, "INSERT INTO Filename (Name) VALUES ('%s')", esc_name);
> +/**
> + * Use INSERT IGNORE or REPLACE INTO here to avoid failure in the
> + * event of a race condition between jobs
> + */
> +   Mmsg(cmd, "INSERT IGNORE INTO Filename (Name) VALUES ('%s')", esc_name);
> 
>     ar->FilenameId = sql_insert_autokey_record(cmd, NT_("Filename"));
>     if (ar->FilenameId == 0) {
>        Mmsg2(&errmsg, _("Create db Filename record %s failed. ERR=%s\n"),
>              cmd, sql_strerror());
> 
> 
> _____
> 
> Manual jobs are running fine.  I may have to let it run for a week or
> two before I have good confidence that this works around the race condition.
> 
> 
> Either INSERT IGNORE or REPLACE should have the same result here, but
> their semantics are slightly different.
> 
> INSERT IGNORE:  If the key value already exists, do not insert the row,
> do nothing.
> 
> REPLACE INTO:  If the key value already exists, delete the row and
> re-insert.
> 
> When the row consists ONLY of the key value and the ID, the two are
> largely functionally equivalent, but I believe that INSERT IGNORE is the
> correct action here, in addition to being slightly faster.

Will sql_insert_autokey_record (i.e. mysql_insert_id) still return the correct
id after this?  If not, then you will get a subtle mess.

__Martin


_______________________________________________
Bacula-devel mailing list
Bacula-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bacula-devel

Reply via email to