Commit 59b21794ec192212e590f29fd2957e73dc5dc5fe

Stefan Sperling 2022-01-07T14:33:52

only open raw objects if necessary while writing out pack file data significantly speeds up the "writing pack: " step of gotadmin pack

diff --git a/lib/pack_create.c b/lib/pack_create.c
index 2e421bd..884cbfa 100644
--- a/lib/pack_create.c
+++ b/lib/pack_create.c
@@ -1193,10 +1193,10 @@ genpack(uint8_t *pack_sha1, FILE *packfile, FILE *delta_cache,
 			goto done;
 		m = meta[i];
 		m->off = ftello(packfile);
-		err = got_object_raw_open(&raw, &outfd, repo, &m->id);
-		if (err)
-			goto done;
 		if (m->delta_len == 0) {
+			err = got_object_raw_open(&raw, &outfd, repo, &m->id);
+			if (err)
+				goto done;
 			err = packhdr(&nh, buf, sizeof(buf),
 			    m->obj_type, raw->size);
 			if (err)
@@ -1214,6 +1214,8 @@ genpack(uint8_t *pack_sha1, FILE *packfile, FILE *delta_cache,
 			if (err)
 				goto done;
 			packfile_size += outlen;
+			got_object_raw_close(raw);
+			raw = NULL;
 		} else {
 			off_t remain;
 			if (delta_file == NULL) {
@@ -1290,8 +1292,6 @@ genpack(uint8_t *pack_sha1, FILE *packfile, FILE *delta_cache,
 				goto done;
 			packfile_size += outlen;
 		}
-		got_object_raw_close(raw);
-		raw = NULL;
 	}
 	SHA1Final(pack_sha1, &ctx);
 	n = fwrite(pack_sha1, 1, SHA1_DIGEST_LENGTH, packfile);