Change AccountManager to not wait for disk flushes.
Should fix hang found by dhill.
This commit is contained in:
parent
03ffa0ccd8
commit
8dac5080ac
2 changed files with 12 additions and 17 deletions
|
@ -119,9 +119,7 @@ func (am *AccountManager) Start() {
|
||||||
}
|
}
|
||||||
|
|
||||||
case <-timer.C:
|
case <-timer.C:
|
||||||
if err := am.ds.FlushScheduled(); err != nil {
|
am.ds.FlushScheduled()
|
||||||
log.Errorf("Cannot write account: %v", err)
|
|
||||||
}
|
|
||||||
timer = time.NewTimer(wait)
|
timer = time.NewTimer(wait)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
25
disksync.go
25
disksync.go
|
@ -173,10 +173,6 @@ func (s *syncSchedule) flush() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type flushScheduledRequest struct {
|
|
||||||
err chan error
|
|
||||||
}
|
|
||||||
|
|
||||||
type flushAccountRequest struct {
|
type flushAccountRequest struct {
|
||||||
a *Account
|
a *Account
|
||||||
err chan error
|
err chan error
|
||||||
|
@ -196,7 +192,7 @@ type exportRequest struct {
|
||||||
// DiskSyncer manages all disk write operations for a collection of accounts.
|
// DiskSyncer manages all disk write operations for a collection of accounts.
|
||||||
type DiskSyncer struct {
|
type DiskSyncer struct {
|
||||||
// Flush scheduled account writes.
|
// Flush scheduled account writes.
|
||||||
flushScheduled chan *flushScheduledRequest
|
flushScheduled chan struct{}
|
||||||
flushAccount chan *flushAccountRequest
|
flushAccount chan *flushAccountRequest
|
||||||
|
|
||||||
// Schedule file writes for an account.
|
// Schedule file writes for an account.
|
||||||
|
@ -218,7 +214,7 @@ type DiskSyncer struct {
|
||||||
// NewDiskSyncer creates a new DiskSyncer.
|
// NewDiskSyncer creates a new DiskSyncer.
|
||||||
func NewDiskSyncer(am *AccountManager) *DiskSyncer {
|
func NewDiskSyncer(am *AccountManager) *DiskSyncer {
|
||||||
return &DiskSyncer{
|
return &DiskSyncer{
|
||||||
flushScheduled: make(chan *flushScheduledRequest),
|
flushScheduled: make(chan struct{}),
|
||||||
flushAccount: make(chan *flushAccountRequest),
|
flushAccount: make(chan *flushAccountRequest),
|
||||||
scheduleWallet: make(chan *Account),
|
scheduleWallet: make(chan *Account),
|
||||||
scheduleTxStore: make(chan *Account),
|
scheduleTxStore: make(chan *Account),
|
||||||
|
@ -244,8 +240,13 @@ func (ds *DiskSyncer) Start() {
|
||||||
schedule := newSyncSchedule(netdir)
|
schedule := newSyncSchedule(netdir)
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case fr := <-ds.flushScheduled:
|
case <-ds.flushScheduled:
|
||||||
fr.err <- schedule.flush()
|
ds.am.Grab()
|
||||||
|
err := schedule.flush()
|
||||||
|
ds.am.Release()
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Cannot write accounts: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
case fr := <-ds.flushAccount:
|
case fr := <-ds.flushAccount:
|
||||||
fr.err <- schedule.flushAccount(fr.a)
|
fr.err <- schedule.flushAccount(fr.a)
|
||||||
|
@ -277,12 +278,8 @@ func (ds *DiskSyncer) Start() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// FlushScheduled writes all scheduled account files to disk.
|
// FlushScheduled writes all scheduled account files to disk.
|
||||||
func (ds *DiskSyncer) FlushScheduled() error {
|
func (ds *DiskSyncer) FlushScheduled() {
|
||||||
ds.am.Grab()
|
ds.flushScheduled <- struct{}{}
|
||||||
err := make(chan error)
|
|
||||||
ds.flushScheduled <- &flushScheduledRequest{err}
|
|
||||||
ds.am.Release()
|
|
||||||
return <-err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// FlushAccount writes all scheduled account files to disk for a single
|
// FlushAccount writes all scheduled account files to disk for a single
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue