-
Notifications
You must be signed in to change notification settings - Fork 168
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
raft: error on ignored proposal and wait for EntryConfChange results #44
base: main
Are you sure you want to change the base?
Conversation
fixes: etcd-io#43 Signed-off-by: Bogdan Kanivets <[email protected]>
there might be some other side effects of returning |
@@ -1229,7 +1229,7 @@ func stepLeader(r *raft, m pb.Message) error { | |||
|
|||
if refused != "" { | |||
r.logger.Infof("%x ignoring conf change %v at config %s: %s", r.id, cc, r.prs.Config, refused) | |||
m.Entries[i] = pb.Entry{Type: pb.EntryNormal} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Switching to normal entry is trying to increase applied index so that the next confChange can be applicable. It seems that it is right move to return dropped if we have a way to update pendingConfIndex.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Switching to normal entry is trying to increase applied index so that the next confChange can be applicable.
I don't think switching to normal entry will make a difference here to increase applied index. The advance of applied index is triggered by etcd. But I agree returning proposal dropped early is helpful.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You are right. The raft will update applied index even if the apply fails. I was thinking that the normal is used to catch up with pendingConfIndex so that it won't impact the following confChange.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
aha. Thanks for explanation! I think next ProposeConfChange()
will succeed once the raft.Applied
is advanced by etcd raftNode r.Advance()
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For reference, the use of normal entry was added here
I think the idea was to support mixed list of entries (ConfChanges and Normal) in proposal, but is it even possible to get mixed list right now?
When I check for creation of pb.Message{Type: pb.MsgProp
, there are two distinct places:
- regular Propose
- confChangeToMsg - used in ProposeConfChange and raft.appliedTo
@@ -1229,7 +1229,7 @@ func stepLeader(r *raft, m pb.Message) error { | |||
|
|||
if refused != "" { | |||
r.logger.Infof("%x ignoring conf change %v at config %s: %s", r.id, cc, r.prs.Config, refused) | |||
m.Entries[i] = pb.Entry{Type: pb.EntryNormal} | |||
return ErrProposalDropped |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't know the side effect of dropping other entries in the same m.Entries
for loop.
How about moving it til the end of stepLeader function, especially after bcastAppend
so other entries handling are not impacted just to be safe?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
the loop is only processing config changes, see if cc != nil {
. So, I think it's ok to drop here. Also, my understanding is that we have to drop full proposal, there is no per entry ErrProposalDropped
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see, thanks for the explanation!
etcd only uses so-called deprecated Lines 141 to 153 in 3cbcd6e
cc @ahrtr @serathius for insights~ |
raft will automatically convert it to V2, see node.go#L533. The intention is just to ignore the confChange, as the log " |
To be clear, I am not sure what's the impact of fail fast in case of Lines 1222 to 1226 in 7357439
Is there an unknown reason that designs like this? @tbg for consulting.. |
cc @nvanbenschoten, noticed some of your recent comments here Lines 698 to 704 in 7357439
can you take a look at this PR? |
@lavacat thanks for the ping. I don't see any issue with the changes made to |
fixes: #43