Skip to content

Commit

Permalink
Don't parallize user creation (#260)
Browse files Browse the repository at this point in the history
  • Loading branch information
Hoverbear authored Feb 19, 2023
1 parent 5e7cb50 commit a89e05b
Showing 1 changed file with 34 additions and 25 deletions.
59 changes: 34 additions & 25 deletions src/action/common/create_users_and_groups.rs
Original file line number Diff line number Diff line change
Expand Up @@ -131,32 +131,41 @@ impl Action for CreateUsersAndGroups {
}
},
_ => {
let mut set = JoinSet::new();
let mut errors: Vec<Box<ActionError>> = Vec::new();
for (idx, create_user) in create_users.iter_mut().enumerate() {
let span = tracing::Span::current().clone();
let mut create_user_clone = create_user.clone();
let _abort_handle = set.spawn(async move {
create_user_clone.try_execute().instrument(span).await?;
Result::<_, _>::Ok((idx, create_user_clone))
});
}

while let Some(result) = set.join_next().await {
match result {
Ok(Ok((idx, success))) => create_users[idx] = success,
Ok(Err(e)) => errors.push(Box::new(e)),
Err(e) => return Err(ActionError::Join(e))?,
};
}

if !errors.is_empty() {
if errors.len() == 1 {
return Err(errors.into_iter().next().unwrap().into());
} else {
return Err(ActionError::Children(errors));
}
for create_user in create_users.iter_mut() {
create_user.try_execute().await?;
}
// While we may be tempted to do something like this, it can break on many older OSes like Ubuntu 18.04:
// ```
// useradd: cannot lock /etc/passwd; try again later.
// ```
// So, instead, we keep this here in hopes one day we can enable it for some detected OS:
//
// let mut set = JoinSet::new();
// let mut errors: Vec<Box<ActionError>> = Vec::new();
// for (idx, create_user) in create_users.iter_mut().enumerate() {
// let span = tracing::Span::current().clone();
// let mut create_user_clone = create_user.clone();
// let _abort_handle = set.spawn(async move {
// create_user_clone.try_execute().instrument(span).await?;
// Result::<_, _>::Ok((idx, create_user_clone))
// });
// }

// while let Some(result) = set.join_next().await {
// match result {
// Ok(Ok((idx, success))) => create_users[idx] = success,
// Ok(Err(e)) => errors.push(Box::new(e)),
// Err(e) => return Err(ActionError::Join(e))?,
// };
// }

// if !errors.is_empty() {
// if errors.len() == 1 {
// return Err(errors.into_iter().next().unwrap().into());
// } else {
// return Err(ActionError::Children(errors));
// }
// }
},
};

Expand Down

0 comments on commit a89e05b

Please sign in to comment.