Skip to content

Commit f2a471e

Browse files
author
Bartłomiej Święcki
committed
fix(embedded/immustore): Avoid deadlock when acquire vLog lock
When waiting for a vLog lock, don't check for close flag that could introduce deadlock with store's mutex. Signed-off-by: Bartłomiej Święcki <[email protected]>
1 parent cdde0e0 commit f2a471e

File tree

1 file changed

+7
-21
lines changed

1 file changed

+7
-21
lines changed

embedded/store/immustore.go

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -786,30 +786,18 @@ func (s *ImmuStore) fetchAnyVLog() (vLodID byte, vLog appendable.Appendable) {
786786
return vLogID, s.vLogs[vLogID-1].vLog
787787
}
788788

789-
func (s *ImmuStore) fetchVLog(vLogID byte, checkClosed bool) (vLog appendable.Appendable, err error) {
789+
func (s *ImmuStore) fetchVLog(vLogID byte) appendable.Appendable {
790790
s.vLogsCond.L.Lock()
791791
defer s.vLogsCond.L.Unlock()
792792

793793
for s.vLogs[vLogID-1].unlockedRef == nil {
794-
if checkClosed {
795-
s.mutex.Lock()
796-
if s.closed {
797-
err = ErrAlreadyClosed
798-
}
799-
s.mutex.Unlock()
800-
}
801-
802-
if err != nil {
803-
return nil, err
804-
}
805-
806794
s.vLogsCond.Wait()
807795
}
808796

809797
s.vLogUnlockedList.Remove(s.vLogs[vLogID-1].unlockedRef)
810798
s.vLogs[vLogID-1].unlockedRef = nil // locked
811799

812-
return s.vLogs[vLogID-1].vLog, nil
800+
return s.vLogs[vLogID-1].vLog
813801
}
814802

815803
func (s *ImmuStore) releaseVLog(vLogID byte) {
@@ -1720,10 +1708,7 @@ func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte) (
17201708
vLogID, offset := decodeOffset(off)
17211709

17221710
if vLogID > 0 {
1723-
vLog, err := s.fetchVLog(vLogID, true)
1724-
if err != nil {
1725-
return 0, err
1726-
}
1711+
vLog := s.fetchVLog(vLogID)
17271712
defer s.releaseVLog(vLogID)
17281713

17291714
n, err := vLog.ReadAt(b, offset)
@@ -1782,7 +1767,7 @@ func (s *ImmuStore) Sync() error {
17821767
}
17831768

17841769
for i := range s.vLogs {
1785-
vLog, _ := s.fetchVLog(i+1, false)
1770+
vLog := s.fetchVLog(i + 1)
17861771
defer s.releaseVLog(i + 1)
17871772

17881773
err := vLog.Sync()
@@ -1817,12 +1802,13 @@ func (s *ImmuStore) Close() error {
18171802
merr := multierr.NewMultiErr()
18181803

18191804
for i := range s.vLogs {
1820-
vLog, _ := s.fetchVLog(i+1, false)
1805+
vLog := s.fetchVLog(i + 1)
18211806

18221807
err := vLog.Close()
18231808
merr.Append(err)
1809+
1810+
s.releaseVLog(i + 1)
18241811
}
1825-
s.vLogsCond.Broadcast()
18261812

18271813
if s.blBuffer != nil && s.blErr == nil && s.blDone != nil {
18281814
s.log.Infof("Stopping Binary Linking at '%s'...", s.path)

0 commit comments

Comments
 (0)