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 <[email protected]>
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 <[email protected]>
---
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,"""\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
<[email protected]> 于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,"""\r\n\r\ncpu占用率一直接近100%\r\n\r\n\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 <[email protected]>
于2018年9月27日周四 下午5:00写道:\r\n\r\n> 我晚上回去就打一下新的tag,完了我再给你回一个邮件\r\n>\r\n>
edcismybrother <[email protected]> 于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[
[...]
+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[ <= 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\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,"""\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\r\n\r\n\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[ 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[ 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[ 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[ 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[\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[\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,"""\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
<[email protected]> 于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,"""\r\n\r\ncpu占用率一直接近100%\r\n\r\n\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 <[email protected]> 于2018年9月27日周四 下午5:00写道:\r\n\r\n>
我晚上回去就打一下新的tag,完了我再给你回一个邮件\r\n>\r\n> edcismybrother <[email protected]>
于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[ 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[ <= 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\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,"""\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\r\n\r\n\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[ 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[ 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[ 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[ 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[\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[\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,