/** * 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 ' +Net.Print.port(pubhostport)); process.on('SIGINT', function () { console.log('Ctrl-C...'); server.afs_exit(); process.exit(2); }); router.start(100);