Download raw body.
got-read-pack commit coloring fix
Pass an exact copy of queued IDs to got-read-pack during commit coloring. This ensures that commit painting inside got-read-pack begins with an exact copy of the object ID list state which the main process has. ok? M libexec/got-read-pack/got-read-pack.c | 13+ 33- 1 file changed, 13 insertions(+), 33 deletions(-) commit - 58cfb2ec1ed437bf474ca53c28a459adfa8e8c7c commit + 2bccde005ed70aba1cef6b10e25bf1add9e2440a blob - 3e11305bebb5cfea0725ac4325aca4c560b97c10 blob + 4e65a3f8939e6541fe568b471a16f36581536485 --- libexec/got-read-pack/got-read-pack.c +++ libexec/got-read-pack/got-read-pack.c @@ -1901,9 +1901,8 @@ commit_painting_request(struct imsg *imsg, struct imsg const struct got_error *err = NULL; size_t datalen; struct got_object_id_queue ids; - size_t nkeep = 0, ndrop = 0, nskip = 0; - int nids = 0; - uintptr_t color; + size_t nids; + int nqueued = 0, done = 0; STAILQ_INIT(&ids); @@ -1911,42 +1910,23 @@ commit_painting_request(struct imsg *imsg, struct imsg if (datalen != 0) return got_error(GOT_ERR_PRIVSEP_LEN); - color = COLOR_KEEP; - err = recv_object_id_queue(&nkeep, &ids, (void *)color, NULL, ibuf); - if (err) - goto done; - if (nids + nkeep > INT_MAX) { - err = got_error(GOT_ERR_PRIVSEP_LEN); - goto done; + while (!done) { + err = got_privsep_recv_object_id_queue(&done, &ids, &nids, ibuf); + if (err) + goto done; + if (nqueued + nids > INT_MAX) { + err = got_error(GOT_ERR_PRIVSEP_LEN); + goto done; + } + nqueued += nids; } - nids += nkeep; - color = COLOR_DROP; - err = recv_object_id_queue(&ndrop, &ids, (void *)color, NULL, ibuf); - if (err) - goto done; - if (nids + ndrop > INT_MAX) { - err = got_error(GOT_ERR_PRIVSEP_LEN); - goto done; - } - nids += ndrop; - - color = COLOR_SKIP; - err = recv_object_id_queue(&nskip, &ids, (void *)color, NULL, ibuf); - if (err) - goto done; - if (nids + nskip > INT_MAX) { - err = got_error(GOT_ERR_PRIVSEP_LEN); - goto done; - } - nids += nskip; - - err = paint_commits(&ids, &nids, keep, drop, skip, + err = paint_commits(&ids, &nqueued, keep, drop, skip, pack, packidx, ibuf, objcache); if (err) goto done; - err = got_privsep_send_painted_commits(ibuf, &ids, &nids, 0, 1); + err = got_privsep_send_painted_commits(ibuf, &ids, &nqueued, 0, 1); if (err) goto done;
got-read-pack commit coloring fix