[lvm-devel] master - test: Make the runner's journal more reliable.
Petr Rockai
mornfall at fedoraproject.org
Thu Feb 5 13:41:17 UTC 2015
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=dc1d15787830e37480925fbd5bb3ab04982ad1dd
Commit: dc1d15787830e37480925fbd5bb3ab04982ad1dd
Parent: d27833ba7ca2e6e80a01923e311b263681d4279d
Author: Petr Rockai <prockai at redhat.com>
AuthorDate: Fri Jun 27 01:19:15 2014 +0200
Committer: Petr Rockai <prockai at redhat.com>
CommitterDate: Thu Feb 5 13:47:17 2015 +0100
test: Make the runner's journal more reliable.
---
test/lib/filesystem.h | 9 +++++++++
test/lib/journal.h | 19 +++++++++++++++++--
2 files changed, 26 insertions(+), 2 deletions(-)
diff --git a/test/lib/filesystem.h b/test/lib/filesystem.h
index 718c433..2ae0c09 100644
--- a/test/lib/filesystem.h
+++ b/test/lib/filesystem.h
@@ -48,6 +48,15 @@ struct dir {
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 = "" )
{
Listing r;
diff --git a/test/lib/journal.h b/test/lib/journal.h
index d2f028c..020afe3 100644
--- a/test/lib/journal.h
+++ b/test/lib/journal.h
@@ -1,5 +1,7 @@
// -*- C++ -*-
+#include "filesystem.h"
+
#include <map>
#include <string>
#include <iostream>
@@ -26,6 +28,7 @@ struct Journal {
friend std::ostream &operator<<( std::ostream &o, R r ) {
switch ( r ) {
case STARTED: return o << "started";
+ case RETRIED: return o << "retried";
case FAILED: return o << "failed";
case INTERRUPTED: return o << "interrupted";
case PASSED: return o << "passed";
@@ -71,6 +74,7 @@ struct Journal {
void sync() {
write( location_tmp );
+ fsync_name( location_tmp );
rename( location_tmp.c_str(), location.c_str() );
}
@@ -112,12 +116,23 @@ struct Journal {
std::cout << i->second << ": " << i->first << std::endl;
}
- void read() {
- std::ifstream ifs( location.c_str() );
+ void read( std::string n ) {
+ std::ifstream ifs( n.c_str() );
typedef std::istream_iterator< std::pair< std::string, R > > It;
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 )
: location( dir + "/journal" ),
location_tmp( dir + "/journal.tmp" )
More information about the lvm-devel
mailing list