nonlib: Always get the latest unjournaled state when saving.

This commit is contained in:
Jonathan Moore Liles 2012-06-16 22:07:47 -07:00
parent 13b6537ee4
commit 6f993eeb10
1 changed files with 19 additions and 16 deletions

View File

@ -244,17 +244,17 @@ Loggable::close ( void )
if ( ! snapshot( "snapshot" ) )
WARNING( "Failed to create snapshot" );
if ( ! save_unjournaled_state() )
WARNING( "Failed to save unjournaled state" );
for ( std::map <unsigned int, Loggable::log_pair >::iterator i = _loggables.begin();
i != _loggables.end(); ++i )
{
if ( i->second.loggable )
delete i->second.loggable;
save_unjournaled_state();
for ( std::map <unsigned int, Loggable::log_pair >::iterator i = _loggables.begin();
i != _loggables.end(); ++i )
if ( i->second.unjournaled_state )
delete i->second.unjournaled_state;
}
_loggables.clear();
@ -279,6 +279,10 @@ Loggable::save_unjournaled_state ( void )
for ( std::map <unsigned int, Loggable::log_pair >::iterator i = _loggables.begin();
i != _loggables.end(); ++i )
{
/* get the latest state */
if ( i->second.loggable )
i->second.loggable->record_unjournaled();
if ( i->second.unjournaled_state )
{
char *s = i->second.unjournaled_state->print();
@ -782,20 +786,19 @@ Loggable::record_unjournaled ( void ) const
get_unjournaled( *e );
Log_Entry *le = _loggables[ _id ].unjournaled_state;
Log_Entry **le = &_loggables[ _id ].unjournaled_state;
if ( le )
delete le;
if ( *le )
{
delete *le;
*le = NULL;
}
if ( e->size() )
_loggables[ _id ].unjournaled_state = e;
*le = e;
else
{
/* don't waste space on loggables with no unjournaled properties */
_loggables[ _id ].unjournaled_state = NULL;
delete e;
}
}
/** Log object destruction. *Must* be called at the beginning of the
* destructors of leaf classes */
@ -804,15 +807,15 @@ Loggable::log_destroy ( void ) const
{
Locker lock( _lock );;
/* the unjournaled state may have changed: make a note of it. */
record_unjournaled();
set_dirty();
if ( ! _fp )
/* tearing down... don't bother */
return;
/* the unjournaled state may have changed: make a note of it. */
record_unjournaled();
log( "%s 0x%X destroy << ", class_name(), _id );
Log_Entry e;