Skip to content

Commit

Permalink
Merge branch 'master' into upgrade/go-ethereum/v1.9.15-2021212113514
Browse files Browse the repository at this point in the history
  • Loading branch information
ricardolyn committed Feb 17, 2021
2 parents 550c952 + 95ef546 commit 662c1b8
Show file tree
Hide file tree
Showing 4 changed files with 87 additions and 1 deletion.
11 changes: 10 additions & 1 deletion core/rawdb/freezer.go
Original file line number Diff line number Diff line change
Expand Up @@ -128,8 +128,17 @@ func newFreezer(datadir string, namespace string) (*freezer, error) {

// Close terminates the chain freezer, unmapping all the data files.
func (f *freezer) Close() error {
f.quit <- struct{}{}
var errs []error

// Quorum
// Check if 'f.quit' has subscribers, as freezer.Close() might be called again by Raft when stopping raft service
select {
case f.quit <- struct{}{}:
default:
errs = append(errs, errors.New("freezer DB process already stopped"))
}
// End Quorum

for _, table := range f.tables {
if err := table.Close(); err != nil {
errs = append(errs, err)
Expand Down
75 changes: 75 additions & 0 deletions core/rawdb/freezer_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package rawdb

import (
"testing"
"time"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
)

// Quorum

func Test_freezer_Close(t *testing.T) {
// Close first time
mockFreezer := newFreezerMock(t)
err := mockFreezer.Close()
assert.Nil(t, err)

// Close second time should return error but do not hang sending data to freeze.quit channel
timeout := time.After(1 * time.Second)
errCh := make(chan error)

go func() {
errCh <- mockFreezer.Close()
}()

select {
case <-timeout:
t.Fatal("freezer.Close() timed out")
case err := <-errCh:
assert.NotNil(t, err)
assert.Equal(t, "[freezer DB process already stopped]", err.Error())
}

}

// Releaser is an autogenerated mock type for the Releaser type
type releaserMock struct {
mock.Mock
}

// Release provides a mock function with given fields:
func (_m *releaserMock) Release() error {
ret := _m.Called()

var r0 error
if rf, ok := ret.Get(0).(func() error); ok {
r0 = rf()
} else {
r0 = ret.Error(0)
}

return r0
}

func newFreezerMock(t *testing.T) *freezer {
mockLock := new(releaserMock)
mockFreezer := &freezer{
tables: make(map[string]*freezerTable),
instanceLock: mockLock,
quit: make(chan struct{}),
}
mockLock.On("Release").Return(nil)

started := make(chan bool)
go func() {
started <- true
<-mockFreezer.quit
}()
<-started

return mockFreezer
}

// End Quorum
1 change: 1 addition & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,7 @@ github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570 h1:gIlAHnH1
github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570/go.mod h1:8OR4w3TdeIHIh1g6EMY5p0gVNOovcWC+1vpc7naMuAw=
github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3 h1:njlZPzLwU639dk2kqnCPPv+wNjq7Xb6EfUxe/oX0/NM=
github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUWaI9xL8pRQCTXQgocU38Qw1g0Us7n5PxxTwTCYU=
github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
Expand Down
1 change: 1 addition & 0 deletions raft/backend.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ func (service *RaftService) Stop() error {
service.minter.stop()
service.eventMux.Stop()

// chainDb.Close() handles gracefully if freezedb process is already stopped
service.chainDb.Close()

log.Info("Raft stopped")
Expand Down

0 comments on commit 662c1b8

Please sign in to comment.