1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-22 17:35:59 +03:00

test: Make the runner's journal more reliable.

This commit is contained in:
Petr Rockai 2014-06-27 01:19:15 +02:00
parent d27833ba7c
commit dc1d157878
2 changed files with 26 additions and 2 deletions

View File

@ -48,6 +48,15 @@ struct dir {
typedef std::vector< std::string > Listing; typedef std::vector< std::string > Listing;
inline void fsync_name( std::string n )
{
int fd = open( n.c_str(), O_WRONLY );
if ( fd >= 0 ) {
fsync( fd );
close( fd );
}
}
inline Listing listdir( std::string p, bool recurse = false, std::string prefix = "" ) inline Listing listdir( std::string p, bool recurse = false, std::string prefix = "" )
{ {
Listing r; Listing r;

View File

@ -1,5 +1,7 @@
// -*- C++ -*- // -*- C++ -*-
#include "filesystem.h"
#include <map> #include <map>
#include <string> #include <string>
#include <iostream> #include <iostream>
@ -26,6 +28,7 @@ struct Journal {
friend std::ostream &operator<<( std::ostream &o, R r ) { friend std::ostream &operator<<( std::ostream &o, R r ) {
switch ( r ) { switch ( r ) {
case STARTED: return o << "started"; case STARTED: return o << "started";
case RETRIED: return o << "retried";
case FAILED: return o << "failed"; case FAILED: return o << "failed";
case INTERRUPTED: return o << "interrupted"; case INTERRUPTED: return o << "interrupted";
case PASSED: return o << "passed"; case PASSED: return o << "passed";
@ -71,6 +74,7 @@ struct Journal {
void sync() { void sync() {
write( location_tmp ); write( location_tmp );
fsync_name( location_tmp );
rename( location_tmp.c_str(), location.c_str() ); rename( location_tmp.c_str(), location.c_str() );
} }
@ -112,12 +116,23 @@ struct Journal {
std::cout << i->second << ": " << i->first << std::endl; std::cout << i->second << ": " << i->first << std::endl;
} }
void read() { void read( std::string n ) {
std::ifstream ifs( location.c_str() ); std::ifstream ifs( n.c_str() );
typedef std::istream_iterator< std::pair< std::string, R > > It; typedef std::istream_iterator< std::pair< std::string, R > > It;
std::copy( It( ifs ), It(), std::inserter( status, status.begin() ) ); std::copy( It( ifs ), It(), std::inserter( status, status.begin() ) );
} }
void read() {
struct stat64 stat;
if ( ::stat64( location.c_str(), &stat ) == 0 )
read( location );
/* on CIFS, rename might fail halfway through, with journal
* already gone but journal.tmp not yet replacing it... in that
* case, pick up journal.tmp */
else if ( ::stat64( location_tmp.c_str(), &stat ) == 0 )
read( location_tmp );
}
Journal( std::string dir ) Journal( std::string dir )
: location( dir + "/journal" ), : location( dir + "/journal" ),
location_tmp( dir + "/journal.tmp" ) location_tmp( dir + "/journal.tmp" )