@@ -61,10 +61,13 @@ def find_desirable_secondary(self):
6161 'host' : member ['name' ],
6262 'optime' : member ['optimeDate' ]
6363 }
64+ optime = member ['optime' ]
65+ if 'ts' in member ['optime' ]:
66+ optime = member ['optime' ]['ts' ]
6467 logging .debug ("Found PRIMARY: %s/%s with optime %s" % (
6568 rs_name ,
6669 member ['name' ],
67- str (member [ ' optime' ][ 'ts' ] )
70+ str (optime )
6871 ))
6972 if primary is None :
7073 logging .fatal ("Unable to locate a PRIMARY member for replset %s, giving up" % rs_name )
@@ -73,22 +76,24 @@ def find_desirable_secondary(self):
7376 secondary = None
7477 for member in rs_status ['members' ]:
7578 if member ['stateStr' ] == 'SECONDARY' and member ['health' ] > 0 :
76- log_data = {}
77- score = 100
79+ score = self .max_lag_secs * 10
80+ score_scale = 100 / score
81+ log_data = {}
7882
83+ hidden_weight = 0.20
7984 for member_config in rs_config ['config' ]['members' ]:
8085 if member_config ['host' ] == member ['name' ]:
8186 if 'hidden' in member_config and member_config ['hidden' ] == True :
82- score += 20
87+ score += ( score * hidden_weight )
8388 log_data ['hidden' ] = True
8489 if 'priority' in member_config :
8590 log_data ['priority' ] = int (member_config ['priority' ])
86- if member_config ['priority' ] > 1 :
91+ if member_config ['priority' ] > 0 :
8792 score = score - member_config ['priority' ]
8893 break
8994
9095 rep_lag = (mktime (primary ['optime' ].timetuple ()) - mktime (member ['optimeDate' ].timetuple ()))
91- score = score - rep_lag
96+ score = ceil (( score - rep_lag ) * score_scale )
9297 if rep_lag < self .max_lag_secs :
9398 if secondary is None or score > secondary ['score' ]:
9499 secondary = {
@@ -102,7 +107,9 @@ def find_desirable_secondary(self):
102107 else :
103108 log_msg = "Found SECONDARY %s/%s with too-high replication lag! Skipping" % (rs_name , member ['name' ])
104109
105- log_data ['optime' ] = member ['optime' ]['ts' ]
110+ log_data ['optime' ] = member ['optime' ]
111+ if 'ts' in member ['optime' ]:
112+ log_data ['optime' ] = member ['optime' ]['ts' ]
106113 log_data ['score' ] = int (score )
107114 logging .debug ("%s: %s" % (log_msg , str (log_data )))
108115 if secondary is None or (secondary ['count' ] + 1 ) < quorum_count :
0 commit comments