[Date Prev][Date Next]
[Chronological]
[Thread]
[Top]
Re: (ITS#5487) syncprov_findbase must search the backend from the syncrepl search
rein@OpenLDAP.org wrote:
> Full_Name: Rein Tollevik
> Version: CVS head
> OS:
> URL: ftp://ftp.openldap.org/incoming/
> Submission from: (NULL) (81.93.160.250)
> Submitted by: rein
>
>
> syncprov_findbase() must search the backend saved with the syncrepl operation,
> not the one from the operation passed as argument. The backend in the op
> argument can be a subordinate database, in which case the search for the base in
> the superior database will fail, and syncrepl consumers will be force to do a an
> unneccessary full refresh of the database.
OK.
> The patch at the end should fix
> this. Note that both fop.o_bd and fop.o_bd->bd_info can be changed by the
> overlay_op_walk() call, which is the reason for the long pointer traversal to
> find the correct bd_info to save and restore.
But the overlay_op_walk call is only appropriate when the DB to be searched is
the current database, and the current DB is an overlay DB structure.
Your patch causes fc->fss->s_op->o_bd's bd_info pointer to change, which is
not allowed. That's in the original backendDB, which must be treated as
read-only since multiple threads may be accessing it. The correct approach
here is to use a new local backendDB variable, copy the s_op->o_bd into it,
and then just do a regular be_search invocation instead of using overlay_op_walk.
But, this patch must not take effect on the first call to syncprov_findbase
(which occurred in syncprov_op_search) - in that case, the current code is
correct. So, you need to tweak things based on whether (s_flags &
PS_IS_REFRESHING) is true or not - if true, this is the first search, and it
should use the original code. Else, it must use be_search.
> Rein Tollevik
> Basefarm AS
>
> diff -u OpenLDAP/servers/slapd/overlays/syncprov.c:1.1.1.18
> OpenLDAP/servers/slapd/overlays/syncprov.c:1.19
> --- OpenLDAP/servers/slapd/overlays/syncprov.c:1.1.1.18 Wed Apr 30 13:17:58
> 2008
> +++ OpenLDAP/servers/slapd/overlays/syncprov.c Wed Apr 30 19:34:00 2008
> @@ -404,7 +404,7 @@
> slap_callback cb = {0};
> Operation fop;
> SlapReply frs = { REP_RESULT };
> - BackendInfo *bi;
> + BackendInfo *bi = fc->fss->s_op->o_bd->bd_info;
> int rc;
>
> fc->fss->s_flags ^= PS_FIND_BASE;
> @@ -413,10 +413,8 @@
> fop = *fc->fss->s_op;
>
> fop.o_hdr = op->o_hdr;
> - fop.o_bd = op->o_bd;
> fop.o_time = op->o_time;
> fop.o_tincr = op->o_tincr;
> - bi = op->o_bd->bd_info;
>
> cb.sc_response = findbase_cb;
> cb.sc_private = fc;
> @@ -435,7 +433,7 @@
> fop.ors_filterstr = generic_filterstr;
>
> rc = overlay_op_walk(&fop,&frs, op_search, on->on_info, on );
> - op->o_bd->bd_info = bi;
> + fc->fss->s_op->o_bd->bd_info = bi;
> } else {
> ldap_pvt_thread_mutex_unlock(&fc->fss->s_mutex );
> fc->fbase = 1;
>
>
>
--
-- Howard Chu
CTO, Symas Corp. http://www.symas.com
Director, Highland Sun http://highlandsun.com/hyc/
Chief Architect, OpenLDAP http://www.openldap.org/project/