Skip to content
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

Small raft improvements. #4126

Merged
merged 1 commit into from May 3, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
29 changes: 18 additions & 11 deletions server/raft.go
Expand Up @@ -1770,12 +1770,18 @@ func (n *raft) setObserver(isObserver bool, extSt extensionState) {

// Invoked when being notified that there is something in the entryc's queue
func (n *raft) processAppendEntries() {
ok := !n.outOfResources()
if !ok {
canProcess := true
if n.isClosed() {
n.debug("AppendEntry not processing inbound, closed")
canProcess = false
}
if n.outOfResources() {
n.debug("AppendEntry not processing inbound, no resources")
canProcess = false
}
// Always pop the entries, but check if we can process them.
aes := n.entry.pop()
if ok {
if canProcess {
for _, ae := range aes {
n.processAppendEntry(ae, ae.sub)
}
Expand Down Expand Up @@ -3565,6 +3571,13 @@ func (n *raft) setWriteErrLocked(err error) {
}
}

// Helper to check if we are closed when we do not hold a lock already.
func (n *raft) isClosed() bool {
n.RLock()
defer n.RUnlock()
return n.state == Closed
}

// Capture our write error if any and hold.
func (n *raft) setWriteErr(err error) {
n.Lock()
Expand All @@ -3581,12 +3594,6 @@ func (n *raft) fileWriter() {
psf := filepath.Join(n.sd, peerStateFile)
n.RUnlock()

isClosed := func() bool {
n.RLock()
defer n.RUnlock()
return n.state == Closed
}

for s.isRunning() {
select {
case <-n.quit:
Expand All @@ -3599,7 +3606,7 @@ func (n *raft) fileWriter() {
<-dios
err := os.WriteFile(tvf, buf[:], 0640)
dios <- struct{}{}
if err != nil && !isClosed() {
if err != nil && !n.isClosed() {
n.setWriteErr(err)
n.warn("Error writing term and vote file for %q: %v", n.group, err)
}
Expand All @@ -3610,7 +3617,7 @@ func (n *raft) fileWriter() {
<-dios
err := os.WriteFile(psf, buf, 0640)
dios <- struct{}{}
if err != nil && !isClosed() {
if err != nil && !n.isClosed() {
n.setWriteErr(err)
n.warn("Error writing peer state file for %q: %v", n.group, err)
}
Expand Down