-
Notifications
You must be signed in to change notification settings - Fork 155
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Enable Garbage Collection for Interned Values #602
base: master
Are you sure you want to change the base?
Conversation
✅ Deploy Preview for salsa-rs canceled.
|
CodSpeed Performance ReportMerging #602 will not alter performanceComparing Summary
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice. This looks good to me after adding a few tests.
src/function/specify.rs
Outdated
let dependency_index = database_key_index; | ||
if !zalsa_local.is_output_of_active_query(dependency_index) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nit
let dependency_index = database_key_index; | |
if !zalsa_local.is_output_of_active_query(dependency_index) { | |
if !zalsa_local.is_output_of_active_query(database_key_index) { |
src/interned.rs
Outdated
// The revision the value was first interned in. | ||
first_interned_at: Revision, | ||
// The most recent interned revision. | ||
last_interned_at: AtomicRevision, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
// The revision the value was first interned in. | |
first_interned_at: Revision, | |
// The most recent interned revision. | |
last_interned_at: AtomicRevision, | |
/// The revision the value was first interned in. | |
first_interned_at: Revision, | |
/// The most recent interned revision. | |
last_interned_at: AtomicRevision, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, looks good to me!
I see there is a test failure....have you investigated it at all? |
My hunch is that the test is testing behavior that's not relevant anymore but I can look. |
@nikomatsakis I'm also hitting the assertion error in this example: #[salsa::tracked]
fn function<'db>(db: &'db dyn Database, input: Input) -> Interned<'db> {
Interned::new(db, 0)
}
let input = Input::new(&db, 0);
function(&db, input);
input.set_field1(&mut db).to(1);
function(&db, input); The function does not read the input so the interned value is memoized, meaning it is not re-interned in R2. What should be done in this case (and the similar failing test)? I'm also a little unclear about the testing instructions. Should I add a log event for when values are re-interned, or is there another way I can test that? I'm also not sure how to access the |
That would sound reasonable to me, similar to the backdate event. We could also consider adding an event when a value is garbage collected. |
If I understand it correctly the problem is that interned ingredients created outside of a query are never revalidated because there's no corresponding query that creates them. I see two options:
|
I took a closer look at I think the problem here is that |
We had a brief discussion in our meeting today--- @ibraheemdev I think values that are interned outside of any salsa query have to be concerned immortal. |
if value.first_interned_at > revision { | ||
// The slot was reused. | ||
return true; | ||
} | ||
|
||
if value.first_interned_at < revision { | ||
// The slot is valid in this revision but we have to sync the value's revision. | ||
value.last_interned_at.store(db.zalsa().current_revision()); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I already discussed this with @ibraheemdev but I document it here in case anyone else ends up reviewing this PR or tries to fix the failing test.
The fix here is to always set last_interned_at
even then the first_interned_at
is equal to revision
if value.first_interned_at > revision { | |
// The slot was reused. | |
return true; | |
} | |
if value.first_interned_at < revision { | |
// The slot is valid in this revision but we have to sync the value's revision. | |
value.last_interned_at.store(db.zalsa().current_revision()); | |
} | |
if value.first_interned_at > revision { | |
// The slot was reused. | |
true | |
} else { | |
// The slot is valid in this revision but we have to sync the value's revision. | |
value.last_interned_at.store(db.zalsa().current_revision()); | |
false | |
} |
Per the mentoring instructions in #597.
Still needs some tests. Note this does not actually implement garbage collection but adds the necessary plumbing to do so.