Improve materialize_batch_and_maybe_update_state (#1381)

diff --git a/Cargo.lock b/Cargo.lock
index e3c6352..fc657ee 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4262,7 +4262,7 @@
 
 [[package]]
 name = "server"
-version = "0.4.84"
+version = "0.4.85"
 dependencies = [
  "ahash 0.8.11",
  "anyhow",
diff --git a/server/Cargo.toml b/server/Cargo.toml
index 44dbde7..ce64e50 100644
--- a/server/Cargo.toml
+++ b/server/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "server"
-version = "0.4.84"
+version = "0.4.85"
 edition = "2021"
 build = "src/build.rs"
 
diff --git a/server/src/streaming/batching/batch_accumulator.rs b/server/src/streaming/batching/batch_accumulator.rs
index 65f6f84..eb9b6f2 100644
--- a/server/src/streaming/batching/batch_accumulator.rs
+++ b/server/src/streaming/batching/batch_accumulator.rs
@@ -71,35 +71,35 @@
     pub fn materialize_batch_and_maybe_update_state(&mut self) -> (bool, RetainedMessageBatch) {
         let batch_base_offset = self.base_offset;
         let batch_last_offset_delta = (self.current_offset - self.base_offset) as u32;
-        let batch_max_timestamp = self.messages.last().unwrap().timestamp;
         let split_point = std::cmp::min(self.capacity as usize, self.messages.len());
-        let (batch, remainder) = self.messages.as_slice().split_at(split_point);
+
         let mut bytes = BytesMut::with_capacity(self.current_size.as_bytes_u64() as usize);
-        for message in batch {
+        let last_batch_timestamp = self
+            .messages
+            .get(split_point - 1)
+            .map_or(0, |msg| msg.timestamp);
+        for message in self.messages.drain(..split_point) {
             message.extend(&mut bytes);
         }
 
-        let mut remaining_messages = Vec::with_capacity(remainder.len());
-        let has_remainder = !remainder.is_empty();
+        let has_remainder = !self.messages.is_empty();
         if has_remainder {
-            self.base_offset = remainder.first().unwrap().offset;
-            self.current_size = remainder
+            self.base_offset = self.messages.first().unwrap().offset;
+            self.current_size = self
+                .messages
                 .iter()
                 .map(|msg| msg.get_size_bytes())
                 .sum::<IggyByteSize>();
-            self.current_offset = remainder.last().unwrap().offset;
-            self.current_timestamp = remainder.last().unwrap().timestamp;
-            for message in remainder {
-                remaining_messages.push(message.clone());
-            }
-            self.messages = remaining_messages;
+            self.current_offset = self.messages.last().unwrap().offset;
+            self.current_timestamp = self.messages.last().unwrap().timestamp;
         }
+
         let batch_payload = bytes.freeze();
         let batch_payload_len = IggyByteSize::from(batch_payload.len() as u64);
         let batch = RetainedMessageBatch::new(
             batch_base_offset,
             batch_last_offset_delta,
-            batch_max_timestamp,
+            last_batch_timestamp,
             batch_payload_len,
             batch_payload,
         );