11/* Copyright (C) 2016 NooBaa */
22'use strict' ;
33
4+ require ( '../util/panic' ) ;
5+
46const fs = require ( 'fs' ) ;
57const util = require ( 'util' ) ;
68const path = require ( 'path' ) ;
79const argv = require ( 'minimist' ) ( process . argv ) ;
8- const cluster = require ( 'cluster ' ) ;
10+ const { cluster } = require ( '../util/fork_utils ' ) ;
911const execAsync = util . promisify ( require ( 'child_process' ) . exec ) ;
1012const Speedometer = require ( '../util/speedometer' ) ;
1113const RandStream = require ( '../util/rand_stream' ) ;
@@ -55,6 +57,7 @@ argv.file_size_units = argv.file_size_units || 'MB';
5557argv . block_size_units = argv . block_size_units || 'MB' ;
5658argv . fsync = Boolean ( argv . fsync ) ;
5759argv . mode = argv . mode || 'nsfs' ;
60+ argv . backend = argv . backend || 'GPFS' ;
5861if ( argv . mode === 'dd' ) {
5962 argv . device = argv . device || '/dev/zero' ;
6063} else {
@@ -89,18 +92,15 @@ const file_size = argv.file_size * size_units_table[argv.file_size_units];
8992const block_count = Math . ceil ( file_size / block_size ) ;
9093const file_size_aligned = block_count * block_size ;
9194const nb_native = argv . mode === 'nsfs' && require ( '../util/nb_native' ) ;
92- const is_master = cluster . isMaster ;
93- const speedometer = new Speedometer ( is_master ? 'Total Speed' : 'FS Speed' ) ;
95+ const is_master = cluster . isPrimary ;
9496const start_time = Date . now ( ) ;
9597const end_time = start_time + ( argv . time * 1000 ) ;
9698
97- if ( argv . forks > 1 && is_master ) {
98- speedometer . fork ( argv . forks ) ;
99- } else {
100- main ( ) ;
101- }
99+ const speedometer = new Speedometer ( 'FS Speed' ) ;
100+ speedometer . run_workers ( argv . forks , main , argv ) ;
102101
103102async function main ( ) {
103+ // nb_native().fs.set_debug_level(5);
104104 const promises = [ ] ;
105105 fs . mkdirSync ( argv . dir , { recursive : true } ) ;
106106 for ( let i = 0 ; i < argv . concur ; ++ i ) promises . push ( worker ( i ) ) ;
@@ -127,15 +127,23 @@ async function worker(id) {
127127 if ( file_start_time >= end_time ) break ;
128128 const file_path = path . join ( dir , `file-${ file_id } ` ) ;
129129 file_id += 1 ;
130- if ( argv . mode === 'nsfs' ) {
131- await work_with_nsfs ( file_path ) ;
132- } else if ( argv . mode === 'nodejs' ) {
133- await work_with_nodejs ( file_path ) ;
134- } else if ( argv . mode === 'dd' ) {
135- await work_with_dd ( file_path ) ;
130+ try {
131+ if ( argv . mode === 'nsfs' ) {
132+ await work_with_nsfs ( file_path ) ;
133+ } else if ( argv . mode === 'nodejs' ) {
134+ await work_with_nodejs ( file_path ) ;
135+ } else if ( argv . mode === 'dd' ) {
136+ await work_with_dd ( file_path ) ;
137+ }
138+ const took_ms = Date . now ( ) - file_start_time ;
139+ speedometer . add_op ( took_ms ) ;
140+ } catch ( err ) {
141+ if ( argv . read && err . code === 'ENOENT' ) {
142+ file_id = 0 ;
143+ } else {
144+ throw err ;
145+ }
136146 }
137- const took_ms = Date . now ( ) - file_start_time ;
138- speedometer . add_op ( took_ms ) ;
139147 }
140148}
141149
@@ -157,24 +165,25 @@ async function work_with_nsfs(file_path) {
157165 const fs_context = {
158166 // uid: 666,
159167 // gid: 666,
160- backend : 'GPFS' ,
161- warn_threshold_ms : 1000 ,
168+ backend : argv . backend ,
169+ warn_threshold_ms : 10000 ,
162170 } ;
163- const file = await nb_native ( ) . fs . open ( fs_context , file_path , argv . read ? 'r' : 'w' , 0x660 ) ;
171+ const file = await nb_native ( ) . fs . open ( fs_context , file_path , argv . read ? 'r' : 'w' , 0o660 ) ;
164172 for ( let pos = 0 ; pos < file_size_aligned ; pos += block_size ) {
165173 const buf_start_time = Date . now ( ) ;
166174 if ( buf_start_time >= end_time ) break ;
167175 const buf = rand_stream . generator ( block_size ) ;
168176 if ( argv . nvec > 1 ) {
169177 if ( argv . read ) {
170- await file . readv ( fs_context , split_to_nvec ( buf , argv . nvec ) ) ;
178+ // await file.readv(fs_context, split_to_nvec(buf, argv.nvec));
179+ throw new Error ( 'TODO: readv is not yet available in NativeFile' ) ;
171180 } else {
172181 await file . writev ( fs_context , split_to_nvec ( buf , argv . nvec ) ) ;
173182 }
174183 } else if ( argv . read ) {
175184 await file . read ( fs_context , buf , 0 , buf . length , pos ) ;
176185 } else {
177- await file . write ( fs_context , buf ) ;
186+ await file . write ( fs_context , buf , buf . length , pos ) ;
178187 }
179188 speedometer . update ( block_size ) ;
180189 }
@@ -187,7 +196,7 @@ async function work_with_nodejs(file_path) {
187196 highWaterMark : 2 * block_size ,
188197 generator : argv . read ? 'noinit' : argv . generator ,
189198 } ) ;
190- const file = await fs . promises . open ( file_path , argv . read ? 'r' : 'w' , 0x660 ) ;
199+ const file = await fs . promises . open ( file_path , argv . read ? 'r' : 'w' , 0o660 ) ;
191200 for ( let pos = 0 ; pos < file_size_aligned ; pos += block_size ) {
192201 const buf_start_time = Date . now ( ) ;
193202 if ( buf_start_time >= end_time ) break ;
0 commit comments