From 86cc92be7b84f4583bf9ed616848ef178f73d475 Mon Sep 17 00:00:00 2001
From: Rich Megginson <rmeggins@redhat.com>
Date: Wed, 25 Sep 2013 08:51:12 -0600
Subject: [PATCH 10/28] Ticket #47504 idlistscanlimit per index/type/value
https://fedorahosted.org/389/ticket/47504
Reviewed by: nhosoi (Thanks!)
Branch: rhel-7.0
Fix Description: This patch broke replication. The problem is that we cannot
compare the allidslimit to 0 unless the value is explicitly set by
index_get_allids. The fix is to only return ALLIDS if the allidslimit was
explicitly set to 0 by index_get_allids.
Platforms tested: RHEL6 x86_64
Flag Day: no
Doc impact: no
(cherry picked from commit 058d01d7479204a2507dab822cd81e32c37be862)
(cherry picked from commit e5405e627439ccaf370d90c42e65c0a987e33e73)
---
ldap/servers/slapd/back-ldbm/index.c | 20 ++++++++++++--------
1 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/ldap/servers/slapd/back-ldbm/index.c b/ldap/servers/slapd/back-ldbm/index.c
index d5ca16a..f4de2fa 100644
--- a/ldap/servers/slapd/back-ldbm/index.c
+++ b/ldap/servers/slapd/back-ldbm/index.c
@@ -52,7 +52,7 @@
static const char *errmsg = "database index operation failed";
static int is_indexed (const char* indextype, int indexmask, char** index_rules);
-static int index_get_allids( int default_allids, const char *indextype, struct attrinfo *ai, const struct berval *val, unsigned int flags );
+static int index_get_allids( int *allids, const char *indextype, struct attrinfo *ai, const struct berval *val, unsigned int flags );
static Slapi_Value **
valuearray_minus_valuearray(
@@ -985,8 +985,11 @@ index_read_ext_allids(
slapi_pblock_get(pb, SLAPI_SEARCH_IS_AND, &is_and);
}
ai_flags = is_and ? INDEX_ALLIDS_FLAG_AND : 0;
- allidslimit = index_get_allids( allidslimit, indextype, ai, val, ai_flags );
- if (allidslimit == 0) {
+ /* the caller can pass in a value of 0 - just ignore those - but if the index
+ * config sets the allidslimit to 0, this means to skip the index
+ */
+ if (index_get_allids( &allidslimit, indextype, ai, val, ai_flags ) &&
+ (allidslimit == 0)) {
idl = idl_allids( be );
if (unindexed != NULL) *unindexed = 1;
LDAPDebug1Arg( LDAP_DEBUG_BACKLDBM, "<= index_read %lu candidates "
@@ -2400,9 +2403,9 @@ valuearray_minus_valuearray(
#define AI_HAS_TYPE 0x02
#define AI_HAS_FLAG 0x01
static int
-index_get_allids( int default_allids, const char *indextype, struct attrinfo *ai, const struct berval *val, unsigned int flags )
+index_get_allids( int *allids, const char *indextype, struct attrinfo *ai, const struct berval *val, unsigned int flags )
{
- int allids = default_allids;
+ int found = 0;
Slapi_Value sval;
struct index_idlistsizeinfo *iter; /* iterator */
int cookie = 0;
@@ -2410,7 +2413,7 @@ index_get_allids( int default_allids, const char *indextype, struct attrinfo *ai
struct index_idlistsizeinfo *best_match = NULL;
if (!ai->ai_idlistinfo) {
- return allids;
+ return found;
}
if (val) { /* val should already be a Slapi_Value, but some paths do not use Slapi_Value */
@@ -2454,9 +2457,10 @@ index_get_allids( int default_allids, const char *indextype, struct attrinfo *ai
}
if (best_match) {
- allids = best_match->ai_idlistsizelimit;
+ *allids = best_match->ai_idlistsizelimit;
+ found = 1; /* found a match */
}
- return allids;
+ return found;
}
--
1.7.1