Skip to content

Commit 8793fc4

Browse files
authored
feat: add C binding for context keys cache capacity configuration (#346)
This adds a missing C binding for configuring the context key cache capacity which the Event Processor uses to deduplicate index events.
1 parent 0a311e9 commit 8793fc4

File tree

6 files changed

+75
-3
lines changed

6 files changed

+75
-3
lines changed

libs/common/include/launchdarkly/config/shared/builders/events_builder.hpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,20 @@ class EventsBuilder {
107107
*/
108108
EventsBuilder& PrivateAttribute(AttributeReference attribute);
109109

110+
/**
111+
* @brief Specifies the number of unique context keys that can be remembered
112+
* by the index event generation logic before needing to evict keys from
113+
* memory in LRU order.
114+
*
115+
* After reaching capacity, it's possible
116+
* that a previously-indexed context may cause generation of a redundant
117+
* index event.
118+
*
119+
* @param capacity Maximum unique context keys to remember.
120+
* @return Reference to this builder.
121+
*/
122+
EventsBuilder& ContextKeysCapacity(std::size_t capacity);
123+
110124
/**
111125
* Builds Events configuration, if the configuration is valid.
112126
* @return Events config, or error.

libs/common/include/launchdarkly/config/shared/built/events.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,8 @@ class Events final {
9393
[[nodiscard]] std::size_t FlushWorkers() const;
9494

9595
/**
96-
* Max number of unique context keys to hold in LRU cache used for context
97-
* deduplication when generating index events.
96+
* Number of unique contexts to remember when deduplicating index
97+
* events.
9898
* @return Max, or std::nullopt if not applicable.
9999
*/
100100
[[nodiscard]] std::optional<std::size_t> ContextKeysCacheCapacity() const;

libs/common/src/config/events_builder.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@ EventsBuilder<SDK>& EventsBuilder<SDK>::Capacity(std::size_t capacity) {
2525
return *this;
2626
}
2727

28+
template <typename SDK>
29+
EventsBuilder<SDK>& EventsBuilder<SDK>::ContextKeysCapacity(
30+
std::size_t capacity) {
31+
config_.context_keys_cache_capacity_ = capacity;
32+
return *this;
33+
}
34+
2835
template <typename SDK>
2936
EventsBuilder<SDK>& EventsBuilder<SDK>::FlushInterval(
3037
std::chrono::milliseconds interval) {

libs/server-sdk/include/launchdarkly/server_side/bindings/c/config/builder.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,22 @@ LDServerConfigBuilder_Offline(LDServerConfigBuilder b, bool offline);
107107
LD_EXPORT(void)
108108
LDServerConfigBuilder_Events_Enabled(LDServerConfigBuilder b, bool enabled);
109109

110+
/**
111+
* Specifies the number of unique context keys that can be remembered
112+
* by the index event generation logic before needing to evict keys from
113+
* memory in LRU order.
114+
*
115+
* After reaching capacity, it's possible
116+
* that a previously-indexed context may cause generation of a redundant
117+
* index event.
118+
* @param b Server config builder. Must not be NULL.
119+
* @param context_keys_capacity Maximum unique context keys to remember. The default
120+
* is 1000.
121+
*/
122+
LD_EXPORT(void)
123+
LDServerConfigBuilder_Events_ContextKeysCapacity(LDServerConfigBuilder b,
124+
size_t context_keys_capacity);
125+
110126
/**
111127
* Sets the capacity of the event processor. When more events are generated
112128
* within the processor's flush interval than this value, events will be

libs/server-sdk/src/bindings/c/builder.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,14 @@ LDServerConfigBuilder_Events_Capacity(LDServerConfigBuilder b,
140140
TO_BUILDER(b)->Events().Capacity(capacity);
141141
}
142142

143+
LD_EXPORT(void)
144+
LDServerConfigBuilder_Events_ContextKeysCapacity(LDServerConfigBuilder b,
145+
size_t context_keys_capacity) {
146+
LD_ASSERT_NOT_NULL(b);
147+
148+
TO_BUILDER(b)->Events().ContextKeysCapacity(context_keys_capacity);
149+
}
150+
143151
LD_EXPORT(void)
144152
LDServerConfigBuilder_Events_FlushIntervalMs(LDServerConfigBuilder b,
145153
unsigned int milliseconds) {
@@ -225,7 +233,7 @@ LD_EXPORT(LDServerDataSourcePollBuilder) LDServerDataSourcePollBuilder_New() {
225233

226234
LD_EXPORT(void)
227235
LDServerDataSourcePollBuilder_IntervalS(LDServerDataSourcePollBuilder b,
228-
unsigned int seconds) {
236+
unsigned int seconds) {
229237
LD_ASSERT_NOT_NULL(b);
230238

231239
TO_POLL_BUILDER(b)->PollInterval(std::chrono::seconds{seconds});

libs/server-sdk/tests/server_c_bindings_test.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include <boost/json/parse.hpp>
1010

1111
#include <chrono>
12+
#include <launchdarkly/server_side/config/config.hpp>
1213

1314
TEST(ClientBindings, MinimalInstantiation) {
1415
LDServerConfigBuilder cfg_builder = LDServerConfigBuilder_New("sdk-123");
@@ -186,3 +187,29 @@ TEST(ClientBindings, DoubleVariationPassesThroughDefault) {
186187
LDServerSDK_Free(sdk);
187188
LDContext_Free(context);
188189
}
190+
191+
TEST(ClientBindings, CanSetEventConfigurationSuccessfully) {
192+
LDServerConfigBuilder cfg_builder = LDServerConfigBuilder_New("sdk-123");
193+
194+
LDServerConfigBuilder_Events_Enabled(cfg_builder, false);
195+
LDServerConfigBuilder_Events_Capacity(cfg_builder, 100);
196+
LDServerConfigBuilder_Events_ContextKeysCapacity(cfg_builder, 100);
197+
LDServerConfigBuilder_Events_PrivateAttribute(cfg_builder, "email");
198+
LDServerConfigBuilder_Events_AllAttributesPrivate(cfg_builder, true);
199+
200+
LDServerConfig config;
201+
LDStatus status = LDServerConfigBuilder_Build(cfg_builder, &config);
202+
ASSERT_TRUE(LDStatus_Ok(status));
203+
204+
launchdarkly::server_side::Config const* c =
205+
reinterpret_cast<launchdarkly::server_side::Config*>(config);
206+
207+
ASSERT_EQ(c->Events().Capacity(), 100);
208+
ASSERT_EQ(c->Events().ContextKeysCacheCapacity(), 100);
209+
ASSERT_EQ(c->Events().PrivateAttributes(),
210+
launchdarkly::AttributeReference::SetType{"email"});
211+
ASSERT_TRUE(c->Events().AllAttributesPrivate());
212+
ASSERT_FALSE(c->Events().Enabled());
213+
214+
LDServerConfig_Free(config);
215+
}

0 commit comments

Comments
 (0)