commit 701e10aba853afb4cd1ab4a1e4e3dd64ea96e907 Author: David Vossel Date: Thu Oct 10 17:22:29 2013 -0500 Low: crmd: Cache rsc_info retrieved from lrmd and pacemaker_remoted (cherry picked from commit d65b2703d2107665365b0db06cff67386981e346) diff --git a/crmd/crmd_lrm.h b/crmd/crmd_lrm.h index d0ca58c..2239638 100644 --- a/crmd/crmd_lrm.h +++ b/crmd/crmd_lrm.h @@ -56,6 +56,8 @@ typedef struct lrm_state_s { GHashTable *pending_ops; GHashTable *deletion_ops; + GHashTable *rsc_info_cache; + int num_lrm_register_fails; } lrm_state_t; diff --git a/crmd/lrm_state.c b/crmd/lrm_state.c index b1b1b7f..57eb87e 100644 --- a/crmd/lrm_state.c +++ b/crmd/lrm_state.c @@ -60,6 +60,13 @@ history_cache_destroy(gpointer data) free(entry->id); free(entry); } +static void +free_rsc_info(gpointer value) +{ + lrmd_rsc_info_t *rsc_info = value; + + lrmd_free_rsc_info(rsc_info); +} static void free_deletion_op(gpointer value) @@ -99,6 +106,9 @@ lrm_state_create(const char *node_name) state->node_name = strdup(node_name); + state->rsc_info_cache = g_hash_table_new_full(crm_str_hash, + g_str_equal, NULL, free_rsc_info); + state->deletion_ops = g_hash_table_new_full(crm_str_hash, g_str_equal, g_hash_destroy_str, free_deletion_op); @@ -146,6 +156,10 @@ internal_lrm_state_destroy(gpointer data) remote_ra_cleanup(lrm_state); lrmd_api_delete(lrm_state->conn); + if (lrm_state->rsc_info_cache) { + crm_trace("Destroying rsc info cache with %d members", g_hash_table_size(lrm_state->rsc_info_cache)); + g_hash_table_destroy(lrm_state->rsc_info_cache); + } if (lrm_state->resource_history) { crm_trace("Destroying history op cache with %d members", g_hash_table_size(lrm_state->resource_history)); g_hash_table_destroy(lrm_state->resource_history); @@ -181,6 +195,11 @@ lrm_state_reset_tables(lrm_state_t * lrm_state) g_hash_table_size(lrm_state->pending_ops)); g_hash_table_remove_all(lrm_state->pending_ops); } + if (lrm_state->rsc_info_cache) { + crm_trace("Re-setting rsc info cache with %d members", + g_hash_table_size(lrm_state->rsc_info_cache)); + g_hash_table_remove_all(lrm_state->rsc_info_cache); + } } static void @@ -590,16 +609,28 @@ lrm_state_cancel(lrm_state_t * lrm_state, const char *rsc_id, const char *action lrmd_rsc_info_t * lrm_state_get_rsc_info(lrm_state_t * lrm_state, const char *rsc_id, enum lrmd_call_options options) { + lrmd_rsc_info_t *rsc = NULL; + if (!lrm_state->conn) { return NULL; } - /* optimize this... this function is a synced round trip from client to daemon. - * It should be possible to cache the resource info in the lrmd client to prevent this. */ if (is_remote_lrmd_ra(NULL, NULL, rsc_id)) { return remote_ra_get_rsc_info(lrm_state, rsc_id); } - return ((lrmd_t *) lrm_state->conn)->cmds->get_rsc_info(lrm_state->conn, rsc_id, options); + rsc = g_hash_table_lookup(lrm_state->rsc_info_cache, rsc_id); + if (rsc == NULL) { + /* only contact the lrmd if we don't already have a cached rsc info */ + rsc = ((lrmd_t *) lrm_state->conn)->cmds->get_rsc_info(lrm_state->conn, rsc_id, options); + if (rsc == NULL) { + return NULL; + } + /* cache the result */ + g_hash_table_insert(lrm_state->rsc_info_cache, rsc->id, rsc); + } + + return lrmd_copy_rsc_info(rsc); + } int @@ -667,5 +698,7 @@ lrm_state_unregister_rsc(lrm_state_t * lrm_state, return pcmk_ok; } + g_hash_table_remove(lrm_state->rsc_info_cache, rsc_id); + return ((lrmd_t *) lrm_state->conn)->cmds->unregister_rsc(lrm_state->conn, rsc_id, options); }