Properly dropping a channel

[?]
Feb 26, 2021, 3:47 PM
TZ42DX3BML5C3O5Z6OBVNBCHSIIHT6AOJPD6ICOLOP4LPYFXQN2QC

Dependencies

  • [2] YN63NUZO Sanakirja 1.0
  • [3] SXEYMYF7 Fixing the bad changes in history (unfortunately, by rebooting).
  • [4] VO5OQW4W Removing anyhow in libpijul
  • [5] CCLLB7OI Upgrading to Sanakirja 0.15 + version bump

Change contents

  • edit in libpijul/src/pristine/sanakirja.rs at line 29
    [3.12924]
    [3.38798]
    #[error("Cannot dropped a borrowed channel: {:?}", c)]
    ChannelRc { c: String },
  • replacement in libpijul/src/pristine/sanakirja.rs at line 1631
    [3.567504][3.53082:53161](),[3.16215][3.567580:567726](),[3.53161][3.567580:567726](),[3.567580][3.567580:567726](),[3.567726][2.90650:90732](),[2.90732][3.567915:567992](),[3.567915][3.567915:567992]()
    fn drop_channel(&mut self, name: &str) -> Result<bool, Self::GraphError> {
    let name = SmallString::from_str(name);
    self.open_channels.borrow_mut().remove(&name);
    debug!("drop_channel {:?}", name);
    let result = btree::del(&mut self.txn, &mut self.channels, &name, None)?;
    debug!("/drop_channel {:?}: {:?}", name, result);
    Ok(result)
    [3.567504]
    [3.567992]
    fn drop_channel(&mut self, name0: &str) -> Result<bool, Self::GraphError> {
    let name = SmallString::from_str(name0);
    let channel = if let Some(channel) = self.open_channels.borrow_mut().remove(&name) {
    let channel = Rc::try_unwrap(channel.r)
    .map_err(|_| SanakirjaError::ChannelRc { c: name0.to_string() })?
    .into_inner();
    Some((
    channel.graph,
    channel.changes,
    channel.revchanges,
    channel.states,
    ))
    } else if let Some((name_, chan)) = btree::get(&self.txn, &self.channels, &name, None)? {
    if name_ == name.as_ref() {
    Some((
    Db::from_page(chan.0[0].into()),
    Db::from_page(chan.0[1].into()),
    UDb::from_page(chan.0[2].into()),
    UDb::from_page(chan.0[3].into()),
    ))
    } else {
    None
    }
    } else {
    None
    };
    if let Some((a, b, c, d)) = channel {
    btree::drop(&mut self.txn, a)?;
    btree::drop(&mut self.txn, b)?;
    btree::drop(&mut self.txn, c)?;
    btree::drop(&mut self.txn, d)?;
    }
    Ok(btree::del(&mut self.txn, &mut self.channels, &name, None)?)