Repository navigation
Expand file tree
/
Copy pathCargo.toml
More file actions
135 lines (126 loc) · 5.84 KB
/
Copy pathCargo.toml
File metadata and controls
135 lines (126 loc) · 5.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
[workspace]
resolver = "2"
members = ["crates/*"]
[workspace.package]
version = "0.2.0"
edition = "2024"
# The lockfile's floor (Ballista's bundled AWS SDK crates need 1.94.1), not
# the 1.88 of the direct dependencies; verified by `make msrv` / the CI job.
rust-version = "1.94.1"
license = "Apache-2.0"
authors = ["Vyncint Ng <vyncint@icloud.com>"]
repository = "https://github.com/vyncint/oxidelake"
homepage = "https://github.com/vyncint/oxidelake"
documentation = "https://docs.rs/oxidelake-runtime"
readme = "README.md"
# `gpu` is how someone searching for this searches; the rest say what it is.
keywords = ["gpu", "arrow", "datafusion", "lakehouse", "cuda"]
categories = ["database-implementations", "science"]
# Nine crates publish together (docs/RELEASING.md). The kernels live INSIDE
# oxidelake-device so the published crate is self-contained — they used to sit
# at the repository root, which `cargo publish` cannot see.
exclude = [".github/*", ".claude/*", "docs/*", "target/*"]
[workspace.dependencies]
# internal crates
oxidelake-core = { path = "crates/oxidelake-core", version = "0.2.0" }
oxidelake-memory = { path = "crates/oxidelake-memory", version = "0.2.0" }
oxidelake-device = { path = "crates/oxidelake-device", version = "0.2.0" }
oxidelake-compute = { path = "crates/oxidelake-compute", version = "0.2.0" }
oxidelake-storage = { path = "crates/oxidelake-storage", version = "0.2.0" }
oxidelake-planner = { path = "crates/oxidelake-planner", version = "0.2.0" }
oxidelake-runtime = { path = "crates/oxidelake-runtime", version = "0.2.0" }
oxidelake-tui = { path = "crates/oxidelake-tui", version = "0.2.0" }
oxidelake-api = { path = "crates/oxidelake-api", version = "0.2.0" }
# data plane — Ballista 54 is the root of this chain
ballista = "54" # client: SessionContext::remote / standalone
ballista-core = "54"
ballista-scheduler = "54"
ballista-executor = "54"
datafusion = "54"
datafusion-proto = "54" # PhysicalExtensionCodec for Gpu*Exec; always identical to datafusion
arrow = { version = "58", features = ["prettyprint"] }
parquet = "58" # lake format: statistics, page index, Bloom filters
object_store = "0.13" # ObjectStore trait; io_uring local store implements it
# async
tokio = { version = "1.52", features = ["full"] }
futures = "0.3"
bytes = "1"
async-trait = "0.1" # only to implement object_store's ObjectStore (foreign trait)
# parallelism
rayon = "1"
# syscalls the standard library does not expose: installing a SIGUSR1 handler
# in the io_uring signal test (#27). Already in the graph transitively; this
# only names it so a dev-dependency can use it directly.
libc = "0.2"
# errors + observability
thiserror = "2"
anyhow = "1"
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
# serialization (codec payloads, config)
serde = { version = "1", features = ["derive"] }
postcard = { version = "1", features = ["use-std"] }
# storage fast path
io-uring = "0.7" # Linux target-gated, behind the io-uring feature
# GPU (all optional)
cudarc = { version = "0.19", default-features = false, features = ["std", "driver", "nvrtc", "dynamic-loading", "cuda-12080"] }
objc2 = "0.6" # macOS target-gated, behind the metal feature
objc2-metal = "0.3"
objc2-foundation = "0.3"
# UI + CLI
ratatui = { version = "0.30", features = ["crossterm_0_29"] }
crossterm = "0.29"
clap = { version = "4", features = ["derive"] }
# in-database inference (optional, behind oxidelake-compute/predict)
#
# default-features = false is load-bearing, not tidiness. oxmera registers its
# CUDA backend from a `#[ctor]` that runs before `main` and calls
# CudaContext::new(0) — so the default build would have every `oxide` process,
# scheduler and worker included, dlopen libcuda and create a CUDA context at
# load time, beside the one OxideLake creates itself, even for a pure-CPU
# query. oxmera 0.4.0 made that a feature; this is the reason to use it.
oxmera = { version = "0.5", default-features = false }
safetensors = "0.8" # reading a model's header to recover its shape
# test-only
insta = "1"
# `serde` is on because the PTY suite round-trips a screen through JSON — the
# exact bytes `TERMLENS_ARTIFACT_DIR` writes when a wait fails in CI, so the
# artefact a failure leaves behind is a format this suite has read back. It
# also makes those artefacts `.screen.json` rather than `.screen.txt`.
termlens = { version = "0.11", features = ["serde"] }
assert_cmd = "2"
tempfile = "3"
rand = "0.10"
serde_json = "1" # reading a serialized termlens Screen back
[workspace.lints.rust]
unsafe_op_in_unsafe_fn = "deny"
missing_docs = "warn"
[workspace.lints.clippy]
unwrap_used = "deny"
expect_used = "deny"
todo = "deny"
unimplemented = "deny"
dbg_macro = "deny"
[profile.release]
opt-level = 3
# Thin, not fat. With fat LTO each binary's link was a 13.6 GB whole-program
# pass (measured 2026-09-07, Apple Silicon): Cargo links the three binaries
# in parallel, which killed the 16 GB Linux release runners (exit 143 on
# v0.1.0 and v0.1.2) and left the 7 GB macOS runners swapping for four hours
# per target. Thin LTO with one codegen unit peaks at 7.4 GB and links in
# half the time for 9% more binary; a 10M-row aggregate ran in the same
# 40 ms under both. Sixteen codegen units would peak at 2.6 GB but cost 75%
# in size, so the single unit stays.
lto = "thin"
codegen-units = 1
strip = "symbols"
# Deliberately no `panic = "abort"`: unwinding must stay sound across PyO3/FFI
# boundaries and workers must keep backtraces.
[profile.dev.package."*"]
opt-level = 2 # arrow/datafusion are unusably slow at -O0 in tests
# `cargo build --profile profiling`: release code generation with symbols and
# line tables kept, so perf / Instruments can attribute time to functions.
[profile.profiling]
inherits = "release"
debug = 1
strip = false