{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":448046539,"defaultBranch":"main","name":"uForwarder","ownerLogin":"uber","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2022-01-14T17:09:35.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/538264?v=4","public":true,"private":false,"isOrgOwned":true},"refInfo":{"name":"","listCacheKey":"v0:1713938733.0","currentOid":""},"activityList":{"items":[{"before":"28601ab8d5b0568413f131b782abe9052d837465","after":"d5d98b6dfbe222cdec4a2f18b4829224e2b900e5","ref":"refs/heads/main","pushedAt":"2024-05-20T16:22:42.000Z","pushType":"pr_merge","commitsCount":4,"pusher":{"login":"yangy0000","name":"yang","path":"/yangy0000","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43356004?s=80&v=4"},"commit":{"message":"uforwarder controller web ui\n\nSummary:\nThis diff ported KCP controller debug UI into uforwarder-controller, including\n- created NodeUrlResolver to resolve debug page link for uforwarder, while UberNodeUrlResolver. did the same thing for KCP\n- NodeAutoConfiguration works for both worker and controller\n\nuforwarder controller UI can be access with link : http://127.0.0.1:8086/jobs\n\nTest Plan:\nunit test\nlocal test\ndev env test show no regression","shortMessageHtmlLink":"uforwarder controller web ui"}},{"before":"86a396ebaad66f041c0193c2dd6704749119d954","after":"1f8f7b8af30ced969aafdde07c19661b6aa46d01","ref":"refs/heads/merge-changes","pushedAt":"2024-05-18T21:36:52.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"yangy0000","name":"yang","path":"/yangy0000","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43356004?s=80&v=4"},"commit":{"message":"uforwarder controller web ui\n\nSummary:\nThis diff ported KCP controller debug UI into uforwarder-controller, including\n- created NodeUrlResolver to resolve debug page link for uforwarder, while UberNodeUrlResolver. did the same thing for KCP\n- NodeAutoConfiguration works for both worker and controller\n\nuforwarder controller UI can be access with link : http://127.0.0.1:8086/jobs\n\nTest Plan:\nunit test\nlocal test\ndev env test show no regression","shortMessageHtmlLink":"uforwarder controller web ui"}},{"before":"a654097a802219607ab875ca28940b6952a18c86","after":"28601ab8d5b0568413f131b782abe9052d837465","ref":"refs/heads/main","pushedAt":"2024-04-24T18:22:27.000Z","pushType":"pr_merge","commitsCount":10,"pusher":{"login":"yangy0000","name":"yang","path":"/yangy0000","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43356004?s=80&v=4"},"commit":{"message":"fix ConcurrentModificationException AsyncInflightLimiterAdapter.size\n\nSummary:\nHere is how ConcurrentModificationException happens\n1.AsyncInflightLimiterAdapter.acquireAsync call PendingMessageQueue.isEmpty()\nit creates iterator and enumerate sub-queues, current this call is not synchronized\n\n2. AsyncInflightLimiterAdapter.acquireAsync call PendingMessageQueue.add()\nit may creates a sub-queue and add to the main queue, currently this call is synchronized\n\nTo solve the problem\nOption 1. make isEmpty() thread-safe\nOption 2. make PendingMessageQueue.isEmpty() synchronized\n\nFor option 2, as PendingMessageQueue.isEmpty() is on the hot path, it could cause some performance issue when processor threads is high\nso adopted solution is option-1\n\nTest Plan:\nunit test\ndev env test show queue works property when back-pressure happens","shortMessageHtmlLink":"fix ConcurrentModificationException AsyncInflightLimiterAdapter.size"}},{"before":"25a0bedd35883a1f10d197049f66455fe51468cb","after":"86a396ebaad66f041c0193c2dd6704749119d954","ref":"refs/heads/merge-changes","pushedAt":"2024-04-24T06:06:41.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"yangy0000","name":"yang","path":"/yangy0000","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43356004?s=80&v=4"},"commit":{"message":"fix ConcurrentModificationException AsyncInflightLimiterAdapter.size\n\nSummary:\nHere is how ConcurrentModificationException happens\n1.AsyncInflightLimiterAdapter.acquireAsync call PendingMessageQueue.isEmpty()\nit creates iterator and enumerate sub-queues, current this call is not synchronized\n\n2. AsyncInflightLimiterAdapter.acquireAsync call PendingMessageQueue.add()\nit may creates a sub-queue and add to the main queue, currently this call is synchronized\n\nTo solve the problem\nOption 1. make isEmpty() thread-safe\nOption 2. make PendingMessageQueue.isEmpty() synchronized\n\nFor option 2, as PendingMessageQueue.isEmpty() is on the hot path, it could cause some performance issue when processor threads is high\nso adopted solution is option-1\n\nTest Plan:\nunit test\ndev env test show queue works property when back-pressure happens","shortMessageHtmlLink":"fix ConcurrentModificationException AsyncInflightLimiterAdapter.size"}},{"before":null,"after":"25a0bedd35883a1f10d197049f66455fe51468cb","ref":"refs/heads/merge-changes","pushedAt":"2024-04-24T06:05:33.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"yangy0000","name":"yang","path":"/yangy0000","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43356004?s=80&v=4"},"commit":{"message":"fix ConcurrentModificationException AsyncInflightLimiterAdapter.size\n\nSummary:\nHere is how ConcurrentModificationException happens\n1.AsyncInflightLimiterAdapter.acquireAsync call PendingMessageQueue.isEmpty()\nit creates iterator and enumerate sub-queues, current this call is not synchronized\n\n2. AsyncInflightLimiterAdapter.acquireAsync call PendingMessageQueue.add()\nit may creates a sub-queue and add to the main queue, currently this call is synchronized\n\nTo solve the problem\nOption 1. make isEmpty() thread-safe\nOption 2. make PendingMessageQueue.isEmpty() synchronized\n\nFor option 2, as PendingMessageQueue.isEmpty() is on the hot path, it could cause some performance issue when processor threads is high\nso adopted solution is option-1\n\nTest Plan:\nunit test\ndev env test show queue works property when back-pressure happens","shortMessageHtmlLink":"fix ConcurrentModificationException AsyncInflightLimiterAdapter.size"}},{"before":"2461da2bcae39153bbca82afdb02025b715e43bd","after":null,"ref":"refs/heads/merge-changes","pushedAt":"2024-04-24T05:51:57.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"yangy0000","name":"yang","path":"/yangy0000","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43356004?s=80&v=4"}},{"before":"c83cbfee0860af24f9b2f9e1ffcacc54efb618ee","after":"a654097a802219607ab875ca28940b6952a18c86","ref":"refs/heads/main","pushedAt":"2024-04-23T20:19:35.000Z","pushType":"pr_merge","commitsCount":12,"pusher":{"login":"yangy0000","name":"yang","path":"/yangy0000","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43356004?s=80&v=4"},"commit":{"message":"create AsyncInflightLimiterAdapter\n\nSummary:\nMove async permit acquire capability from inflight limiter to AsyncInflightLimiterAdapter\n\nasync permit acquire will only be used in out bound inflight limiter case\n\nin the next diff, will change the implementation from FIFO queue to Priority queue","shortMessageHtmlLink":"create AsyncInflightLimiterAdapter"}},{"before":"6ebd921b262b72b99aad0496d21dc62b7812aa42","after":"2461da2bcae39153bbca82afdb02025b715e43bd","ref":"refs/heads/merge-changes","pushedAt":"2024-04-23T07:13:09.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"yangy0000","name":"yang","path":"/yangy0000","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43356004?s=80&v=4"},"commit":{"message":"create AsyncInflightLimiterAdapter\n\nSummary:\nMove async permit acquire capability from inflight limiter to AsyncInflightLimiterAdapter\n\nasync permit acquire will only be used in out bound inflight limiter case\n\nin the next diff, will change the implementation from FIFO queue to Priority queue","shortMessageHtmlLink":"create AsyncInflightLimiterAdapter"}},{"before":"85823ceec0be296e920aa81a44b9b1a0499b7e53","after":"6ebd921b262b72b99aad0496d21dc62b7812aa42","ref":"refs/heads/merge-changes","pushedAt":"2024-04-23T06:52:19.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"yangy0000","name":"yang","path":"/yangy0000","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43356004?s=80&v=4"},"commit":{"message":"[Rebalancer] Rename rebalancing cache and small unit test refactor (Stacked diff 2/2)\n\nSummary:\nStacked on top of 7e8852da7cc6f0ee42277c69985663f9b0711767\nRebalancing Cache -> Rebalancing Table (since it is no longer uses as an in memory cache on rebalance runs). Also minor unit test refactor.","shortMessageHtmlLink":"[Rebalancer] Rename rebalancing cache and small unit test refactor (S…"}},{"before":"bad05d6d12d7f8be6e88b73868b9f6fe34ddde2b","after":"85823ceec0be296e920aa81a44b9b1a0499b7e53","ref":"refs/heads/merge-changes","pushedAt":"2024-04-23T06:46:43.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"yangy0000","name":"yang","path":"/yangy0000","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43356004?s=80&v=4"},"commit":{"message":"Merge JobGroup with Job for MiscConfig\n\nSummary:\nFor existing jobs, if we don't respect the MiscConfig in the `JobGroup`,\nuForwarder will not update the jobs. `MiscConfig` should always use the latest\ndata available from the `JobGroup`.","shortMessageHtmlLink":"Merge JobGroup with Job for MiscConfig"}},{"before":"96c4a0e05c99314252fdb03de166602ecba20565","after":"bad05d6d12d7f8be6e88b73868b9f6fe34ddde2b","ref":"refs/heads/merge-changes","pushedAt":"2024-04-23T05:54:50.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"yangy0000","name":"yang","path":"/yangy0000","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43356004?s=80&v=4"},"commit":{"message":"cancel grpc call through context\n\nSummary:\nFor java grpc client, there are 2 ways to cancel a grpc call.\n1. clientCall.cancel, cancel client call directly, it's existing solution. the problem is if client call was canceled before it started rpc stream, it will throw illegal state exception (which is already stated in java doc) however, there is no ideal way to determine if rpc stream has started or not when cancel the client call. so with existing solution. we try to handle the exception.\nhowever, there is one edge case, when grpc channel was during name resolution, it will queue up client call and start in async execution, in this case there is no way to handle the illegal state exception, thus it cause following call stack, and stuck consumer\n```\n2024-03-14T16:48:21.535744376Z stderr F Exception in thread \"grpc-default-executor-664\" java.lang.IllegalStateException: call was cancelled\n2024-03-14T16:48:21.535797463Z stderr F at com.google.common.base.Preconditions.checkState(Preconditions.java:504)\n2024-03-14T16:48:21.535814016Z stderr F at io.grpc.internal.ClientCallImpl.startInternal(ClientCallImpl.java:199)\n2024-03-14T16:48:21.535819157Z stderr F at io.grpc.internal.ClientCallImpl.start(ClientCallImpl.java:191)\n2024-03-14T16:48:21.535825767Z stderr F at io.grpc.internal.DelayedClientCall$2.run(DelayedClientCall.java:187)\n2024-03-14T16:48:21.535830633Z stderr F at io.grpc.internal.DelayedClientCall.drainPendingCalls(DelayedClientCall.java:285)\n2024-03-14T16:48:21.535836051Z stderr F at io.grpc.internal.DelayedClientCall.access$100(DelayedClientCall.java:50)\n2024-03-14T16:48:21.535841091Z stderr F at io.grpc.internal.DelayedClientCall$1.run(DelayedClientCall.java:157)\n2024-03-14T16:48:21.535845657Z stderr F at io.grpc.internal.ManagedChannelImpl$RealChannel$PendingCall$1.run(ManagedChannelImpl.java:1113)\n2024-03-14T16:48:21.535857233Z stderr F at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)\n2024-03-14T16:48:21.535865083Z stderr F at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)\n2024-03-14T16:48:21.535886324Z stderr F at java.base/java.lang.Thread.run(Thread.java:829)\n```\n2. context.cancel. grpc client can listen to context cancellation event. this method won't throw exception. thus should be more reliable than the existing solution\n\nso proposed solution is change to context.cancel.\n\nTest Plan:\nunit test\nintegration test with KA. cancel aggregatively without seeing problem","shortMessageHtmlLink":"cancel grpc call through context"}},{"before":"42768a8e11225c277644ac44136278cf0566516a","after":null,"ref":"refs/heads/merge-changes2","pushedAt":"2024-04-23T05:34:34.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"yangy0000","name":"yang","path":"/yangy0000","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43356004?s=80&v=4"}},{"before":null,"after":"42768a8e11225c277644ac44136278cf0566516a","ref":"refs/heads/merge-changes2","pushedAt":"2024-04-23T05:33:03.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"yangy0000","name":"yang","path":"/yangy0000","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43356004?s=80&v=4"},"commit":{"message":"fix flaky test testSubmitMessageWithCommitResponse","shortMessageHtmlLink":"fix flaky test testSubmitMessageWithCommitResponse"}},{"before":"d4481a20daba6bbca612bea1f7d08a66443b9d8e","after":"96c4a0e05c99314252fdb03de166602ecba20565","ref":"refs/heads/merge-changes","pushedAt":"2024-04-23T05:07:26.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"yangy0000","name":"yang","path":"/yangy0000","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43356004?s=80&v=4"},"commit":{"message":"add consumer record timestamp in GRPC request and metadata intercepter\n\nAPI change to expose consumer record timestamp, and adding it in header","shortMessageHtmlLink":"add consumer record timestamp in GRPC request and metadata intercepter"}},{"before":"061cf171dff12278dc7f8239c8a4b825bdebdf79","after":"d4481a20daba6bbca612bea1f7d08a66443b9d8e","ref":"refs/heads/merge-changes","pushedAt":"2024-04-23T05:06:53.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"yangy0000","name":"yang","path":"/yangy0000","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43356004?s=80&v=4"},"commit":{"message":"add consumer record timestamp in GRPC request and metadata intercepter\n\nAPI change to expose consumer record timestamp, and adding it in header","shortMessageHtmlLink":"add consumer record timestamp in GRPC request and metadata intercepter"}},{"before":null,"after":"061cf171dff12278dc7f8239c8a4b825bdebdf79","ref":"refs/heads/merge-changes","pushedAt":"2024-04-23T05:04:25.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"yangy0000","name":"yang","path":"/yangy0000","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43356004?s=80&v=4"},"commit":{"message":"add consumer record timestamp in GRPC request and metadata intercepter\n\nAPI change to expose consumer record timestamp, and adding it in header","shortMessageHtmlLink":"add consumer record timestamp in GRPC request and metadata intercepter"}},{"before":"fde354372e1d55e3c20bd7a79059a14ff22eaf33","after":null,"ref":"refs/heads/yang-merge","pushedAt":"2024-04-22T23:46:55.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"yangy0000","name":"yang","path":"/yangy0000","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43356004?s=80&v=4"}},{"before":"3ea976764b6a49168a022869d77aaededf9948b9","after":"c83cbfee0860af24f9b2f9e1ffcacc54efb618ee","ref":"refs/heads/main","pushedAt":"2024-04-22T18:41:13.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"yangy0000","name":"yang","path":"/yangy0000","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43356004?s=80&v=4"},"commit":{"message":"Add logging for header decoding error for debugging purpose","shortMessageHtmlLink":"Add logging for header decoding error for debugging purpose"}},{"before":null,"after":"fde354372e1d55e3c20bd7a79059a14ff22eaf33","ref":"refs/heads/yang-merge","pushedAt":"2024-04-22T07:05:39.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"yangy0000","name":"yang","path":"/yangy0000","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43356004?s=80&v=4"},"commit":{"message":"Add logging for header decoding error for debugging purpose","shortMessageHtmlLink":"Add logging for header decoding error for debugging purpose"}},{"before":"9b30be8e2d59cf231251b306a5b6e4b7fca58c4c","after":"3ea976764b6a49168a022869d77aaededf9948b9","ref":"refs/heads/main","pushedAt":"2024-04-13T03:17:35.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"yangy0000","name":"yang","path":"/yangy0000","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43356004?s=80&v=4"},"commit":{"message":"Update rootProject name in settings.gradle (#20)","shortMessageHtmlLink":"Update rootProject name in settings.gradle (#20)"}},{"before":"2644da2d8f7383ff9bd1f836324c66e9037cbca2","after":"9b30be8e2d59cf231251b306a5b6e4b7fca58c4c","ref":"refs/heads/main","pushedAt":"2024-04-12T20:36:04.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"yangy0000","name":"yang","path":"/yangy0000","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43356004?s=80&v=4"},"commit":{"message":"upgrade protoc and protoc-gen-grpc-java version (#18)","shortMessageHtmlLink":"upgrade protoc and protoc-gen-grpc-java version (#18)"}},{"before":"8d22760f314ac3ccab35cbe8cc6f1a8b32fa88d7","after":"2644da2d8f7383ff9bd1f836324c66e9037cbca2","ref":"refs/heads/main","pushedAt":"2024-04-08T17:29:54.000Z","pushType":"pr_merge","commitsCount":3,"pusher":{"login":"ericzhifengchen","name":"Zhifeng Chen","path":"/ericzhifengchen","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/67832317?s=80&v=4"},"commit":{"message":"Merge pull request #17 from suez1224/fix-commit-sample-consumer\n\nFix sample consumer to commit after processing the event","shortMessageHtmlLink":"Merge pull request #17 from suez1224/fix-commit-sample-consumer"}},{"before":"d73a84e5015af34c6bb70d2dcd357b9aafc5f60f","after":"8d22760f314ac3ccab35cbe8cc6f1a8b32fa88d7","ref":"refs/heads/main","pushedAt":"2024-03-13T02:29:48.000Z","pushType":"pr_merge","commitsCount":2,"pusher":{"login":"ericzhifengchen","name":"Zhifeng Chen","path":"/ericzhifengchen","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/67832317?s=80&v=4"},"commit":{"message":"Merge pull request #13 from ericzhifengchen/main\n\nfix flaky test testSubmitMessageWithCommitResponse","shortMessageHtmlLink":"Merge pull request #13 from ericzhifengchen/main"}},{"before":"a2e2f5d936623ad4964822a36fa5fffe41829443","after":"d73a84e5015af34c6bb70d2dcd357b9aafc5f60f","ref":"refs/heads/main","pushedAt":"2024-03-13T00:42:10.000Z","pushType":"pr_merge","commitsCount":3,"pusher":{"login":"ericzhifengchen","name":"Zhifeng Chen","path":"/ericzhifengchen","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/67832317?s=80&v=4"},"commit":{"message":"Merge pull request #12 from ericzhifengchen/main\n\nmount docker.sock to allow dind","shortMessageHtmlLink":"Merge pull request #12 from ericzhifengchen/main"}},{"before":"d7d0667b9a5a4b27c23e6d3480957377bda0d764","after":"a2e2f5d936623ad4964822a36fa5fffe41829443","ref":"refs/heads/main","pushedAt":"2024-03-12T23:25:19.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"ericzhifengchen","name":"Zhifeng Chen","path":"/ericzhifengchen","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/67832317?s=80&v=4"},"commit":{"message":"Create gradle.yml","shortMessageHtmlLink":"Create gradle.yml"}},{"before":"fe228278b5aa99dfa5b4d0d08ce357f408fd12d7","after":"d7d0667b9a5a4b27c23e6d3480957377bda0d764","ref":"refs/heads/main","pushedAt":"2024-03-12T23:07:55.000Z","pushType":"pr_merge","commitsCount":2,"pusher":{"login":"ericzhifengchen","name":"Zhifeng Chen","path":"/ericzhifengchen","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/67832317?s=80&v=4"},"commit":{"message":"Merge pull request #9 from ericzhifengchen/main\n\nswitch to gradle image 8.6.0-jdk11-focal","shortMessageHtmlLink":"Merge pull request #9 from ericzhifengchen/main"}},{"before":"63791de72af3d6e41f2aaf229d125abed7cf39c7","after":"fe228278b5aa99dfa5b4d0d08ce357f408fd12d7","ref":"refs/heads/main","pushedAt":"2024-03-12T21:54:03.000Z","pushType":"pr_merge","commitsCount":2,"pusher":{"login":"ericzhifengchen","name":"Zhifeng Chen","path":"/ericzhifengchen","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/67832317?s=80&v=4"},"commit":{"message":"Merge pull request #8 from ericzhifengchen/main\n\nadd buidkite docker compose","shortMessageHtmlLink":"Merge pull request #8 from ericzhifengchen/main"}},{"before":"cb7a1a3646c8ef55023a85fc68a95650ce2f175c","after":null,"ref":"refs/heads/chenz/migration","pushedAt":"2024-03-07T23:58:16.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"ericzhifengchen","name":"Zhifeng Chen","path":"/ericzhifengchen","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/67832317?s=80&v=4"}},{"before":"cad94ae0eb40c24890a2e18f3000bd5be12d2af6","after":"63791de72af3d6e41f2aaf229d125abed7cf39c7","ref":"refs/heads/main","pushedAt":"2024-03-06T22:05:38.000Z","pushType":"pr_merge","commitsCount":5,"pusher":{"login":"ericzhifengchen","name":"Zhifeng Chen","path":"/ericzhifengchen","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/67832317?s=80&v=4"},"commit":{"message":"Merge pull request #7 from ericzhifengchen/main\n\nintegrate from gitolite to github repo","shortMessageHtmlLink":"Merge pull request #7 from ericzhifengchen/main"}},{"before":"cdc09464db87aa5c92b25f78a34fe25d6a475d37","after":null,"ref":"refs/heads/jonathanbaker7-patch-1","pushedAt":"2024-03-06T20:30:21.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"ericzhifengchen","name":"Zhifeng Chen","path":"/ericzhifengchen","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/67832317?s=80&v=4"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAETvvdtwA","startCursor":null,"endCursor":null}},"title":"Activity · uber/uForwarder"}