[ 
https://issues.apache.org/jira/browse/SOLR-11069?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16087076#comment-16087076
 ] 

Amrit Sarkar commented on SOLR-11069:
-------------------------------------

So when we enable buffering in CDCR, {{buffertoggle}} gets initialised via 
{{newLogReader()}} where ::
{code}
 return new CdcrLogReader(new ArrayList(logs), tlog);
{code}
{code}
    private CdcrLogReader(List<TransactionLog> tlogs, TransactionLog tlog) {
      this.tlogs = new LinkedBlockingDeque<>();
      this.tlogs.addAll(tlogs);
      if (tlog != null) this.tlogs.push(tlog); // ensure that the tlog being 
written is pushed

      // Register the pointer in the parent UpdateLog
      pointer = new CdcrLogPointer();
      logPointers.put(this, pointer);

      // If the reader is initialised while the updates log is empty, do nothing
      if ((currentTlog = this.tlogs.peekLast()) != null) {
        tlogReader = currentTlog.getReader(0);
        pointer.set(currentTlog.tlogFile);
        numRecordsReadInCurrentTlog = 0;
        log.debug("Init new tlog reader for {} - tlogReader = {}", 
currentTlog.tlogFile, tlogReader);
      }
    }
{code}
{{lastVersion}} and {{nextToLastVersion}} initialised as {{-1}} and never 
changed / modified / updated ever. The recent logs are added into {{tlogs}} and 
current tlog is maintained though.

Now LPV is calculated as: CdcrRequestHandler::handleLastProcessedVersionAction
{code}
    for (CdcrReplicatorState state : replicatorManager.getReplicatorStates()) {
      long version = Long.MAX_VALUE;
      if (state.getLogReader() != null) {
        version = state.getLogReader().getLastVersion();
      }
      lastProcessedVersion = Math.min(lastProcessedVersion, version);
    }

    // next check the log reader of the buffer
    CdcrUpdateLog.CdcrLogReader bufferLogReader = ((CdcrUpdateLog) 
core.getUpdateHandler().getUpdateLog()).getBufferToggle();
    if (bufferLogReader != null) {
      lastProcessedVersion = Math.min(lastProcessedVersion, 
bufferLogReader.getLastVersion());
    }
{code}
bufferLogReader.getLastVersion() is calculated {{-1}} and LPV outputs {{-1}}.

> LASTPROCESSEDVERSION for CDCR is flawed when buffering is enabled
> -----------------------------------------------------------------
>
>                 Key: SOLR-11069
>                 URL: https://issues.apache.org/jira/browse/SOLR-11069
>             Project: Solr
>          Issue Type: Bug
>      Security Level: Public(Default Security Level. Issues are Public) 
>          Components: CDCR
>    Affects Versions: 7.0
>            Reporter: Amrit Sarkar
>
> {{LASTPROCESSEDVERSION}} (a.b.v. LPV) action for CDCR breaks down due to 
> poorly initialised and maintained buffer log for either source or target 
> cluster core nodes.
> If buffer is enabled for cores of either source or target cluster, it return 
> {{-1}}, *irrespective of number of entries in tlog read by the {{leader}}* 
> node of each shard of respective collection of respective cluster. Once 
> disabled, it starts telling us the correct LPV for each core.
> Due to the same flawed behavior, Update Log Synchroniser may doesn't work 
> properly as expected, i.e. provides correct seek to the {{non-leader}} nodes 
> to advance at. I am not sure whether this is an intended behavior for sync 
> but it surely doesn't feel right.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@lucene.apache.org
For additional commands, e-mail: dev-h...@lucene.apache.org

Reply via email to