diff options
author | Steve Golton <stevegolton@google.com> | 2024-05-10 19:01:36 +0100 |
---|---|---|
committer | Steve Golton <stevegolton@google.com> | 2024-05-10 18:02:02 +0000 |
commit | 376a58c095e81a9556c49ba05527e0a1171f9794 (patch) | |
tree | 92c1f377c8aed265c6dfd02ce58c048035194b4b /ui | |
parent | 51a1471bbd6bbf2fbeb69ad71cf65543f2bbf961 (diff) | |
download | perfetto-376a58c095e81a9556c49ba05527e0a1171f9794.tar.gz |
ui: Randomize plugin startup order & fix missing import
Change-Id: If5f1a05f735997eed4078d579a10af8716d78c74
Diffstat (limited to 'ui')
-rw-r--r-- | ui/src/common/plugins.ts | 34 | ||||
-rw-r--r-- | ui/src/core_plugins/process_summary/index.ts | 2 |
2 files changed, 25 insertions, 11 deletions
diff --git a/ui/src/common/plugins.ts b/ui/src/common/plugins.ts index 0750e2e66..0f2b2b715 100644 --- a/ui/src/common/plugins.ts +++ b/ui/src/common/plugins.ts @@ -394,18 +394,24 @@ export class PluginManager { // Must only be called once on startup async initialize(): Promise<void> { - for (const plugin of pluginRegistry.values()) { - const id = `plugin_${plugin.pluginId}`; - const name = `Plugin: ${plugin.pluginId}`; + // Shuffle the order of plugins to weed out any implicit inter-plugin + // dependencies. + const pluginsShuffled = Array.from(pluginRegistry.values()) + .map(({pluginId}) => ({pluginId, sort: Math.random()})) + .sort((a, b) => a.sort - b.sort); + + for (const {pluginId} of pluginsShuffled) { + const flagId = `plugin_${pluginId}`; + const name = `Plugin: ${pluginId}`; const flag = featureFlags.register({ - id, + id: flagId, name, - description: `Overrides '${id}' plugin.`, - defaultValue: defaultPlugins.includes(plugin.pluginId), + description: `Overrides '${pluginId}' plugin.`, + defaultValue: defaultPlugins.includes(pluginId), }); - this.flags.set(plugin.pluginId, flag); + this.flags.set(pluginId, flag); if (flag.get()) { - await this.activatePlugin(plugin.pluginId); + await this.activatePlugin(pluginId); } } } @@ -526,15 +532,21 @@ export class PluginManager { beforeEach?: (id: string) => void, ): Promise<void> { this.engine = engine; - const plugins = Array.from(this._plugins.entries()); + + // Shuffle the order of plugins to weed out any implicit inter-plugin + // dependencies. + const pluginsShuffled = Array.from(this._plugins.entries()) + .map(([id, plugin]) => ({id, plugin, sort: Math.random()})) + .sort((a, b) => a.sort - b.sort); + // Awaiting all plugins in parallel will skew timing data as later plugins // will spend most of their time waiting for earlier plugins to load. // Running in parallel will have very little performance benefit assuming // most plugins use the same engine, which can only process one query at a // time. - for (const [id, pluginDetails] of plugins) { + for (const {id, plugin} of pluginsShuffled) { beforeEach?.(id); - await doPluginTraceLoad(pluginDetails, engine, id); + await doPluginTraceLoad(plugin, engine, id); } } diff --git a/ui/src/core_plugins/process_summary/index.ts b/ui/src/core_plugins/process_summary/index.ts index ea6845f31..f2a747574 100644 --- a/ui/src/core_plugins/process_summary/index.ts +++ b/ui/src/core_plugins/process_summary/index.ts @@ -35,6 +35,8 @@ class ProcessSummaryPlugin implements Plugin { private async addProcessTrackGroups(ctx: PluginContextTrace): Promise<void> { const result = await ctx.engine.query(` + INCLUDE PERFETTO MODULE android.process_metadata; + select * from ( select |