From cfdbd3cf6f137d642f26664c935fdb33a0eb6b8e Mon Sep 17 00:00:00 2001 From: Tom Clegg Date: Wed, 26 Feb 2020 10:17:32 -0500 Subject: [PATCH] 15954: Move PortableDataHash func to sdk/go/arvados. Arvados-DCO-1.1-Signed-off-by: Tom Clegg --- lib/controller/federation/conn.go | 23 +---------------------- sdk/go/arvados/collection.go | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/lib/controller/federation/conn.go b/lib/controller/federation/conn.go index 3eca637058..3909b6cdd5 100644 --- a/lib/controller/federation/conn.go +++ b/lib/controller/federation/conn.go @@ -7,7 +7,6 @@ package federation import ( "bytes" "context" - "crypto/md5" "encoding/json" "errors" "fmt" @@ -169,26 +168,6 @@ func rewriteManifest(mt, remoteID string) string { }) } -// this could be in sdk/go/arvados -func portableDataHash(mt string) string { - h := md5.New() - blkRe := regexp.MustCompile(`^ [0-9a-f]{32}\+\d+`) - size := 0 - _ = regexp.MustCompile(` ?[^ ]*`).ReplaceAllFunc([]byte(mt), func(tok []byte) []byte { - if m := blkRe.Find(tok); m != nil { - // write hash+size, ignore remaining block hints - tok = m - } - n, err := h.Write(tok) - if err != nil { - panic(err) - } - size += n - return nil - }) - return fmt.Sprintf("%x+%d", h.Sum(nil), size) -} - func (conn *Conn) ConfigGet(ctx context.Context) (json.RawMessage, error) { var buf bytes.Buffer err := config.ExportJSON(&buf, conn.cluster) @@ -243,7 +222,7 @@ func (conn *Conn) CollectionGet(ctx context.Context, options arvados.GetOptions) // options.UUID is either hash+size or // hash+size+hints; only hash+size need to // match the computed PDH. - if pdh := portableDataHash(c.ManifestText); pdh != options.UUID && !strings.HasPrefix(options.UUID, pdh+"+") { + if pdh := arvados.PortableDataHash(c.ManifestText); pdh != options.UUID && !strings.HasPrefix(options.UUID, pdh+"+") { err = httpErrorf(http.StatusBadGateway, "bad portable data hash %q received from remote %q (expected %q)", pdh, remoteID, options.UUID) ctxlog.FromContext(ctx).Warn(err) return err diff --git a/sdk/go/arvados/collection.go b/sdk/go/arvados/collection.go index 35fd3fd740..030665d77f 100644 --- a/sdk/go/arvados/collection.go +++ b/sdk/go/arvados/collection.go @@ -6,7 +6,9 @@ package arvados import ( "bufio" + "crypto/md5" "fmt" + "regexp" "strings" "time" @@ -90,3 +92,28 @@ type CollectionList struct { Offset int `json:"offset"` Limit int `json:"limit"` } + +var ( + blkRe = regexp.MustCompile(`^ [0-9a-f]{32}\+\d+`) + tokRe = regexp.MustCompile(` ?[^ ]*`) +) + +// PortableDataHash computes the portable data hash of the given +// manifest. +func PortableDataHash(mt string) string { + h := md5.New() + size := 0 + _ = tokRe.ReplaceAllFunc([]byte(mt), func(tok []byte) []byte { + if m := blkRe.Find(tok); m != nil { + // write hash+size, ignore remaining block hints + tok = m + } + n, err := h.Write(tok) + if err != nil { + panic(err) + } + size += n + return nil + }) + return fmt.Sprintf("%x+%d", h.Sum(nil), size) +} -- 2.39.5