33
44const crypto = require ( 'crypto' ) ;
55const assert = require ( 'assert' ) ;
6- const ChunkFS = require ( '../util/chunk_fs ' ) ;
6+ const FileWriter = require ( '../util/file_writer ' ) ;
77const config = require ( '../../config' ) ;
88const nb_native = require ( '../util/nb_native' ) ;
99const stream_utils = require ( '../util/stream_utils' ) ;
@@ -19,7 +19,8 @@ const PARTS = Number(argv.parts) || 1000;
1919const CONCURRENCY = Number ( argv . concurrency ) || 20 ;
2020const CHUNK = Number ( argv . chunk ) || 16 * 1024 ;
2121const PART_SIZE = Number ( argv . part_size ) || 20 * 1024 * 1024 ;
22- const F_PREFIX = argv . dst_folder || '/tmp/chunk_fs_hashing/' ;
22+ const F_PREFIX = argv . dst_folder || '/tmp/file_writer_hashing/' ;
23+ const IOV_MAX = argv . iov_max || config . NSFS_DEFAULT_IOV_MAX ;
2324
2425const DEFAULT_FS_CONFIG = {
2526 uid : Number ( argv . uid ) || process . getuid ( ) ,
@@ -28,12 +29,6 @@ const DEFAULT_FS_CONFIG = {
2829 warn_threshold_ms : 100 ,
2930} ;
3031
31- const DUMMY_RPC = {
32- object : {
33- update_endpoint_stats : ( ...params ) => null
34- }
35- } ;
36-
3732const XATTR_USER_PREFIX = 'user.' ;
3833// TODO: In order to verify validity add content_md5_mtime as well
3934const XATTR_MD5_KEY = XATTR_USER_PREFIX + 'content_md5' ;
@@ -64,41 +59,42 @@ function assign_md5_to_fs_xattr(md5_digest, fs_xattr) {
6459 return fs_xattr ;
6560}
6661
67- async function hash_target ( ) {
68- await P . map_with_concurrency ( CONCURRENCY , Array ( PARTS ) . fill ( ) , async ( ) => {
62+ async function hash_target ( chunk_size = CHUNK , parts = PARTS , iov_max = IOV_MAX ) {
63+ config . NSFS_DEFAULT_IOV_MAX = iov_max ;
64+ await P . map_with_concurrency ( CONCURRENCY , Array ( parts ) . fill ( ) , async ( ) => {
6965 const data = crypto . randomBytes ( PART_SIZE ) ;
7066 const content_md5 = crypto . createHash ( 'md5' ) . update ( data ) . digest ( 'hex' ) ;
7167 // Using async generator function in order to push data in small chunks
7268 const source_stream = stream . Readable . from ( async function * ( ) {
73- for ( let i = 0 ; i < data . length ; i += CHUNK ) {
74- yield data . slice ( i , i + CHUNK ) ;
69+ for ( let i = 0 ; i < data . length ; i += chunk_size ) {
70+ yield data . slice ( i , i + chunk_size ) ;
7571 }
7672 } ( ) ) ;
7773 const target = new TargetHash ( ) ;
78- const chunk_fs = new ChunkFS ( {
74+ const file_writer = new FileWriter ( {
7975 target_file : target ,
8076 fs_context : DEFAULT_FS_CONFIG ,
81- rpc_client : DUMMY_RPC ,
8277 namespace_resource_id : 'MajesticSloth'
8378 } ) ;
84- await stream_utils . pipeline ( [ source_stream , chunk_fs ] ) ;
85- await stream_utils . wait_finished ( chunk_fs ) ;
79+ await stream_utils . pipeline ( [ source_stream , file_writer ] ) ;
80+ await stream_utils . wait_finished ( file_writer ) ;
8681 const write_hash = target . digest ( ) ;
8782 console . log (
8883 'Hash target' ,
89- `NativeMD5=${ chunk_fs . digest } ` ,
84+ `NativeMD5=${ file_writer . digest } ` ,
9085 `DataWriteCryptoMD5=${ write_hash } ` ,
9186 `DataOriginMD5=${ content_md5 } ` ,
9287 ) ;
9388 assert . strictEqual ( content_md5 , write_hash ) ;
9489 if ( config . NSFS_CALCULATE_MD5 ) {
95- assert . strictEqual ( chunk_fs . digest , content_md5 ) ;
96- assert . strictEqual ( chunk_fs . digest , write_hash ) ;
90+ assert . strictEqual ( file_writer . digest , content_md5 ) ;
91+ assert . strictEqual ( file_writer . digest , write_hash ) ;
9792 }
9893 } ) ;
9994}
10095
101- async function file_target ( chunk_size = CHUNK , parts = PARTS ) {
96+ async function file_target ( chunk_size = CHUNK , parts = PARTS , iov_max = IOV_MAX ) {
97+ config . NSFS_DEFAULT_IOV_MAX = iov_max ;
10298 fs . mkdirSync ( F_PREFIX ) ;
10399 await P . map_with_concurrency ( CONCURRENCY , Array ( parts ) . fill ( ) , async ( ) => {
104100 let target_file ;
@@ -113,32 +109,31 @@ async function file_target(chunk_size = CHUNK, parts = PARTS) {
113109 yield data . slice ( i , i + chunk_size ) ;
114110 }
115111 } ( ) ) ;
116- const chunk_fs = new ChunkFS ( {
112+ const file_writer = new FileWriter ( {
117113 target_file,
118114 fs_context : DEFAULT_FS_CONFIG ,
119- rpc_client : DUMMY_RPC ,
120115 namespace_resource_id : 'MajesticSloth'
121116 } ) ;
122- await stream_utils . pipeline ( [ source_stream , chunk_fs ] ) ;
123- await stream_utils . wait_finished ( chunk_fs ) ;
117+ await stream_utils . pipeline ( [ source_stream , file_writer ] ) ;
118+ await stream_utils . wait_finished ( file_writer ) ;
124119 if ( XATTR ) {
125120 await target_file . replacexattr (
126121 DEFAULT_FS_CONFIG ,
127- assign_md5_to_fs_xattr ( chunk_fs . digest , { } )
122+ assign_md5_to_fs_xattr ( file_writer . digest , { } )
128123 ) ;
129124 }
130125 if ( FSYNC ) await target_file . fsync ( DEFAULT_FS_CONFIG ) ;
131126 const write_hash = crypto . createHash ( 'md5' ) . update ( fs . readFileSync ( F_TARGET ) ) . digest ( 'hex' ) ;
132127 console . log (
133128 'File target' ,
134- `NativeMD5=${ chunk_fs . digest } ` ,
129+ `NativeMD5=${ file_writer . digest } ` ,
135130 `DataWriteMD5=${ write_hash } ` ,
136131 `DataOriginMD5=${ content_md5 } ` ,
137132 ) ;
138133 assert . strictEqual ( content_md5 , write_hash ) ;
139134 if ( config . NSFS_CALCULATE_MD5 ) {
140- assert . strictEqual ( chunk_fs . digest , content_md5 ) ;
141- assert . strictEqual ( chunk_fs . digest , write_hash ) ;
135+ assert . strictEqual ( file_writer . digest , content_md5 ) ;
136+ assert . strictEqual ( file_writer . digest , write_hash ) ;
142137 }
143138 // Leave parts on error
144139 fs . rmSync ( F_TARGET ) ;
0 commit comments