diff options
Diffstat (limited to 'ui/src/tracks/cpu_slices/controller.ts')
-rw-r--r-- | ui/src/tracks/cpu_slices/controller.ts | 45 |
1 files changed, 30 insertions, 15 deletions
diff --git a/ui/src/tracks/cpu_slices/controller.ts b/ui/src/tracks/cpu_slices/controller.ts index 278450e23..5917968be 100644 --- a/ui/src/tracks/cpu_slices/controller.ts +++ b/ui/src/tracks/cpu_slices/controller.ts @@ -12,9 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -import {fromNs, toNs} from '../../common/time'; -import {LIMIT} from '../../common/track_data'; - +import {fromNs} from '../../common/time'; import { TrackController, trackControllerRegistry @@ -30,13 +28,22 @@ import { class CpuSliceTrackController extends TrackController<Config, Data> { static readonly kind = CPU_SLICE_TRACK_KIND; + private busy = false; private setup = false; - async onBoundsChange(start: number, end: number, resolution: number): - Promise<Data> { - const startNs = toNs(start); - const endNs = toNs(end); + onBoundsChange(start: number, end: number, resolution: number): void { + this.update(start, end, resolution); + } + + private async update(start: number, end: number, resolution: number): + Promise<void> { + // TODO: we should really call TraceProcessor.Interrupt() at this point. + if (this.busy) return; + const startNs = Math.round(start * 1e9); + const endNs = Math.round(end * 1e9); + + this.busy = true; if (this.setup === false) { await this.query( `create virtual table ${this.tableName('window')} using window;`); @@ -62,18 +69,20 @@ class CpuSliceTrackController extends TrackController<Config, Data> { where rowid = 0;`); if (isQuantized) { - return this.computeSummary( - fromNs(windowStartNs), end, resolution, bucketSizeNs); + this.publish(await this.computeSummary( + fromNs(windowStartNs), end, resolution, bucketSizeNs)); } else { - return this.computeSlices(fromNs(windowStartNs), end, resolution); + this.publish( + await this.computeSlices(fromNs(windowStartNs), end, resolution)); } + this.busy = false; } private async computeSummary( start: number, end: number, resolution: number, bucketSizeNs: number): Promise<SummaryData> { - const startNs = toNs(start); - const endNs = toNs(end); + const startNs = Math.round(start * 1e9); + const endNs = Math.round(end * 1e9); const numBuckets = Math.ceil((endNs - startNs) / bucketSizeNs); const query = `select @@ -82,7 +91,7 @@ class CpuSliceTrackController extends TrackController<Config, Data> { from ${this.tableName('span')} where cpu = ${this.config.cpu} and utid != 0 - group by quantum_ts limit ${LIMIT}`; + group by quantum_ts`; const rawResult = await this.query(query); const numRows = +rawResult.numRecords; @@ -92,7 +101,6 @@ class CpuSliceTrackController extends TrackController<Config, Data> { start, end, resolution, - length: numRows, bucketSizeSeconds: fromNs(bucketSizeNs), utilizations: new Float64Array(numBuckets), }; @@ -121,7 +129,6 @@ class CpuSliceTrackController extends TrackController<Config, Data> { start, end, resolution, - length: numRows, ids: new Float64Array(numRows), starts: new Float64Array(numRows), ends: new Float64Array(numRows), @@ -142,6 +149,14 @@ class CpuSliceTrackController extends TrackController<Config, Data> { return slices; } + private async query(query: string) { + const result = await this.engine.query(query); + if (result.error) { + console.error(`Query error "${query}": ${result.error}`); + throw new Error(`Query error "${query}": ${result.error}`); + } + return result; + } onDestroy(): void { if (this.setup) { |