@@ -506,19 +506,27 @@ async def upgrade_pending(self) -> bool:
506506 self .log .debug ('- No update found for DCSServerBot.' )
507507 return rc
508508
509- async def upgrade (self ):
509+ async def _upgrade (self , conn : psycopg . AsyncConnection ):
510510 # We do not want to run an upgrade, if we are on a cloud drive, so just restart in this case
511511 if not self .master and self .locals .get ('cloud_drive' , True ):
512512 await self .restart ()
513- return
514513 elif await self .upgrade_pending ():
515514 if self .master :
516- async with self .cpool .connection () as conn :
517- async with conn .transaction ():
518- await conn .execute ("""
519- UPDATE cluster SET update_pending = TRUE WHERE guild_id = %s
520- """ , (self .guild_id , ))
515+ await conn .execute ("""
516+ UPDATE cluster SET update_pending = TRUE WHERE guild_id = %s
517+ """ , (self .guild_id , ))
521518 await self .shutdown (UPDATE )
519+ elif self .master :
520+ await conn .execute ("""
521+ UPDATE cluster
522+ SET update_pending = FALSE, version = %s
523+ WHERE guild_id = %s
524+ """ , (__version__ , self .guild_id ))
525+
526+ async def upgrade (self ):
527+ async with self .cpool .connection () as conn :
528+ async with conn .transaction ():
529+ await self ._upgrade (conn )
522530
523531 async def get_dcs_branch_and_version (self ) -> tuple [str , str ]:
524532 if not self .dcs_branch or not self .dcs_version :
@@ -858,8 +866,18 @@ async def check_nodes():
858866 if update_pending :
859867 return await handle_upgrade (master )
860868 elif parse (version ) > parse (__version__ ):
861- await self .upgrade ()
862- return False
869+ # avoid update loops if we are the master
870+ if master == self .name :
871+ self .master = True
872+ self .log .warning ("We are the master, but the cluster seems to have a newer version.\n "
873+ "Rolling back the cluser version to my version." )
874+ await self ._upgrade (conn )
875+ elif parse (version ) < parse (__version__ ):
876+ if master != self .name :
877+ raise FatalException (f"This node uses DCSServerBot version { __version__ } "
878+ f"where the master uses version { version } !" )
879+ self .master = True
880+ await self ._upgrade (conn )
863881
864882 # I am the master
865883 if master == self .name :
@@ -885,6 +903,9 @@ async def check_nodes():
885903 current_stats = self .cpool .get_stats ()
886904 self .log .warning (f"Pool stats: { repr (current_stats )} " )
887905 raise
906+ except FatalException as ex :
907+ self .log .critical (ex )
908+ exit (SHUTDOWN )
888909 except Exception as ex :
889910 self .log .exception (ex )
890911 raise
0 commit comments