-
Notifications
You must be signed in to change notification settings - Fork 83
feat: launch one remote workspace for all workspace folders #1348
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 9 commits
9b620ad
092ccfe
9f9903b
5f4ee34
ae301e2
0fa8696
6e56dee
1e9e12d
d12b158
64dad74
97c7b30
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -26,21 +26,23 @@ export abstract class LanguageDependencyHandler<T extends BaseDependencyInfo> { | |
| protected workspaceFolders: WorkspaceFolder[] | ||
| // key: workspaceFolder, value: {key: dependency name, value: Dependency} | ||
| protected dependencyMap = new Map<WorkspaceFolder, Map<string, Dependency>>() | ||
| protected dependencyUploadedSize = new Map<WorkspaceFolder, number>() | ||
| protected dependencyUploadedSizeMap = new Map<WorkspaceFolder, number>() | ||
| protected dependencyUploadedSizeSum: Uint32Array<SharedArrayBuffer> | ||
| protected dependencyWatchers: Map<string, fs.FSWatcher> = new Map<string, fs.FSWatcher>() | ||
| protected artifactManager: ArtifactManager | ||
| protected dependenciesFolderName: string | ||
| protected eventEmitter: EventEmitter | ||
| protected readonly MAX_SINGLE_DEPENDENCY_SIZE: number = 500 * 1024 * 1024 // 500 MB | ||
| protected readonly MAX_WORKSPACE_DEPENDENCY_SIZE: number = 5 * 1024 * 1024 * 1024 //5 GB | ||
| protected readonly MAX_WORKSPACE_DEPENDENCY_SIZE: number = 8 * 1024 * 1024 * 1024 // 8 GB | ||
|
|
||
| constructor( | ||
| language: CodewhispererLanguage, | ||
| workspace: Workspace, | ||
| logging: Logging, | ||
| workspaceFolders: WorkspaceFolder[], | ||
| artifactManager: ArtifactManager, | ||
| dependenciesFolderName: string | ||
| dependenciesFolderName: string, | ||
| dependencyUploadedSizeSum: Uint32Array<SharedArrayBuffer> | ||
| ) { | ||
| this.language = language | ||
| this.workspace = workspace | ||
|
|
@@ -54,7 +56,7 @@ export abstract class LanguageDependencyHandler<T extends BaseDependencyInfo> { | |
| this.workspaceFolders.forEach(workSpaceFolder => | ||
| this.dependencyMap.set(workSpaceFolder, new Map<string, Dependency>()) | ||
| ) | ||
|
|
||
| this.dependencyUploadedSizeSum = dependencyUploadedSizeSum | ||
| this.eventEmitter = new EventEmitter() | ||
| } | ||
|
|
||
|
|
@@ -85,14 +87,18 @@ export abstract class LanguageDependencyHandler<T extends BaseDependencyInfo> { | |
| dependencyMap: Map<string, Dependency> | ||
| ): void | ||
|
|
||
| public onDependencyChange(callback: (workspaceFolder: WorkspaceFolder, zips: FileMetadata[]) => void): void { | ||
| public onDependencyChange( | ||
| callback: (workspaceFolder: WorkspaceFolder, zips: FileMetadata[], addWSFolderPathInS3: boolean) => void | ||
| ): void { | ||
| this.eventEmitter.on('dependencyChange', callback) | ||
| } | ||
|
|
||
| protected emitDependencyChange(workspaceFolder: WorkspaceFolder, zips: FileMetadata[]): void { | ||
| if (zips.length > 0) { | ||
| this.logging.log(`Emitting ${this.language} dependency change event for ${workspaceFolder.name}`) | ||
| this.eventEmitter.emit('dependencyChange', workspaceFolder, zips) | ||
| // If language is JavaScript or TypeScript, we want to preserve the workspaceFolder path in S3 path | ||
| const addWSFolderPathInS3 = this.language === 'javascript' || this.language === 'typescript' | ||
| this.eventEmitter.emit('dependencyChange', workspaceFolder, zips, addWSFolderPathInS3) | ||
| return | ||
| } | ||
| } | ||
|
|
@@ -170,10 +176,11 @@ export abstract class LanguageDependencyHandler<T extends BaseDependencyInfo> { | |
| } | ||
| currentChunk.push(dependency) | ||
| currentChunkSize += dependency.size | ||
| this.dependencyUploadedSize.set( | ||
| this.dependencyUploadedSizeMap.set( | ||
| workspaceFolder, | ||
| (this.dependencyUploadedSize.get(workspaceFolder) || 0) + dependency.size | ||
| (this.dependencyUploadedSizeMap.get(workspaceFolder) || 0) + dependency.size | ||
| ) | ||
| Atomics.add(this.dependencyUploadedSizeSum, 0, dependency.size) | ||
| // Mark this dependency that has been zipped | ||
| dependency.zipped = true | ||
| this.dependencyMap.get(workspaceFolder)?.set(dependency.name, dependency) | ||
|
|
@@ -299,7 +306,7 @@ export abstract class LanguageDependencyHandler<T extends BaseDependencyInfo> { | |
| * However, everytime flare server restarts, this dependency map will be initialized. | ||
| */ | ||
| private validateWorkspaceDependencySize(workspaceFolder: WorkspaceFolder): boolean { | ||
| let uploadedSize = this.dependencyUploadedSize.get(workspaceFolder) | ||
| let uploadedSize = Atomics.load(this.dependencyUploadedSizeSum, 0) | ||
| if (uploadedSize && this.MAX_WORKSPACE_DEPENDENCY_SIZE < uploadedSize) { | ||
| return false | ||
| } | ||
|
|
@@ -308,14 +315,16 @@ export abstract class LanguageDependencyHandler<T extends BaseDependencyInfo> { | |
|
|
||
| dispose(): void { | ||
| this.dependencyMap.clear() | ||
| this.dependencyUploadedSize.clear() | ||
| Atomics.store(this.dependencyUploadedSizeSum, 0, 0) | ||
|
||
| this.dependencyUploadedSizeMap.clear() | ||
| this.dependencyWatchers.forEach(watcher => watcher.close()) | ||
| this.dependencyWatchers.clear() | ||
| } | ||
|
|
||
| disposeWorkspaceFolder(workspaceFolder: WorkspaceFolder): void { | ||
| this.dependencyMap.delete(workspaceFolder) | ||
| this.dependencyUploadedSize.delete(workspaceFolder) | ||
| Atomics.sub(this.dependencyUploadedSizeSum, 0, this.dependencyUploadedSizeMap.get(workspaceFolder) || 0) | ||
| this.dependencyUploadedSizeMap.delete(workspaceFolder) | ||
| this.disposeWatchers(workspaceFolder) | ||
| this.disposeDependencyInfo(workspaceFolder) | ||
| } | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just for posterity, I believe we don't need to go with this approach since we are not using any workers or threads in the code and everything is single threaded at the moment
a simple data type like the following would also work here
The current approach is still fine and I am not suggesting we change it.