<html>
  <head>
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    Thanks everyone for your feedback!<br>
    <br>
    Ok I have written an initial fix, and here is how it works and what
    I am seeing...<br>
    <br>
    [1]  An update comes it and we update the local RUV.<br>
    [2]  We check this update against the fractional/stripped attrs in
    each agmt.<br>
    [3]  If this update does replicate to at least one agmt, we write a
    new attribute to the local ruv (currently call "nsds50replruv" - we
    can improve the names later).  If it doesn't replicate to any
    replicas then we don't update the new ruv attribute.  This all
    happens at the same time in write_changelog_and_ruv().  So there is
    no delay or copying of useless ruv info, and we write to the local
    RUV instead of a new RUV in cn=config(which I had originally
    proposed).<br>
    <br>
    [4]  Here we made an update that is stripped by fractional
    replication:<br>
    <br>
    Master A:<br>
    <br>
     ldapsearch -h localhost -D cn=dm -w password -b "dc=example,dc=com"
    -xLLL 
    '(&amp;(nsuniqueid=ffffffff-ffffffff-ffffffff-ffffffff)(objectclass=nstombstone))'
    nsds50ruv nsds50replruv<br>
    dn: cn=replica,cn=dc\3Dexample\2Cdc\3Dcom,cn=mapping tree,cn=config<br>
    nsds50ruv: {replica 1 <a class="moz-txt-link-freetext" href="ldap://localhost.localdomain:389">ldap://localhost.localdomain:389</a>}
    52583d80000000010000 52600339000000010000<br>
    nsds50replruv: {replica 1 <a class="moz-txt-link-freetext" href="ldap://localhost.localdomain:389">ldap://localhost.localdomain:389</a>}
    52583d80000000010000 5260030d000000010000<br>
    ...<br>
    <br>
    Master B<br>
    <br>
     ldapsearch -h localhost -D cn=dm -w password -b "dc=example,dc=com"
    -xLLL -p 22222 
    '(&amp;(nsuniqueid=ffffffff-ffffffff-ffffffff-ffffffff)(objectclass=nstombstone))'
    nsds50ruv nsds50replruv<br>
    dn: cn=replica,cn=dc\3Dexample\2Cdc\3Dcom,cn=mapping tree,cn=config<br>
    nsds50ruv: {replica 1 <a class="moz-txt-link-freetext" href="ldap://localhost.localdomain:389">ldap://localhost.localdomain:389</a>}
    52583d80000000010000 5260030d000000010000<br>
    nsds50replruv: {replica 1 <a class="moz-txt-link-freetext" href="ldap://localhost.localdomain:389">ldap://localhost.localdomain:389</a>}
    52583d80000000010000 5260030d000000010000<br>
    ...<br>
    <br>
    <br>
    [5]  If we look at the "fractional" ruv (nsds50replruv) on Master A,
    it does correctly line up with the ruv on master B(nsds50ruv).<br>
    [6]  Then we make an update that does replicate, and now all the
    ruv's line up.<br>
    <br>
    Master A<br>
    <br>
    ldapsearch -h localhost -D cn=dm -w password -b "dc=example,dc=com"
    -xLLL 
    '(&amp;(nsuniqueid=ffffffff-ffffffff-ffffffff-ffffffff)(objectclass=nstombstone))'
    nsds50ruv nsds50replruv<br>
    dn: cn=replica,cn=dc\3Dexample\2Cdc\3Dcom,cn=mapping tree,cn=config<br>
    nsds50ruv: {replica 1 <a class="moz-txt-link-freetext" href="ldap://localhost.localdomain:389">ldap://localhost.localdomain:389</a>}
    52583d80000000010000 52600790000000010000<br>
    nsds50replruv: {replica 1 <a class="moz-txt-link-freetext" href="ldap://localhost.localdomain:389">ldap://localhost.localdomain:389</a>}
    52583d80000000010000 52600790000000010000<br>
    <br>
    Master B<br>
    <br>
    ldapsearch -h localhost -D cn=dm -w password -b "dc=example,dc=com"
    -xLLL -p 22222 
    '(&amp;(nsuniqueid=ffffffff-ffffffff-ffffffff-ffffffff)(objectclass=nstombstone))'
    nsds50ruv nsds50replruv<br>
    dn: cn=replica,cn=dc\3Dexample\2Cdc\3Dcom,cn=mapping tree,cn=config<br>
    nsds50ruv: {replica 1 <a class="moz-txt-link-freetext" href="ldap://localhost.localdomain:389">ldap://localhost.localdomain:389</a>}
    52583d80000000010000 52600790000000010000<br>
    nsds50replruv: {replica 1 <a class="moz-txt-link-freetext" href="ldap://localhost.localdomain:389">ldap://localhost.localdomain:389</a>}
    52583d80000000010000 52600790000000010000<br>
    <br>
    There are still the same problems with fix, as I mentioned before,
    except we're not updating the dse config.  Now, I am concerned about
    the performance hit of checking to see if a mod gets "replicated". 
    <br>
    <br>
    As for the "sync" question, this fix does change how that behaves,
    or how repl-monitor already works.  It's either behind(by a certain
    amount of time), or in sync.  I'm not trying to improve the current
    repl status model.<br>
    <br>
    Anyway, I just wanted to see if I could get this working.  Comments
    welcome.<br>
    <br>
    Thanks again,<br>
    Mark<br>
    <br>
    <div class="moz-cite-prefix">On 10/17/2013 05:44 AM, thierry bordaz
      wrote:<br>
    </div>
    <blockquote cite="mid:525FB16E.9050404@redhat.com" type="cite">
      <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
      <div class="moz-cite-prefix">On 10/17/2013 11:06 AM, Ludwig
        Krispenz wrote:<br>
      </div>
      <blockquote cite="mid:525FA882.1060002@redhat.com" type="cite">
        <meta content="text/html; charset=UTF-8"
          http-equiv="Content-Type">
        <br>
        <div class="moz-cite-prefix">On 10/17/2013 10:56 AM, thierry
          bordaz wrote:<br>
        </div>
        <blockquote cite="mid:525FA63D.9020204@redhat.com" type="cite">
          <meta content="text/html; charset=UTF-8"
            http-equiv="Content-Type">
          <div class="moz-cite-prefix">On 10/17/2013 10:49 AM, Ludwig
            Krispenz wrote:<br>
          </div>
          <blockquote cite="mid:525FA4B3.6090209@redhat.com" type="cite">
            <meta content="text/html; charset=UTF-8"
              http-equiv="Content-Type">
            <br>
            <div class="moz-cite-prefix">On 10/17/2013 10:15 AM, thierry
              bordaz wrote:<br>
            </div>
            <blockquote cite="mid:525F9C8A.4060605@redhat.com"
              type="cite">
              <meta content="text/html; charset=UTF-8"
                http-equiv="Content-Type">
              <div class="moz-cite-prefix">On 10/16/2013 05:41 PM,
                Ludwig Krispenz wrote:<br>
              </div>
              <blockquote cite="mid:525EB3AE.2050609@redhat.com"
                type="cite">
                <meta content="text/html; charset=UTF-8"
                  http-equiv="Content-Type">
                <br>
                <div class="moz-cite-prefix">On 10/16/2013 05:28 PM,
                  Mark Reynolds wrote:<br>
                </div>
                <blockquote cite="mid:525EB0B9.8020901@redhat.com"
                  type="cite">
                  <meta content="text/html; charset=UTF-8"
                    http-equiv="Content-Type">
                  <br>
                  <div class="moz-cite-prefix">On 10/16/2013 11:05 AM,
                    Ludwig Krispenz wrote:<br>
                  </div>
                  <blockquote cite="mid:525EAB4D.80308@redhat.com"
                    type="cite">
                    <meta content="text/html; charset=UTF-8"
                      http-equiv="Content-Type">
                    <br>
                    <div class="moz-cite-prefix">On 10/15/2013 10:41 PM,
                      Mark Reynolds wrote:<br>
                    </div>
                    <blockquote cite="mid:525DA868.6040003@redhat.com"
                      type="cite">
                      <meta http-equiv="content-type"
                        content="text/html; charset=UTF-8">
                      <div class="moz-text-flowed" style="font-family:
                        -moz-fixed; font-size: 12px;" lang="x-western"><a
                          moz-do-not-send="true"
                          class="moz-txt-link-freetext"
                          href="https://fedorahosted.org/389/ticket/47368">https://fedorahosted.org/389/ticket/47368</a>
                        <br>
                        <br>
                        So we run into issues when trying to figure out
                        if replicas are in synch(if those replicas use
                        fractional replication and "strip mods").  What
                        happens is that an update is made on master A,
                        but due to fractional replication there is no
                        update made to any replicas. So if you look at
                        the ruv in the tombstone entry on each server,
                        it would appear they are out of synch.  So using
                        the ruv in the db tombstone is no longer
                        accurate when using fractional replication. <br>
                        <br>
                        I'm proposing a new ruv to be stored in the
                        backend replica entry: e.g.
                        cn=replica,cn="dc=example,dc=com",cn=mapping
                        tree,cn=config. I'm calling this the "replicated
                        ruv".  So whenever we actually send an update to
                        a replica, this ruv will get updated.  </div>
                    </blockquote>
                    I don't see how this will help, you have an
                    additional info on waht has been replicated (which
                    is available on the consumer as well) and you have a
                    max csn, but you don't know if there are outstanding
                    fractional changes to be sent.<br>
                  </blockquote>
                  Well you will know on master A what operations get
                  replicated(this updates the new ruv before sending any
                  changes), and you can use this ruv to compare against
                  the other master B's ruv(in its replication
                  agreement).   Maybe I am missing your point?  </blockquote>
                MY point is that the question is, what is NOT yet
                replicated. Without fractional replication you have
                states of the ruv on all servers, and if ruv(A) &gt;
                ruv(B) you know there are updates missing on B. With
                fractional, if (ruv(A) &gt; ruv(B) this might be ok or
                not. If you keep an additional ruv on A when sending
                updates to be, you can only record what ws sent or
                attempted to send, but not what still has to be sent<br>
              </blockquote>
              <br>
              I agree with you Ludwig, but unless I missed something
              would not be enough to know that the replica B is late or
              in sync ?<br>
              <br>
              For example, we have updates U1 U2 U3 and U4. U3 should be
              skipped by fractional replication.<br>
              <br>
              replica RUV (tombstone) on master_A contains U4 and
              master_B replica RUV contains U1.<br>
              Let's assume that as initial value of the "replicated ruv"
              on master_A we have U1.<br>
              Starting a replication session, master_A should send U2
              and update the "replicated ruv" to U2.<br>
              If the update is successfully applied on master_B,
              master_B replica ruv is U2 and monitoring the two ruv
              shoud show they are in sync.<br>
            </blockquote>
            They are not, since U4 is not yet replicated, in master_A
            you see the "normal" ruv as U4 and the "replicated" ruv as
            U2, but you don't know how many changes are between U2 and
            U4 an if any of them should be replicated, the replicated
            ruv is more or less a local copy of the remote ruv<br>
          </blockquote>
          <br>
          Yes I agree they are not this is a transient status. Transient
          because the RA will continue going through the changelog until
          it hits U4. At this point it will write U4 in the "replicated
          RUV" and until master_B will apply U4 both server will appear
          out of sync.<br>
          My understanding is that this "replicated RUV" only says it is
          in sync or not, but does not address how far a server is out
          of sync from the other (how many updates are missing). When
          you say it is more or less a copy, it is exactly what it is.
          If it is a copy =&gt; in sync, if it different =&gt; out of
          sync.<br>
        </blockquote>
        maybe we need to define what "in sync" means. For me in sync
        means both servers have the same set of updates applied.<br>
        <br>
        Forget fractional for a moment, if we have standard replication
        and master A is at U4 and master B is at U2, we say they are not
        in sync - or not ? You could keep a replicated ruv for thos as
        well, but this wouldn't change things.<br>
      </blockquote>
      <br>
      I agree we need to agree of what "in sync" means <span
        class="moz-smiley-s1"><span> :-) </span></span><br>
      <br>
      I would prefer to speak of 'fractional ruv' (in place of
      'replicated ruv') for the new ruv proposed by Mark.<br>
       'replica ruv' being for the traditional ruv (tombstone) used in
      standard replication.<br>
      <br>
      With  'replica ruv' we are in sync when the 'replica ruv' on both
      side have the same value.<br>
      With 'fractional ruv' we are in sync when the 'fractional ruv' on
      the supplier and the 'replica ruv' have the same value.<br>
      <br>
      In fractional replication, we have updates U1, U2, U3 and U4.
      Let's U3 and U4 being skipped by fractional<br>
      Let master_A 'replica ruv' is U4 and master_B 'replica ruv' is U2.
      And no new updates.<br>
      From a standard replication point of view they are out of sync,
      but for fractional they are in sync.<br>
      <br>
      For fractional, how to know that that both masters are in sync.
      With Mark solution 'fractional ruv' shows U2.<br>
      <br>
      Now a new update arrives U5 that is not skipped by fractional. <br>
      master_A 'replicat ruv' is U5 and master_B 'replica ruv' is U2.<br>
      until the replica agreement starts a new replication session,
      'fractional ruv' shows U2. <br>
      The servers are shown 'in sync', because the RA has not yet
      started. <br>
      From my understanding, the solution proposed by Mark has a
      drawback where for a transient period (time to the RA to start its
      jobs, evaluate and send U5, store it into the 'fractional ruv'),
      the servers will appear 'in sync' although they are not. It could
      be an issue with schedule replication but should be transient
      wrong status under normal condition.<br>
      <br>
      <blockquote cite="mid:525FA882.1060002@redhat.com" type="cite">
        <blockquote cite="mid:525FA63D.9020204@redhat.com" type="cite">
          <br>
          <blockquote cite="mid:525FA4B3.6090209@redhat.com" type="cite">
            <blockquote cite="mid:525F9C8A.4060605@redhat.com"
              type="cite"> If the update is not applierd, master_B
              replica ruv stays at U1 and the two ruv will show out of
              sync.<br>
              <br>
              In the first case, we have a transient status of 'in sync'
              because the replica agreement will evaluate U3 then U4
              then send U4 and store it into the "replicated ruv". At
              this point master_A and master_B will appear out of sync
              until master_B will apply U4.<br>
              If U4 was to be skipped by fractional we have master_B ruv
              and Master_A replicated ruv both showing U2 and that is
              correct both servers are in sync.<br>
              <br>
              Mark instead of storing the replicated ruv in the replica,
              would not be possible to store it into the replica
              agreement (one replicated ruv per RA). So that it can
              solve the problem of different fractional replication
              policy ?<br>
              <br>
              <blockquote cite="mid:525EB3AE.2050609@redhat.com"
                type="cite">
                <blockquote cite="mid:525EB0B9.8020901@redhat.com"
                  type="cite">Do you mean changes that have not been
                  read from the changelog yet?  My plan was to update
                  the new ruv in perform_operation() - right after all
                  the "stripping" has been done and there is something
                  to replicate.  We need to have a ruv for replicated
                  operations.<br>
                  <br>
                  I guess there are other scenarios I didn't think of,
                  like if replication is in a backoff state, and valid
                  changes are coming in.  Maybe, we could do test
                  "stripping" earlier in the replication process(when
                  writing to the changelog?), and then update the new
                  ruv there instead of waiting until we try and send the
                  changes.<br>
                  <blockquote cite="mid:525EAB4D.80308@redhat.com"
                    type="cite">
                    <blockquote cite="mid:525DA868.6040003@redhat.com"
                      type="cite">
                      <div class="moz-text-flowed" style="font-family:
                        -moz-fixed; font-size: 12px;" lang="x-western">Since


                        we can not compare this "replicated ruv" to the
                        replicas tombstone ruv, we can instead compare
                        the "replicated ruv" to the ruv in the replica's
                        repl agreement(unless it is a dedicated consumer
                        - here we might be able to still look at the db
                        tombstone ruv to determine the status). <br>
                        <br>
                        Problems with this approach: <br>
                        <br>
                        -  All the servers need to have the same
                        replication configuration(the same fractional
                        replication policy and attribute stripping) to
                        give accurate results. <br>
                        <br>
                        -  If one replica has an agreement that does NOT
                        filter the updates, but has agreements that do
                        filter updates, then we can not correctly
                        determine its synchronization state with the
                        fractional replicas. <br>
                        <br>
                        -  Performance hit from updating another ruv(in
                        cn=config)? <br>
                        <br>
                        <br>
                        Fractional replication simply breaks our
                        monitoring process.  I'm not sure, not without
                        updating the repl protocol, that we can cover
                        all deployment scenarios(mixed fractional repl
                        agmts, etc). However, I "think" this approach
                        would work for most deployments(compared to none
                        at the moment).  For IPA, since they don't use
                        consumers, this approach would work for them. 
                        And finally, all of this would have to be
                        handled by a updated version of repl-monitor.pl.
                        <br>
                        <br>
                        This is just my preliminary idea on how to
                        handle this.  Feedback is welcome!! <br>
                        <br>
                        Thanks in advance, <br>
                        Mark <br>
                        <div class="moz-txt-sig"> <br>
                        </div>
                      </div>
                      <pre class="moz-signature" cols="72">-- 
Mark Reynolds
389 Development Team
Red Hat, Inc
<a moz-do-not-send="true" class="moz-txt-link-abbreviated" href="mailto:mreynolds@redhat.com">mreynolds@redhat.com</a></pre>
                      <br>
                      <fieldset class="mimeAttachmentHeader"></fieldset>
                      <br>
                      <pre wrap="">--
389-devel mailing list
<a moz-do-not-send="true" class="moz-txt-link-abbreviated" href="mailto:389-devel@lists.fedoraproject.org">389-devel@lists.fedoraproject.org</a>
<a moz-do-not-send="true" class="moz-txt-link-freetext" href="https://admin.fedoraproject.org/mailman/listinfo/389-devel">https://admin.fedoraproject.org/mailman/listinfo/389-devel</a></pre>
                    </blockquote>
                    <br>
                    <br>
                    <fieldset class="mimeAttachmentHeader"></fieldset>
                    <br>
                    <pre wrap="">--
389-devel mailing list
<a moz-do-not-send="true" class="moz-txt-link-abbreviated" href="mailto:389-devel@lists.fedoraproject.org">389-devel@lists.fedoraproject.org</a>
<a moz-do-not-send="true" class="moz-txt-link-freetext" href="https://admin.fedoraproject.org/mailman/listinfo/389-devel">https://admin.fedoraproject.org/mailman/listinfo/389-devel</a></pre>
                  </blockquote>
                  <br>
                  <pre class="moz-signature" cols="72">-- 
Mark Reynolds
389 Development Team
Red Hat, Inc
<a moz-do-not-send="true" class="moz-txt-link-abbreviated" href="mailto:mreynolds@redhat.com">mreynolds@redhat.com</a></pre>
                </blockquote>
                <br>
                <br>
                <fieldset class="mimeAttachmentHeader"></fieldset>
                <br>
                <pre wrap="">--
389-devel mailing list
<a moz-do-not-send="true" class="moz-txt-link-abbreviated" href="mailto:389-devel@lists.fedoraproject.org">389-devel@lists.fedoraproject.org</a>
<a moz-do-not-send="true" class="moz-txt-link-freetext" href="https://admin.fedoraproject.org/mailman/listinfo/389-devel">https://admin.fedoraproject.org/mailman/listinfo/389-devel</a></pre>
              </blockquote>
              <br>
            </blockquote>
            <br>
          </blockquote>
          <br>
        </blockquote>
        <br>
      </blockquote>
      <br>
    </blockquote>
    <br>
    <pre class="moz-signature" cols="72">-- 
Mark Reynolds
389 Development Team
Red Hat, Inc
<a class="moz-txt-link-abbreviated" href="mailto:mreynolds@redhat.com">mreynolds@redhat.com</a></pre>
  </body>
</html>