3838import tempfile
3939import threading
4040import time
41+ import traceback
4142
4243import port_for
4344
@@ -349,7 +350,7 @@ def _prepare_dir(self, destroy):
349350 # Copy backup to new data dir
350351 shutil .copytree (data1 , data2 )
351352 except Exception as e :
352- raise BackupException (str (e ))
353+ raise BackupException (_explain_exception (e ))
353354 else :
354355 base_dir = self .base_dir
355356
@@ -691,13 +692,13 @@ def print_node_file(node_file):
691692 return "### file not found ###\n "
692693
693694 error_text = (
694- "Cannot start node\n "
695- "{}\n " # pg_ctl log
696- "{}:\n ----\n {}\n " # postgresql.log
697- "{}:\n ----\n {}\n " # postgresql.conf
698- "{}:\n ----\n {}\n " # pg_hba.conf
699- "{}:\n ----\n {}\n " # recovery.conf
700- ).format (str (e ),
695+ u "Cannot start node\n "
696+ u "{}\n " # pg_ctl log
697+ u "{}:\n ----\n {}\n " # postgresql.log
698+ u "{}:\n ----\n {}\n " # postgresql.conf
699+ u "{}:\n ----\n {}\n " # pg_hba.conf
700+ u "{}:\n ----\n {}\n " # recovery.conf
701+ ).format (_explain_exception (e ),
701702 log_filename , print_node_file (log_filename ),
702703 conf_filename , print_node_file (conf_filename ),
703704 hba_filename , print_node_file (hba_filename ),
@@ -867,7 +868,9 @@ def safe_psql(self, dbname, query, username=None):
867868
868869 ret , out , err = self .psql (dbname , query , username = username )
869870 if ret :
870- raise QueryException (six .text_type (err ))
871+ if err :
872+ err = err .decode ('utf-8' )
873+ raise QueryException (err )
871874 return out
872875
873876 def dump (self , dbname , filename = None ):
@@ -1041,7 +1044,7 @@ def catchup(self):
10411044 lsn = master .execute ('postgres' , poll_lsn )[0 ][0 ]
10421045 self .poll_query_until ('postgres' , wait_lsn .format (lsn ))
10431046 except Exception as e :
1044- raise CatchUpException (str (e ))
1047+ raise CatchUpException (_explain_exception (e ))
10451048
10461049 def pgbench_init (self , dbname = 'postgres' , scale = 1 , options = []):
10471050 """
@@ -1103,6 +1106,15 @@ def connect(self, dbname='postgres', username=None):
11031106 username = username )
11041107
11051108
1109+ def _explain_exception (e ):
1110+ """
1111+ Use this function instead of str(e).
1112+ """
1113+
1114+ lines = traceback .format_exception_only (type (e ), e )
1115+ return '' .join (lines )
1116+
1117+
11061118def _cached_initdb (data_dir , initdb_logfile , initdb_params = []):
11071119 """
11081120 Perform initdb or use cached node files.
@@ -1113,7 +1125,7 @@ def call_initdb(_data_dir):
11131125 _params = [_data_dir , "-N" ] + initdb_params
11141126 _execute_utility ("initdb" , _params , initdb_logfile )
11151127 except Exception as e :
1116- raise InitNodeException (str (e ))
1128+ raise InitNodeException (_explain_exception (e ))
11171129
11181130 # Call initdb if we have custom params
11191131 if initdb_params or not TestgresConfig .cache_initdb :
@@ -1144,7 +1156,7 @@ def rm_cached_data_dir(rm_dir):
11441156 shutil .copytree (cached_data_dir , data_dir )
11451157
11461158 except Exception as e :
1147- raise InitNodeException (str (e ))
1159+ raise InitNodeException (_explain_exception (e ))
11481160
11491161
11501162def _execute_utility (util , args , logfile , write_to_pipe = True ):
@@ -1174,23 +1186,29 @@ def _execute_utility(util, args, logfile, write_to_pipe=True):
11741186
11751187 # get result
11761188 out , _ = process .communicate ()
1177- out = '' if not out else six .text_type (out )
11781189
11791190 # write new log entry if possible
11801191 try :
11811192 with open (logfile , "a" ) as file_out :
1182- # write util name + args
1183- file_out .write ('' .join (map (lambda x : str (x ) + ' ' ,
1184- [util ] + args )))
1185- file_out .write ('\n ' )
1186- file_out .write (out )
1193+ # write util name
1194+ file_out .write (util )
1195+ # write args
1196+ for arg in args :
1197+ file_out .write (arg )
1198+ with open (logfile , "ab" ) as file_out :
1199+ # write output
1200+ if out :
1201+ file_out .write (out )
11871202 except IOError :
11881203 pass
11891204
1205+ # decode output
1206+ out = '' if not out else out .decode ('utf-8' )
1207+
11901208 if process .returncode :
11911209 error_text = (
1192- "{} failed\n "
1193- "log:\n ----\n {}\n "
1210+ u "{} failed\n "
1211+ u "log:\n ----\n {}\n "
11941212 ).format (util , out )
11951213
11961214 raise ExecUtilException (error_text , process .returncode )
0 commit comments