The setrange approach creates a memory object for each open database
file. It is mapped to the application's address space when
trans_mmap
is called.
Before modifying a region in the database, the application must issue
the trans_setrange
system call to notify the Rhino extension about
the region.
In response to the call, Rhino pins down all
buffer pages in the region so they will not be paged out
until the transaction ends. It then records the region
in a per-transaction record.
Upon commit, Rhino scans the per-transaction record and
logs the contents of each region as redo records.
Thus, it implements a no-steal, no-force policy [effelsberg84].
Update detection using setrange
was first implemented in RVM [rvm].