On Mon, Jan 25, 2016 at 4:51 PM, Emmanuel Lécharny <[email protected]>
wrote:
> Hi guys,
>
> while working on the repair() function, iI found something very
> interesting.
>
> When we update a partition, at the end, we call the sync() method which
> writes down on disk all the updates which are pending in memory. This
> sync() method itself sync all the indexes :
>
> /**
> * This method is called when the synch thread is waking up, to write
> * the modified data.
> *
> * @throws Exception on failures to sync database files to disk
> */
> public synchronized void sync() throws Exception
> {
> if ( !initialized )
> {
> return;
> }
>
> // Sync all system indices
> for ( Index<?, String> idx : systemIndices.values() )
> {
> idx.sync();
> }
>
the above call should cover this case cause JdbmRdnIndex extends JdbmIndex
>
> // Sync all user defined userIndices
> for ( Index<?, String> idx : userIndices.values() )
> {
> idx.sync();
> }
>
> // Sync the master table
> ( ( JdbmMasterTable ) master ).sync();
> }
>
> Sadly, the rdnIndex is *never* flushed explicitely - so it's done only
> periodically (every 2000 updates, the default):
>
> /**
> * Commit the modification on disk
> *
> * @param recordManager The recordManager used for the commit
> */
> private void commit( RecordManager recordManager ) throws IOException
> {
> if ( commitNumber.incrementAndGet() % 2000 == 0 )
> {
> sync();
> }
> }
>
>
> This is *BAD*. That means we may have some pending modifications of this
> RDN index that are not written on disk when we stop the server or when
> we have a crash :/
>
> Adding a rdnIdx.sync() might be just enough to eliminate the corruptions
> we see...
>
>
> In any case, we still need the repair tool.
>
>