Skip to content

Commit 469b12c

Browse files
authored
chore: enable to retry in all operations. (#278)
1 parent da412a8 commit 469b12c

File tree

8 files changed

+169
-87
lines changed

8 files changed

+169
-87
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ jobs:
66
runs-on: ubuntu-latest
77
steps:
88
- uses: actions/checkout@master
9-
- uses: denoland/setup-deno@909cc5acb0fdd60627fb858598759246509fa755 # v2.0.2
9+
- uses: denoland/setup-deno@e95548e56dfa95d4e1a28d6f422fafe75c4c26fb # v2.0.3
1010
with:
1111
deno-version: v1.x
1212
- name: Run deno fmt and deno lint

Cargo.lock

Lines changed: 50 additions & 25 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

raiden-derive/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ convert_case = "^0.8.0"
1616
ident_case = "^1.0.1"
1717
proc-macro2 = "^1.0.95"
1818
quote = "^1.0.40"
19-
syn = "^2.0.101"
19+
syn = "^2.0.104"
2020

2121
[features]
2222
default = []

raiden-derive/src/ops/batch_delete.rs

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ pub(crate) fn expand_batch_delete(
4848
client: &self.client,
4949
write_requests,
5050
table_name: self.table_name(),
51+
policy: self.retry_condition.strategy.policy(),
52+
condition: &self.retry_condition,
5153
}
5254
}
5355
}
@@ -86,6 +88,8 @@ pub(crate) fn expand_batch_delete(
8688
client: &self.client,
8789
write_requests,
8890
table_name: self.table_name(),
91+
policy: self.retry_condition.strategy.policy(),
92+
condition: &self.retry_condition,
8993
}
9094
}
9195
}
@@ -95,12 +99,12 @@ pub(crate) fn expand_batch_delete(
9599
let api_call_token = super::api_call_token!("batch_write_item");
96100
let (call_inner_run, inner_run_args) = if cfg!(feature = "tracing") {
97101
(
98-
quote! { #builder_name::inner_run(&self.table_name, &self.client, input).await? },
99-
quote! { table_name: &str, },
102+
quote! { #builder_name::inner_run(table_name, client, input).await },
103+
quote! { table_name: String, },
100104
)
101105
} else {
102106
(
103-
quote! { #builder_name::inner_run(&self.client, input).await? },
107+
quote! { #builder_name::inner_run(client, input).await },
104108
quote! {},
105109
)
106110
};
@@ -112,17 +116,22 @@ pub(crate) fn expand_batch_delete(
112116
pub client: &'a ::raiden::DynamoDbClient,
113117
pub write_requests: std::vec::Vec<::raiden::WriteRequest>,
114118
pub table_name: String,
119+
pub policy: ::raiden::Policy,
120+
pub condition: &'a ::raiden::retry::RetryCondition,
115121
}
116122

117123
impl<'a> #builder_name<'a> {
118-
pub async fn run(mut self) -> Result<::raiden::batch_delete::BatchDeleteOutput, ::raiden::RaidenError> {
124+
pub async fn run(self) -> Result<::raiden::batch_delete::BatchDeleteOutput, ::raiden::RaidenError> {
125+
let Self { client, mut write_requests, table_name, policy, condition } = self;
126+
let policy: ::raiden::RetryPolicy = policy.into();
127+
119128
// TODO: set the number of retry to 5 for now, which should be made more flexible
120129
const RETRY: usize = 5;
121130
const MAX_ITEMS_PER_REQUEST: usize = 25;
122131

123132
for _ in 0..RETRY {
124133
loop {
125-
let len = self.write_requests.len();
134+
let len = write_requests.len();
126135

127136
// len == 0 means there are no items to be processed anymore
128137
if len == 0 {
@@ -132,16 +141,24 @@ pub(crate) fn expand_batch_delete(
132141
let start = len.saturating_sub(MAX_ITEMS_PER_REQUEST);
133142
let end = std::cmp::min(len, start + MAX_ITEMS_PER_REQUEST);
134143
// take requests up to 25 from the request buffer
135-
let req = self.write_requests.drain(start..end).collect::<std::vec::Vec<_>>();
136-
let request_items = vec![(self.table_name.clone(), req)]
144+
let req = write_requests.drain(start..end).collect::<std::vec::Vec<_>>();
145+
let request_items = vec![(table_name.clone(), req)]
137146
.into_iter()
138147
.collect::<std::collections::HashMap<_, _>>();
139-
let input = ::raiden::BatchWriteItemInput {
140-
request_items,
141-
..std::default::Default::default()
142-
};
148+
let result = {
149+
let t = table_name.clone();
150+
let c = client.clone();
151+
let i = ::raiden::BatchWriteItemInput {
152+
request_items,
153+
..std::default::Default::default()
154+
};
143155

144-
let result = #call_inner_run;
156+
policy.retry_if(move || {
157+
let (table_name, client, input)
158+
= (t.clone(), c.clone(), i.clone());
159+
async move { #call_inner_run }
160+
}, condition).await?
161+
};
145162

146163
let mut unprocessed_items = match result.unprocessed_items {
147164
None => {
@@ -161,16 +178,16 @@ pub(crate) fn expand_batch_delete(
161178
};
162179

163180
let unprocessed_requests = unprocessed_items
164-
.remove(&self.table_name)
165-
.expect("reqeust_items hashmap must have a value for the table name");
181+
.remove(&table_name)
182+
.expect("request_items hashmap must have a value for the table name");
166183
// push unprocessed requests back to the request buffer
167-
self.write_requests.extend(unprocessed_requests);
184+
write_requests.extend(unprocessed_requests);
168185
}
169186
}
170187

171188
// when retry is done the specified times, treat it as success even if there are
172189
// still unprocessed items
173-
let unprocessed_items = self.write_requests
190+
let unprocessed_items = write_requests
174191
.into_iter()
175192
.filter_map(|write_request| write_request.delete_request)
176193
.collect::<std::vec::Vec<_>>();
@@ -182,7 +199,7 @@ pub(crate) fn expand_batch_delete(
182199

183200
async fn inner_run(
184201
#inner_run_args
185-
client: &::raiden::DynamoDbClient,
202+
client: ::raiden::DynamoDbClient,
186203
input: ::raiden::BatchWriteItemInput,
187204
) -> Result<::raiden::BatchWriteItemOutput, ::raiden::RaidenError> {
188205
Ok(#api_call_token?)

0 commit comments

Comments
 (0)