@@ -8,8 +8,6 @@ import { DBWithTracing, TracedWorkspaceDB, WorkspaceDB } from '@gitpod/gitpod-db
8
8
import { CommitContext , Project , ProjectEnvVar , StartPrebuildContext , StartPrebuildResult , TaskConfig , User , WorkspaceConfig , WorkspaceInstance } from '@gitpod/gitpod-protocol' ;
9
9
import { log } from '@gitpod/gitpod-protocol/lib/util/logging' ;
10
10
import { TraceContext } from '@gitpod/gitpod-protocol/lib/util/tracing' ;
11
- import { inject , injectable } from 'inversify' ;
12
- import { URL } from 'url' ;
13
11
import { HostContextProvider } from '../../../src/auth/host-context-provider' ;
14
12
import { WorkspaceFactory } from '../../../src/workspace/workspace-factory' ;
15
13
import { ConfigProvider } from '../../../src/workspace/config-provider' ;
@@ -18,6 +16,10 @@ import { Config } from '../../../src/config';
18
16
import { ProjectsService } from '../../../src/projects/projects-service' ;
19
17
import { secondsBefore } from '@gitpod/gitpod-protocol/lib/util/timeutil' ;
20
18
19
+ import { inject , injectable } from 'inversify' ;
20
+ import * as opentracing from 'opentracing' ;
21
+ import { URL } from 'url' ;
22
+
21
23
export class WorkspaceRunningError extends Error {
22
24
constructor ( msg : string , public instance : WorkspaceInstance ) {
23
25
super ( msg ) ;
@@ -116,33 +118,32 @@ export class PrebuildManager {
116
118
prebuildContext . commitHistory = await contextParser . fetchCommitHistory ( { span } , user , contextURL , commit , maxDepth ) ;
117
119
}
118
120
119
- const now = new Date ( )
120
- const runningCount = await this . workspaceDB . trace ( { span} ) . countUnabortedPrebuildsSince ( cloneURL , new Date ( secondsBefore ( now . toISOString ( ) , 300 ) ) )
121
- log . info ( "Created prebuild context with running count" , prebuildContext , runningCount ) ;
122
- if ( runningCount > 10 ) {
123
- log . info ( "Would rate limit prebuild for " , cloneURL )
124
- await this . workspaceFactory . createAbortedWorkspace ( { span} , user , prebuildContext , contextURL )
125
- const id = await this . generateWorkspaceID ( context ) ;
126
-
127
- await this . db . trace ( { span} ) . store ( newWs ) ;
128
121
129
- }
130
122
131
123
const projectEnvVarsPromise = project ? this . projectService . getProjectEnvironmentVariables ( project . id ) : [ ] ;
132
124
const workspace = await this . workspaceFactory . createForContext ( { span} , user , prebuildContext , contextURL ) ;
133
- const prebuildPromise = this . workspaceDB . trace ( { span} ) . findPrebuildByWorkspaceID ( workspace . id ) ! ;
125
+ const prebuild = await this . workspaceDB . trace ( { span} ) . findPrebuildByWorkspaceID ( workspace . id ) ! ;
126
+ if ( ! prebuild ) {
127
+ throw new Error ( `Failed to create a prebuild for: ${ contextURL } ` ) ;
128
+ }
134
129
135
- // const canBuildNow = await this.prebuildRateLimiter.canBuildNow({ span }, user, cloneURL);
136
- // if (!canBuildNow) {
137
- // // we cannot start building now because the rate limiter prevents it.
138
- // span.setTag("starting", false);
139
- // return { wsid: workspace.id, done: false };;
140
- // }
130
+ if ( await this . shouldRateLimitPrebuild ( span , cloneURL ) ) {
131
+ prebuild . state = "aborted" ;
132
+ prebuild . error = "Prebuild is rate limited. Please contact Gitpod if you believe this happened in error." ;
133
+
134
+ await this . workspaceDB . trace ( { span } ) . storePrebuiltWorkspace ( prebuild )
135
+ span . setTag ( "starting" , false ) ;
136
+ span . setTag ( "ratelimited" , true )
137
+ return {
138
+ wsid : workspace . id ,
139
+ prebuildId : prebuild . id ,
140
+ done : false ,
141
+ }
142
+ }
141
143
142
144
span . setTag ( "starting" , true ) ;
143
145
const projectEnvVars = await projectEnvVarsPromise ;
144
146
await this . workspaceStarter . startWorkspace ( { span } , workspace , user , [ ] , projectEnvVars , { excludeFeatureFlags : [ 'full_workspace_backup' ] } ) ;
145
- const prebuild = await prebuildPromise ;
146
147
if ( ! prebuild ) {
147
148
throw new Error ( `Failed to create a prebuild for: ${ contextURL } ` ) ;
148
149
}
@@ -241,4 +242,10 @@ export class PrebuildManager {
241
242
}
242
243
return hostContext . contextParser ;
243
244
}
245
+
246
+ private async shouldRateLimitPrebuild ( span : opentracing . Span , cloneURL : string ) : Promise < boolean > {
247
+ const now = new Date ( )
248
+ const runningCount = await this . workspaceDB . trace ( { span} ) . countUnabortedPrebuildsSince ( cloneURL , new Date ( secondsBefore ( now . toISOString ( ) , 300 ) ) )
249
+ return runningCount > 10
250
+ }
244
251
}
0 commit comments