@@ -36,10 +36,10 @@ def test_route_request_with_session_id():
36
36
request = Request (headers = {"session_id" : "abc123" })
37
37
38
38
router = SessionRouter (session_key = "session_id" )
39
- url = router .route_request (endpoints , None , request_stats , request )
39
+ url = router .route_request (endpoints , None , request_stats , request )[ 0 ]
40
40
41
41
# Ensure the same session ID always maps to the same endpoint
42
- assert url == router .route_request (endpoints , None , request_stats , request )
42
+ assert url == router .route_request (endpoints , None , request_stats , request )[ 0 ]
43
43
44
44
45
45
def test_route_request_without_session_id ():
@@ -57,7 +57,7 @@ def test_route_request_without_session_id():
57
57
request = Request (headers = {}) # No session ID
58
58
59
59
router = SessionRouter (session_key = "session_id" )
60
- url = router .route_request (endpoints , None , request_stats , request )
60
+ url = router .route_request (endpoints , None , request_stats , request )[ 0 ]
61
61
62
62
# Ensure the endpoint with the lowest QPS is selected
63
63
assert url == "http://engine2.com"
@@ -78,12 +78,12 @@ def test_route_request_with_dynamic_endpoints():
78
78
request = Request (headers = {"session_id" : "abc123" })
79
79
80
80
router = SessionRouter (session_key = "session_id" )
81
- url1 = router .route_request (endpoints , None , request_stats , request )
81
+ url1 = router .route_request (endpoints , None , request_stats , request )[ 0 ]
82
82
83
83
# Add a new endpoint
84
84
endpoints .append (EndpointInfo (url = "http://engine3.com" ))
85
85
request_stats ["http://engine3.com" ] = RequestStats (qps = 2 )
86
- url2 = router .route_request (endpoints , None , request_stats , request )
86
+ url2 = router .route_request (endpoints , None , request_stats , request )[ 0 ]
87
87
88
88
# Ensure the session ID is still mapped to a valid endpoint
89
89
assert url2 in [endpoint .url for endpoint in endpoints ]
@@ -110,7 +110,7 @@ def test_consistent_hashing_remove_node_multiple_sessions():
110
110
111
111
# Route with initial endpoints
112
112
urls_before = [
113
- router .route_request (endpoints , None , request_stats , req ) for req in requests
113
+ router .route_request (endpoints , None , request_stats , req )[ 0 ] for req in requests
114
114
]
115
115
116
116
# Remove an endpoint
@@ -119,9 +119,8 @@ def test_consistent_hashing_remove_node_multiple_sessions():
119
119
120
120
# Route with the updated endpoints
121
121
urls_after = [
122
- router .route_request (endpoints , None , request_stats , req ) for req in requests
122
+ router .route_request (endpoints , None , request_stats , req )[ 0 ] for req in requests
123
123
]
124
-
125
124
# Ensure all session IDs are still mapped to valid endpoints
126
125
assert all (url in [endpoint .url for endpoint in endpoints ] for url in urls_after )
127
126
@@ -155,7 +154,7 @@ def test_consistent_hashing_add_node_multiple_sessions():
155
154
156
155
# Route with initial endpoints
157
156
urls_before = [
158
- router .route_request (endpoints , None , request_stats , req ) for req in requests
157
+ router .route_request (endpoints , None , request_stats , req )[ 0 ] for req in requests
159
158
]
160
159
161
160
# Add a new endpoint
@@ -165,7 +164,7 @@ def test_consistent_hashing_add_node_multiple_sessions():
165
164
166
165
# Route with the updated endpoints
167
166
urls_after = [
168
- router .route_request (endpoints , None , request_stats , req ) for req in requests
167
+ router .route_request (endpoints , None , request_stats , req )[ 0 ] for req in requests
169
168
]
170
169
171
170
# Ensure all session IDs are still mapped to valid endpoints
@@ -201,7 +200,7 @@ def test_consistent_hashing_add_then_remove_node():
201
200
202
201
# Route with initial endpoints
203
202
urls_before_add = [
204
- router .route_request (endpoints , None , request_stats , req ) for req in requests
203
+ router .route_request (endpoints , None , request_stats , req )[ 0 ] for req in requests
205
204
]
206
205
207
206
# Add a new endpoint
@@ -211,7 +210,7 @@ def test_consistent_hashing_add_then_remove_node():
211
210
212
211
# Route with the updated endpoints (after adding)
213
212
urls_after_add = [
214
- router .route_request (endpoints , None , request_stats , req ) for req in requests
213
+ router .route_request (endpoints , None , request_stats , req )[ 0 ] for req in requests
215
214
]
216
215
217
216
# Ensure all session IDs are still mapped to valid endpoints
@@ -233,7 +232,7 @@ def test_consistent_hashing_add_then_remove_node():
233
232
234
233
# Route with the updated endpoints (after removing)
235
234
urls_after_remove = [
236
- router .route_request (endpoints , None , request_stats , req ) for req in requests
235
+ router .route_request (endpoints , None , request_stats , req )[ 0 ] for req in requests
237
236
]
238
237
239
238
# Ensure all session IDs are still mapped to valid endpoints
@@ -258,3 +257,27 @@ def test_consistent_hashing_add_then_remove_node():
258
257
print (
259
258
f"{ unaffected_count } out of { len (session_ids )} session IDs were unaffected by adding and removing a node."
260
259
)
260
+
261
+
262
+ def test_n_candidates ():
263
+ """
264
+ Test the candidates returned by the router without session id should be sorted.
265
+ """
266
+ endpoints = [
267
+ EndpointInfo (url = "http://engine1.com" ),
268
+ EndpointInfo (url = "http://engine2.com" ),
269
+ EndpointInfo (url = "http://engine3.com" ),
270
+ ]
271
+ request_stats = {
272
+ "http://engine1.com" : RequestStats (qps = 10 ),
273
+ "http://engine2.com" : RequestStats (qps = 5 ),
274
+ "http://engine3.com" : RequestStats (qps = 2 ),
275
+ }
276
+ request = Request (headers = {}) # No session ID
277
+
278
+ router = SessionRouter (session_key = "session_id" )
279
+ # Route with 2 candidates.
280
+ candidates = router .route_request (endpoints , None , request_stats , request , 2 )
281
+
282
+ # Ensure the candidates are sorted by QPS
283
+ assert candidates == ["http://engine3.com" , "http://engine2.com" ]
0 commit comments