gvfs-helper: retry when creating temp files

When we create temp files for downloading packs, we use a name
based on the current timestamp. There is no randomness in the
name, so we can have collisions in the same second.

Retry the temp pack names using a new "-<retry>" suffix to the
name before the ".temp".

Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
This commit is contained in:
Derrick Stolee 2019-12-26 10:20:24 -05:00 коммит произвёл Victoria Dye
Родитель a0d5f04651
Коммит 468356e581
1 изменённых файлов: 16 добавлений и 0 удалений

Просмотреть файл

@ -1662,6 +1662,7 @@ static void my_create_tempfile(
struct strbuf buf = STRBUF_INIT; struct strbuf buf = STRBUF_INIT;
int len_tp; int len_tp;
enum scld_error scld; enum scld_error scld;
int retries;
gh__response_status__zero(status); gh__response_status__zero(status);
@ -1710,7 +1711,15 @@ static void my_create_tempfile(
goto cleanup; goto cleanup;
} }
retries = 0;
*t1 = create_tempfile(buf.buf); *t1 = create_tempfile(buf.buf);
while (!*t1 && retries < 5) {
retries++;
strbuf_setlen(&buf, len_tp);
strbuf_addf(&buf, "%s-%d.%s", basename.buf, retries, suffix1);
*t1 = create_tempfile(buf.buf);
}
if (!*t1) { if (!*t1) {
strbuf_addf(&status->error_message, strbuf_addf(&status->error_message,
"could not create tempfile: '%s'", "could not create tempfile: '%s'",
@ -1732,6 +1741,13 @@ static void my_create_tempfile(
strbuf_addf( &buf, "%s.%s", basename.buf, suffix2); strbuf_addf( &buf, "%s.%s", basename.buf, suffix2);
*t2 = create_tempfile(buf.buf); *t2 = create_tempfile(buf.buf);
while (!*t2 && retries < 5) {
retries++;
strbuf_setlen(&buf, len_tp);
strbuf_addf(&buf, "%s-%d.%s", basename.buf, retries, suffix2);
*t2 = create_tempfile(buf.buf);
}
if (!*t2) { if (!*t2) {
strbuf_addf(&status->error_message, strbuf_addf(&status->error_message,
"could not create tempfile: '%s'", "could not create tempfile: '%s'",