optimizely / optimizely/javascript-sdk
[BUG] Memory leak when migrating from v5 to v6
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 82
- Forks
- 86
- Avg merge
- 2d 15h
- Merged PRs (30d)
- 3
Description
Is there an existing issue for this?
- I have searched the existing issues
SDK Version
6.3.1
Current Behavior
Memory increases over time and is not garbage collected
Expected Behavior
Memory is like it was before
Steps To Reproduce
We rewrote the optimizely instance creation from:
const DEFAULT_DATAFILE_OPTIONS = {
autoUpdate: true,
updateInterval: 5 * 60 * 1000 // 5 minutes
}
const DEFAULT_EVENTS_OPTIONS = {
batchSize: 10,
flushInterval: 1000
}
const DEFAULT_TIMEOUT = 500
const LOGGER_LEVEL = process.env.NODE_ENV === 'production' ? ERROR : INFO
export default class OptimizelyAdapter {
static createOptimizelyInstance({
options: optionParameter,
sdkKey,
datafile,
optimizely = optimizelySDK,
eventDispatcher = optimizelySDK.eventDispatcher
}) {
const options = {...DEFAULT_DATAFILE_OPTIONS, ...optionParameter}
optimizely.setLogLevel(LOGGER_LEVEL)
optimizely.setLogger(optimizely.logging.createLogger())
if (!datafile && typeof window !== 'undefined' && window.__INITIAL_CONTEXT_VALUE__?.pde) {
datafile = window.__INITIAL_CONTEXT_VALUE__.pde
sdkKey = undefined
}
const isServer = typeof window === 'undefined'
const optimizelyInstance = optimizely.createInstance({
sdkKey,
datafileOptions: options,
datafile,
eventDispatcher,
...DEFAULT_EVENTS_OPTIONS,
defaultDecideOptions: isServer ? [optimizely.OptimizelyDecideOption.DISABLE_DECISION_EVENT] : []
})
return optimizelyInstance
}
}
To:
const DEFAULT_DATAFILE_OPTIONS = {
autoUpdate: true,
updateInterval: 5 * 60 * 1000 // 5 minutes
}
const DEFAULT_EVENTS_OPTIONS = {
batchSize: 10,
flushInterval: 1000
}
const DEFAULT_TIMEOUT = 500
const LOGGER_LEVEL = process.env.NODE_ENV === 'production' ? ERROR : INFO
export default class OptimizelyAdapter {
static createOptimizelyInstance({options: optionParameter, sdkKey, datafile}) {
if (!datafile && typeof window !== 'undefined' && window.__INITIAL_CONTEXT_VALUE__?.pde) {
datafile = window.__INITIAL_CONTEXT_VALUE__.pde
sdkKey = undefined
}
const isServer = typeof window === 'undefined'
const projectConfigManager = sdkKey
? createPollingProjectConfigManager({sdkKey, datafile, ...DEFAULT_DATAFILE_OPTIONS, ...optionParameter})
: createStaticProjectConfigManager({datafile})
const eventProcessor = createBatchEventProcessor({
...DEFAULT_EVENTS_OPTIONS,
...optionParameter
})
const odpManager = createOdpManager()
const logger = createLogger({
level: LOGGER_LEVEL
})
return createInstance({
projectConfigManager,
eventProcessor,
odpManager,
logger,
defaultDecideOptions: isServer ? [OptimizelyDecideOption.DISABLE_DECISION_EVENT] : []
})
}
}
The instance is created in the server during bootstrap and we just create one. We would like to keep the current behaviour as it is (not using the disposable flag). I will try to do some memory snapshots but I was wondering is something is wrong since we only changed this part following your migration from v5 to v6 guide
SDK Type
Browser
Node Version
JS SDK
Browsers impacted
No response
Link
No response
Logs
No response
Severity
No response
Workaround/Solution
No response
Recent Change
No response
Conflicts
No response
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the v5-to-v6 instance-creation change shown in the issue and reproduce the server-bootstrap case that creates one instance. Compare memory snapshots over time, focusing on the project config manager, event processor, ODP manager, logger, and createInstance path. Done means identifying the source of retained memory and confirming stable memory behavior without enabling the disposable flag.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- javascript
- Domain
- backend, performance
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 28/100