]> Cypherpunks.ru repositories - nncp.git/blobdiff - src/sp.go
Deleted hasher must send checker task too
[nncp.git] / src / sp.go
index a1f51ebf80276b143675159248c97514ba621494..a8b5f0bbaa9385694e0110bec5ddd07de6e4b95a 100644 (file)
--- a/src/sp.go
+++ b/src/sp.go
@@ -41,14 +41,14 @@ const (
 )
 
 type MTHAndOffset struct {
-       mth    *MTH
+       mth    MTH
        offset uint64
 }
 
 type SPCheckerTask struct {
        nodeId *NodeId
        hsh    *[MTHSize]byte
-       mth    *MTH
+       mth    MTH
        done   chan []byte
 }
 
@@ -806,6 +806,7 @@ func (state *SPState) StartWorkers(
                defer conn.Close()
                defer state.SetDead()
                defer state.wg.Done()
+               buf := make([]byte, MaxSPSize-SPHeadOverhead-SPFileOverhead)
                for {
                        if state.NotAlive() {
                                return
@@ -895,7 +896,7 @@ func (state *SPState) StartWorkers(
                                }
                                fd := fdAndFullSize.fd
                                fullSize := fdAndFullSize.fullSize
-                               var buf []byte
+                               var bufRead []byte
                                if freq.Offset < uint64(fullSize) {
                                        state.Ctx.LogD("sp-file-seek", lesp, func(les LEs) string {
                                                return logMsg(les) + ": seeking"
@@ -906,7 +907,6 @@ func (state *SPState) StartWorkers(
                                                })
                                                return
                                        }
-                                       buf = make([]byte, MaxSPSize-SPHeadOverhead-SPFileOverhead)
                                        n, err := fd.Read(buf)
                                        if err != nil {
                                                state.Ctx.LogE("sp-file-read", lesp, err, func(les LEs) string {
@@ -914,7 +914,7 @@ func (state *SPState) StartWorkers(
                                                })
                                                return
                                        }
-                                       buf = buf[:n]
+                                       bufRead = buf[:n]
                                        lesp = append(
                                                les,
                                                LE{"XX", string(TTx)},
@@ -932,9 +932,9 @@ func (state *SPState) StartWorkers(
                                payload = MarshalSP(SPTypeFile, SPFile{
                                        Hash:    freq.Hash,
                                        Offset:  freq.Offset,
-                                       Payload: buf,
+                                       Payload: bufRead,
                                })
-                               ourSize := freq.Offset + uint64(len(buf))
+                               ourSize := freq.Offset + uint64(len(bufRead))
                                lesp = append(
                                        les,
                                        LE{"XX", string(TTx)},
@@ -947,7 +947,8 @@ func (state *SPState) StartWorkers(
                                        Progress("Tx", lesp)
                                }
                                state.Lock()
-                               if len(state.queueTheir) > 0 && *state.queueTheir[0].freq.Hash == *freq.Hash {
+                               if len(state.queueTheir) > 0 &&
+                                       *state.queueTheir[0].freq.Hash == *freq.Hash {
                                        if ourSize == uint64(fullSize) {
                                                state.Ctx.LogD("sp-file-finished", lesp, func(les LEs) string {
                                                        return logMsg(les) + ": finished"
@@ -961,7 +962,7 @@ func (state *SPState) StartWorkers(
                                                        delete(state.progressBars, pktName)
                                                }
                                        } else {
-                                               state.queueTheir[0].freq.Offset += uint64(len(buf))
+                                               state.queueTheir[0].freq.Offset = ourSize
                                        }
                                } else {
                                        state.Ctx.LogD("sp-file-disappeared", lesp, func(les LEs) string {
@@ -1439,7 +1440,7 @@ func (state *SPState) ProcessSP(payload []byte) ([][]byte, error) {
                        }
                        if hasherAndOffset != nil {
                                delete(state.fileHashers, filePath)
-                               if hasherAndOffset.mth.PrependSize == 0 {
+                               if hasherAndOffset.mth.PrependSize() == 0 {
                                        if bytes.Compare(hasherAndOffset.mth.Sum(nil), file.Hash[:]) != 0 {
                                                state.Ctx.LogE(
                                                        "sp-file-bad-checksum", lesp,
@@ -1515,16 +1516,17 @@ func (state *SPState) ProcessSP(payload []byte) ([][]byte, error) {
                        state.Lock()
                        delete(state.infosTheir, *file.Hash)
                        state.Unlock()
-                       if hasherAndOffset != nil {
-                               go func() {
-                                       spCheckerTasks <- SPCheckerTask{
-                                               nodeId: state.Node.Id,
-                                               hsh:    file.Hash,
-                                               mth:    hasherAndOffset.mth,
-                                               done:   state.payloads,
-                                       }
-                               }()
-                       }
+                       go func() {
+                               t := SPCheckerTask{
+                                       nodeId: state.Node.Id,
+                                       hsh:    file.Hash,
+                                       done:   state.payloads,
+                               }
+                               if hasherAndOffset != nil {
+                                       t.mth = hasherAndOffset.mth
+                               }
+                               spCheckerTasks <- t
+                       }()
 
                case SPTypeDone:
                        lesp := append(les, LE{"Type", "done"})