aboutsummaryrefslogtreecommitdiff
path: root/ui
diff options
context:
space:
mode:
authorSteve Golton <stevegolton@google.com>2024-05-10 19:01:36 +0100
committerSteve Golton <stevegolton@google.com>2024-05-10 18:02:02 +0000
commit376a58c095e81a9556c49ba05527e0a1171f9794 (patch)
tree92c1f377c8aed265c6dfd02ce58c048035194b4b /ui
parent51a1471bbd6bbf2fbeb69ad71cf65543f2bbf961 (diff)
downloadperfetto-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.ts34
-rw-r--r--ui/src/core_plugins/process_summary/index.ts2
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