]> Cypherpunks.ru repositories - nncp.git/blobdiff - src/sp.go
NNCPNOSYNC environment variable
[nncp.git] / src / sp.go
index 1f2e91504dfd7d71c15cb86787fc68afeafb52fb..772d92c4d729bb4fbec8ba066ae67a3438e45807 100644 (file)
--- a/src/sp.go
+++ b/src/sp.go
@@ -1,6 +1,6 @@
 /*
 NNCP -- Node to Node copy, utilities for store-and-forward data exchange
-Copyright (C) 2016-2021 Sergey Matveev <stargrave@stargrave.org>
+Copyright (C) 2016-2022 Sergey Matveev <stargrave@stargrave.org>
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -27,6 +27,7 @@ import (
        "os"
        "path/filepath"
        "sort"
+       "strconv"
        "sync"
        "time"
 
@@ -39,6 +40,7 @@ const (
        MaxSPSize      = 1<<16 - 256
        PartSuffix     = ".part"
        SPHeadOverhead = 4
+       CfgDeadline    = "NNCPDEADLINE"
 )
 
 type MTHAndOffset struct {
@@ -132,6 +134,14 @@ type ConnDeadlined interface {
 }
 
 func init() {
+       if v := os.Getenv(CfgDeadline); v != "" {
+               i, err := strconv.Atoi(v)
+               if err != nil {
+                       log.Fatalln("Can not convert", CfgDeadline, "to integer:", err)
+               }
+               DefaultDeadline = time.Duration(i) * time.Second
+       }
+
        var buf bytes.Buffer
        spHead := SPHead{Type: SPTypeHalt}
        if _, err := xdr.Marshal(&buf, spHead); err != nil {
@@ -1263,7 +1273,10 @@ func (state *SPState) ProcessSP(payload []byte) ([][]byte, error) {
                                }
                                continue
                        }
-                       if _, err = os.Stat(pktPath + SeenSuffix); err == nil {
+                       if _, err = os.Stat(filepath.Join(
+                               state.Ctx.Spool, state.Node.Id.String(), string(TRx),
+                               SeenDir, Base32Codec.EncodeToString(info.Hash[:]),
+                       )); err == nil {
                                state.Ctx.LogI("sp-info-seen", lesp, func(les LEs) string {
                                        return logMsg(les) + ": already seen"
                                })
@@ -1448,13 +1461,15 @@ func (state *SPState) ProcessSP(payload []byte) ([][]byte, error) {
                                        humanize.IBytes(uint64(fullsize)),
                                )
                        }
-                       err = fd.Sync()
-                       if err != nil {
-                               state.Ctx.LogE("sp-file-sync", lesp, err, func(les LEs) string {
-                                       return logMsg(les) + ": syncing"
-                               })
-                               state.closeFd(filePathPart)
-                               continue
+                       if !NoSync {
+                               err = fd.Sync()
+                               if err != nil {
+                                       state.Ctx.LogE("sp-file-sync", lesp, err, func(les LEs) string {
+                                               return logMsg(les) + ": syncing"
+                                       })
+                                       state.closeFd(filePathPart)
+                                       continue
+                               }
                        }
                        if hasherAndOffset != nil {
                                delete(state.fileHashers, filePath)
@@ -1584,7 +1599,7 @@ func (state *SPState) ProcessSP(payload []byte) ([][]byte, error) {
                                        return fmt.Sprintf("Packet %s is sent", pktName)
                                })
                                if state.Ctx.HdrUsage {
-                                       os.Remove(pth + HdrSuffix)
+                                       os.Remove(JobPath2Hdr(pth))
                                }
                        } else {
                                state.Ctx.LogE("sp-done", lesp, err, logMsg)