jam/js/dos/test/afs_srv.js

312 lines
12 KiB
JavaScript

/**
* Created by sbosse on 4/29/15.
*/
"use strict";
var Io = require('../io');
var Net = require('../network');
var Status = require('../network').Status;
var Sch = require('../scheduler');
var Conn = require('../connection');
var Buf = require('../buf');
var Rpc = require('../rpc');
var Std = require('../std');
var Afs = require('../afs');
var Afs_srv = require('../afs_srv');
var Router = require('../router');
var util = require('util');
var assert = require('../compat').assert;
var Command = Net.Command;
var String = require('../compat').string;
var Array = require('../compat').array;
var Perv = require('../compat').pervasives;
var div = require('../compat').div;
var Fs = require('fs');
var help=false;
var create=false;
var overwrite=false;
var nblocks=65536;
var ninodes=1024;
var blocksize=512;
var partA = '/tmp/afs.inode';
var partB = '/tmp/afs.data';
var test = [];
var shift='';
var verbose=true;
var shunk=10000;
process.argv.forEach(function (val, index, array) {
if(index>1) {
if (String.equal(shift,''))
String.match(val,[
['-help',function() {help=true;}],
['-overwrite',function() {overwrite=true;}],
['-create',function() {create=true;}],
['-nblocks',function() {shift=val;}],
['-ninodes',function() {shift=val;}],
['-blocksize',function() {shift=val;}],
['-test',function() {shift=val;}]
]);
else {
String.match(shift,[
['-nblocks',function() {nblocks=Perv.int_of_string(val);}],
['-ninodes',function() {ninodes=Perv.int_of_string(val);}],
['-blocksize',function() {blocksize=Perv.int_of_string(val);}],
['-test',function() {test.push(Perv.int_of_string(val));}]
]);
shift='';
}
}
});
if (help) {
Io.out('usage: '+process.argv[0]+' '+process.argv[1]);
Io.out(' [-help -create -overwrite]');
Io.out(' [-nblocks '+nblocks+' -ninodes '+ninodes+' -blocksize '+blocksize+']');
Io.out(' [-partA '+partA+' -partB '+partB+']');
return;
}
var privhostport = Net.uniqport();
var pubhostport = Net.prv2pub(privhostport);
var scheduler = Sch.Scheduler();
var conn = Conn.Connection(Net.uniqport(),'localhost',3000);
conn.init();
var router = Router.Router(pubhostport);
router.connection_broker(conn);
var rpc = Rpc.Rpc(router);
router.init();
/**
* @type Afs_server
*/
var server = Afs_srv.Server(rpc);
var stat;
if (create)
stat=server.afs_create_fs('myfiles',ninodes,blocksize,nblocks,partA,partB,true);
stat=server.afs_open_fs(partA,partB,Afs_srv.Afs_cache_parameters(2*(ninodes*Afs_srv.DEF_INODE_SIZE)/Afs_srv.DEF_BLOCK_SIZE,1,100,30));
Net.cap_to_file(Net.Capability(server.afs_super.afs_putport,
Net.prv_encode(0,Net.Rights.PRV_ALL_RIGHTS,server.afs_super.afs_checkfield)),"/tmp/afscap");
scheduler.Init();
scheduler.Run();
Io.out(server.afs_stat());
//Io.out(server.freeblocks.print());
var fcap=[];
function test_create_file(path) {
if (verbose) Io.out('test_create_file '+path);
var stats = Fs.statSync(path);
var size = stats.size;
var data = Fs.readFileSync(path);
var buf = Buf.Buffer(data);
var priv = Net.prv_encode(0,Net.Rights.AFS_RGT_CREATE,server.afs_super.afs_checkfield);
var sc = server.afs_create_file(priv,buf,size,Afs_srv.Afs_commit_flag.AFS_SAFETY);
if (verbose) Io.out('test_create_file: '+Status.print(sc.stat)+' '+Net.Print.capability(sc.cap));
fcap.push(sc.cap);
return sc
}
function test_create_file2(size) {
if (verbose) Io.out('test_create_file2 '+size);
var buf = Buf.Buffer(size);
var priv = Net.prv_encode(0,Net.Rights.AFS_RGT_CREATE,server.afs_super.afs_checkfield);
var sc = server.afs_create_file(priv,buf,size,Afs_srv.Afs_commit_flag.AFS_SAFETY);
if (verbose) Io.out('test_create_file2: '+Status.print(sc.stat)+' '+Net.Print.capability(sc.cap));
fcap.push(sc.cap);
return sc
}
function test_insert_file(path) {
if (verbose) Io.out('test_insert_file '+path);
var stats = Fs.statSync(path);
var size = stats.size;
var data = Fs.readFileSync(path);
var buf = Buf.Buffer(data);
var priv = Net.prv_encode(0,Net.Rights.AFS_RGT_CREATE,server.afs_super.afs_checkfield);
var sc = server.afs_create_file(priv,undefined,0,Afs_srv.Afs_commit_flag.AFS_UNCOMMIT);
var stat = sc.stat;
var off2 = 0;
var size2 = Perv.min(shunk,size);
var buf2=Buf.Buffer(size2);
while (stat == Status.STD_OK && off2 < size) {
Buf.buf_blit(buf2,0,buf,off2,size2);
var sc2 = server.afs_insert_data(sc.cap.cap_priv,buf2,off2,size2,Afs_srv.Afs_commit_flag.AFS_UNCOMMIT);
stat=sc2.stat;
off2=off2+size2;
size2=Perv.min((size-off2),shunk);
}
sc = server.afs_insert_data(sc.cap.cap_priv,undefined,0,0,Afs_srv.Afs_commit_flag.AFS_SAFETY);
fcap.push(sc.cap);
sc.stat=stat;
if (verbose) Io.out('test_insert_file: '+Status.print(sc.stat)+' '+Net.Print.capability(sc.cap));
return sc
}
function test_insert_file2(size) {
if (verbose) Io.out('test_insert_file2 '+size);
var buf = Buf.Buffer(size);
var priv = Net.prv_encode(0,Net.Rights.AFS_RGT_CREATE,server.afs_super.afs_checkfield);
var sc = server.afs_create_file(priv,undefined,0,Afs_srv.Afs_commit_flag.AFS_UNCOMMIT);
var stat = sc.stat;
var off2 = 0;
var size2 = Perv.min(shunk,size);
var buf2=Buf.Buffer(size2);
while (stat == Status.STD_OK && off2 < size) {
Buf.buf_blit(buf2,0,buf,off2,size2);
var sc2 = server.afs_insert_data(sc.cap.cap_priv,buf2,off2,size2,Afs_srv.Afs_commit_flag.AFS_UNCOMMIT);
stat=sc2.stat;
off2=off2+size2;
size2=Perv.min((size-off2),shunk);
}
sc = server.afs_insert_data(sc.cap.cap_priv,undefined,0,0,Afs_srv.Afs_commit_flag.AFS_SAFETY);
fcap.push(sc.cap);
sc.stat=stat;
if (verbose) Io.out('test_insert_file2: '+Status.print(sc.stat)+' '+Net.Print.capability(sc.cap));
return sc
}
function test_file_size(obj) {
if (verbose) Io.out('test_file_size '+obj);
var priv = fcap[obj].cap_priv;
var ss = server.afs_file_size(priv);
if (verbose) Io.out('test_file_size: '+Status.print(ss.stat)+' '+Net.Print.capability(fcap[obj])+' '+ss.size);
return ss;
}
function test_read_file(obj) {
if (verbose) Io.out('test_read_file '+obj);
var stats = test_file_size(obj);
var size = stats.size;
var buf = Buf.Buffer(size);
var priv = fcap[obj].cap_priv;
var ss = server.afs_read_file(priv,buf,0,size);
if (ss.stat == Status.STD_OK) Fs.writeFileSync('file'+obj+'.dat',buf.data);
if (verbose) Io.out('test_read_file: '+Status.print(ss.stat)+' '+Net.Print.capability(fcap[obj])+' '+ss.size);
return ss;
}
function test_destroy_file(obj) {
if (verbose) Io.out('test_destroy_file '+obj);
var priv = fcap[obj].cap_priv;
var stat = server.afs_destroy_file(priv);
if (verbose) Io.out('test_destroy_file: '+Status.print(stat));
return stat;
}
Array.iter (test,function(i) {
var sc,ss,stat;
switch (i) {
case 1:
sc=test_create_file('../sax.js');
assert((sc.stat==Status.STD_OK)||('test 1 failed (test_create_file) '+Status.print(sc.stat)));
break;
case 2:
sc=test_create_file('../xmldoc.js');
assert((sc.stat==Status.STD_OK)||('test 2 failed (test_create_file) '+Status.print(sc.stat)));
break;
case 3:
ss=test_file_size(0);
assert((ss.stat==Status.STD_OK)||('test 3 failed (test_create_file) '+Status.print(ss.stat)));
break;
case 4:
ss=test_file_size(1);
assert((ss.stat==Status.STD_OK)||('test 4 failed (test_create_file) '+Status.print(ss.stat)));
break;
case 11:
ss=test_read_file(0);
assert((ss.stat==Status.STD_OK)||('test 11 failed (test_read_file) '+Status.print(ss.stat)));
break;
case 12:
ss=test_read_file(1);
assert((ss.stat==Status.STD_OK)||('test 12 failed (test_read_file) '+Status.print(ss.stat)));
break;
case 21:
stat=test_destroy_file(0);
assert((stat==Status.STD_OK)||('test 21 failed (test_destroy_file) '+Status.print(stat)));
break;
case 22:
stat=test_destroy_file(1);
assert((stat==Status.STD_OK)||('test 22 failed (test_destroy_file) '+Status.print(stat)));
break;
case 51:
sc=test_insert_file('../sax.js');
assert((sc.stat==Status.STD_OK)||('test 51 failed (test_insert_file) '+Status.print(sc.stat)));
break;
case 100:
server.afs_exit();
server = Afs_srv.Server(rpc);
stat=server.afs_open_fs(partA,partB,Afs_srv.Afs_cache_parameters(1000,1,100,30));
assert((stat==Status.STD_OK)||('test 100 failed (afs_open_fs) '+Status.print(stat)));
break;
case 200:
var loops=100;
var size=500000;
Io.out('test_loop run '+loops);
var start=Perv.mtime();
verbose=false;
for(var i=0;i<loops;i++) {
fcap = [];
sc = test_insert_file2(size);
assert((sc.stat == Status.STD_OK) || ('test 200A failed (test_insert_file) ' + Status.print(sc.stat)));
sc = test_insert_file2(size);
assert((sc.stat == Status.STD_OK) || ('test 200B failed (test_insert_file) ' + Status.print(sc.stat)));
stat = test_destroy_file(0);
assert((stat == Status.STD_OK) || ('test 200C failed (test_destroy_file) ' + Status.print(stat)));
stat = test_destroy_file(1);
assert((stat == Status.STD_OK) || ('test 200D failed (test_destroy_file) ' + Status.print(stat)));
}
verbose=true;
var stop=Perv.mtime();
var bw = (loops*size*2)/(stop-start);
Io.out('test_loop run '+loops+' finished.');
Io.out(((bw*1000)|0)+' Bytes/sec '+div(div((bw*1000),1024),1024)+' MB/sec');
break;
case 201:
var loops=100;
var size=1000000;
Io.out('test_loop run '+loops);
var start=Perv.mtime();
verbose=false;
for(var i=0;i<loops;i++) {
fcap = [];
sc = test_create_file2(size);
assert((sc.stat == Status.STD_OK) || ('test 200A failed (test_insert_file) ' + Status.print(sc.stat)));
sc = test_create_file2(size);
assert((sc.stat == Status.STD_OK) || ('test 200B failed (test_insert_file) ' + Status.print(sc.stat)));
stat = test_destroy_file(0);
assert((stat == Status.STD_OK) || ('test 200C failed (test_destroy_file) ' + Status.print(stat)));
stat = test_destroy_file(1);
assert((stat == Status.STD_OK) || ('test 200D failed (test_destroy_file) ' + Status.print(stat)));
}
verbose=true;
var stop=Perv.mtime();
var bw = (loops*size*2)/(stop-start);
Io.out('test_loop run '+loops+' finished.');
Io.out(((bw*1000)|0)+' Bytes/sec '+div(div((bw*1000),1024),1024)+' MB/sec');
break;
case 1000:
server.afs_start_server(scheduler);
break;
}
});
//Io.inspect(server.inode_cache_entry)
//Io.inspect(server.cache_data.fsc_table)
Io.out(server.afs_stat());
Io.out(server.freeblocks.print());
server.freeblocks.free_compact();
Io.out(server.freeblocks.print());
Io.out('Host ports: '+Net.Print.port(privhostport)+' -> ' +Net.Print.port(pubhostport));
process.on('SIGINT', function () {
console.log('Ctrl-C...');
server.afs_exit();
process.exit(2);
});
router.start(100);