optimizely / optimizely/javascript-sdk
[BUG] Memory leak when migrating from v5 to v6
まだ誰も着手していません。
- 主要言語
- TypeScript
- スター
- 82
- フォーク
- 86
- 平均マージ
- 2日 15時間
- マージ済み PR(30日)
- 3
説明
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
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
Issue に示されている v5 から v6 へのインスタンス作成の変更から始め、1 つのインスタンスを作成する server-bootstrap のケースを再現します。時間の経過に伴うメモリスナップショットを比較し、プロジェクト設定マネージャー、イベントプロセッサ、ODP マネージャー、ロガー、createInstance パスに重点を置きます。disposable flag を有効にせずに、保持されたメモリの原因を特定し、メモリが安定して動作することを確認できれば完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- javascript
- 領域
- backend, performance
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- 説明が足りない
- 初心者へのやさしさ
- 28/100