Commit 0329586a authored by Kamron Aroonrua's avatar Kamron Aroonrua 💬

storecache

parent b2b354f3
......@@ -25,6 +25,7 @@
"minimist": "^1.2.0",
"moment": "^2.17.1",
"mqtt": "^3.0.0",
"node-cache": "^5.1.2",
"node-gyp": "^3.6.2",
"node-persist": "^2.0.7",
"node-schedule": "^1.2.0",
......
const NodeCache = require( "node-cache" )
module.exports.create = function(prm)
{
return new BSSCache(prm);
}
function BSSCache(prm={}){
this.defTTL = prm.TTL || 600
this.max_size = prm.max_size || 8 * 1024 *1024
this.cache = new NodeCache({stdTTL:this.defTTL})
}
BSSCache.prototype.setCache = function (prm,obj)
{
let sname = prm.s
let ktype = prm.t || 'seq'
let keyname = prm.k
let ver = prm.v || '0'
let osize = prm.z
let cachekey = sname + ':' + ktype + ':' + String(keyname) + ':' + String(ver)
if(!obj){return;}
if(osize && osize>this.max_size){
return;
}
this.cache.set(cachekey,obj);
}
BSSCache.prototype.getCache = function (prm)
{
let sname = prm.s || '.'
let ktype = prm.t || 'seq'
let keyname = prm.k
let ver = prm.v || '0'
let cachekey = sname + ':' + ktype + ':' + String(keyname) + ':' + String(ver)
let val = this.cache.get(cachekey)
if(!val){
return null
}
this.cache.ttl(cachekey)
return val
}
\ No newline at end of file
......@@ -5,6 +5,9 @@ var RPCCaller = ctx.getLib('lib/amqp/rpccaller');
var SSServer = ctx.getLib('lib/axon/rpcserver');
var Db = ctx.getLib('storage-service/lib/db');
var WorkerPool = ctx.getLib('storage-service/lib/worker_pool');
var BSSCache = ctx.getLib('storage-service/lib/storage-bsscache');
var SSCaller = ctx.getLib('lib/axon/rpccaller');
var Tokenizer = ctx.getLib('lib/auth/tokenizer');
......@@ -147,17 +150,21 @@ SS.prototype.http_start = function()
}));
var context = ctx.getLib('lib/ws/http-context');
//this.storagecaller = new SSCaller({'url':SS_URL});
this.storagecaller = new RPCCaller({
url : amqp_cfg.url,
name :'storage_request'
});
this.bsscache = BSSCache.create()
this.acl_validator = ACLValidator.create(auth_cfg);
this.worker_pool.initWorker();
app.use(context.middleware({
'acl_validator':self.acl_validator,
'worker_pool' : self.worker_pool,
'storagecaller':self.storagecaller
'storagecaller':self.storagecaller,
'bsscache':self.bsscache
}));
var tokenizer = Tokenizer.create(auth_cfg);
......
......@@ -140,6 +140,7 @@ function get_object(reqHelper,respHelper,prm)
var opt = prm.opt || {};
var storagecaller = reqHelper.request.context.storagecaller;
var bsscache = reqHelper.request.context.bsscache;
oid_parse(oid,storagecaller,(err,oid_result)=>{
......@@ -158,23 +159,67 @@ function get_object(reqHelper,respHelper,prm)
var bss_full_path = storage_cfg.repository + "/" + oid_result.storage_name.split('.').join('/') + ".bss";
fs.exists(bss_full_path,function(exists){
fs.stat(bss_full_path,function(f_error,stats){
if(!f_error && stats.isFile()){
var cobj = null
//cache
if(oid_result.seq>=0){
cobj = bsscache.getCache({
s:oid_result.storage_name,
t:'seq',
k:String(oid_result.seq),
v:stats.atimeMs
})
}
if(exists){
if(cobj == null){
//MISS Cache
//console.log('Cache MISS----->>')
BinStream.open(bss_full_path,function(err,bss){
var rd = bss.reader();
var rec_count = rd.count();
var seq = (oid_result.seq>=0)?oid_result.seq:rec_count + oid_result.seq + 1;
if(oid_result.seq<0){
cobj = bsscache.getCache({
s:oid_result.storage_name,
t:'seq',
k:String(seq),
v:stats.atimeMs
})
}
if(cobj == null){
rd.objectAt(seq,function(err,obj){
bss.close(function(err){
if(obj && (oid_result.by == 'seq' || oid_result.obj_id == (new ObjId(obj.header.ID)).toString()) ){
bsscache.setCache({
s:oid_result.storage_name,
t:'seq',
k:String(seq),
v:stats.atimeMs,
z:obj.header.MZ+obj.header.DZ
},obj)
output(respHelper,obj,opt);
}else{respHelper.response404();}
});
});
}else{
//console.log('Cache HIT2----->>')
output(respHelper,cobj,opt);
}
});
}else{
//HIT Cache
//console.log('Cache HIT----->>')
output(respHelper,cobj,opt);
}
}else{
respHelper.response404();
}
......
const fs = require('fs');
var fname = "f.txt"
// Getting information for a file
fs.stat(fname, (error, stats) => {
if (error) {
console.log(error);
}
else {
console.log("Stats object for: example_file.txt");
console.log(stats.atimeMs);
// Using methods of the Stats object
console.log("Path is file:", stats.isFile());
console.log("Path is directory:", stats.isDirectory());
}
});
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment