| 85 | |
| 86 | impl LogStorage for RedbLogStorage { |
| 87 | fn append(&mut self, entries: &[LogEntry]) -> nodedb_raft::error::Result<()> { |
| 88 | if entries.is_empty() { |
| 89 | return Ok(()); |
| 90 | } |
| 91 | |
| 92 | let write_txn = |
| 93 | self.db |
| 94 | .begin_write() |
| 95 | .map_err(|e| nodedb_raft::error::RaftError::Storage { |
| 96 | detail: format!("write txn: {e}"), |
| 97 | })?; |
| 98 | { |
| 99 | let mut table = write_txn.open_table(ENTRIES).map_err(|e| { |
| 100 | nodedb_raft::error::RaftError::Storage { |
| 101 | detail: format!("open entries: {e}"), |
| 102 | } |
| 103 | })?; |
| 104 | |
| 105 | for entry in entries { |
| 106 | let key = index_key(entry.index); |
| 107 | let value = encode_versioned(entry).map_err(|e| { |
| 108 | nodedb_raft::error::RaftError::Storage { |
| 109 | detail: format!("serialize entry: {e}"), |
| 110 | } |
| 111 | })?; |
| 112 | table |
| 113 | .insert(key.as_slice(), value.as_slice()) |
| 114 | .map_err(|e| nodedb_raft::error::RaftError::Storage { |
| 115 | detail: format!("insert entry: {e}"), |
| 116 | })?; |
| 117 | } |
| 118 | } |
| 119 | write_txn |
| 120 | .commit() |
| 121 | .map_err(|e| nodedb_raft::error::RaftError::Storage { |
| 122 | detail: format!("commit append: {e}"), |
| 123 | })?; |
| 124 | |
| 125 | debug!(count = entries.len(), "raft log appended"); |
| 126 | Ok(()) |
| 127 | } |
| 128 | |
| 129 | fn truncate(&mut self, index: u64) -> nodedb_raft::error::Result<()> { |
| 130 | let write_txn = |