diff options
author | Stephen Gallagher <sgallagh@redhat.com> | 2009-11-19 16:37:51 -0500 |
---|---|---|
committer | Stephen Gallagher <sgallagh@redhat.com> | 2009-11-23 12:46:30 -0500 |
commit | 64e5787639836a49ddc589eda65be454c4bdff58 (patch) | |
tree | 75fdc5923cd6854547be1cdd62110a0bd602aaab /server/providers | |
parent | 23341562c1cd4baf46cbc4eacaa09d6b6cb00e82 (diff) | |
download | sssd-64e5787639836a49ddc589eda65be454c4bdff58.tar.gz sssd-64e5787639836a49ddc589eda65be454c4bdff58.tar.bz2 sssd-64e5787639836a49ddc589eda65be454c4bdff58.zip |
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).
Diffstat (limited to 'server/providers')
-rw-r--r-- | server/providers/data_provider.h | 1 | ||||
-rw-r--r-- | server/providers/data_provider_be.c | 113 |
2 files changed, 77 insertions, 37 deletions
diff --git a/server/providers/data_provider.h b/server/providers/data_provider.h index 33aed3f2..c5246623 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 b5d24600..02d5a0d1 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; } |