Commit graph

1059 commits

Author SHA1 Message Date
Mihail Mihov
6b1d24098b Add test override_new_get_set 2022-08-21 01:52:54 +03:00
Mihail Mihov
958b063a60 Update input, interned and tracked structs to use specified getter and setter names 2022-08-21 01:52:54 +03:00
Mihail Mihov
eb4f97f533 Add get and set to FIELD_OPTION_ATTRIBUTES 2022-08-21 01:22:18 +03:00
Mihail Mihov
2970c16e77 Respect constructor_name option input, interned and tracked structs 2022-08-21 01:19:12 +03:00
Mihail Mihov
6cb1cb0a47 Add constructor_name option to Options 2022-08-21 01:16:45 +03:00
bors[bot]
6fe5062548
Merge #357
357: Add missing `db` param in salsa::input book example r=nikomatsakis a=Veykril



Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
2022-08-18 12:21:18 +00:00
Lukas Wirth
e1a44b5d1d Add missing db param in book example 2022-08-18 13:00:43 +02:00
bors[bot]
5aebeeb9e5
Merge #356
356: make Id::from_u32 public r=nikomatsakis a=nikomatsakis

I made it private 'just because', but it turns out that dada uses it, and it seems reasonable.

Co-authored-by: Niko Matsakis <niko@alum.mit.edu>
2022-08-18 10:56:53 +00:00
Niko Matsakis
bc01b9b0d1 make Id::from_u32 public
I made it private, but it turns out that dada uses it,
and it seems reasnable.
2022-08-18 06:48:57 -04:00
bors[bot]
eca8bad6e9
Merge #352
352: Add options to tracked funcitons for lru capacity  r=nikomatsakis a=XFFXFF

fixes #344 

Now we can write something like the following to set the lru capacity of tracked functions  
```rust
#[salsa::tracked(lru=32)]
fn my_tracked_fn(db: &dyn crate::Db, ...) { }
```

some details:  
* lru should not be combined with specify. We will report an error if people do #[salsa::tracked(lru = 32, specify)]
* set 0 as default capacity to disable LRU (Because I think doing this would make the code simpler when implementing `create_ingredients` of tracked functions).
* old salsa support to change lru capacity at runtime, [as noted here](https://salsa-rs.github.io/salsa/rfcs/RFC0004-LRU.html?highlight=change#reference-guide), but we do not support this now

Co-authored-by: XFFXFF <1247714429@qq.com>
2022-08-18 10:37:38 +00:00
XFFXFF
fc4d531d76 refactor and cargo fmt 2022-08-18 08:07:13 +08:00
bors[bot]
becaade31e
Merge #350
350: Accumulators r=nikomatsakis a=nikomatsakis

This branch fixes accumulators so they have the right *behavior* -- the implementation leaves something to be desired, though, in that you don't get very good re-use if you are using accumulators from inside tracked functions. Right now that is treated as an untracked read, so if you want to get good re-use you need a workaround like this one...

```rust
#[salsa::tracked(return_ref)]
fn accumulated_values(db: &dyn Db) -> Vec<T> {
    some_query::accumulated::<SomeAccumulator>(db)
}
```

...which would track and compare the new vs old vector and detect when they've changed.


Despite this limitation, this PR makes accumulators behave correctly with respect to the value taht gets returned and is good enough to Fix #313 in my opinion. I'll file an issue for the remaining improvements.

Co-authored-by: Niko Matsakis <niko@alum.mit.edu>
2022-08-17 11:57:51 +00:00
Niko Matsakis
70b50a1813 fix formatting 2022-08-17 07:38:03 -04:00
Niko Matsakis
f147ee3917 demonstrate re-use workaround 2022-08-17 06:55:27 -04:00
XFFXFF
53785f1355 lru and specify can not be used together 2022-08-17 18:54:55 +08:00
XFFXFF
341fc80726 port more tests about lru 2022-08-17 18:54:55 +08:00
XFFXFF
d080e349ef make lru option work 2022-08-17 18:54:17 +08:00
Niko Matsakis
9df075b63c reset accumulators on new revisions, etc
Accumulators don't currently work across revisions
due to a few bugs. This commit adds 2 tests to show
the problems and reworks the implementation strategy.

We keep track of when the values in an accumulator were pushed
and reset the vector to empty when the push occurs in a new
revision.

We also ignore stale values from old revisions
(but update the revision when it is marked as validated).

Finally, we treat an accumulator as an untracked read,
which is quite conservative but correct. To get better
reuse, we would need to (a) somehow determine when different
values were pushed, e.g. by hashing or tracked the old values;
and (b) have some `DatabaseKeyIndex` we can use to identify
"the values pushed by this query".

Both of these would add overhead to accumulators and I didn'τ
feel like doing it, particularly since the main use case for
them is communicating errors and things which are not typically
used from within queries.
2022-08-17 06:47:11 -04:00
Niko Matsakis
186c915b21 make outputs use DependencyIndex
It turns out that we have some outputs (accumulators) for which
it only makes sense to have a `DependencyIndex` (they don't have
individual keys to identify).
2022-08-17 04:43:25 -04:00
Niko Matsakis
2a9f0f7140 add accumulation test
I can't seem to get it to perform incorrectly lol,
what am I missing.
2022-08-17 04:43:25 -04:00
XFFXFF
2d59df39af parse the lru option 2022-08-17 07:22:45 +08:00
XFFXFF
2778750fdf add a broken test for lru 2022-08-17 07:22:45 +08:00
bors[bot]
c24ab8ffc1
Merge #349
349: GC tracked structs r=nikomatsakis a=nikomatsakis

Extends the system to track when a tracked struct is no longer created in a new revision and eagerly delete data associated with it. It's not a *complete* answer for GC but it seems pretty useful. 

Fix #315 

Co-authored-by: Niko Matsakis <niko@alum.mit.edu>
2022-08-16 21:59:48 +00:00
Niko Matsakis
f2a67ae527 update expected logs
input fields no longer generate WillCheckCancellation events
2022-08-16 17:58:51 -04:00
Niko Matsakis
f7f1bb9024 add reset for new revision for input fields 2022-08-16 17:58:00 -04:00
Niko Matsakis
7b99365620 add salsa_struct_deleted for input fields 2022-08-16 17:57:41 -04:00
Niko Matsakis
689751b243 wire up salsa struct seletion, test it
We now delete entities and data associated with them!
Neat!
2022-08-16 17:55:32 -04:00
Niko Matsakis
66ffae1bb9 generalize push to always have a &mut route
We also track whether reset is required at the ingredient level.
For tracked struct fields, we were not using `push_mut`,
and I think that was an oversight.

The plan is to do a "dependent ingredient" interlinking pass
once the database is constructed.
2022-08-16 17:55:32 -04:00
Niko Matsakis
60cdce22e9 track "dependent functions" 2022-08-16 17:55:32 -04:00
bors[bot]
a866e71266
Merge #342
342: Make input setters return old value r=nikomatsakis a=MihailMihov

Added an `InputFieldIngredient` which replaces the `FunctionIngredient` for inputs. The end goal is for the inputs to use an ingredient simpler than `FunctionIngredient` and that would allow us to return the old values when updating an input.

Co-authored-by: Mihail Mihov <mmihov.personal@gmail.com>
2022-08-16 19:26:02 +00:00
Mihail Mihov
07dd72470e Rename compare_and_swap to mutate_in_place 2022-08-14 20:24:57 +03:00
Mihail Mihov
5e79fb42e3 Add "compare and swap" test 2022-08-13 18:22:44 +03:00
Mihail Mihov
11cedfba4f Update methods in InputFieldIngredient 2022-08-13 18:19:37 +03:00
Mihail Mihov
83474bbc53 Fix maybe_changed_after's logic 2022-08-13 13:04:19 +03:00
Mihail Mihov
5fe3c08cb7 Pass the runtime to InputFieldIngredient's fetch 2022-08-13 13:04:19 +03:00
Mihail Mihov
064f26db8f Change QueryInputs to QueryEdges 2022-08-13 13:04:19 +03:00
Mihail Mihov
8e54a9bb3e Report reads in InputFieldIngredient's fetch method. 2022-08-13 13:04:19 +03:00
Mihail Mihov
9b7f7fd4ed Add comments describing InputFieldIngredient
Co-authored-by: Niko Matsakis <niko@alum.mit.edu>
2022-08-13 13:04:19 +03:00
Mihail Mihov
11b23c942b Return old value in input setter methods 2022-08-13 13:04:19 +03:00
Mihail Mihov
ec141aceba Replace inputs' FunctionIngredients with InputFieldIngredients 2022-08-13 13:04:19 +03:00
Mihail Mihov
da43bd2ba6 Add InputFieldIngredient 2022-08-13 13:04:19 +03:00
bors[bot]
648248bd39
Merge #347
347: Track outputs and specified fields r=nikomatsakis a=nikomatsakis

This PR implements a new strategy for tracking output edges and specified fields correctly. Core ideas:

* Track the *outputs* of each query Q and not only its inputs. An output is a specified or assigned field, a created entity, or a pushed accumulator.
* When marking a query Q as validated (no need to execute) in a new revision, you mark ALL of its outputs as validated.

Fixes #338.

The PR also includes some commits that lay the groundwork for #313 and #315 (but I left those for a future PR). In particular, it includes the logic to diff outputs to find values that are no longer output by Q. This will be used to delete obsolete entities. (Originally, I was going to use this to clear outdated outputs of all kinds, but I realized that marking them as validated was a better approach.)

Co-authored-by: Niko Matsakis <niko@alum.mit.edu>
2022-08-13 05:31:11 +00:00
Niko Matsakis
d80d5308f1 fix annoying formatting problem 2022-08-13 01:28:01 -04:00
Niko Matsakis
b8643a5f70 distinguish fields from other specified values
And make `QueryOrigin` finer grained while we are at it.
2022-08-13 01:21:45 -04:00
Niko Matsakis
e2763aba88 change approach: eagerly verify, don't remove
This approach is more compatible with our overall "pull" result,
and it also means we can get more re-use.
2022-08-13 01:21:45 -04:00
Niko Matsakis
2652f66fc9 messy commit: refactor + add mark_validated_output
I realized I can do this better:

* require that outputs are DatabaseKeyIndex, fewer unwraps,
  more clearly justified
* when we validate result of tracked fn, also validate its outputs
  (this is incompletely implemented, would ideally be separated
  into its own commit, but I'm short for time)

The last step will allow us to keep the memoized results for
assigned values and means we don't have to eagerly clear them.
If we see an "assigned value" that is not verified in the current
revision, it can simply be considered dirty.

We can still delete them when entities are deleted, but they're
less special.
2022-08-13 01:21:45 -04:00
Niko Matsakis
37e7eeb3fd delete stale output values
This fixes the behavior of `specify_tracked_fn_in_rev_1_but_not_2`,
mostly, though I realize now that it is suboptimal.
2022-08-13 01:21:45 -04:00
Niko Matsakis
a3a0f030f6 track the query that assigned the value
We will use this just for asserts, but it seems useful.
2022-08-13 01:21:45 -04:00
Niko Matsakis
af9de5686d delete some dead code, squash wanings 2022-08-13 01:21:45 -04:00
Niko Matsakis
aa88884b51 move "untracked" into the Origin enum
It's a bit of a stretch for the name, but I think the code is cleaner.
2022-08-13 01:21:45 -04:00