summaryrefslogtreecommitdiffstats
path: root/src/back-shr.c
diff options
context:
space:
mode:
authorNalin Dahyabhai <nalin@redhat.com>2012-01-17 14:13:53 -0500
committerNalin Dahyabhai <nalin@redhat.com>2012-01-17 14:13:53 -0500
commitf1375d0b5a56a583db25540ecd75585ea351d504 (patch)
tree1442c19a046da5428a4ecbe81de2f591119128ba /src/back-shr.c
parentd9d9fa5a47e1ff5faf8cffe34a392895a9465717 (diff)
downloadslapi-nis-f1375d0b5a56a583db25540ecd75585ea351d504.tar.gz
slapi-nis-f1375d0b5a56a583db25540ecd75585ea351d504.tar.xz
slapi-nis-f1375d0b5a56a583db25540ecd75585ea351d504.zip
- computer our own mods list for modify operations, to not get suckered
into doing completely unnecessary work for other plugins that modify an entry to give it the same contents that it already has
Diffstat (limited to 'src/back-shr.c')
-rw-r--r--src/back-shr.c62
1 files changed, 50 insertions, 12 deletions
diff --git a/src/back-shr.c b/src/back-shr.c
index 6a874a3..29463a5 100644
--- a/src/back-shr.c
+++ b/src/back-shr.c
@@ -852,6 +852,7 @@ struct backend_shr_update_references_cbdata {
Slapi_PBlock *pb;
Slapi_Entry *e;
LDAPMod **mods;
+ char *modlist;
};
static bool_t
@@ -925,7 +926,6 @@ backend_shr_update_references_cb(const char *group, const char *set,
}
}
if (cbdata->mods[i] == NULL) {
- modlist = backend_shr_mods_as_string(cbdata->mods);
slapi_log_error(SLAPI_LOG_PLUGIN,
state->plugin_desc->spd_id,
"no interesting reference-based "
@@ -934,10 +934,20 @@ backend_shr_update_references_cb(const char *group, const char *set,
set_data->group,
set_data->set,
slapi_entry_get_ndn(cbdata->e),
- modlist,
+ cbdata->modlist,
backend_shr_get_rel_attr_list(set_data));
- free(modlist);
return TRUE;
+ } else {
+ slapi_log_error(SLAPI_LOG_PLUGIN,
+ state->plugin_desc->spd_id,
+ "interesting reference-based "
+ "changes for \"%s\"/\"%s\" "
+ "made in \"%s\" (%s in %s)\n",
+ set_data->group,
+ set_data->set,
+ slapi_entry_get_ndn(cbdata->e),
+ cbdata->modlist,
+ backend_shr_get_rel_attr_list(set_data));
}
}
@@ -1454,16 +1464,18 @@ backend_shr_update_references_cb(const char *group, const char *set,
return TRUE;
}
-void
+static void
backend_shr_update_references(struct plugin_state *state,
Slapi_PBlock *pb,
Slapi_Entry *e,
- LDAPMod **mods)
+ LDAPMod **mods,
+ char *modlist)
{
struct backend_shr_update_references_cbdata cbdata;
cbdata.pb = pb;
cbdata.e = e;
cbdata.mods = mods;
+ cbdata.modlist = modlist ? modlist : backend_shr_mods_as_string(mods);
if (!map_data_foreach_map(state, NULL,
backend_shr_update_references_cb, &cbdata)) {
slapi_log_error(SLAPI_LOG_PLUGIN,
@@ -1471,6 +1483,9 @@ backend_shr_update_references(struct plugin_state *state,
"error updating references for \"%s\"\n",
slapi_entry_get_ndn(cbdata.e));
}
+ if (modlist != cbdata.modlist) {
+ free(cbdata.modlist);
+ }
}
/* Add any map entries which correspond to a directory server entry in this
@@ -1591,7 +1606,7 @@ backend_shr_add_cb(Slapi_PBlock *pb)
}
/* Update entries in maps which are affected by this entry. */
- backend_shr_update_references(cbdata.state, pb, cbdata.e, NULL);
+ backend_shr_update_references(cbdata.state, pb, cbdata.e, NULL, NULL);
map_unlock();
wrap_dec_call_level();
@@ -1607,6 +1622,7 @@ struct backend_shr_modify_entry_cbdata {
struct plugin_state *state;
Slapi_PBlock *pb;
LDAPMod **mods;
+ Slapi_Mods *real_mods;
Slapi_Entry *e_pre, *e_post;
char *ndn;
char *modlist;
@@ -1619,6 +1635,7 @@ backend_shr_modify_entry_cb(const char *group, const char *set, bool_t flag,
struct backend_shr_set_data *set_data;
struct backend_shr_modify_entry_cbdata *cbdata;
int i, j;
+ LDAPMod *mod;
set_data = backend_data;
cbdata = cbdata_ptr;
@@ -1641,9 +1658,9 @@ backend_shr_modify_entry_cb(const char *group, const char *set, bool_t flag,
}
if (set_data->skip_uninteresting_updates &&
(cbdata->mods != NULL) && (set_data->rel_attrs != NULL)) {
- for (i = 0; cbdata->mods[i] != NULL; i++) {
+ for (i = 0; (mod = cbdata->mods[i]) != NULL; i++) {
for (j = 0; set_data->rel_attrs[j] != NULL; j++) {
- if (slapi_attr_types_equivalent(cbdata->mods[i]->mod_type,
+ if (slapi_attr_types_equivalent(mod->mod_type,
set_data->rel_attrs[j])) {
break;
}
@@ -1652,7 +1669,7 @@ backend_shr_modify_entry_cb(const char *group, const char *set, bool_t flag,
break;
}
}
- if (cbdata->mods[i] == NULL) {
+ if (mod == NULL) {
slapi_log_error(SLAPI_LOG_PLUGIN,
cbdata->state->plugin_desc->spd_id,
"no interesting changes for "
@@ -1664,6 +1681,17 @@ backend_shr_modify_entry_cb(const char *group, const char *set, bool_t flag,
cbdata->modlist,
backend_shr_get_rel_attr_list(set_data));
return TRUE;
+ } else {
+ slapi_log_error(SLAPI_LOG_PLUGIN,
+ cbdata->state->plugin_desc->spd_id,
+ "interesting changes for "
+ "\"%s\"/\"%s\" made in (\"%s\") "
+ "(%s in %s)\n",
+ set_data->group,
+ set_data->set,
+ cbdata->ndn,
+ cbdata->modlist,
+ backend_shr_get_rel_attr_list(set_data));
}
}
/* If the entry used to match the map, remove it. */
@@ -1753,6 +1781,11 @@ backend_shr_modify_cb(Slapi_PBlock *pb)
"post-modify entry is NULL\n");
return 0;
}
+ /* Don't do a lot of work for other plugins which initiated a no-op
+ * modify. */
+ cbdata.real_mods = slapi_mods_new();
+ slapi_entry_diff(cbdata.real_mods, cbdata.e_pre, cbdata.e_post, 0);
+ cbdata.mods = slapi_mods_get_ldapmods_byref(cbdata.real_mods);
cbdata.ndn = slapi_entry_get_ndn(cbdata.e_pre);
cbdata.modlist = backend_shr_mods_as_string(cbdata.mods);
/* Modify map entries which corresponded to this directory server
@@ -1768,10 +1801,15 @@ backend_shr_modify_cb(Slapi_PBlock *pb)
}
/* Update entries which need to be updated in case they are no longer
* affected by this entry. */
- backend_shr_update_references(cbdata.state, pb, cbdata.e_pre, cbdata.mods);
+ backend_shr_update_references(cbdata.state, pb, cbdata.e_pre,
+ cbdata.mods, cbdata.modlist);
/* Update entries which need to be updated in case they are now
* affected by this entry. */
- backend_shr_update_references(cbdata.state, pb, cbdata.e_post, cbdata.mods);
+ backend_shr_update_references(cbdata.state, pb, cbdata.e_post,
+ cbdata.mods, cbdata.modlist);
+ /* Done with the "real" mods. */
+ slapi_mods_free(&cbdata.real_mods);
+ slapi_pblock_get(pb, SLAPI_MODIFY_MODS, &cbdata.mods);
/* If it's a map configuration entry, reconfigure, clear, and
* repopulate the map. */
if (backend_shr_entry_is_a_set(cbdata.state, pb, cbdata.e_pre)) {
@@ -2062,7 +2100,7 @@ backend_shr_delete_cb(Slapi_PBlock *pb)
}
/* Update entries which need to be updated in case they are no longer
* affected by this entry. */
- backend_shr_update_references(cbdata.state, pb, cbdata.e, NULL);
+ backend_shr_update_references(cbdata.state, pb, cbdata.e, NULL, NULL);
map_unlock();
wrap_dec_call_level();
return 0;