Skip to content

Commit

Permalink
delete works
Browse files Browse the repository at this point in the history
  • Loading branch information
SonicWang committed Dec 14, 2012
1 parent 79e201c commit 4913c8b
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 15 deletions.
27 changes: 16 additions & 11 deletions drivers/fs/blob_fs.js
Expand Up @@ -783,26 +783,31 @@ FS_blob.prototype.file_delete_meta = function (container_name, filename, callbac
//generate a fake version, just a place holder to let gc know there are work to do
var version_id = generate_version_id(key_fingerprint);
var prefix1 = key_fingerprint.substr(0,PREFIX_LENGTH), prefix2 = key_fingerprint.substr(PREFIX_LENGTH,PREFIX_LENGTH2);
var file_path = c_path + "/meta/" + prefix1 +"/"+prefix2+"/"+key_fingerprint; //complete representation: /container_name/filename
fs.symlink(c_path +"/" + TEMP_FOLDER + "/"+version_id, c_path + "/"+GC_FOLDER+"/" + version_id,function(err) {
if (err) {
var resp = {};
error_msg(500,"InternalError",err,resp);
callback(resp.resp_code, resp.resp_header, resp.resp_body, null);
return;
}

fs.unlink(file_path, function(err) {
var file_path = c_path + "/versions/" + prefix1 +"/"+prefix2+"/"+key_fingerprint; //complete representation: /container_name/filename
//we create a delete marker without actual data here
http.get("http://"+fb.seq_host+":"+fb.seq_port,function(res) {
var seq_id = res.headers["seq-id"];
fs.symlink(c_path +"/" + TEMP_FOLDER + "/"+version_id, c_path + "/"+GC_FOLDER+"/" + version_id+"-"+seq_id,function(err) {
if (err) {
var resp = {};
error_msg(500,"InternalError",err,resp);
callback(resp.resp_code, resp.resp_header, resp.resp_body, null);
return;
}
//add to gc cache
gc_counter++;
if (!gc_hash[container_name]) gc_hash[container_name] = {};
if (!gc_hash[container_name][key_fingerprint]) gc_hash[container_name][key_fingerprint] = {ver:[version_id],fn:filename}; else gc_hash[container_name][key_fingerprint].ver.push(version_id);
if (!gc_hash[container_name][key_fingerprint]) gc_hash[container_name][key_fingerprint] = {ver:[version_id+"-"+seq_id], meta:[{vblob_update_time:new Date().toUTCString().replace(/UTC/ig, "GMT"), vblob_seq_id:seq_id, vblob_file_size:0}], fn:filename}; else { gc_hash[container_name][key_fingerprint].ver.push(version_id+"-"+seq_id); gc_hash[container_name][key_fingerprint].meta.push({vblob_update_time:new Date().toUTCString().replace(/UTC/ig, "GMT"), vblob_seq_id:seq_id, vblob_file_size:0}); }
//ERROR?
resp_code = 204;
var header = common_header();
resp_header = header;
callback(resp_code, resp_header, null, null);
});
}).on('error',function(err) {
var resp = {};
error_msg(500,"InternalError",err,resp);
callback(resp.resp_code, resp.resp_header, resp.resp_body, null);
});
};

Expand Down
14 changes: 10 additions & 4 deletions drivers/fs/fs_ec.js
Expand Up @@ -207,12 +207,16 @@ buck.on('compact',function(buck_idx) {
}
var closure = function(bucket) {
var ivt_enum = {};
var ivt_enum2 = {};
var enum_base = global_enum_base[bucket];
var keys1 = Object.keys(global_enum_base[bucket]);
for (var nIdx1=0; nIdx1<keys1.length; nIdx1++) {
var ver1 = get_key_fingerprint(keys1[nIdx1]);
ivt_enum[keys1[nIdx1]] = ver1;
ivt_enum2[ver1] = keys1[nIdx1];
_objects += enum_base[keys1[nIdx1]].length;
//need to change for versionings
if (enum_base[keys1[nIdx1]].length==1&&!enum_base[keys1[nIdx1]][0].etag) _objects--;
for (var nIdx2=0; nIdx2<enum_base[keys1[nIdx1]].length; nIdx2++) {
_used_quota += enum_base[keys1[nIdx1]][nIdx2].size;
}
Expand Down Expand Up @@ -244,6 +248,9 @@ buck.on('compact',function(buck_idx) {
for (var key_idx = 0; key_idx < keys.length; key_idx++) {
var current_key = keys[key_idx];
var filename;
if (ivt_enum2[current_key]) { //special handling for delete
filename = current_key; current_key = ivt_enum2[current_key];
} else
if (ivt_enum[current_key]) filename = ivt_enum[current_key];
else
filename = get_key_fingerprint(current_key);
Expand All @@ -256,15 +263,14 @@ buck.on('compact',function(buck_idx) {
var old_size = enum_base[current_key]?enum_base[current_key][0].size:-1;
if (old_size == -1 || enum_base[current_key][0].seq <= obj2.vblob_seq_id) {
if (old_size != -1 && enum_base[current_key][0].seq == obj2.vblob_seq_id) continue;
if (old_size != -1) {
}
//unlink version and blob of current version
if (old_size != -1) fs.unlink(version_dir+"/"+pref1+"/"+pref2+"/"+filename+"-"+enum_base[current_key][0].seq, function(err) {} );
if (old_size != -1) fs.unlink(blob_dir+"/"+pref1+"/"+pref2+"/"+filename+"-"+enum_base[current_key][0].seq, function(err) {} );
if (old_size == -1) { old_size = 0; _objects += 1; }
if (enum_base[current_key][0].etag && !obj2.vblob_file_etag) _objects--; //deleting an object
if (old_size == -1) { old_size = 0; _objects += 1; if (!obj2.vblob_file_etag) _objects--; }
enum_base[current_key] = [{}];
enum_base[current_key][0].size = obj2.vblob_file_size;
enum_base[current_key][0].etag = obj2.vblob_file_etag;
if (obj2.vblob_file_etag) enum_base[current_key][0].etag = obj2.vblob_file_etag;
enum_base[current_key][0].lastmodified = obj2.vblob_update_time;
enum_base[current_key][0].seq = obj2.vblob_seq_id;
_used_quota += enum_base[current_key][0].size - old_size;
Expand Down
9 changes: 9 additions & 0 deletions drivers/fs/fs_gc.js
Expand Up @@ -93,6 +93,15 @@ buck.on('gc',function(buck_idx) {
evt.Batch = BATCH_NUM; evt.emit('nextbatch');
}
} else {
if (err.code == 'ENOENT') {
to_delete[filename] = 1;
if (!enum_delta[filename])
enum_delta[filename]=[];
var obj2 = {};
obj2.vblob_update_time = new Date(parseInt(filename2,10)).toUTCString().replace(/UTC/ig,"GMT");
obj2.vblob_seq_id = seq_id;
obj2.vblob_file_size = 0;
}
evt.Counter++; evt.Batch--;
if (evt.Batch === 0) { evt.Batch = BATCH_NUM; evt.emit('nextbatch'); }
}
Expand Down

0 comments on commit 4913c8b

Please sign in to comment.