@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}
@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
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
const Base32Encoded32Len = 52
var (
- Version string = "7.2.0"
+ Version string = "7.2.1"
Base32Codec *base32.Encoding = base32.StdEncoding.WithPadding(base32.NoPadding)
)
}
}
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
func ProgressKill(pkt string) {
progressBarsLock.Lock()
- pb, exists := progressBars[pkt]
- if exists {
+ pb := progressBars[pkt]
+ if pb != nil {
pb.Kill()
delete(progressBars, pkt)
}
defer conn.Close()
defer state.SetDead()
defer state.wg.Done()
+ buf := make([]byte, MaxSPSize-SPHeadOverhead-SPFileOverhead)
for {
if state.NotAlive() {
return
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 {
}
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"
})
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 {
})
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(
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)},
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()
}
}
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"
})
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"})
}
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,
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)...,