}
func (ks *keepstore) BlockRead(ctx context.Context, opts arvados.BlockReadOptions) (n int, err error) {
- li, err := parseLocator(opts.Locator)
+ li, err := getLocatorInfo(opts.Locator)
if err != nil {
return 0, err
}
}
func (ks *keepstore) BlockUntrash(ctx context.Context, locator string) error {
- li, err := parseLocator(locator)
+ li, err := getLocatorInfo(locator)
if err != nil {
return err
}
}
func (ks *keepstore) BlockTouch(ctx context.Context, locator string) error {
- li, err := parseLocator(locator)
+ li, err := getLocatorInfo(locator)
if err != nil {
return err
}
if !ks.cluster.Collections.BlobTrash {
return errMethodNotAllowed
}
- li, err := parseLocator(locator)
+ li, err := getLocatorInfo(locator)
if err != nil {
return err
}
}
}
+// locatorInfo expresses the attributes of a locator that are relevant
+// for keepstore decision-making.
type locatorInfo struct {
hash string
size int
- remote bool
- signed bool
+ remote bool // locator has a +R hint
+ signed bool // locator has a +A hint
}
-func parseLocator(loc string) (locatorInfo, error) {
+func getLocatorInfo(loc string) (locatorInfo, error) {
var li locatorInfo
for i, part := range strings.Split(loc, "+") {
if i == 0 {
logger := p.keepstore.logger.WithField("locator", item.Locator)
- li, err := parseLocator(item.Locator)
+ li, err := getLocatorInfo(item.Locator)
if err != nil {
logger.Warn("ignoring pull request for invalid locator")
return
out := w
if req.Method == http.MethodHead {
out = discardWrite{ResponseWriter: w}
- } else if li, err := parseLocator(mux.Vars(req)["locator"]); err != nil {
+ } else if li, err := getLocatorInfo(mux.Vars(req)["locator"]); err != nil {
rtr.handleError(w, req, err)
return
} else if li.size == 0 && li.hash != "d41d8cd98f00b204e9800998ecf8427e" {
defer t.inprogress.Add(-1)
logger := t.keepstore.logger.WithField("locator", item.Locator)
- li, err := parseLocator(item.Locator)
+ li, err := getLocatorInfo(item.Locator)
if err != nil {
logger.Warn("ignoring trash request for invalid locator")
return