Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
Tero Saarni
OpenLDAP
Commits
12c52148
Commit
12c52148
authored
Jan 04, 2011
by
Quanah Gibson-Mount
Browse files
ITS#6716
parent
f6ae2d96
Changes
2
Hide whitespace changes
Inline
Side-by-side
CHANGES
View file @
12c52148
...
...
@@ -68,6 +68,7 @@ OpenLDAP 2.4.24 Engineering
Fixed slapo-syncprov active mod race (ITS#6709)
Fixed slapo-syncprov to refresh if context is dirty (ITS#6710)
Fixed slapo-syncprov CSN updates to all replicas (ITS#6718)
Fixed slapo-syncprov sessionlog ordering (ITS#6716)
Fixed contrib/autogroup LDAP URI with attribute filter (ITS#6536)
Fixed contrib/nssov to only close socket on shutdown (ITS#6676)
Fixed contrib/nssov multi platform support (ITS#6604)
...
...
servers/slapd/overlays/syncprov.c
View file @
12c52148
...
...
@@ -113,7 +113,6 @@ typedef struct slog_entry {
}
slog_entry
;
typedef
struct
sessionlog
{
struct
berval
sl_mincsn
;
int
sl_num
;
int
sl_size
;
slog_entry
*
sl_head
;
...
...
@@ -1500,6 +1499,23 @@ syncprov_add_slog( Operation *op )
sl
=
si
->
si_logs
;
{
if
(
BER_BVISEMPTY
(
&
op
->
o_csn
)
)
{
/* During the syncrepl refresh phase we can receive operations
* without a csn. We cannot reliably determine the consumers
* state with respect to such operations, so we ignore them and
* wipe out anything in the log if we see them.
*/
ldap_pvt_thread_mutex_lock
(
&
sl
->
sl_mutex
);
while
(
se
=
sl
->
sl_head
)
{
sl
->
sl_head
=
se
->
se_next
;
ch_free
(
se
);
}
sl
->
sl_tail
=
NULL
;
sl
->
sl_num
=
0
;
ldap_pvt_thread_mutex_unlock
(
&
sl
->
sl_mutex
);
return
;
}
/* Allocate a record. UUIDs are not NUL-terminated. */
se
=
ch_malloc
(
sizeof
(
slog_entry
)
+
opc
->
suuid
.
bv_len
+
op
->
o_csn
.
bv_len
+
1
);
...
...
@@ -1518,17 +1534,29 @@ syncprov_add_slog( Operation *op )
ldap_pvt_thread_mutex_lock
(
&
sl
->
sl_mutex
);
if
(
sl
->
sl_head
)
{
sl
->
sl_tail
->
se_next
=
se
;
/* Keep the list in csn order. */
if
(
ber_bvcmp
(
&
sl
->
sl_tail
->
se_csn
,
&
se
->
se_csn
)
<=
0
)
{
sl
->
sl_tail
->
se_next
=
se
;
sl
->
sl_tail
=
se
;
}
else
{
slog_entry
**
sep
;
for
(
sep
=
&
sl
->
sl_head
;
*
sep
;
sep
=
&
(
*
sep
)
->
se_next
)
{
if
(
ber_bvcmp
(
&
se
->
se_csn
,
&
(
*
sep
)
->
se_csn
)
<
0
)
{
se
->
se_next
=
*
sep
;
*
sep
=
se
;
break
;
}
}
}
}
else
{
sl
->
sl_head
=
se
;
sl
->
sl_tail
=
se
;
}
sl
->
sl_tail
=
se
;
sl
->
sl_num
++
;
while
(
sl
->
sl_num
>
sl
->
sl_size
)
{
se
=
sl
->
sl_head
;
sl
->
sl_head
=
se
->
se_next
;
strcpy
(
sl
->
sl_mincsn
.
bv_val
,
se
->
se_csn
.
bv_val
);
sl
->
sl_mincsn
.
bv_len
=
se
->
se_csn
.
bv_len
;
ch_free
(
se
);
sl
->
sl_num
--
;
}
...
...
@@ -2565,7 +2593,7 @@ no_change: if ( !(op->o_sync_mode & SLAP_SYNC_PERSIST) ) {
/* Are there any log entries, and is the consumer state
* present in the session log?
*/
if
(
sl
->
sl_num
>
0
&&
ber_bvcmp
(
&
mincsn
,
&
sl
->
sl_
min
csn
)
>=
0
)
{
if
(
sl
->
sl_num
>
0
&&
ber_bvcmp
(
&
mincsn
,
&
sl
->
sl_
head
->
se_
csn
)
>=
0
)
{
do_present
=
0
;
/* mutex is unlocked in playlog */
syncprov_playlog
(
op
,
rs
,
sl
,
srs
,
ctxcsn
,
numcsns
,
sids
);
...
...
@@ -2907,9 +2935,7 @@ sp_cf_gen(ConfigArgs *c)
}
sl
=
si
->
si_logs
;
if
(
!
sl
)
{
sl
=
ch_malloc
(
sizeof
(
sessionlog
)
+
LDAP_PVT_CSNSTR_BUFSIZE
);
sl
->
sl_mincsn
.
bv_val
=
(
char
*
)(
sl
+
1
);
sl
->
sl_mincsn
.
bv_len
=
0
;
sl
=
ch_malloc
(
sizeof
(
sessionlog
)
);
sl
->
sl_num
=
0
;
sl
->
sl_head
=
sl
->
sl_tail
=
NULL
;
ldap_pvt_thread_mutex_init
(
&
sl
->
sl_mutex
);
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment