payload: {"action":"created","comment":{"url":"https://api.github.com/repos/pingcap/tidb/pulls/comments/316008688","pull_request_review_id":277570643,"id":316008688,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDMxNjAwODY4OA==","diff_hunk":"@@ -113,17 +121,160 @@ type LoadDataInfo struct {\n \tIgnoreLines uint64\n \tCtx         sessionctx.Context\n \trows        [][]types.Datum\n+\n+\t// these fields are used for pipeline data prepare and commit\n+\tcommitTaskQueue chan CommitTask\n+\tQuitCommit      chan struct{}\n+\tQuitProcess     chan struct{}\n+}\n+\n+// GetRows getter for rows\n+func (e *LoadDataInfo) GetRows() [][]types.Datum {\n+\treturn e.rows\n+}\n+\n+// GetCurBatchCnt getter for curBatchCnt\n+func (e *LoadDataInfo) GetCurBatchCnt() uint64 {\n+\treturn e.curBatchCnt\n+}\n+\n+// CloseTaskQueue preparing routine to inform commit routine no more data\n+func (e *LoadDataInfo) CloseTaskQueue() {\n+\tclose(e.commitTaskQueue)\n+}\n+\n+// InitQueues initialize task queue and error report queue\n+func (e *LoadDataInfo) InitQueues() {\n+\te.commitTaskQueue = make(chan CommitTask, taskQueueSize)\n+\te.QuitCommit = make(chan struct{})\n+\te.QuitProcess = make(chan struct{})\n+}\n+\n+// ForceQuitCommit let commit quit directly\n+func (e *LoadDataInfo) ForceQuitCommit() {\n+\tclose(e.QuitCommit)\n+}\n+\n+// ForceQuitProcess let process quit directly\n+func (e *LoadDataInfo) ForceQuitProcess() {\n+\tclose(e.QuitProcess)\n+}\n+\n+// MakeCommitTask produce commit task with data in LoadDataInfo.rows LoadDataInfo.curBatchCnt\n+func (e *LoadDataInfo) MakeCommitTask() CommitTask {\n+\treturn CommitTask{e.curBatchCnt, e.rows}\n+}\n+\n+// EnqOneTask feed one batch commit task to commit work\n+func (e *LoadDataInfo) EnqOneTask(ctx context.Context) error {\n+\tvar err error\n+\tif e.curBatchCnt > 0 {\n+\t\tsendOk := false\n+\t\tfor !sendOk {\n+\t\t\tselect {\n+\t\t\tcase e.commitTaskQueue <- e.MakeCommitTask():\n+\t\t\t\tsendOk = true\n+\t\t\tcase <-e.QuitProcess:\n+\t\t\t\terr = errors.New(\"EnqOneTask forced to quit\")\n+\t\t\t\tlogutil.Logger(ctx).Error(\"EnqOneTask forced to quit, possible commitWork error\")\n+\t\t\t\treturn err\n+\t\t\t}\n+\t\t}\n+\t\tlogutil.Logger(ctx).Debug(\"one task enqueued \", zap.Int(\"current queue len\", len(e.commitTaskQueue)))\n+\t\t// reset rows buffer, will reallocate buffer but NOT reuse\n+\t\te.SetMaxRowsInBatch(e.maxRowsInBatch)\n+\t}\n+\treturn err\n+}\n+\n+// CommitOneTask insert Data from LoadDataInfo.rows, then make commit and refresh txn\n+func (e *LoadDataInfo) CommitOneTask(ctx context.Context, task CommitTask, resetBuf bool) error {\n+\tvar err error\n+\tdefer func() {\n+\t\tif err != nil {\n+\t\t\te.Ctx.StmtRollback()\n+\t\t}\n+\t}()\n+\terr = e.CheckAndInsertOneBatch(ctx, task.rows, task.cnt)\n+\tif err != nil {\n+\t\tlogutil.Logger(ctx).Error(\"commit error CheckAndInsert\", zap.Error(err))\n+\t\treturn err\n+\t}\n+\tif err = e.Ctx.StmtCommit(); err != nil {\n+\t\tlogutil.Logger(ctx).Error(\"commit error commit\", zap.Error(err))\n+\t\treturn err\n+\t}\n+\t// Make sure that there are no retries when committing.\n+\tif err = e.Ctx.RefreshTxnCtx(ctx); err != nil {\n+\t\tlogutil.Logger(ctx).Error(\"commit error refresh\", zap.Error(err))\n+\t\treturn err\n+\t}\n+\t// this only set in sequential mode, e.rows buffer will be reused in sequential mode\n+\tif resetBuf {\n+\t\te.curBatchCnt = 0\n+\t}\n+\treturn err\n+}\n+\n+// CommitWork commit batch sequentially\n+func (e *LoadDataInfo) CommitWork(ctx context.Context) error {\n+\tvar err error\n+\tdefer func() {\n+\t\tr := recover()\n+\t\tif r != nil {\n+\t\t\tbuf := make([]byte, 4096)\n+\t\t\tstackSize := runtime.Stack(buf, false)\n+\t\t\tbuf = buf[:stackSize]\n+\t\t\tlogutil.Logger(ctx).Error(\"CommitWork panicked\", zap.String(\"stack\", string(buf)))\n+\t\t}\n+\t\tif err != nil || r != nil {\n+\t\t\te.ForceQuitProcess()\n+\t\t}\n+\t\tif err != nil {\n+\t\t\te.ctx.StmtRollback()\n+\t\t}\n+\t}()\n+\tvar tasks uint64 = 0\n+\tvar end = false\n+\tfor !end {\n+\t\tselect {\n+\t\tcase <-e.QuitCommit:\n+\t\t\terr = errors.New(\"commit forced to quit\")\n+\t\t\tlogutil.Logger(ctx).Error(\"commit forced to quit, possible preparation failed\")\n+\t\t\tbreak\n+\t\tcase commitTask, ok := <-e.commitTaskQueue:\n+\t\t\tif ok {\n+\t\t\t\terr = e.CommitOneTask(ctx, commitTask, false)\n+\t\t\t\tif err != nil {\n+\t\t\t\t\tbreak\n+\t\t\t\t}\n+\t\t\t\ttasks++\n+\t\t\t\tlogutil.Logger(ctx).Debug(\"commit one task finished\",\n+\t\t\t\t\tzap.Uint64(\"finished tasks count\", tasks),\n+\t\t\t\t\tzap.Int(\"pending tasks count\", len(e.commitTaskQueue)))\n+\t\t\t} else {\n+\t\t\t\tend = true\n+\t\t\t\tlogutil.Logger(ctx).Info(\"commit work all finished\",","path":"executor/load_data.go","position":168,"original_position":168,"commit_id":"e59d08d5960632649e90edc3c742e93175191e04","original_commit_id":"e59d08d5960632649e90edc3c742e93175191e04","user":{"login":"ngaut","id":878009,"node_id":"MDQ6VXNlcjg3ODAwOQ==","avatar_url":"https://avatars2.githubusercontent.com/u/878009?v=4","gravatar_id":"","url":"https://api.github.com/users/ngaut","html_url":"https://github.com/ngaut","followers_url":"https://api.github.com/users/ngaut/followers","following_url":"https://api.github.com/users/ngaut/following{/other_user}","gists_url":"https://api.github.com/users/ngaut/gists{/gist_id}","starred_url":"https://api.github.com/users/ngaut/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ngaut/subscriptions","organizations_url":"https://api.github.com/users/ngaut/orgs","repos_url":"https://api.github.com/users/ngaut/repos","events_url":"https://api.github.com/users/ngaut/events{/privacy}","received_events_url":"https://api.github.com/users/ngaut/received_events","type":"User","site_admin":false},"body":"Ditto.","created_at":"2019-08-21T05:56:20Z","updated_at":"2019-08-21T05:56:21Z","html_url":"https://github.com/pingcap/tidb/pull/11533#discussion_r316008688","pull_request_url":"https://api.github.com/repos/pingcap/tidb/pulls/11533","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/pingcap/tidb/pulls/comments/316008688"},"html":{"href":"https://github.com/pingcap/tidb/pull/11533#discussion_r316008688"},"pull_request":{"href":"https://api.github.com/repos/pingcap/tidb/pulls/11533"}}},"pull_request":{"url":"https://api.github.com/repos/pingcap/tidb/pulls/11533","id":302518711,"node_id":"MDExOlB1bGxSZXF1ZXN0MzAyNTE4NzEx","html_url":"https://github.com/pingcap/tidb/pull/11533","diff_url":"https://github.com/pingcap/tidb/pull/11533.diff","patch_url":"https://github.com/pingcap/tidb/pull/11533.patch","issue_url":"https://api.github.com/repos/pingcap/tidb/issues/11533","number":11533,"state":"open","locked":false,"title":"executor: load data statement, separate data preparing routine and commit routine","user":{"login":"cfzjywxk","id":3692139,"node_id":"MDQ6VXNlcjM2OTIxMzk=","avatar_url":"https://avatars0.githubusercontent.com/u/3692139?v=4","gravatar_id":"","url":"https://api.github.com/users/cfzjywxk","html_url":"https://github.com/cfzjywxk","followers_url":"https://api.github.com/users/cfzjywxk/followers","following_url":"https://api.github.com/users/cfzjywxk/following{/other_user}","gists_url":"https://api.github.com/users/cfzjywxk/gists{/gist_id}","starred_url":"https://api.github.com/users/cfzjywxk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cfzjywxk/subscriptions","organizations_url":"https://api.github.com/users/cfzjywxk/orgs","repos_url":"https://api.github.com/users/cfzjywxk/repos","events_url":"https://api.github.com/users/cfzjywxk/events{/privacy}","received_events_url":"https://api.github.com/users/cfzjywxk/received_events","type":"User","site_admin":false},"body":"<!--\r\nThank you for contributing to TiDB! Please read TiDB's [CONTRIBUTING](https://github.com/pingcap/tidb/blob/master/CONTRIBUTING.md) document **BEFORE** filing this PR.\r\n-->\r\n\r\n## What problem does this PR solve? <!--add issue link with summary if exists-->\r\n\r\n\r\n\r\nexperiments diff on \r\nhttps://github.com/pingcap/tidb/issues/11517\r\n\r\n\r\n## What is changed and how it works?\r\n\r\nload data statement\r\n- separate data preparing routine and commit routine(maybe could concurrent commit within multiple txns in the future)\r\n- tests on different workloads\r\n\r\n### bench workload1\r\n\r\nsysbench schema\r\n1m rows  =  185MB\r\n10m rows  = 1.9GB\r\n\r\nbatch size = 20k\r\n\r\n\r\ndata | mode | rt(sec) | batch size(row) | prepare(us) | commit(us) | avg prepare(us) | avg commit(us)\r\n-- | -- | -- | -- | -- | -- | -- | --\r\n1m | concurrent | 27.56 | 20k | 5578125 | 27436263 | 111562 | 548725\r\n1m | concurrent | 28.93 | 20k | 5646682 | 28809710 | 112933 | 576194\r\n1m | concurrent | 28.59 | 20k | 6077118 | 28429610 | 121542 | 568592\r\n1m | sequential | 33.56 | 20k | 5295292 | 28251475 | 105905 | 565029\r\n1m | sequential | 31.64 | 20k | 5221046 | 26403697 | 104420 | 528073\r\n1m | sequential | 32.74 | 20k | 5463142 | 27259847 | 109262 | 545196\r\n\r\nbatch size = 200k\r\n\r\n\r\ndata | mode | rt(sec) | batch size(row) | prepare(us) | commit(us) | avg prepare(us) | avg commit(us)\r\n-- | -- | -- | -- | -- | -- | -- | --\r\n1m | concurrent | 29.41 | 200k | 5740404 | 28639015 | 1148080 | 5727803\r\n1m | sequential | 33.87 | 200k | 5580477 | 28238641 | 1116095 | 5647728\r\n\r\nbatch size = 4k\r\n\r\n\r\ndata | mode | rt(sec) | batch size(row) | prepare(us) | commit(us) | avg prepare(us) | avg commit(us)\r\n-- | -- | -- | -- | -- | -- | -- | --\r\n1m | concurrent | 35.79 | 4k | 5653526 | 35739674 | 22614 | 142958\r\n1m | sequential | 37.52 | 4k | 5349413 | 32139162 | 21397 | 128556\r\n\r\n\r\ndata size = 10m\r\n\r\n\r\ndata | mode | rt(sec) | batch size(row) | prepare(us) | commit(us) | avg prepare(us) | avg commit(us)\r\n-- | -- | -- | -- | -- | -- | -- | --\r\n10m | concurrent | 299 | 20k | 62993307 | 299338296 | 125986 | 598676\r\n10m | concurrent | 308 | 20k | 60778661 | 308309945 | 121557 | 616619\r\n10m | concurrent | 310 | 20k | 60284459 | 309862211 | 120568 | 619724\r\n10m | sequential | 371 | 20k | 64699475 | 306366299 | 129398 | 612732\r\n10m | sequential | 348 | 20k | 62781449 | 285804457 | 125562 | 571608\r\n10m | sequential | 346 | 20k | 61517956 | 285356229 | 123035 | 570712\r\n\r\n\r\n\r\n\r\n\r\n### bench workload2\r\n\r\nthis workload  task generator routine and commit routine cooperate well,  producing and committing seem concurrently progressing.  Master branch do all these things sequentially\r\n```\r\nCREATE TABLE `model` (\r\n  `pk` int(11) DEFAULT NULL,\r\n  `col1` int(11) DEFAULT NULL,\r\n  `col2` int(11) DEFAULT NULL,\r\n  ...\r\n  `col99` int(11) DEFAULT NULL,\r\n  KEY `pk` (`pk`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\r\n```\r\n\r\ncolumn content = 99999999\r\n\r\n100columns 1m rows = 852MB\r\n500columns 1m rows = 4.2GB\r\n\r\n\r\ndata | mode | rt(sec) | batch size(row) | prepare(us) | commit(us) | avg prepare(us) | avg commit(us)\r\n-- | -- | -- | -- | -- | -- | -- | --\r\n1m | concurrent | 80.44 | 20k | 55995202 | 79229461 | 1119904 | 1584589\r\n1m | concurrent | 78.07 | 20k | 55592061 | 76927103 | 1111841 | 1538542\r\n1m | concurrent | 83.41 | 40k | 55236614 | 81160118 | 2209464 | 3246404\r\n1m | sequential | 121.60 | 20k | 50197243 | 71241453 | 1003944 | 1424829\r\n\r\n\r\n500columns\r\n\r\ndata | mode | rt(sec) | batch size(row) | prepare(us) | commit(us) | avg prepare(us) | avg commit(us)\r\n-- | -- | -- | -- | -- | -- | -- | --\r\n1m | concurrent | 457.73 | 20k | 268403660 | 452392863 | 5368073 | 9047857\r\n1m | concurrent | 392.51 | 20k | 264366292 | 387069215 | 5287325 | 7741384\r\n1m | sequential | 589.52 | 20k | 236941284 | 351913873 | 4738825 | 7038277\r\n1m | sequential | 585.56 | 20k | 237462383 | 347632453 | 4749247 | 6952649\r\n\r\n\r\n### bench workload3\r\n\r\nwide table with 100 columns (**all columns with BLOB or TEXT fields**) , big column\r\n\r\nwork queue size 1000(max wait job numbers)\r\n( txn limit 100MB)\r\n\r\nschema like \r\n```\r\nCREATE TABLE `tin_n_10wb` (\r\n  `pk` int(11) DEFAULT NULL,\r\n  `col1` blob DEFAULT NULL,\r\n  `col2` text DEFAULT NULL,\r\n  ...\r\n `col95` blob DEFAULT NULL,\r\n `col96` text DEFAULT NULL,\r\n  ...\r\n\r\ncolumn content like\r\nlen(\"G2jOVOMOg3Cnub2jCuXtn0AO1V5hONfLftt0cBHX74itPKMm2uVj1Ax1GfykLLR6PxGclMhPRQxoCe8ZvYI096goa6CsxKHiBvpl7SOp0ax5vl1QNYUZq2x2\") = 120\r\n\r\n```\r\n\r\n100k rows = 1.2GB \r\n\r\ndata | mode | rt(sec) | batch size(row) | prepare(us) | commit(us) | avg prepare(us) | avg commit(us)\r\n-- | -- | -- | -- | -- | -- | -- | --\r\n100k | concurrent | 24.70 | 5k(raftstore.raft-max-inflight-msgs) | 22384533 | 23709265  | 1119226 | 1185463\r\n100k | sequential | 43.15 | 5k(reconfiguring raftstore.raft-max-inflight-msgs) | 20503449 | 22651435 |  1025172| 1132571 |\r\n100k | concurrent | 21.87 | 1k | 20900265 | 21574010 | 209002 | 215740\r\n100k | sequential | 51.21 | 1k | 19181370 | 31973015 | 191813 | 319730\r\n100k | sequential | 108.33 | 1k | 19770424 | 88490433 | 197704 | 884904\r\n100k | concurrent | 23.52 | 200 | 20573994 | 23393318 | 41147 | 46786\r\n100k | sequential | 40.94 | 200 | 19083036 | 21767787 | 38166 | 43535\r\n\r\n---\r\nsome conclusions up to now\r\n\r\n- greater avg prepare and commit time cost in concurrent mode compared with sequential processing.\r\n- costs, seperate processing will consume more memory resources during processing. Sequential processing some row buffer could be reused. \r\n- batch size will impact performance, default 20k batch size seems good on most situations\r\n- <del> workload3 batch size = 5k  and batch size = 1k have much different performance, batch size = 5k \r\n   many error logs in  like\r\n\r\n<del> from monitor data on grafana, we see prewrite on kv is quit slow, the root cause should be the prewrite request is quite slow(32sec on 5k batch size) \r\n\r\nhttps://github.com/tikv/tikv/issues/5279 \r\nhas some explanations on prewrite slow on tikv executing workload3(big rowsize)\r\nthis could be solved by increase tikv raftstore.raft-max-inflight-msgs configuration(default -> 4096), allow more un ack raft messages in queue, after changing this config, \r\n\r\n\r\n### Check List <!--REMOVE the items that are not applicable-->\r\n\r\nTests <!-- At least one of them must be included. -->\r\n\r\n - Unit test\r\n \r\n\r\nCode changes\r\n\r\n - Has exported function/method change\r\n - Has exported variable/fields change\r\n - Has interface methods change\r\n\r\nSide effects\r\n\r\n - Increased code complexity\r\n\r\n\r\nRelated changes\r\n\r\n","created_at":"2019-07-30T14:09:35Z","updated_at":"2019-08-21T05:56:20Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ece5a8adfbd442eb724f5d76e881362c4f58ae49","assignee":null,"assignees":[],"requested_reviewers":[{"login":"lysu","id":528332,"node_id":"MDQ6VXNlcjUyODMzMg==","avatar_url":"https://avatars3.githubusercontent.com/u/528332?v=4","gravatar_id":"","url":"https://api.github.com/users/lysu","html_url":"https://github.com/lysu","followers_url":"https://api.github.com/users/lysu/followers","following_url":"https://api.github.com/users/lysu/following{/other_user}","gists_url":"https://api.github.com/users/lysu/gists{/gist_id}","starred_url":"https://api.github.com/users/lysu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lysu/subscriptions","organizations_url":"https://api.github.com/users/lysu/orgs","repos_url":"https://api.github.com/users/lysu/repos","events_url":"https://api.github.com/users/lysu/events{/privacy}","received_events_url":"https://api.github.com/users/lysu/received_events","type":"User","site_admin":false},{"login":"tiancaiamao","id":1420062,"node_id":"MDQ6VXNlcjE0MjAwNjI=","avatar_url":"https://avatars2.githubusercontent.com/u/1420062?v=4","gravatar_id":"","url":"https://api.github.com/users/tiancaiamao","html_url":"https://github.com/tiancaiamao","followers_url":"https://api.github.com/users/tiancaiamao/followers","following_url":"https://api.github.com/users/tiancaiamao/following{/other_user}","gists_url":"https://api.github.com/users/tiancaiamao/gists{/gist_id}","starred_url":"https://api.github.com/users/tiancaiamao/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tiancaiamao/subscriptions","organizations_url":"https://api.github.com/users/tiancaiamao/orgs","repos_url":"https://api.github.com/users/tiancaiamao/repos","events_url":"https://api.github.com/users/tiancaiamao/events{/privacy}","received_events_url":"https://api.github.com/users/tiancaiamao/received_events","type":"User","site_admin":false},{"login":"crazycs520","id":26020263,"node_id":"MDQ6VXNlcjI2MDIwMjYz","avatar_url":"https://avatars2.githubusercontent.com/u/26020263?v=4","gravatar_id":"","url":"https://api.github.com/users/crazycs520","html_url":"https://github.com/crazycs520","followers_url":"https://api.github.com/users/crazycs520/followers","following_url":"https://api.github.com/users/crazycs520/following{/other_user}","gists_url":"https://api.github.com/users/crazycs520/gists{/gist_id}","starred_url":"https://api.github.com/users/crazycs520/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/crazycs520/subscriptions","organizations_url":"https://api.github.com/users/crazycs520/orgs","repos_url":"https://api.github.com/users/crazycs520/repos","events_url":"https://api.github.com/users/crazycs520/events{/privacy}","received_events_url":"https://api.github.com/users/crazycs520/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":970807266,"node_id":"MDU6TGFiZWw5NzA4MDcyNjY=","url":"https://api.github.com/repos/pingcap/tidb/labels/component/executor","name":"component/executor","color":"000000","default":false},{"id":564574080,"node_id":"MDU6TGFiZWw1NjQ1NzQwODA=","url":"https://api.github.com/repos/pingcap/tidb/labels/status/LGT1","name":"status/LGT1","color":"d4c5f9","default":false},{"id":1482175488,"node_id":"MDU6TGFiZWwxNDgyMTc1NDg4","url":"https://api.github.com/repos/pingcap/tidb/labels/status/PTAL","name":"status/PTAL","color":"2cbe4e","default":false},{"id":770872605,"node_id":"MDU6TGFiZWw3NzA4NzI2MDU=","url":"https://api.github.com/repos/pingcap/tidb/labels/status/all%20tests%20passed","name":"status/all tests passed","color":"2cbe4e","default":false},{"id":546205169,"node_id":"MDU6TGFiZWw1NDYyMDUxNjk=","url":"https://api.github.com/repos/pingcap/tidb/labels/type/performance","name":"type/performance","color":"006b75","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/pingcap/tidb/pulls/11533/commits","review_comments_url":"https://api.github.com/repos/pingcap/tidb/pulls/11533/comments","review_comment_url":"https://api.github.com/repos/pingcap/tidb/pulls/comments{/number}","comments_url":"https://api.github.com/repos/pingcap/tidb/issues/11533/comments","statuses_url":"https://api.github.com/repos/pingcap/tidb/statuses/e59d08d5960632649e90edc3c742e93175191e04","head":{"label":"cfzjywxk:ppload","ref":"ppload","sha":"e59d08d5960632649e90edc3c742e93175191e04","user":{"login":"cfzjywxk","id":3692139,"node_id":"MDQ6VXNlcjM2OTIxMzk=","avatar_url":"https://avatars0.githubusercontent.com/u/3692139?v=4","gravatar_id":"","url":"https://api.github.com/users/cfzjywxk","html_url":"https://github.com/cfzjywxk","followers_url":"https://api.github.com/users/cfzjywxk/followers","following_url":"https://api.github.com/users/cfzjywxk/following{/other_user}","gists_url":"https://api.github.com/users/cfzjywxk/gists{/gist_id}","starred_url":"https://api.github.com/users/cfzjywxk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cfzjywxk/subscriptions","organizations_url":"https://api.github.com/users/cfzjywxk/orgs","repos_url":"https://api.github.com/users/cfzjywxk/repos","events_url":"https://api.github.com/users/cfzjywxk/events{/privacy}","received_events_url":"https://api.github.com/users/cfzjywxk/received_events","type":"User","site_admin":false},"repo":{"id":193649547,"node_id":"MDEwOlJlcG9zaXRvcnkxOTM2NDk1NDc=","name":"tidb","full_name":"cfzjywxk/tidb","private":false,"owner":{"login":"cfzjywxk","id":3692139,"node_id":"MDQ6VXNlcjM2OTIxMzk=","avatar_url":"https://avatars0.githubusercontent.com/u/3692139?v=4","gravatar_id":"","url":"https://api.github.com/users/cfzjywxk","html_url":"https://github.com/cfzjywxk","followers_url":"https://api.github.com/users/cfzjywxk/followers","following_url":"https://api.github.com/users/cfzjywxk/following{/other_user}","gists_url":"https://api.github.com/users/cfzjywxk/gists{/gist_id}","starred_url":"https://api.github.com/users/cfzjywxk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cfzjywxk/subscriptions","organizations_url":"https://api.github.com/users/cfzjywxk/orgs","repos_url":"https://api.github.com/users/cfzjywxk/repos","events_url":"https://api.github.com/users/cfzjywxk/events{/privacy}","received_events_url":"https://api.github.com/users/cfzjywxk/received_events","type":"User","site_admin":false},"html_url":"https://github.com/cfzjywxk/tidb","description":"TiDB is a distributed HTAP database compatible with the MySQL protocol ","fork":true,"url":"https://api.github.com/repos/cfzjywxk/tidb","forks_url":"https://api.github.com/repos/cfzjywxk/tidb/forks","keys_url":"https://api.github.com/repos/cfzjywxk/tidb/keys{/key_id}","collaborators_url":"https://api.github.com/repos/cfzjywxk/tidb/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/cfzjywxk/tidb/teams","hooks_url":"https://api.github.com/repos/cfzjywxk/tidb/hooks","issue_events_url":"https://api.github.com/repos/cfzjywxk/tidb/issues/events{/number}","events_url":"https://api.github.com/repos/cfzjywxk/tidb/events","assignees_url":"https://api.github.com/repos/cfzjywxk/tidb/assignees{/user}","branches_url":"https://api.github.com/repos/cfzjywxk/tidb/branches{/branch}","tags_url":"https://api.github.com/repos/cfzjywxk/tidb/tags","blobs_url":"https://api.github.com/repos/cfzjywxk/tidb/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/cfzjywxk/tidb/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/cfzjywxk/tidb/git/refs{/sha}","trees_url":"https://api.github.com/repos/cfzjywxk/tidb/git/trees{/sha}","statuses_url":"https://api.github.com/repos/cfzjywxk/tidb/statuses/{sha}","languages_url":"https://api.github.com/repos/cfzjywxk/tidb/languages","stargazers_url":"https://api.github.com/repos/cfzjywxk/tidb/stargazers","contributors_url":"https://api.github.com/repos/cfzjywxk/tidb/contributors","subscribers_url":"https://api.github.com/repos/cfzjywxk/tidb/subscribers","subscription_url":"https://api.github.com/repos/cfzjywxk/tidb/subscription","commits_url":"https://api.github.com/repos/cfzjywxk/tidb/commits{/sha}","git_commits_url":"https://api.github.com/repos/cfzjywxk/tidb/git/commits{/sha}","comments_url":"https://api.github.com/repos/cfzjywxk/tidb/comments{/number}","issue_comment_url":"https://api.github.com/repos/cfzjywxk/tidb/issues/comments{/number}","contents_url":"https://api.github.com/repos/cfzjywxk/tidb/contents/{+path}","compare_url":"https://api.github.com/repos/cfzjywxk/tidb/compare/{base}...{head}","merges_url":"https://api.github.com/repos/cfzjywxk/tidb/merges","archive_url":"https://api.github.com/repos/cfzjywxk/tidb/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/cfzjywxk/tidb/downloads","issues_url":"https://api.github.com/repos/cfzjywxk/tidb/issues{/number}","pulls_url":"https://api.github.com/repos/cfzjywxk/tidb/pulls{/number}","milestones_url":"https://api.github.com/repos/cfzjywxk/tidb/milestones{/number}","notifications_url":"https://api.github.com/repos/cfzjywxk/tidb/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/cfzjywxk/tidb/labels{/name}","releases_url":"https://api.github.com/repos/cfzjywxk/tidb/releases{/id}","deployments_url":"https://api.github.com/repos/cfzjywxk/tidb/deployments","created_at":"2019-06-25T06:38:17Z","updated_at":"2019-06-25T06:38:23Z","pushed_at":"2019-08-20T02:46:27Z","git_url":"git://github.com/cfzjywxk/tidb.git","ssh_url":"git@github.com:cfzjywxk/tidb.git","clone_url":"https://github.com/cfzjywxk/tidb.git","svn_url":"https://github.com/cfzjywxk/tidb","homepage":"https://pingcap.com","size":83007,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"pingcap:master","ref":"master","sha":"bd33771efaf7e771dab5c670abf7ee91c2b3abf6","user":{"login":"pingcap","id":11855343,"node_id":"MDEyOk9yZ2FuaXphdGlvbjExODU1MzQz","avatar_url":"https://avatars3.githubusercontent.com/u/11855343?v=4","gravatar_id":"","url":"https://api.github.com/users/pingcap","html_url":"https://github.com/pingcap","followers_url":"https://api.github.com/users/pingcap/followers","following_url":"https://api.github.com/users/pingcap/following{/other_user}","gists_url":"https://api.github.com/users/pingcap/gists{/gist_id}","starred_url":"https://api.github.com/users/pingcap/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pingcap/subscriptions","organizations_url":"https://api.github.com/users/pingcap/orgs","repos_url":"https://api.github.com/users/pingcap/repos","events_url":"https://api.github.com/users/pingcap/events{/privacy}","received_events_url":"https://api.github.com/users/pingcap/received_events","type":"Organization","site_admin":false},"repo":{"id":41986369,"node_id":"MDEwOlJlcG9zaXRvcnk0MTk4NjM2OQ==","name":"tidb","full_name":"pingcap/tidb","private":false,"owner":{"login":"pingcap","id":11855343,"node_id":"MDEyOk9yZ2FuaXphdGlvbjExODU1MzQz","avatar_url":"https://avatars3.githubusercontent.com/u/11855343?v=4","gravatar_id":"","url":"https://api.github.com/users/pingcap","html_url":"https://github.com/pingcap","followers_url":"https://api.github.com/users/pingcap/followers","following_url":"https://api.github.com/users/pingcap/following{/other_user}","gists_url":"https://api.github.com/users/pingcap/gists{/gist_id}","starred_url":"https://api.github.com/users/pingcap/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pingcap/subscriptions","organizations_url":"https://api.github.com/users/pingcap/orgs","repos_url":"https://api.github.com/users/pingcap/repos","events_url":"https://api.github.com/users/pingcap/events{/privacy}","received_events_url":"https://api.github.com/users/pingcap/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/pingcap/tidb","description":"TiDB is an open source distributed HTAP database compatible with the MySQL protocol ","fork":false,"url":"https://api.github.com/repos/pingcap/tidb","forks_url":"https://api.github.com/repos/pingcap/tidb/forks","keys_url":"https://api.github.com/repos/pingcap/tidb/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pingcap/tidb/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pingcap/tidb/teams","hooks_url":"https://api.github.com/repos/pingcap/tidb/hooks","issue_events_url":"https://api.github.com/repos/pingcap/tidb/issues/events{/number}","events_url":"https://api.github.com/repos/pingcap/tidb/events","assignees_url":"https://api.github.com/repos/pingcap/tidb/assignees{/user}","branches_url":"https://api.github.com/repos/pingcap/tidb/branches{/branch}","tags_url":"https://api.github.com/repos/pingcap/tidb/tags","blobs_url":"https://api.github.com/repos/pingcap/tidb/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pingcap/tidb/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pingcap/tidb/git/refs{/sha}","trees_url":"https://api.github.com/repos/pingcap/tidb/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pingcap/tidb/statuses/{sha}","languages_url":"https://api.github.com/repos/pingcap/tidb/languages","stargazers_url":"https://api.github.com/repos/pingcap/tidb/stargazers","contributors_url":"https://api.github.com/repos/pingcap/tidb/contributors","subscribers_url":"https://api.github.com/repos/pingcap/tidb/subscribers","subscription_url":"https://api.github.com/repos/pingcap/tidb/subscription","commits_url":"https://api.github.com/repos/pingcap/tidb/commits{/sha}","git_commits_url":"https://api.github.com/repos/pingcap/tidb/git/commits{/sha}","comments_url":"https://api.github.com/repos/pingcap/tidb/comments{/number}","issue_comment_url":"https://api.github.com/repos/pingcap/tidb/issues/comments{/number}","contents_url":"https://api.github.com/repos/pingcap/tidb/contents/{+path}","compare_url":"https://api.github.com/repos/pingcap/tidb/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pingcap/tidb/merges","archive_url":"https://api.github.com/repos/pingcap/tidb/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pingcap/tidb/downloads","issues_url":"https://api.github.com/repos/pingcap/tidb/issues{/number}","pulls_url":"https://api.github.com/repos/pingcap/tidb/pulls{/number}","milestones_url":"https://api.github.com/repos/pingcap/tidb/milestones{/number}","notifications_url":"https://api.github.com/repos/pingcap/tidb/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pingcap/tidb/labels{/name}","releases_url":"https://api.github.com/repos/pingcap/tidb/releases{/id}","deployments_url":"https://api.github.com/repos/pingcap/tidb/deployments","created_at":"2015-09-06T04:01:52Z","updated_at":"2019-08-21T05:37:09Z","pushed_at":"2019-08-21T05:55:27Z","git_url":"git://github.com/pingcap/tidb.git","ssh_url":"git@github.com:pingcap/tidb.git","clone_url":"https://github.com/pingcap/tidb.git","svn_url":"https://github.com/pingcap/tidb","homepage":"https://pingcap.com","size":138998,"stargazers_count":20238,"watchers_count":20238,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2953,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":961,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":2953,"open_issues":961,"watchers":20238,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/pingcap/tidb/pulls/11533"},"html":{"href":"https://github.com/pingcap/tidb/pull/11533"},"issue":{"href":"https://api.github.com/repos/pingcap/tidb/issues/11533"},"comments":{"href":"https://api.github.com/repos/pingcap/tidb/issues/11533/comments"},"review_comments":{"href":"https://api.github.com/repos/pingcap/tidb/pulls/11533/comments"},"review_comment":{"href":"https://api.github.com/repos/pingcap/tidb/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/pingcap/tidb/pulls/11533/commits"},"statuses":{"href":"https://api.github.com/repos/pingcap/tidb/statuses/e59d08d5960632649e90edc3c742e93175191e04"}},"author_association":"CONTRIBUTOR"}}
other: {"actor":{"display_login":"ngaut"}}