1- use anyhow:: Result ;
1+ use anyhow:: { Result , anyhow} ;
2+ use pyo3:: Python ;
3+ use pyo3:: types:: PyAnyMethods ;
24use std:: sync:: Arc ;
35use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
46use std:: time:: Duration ;
@@ -18,6 +20,11 @@ pub async fn run_worker(
1820 queue_name : String ,
1921 save_dead_tasks : bool ,
2022) -> Result < ( ) > {
23+ check_client_library_version ( ) . map_err ( |e| {
24+ tracing:: error!( "{}" , e) ;
25+ std:: process:: exit ( 1 ) ;
26+ } ) ?;
27+
2128 let redis_client = RedisClient :: new ( & redis_url) . await . map_err ( |e| {
2229 tracing:: error!( "{}" , e) ;
2330 std:: process:: exit ( 1 ) ;
@@ -331,6 +338,53 @@ fn check_worker_is_ready(ready_check: ReadyCheck) {
331338 }
332339}
333340
341+ fn check_client_library_version ( ) -> Result < ( ) > {
342+ let worker_version = env ! ( "CARGO_PKG_VERSION" ) ;
343+ let library_version = Python :: attach ( |py| -> Result < String > {
344+ let module = py. import ( "fluxqueue" ) ?;
345+ let version = module. getattr ( "__version__" ) ?;
346+ Ok ( version. to_string ( ) )
347+ } ) ?;
348+
349+ let comparison = compare_versions ( worker_version, & library_version) ;
350+ if comparison == -1 {
351+ tracing:: warn!(
352+ "Worker version '{}' is older than client library '{}'. For full functionality, update the worker to match the client version." ,
353+ worker_version,
354+ & library_version
355+ ) ;
356+ }
357+
358+ if comparison == 1 {
359+ return Err ( anyhow ! (
360+ "Minimum required client library version is: {}, found: {}" ,
361+ worker_version,
362+ & library_version
363+ ) ) ;
364+ }
365+
366+ Ok ( ( ) )
367+ }
368+
369+ fn compare_versions ( v1 : & str , v2 : & str ) -> i8 {
370+ let mut parts1: Vec < u32 > = v1. split ( '.' ) . map ( |p| p. parse ( ) . unwrap_or ( 0 ) ) . collect ( ) ;
371+ let mut parts2: Vec < u32 > = v2. split ( '.' ) . map ( |p| p. parse ( ) . unwrap_or ( 0 ) ) . collect ( ) ;
372+
373+ let len = parts1. len ( ) . max ( parts2. len ( ) ) ;
374+ parts1. resize ( len, 0 ) ;
375+ parts2. resize ( len, 0 ) ;
376+
377+ for ( a, b) in parts1. iter ( ) . zip ( parts2. iter ( ) ) {
378+ if a > b {
379+ return 1 ;
380+ }
381+ if a < b {
382+ return -1 ;
383+ }
384+ }
385+ 0
386+ }
387+
334388#[ cfg( test) ]
335389mod tests {
336390 use super :: * ;
0 commit comments