Skip to content

Commit 253895f

Browse files
committed
Move key mapping after key pruning
That way we'll not pollute the spool so much. The downside is that we need to have some extra room on the needid array for the keys.
1 parent 237946c commit 253895f

1 file changed

Lines changed: 63 additions & 69 deletions

File tree

src/repo_write.c

Lines changed: 63 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1176,7 +1176,6 @@ repowriter_write(Repowriter *writer, FILE *fp)
11761176
struct extdata *xd;
11771177

11781178
Id type_constantid = 0;
1179-
Id type_dirstrarray = 0;
11801179

11811180

11821181
memset(&cbdata, 0, sizeof(cbdata));
@@ -1212,11 +1211,11 @@ repowriter_write(Repowriter *writer, FILE *fp)
12121211
if (i < SOLVABLE_PROVIDES)
12131212
keyd.type = REPOKEY_TYPE_ID;
12141213
else if (i < RPM_RPMDBID)
1215-
#ifdef USE_REL_IDARRAY
1214+
#ifdef USE_REL_IDARRAY
12161215
keyd.type = REPOKEY_TYPE_REL_IDARRAY;
1217-
#else
1216+
#else
12181217
keyd.type = REPOKEY_TYPE_IDARRAY;
1219-
#endif
1218+
#endif
12201219
else
12211220
keyd.type = REPOKEY_TYPE_NUM;
12221221
keyd.size = 0;
@@ -1432,41 +1431,6 @@ for (i = 1; i < target.nkeys; i++)
14321431
fprintf(stderr, " %2d: %s[%d] %d %d %d\n", i, pool_id2str(pool, target.keys[i].name), target.keys[i].name, target.keys[i].type, target.keys[i].size, target.keys[i].storage);
14331432
#endif
14341433

1435-
/* copy keys if requested */
1436-
if (writer->keyq)
1437-
{
1438-
queue_empty(writer->keyq);
1439-
for (i = 1; i < target.nkeys; i++)
1440-
queue_push2(writer->keyq, target.keys[i].name, target.keys[i].type);
1441-
}
1442-
1443-
if (poolusage > 1)
1444-
{
1445-
/* put all the keys we need in our string pool */
1446-
/* put mapped ids right into target.keys */
1447-
for (i = 1, key = target.keys + i; i < target.nkeys; i++, key++)
1448-
{
1449-
key->name = stringpool_str2id(spool, pool_id2str(pool, key->name), 1);
1450-
id = stringpool_str2id(spool, pool_id2str(pool, key->type), 1);
1451-
if (key->type == REPOKEY_TYPE_CONSTANTID)
1452-
{
1453-
type_constantid = id;
1454-
key->size = stringpool_str2id(spool, pool_id2str(pool, key->size), 1);
1455-
}
1456-
if (key->type == REPOKEY_TYPE_DIRSTRARRAY)
1457-
type_dirstrarray = id;
1458-
key->type = id;
1459-
}
1460-
if (poolusage == 2)
1461-
stringpool_freehash(spool); /* free some mem */
1462-
}
1463-
else
1464-
{
1465-
type_constantid = REPOKEY_TYPE_CONSTANTID;
1466-
type_dirstrarray = REPOKEY_TYPE_DIRSTRARRAY;
1467-
}
1468-
1469-
14701434
/********************************************************************/
14711435

14721436
searchflags = SEARCH_SUB|SEARCH_ARRAYSENTINEL;
@@ -1481,6 +1445,12 @@ for (i = 1; i < target.nkeys; i++)
14811445
reloff = spool->nstrings;
14821446
if (cbdata.ownspool)
14831447
reloff = (reloff + NEEDID_BLOCK) & ~NEEDID_BLOCK;
1448+
else if (poolusage == 2)
1449+
{
1450+
/* we'll need to put the key data into the spool,
1451+
* so leave some room. 3 * nkeys is an upper bound */
1452+
reloff += 3 * target.nkeys;
1453+
}
14841454

14851455
needid = calloc(reloff + pool->nrels, sizeof(*needid));
14861456
needid[0].map = reloff; /* remember size in case we need to grow */
@@ -1571,21 +1541,11 @@ for (i = 1; i < target.nkeys; i++)
15711541
{
15721542
if (!keyused[i])
15731543
continue;
1574-
keyused[i] = n;
15751544
if (i != n)
1576-
{
1577-
target.keys[n] = target.keys[i];
1578-
if (writer->keyq)
1579-
{
1580-
writer->keyq->elements[2 * n - 2] = writer->keyq->elements[2 * i - 2];
1581-
writer->keyq->elements[2 * n - 1] = writer->keyq->elements[2 * i - 1];
1582-
}
1583-
}
1584-
n++;
1545+
target.keys[n] = target.keys[i];
1546+
keyused[i] = n++;
15851547
}
15861548
target.nkeys = n;
1587-
if (writer->keyq)
1588-
queue_truncate(writer->keyq, 2 * n - 2);
15891549

15901550
/* update schema data to the new key ids */
15911551
for (i = 1; i < (int)target.schemadatalen; i++)
@@ -1595,9 +1555,59 @@ for (i = 1; i < target.nkeys; i++)
15951555
keymap[i] = keyused[keymap[i]];
15961556
keyused = solv_free(keyused);
15971557

1558+
/* copy keys if requested */
1559+
if (writer->keyq)
1560+
{
1561+
queue_empty(writer->keyq);
1562+
for (i = 1; i < target.nkeys; i++)
1563+
queue_push2(writer->keyq, target.keys[i].name, target.keys[i].type);
1564+
}
1565+
1566+
/********************************************************************/
1567+
1568+
/* check if we can do the special filelist memory optimization */
1569+
/* we do the check before the keys are mapped */
1570+
if (anysolvableused && anyrepodataused)
1571+
{
1572+
for (i = 1; i < target.nkeys; i++)
1573+
if (target.keys[i].storage == KEY_STORAGE_VERTICAL_OFFSET)
1574+
cbdata.filelistmode |= cbdata.filelistmode == 0 && target.keys[i].type == REPOKEY_TYPE_DIRSTRARRAY ? 1 : 2;
1575+
else if (target.keys[i].type == REPOKEY_TYPE_DIRSTRARRAY)
1576+
cbdata.filelistmode = 2;
1577+
if (cbdata.filelistmode != 1)
1578+
cbdata.filelistmode = 0;
1579+
}
1580+
1581+
/********************************************************************/
1582+
1583+
if (poolusage > 1)
1584+
{
1585+
/* put all the keys in our string pool */
1586+
/* put mapped ids right into target.keys */
1587+
for (i = 1, key = target.keys + i; i < target.nkeys; i++, key++)
1588+
{
1589+
key->name = stringpool_str2id(spool, pool_id2str(pool, key->name), 1);
1590+
id = stringpool_str2id(spool, pool_id2str(pool, key->type), 1);
1591+
if (key->type == REPOKEY_TYPE_CONSTANTID)
1592+
{
1593+
type_constantid = id;
1594+
key->size = stringpool_str2id(spool, pool_id2str(pool, key->size), 1);
1595+
}
1596+
key->type = id;
1597+
}
1598+
if (poolusage == 2)
1599+
stringpool_freehash(spool); /* free some mem */
1600+
if (cbdata.ownspool && spool->nstrings > needid[0].map)
1601+
{
1602+
grow_needid(&cbdata, spool->nstrings - 1);
1603+
needid = cbdata.needid; /* we relocated */
1604+
reloff = needid[0].map; /* we have a new offset */
1605+
}
1606+
}
1607+
else
1608+
type_constantid = REPOKEY_TYPE_CONSTANTID;
15981609

1599-
/* increment needid of the keys, they are already mapped to
1600-
* the correct string pool */
1610+
/* increment needid of the keys */
16011611
for (i = 1; i < target.nkeys; i++)
16021612
{
16031613
if (target.keys[i].type == type_constantid)
@@ -1737,13 +1747,9 @@ for (i = 1; i < target.nkeys; i++)
17371747
for (i = 1; i < reloff + pool->nrels; i++)
17381748
needid[i].map = i;
17391749

1740-
#if 0
1741-
solv_sort(needid + 1, spool->nstrings - 1, sizeof(*needid), needid_cmp_need_s, spool);
1742-
#else
17431750
/* make first entry '' */
17441751
needid[1].need = 1;
17451752
solv_sort(needid + 2, spool->nstrings - 2, sizeof(*needid), needid_cmp_need_s, spool);
1746-
#endif
17471753
solv_sort(needid + reloff, pool->nrels, sizeof(*needid), needid_cmp_need, 0);
17481754
/* now needid is in new order, needid[newid].map -> oldid */
17491755

@@ -1854,18 +1860,6 @@ for (i = 1; i < target.nkeys; i++)
18541860
data_addid(xd, nsolvables); /* FLEXARRAY nentries */
18551861
cbdata.doingsolvables = 1;
18561862

1857-
/* check if we can do the special filelist memory optimization */
1858-
if (anyrepodataused)
1859-
{
1860-
for (i = 1; i < target.nkeys; i++)
1861-
if (target.keys[i].storage == KEY_STORAGE_VERTICAL_OFFSET)
1862-
cbdata.filelistmode |= cbdata.filelistmode == 0 && target.keys[i].type == type_dirstrarray? 1 : 2;
1863-
else if (target.keys[i].type == type_dirstrarray)
1864-
cbdata.filelistmode = 2;
1865-
if (cbdata.filelistmode != 1)
1866-
cbdata.filelistmode = 0;
1867-
}
1868-
18691863
for (i = solvablestart, s = pool->solvables + i, n = 0; i < solvableend; i++, s++)
18701864
{
18711865
if (s->repo != repo)

0 commit comments

Comments
 (0)