Skip to content

Commit 854ca01

Browse files
committed
chore: add logging around workspace fetching and refetching logic
1 parent 5ebc004 commit 854ca01

File tree

1 file changed

+58
-4
lines changed

1 file changed

+58
-4
lines changed

src/workspacesProvider.ts

+58-4
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
errToStr,
1313
} from "./api-helper"
1414
import { Storage } from "./storage"
15-
import { getMemoryLogger, MemoryLogger } from "./memoryLogger"
15+
import { getMemoryLogger } from "./memoryLogger"
1616

1717
export enum WorkspaceQuery {
1818
Mine = "owner:me",
@@ -57,10 +57,21 @@ export class WorkspaceProvider implements vscode.TreeDataProvider<vscode.TreeIte
5757
// Calling this while already refreshing or not visible is a no-op and will
5858
// return immediately.
5959
async fetchAndRefresh() {
60-
if (this.fetching || !this.visible) {
60+
const logger = getMemoryLogger()
61+
62+
if (this.fetching) {
63+
logger.debug(`WorkspaceProvider(${this.getWorkspacesQuery}): Already fetching, ignoring refresh request`)
64+
return
65+
}
66+
67+
if (!this.visible) {
68+
logger.debug(`WorkspaceProvider(${this.getWorkspacesQuery}): Not visible, ignoring refresh request`)
6169
return
6270
}
71+
72+
logger.info(`WorkspaceProvider(${this.getWorkspacesQuery}): Starting workspace fetch`)
6373
this.fetching = true
74+
let fetchStart = Date.now()
6475

6576
// It is possible we called fetchAndRefresh() manually (through the button
6677
// for example), in which case we might still have a pending refresh that
@@ -70,12 +81,17 @@ export class WorkspaceProvider implements vscode.TreeDataProvider<vscode.TreeIte
7081
let hadError = false
7182
try {
7283
this.workspaces = await this.fetch()
84+
logger.info(
85+
`WorkspaceProvider(${this.getWorkspacesQuery}): Fetch completed in ${Date.now() - fetchStart}ms, found ${this.workspaces.length} workspaces`,
86+
)
7387
} catch (error) {
7488
hadError = true
89+
logger.error(`WorkspaceProvider(${this.getWorkspacesQuery}): Fetch failed`, error)
7590
this.workspaces = []
7691
}
7792

7893
this.fetching = false
94+
logger.logMemoryUsage("WORKSPACE_PROVIDER_FETCH")
7995

8096
this.refresh()
8197

@@ -158,45 +174,83 @@ export class WorkspaceProvider implements vscode.TreeDataProvider<vscode.TreeIte
158174
* If we have never fetched workspaces and are visible, fetch immediately.
159175
*/
160176
setVisibility(visible: boolean) {
177+
const logger = getMemoryLogger()
178+
179+
if (this.visible !== visible) {
180+
logger.info(`WorkspaceProvider(${this.getWorkspacesQuery}): Visibility changed to ${visible}`)
181+
}
182+
161183
this.visible = visible
184+
162185
if (!visible) {
163186
this.cancelPendingRefresh()
164187
} else if (!this.workspaces) {
188+
logger.info(`WorkspaceProvider(${this.getWorkspacesQuery}): Initial fetch required`)
165189
this.fetchAndRefresh()
166190
} else {
167191
this.maybeScheduleRefresh()
168192
}
169193
}
170194

171195
private cancelPendingRefresh() {
196+
const logger = getMemoryLogger()
197+
172198
if (this.timeout) {
199+
logger.debug(`WorkspaceProvider(${this.getWorkspacesQuery}): Canceling pending refresh`)
173200
clearTimeout(this.timeout)
174201
this.timeout = undefined
175202
}
176203
}
177-
178204
/**
179205
* Schedule a refresh if one is not already scheduled or underway and a
180206
* timeout length was provided.
181207
*/
182208
private maybeScheduleRefresh() {
209+
const logger = getMemoryLogger()
210+
183211
if (this.timerSeconds && !this.timeout && !this.fetching) {
212+
logger.debug(`WorkspaceProvider(${this.getWorkspacesQuery}): Scheduling refresh in ${this.timerSeconds} seconds`)
213+
184214
this.timeout = setTimeout(() => {
215+
logger.debug(`WorkspaceProvider(${this.getWorkspacesQuery}): Executing scheduled refresh`)
185216
this.fetchAndRefresh()
186217
}, this.timerSeconds * 1000)
187218
}
188219
}
189-
190220
private _onDidChangeTreeData: vscode.EventEmitter<vscode.TreeItem | undefined | null | void> =
191221
new vscode.EventEmitter<vscode.TreeItem | undefined | null | void>()
192222
readonly onDidChangeTreeData: vscode.Event<vscode.TreeItem | undefined | null | void> =
193223
this._onDidChangeTreeData.event
194224

195225
// refresh causes the tree to re-render. It does not fetch fresh workspaces.
196226
refresh(item: vscode.TreeItem | undefined | null | void): void {
227+
const logger = getMemoryLogger()
228+
logger.debug(
229+
`WorkspaceProvider(${this.getWorkspacesQuery}): Refreshing tree view${item ? " for specific item" : ""}`,
230+
)
231+
197232
this._onDidChangeTreeData.fire(item)
198233
}
199234

235+
dispose(): void {
236+
const logger = getMemoryLogger()
237+
logger.info(`WorkspaceProvider(${this.getWorkspacesQuery}): Disposing`)
238+
239+
// Cancel any pending refreshes
240+
this.cancelPendingRefresh()
241+
242+
// Dispose all watchers
243+
Object.keys(this.agentWatchers).forEach((id) => {
244+
logger.debug(`WorkspaceProvider(${this.getWorkspacesQuery}): Disposing agent watcher ${id}`)
245+
this.agentWatchers[id].dispose()
246+
})
247+
248+
this.agentWatchers = {}
249+
this.workspaces = undefined
250+
251+
logger.logMemoryUsage("WORKSPACE_PROVIDER_DISPOSE")
252+
}
253+
200254
async getTreeItem(element: vscode.TreeItem): Promise<vscode.TreeItem> {
201255
return element
202256
}

0 commit comments

Comments
 (0)