Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Switch over to reading events from stable memory #41

Merged
merged 1 commit into from
Feb 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion rs/canister/api/can.did
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
type EventsArgs = record { start : nat64; length : nat64 };
type EventsResponse = record {
latest_event_index_in_stable_memory : opt nat64;
events : vec IndexedEvent;
latest_event_index : opt nat64;
};
Expand Down
1 change: 0 additions & 1 deletion rs/canister/api/src/queries/events.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,4 @@ pub struct EventsArgs {
pub struct EventsResponse {
pub events: Vec<IndexedEvent>,
pub latest_event_index: Option<u64>,
pub latest_event_index_in_stable_memory: Option<u64>,
}
7 changes: 0 additions & 7 deletions rs/canister/impl/src/lifecycle/heartbeat.rs

This file was deleted.

1 change: 0 additions & 1 deletion rs/canister/impl/src/lifecycle/mod.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
mod heartbeat;
mod init;
mod post_upgrade;
mod pre_upgrade;
Expand Down
66 changes: 13 additions & 53 deletions rs/canister/impl/src/model/events.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,79 +5,40 @@ use ic_stable_structures::storable::Bound;
use ic_stable_structures::{StableLog, Storable};
use serde::Serialize;
use std::borrow::Cow;
use std::collections::VecDeque;

#[derive(Serialize, Deserialize)]
pub struct Events {
events: VecDeque<IndexedEvent>,
#[serde(skip, default = "init_events")]
events_v2: StableLog<StorableEvent, Memory, Memory>,
latest_event_index: Option<u64>,
#[serde(alias = "events_v2", skip, default = "init_events")]
events: StableLog<StorableEvent, Memory, Memory>,
}

impl Events {
pub fn get(&self, start: u64, length: u64) -> Vec<IndexedEvent> {
let start_index = start as usize;
if start_index < self.events.len() {
self.events
.range(start_index..)
.take(length as usize)
.cloned()
.collect()
} else {
Vec::new()
}
}

pub fn migrate(&mut self, count: u64) {
for event in self.get(self.events_v2.len(), count) {
self.events_v2
.append(&StorableEvent {
index: event.index,
name: event.name,
timestamp: event.timestamp,
user: event.user,
source: event.source,
payload: event.payload,
})
.unwrap();
}
self.events
.iter()
.skip(start as usize)
.take(length as usize)
.map(|e| e.into())
.collect()
}

pub fn push(&mut self, event: IdempotentEvent) {
let index = self.latest_event_index.map_or(0, |i| i + 1);

if self.events_v2.len() == index {
self.events_v2
.append(&StorableEvent::new(event.clone(), index))
.unwrap();
}

self.events.push_back(IndexedEvent {
index,
name: event.name,
timestamp: event.timestamp,
user: event.user,
source: event.source,
payload: event.payload,
});
self.latest_event_index = Some(index);
self.events
.append(&StorableEvent::new(event.clone(), self.events.len()))
.unwrap();
}

pub fn stats(&self) -> EventsStats {
EventsStats {
latest_event_index: self.latest_event_index,
latest_event_index_in_stable_memory: self.events_v2.iter().last().map(|e| e.index),
latest_event_index: self.events.iter().last().map(|e| e.index),
}
}
}

impl Default for Events {
fn default() -> Self {
Events {
events: VecDeque::new(),
events_v2: init_events(),
latest_event_index: None,
events: init_events(),
}
}
}
Expand All @@ -88,7 +49,6 @@ fn init_events() -> StableLog<StorableEvent, Memory, Memory> {

pub struct EventsStats {
pub latest_event_index: Option<u64>,
pub latest_event_index_in_stable_memory: Option<u64>,
}

#[derive(Serialize, Deserialize)]
Expand Down
1 change: 0 additions & 1 deletion rs/canister/impl/src/queries/events.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ fn events(args: EventsArgs) -> EventsResponse {
EventsResponse {
events,
latest_event_index: stats.latest_event_index,
latest_event_index_in_stable_memory: stats.latest_event_index_in_stable_memory,
}
})
}
Loading