]> Cypherpunks.ru repositories - goredo.git/blobdiff - ood.go
Storage optimisations for the same often used data
[goredo.git] / ood.go
diff --git a/ood.go b/ood.go
index dffaa4ef06b8ea1335e51636751a880d0191cbe7..9a70be41a54bbc95776a632f90453804154a27cb 100644 (file)
--- a/ood.go
+++ b/ood.go
@@ -20,7 +20,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 package main
 
 import (
-       "bytes"
        "errors"
        "fmt"
        "io"
@@ -49,6 +48,7 @@ var (
 
        OODCache        = make(map[string]bool)
        FileExistsCache = make(map[string]bool)
+       DepInfoCache    = make(map[string]*DepInfo)
 
        ErrMissingTarget = errors.New("invalid format of .rec: missing Target")
 )
@@ -105,22 +105,27 @@ func isOOD(tgt *Tgt, level int, seen map[string]*Tgt) (bool, error) {
                tracef(CDebug, "ood: %s%s -> cached: %v", indent, tgt, ood)
                return ood, nil
        }
-       depInfo, err := depRead(tgt)
-       if err != nil {
-               if errors.Is(err, fs.ErrNotExist) {
-                       if isSrc(tgt) {
-                               ood = false
-                               tracef(CDebug, "ood: %s%s -> is source", indent, tgt)
-                       } else {
-                               ood = true
-                               tracef(CDebug, "ood: %s%s -> no dep: %s", indent, tgt, tgt.Dep())
-                       }
-                       OODCache[tgt.a] = ood
-                       return ood, nil
-               }
+       depInfo := DepInfoCache[tgt.Dep()]
+       var err error
+       if depInfo == nil {
+               depInfo, err = depRead(tgt)
                if err != nil {
-                       return true, TgtError{tgt, ErrLine(err)}
+                       if errors.Is(err, fs.ErrNotExist) {
+                               if isSrc(tgt) {
+                                       ood = false
+                                       tracef(CDebug, "ood: %s%s -> is source", indent, tgt)
+                               } else {
+                                       ood = true
+                                       tracef(CDebug, "ood: %s%s -> no dep: %s", indent, tgt, tgt.Dep())
+                               }
+                               OODCache[tgt.a] = ood
+                               return ood, nil
+                       }
+                       if err != nil {
+                               return true, TgtError{tgt, ErrLine(err)}
+                       }
                }
+               DepInfoCache[tgt.Dep()] = depInfo
        }
 
        if depInfo.build == BuildUUID {
@@ -183,7 +188,7 @@ func isOOD(tgt *Tgt, level int, seen map[string]*Tgt) (bool, error) {
                        if err != nil {
                                return ood, TgtError{tgt, ErrLine(err)}
                        }
-                       if !bytes.Equal(dep.hash, hsh) {
+                       if dep.hash != hsh {
                                tracef(CDebug, "ood: %s%s -> %s: hash differs", indent, tgt, dep.tgt)
                                ood = true
                                OODCache[dep.tgt.a] = ood