[Metakit] Corrupted database
Jean-Claude Wippler
jcw at equi4.com
Wed May 10 15:27:25 CEST 2006
martin troxler wrote:
> We use Metakit on a embedded linux device that uses a EXT3-
> formatted compact flash card. Because we have to face the problem
> of sudden power fail, I wrote some tests that reset the device
> (hardware reset!) while writing to the database (adding rows and
> full commit)
>
>
> I browsed the mailing list and found your recovery how-to
> (truncating the file to the size given by bytes 4..7).
> But in my case the file is smaller than written at those bytes 4..7 !!
>
> I am using Metakit 2.4.9.5, because I was hoping that those changes
> would help me, too.
>
> Any help would be appreciated
You are going to have to force fsyncs (and be sure they work on your
platform) to guard against power outages. The proper place to do
this is in c4_FileStrategy::DataCommit (src/fileio.cpp), after the
fflush. There is no portable way to do this. The more involved but
cleaner way to do this is to create a derived class and override
DataComit (you can call the base class and do the fsync afterwards if
_failure == 0.
This change will force two fsyncs on each commit, protecting start
and the end of the commit as is need for full safety (DataCommit gets
called twice on each MK commit). The file damage you witnessed is
caused by your device not performing writes in the order they are
issued - with an fsync (again, making sure these really go all the
way to the CF card!) the essential two writes will be ordered as
needed to guarantee stable storage.
-jcw
More information about the Metakit
mailing list