You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@devlake.apache.org by kl...@apache.org on 2022/06/20 03:33:24 UTC

[incubator-devlake] branch main updated: github comment task refactor (#2204)

This is an automated email from the ASF dual-hosted git repository.

klesh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git


The following commit(s) were added to refs/heads/main by this push:
     new dcd72ad6 github comment task refactor (#2204)
dcd72ad6 is described below

commit dcd72ad67453cbaf304051378cf25cbb434f26ad
Author: likyh <l...@likyh.com>
AuthorDate: Mon Jun 20 11:33:20 2022 +0800

    github comment task refactor (#2204)
    
    * base csv
    
    * base code
    
    * add connection id
    
    * delete unuse check
    
    * append
    
    * fix comment
    
    * fix for review
    
    Co-authored-by: linyh <ya...@meri.co>
---
 helpers/e2ehelper/data_flow_tester.go              |  29 ++++-
 plugins/github/e2e/comment_test.go                 | 135 +++++++++++++++++++++
 .../e2e/raw_tables/_raw_github_api_comments.csv    |  95 +++++++++++++++
 .../_tool_github_issue_comments.csv                |  49 ++++++++
 .../_tool_github_pull_request_comments.csv         |  47 +++++++
 .../github/e2e/snapshot_tables/issue_comments.csv  |  49 ++++++++
 .../e2e/snapshot_tables/pull_request_comments.csv  |  47 +++++++
 plugins/github/models/issue_comment.go             |   5 +-
 .../migrationscripts/archived/issue_comment.go     |   5 +-
 .../archived/pull_request_comment.go               |   5 +-
 .../migrationscripts/init_schema_20220611.go       |   2 +-
 plugins/github/models/pr_comment.go                |   5 +-
 plugins/github/tasks/comment_collector.go          |  29 +++--
 plugins/github/tasks/comment_extractor.go          |  18 +--
 plugins/github/tasks/issue_comment_convertor.go    |  22 ++--
 plugins/github/tasks/pr_comment_convertor.go       |  22 ++--
 16 files changed, 515 insertions(+), 49 deletions(-)

diff --git a/helpers/e2ehelper/data_flow_tester.go b/helpers/e2ehelper/data_flow_tester.go
index 53bc83c9..1b7dab52 100644
--- a/helpers/e2ehelper/data_flow_tester.go
+++ b/helpers/e2ehelper/data_flow_tester.go
@@ -98,16 +98,37 @@ func NewDataFlowTester(t *testing.T, pluginName string, pluginMeta core.PluginMe
 	}
 }
 
-// ImportCsvIntoRawTable imports records from specified csv file into target table, note that existing data would be deleted first.
-func (t *DataFlowTester) ImportCsvIntoRawTable(csvRelPath string, tableName string) {
+// ImportCsvIntoRawTable imports records from specified csv file into target raw table, note that existing data would be deleted first.
+func (t *DataFlowTester) ImportCsvIntoRawTable(csvRelPath string, rawTableName string) {
 	csvIter := pluginhelper.NewCsvFileIterator(csvRelPath)
 	defer csvIter.Close()
-	t.FlushRawTable(tableName)
+	t.FlushRawTable(rawTableName)
 	// load rows and insert into target table
 	for csvIter.HasNext() {
 		toInsertValues := csvIter.Fetch()
 		toInsertValues[`data`] = json.RawMessage(toInsertValues[`data`].(string))
-		result := t.Db.Table(tableName).Create(toInsertValues)
+		result := t.Db.Table(rawTableName).Create(toInsertValues)
+		if result.Error != nil {
+			panic(result.Error)
+		}
+		assert.Equal(t.T, int64(1), result.RowsAffected)
+	}
+}
+
+// ImportCsvIntoTabler imports records from specified csv file into target tabler, note that existing data would be deleted first.
+func (t *DataFlowTester) ImportCsvIntoTabler(csvRelPath string, dst schema.Tabler) {
+	csvIter := pluginhelper.NewCsvFileIterator(csvRelPath)
+	defer csvIter.Close()
+	t.FlushTabler(dst)
+	// load rows and insert into target table
+	for csvIter.HasNext() {
+		toInsertValues := csvIter.Fetch()
+		for i := range toInsertValues {
+			if toInsertValues[i].(string) == `` {
+				toInsertValues[i] = nil
+			}
+		}
+		result := t.Db.Model(dst).Create(toInsertValues)
 		if result.Error != nil {
 			panic(result.Error)
 		}
diff --git a/plugins/github/e2e/comment_test.go b/plugins/github/e2e/comment_test.go
new file mode 100644
index 00000000..8f87b833
--- /dev/null
+++ b/plugins/github/e2e/comment_test.go
@@ -0,0 +1,135 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package e2e
+
+import (
+	"fmt"
+	"github.com/apache/incubator-devlake/models/domainlayer/code"
+	"github.com/apache/incubator-devlake/models/domainlayer/ticket"
+	"github.com/apache/incubator-devlake/plugins/github/models"
+	"github.com/apache/incubator-devlake/plugins/github/tasks"
+	"testing"
+
+	"github.com/apache/incubator-devlake/helpers/e2ehelper"
+	"github.com/apache/incubator-devlake/plugins/github/impl"
+)
+
+func TestCommentDataFlow(t *testing.T) {
+	var plugin impl.Github
+	dataflowTester := e2ehelper.NewDataFlowTester(t, "gitlab", plugin)
+
+	githubRepository := &models.GithubRepo{
+		GithubId: 134018330,
+	}
+	taskData := &tasks.GithubTaskData{
+		Options: &tasks.GithubOptions{
+			ConnectionId: 1,
+			Owner:        "panjf2000",
+			Repo:         "ants",
+			Config: models.Config{
+				PrType:               "type/(.*)$",
+				PrComponent:          "component/(.*)$",
+				PrBodyClosePattern:   "(?mi)(fix|close|resolve|fixes|closes|resolves|fixed|closed|resolved)[\\s]*.*(((and )?(#|https:\\/\\/github.com\\/%s\\/%s\\/issues\\/)\\d+[ ]*)+)",
+				IssueSeverity:        "severity/(.*)$",
+				IssuePriority:        "^(highest|high|medium|low)$",
+				IssueComponent:       "component/(.*)$",
+				IssueTypeBug:         "^(bug|failure|error)$",
+				IssueTypeIncident:    "",
+				IssueTypeRequirement: "^(feat|feature|proposal|requirement)$",
+			},
+		},
+		Repo: githubRepository,
+	}
+
+	// import raw data table
+	dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_github_api_comments.csv", "_raw_github_api_comments")
+	dataflowTester.ImportCsvIntoTabler("./snapshot_tables/_tool_github_issues.csv", &models.GithubIssue{})
+	dataflowTester.ImportCsvIntoTabler("./snapshot_tables/_tool_github_issue_labels.csv", &models.GithubIssueLabel{})
+	dataflowTester.ImportCsvIntoTabler("./snapshot_tables/_tool_github_pull_requests.csv", models.GithubPullRequest{})
+
+	// verify extraction
+	dataflowTester.FlushTabler(&models.GithubIssueComment{})
+	dataflowTester.FlushTabler(&models.GithubPullRequestComment{})
+	dataflowTester.Subtask(tasks.ExtractApiCommentsMeta, taskData)
+	dataflowTester.VerifyTable(
+		models.GithubIssueComment{},
+		fmt.Sprintf("./snapshot_tables/%s.csv", models.GithubIssueComment{}.TableName()),
+		[]string{"connection_id", "github_id"},
+		[]string{
+			"issue_id",
+			"body",
+			"author_username",
+			"author_user_id",
+			"github_created_at",
+			"github_updated_at",
+			"_raw_data_params",
+			"_raw_data_table",
+			"_raw_data_id",
+			"_raw_data_remark",
+		},
+	)
+	dataflowTester.VerifyTable(
+		models.GithubPullRequestComment{},
+		fmt.Sprintf("./snapshot_tables/%s.csv", models.GithubPullRequestComment{}.TableName()),
+		[]string{"connection_id", "github_id"},
+		[]string{
+			"pull_request_id",
+			"body",
+			"author_username",
+			"author_user_id",
+			"github_created_at",
+			"github_updated_at",
+			"_raw_data_params",
+			"_raw_data_table",
+			"_raw_data_id",
+			"_raw_data_remark",
+		},
+	)
+
+	// verify comment conversion
+	dataflowTester.FlushTabler(&ticket.IssueComment{})
+	dataflowTester.Subtask(tasks.ConvertIssueCommentsMeta, taskData)
+	dataflowTester.VerifyTable(
+		ticket.IssueComment{},
+		fmt.Sprintf("./snapshot_tables/%s.csv", ticket.IssueComment{}.TableName()),
+		[]string{"id"},
+		[]string{
+			"issue_id",
+			"body",
+			"user_id",
+			"created_date",
+		},
+	)
+
+	// verify relation in pr and comment conversion
+	dataflowTester.FlushTabler(&code.PullRequestComment{})
+	dataflowTester.Subtask(tasks.ConvertPullRequestCommentsMeta, taskData)
+	dataflowTester.VerifyTable(
+		code.PullRequestComment{},
+		fmt.Sprintf("./snapshot_tables/%s.csv", code.PullRequestComment{}.TableName()),
+		[]string{"id"},
+		[]string{
+			"pull_request_id",
+			"body",
+			"user_id",
+			"created_date",
+			"commit_sha",
+			"position",
+		},
+	)
+}
diff --git a/plugins/github/e2e/raw_tables/_raw_github_api_comments.csv b/plugins/github/e2e/raw_tables/_raw_github_api_comments.csv
new file mode 100644
index 00000000..8cabc6e8
--- /dev/null
+++ b/plugins/github/e2e/raw_tables/_raw_github_api_comments.csv
@@ -0,0 +1,95 @@
+id,params,data,url,input,created_at
+3162,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/407675431"",""html_url"":""https://github.com/panjf2000/ants/pull/4#issuecomment-407675431"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/4"",""id"":407675431,""node_id"":""MDEyOklzc3VlQ29tbWVudDQwNzY3NTQzMQ=="",""user"":{""login"":""codecov[bot]"",""id"":22429695,""node_id"":""MDM6Qm90MjI0Mjk2OTU="",""avatar_url"":""https://a [...]
+3163,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/407714136"",""html_url"":""https://github.com/panjf2000/ants/pull/4#issuecomment-407714136"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/4"",""id"":407714136,""node_id"":""MDEyOklzc3VlQ29tbWVudDQwNzcxNDEzNg=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://avata [...]
+3164,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/407755528"",""html_url"":""https://github.com/panjf2000/ants/pull/4#issuecomment-407755528"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/4"",""id"":407755528,""node_id"":""MDEyOklzc3VlQ29tbWVudDQwNzc1NTUyOA=="",""user"":{""login"":""barryz"",""id"":16658738,""node_id"":""MDQ6VXNlcjE2NjU4NzM4"",""avatar_url"":""https://avatars [...]
+3165,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/407764945"",""html_url"":""https://github.com/panjf2000/ants/pull/4#issuecomment-407764945"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/4"",""id"":407764945,""node_id"":""MDEyOklzc3VlQ29tbWVudDQwNzc2NDk0NQ=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://avata [...]
+3166,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/409800144"",""html_url"":""https://github.com/panjf2000/ants/issues/5#issuecomment-409800144"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/5"",""id"":409800144,""node_id"":""MDEyOklzc3VlQ29tbWVudDQwOTgwMDE0NA=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://ava [...]
+3167,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/410141732"",""html_url"":""https://github.com/panjf2000/ants/issues/6#issuecomment-410141732"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/6"",""id"":410141732,""node_id"":""MDEyOklzc3VlQ29tbWVudDQxMDE0MTczMg=="",""user"":{""login"":""lovelly"",""id"":13118848,""node_id"":""MDQ6VXNlcjEzMTE4ODQ4"",""avatar_url"":""https://avat [...]
+3168,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/410143221"",""html_url"":""https://github.com/panjf2000/ants/issues/6#issuecomment-410143221"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/6"",""id"":410143221,""node_id"":""MDEyOklzc3VlQ29tbWVudDQxMDE0MzIyMQ=="",""user"":{""login"":""lovelly"",""id"":13118848,""node_id"":""MDQ6VXNlcjEzMTE4ODQ4"",""avatar_url"":""https://avat [...]
+3169,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/410147487"",""html_url"":""https://github.com/panjf2000/ants/issues/6#issuecomment-410147487"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/6"",""id"":410147487,""node_id"":""MDEyOklzc3VlQ29tbWVudDQxMDE0NzQ4Nw=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://ava [...]
+3170,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/410170764"",""html_url"":""https://github.com/panjf2000/ants/issues/6#issuecomment-410170764"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/6"",""id"":410170764,""node_id"":""MDEyOklzc3VlQ29tbWVudDQxMDE3MDc2NA=="",""user"":{""login"":""lovelly"",""id"":13118848,""node_id"":""MDQ6VXNlcjEzMTE4ODQ4"",""avatar_url"":""https://avat [...]
+3171,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/410173358"",""html_url"":""https://github.com/panjf2000/ants/issues/6#issuecomment-410173358"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/6"",""id"":410173358,""node_id"":""MDEyOklzc3VlQ29tbWVudDQxMDE3MzM1OA=="",""user"":{""login"":""lovelly"",""id"":13118848,""node_id"":""MDQ6VXNlcjEzMTE4ODQ4"",""avatar_url"":""https://avat [...]
+3172,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/410204870"",""html_url"":""https://github.com/panjf2000/ants/issues/6#issuecomment-410204870"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/6"",""id"":410204870,""node_id"":""MDEyOklzc3VlQ29tbWVudDQxMDIwNDg3MA=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://ava [...]
+3173,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/410205295"",""html_url"":""https://github.com/panjf2000/ants/issues/6#issuecomment-410205295"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/6"",""id"":410205295,""node_id"":""MDEyOklzc3VlQ29tbWVudDQxMDIwNTI5NQ=="",""user"":{""login"":""lovelly"",""id"":13118848,""node_id"":""MDQ6VXNlcjEzMTE4ODQ4"",""avatar_url"":""https://avat [...]
+3174,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/410267195"",""html_url"":""https://github.com/panjf2000/ants/issues/6#issuecomment-410267195"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/6"",""id"":410267195,""node_id"":""MDEyOklzc3VlQ29tbWVudDQxMDI2NzE5NQ=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://ava [...]
+3175,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/410290418"",""html_url"":""https://github.com/panjf2000/ants/issues/5#issuecomment-410290418"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/5"",""id"":410290418,""node_id"":""MDEyOklzc3VlQ29tbWVudDQxMDI5MDQxOA=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://ava [...]
+3176,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/411342200"",""html_url"":""https://github.com/panjf2000/ants/issues/7#issuecomment-411342200"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/7"",""id"":411342200,""node_id"":""MDEyOklzc3VlQ29tbWVudDQxMTM0MjIwMA=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://ava [...]
+3177,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/411369513"",""html_url"":""https://github.com/panjf2000/ants/issues/7#issuecomment-411369513"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/7"",""id"":411369513,""node_id"":""MDEyOklzc3VlQ29tbWVudDQxMTM2OTUxMw=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://ava [...]
+3178,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/411965696"",""html_url"":""https://github.com/panjf2000/ants/issues/7#issuecomment-411965696"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/7"",""id"":411965696,""node_id"":""MDEyOklzc3VlQ29tbWVudDQxMTk2NTY5Ng=="",""user"":{""login"":""huiwq1990"",""id"":4555057,""node_id"":""MDQ6VXNlcjQ1NTUwNTc="",""avatar_url"":""https://ava [...]
+3179,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/411969260"",""html_url"":""https://github.com/panjf2000/ants/issues/7#issuecomment-411969260"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/7"",""id"":411969260,""node_id"":""MDEyOklzc3VlQ29tbWVudDQxMTk2OTI2MA=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://ava [...]
+3180,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/416794440"",""html_url"":""https://github.com/panjf2000/ants/pull/8#issuecomment-416794440"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/8"",""id"":416794440,""node_id"":""MDEyOklzc3VlQ29tbWVudDQxNjc5NDQ0MA=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://avata [...]
+3181,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/416794871"",""html_url"":""https://github.com/panjf2000/ants/pull/8#issuecomment-416794871"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/8"",""id"":416794871,""node_id"":""MDEyOklzc3VlQ29tbWVudDQxNjc5NDg3MQ=="",""user"":{""login"":""codecov[bot]"",""id"":22429695,""node_id"":""MDM6Qm90MjI0Mjk2OTU="",""avatar_url"":""https://a [...]
+3182,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/416803651"",""html_url"":""https://github.com/panjf2000/ants/pull/8#issuecomment-416803651"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/8"",""id"":416803651,""node_id"":""MDEyOklzc3VlQ29tbWVudDQxNjgwMzY1MQ=="",""user"":{""login"":""hongli-my"",""id"":8597823,""node_id"":""MDQ6VXNlcjg1OTc4MjM="",""avatar_url"":""https://avata [...]
+3183,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/416818094"",""html_url"":""https://github.com/panjf2000/ants/pull/8#issuecomment-416818094"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/8"",""id"":416818094,""node_id"":""MDEyOklzc3VlQ29tbWVudDQxNjgxODA5NA=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://avata [...]
+3184,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/418287926"",""html_url"":""https://github.com/panjf2000/ants/issues/10#issuecomment-418287926"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/10"",""id"":418287926,""node_id"":""MDEyOklzc3VlQ29tbWVudDQxODI4NzkyNg=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://a [...]
+3185,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/418290090"",""html_url"":""https://github.com/panjf2000/ants/issues/10#issuecomment-418290090"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/10"",""id"":418290090,""node_id"":""MDEyOklzc3VlQ29tbWVudDQxODI5MDA5MA=="",""user"":{""login"":""Moonlight-Zhao"",""id"":11763614,""node_id"":""MDQ6VXNlcjExNzYzNjE0"",""avatar_url"":""htt [...]
+3186,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/418293975"",""html_url"":""https://github.com/panjf2000/ants/issues/10#issuecomment-418293975"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/10"",""id"":418293975,""node_id"":""MDEyOklzc3VlQ29tbWVudDQxODI5Mzk3NQ=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://a [...]
+3187,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/418297020"",""html_url"":""https://github.com/panjf2000/ants/issues/10#issuecomment-418297020"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/10"",""id"":418297020,""node_id"":""MDEyOklzc3VlQ29tbWVudDQxODI5NzAyMA=="",""user"":{""login"":""Moonlight-Zhao"",""id"":11763614,""node_id"":""MDQ6VXNlcjExNzYzNjE0"",""avatar_url"":""htt [...]
+3188,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/421884048"",""html_url"":""https://github.com/panjf2000/ants/pull/8#issuecomment-421884048"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/8"",""id"":421884048,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyMTg4NDA0OA=="",""user"":{""login"":""ylwangs"",""id"":29241786,""node_id"":""MDQ6VXNlcjI5MjQxNzg2"",""avatar_url"":""https://avatar [...]
+3189,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425014962"",""html_url"":""https://github.com/panjf2000/ants/issues/12#issuecomment-425014962"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/12"",""id"":425014962,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTAxNDk2Mg=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://a [...]
+3190,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425018770"",""html_url"":""https://github.com/panjf2000/ants/issues/10#issuecomment-425018770"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/10"",""id"":425018770,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTAxODc3MA=="",""user"":{""login"":""liyonglion"",""id"":12890888,""node_id"":""MDQ6VXNlcjEyODkwODg4"",""avatar_url"":""https:/ [...]
+3191,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425061837"",""html_url"":""https://github.com/panjf2000/ants/issues/10#issuecomment-425061837"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/10"",""id"":425061837,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTA2MTgzNw=="",""user"":{""login"":""liyonglion"",""id"":12890888,""node_id"":""MDQ6VXNlcjEyODkwODg4"",""avatar_url"":""https:/ [...]
+3192,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425062926"",""html_url"":""https://github.com/panjf2000/ants/issues/12#issuecomment-425062926"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/12"",""id"":425062926,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTA2MjkyNg=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://a [...]
+3193,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425066089"",""html_url"":""https://github.com/panjf2000/ants/issues/10#issuecomment-425066089"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/10"",""id"":425066089,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTA2NjA4OQ=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://a [...]
+3194,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425288734"",""html_url"":""https://github.com/panjf2000/ants/issues/10#issuecomment-425288734"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/10"",""id"":425288734,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTI4ODczNA=="",""user"":{""login"":""liyonglion"",""id"":12890888,""node_id"":""MDQ6VXNlcjEyODkwODg4"",""avatar_url"":""https:/ [...]
+3195,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425293042"",""html_url"":""https://github.com/panjf2000/ants/issues/10#issuecomment-425293042"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/10"",""id"":425293042,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTI5MzA0Mg=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://a [...]
+3196,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425331360"",""html_url"":""https://github.com/panjf2000/ants/issues/12#issuecomment-425331360"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/12"",""id"":425331360,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTMzMTM2MA=="",""user"":{""login"":""edcismybrother"",""id"":29452204,""node_id"":""MDQ6VXNlcjI5NDUyMjA0"",""avatar_url"":""htt [...]
+3197,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425409255"",""html_url"":""https://github.com/panjf2000/ants/issues/10#issuecomment-425409255"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/10"",""id"":425409255,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTQwOTI1NQ=="",""user"":{""login"":""liyonglion"",""id"":12890888,""node_id"":""MDQ6VXNlcjEyODkwODg4"",""avatar_url"":""https:/ [...]
+3198,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425423023"",""html_url"":""https://github.com/panjf2000/ants/issues/10#issuecomment-425423023"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/10"",""id"":425423023,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTQyMzAyMw=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://a [...]
+3199,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425423544"",""html_url"":""https://github.com/panjf2000/ants/pull/13#issuecomment-425423544"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/13"",""id"":425423544,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTQyMzU0NA=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://ava [...]
+3200,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425428914"",""html_url"":""https://github.com/panjf2000/ants/pull/13#issuecomment-425428914"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/13"",""id"":425428914,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTQyODkxNA=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://ava [...]
+3201,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425431081"",""html_url"":""https://github.com/panjf2000/ants/pull/13#issuecomment-425431081"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/13"",""id"":425431081,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTQzMTA4MQ=="",""user"":{""login"":""liyonglion"",""id"":12890888,""node_id"":""MDQ6VXNlcjEyODkwODg4"",""avatar_url"":""https://a [...]
+3202,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425432498"",""html_url"":""https://github.com/panjf2000/ants/pull/13#issuecomment-425432498"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/13"",""id"":425432498,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTQzMjQ5OA=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://ava [...]
+3203,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425438107"",""html_url"":""https://github.com/panjf2000/ants/pull/13#issuecomment-425438107"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/13"",""id"":425438107,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTQzODEwNw=="",""user"":{""login"":""liyonglion"",""id"":12890888,""node_id"":""MDQ6VXNlcjEyODkwODg4"",""avatar_url"":""https://a [...]
+3204,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425439137"",""html_url"":""https://github.com/panjf2000/ants/pull/13#issuecomment-425439137"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/13"",""id"":425439137,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTQzOTEzNw=="",""user"":{""login"":""liyonglion"",""id"":12890888,""node_id"":""MDQ6VXNlcjEyODkwODg4"",""avatar_url"":""https://a [...]
+3205,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425608265"",""html_url"":""https://github.com/panjf2000/ants/pull/13#issuecomment-425608265"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/13"",""id"":425608265,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTYwODI2NQ=="",""user"":{""login"":""liyonglion"",""id"":12890888,""node_id"":""MDQ6VXNlcjEyODkwODg4"",""avatar_url"":""https://a [...]
+3206,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425609411"",""html_url"":""https://github.com/panjf2000/ants/pull/13#issuecomment-425609411"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/13"",""id"":425609411,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTYwOTQxMQ=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://ava [...]
+3207,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425609608"",""html_url"":""https://github.com/panjf2000/ants/pull/13#issuecomment-425609608"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/13"",""id"":425609608,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTYwOTYwOA=="",""user"":{""login"":""liyonglion"",""id"":12890888,""node_id"":""MDQ6VXNlcjEyODkwODg4"",""avatar_url"":""https://a [...]
+3208,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425622339"",""html_url"":""https://github.com/panjf2000/ants/pull/13#issuecomment-425622339"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/13"",""id"":425622339,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTYyMjMzOQ=="",""user"":{""login"":""liyonglion"",""id"":12890888,""node_id"":""MDQ6VXNlcjEyODkwODg4"",""avatar_url"":""https://a [...]
+3209,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425622437"",""html_url"":""https://github.com/panjf2000/ants/pull/13#issuecomment-425622437"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/13"",""id"":425622437,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTYyMjQzNw=="",""user"":{""login"":""codecov[bot]"",""id"":22429695,""node_id"":""MDM6Qm90MjI0Mjk2OTU="",""avatar_url"":""https:/ [...]
+3210,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425623081"",""html_url"":""https://github.com/panjf2000/ants/pull/13#issuecomment-425623081"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/13"",""id"":425623081,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTYyMzA4MQ=="",""user"":{""login"":""liyonglion"",""id"":12890888,""node_id"":""MDQ6VXNlcjEyODkwODg4"",""avatar_url"":""https://a [...]
+3211,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425632550"",""html_url"":""https://github.com/panjf2000/ants/pull/13#issuecomment-425632550"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/13"",""id"":425632550,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTYzMjU1MA=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://ava [...]
+3212,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425632613"",""html_url"":""https://github.com/panjf2000/ants/pull/13#issuecomment-425632613"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/13"",""id"":425632613,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTYzMjYxMw=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://ava [...]
+3213,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425632632"",""html_url"":""https://github.com/panjf2000/ants/pull/13#issuecomment-425632632"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/13"",""id"":425632632,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTYzMjYzMg=="",""user"":{""login"":""liyonglion"",""id"":12890888,""node_id"":""MDQ6VXNlcjEyODkwODg4"",""avatar_url"":""https://a [...]
+3214,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425632777"",""html_url"":""https://github.com/panjf2000/ants/pull/13#issuecomment-425632777"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/13"",""id"":425632777,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTYzMjc3Nw=="",""user"":{""login"":""liyonglion"",""id"":12890888,""node_id"":""MDQ6VXNlcjEyODkwODg4"",""avatar_url"":""https://a [...]
+3215,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425637776"",""html_url"":""https://github.com/panjf2000/ants/pull/13#issuecomment-425637776"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/13"",""id"":425637776,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTYzNzc3Ng=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://ava [...]
+3216,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425637938"",""html_url"":""https://github.com/panjf2000/ants/pull/13#issuecomment-425637938"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/13"",""id"":425637938,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTYzNzkzOA=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://ava [...]
+3217,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425896318"",""html_url"":""https://github.com/panjf2000/ants/pull/14#issuecomment-425896318"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/14"",""id"":425896318,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTg5NjMxOA=="",""user"":{""login"":""codecov[bot]"",""id"":22429695,""node_id"":""MDM6Qm90MjI0Mjk2OTU="",""avatar_url"":""https:/ [...]
+3218,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/425906970"",""html_url"":""https://github.com/panjf2000/ants/pull/14#issuecomment-425906970"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/14"",""id"":425906970,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNTkwNjk3MA=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://ava [...]
+3219,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/426537013"",""html_url"":""https://github.com/panjf2000/ants/pull/15#issuecomment-426537013"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/15"",""id"":426537013,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNjUzNzAxMw=="",""user"":{""login"":""codecov[bot]"",""id"":22429695,""node_id"":""MDM6Qm90MjI0Mjk2OTU="",""avatar_url"":""https:/ [...]
+3220,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/426596957"",""html_url"":""https://github.com/panjf2000/ants/pull/15#issuecomment-426596957"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/15"",""id"":426596957,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNjU5Njk1Nw=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://ava [...]
+3221,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/426604764"",""html_url"":""https://github.com/panjf2000/ants/pull/15#issuecomment-426604764"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/15"",""id"":426604764,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyNjYwNDc2NA=="",""user"":{""login"":""egonelbre"",""id"":192964,""node_id"":""MDQ6VXNlcjE5Mjk2NA=="",""avatar_url"":""https://avat [...]
+3222,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/429609579"",""html_url"":""https://github.com/panjf2000/ants/pull/16#issuecomment-429609579"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/16"",""id"":429609579,""node_id"":""MDEyOklzc3VlQ29tbWVudDQyOTYwOTU3OQ=="",""user"":{""login"":""codecov[bot]"",""id"":22429695,""node_id"":""MDM6Qm90MjI0Mjk2OTU="",""avatar_url"":""https:/ [...]
+3223,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/433821356"",""html_url"":""https://github.com/panjf2000/ants/pull/8#issuecomment-433821356"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/8"",""id"":433821356,""node_id"":""MDEyOklzc3VlQ29tbWVudDQzMzgyMTM1Ng=="",""user"":{""login"":""choleraehyq"",""id"":8923413,""node_id"":""MDQ6VXNlcjg5MjM0MTM="",""avatar_url"":""https://ava [...]
+3224,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/434126048"",""html_url"":""https://github.com/panjf2000/ants/pull/8#issuecomment-434126048"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/8"",""id"":434126048,""node_id"":""MDEyOklzc3VlQ29tbWVudDQzNDEyNjA0OA=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://avata [...]
+3225,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/434126349"",""html_url"":""https://github.com/panjf2000/ants/pull/8#issuecomment-434126349"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/8"",""id"":434126349,""node_id"":""MDEyOklzc3VlQ29tbWVudDQzNDEyNjM0OQ=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://avata [...]
+3226,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/439758381"",""html_url"":""https://github.com/panjf2000/ants/pull/19#issuecomment-439758381"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/19"",""id"":439758381,""node_id"":""MDEyOklzc3VlQ29tbWVudDQzOTc1ODM4MQ=="",""user"":{""login"":""codecov[bot]"",""id"":22429695,""node_id"":""MDM6Qm90MjI0Mjk2OTU="",""avatar_url"":""https:/ [...]
+3227,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/439758480"",""html_url"":""https://github.com/panjf2000/ants/pull/19#issuecomment-439758480"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/19"",""id"":439758480,""node_id"":""MDEyOklzc3VlQ29tbWVudDQzOTc1ODQ4MA=="",""user"":{""login"":""zplzpl"",""id"":7931755,""node_id"":""MDQ6VXNlcjc5MzE3NTU="",""avatar_url"":""https://avatar [...]
+3228,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/439781607"",""html_url"":""https://github.com/panjf2000/ants/pull/19#issuecomment-439781607"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/19"",""id"":439781607,""node_id"":""MDEyOklzc3VlQ29tbWVudDQzOTc4MTYwNw=="",""user"":{""login"":""zplzpl"",""id"":7931755,""node_id"":""MDQ6VXNlcjc5MzE3NTU="",""avatar_url"":""https://avatar [...]
+3229,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/439792581"",""html_url"":""https://github.com/panjf2000/ants/issues/18#issuecomment-439792581"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/18"",""id"":439792581,""node_id"":""MDEyOklzc3VlQ29tbWVudDQzOTc5MjU4MQ=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://a [...]
+3230,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/439793352"",""html_url"":""https://github.com/panjf2000/ants/pull/19#issuecomment-439793352"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/19"",""id"":439793352,""node_id"":""MDEyOklzc3VlQ29tbWVudDQzOTc5MzM1Mg=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://ava [...]
+3231,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/439793939"",""html_url"":""https://github.com/panjf2000/ants/issues/17#issuecomment-439793939"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/17"",""id"":439793939,""node_id"":""MDEyOklzc3VlQ29tbWVudDQzOTc5MzkzOQ=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://a [...]
+3232,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/440207809"",""html_url"":""https://github.com/panjf2000/ants/issues/20#issuecomment-440207809"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/20"",""id"":440207809,""node_id"":""MDEyOklzc3VlQ29tbWVudDQ0MDIwNzgwOQ=="",""user"":{""login"":""kklinan"",""id"":5668717,""node_id"":""MDQ6VXNlcjU2Njg3MTc="",""avatar_url"":""https://ava [...]
+3233,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/440263871"",""html_url"":""https://github.com/panjf2000/ants/issues/20#issuecomment-440263871"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/20"",""id"":440263871,""node_id"":""MDEyOklzc3VlQ29tbWVudDQ0MDI2Mzg3MQ=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://a [...]
+3234,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/440500490"",""html_url"":""https://github.com/panjf2000/ants/issues/20#issuecomment-440500490"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/20"",""id"":440500490,""node_id"":""MDEyOklzc3VlQ29tbWVudDQ0MDUwMDQ5MA=="",""user"":{""login"":""kklinan"",""id"":5668717,""node_id"":""MDQ6VXNlcjU2Njg3MTc="",""avatar_url"":""https://ava [...]
+3235,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/440541883"",""html_url"":""https://github.com/panjf2000/ants/issues/20#issuecomment-440541883"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/20"",""id"":440541883,""node_id"":""MDEyOklzc3VlQ29tbWVudDQ0MDU0MTg4Mw=="",""user"":{""login"":""zplzpl"",""id"":7931755,""node_id"":""MDQ6VXNlcjc5MzE3NTU="",""avatar_url"":""https://avat [...]
+3236,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/440605531"",""html_url"":""https://github.com/panjf2000/ants/issues/20#issuecomment-440605531"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/20"",""id"":440605531,""node_id"":""MDEyOklzc3VlQ29tbWVudDQ0MDYwNTUzMQ=="",""user"":{""login"":""kklinan"",""id"":5668717,""node_id"":""MDQ6VXNlcjU2Njg3MTc="",""avatar_url"":""https://ava [...]
+3237,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/440876192"",""html_url"":""https://github.com/panjf2000/ants/issues/20#issuecomment-440876192"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/20"",""id"":440876192,""node_id"":""MDEyOklzc3VlQ29tbWVudDQ0MDg3NjE5Mg=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://a [...]
+3238,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/442366878"",""html_url"":""https://github.com/panjf2000/ants/issues/17#issuecomment-442366878"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/17"",""id"":442366878,""node_id"":""MDEyOklzc3VlQ29tbWVudDQ0MjM2Njg3OA=="",""user"":{""login"":""hawklin2017"",""id"":32898629,""node_id"":""MDQ6VXNlcjMyODk4NjI5"",""avatar_url"":""https: [...]
+3239,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/445462719"",""html_url"":""https://github.com/panjf2000/ants/issues/21#issuecomment-445462719"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/21"",""id"":445462719,""node_id"":""MDEyOklzc3VlQ29tbWVudDQ0NTQ2MjcxOQ=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://a [...]
+3240,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/445496131"",""html_url"":""https://github.com/panjf2000/ants/issues/21#issuecomment-445496131"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/21"",""id"":445496131,""node_id"":""MDEyOklzc3VlQ29tbWVudDQ0NTQ5NjEzMQ=="",""user"":{""login"":""huangjunwen"",""id"":720086,""node_id"":""MDQ6VXNlcjcyMDA4Ng=="",""avatar_url"":""https:// [...]
+3241,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/445815378"",""html_url"":""https://github.com/panjf2000/ants/issues/21#issuecomment-445815378"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/21"",""id"":445815378,""node_id"":""MDEyOklzc3VlQ29tbWVudDQ0NTgxNTM3OA=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://a [...]
+3242,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/446447291"",""html_url"":""https://github.com/panjf2000/ants/issues/21#issuecomment-446447291"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/21"",""id"":446447291,""node_id"":""MDEyOklzc3VlQ29tbWVudDQ0NjQ0NzI5MQ=="",""user"":{""login"":""huangjunwen"",""id"":720086,""node_id"":""MDQ6VXNlcjcyMDA4Ng=="",""avatar_url"":""https:// [...]
+3243,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/446453643"",""html_url"":""https://github.com/panjf2000/ants/issues/21#issuecomment-446453643"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/21"",""id"":446453643,""node_id"":""MDEyOklzc3VlQ29tbWVudDQ0NjQ1MzY0Mw=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://a [...]
+3244,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/456022133"",""html_url"":""https://github.com/panjf2000/ants/issues/22#issuecomment-456022133"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/22"",""id"":456022133,""node_id"":""MDEyOklzc3VlQ29tbWVudDQ1NjAyMjEzMw=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://a [...]
+3245,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/456022560"",""html_url"":""https://github.com/panjf2000/ants/issues/22#issuecomment-456022560"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/22"",""id"":456022560,""node_id"":""MDEyOklzc3VlQ29tbWVudDQ1NjAyMjU2MA=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://a [...]
+3246,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/456033956"",""html_url"":""https://github.com/panjf2000/ants/pull/23#issuecomment-456033956"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/23"",""id"":456033956,""node_id"":""MDEyOklzc3VlQ29tbWVudDQ1NjAzMzk1Ng=="",""user"":{""login"":""codecov[bot]"",""id"":22429695,""node_id"":""MDM6Qm90MjI0Mjk2OTU="",""avatar_url"":""https:/ [...]
+3247,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/456071084"",""html_url"":""https://github.com/panjf2000/ants/pull/23#issuecomment-456071084"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/23"",""id"":456071084,""node_id"":""MDEyOklzc3VlQ29tbWVudDQ1NjA3MTA4NA=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://ava [...]
+3248,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/456261758"",""html_url"":""https://github.com/panjf2000/ants/pull/23#issuecomment-456261758"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/23"",""id"":456261758,""node_id"":""MDEyOklzc3VlQ29tbWVudDQ1NjI2MTc1OA=="",""user"":{""login"":""choleraehyq"",""id"":8923413,""node_id"":""MDQ6VXNlcjg5MjM0MTM="",""avatar_url"":""https://a [...]
+3249,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/456270386"",""html_url"":""https://github.com/panjf2000/ants/pull/23#issuecomment-456270386"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/23"",""id"":456270386,""node_id"":""MDEyOklzc3VlQ29tbWVudDQ1NjI3MDM4Ng=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://ava [...]
+3250,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/456273052"",""html_url"":""https://github.com/panjf2000/ants/pull/23#issuecomment-456273052"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/23"",""id"":456273052,""node_id"":""MDEyOklzc3VlQ29tbWVudDQ1NjI3MzA1Mg=="",""user"":{""login"":""choleraehyq"",""id"":8923413,""node_id"":""MDQ6VXNlcjg5MjM0MTM="",""avatar_url"":""https://a [...]
+3251,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/456277710"",""html_url"":""https://github.com/panjf2000/ants/pull/23#issuecomment-456277710"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/23"",""id"":456277710,""node_id"":""MDEyOklzc3VlQ29tbWVudDQ1NjI3NzcxMA=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://ava [...]
+3252,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/459948887"",""html_url"":""https://github.com/panjf2000/ants/issues/25#issuecomment-459948887"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/25"",""id"":459948887,""node_id"":""MDEyOklzc3VlQ29tbWVudDQ1OTk0ODg4Nw=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://a [...]
+3253,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/468919580"",""html_url"":""https://github.com/panjf2000/ants/issues/26#issuecomment-468919580"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/26"",""id"":468919580,""node_id"":""MDEyOklzc3VlQ29tbWVudDQ2ODkxOTU4MA=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://a [...]
+3254,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/471299071"",""html_url"":""https://github.com/panjf2000/ants/issues/27#issuecomment-471299071"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/27"",""id"":471299071,""node_id"":""MDEyOklzc3VlQ29tbWVudDQ3MTI5OTA3MQ=="",""user"":{""login"":""panjf2000"",""id"":7496278,""node_id"":""MDQ6VXNlcjc0OTYyNzg="",""avatar_url"":""https://a [...]
+3255,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""url"":""https://api.github.com/repos/panjf2000/ants/issues/comments/471869506"",""html_url"":""https://github.com/panjf2000/ants/issues/28#issuecomment-471869506"",""issue_url"":""https://api.github.com/repos/panjf2000/ants/issues/28"",""id"":471869506,""node_id"":""MDEyOklzc3VlQ29tbWVudDQ3MTg2OTUwNg=="",""user"":{""login"":""naiba"",""id"":29243953,""node_id"":""MDQ6VXNlcjI5MjQzOTUz"",""avatar_url"":""https://avat [...]
diff --git a/plugins/github/e2e/snapshot_tables/_tool_github_issue_comments.csv b/plugins/github/e2e/snapshot_tables/_tool_github_issue_comments.csv
new file mode 100644
index 00000000..97c876d5
--- /dev/null
+++ b/plugins/github/e2e/snapshot_tables/_tool_github_issue_comments.csv
@@ -0,0 +1,49 @@
+connection_id,github_id,issue_id,body,author_username,author_user_id,github_created_at,github_updated_at,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
+1,409800144,346842831,"""这里freeSignal和idleWorkers的数量是绝对匹配的,也就是说,只要freeSignal有值那么idleWorkers里肯定有可用worker可以取出来,putWorker就是把可用worker放回idleWorkers,每次都会塞一个值进freeSignal,还有每次从idleWorkers里取一个worker都要取出freeSignal对应的一个值,不存在有可用worker却被freeSignal阻塞""",panjf2000,7496278,2018-08-02T04:13:09.000+00:00,2018-08-02T04:13:09.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3166,
+1,410141732,347255859,"""切片如下\r\n\r\n这里等待锁\r\n9913 @ 0x42c73a 0x42c7ee 0x43cf64 0x43cc7d 0x46dfe8 0x7b28e0 0x7b2be5 0x4591f1\r\n#\t0x43cc7c\tsync.runtime_SemacquireMutex+0x3c\t\t\t\tE:/go/src/runtime/sema.go:71\r\n#\t0x46dfe7\tsync.(*Mutex).Lock+0x107\t\t\t\t\tE:/go/src/sync/mutex.go:134\r\n#\t0x7b28df\tmp/vendor/github.com/panjf2000/ants.(*Pool).putWorker+0x6f\tF:/gowork/src/mp/vendor/github.com/panjf2000/ants/pool.go:229\r\n#\t0x7b2be4\tmp/vendor/github.com/panjf2000/ants.(*Worker).run [...]
+1,410143221,347255859,"""加了锁之后有下标溢出了。。。\r\npanic: runtime error: index out of range\r\n\r\ngoroutine 7 [running]:\r\nmp/vendor/github.com/panjf2000/ants.(*Pool).getWorker(0xc4200b6460, 0xc4202a6e01)\r\n\tF:/gowork/src/mp/vendor/github.com/panjf2000/ants/pool.go:213 +0x2ce\r\nmp/vendor/github.com/panjf2000/ants.(*Pool).Submit(0xc4200b6460, 0xc4223d47d0, 0x0, 0x0)\r\n\tF:/gowork/src/mp/vendor/github.com/panjf2000/ants/pool.go:125 +0x62\r\n""",lovelly,13118848,2018-08-03T04:46:13.000+00:00, [...]
+1,410147487,347255859,"""@lovelly 我查了源码,怎么行数和你说的有点对不上,你的代码更新到最新了吗?""",panjf2000,7496278,2018-08-03T05:21:03.000+00:00,2018-08-03T05:21:13.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3169,
+1,410170764,347255859,"""是最新的代码,我有添加一些print 所以行数不一样,这确实是一个bug 9913个协程阻塞在了 putWorker 很久很久。,。。。""",lovelly,13118848,2018-08-03T07:33:21.000+00:00,2018-08-03T07:33:21.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3170,
+1,410173358,347255859,"""![image](https://user-images.githubusercontent.com/13118848/43630582-44f48000-9733-11e8-936d-9cb0d4145204.png)\r\n 我idleWorkers 为空的, 但是我有n个协程阻塞在了 204行的\t<-p.freeSignal, 这时候来了一个worker被放入idleWorkers, 很巧的是一个协程在putWorker结束锁后,在190行的p.lock.Lock()拿到了锁,这时候 n := len(idleWorkers) - 1 结果是0 这个协程很高兴的进入了接下来的else分支, 然而不幸发生了,p.freeSignal的信号确被早已等在 204行的若干个协程中的一个拿走了, 那么 可怜的协程拿到了锁, 确无法等到 p.freeSignal  p.freeSignal要拿到锁才能产生信号, 然后就。,。。""",lovelly,13118848,2018-08-03T07:44:32.000+00:00 [...]
+1,410204870,347255859,"""@lovelly 检查了一下,的确可能会有这个问题,这两天我会修复;\r\n另外,我测试的时候试过1000w的量都没发现过这个问题,可能是我每个任务的执行时间太短了,所以我想问下你的任务量有多大以及每个任务的耗时大概是多少?""",panjf2000,7496278,2018-08-03T09:51:15.000+00:00,2018-08-03T09:52:04.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3172,
+1,410205295,347255859,"""我任务耗时从0秒到60秒之间。。。""",lovelly,13118848,2018-08-03T09:53:00.000+00:00,2018-08-03T09:53:00.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3173,
+1,410267195,347255859,"""@lovelly 应该已经修复了,可以再试试""",panjf2000,7496278,2018-08-03T14:15:45.000+00:00,2018-08-03T14:15:45.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3174,
+1,410290418,346842831,"""具体问题可以看 #6 """,panjf2000,7496278,2018-08-03T15:32:00.000+00:00,2018-08-03T15:32:00.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3175,
+1,411342200,348630179,"""@huiwq1990 谢谢指出,今天会修复这个问题。""",panjf2000,7496278,2018-08-08T09:17:30.000+00:00,2018-08-08T09:17:30.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3176,
+1,411369513,348630179,"""@huiwq1990 应该解决了,可以再试试""",panjf2000,7496278,2018-08-08T11:06:55.000+00:00,2018-08-08T11:06:55.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3177,
+1,411965696,348630179,"""嗯,解决了""",huiwq1990,4555057,2018-08-10T03:35:53.000+00:00,2018-08-10T03:35:53.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3178,
+1,411969260,348630179,"""@huiwq1990 好的,那我关掉这个issue了。""",panjf2000,7496278,2018-08-10T04:06:04.000+00:00,2018-08-10T04:06:04.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3179,
+1,418287926,356703393,"""会导致很多任务长时间在阻塞,至于cpu飙升应该不会""",panjf2000,7496278,2018-09-04T08:40:06.000+00:00,2018-09-04T08:40:06.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3184,
+1,418290090,356703393,"""所以应该在goroutine中调用submit 否则会阻塞主任务""",Moonlight-Zhao,11763614,2018-09-04T08:47:39.000+00:00,2018-09-04T08:47:39.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3185,
+1,418293975,356703393,"""不是的,如果每一个submit都用一个goroutine那不就违背初衷了吗,这样的话你有多少个任务还是要启动多少个原生goroutine。""",panjf2000,7496278,2018-09-04T09:00:55.000+00:00,2018-09-04T09:00:55.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3186,
+1,418297020,356703393,"""// Submit submits a task to this pool.\r\nfunc (p *Pool) Submit(task f) error {\r\n\tif len(p.release) > 0 {\r\n\t\treturn ErrPoolClosed\r\n\t}\r\n\tp.getWorker().task <- task\r\n\treturn nil\r\n}\r\n我是觉得p.getWorker()  阻塞不太好 ,这样主任务和pool没有彻底隔离""",Moonlight-Zhao,11763614,2018-09-04T09:11:37.000+00:00,2018-09-04T09:11:37.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3187,
+1,425014962,364361014,"""我晚上回去就打一下新的tag,完了我再给你回一个邮件\r\n\r\nedcismybrother <no...@github.com> 于2018年9月27日周四 下午4:32写道:\r\n\r\n> 鄙人现在在弄dep依赖管理,有用到你写的ants项目,可是你好像忘记打最新的tag了。最新的tag\r\n> 3.6是指向ed55924这个提交,git上的最新代码是af376f1b这次提交,两次提交都隔了快5个月了,看到的话,麻烦打一个最新的tag吧。(手动可怜)\r\n>\r\n> —\r\n> You are receiving this because you are subscribed to this thread.\r\n> Reply to this email directly, view it on GitHub\r\n> <https://github.com/panjf2000/ants/issues/12>, or mute the thread\r\n> <https://git [...]
+1,425018770,356703393,"""我觉得这个会导致cpu上升。调用Submit时,如果没有多余的worker,会一直进入这个死循环\r\n```\t\t\r\nfor {\r\n\t\t\tp.lock.Lock()\r\n\t\t\tidleWorkers = p.workers\r\n\t\t\tl := len(idleWorkers) - 1\r\n\t\t\tif l < 0 {\r\n\t\t\t\tp.lock.Unlock()\r\n\t\t\t\tcontinue\r\n\t\t\t}\r\n\t\t\tw = idleWorkers[l]\r\n\t\t\tidleWorkers[l] = nil\r\n\t\t\tp.workers = idleWorkers[:l]\r\n\t\t\tp.lock.Unlock()\r\n\t\t\tbreak\r\n\t\t}\r\n```\r\n一直会continue,直到有空闲的worker,这样会阻塞调用Submit的goroutine.""",liyonglion,12890888,20 [...]
+1,425061837,356703393,"""![snip20180927_3](https://user-images.githubusercontent.com/12890888/46144182-c4efe200-c28e-11e8-8e69-ffd4502e3b9e.png)\r\n\r\ncpu占用率一直接近100%\r\n\r\n![snip20180927_4](https://user-images.githubusercontent.com/12890888/46144221-ddf89300-c28e-11e8-985b-48437eb20cdc.png)\r\n""",liyonglion,12890888,2018-09-27T11:53:26.000+00:00,2018-09-27T11:53:26.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3191,
+1,425062926,364361014,"""tag更新了,v3.7\r\n\r\nAndy Pan <pa...@gmail.com> 于2018年9月27日周四 下午5:00写道:\r\n\r\n> 我晚上回去就打一下新的tag,完了我再给你回一个邮件\r\n>\r\n> edcismybrother <no...@github.com> 于2018年9月27日周四 下午4:32写道:\r\n>\r\n>> 鄙人现在在弄dep依赖管理,有用到你写的ants项目,可是你好像忘记打最新的tag了。最新的tag\r\n>> 3.6是指向ed55924这个提交,git上的最新代码是af376f1b这次提交,两次提交都隔了快5个月了,看到的话,麻烦打一个最新的tag吧。(手动可怜)\r\n>>\r\n>> —\r\n>> You are receiving this because you are subscribed to this thread.\r\n>> Reply to this email directly, view it on Gi [...]
+1,425066089,356703393,"""@liyonglion 这个例子看起来有点极端,因为只有两个任务,pool容量是1,所以剩下那个不断在自己加锁解锁导致cpu忙,如果是多个竞争的大部分是block状态,应该不会出现这种cpu满的情况,不然你把例子改改?增加提交的任务数再看看,看看还会不会出现这种情况。""",panjf2000,7496278,2018-09-27T12:07:30.000+00:00,2018-09-27T12:07:30.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3193,
+1,425288734,356703393,"""@panjf2000  ants比较适合做“短期”任务,如果存在大量的“长期”任务,很有可能导致死循环。为什么不block当前Submit的“线程”?""",liyonglion,12890888,2018-09-28T01:09:40.000+00:00,2018-09-28T01:09:40.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3194,
+1,425293042,356703393,"""@liyonglion 之前有用过chan阻塞等待,但是导致了一个死锁问题:#6,后来才改成这种形式。所以我说的增加submit的任务数再测试之后也是cpu 100%吗?这个问题我现在暂时没想到比较好的解决办法,我再想想,或者你有没有比较好的想法?可以提个pr。""",panjf2000,7496278,2018-09-28T01:37:17.000+00:00,2018-09-28T01:37:27.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3195,
+1,425331360,364361014,"""@panjf2000 可以的,谢谢啦""",edcismybrother,29452204,2018-09-28T06:05:58.000+00:00,2018-09-28T06:05:58.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3196,
+1,425409255,356703393,"""@panjf2000  我提交了一个pr,你看下是否合理?我自己跑了上面的用例,没有问题。效率方面我还没有具体测试。""",liyonglion,12890888,2018-09-28T11:41:08.000+00:00,2018-09-28T11:41:08.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3197,
+1,425423023,356703393,"""@liyonglion 我看修改的代码应该是正确的,但是有两个问题:\r\n1. 要正确测试你pr,你要把ants_test.go里import ants的路径改成你自己的路径;\r\n2.你现在只修改了pool.go的代码,麻烦把pool_func.go里相应的地方也优化一下。""",panjf2000,7496278,2018-09-28T12:41:27.000+00:00,2018-09-28T12:43:06.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3198,
+1,439792581,382039050,"""GOMAXPROCS你可以理解成是G-P-M模型中的M的数量,也就是最大并行数。""",panjf2000,7496278,2018-11-19T07:10:47.000+00:00,2018-11-19T07:10:47.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3229,
+1,439793939,381941219,"""release的确有这个问题,目前还没有比较好的办法,只是等待定时销毁的那个goroutine去释放内存,你要是有兴趣可以再想想有没有更好的办法,可以提个pr""",panjf2000,7496278,2018-11-19T07:18:05.000+00:00,2018-11-19T07:18:05.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3231,
+1,440207809,382574800,"""https://github.com/panjf2000/ants/blob/711dbdb7a222771ce15aaee1bb7b7c6e9731f208/pool.go#L119""",kklinan,5668717,2018-11-20T09:41:24.000+00:00,2018-11-20T09:41:24.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3232,
+1,440263871,382574800,"""这里可以讨论下,是否可以在任务函数里通过闭包的形式,将结果存入channel,满足你的需求?""",panjf2000,7496278,2018-11-20T12:56:13.000+00:00,2018-11-20T12:56:13.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3233,
+1,440500490,382574800,"""> 这里可以讨论下,是否可以在任务函数里通过闭包的形式,将结果存入channel,满足你的需求?\r\n\r\n可以的。但不仅仅如此,最重要的是想得到哪条消息失败了,方便进行下次延时处理或丢回队列。""",kklinan,5668717,2018-11-21T02:00:22.000+00:00,2018-11-21T02:00:22.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3234,
+1,440541883,382574800,"""目前可以通过参数来传入处理失败的chan\r\n\r\ntype msg struct {\r\n……\r\nFailed chan<- *msg\r\n}\r\n\r\n// payload == &msg\r\npool,_:= NewPoolWithFunc(10,func(payload interface{}) error{\r\n……\r\n// 失败的话payload 发送到 Failed chan\r\n})\r\n\r\npool.Serve(msg)""",zplzpl,7931755,2018-11-21T05:57:51.000+00:00,2018-11-21T06:06:47.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3235,
+1,440605531,382574800,"""> 目前可以通过参数来传入处理失败的chan\r\n> \r\n> type msg struct {\r\n> ……\r\n> Failed chan<- *msg\r\n> }\r\n> \r\n> // payload == &msg\r\n> pool,_:= NewPoolWithFunc(10,func(payload interface{}) error{\r\n> ……\r\n> // 失败的话payload 发送到 Failed chan\r\n> })\r\n> \r\n> pool.Serve(msg)\r\n\r\n我目前的做法是没有用 `NewPoolWithFunc()`,而是用的 `ants.NewPool()`,控制整个服务只有一个`pool`,所有的任务都是从大`pool`里取:\r\n\r\n```\r\nfunc (w *Worker) Register(fn func() error, opts ...Option) error {\r\n\t// w.Workers = appe [...]
+1,440876192,382574800,"""错误返回,按照ants的设计,其实应该是异步的,目前没办法直接return error到调用的函数里,所以我觉得就算是处理也应该是异步的方式;至于任务依赖,目前想到的有两种办法:1.回调函数;2.消息通知(通过channel或消息队列),至于是不是要把这些复杂的逻辑加到ants里,有待商榷,或者你也可以推一个pr,大家一起探讨下~~""",panjf2000,7496278,2018-11-22T01:09:56.000+00:00,2018-11-22T01:09:56.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3237,
+1,442366878,381941219,"""在 pool里面加上一个 waitgroup,每次 启动一个 work,调用 waitgroup.Add(),协程执行完了就执行waitgroup.Done()。在release时候调用waitgroup.Wait()。最后再回收空闲 worker。不过b如果 worker 对于的 func 执行时间过长,会导致release一直等待。""",hawklin2017,32898629,2018-11-28T08:48:17.000+00:00,2018-11-28T08:48:17.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3238,
+1,445462719,388907811,"""你的go版本是多少?""",panjf2000,7496278,2018-12-08T14:20:26.000+00:00,2018-12-08T14:20:26.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3239,
+1,445496131,388907811,"""go version go1.11.1 darwin/amd64\r\n\r\n我也尝试了将几个参数调小一点,结果都是 Semaphore 和 AntsPool 量级上都是差不多的""",huangjunwen,720086,2018-12-08T22:56:54.000+00:00,2018-12-08T22:56:54.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3240,
+1,445815378,388907811,"""嗯,的确是一个量级。\r\nants的优势是:\r\n1. 内存消耗会小(并发量大的时候几乎可以节省一半的内存量);\r\n2. goroutine常驻内存(定时清理长时间空置的goroutine,按最后使用时间排序,最久未使用的goroutine最先被清理,进一步降低资源消耗);\r\n3. ants pool更加灵活可控,可动态调整pool size、手动销毁pool;\r\n4. 还有各类方法获取正在运行的goroutine数量、可用的goroutine数量,使并发程序更精确可控;\r\n......""",panjf2000,7496278,2018-12-10T13:30:04.000+00:00,2018-12-11T02:52:18.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3241,
+1,446447291,388907811,"""好的,怎么样测试内存消耗呢?按我理解大家活跃的 go routines 是一样的数目,为什么 ants 的内存消耗会小呢?""",huangjunwen,720086,2018-12-12T03:18:44.000+00:00,2018-12-12T03:18:44.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3242,
+1,446453643,388907811,"""加上benchmem=true参数;至于为什么内存会更小,是因为在pool里的goroutines是常驻内存的,新的任务是复用goroutine的,而用sema的话只是限制了活跃的goroutine数量,并没有复用,新的任务还是会生成新的goroutine。""",panjf2000,7496278,2018-12-12T03:58:29.000+00:00,2018-12-12T03:58:29.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3243,
+1,456022133,401277739,"""合理的需求,可以加。我这两天加下。""",panjf2000,7496278,2019-01-21T10:21:24.000+00:00,2019-01-21T10:22:58.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3244,
+1,456022560,401277739,"""你要有兴趣也可以自己做,然后提个PR。""",panjf2000,7496278,2019-01-21T10:22:39.000+00:00,2019-01-21T10:22:39.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3245,
+1,459948887,405951301,"""@jiashiwen \r\nIt works on my side, pls make sure that you run the example on top of the latest ants code, thanks.""",panjf2000,7496278,2019-02-02T09:03:51.000+00:00,2019-02-02T09:04:50.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3252,
+1,468919580,413968505,"""不会的,incRunning操作总是在比较大小之后才发生的。""",panjf2000,7496278,2019-03-02T13:14:05.000+00:00,2019-03-02T13:14:05.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3253,
+1,471299071,419183961,"""server接收的并发请求量有多大?""",panjf2000,7496278,2019-03-10T13:18:01.000+00:00,2019-03-10T13:18:01.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3254,
+1,471869506,419268851,"""加锁后资源消耗会增加,性能会下降很多,所以是加锁确保池数量还是不加锁保证性能呢?""",naiba,29243953,2019-03-12T06:06:39.000+00:00,2019-03-12T06:06:39.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3255,
diff --git a/plugins/github/e2e/snapshot_tables/_tool_github_pull_request_comments.csv b/plugins/github/e2e/snapshot_tables/_tool_github_pull_request_comments.csv
new file mode 100644
index 00000000..f66d21c2
--- /dev/null
+++ b/plugins/github/e2e/snapshot_tables/_tool_github_pull_request_comments.csv
@@ -0,0 +1,47 @@
+connection_id,github_id,pull_request_id,body,author_username,author_user_id,github_created_at,github_updated_at,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
+1,407675431,203756736,"""# [Codecov](https://codecov.io/gh/panjf2000/ants/pull/4?src=pr&el=h1) Report\n> Merging [#4](https://codecov.io/gh/panjf2000/ants/pull/4?src=pr&el=desc) into [master](https://codecov.io/gh/panjf2000/ants/commit/f5b37d0798a8e4c6780a1e08270fa50e979aa1d7?src=pr&el=desc) will **not change** coverage.\n> The diff coverage is `100%`.\n\n[![Impacted file tree graph](https://codecov.io/gh/panjf2000/ants/pull/4/graphs/tree.svg?token=JFa3laaGKq&width=650&height=150&src=pr) [...]
+1,407714136,203756736,"""@barryz 改的不错,不过有一点需要商榷,那个预分配的大小,之前benchmark我记得1000w也只需要用到7w多,这样的话预分配5w对于大部分场景其实有点浪费,你有没有用修改后的代码benchmark一下,每次allocs/op应该是变大了吧""",panjf2000,7496278,2018-07-25T10:49:44.000+00:00,2018-07-25T10:49:44.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3163,
+1,407755528,203756736,"""@panjf2000  因为从压测结果来看, 1000W的场景下goroutine池的作用很明显, 尤其是在节省内存开销方面,所以在选择默认worker数量时,取了一个相对较大的值。 下面是benchmark 对比\r\n\r\nmaster:\r\n\r\n```\r\ngoos: linux\r\ngoarch: amd64\r\nBenchmarkGoroutineWithFunc-4           1        15079030287 ns/op       723120296 B/op  10176159 allocs/op\r\nPASS\r\nok      command-line-arguments  15.106s\r\n```\r\n\r\nPR:\r\n```\r\ngoos: linux\r\ngoarch: amd64\r\nBenchmarkGoroutineWithFunc-4           1        15443376244 ns/op       72096288 [...]
+1,407764945,203756736,"""@barryz 这样看起来预分配似乎没有太大的内存优势,相反在其他数量的任务量场景下可能还会有点浪费,这样吧,要不你先把预分配内存这一块的暂时移除,然后我合一下优化代码的部分,至于预分配内存这一块,后续再继续讨论下看看有没有能兼顾的办法""",panjf2000,7496278,2018-07-25T14:02:41.000+00:00,2018-07-25T14:02:41.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3165,
+1,416794440,211603583,"""@hongli-my 不好意思,我没太懂你的意图?能麻烦说详细点吗?""",panjf2000,7496278,2018-08-29T01:39:23.000+00:00,2018-08-29T01:39:23.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3180,
+1,416794871,211603583,"""# [Codecov](https://codecov.io/gh/panjf2000/ants/pull/8?src=pr&el=h1) Report\n> Merging [#8](https://codecov.io/gh/panjf2000/ants/pull/8?src=pr&el=desc) into [master](https://codecov.io/gh/panjf2000/ants/commit/666635c65d8d3bb1223b819325e0bd23c81f2733?src=pr&el=desc) will **decrease** coverage by `1.24%`.\n> The diff coverage is `100%`.\n\n[![Impacted file tree graph](https://codecov.io/gh/panjf2000/ants/pull/8/graphs/tree.svg?width=650&token=JFa3laaGKq&height=15 [...]
+1,416803651,211603583,"""```n := 0\r\n\t\tfor i, w := range idleWorkers {\r\n\t\t\tif currentTime.Sub(w.recycleTime) <= p.expiryDuration {\r\n\t\t\t\tbreak\r\n\t\t\t}\r\n\t\t\tn = i\r\n\t\t\tw.args <- nil\r\n\t\t\tidleWorkers[i] = nil\r\n\t\t}\r\n\t\tn++\r\n\t\tif n >= len(idleWorkers) {\r\n\t\t\tp.workers = idleWorkers[:0]\r\n\t\t} else {\r\n\t\t\tp.workers = idleWorkers[n:]\r\n\t\t}```\r\nfor 循环中,如果for 循环没有满足条件,n 并没有复制,此时n ++,   n 变为1, p.workers = idleWorkers[1:],  idleWorkers[0] 丢弃了?  [...]
+1,416818094,211603583,"""@hongli-my 嗯,我知道了,但是你的修改似乎不完整,我已经在develop分支改了一版,要不你看下那个分支,然后按照那个再改一下,然后我再merge""",panjf2000,7496278,2018-08-29T04:11:17.000+00:00,2018-08-29T04:11:17.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3183,
+1,421884048,211603583,"""对于worker中的chan应该也需要close吧,当协程数量增大时,这种也是一种消耗""",ylwangs,29241786,2018-09-17T03:37:44.000+00:00,2018-09-17T03:37:44.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3188,
+1,425423544,218939809,"""@liyonglion 我看修改的代码应该是正确的,但是有两个问题:\r\n1. 要正确测试你pr,你要把ants_test.go里import ants的路径改成你自己的路径;\r\n2. 你现在只修改了pool.go的代码,麻烦把pool_func.go里相应的地方也优化一下。\r\n\r\n你重新修改一下pr,然后通过测试,我就merge了。""",panjf2000,7496278,2018-09-28T12:43:30.000+00:00,2018-09-28T12:44:42.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3199,
+1,425428914,218939809,"""我又仔细地想了想,在putWorker方法中,调用p.cond.Signal()之前,p.lock已经解锁了,如果这时候被\r\n![image](https://user-images.githubusercontent.com/7496278/46209831-824b0a00-c361-11e8-9109-609d21bab572.png)\r\n这里获得锁,则空闲队列中的刚刚放入的worker会被取出,这时候p.cond.Wait()再获得锁去队列中取worker的时候就会取不到,len(p.workers) - 1就会是-1,会报错:index out of range,和https://github.com/panjf2000/ants/issues/6 相似的问题,所以p.cond.Signal()应该放在putWorker中的p.lock.Lock()和p.lock.Unlock()之间。\r\n""",panjf2000,7496278,2018-09-28T13:03:48.000+00:00,201 [...]
+1,425431081,218939809,"""我明天仔细研究下。如果这个地方的死锁不好解决,其实可以使用另外一把锁,专门给条件变量使用。""",liyonglion,12890888,2018-09-28T13:12:08.000+00:00,2018-09-28T13:12:08.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3201,
+1,425432498,218939809,"""单一操作变量最好不要有多个锁,这样引发死锁的概率会非常高。""",panjf2000,7496278,2018-09-28T13:17:44.000+00:00,2018-09-28T13:17:57.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3202,
+1,425438107,218939809,"""新的锁只给条件变量使用,其他任何地方都不会使用。如果怕死锁,明天我封装一层,pool层只有一把锁。""",liyonglion,12890888,2018-09-28T13:37:48.000+00:00,2018-09-28T13:37:48.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3203,
+1,425439137,218939809,"""封装一层后,按照你的思路修改应该就可以了。""",liyonglion,12890888,2018-09-28T13:41:20.000+00:00,2018-09-28T13:41:20.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3204,
+1,425608265,218939809,"""看了下代码,你说的没错。我在测试下性能方面""",liyonglion,12890888,2018-09-29T02:22:39.000+00:00,2018-09-29T02:22:39.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3205,
+1,425609411,218939809,"""![image](https://user-images.githubusercontent.com/7496278/46240052-34bbb500-c3d4-11e8-809b-46b429039aee.png)\r\n你这改的有问题,取出来后没有对workers队列缩容,现在Travis CI整个卡住了""",panjf2000,7496278,2018-09-29T02:41:56.000+00:00,2018-09-29T02:43:26.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3206,
+1,425609608,218939809,"""嗯,到时候我会补上。容我再想想""",liyonglion,12890888,2018-09-29T02:45:23.000+00:00,2018-09-29T02:45:23.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3207,
+1,425622339,218939809,"""性能测试如下:\r\n100w的并发,5w的goroutine\r\n![snip20180929_3](https://user-images.githubusercontent.com/12890888/46242225-93932580-c3f8-11e8-841c-fc7fc620313d.png)\r\n\r\n![snip20180929_5](https://user-images.githubusercontent.com/12890888/46242227-9beb6080-c3f8-11e8-80fa-5d01da9aba19.png)\r\n""",liyonglion,12890888,2018-09-29T07:02:56.000+00:00,2018-09-29T07:02:56.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3208,
+1,425622437,218939809,"""# [Codecov](https://codecov.io/gh/panjf2000/ants/pull/13?src=pr&el=h1) Report\n> Merging [#13](https://codecov.io/gh/panjf2000/ants/pull/13?src=pr&el=desc) into [master](https://codecov.io/gh/panjf2000/ants/commit/af376f1b7b59dc488458bcecd4273f0fcde33c55?src=pr&el=desc) will **decrease** coverage by `90.38%`.\n> The diff coverage is `5%`.\n\n[![Impacted file tree graph](https://codecov.io/gh/panjf2000/ants/pull/13/graphs/tree.svg?width=650&token=JFa3laaGKq&height [...]
+1,425623081,218939809,"""@panjf2000  这个覆盖率怎么看?""",liyonglion,12890888,2018-09-29T07:16:02.000+00:00,2018-09-29T07:16:02.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3210,
+1,425632550,218939809,"""怎么会有负数。。。""",panjf2000,7496278,2018-09-29T09:53:47.000+00:00,2018-09-29T09:53:47.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3211,
+1,425632613,218939809,"""而且你那个取出worker之后还是没有对队列进行缩容吧""",panjf2000,7496278,2018-09-29T09:54:48.000+00:00,2018-09-29T09:54:48.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3212,
+1,425632632,218939809,"""这个我没玩过。。。。""",liyonglion,12890888,2018-09-29T09:55:07.000+00:00,2018-09-29T09:55:07.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3213,
+1,425632777,218939809,"""@panjf2000  我缩容了,具体哪个地方?""",liyonglion,12890888,2018-09-29T09:57:34.000+00:00,2018-09-29T09:57:34.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3214,
+1,425637776,218939809,"""@liyonglion 我看错了,缩容的补上了,这块没什么问题了,关于覆盖率这块我明天再查查。。。""",panjf2000,7496278,2018-09-29T11:25:56.000+00:00,2018-09-29T11:25:56.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3215,
+1,425637938,218939809,"""哦,我知道了,应该是那个import路径的问题导致的,那我先merge一下代码""",panjf2000,7496278,2018-09-29T11:29:28.000+00:00,2018-09-29T11:29:28.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3216,
+1,425896318,219363161,"""# [Codecov](https://codecov.io/gh/panjf2000/ants/pull/14?src=pr&el=h1) Report\n> Merging [#14](https://codecov.io/gh/panjf2000/ants/pull/14?src=pr&el=desc) into [master](https://codecov.io/gh/panjf2000/ants/commit/1b62696050b7030106291980d5220f886b017eff?src=pr&el=desc) will **decrease** coverage by `2.12%`.\n> The diff coverage is `100%`.\n\n[![Impacted file tree graph](https://codecov.io/gh/panjf2000/ants/pull/14/graphs/tree.svg?width=650&token=JFa3laaGKq&heigh [...]
+1,425906970,219363161,"""thanks for your correction and could you also modify the pool_func.go cuz there is also the same useless statement in that file. i will accept this pr after your modification is done, thanks.""",panjf2000,7496278,2018-10-01T13:27:04.000+00:00,2018-10-02T13:52:03.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3218,
+1,426537013,219936521,"""# [Codecov](https://codecov.io/gh/panjf2000/ants/pull/15?src=pr&el=h1) Report\n> Merging [#15](https://codecov.io/gh/panjf2000/ants/pull/15?src=pr&el=desc) into [master](https://codecov.io/gh/panjf2000/ants/commit/29730bb70343924a2f56a13a9799611dd1cd27fd?src=pr&el=desc) will **decrease** coverage by `0.84%`.\n> The diff coverage is `n/a`.\n\n[![Impacted file tree graph](https://codecov.io/gh/panjf2000/ants/pull/15/graphs/tree.svg?width=650&token=JFa3laaGKq&height [...]
+1,426596957,219936521,"""@egonelbre thanks for your interest in this repository and i got some puzzles.\r\nfirstly, i don't understand why you use both the chan struct{} and sync.WaitGroup at once, that seems a bit excessive cuz waitgroup and chan did the same thing.\r\nsecondly, method BenchmarkGoroutine was design to test throughput so it should run without waitgroup.""",panjf2000,7496278,2018-10-03T11:05:45.000+00:00,2018-10-03T12:02:17.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf [...]
+1,426604764,219936521,"""Hi, semaphore acts as protection to avoid starting too many goroutines at once. `WaitGroup` is used to wait for everything to complete.\r\n\r\n`BenchmarkGoroutine` doesn't wait for all the goroutines to finish, so you are testing goroutine startup speed rather than throughput. It's somewhat unclear what you mean by \""throughput\"" in this case, but either way you would need to wait for all goroutines to finish, otherwise they will start affecting all other bench [...]
+1,429609579,222703171,"""# [Codecov](https://codecov.io/gh/panjf2000/ants/pull/16?src=pr&el=h1) Report\n> Merging [#16](https://codecov.io/gh/panjf2000/ants/pull/16?src=pr&el=desc) into [master](https://codecov.io/gh/panjf2000/ants/commit/711dbdb7a222771ce15aaee1bb7b7c6e9731f208?src=pr&el=desc) will **decrease** coverage by `2.03%`.\n> The diff coverage is `0%`.\n\n[![Impacted file tree graph](https://codecov.io/gh/panjf2000/ants/pull/16/graphs/tree.svg?width=650&token=JFa3laaGKq&height= [...]
+1,433821356,211603583,"""这种bugfix是不是应该赶紧修了?""",choleraehyq,8923413,2018-10-29T08:10:59.000+00:00,2018-10-29T08:10:59.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3223,
+1,434126048,211603583,"""@choleraehyq 这个很早就已经修复了这个pr一直忘了关。""",panjf2000,7496278,2018-10-30T00:10:32.000+00:00,2018-10-30T00:10:32.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3224,
+1,434126349,211603583,"""@MrDragon1122 一般来说channel是不需要显式close的,只要没有goroutine持有channel,相关资源会自动释放。""",panjf2000,7496278,2018-10-30T00:12:13.000+00:00,2018-10-30T00:12:13.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3225,
+1,439758381,231840723,"""# [Codecov](https://codecov.io/gh/panjf2000/ants/pull/19?src=pr&el=h1) Report\n> Merging [#19](https://codecov.io/gh/panjf2000/ants/pull/19?src=pr&el=desc) into [develop](https://codecov.io/gh/panjf2000/ants/commit/92acf74bb71c1dc1758c61346c88325284978b3e?src=pr&el=desc) will **increase** coverage by `0.02%`.\n> The diff coverage is `100%`.\n\n[![Impacted file tree graph](https://codecov.io/gh/panjf2000/ants/pull/19/graphs/tree.svg?width=650&token=JFa3laaGKq&heig [...]
+1,439758480,231840723,"""我自己写了测试示例\r\n重复\r\nants.NewPoolWithFunc()\r\n然后\r\n进行Resize(0) && Release\r\n但仍发现内存泄漏现象,追溯到了NewTicker没有进行Stop可能导致\r\n\r\nflat  flat%   sum%        cum   cum%\r\n\r\n 7168.57kB 77.60% 77.60%  7168.57kB 77.60%  time.NewTicker\r\n\r\n\r\n\r\n""",zplzpl,7931755,2018-11-19T03:06:50.000+00:00,2018-11-19T03:07:36.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3227,
+1,439781607,231840723,"""突然看到一个PR有更完善的解决方式,不知道为啥没有PR成功""",zplzpl,7931755,2018-11-19T06:07:43.000+00:00,2018-11-19T06:07:43.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3228,
+1,439793352,231840723,"""另外一个pr跟你大概是完成类似的功能,不过那个failed之后作者就没再更新了,所以就没有merge,你要是有时间不如参考下他的代码再优化下?就放到这个pr里。""",panjf2000,7496278,2018-11-19T07:14:58.000+00:00,2018-11-19T07:14:58.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3230,
+1,456033956,246250598,"""# [Codecov](https://codecov.io/gh/panjf2000/ants/pull/23?src=pr&el=h1) Report\n> Merging [#23](https://codecov.io/gh/panjf2000/ants/pull/23?src=pr&el=desc) into [master](https://codecov.io/gh/panjf2000/ants/commit/812dd4e01075be3cf97429a43abaf6837908cdcd?src=pr&el=desc) will **decrease** coverage by `1.02%`.\n> The diff coverage is `71.42%`.\n\n[![Impacted file tree graph](https://codecov.io/gh/panjf2000/ants/pull/23/graphs/tree.svg?width=650&token=JFa3laaGKq&hei [...]
+1,456071084,246250598,"""@choleraehyq \r\nbuild失败了,解决一下?""",panjf2000,7496278,2019-01-21T13:18:19.000+00:00,2019-01-21T13:18:38.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3247,
+1,456261758,246250598,"""@panjf2000 这是测试覆盖率的问题吧,我已经测了设置 PanicHandler 的情况了,不设置的情况一测就 panic 了,而且是在一个 worker 里 panic,没法 recover""",choleraehyq,8923413,2019-01-22T03:45:04.000+00:00,2019-01-22T03:45:04.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3248,
+1,456270386,246250598,"""@choleraehyq \r\n三点:\r\n1. CI failed是因为TestPanicHandler测试失败了\r\n![image](https://user-images.githubusercontent.com/7496278/51513040-ba5fe680-1e43-11e9-92eb-6af6fa1242c9.png)\r\n2. 在Worker的recover里面,需要再加一个w.pool.decRunning(),因为panic之后这个goroutine就销毁了,所以要更新pool中的可用worker数量\r\n3. 麻烦在pool_func.go和worker_func.go里面也相应地加上PanicHandler的逻辑以及对应的unit tests\r\n\r\nThanks.""",panjf2000,7496278,2019-01-22T04:50:28.000+00:00,2019-01-22T04:54:54.000+00:00,"{""ConnectionId"":1,""Ow [...]
+1,456273052,246250598,"""@panjf2000 thanks,修了""",choleraehyq,8923413,2019-01-22T05:10:00.000+00:00,2019-01-22T05:10:00.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3250,
+1,456277710,246250598,"""Thanks for your contributions to `ants`!""",panjf2000,7496278,2019-01-22T05:41:10.000+00:00,2019-01-22T05:41:10.000+00:00,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}",_raw_github_api_comments,3251,
diff --git a/plugins/github/e2e/snapshot_tables/issue_comments.csv b/plugins/github/e2e/snapshot_tables/issue_comments.csv
new file mode 100644
index 00000000..0e0b099b
--- /dev/null
+++ b/plugins/github/e2e/snapshot_tables/issue_comments.csv
@@ -0,0 +1,49 @@
+id,issue_id,body,user_id,created_date
+gitlab:GithubIssue:1:409800144,gitlab:GithubIssue:1:346842831,"""这里freeSignal和idleWorkers的数量是绝对匹配的,也就是说,只要freeSignal有值那么idleWorkers里肯定有可用worker可以取出来,putWorker就是把可用worker放回idleWorkers,每次都会塞一个值进freeSignal,还有每次从idleWorkers里取一个worker都要取出freeSignal对应的一个值,不存在有可用worker却被freeSignal阻塞""",gitlab:GithubUser:7496278,2018-08-02T04:13:09.000+00:00
+gitlab:GithubIssue:1:410141732,gitlab:GithubIssue:1:347255859,"""切片如下\r\n\r\n这里等待锁\r\n9913 @ 0x42c73a 0x42c7ee 0x43cf64 0x43cc7d 0x46dfe8 0x7b28e0 0x7b2be5 0x4591f1\r\n#\t0x43cc7c\tsync.runtime_SemacquireMutex+0x3c\t\t\t\tE:/go/src/runtime/sema.go:71\r\n#\t0x46dfe7\tsync.(*Mutex).Lock+0x107\t\t\t\t\tE:/go/src/sync/mutex.go:134\r\n#\t0x7b28df\tmp/vendor/github.com/panjf2000/ants.(*Pool).putWorker+0x6f\tF:/gowork/src/mp/vendor/github.com/panjf2000/ants/pool.go:229\r\n#\t0x7b2be4\tmp/vendor [...]
+gitlab:GithubIssue:1:410143221,gitlab:GithubIssue:1:347255859,"""加了锁之后有下标溢出了。。。\r\npanic: runtime error: index out of range\r\n\r\ngoroutine 7 [running]:\r\nmp/vendor/github.com/panjf2000/ants.(*Pool).getWorker(0xc4200b6460, 0xc4202a6e01)\r\n\tF:/gowork/src/mp/vendor/github.com/panjf2000/ants/pool.go:213 +0x2ce\r\nmp/vendor/github.com/panjf2000/ants.(*Pool).Submit(0xc4200b6460, 0xc4223d47d0, 0x0, 0x0)\r\n\tF:/gowork/src/mp/vendor/github.com/panjf2000/ants/pool.go:125 +0x62\r\n""",gitlab: [...]
+gitlab:GithubIssue:1:410147487,gitlab:GithubIssue:1:347255859,"""@lovelly 我查了源码,怎么行数和你说的有点对不上,你的代码更新到最新了吗?""",gitlab:GithubUser:7496278,2018-08-03T05:21:03.000+00:00
+gitlab:GithubIssue:1:410170764,gitlab:GithubIssue:1:347255859,"""是最新的代码,我有添加一些print 所以行数不一样,这确实是一个bug 9913个协程阻塞在了 putWorker 很久很久。,。。。""",gitlab:GithubUser:13118848,2018-08-03T07:33:21.000+00:00
+gitlab:GithubIssue:1:410173358,gitlab:GithubIssue:1:347255859,"""![image](https://user-images.githubusercontent.com/13118848/43630582-44f48000-9733-11e8-936d-9cb0d4145204.png)\r\n 我idleWorkers 为空的, 但是我有n个协程阻塞在了 204行的\t<-p.freeSignal, 这时候来了一个worker被放入idleWorkers, 很巧的是一个协程在putWorker结束锁后,在190行的p.lock.Lock()拿到了锁,这时候 n := len(idleWorkers) - 1 结果是0 这个协程很高兴的进入了接下来的else分支, 然而不幸发生了,p.freeSignal的信号确被早已等在 204行的若干个协程中的一个拿走了, 那么 可怜的协程拿到了锁, 确无法等到 p.freeSignal  p.freeSignal要拿到锁才能产生信号, 然后就。,。。""",gitlab [...]
+gitlab:GithubIssue:1:410204870,gitlab:GithubIssue:1:347255859,"""@lovelly 检查了一下,的确可能会有这个问题,这两天我会修复;\r\n另外,我测试的时候试过1000w的量都没发现过这个问题,可能是我每个任务的执行时间太短了,所以我想问下你的任务量有多大以及每个任务的耗时大概是多少?""",gitlab:GithubUser:7496278,2018-08-03T09:51:15.000+00:00
+gitlab:GithubIssue:1:410205295,gitlab:GithubIssue:1:347255859,"""我任务耗时从0秒到60秒之间。。。""",gitlab:GithubUser:13118848,2018-08-03T09:53:00.000+00:00
+gitlab:GithubIssue:1:410267195,gitlab:GithubIssue:1:347255859,"""@lovelly 应该已经修复了,可以再试试""",gitlab:GithubUser:7496278,2018-08-03T14:15:45.000+00:00
+gitlab:GithubIssue:1:410290418,gitlab:GithubIssue:1:346842831,"""具体问题可以看 #6 """,gitlab:GithubUser:7496278,2018-08-03T15:32:00.000+00:00
+gitlab:GithubIssue:1:411342200,gitlab:GithubIssue:1:348630179,"""@huiwq1990 谢谢指出,今天会修复这个问题。""",gitlab:GithubUser:7496278,2018-08-08T09:17:30.000+00:00
+gitlab:GithubIssue:1:411369513,gitlab:GithubIssue:1:348630179,"""@huiwq1990 应该解决了,可以再试试""",gitlab:GithubUser:7496278,2018-08-08T11:06:55.000+00:00
+gitlab:GithubIssue:1:411965696,gitlab:GithubIssue:1:348630179,"""嗯,解决了""",gitlab:GithubUser:4555057,2018-08-10T03:35:53.000+00:00
+gitlab:GithubIssue:1:411969260,gitlab:GithubIssue:1:348630179,"""@huiwq1990 好的,那我关掉这个issue了。""",gitlab:GithubUser:7496278,2018-08-10T04:06:04.000+00:00
+gitlab:GithubIssue:1:418287926,gitlab:GithubIssue:1:356703393,"""会导致很多任务长时间在阻塞,至于cpu飙升应该不会""",gitlab:GithubUser:7496278,2018-09-04T08:40:06.000+00:00
+gitlab:GithubIssue:1:418290090,gitlab:GithubIssue:1:356703393,"""所以应该在goroutine中调用submit 否则会阻塞主任务""",gitlab:GithubUser:11763614,2018-09-04T08:47:39.000+00:00
+gitlab:GithubIssue:1:418293975,gitlab:GithubIssue:1:356703393,"""不是的,如果每一个submit都用一个goroutine那不就违背初衷了吗,这样的话你有多少个任务还是要启动多少个原生goroutine。""",gitlab:GithubUser:7496278,2018-09-04T09:00:55.000+00:00
+gitlab:GithubIssue:1:418297020,gitlab:GithubIssue:1:356703393,"""// Submit submits a task to this pool.\r\nfunc (p *Pool) Submit(task f) error {\r\n\tif len(p.release) > 0 {\r\n\t\treturn ErrPoolClosed\r\n\t}\r\n\tp.getWorker().task <- task\r\n\treturn nil\r\n}\r\n我是觉得p.getWorker()  阻塞不太好 ,这样主任务和pool没有彻底隔离""",gitlab:GithubUser:11763614,2018-09-04T09:11:37.000+00:00
+gitlab:GithubIssue:1:425014962,gitlab:GithubIssue:1:364361014,"""我晚上回去就打一下新的tag,完了我再给你回一个邮件\r\n\r\nedcismybrother <no...@github.com> 于2018年9月27日周四 下午4:32写道:\r\n\r\n> 鄙人现在在弄dep依赖管理,有用到你写的ants项目,可是你好像忘记打最新的tag了。最新的tag\r\n> 3.6是指向ed55924这个提交,git上的最新代码是af376f1b这次提交,两次提交都隔了快5个月了,看到的话,麻烦打一个最新的tag吧。(手动可怜)\r\n>\r\n> —\r\n> You are receiving this because you are subscribed to this thread.\r\n> Reply to this email directly, view it on GitHub\r\n> <https://github.com/panjf2000/ants/issues/1 [...]
+gitlab:GithubIssue:1:425018770,gitlab:GithubIssue:1:356703393,"""我觉得这个会导致cpu上升。调用Submit时,如果没有多余的worker,会一直进入这个死循环\r\n```\t\t\r\nfor {\r\n\t\t\tp.lock.Lock()\r\n\t\t\tidleWorkers = p.workers\r\n\t\t\tl := len(idleWorkers) - 1\r\n\t\t\tif l < 0 {\r\n\t\t\t\tp.lock.Unlock()\r\n\t\t\t\tcontinue\r\n\t\t\t}\r\n\t\t\tw = idleWorkers[l]\r\n\t\t\tidleWorkers[l] = nil\r\n\t\t\tp.workers = idleWorkers[:l]\r\n\t\t\tp.lock.Unlock()\r\n\t\t\tbreak\r\n\t\t}\r\n```\r\n一直会continue,直到有空闲的worker,这样会阻塞调用Sub [...]
+gitlab:GithubIssue:1:425061837,gitlab:GithubIssue:1:356703393,"""![snip20180927_3](https://user-images.githubusercontent.com/12890888/46144182-c4efe200-c28e-11e8-8e69-ffd4502e3b9e.png)\r\n\r\ncpu占用率一直接近100%\r\n\r\n![snip20180927_4](https://user-images.githubusercontent.com/12890888/46144221-ddf89300-c28e-11e8-985b-48437eb20cdc.png)\r\n""",gitlab:GithubUser:12890888,2018-09-27T11:53:26.000+00:00
+gitlab:GithubIssue:1:425062926,gitlab:GithubIssue:1:364361014,"""tag更新了,v3.7\r\n\r\nAndy Pan <pa...@gmail.com> 于2018年9月27日周四 下午5:00写道:\r\n\r\n> 我晚上回去就打一下新的tag,完了我再给你回一个邮件\r\n>\r\n> edcismybrother <no...@github.com> 于2018年9月27日周四 下午4:32写道:\r\n>\r\n>> 鄙人现在在弄dep依赖管理,有用到你写的ants项目,可是你好像忘记打最新的tag了。最新的tag\r\n>> 3.6是指向ed55924这个提交,git上的最新代码是af376f1b这次提交,两次提交都隔了快5个月了,看到的话,麻烦打一个最新的tag吧。(手动可怜)\r\n>>\r\n>> —\r\n>> You are receiving this because you are subscribed to this thread.\r\n>> Rep [...]
+gitlab:GithubIssue:1:425066089,gitlab:GithubIssue:1:356703393,"""@liyonglion 这个例子看起来有点极端,因为只有两个任务,pool容量是1,所以剩下那个不断在自己加锁解锁导致cpu忙,如果是多个竞争的大部分是block状态,应该不会出现这种cpu满的情况,不然你把例子改改?增加提交的任务数再看看,看看还会不会出现这种情况。""",gitlab:GithubUser:7496278,2018-09-27T12:07:30.000+00:00
+gitlab:GithubIssue:1:425288734,gitlab:GithubIssue:1:356703393,"""@panjf2000  ants比较适合做“短期”任务,如果存在大量的“长期”任务,很有可能导致死循环。为什么不block当前Submit的“线程”?""",gitlab:GithubUser:12890888,2018-09-28T01:09:40.000+00:00
+gitlab:GithubIssue:1:425293042,gitlab:GithubIssue:1:356703393,"""@liyonglion 之前有用过chan阻塞等待,但是导致了一个死锁问题:#6,后来才改成这种形式。所以我说的增加submit的任务数再测试之后也是cpu 100%吗?这个问题我现在暂时没想到比较好的解决办法,我再想想,或者你有没有比较好的想法?可以提个pr。""",gitlab:GithubUser:7496278,2018-09-28T01:37:17.000+00:00
+gitlab:GithubIssue:1:425331360,gitlab:GithubIssue:1:364361014,"""@panjf2000 可以的,谢谢啦""",gitlab:GithubUser:29452204,2018-09-28T06:05:58.000+00:00
+gitlab:GithubIssue:1:425409255,gitlab:GithubIssue:1:356703393,"""@panjf2000  我提交了一个pr,你看下是否合理?我自己跑了上面的用例,没有问题。效率方面我还没有具体测试。""",gitlab:GithubUser:12890888,2018-09-28T11:41:08.000+00:00
+gitlab:GithubIssue:1:425423023,gitlab:GithubIssue:1:356703393,"""@liyonglion 我看修改的代码应该是正确的,但是有两个问题:\r\n1. 要正确测试你pr,你要把ants_test.go里import ants的路径改成你自己的路径;\r\n2.你现在只修改了pool.go的代码,麻烦把pool_func.go里相应的地方也优化一下。""",gitlab:GithubUser:7496278,2018-09-28T12:41:27.000+00:00
+gitlab:GithubIssue:1:439792581,gitlab:GithubIssue:1:382039050,"""GOMAXPROCS你可以理解成是G-P-M模型中的M的数量,也就是最大并行数。""",gitlab:GithubUser:7496278,2018-11-19T07:10:47.000+00:00
+gitlab:GithubIssue:1:439793939,gitlab:GithubIssue:1:381941219,"""release的确有这个问题,目前还没有比较好的办法,只是等待定时销毁的那个goroutine去释放内存,你要是有兴趣可以再想想有没有更好的办法,可以提个pr""",gitlab:GithubUser:7496278,2018-11-19T07:18:05.000+00:00
+gitlab:GithubIssue:1:440207809,gitlab:GithubIssue:1:382574800,"""https://github.com/panjf2000/ants/blob/711dbdb7a222771ce15aaee1bb7b7c6e9731f208/pool.go#L119""",gitlab:GithubUser:5668717,2018-11-20T09:41:24.000+00:00
+gitlab:GithubIssue:1:440263871,gitlab:GithubIssue:1:382574800,"""这里可以讨论下,是否可以在任务函数里通过闭包的形式,将结果存入channel,满足你的需求?""",gitlab:GithubUser:7496278,2018-11-20T12:56:13.000+00:00
+gitlab:GithubIssue:1:440500490,gitlab:GithubIssue:1:382574800,"""> 这里可以讨论下,是否可以在任务函数里通过闭包的形式,将结果存入channel,满足你的需求?\r\n\r\n可以的。但不仅仅如此,最重要的是想得到哪条消息失败了,方便进行下次延时处理或丢回队列。""",gitlab:GithubUser:5668717,2018-11-21T02:00:22.000+00:00
+gitlab:GithubIssue:1:440541883,gitlab:GithubIssue:1:382574800,"""目前可以通过参数来传入处理失败的chan\r\n\r\ntype msg struct {\r\n……\r\nFailed chan<- *msg\r\n}\r\n\r\n// payload == &msg\r\npool,_:= NewPoolWithFunc(10,func(payload interface{}) error{\r\n……\r\n// 失败的话payload 发送到 Failed chan\r\n})\r\n\r\npool.Serve(msg)""",gitlab:GithubUser:7931755,2018-11-21T05:57:51.000+00:00
+gitlab:GithubIssue:1:440605531,gitlab:GithubIssue:1:382574800,"""> 目前可以通过参数来传入处理失败的chan\r\n> \r\n> type msg struct {\r\n> ……\r\n> Failed chan<- *msg\r\n> }\r\n> \r\n> // payload == &msg\r\n> pool,_:= NewPoolWithFunc(10,func(payload interface{}) error{\r\n> ……\r\n> // 失败的话payload 发送到 Failed chan\r\n> })\r\n> \r\n> pool.Serve(msg)\r\n\r\n我目前的做法是没有用 `NewPoolWithFunc()`,而是用的 `ants.NewPool()`,控制整个服务只有一个`pool`,所有的任务都是从大`pool`里取:\r\n\r\n```\r\nfunc (w *Worker) Register(fn func() error, opts ... [...]
+gitlab:GithubIssue:1:440876192,gitlab:GithubIssue:1:382574800,"""错误返回,按照ants的设计,其实应该是异步的,目前没办法直接return error到调用的函数里,所以我觉得就算是处理也应该是异步的方式;至于任务依赖,目前想到的有两种办法:1.回调函数;2.消息通知(通过channel或消息队列),至于是不是要把这些复杂的逻辑加到ants里,有待商榷,或者你也可以推一个pr,大家一起探讨下~~""",gitlab:GithubUser:7496278,2018-11-22T01:09:56.000+00:00
+gitlab:GithubIssue:1:442366878,gitlab:GithubIssue:1:381941219,"""在 pool里面加上一个 waitgroup,每次 启动一个 work,调用 waitgroup.Add(),协程执行完了就执行waitgroup.Done()。在release时候调用waitgroup.Wait()。最后再回收空闲 worker。不过b如果 worker 对于的 func 执行时间过长,会导致release一直等待。""",gitlab:GithubUser:32898629,2018-11-28T08:48:17.000+00:00
+gitlab:GithubIssue:1:445462719,gitlab:GithubIssue:1:388907811,"""你的go版本是多少?""",gitlab:GithubUser:7496278,2018-12-08T14:20:26.000+00:00
+gitlab:GithubIssue:1:445496131,gitlab:GithubIssue:1:388907811,"""go version go1.11.1 darwin/amd64\r\n\r\n我也尝试了将几个参数调小一点,结果都是 Semaphore 和 AntsPool 量级上都是差不多的""",gitlab:GithubUser:720086,2018-12-08T22:56:54.000+00:00
+gitlab:GithubIssue:1:445815378,gitlab:GithubIssue:1:388907811,"""嗯,的确是一个量级。\r\nants的优势是:\r\n1. 内存消耗会小(并发量大的时候几乎可以节省一半的内存量);\r\n2. goroutine常驻内存(定时清理长时间空置的goroutine,按最后使用时间排序,最久未使用的goroutine最先被清理,进一步降低资源消耗);\r\n3. ants pool更加灵活可控,可动态调整pool size、手动销毁pool;\r\n4. 还有各类方法获取正在运行的goroutine数量、可用的goroutine数量,使并发程序更精确可控;\r\n......""",gitlab:GithubUser:7496278,2018-12-10T13:30:04.000+00:00
+gitlab:GithubIssue:1:446447291,gitlab:GithubIssue:1:388907811,"""好的,怎么样测试内存消耗呢?按我理解大家活跃的 go routines 是一样的数目,为什么 ants 的内存消耗会小呢?""",gitlab:GithubUser:720086,2018-12-12T03:18:44.000+00:00
+gitlab:GithubIssue:1:446453643,gitlab:GithubIssue:1:388907811,"""加上benchmem=true参数;至于为什么内存会更小,是因为在pool里的goroutines是常驻内存的,新的任务是复用goroutine的,而用sema的话只是限制了活跃的goroutine数量,并没有复用,新的任务还是会生成新的goroutine。""",gitlab:GithubUser:7496278,2018-12-12T03:58:29.000+00:00
+gitlab:GithubIssue:1:456022133,gitlab:GithubIssue:1:401277739,"""合理的需求,可以加。我这两天加下。""",gitlab:GithubUser:7496278,2019-01-21T10:21:24.000+00:00
+gitlab:GithubIssue:1:456022560,gitlab:GithubIssue:1:401277739,"""你要有兴趣也可以自己做,然后提个PR。""",gitlab:GithubUser:7496278,2019-01-21T10:22:39.000+00:00
+gitlab:GithubIssue:1:459948887,gitlab:GithubIssue:1:405951301,"""@jiashiwen \r\nIt works on my side, pls make sure that you run the example on top of the latest ants code, thanks.""",gitlab:GithubUser:7496278,2019-02-02T09:03:51.000+00:00
+gitlab:GithubIssue:1:468919580,gitlab:GithubIssue:1:413968505,"""不会的,incRunning操作总是在比较大小之后才发生的。""",gitlab:GithubUser:7496278,2019-03-02T13:14:05.000+00:00
+gitlab:GithubIssue:1:471299071,gitlab:GithubIssue:1:419183961,"""server接收的并发请求量有多大?""",gitlab:GithubUser:7496278,2019-03-10T13:18:01.000+00:00
+gitlab:GithubIssue:1:471869506,gitlab:GithubIssue:1:419268851,"""加锁后资源消耗会增加,性能会下降很多,所以是加锁确保池数量还是不加锁保证性能呢?""",gitlab:GithubUser:29243953,2019-03-12T06:06:39.000+00:00
diff --git a/plugins/github/e2e/snapshot_tables/pull_request_comments.csv b/plugins/github/e2e/snapshot_tables/pull_request_comments.csv
new file mode 100644
index 00000000..d1c18c3b
--- /dev/null
+++ b/plugins/github/e2e/snapshot_tables/pull_request_comments.csv
@@ -0,0 +1,47 @@
+id,pull_request_id,body,user_id,created_date,commit_sha,position
+gitlab:GithubPullRequest:1:407675431,gitlab:GithubPullRequest:1:203756736,"""# [Codecov](https://codecov.io/gh/panjf2000/ants/pull/4?src=pr&el=h1) Report\n> Merging [#4](https://codecov.io/gh/panjf2000/ants/pull/4?src=pr&el=desc) into [master](https://codecov.io/gh/panjf2000/ants/commit/f5b37d0798a8e4c6780a1e08270fa50e979aa1d7?src=pr&el=desc) will **not change** coverage.\n> The diff coverage is `100%`.\n\n[![Impacted file tree graph](https://codecov.io/gh/panjf2000/ants/pull/4/graphs/tr [...]
+gitlab:GithubPullRequest:1:407714136,gitlab:GithubPullRequest:1:203756736,"""@barryz 改的不错,不过有一点需要商榷,那个预分配的大小,之前benchmark我记得1000w也只需要用到7w多,这样的话预分配5w对于大部分场景其实有点浪费,你有没有用修改后的代码benchmark一下,每次allocs/op应该是变大了吧""",gitlab:GithubUser:7496278,2018-07-25T10:49:44.000+00:00,,0
+gitlab:GithubPullRequest:1:407755528,gitlab:GithubPullRequest:1:203756736,"""@panjf2000  因为从压测结果来看, 1000W的场景下goroutine池的作用很明显, 尤其是在节省内存开销方面,所以在选择默认worker数量时,取了一个相对较大的值。 下面是benchmark 对比\r\n\r\nmaster:\r\n\r\n```\r\ngoos: linux\r\ngoarch: amd64\r\nBenchmarkGoroutineWithFunc-4           1        15079030287 ns/op       723120296 B/op  10176159 allocs/op\r\nPASS\r\nok      command-line-arguments  15.106s\r\n```\r\n\r\nPR:\r\n```\r\ngoos: linux\r\ngoarch: amd64\r\nBenchmarkGoroutineWithFunc-4 [...]
+gitlab:GithubPullRequest:1:407764945,gitlab:GithubPullRequest:1:203756736,"""@barryz 这样看起来预分配似乎没有太大的内存优势,相反在其他数量的任务量场景下可能还会有点浪费,这样吧,要不你先把预分配内存这一块的暂时移除,然后我合一下优化代码的部分,至于预分配内存这一块,后续再继续讨论下看看有没有能兼顾的办法""",gitlab:GithubUser:7496278,2018-07-25T14:02:41.000+00:00,,0
+gitlab:GithubPullRequest:1:416794440,gitlab:GithubPullRequest:1:211603583,"""@hongli-my 不好意思,我没太懂你的意图?能麻烦说详细点吗?""",gitlab:GithubUser:7496278,2018-08-29T01:39:23.000+00:00,,0
+gitlab:GithubPullRequest:1:416794871,gitlab:GithubPullRequest:1:211603583,"""# [Codecov](https://codecov.io/gh/panjf2000/ants/pull/8?src=pr&el=h1) Report\n> Merging [#8](https://codecov.io/gh/panjf2000/ants/pull/8?src=pr&el=desc) into [master](https://codecov.io/gh/panjf2000/ants/commit/666635c65d8d3bb1223b819325e0bd23c81f2733?src=pr&el=desc) will **decrease** coverage by `1.24%`.\n> The diff coverage is `100%`.\n\n[![Impacted file tree graph](https://codecov.io/gh/panjf2000/ants/pull/8/ [...]
+gitlab:GithubPullRequest:1:416803651,gitlab:GithubPullRequest:1:211603583,"""```n := 0\r\n\t\tfor i, w := range idleWorkers {\r\n\t\t\tif currentTime.Sub(w.recycleTime) <= p.expiryDuration {\r\n\t\t\t\tbreak\r\n\t\t\t}\r\n\t\t\tn = i\r\n\t\t\tw.args <- nil\r\n\t\t\tidleWorkers[i] = nil\r\n\t\t}\r\n\t\tn++\r\n\t\tif n >= len(idleWorkers) {\r\n\t\t\tp.workers = idleWorkers[:0]\r\n\t\t} else {\r\n\t\t\tp.workers = idleWorkers[n:]\r\n\t\t}```\r\nfor 循环中,如果for 循环没有满足条件,n 并没有复制,此时n ++,   n 变为1 [...]
+gitlab:GithubPullRequest:1:416818094,gitlab:GithubPullRequest:1:211603583,"""@hongli-my 嗯,我知道了,但是你的修改似乎不完整,我已经在develop分支改了一版,要不你看下那个分支,然后按照那个再改一下,然后我再merge""",gitlab:GithubUser:7496278,2018-08-29T04:11:17.000+00:00,,0
+gitlab:GithubPullRequest:1:421884048,gitlab:GithubPullRequest:1:211603583,"""对于worker中的chan应该也需要close吧,当协程数量增大时,这种也是一种消耗""",gitlab:GithubUser:29241786,2018-09-17T03:37:44.000+00:00,,0
+gitlab:GithubPullRequest:1:425423544,gitlab:GithubPullRequest:1:218939809,"""@liyonglion 我看修改的代码应该是正确的,但是有两个问题:\r\n1. 要正确测试你pr,你要把ants_test.go里import ants的路径改成你自己的路径;\r\n2. 你现在只修改了pool.go的代码,麻烦把pool_func.go里相应的地方也优化一下。\r\n\r\n你重新修改一下pr,然后通过测试,我就merge了。""",gitlab:GithubUser:7496278,2018-09-28T12:43:30.000+00:00,,0
+gitlab:GithubPullRequest:1:425428914,gitlab:GithubPullRequest:1:218939809,"""我又仔细地想了想,在putWorker方法中,调用p.cond.Signal()之前,p.lock已经解锁了,如果这时候被\r\n![image](https://user-images.githubusercontent.com/7496278/46209831-824b0a00-c361-11e8-9109-609d21bab572.png)\r\n这里获得锁,则空闲队列中的刚刚放入的worker会被取出,这时候p.cond.Wait()再获得锁去队列中取worker的时候就会取不到,len(p.workers) - 1就会是-1,会报错:index out of range,和https://github.com/panjf2000/ants/issues/6 相似的问题,所以p.cond.Signal()应该放在putWorker中的p.lock.Lock()和p.lock.Unlock()之间。\r\n""" [...]
+gitlab:GithubPullRequest:1:425431081,gitlab:GithubPullRequest:1:218939809,"""我明天仔细研究下。如果这个地方的死锁不好解决,其实可以使用另外一把锁,专门给条件变量使用。""",gitlab:GithubUser:12890888,2018-09-28T13:12:08.000+00:00,,0
+gitlab:GithubPullRequest:1:425432498,gitlab:GithubPullRequest:1:218939809,"""单一操作变量最好不要有多个锁,这样引发死锁的概率会非常高。""",gitlab:GithubUser:7496278,2018-09-28T13:17:44.000+00:00,,0
+gitlab:GithubPullRequest:1:425438107,gitlab:GithubPullRequest:1:218939809,"""新的锁只给条件变量使用,其他任何地方都不会使用。如果怕死锁,明天我封装一层,pool层只有一把锁。""",gitlab:GithubUser:12890888,2018-09-28T13:37:48.000+00:00,,0
+gitlab:GithubPullRequest:1:425439137,gitlab:GithubPullRequest:1:218939809,"""封装一层后,按照你的思路修改应该就可以了。""",gitlab:GithubUser:12890888,2018-09-28T13:41:20.000+00:00,,0
+gitlab:GithubPullRequest:1:425608265,gitlab:GithubPullRequest:1:218939809,"""看了下代码,你说的没错。我在测试下性能方面""",gitlab:GithubUser:12890888,2018-09-29T02:22:39.000+00:00,,0
+gitlab:GithubPullRequest:1:425609411,gitlab:GithubPullRequest:1:218939809,"""![image](https://user-images.githubusercontent.com/7496278/46240052-34bbb500-c3d4-11e8-809b-46b429039aee.png)\r\n你这改的有问题,取出来后没有对workers队列缩容,现在Travis CI整个卡住了""",gitlab:GithubUser:7496278,2018-09-29T02:41:56.000+00:00,,0
+gitlab:GithubPullRequest:1:425609608,gitlab:GithubPullRequest:1:218939809,"""嗯,到时候我会补上。容我再想想""",gitlab:GithubUser:12890888,2018-09-29T02:45:23.000+00:00,,0
+gitlab:GithubPullRequest:1:425622339,gitlab:GithubPullRequest:1:218939809,"""性能测试如下:\r\n100w的并发,5w的goroutine\r\n![snip20180929_3](https://user-images.githubusercontent.com/12890888/46242225-93932580-c3f8-11e8-841c-fc7fc620313d.png)\r\n\r\n![snip20180929_5](https://user-images.githubusercontent.com/12890888/46242227-9beb6080-c3f8-11e8-80fa-5d01da9aba19.png)\r\n""",gitlab:GithubUser:12890888,2018-09-29T07:02:56.000+00:00,,0
+gitlab:GithubPullRequest:1:425622437,gitlab:GithubPullRequest:1:218939809,"""# [Codecov](https://codecov.io/gh/panjf2000/ants/pull/13?src=pr&el=h1) Report\n> Merging [#13](https://codecov.io/gh/panjf2000/ants/pull/13?src=pr&el=desc) into [master](https://codecov.io/gh/panjf2000/ants/commit/af376f1b7b59dc488458bcecd4273f0fcde33c55?src=pr&el=desc) will **decrease** coverage by `90.38%`.\n> The diff coverage is `5%`.\n\n[![Impacted file tree graph](https://codecov.io/gh/panjf2000/ants/pull/ [...]
+gitlab:GithubPullRequest:1:425623081,gitlab:GithubPullRequest:1:218939809,"""@panjf2000  这个覆盖率怎么看?""",gitlab:GithubUser:12890888,2018-09-29T07:16:02.000+00:00,,0
+gitlab:GithubPullRequest:1:425632550,gitlab:GithubPullRequest:1:218939809,"""怎么会有负数。。。""",gitlab:GithubUser:7496278,2018-09-29T09:53:47.000+00:00,,0
+gitlab:GithubPullRequest:1:425632613,gitlab:GithubPullRequest:1:218939809,"""而且你那个取出worker之后还是没有对队列进行缩容吧""",gitlab:GithubUser:7496278,2018-09-29T09:54:48.000+00:00,,0
+gitlab:GithubPullRequest:1:425632632,gitlab:GithubPullRequest:1:218939809,"""这个我没玩过。。。。""",gitlab:GithubUser:12890888,2018-09-29T09:55:07.000+00:00,,0
+gitlab:GithubPullRequest:1:425632777,gitlab:GithubPullRequest:1:218939809,"""@panjf2000  我缩容了,具体哪个地方?""",gitlab:GithubUser:12890888,2018-09-29T09:57:34.000+00:00,,0
+gitlab:GithubPullRequest:1:425637776,gitlab:GithubPullRequest:1:218939809,"""@liyonglion 我看错了,缩容的补上了,这块没什么问题了,关于覆盖率这块我明天再查查。。。""",gitlab:GithubUser:7496278,2018-09-29T11:25:56.000+00:00,,0
+gitlab:GithubPullRequest:1:425637938,gitlab:GithubPullRequest:1:218939809,"""哦,我知道了,应该是那个import路径的问题导致的,那我先merge一下代码""",gitlab:GithubUser:7496278,2018-09-29T11:29:28.000+00:00,,0
+gitlab:GithubPullRequest:1:425896318,gitlab:GithubPullRequest:1:219363161,"""# [Codecov](https://codecov.io/gh/panjf2000/ants/pull/14?src=pr&el=h1) Report\n> Merging [#14](https://codecov.io/gh/panjf2000/ants/pull/14?src=pr&el=desc) into [master](https://codecov.io/gh/panjf2000/ants/commit/1b62696050b7030106291980d5220f886b017eff?src=pr&el=desc) will **decrease** coverage by `2.12%`.\n> The diff coverage is `100%`.\n\n[![Impacted file tree graph](https://codecov.io/gh/panjf2000/ants/pull [...]
+gitlab:GithubPullRequest:1:425906970,gitlab:GithubPullRequest:1:219363161,"""thanks for your correction and could you also modify the pool_func.go cuz there is also the same useless statement in that file. i will accept this pr after your modification is done, thanks.""",gitlab:GithubUser:7496278,2018-10-01T13:27:04.000+00:00,,0
+gitlab:GithubPullRequest:1:426537013,gitlab:GithubPullRequest:1:219936521,"""# [Codecov](https://codecov.io/gh/panjf2000/ants/pull/15?src=pr&el=h1) Report\n> Merging [#15](https://codecov.io/gh/panjf2000/ants/pull/15?src=pr&el=desc) into [master](https://codecov.io/gh/panjf2000/ants/commit/29730bb70343924a2f56a13a9799611dd1cd27fd?src=pr&el=desc) will **decrease** coverage by `0.84%`.\n> The diff coverage is `n/a`.\n\n[![Impacted file tree graph](https://codecov.io/gh/panjf2000/ants/pull/ [...]
+gitlab:GithubPullRequest:1:426596957,gitlab:GithubPullRequest:1:219936521,"""@egonelbre thanks for your interest in this repository and i got some puzzles.\r\nfirstly, i don't understand why you use both the chan struct{} and sync.WaitGroup at once, that seems a bit excessive cuz waitgroup and chan did the same thing.\r\nsecondly, method BenchmarkGoroutine was design to test throughput so it should run without waitgroup.""",gitlab:GithubUser:7496278,2018-10-03T11:05:45.000+00:00,,0
+gitlab:GithubPullRequest:1:426604764,gitlab:GithubPullRequest:1:219936521,"""Hi, semaphore acts as protection to avoid starting too many goroutines at once. `WaitGroup` is used to wait for everything to complete.\r\n\r\n`BenchmarkGoroutine` doesn't wait for all the goroutines to finish, so you are testing goroutine startup speed rather than throughput. It's somewhat unclear what you mean by \""throughput\"" in this case, but either way you would need to wait for all goroutines to finish, [...]
+gitlab:GithubPullRequest:1:429609579,gitlab:GithubPullRequest:1:222703171,"""# [Codecov](https://codecov.io/gh/panjf2000/ants/pull/16?src=pr&el=h1) Report\n> Merging [#16](https://codecov.io/gh/panjf2000/ants/pull/16?src=pr&el=desc) into [master](https://codecov.io/gh/panjf2000/ants/commit/711dbdb7a222771ce15aaee1bb7b7c6e9731f208?src=pr&el=desc) will **decrease** coverage by `2.03%`.\n> The diff coverage is `0%`.\n\n[![Impacted file tree graph](https://codecov.io/gh/panjf2000/ants/pull/1 [...]
+gitlab:GithubPullRequest:1:433821356,gitlab:GithubPullRequest:1:211603583,"""这种bugfix是不是应该赶紧修了?""",gitlab:GithubUser:8923413,2018-10-29T08:10:59.000+00:00,,0
+gitlab:GithubPullRequest:1:434126048,gitlab:GithubPullRequest:1:211603583,"""@choleraehyq 这个很早就已经修复了这个pr一直忘了关。""",gitlab:GithubUser:7496278,2018-10-30T00:10:32.000+00:00,,0
+gitlab:GithubPullRequest:1:434126349,gitlab:GithubPullRequest:1:211603583,"""@MrDragon1122 一般来说channel是不需要显式close的,只要没有goroutine持有channel,相关资源会自动释放。""",gitlab:GithubUser:7496278,2018-10-30T00:12:13.000+00:00,,0
+gitlab:GithubPullRequest:1:439758381,gitlab:GithubPullRequest:1:231840723,"""# [Codecov](https://codecov.io/gh/panjf2000/ants/pull/19?src=pr&el=h1) Report\n> Merging [#19](https://codecov.io/gh/panjf2000/ants/pull/19?src=pr&el=desc) into [develop](https://codecov.io/gh/panjf2000/ants/commit/92acf74bb71c1dc1758c61346c88325284978b3e?src=pr&el=desc) will **increase** coverage by `0.02%`.\n> The diff coverage is `100%`.\n\n[![Impacted file tree graph](https://codecov.io/gh/panjf2000/ants/pul [...]
+gitlab:GithubPullRequest:1:439758480,gitlab:GithubPullRequest:1:231840723,"""我自己写了测试示例\r\n重复\r\nants.NewPoolWithFunc()\r\n然后\r\n进行Resize(0) && Release\r\n但仍发现内存泄漏现象,追溯到了NewTicker没有进行Stop可能导致\r\n\r\nflat  flat%   sum%        cum   cum%\r\n\r\n 7168.57kB 77.60% 77.60%  7168.57kB 77.60%  time.NewTicker\r\n\r\n\r\n\r\n""",gitlab:GithubUser:7931755,2018-11-19T03:06:50.000+00:00,,0
+gitlab:GithubPullRequest:1:439781607,gitlab:GithubPullRequest:1:231840723,"""突然看到一个PR有更完善的解决方式,不知道为啥没有PR成功""",gitlab:GithubUser:7931755,2018-11-19T06:07:43.000+00:00,,0
+gitlab:GithubPullRequest:1:439793352,gitlab:GithubPullRequest:1:231840723,"""另外一个pr跟你大概是完成类似的功能,不过那个failed之后作者就没再更新了,所以就没有merge,你要是有时间不如参考下他的代码再优化下?就放到这个pr里。""",gitlab:GithubUser:7496278,2018-11-19T07:14:58.000+00:00,,0
+gitlab:GithubPullRequest:1:456033956,gitlab:GithubPullRequest:1:246250598,"""# [Codecov](https://codecov.io/gh/panjf2000/ants/pull/23?src=pr&el=h1) Report\n> Merging [#23](https://codecov.io/gh/panjf2000/ants/pull/23?src=pr&el=desc) into [master](https://codecov.io/gh/panjf2000/ants/commit/812dd4e01075be3cf97429a43abaf6837908cdcd?src=pr&el=desc) will **decrease** coverage by `1.02%`.\n> The diff coverage is `71.42%`.\n\n[![Impacted file tree graph](https://codecov.io/gh/panjf2000/ants/pu [...]
+gitlab:GithubPullRequest:1:456071084,gitlab:GithubPullRequest:1:246250598,"""@choleraehyq \r\nbuild失败了,解决一下?""",gitlab:GithubUser:7496278,2019-01-21T13:18:19.000+00:00,,0
+gitlab:GithubPullRequest:1:456261758,gitlab:GithubPullRequest:1:246250598,"""@panjf2000 这是测试覆盖率的问题吧,我已经测了设置 PanicHandler 的情况了,不设置的情况一测就 panic 了,而且是在一个 worker 里 panic,没法 recover""",gitlab:GithubUser:8923413,2019-01-22T03:45:04.000+00:00,,0
+gitlab:GithubPullRequest:1:456270386,gitlab:GithubPullRequest:1:246250598,"""@choleraehyq \r\n三点:\r\n1. CI failed是因为TestPanicHandler测试失败了\r\n![image](https://user-images.githubusercontent.com/7496278/51513040-ba5fe680-1e43-11e9-92eb-6af6fa1242c9.png)\r\n2. 在Worker的recover里面,需要再加一个w.pool.decRunning(),因为panic之后这个goroutine就销毁了,所以要更新pool中的可用worker数量\r\n3. 麻烦在pool_func.go和worker_func.go里面也相应地加上PanicHandler的逻辑以及对应的unit tests\r\n\r\nThanks.""",gitlab:GithubUser:7496278,2019-01-22T04:50:28.000+00:00,,0
+gitlab:GithubPullRequest:1:456273052,gitlab:GithubPullRequest:1:246250598,"""@panjf2000 thanks,修了""",gitlab:GithubUser:8923413,2019-01-22T05:10:00.000+00:00,,0
+gitlab:GithubPullRequest:1:456277710,gitlab:GithubPullRequest:1:246250598,"""Thanks for your contributions to `ants`!""",gitlab:GithubUser:7496278,2019-01-22T05:41:10.000+00:00,,0
diff --git a/plugins/github/models/issue_comment.go b/plugins/github/models/issue_comment.go
index 3dd77221..960dfbf7 100644
--- a/plugins/github/models/issue_comment.go
+++ b/plugins/github/models/issue_comment.go
@@ -23,8 +23,9 @@ import (
 )
 
 type GithubIssueComment struct {
-	GithubId        int `gorm:"primaryKey"`
-	IssueId         int `gorm:"index;comment:References the Issue"`
+	ConnectionId    uint64 `gorm:"primaryKey"`
+	GithubId        int    `gorm:"primaryKey"`
+	IssueId         int    `gorm:"index;comment:References the Issue"`
 	Body            string
 	AuthorUsername  string `gorm:"type:varchar(255)"`
 	AuthorUserId    int
diff --git a/plugins/github/models/migrationscripts/archived/issue_comment.go b/plugins/github/models/migrationscripts/archived/issue_comment.go
index b17c79a7..4f06dcf3 100644
--- a/plugins/github/models/migrationscripts/archived/issue_comment.go
+++ b/plugins/github/models/migrationscripts/archived/issue_comment.go
@@ -24,8 +24,9 @@ import (
 )
 
 type GithubIssueComment struct {
-	GithubId        int `gorm:"primaryKey"`
-	IssueId         int `gorm:"index;comment:References the Issue"`
+	ConnectionId    uint64 `gorm:"primaryKey"`
+	GithubId        int    `gorm:"primaryKey"`
+	IssueId         int    `gorm:"index;comment:References the Issue"`
 	Body            string
 	AuthorUsername  string `gorm:"type:varchar(255)"`
 	AuthorUserId    int
diff --git a/plugins/github/models/migrationscripts/archived/pull_request_comment.go b/plugins/github/models/migrationscripts/archived/pull_request_comment.go
index e1fe4457..c88387c8 100644
--- a/plugins/github/models/migrationscripts/archived/pull_request_comment.go
+++ b/plugins/github/models/migrationscripts/archived/pull_request_comment.go
@@ -24,8 +24,9 @@ import (
 )
 
 type GithubPullRequestComment struct {
-	GithubId        int `gorm:"primaryKey"`
-	PullRequestId   int `gorm:"index"`
+	ConnectionId    uint64 `gorm:"primaryKey"`
+	GithubId        int    `gorm:"primaryKey"`
+	PullRequestId   int    `gorm:"index"`
 	Body            string
 	AuthorUsername  string `gorm:"type:varchar(255)"`
 	AuthorUserId    int
diff --git a/plugins/github/models/migrationscripts/init_schema_20220611.go b/plugins/github/models/migrationscripts/init_schema_20220611.go
index 9453c359..ce938638 100644
--- a/plugins/github/models/migrationscripts/init_schema_20220611.go
+++ b/plugins/github/models/migrationscripts/init_schema_20220611.go
@@ -131,7 +131,7 @@ func (u *InitSchemas) Up(ctx context.Context, db *gorm.DB) error {
 }
 
 func (*InitSchemas) Version() uint64 {
-	return 20220612000001
+	return 20220613000001
 }
 
 func (*InitSchemas) Name() string {
diff --git a/plugins/github/models/pr_comment.go b/plugins/github/models/pr_comment.go
index e1cfdb18..bea0a5c0 100644
--- a/plugins/github/models/pr_comment.go
+++ b/plugins/github/models/pr_comment.go
@@ -23,8 +23,9 @@ import (
 )
 
 type GithubPullRequestComment struct {
-	GithubId        int `gorm:"primaryKey"`
-	PullRequestId   int `gorm:"index"`
+	ConnectionId    uint64 `gorm:"primaryKey"`
+	GithubId        int    `gorm:"primaryKey"`
+	PullRequestId   int    `gorm:"index"`
 	Body            string
 	AuthorUsername  string `gorm:"type:varchar(255)"`
 	AuthorUserId    int
diff --git a/plugins/github/tasks/comment_collector.go b/plugins/github/tasks/comment_collector.go
index 9263a312..b9b42a91 100644
--- a/plugins/github/tasks/comment_collector.go
+++ b/plugins/github/tasks/comment_collector.go
@@ -20,6 +20,7 @@ package tasks
 import (
 	"encoding/json"
 	"fmt"
+	. "github.com/apache/incubator-devlake/plugins/core/dal"
 	"net/http"
 	"net/url"
 
@@ -34,27 +35,33 @@ const RAW_COMMENTS_TABLE = "github_api_comments"
 // this struct should be moved to `github_api_common.go`
 
 func CollectApiComments(taskCtx core.SubTaskContext) error {
-	db := taskCtx.GetDb()
+	db := taskCtx.GetDal()
 	data := taskCtx.GetData().(*GithubTaskData)
 
 	since := data.Since
 	incremental := false
-	// user didn't specify a time range to sync, try load from database
-	// actually, for github pull, since doesn't make any sense, github pull api doesn't support it
 	if since == nil {
 		var latestUpdatedIssueComt models.GithubIssueComment
-		err := db.Model(&latestUpdatedIssueComt).
-			Joins("left join _tool_github_issues on _tool_github_issues.github_id = _tool_github_issue_comments.issue_id").
-			Where("_tool_github_issues.repo_id = ?", data.Repo.GithubId).
-			Order("github_updated_at DESC").Limit(1).Find(&latestUpdatedIssueComt).Error
+		err := db.All(
+			&latestUpdatedIssueComt,
+			Join("left join _tool_github_issues on _tool_github_issues.github_id = _tool_github_issue_comments.issue_id"),
+			Where(
+				"_tool_github_issues.repo_id = ? AND _tool_github_issues.connection_id = ?", data.Repo.GithubId, data.Repo.ConnectionId,
+			),
+			Orderby("github_updated_at DESC"),
+			Limit(1),
+		)
 		if err != nil {
 			return fmt.Errorf("failed to get latest github issue record: %w", err)
 		}
 		var latestUpdatedPrComt models.GithubPullRequestComment
-		err = db.Model(&latestUpdatedPrComt).
-			Joins("left join _tool_github_pull_requests on _tool_github_pull_requests.github_id = _tool_github_pull_request_comments.pull_request_id").
-			Where("_tool_github_pull_requests.repo_id = ?", data.Repo.GithubId).
-			Order("github_updated_at DESC").Limit(1).Find(&latestUpdatedPrComt).Error
+		err = db.All(
+			&latestUpdatedPrComt,
+			Join("left join _tool_github_pull_requests on _tool_github_pull_requests.github_id = _tool_github_pull_request_comments.pull_request_id"),
+			Where("_tool_github_pull_requests.repo_id = ? AND _tool_github_pull_requests.connection_id = ?", data.Repo.GithubId, data.Repo.ConnectionId),
+			Orderby("github_updated_at DESC"),
+			Limit(1),
+		)
 		if err != nil {
 			return fmt.Errorf("failed to get latest github issue record: %w", err)
 		}
diff --git a/plugins/github/tasks/comment_extractor.go b/plugins/github/tasks/comment_extractor.go
index 4627d976..c932ab4f 100644
--- a/plugins/github/tasks/comment_extractor.go
+++ b/plugins/github/tasks/comment_extractor.go
@@ -19,6 +19,7 @@ package tasks
 
 import (
 	"encoding/json"
+	"github.com/apache/incubator-devlake/plugins/core/dal"
 
 	"github.com/apache/incubator-devlake/plugins/core"
 	"github.com/apache/incubator-devlake/plugins/github/models"
@@ -36,7 +37,7 @@ var ExtractApiCommentsMeta = core.SubTaskMeta{
 
 type IssueComment struct {
 	GithubId int `json:"id"`
-	Body     string
+	Body     json.RawMessage
 	User     struct {
 		Login string
 		Id    int
@@ -53,8 +54,9 @@ func ExtractApiComments(taskCtx core.SubTaskContext) error {
 		RawDataSubTaskArgs: helper.RawDataSubTaskArgs{
 			Ctx: taskCtx,
 			Params: GithubApiParams{
-				Owner: data.Options.Owner,
-				Repo:  data.Options.Repo,
+				ConnectionId: data.Options.ConnectionId,
+				Owner:        data.Options.Owner,
+				Repo:         data.Options.Repo,
 			},
 			Table: RAW_COMMENTS_TABLE,
 		},
@@ -75,21 +77,22 @@ func ExtractApiComments(taskCtx core.SubTaskContext) error {
 				return nil, err
 			}
 			issue := &models.GithubIssue{}
-			err = taskCtx.GetDb().Where("number = ? and repo_id = ?", issueINumber, data.Repo.GithubId).Limit(1).Find(issue).Error
+			err = taskCtx.GetDal().All(issue, dal.Where("connection_id = ? and number = ? and repo_id = ?", data.Options.ConnectionId, issueINumber, data.Repo.GithubId))
 			if err != nil {
 				return nil, err
 			}
 			//if we can not find issues with issue number above, move the comments to github_pull_request_comments
 			if issue.GithubId == 0 {
 				pr := &models.GithubPullRequest{}
-				err = taskCtx.GetDb().Where("number = ? and repo_id = ?", issueINumber, data.Repo.GithubId).Limit(1).Find(pr).Error
+				err = taskCtx.GetDal().First(pr, dal.Where("connection_id = ? and number = ? and repo_id = ?", data.Options.ConnectionId, issueINumber, data.Repo.GithubId))
 				if err != nil {
 					return nil, err
 				}
 				githubPrComment := &models.GithubPullRequestComment{
+					ConnectionId:    data.Options.ConnectionId,
 					GithubId:        apiComment.GithubId,
 					PullRequestId:   pr.GithubId,
-					Body:            apiComment.Body,
+					Body:            string(apiComment.Body),
 					AuthorUsername:  apiComment.User.Login,
 					AuthorUserId:    apiComment.User.Id,
 					GithubCreatedAt: apiComment.GithubCreatedAt.ToTime(),
@@ -98,9 +101,10 @@ func ExtractApiComments(taskCtx core.SubTaskContext) error {
 				results = append(results, githubPrComment)
 			} else {
 				githubIssueComment := &models.GithubIssueComment{
+					ConnectionId:    data.Options.ConnectionId,
 					GithubId:        apiComment.GithubId,
 					IssueId:         issue.GithubId,
-					Body:            apiComment.Body,
+					Body:            string(apiComment.Body),
 					AuthorUsername:  apiComment.User.Login,
 					AuthorUserId:    apiComment.User.Id,
 					GithubCreatedAt: apiComment.GithubCreatedAt.ToTime(),
diff --git a/plugins/github/tasks/issue_comment_convertor.go b/plugins/github/tasks/issue_comment_convertor.go
index e480ac5d..1503deee 100644
--- a/plugins/github/tasks/issue_comment_convertor.go
+++ b/plugins/github/tasks/issue_comment_convertor.go
@@ -22,6 +22,7 @@ import (
 	"github.com/apache/incubator-devlake/models/domainlayer/didgen"
 	"github.com/apache/incubator-devlake/models/domainlayer/ticket"
 	"github.com/apache/incubator-devlake/plugins/core"
+	"github.com/apache/incubator-devlake/plugins/core/dal"
 	githubModels "github.com/apache/incubator-devlake/plugins/github/models"
 	"github.com/apache/incubator-devlake/plugins/helper"
 	"reflect"
@@ -35,14 +36,16 @@ var ConvertIssueCommentsMeta = core.SubTaskMeta{
 }
 
 func ConvertIssueComments(taskCtx core.SubTaskContext) error {
-	db := taskCtx.GetDb()
+	db := taskCtx.GetDal()
 	data := taskCtx.GetData().(*GithubTaskData)
 	repoId := data.Repo.GithubId
 
-	cursor, err := db.Model(&githubModels.GithubIssueComment{}).
-		Joins("left join _tool_github_issues "+
-			"on _tool_github_issues.github_id = _tool_github_issue_comments.issue_id").
-		Where("repo_id = ?", repoId).Rows()
+	cursor, err := db.Cursor(
+		dal.From(&githubModels.GithubIssueComment{}),
+		dal.Join("left join _tool_github_issues "+
+			"on _tool_github_issues.github_id = _tool_github_issue_comments.issue_id"),
+		dal.Where("repo_id = ? and _tool_github_issues.connection_id = ?", repoId, data.Options.ConnectionId),
+	)
 	if err != nil {
 		return err
 	}
@@ -57,8 +60,9 @@ func ConvertIssueComments(taskCtx core.SubTaskContext) error {
 		RawDataSubTaskArgs: helper.RawDataSubTaskArgs{
 			Ctx: taskCtx,
 			Params: GithubApiParams{
-				Owner: data.Options.Owner,
-				Repo:  data.Options.Repo,
+				ConnectionId: data.Options.ConnectionId,
+				Owner:        data.Options.Owner,
+				Repo:         data.Options.Repo,
 			},
 			Table: RAW_COMMENTS_TABLE,
 		},
@@ -66,9 +70,9 @@ func ConvertIssueComments(taskCtx core.SubTaskContext) error {
 			githubIssueComment := inputRow.(*githubModels.GithubIssueComment)
 			domainIssueComment := &ticket.IssueComment{
 				DomainEntity: domainlayer.DomainEntity{
-					Id: issueIdGen.Generate(githubIssueComment.GithubId),
+					Id: issueIdGen.Generate(data.Options.ConnectionId, githubIssueComment.GithubId),
 				},
-				IssueId:     issueIdGen.Generate(githubIssueComment.IssueId),
+				IssueId:     issueIdGen.Generate(data.Options.ConnectionId, githubIssueComment.IssueId),
 				Body:        githubIssueComment.Body,
 				UserId:      userIdGen.Generate(githubIssueComment.AuthorUserId),
 				CreatedDate: githubIssueComment.GithubCreatedAt,
diff --git a/plugins/github/tasks/pr_comment_convertor.go b/plugins/github/tasks/pr_comment_convertor.go
index d6260804..0e3e0f9a 100644
--- a/plugins/github/tasks/pr_comment_convertor.go
+++ b/plugins/github/tasks/pr_comment_convertor.go
@@ -22,6 +22,7 @@ import (
 	"github.com/apache/incubator-devlake/models/domainlayer/code"
 	"github.com/apache/incubator-devlake/models/domainlayer/didgen"
 	"github.com/apache/incubator-devlake/plugins/core"
+	"github.com/apache/incubator-devlake/plugins/core/dal"
 	githubModels "github.com/apache/incubator-devlake/plugins/github/models"
 	"github.com/apache/incubator-devlake/plugins/helper"
 	"reflect"
@@ -35,14 +36,16 @@ var ConvertPullRequestCommentsMeta = core.SubTaskMeta{
 }
 
 func ConvertPullRequestComments(taskCtx core.SubTaskContext) error {
-	db := taskCtx.GetDb()
+	db := taskCtx.GetDal()
 	data := taskCtx.GetData().(*GithubTaskData)
 	repoId := data.Repo.GithubId
 
-	cursor, err := db.Model(&githubModels.GithubPullRequestComment{}).
-		Joins("left join _tool_github_pull_requests "+
-			"on _tool_github_pull_requests.github_id = _tool_github_pull_request_comments.pull_request_id").
-		Where("repo_id = ?", repoId).Rows()
+	cursor, err := db.Cursor(
+		dal.From(&githubModels.GithubPullRequestComment{}),
+		dal.Join("left join _tool_github_pull_requests "+
+			"on _tool_github_pull_requests.github_id = _tool_github_pull_request_comments.pull_request_id"),
+		dal.Where("repo_id = ? and _tool_github_pull_requests.connection_id = ?", repoId, data.Options.ConnectionId),
+	)
 	if err != nil {
 		return err
 	}
@@ -57,8 +60,9 @@ func ConvertPullRequestComments(taskCtx core.SubTaskContext) error {
 		RawDataSubTaskArgs: helper.RawDataSubTaskArgs{
 			Ctx: taskCtx,
 			Params: GithubApiParams{
-				Owner: data.Options.Owner,
-				Repo:  data.Options.Repo,
+				ConnectionId: data.Options.ConnectionId,
+				Owner:        data.Options.Owner,
+				Repo:         data.Options.Repo,
 			},
 			Table: RAW_COMMENTS_TABLE,
 		},
@@ -66,9 +70,9 @@ func ConvertPullRequestComments(taskCtx core.SubTaskContext) error {
 			githubPullRequestComment := inputRow.(*githubModels.GithubPullRequestComment)
 			domainPrComment := &code.PullRequestComment{
 				DomainEntity: domainlayer.DomainEntity{
-					Id: prIdGen.Generate(githubPullRequestComment.GithubId),
+					Id: prIdGen.Generate(data.Options.ConnectionId, githubPullRequestComment.GithubId),
 				},
-				PullRequestId: prIdGen.Generate(githubPullRequestComment.PullRequestId),
+				PullRequestId: prIdGen.Generate(data.Options.ConnectionId, githubPullRequestComment.PullRequestId),
 				Body:          githubPullRequestComment.Body,
 				UserId:        userIdGen.Generate(githubPullRequestComment.AuthorUserId),
 				CreatedDate:   githubPullRequestComment.GithubCreatedAt,