Re: pg_restore dependencies - Mailing list pgsql-hackers
From | Andrew Dunstan |
---|---|
Subject | Re: pg_restore dependencies |
Date | |
Msg-id | 49DFD5BD.1010208@dunslane.net Whole thread Raw |
In response to | Re: pg_restore dependencies (Tom Lane <tgl@sss.pgh.pa.us>) |
Responses |
Re: pg_restore dependencies
Re: pg_restore dependencies Re: pg_restore dependencies |
List | pgsql-hackers |
Tom Lane wrote: > Andrew Dunstan <andrew@dunslane.net> writes: > >> What you're missing is that we need to compare the lockdeps of each item >> (i.e. both the candidate item and the running item) with all the deps >> (not just the lockdeps) of the other item. If neither item has any >> lockdeps there will be no conflict. This will allow concurrent index >> creation, since neither item will have any lockdeps. But it will prevent >> us selecting a create index that conflicts with a running FK creation or >> vice versa. >> > > Oh, I see, you're using the deps as a proxy for the shared locks the > operation will acquire. Yeah, that might work. Seems like it's nearly > a one-liner fix, too. > > > Well, what I have in mind is a bit bigger, but not large. See attached patch. cheers andrew *** pg_backup_archiver.c 2009-04-10 00:09:57.000000000 -0400 --- pg_backup_archiver-fix.c 2009-04-10 19:22:07.000000000 -0400 *************** *** 3423,3433 **** if (slots[i].args == NULL) continue; running_te = slots[i].args->te; for (j = 0; j < te->nLockDeps && !conflicts; j++) { ! for (k = 0; k < running_te->nLockDeps; k++) { ! if (te->lockDeps[j] == running_te->lockDeps[k]) { conflicts = true; break; --- 3423,3450 ---- if (slots[i].args == NULL) continue; running_te = slots[i].args->te; + /* does the candidate item require an exclusive lock that + * would block on or conflict with the running item? + */ for (j = 0; j < te->nLockDeps && !conflicts; j++) { ! for (k = 0; k < running_te->nDeps; k++) { ! if (te->lockDeps[j] == running_te->dependencies[k]) ! { ! conflicts = true; ! break; ! } ! } ! } ! /* or does the running item hold an exclusive lock that ! * would block or conflict with the candidate item? ! */ ! for (j = 0; j < running_te->nLockDeps && !conflicts; j++) ! { ! for (k = 0; k < te->nDeps; k++) ! { ! if (running_te->lockDeps[j] == te->dependencies[k]) { conflicts = true; break;
pgsql-hackers by date: