@@ -145,20 +145,12 @@ async def _forward_if_not_ready_to_serve(self, request: HTTPRequest, content_typ
145145 pass
146146 else :
147147 # Not ready, still loading the state.
148- # Needs only the master_url
149- _ , master_url = await self .schema_registry .get_master (ignore_readiness = True )
148+ primary_info = await self .schema_registry .get_master ()
150149 returned_content_type = request .get_header ("Content-Type" ) if content_type is None else content_type
151- if not master_url :
150+ if not primary_info . primary_url :
152151 self .no_master_error (request .content_type )
153- elif f"{ self .config ['advertised_hostname' ]} :{ self .config ['advertised_port' ]} " in master_url :
154- # If master url is the same as the url of this Karapace respond 503.
155- self .r (
156- body = "" ,
157- content_type = returned_content_type ,
158- status = HTTPStatus .SERVICE_UNAVAILABLE ,
159- )
160152 else :
161- url = f"{ master_url } { request .url .path } "
153+ url = f"{ primary_info . primary_url } { request .url .path } "
162154 await self ._forward_request_remote (
163155 request = request ,
164156 body = request .json ,
@@ -574,13 +566,13 @@ async def config_set(self, content_type: str, *, request: HTTPRequest, user: Use
574566 status = HTTPStatus .UNPROCESSABLE_ENTITY ,
575567 )
576568
577- are_we_master , master_url = await self .schema_registry .get_master ()
578- if are_we_master :
569+ primary_info = await self .schema_registry .get_master ()
570+ if primary_info . primary :
579571 self .schema_registry .send_config_message (compatibility_level = compatibility_level , subject = None )
580- elif not master_url :
572+ elif not primary_info . primary_url :
581573 self .no_master_error (content_type )
582574 else :
583- url = f"{ master_url } /config"
575+ url = f"{ primary_info . primary_url } /config"
584576 await self ._forward_request_remote (request = request , body = body , url = url , content_type = content_type , method = "PUT" )
585577
586578 self .r ({"compatibility" : self .schema_registry .schema_reader .config ["compatibility" ]}, content_type )
@@ -645,13 +637,13 @@ async def config_subject_set(
645637 status = HTTPStatus .UNPROCESSABLE_ENTITY ,
646638 )
647639
648- are_we_master , master_url = await self .schema_registry .get_master ()
649- if are_we_master :
640+ primary_info = await self .schema_registry .get_master ()
641+ if primary_info . primary :
650642 self .schema_registry .send_config_message (compatibility_level = compatibility_level , subject = subject )
651- elif not master_url :
643+ elif not primary_info . primary_url :
652644 self .no_master_error (content_type )
653645 else :
654- url = f"{ master_url } /config/{ subject } "
646+ url = f"{ primary_info . primary_url } /config/{ subject } "
655647 await self ._forward_request_remote (
656648 request = request , body = request .json , url = url , content_type = content_type , method = "PUT"
657649 )
@@ -670,13 +662,13 @@ async def config_subject_delete(
670662 if not self ._auth .check_authorization (user , Operation .Write , f"Subject:{ subject } " ):
671663 self .r (body = {"message" : "Forbidden" }, content_type = JSON_CONTENT_TYPE , status = HTTPStatus .FORBIDDEN )
672664
673- are_we_master , master_url = await self .schema_registry .get_master ()
674- if are_we_master :
665+ primary_info = await self .schema_registry .get_master ()
666+ if primary_info . primary :
675667 self .schema_registry .send_config_subject_delete_message (subject = subject )
676- elif not master_url :
668+ elif not primary_info . primary_url :
677669 self .no_master_error (content_type )
678670 else :
679- url = f"{ master_url } /config/{ subject } "
671+ url = f"{ primary_info . primary_url } /config/{ subject } "
680672 await self ._forward_request_remote (
681673 request = request , body = request .json , url = url , content_type = content_type , method = "PUT"
682674 )
@@ -685,21 +677,24 @@ async def config_subject_delete(
685677
686678 async def master_available (self , * , request : HTTPRequest ) -> None :
687679 no_cache_header = {"Cache-Control" : "no-store, no-cache, must-revalidate" }
688- are_we_master , master_url = await self .schema_registry .get_master ()
689- self .log .info ("are master %s, master url %s" , are_we_master , master_url )
680+ primary_info = await self .schema_registry .get_master ()
681+ self .log .info ("are master %s, master url %s" , primary_info . primary , primary_info . primary_url )
690682
691683 if (
692684 self .schema_registry .schema_reader .master_coordinator ._sc is not None # pylint: disable=protected-access
693685 and self .schema_registry .schema_reader .master_coordinator ._sc .is_master_assigned_to_myself () # pylint: disable=protected-access
694686 ):
695687 raise HTTPResponse (
696- body = {"master_available" : are_we_master },
688+ body = {"master_available" : primary_info . primary },
697689 status = HTTPStatus .OK ,
698690 content_type = JSON_CONTENT_TYPE ,
699691 headers = no_cache_header ,
700692 )
701693
702- if master_url is None or f"{ self .config ['advertised_hostname' ]} :{ self .config ['advertised_port' ]} " in master_url :
694+ if (
695+ primary_info .primary_url is None
696+ or f"{ self .config ['advertised_hostname' ]} :{ self .config ['advertised_port' ]} " in primary_info .primary_url
697+ ):
703698 raise HTTPResponse (
704699 body = {"master_available" : False },
705700 status = HTTPStatus .OK ,
@@ -708,7 +703,11 @@ async def master_available(self, *, request: HTTPRequest) -> None:
708703 )
709704
710705 await self ._forward_request_remote (
711- request = request , body = {}, url = f"{ master_url } /master_available" , content_type = JSON_CONTENT_TYPE , method = "GET"
706+ request = request ,
707+ body = {},
708+ url = f"{ primary_info .primary_url } /master_available" ,
709+ content_type = JSON_CONTENT_TYPE ,
710+ method = "GET" ,
712711 )
713712
714713 async def subjects_list (self , content_type : str , * , request : HTTPRequest , user : User | None = None ) -> None :
@@ -730,8 +729,8 @@ async def subject_delete(
730729
731730 permanent = request .query .get ("permanent" , "false" ).lower () == "true"
732731
733- are_we_master , master_url = await self .schema_registry .get_master ()
734- if are_we_master :
732+ primary_info = await self .schema_registry .get_master ()
733+ if primary_info . primary :
735734 try :
736735 version_list = await self .schema_registry .subject_delete_local (subject = subject , permanent = permanent )
737736 self .r ([version .value for version in version_list ], content_type , status = HTTPStatus .OK )
@@ -775,10 +774,10 @@ async def subject_delete(
775774 content_type = content_type ,
776775 status = HTTPStatus .UNPROCESSABLE_ENTITY ,
777776 )
778- elif not master_url :
777+ elif not primary_info . primary_url :
779778 self .no_master_error (content_type )
780779 else :
781- url = f"{ master_url } /subjects/{ subject } ?permanent={ permanent } "
780+ url = f"{ primary_info . primary_url } /subjects/{ subject } ?permanent={ permanent } "
782781 await self ._forward_request_remote (request = request , body = {}, url = url , content_type = content_type , method = "DELETE" )
783782
784783 async def subject_version_get (
@@ -819,8 +818,8 @@ async def subject_version_delete(
819818 self ._check_authorization (user , Operation .Write , f"Subject:{ subject } " )
820819 permanent = request .query .get ("permanent" , "false" ).lower () == "true"
821820
822- are_we_master , master_url = await self .schema_registry .get_master ()
823- if are_we_master :
821+ primary_info = await self .schema_registry .get_master ()
822+ if primary_info . primary :
824823 try :
825824 resolved_version = await self .schema_registry .subject_version_delete_local (
826825 subject , Versioner .V (version ), permanent
@@ -882,10 +881,10 @@ async def subject_version_delete(
882881 )
883882 except InvalidVersion :
884883 self ._invalid_version (content_type , version )
885- elif not master_url :
884+ elif not primary_info . primary_url :
886885 self .no_master_error (content_type )
887886 else :
888- url = f"{ master_url } /subjects/{ subject } /versions/{ version } ?permanent={ permanent } "
887+ url = f"{ primary_info . primary_url } /subjects/{ subject } /versions/{ version } ?permanent={ permanent } "
889888 await self ._forward_request_remote (request = request , body = {}, url = url , content_type = content_type , method = "DELETE" )
890889
891890 async def subject_version_schema_get (
@@ -1241,8 +1240,8 @@ async def subject_post(
12411240 if schema_id is not None :
12421241 self .r ({"id" : schema_id }, content_type )
12431242
1244- are_we_master , master_url = await self .schema_registry .get_master ()
1245- if are_we_master :
1243+ primary_info = await self .schema_registry .get_master ()
1244+ if primary_info . primary :
12461245 try :
12471246 schema_id = await self .schema_registry .write_new_schema_local (subject , new_schema , references )
12481247 self .r (
@@ -1279,10 +1278,10 @@ async def subject_post(
12791278 except Exception as xx :
12801279 raise xx
12811280
1282- elif not master_url :
1281+ elif not primary_info . primary_url :
12831282 self .no_master_error (content_type )
12841283 else :
1285- url = f"{ master_url } /subjects/{ subject } /versions"
1284+ url = f"{ primary_info . primary_url } /subjects/{ subject } /versions"
12861285 await self ._forward_request_remote (request = request , body = body , url = url , content_type = content_type , method = "POST" )
12871286
12881287 async def get_global_mode (
0 commit comments