11#!/usr/bin/env node
2-
32const { execSync } = require ( 'child_process' ) ;
43const fs = require ( 'fs' ) ;
54const path = require ( 'path' ) ;
@@ -16,6 +15,7 @@ function extractMetric(file, metric) {
1615}
1716
1817function average ( values ) {
18+ if ( values . length === 0 ) return 0 ;
1919 const sum = values . reduce ( ( a , b ) => parseFloat ( a ) + parseFloat ( b ) , 0 ) ;
2020 return sum / values . length ;
2121}
@@ -42,10 +42,12 @@ servers.forEach((server, idx) => {
4242 const latencyVals = [ ] ;
4343 for ( let j = 0 ; j < 3 ; j ++ ) {
4444 const fileIdx = startIdx + j ;
45- const reqSec = extractMetric ( resultFiles [ fileIdx ] , "Requests/sec" ) ;
46- const latency = extractMetric ( resultFiles [ fileIdx ] , "Latency" ) ;
47- if ( reqSec !== null ) reqSecVals . push ( reqSec ) ;
48- if ( latency !== null ) latencyVals . push ( latency ) ;
45+ if ( fileIdx < resultFiles . length ) {
46+ const reqSec = extractMetric ( resultFiles [ fileIdx ] , "Requests/sec" ) ;
47+ const latency = extractMetric ( resultFiles [ fileIdx ] , "Latency" ) ;
48+ if ( reqSec !== null ) reqSecVals . push ( reqSec ) ;
49+ if ( latency !== null ) latencyVals . push ( latency ) ;
50+ }
4951 }
5052 avgReqSecs [ server ] = average ( reqSecVals ) ;
5153 avgLatencies [ server ] = average ( latencyVals ) ;
@@ -54,25 +56,43 @@ servers.forEach((server, idx) => {
5456const reqSecData = "/tmp/reqSec.dat" ;
5557const latencyData = "/tmp/latency.dat" ;
5658
57- fs . writeFileSync ( reqSecData , "Server Value\n" + servers . map ( server => `${ server } ${ avgReqSecs [ server ] } ` ) . join ( '\n' ) ) ;
58- fs . writeFileSync ( latencyData , "Server Value\n" + servers . map ( server => `${ server } ${ avgLatencies [ server ] } ` ) . join ( '\n' ) ) ;
59+ try {
60+ fs . writeFileSync ( reqSecData , "Server Value\n" + servers . map ( server => `${ server } ${ avgReqSecs [ server ] } ` ) . join ( '\n' ) ) ;
61+ fs . writeFileSync ( latencyData , "Server Value\n" + servers . map ( server => `${ server } ${ avgLatencies [ server ] } ` ) . join ( '\n' ) ) ;
62+ } catch ( error ) {
63+ console . error ( `Error writing data files: ${ error . message } ` ) ;
64+ }
5965
6066let whichBench = 1 ;
61- if ( resultFiles [ 0 ] . startsWith ( "bench2" ) ) {
62- whichBench = 2 ;
63- } else if ( resultFiles [ 0 ] . startsWith ( "bench3" ) ) {
64- whichBench = 3 ;
67+ if ( resultFiles . length > 0 ) {
68+ if ( resultFiles [ 0 ] . startsWith ( "bench2" ) ) {
69+ whichBench = 2 ;
70+ } else if ( resultFiles [ 0 ] . startsWith ( "bench3" ) ) {
71+ whichBench = 3 ;
72+ }
6573}
6674
6775const reqSecHistogramFile = `req_sec_histogram${ whichBench } .png` ;
6876const latencyHistogramFile = `latency_histogram${ whichBench } .png` ;
6977
7078function getMaxValue ( data ) {
71- return Math . max ( ...data . split ( '\n' ) . slice ( 1 ) . map ( line => parseFloat ( line . split ( ' ' ) [ 1 ] ) ) ) ;
79+ try {
80+ return Math . max ( ...data . split ( '\n' ) . slice ( 1 ) . map ( line => parseFloat ( line . split ( ' ' ) [ 1 ] ) ) ) ;
81+ } catch ( error ) {
82+ console . error ( `Error getting max value: ${ error . message } ` ) ;
83+ return 0 ;
84+ }
7285}
7386
74- const reqSecMax = getMaxValue ( fs . readFileSync ( reqSecData , 'utf-8' ) ) * 1.2 ;
75- const latencyMax = getMaxValue ( fs . readFileSync ( latencyData , 'utf-8' ) ) * 1.2 ;
87+ let reqSecMax , latencyMax ;
88+ try {
89+ reqSecMax = getMaxValue ( fs . readFileSync ( reqSecData , 'utf-8' ) ) * 1.2 ;
90+ latencyMax = getMaxValue ( fs . readFileSync ( latencyData , 'utf-8' ) ) * 1.2 ;
91+ } catch ( error ) {
92+ console . error ( `Error reading data files: ${ error . message } ` ) ;
93+ reqSecMax = 0 ;
94+ latencyMax = 0 ;
95+ }
7696
7797const gnuplotScript = `
7898set term pngcairo size 1280,720 enhanced font 'Courier,12'
@@ -94,19 +114,26 @@ plot '${latencyData}' using 2:xtic(1) title 'Latency'
94114` ;
95115
96116const gnuplotScriptFile = '/tmp/gnuplot_script.gp' ;
97- fs . writeFileSync ( gnuplotScriptFile , gnuplotScript ) ;
117+ try {
118+ fs . writeFileSync ( gnuplotScriptFile , gnuplotScript ) ;
119+ } catch ( error ) {
120+ console . error ( `Error writing gnuplot script: ${ error . message } ` ) ;
121+ }
98122
99123try {
100124 execSync ( `gnuplot ${ gnuplotScriptFile } ` , { stdio : 'inherit' } ) ;
101125 console . log ( 'Gnuplot executed successfully' ) ;
102126} catch ( error ) {
103127 console . error ( 'Error executing gnuplot:' , error . message ) ;
104- process . exit ( 1 ) ;
105128}
106129
107130const assetsDir = path . join ( __dirname , "assets" ) ;
108131if ( ! fs . existsSync ( assetsDir ) ) {
109- fs . mkdirSync ( assetsDir ) ;
132+ try {
133+ fs . mkdirSync ( assetsDir ) ;
134+ } catch ( error ) {
135+ console . error ( `Error creating assets directory: ${ error . message } ` ) ;
136+ }
110137}
111138
112139function moveFile ( source , destination ) {
@@ -138,11 +165,15 @@ const lastServerReqSecs = avgReqSecs[lastServer];
138165
139166const resultsFile = "results.md" ;
140167
141- if ( ! fs . existsSync ( resultsFile ) || fs . readFileSync ( resultsFile , 'utf8' ) . trim ( ) === '' ) {
142- fs . writeFileSync ( resultsFile , `<!-- PERFORMANCE_RESULTS_START -->
168+ try {
169+ if ( ! fs . existsSync ( resultsFile ) || fs . readFileSync ( resultsFile , 'utf8' ) . trim ( ) === '' ) {
170+ fs . writeFileSync ( resultsFile , `<!-- PERFORMANCE_RESULTS_START -->
143171
144172| Query | Server | Requests/sec | Latency (ms) | Relative |
145173|-------:|--------:|--------------:|--------------:|---------:|` ) ;
174+ }
175+ } catch ( error ) {
176+ console . error ( `Error initializing results file: ${ error . message } ` ) ;
146177}
147178
148179let resultsTable = "" ;
@@ -169,30 +200,43 @@ sortedServers.forEach((server) => {
169200 resultsTable += `\n|| [${ formattedServerNames [ server ] } ] | \`${ formattedReqSecs } \` | \`${ formattedLatencies } \` | \`${ relativePerformance } x\` |` ;
170201} ) ;
171202
172- fs . appendFileSync ( resultsFile , resultsTable ) ;
203+ try {
204+ fs . appendFileSync ( resultsFile , resultsTable ) ;
205+ } catch ( error ) {
206+ console . error ( `Error appending to results file: ${ error . message } ` ) ;
207+ }
173208
174209if ( whichBench === 3 ) {
175- fs . appendFileSync ( resultsFile , "\n\n<!-- PERFORMANCE_RESULTS_END -->" ) ;
176-
177- const finalResults = fs
178- . readFileSync ( resultsFile , "utf-8" )
179- . replace ( / ( \r \n | \n | \r ) / gm, "\\n" ) ;
180-
181- const readmePath = "README.md" ;
182- let readmeContent = fs . readFileSync ( readmePath , "utf-8" ) ;
183- const performanceResultsRegex =
184- / < ! - - P E R F O R M A N C E _ R E S U L T S _ S T A R T - - > [ \s \S ] * < ! - - P E R F O R M A N C E _ R E S U L T S _ E N D - - > / ;
185- if ( performanceResultsRegex . test ( readmeContent ) ) {
186- readmeContent = readmeContent . replace (
187- performanceResultsRegex ,
188- finalResults
189- ) ;
190- } else {
191- readmeContent += `\n${ finalResults } ` ;
210+ try {
211+ fs . appendFileSync ( resultsFile , "\n\n<!-- PERFORMANCE_RESULTS_END -->" ) ;
212+
213+ const finalResults = fs
214+ . readFileSync ( resultsFile , "utf-8" )
215+ . replace ( / \\ / g, '' ) ; // Remove backslashes
216+
217+ const readmePath = "README.md" ;
218+ let readmeContent = fs . readFileSync ( readmePath , "utf-8" ) ;
219+ const performanceResultsRegex =
220+ / < ! - - P E R F O R M A N C E _ R E S U L T S _ S T A R T - - > [ \s \S ] * < ! - - P E R F O R M A N C E _ R E S U L T S _ E N D - - > / ;
221+ if ( performanceResultsRegex . test ( readmeContent ) ) {
222+ readmeContent = readmeContent . replace (
223+ performanceResultsRegex ,
224+ finalResults
225+ ) ;
226+ } else {
227+ readmeContent += `\n${ finalResults } ` ;
228+ }
229+ fs . writeFileSync ( readmePath , readmeContent ) ;
230+ console . log ( "README.md updated successfully" ) ;
231+ } catch ( error ) {
232+ console . error ( `Error updating README: ${ error . message } ` ) ;
192233 }
193- fs . writeFileSync ( readmePath , readmeContent ) ;
194234}
195235
196236resultFiles . forEach ( ( file ) => {
197- fs . unlinkSync ( file ) ;
198- } ) ;
237+ try {
238+ fs . unlinkSync ( file ) ;
239+ } catch ( error ) {
240+ console . error ( `Error deleting file ${ file } : ${ error . message } ` ) ;
241+ }
242+ } ) ;
0 commit comments