Skip to content

Commit b824198

Browse files
committed
database: remove DatabaseHelper from MemoryDatabase
Signed-off-by: Yuki Kishimoto <[email protected]>
1 parent 66ede06 commit b824198

File tree

11 files changed

+57
-78
lines changed

11 files changed

+57
-78
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
* nostr: update `RelayMessage::NegErr` variant ([Yuki Kishimoto])
5454
* database: add manual trait implementations for `BTreeCappedSet` ([Yuki Kishimoto])
5555
* database: replace LRU with custom memory cache for IDs tracking ([Yuki Kishimoto])
56+
* database: remove `DatabaseHelper` from `MemoryDatabase` ([Yuki Kishimoto])
5657
* lmdb: use `async-utility` to spawn blocking tasks ([Yuki Kishimoto])
5758
* ndb: bump `nostr-ndb` to 0.4 ([Yuki Kishimoto])
5859
* pool: add `PingTracker` and improve relay ping management ([Yuki Kishimoto])

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/nostr-database/src/memory.rs

Lines changed: 25 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,14 @@ use nostr::prelude::*;
1212
use tokio::sync::RwLock;
1313

1414
use crate::{
15-
Backend, DatabaseError, DatabaseEventResult, DatabaseEventStatus, DatabaseHelper, Events,
16-
NostrDatabase, NostrEventsDatabase, RejectedReason, SaveEventStatus,
15+
Backend, DatabaseError, DatabaseEventStatus, Events, NostrDatabase, NostrEventsDatabase,
16+
RejectedReason, SaveEventStatus,
1717
};
1818

1919
/// Database options
2020
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
2121
pub struct MemoryDatabaseOptions {
22-
/// Store events (default: false)
23-
pub events: bool,
24-
/// Max events and IDs to store in memory (default: 35_000)
22+
/// Max IDs to store in memory (default: 35_000)
2523
///
2624
/// `None` means no limits.
2725
pub max_events: Option<usize>,
@@ -30,7 +28,6 @@ pub struct MemoryDatabaseOptions {
3028
impl Default for MemoryDatabaseOptions {
3129
fn default() -> Self {
3230
Self {
33-
events: false,
3431
max_events: Some(35_000),
3532
}
3633
}
@@ -44,11 +41,11 @@ impl MemoryDatabaseOptions {
4441
}
4542

4643
/// Memory Database (RAM)
44+
///
45+
/// This database keep track only of seen event IDs!
4746
#[derive(Debug, Clone)]
4847
pub struct MemoryDatabase {
49-
opts: MemoryDatabaseOptions,
5048
seen_event_ids: Arc<RwLock<SeenTracker>>,
51-
helper: DatabaseHelper,
5249
}
5350

5451
impl Default for MemoryDatabase {
@@ -66,12 +63,7 @@ impl MemoryDatabase {
6663
/// New Memory database
6764
pub fn with_opts(opts: MemoryDatabaseOptions) -> Self {
6865
Self {
69-
opts,
7066
seen_event_ids: Arc::new(RwLock::new(SeenTracker::new(opts.max_events))),
71-
helper: match opts.max_events {
72-
Some(max) => DatabaseHelper::bounded(max),
73-
None => DatabaseHelper::unbounded(),
74-
},
7567
}
7668
}
7769
}
@@ -84,9 +76,6 @@ impl NostrDatabase for MemoryDatabase {
8476
}
8577

8678
async fn wipe(&self) -> Result<(), DatabaseError> {
87-
// Clear helper
88-
self.helper.clear().await;
89-
9079
// Clear
9180
let mut seen_event_ids = self.seen_event_ids.write().await;
9281
seen_event_ids.clear();
@@ -98,46 +87,28 @@ impl NostrDatabase for MemoryDatabase {
9887
#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
9988
impl NostrEventsDatabase for MemoryDatabase {
10089
async fn save_event(&self, event: &Event) -> Result<SaveEventStatus, DatabaseError> {
101-
if self.opts.events {
102-
let DatabaseEventResult { status, .. } = self.helper.index_event(event).await;
103-
Ok(status)
104-
} else {
105-
// Mark it as seen
106-
let mut seen_event_ids = self.seen_event_ids.write().await;
107-
seen_event_ids.seen(event.id, None);
90+
// Mark it as seen
91+
let mut seen_event_ids = self.seen_event_ids.write().await;
92+
seen_event_ids.seen(event.id, None);
10893

109-
Ok(SaveEventStatus::Rejected(RejectedReason::Other))
110-
}
94+
Ok(SaveEventStatus::Rejected(RejectedReason::Other))
11195
}
11296

11397
async fn check_id(&self, event_id: &EventId) -> Result<DatabaseEventStatus, DatabaseError> {
114-
if self.opts.events {
115-
if self.helper.has_event_id_been_deleted(event_id).await {
116-
Ok(DatabaseEventStatus::Deleted)
117-
} else if self.helper.has_event(event_id).await {
118-
Ok(DatabaseEventStatus::Saved)
119-
} else {
120-
Ok(DatabaseEventStatus::NotExistent)
121-
}
98+
let seen_event_ids = self.seen_event_ids.read().await;
99+
Ok(if seen_event_ids.contains(event_id) {
100+
DatabaseEventStatus::Saved
122101
} else {
123-
let seen_event_ids = self.seen_event_ids.read().await;
124-
Ok(if seen_event_ids.contains(event_id) {
125-
DatabaseEventStatus::Saved
126-
} else {
127-
DatabaseEventStatus::NotExistent
128-
})
129-
}
102+
DatabaseEventStatus::NotExistent
103+
})
130104
}
131105

132106
async fn has_coordinate_been_deleted(
133107
&self,
134-
coordinate: &Coordinate,
135-
timestamp: &Timestamp,
108+
_coordinate: &Coordinate,
109+
_timestamp: &Timestamp,
136110
) -> Result<bool, DatabaseError> {
137-
Ok(self
138-
.helper
139-
.has_coordinate_been_deleted(coordinate, timestamp)
140-
.await)
111+
Ok(false)
141112
}
142113

143114
async fn event_id_seen(
@@ -158,27 +129,26 @@ impl NostrEventsDatabase for MemoryDatabase {
158129
Ok(seen_event_ids.get(event_id).cloned())
159130
}
160131

161-
async fn event_by_id(&self, id: &EventId) -> Result<Option<Event>, DatabaseError> {
162-
Ok(self.helper.event_by_id(id).await)
132+
async fn event_by_id(&self, _id: &EventId) -> Result<Option<Event>, DatabaseError> {
133+
Ok(None)
163134
}
164135

165-
async fn count(&self, filters: Vec<Filter>) -> Result<usize, DatabaseError> {
166-
Ok(self.helper.count(filters).await)
136+
async fn count(&self, _filters: Vec<Filter>) -> Result<usize, DatabaseError> {
137+
Ok(0)
167138
}
168139

169140
async fn query(&self, filters: Vec<Filter>) -> Result<Events, DatabaseError> {
170-
Ok(self.helper.query(filters).await)
141+
Ok(Events::new(&filters))
171142
}
172143

173144
async fn negentropy_items(
174145
&self,
175-
filter: Filter,
146+
_filter: Filter,
176147
) -> Result<Vec<(EventId, Timestamp)>, DatabaseError> {
177-
Ok(self.helper.negentropy_items(filter).await)
148+
Ok(Vec::new())
178149
}
179150

180-
async fn delete(&self, filter: Filter) -> Result<(), DatabaseError> {
181-
self.helper.delete(filter).await;
151+
async fn delete(&self, _filter: Filter) -> Result<(), DatabaseError> {
182152
Ok(())
183153
}
184154
}

crates/nostr-lmdb/src/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ impl NostrLMDB {
3939
Ok(Self {
4040
db: Store::open(path).map_err(DatabaseError::backend)?,
4141
temp: MemoryDatabase::with_opts(MemoryDatabaseOptions {
42-
events: false,
4342
max_events: Some(100_000),
4443
}),
4544
})

crates/nostr-redb/src/lib.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ impl NostrRedb {
3838
Ok(Self {
3939
db: Store::persistent(path).map_err(DatabaseError::backend)?,
4040
temp: MemoryDatabase::with_opts(MemoryDatabaseOptions {
41-
events: false,
4241
max_events: Some(100_000),
4342
}),
4443
})
@@ -50,7 +49,6 @@ impl NostrRedb {
5049
Ok(Self {
5150
db: Store::in_memory().map_err(DatabaseError::backend)?,
5251
temp: MemoryDatabase::with_opts(MemoryDatabaseOptions {
53-
events: false,
5452
max_events: Some(100_000),
5553
}),
5654
})

crates/nostr-relay-builder/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ atomic-destructor.workspace = true
2222
negentropy.workspace = true
2323
nostr = { workspace = true, default-features = false, features = ["std"] }
2424
nostr-database.workspace = true
25+
nostr-redb.workspace = true
2526
thiserror.workspace = true
2627
tokio = { workspace = true, features = ["macros", "net", "sync"] }
2728
tracing.workspace = true

crates/nostr-relay-builder/examples/local-with-hs.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,16 @@
44

55
use std::time::Duration;
66

7+
use nostr_redb::NostrRedb;
78
use nostr_relay_builder::prelude::*;
89

910
#[tokio::main]
1011
async fn main() -> Result<()> {
1112
tracing_subscriber::fmt::init();
1213

14+
let database = NostrRedb::in_memory()?;
1315
let tor = RelayBuilderHiddenService::new("rust-nostr-local-hs-test");
14-
let builder = RelayBuilder::default().tor(tor);
16+
let builder = RelayBuilder::new(database).tor(tor);
1517

1618
let relay = LocalRelay::run(builder).await?;
1719

crates/nostr-relay-builder/examples/policy.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use std::collections::HashSet;
55
use std::net::SocketAddr;
66
use std::time::Duration;
77

8+
use nostr_redb::NostrRedb;
89
use nostr_relay_builder::prelude::*;
910

1011
/// Accept only certain event kinds
@@ -54,7 +55,8 @@ async fn main() -> Result<()> {
5455

5556
let low_author_limit = RejectAuthorLimit { limit: 2 };
5657

57-
let builder = RelayBuilder::default()
58+
let database = NostrRedb::in_memory()?;
59+
let builder = RelayBuilder::new(database)
5860
.write_policy(accept_profile_data)
5961
.query_policy(low_author_limit);
6062

crates/nostr-relay-builder/src/builder.rs

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use std::sync::Arc;
1414
use std::time::Duration;
1515

1616
use nostr_database::prelude::*;
17+
use nostr_redb::NostrRedb;
1718

1819
/// Rate limit
1920
#[derive(Debug, Clone)]
@@ -190,13 +191,22 @@ pub struct RelayBuilder {
190191

191192
impl Default for RelayBuilder {
192193
fn default() -> Self {
194+
// TODO: remove?
195+
let database = NostrRedb::in_memory().unwrap();
196+
Self::new(database)
197+
}
198+
}
199+
200+
impl RelayBuilder {
201+
/// New relay builder
202+
pub fn new<T>(database: T) -> Self
203+
where
204+
T: IntoNostrEventsDatabase,
205+
{
193206
Self {
194207
addr: None,
195208
port: None,
196-
database: Arc::new(MemoryDatabase::with_opts(MemoryDatabaseOptions {
197-
events: true,
198-
max_events: Some(75_000),
199-
})),
209+
database: database.into_database(),
200210
mode: RelayBuilderMode::default(),
201211
rate_limit: RateLimit::default(),
202212
nip42: None,
@@ -209,9 +219,7 @@ impl Default for RelayBuilder {
209219
test: RelayTestOptions::default(),
210220
}
211221
}
212-
}
213222

214-
impl RelayBuilder {
215223
/// Set IP address
216224
#[inline]
217225
pub fn addr(mut self, ip: IpAddr) -> Self {
@@ -226,16 +234,6 @@ impl RelayBuilder {
226234
self
227235
}
228236

229-
/// Set database
230-
#[inline]
231-
pub fn database<D>(mut self, database: D) -> Self
232-
where
233-
D: IntoNostrEventsDatabase,
234-
{
235-
self.database = database.into_database();
236-
self
237-
}
238-
239237
/// Set mode
240238
#[inline]
241239
pub fn mode(mut self, mode: RelayBuilderMode) -> Self {

crates/nostr-relay-builder/src/error.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use std::io;
88

99
#[cfg(feature = "tor")]
1010
use async_wsocket::native::tor;
11+
use nostr_database::DatabaseError;
1112
use thiserror::Error;
1213

1314
/// Relay builder error
@@ -16,6 +17,9 @@ pub enum Error {
1617
/// I/O error
1718
#[error(transparent)]
1819
IO(#[from] io::Error),
20+
/// Database error
21+
#[error(transparent)]
22+
Database(#[from] DatabaseError),
1923
/// Tor error
2024
#[cfg(feature = "tor")]
2125
#[error(transparent)]

crates/nostr-relay-builder/src/mock.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use std::ops::Deref;
88

99
use nostr::prelude::*;
1010
use nostr_database::prelude::*;
11+
use nostr_redb::NostrRedb;
1112

1213
use crate::builder::{RelayBuilder, RelayTestOptions};
1314
use crate::error::Error;
@@ -31,7 +32,8 @@ impl MockRelay {
3132
/// Run mock relay
3233
#[inline]
3334
pub async fn run() -> Result<Self, Error> {
34-
let builder = RelayBuilder::default();
35+
let database = NostrRedb::in_memory()?;
36+
let builder = RelayBuilder::new(database);
3537
Ok(Self {
3638
local: LocalRelay::run(builder).await?,
3739
})
@@ -40,7 +42,8 @@ impl MockRelay {
4042
/// Run unresponsive relay
4143
#[inline]
4244
pub async fn run_with_opts(opts: RelayTestOptions) -> Result<Self, Error> {
43-
let builder = RelayBuilder::default().test(opts);
45+
let database = NostrRedb::in_memory()?;
46+
let builder = RelayBuilder::new(database).test(opts);
4447
Ok(Self {
4548
local: LocalRelay::run(builder).await?,
4649
})

0 commit comments

Comments
 (0)