]> Cypherpunks.ru repositories - nncp.git/commitdiff
Lock during tossing
authorSergey Matveev <stargrave@stargrave.org>
Sat, 21 Dec 2019 17:42:40 +0000 (20:42 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Sun, 22 Dec 2019 18:13:04 +0000 (21:13 +0300)
doc/news.ru.texi
doc/news.texi
doc/spool.texi
src/cmd/nncp-xfer/main.go
src/lockdir.go
src/sp.go
src/toss.go

index 3ac7b2f93f076e2aab55efc396d60916dc156705..ba347167b8a4416a48c6fa79f943b5d3e8d0920b 100644 (file)
@@ -27,6 +27,10 @@ SP протокол порождает меньше вызовов записе
 пакеты в SP-соединении. Это позволит быстрее понимать что соединение
 более не работоспособно.
 
+@item
+@command{nncp-toss} использует lock-file для предотвращения
+одновременной обработки зашифрованных пакетов.
+
 @end itemize
 
 @node Релиз 5.2.1
index fe27bb14c73ca06d17f9da93e597bd4a3b64f6fa..9d9e877d85548015168275447680c26bead33777 100644 (file)
@@ -28,6 +28,9 @@ second, independently from socket reads (up to 10 seconds).
 Once per minute, if no other traffic exists, PING packets are sent in
 SP-connection. That allows faster determining of connection unworkability.
 
+@item
+@command{nncp-toss} uses lock-file to prevent simultaneous tossing.
+
 @end itemize
 
 @node Release 5.2.1
index 98532ae803597b7784ec5eb8c9f0ae76cd4b6350..5e7812d50b6a0944356aed56ce12bcc488662b55 100644 (file)
@@ -10,6 +10,7 @@ spool/tmp/
 spool/2WHB...OABQ/rx.lock
 spool/2WHB...OABQ/rx/5ZIB...UMKW.part
 spool/2WHB...OABQ/tx.lock
+spool/2WHB...OABQ/toss.lock
 spool/BYRR...CG6Q/rx.lock
 spool/BYRR...CG6Q/rx/
 spool/BYRR...CG6Q/tx.lock
index f451b10c1ef920f527b45fc4de2bfd4eb77886bc..1a2351d4ed92526bd01c61eba8f58fad9efcc79a 100644 (file)
@@ -262,7 +262,7 @@ Tx:
                        ctx.LogD("nncp-xfer", sds, "skip")
                        continue
                }
-               dirLock, err := ctx.LockDir(&nodeId, nncp.TTx)
+               dirLock, err := ctx.LockDir(&nodeId, string(nncp.TTx))
                if err != nil {
                        continue
                }
index d26f85f706eceb4913392cad17ff285cf1dd8d00..f87e6c6afbf67dd132d992b9eb144c1ea4fc8e17 100644 (file)
@@ -24,9 +24,9 @@ import (
        "golang.org/x/sys/unix"
 )
 
-func (ctx *Ctx) LockDir(nodeId *NodeId, xx TRxTx) (*os.File, error) {
+func (ctx *Ctx) LockDir(nodeId *NodeId, lockCtx string) (*os.File, error) {
        ctx.ensureRxDir(nodeId)
-       lockPath := filepath.Join(ctx.Spool, nodeId.String(), string(xx)) + ".lock"
+       lockPath := filepath.Join(ctx.Spool, nodeId.String(), lockCtx) + ".lock"
        dirLock, err := os.OpenFile(
                lockPath,
                os.O_CREATE|os.O_WRONLY,
index 1d4e1c60c271ada75da2e3c22b1a0b91d086b9dd..1297c414cb3d5c175720fc0178fe3e21224fec40 100644 (file)
--- a/src/sp.go
+++ b/src/sp.go
@@ -335,14 +335,14 @@ func (state *SPState) StartI(conn ConnDeadlined) error {
        }
        var rxLock *os.File
        if !state.listOnly && (state.xxOnly == "" || state.xxOnly == TRx) {
-               rxLock, err = state.Ctx.LockDir(nodeId, TRx)
+               rxLock, err = state.Ctx.LockDir(nodeId, string(TRx))
                if err != nil {
                        return err
                }
        }
        var txLock *os.File
        if !state.listOnly && (state.xxOnly == "" || state.xxOnly == TTx) {
-               txLock, err = state.Ctx.LockDir(nodeId, TTx)
+               txLock, err = state.Ctx.LockDir(nodeId, string(TTx))
                if err != nil {
                        return err
                }
@@ -481,7 +481,7 @@ func (state *SPState) StartR(conn ConnDeadlined) error {
        }
        var rxLock *os.File
        if xxOnly == "" || xxOnly == TRx {
-               rxLock, err = state.Ctx.LockDir(node.Id, TRx)
+               rxLock, err = state.Ctx.LockDir(node.Id, string(TRx))
                if err != nil {
                        return err
                }
@@ -489,7 +489,7 @@ func (state *SPState) StartR(conn ConnDeadlined) error {
        state.rxLock = rxLock
        var txLock *os.File
        if xxOnly == "" || xxOnly == TTx {
-               txLock, err = state.Ctx.LockDir(node.Id, TTx)
+               txLock, err = state.Ctx.LockDir(node.Id, string(TTx))
                if err != nil {
                        return err
                }
index 05b5a3a6a51cde6862f3f5344bf2d480681f6c1c..0bedecae7a76440b3812519b5fe37c433e4fbcbd 100644 (file)
@@ -68,6 +68,12 @@ func (ctx *Ctx) Toss(
        nice uint8,
        dryRun, doSeen, noFile, noFreq, noExec, noTrns bool,
 ) bool {
+       dirLock, err := ctx.LockDir(nodeId, "toss")
+       if err != nil {
+               ctx.LogE("rx", SDS{}, err, "lock")
+               return false
+       }
+       defer ctx.UnlockDir(dirLock)
        isBad := false
        sendmail := ctx.Neigh[*ctx.SelfId].Exec["sendmail"]
        decompressor, err := zstd.NewReader(nil)