Skip to content

Commit 910ef37

Browse files
committed
Improve Error context.
Fixes <#94>.
1 parent f5258b5 commit 910ef37

8 files changed

Lines changed: 261 additions & 128 deletions

File tree

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "amd-apcb"
3-
version = "0.4.6"
3+
version = "0.5.0"
44
authors = ["Oxide Computer"]
55
edition = "2021"
66

src/apcb.rs

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ impl<'a> ApcbIterMut<'a> {
304304
&'_ mut self,
305305
group_id: GroupId,
306306
) -> Result<(usize, usize)> {
307-
let group_id = group_id.to_u16().unwrap();
307+
let raw_group_id = group_id.to_u16().unwrap();
308308
let mut remaining_used_size = self.remaining_used_size;
309309
let mut offset = 0usize;
310310
loop {
@@ -314,7 +314,7 @@ impl<'a> ApcbIterMut<'a> {
314314
}
315315
let group = ApcbIterMut::next_item(self.context, &mut buf)?;
316316
let group_size = group.header.group_size.get();
317-
if group.header.group_id.get() == group_id {
317+
if group.header.group_id.get() == raw_group_id {
318318
return Ok((offset, group_size as usize));
319319
}
320320
let group = ApcbIterMut::next_item(self.context, &mut self.buf)?;
@@ -329,7 +329,7 @@ impl<'a> ApcbIterMut<'a> {
329329
"GROUP_HEADER::group_size",
330330
))?;
331331
}
332-
Err(Error::GroupNotFound)
332+
Err(Error::GroupNotFound { group_id })
333333
}
334334

335335
pub(crate) fn next1(&mut self) -> Result<GroupMutItem<'a>> {
@@ -593,8 +593,9 @@ impl<'a> Apcb<'a> {
593593
board_instance_mask: BoardInstances,
594594
) -> Result<()> {
595595
let group_id = entry_id.group_id();
596-
let mut group =
597-
self.group_mut(group_id)?.ok_or(Error::GroupNotFound)?;
596+
let mut group = self
597+
.group_mut(group_id)?
598+
.ok_or(Error::GroupNotFound { group_id })?;
598599
let size_diff =
599600
group.delete_entry(entry_id, instance_id, board_instance_mask)?;
600601
if size_diff > 0 {
@@ -661,7 +662,8 @@ impl<'a> Apcb<'a> {
661662
} else {
662663
return Err(Error::OutOfSpace);
663664
}
664-
let group = groups.next().ok_or(Error::GroupNotFound)?;
665+
let group =
666+
groups.next().ok_or(Error::GroupNotFound { group_id })?;
665667
group.header.group_size.set(new_group_size);
666668
let buf = &mut self.beginning_of_groups_mut()?[offset..];
667669
if old_group_size as usize > old_used_size {
@@ -694,7 +696,8 @@ impl<'a> Apcb<'a> {
694696
FileSystemError::InconsistentHeader,
695697
"ENTRY_HEADER::entry_size",
696698
))?;
697-
let group = groups.next().ok_or(Error::GroupNotFound)?;
699+
let group =
700+
groups.next().ok_or(Error::GroupNotFound { group_id })?;
698701
group.header.group_size.set(new_group_size);
699702
let buf = &mut self.beginning_of_groups_mut()?[offset..];
700703
buf.copy_within(
@@ -703,7 +706,7 @@ impl<'a> Apcb<'a> {
703706
);
704707
self.used_size = new_used_size;
705708
}
706-
self.group_mut(group_id)?.ok_or(Error::GroupNotFound)
709+
self.group_mut(group_id)?.ok_or(Error::GroupNotFound { group_id })
707710
}
708711
/// Note: board_instance_mask needs to be exact.
709712
#[allow(clippy::too_many_arguments)]
@@ -719,13 +722,18 @@ impl<'a> Apcb<'a> {
719722
payload_initializer: impl Fn(&mut [u8]),
720723
) -> Result<()> {
721724
let group_id = entry_id.group_id();
722-
let mut group =
723-
self.group_mut(group_id)?.ok_or(Error::GroupNotFound)?;
725+
let mut group = self
726+
.group_mut(group_id)?
727+
.ok_or(Error::GroupNotFound { group_id })?;
724728
if group
725729
.entry_exact_mut(entry_id, instance_id, board_instance_mask)
726730
.is_some()
727731
{
728-
return Err(Error::EntryUniqueKeyViolation);
732+
return Err(Error::EntryUniqueKeyViolation {
733+
entry_id,
734+
instance_id,
735+
board_instance_mask,
736+
});
729737
}
730738

731739
let mut entry_allocation: u16 = (size_of::<ENTRY_HEADER>() as u16)
@@ -983,15 +991,25 @@ impl<'a> Apcb<'a> {
983991
) -> Result<()> {
984992
let group_id = entry_id.group_id();
985993
// Make sure that the entry exists before resizing the group
986-
let group = self.group(group_id)?.ok_or(Error::GroupNotFound)?;
994+
let group =
995+
self.group(group_id)?.ok_or(Error::GroupNotFound { group_id })?;
987996
let entry = group
988997
.entry_exact(entry_id, instance_id, board_instance_mask)
989-
.ok_or(Error::EntryNotFound)?;
998+
.ok_or(Error::EntryNotFound {
999+
entry_id,
1000+
instance_id,
1001+
board_instance_mask,
1002+
})?;
9901003
let EntryItemBody::<_>::Tokens(a) = &entry.body else {
9911004
return Err(Error::EntryTypeMismatch);
9921005
};
9931006
if a.token(token_id).is_some() {
994-
return Err(Error::TokenUniqueKeyViolation);
1007+
return Err(Error::TokenUniqueKeyViolation {
1008+
entry_id,
1009+
instance_id,
1010+
board_instance_mask,
1011+
token_id,
1012+
});
9951013
}
9961014
// Tokens that destroy the alignment in the container have not been
9971015
// tested, are impossible right now anyway and have never been seen. So
@@ -1013,7 +1031,7 @@ impl<'a> Apcb<'a> {
10131031
token_id,
10141032
token_value,
10151033
);
1016-
if let Err(Error::EntryNotFound) = rv {
1034+
if let Err(Error::EntryNotFound { .. }) = rv {
10171035
panic!(
10181036
"Internal error: Entry (entry_id = {entry_id:?}, \
10191037
instance_id = {instance_id:?}, \
@@ -1034,8 +1052,9 @@ impl<'a> Apcb<'a> {
10341052
) -> Result<()> {
10351053
let group_id = entry_id.group_id();
10361054
// Make sure that the entry exists before resizing the group
1037-
let mut group =
1038-
self.group_mut(group_id)?.ok_or(Error::GroupNotFound)?;
1055+
let mut group = self
1056+
.group_mut(group_id)?
1057+
.ok_or(Error::GroupNotFound { group_id })?;
10391058
let token_diff = group.delete_token(
10401059
entry_id,
10411060
instance_id,
@@ -1088,17 +1107,17 @@ impl<'a> Apcb<'a> {
10881107
GroupId::Token => signature == *b"TOKN",
10891108
GroupId::Unknown(_) => true,
10901109
} {
1091-
return Err(Error::GroupTypeMismatch);
1110+
return Err(Error::GroupTypeMismatch { group_id, signature });
10921111
}
10931112

10941113
let mut groups = self.groups_mut()?;
10951114
match groups.move_point_to(group_id) {
1096-
Err(Error::GroupNotFound) => {}
1115+
Err(Error::GroupNotFound { .. }) => {}
10971116
Err(x) => {
10981117
return Err(x);
10991118
}
11001119
_ => {
1101-
return Err(Error::GroupUniqueKeyViolation);
1120+
return Err(Error::GroupUniqueKeyViolation { group_id });
11021121
}
11031122
}
11041123

src/entry.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1498,7 +1498,7 @@ impl Parameters {
14981498
}
14991499
}
15001500
}
1501-
Err(Error::ParameterNotFound)
1501+
Err(Error::ParameterNotFound { parameter_id: key })
15021502
}
15031503
}
15041504

src/group.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,11 @@ impl<'a> GroupMutIter<'a> {
364364
};
365365
let mut buf = &mut self.buf[..remaining_used_size];
366366
if buf.is_empty() {
367-
return Err(Error::EntryNotFound);
367+
return Err(Error::EntryNotFound {
368+
entry_id,
369+
instance_id,
370+
board_instance_mask,
371+
});
368372
}
369373
match Self::next_item(self.context, &mut buf) {
370374
Ok(e) => {
@@ -585,7 +589,11 @@ impl<'a> GroupMutItem<'a> {
585589
)?;
586590
let entry_size: u16 =
587591
entry_size.try_into().map_err(|_| Error::ArithmeticOverflow)?;
588-
let entry = entries.next().ok_or(Error::EntryNotFound)?;
592+
let entry = entries.next().ok_or(Error::EntryNotFound {
593+
entry_id,
594+
instance_id,
595+
board_instance_mask,
596+
})?;
589597

590598
if size_diff > 0 {
591599
let size_diff: usize =
@@ -683,7 +691,11 @@ impl<'a> GroupMutItem<'a> {
683691
// Ok.
684692
let mut entry = self
685693
.entry_exact_mut(entry_id, instance_id, board_instance_mask)
686-
.ok_or(Error::EntryNotFound)?;
694+
.ok_or(Error::EntryNotFound {
695+
entry_id,
696+
instance_id,
697+
board_instance_mask,
698+
})?;
687699
entry.delete_token(token_id)?;
688700
let mut token_size_diff: i64 =
689701
token_size.try_into().map_err(|_| Error::ArithmeticOverflow)?;

0 commit comments

Comments
 (0)