@@ -321,9 +321,11 @@ export class DedicatedServersService {
321321 } ,
322322 } ) ;
323323
324- this . logger . verbose ( `[${ serverId } ] create service for dedicated server` ) ;
325-
326324 if ( ! steamRelay ) {
325+ this . logger . verbose (
326+ `[${ serverId } ] create service for dedicated server` ,
327+ ) ;
328+
327329 await this . core . createNamespacedService ( {
328330 namespace : this . namespace ,
329331 body : {
@@ -377,16 +379,27 @@ export class DedicatedServersService {
377379 __args : {
378380 pk_columns : { id : serverId } ,
379381 _set : {
380- connected : true ,
382+ connected : false ,
383+ steam_relay : null ,
381384 } ,
382385 } ,
383386 id : true ,
384387 } ,
385388 } ) ;
386389
387- setTimeout ( ( ) => {
388- this . pingDedicatedServer ( serverId ) ;
389- } , 10000 ) ;
390+ void this . waitForPodReady ( serverId )
391+ . then ( ( ) => {
392+ setTimeout ( async ( ) => {
393+ this . logger . verbose ( `[${ serverId } ] dedicated server is ready` ) ;
394+ await this . pingDedicatedServer ( serverId ) ;
395+ } , 10000 ) ;
396+ } )
397+ . catch ( ( error ) => {
398+ this . logger . error (
399+ `[${ serverId } ] error waiting for pod to be ready` ,
400+ error ,
401+ ) ;
402+ } ) ;
390403
391404 return true ;
392405 } catch ( error ) {
@@ -491,6 +504,7 @@ export class DedicatedServersService {
491504 servers_by_pk : {
492505 __args : { id : serverId } ,
493506 connected : true ,
507+ steam_relay : true ,
494508 server_region : {
495509 steam_relay : true ,
496510 } ,
@@ -513,7 +527,8 @@ export class DedicatedServersService {
513527 let steamId = null ;
514528 const status = JSON . parse ( await rcon . send ( "status_json" ) ) ;
515529
516- if ( server . server_region ?. steam_relay ) {
530+ const steamRelayeEnabled = server . server_region ?. steam_relay ;
531+ if ( steamRelayeEnabled ) {
517532 steamId = status . server . steamid ;
518533 }
519534
@@ -529,19 +544,15 @@ export class DedicatedServersService {
529544
530545 await this . redis . expire ( "dedicated-servers:stats" , 120 ) ;
531546
532- const { servers_by_pk : currentServer } = await this . hasura . query ( {
533- servers_by_pk : {
534- __args : { id : serverId } ,
535- steam_relay : true ,
536- } ,
537- } ) ;
538-
539- if ( currentServer . steam_relay !== steamId ) {
547+ if ( server . steam_relay !== steamId ) {
540548 await this . hasura . mutation ( {
541549 update_servers_by_pk : {
542550 __args : {
543551 pk_columns : { id : serverId } ,
544- _set : { steam_relay : steamId } ,
552+ _set : {
553+ steam_relay : steamId ,
554+ connected : ! steamRelayeEnabled || steamId !== null ,
555+ } ,
545556 } ,
546557 id : true ,
547558 } ,
@@ -606,4 +617,61 @@ export class DedicatedServersService {
606617 private getDedicatedServerDeploymentName ( serverId : string ) : string {
607618 return `dedicated-server-${ serverId } ` ;
608619 }
620+
621+ private async waitForPodReady (
622+ serverId : string ,
623+ maxWaitTime : number = 60 * 1000 ,
624+ ) : Promise < void > {
625+ const deploymentName = this . getDedicatedServerDeploymentName ( serverId ) ;
626+ const startTime = Date . now ( ) ;
627+
628+ this . logger . log ( `[${ serverId } ] waiting for pod to be ready` ) ;
629+
630+ return new Promise ( ( resolve , reject ) => {
631+ const checkPodStatus = async ( ) => {
632+ try {
633+ const deployment = await this . apps . readNamespacedDeployment ( {
634+ name : deploymentName ,
635+ namespace : this . namespace ,
636+ } ) ;
637+
638+ const readyReplicas = deployment . status ?. readyReplicas || 0 ;
639+ const desiredReplicas = deployment . spec ?. replicas || 1 ;
640+
641+ if ( readyReplicas >= desiredReplicas ) {
642+ resolve ( ) ;
643+ return ;
644+ }
645+
646+ if ( Date . now ( ) - startTime >= maxWaitTime ) {
647+ reject (
648+ new Error (
649+ `[${ serverId } ] timeout waiting for pod to be ready after ${ maxWaitTime } ms` ,
650+ ) ,
651+ ) ;
652+ return ;
653+ }
654+
655+ setTimeout ( checkPodStatus , 5000 ) ;
656+ } catch ( error ) {
657+ this . logger . warn (
658+ `[${ serverId } ] error checking pod status: ${ error . message } ` ,
659+ ) ;
660+
661+ if ( Date . now ( ) - startTime >= maxWaitTime ) {
662+ reject (
663+ new Error (
664+ `[${ serverId } ] timeout waiting for pod to be ready after ${ maxWaitTime } ms` ,
665+ ) ,
666+ ) ;
667+ return ;
668+ }
669+
670+ setTimeout ( checkPodStatus , 5000 ) ;
671+ }
672+ } ;
673+
674+ checkPodStatus ( ) ;
675+ } ) ;
676+ }
609677}
0 commit comments