Hello, please see simple patch attached.
Thanks.
>From 8ea41341650498aade9ce91ac04501327d89a558 Mon Sep 17 00:00:00 2001 From: Pavel Reichl <prei...@redhat.com> Date: Tue, 26 Jan 2016 11:28:22 -0500 Subject: [PATCH] IDMAP: Add minor performance improvements Some ID ranges are precalculated when ID mapping is being initialized. This patch utilizes these (helper) ranges when new domains are generated if appropriate. --- src/lib/idmap/sss_idmap.c | 96 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 85 insertions(+), 11 deletions(-) diff --git a/src/lib/idmap/sss_idmap.c b/src/lib/idmap/sss_idmap.c index 269ef0132ff3b9ffbfbe65006361fac6d4f88cf9..394f9dcee69f7340e3af907fabd612b9ab205df8 100644 --- a/src/lib/idmap/sss_idmap.c +++ b/src/lib/idmap/sss_idmap.c @@ -89,6 +89,48 @@ static char *idmap_strdup(struct sss_idmap_ctx *ctx, const char *str) return new; } +static bool ranges_eq(const struct idmap_range_params *a, + const struct idmap_range_params *b) +{ + if (a == NULL || b == NULL) { + return false; + } + + if (a->first_rid == b->first_rid + && a->min_id == b->min_id + && a->max_id == b->max_id) { + return true; + } + + return false; +} + +static struct idmap_range_params* +construct_range(struct sss_idmap_ctx *ctx, + const struct idmap_range_params *src, + char *id) +{ + struct idmap_range_params *dst; + + if (src == NULL || id == NULL) { + return NULL; + } + + dst = ctx->alloc_func(sizeof(struct idmap_range_params), ctx->alloc_pvt); + if (dst == NULL) { + return NULL; + } + + /* Copy */ + dst->min_id = src->min_id; + dst->max_id = src->max_id; + dst->first_rid = src->first_rid; + dst->next = src->next; + + dst->range_id = id; + return dst; +} + static bool id_is_in_range(uint32_t id, struct idmap_range_params *rp, uint32_t *rid) @@ -232,6 +274,18 @@ static void free_helpers(struct sss_idmap_ctx *ctx, } } +static struct idmap_range_params* +get_helper_by_id(struct idmap_range_params *helpers, const char *id) +{ + for (struct idmap_range_params *it = helpers; it != NULL; it = it->next) { + if (strcmp(it->range_id, id) == 0) { + return it; + } + } + + return NULL; +} + static void sss_idmap_free_domain(struct sss_idmap_ctx *ctx, struct idmap_domain_info *dom) { @@ -846,30 +900,48 @@ static bool comp_id(struct idmap_range_params *range_params, long long rid, static enum idmap_error_code get_range(struct sss_idmap_ctx *ctx, + struct idmap_range_params *helpers, const char *dom_sid, long long rid, struct idmap_range_params **_range) { - char *secondary_name; + char *secondary_name = NULL;; enum idmap_error_code err; int first_rid; struct idmap_range_params *range; + struct idmap_range_params *helper; first_rid = (rid / ctx->idmap_opts.rangesize) * ctx->idmap_opts.rangesize; secondary_name = generate_sec_slice_name(ctx, dom_sid, first_rid); if (secondary_name == NULL) { - return IDMAP_OUT_OF_MEMORY; + err = IDMAP_OUT_OF_MEMORY; + goto error; } - err = generate_slice(ctx, secondary_name, first_rid, &range); - if (err == IDMAP_OUT_OF_SLICES) { - ctx->free_func(secondary_name, ctx->alloc_pvt); - return err; + helper = get_helper_by_id(helpers, secondary_name); + if (helper != NULL) { + /* Utilize helper's range. */ + range = construct_range(ctx, helper, secondary_name); + if (range == NULL) { + err = IDMAP_OUT_OF_MEMORY; + goto error; + } + range->next = NULL; + } else { + /* Have to generate a whole new range. */ + err = generate_slice(ctx, secondary_name, first_rid, &range); + if (err == IDMAP_OUT_OF_SLICES) { + goto error; + } } *_range = range; return IDMAP_SUCCESS; + +error: + ctx->free_func(secondary_name, ctx->alloc_pvt); + return err; } static enum idmap_error_code @@ -896,9 +968,7 @@ spawn_dom(struct sss_idmap_ctx *ctx, it = ctx->idmap_domain_info; while (it != NULL) { /* Find the newly added domain. */ - if (it->range_params.first_rid == range->first_rid - && it->range_params.min_id == range->min_id - && it->range_params.max_id == range->max_id) { + if (ranges_eq(&it->range_params, range)) { /* Share helpers. */ it->helpers = parent->helpers; @@ -950,8 +1020,7 @@ add_dom_for_sid(struct sss_idmap_ctx *ctx, goto done; } - /* todo optimize */ - err = get_range(ctx, matched_dom->sid, rid, &range); + err = get_range(ctx, matched_dom->helpers, matched_dom->sid, rid, &range); if (err != IDMAP_SUCCESS) { goto done; } @@ -1135,6 +1204,11 @@ enum idmap_error_code sss_idmap_unix_to_sid(struct sss_idmap_ctx *ctx, it != NULL; it = it->next) { + if (idmap_domain_info->helpers_owner == false) { + /* Checking helpers on owner is sufficient. */ + continue; + } + if (id_is_in_range(id, it, &rid)) { if (idmap_domain_info->external_mapping == true -- 2.4.3
_______________________________________________ sssd-devel mailing list sssd-devel@lists.fedorahosted.org https://lists.fedorahosted.org/admin/lists/sssd-devel@lists.fedorahosted.org