Use Arc<EventId> in place of most EventIds
This commit is contained in:
		
							parent
							
								
									19b89ab91f
								
							
						
					
					
						commit
						9bff276fa9
					
				
					 4 changed files with 104 additions and 93 deletions
				
			
		
							
								
								
									
										77
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										77
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							|  | @ -324,9 +324,9 @@ checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b" | ||||||
| 
 | 
 | ||||||
| [[package]] | [[package]] | ||||||
| name = "cpufeatures" | name = "cpufeatures" | ||||||
| version = "0.1.5" | version = "0.2.1" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
| checksum = "66c99696f6c9dd7f35d486b9d04d7e6e202aa3e8c40d553f2fdf5e7e0c6a71ef" | checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "libc", |  "libc", | ||||||
| ] | ] | ||||||
|  | @ -2061,9 +2061,8 @@ dependencies = [ | ||||||
| 
 | 
 | ||||||
| [[package]] | [[package]] | ||||||
| name = "ruma" | name = "ruma" | ||||||
| version = "0.4.0" | version = "0.3.0" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "git+https://github.com/DevinR528/ruma?rev=c7860fcb89dbde636e2c83d0636934fb9924f40c#c7860fcb89dbde636e2c83d0636934fb9924f40c" | ||||||
| checksum = "668031e3108d6a2cfbe6eca271d8698f4593440e71a44afdadcf67ce3cb93c1f" |  | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "assign", |  "assign", | ||||||
|  "js_int", |  "js_int", | ||||||
|  | @ -2084,8 +2083,7 @@ dependencies = [ | ||||||
| [[package]] | [[package]] | ||||||
| name = "ruma-api" | name = "ruma-api" | ||||||
| version = "0.18.3" | version = "0.18.3" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "git+https://github.com/DevinR528/ruma?rev=c7860fcb89dbde636e2c83d0636934fb9924f40c#c7860fcb89dbde636e2c83d0636934fb9924f40c" | ||||||
| checksum = "f5f1843792b6749ec1ece62595cf99ad30bf9589c96bb237515235e71da396ea" |  | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "bytes", |  "bytes", | ||||||
|  "http", |  "http", | ||||||
|  | @ -2101,8 +2099,7 @@ dependencies = [ | ||||||
| [[package]] | [[package]] | ||||||
| name = "ruma-api-macros" | name = "ruma-api-macros" | ||||||
| version = "0.18.3" | version = "0.18.3" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "git+https://github.com/DevinR528/ruma?rev=c7860fcb89dbde636e2c83d0636934fb9924f40c#c7860fcb89dbde636e2c83d0636934fb9924f40c" | ||||||
| checksum = "7b18abda5cca94178d08b622bca042e1cbb5eb7d4ebf3a2a81590a3bb3c57008" |  | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "proc-macro-crate", |  "proc-macro-crate", | ||||||
|  "proc-macro2", |  "proc-macro2", | ||||||
|  | @ -2113,8 +2110,7 @@ dependencies = [ | ||||||
| [[package]] | [[package]] | ||||||
| name = "ruma-appservice-api" | name = "ruma-appservice-api" | ||||||
| version = "0.4.0" | version = "0.4.0" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "git+https://github.com/DevinR528/ruma?rev=c7860fcb89dbde636e2c83d0636934fb9924f40c#c7860fcb89dbde636e2c83d0636934fb9924f40c" | ||||||
| checksum = "49369332a5f299e832e19661f92d49e08c345c3c6c4ab16e09cb31c5ff6da878" |  | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "ruma-api", |  "ruma-api", | ||||||
|  "ruma-common", |  "ruma-common", | ||||||
|  | @ -2128,8 +2124,7 @@ dependencies = [ | ||||||
| [[package]] | [[package]] | ||||||
| name = "ruma-client-api" | name = "ruma-client-api" | ||||||
| version = "0.12.2" | version = "0.12.2" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "git+https://github.com/DevinR528/ruma?rev=c7860fcb89dbde636e2c83d0636934fb9924f40c#c7860fcb89dbde636e2c83d0636934fb9924f40c" | ||||||
| checksum = "9568a222c12cf6220e751484ab78feec28071f85965113a5bb802936a2920ff0" |  | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "assign", |  "assign", | ||||||
|  "bytes", |  "bytes", | ||||||
|  | @ -2149,8 +2144,7 @@ dependencies = [ | ||||||
| [[package]] | [[package]] | ||||||
| name = "ruma-common" | name = "ruma-common" | ||||||
| version = "0.6.0" | version = "0.6.0" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "git+https://github.com/DevinR528/ruma?rev=c7860fcb89dbde636e2c83d0636934fb9924f40c#c7860fcb89dbde636e2c83d0636934fb9924f40c" | ||||||
| checksum = "41d5b7605f58dc0d9cf1848cc7f1af2bae4e4bcd1d2b7a87bbb9864c8a785b91" |  | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "indexmap", |  "indexmap", | ||||||
|  "js_int", |  "js_int", | ||||||
|  | @ -2164,9 +2158,8 @@ dependencies = [ | ||||||
| 
 | 
 | ||||||
| [[package]] | [[package]] | ||||||
| name = "ruma-events" | name = "ruma-events" | ||||||
| version = "0.24.5" | version = "0.24.4" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "git+https://github.com/DevinR528/ruma?rev=c7860fcb89dbde636e2c83d0636934fb9924f40c#c7860fcb89dbde636e2c83d0636934fb9924f40c" | ||||||
| checksum = "87801e1207cfebdee02e7997ebf181a1c9837260b78c1b8ce96b896a2bcb3763" |  | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "indoc", |  "indoc", | ||||||
|  "js_int", |  "js_int", | ||||||
|  | @ -2181,9 +2174,8 @@ dependencies = [ | ||||||
| 
 | 
 | ||||||
| [[package]] | [[package]] | ||||||
| name = "ruma-events-macros" | name = "ruma-events-macros" | ||||||
| version = "0.24.5" | version = "0.24.4" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "git+https://github.com/DevinR528/ruma?rev=c7860fcb89dbde636e2c83d0636934fb9924f40c#c7860fcb89dbde636e2c83d0636934fb9924f40c" | ||||||
| checksum = "5da4498845347de88adf1b7da4578e2ca7355ad4ce47b0976f6594bacf958660" |  | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "proc-macro-crate", |  "proc-macro-crate", | ||||||
|  "proc-macro2", |  "proc-macro2", | ||||||
|  | @ -2194,8 +2186,7 @@ dependencies = [ | ||||||
| [[package]] | [[package]] | ||||||
| name = "ruma-federation-api" | name = "ruma-federation-api" | ||||||
| version = "0.3.0" | version = "0.3.0" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "git+https://github.com/DevinR528/ruma?rev=c7860fcb89dbde636e2c83d0636934fb9924f40c#c7860fcb89dbde636e2c83d0636934fb9924f40c" | ||||||
| checksum = "c61c9adbe1a29c301ae627604406d60102c89fc833b110cd35bbf29ae205ea6c" |  | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "js_int", |  "js_int", | ||||||
|  "ruma-api", |  "ruma-api", | ||||||
|  | @ -2210,8 +2201,7 @@ dependencies = [ | ||||||
| [[package]] | [[package]] | ||||||
| name = "ruma-identifiers" | name = "ruma-identifiers" | ||||||
| version = "0.20.0" | version = "0.20.0" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "git+https://github.com/DevinR528/ruma?rev=c7860fcb89dbde636e2c83d0636934fb9924f40c#c7860fcb89dbde636e2c83d0636934fb9924f40c" | ||||||
| checksum = "cb417d091e8dd5a633e4e5998231a156049d7fcc221045cfdc0642eb72067732" |  | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "paste", |  "paste", | ||||||
|  "rand 0.8.4", |  "rand 0.8.4", | ||||||
|  | @ -2225,8 +2215,7 @@ dependencies = [ | ||||||
| [[package]] | [[package]] | ||||||
| name = "ruma-identifiers-macros" | name = "ruma-identifiers-macros" | ||||||
| version = "0.20.0" | version = "0.20.0" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "git+https://github.com/DevinR528/ruma?rev=c7860fcb89dbde636e2c83d0636934fb9924f40c#c7860fcb89dbde636e2c83d0636934fb9924f40c" | ||||||
| checksum = "c708edad7f605638f26c951cbad7501fbf28ab01009e5ca65ea5a2db74a882b1" |  | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "quote", |  "quote", | ||||||
|  "ruma-identifiers-validation", |  "ruma-identifiers-validation", | ||||||
|  | @ -2236,14 +2225,15 @@ dependencies = [ | ||||||
| [[package]] | [[package]] | ||||||
| name = "ruma-identifiers-validation" | name = "ruma-identifiers-validation" | ||||||
| version = "0.5.0" | version = "0.5.0" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "git+https://github.com/DevinR528/ruma?rev=c7860fcb89dbde636e2c83d0636934fb9924f40c#c7860fcb89dbde636e2c83d0636934fb9924f40c" | ||||||
| checksum = "42285e7fb5d5f2d5268e45bb683e36d5c6fd9fc1e11a4559ba3c3521f3bbb2cb" | dependencies = [ | ||||||
|  |  "thiserror", | ||||||
|  | ] | ||||||
| 
 | 
 | ||||||
| [[package]] | [[package]] | ||||||
| name = "ruma-identity-service-api" | name = "ruma-identity-service-api" | ||||||
| version = "0.3.0" | version = "0.3.0" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "git+https://github.com/DevinR528/ruma?rev=c7860fcb89dbde636e2c83d0636934fb9924f40c#c7860fcb89dbde636e2c83d0636934fb9924f40c" | ||||||
| checksum = "e76e66e24f2d5a31511fbf6c79e79f67a7a6a98ebf48d72381b7d5bb6c09f035" |  | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "js_int", |  "js_int", | ||||||
|  "ruma-api", |  "ruma-api", | ||||||
|  | @ -2256,8 +2246,7 @@ dependencies = [ | ||||||
| [[package]] | [[package]] | ||||||
| name = "ruma-push-gateway-api" | name = "ruma-push-gateway-api" | ||||||
| version = "0.3.0" | version = "0.3.0" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "git+https://github.com/DevinR528/ruma?rev=c7860fcb89dbde636e2c83d0636934fb9924f40c#c7860fcb89dbde636e2c83d0636934fb9924f40c" | ||||||
| checksum = "5ef5b29da7065efc5b1e1a8f61add7543c9ab4ecce5ee0dd1c1c5ecec83fbeec" |  | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "js_int", |  "js_int", | ||||||
|  "ruma-api", |  "ruma-api", | ||||||
|  | @ -2272,8 +2261,7 @@ dependencies = [ | ||||||
| [[package]] | [[package]] | ||||||
| name = "ruma-serde" | name = "ruma-serde" | ||||||
| version = "0.5.0" | version = "0.5.0" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "git+https://github.com/DevinR528/ruma?rev=c7860fcb89dbde636e2c83d0636934fb9924f40c#c7860fcb89dbde636e2c83d0636934fb9924f40c" | ||||||
| checksum = "8b2b22aae842e7ecda695e42b7b39d4558959d9d9a27acc2a16acf4f4f7f00c3" |  | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "bytes", |  "bytes", | ||||||
|  "form_urlencoded", |  "form_urlencoded", | ||||||
|  | @ -2287,8 +2275,7 @@ dependencies = [ | ||||||
| [[package]] | [[package]] | ||||||
| name = "ruma-serde-macros" | name = "ruma-serde-macros" | ||||||
| version = "0.5.0" | version = "0.5.0" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "git+https://github.com/DevinR528/ruma?rev=c7860fcb89dbde636e2c83d0636934fb9924f40c#c7860fcb89dbde636e2c83d0636934fb9924f40c" | ||||||
| checksum = "243e9bef188b08f94c79bc2f8fd1eb307a9e636b2b8e4571acf8c7be16381d28" |  | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "proc-macro-crate", |  "proc-macro-crate", | ||||||
|  "proc-macro2", |  "proc-macro2", | ||||||
|  | @ -2299,8 +2286,7 @@ dependencies = [ | ||||||
| [[package]] | [[package]] | ||||||
| name = "ruma-signatures" | name = "ruma-signatures" | ||||||
| version = "0.9.0" | version = "0.9.0" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "git+https://github.com/DevinR528/ruma?rev=c7860fcb89dbde636e2c83d0636934fb9924f40c#c7860fcb89dbde636e2c83d0636934fb9924f40c" | ||||||
| checksum = "4a4f64027165b59500162d10d435b1253898bf3ad4f5002cb0d56913fe7f76d7" |  | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "base64 0.13.0", |  "base64 0.13.0", | ||||||
|  "ed25519-dalek", |  "ed25519-dalek", | ||||||
|  | @ -2316,9 +2302,8 @@ dependencies = [ | ||||||
| 
 | 
 | ||||||
| [[package]] | [[package]] | ||||||
| name = "ruma-state-res" | name = "ruma-state-res" | ||||||
| version = "0.4.0" | version = "0.3.0" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "git+https://github.com/DevinR528/ruma?rev=c7860fcb89dbde636e2c83d0636934fb9924f40c#c7860fcb89dbde636e2c83d0636934fb9924f40c" | ||||||
| checksum = "796427aaa2d266238c5c1b1a6ca4640a4d282ec2cb2e844c69a8f3a262d3db15" |  | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "itertools 0.10.1", |  "itertools 0.10.1", | ||||||
|  "js_int", |  "js_int", | ||||||
|  | @ -2522,9 +2507,9 @@ dependencies = [ | ||||||
| 
 | 
 | ||||||
| [[package]] | [[package]] | ||||||
| name = "serde_yaml" | name = "serde_yaml" | ||||||
| version = "0.8.19" | version = "0.8.20" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
| checksum = "6375dbd828ed6964c3748e4ef6d18e7a175d408ffe184bca01698d0c73f915a9" | checksum = "ad104641f3c958dab30eb3010e834c2622d1f3f4c530fef1dee20ad9485f3c09" | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "dtoa", |  "dtoa", | ||||||
|  "indexmap", |  "indexmap", | ||||||
|  | @ -2540,9 +2525,9 @@ checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" | ||||||
| 
 | 
 | ||||||
| [[package]] | [[package]] | ||||||
| name = "sha2" | name = "sha2" | ||||||
| version = "0.9.5" | version = "0.9.6" | ||||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | source = "registry+https://github.com/rust-lang/crates.io-index" | ||||||
| checksum = "b362ae5752fd2137731f9fa25fd4d9058af34666ca1966fb969119cc35719f12" | checksum = "9204c41a1597a8c5af23c82d1c921cb01ec0a4c59e07a9c7306062829a3903f3" | ||||||
| dependencies = [ | dependencies = [ | ||||||
|  "block-buffer", |  "block-buffer", | ||||||
|  "cfg-if 1.0.0", |  "cfg-if 1.0.0", | ||||||
|  |  | ||||||
|  | @ -18,9 +18,9 @@ edition = "2018" | ||||||
| rocket = { version = "0.5.0-rc.1", features = ["tls"] } # Used to handle requests | rocket = { version = "0.5.0-rc.1", features = ["tls"] } # Used to handle requests | ||||||
| 
 | 
 | ||||||
| # Used for matrix spec type definitions and helpers | # Used for matrix spec type definitions and helpers | ||||||
| ruma = { version = "0.4.0", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-pre-spec", "unstable-exhaustive-types"] } | #ruma = { version = "0.4.0", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-pre-spec", "unstable-exhaustive-types"] } | ||||||
| #ruma = { git = "https://github.com/ruma/ruma", rev = "f5ab038e22421ed338396ece977b6b2844772ced", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-pre-spec", "unstable-exhaustive-types"] } | #ruma = { git = "https://github.com/ruma/ruma", rev = "f5ab038e22421ed338396ece977b6b2844772ced", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-pre-spec", "unstable-exhaustive-types"] } | ||||||
| #ruma = { git = "https://github.com/timokoesters/ruma", rev = "2215049b60a1c3358f5a52215adf1e7bb88619a1", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-pre-spec", "unstable-exhaustive-types"] } | ruma = { git = "https://github.com/DevinR528/ruma", rev = "c7860fcb89dbde636e2c83d0636934fb9924f40c", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-pre-spec", "unstable-exhaustive-types"] } | ||||||
| #ruma = { path = "../ruma/crates/ruma", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-pre-spec", "unstable-exhaustive-types"] } | #ruma = { path = "../ruma/crates/ruma", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-pre-spec", "unstable-exhaustive-types"] } | ||||||
| 
 | 
 | ||||||
| # Used for long polling and federation sender, should be the same as rocket::tokio | # Used for long polling and federation sender, should be the same as rocket::tokio | ||||||
|  |  | ||||||
|  | @ -3,7 +3,7 @@ mod edus; | ||||||
| pub use edus::RoomEdus; | pub use edus::RoomEdus; | ||||||
| use member::MembershipState; | use member::MembershipState; | ||||||
| 
 | 
 | ||||||
| use crate::{Database, Error, PduEvent, Result, pdu::PduBuilder, server_server, utils}; | use crate::{pdu::PduBuilder, server_server, utils, Database, Error, PduEvent, Result}; | ||||||
| use lru_cache::LruCache; | use lru_cache::LruCache; | ||||||
| use regex::Regex; | use regex::Regex; | ||||||
| use ring::digest; | use ring::digest; | ||||||
|  | @ -22,7 +22,13 @@ use ruma::{ | ||||||
|     state_res::{self, RoomVersion, StateMap}, |     state_res::{self, RoomVersion, StateMap}, | ||||||
|     uint, EventId, RoomAliasId, RoomId, RoomVersionId, ServerName, UserId, |     uint, EventId, RoomAliasId, RoomId, RoomVersionId, ServerName, UserId, | ||||||
| }; | }; | ||||||
| use std::{collections::{BTreeMap, HashMap, HashSet}, convert::{TryFrom, TryInto}, mem::size_of, sync::{Arc, Mutex}, time::Instant}; | use std::{ | ||||||
|  |     collections::{BTreeMap, HashMap, HashSet}, | ||||||
|  |     convert::{TryFrom, TryInto}, | ||||||
|  |     mem::size_of, | ||||||
|  |     sync::{Arc, Mutex}, | ||||||
|  |     time::Instant, | ||||||
|  | }; | ||||||
| use tokio::sync::MutexGuard; | use tokio::sync::MutexGuard; | ||||||
| use tracing::{error, warn}; | use tracing::{error, warn}; | ||||||
| 
 | 
 | ||||||
|  | @ -89,8 +95,8 @@ pub struct Rooms { | ||||||
|     pub(super) referencedevents: Arc<dyn Tree>, |     pub(super) referencedevents: Arc<dyn Tree>, | ||||||
| 
 | 
 | ||||||
|     pub(super) pdu_cache: Mutex<LruCache<EventId, Arc<PduEvent>>>, |     pub(super) pdu_cache: Mutex<LruCache<EventId, Arc<PduEvent>>>, | ||||||
|  |     pub(super) shorteventid_cache: Mutex<LruCache<u64, Arc<EventId>>>, | ||||||
|     pub(super) auth_chain_cache: Mutex<LruCache<Vec<u64>, Arc<HashSet<u64>>>>, |     pub(super) auth_chain_cache: Mutex<LruCache<Vec<u64>, Arc<HashSet<u64>>>>, | ||||||
|     pub(super) shorteventid_cache: Mutex<LruCache<u64, EventId>>, |  | ||||||
|     pub(super) eventidshort_cache: Mutex<LruCache<EventId, u64>>, |     pub(super) eventidshort_cache: Mutex<LruCache<EventId, u64>>, | ||||||
|     pub(super) statekeyshort_cache: Mutex<LruCache<(EventType, String), u64>>, |     pub(super) statekeyshort_cache: Mutex<LruCache<(EventType, String), u64>>, | ||||||
|     pub(super) shortstatekey_cache: Mutex<LruCache<u64, (EventType, String)>>, |     pub(super) shortstatekey_cache: Mutex<LruCache<u64, (EventType, String)>>, | ||||||
|  | @ -111,7 +117,7 @@ impl Rooms { | ||||||
|     /// Builds a StateMap by iterating over all keys that start
 |     /// Builds a StateMap by iterating over all keys that start
 | ||||||
|     /// with state_hash, this gives the full state for the given state_hash.
 |     /// with state_hash, this gives the full state for the given state_hash.
 | ||||||
|     #[tracing::instrument(skip(self))] |     #[tracing::instrument(skip(self))] | ||||||
|     pub fn state_full_ids(&self, shortstatehash: u64) -> Result<BTreeMap<u64, EventId>> { |     pub fn state_full_ids(&self, shortstatehash: u64) -> Result<BTreeMap<u64, Arc<EventId>>> { | ||||||
|         let full_state = self |         let full_state = self | ||||||
|             .load_shortstatehash_info(shortstatehash)? |             .load_shortstatehash_info(shortstatehash)? | ||||||
|             .pop() |             .pop() | ||||||
|  | @ -162,7 +168,7 @@ impl Rooms { | ||||||
|         shortstatehash: u64, |         shortstatehash: u64, | ||||||
|         event_type: &EventType, |         event_type: &EventType, | ||||||
|         state_key: &str, |         state_key: &str, | ||||||
|     ) -> Result<Option<EventId>> { |     ) -> Result<Option<Arc<EventId>>> { | ||||||
|         let shortstatekey = match self.get_shortstatekey(event_type, state_key)? { |         let shortstatekey = match self.get_shortstatekey(event_type, state_key)? { | ||||||
|             Some(s) => s, |             Some(s) => s, | ||||||
|             None => return Ok(None), |             None => return Ok(None), | ||||||
|  | @ -518,7 +524,7 @@ impl Rooms { | ||||||
|     pub fn parse_compressed_state_event( |     pub fn parse_compressed_state_event( | ||||||
|         &self, |         &self, | ||||||
|         compressed_event: CompressedStateEvent, |         compressed_event: CompressedStateEvent, | ||||||
|     ) -> Result<(u64, EventId)> { |     ) -> Result<(u64, Arc<EventId>)> { | ||||||
|         Ok(( |         Ok(( | ||||||
|             utils::u64_from_bytes(&compressed_event[0..size_of::<u64>()]) |             utils::u64_from_bytes(&compressed_event[0..size_of::<u64>()]) | ||||||
|                 .expect("bytes have right length"), |                 .expect("bytes have right length"), | ||||||
|  | @ -834,14 +840,14 @@ impl Rooms { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     #[tracing::instrument(skip(self))] |     #[tracing::instrument(skip(self))] | ||||||
|     pub fn get_eventid_from_short(&self, shorteventid: u64) -> Result<EventId> { |     pub fn get_eventid_from_short(&self, shorteventid: u64) -> Result<Arc<EventId>> { | ||||||
|         if let Some(id) = self |         if let Some(id) = self | ||||||
|             .shorteventid_cache |             .shorteventid_cache | ||||||
|             .lock() |             .lock() | ||||||
|             .unwrap() |             .unwrap() | ||||||
|             .get_mut(&shorteventid) |             .get_mut(&shorteventid) | ||||||
|         { |         { | ||||||
|             return Ok(id.clone()); |             return Ok(Arc::clone(id)); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         let bytes = self |         let bytes = self | ||||||
|  | @ -849,15 +855,17 @@ impl Rooms { | ||||||
|             .get(&shorteventid.to_be_bytes())? |             .get(&shorteventid.to_be_bytes())? | ||||||
|             .ok_or_else(|| Error::bad_database("Shorteventid does not exist"))?; |             .ok_or_else(|| Error::bad_database("Shorteventid does not exist"))?; | ||||||
| 
 | 
 | ||||||
|         let event_id = EventId::try_from(utils::string_from_bytes(&bytes).map_err(|_| { |         let event_id = Arc::new( | ||||||
|  |             EventId::try_from(utils::string_from_bytes(&bytes).map_err(|_| { | ||||||
|                 Error::bad_database("EventID in shorteventid_eventid is invalid unicode.") |                 Error::bad_database("EventID in shorteventid_eventid is invalid unicode.") | ||||||
|             })?) |             })?) | ||||||
|         .map_err(|_| Error::bad_database("EventId in shorteventid_eventid is invalid."))?; |             .map_err(|_| Error::bad_database("EventId in shorteventid_eventid is invalid."))?, | ||||||
|  |         ); | ||||||
| 
 | 
 | ||||||
|         self.shorteventid_cache |         self.shorteventid_cache | ||||||
|             .lock() |             .lock() | ||||||
|             .unwrap() |             .unwrap() | ||||||
|             .insert(shorteventid, event_id.clone()); |             .insert(shorteventid, Arc::clone(&event_id)); | ||||||
| 
 | 
 | ||||||
|         Ok(event_id) |         Ok(event_id) | ||||||
|     } |     } | ||||||
|  | @ -924,7 +932,7 @@ impl Rooms { | ||||||
|         room_id: &RoomId, |         room_id: &RoomId, | ||||||
|         event_type: &EventType, |         event_type: &EventType, | ||||||
|         state_key: &str, |         state_key: &str, | ||||||
|     ) -> Result<Option<EventId>> { |     ) -> Result<Option<Arc<EventId>>> { | ||||||
|         if let Some(current_shortstatehash) = self.current_shortstatehash(room_id)? { |         if let Some(current_shortstatehash) = self.current_shortstatehash(room_id)? { | ||||||
|             self.state_get_id(current_shortstatehash, event_type, state_key) |             self.state_get_id(current_shortstatehash, event_type, state_key) | ||||||
|         } else { |         } else { | ||||||
|  | @ -1514,8 +1522,10 @@ impl Rooms { | ||||||
|                                     if args.len() == 1 { |                                     if args.len() == 1 { | ||||||
|                                         if let Ok(event_id) = EventId::try_from(args[0]) { |                                         if let Ok(event_id) = EventId::try_from(args[0]) { | ||||||
|                                             let start = Instant::now(); |                                             let start = Instant::now(); | ||||||
|                                             let count = |                                             let count = server_server::get_auth_chain( | ||||||
|                                                 server_server::get_auth_chain(vec![event_id], db)? |                                                 vec![Arc::new(event_id)], | ||||||
|  |                                                 db, | ||||||
|  |                                             )? | ||||||
|                                             .count(); |                                             .count(); | ||||||
|                                             let elapsed = start.elapsed(); |                                             let elapsed = start.elapsed(); | ||||||
|                                             db.admin.send(AdminCommand::SendMessage( |                                             db.admin.send(AdminCommand::SendMessage( | ||||||
|  |  | ||||||
|  | @ -967,7 +967,12 @@ pub async fn handle_incoming_pdu<'a>( | ||||||
|     // 9. Fetch any missing prev events doing all checks listed here starting at 1. These are timeline events
 |     // 9. Fetch any missing prev events doing all checks listed here starting at 1. These are timeline events
 | ||||||
|     let mut graph = HashMap::new(); |     let mut graph = HashMap::new(); | ||||||
|     let mut eventid_info = HashMap::new(); |     let mut eventid_info = HashMap::new(); | ||||||
|     let mut todo_outlier_stack = incoming_pdu.prev_events.clone(); |     let mut todo_outlier_stack = incoming_pdu | ||||||
|  |         .prev_events | ||||||
|  |         .iter() | ||||||
|  |         .cloned() | ||||||
|  |         .map(Arc::new) | ||||||
|  |         .collect::<Vec<_>>(); | ||||||
| 
 | 
 | ||||||
|     let mut amount = 0; |     let mut amount = 0; | ||||||
| 
 | 
 | ||||||
|  | @ -1003,13 +1008,13 @@ pub async fn handle_incoming_pdu<'a>( | ||||||
|                     amount += 1; |                     amount += 1; | ||||||
|                     for prev_prev in &pdu.prev_events { |                     for prev_prev in &pdu.prev_events { | ||||||
|                         if !graph.contains_key(prev_prev) { |                         if !graph.contains_key(prev_prev) { | ||||||
|                             todo_outlier_stack.push(dbg!(prev_prev.clone())); |                             todo_outlier_stack.push(dbg!(Arc::new(prev_prev.clone()))); | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
| 
 | 
 | ||||||
|                     graph.insert( |                     graph.insert( | ||||||
|                         prev_event_id.clone(), |                         prev_event_id.clone(), | ||||||
|                         pdu.prev_events.iter().cloned().collect(), |                         pdu.prev_events.iter().cloned().map(Arc::new).collect(), | ||||||
|                     ); |                     ); | ||||||
|                     eventid_info.insert(prev_event_id.clone(), (pdu, json)); |                     eventid_info.insert(prev_event_id.clone(), (pdu, json)); | ||||||
|                 } else { |                 } else { | ||||||
|  | @ -1038,9 +1043,9 @@ pub async fn handle_incoming_pdu<'a>( | ||||||
|                 MilliSecondsSinceUnixEpoch( |                 MilliSecondsSinceUnixEpoch( | ||||||
|                     eventid_info |                     eventid_info | ||||||
|                         .get(event_id) |                         .get(event_id) | ||||||
|                         .map_or_else(|| uint!(0), |info| info.0.origin_server_ts.clone()), |                         .map_or_else(|| uint!(0), |info| info.0.origin_server_ts), | ||||||
|                 ), |                 ), | ||||||
|                 ruma::event_id!("$notimportant"), |                 Arc::new(ruma::event_id!("$notimportant")), | ||||||
|             )) |             )) | ||||||
|         }) |         }) | ||||||
|         .map_err(|_| "Error sorting prev events".to_owned())?; |         .map_err(|_| "Error sorting prev events".to_owned())?; | ||||||
|  | @ -1158,7 +1163,12 @@ fn handle_outlier_pdu<'a>( | ||||||
|         fetch_and_handle_outliers( |         fetch_and_handle_outliers( | ||||||
|             db, |             db, | ||||||
|             origin, |             origin, | ||||||
|             &incoming_pdu.auth_events, |             &incoming_pdu | ||||||
|  |                 .auth_events | ||||||
|  |                 .iter() | ||||||
|  |                 .cloned() | ||||||
|  |                 .map(Arc::new) | ||||||
|  |                 .collect::<Vec<_>>(), | ||||||
|             &create_event, |             &create_event, | ||||||
|             &room_id, |             &room_id, | ||||||
|             pub_key_map, |             pub_key_map, | ||||||
|  | @ -1227,7 +1237,7 @@ fn handle_outlier_pdu<'a>( | ||||||
|         if !state_res::event_auth::auth_check( |         if !state_res::event_auth::auth_check( | ||||||
|             &room_version, |             &room_version, | ||||||
|             &incoming_pdu, |             &incoming_pdu, | ||||||
|             previous_create.clone(), |             previous_create, | ||||||
|             None, // TODO: third party invite
 |             None, // TODO: third party invite
 | ||||||
|             |k, s| auth_events.get(&(k.clone(), s.to_owned())).map(Arc::clone), |             |k, s| auth_events.get(&(k.clone(), s.to_owned())).map(Arc::clone), | ||||||
|         ) |         ) | ||||||
|  | @ -1293,7 +1303,7 @@ async fn upgrade_outlier_to_timeline_pdu( | ||||||
|                     .get_or_create_shortstatekey(&prev_pdu.kind, state_key, &db.globals) |                     .get_or_create_shortstatekey(&prev_pdu.kind, state_key, &db.globals) | ||||||
|                     .map_err(|_| "Failed to create shortstatekey.".to_owned())?; |                     .map_err(|_| "Failed to create shortstatekey.".to_owned())?; | ||||||
| 
 | 
 | ||||||
|                 state.insert(shortstatekey, prev_event.clone()); |                 state.insert(shortstatekey, Arc::new(prev_event.clone())); | ||||||
|                 // Now it's the state after the pdu
 |                 // Now it's the state after the pdu
 | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|  | @ -1323,7 +1333,11 @@ async fn upgrade_outlier_to_timeline_pdu( | ||||||
|                 let state_vec = fetch_and_handle_outliers( |                 let state_vec = fetch_and_handle_outliers( | ||||||
|                     &db, |                     &db, | ||||||
|                     origin, |                     origin, | ||||||
|                     &res.pdu_ids, |                     &res.pdu_ids | ||||||
|  |                         .iter() | ||||||
|  |                         .cloned() | ||||||
|  |                         .map(Arc::new) | ||||||
|  |                         .collect::<Vec<_>>(), | ||||||
|                     &create_event, |                     &create_event, | ||||||
|                     &room_id, |                     &room_id, | ||||||
|                     pub_key_map, |                     pub_key_map, | ||||||
|  | @ -1344,7 +1358,7 @@ async fn upgrade_outlier_to_timeline_pdu( | ||||||
| 
 | 
 | ||||||
|                     match state.entry(shortstatekey) { |                     match state.entry(shortstatekey) { | ||||||
|                         btree_map::Entry::Vacant(v) => { |                         btree_map::Entry::Vacant(v) => { | ||||||
|                             v.insert(pdu.event_id.clone()); |                             v.insert(Arc::new(pdu.event_id.clone())); | ||||||
|                         } |                         } | ||||||
|                         btree_map::Entry::Occupied(_) => return Err( |                         btree_map::Entry::Occupied(_) => return Err( | ||||||
|                             "State event's type and state_key combination exists multiple times." |                             "State event's type and state_key combination exists multiple times." | ||||||
|  | @ -1360,7 +1374,9 @@ async fn upgrade_outlier_to_timeline_pdu( | ||||||
|                     .map_err(|_| "Failed to talk to db.")? |                     .map_err(|_| "Failed to talk to db.")? | ||||||
|                     .expect("Room exists"); |                     .expect("Room exists"); | ||||||
| 
 | 
 | ||||||
|                 if state.get(&create_shortstatekey) != Some(&create_event.event_id) { |                 if state.get(&create_shortstatekey).map(|id| id.as_ref()) | ||||||
|  |                     != Some(&create_event.event_id) | ||||||
|  |                 { | ||||||
|                     return Err("Incoming event refers to wrong create event.".to_owned()); |                     return Err("Incoming event refers to wrong create event.".to_owned()); | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|  | @ -1525,7 +1541,7 @@ async fn upgrade_outlier_to_timeline_pdu( | ||||||
|                     .rooms |                     .rooms | ||||||
|                     .get_or_create_shortstatekey(&leaf_pdu.kind, state_key, &db.globals) |                     .get_or_create_shortstatekey(&leaf_pdu.kind, state_key, &db.globals) | ||||||
|                     .map_err(|_| "Failed to create shortstatekey.".to_owned())?; |                     .map_err(|_| "Failed to create shortstatekey.".to_owned())?; | ||||||
|                 leaf_state.insert(shortstatekey, leaf_pdu.event_id.clone()); |                 leaf_state.insert(shortstatekey, Arc::new(leaf_pdu.event_id.clone())); | ||||||
|                 // Now it's the state after the pdu
 |                 // Now it's the state after the pdu
 | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|  | @ -1540,9 +1556,9 @@ async fn upgrade_outlier_to_timeline_pdu( | ||||||
|                 .get_or_create_shortstatekey(&incoming_pdu.kind, state_key, &db.globals) |                 .get_or_create_shortstatekey(&incoming_pdu.kind, state_key, &db.globals) | ||||||
|                 .map_err(|_| "Failed to create shortstatekey.".to_owned())?; |                 .map_err(|_| "Failed to create shortstatekey.".to_owned())?; | ||||||
| 
 | 
 | ||||||
|             state_after.insert(shortstatekey, incoming_pdu.event_id.clone()); |             state_after.insert(shortstatekey, Arc::new(incoming_pdu.event_id.clone())); | ||||||
|         } |         } | ||||||
|         fork_states.push(state_after.clone()); |         fork_states.push(state_after); | ||||||
| 
 | 
 | ||||||
|         let mut update_state = false; |         let mut update_state = false; | ||||||
|         // 14. Use state resolution to find new room state
 |         // 14. Use state resolution to find new room state
 | ||||||
|  | @ -1688,7 +1704,7 @@ async fn upgrade_outlier_to_timeline_pdu( | ||||||
| pub(crate) fn fetch_and_handle_outliers<'a>( | pub(crate) fn fetch_and_handle_outliers<'a>( | ||||||
|     db: &'a Database, |     db: &'a Database, | ||||||
|     origin: &'a ServerName, |     origin: &'a ServerName, | ||||||
|     events: &'a [EventId], |     events: &'a [Arc<EventId>], | ||||||
|     create_event: &'a PduEvent, |     create_event: &'a PduEvent, | ||||||
|     room_id: &'a RoomId, |     room_id: &'a RoomId, | ||||||
|     pub_key_map: &'a RwLock<BTreeMap<String, BTreeMap<String, String>>>, |     pub_key_map: &'a RwLock<BTreeMap<String, BTreeMap<String, String>>>, | ||||||
|  | @ -1743,7 +1759,7 @@ pub(crate) fn fetch_and_handle_outliers<'a>( | ||||||
|                                 match crate::pdu::gen_event_id_canonical_json(&res.pdu) { |                                 match crate::pdu::gen_event_id_canonical_json(&res.pdu) { | ||||||
|                                     Ok(t) => t, |                                     Ok(t) => t, | ||||||
|                                     Err(_) => { |                                     Err(_) => { | ||||||
|                                         back_off(id.clone()); |                                         back_off((**id).clone()); | ||||||
|                                         continue; |                                         continue; | ||||||
|                                     } |                                     } | ||||||
|                                 }; |                                 }; | ||||||
|  | @ -1763,14 +1779,14 @@ pub(crate) fn fetch_and_handle_outliers<'a>( | ||||||
|                                 Ok((pdu, json)) => (pdu, Some(json)), |                                 Ok((pdu, json)) => (pdu, Some(json)), | ||||||
|                                 Err(e) => { |                                 Err(e) => { | ||||||
|                                     warn!("Authentication of event {} failed: {:?}", id, e); |                                     warn!("Authentication of event {} failed: {:?}", id, e); | ||||||
|                                     back_off(id.clone()); |                                     back_off((**id).clone()); | ||||||
|                                     continue; |                                     continue; | ||||||
|                                 } |                                 } | ||||||
|                             } |                             } | ||||||
|                         } |                         } | ||||||
|                         Err(_) => { |                         Err(_) => { | ||||||
|                             warn!("Failed to fetch event: {}", id); |                             warn!("Failed to fetch event: {}", id); | ||||||
|                             back_off(id.clone()); |                             back_off((**id).clone()); | ||||||
|                             continue; |                             continue; | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|  | @ -2046,9 +2062,9 @@ fn append_incoming_pdu( | ||||||
| 
 | 
 | ||||||
| #[tracing::instrument(skip(starting_events, db))] | #[tracing::instrument(skip(starting_events, db))] | ||||||
| pub fn get_auth_chain( | pub fn get_auth_chain( | ||||||
|     starting_events: Vec<EventId>, |     starting_events: Vec<Arc<EventId>>, | ||||||
|     db: &Database, |     db: &Database, | ||||||
| ) -> Result<impl Iterator<Item = EventId> + '_> { | ) -> Result<impl Iterator<Item = Arc<EventId>> + '_> { | ||||||
|     const NUM_BUCKETS: usize = 50; |     const NUM_BUCKETS: usize = 50; | ||||||
| 
 | 
 | ||||||
|     let mut buckets = vec![BTreeSet::new(); NUM_BUCKETS]; |     let mut buckets = vec![BTreeSet::new(); NUM_BUCKETS]; | ||||||
|  | @ -2242,12 +2258,12 @@ pub fn get_event_authorization_route( | ||||||
|         return Err(Error::bad_config("Federation is disabled.")); |         return Err(Error::bad_config("Federation is disabled.")); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     let auth_chain_ids = get_auth_chain(vec![body.event_id.clone()], &db)?; |     let auth_chain_ids = get_auth_chain(vec![Arc::new(body.event_id.clone())], &db)?; | ||||||
| 
 | 
 | ||||||
|     Ok(get_event_authorization::v1::Response { |     Ok(get_event_authorization::v1::Response { | ||||||
|         auth_chain: auth_chain_ids |         auth_chain: auth_chain_ids | ||||||
|             .filter_map(|id| Some(db.rooms.get_pdu_json(&id).ok()??)) |             .filter_map(|id| db.rooms.get_pdu_json(&id).ok()?) | ||||||
|             .map(|event| PduEvent::convert_to_outgoing_federation_event(event)) |             .map(PduEvent::convert_to_outgoing_federation_event) | ||||||
|             .collect(), |             .collect(), | ||||||
|     } |     } | ||||||
|     .into()) |     .into()) | ||||||
|  | @ -2285,7 +2301,7 @@ pub fn get_room_state_route( | ||||||
|         }) |         }) | ||||||
|         .collect(); |         .collect(); | ||||||
| 
 | 
 | ||||||
|     let auth_chain_ids = get_auth_chain(vec![body.event_id.clone()], &db)?; |     let auth_chain_ids = get_auth_chain(vec![Arc::new(body.event_id.clone())], &db)?; | ||||||
| 
 | 
 | ||||||
|     Ok(get_room_state::v1::Response { |     Ok(get_room_state::v1::Response { | ||||||
|         auth_chain: auth_chain_ids |         auth_chain: auth_chain_ids | ||||||
|  | @ -2326,13 +2342,13 @@ pub fn get_room_state_ids_route( | ||||||
|         .rooms |         .rooms | ||||||
|         .state_full_ids(shortstatehash)? |         .state_full_ids(shortstatehash)? | ||||||
|         .into_iter() |         .into_iter() | ||||||
|         .map(|(_, id)| id) |         .map(|(_, id)| (*id).clone()) | ||||||
|         .collect(); |         .collect(); | ||||||
| 
 | 
 | ||||||
|     let auth_chain_ids = get_auth_chain(vec![body.event_id.clone()], &db)?; |     let auth_chain_ids = get_auth_chain(vec![Arc::new(body.event_id.clone())], &db)?; | ||||||
| 
 | 
 | ||||||
|     Ok(get_room_state_ids::v1::Response { |     Ok(get_room_state_ids::v1::Response { | ||||||
|         auth_chain_ids: auth_chain_ids.collect(), |         auth_chain_ids: auth_chain_ids.map(|id| (*id).clone()).collect(), | ||||||
|         pdu_ids, |         pdu_ids, | ||||||
|     } |     } | ||||||
|     .into()) |     .into()) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue