Vladimir Ivić created ZOOKEEPER-3594:
----------------------------------------
Summary: Ability to skip proposing requests with error transactions
Key: ZOOKEEPER-3594
URL: https://issues.apache.org/jira/browse/ZOOKEEPER-3594
Project: ZooKeeper
Issue Type: New Feature
Components: quorum, server
Affects Versions: 3.5.6
Reporter: Vladimir Ivić
Assignee: Vladimir Ivić
Ensembles that have a high write request rate could be skipping proposing
requests that contain errors instead of having the quorum vote on those
transactions.
For example, having a sizable write traffic that results in error transactions
would be creating additional network and log disk space overhead for each of
the requests that would only return errors to the client in the end (e.g.
delete non-existing path, version mismatch, trying to create a node that
already exists etc).
Currently, there is no such logic in the ProposalRequestProcessor, every
request that comes out of PrepRequestProcessor will be proposed to the quorum.
Proposed solution workflow:
* A client sends a new write request trying to setData on an non-existing node
* The server accepts the request and sends it through the PrepRequestProcessor
* PrepRequestProcessor detects the error and assigns the error transaction to
the request
* Between PrepRequestProcessor and ProposalRequestProcessor there is another
processor named SkipRequestProcessor which sole responsibility is to decide
will the request be forwarded or returned to the originating quorum peer
(Leader or Learner).
* The quorum peer waits for all previous requests to complete before the error
request proceeds with echoing the error back to the client.
Requirements:
* We should be conservative about the use of ZXID. If the request generates an
error transaction we don't want to increment the last proposed ZXID and cause
any gaps in the log.
* Request that are found to be invalid should be sent directly to the origin
(either to the corresponding Learner or to the Leader directly) so there is
exactly one roundtrip for each request with error transaction.
* All the requests must preserve its order, the changes must be backwards
compatible with the Zookeeper ordering guarantees.
Challenges:
* Skipping request without having them go through the proposal pipeline poses
a challenge in preserving Zookeeper transaction order.
* Avoiding any additional changes inside CommitProcessor if possible.
* Have unified logic for all three different paths in which write requests can
come through:
## Via Leader placed directly into the PrepRequestProcessor
## Via Follower where the request is forwarded to the leader and also passed
to CommitProcessor to wait for COMMIT packet
## Via Observer, where the request is forwarded to the Leader and the Observer
waits for the INFORM packet
--
This message was sent by Atlassian Jira
(v8.3.4#803005)