Upgrades MSRV to 1.70

pull/634/head
Tpt 1 year ago committed by Thomas Tanon
parent 9b985295ae
commit 90b7b128f2
  1. 4
      .github/workflows/tests.yml
  2. 2
      Cargo.lock
  3. 2
      Cargo.toml
  4. 2
      cli/Cargo.toml
  5. 1
      fuzz/Cargo.toml
  6. 15
      fuzz/fuzz_targets/sparql_eval.rs
  7. 1
      lib/Cargo.toml
  8. 2
      lib/oxsdatatypes/src/double.rs
  9. 2
      lib/oxsdatatypes/src/float.rs
  10. 41
      lib/src/storage/backend/rocksdb.rs
  11. 14
      python/src/io.rs
  12. 3
      testsuite/Cargo.toml
  13. 17
      testsuite/src/sparql_evaluator.rs

@ -123,7 +123,7 @@ jobs:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
with: with:
submodules: true submodules: true
- run: rustup update && rustup toolchain install nightly && rustup default 1.67.0 - run: rustup update && rustup toolchain install nightly && rustup default 1.70.0
- uses: Swatinem/rust-cache@v2 - uses: Swatinem/rust-cache@v2
- run: rm Cargo.lock && cargo +nightly update -Z direct-minimal-versions - run: rm Cargo.lock && cargo +nightly update -Z direct-minimal-versions
- run: cargo test - run: cargo test
@ -253,7 +253,7 @@ jobs:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
with: with:
submodules: true submodules: true
- run: rustup update && rustup toolchain install nightly && rustup default 1.67.0 - run: rustup update && rustup toolchain install nightly && rustup default 1.70.0
- uses: Swatinem/rust-cache@v2 - uses: Swatinem/rust-cache@v2
- uses: actions/setup-python@v4 - uses: actions/setup-python@v4
with: with:

2
Cargo.lock generated

@ -960,7 +960,6 @@ dependencies = [
"hex", "hex",
"js-sys", "js-sys",
"json-event-parser", "json-event-parser",
"lazy_static",
"libc", "libc",
"md-5", "md-5",
"oxhttp", "oxhttp",
@ -1017,7 +1016,6 @@ dependencies = [
"anyhow", "anyhow",
"clap", "clap",
"criterion", "criterion",
"lazy_static",
"oxigraph", "oxigraph",
"oxttl", "oxttl",
"rio_api", "rio_api",

@ -24,7 +24,7 @@ authors = ["Tpt <thomas@pellissier-tanon.fr>"]
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
homepage = "https://oxigraph.org/" homepage = "https://oxigraph.org/"
edition = "2021" edition = "2021"
rust-version = "1.67" rust-version = "1.70"
[profile.release] [profile.release]
lto = true lto = true

@ -24,7 +24,7 @@ rocksdb-pkg-config = ["oxigraph/rocksdb-pkg-config"]
[dependencies] [dependencies]
anyhow = "1.0.72" anyhow = "1.0.72"
oxhttp = { version = "0.1.7", features = ["rayon"] } oxhttp = { version = "0.1.7", features = ["rayon"] }
clap = { version = ">=4.0, <5.0", features = ["derive"] } clap = { version = "4.0", features = ["derive"] }
oxigraph = { version = "0.4.0-alpha.1-dev", path = "../lib", features = ["http_client"] } oxigraph = { version = "0.4.0-alpha.1-dev", path = "../lib", features = ["http_client"] }
rand = "0.8" rand = "0.8"
url = "2.4" url = "2.4"

@ -9,7 +9,6 @@ cargo-fuzz = true
[dependencies] [dependencies]
anyhow = "1.0.72" anyhow = "1.0.72"
lazy_static = "1.4"
libfuzzer-sys = "0.4" libfuzzer-sys = "0.4"
oxrdf = { path = "../lib/oxrdf", features = ["rdf-star"] } oxrdf = { path = "../lib/oxrdf", features = ["rdf-star"] }
oxttl = { path = "../lib/oxttl", features = ["rdf-star"] } oxttl = { path = "../lib/oxttl", features = ["rdf-star"] }

@ -1,27 +1,26 @@
#![no_main] #![no_main]
use lazy_static::lazy_static;
use libfuzzer_sys::fuzz_target; use libfuzzer_sys::fuzz_target;
use oxigraph::io::RdfFormat; use oxigraph::io::RdfFormat;
use oxigraph::sparql::{Query, QueryOptions, QueryResults, QuerySolutionIter}; use oxigraph::sparql::{Query, QueryOptions, QueryResults, QuerySolutionIter};
use oxigraph::store::Store; use oxigraph::store::Store;
use std::sync::OnceLock;
lazy_static! { fuzz_target!(|data: sparql_smith::Query| {
static ref STORE: Store = { static STORE: OnceLock<Store> = OnceLock::new();
let store = STORE.get_or_init(|| {
let store = Store::new().unwrap(); let store = Store::new().unwrap();
store store
.load_dataset(sparql_smith::DATA_TRIG.as_bytes(), RdfFormat::TriG, None) .load_dataset(sparql_smith::DATA_TRIG.as_bytes(), RdfFormat::TriG, None)
.unwrap(); .unwrap();
store store
}; });
}
fuzz_target!(|data: sparql_smith::Query| {
let query_str = data.to_string(); let query_str = data.to_string();
if let Ok(query) = Query::parse(&query_str, None) { if let Ok(query) = Query::parse(&query_str, None) {
let options = QueryOptions::default(); let options = QueryOptions::default();
let with_opt = STORE.query_opt(query.clone(), options.clone()).unwrap(); let with_opt = store.query_opt(query.clone(), options.clone()).unwrap();
let without_opt = STORE let without_opt = store
.query_opt(query, options.without_optimizations()) .query_opt(query, options.without_optimizations())
.unwrap(); .unwrap();
match (with_opt, without_opt) { match (with_opt, without_opt) {

@ -26,7 +26,6 @@ rocksdb_debug = []
digest = "0.10" digest = "0.10"
hex = "0.4" hex = "0.4"
json-event-parser = "0.1" json-event-parser = "0.1"
lazy_static = "1.4"
md-5 = "0.10" md-5 = "0.10"
oxilangtag = "0.1" oxilangtag = "0.1"
oxiri = "0.2" oxiri = "0.2"

@ -173,7 +173,7 @@ impl From<Float> for Double {
impl From<Boolean> for Double { impl From<Boolean> for Double {
#[inline] #[inline]
fn from(value: Boolean) -> Self { fn from(value: Boolean) -> Self {
if bool::from(value) { 1. } else { 0. }.into() f64::from(bool::from(value)).into()
} }
} }

@ -153,7 +153,7 @@ impl From<u16> for Float {
impl From<Boolean> for Float { impl From<Boolean> for Float {
#[inline] #[inline]
fn from(value: Boolean) -> Self { fn from(value: Boolean) -> Self {
if bool::from(value) { 1. } else { 0. }.into() f32::from(bool::from(value)).into()
} }
} }

@ -9,7 +9,6 @@
)] )]
use crate::storage::error::{CorruptionError, StorageError}; use crate::storage::error::{CorruptionError, StorageError};
use lazy_static::lazy_static;
use libc::{self, c_void, free}; use libc::{self, c_void, free};
use oxrocksdb_sys::*; use oxrocksdb_sys::*;
use rand::random; use rand::random;
@ -26,7 +25,7 @@ use std::marker::PhantomData;
use std::ops::Deref; use std::ops::Deref;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::rc::{Rc, Weak}; use std::rc::{Rc, Weak};
use std::sync::Arc; use std::sync::{Arc, OnceLock};
use std::thread::{available_parallelism, yield_now}; use std::thread::{available_parallelism, yield_now};
use std::{ptr, slice}; use std::{ptr, slice};
@ -57,23 +56,6 @@ macro_rules! ffi_result_impl {
}} }}
} }
lazy_static! {
static ref ROCKSDB_ENV: UnsafeEnv = {
unsafe {
let env = rocksdb_create_default_env();
assert!(!env.is_null(), "rocksdb_create_default_env returned null");
UnsafeEnv(env)
}
};
static ref ROCKSDB_MEM_ENV: UnsafeEnv = {
unsafe {
let env = rocksdb_create_mem_env();
assert!(!env.is_null(), "rocksdb_create_mem_env returned null");
UnsafeEnv(env)
}
};
}
pub struct ColumnFamilyDefinition { pub struct ColumnFamilyDefinition {
pub name: &'static str, pub name: &'static str,
pub use_iter: bool, pub use_iter: bool,
@ -472,6 +454,9 @@ impl Db {
limit_max_open_files: bool, limit_max_open_files: bool,
in_memory: bool, in_memory: bool,
) -> Result<*mut rocksdb_options_t, StorageError> { ) -> Result<*mut rocksdb_options_t, StorageError> {
static ROCKSDB_ENV: OnceLock<UnsafeEnv> = OnceLock::new();
static ROCKSDB_MEM_ENV: OnceLock<UnsafeEnv> = OnceLock::new();
unsafe { unsafe {
let options = rocksdb_options_create(); let options = rocksdb_options_create();
assert!(!options.is_null(), "rocksdb_options_create returned null"); assert!(!options.is_null(), "rocksdb_options_create returned null");
@ -508,10 +493,19 @@ impl Db {
rocksdb_options_set_env( rocksdb_options_set_env(
options, options,
if in_memory { if in_memory {
ROCKSDB_MEM_ENV.0 ROCKSDB_MEM_ENV.get_or_init(|| {
let env = rocksdb_create_mem_env();
assert!(!env.is_null(), "rocksdb_create_mem_env returned null");
UnsafeEnv(env)
})
} else { } else {
ROCKSDB_ENV.0 ROCKSDB_ENV.get_or_init(|| {
}, let env = rocksdb_create_default_env();
assert!(!env.is_null(), "rocksdb_create_default_env returned null");
UnsafeEnv(env)
})
}
.0,
); );
Ok(options) Ok(options)
} }
@ -1400,7 +1394,8 @@ impl From<ErrorStatus> for StorageError {
struct UnsafeEnv(*mut rocksdb_env_t); struct UnsafeEnv(*mut rocksdb_env_t);
// Hack for lazy_static. OK because only written in lazy static and used in a thread-safe way by RocksDB // Hack for OnceCell. OK because only written in OnceCell and used in a thread-safe way by RocksDB
unsafe impl Send for UnsafeEnv {}
unsafe impl Sync for UnsafeEnv {} unsafe impl Sync for UnsafeEnv {}
fn path_to_cstring(path: &Path) -> Result<CString, StorageError> { fn path_to_cstring(path: &Path) -> Result<CString, StorageError> {

@ -14,6 +14,7 @@ use std::ffi::OsStr;
use std::fs::File; use std::fs::File;
use std::io::{self, BufWriter, Cursor, Read, Write}; use std::io::{self, BufWriter, Cursor, Read, Write};
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::sync::OnceLock;
/// Parses RDF graph and dataset serialization formats. /// Parses RDF graph and dataset serialization formats.
/// ///
@ -400,7 +401,7 @@ pub fn map_parse_error(error: ParseError, file_path: Option<PathBuf>) -> PyErr {
match error { match error {
ParseError::Syntax(error) => { ParseError::Syntax(error) => {
// Python 3.9 does not support end line and end column // Python 3.9 does not support end line and end column
if python_version() >= (3, 10) { if python_version() >= (3, 10, 0) {
let params = if let Some(location) = error.location() { let params = if let Some(location) = error.location() {
( (
file_path, file_path,
@ -457,9 +458,12 @@ pub fn allow_threads_unsafe<T>(_py: Python<'_>, f: impl FnOnce() -> T) -> T {
f() f()
} }
fn python_version() -> (u8, u8) { fn python_version() -> (u8, u8, u8) {
Python::with_gil(|py| { static VERSION: OnceLock<(u8, u8, u8)> = OnceLock::new();
let v = py.version_info(); *VERSION.get_or_init(|| {
(v.major, v.minor) Python::with_gil(|py| {
let v = py.version_info();
(v.major, v.minor, v.patch)
})
}) })
} }

@ -12,8 +12,7 @@ publish = false
[dependencies] [dependencies]
anyhow = "1.0.72" anyhow = "1.0.72"
clap = { version = ">=4.0, <5.0", features = ["derive"] } clap = { version = "4.0", features = ["derive"] }
lazy_static = "1.4"
oxigraph = { path = "../lib" } oxigraph = { path = "../lib" }
oxttl = { path= "../lib/oxttl" } oxttl = { path= "../lib/oxttl" }
sparopt = { path = "../lib/sparopt" } sparopt = { path = "../lib/sparopt" }

@ -4,7 +4,6 @@ use crate::manifest::*;
use crate::report::{dataset_diff, format_diff}; use crate::report::{dataset_diff, format_diff};
use crate::vocab::*; use crate::vocab::*;
use anyhow::{anyhow, bail, ensure, Error, Result}; use anyhow::{anyhow, bail, ensure, Error, Result};
use lazy_static::lazy_static;
use oxigraph::model::vocab::*; use oxigraph::model::vocab::*;
use oxigraph::model::*; use oxigraph::model::*;
use oxigraph::sparql::results::QueryResultsFormat; use oxigraph::sparql::results::QueryResultsFormat;
@ -16,7 +15,7 @@ use std::fmt::Write;
use std::io::{self, BufReader, Cursor}; use std::io::{self, BufReader, Cursor};
use std::ops::Deref; use std::ops::Deref;
use std::str::FromStr; use std::str::FromStr;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex, OnceLock};
pub fn register_sparql_tests(evaluator: &mut TestEvaluator) { pub fn register_sparql_tests(evaluator: &mut TestEvaluator) {
evaluator.register( evaluator.register(
@ -740,13 +739,11 @@ fn evaluate_query_optimization_test(test: &Test) -> Result<()> {
Ok(()) Ok(())
} }
lazy_static! { // Pool of stores to avoid allocating/deallocating them a lot
// Pool of stores to avoid allocating/deallocating them a lot static STORE_POOL: OnceLock<Mutex<Vec<Store>>> = OnceLock::new();
static ref STORE_POOL: Mutex<Vec<Store>> = Mutex::new(Vec::new());
}
fn get_store() -> Result<StoreRef> { fn get_store() -> Result<StoreRef> {
let store = if let Some(store) = STORE_POOL.lock().unwrap().pop() { let store = if let Some(store) = STORE_POOL.get_or_init(Mutex::default).lock().unwrap().pop() {
store store
} else { } else {
Store::new()? Store::new()?
@ -761,7 +758,11 @@ struct StoreRef {
impl Drop for StoreRef { impl Drop for StoreRef {
fn drop(&mut self) { fn drop(&mut self) {
if self.store.clear().is_ok() { if self.store.clear().is_ok() {
STORE_POOL.lock().unwrap().push(self.store.clone()) STORE_POOL
.get_or_init(Mutex::default)
.lock()
.unwrap()
.push(self.store.clone())
} }
} }
} }

Loading…
Cancel
Save