Skip to content

Instantly share code, notes, and snippets.

@bobrik
Created September 4, 2012 11:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bobrik/3620592 to your computer and use it in GitHub Desktop.
Save bobrik/3620592 to your computer and use it in GitHub Desktop.
// rm aa; node buggy3.js | fgrep WTF | wc -l
// different results for each run
// writes are sequential
function FileWriterQueue(file) {
this.file = file;
this.queue = [];
}
FileWriterQueue.prototype.write = function(buffer, offset, callback) {
this.queue.push([buffer, offset, callback]);
if (this.queue.length > 1) {
return;
}
this.process();
};
FileWriterQueue.prototype.process = function() {
var self = this,
write = self.queue[0];
if (!write) {
return console.log("requested write with empty queue!");
}
console.log("[pwrite]", write[1], write[0].length);
fs.write(self.file, write[0], 0, write[0].length, write[1], function(error) {
console.log("[pwrite finished]", write[1], "->", write[1] + write[0].length);
write[2] && write[2](error);
self.queue.shift();
if (self.queue.length) {
self.process();
}
});
};
var fs = require("fs"),
file = fs.openSync("aa", "a+"),
bufs = {},
off = fs.fstatSync(file).size,
offs = {},
queue = new FileWriterQueue(file);
Object.keys(offs).forEach(function(o) {
offs[o] += off;
});
function calc_offset(size, from) {
var result = 0;
while (from < size) {
result += from;
from++;
}
return result;
}
function buf(size) {
if (!bufs[size]) {
bufs[size] = new Buffer(size);
for (var i = 0; i < size; i++) {
bufs[size][i] = i % 256;
}
}
return bufs[size];
}
function write_with_offset(size, from, callback) {
var offset = calc_offset(size, from);
queue.write(buf(size), offset, callback);
}
function reader() {
console.log("reader is here");
console.log(bufs);
console.log(offs);
Object.keys(bufs).forEach(function(size) {
size = +size;
var offset = offs[size],
test = new Buffer(size);
fs.read(file, test, 0, test.length, offset, function() {
if (test.toString("base64") != buf(size).toString("base64")) {
console.log("WTF? " + test.length + ":" + buf(size).length);
console.log(buf(size).slice(0,4).toString("base64"), test.slice(0, 4).toString("base64"))
}
});
});
}
//for (var i = 4000; i >= 3900; i--) {
// write_with_offset(i, 3900);
//}
for (var i = 9; i <= 100; i++) {
console.log(i);
write_with_offset(i, 9);
}
setTimeout(reader, 1000);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment