Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/rpm-software-management/createrepo_c.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Alley <dalley@redhat.com>2022-06-25 22:00:04 +0300
committeramatej <matej.ales@seznam.cz>2022-06-27 17:13:11 +0300
commit32971377b7fa4e999b039c58b4a0c9ae8c5ac95e (patch)
tree6a28cd7c71e1a669857be21ce5994cd05e518b13
parentd1d12ddc474391ea738cf713329da080eb5346ee (diff)
Fix bad performance with task queue management
closes #323
-rw-r--r--src/createrepo_c.c38
1 files changed, 21 insertions, 17 deletions
diff --git a/src/createrepo_c.c b/src/createrepo_c.c
index 5b4ff8e..ff8ce82 100644
--- a/src/createrepo_c.c
+++ b/src/createrepo_c.c
@@ -106,14 +106,13 @@ allowed_modulemd_module_metadata_file(const gchar *filename)
*
* @param a_p Pointer to first struct PoolTask
* @param b_p Pointer to second struct PoolTask
- * @param user_data Unused (user data)
*/
static int
-task_cmp(gconstpointer a_p, gconstpointer b_p, G_GNUC_UNUSED gpointer user_data)
+task_cmp(gconstpointer a_p, gconstpointer b_p)
{
int ret;
- const struct PoolTask *a = a_p;
- const struct PoolTask *b = b_p;
+ const struct PoolTask *a = *(struct PoolTask **) a_p;
+ const struct PoolTask *b = *(struct PoolTask **) b_p;
ret = g_strcmp0(a->filename, b->filename);
if (ret) return ret;
return g_strcmp0(a->path, b->path);
@@ -143,7 +142,7 @@ fill_pool(GThreadPool *pool,
long *task_count,
int media_id)
{
- GQueue queue = G_QUEUE_INIT;
+ GArray *package_tasks = g_array_new(FALSE, FALSE, sizeof(struct PoolTask *));
struct PoolTask *task;
if ( ! cmd_options->split ) {
@@ -243,7 +242,7 @@ fill_pool(GThreadPool *pool,
task->path = g_strdup(dirname);
*current_pkglist = g_slist_prepend(*current_pkglist, task->filename);
// TODO: One common path for all tasks with the same path?
- g_queue_insert_sorted(&queue, task, task_cmp, NULL);
+ g_array_append_val(package_tasks, task);
} else {
g_free(full_path);
}
@@ -299,19 +298,24 @@ fill_pool(GThreadPool *pool,
task->filename = g_strdup(filename); // foobar.rpm
task->path = strndup(relative_path, x); // packages/i386/
*current_pkglist = g_slist_prepend(*current_pkglist, task->filename);
- g_queue_insert_sorted(&queue, task, task_cmp, NULL);
+ g_array_append_val(package_tasks, task);
}
}
}
+ g_array_sort(package_tasks, task_cmp);
+
// Push sorted tasks into the thread pool
- while ((task = g_queue_pop_head(&queue)) != NULL) {
+ for (int i=0; i<package_tasks->len; i++) {
+ task = g_array_index(package_tasks, struct PoolTask *, i);
task->id = *task_count;
task->media_id = media_id;
g_thread_pool_push(pool, task, NULL);
++*task_count;
}
+ g_array_free(package_tasks, TRUE);
+
return *task_count;
}
@@ -427,10 +431,10 @@ cr_create_repomd_records_for_groupfile_metadata(const cr_Metadatum *group_metada
}
/** Creates list of cr_RepomdRecords from list
- * of additional metadata (cr_Metadatum)
+ * of additional metadata (cr_Metadatum)
*
* @param additional_metadata List of cr_Metadatum
- * @param repomd_checksum_type
+ * @param repomd_checksum_type
*
* @return New GSList of cr_RepomdRecords
*/
@@ -439,7 +443,7 @@ cr_create_repomd_records_for_additional_metadata(GSList *additional_metadata,
cr_ChecksumType repomd_checksum_type)
{
GError *tmp_err = NULL;
- GSList *additional_metadata_rec = NULL;
+ GSList *additional_metadata_rec = NULL;
GSList *element = additional_metadata;
for (; element; element=g_slist_next(element)) {
additional_metadata_rec = g_slist_prepend(additional_metadata_rec,
@@ -468,9 +472,9 @@ cr_create_repomd_records_for_additional_metadata(GSList *additional_metadata,
* use content stats of the new file
*
* @param task Rewrite pkg count task
- * @param filename Name of file with wrong package count
+ * @param filename Name of file with wrong package count
* @param exit_val If errors occured set createrepo_c exit value
- * @param content_stat Content stats for filename
+ * @param content_stat Content stats for filename
*
*/
static void
@@ -794,7 +798,7 @@ main(int argc, char **argv)
cr_Metadatum *new_groupfile_metadatum = NULL;
- // Groupfile specified as argument
+ // Groupfile specified as argument
if (cmd_options->groupfile_fullpath) {
new_groupfile_metadatum = g_malloc0(sizeof(cr_Metadatum));
new_groupfile_metadatum->name = cr_copy_metadatum(cmd_options->groupfile_fullpath, tmp_out_repo, &tmp_err);
@@ -1478,7 +1482,7 @@ main(int argc, char **argv)
cr_RepomdRecord *prestodelta_zck_rec = NULL;
// List of cr_RepomdRecords
- GSList *additional_metadata_rec = NULL;
+ GSList *additional_metadata_rec = NULL;
// XML
cr_repomd_record_load_contentstat(pri_xml_rec, pri_stat);
@@ -1729,9 +1733,9 @@ main(int argc, char **argv)
g_clear_error(&tmp_err);
exit(EXIT_FAILURE);
}
- /* Only create additional_metadata_zck if additional_metadata isn't already zchunk
+ /* Only create additional_metadata_zck if additional_metadata isn't already zchunk
* and its zck version doesn't yet exists */
- if (com_type != CR_CW_ZCK_COMPRESSION &&
+ if (com_type != CR_CW_ZCK_COMPRESSION &&
!g_slist_find_custom(additional_metadata_rec, additional_metadatum_rec_zck_type, cr_cmp_repomd_record_type)) {
GSList *additional_metadatum_rec_elem = g_slist_find_custom(additional_metadata_rec,
((cr_Metadatum *) element->data)->type,