From: Sergey Matveev Date: Sat, 21 Dec 2019 17:42:40 +0000 (+0300) Subject: Lock during tossing X-Git-Tag: v5.3.0^2 X-Git-Url: http://www.git.cypherpunks.ru/?p=nncp.git;a=commitdiff_plain;h=2eb26bb13890654bfeb6385ddad40a233da3e601 Lock during tossing --- diff --git a/doc/news.ru.texi b/doc/news.ru.texi index 3ac7b2f..ba34716 100644 --- a/doc/news.ru.texi +++ b/doc/news.ru.texi @@ -27,6 +27,10 @@ SP протокол порождает меньше вызовов записе пакеты в SP-соединении. Это позволит быстрее понимать что соединение более не работоспособно. +@item +@command{nncp-toss} использует lock-file для предотвращения +одновременной обработки зашифрованных пакетов. + @end itemize @node Релиз 5.2.1 diff --git a/doc/news.texi b/doc/news.texi index fe27bb1..9d9e877 100644 --- a/doc/news.texi +++ b/doc/news.texi @@ -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 diff --git a/doc/spool.texi b/doc/spool.texi index 98532ae..5e7812d 100644 --- a/doc/spool.texi +++ b/doc/spool.texi @@ -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 diff --git a/src/cmd/nncp-xfer/main.go b/src/cmd/nncp-xfer/main.go index f451b10..1a2351d 100644 --- a/src/cmd/nncp-xfer/main.go +++ b/src/cmd/nncp-xfer/main.go @@ -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 } diff --git a/src/lockdir.go b/src/lockdir.go index d26f85f..f87e6c6 100644 --- a/src/lockdir.go +++ b/src/lockdir.go @@ -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, diff --git a/src/sp.go b/src/sp.go index 1d4e1c6..1297c41 100644 --- 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 } diff --git a/src/toss.go b/src/toss.go index 05b5a3a..0bedeca 100644 --- a/src/toss.go +++ b/src/toss.go @@ -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)