Skip to content
This repository has been archived by the owner on Oct 13, 2021. It is now read-only.

bug: race condition on parallel search #82

Open
bobheadxi opened this issue Feb 11, 2019 · 0 comments
Open

bug: race condition on parallel search #82

bobheadxi opened this issue Feb 11, 2019 · 0 comments

Comments

@bobheadxi
Copy link

bobheadxi commented Feb 11, 2019

  • Ego version (or commit ref): * cd980ec
  • Go version: 1.11
  • Gcc version:
  • Operating system and bit: macos mojave 64bit
  • Provide example code:
		t.Run("index "+tt.args.object.Hash, func(t *testing.T) {
			t.Parallel()

			// request index
			if err = e.Index(Document{tt.args.object, "", true}); err != nil {
				t.Errorf("wanted Index error = false, got %v", err)
			}

			// we'll be referring to this hash a few times
			var objHash = tt.args.object.Hash

			// make sure object can be found
			if !e.IsIndexed(objHash) {
				t.Errorf("wanted IsIndexed = true, got false")
			}

			// attempt search
			if res, err := e.Search(Query{
				Text:   tt.args.content,
				Hashes: []string{objHash},
			}); err != nil && len(res) > 0 {
				if res[0].Hash != objHash {
					t.Errorf("wanted Search to find '%s', but failed", objHash)
				}
			} else {
				t.Errorf("wanted Search to find '%s', but failed", objHash)
			}

the full code is available at https://github.com/RTradeLtd/Lens/blob/engine/riot%23parallel-tests/engine/engine_parallel_test.go

the race condition appears to be in https://github.com/go-ego/gse/blob/master/hmm/hmm_seg.go#L18, where the library attempts to write to a global map.

# .... snip
fatal error: concurrent map writes
fatal error: concurrent map writes

goroutine 438 [running]:
runtime.throw(0x47ddbb0, 0x15)
	/usr/local/Cellar/go/1.11.3/libexec/src/runtime/panic.go:608 +0x72 fp=0xc012007070 sp=0xc012007040 pc=0x402e082
runtime.mapassign(0x46d6480, 0xc0000bfe60, 0x4885433, 0xc00e963cf0)
	/usr/local/Cellar/go/1.11.3/libexec/src/runtime/map.go:651 +0x545 fp=0xc0120070f8 sp=0xc012007070 pc=0x40103b5
github.com/RTradeLtd/Lens/vendor/github.com/go-ego/gse/hmm.loadDefEmit()
	/Users/robertlin/go/src/github.com/RTradeLtd/Lens/vendor/github.com/go-ego/gse/hmm/prob_emit.go:9 +0xcc fp=0xc012007150 sp=0xc0120070f8 pc=0x4448efc
github.com/RTradeLtd/Lens/vendor/github.com/go-ego/gse/hmm.LoadModel(0x0, 0x0, 0x0)
	/Users/robertlin/go/src/github.com/RTradeLtd/Lens/vendor/github.com/go-ego/gse/hmm/hmm_seg.go:28 +0x1b4 fp=0xc012007188 sp=0xc012007150 pc=0x4448134
github.com/RTradeLtd/Lens/vendor/github.com/go-ego/gse.(*Segmenter).LoadModel(0xc000354398, 0x0, 0x0, 0x0)
	/Users/robertlin/go/src/github.com/RTradeLtd/Lens/vendor/github.com/go-ego/gse/segmenter.go:107 +0x3f fp=0xc0120071b0 sp=0xc012007188 pc=0x444f81f
github.com/RTradeLtd/Lens/vendor/github.com/go-ego/gse.(*Segmenter).cutDAG(0xc000354398, 0x47d6387, 0xf, 0x0, 0x0, 0x0, 0xc000da0630, 0x3, 0xc000053970)
	/Users/robertlin/go/src/github.com/RTradeLtd/Lens/vendor/github.com/go-ego/gse/dag.go:129 +0x6a fp=0xc012007348 sp=0xc0120071b0 pc=0x444bd1a
github.com/RTradeLtd/Lens/vendor/github.com/go-ego/gse.(*Segmenter).Cut(0xc000354398, 0x47d6387, 0xf, 0xc012007490, 0x1, 0x1, 0x240, 0xc0012161e0, 0x1800)
	/Users/robertlin/go/src/github.com/RTradeLtd/Lens/vendor/github.com/go-ego/gse/segmenter.go:74 +0xe7 fp=0xc012007408 sp=0xc012007348 pc=0x444f207
github.com/RTradeLtd/Lens/vendor/github.com/go-ego/riot.(*Engine).Segment(0xc000354240, 0x47d6387, 0xf, 0xf, 0xc0003846a8, 0xc000384680)
	/Users/robertlin/go/src/github.com/RTradeLtd/Lens/vendor/github.com/go-ego/riot/engine.go:487 +0x2eb fp=0xc0120074c0 sp=0xc012007408 pc=0x445c60b
github.com/RTradeLtd/Lens/vendor/github.com/go-ego/riot.(*Engine).Tokens(0xc000354240, 0x47d6387, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
	/Users/robertlin/go/src/github.com/RTradeLtd/Lens/vendor/github.com/go-ego/riot/engine.go:510 +0x2fc fp=0xc012007550 sp=0xc0120074c0 pc=0x445c92c
github.com/RTradeLtd/Lens/vendor/github.com/go-ego/riot.(*Engine).Search(0xc000354240, 0x47d6387, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
	/Users/robertlin/go/src/github.com/RTradeLtd/Lens/vendor/github.com/go-ego/riot/engine.go:767 +0x9c fp=0xc012007888 sp=0xc012007550 pc=0x445e56c
github.com/RTradeLtd/Lens/engine.(*Engine).Search(0xc01179fb80, 0x47d6387, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
	/Users/robertlin/go/src/github.com/RTradeLtd/Lens/engine/engine.go:283 +0x46b fp=0xc012007de0 sp=0xc012007888 pc=0x463349b
github.com/RTradeLtd/Lens/engine.TestEngine_parallel.func1(0xc000148700)
	/Users/robertlin/go/src/github.com/RTradeLtd/Lens/engine/engine_parallel_test.go:76 +0x252 fp=0xc012007fa8 sp=0xc012007de0 pc=0x46362c2
testing.tRunner(0xc000148700, 0xc01128c750)
	/usr/local/Cellar/go/1.11.3/libexec/src/testing/testing.go:827 +0xbf fp=0xc012007fd0 sp=0xc012007fa8 pc=0x40f17ff
runtime.goexit()
	/usr/local/Cellar/go/1.11.3/libexec/src/runtime/asm_amd64.s:1333 +0x1 fp=0xc012007fd8 sp=0xc012007fd0 pc=0x405ded1
created by testing.(*T).Run
	/usr/local/Cellar/go/1.11.3/libexec/src/testing/testing.go:878 +0x353

# ......... snip
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant