Skip to content
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

Some changes could be lost during the merge of delta file into main database file [CORE3466] #3827

Open
firebird-automations opened this issue May 5, 2011 · 10 comments

Comments

@firebird-automations
Copy link
Collaborator

Submitted by: @hvlad

When merge is in progress engine writes changes into both delta and main file. This creates additional IO load of course.
Therefore in v2.5 merge process was optimized - when page is read from delta file for merging purposes it is marked (with
BDB_merge flag) and not writed back into delta. It is OK if page not leave the cache until merge done. But there is a scenario
when this optimization is wrong :
a) page is read by merge process and marked by BDB_merge flag
b) page is changed by some user attachment and written into database file only
c) page is evicted from the page cache
d) user attachment going to change that page again
e) page is read from delta, this copy have no changes by (b) !
f) page is changed and written into both database and delta, overwriting changes by (b) in database

Commits: 4a916be d578149

@firebird-automations
Copy link
Collaborator Author

Modified by: @hvlad

assignee: Vlad Khorsun [ hvlad ]

@firebird-automations
Copy link
Collaborator Author

Commented by: @hvlad

Classic is not affected as there is no other activity except of merge itself in the same page cache instance. I.e. there is no user process which could
change page marked with BDB_merge flag. Note, this optimization not applicable for Classic.

Solution is to undo such optimization. Another way to avoid double writes could be implemented but not in this ticket.

@firebird-automations
Copy link
Collaborator Author

Modified by: @hvlad

status: Open [ 1 ] => Resolved [ 5 ]

resolution: Fixed [ 1 ]

Fix Version: 2.5.1 [ 10333 ]

Fix Version: 3.0 Alpha 1 [ 10331 ]

@firebird-automations
Copy link
Collaborator Author

Modified by: @dyemanov

security: Developers [ 10012 ] =>

@firebird-automations
Copy link
Collaborator Author

Modified by: @pcisar

status: Resolved [ 5 ] => Closed [ 6 ]

@firebird-automations
Copy link
Collaborator Author

Modified by: @pavel-zotov

status: Closed [ 6 ] => Closed [ 6 ]

QA Status: Cannot be tested

@romansimakov
Copy link
Collaborator

What if just clear BDB_merge in CCH_MARK?

@hvlad
Copy link
Member

hvlad commented Aug 12, 2023

Hmm... looks like good idea

@romansimakov romansimakov reopened this Aug 13, 2023
@romansimakov romansimakov self-assigned this Aug 13, 2023
@hvlad
Copy link
Member

hvlad commented Aug 13, 2023

May I ask you to not restore old code as is - instead of add new argument into CCH_fetch_page() (and all callers), consider CCH_mark_merge() or something like it.

@romansimakov
Copy link
Collaborator

I thought about the same. I'll try to minimize changes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment