BUG #15887: An extra "break" instruction causes a bug
От | PG Bug reporting form |
---|---|
Тема | BUG #15887: An extra "break" instruction causes a bug |
Дата | |
Msg-id | 15887-e9320033d84cf7ea@postgresql.org обсуждение исходный текст |
Список | pgsql-bugs |
The following bug has been logged on the website: Bug reference: 15887 Logged by: Rui Hai Jiang Email address: ruihaij@gmail.com PostgreSQL version: 12beta2 Operating system: all Description: In function TopoSort(), an extra "break" instruction make it impossible to set beforeConstraints to -1 for other processes in the same group. If the waiter's group has more than one members in the wait for queue, the sorting couldn't get the right order. The issue exists in all V10,V11,V12 releases. static bool TopoSort(LOCK *lock, EDGE *constraints, int nConstraints, PGPROC **ordering) /* output argument */ { MemSet(beforeConstraints, 0, queue_size * sizeof(int)); MemSet(afterConstraints, 0, queue_size * sizeof(int)); for (i = 0; i < nConstraints; i++) { /* * Find a representative process that is on the lock queue and part of * the waiting lock group. This may or may not be the leader, which * may or may not be waiting at all. If there are any other processes * in the same lock group on the queue, set their number of * beforeConstraints to -1 to indicate that they should be emitted * with their groupmates rather than considered separately. */ proc = constraints[i].waiter; Assert(proc != NULL); jj = -1; for (j = queue_size; --j >= 0;) { PGPROC *waiter = topoProcs[j]; if (waiter == proc || waiter->lockGroupLeader == proc) { Assert(waiter->waitLock == lock); if (jj == -1) jj = j; else { Assert(beforeConstraints[j] <= 0); beforeConstraints[j] = -1; } break; } } } } A proposed patch is also sent to the hacker' list. https://www.postgresql.org/message-id/CAEri+mLd3bpHLyW+a9pSe1y=aEkeuJpwBSwvo-+m4n7-ceRmXw@mail.gmail.com
В списке pgsql-bugs по дате отправления: