[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