[ 
https://issues.apache.org/jira/browse/ZOOKEEPER-4785?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Li Wang updated ZOOKEEPER-4785:
-------------------------------
    Description: 
We had txn loss incident in production recently. The root cause is follower 
writes the current epoch and sends the ACK_LD before successfully persisting 
all the txns from DIFF sync, as persisting txns is handled asynchronously via 
SyncRequestProcessor.



case Leader.NEWLEADER: 
        ...
        *self.setCurrentEpoch(newEpoch);*
        writeToTxnLog = true;
        //Anything after this needs to go to the transaction log, not applied 
directly in memory
        isPreZAB1_0 = false;

        // ZOOKEEPER-3911: make sure sync the uncommitted logs before commit 
them (ACK NEWLEADER).
        sock.setSoTimeout(self.tickTime * self.syncLimit);
        self.setSyncMode(QuorumPeer.SyncMode.NONE);
        zk.startupWithoutServing();
        if (zk instanceof FollowerZooKeeperServer) {
            FollowerZooKeeperServer fzk = (FollowerZooKeeperServer) zk;
            for (PacketInFlight p : packetsNotCommitted) {
              * fzk.logRequest(p.hdr, p.rec, p.digest);*
            }
            packetsNotCommitted.clear();
        }

        writePacket(new QuorumPacket(Leader.ACK, newLeaderZxid, null, null), 
true);
        break;
    }



  was:
We had txn loss incident in production recently. The root cause is follower 
writes the current epoch and sends the ACK_LD before successfully persisting 
all the txns from DIFF sync, as persisting txns is handled asynchronously via 
SyncRequestProcessor.



case Leader.NEWLEADER: 
        ...
        *self.setCurrentEpoch(newEpoch);*
        writeToTxnLog = true;
        //Anything after this needs to go to the transaction log, not applied 
directly in memory
        isPreZAB1_0 = false;

        // ZOOKEEPER-3911: make sure sync the uncommitted logs before commit 
them (ACK NEWLEADER).
        sock.setSoTimeout(self.tickTime * self.syncLimit);
        self.setSyncMode(QuorumPeer.SyncMode.NONE);
        zk.startupWithoutServing();
        if (zk instanceof FollowerZooKeeperServer) {
            FollowerZooKeeperServer fzk = (FollowerZooKeeperServer) zk;
            for (PacketInFlight p : packetsNotCommitted) {
             fzk.logRequest(p.hdr, p.rec, p.digest);
            }
            packetsNotCommitted.clear();
        }

        writePacket(new QuorumPacket(Leader.ACK, newLeaderZxid, null, null), 
true);
        break;
    }




> Txn loss due to race condition when follower DIFF sync with leader
> ------------------------------------------------------------------
>
>                 Key: ZOOKEEPER-4785
>                 URL: https://issues.apache.org/jira/browse/ZOOKEEPER-4785
>             Project: ZooKeeper
>          Issue Type: Bug
>          Components: server
>    Affects Versions: 3.8.0, 3.7.1, 3.8.1, 3.7.2, 3.8.2, 3.9.1
>            Reporter: Li Wang
>            Priority: Major
>
> We had txn loss incident in production recently. The root cause is follower 
> writes the current epoch and sends the ACK_LD before successfully persisting 
> all the txns from DIFF sync, as persisting txns is handled asynchronously via 
> SyncRequestProcessor.
> case Leader.NEWLEADER: 
>         ...
>         *self.setCurrentEpoch(newEpoch);*
>         writeToTxnLog = true;
>         //Anything after this needs to go to the transaction log, not applied 
> directly in memory
>         isPreZAB1_0 = false;
>         // ZOOKEEPER-3911: make sure sync the uncommitted logs before commit 
> them (ACK NEWLEADER).
>         sock.setSoTimeout(self.tickTime * self.syncLimit);
>         self.setSyncMode(QuorumPeer.SyncMode.NONE);
>         zk.startupWithoutServing();
>         if (zk instanceof FollowerZooKeeperServer) {
>             FollowerZooKeeperServer fzk = (FollowerZooKeeperServer) zk;
>             for (PacketInFlight p : packetsNotCommitted) {
>               * fzk.logRequest(p.hdr, p.rec, p.digest);*
>             }
>             packetsNotCommitted.clear();
>         }
>         writePacket(new QuorumPacket(Leader.ACK, newLeaderZxid, null, null), 
> true);
>         break;
>     }



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to