@@ -8,7 +8,7 @@ import { ExtensionServiceDefinition, ExtensionServiceImplementation, GetWorkspac
88import { Disposable } from '../../common/dispose' ;
99import { retry , timeout } from '../../common/async' ;
1010export { ExtensionServiceDefinition } from '../../proto/typescript/ipc/v1/ipc' ;
11- import { ensureDaemonStarted } from '../../daemonStarter' ;
11+ import { ensureDaemonStarted , killDaemon } from '../../daemonStarter' ;
1212import { withServerApi } from '../../internalApi' ;
1313import { Workspace , WorkspaceInstanceStatus_Phase } from '@gitpod/public-api/lib/gitpod/experimental/v1' ;
1414import { WorkspaceInfo , WorkspaceInstancePhase } from '@gitpod/gitpod-protocol' ;
@@ -22,6 +22,7 @@ import { getGitpodRemoteWindowConnectionInfo, showWsNotRunningDialog } from '../
2222import { ITelemetryService , UserFlowTelemetry } from '../../services/telemetryService' ;
2323import { ExperimentalSettings } from '../../experiments' ;
2424import { Configuration } from '../../configuration' ;
25+ import { SemVer } from 'semver' ;
2526
2627const phaseMap : Record < WorkspaceInstanceStatus_Phase , WorkspaceInstancePhase | undefined > = {
2728 [ WorkspaceInstanceStatus_Phase . CREATING ] : 'pending' ,
@@ -69,7 +70,7 @@ export class ExtensionServiceImpl implements ExtensionServiceImplementation {
6970 }
7071 const userId = this . sessionService . getUserId ( ) ;
7172 const workspaceId = request . workspaceId ;
72-
73+
7374 const gitpodHost = this . hostService . gitpodHost ;
7475 const usePublicApi = await this . experiments . getUsePublicAPI ( gitpodHost ) ;
7576 const [ workspace , ownerToken ] = await withServerApi ( accessToken , gitpodHost , svc => Promise . all ( [
@@ -171,6 +172,7 @@ export class ExtensionServiceServer extends Disposable {
171172 ) {
172173 super ( ) ;
173174 this . server = this . getServer ( ) ;
175+ this . tryForceKillZombieDaemon ( ) ;
174176 this . tryActive ( ) ;
175177 this . hostService . onDidChangeHost ( ( ) => {
176178 this . tryActive ( ) ;
@@ -259,4 +261,18 @@ export class ExtensionServiceServer extends Disposable {
259261 // this.logService.info('restart vscode to get latest features of local ssh');
260262 // // await this.notificationService.showWarningMessage('Restart VSCode to use latest local ssh daemon', { id: 'daemon_needs_restart', flow: { flow: 'daemon_needs_restart' } });
261263 // }
264+
265+ private async tryForceKillZombieDaemon ( ) {
266+ try {
267+ // force kill daemon if its version less than 0.0.3
268+ const resp = await this . localSSHServiceClient . getDaemonVersion ( { } ) ;
269+ const runningDaemonVersion = new SemVer ( resp . version ) ;
270+ if ( runningDaemonVersion . compare ( new SemVer ( '0.0.3' ) ) >= 0 ) {
271+ return ;
272+ }
273+ killDaemon ( this . logService ) ;
274+ } catch ( e ) {
275+ this . logService . error ( e , 'failed to force kill zombie daemon' ) ;
276+ }
277+ }
262278}
0 commit comments