doc/download.texi | 4 ++++ doc/news.ru.texi | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++ doc/news.texi | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/nncp.go | 2 +- src/progress.go | 8 ++++---- src/sp.go | 64 +++++++++++++++++++++++++++++------------------------ src/toss.go | 12 ++++++------ diff --git a/doc/download.texi b/doc/download.texi index 3cf15b85219a49547c0192f0e3bc05b140f4fbf298fa7392a7daf0149499dd9c..712784591d95f426a8790378ec4d978f01a8031fb88bb06d94c88ecb47fe8aea 100644 --- a/doc/download.texi +++ b/doc/download.texi @@ -28,6 +28,10 @@ @multitable {XXXXX} {XXXX-XX-XX} {XXXX KiB} {link sign} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} @headitem Version @tab Date @tab Size @tab Tarball @tab SHA256 checksum +@item @ref{Release 7_2_0, 7.2.0} @tab 2021-07-08 @tab 1136 KiB +@tab @url{download/nncp-7.2.0.tar.xz, link} @url{download/nncp-7.2.0.tar.xz.sig, sign} +@tab @code{70DBB97B 86C9B4B6 E35CFF02 B8C9FAE2 4323EEA5 C56403A2 66CBA268 D82F5077} + @item @ref{Release 7_1_1, 7.1.1} @tab 2021-07-06 @tab 1132 KiB @tab @url{download/nncp-7.1.1.tar.xz, link} @url{download/nncp-7.1.1.tar.xz.sig, sign} @tab @code{B741C9E3 EC3DB342 893FE081 888C40E4 B94E4298 E5C1A8E0 BA4D179C C239CCCA} diff --git a/doc/news.ru.texi b/doc/news.ru.texi index c479b62d279bed344f83f484a8e1a97d8df5f522faf048c8aea0a3176d7a253b..b3225f735a549bf8f890853cc92803c58ff58e3178ce350370938a2982a5dd49 100644 --- a/doc/news.ru.texi +++ b/doc/news.ru.texi @@ -1,6 +1,66 @@ @node Новости @section Новости +@menu +* Релиз 7.2.1:: +* Релиз 7.2.0:: +* Релиз 7.1.1:: +* Релиз 7.1.0:: +* Релиз 7.0.0:: +* Релиз 6.6.0:: +* Релиз 6.5.0:: +* Релиз 6.4.0:: +* Релиз 6.3.0:: +* Релиз 6.2.1:: +* Релиз 6.2.0:: +* Релиз 6.1.0:: +* Релиз 6.0.0:: +* Релиз 5.6.0:: +* Релиз 5.5.1:: +* Релиз 5.5.0:: +* Релиз 5.4.1:: +* Релиз 5.4.0:: +* Релиз 5.3.3:: +* Релиз 5.3.2:: +* Релиз 5.3.1:: +* Релиз 5.3.0:: +* Релиз 5.2.1:: +* Релиз 5.2.0:: +* Релиз 5.1.2:: +* Релиз 5.1.1:: +* Релиз 5.1.0:: +* Релиз 5.0.0:: +* Релиз 4.1:: +* Релиз 4.0:: +* Релиз 3.4:: +* Релиз 3.3:: +* Релиз 3.2:: +* Релиз 3.1:: +* Релиз 3.0:: +* Релиз 2.0:: +* Релиз 1.0:: +* Релиз 0.12:: +* Релиз 0.11:: +* Релиз 0.10:: +* Релиз 0.9:: +* Релиз 0.8:: +* Релиз 0.7:: +* Релиз 0.6:: +* Релиз 0.5:: +* Релиз 0.4:: +* Релиз 0.3:: +* Релиз 0.2:: +@end menu + +@node Релиз 7.2.1 +@subsection Релиз 7.2.1 +@itemize + +@item +Небольшие оптимизации в online командах. + +@end itemize + @node Релиз 7.2.0 @subsection Релиз 7.2.0 @itemize diff --git a/doc/news.texi b/doc/news.texi index 076453f6dba3c3621d98c4013387af9624071cfb83f9f16206599325514668a8..eee04a150d1aec335aec3989716fba9696429fcc77d4ccd3989c1962f6454e76 100644 --- a/doc/news.texi +++ b/doc/news.texi @@ -3,6 +3,66 @@ @unnumbered News See also this page @ref{Новости, on russian}. +@menu +* Release 7.2.1: Release 7_2_1. +* Release 7.2.0: Release 7_2_0. +* Release 7.1.1: Release 7_1_1. +* Release 7.1.0: Release 7_1_0. +* Release 7.0.0: Release 7_0_0. +* Release 6.6.0: Release 6_6_0. +* Release 6.5.0: Release 6_5_0. +* Release 6.4.0: Release 6_4_0. +* Release 6.3.0: Release 6_3_0. +* Release 6.2.1: Release 6_2_1. +* Release 6.2.0: Release 6_2_0. +* Release 6.1.0: Release 6_1_0. +* Release 6.0.0: Release 6_0_0. +* Release 5.6.0: Release 5_6_0. +* Release 5.5.1: Release 5_5_1. +* Release 5.5.0: Release 5_5_0. +* Release 5.4.1: Release 5_4_1. +* Release 5.4.0: Release 5_4_0. +* Release 5.3.3: Release 5_3_3. +* Release 5.3.2: Release 5_3_2. +* Release 5.3.1: Release 5_3_1. +* Release 5.3.0: Release 5_3_0. +* Release 5.2.1: Release 5_2_1. +* Release 5.2.0: Release 5_2_0. +* Release 5.1.2: Release 5_1_2. +* Release 5.1.1: Release 5_1_1. +* Release 5.1.0: Release 5_1_0. +* Release 5.0.0: Release 5_0_0. +* Release 4.1: Release 4_1. +* Release 4.0: Release 4_0. +* Release 3.4: Release 3_4. +* Release 3.3: Release 3_3. +* Release 3.2: Release 3_2. +* Release 3.1: Release 3_1. +* Release 3.0: Release 3_0. +* Release 2.0: Release 2_0. +* Release 1.0: Release 1_0. +* Release 0.12: Release 0_12. +* Release 0.11: Release 0_11. +* Release 0.10: Release 0_10. +* Release 0.9: Release 0_9. +* Release 0.8: Release 0_8. +* Release 0.7: Release 0_7. +* Release 0.6: Release 0_6. +* Release 0.5: Release 0_5. +* Release 0.4: Release 0_4. +* Release 0.3: Release 0_3. +* Release 0.2: Release 0_2. +@end menu + +@node Release 7_2_1 +@section Release 7.2.1 +@itemize + +@item +Small optimizations in online commands. + +@end itemize + @node Release 7_2_0 @section Release 7.2.0 @itemize diff --git a/src/nncp.go b/src/nncp.go index 50368596ec27dd60c2d9001673487c73bd25dd03194b617820f1e9a667b11fd1..6887e548b5775b5a257d87eff2a819682a9e3ec53194b217af096b04657b508a 100644 --- a/src/nncp.go +++ b/src/nncp.go @@ -40,7 +40,7 @@ const Base32Encoded32Len = 52 var ( - Version string = "7.2.0" + Version string = "7.2.1" Base32Codec *base32.Encoding = base32.StdEncoding.WithPadding(base32.NoPadding) ) diff --git a/src/progress.go b/src/progress.go index 9bca3483d98688abee1913dced50cb43bd55bf9f401a5fc41b8e009e107b48de..15339cb9bf65488115aa8ea7ba64cdfe69afb1827dd7f36515d4d8207af00fd8 100644 --- a/src/progress.go +++ b/src/progress.go @@ -132,9 +132,9 @@ pkt = le.V.(string) } } progressBarsLock.RLock() - pb, exists := progressBars[pkt] + pb := progressBars[pkt] progressBarsLock.RUnlock() - if !exists { + if pb == nil { progressBarsLock.Lock() pb = ProgressBarNew(size, fullsize) progressBars[pkt] = pb @@ -156,8 +156,8 @@ } func ProgressKill(pkt string) { progressBarsLock.Lock() - pb, exists := progressBars[pkt] - if exists { + pb := progressBars[pkt] + if pb != nil { pb.Kill() delete(progressBars, pkt) } diff --git a/src/sp.go b/src/sp.go index eac64eaa7319eb911f0a243b130fc92aae8c12f4cf00e0077dc0bdc9478d67e9..20744521b94d89ccc799a61fe76272bfe24f5d67275dc73023e87c92921d7515 100644 --- a/src/sp.go +++ b/src/sp.go @@ -806,6 +806,7 @@ go func() { defer conn.Close() defer state.SetDead() defer state.wg.Done() + buf := make([]byte, MaxSPSize-SPHeadOverhead-SPFileOverhead) for { if state.NotAlive() { return @@ -874,6 +875,9 @@ state.fdsLock.RLock() fdAndFullSize, exists := state.fds[pth] state.fdsLock.RUnlock() if !exists { + state.Ctx.LogD("sp-queue-open", lesp, func(les LEs) string { + return logMsg(les) + ": opening" + }) fd, err := os.Open(pth) if err != nil { state.Ctx.LogE("sp-queue-open", lesp, err, func(les LEs) string { @@ -895,7 +899,8 @@ state.fdsLock.Unlock() } fd := fdAndFullSize.fd fullSize := fdAndFullSize.fullSize - var buf []byte + lesp = append(lesp, LE{"FullSize", fullSize}) + 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 +911,6 @@ return logMsg(les) + ": seeking" }) 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,12 +918,13 @@ return logMsg(les) + ": reading" }) return } - buf = buf[:n] + bufRead = buf[:n] lesp = append( les, LE{"XX", string(TTx)}, LE{"Pkt", pktName}, LE{"Size", int64(n)}, + LE{"FullSize", fullSize}, ) state.Ctx.LogD("sp-file-read", lesp, func(les LEs) string { return fmt.Sprintf( @@ -927,14 +932,15 @@ "%s: read %s", logMsg(les), humanize.IBytes(uint64(n)), ) }) + } else { + state.closeFd(pth) } - state.closeFd(pth) 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,26 +953,25 @@ state.progressBars[pktName] = struct{}{} Progress("Tx", lesp) } state.Lock() - if len(state.queueTheir) > 0 && *state.queueTheir[0].freq.Hash == *freq.Hash { + for i, q := range state.queueTheir { + if *q.freq.Hash != *freq.Hash { + continue + } if ourSize == uint64(fullSize) { state.Ctx.LogD("sp-file-finished", lesp, func(les LEs) string { return logMsg(les) + ": finished" }) - if len(state.queueTheir) > 1 { - state.queueTheir = state.queueTheir[1:] - } else { - state.queueTheir = state.queueTheir[:0] - } + state.queueTheir = append( + state.queueTheir[:i], + state.queueTheir[i+1:]..., + ) if state.Ctx.ShowPrgrs { delete(state.progressBars, pktName) } } else { - state.queueTheir[0].freq.Offset += uint64(len(buf)) + q.freq.Offset = ourSize } - } else { - state.Ctx.LogD("sp-file-disappeared", lesp, func(les LEs) string { - return logMsg(les) + ": queue disappeared" - }) + break } state.Unlock() } @@ -1319,9 +1324,9 @@ ) } fullsize := int64(0) state.RLock() - infoTheir, ok := state.infosTheir[*file.Hash] + infoTheir := state.infosTheir[*file.Hash] state.RUnlock() - if !ok { + if infoTheir == nil { state.Ctx.LogE("sp-file-open", lesp, err, func(les LEs) string { return logMsg(les) + ": unknown file" }) @@ -1515,16 +1520,17 @@ }) 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"}) diff --git a/src/toss.go b/src/toss.go index 74f9d98a43f94d9bd086cf3579de49ea4f4dba696db9da87039b19900fa7597d..d17c5461fd87c0df935db4dd126229df3a3575331495bd3715ab6398e1954748 100644 --- a/src/toss.go +++ b/src/toss.go @@ -120,8 +120,8 @@ args = append(args, string(p)) } argsStr := strings.Join(append([]string{handle}, args...), " ") les = append(les, LE{"Type", "exec"}, LE{"Dst", argsStr}) - cmdline, exists := sender.Exec[handle] - if !exists || len(cmdline) == 0 { + cmdline := sender.Exec[handle] + if len(cmdline) == 0 { err = errors.New("No handle found") ctx.LogE( "rx-no-handle", les, err, @@ -165,11 +165,11 @@ }) return err } if len(sendmail) > 0 && ctx.NotifyExec != nil { - notify, exists := ctx.NotifyExec[sender.Name+"."+handle] - if !exists { - notify, exists = ctx.NotifyExec["*."+handle] + notify := ctx.NotifyExec[sender.Name+"."+handle] + if notify == nil { + notify = ctx.NotifyExec["*."+handle] } - if exists { + if notify != nil { cmd := exec.Command( sendmail[0], append(sendmail[1:], notify.To)...,