Yes, the rumors are true - it's release day! 🎉 🎉
We're gearing up for our big 1.0 release later this year, so this release has some great foundational API improvements, improves consistency across ours APIs, and adds some other fantastic foundational features!
Highlights
- Bumped to Rust 1.78
- We now regularly capture a snapshot of the database state, and restore from it when restarting the Database
- Tables are now private by default, and must be explicitly marked as
public
via#[spacetimedb(table(public))]
or[SpacetimeDB.Table(Public = true)]
- Our SDKs now have consistent
filter_by_*
functions that return a collection of results, andfind_by_*
functions that return a single result - Implement a new rand api which fixes bugs in our previous random number generator
- Bugfix: When the database is restarted, we properly treat all clients as disconnected
Big ones!
- Module hotswapping - You can now update your server logic with a new module without disconnecting existing clients! Players will keep on playing and clients will keep on clienting without being any the wiser!
- Recv-style ABI - We've improved the performance of passing data into your module from the host substantially by eliminating several allocations and copies.
CLI changes
spacetime build
uses the--project-path
param instead of an anonymous paramspacetime publish -c
requires confirmation (can be overridden with--force
)spacetime logs -f
does not start from the very beginning
What's Changed
impl PartialEq<ProductValue> for RowRef
by @Centril in #1164- Use a custom
FixedBitSet
+ optimizePage::iter_fixed_len
by @Centril in #1160 - Implement
RelValue: Eq + Hash
by @Centril in #1107 - Fix soundness hole in
Table::delete
+ don't make & immedately drop PVs in the method by @Centril in #1162 - Add PR status check that fails unless based on
master
by @bfops in #1180 - Some clarifications to dropping the updates in eval incr by @Centril in #1192
- perf(
JoinInner
): use AVs for keys instead of PVs by @Centril in #1194 - Make
Page
always fully init by @gefjon in #1193 - Remove C# GetArgsAsObjectArray by @RReverser in #1188
- feat(1168): Track subscription query duration for each reducer by @joshua-spacetime in #1195
- Fix unsoundness in
AlgebraicValue::type_of
by making it partial by @Centril in #1189 - From.{join => joins} + remove Option layer + Remove RelOps::try_fold by @Centril in #1208
- subscription benches: reorder footprint fields by @Centril in #1209
- C#: rename DbEventArgs to ReducerContext by @RReverser in #1191
- Bump to Rust 1.78 by @coolreader18 in #1205
spacetime build
uses--project-path
param by @jdetter in #1212- Remove some impls that were dead code by @Centril in #1210
- CrudExpr::{Delete, Insert, Update}: only DbTables are possible, so cleanup InMem path by @Centril in #1211
- Remove RowUpdate event from C# by @RReverser in #1190
- Switch to a better API for tagged enums for C# by @RReverser in #1177
- Remove a few dead impls by @Centril in #1214
- commitlog: Allow folds to not allocate
Mutations
values by @kim in #1215 - Fix #1180: Add PR status check that fails unless based on master by @bfops in #1213
- Split up #735:
auth.rs
refactors by @bfops in #871 - Create a lockfile when opening config files by @gefjon in #1196
- Bump version to 0.9.0 by @bfops in #1055
- Add CODEOWNERS for
rust-toolchain.toml
by @bfops in #1221 - Fix select * from * by @coolreader18 in #1218
- CLI - Small refactors to identity code by @bfops in #1169
- Add CODEOWNERS for
LICENSE.txt
by @bfops in #1225 - Add
CODEOWNERS
forCODEOWNERS
by @bfops in #1226 spacetime publish
: Add confirmation for-c
by @bfops in #1038- Make identity naming more consistent + fix bugs by @jdetter in #1140
- feat(1229): Double client channel capacity by @joshua-spacetime in #1230
- to_bsatn_extend/vec: use uninit instead of zeroed buffer by @Centril in #1204
- refactor compile_read_only_query: dedup SideEffect errors by @Centril in #1235
- Add test for
select * from B join A on B.y = A.x
by @Centril in #1238 - Always send TransactionUpdate to the sender by @drogus in #1111
- row_count field to table by @Shubham8287 in #1242
- Simplify
MutTxId::table_exists
by @Centril in #1246 - Remove unreachable branches from C# generate
by @RReverser in #1247 Table::get_fixed_row
->RowRef::get_row_data
+ Some docs by @Centril in #1250- Move
StaticBsatnLayout
code to its module + harden test by @Centril in #1254 - Remove
BTreeIndex::name
again by @Centril in #1251 - Atomically downgrade lock when committing tx to prevent deadlock by @coolreader18 in #1252
- Tiny change: slightly better logging of sled errors by @kazimuth in #1248
- Add
PageHeader::unmodified_hash
, a BLAKE3 hash for snapshotting by @Centril in #1249 - Privatize
Table::row_layout
+ relatedBTreeIndex
refactoring by @Centril in #1262 - core: Collapse DBIC into HostController by @kim in #1186
- Reserve sequence range for system tables by @kim in #1265
- Add
fn ColList::last(&self) -> ColId
by @Centril in #1267 - Misc datastore cleanups & less cloning by @Centril in #1263
- Module hotswapping by @coolreader18 in #1147
- Consistent filtering rules for Rust bindings by @RReverser in #1280
- recv-style abi by @coolreader18 in #1002
- feat(1231): Basic query cardinality estimation by @joshua-spacetime in #1273
- Simplify
btree_index
module with more idiomatic Rust by @Centril in #1285 - Disconnect dangling clients by @kim in #1132
- CI workflows support
workflow_dispatch
event by @bfops in #1289 - Remove
incremental-joins.md
by @bfops in #1296 - Add table smoketest + more smoketest logging by @kazimuth in #1272
- Fix
workflow_dispatch
for ci.yml by @bfops in #1295 - Shub/st connected clients by @Shubham8287 in #1288
- Let ProgramStorage::external be async by @coolreader18 in #1291
- due cleanup in datastore test by @Shubham8287 in #1301
- fix(1297):
spacetime logs -f
should not start at the very beginning by @bfops in #1298 merge_apply_inserts/deletes
: do metrics work once per table, not per row by @Centril in #1286- Consistent filtering in Rust client + minor fixes by @RReverser in #1275
- Implement consistent filtering rules for C# modules by @RReverser in #1282
- Update C# codegen to consistent filtering rules by @RReverser in #1277
- Implement consistent filtering rules for TypeScript by @RReverser in #1276
- CLI - Fix
Lockfile
error message format strings by @bfops in #1302 - CLI - Drop Config lock earlier for
spacetime logs
by @bfops in #1303 - Facilitate eventual datastore crate by reducing visibilities and simplifying imports by @Centril in #1306
- Commitlog: panic on fsync failure by @kim in #985
execution_set.check_auth(...)
on initial subscription by @Centril in #1274- Refactor
check_auth
+(walk_)sources
using internal iteration in the latter by @Centril in #1304 - Bump version to 0.9.3 by @bfops in #1224
- feat(1231): Add a configurable row limit for queries by @joshua-spacetime in #1293
- NFC: use record struct for auto-equality in C# by @RReverser in #1318
- Fix FilterBy regression in C# by @RReverser in #1309
- Bump ABI version for C# AOT by @RReverser in #1311
- Implement new rand api by @coolreader18 in #1283
- metric for table size by @Shubham8287 in #1319
- Automated bot tests by @kazimuth in #1255
- Restrict multi-col index scans to
=
(OpCmp::Eq
) on all columns by @Centril in #1316 - Re-add execute_sql_mut_tx by @coolreader18 in #1313
- Tables only become public explicitly via
#[spacetimedb(table(public))]
by @Centril in #1278 IndexJoin
/JoinInner
: storeColId
by @Centril in #1166- More trace logs for TX locking by @bfops in #1253
- Split
ColumnOp
into one with row indices and one withFieldName
& other enabled changes by @Centril in #1207 - Flatten
ColumnOp
, avoiding allocation in the common case by @Centril in #1234 - Fix commitlog
fold_transactions_from
ignoring requested offset by @gefjon in #1330 - Jeremie/notify sql by @lcodes in #1198
- Impl
Serialize
,Deserialize
forPage
by @gefjon in #1335 - Create new crate
fs-utils
; moveLockfile
andcreate_parent_dir
by @gefjon in #1334 - Make both TX offset counters agree by @gefjon in #1332
- commitlog: Make bitflip test a proptest by @kim in #1333
- Make
update_database
insensitive to table access changes by @Centril in #1338 - Define
DirTrie
, a git-like on-disk object store by @gefjon in #1336 - Add the
snapshot
crate, which implements snapshotting at a low level by @gefjon in #1340 - Fix bug with
Lockfile
sticking around by @bfops in #1341 - chore: fix typos by @xiaoxianBoy in #1241
- Fix
Config.save
failing if/tmp
is on a different filesystem by @bfops in #1346 - feat(1329): System table for system variables by @joshua-spacetime in #1342
- Update quickstart modules to have public tables by @bfops in #1348
- Shared C# codegen for BSATN by @RReverser in #1312
- Prune bindings deps by @coolreader18 in #1290
- feat: System table based slow query logging by @joshua-spacetime in #1350
- Add Jenkinsfile to run internal automation by @kurtismullins in #1232
- fix(1353): Remove underscore based table access checks by @joshua-spacetime in #1354
- core: Store address, owner and program bytes in st_module by @kim in #1305
- test(1329): Row limit from system table by @joshua-spacetime in #1355
- Add explicit parameter for table visibility by @RReverser in #1359
- Bump version to 0.10.0 by @bfops in #1349
- Fix output of binary, Identity, Address for
SQL
output and the 'Display' of them to show a full hex value by @mamcx in #1087 - Integrate snapshotting into core by @gefjon in #1344
- core: Determine dangling clients from
st_clients
by @kim in #1366 - durability: Skip fsync if nothing changed by @kim in #1360
- [C#] Add Roslyn shapshot tests by @RReverser in #1399
- chore: Remove max value metrics by @joshua-spacetime in #1402
- [NFC] [C#] Minor simplifications to type checks in Roslyn codegen by @RReverser in #1400
- Add Option SDK tests by @RReverser in #1405
- [C#] [NFC] Use semantic model's type where possible by @RReverser in #1401
- Fix auth regression by @coolreader18 in #1413
New Contributors
- @lcodes made their first contribution in #1198
- @xiaoxianBoy made their first contribution in #1241
Full Changelog: v0.9.2-beta...v0.10.0-beta