From 5a5e7d4bdae5861a0c57e69fc1b8d6270a89ea2a Mon Sep 17 00:00:00 2001 From: cc Date: Tue, 5 Sep 2023 08:30:04 +0800 Subject: [PATCH 1/2] fixbug: Parallel panic use recover --- base/parallel/parallel.go | 2 ++ base/parallel/parallel_test.go | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/base/parallel/parallel.go b/base/parallel/parallel.go index f0143ddee..d06e4e9e7 100644 --- a/base/parallel/parallel.go +++ b/base/parallel/parallel.go @@ -15,6 +15,7 @@ package parallel import ( + "github.com/zhenghaoz/gorse/base" "sync" "github.com/juju/errors" @@ -56,6 +57,7 @@ func Parallel(nJobs, nWorkers int, worker func(workerId, jobId int) error) error for j := 0; j < nWorkers; j++ { // start workers go func(workerId int) { + defer base.CheckPanic() defer wg.Done() for { // read job diff --git a/base/parallel/parallel_test.go b/base/parallel/parallel_test.go index 9f63fb2fb..5b7063e11 100644 --- a/base/parallel/parallel_test.go +++ b/base/parallel/parallel_test.go @@ -141,3 +141,14 @@ func TestSplit(t *testing.T) { b = Split(a, 3) assert.Equal(t, [][]int{{1, 2, 3}, {4, 5}, {6, 7}}, b) } + +// check panic +func TestParallelPanic(t *testing.T) { + err := Parallel(10000, 4, func(workerId, jobId int) error { + panic("panic") + }) + if err != nil { + return + } + time.Sleep(time.Second * 3) +} From 17357f6ed6f9a99ad660ff0b3e9c432a92f10d38 Mon Sep 17 00:00:00 2001 From: cc Date: Tue, 5 Sep 2023 19:02:36 +0800 Subject: [PATCH 2/2] redis query categories use escape --- storage/cache/redis.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/storage/cache/redis.go b/storage/cache/redis.go index 91b36b706..3a914f872 100644 --- a/storage/cache/redis.go +++ b/storage/cache/redis.go @@ -260,7 +260,7 @@ func (r *Redis) SearchDocuments(ctx context.Context, collection, subset string, builder.WriteString(fmt.Sprintf(" @subset:{ %s }", escape(subset))) } for _, q := range query { - builder.WriteString(fmt.Sprintf(" @categories:{ %s }", encdodeCategory(q))) + builder.WriteString(fmt.Sprintf(" @categories:{ %s }", escape(encdodeCategory(q)))) } args := []any{"FT.SEARCH", r.DocumentTable(), builder.String(), "SORTBY", "score", "DESC", "LIMIT", begin} if end == -1 { @@ -560,6 +560,7 @@ func escape(s string) string { ":", "\\:", ".", "\\.", "/", "\\/", + "+", "\\+", ) return r.Replace(s) }