Hi,

Attached are three patches,

[PATCH 1/3] Make subdomain refresh period configurable
* Adds the ad_subdomain_refresh_period and ipa_subdomain_refresh_period configuration options. This isn't needed to be pushed, but I think it can be beneficial. Also, I needed to write this anyway to work with the refresh.

[PATCH 2/3] DP: Store list of back-end tevent requests
* Adds every created request to list, and removes every terminated. This is to enable iteration through active requests, to fix the issue addressed in https://fedorahosted.org/sssd/ticket/1968

[PATCH 3/3] Clean list of domain requests
* fixes https://fedorahosted.org/sssd/ticket/1968
* Goes through the list of tevent requests introduced in previous patch an those, which match the vanished domain are terminated.

Ondra
--
Ondrej Kos
Associate Software Engineer
Identity Management - SSSD
Red Hat Czech
From 733f0bfd650634724d2040be8e66bf539e586136 Mon Sep 17 00:00:00 2001
From: Ondrej Kos <o...@redhat.com>
Date: Mon, 5 Aug 2013 14:44:31 +0200
Subject: [PATCH 1/3] Make subdomain refresh period configurable

Adds following config file options:

ad_subdomain_refresh_period
ipa_subdomain_refresh_period

Both are in seconds and have the same usage - setting the refresh period
of AD/IPA subdomains.
---
 src/config/SSSDConfig/__init__.py.in    |  3 +++
 src/config/etc/sssd.api.d/sssd-ad.conf  |  1 +
 src/config/etc/sssd.api.d/sssd-ipa.conf |  1 +
 src/man/sssd-ad.5.xml                   | 13 +++++++++++++
 src/man/sssd-ipa.5.xml                  | 13 +++++++++++++
 src/providers/ad/ad_common.h            |  1 +
 src/providers/ad/ad_opts.h              |  1 +
 src/providers/ad/ad_subdomains.c        |  9 +++++----
 src/providers/ipa/ipa_common.h          |  1 +
 src/providers/ipa/ipa_opts.h            |  1 +
 src/providers/ipa/ipa_subdomains.c      |  7 +++++--
 11 files changed, 45 insertions(+), 6 deletions(-)

diff --git a/src/config/SSSDConfig/__init__.py.in b/src/config/SSSDConfig/__init__.py.in
index 1bc4f1bffeb757547d35f6064d9c36bf053d49f9..9b7a67e9079fab0b07200ad1370fbecb4dd100f5 100644
--- a/src/config/SSSDConfig/__init__.py.in
+++ b/src/config/SSSDConfig/__init__.py.in
@@ -151,6 +151,8 @@ option_strings = {
     'ipa_master_domain_search_base': _("Search base for object containing info about IPA domain"),
     'ipa_ranges_search_base': _("Search base for objects containing info about ID ranges"),
     'ipa_enable_dns_sites': _("Enable DNS sites - location based service discovery"),
+    'ipa_subdomain_refresh_period': _("How often should be subdomains list refreshed"),
+ 
 
     # [provider/ad]
     'ad_domain' : _('Active Directory domain'),
@@ -158,6 +160,7 @@ option_strings = {
     'ad_backup_server' : _('Active Directory backup server address'),
     'ad_hostname' : _('Active Directory client hostname'),
     'ad_enable_dns_sites' : _('Enable DNS sites - location based service discovery'),
+    'ad_subdomain_refresh_period': _("How often should be subdomains list refreshed"),
 
     # [provider/krb5]
     'krb5_kdcip' : _('Kerberos server address'),
diff --git a/src/config/etc/sssd.api.d/sssd-ad.conf b/src/config/etc/sssd.api.d/sssd-ad.conf
index 120c827523d5b103396b3a38bca8cc75b25d0cc2..84bb1854877b8490a16d70450154506a052f8b15 100644
--- a/src/config/etc/sssd.api.d/sssd-ad.conf
+++ b/src/config/etc/sssd.api.d/sssd-ad.conf
@@ -4,6 +4,7 @@ ad_server = str, None, false
 ad_backup_server = str, None, false
 ad_hostname = str, None, false
 ad_enable_dns_sites = bool, None, false
+ad_subdomain_refresh_period = int, None, false
 ldap_uri = str, None, false
 ldap_backup_uri = str, None, false
 ldap_search_base = str, None, false
diff --git a/src/config/etc/sssd.api.d/sssd-ipa.conf b/src/config/etc/sssd.api.d/sssd-ipa.conf
index bc14fbe3d4153bd7a7ca4ffe0351edf0b8c02ee4..566ebed810cd555f19cf5bdbd40760abaffe3420 100644
--- a/src/config/etc/sssd.api.d/sssd-ipa.conf
+++ b/src/config/etc/sssd.api.d/sssd-ipa.conf
@@ -11,6 +11,7 @@ ipa_host_search_base = str, None, false
 ipa_master_domain_search_base = str, None, false
 ipa_ranges_search_base = str, None, false
 ipa_enable_dns_sites = bool, None, false
+ipa_subdomain_refresh_period = int, None, false
 ldap_uri = str, None, false
 ldap_backup_uri = str, None, false
 ldap_search_base = str, None, false
diff --git a/src/man/sssd-ad.5.xml b/src/man/sssd-ad.5.xml
index 92656929461885690d1863947ce528ecb782562b..385ee7030c7455e8d2d7a0fc4193daa940e562d2 100644
--- a/src/man/sssd-ad.5.xml
+++ b/src/man/sssd-ad.5.xml
@@ -159,6 +159,19 @@ ldap_id_mapping = False
                 </varlistentry>
 
                 <varlistentry>
+                    <term>ad_subdomain_refresh_period (integer)</term>
+                    <listitem>
+                        <para>
+                            Optional. Specifies how often should SSSD refresh
+                            the list of subdomains.
+                        </para>
+                        <para>
+                            Default: 14400 (seconds)
+                        </para>
+                    </listitem>
+                </varlistentry>
+
+                <varlistentry>
                     <term>dyndns_update (boolean)</term>
                     <listitem>
                         <para>
diff --git a/src/man/sssd-ipa.5.xml b/src/man/sssd-ipa.5.xml
index 28ac252abbeb508d62ca1a94f2440afc6b5b5c88..9a50e11c229b45f99a6753cb050c573622c334ad 100644
--- a/src/man/sssd-ipa.5.xml
+++ b/src/man/sssd-ipa.5.xml
@@ -208,6 +208,19 @@
                 </varlistentry>
 
                 <varlistentry>
+                    <term>ad_subdomain_refresh_period (integer)</term>
+                    <listitem>
+                        <para>
+                            Optional. Specifies how often should SSSD refresh
+                            the list of subdomains.
+                        </para>
+                        <para>
+                            Default: 14400 (seconds)
+                        </para>
+                    </listitem>
+                </varlistentry>
+
+                <varlistentry>
                     <term>dyndns_refresh_interval (integer)</term>
                     <listitem>
                         <para>
diff --git a/src/providers/ad/ad_common.h b/src/providers/ad/ad_common.h
index 98aeb2165273b5dbfafd3b8757180d74b4504c98..be31b080179011d4f14b1195cde0f4d31e6622f6 100644
--- a/src/providers/ad/ad_common.h
+++ b/src/providers/ad/ad_common.h
@@ -41,6 +41,7 @@ enum ad_basic_opt {
     AD_KEYTAB,
     AD_KRB5_REALM,
     AD_ENABLE_DNS_SITES,
+    AD_SUBDOMAIN_REFRESH_PERIOD,
 
     AD_OPTS_BASIC /* opts counter */
 };
diff --git a/src/providers/ad/ad_opts.h b/src/providers/ad/ad_opts.h
index 197b97e222367ba80af017fe635fceffdd9a9faa..fca5d8e02b8cc6ea48ecd6369d70a8f0cd2ee7e7 100644
--- a/src/providers/ad/ad_opts.h
+++ b/src/providers/ad/ad_opts.h
@@ -35,6 +35,7 @@ struct dp_option ad_basic_opts[] = {
     { "krb5_keytab", DP_OPT_STRING, NULL_STRING, NULL_STRING },
     { "krb5_realm", DP_OPT_STRING, NULL_STRING, NULL_STRING},
     { "ad_enable_dns_sites", DP_OPT_BOOL, BOOL_TRUE, BOOL_TRUE },
+    { "ad_subdomain_refresh_period", DP_OPT_NUMBER, {.number = 14400}, NULL_NUMBER}, /* 4 hours */
     DP_OPTION_TERMINATOR
 };
 
diff --git a/src/providers/ad/ad_subdomains.c b/src/providers/ad/ad_subdomains.c
index be4781cc5bc01152ffa1fbedf0ad5352f72939ae..b062b888d6ee726c79619c9875a9518d151a5854 100644
--- a/src/providers/ad/ad_subdomains.c
+++ b/src/providers/ad/ad_subdomains.c
@@ -55,9 +55,6 @@
 /* do not refresh more often than every 5 seconds for now */
 #define AD_SUBDOMAIN_REFRESH_LIMIT 5
 
-/* refresh automatically every 4 hours */
-#define AD_SUBDOMAIN_REFRESH_PERIOD (3600 * 4)
-
 struct ad_subdomains_ctx {
     struct be_ctx *be_ctx;
     struct sdap_id_ctx *sdap_id_ctx;
@@ -714,6 +711,7 @@ static void ad_subdom_online_cb(void *pvt)
     struct ad_subdomains_ctx *ctx;
     struct be_req *be_req;
     struct timeval tv;
+    int refresh_period;
 
     ctx = talloc_get_type(pvt, struct ad_subdomains_ctx);
     if (!ctx) {
@@ -730,7 +728,10 @@ static void ad_subdom_online_cb(void *pvt)
 
     ad_subdomains_retrieve(ctx, be_req);
 
-    tv = tevent_timeval_current_ofs(AD_SUBDOMAIN_REFRESH_PERIOD, 0);
+    refresh_period = dp_opt_get_int(ctx->sdap_id_ctx->opts->basic,
+            AD_SUBDOMAIN_REFRESH_PERIOD);
+
+    tv = tevent_timeval_current_ofs(refresh_period, 0);
     ctx->timer_event = tevent_add_timer(ctx->be_ctx->ev, ctx, tv,
                                         ad_subdom_timer_refresh, ctx);
     if (!ctx->timer_event) {
diff --git a/src/providers/ipa/ipa_common.h b/src/providers/ipa/ipa_common.h
index 1afe20dbb1ecb52de8bd6948fe780300d43e4dd3..1c1717c518dea96b07ed0c05c7558d476e9e883c 100644
--- a/src/providers/ipa/ipa_common.h
+++ b/src/providers/ipa/ipa_common.h
@@ -52,6 +52,7 @@ enum ipa_basic_opt {
     IPA_RANGES_SEARCH_BASE,
     IPA_ENABLE_DNS_SITES,
     IPA_SERVER_MODE,
+    IPA_SUBDOMAIN_REFRESH_PERIOD,
 
     IPA_OPTS_BASIC /* opts counter */
 };
diff --git a/src/providers/ipa/ipa_opts.h b/src/providers/ipa/ipa_opts.h
index 9babca73f4cf2e48ec7dff085870fa69429053df..f84709604f1267bba59d40832aef3bb2ba9d6cc4 100644
--- a/src/providers/ipa/ipa_opts.h
+++ b/src/providers/ipa/ipa_opts.h
@@ -49,6 +49,7 @@ struct dp_option ipa_basic_opts[] = {
     { "ipa_ranges_search_base", DP_OPT_STRING, NULL_STRING, NULL_STRING },
     { "ipa_enable_dns_sites", DP_OPT_BOOL, BOOL_FALSE, BOOL_FALSE },
     { "ipa_server_mode", DP_OPT_BOOL, BOOL_FALSE, BOOL_FALSE },
+    { "ipa_subdomain_refresh_period", DP_OPT_NUMBER, {.number = 14400}, NULL_NUMBER}, /* 4 hours */
     DP_OPTION_TERMINATOR
 };
 
diff --git a/src/providers/ipa/ipa_subdomains.c b/src/providers/ipa/ipa_subdomains.c
index 9ded9954bbc819e65e3b222c8968d2440320c4be..f7f4db35de753c1377f4ced4dcf731548b8acfcb 100644
--- a/src/providers/ipa/ipa_subdomains.c
+++ b/src/providers/ipa/ipa_subdomains.c
@@ -48,7 +48,6 @@
 #define IPA_SUBDOMAIN_REFRESH_LIMIT 5
 
 /* refresh automatically every 4 hours */
-#define IPA_SUBDOMAIN_REFRESH_PERIOD (3600 * 4)
 #define IPA_SUBDOMAIN_DISABLED_PERIOD 3600
 
 enum ipa_subdomains_req_type {
@@ -953,6 +952,7 @@ static void ipa_subdom_online_cb(void *pvt)
     struct ipa_subdomains_ctx *ctx;
     struct be_req *be_req;
     struct timeval tv;
+    int refresh_period;
 
     ctx = talloc_get_type(pvt, struct ipa_subdomains_ctx);
     if (!ctx) {
@@ -971,7 +971,10 @@ static void ipa_subdom_online_cb(void *pvt)
 
     ipa_subdomains_retrieve(ctx, be_req);
 
-    tv = tevent_timeval_current_ofs(IPA_SUBDOMAIN_REFRESH_PERIOD, 0);
+    refresh_period = dp_opt_get_int(ctx->sdap_id_ctx->opts->basic,
+            IPA_SUBDOMAIN_REFRESH_PERIOD);
+
+    tv = tevent_timeval_current_ofs(refresh_period, 0);
     ctx->timer_event = tevent_add_timer(ctx->be_ctx->ev, ctx, tv,
                                         ipa_subdom_timer_refresh, ctx);
     if (!ctx->timer_event) {
-- 
1.8.1.4

From c32871bb5775d709e32089485e06ba9e204aa066 Mon Sep 17 00:00:00 2001
From: Ondrej Kos <o...@redhat.com>
Date: Mon, 5 Aug 2013 12:39:04 +0200
Subject: [PATCH 2/3] DP: Store list of back-end tevent requests

---
 src/providers/data_provider_be.c | 25 +++++++++++++++++++++++++
 src/providers/dp_backend.h       |  3 +++
 2 files changed, 28 insertions(+)

diff --git a/src/providers/data_provider_be.c b/src/providers/data_provider_be.c
index ae9ba81c871e8cefc11cbbfd9b3fb2140ef74498..7797512815e9c540ba16c14dee3ab4c6b1c421a8 100644
--- a/src/providers/data_provider_be.c
+++ b/src/providers/data_provider_be.c
@@ -125,6 +125,8 @@ static struct bet_data bet_data[] = {
 #define REQ_PHASE_SELINUX 1
 
 struct be_req {
+    struct be_req *prev;
+    struct be_req *next;
     struct be_client *becli;
     struct be_ctx *be_ctx;
     void *req_data;
@@ -166,10 +168,25 @@ void *be_req_get_data(struct be_req *be_req)
     return be_req->req_data;
 }
 
+struct sss_domain_info *be_req_get_domain(struct be_req *be_req)
+{
+    struct be_ctx *be_ctx = be_req_get_be_ctx(be_req);
+
+    return be_ctx ? be_ctx->domain : NULL;
+}
+
 void be_req_terminate(struct be_req *be_req,
                       int dp_err_type, int errnum, const char *errstr)
 {
+    struct be_ctx *be_ctx = NULL;
+
     if (be_req->fn == NULL) return;
+
+    be_ctx = be_req_get_be_ctx(be_req);
+    if (be_ctx == NULL) return;
+
+    DLIST_REMOVE(be_ctx->be_reqlist, be_req);
+
     be_req->fn(be_req, dp_err_type, errnum, errstr);
 }
 
@@ -274,6 +291,7 @@ static errno_t be_file_request(TALLOC_CTX *mem_ctx,
                                be_req_fn_t fn)
 {
     errno_t ret;
+    struct be_ctx *be_ctx = NULL;
     struct be_async_req *areq;
     struct tevent_timer *te;
     struct timeval tv;
@@ -300,6 +318,13 @@ static errno_t be_file_request(TALLOC_CTX *mem_ctx,
         return EIO;
     }
 
+    be_ctx = be_req_get_be_ctx(be_req);
+    if (be_ctx == NULL) {
+        return EINVAL;
+    }
+
+    DLIST_ADD(be_ctx->be_reqlist, be_req);
+
     return EOK;
 }
 
diff --git a/src/providers/dp_backend.h b/src/providers/dp_backend.h
index e07b4e649f5983fc0239101f5b75579ea06f8ef7..12352d487be8931876f975cb5f4f8e4efa6c9bf7 100644
--- a/src/providers/dp_backend.h
+++ b/src/providers/dp_backend.h
@@ -144,6 +144,9 @@ struct be_ctx {
     struct be_refresh_ctx *refresh_ctx;
 
     size_t check_online_ref_count;
+
+    struct be_req *be_reqlist;
+
 };
 
 struct bet_ops {
-- 
1.8.1.4

From c989c6097beebff0b75442f6b753c045e98f339d Mon Sep 17 00:00:00 2001
From: Ondrej Kos <o...@redhat.com>
Date: Mon, 5 Aug 2013 13:44:15 +0200
Subject: [PATCH 3/3] Clean list of domain requests

https://fedorahosted.org/sssd/ticket/1968

When subdomain is removed, there still might be some requests pending.
Provided function goes through the list and matching requests are removed.
---
 src/providers/ad/ad_subdomains.c |  1 +
 src/providers/data_provider_be.c | 21 +++++++++++++++++++++
 src/providers/dp_backend.h       |  2 ++
 3 files changed, 24 insertions(+)

diff --git a/src/providers/ad/ad_subdomains.c b/src/providers/ad/ad_subdomains.c
index b062b888d6ee726c79619c9875a9518d151a5854..bce5e665a5faa0302c79f7d7dd3ac0007e750472 100644
--- a/src/providers/ad/ad_subdomains.c
+++ b/src/providers/ad/ad_subdomains.c
@@ -209,6 +209,7 @@ static errno_t ad_subdomains_refresh(struct ad_subdomains_ctx *ctx,
 
             /* Remove the subdomain from the list of LDAP domains */
             sdap_domain_remove(ctx->sdap_id_ctx->opts, dom);
+            be_clean_dom_req_list(ctx->be_ctx);
         } else {
             /* ok let's try to update it */
             ret = ad_subdom_store(ctx, domain, reply[c]);
diff --git a/src/providers/data_provider_be.c b/src/providers/data_provider_be.c
index 7797512815e9c540ba16c14dee3ab4c6b1c421a8..95d48cbffcdd0e582877e47c8c98eaca3e5ccbbc 100644
--- a/src/providers/data_provider_be.c
+++ b/src/providers/data_provider_be.c
@@ -447,6 +447,27 @@ done:
     talloc_free(next_be_req);
 }
 
+void be_clean_dom_req_list(struct be_ctx *be_ctx)
+{
+    struct be_req *be_req;
+    struct sss_domain_info *domain;
+    char *domain_name;
+
+    domain_name = be_ctx->domain->name;
+
+    DEBUG(SSSDBG_TRACE_FUNC,
+            ("Removing requests for domain %s\n", domain_name));
+
+    DLIST_FOR_EACH(be_req, be_ctx->be_reqlist) {
+
+        domain = be_req_get_domain(be_req);
+
+        if (strcmp(domain_name, domain->name) == 0) {
+            be_req_terminate(be_req, DP_ERR_FATAL, EIO, NULL);
+        }
+    }
+}
+
 bool be_is_offline(struct be_ctx *ctx)
 {
     time_t now = time(NULL);
diff --git a/src/providers/dp_backend.h b/src/providers/dp_backend.h
index 12352d487be8931876f975cb5f4f8e4efa6c9bf7..d5a26491bfa675a1972534e243fc88a567b618f8 100644
--- a/src/providers/dp_backend.h
+++ b/src/providers/dp_backend.h
@@ -210,6 +210,8 @@ int be_add_offline_cb(TALLOC_CTX *mem_ctx,
                      struct be_cb **online_cb);
 void be_run_offline_cb(struct be_ctx *be);
 
+void be_clean_dom_req_list(struct be_ctx *be_ctx);
+
 /* from data_provider_fo.c */
 enum be_fo_protocol {
     BE_FO_PROTO_TCP,
-- 
1.8.1.4

_______________________________________________
sssd-devel mailing list
sssd-devel@lists.fedorahosted.org
https://lists.fedorahosted.org/mailman/listinfo/sssd-devel

Reply via email to