]> Cypherpunks.ru repositories - nncp.git/commitdiff
Fix invalidly used spWorkersGroup
authorSergey Matveev <stargrave@stargrave.org>
Tue, 5 Jan 2021 17:08:11 +0000 (20:08 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Tue, 5 Jan 2021 17:08:14 +0000 (20:08 +0300)
* It leads to races among several SP processes
* No .Done() was called when error occurs inside checker gorouting

src/sp.go

index 56db4628dca95448c1eeaa3c836c5624e35100ba..72ae7fbe8f56cd2b02d081f37b30dc0b8d7625a4 100644 (file)
--- a/src/sp.go
+++ b/src/sp.go
@@ -56,7 +56,7 @@ var (
        DefaultDeadline = 10 * time.Second
        PingTimeout     = time.Minute
 
-       spWorkersGroup sync.WaitGroup
+       spCheckerToken chan struct{}
 )
 
 type SPType uint8
@@ -148,6 +148,8 @@ func init() {
                panic(err)
        }
        SPFileOverhead = buf.Len()
+       spCheckerToken = make(chan struct{}, 1)
+       spCheckerToken <- struct{}{}
 }
 
 func MarshalSP(typ SPType, sp interface{}) []byte {
@@ -989,9 +991,11 @@ func (state *SPState) ProcessSP(payload []byte) ([][]byte, error) {
                                fd.Close() // #nosec G104
                                continue
                        }
-                       spWorkersGroup.Wait()
-                       spWorkersGroup.Add(1)
+                       <-spCheckerToken
                        go func() {
+                               defer func() {
+                                       spCheckerToken <- struct{}{}
+                               }()
                                if err := fd.Sync(); err != nil {
                                        state.Ctx.LogE("sp-file", sdsp, err, "sync")
                                        fd.Close() // #nosec G104
@@ -1023,7 +1027,6 @@ func (state *SPState) ProcessSP(payload []byte) ([][]byte, error) {
                                state.Lock()
                                delete(state.infosTheir, *file.Hash)
                                state.Unlock()
-                               spWorkersGroup.Done()
                                state.wg.Add(1)
                                go func() {
                                        state.payloads <- MarshalSP(SPTypeDone, SPDone{file.Hash})