Change AccountManager to not wait for disk flushes.

Should fix hang found by dhill.
This commit is contained in:
Josh Rickmar 2014-02-03 18:15:36 -05:00
parent 03ffa0ccd8
commit 8dac5080ac
2 changed files with 12 additions and 17 deletions

View file

@ -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)
} }
} }

View file

@ -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