qiniu_http_client/client/
retried.rs

1use std::fmt;
2
3/// 重试统计信息
4#[derive(Clone, Debug, Default, Eq, PartialEq)]
5pub struct RetriedStatsInfo {
6    retried_total: usize,
7    retried_on_current_endpoint: usize,
8    retried_on_current_ips: usize,
9    abandoned_endpoints: usize,
10    abandoned_ips_of_current_endpoint: usize,
11    switched_to_alternative_endpoints: bool,
12}
13
14impl RetriedStatsInfo {
15    /// 提升当前终端地址的重试次数
16    #[inline]
17    pub fn increase_current_endpoint(&mut self) {
18        self.retried_total += 1;
19        self.retried_on_current_endpoint += 1;
20        self.retried_on_current_ips += 1;
21    }
22
23    /// 提升放弃的终端地址的数量
24    #[inline]
25    pub fn increase_abandoned_endpoints(&mut self) {
26        self.abandoned_endpoints += 1;
27    }
28
29    /// 提升放弃的终端的 IP 地址的数量
30    #[inline]
31    pub fn increase_abandoned_ips_of_current_endpoint(&mut self) {
32        self.abandoned_ips_of_current_endpoint += 1;
33    }
34
35    /// 切换到备选终端地址
36    #[inline]
37    pub fn switch_to_alternative_endpoints(&mut self) {
38        self.switched_to_alternative_endpoints = true;
39        self.switch_endpoint();
40    }
41
42    /// 切换终端地址
43    pub fn switch_endpoint(&mut self) {
44        self.retried_on_current_endpoint = 0;
45        self.abandoned_ips_of_current_endpoint = 0;
46        self.switch_ips();
47    }
48
49    /// 切换当前 IP 地址
50    pub fn switch_ips(&mut self) {
51        self.retried_on_current_ips = 0;
52    }
53
54    /// 获取总共重试的次数
55    #[inline]
56    pub fn retried_total(&self) -> usize {
57        self.retried_total
58    }
59
60    /// 获取当前终端地址的重试次数
61    #[inline]
62    pub fn retried_on_current_endpoint(&self) -> usize {
63        self.retried_on_current_endpoint
64    }
65
66    /// 获取当前 IP 地址的重试次数
67    #[inline]
68    pub fn retried_on_current_ips(&self) -> usize {
69        self.retried_on_current_ips
70    }
71
72    /// 获取放弃的终端地址的数量
73    #[inline]
74    pub fn abandoned_endpoints(&self) -> usize {
75        self.abandoned_endpoints
76    }
77
78    /// 获取放弃的终端的 IP 地址的数量
79    #[inline]
80    pub fn abandoned_ips_of_current_endpoint(&self) -> usize {
81        self.abandoned_ips_of_current_endpoint
82    }
83
84    /// 是否切换到了备选终端地址
85    #[inline]
86    pub fn switched_to_alternative_endpoints(&self) -> bool {
87        self.switched_to_alternative_endpoints
88    }
89}
90
91impl fmt::Display for RetriedStatsInfo {
92    #[inline]
93    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
94        write!(
95            f,
96            "{},{},{},{},{},{}",
97            self.retried_total,
98            self.retried_on_current_endpoint,
99            self.retried_on_current_ips,
100            self.abandoned_endpoints,
101            self.abandoned_ips_of_current_endpoint,
102            if self.switched_to_alternative_endpoints {
103                "a" // alternative
104            } else {
105                "p" // preferred
106            }
107        )
108    }
109}