|
1 |
| -use std::future::Future; |
2 |
| -use std::sync::{Arc, Mutex, MutexGuard}; |
3 |
| - |
4 | 1 | use crate::cbconfig::TerseConfig;
|
5 | 2 | use crate::error::ErrorKind;
|
6 | 3 | use crate::error::Result;
|
7 | 4 | use crate::memdx::error::ServerErrorKind;
|
8 | 5 | use crate::memdx::response::TryFromClientResponse;
|
9 | 6 | use crate::nmvbhandler::NotMyVbucketConfigHandler;
|
10 | 7 | use crate::vbucketmap::VbucketMap;
|
| 8 | +use log::debug; |
| 9 | +use std::future::Future; |
| 10 | +use std::sync::{Arc, Mutex, MutexGuard}; |
11 | 11 |
|
12 | 12 | pub(crate) trait VbucketRouter: Send + Sync {
|
13 | 13 | fn update_vbucket_info(&self, info: VbucketRoutingInfo);
|
@@ -102,59 +102,54 @@ where
|
102 | 102 | V: VbucketRouter,
|
103 | 103 | Fut: Future<Output = Result<Resp>> + Send,
|
104 | 104 | {
|
105 |
| - let (mut endpoint, mut vb_id) = vb.dispatch_by_key(key, vb_server_idx)?; |
| 105 | + let (mut endpoint, vb_id) = vb.dispatch_by_key(key, vb_server_idx)?; |
106 | 106 |
|
107 |
| - loop { |
108 |
| - let err = match operation(endpoint.clone(), vb_id).await { |
109 |
| - Ok(r) => return Ok(r), |
110 |
| - Err(e) => e, |
111 |
| - }; |
| 107 | + let err = match operation(endpoint.clone(), vb_id).await { |
| 108 | + Ok(r) => return Ok(r), |
| 109 | + Err(e) => e, |
| 110 | + }; |
112 | 111 |
|
113 |
| - let config = if let Some(memdx_err) = err.is_memdx_error() { |
114 |
| - if memdx_err.is_server_error_kind(ServerErrorKind::NotMyVbucket) { |
115 |
| - if let Some(config) = memdx_err.has_server_config() { |
116 |
| - config |
117 |
| - } else { |
118 |
| - return Err(err); |
119 |
| - } |
| 112 | + let config = if let Some(memdx_err) = err.is_memdx_error() { |
| 113 | + if memdx_err.is_server_error_kind(ServerErrorKind::NotMyVbucket) { |
| 114 | + if let Some(config) = memdx_err.has_server_config() { |
| 115 | + config |
120 | 116 | } else {
|
| 117 | + // This will automatically get retried by the retry manager. |
| 118 | + debug!("Received empty NMVB response"); |
121 | 119 | return Err(err);
|
122 | 120 | }
|
123 | 121 | } else {
|
124 | 122 | return Err(err);
|
125 |
| - }; |
126 |
| - |
127 |
| - if config.is_empty() { |
128 |
| - return Err(err); |
129 | 123 | }
|
| 124 | + } else { |
| 125 | + return Err(err); |
| 126 | + }; |
130 | 127 |
|
131 |
| - let value = match std::str::from_utf8(config.as_slice()) { |
132 |
| - Ok(v) => v.to_string(), |
133 |
| - Err(_e) => "".to_string(), |
134 |
| - }; |
135 |
| - |
136 |
| - let config = value.replace("$HOST", endpoint.as_ref()); |
| 128 | + if config.is_empty() { |
| 129 | + // This shouldn't happen. |
| 130 | + return Err(err); |
| 131 | + } |
137 | 132 |
|
138 |
| - let config_json: TerseConfig = match serde_json::from_str(&config) { |
139 |
| - Ok(c) => c, |
140 |
| - Err(_) => { |
141 |
| - return Err(err); |
142 |
| - } |
143 |
| - }; |
| 133 | + let value = match std::str::from_utf8(config.as_slice()) { |
| 134 | + Ok(v) => v.to_string(), |
| 135 | + Err(_e) => "".to_string(), |
| 136 | + }; |
144 | 137 |
|
145 |
| - nmvb_handler |
146 |
| - .clone() |
147 |
| - .not_my_vbucket_config(config_json, &endpoint) |
148 |
| - .await; |
| 138 | + let config = value.replace("$HOST", endpoint.as_ref()); |
149 | 139 |
|
150 |
| - let (new_endpoint, new_vb_id) = vb.dispatch_by_key(key, vb_server_idx)?; |
151 |
| - if new_endpoint == endpoint && new_vb_id == vb_id { |
| 140 | + let config_json: TerseConfig = match serde_json::from_str(&config) { |
| 141 | + Ok(c) => c, |
| 142 | + Err(_) => { |
152 | 143 | return Err(err);
|
153 | 144 | }
|
| 145 | + }; |
154 | 146 |
|
155 |
| - endpoint = new_endpoint; |
156 |
| - vb_id = new_vb_id; |
157 |
| - } |
| 147 | + nmvb_handler |
| 148 | + .clone() |
| 149 | + .not_my_vbucket_config(config_json, &endpoint) |
| 150 | + .await; |
| 151 | + |
| 152 | + Err(err) |
158 | 153 | }
|
159 | 154 |
|
160 | 155 | #[cfg(test)]
|
|
0 commit comments