Skip to content

Commit

Permalink
Merge pull request #336 from go-playground/correct-var-lock
Browse files Browse the repository at this point in the history
Correct Var tagCache locking
  • Loading branch information
deankarn committed Jan 14, 2018
2 parents 230db62 + e00f5e0 commit 48a433b
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 43 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Package validator
================
<img align="right" src="https://raw.githubusercontent.com/go-playground/validator/v9/logo.png">[![Join the chat at https://gitter.im/go-playground/validator](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/go-playground/validator?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
![Project status](https://img.shields.io/badge/version-9.9.2-green.svg)
![Project status](https://img.shields.io/badge/version-9.9.3-green.svg)
[![Build Status](https://semaphoreci.com/api/v1/joeybloggs/validator/branches/v9/badge.svg)](https://semaphoreci.com/joeybloggs/validator)
[![Coverage Status](https://coveralls.io/repos/go-playground/validator/badge.svg?branch=v9&service=github)](https://coveralls.io/github/go-playground/validator?branch=v9)
[![Go Report Card](https://goreportcard.com/badge/github.com/go-playground/validator)](https://goreportcard.com/report/github.com/go-playground/validator)
Expand Down
19 changes: 18 additions & 1 deletion cache.go
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,23 @@ func (v *Validate) parseFieldTagsRecursive(tag string, fieldName string, alias s
current.isBlockEnd = true
}
}

return
}

func (v *Validate) fetchCacheTag(tag string) *cTag {
// find cached tag
ctag, found := v.tagCache.Get(tag)
if !found {
v.tagCache.lock.Lock()
defer v.tagCache.lock.Unlock()

// could have been multiple trying to access, but once first is done this ensures tag
// isn't parsed again.
ctag, found = v.tagCache.Get(tag)
if !found {
ctag, _ = v.parseFieldTagsRecursive(tag, "", "", false)
v.tagCache.Set(tag, ctag)
}
}
return ctag
}
2 changes: 0 additions & 2 deletions validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -473,9 +473,7 @@ OUTER:
)

return

}

ct = ct.next
}
}
Expand Down
41 changes: 2 additions & 39 deletions validator_instance.go
Original file line number Diff line number Diff line change
Expand Up @@ -520,36 +520,18 @@ func (v *Validate) VarCtx(ctx context.Context, field interface{}, tag string) (e
return nil
}

// find cached tag
ctag, ok := v.tagCache.Get(tag)
if !ok {
v.tagCache.lock.Lock()
defer v.tagCache.lock.Unlock()

// could have been multiple trying to access, but once first is done this ensures tag
// isn't parsed again.
ctag, ok = v.tagCache.Get(tag)
if !ok {
ctag, _ = v.parseFieldTagsRecursive(tag, "", "", false)
v.tagCache.Set(tag, ctag)
}
}

ctag := v.fetchCacheTag(tag)
val := reflect.ValueOf(field)

vd := v.pool.Get().(*validate)
vd.top = val
vd.isPartial = false

vd.traverseField(ctx, val, val, vd.ns[0:0], vd.actualNs[0:0], defaultCField, ctag)

if len(vd.errs) > 0 {
err = vd.errs
vd.errs = nil
}

v.pool.Put(vd)

return
}

Expand Down Expand Up @@ -590,36 +572,17 @@ func (v *Validate) VarWithValueCtx(ctx context.Context, field interface{}, other
if len(tag) == 0 || tag == skipValidationTag {
return nil
}

// find cached tag
ctag, ok := v.tagCache.Get(tag)
if !ok {
v.tagCache.lock.Lock()
defer v.tagCache.lock.Unlock()

// could have been multiple trying to access, but once first is done this ensures tag
// isn't parsed again.
ctag, ok = v.tagCache.Get(tag)
if !ok {
ctag, _ = v.parseFieldTagsRecursive(tag, "", "", false)
v.tagCache.Set(tag, ctag)
}
}

ctag := v.fetchCacheTag(tag)
otherVal := reflect.ValueOf(other)

vd := v.pool.Get().(*validate)
vd.top = otherVal
vd.isPartial = false

vd.traverseField(ctx, otherVal, reflect.ValueOf(field), vd.ns[0:0], vd.actualNs[0:0], defaultCField, ctag)

if len(vd.errs) > 0 {
err = vd.errs
vd.errs = nil
}

v.pool.Put(vd)

return
}

0 comments on commit 48a433b

Please sign in to comment.