On 11/23/2009 09:16 AM, Simo Sorce wrote:
> 
> Patch looks good except for adding a new param in the bus protocol.
> As discussed on IRC we can pass fast_reply as a parameter of the type,
> and make type a bitfield as it should have always been.

Patch 0001: Make "type" a bitfield
Patch 0002: fast_reply is now a bit-flag 0x1000


-- 
Stephen Gallagher
RHCE 804006346421761

Delivering value year after year.
Red Hat ranks #1 in value among software vendors.
http://www.redhat.com/promo/vendor/
From 5f94a4974bc5e83a71111d0a559a60e26a904dc7 Mon Sep 17 00:00:00 2001
From: Stephen Gallagher <sgall...@redhat.com>
Date: Mon, 23 Nov 2009 10:30:44 -0500
Subject: [PATCH 1/2] Make backend request type a bitfield

---
 server/providers/data_provider.h |    6 +++---
 server/providers/ldap/ldap_id.c  |    2 +-
 server/providers/proxy.c         |    2 +-
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/server/providers/data_provider.h b/server/providers/data_provider.h
index 1e97d04..33aed3f 100644
--- a/server/providers/data_provider.h
+++ b/server/providers/data_provider.h
@@ -70,9 +70,9 @@
 #define BE_FILTER_NAME 1
 #define BE_FILTER_IDNUM 2
 
-#define BE_REQ_USER 1
-#define BE_REQ_GROUP 2
-#define BE_REQ_INITGROUPS 3
+#define BE_REQ_USER 0x0001
+#define BE_REQ_GROUP 0x0002
+#define BE_REQ_INITGROUPS 0x0003
 
 /* AUTH related common data and functions */
 
diff --git a/server/providers/ldap/ldap_id.c b/server/providers/ldap/ldap_id.c
index f99ea7b..18b387e 100644
--- a/server/providers/ldap/ldap_id.c
+++ b/server/providers/ldap/ldap_id.c
@@ -628,7 +628,7 @@ void sdap_account_info_handler(struct be_req *breq)
 
     ar = talloc_get_type(breq->req_data, struct be_acct_req);
 
-    switch (ar->entry_type) {
+    switch (ar->entry_type & 0xFFF) {
     case BE_REQ_USER: /* user */
 
         /* skip enumerations on demand */
diff --git a/server/providers/proxy.c b/server/providers/proxy.c
index fbd8f16..9cf0c61 100644
--- a/server/providers/proxy.c
+++ b/server/providers/proxy.c
@@ -2065,7 +2065,7 @@ static void proxy_get_account_info(struct be_req *breq)
         return proxy_reply(breq, DP_ERR_FATAL, EINVAL, "Invalid attr type");
     }
 
-    switch (ar->entry_type) {
+    switch (ar->entry_type & 0xFFF) {
     case BE_REQ_USER: /* user */
         switch (ar->filter_type) {
         case BE_FILTER_NAME:
-- 
1.6.2.5

From bf414292fcc21d4fb339ba584cfb08fe0f036afb Mon Sep 17 00:00:00 2001
From: Stephen Gallagher <sgall...@redhat.com>
Date: Thu, 19 Nov 2009 16:37:51 -0500
Subject: [PATCH 2/2] Speed up user requests while offline

This adds a new boolean option to sss_dp_send_acct_req() called
fast_reply. If we make a request to the backends and we are
currently offline, this option will determine whether we should
immediately return from the cache (acceptable for NSS requests) or
potentially wait for an online check to complete (required for PAM
requests).
---
 server/providers/data_provider.h       |    1 +
 server/providers/data_provider_be.c    |  113 +++++++++++++++++++++----------
 server/responder/common/responder.h    |    3 +-
 server/responder/common/responder_dp.c |    7 ++-
 server/responder/nss/nsssrv_cmd.c      |   22 ++++---
 server/responder/pam/pamsrv_cmd.c      |    8 ++-
 6 files changed, 102 insertions(+), 52 deletions(-)

diff --git a/server/providers/data_provider.h b/server/providers/data_provider.h
index 33aed3f..c524662 100644
--- a/server/providers/data_provider.h
+++ b/server/providers/data_provider.h
@@ -73,6 +73,7 @@
 #define BE_REQ_USER 0x0001
 #define BE_REQ_GROUP 0x0002
 #define BE_REQ_INITGROUPS 0x0003
+#define BE_REQ_FAST 0x1000
 
 /* AUTH related common data and functions */
 
diff --git a/server/providers/data_provider_be.c 
b/server/providers/data_provider_be.c
index b5d2460..02d5a0d 100644
--- a/server/providers/data_provider_be.c
+++ b/server/providers/data_provider_be.c
@@ -251,36 +251,43 @@ static void acctinfo_callback(struct be_req *req,
     dbus_uint32_t err_min = 0;
     const char *err_msg = NULL;
 
-    err_maj = dp_err_type;
-    err_min = errnum;
-    if (errstr) {
-        err_msg = errstr;
-    } else {
-        err_msg = dp_err_to_string(req, dp_err_type, errnum);
-    }
-    if (!err_msg) {
-        DEBUG(1, ("Failed to set err_msg, Out of memory?\n"));
-        err_msg = "OOM";
-    }
-
     reply = (DBusMessage *)req->pvt;
 
-    dbret = dbus_message_append_args(reply,
-                                     DBUS_TYPE_UINT16, &err_maj,
-                                     DBUS_TYPE_UINT32, &err_min,
-                                     DBUS_TYPE_STRING, &err_msg,
-                                     DBUS_TYPE_INVALID);
-    if (!dbret) {
-        DEBUG(1, ("Failed to generate dbus reply\n"));
-        return;
-    }
+    if (reply) {
+        /* Return a reply if one was requested
+         * There may not be one if this request began
+         * while we were offline
+         */
 
-    dbus_conn = sbus_get_connection(req->becli->conn);
-    dbus_connection_send(dbus_conn, reply, NULL);
-    dbus_message_unref(reply);
+        err_maj = dp_err_type;
+        err_min = errnum;
+        if (errstr) {
+            err_msg = errstr;
+        } else {
+            err_msg = dp_err_to_string(req, dp_err_type, errnum);
+        }
+        if (!err_msg) {
+            DEBUG(1, ("Failed to set err_msg, Out of memory?\n"));
+            err_msg = "OOM";
+        }
 
-    DEBUG(4, ("Request processed. Returned %d,%d,%s\n",
-              err_maj, err_min, err_msg));
+        dbret = dbus_message_append_args(reply,
+                                         DBUS_TYPE_UINT16, &err_maj,
+                                         DBUS_TYPE_UINT32, &err_min,
+                                         DBUS_TYPE_STRING, &err_msg,
+                                         DBUS_TYPE_INVALID);
+        if (!dbret) {
+            DEBUG(1, ("Failed to generate dbus reply\n"));
+            return;
+        }
+
+        dbus_conn = sbus_get_connection(req->becli->conn);
+        dbus_connection_send(dbus_conn, reply, NULL);
+        dbus_message_unref(reply);
+
+        DEBUG(4, ("Request processed. Returned %d,%d,%s\n",
+                  err_maj, err_min, err_msg));
+    }
 
     /* finally free the request */
     talloc_free(req);
@@ -329,6 +336,36 @@ static int be_get_account_info(DBusMessage *message, 
struct sbus_connection *con
     reply = dbus_message_new_method_return(message);
     if (!reply) return ENOMEM;
 
+    /* If we are offline and fast reply was requested
+     * return offline immediately
+     */
+    if ((type & BE_REQ_FAST) && becli->bectx->offstat.offline) {
+        /* Send back an immediate reply */
+        err_maj = DP_ERR_OFFLINE;
+        err_min = EAGAIN;
+        err_msg = "Fast reply - offline";
+
+        dbret = dbus_message_append_args(reply,
+                                         DBUS_TYPE_UINT16, &err_maj,
+                                         DBUS_TYPE_UINT32, &err_min,
+                                         DBUS_TYPE_STRING, &err_msg,
+                                         DBUS_TYPE_INVALID);
+        if (!dbret) return EIO;
+
+        DEBUG(4, ("Request processed. Returned %d,%d,%s\n",
+                  err_maj, err_min, err_msg));
+
+        sbus_conn_send_reply(conn, reply);
+        dbus_message_unref(reply);
+        reply = NULL;
+        /* This reply will be queued and sent
+         * when we reenter the mainloop.
+         *
+         * Continue processing in case we are
+         * going back online.
+         */
+    }
+
     if (attrs) {
         if (strcmp(attrs, "core") == 0) attr_type = BE_ATTR_CORE;
         else if (strcmp(attrs, "membership") == 0) attr_type = BE_ATTR_MEM;
@@ -410,19 +447,21 @@ done:
         talloc_free(be_req);
     }
 
-    dbret = dbus_message_append_args(reply,
-                                     DBUS_TYPE_UINT16, &err_maj,
-                                     DBUS_TYPE_UINT32, &err_min,
-                                     DBUS_TYPE_STRING, &err_msg,
-                                     DBUS_TYPE_INVALID);
-    if (!dbret) return EIO;
+    if (reply) {
+        dbret = dbus_message_append_args(reply,
+                                         DBUS_TYPE_UINT16, &err_maj,
+                                         DBUS_TYPE_UINT32, &err_min,
+                                         DBUS_TYPE_STRING, &err_msg,
+                                         DBUS_TYPE_INVALID);
+        if (!dbret) return EIO;
 
-    DEBUG(4, ("Request processed. Returned %d,%d,%s\n",
-              err_maj, err_min, err_msg));
+        DEBUG(4, ("Request processed. Returned %d,%d,%s\n",
+                  err_maj, err_min, err_msg));
 
-    /* send reply back */
-    sbus_conn_send_reply(conn, reply);
-    dbus_message_unref(reply);
+        /* send reply back */
+        sbus_conn_send_reply(conn, reply);
+        dbus_message_unref(reply);
+    }
 
     return EOK;
 }
diff --git a/server/responder/common/responder.h 
b/server/responder/common/responder.h
index a597e68..9294f40 100644
--- a/server/responder/common/responder.h
+++ b/server/responder/common/responder.h
@@ -145,7 +145,8 @@ typedef void (*sss_dp_callback_t)(uint16_t err_maj, 
uint32_t err_min,
 
 int sss_dp_send_acct_req(struct resp_ctx *rctx, TALLOC_CTX *callback_memctx,
                          sss_dp_callback_t callback, void *callback_ctx,
-                         int timeout, const char *domain, int type,
+                         int timeout, const char *domain,
+                         bool fast_reply, int type,
                          const char *opt_name, uint32_t opt_id);
 
 #endif /* __SSS_RESPONDER_H__ */
diff --git a/server/responder/common/responder_dp.c 
b/server/responder/common/responder_dp.c
index 943b72c..03e83ec 100644
--- a/server/responder/common/responder_dp.c
+++ b/server/responder/common/responder_dp.c
@@ -243,7 +243,8 @@ static int sss_dp_send_acct_req_create(struct resp_ctx 
*rctx,
 
 int sss_dp_send_acct_req(struct resp_ctx *rctx, TALLOC_CTX *callback_memctx,
                          sss_dp_callback_t callback, void *callback_ctx,
-                         int timeout, const char *domain, int type,
+                         int timeout, const char *domain,
+                         bool fast_reply, int type,
                          const char *opt_name, uint32_t opt_id)
 {
     int ret, hret;
@@ -279,6 +280,10 @@ int sss_dp_send_acct_req(struct resp_ctx *rctx, TALLOC_CTX 
*callback_memctx,
         return EINVAL;
     }
 
+    if (fast_reply) {
+        be_type |= BE_REQ_FAST;
+    }
+
     if (dp_requests == NULL) {
         /* Create a hash table to handle queued update requests */
         ret = hash_create(10, &dp_requests, NULL);
diff --git a/server/responder/nss/nsssrv_cmd.c 
b/server/responder/nss/nsssrv_cmd.c
index 4473e6c..9717897 100644
--- a/server/responder/nss/nsssrv_cmd.c
+++ b/server/responder/nss/nsssrv_cmd.c
@@ -351,7 +351,8 @@ static errno_t check_cache(struct nss_dom_ctx *dctx,
          */
         ret = sss_dp_send_acct_req(cctx->rctx, NULL, NULL, NULL,
                                    timeout, dctx->domain->name,
-                                   req_type, opt_name, opt_id);
+                                   true, req_type,
+                                   opt_name, opt_id);
         if (ret != EOK) {
             DEBUG(3, ("Failed to dispatch request: %d(%s)\n",
                       ret, strerror(ret)));
@@ -376,7 +377,8 @@ static errno_t check_cache(struct nss_dom_ctx *dctx,
 
         ret = sss_dp_send_acct_req(cctx->rctx, cmdctx,
                                    callback, dctx, timeout,
-                                   dctx->domain->name, req_type,
+                                   dctx->domain->name,
+                                   true, req_type,
                                    opt_name, opt_id);
         if (ret != EOK) {
             DEBUG(3, ("Failed to dispatch request: %d(%s)\n",
@@ -1125,8 +1127,8 @@ static void nss_cmd_setpwent_callback(void *ptr, int 
status,
             timeout = SSS_CLI_SOCKET_TIMEOUT;
             ret = sss_dp_send_acct_req(cctx->rctx, cmdctx,
                                        nss_cmd_setpw_dp_callback, dctx,
-                                       timeout, dom->name, SSS_DP_USER,
-                                       NULL, 0);
+                                       timeout, dom->name, true,
+                                       SSS_DP_USER, NULL, 0);
         } else {
             ret = sysdb_get_ctx_from_list(cctx->rctx->db_list,
                                           dctx->domain, &sysdb);
@@ -1272,8 +1274,8 @@ static int nss_cmd_setpwent_ext(struct cli_ctx *cctx, 
bool immediate)
         timeout = SSS_CLI_SOCKET_TIMEOUT;
         ret = sss_dp_send_acct_req(cctx->rctx, cmdctx,
                                    nss_cmd_setpw_dp_callback, dctx,
-                                   timeout, dom->name, SSS_DP_USER,
-                                   NULL, 0);
+                                   timeout, dom->name, true,
+                                   SSS_DP_USER, NULL, 0);
     } else {
         ret = sysdb_get_ctx_from_list(cctx->rctx->db_list,
                                       dctx->domain, &sysdb);
@@ -2448,8 +2450,8 @@ static void nss_cmd_setgrent_callback(void *ptr, int 
status,
             timeout = SSS_CLI_SOCKET_TIMEOUT;
             ret = sss_dp_send_acct_req(cctx->rctx, cmdctx,
                                        nss_cmd_setgr_dp_callback, dctx,
-                                       timeout, dom->name, SSS_DP_GROUP,
-                                       NULL, 0);
+                                       timeout, dom->name, true,
+                                       SSS_DP_GROUP, NULL, 0);
         } else {
             ret = sysdb_get_ctx_from_list(cctx->rctx->db_list,
                                           dctx->domain, &sysdb);
@@ -2595,8 +2597,8 @@ static int nss_cmd_setgrent_ext(struct cli_ctx *cctx, 
bool immediate)
         timeout = SSS_CLI_SOCKET_TIMEOUT;
         ret = sss_dp_send_acct_req(cctx->rctx, cmdctx,
                                    nss_cmd_setgr_dp_callback, dctx,
-                                   timeout, dom->name, SSS_DP_GROUP,
-                                   NULL, 0);
+                                   timeout, dom->name, true,
+                                   SSS_DP_GROUP, NULL, 0);
     } else {
         ret = sysdb_get_ctx_from_list(cctx->rctx->db_list,
                                       dctx->domain, &sysdb);
diff --git a/server/responder/pam/pamsrv_cmd.c 
b/server/responder/pam/pamsrv_cmd.c
index 8627d5c..4479926 100644
--- a/server/responder/pam/pamsrv_cmd.c
+++ b/server/responder/pam/pamsrv_cmd.c
@@ -725,7 +725,8 @@ static int pam_forwarder(struct cli_ctx *cctx, int pam_cmd)
 
         ret = sss_dp_send_acct_req(preq->cctx->rctx, preq,
                                    pam_check_user_dp_callback, preq,
-                                   timeout, preq->domain->name, 
SSS_DP_INITGROUPS,
+                                   timeout, preq->domain->name,
+                                   false, SSS_DP_INITGROUPS,
                                    preq->pd->user, 0);
     }
     else {
@@ -840,7 +841,8 @@ static void pam_check_user_callback(void *ptr, int status,
 
         ret = sss_dp_send_acct_req(preq->cctx->rctx, preq,
                                    pam_check_user_dp_callback, preq,
-                                   timeout, preq->domain->name, SSS_DP_USER,
+                                   timeout, preq->domain->name,
+                                   false, SSS_DP_USER,
                                    preq->pd->user, 0);
         if (ret != EOK) {
             DEBUG(3, ("Failed to dispatch request: %d(%s)\n",
@@ -910,7 +912,7 @@ static void pam_check_user_callback(void *ptr, int status,
                                                pam_check_user_dp_callback,
                                                preq, timeout,
                                                preq->domain->name,
-                                               SSS_DP_USER,
+                                               false, SSS_DP_USER,
                                                preq->pd->user, 0);
                 }
                 else {
-- 
1.6.2.5

Attachment: signature.asc
Description: OpenPGP digital signature

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

Reply via email to