{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":82700090,"defaultBranch":"master","name":"cadence","ownerLogin":"uber","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2017-02-21T16:10:18.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/538264?v=4","public":true,"private":false,"isOrgOwned":true},"refInfo":{"name":"","listCacheKey":"v0:1716416679.0","currentOid":""},"activityList":{"items":[{"before":"5f45da53908e64d9dd71d58fb3084c336a3e6294","after":"f8765f0185b6b6bd2e994eeaba3fd14016b30151","ref":"refs/heads/master","pushedAt":"2024-05-28T22:55:11.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Groxx","name":"Steven L","path":"/Groxx","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/77197?s=80&v=4"},"commit":{"message":"Cancel-able reservations for ratelimiters (#6030)\n\nImplements a fix for #6029, allowing _normal_ ratelimiter usage to reserve tokens and be able to cancel them, assuming no racing claims on the limiter.\r\n\r\nIn the course of benchmarking this, I discovered what I believe to be some fundamental flaws with how `*rate.Limiter` works, which effectively _require_ a wrapper like I've built here. So unless this has unsustainable latency or CPU costs, IMO it should be preferred over the underlying `*rate.Limiter` on correctness alone.\r\n\r\nThe good news is that latency seems entirely survivable, less than 2x slower in basically all cases (and usually much less).\r\nSurprisingly, it's even slightly _faster_ for one of our common uses (reserve -> cancel, used in multi-stage ratelimits, which I suspect we will use more heavily in the future).\r\n\r\n# What this wrapper does\r\n\r\nA few core things:\r\n1. re-implements `*rate.Limiter` in terms of an interface, to allow mocks and wrappers (`*rate.Limiter` has `Reserve() *rate.Reservation` which can't be mocked in any reasonable way)\r\n2. implements ^ the interface while using a `TimeSource` so tests can resist CPU noise more easily (will also require a context-wrapper in some cases, which will be done later when needed. there's a simple prototype in this commit.)\r\n3. prevents `*rate.Limiter`-internal time from going backwards (leads to irrational behavior / violated limits)\r\n4. synchronously cancels any reservations that are not immediately available (more efficient, matches our intended use, and has much more correct throughput when contended)\r\n\r\n# The flaw\r\n\r\nTime travel does weird things.\r\n\r\nEssentially, it's a combination of:\r\n- `*rate.Limiter`'s *use of* `time.Now()` is not monotonic, despite `time.Now()` *itself* being monotonic: `Now()` is collected _before_ the ratelimiter's mutex is held, so values may be arbitrarily delayed and out of order while waiting to acquire the mutex.\r\n- `*rate.Limiter` allows its internal time to advance _and rewind_ by design, but it does not preserve enough information to e.g. rewind 1s and then advance 1s without affecting the next call.\r\n- as a mitigating factor on all this, `*rate.Limiter` only updates its `last` time when an event is _allowed_. this means ^ this essentially only applies if time skew is greater than your limiter's rate, especially if it's >=2x or other time-changing methods are called.\r\n\r\nWith fast benchmarks this is very easy to trigger, IRL... I'm unsure. Some of our limits are set to >100,000 per second, or <10µs of mutex-imposed delay tolerated. With a tight loop in a benchmark I regularly exceed 100µs of latency between locks even without parallel calls (zero contention), so I suspect it's not all that rare.\r\n\r\nIn any case, because it explicitly allows time to rewind and the simpler methods do not acquire the lock before gathering `time.Now()`, concurrent use can lead to the following behavior. Assuming the limit refills a token every 5 time-periods, and the calls acquire the mutex in the following global order (as observed through the limiter's mutex) but with their original T=time.Now() values:\r\n1. `Allow()` called at T0: successfully claims a token, emptying the token bucket.\r\n - The limiter's internal time, `last`, is now T0.\r\n3. `Allow()` called at T1: fails, 0 tokens available.\r\n - The limiter's internal time does not advance, nothing changes.\r\n5. `Allow()` called at T10: successfully claims a token.\r\n - The limiter's internal time advances from T0 to T10, and adds 2 tokens.\r\n - The 1 full token is claimed, the call is allowed, and 1 token remains after the call.\r\n6. `Allow()` called at T0: successfully claims a token.\r\n - The limiter's internal time advances from T10 to T0. No tokens have been added because the new time is lower.\r\n - There is 1 token in the bucket, so the call is allowed. 0 tokens remain.\r\n7. `Allow()` called at T5: successfully claims a token.\r\n - The limiter's internal time advances from T0 to T5, and adds a token to the bucket.\r\n - The 1 full token is claimed, the call is allowed, and 0 tokens remain after the call.\r\n\r\nFrom an outside observer who knows \"real\" time has only moved from T0 to T10, _four_ calls have been allowed when only three should have been (one each at T0, T5, and T10). This can happen _any number of times_ between real-T0 and real-T10 if more old/new stale-time-alternating calls occur (especially with larger skew), and some benchmarks show this allowing _thousands_ of times more events than it should.\r\n\r\n# The fix\r\n\r\nNever allow the internal time to rewind.\r\n\r\nIt's pretty straightforward conceptually, and I am _absolutely thrilled_ that `*rate.Limiter` has these \"pass in a time\" APIs: they allow this kind of wrapper, both for mocking time and for implementing the fix. Implementing it is a bit subtle and fiddly (as shown in this PR), but thankfully possible.\r\n\r\nThis eliminates rapid thrashing (all old-time events simply occur \"at the same time\"), and as long as \"real\" time is used, it eventually converges on real-time-like throughput because real time keeps advancing at a steady rate when viewed at larger time scales. At small time scales there is no correct time available anyway, so only larger-scale behavior is important.\r\n\r\nI've also chosen to \"pin\" reservations' time, because this allows canceling them well after they are claimed _if no other time-advancing calls have occurred_.\r\n\r\nConceptually I believe this is sound, and benchmarks show essentially perfect timing between allowed events:\r\n- Events that occur in the real-past / at the \"same\" time as the reservation (or after) can be allowed to use the returned token because no possibly-over-limit calls have occurred after it (in fact, none at all).\r\n - If using `time.Now()`, this token likely could not be returned because time has usually advanced, and canceling does nothing when that occurs.\r\n - You can see an isolated version of this in the pinned-time benchmarks, notice how its sequential call throughput is essentially perfect.\r\n- If other calls have occurred \"after\" the reservation, returning a consumed token cannot be guaranteed safe / may not correctly limit throughput, so it is not returned.\r\n - e.g. burst-1 limit-1/s and allowing late cancels would allow: reserve (0 delay) -> wait 1s -> Allow() (true) -> cancel() -> Allow() (true), which means 2 allowed events in the same second, violating the limit.\r\n\r\n# A simpler fix we can contribute upstream\r\n\r\nLock before acquiring `time.Now()`, not after.\r\n\r\nFor \"normal\" use (`Wait(ctx)` and `Allow()`), this would ensure that time progresses monotonically, which seems like an obvious assumption for users. Even high frequency events should behave correctly in this case.\r\n\r\nEven if this is done, this wrapper still has some use to protect against rewinds when canceling while recovering more tokens. In fact, the entire wrapper would likely be completely unchanged, because we have no way to know what the internal time is when canceling...\r\n\r\n... but all non-wrapper and non-at-time-passing users Go-ecosystem-wide would be much more correct. And adding some `AllowN(int)` (not `AllowN(time, int)`) time-free non-singular APIs would likely take care of the VAST majority of the remaining cases, leaving only Reserve-users to suffer through the details.\r\n\r\n(I would need to think harder about it, but changing how CancelAt works to compare against `r.lim.last` might resolve it for cancellation too)","shortMessageHtmlLink":"Cancel-able reservations for ratelimiters (#6030)"}},{"before":"7a58a5d1f647c4725f9580a76996d77a944feefb","after":"5f45da53908e64d9dd71d58fb3084c336a3e6294","ref":"refs/heads/master","pushedAt":"2024-05-28T19:20:57.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Groxx","name":"Steven L","path":"/Groxx","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/77197?s=80&v=4"},"commit":{"message":"Adopt Go toolchains for language-version-control (#6063)\n\nGo 1.21 brought us \"toolchains\":\r\nWe can now describe the version we want, and the Go CLI will automagically download, install, and use that version, with no extra effort. It should give us a MUCH more reliable way to ensure identical builds and formats and whatnot, and all us devs will auto-switch as we jump between git SHAs.\r\n\r\nSo let's use that!\r\n\r\nThis does a few things:\r\n- requires Go 1.21+ to be your `go` version to *work on* Cadence.\r\n - this does not force our *users* to use 1.21+, that's still 1.20, controlled by the `go 1.20` lines. just development in this workspace.\r\n- sets a `go.work` toolchain (if there's a `go.work` file, toolchains in individual `go.mod` files are ignored)\r\n - not all IDEs follow this. we could set it + lint it in the `go.mod` files too if it helps, it just won't have any effect on CLI `go` use so it may be misleading.\r\n- exports `GOTOOLCHAIN=...` inside the Makefile, so ALL makefile-driven builds by everyone use exactly the same version (you can override this with an explicit `GOTOOLCHAIN`)\r\n- updates our dockerfiles (it would just download [wrong version in docker image] and then auto-download the right one, which is a waste of time)\r\n- adds a lint script to ensure ^ all that stays up to date\r\n\r\n---\r\n\r\nFor future upgrades, upgrading the toolchain should be very simple:\r\n- change `go.work` to a new toolchain version\r\n - everything now uses the new language version, tools and binaries will rebuild, etc.\r\n- `make lint` or `make pr` or CI will tell you to change the Dockerfiles / other locations, if you don't `git grep -F 1.22.3` to find and update those first.\r\n\r\nAnd temporarily trying a different version to check a bug / performance / try the new version is:\r\n- `GOTOOLCHAIN=go1.23.4 make whatever` and it'll do exactly that (except for the version check in `make lint`)\r\n- you may want to `make clean` as well, to rebuild tools if that's relevant\r\n - they will not automatically rebuild with this env var changing. they *could*, if we used `.build/go1.23.4/etc` folders, if we want that.","shortMessageHtmlLink":"Adopt Go toolchains for language-version-control (#6063)"}},{"before":"b4a3f3f024ea45b8077aba63242db7a00db85043","after":"7a58a5d1f647c4725f9580a76996d77a944feefb","ref":"refs/heads/master","pushedAt":"2024-05-28T13:12:11.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"jakobht","name":"Jakob Haahr Taankvist","path":"/jakobht","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/580533?s=80&v=4"},"commit":{"message":"Test for DescribeMutableState (#6059)","shortMessageHtmlLink":"Test for DescribeMutableState (#6059)"}},{"before":"2f08de5f16d72b4ce3bd067ebf9f54605aca33fc","after":"b4a3f3f024ea45b8077aba63242db7a00db85043","ref":"refs/heads/master","pushedAt":"2024-05-28T13:08:45.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"ketsiambaku","name":"Ketsia","path":"/ketsiambaku","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/115650494?s=80&v=4"},"commit":{"message":"Add tests for history decision task handler (#6060)\n\nIntroduced the following tests in service/history/decision:\r\n\r\nTestHandleDecisionRecordMarker\r\n\r\nTestHandleDecisionScheduleActivity\r\n\r\nTestHandleDecisionCancelWorkflow","shortMessageHtmlLink":"Add tests for history decision task handler (#6060)"}},{"before":"0aac302e011872396f9393674e98320193ebe68e","after":"2f08de5f16d72b4ce3bd067ebf9f54605aca33fc","ref":"refs/heads/master","pushedAt":"2024-05-24T22:23:52.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"fimanishi","name":"Felipe Imanishi","path":"/fimanishi","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/27440680?s=80&v=4"},"commit":{"message":"Add tests for mutable_state_builder_methods_decision.go (#6055)\n\n* Add tests for mutable_state_builder_methods_decision.go\r\n\r\nWhat changed?\r\ntests for mutable_state_builder_methods_decision.go\r\n\r\nWhy?\r\nimprove unit test coverage\r\n\r\nHow did you test it?\r\nunit tests\r\n\r\nPotential risks\r\n\r\nRelease notes\r\n\r\nDocumentation Changes","shortMessageHtmlLink":"Add tests for mutable_state_builder_methods_decision.go (#6055)"}},{"before":"8d5c056536c8b5c12cfd80970e95f68aeec4f8ce","after":"0aac302e011872396f9393674e98320193ebe68e","ref":"refs/heads/master","pushedAt":"2024-05-24T22:21:32.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Groxx","name":"Steven L","path":"/Groxx","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/77197?s=80&v=4"},"commit":{"message":"Global ratelimiter helper: usage-tracking fallback-capable rate.Limiter (#6028)\n\nThis commit largely exists to break this out for separate review, as it's relatively simple and isolated.\r\n\r\nIn a later PR, this will be used by the \"limiter\"-side logic to track and enforce usage of a ratelimit. At a high level it does only a couple things:\r\n\r\n1. Tracks calls to `Allow() bool` so we can find out how much a limit is actually used (so we can distribute the allowances fairly)\r\n2. Updates ratelimit rates when requested\r\n3. Automatically falls back to different ratelimit if the system seems unhealthy\r\n\r\n^ all of which is done in an atomic-like way so concurrent operations do not block each other, as true precision is not necessary. It only has to be \"good enough\", and performance is more important than precision.","shortMessageHtmlLink":"Global ratelimiter helper: usage-tracking fallback-capable rate.Limit…"}},{"before":"8fe99886453623a7ad375f70d363fcfa4cbd01dc","after":"8d5c056536c8b5c12cfd80970e95f68aeec4f8ce","ref":"refs/heads/master","pushedAt":"2024-05-24T13:49:23.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"jakobht","name":"Jakob Haahr Taankvist","path":"/jakobht","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/580533?s=80&v=4"},"commit":{"message":"Made execution.Cache an interface so we can mock it in unit tests (#6058)\n\nWhat changed?\r\nMade execution cache an interface\r\n\r\nWhy?\r\nNow we can mock it in unit tests\r\n\r\nHow did you test it?\r\nUnit and integration tests\r\n\r\nPotential risks\r\nTouches a lot of files but should be a safe change\r\n\r\nRelease notes\r\n\r\nDocumentation Changes","shortMessageHtmlLink":"Made execution.Cache an interface so we can mock it in unit tests (#6058"}},{"before":"346d753cb6bd0a8b434786f5b7c4a0775315fe86","after":"8fe99886453623a7ad375f70d363fcfa4cbd01dc","ref":"refs/heads/master","pushedAt":"2024-05-24T13:20:36.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"3vilhamster","name":"Ilya Ozherelyev","path":"/3vilhamster","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3466181?s=80&v=4"},"commit":{"message":"Add tests for Put/GetReplicationTasksDLQ (#6057)","shortMessageHtmlLink":"Add tests for Put/GetReplicationTasksDLQ (#6057)"}},{"before":"edc5880df34c277c5786633ab38486aa85c17a17","after":"346d753cb6bd0a8b434786f5b7c4a0775315fe86","ref":"refs/heads/master","pushedAt":"2024-05-24T12:56:24.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"jakobht","name":"Jakob Haahr Taankvist","path":"/jakobht","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/580533?s=80&v=4"},"commit":{"message":"Added tests for CompleteTasks (#6051)","shortMessageHtmlLink":"Added tests for CompleteTasks (#6051)"}},{"before":"af960df0a85aa5e786568dfddb5ad3b94bcc3253","after":"edc5880df34c277c5786633ab38486aa85c17a17","ref":"refs/heads/master","pushedAt":"2024-05-24T11:35:46.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"jakobht","name":"Jakob Haahr Taankvist","path":"/jakobht","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/580533?s=80&v=4"},"commit":{"message":"Added tests for DeleteTaskList (#6047)","shortMessageHtmlLink":"Added tests for DeleteTaskList (#6047)"}},{"before":"fc6fae5384fac24b50cb03f57195dc3b230b29a9","after":"af960df0a85aa5e786568dfddb5ad3b94bcc3253","ref":"refs/heads/master","pushedAt":"2024-05-24T10:43:16.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"jakobht","name":"Jakob Haahr Taankvist","path":"/jakobht","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/580533?s=80&v=4"},"commit":{"message":"Added test for UpdateTaskList (#6046)","shortMessageHtmlLink":"Added test for UpdateTaskList (#6046)"}},{"before":"307ae8062a2c3cd3b867abbad5eeb27a6efa2f90","after":"fc6fae5384fac24b50cb03f57195dc3b230b29a9","ref":"refs/heads/master","pushedAt":"2024-05-24T09:59:38.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"jakobht","name":"Jakob Haahr Taankvist","path":"/jakobht","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/580533?s=80&v=4"},"commit":{"message":"Added test for LeaseTaskList (#6042)","shortMessageHtmlLink":"Added test for LeaseTaskList (#6042)"}},{"before":"96c47bc5a3d77009fb2cc4ebed166499bd1ab603","after":"307ae8062a2c3cd3b867abbad5eeb27a6efa2f90","ref":"refs/heads/master","pushedAt":"2024-05-24T09:56:05.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sankari165","name":"sankari gopalakrishnan","path":"/sankari165","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/76950795?s=80&v=4"},"commit":{"message":"Add unit tests for mutable_state_builder_methods_signal.go (#6056)\n\n* Add unit tests for mutable_state_builder_methods_signal.go\r\n\r\n* Update mutable_state_builder_methods_signal_test.go\r\n\r\n* Update mutable_state_builder_methods_signal_test.go\r\n\r\n* fix lint issues","shortMessageHtmlLink":"Add unit tests for mutable_state_builder_methods_signal.go (#6056)"}},{"before":"f0d9d72986883bacc36c4849bb8eec415c2fbac4","after":"96c47bc5a3d77009fb2cc4ebed166499bd1ab603","ref":"refs/heads/master","pushedAt":"2024-05-24T08:57:39.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"jakobht","name":"Jakob Haahr Taankvist","path":"/jakobht","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/580533?s=80&v=4"},"commit":{"message":"Added tests for GetTasks (#6048)","shortMessageHtmlLink":"Added tests for GetTasks (#6048)"}},{"before":"e8111fb022fa6e4e2eccd80cf000e443fea12b9d","after":"f0d9d72986883bacc36c4849bb8eec415c2fbac4","ref":"refs/heads/master","pushedAt":"2024-05-24T07:54:38.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"3vilhamster","name":"Ilya Ozherelyev","path":"/3vilhamster","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3466181?s=80&v=4"},"commit":{"message":"wrapped error support in transport mappers (#6050)","shortMessageHtmlLink":"wrapped error support in transport mappers (#6050)"}},{"before":"b0e1430fcfad91108ea153d897de577fd9363d0a","after":"e8111fb022fa6e4e2eccd80cf000e443fea12b9d","ref":"refs/heads/master","pushedAt":"2024-05-24T07:54:00.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"3vilhamster","name":"Ilya Ozherelyev","path":"/3vilhamster","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3466181?s=80&v=4"},"commit":{"message":"Unit tests for DeserializeBufferedEvents (#6054)\n\n* Unit tests for DeserializeBufferedEvents","shortMessageHtmlLink":"Unit tests for DeserializeBufferedEvents (#6054)"}},{"before":"919f41685ed082e5b57fb4229b1292cf748f48f5","after":"b0e1430fcfad91108ea153d897de577fd9363d0a","ref":"refs/heads/master","pushedAt":"2024-05-23T22:03:45.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"ketsiambaku","name":"Ketsia","path":"/ketsiambaku","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/115650494?s=80&v=4"},"commit":{"message":"Add tests for history decision task handler (#6053)\n\n* Add tests for history decision task handler\r\n\r\n* lint","shortMessageHtmlLink":"Add tests for history decision task handler (#6053)"}},{"before":"b785b93b8a293fe5e44a49beb787604b8a1d74e6","after":"919f41685ed082e5b57fb4229b1292cf748f48f5","ref":"refs/heads/master","pushedAt":"2024-05-23T16:49:51.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Shaddoll","name":"Zijian","path":"/Shaddoll","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10075390?s=80&v=4"},"commit":{"message":"Move RetryActivity to the corresponding file (#6038)","shortMessageHtmlLink":"Move RetryActivity to the corresponding file (#6038)"}},{"before":"fb4bfce5a9747f602b92a51aa20f139946224d30","after":"b785b93b8a293fe5e44a49beb787604b8a1d74e6","ref":"refs/heads/master","pushedAt":"2024-05-23T13:25:30.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sankari165","name":"sankari gopalakrishnan","path":"/sankari165","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/76950795?s=80&v=4"},"commit":{"message":"Improve unit tests for mutable_state_builder_methods_activity.go (#6045)\n\n* Improve unit tests for mutable_state_builder_methods_activity.go\r\n\r\n* Update mutable_state_builder_methods_activity.go\r\n\r\n* Update mutable_state_builder_methods_activity_test.go","shortMessageHtmlLink":"Improve unit tests for mutable_state_builder_methods_activity.go (#6045)"}},{"before":"144a627eb768cc7b76c87bfb3ff759e25337b3bb","after":"fb4bfce5a9747f602b92a51aa20f139946224d30","ref":"refs/heads/master","pushedAt":"2024-05-23T07:39:42.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"jakobht","name":"Jakob Haahr Taankvist","path":"/jakobht","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/580533?s=80&v=4"},"commit":{"message":"Added test for GetOrphanTasks (#6036)","shortMessageHtmlLink":"Added test for GetOrphanTasks (#6036)"}},{"before":null,"after":"489248029f907b0b5af787d2c64eb23116959b4e","ref":"refs/heads/xbowen_add_pinot_integration_test00","pushedAt":"2024-05-22T22:24:39.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"bowenxia","name":"bowen xiao","path":"/bowenxia","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/81027221?s=80&v=4"},"commit":{"message":"add pinot integration test into pipeline","shortMessageHtmlLink":"add pinot integration test into pipeline"}},{"before":"51af424de5fb77d79cfdcf44491745da0db03bad","after":"144a627eb768cc7b76c87bfb3ff759e25337b3bb","ref":"refs/heads/master","pushedAt":"2024-05-22T22:09:30.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Groxx","name":"Steven L","path":"/Groxx","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/77197?s=80&v=4"},"commit":{"message":"Global ratelimiter helper: a small atomic-like map (#6027)\n\nThis commit largely exists to break this out for separate review, as it's relatively simple and isolated.\r\n\r\nIn a later PR, this will be used by the \"limiter\"-side logic to hold known ratelimiters, and simplify its logic. So it does just two core things, and exposes a *very* small API that's intended to be difficult or impossible to misuse:\r\n\r\n1. Tracks length, so a \"iterate over everything and collect data for sending to aggregators\" loop can pre-allocate a collection that is likely large enough to store everything.\r\n2. Implicitly initializes missing values, so the using logic does not ever need to check for existence or explicitly handle fallbacks or decide how to order atomic operations.\r\n\r\nIt could have other methods, but so far they do not seem necessary. Delete is not currently planned to be used, but it seems important to reserve / guarantee it's possible to build, so I've included that as well.\r\n\r\n---\r\n\r\nThis is not intended to be broadly reusable as we do not currently have any other locations that will use it, and the auto-initializing behavior is potentially unique. It's mostly just isolating and simplifying some logic to prevent accidental misuse, because early iterations had some easily-missed flaws.\r\n\r\nWe very likely *should* have a \"just a type-safe `sync.Map`\" wrapper, which this could easily be changed to use, but the vast majority of that API would be unused here so I haven't built that.","shortMessageHtmlLink":"Global ratelimiter helper: a small atomic-like map (#6027)"}},{"before":"c163eefc6a13c0bcf4581e0dd3207edeaf9d3d27","after":"51af424de5fb77d79cfdcf44491745da0db03bad","ref":"refs/heads/master","pushedAt":"2024-05-22T15:34:32.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"dkrotx","name":"Kisel Jan","path":"/dkrotx","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1651393?s=80&v=4"},"commit":{"message":"Adding more tests to context.go (#6043)\n\nMainly for GenerateTransferTaskID and helper methods.\r\nRemoved tests checked internal calls - we should test public iface.","shortMessageHtmlLink":"Adding more tests to context.go (#6043)"}},{"before":"566388ff7c030793ae981153a5ef52ee36b40854","after":"c163eefc6a13c0bcf4581e0dd3207edeaf9d3d27","ref":"refs/heads/master","pushedAt":"2024-05-22T13:34:25.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"3vilhamster","name":"Ilya Ozherelyev","path":"/3vilhamster","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3466181?s=80&v=4"},"commit":{"message":"[common/persistence] Unit tests for SerializeWorkflowSnapshot (#6034)\n\n* [common/persistence] Unit tests for SerializeWorkflowSnapshot","shortMessageHtmlLink":"[common/persistence] Unit tests for SerializeWorkflowSnapshot (#6034)"}},{"before":"5f605009cb4dfae0c24e0a8bb74928976abc6708","after":"566388ff7c030793ae981153a5ef52ee36b40854","ref":"refs/heads/master","pushedAt":"2024-05-22T12:04:50.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sankari165","name":"sankari gopalakrishnan","path":"/sankari165","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/76950795?s=80&v=4"},"commit":{"message":"Add tests for mutable_state_builder_methods_timer.go (#6040)\n\n* Add tests for mutable_state_builder_methods_activity.go\r\n\r\n* Update mutable_state_builder_methods_activity_test.go\r\n\r\n* Add tests for mutable_state_builder_methods_timer.go\r\n\r\n* Update mutable_state_builder_methods_timer_test.go","shortMessageHtmlLink":"Add tests for mutable_state_builder_methods_timer.go (#6040)"}},{"before":"9363cfed7024c98dea84a4eaad4072ed4f64ebfb","after":"5f605009cb4dfae0c24e0a8bb74928976abc6708","ref":"refs/heads/master","pushedAt":"2024-05-22T12:00:27.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sankari165","name":"sankari gopalakrishnan","path":"/sankari165","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/76950795?s=80&v=4"},"commit":{"message":"Add tests for mutable_state_builder_methods_activity.go (#6037)\n\n* Add tests for mutable_state_builder_methods_activity.go\r\n\r\n* Update mutable_state_builder_methods_activity_test.go","shortMessageHtmlLink":"Add tests for mutable_state_builder_methods_activity.go (#6037)"}},{"before":"1eb24b339f4424031803dc9e7a9a7e27229d1e07","after":"9363cfed7024c98dea84a4eaad4072ed4f64ebfb","ref":"refs/heads/master","pushedAt":"2024-05-22T11:25:16.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"jakobht","name":"Jakob Haahr Taankvist","path":"/jakobht","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/580533?s=80&v=4"},"commit":{"message":"Unit tests for GetTaskListSize (#6039)","shortMessageHtmlLink":"Unit tests for GetTaskListSize (#6039)"}},{"before":"bbe87aa5a819ad5fb9db7e0fd3ce5be29fdc35af","after":"1eb24b339f4424031803dc9e7a9a7e27229d1e07","ref":"refs/heads/master","pushedAt":"2024-05-22T08:12:45.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sankari165","name":"sankari gopalakrishnan","path":"/sankari165","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/76950795?s=80&v=4"},"commit":{"message":"Add method to list all workflow executions with support for partial match and search params (#6017)\n\n* try\r\n\r\n* update\r\n\r\n* Update dataVisibilityManagerInterfaces.go\r\n\r\n* updated\r\n\r\n* Update pinot_visibility_store_test.go\r\n\r\n* Update visibility_store_mock.go\r\n\r\n* Update es_visibility_store_test.go\r\n\r\n* Update pinot_visibility_store.go","shortMessageHtmlLink":"Add method to list all workflow executions with support for partial m…"}},{"before":"cc75f6f4a26eba9d50ac00cd76d941f199398b3a","after":"bbe87aa5a819ad5fb9db7e0fd3ce5be29fdc35af","ref":"refs/heads/master","pushedAt":"2024-05-21T17:44:14.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Shaddoll","name":"Zijian","path":"/Shaddoll","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/10075390?s=80&v=4"},"commit":{"message":"Enable sanity check fr strong idempotency check (#6031)","shortMessageHtmlLink":"Enable sanity check fr strong idempotency check (#6031)"}},{"before":"c0b0576ee623c047366cef1c398a48aaedc09bbe","after":"cc75f6f4a26eba9d50ac00cd76d941f199398b3a","ref":"refs/heads/master","pushedAt":"2024-05-21T14:24:54.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"3vilhamster","name":"Ilya Ozherelyev","path":"/3vilhamster","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3466181?s=80&v=4"},"commit":{"message":"Wrapped errors support on metered persistence wrappers (#6035)","shortMessageHtmlLink":"Wrapped errors support on metered persistence wrappers (#6035)"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAEVlnJPgA","startCursor":null,"endCursor":null}},"title":"Activity · uber/cadence"}