Skip to content

Commit 1e1e4ba

Browse files
authored
Merge pull request #3797 from cloudflare/joshthoward/add-wae-output-gate
Add output gate for Workers Analytics Engine writes
2 parents 242ec64 + a91e9f6 commit 1e1e4ba

File tree

2 files changed

+19
-0
lines changed

2 files changed

+19
-0
lines changed

src/workerd/api/analytics-engine.c++

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,21 @@ void AnalyticsEngine::writeDataPoint(
1515

1616
context.getLimitEnforcer().newAnalyticsEngineRequest();
1717

18+
// Optimization: For non-actors, which never have output locks, avoid the overhead of
19+
// awaitIo() and such by not going back to the event loop at all.
20+
KJ_IF_SOME(promise, context.waitForOutputLocksIfNecessary()) {
21+
context.awaitIo(js, kj::mv(promise), [this, event = kj::mv(event)](jsg::Lock& js) mutable {
22+
writeDataPointNoOutputLock(js, kj::mv(event));
23+
});
24+
} else {
25+
writeDataPointNoOutputLock(js, kj::mv(event));
26+
}
27+
}
28+
29+
void AnalyticsEngine::writeDataPointNoOutputLock(
30+
jsg::Lock& js, jsg::Optional<api::AnalyticsEngine::AnalyticsEngineEvent>&& event) {
31+
auto& context = IoContext::current();
32+
1833
context.writeLogfwdr(logfwdrChannel, [&](capnp::AnyPointer::Builder ptr) {
1934
api::AnalyticsEngineEvent::Builder aeEvent = ptr.initAs<api::AnalyticsEngineEvent>();
2035

src/workerd/api/analytics-engine.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ class AnalyticsEngine: public jsg::Object {
7070
return m * 1000000;
7171
}
7272

73+
// Called within writeDataPoint after waiting for output locks
74+
void writeDataPointNoOutputLock(
75+
jsg::Lock& js, jsg::Optional<api::AnalyticsEngine::AnalyticsEngineEvent>&& event);
76+
7377
uint logfwdrChannel;
7478
kj::String dataset;
7579
int64_t version;

0 commit comments

Comments
 (0)