Skip to content

Commit

Permalink
Make all write streams atomic
Browse files Browse the repository at this point in the history
IT IS ALWAYS A #%@^& RACE CONDITION!
  • Loading branch information
isaacs committed Sep 19, 2014
1 parent 42c872b commit 6784767
Show file tree
Hide file tree
Showing 5 changed files with 11 additions and 10 deletions.
11 changes: 4 additions & 7 deletions lib/cache/add-local-tarball.js
Expand Up @@ -16,6 +16,7 @@ var mkdir = require("mkdirp")
, chownr = require("chownr")
, inflight = require("inflight")
, once = require("once")
, writeStream = require('fs-write-stream-atomic')

module.exports = addLocalTarball

Expand Down Expand Up @@ -59,7 +60,7 @@ function addLocalTarball (p, pkgData, shasum, cb_) {
mkdir(path.dirname(tmp), function (er) {
if (er) return cb(er)
var from = fs.createReadStream(p)
, to = fs.createWriteStream(tmp)
, to = writeStream(tmp, { mode: npm.modes.file })
, errState = null
function errHandler (er) {
if (errState) return
Expand All @@ -69,11 +70,7 @@ function addLocalTarball (p, pkgData, shasum, cb_) {
to.on("error", errHandler)
to.on("close", function () {
if (errState) return
log.verbose("chmod", tmp, npm.modes.file.toString(8))
fs.chmod(tmp, npm.modes.file, function (er) {
if (er) return cb(er)
addTmpTarball(tmp, pkgData, shasum, cb)
})
addTmpTarball(tmp, pkgData, shasum, cb)
})
from.pipe(to)
})
Expand Down Expand Up @@ -203,7 +200,7 @@ function addTmpTarball_ (tgz, data, shasum, cb) {

if (er) return cb(er)
var read = fs.createReadStream(tgz)
var write = fs.createWriteStream(target)
var write = writeStream(target, { mode: npm.modes.file })
var fin = cs.uid && cs.gid ? chown : done
read.on("error", cb).pipe(write).on("error", cb).on("close", fin)
})
Expand Down
3 changes: 2 additions & 1 deletion lib/cache/add-remote-git.js
Expand Up @@ -17,6 +17,7 @@ var mkdir = require("mkdirp")
, unlock = locker.unlock
, getCacheStat = require("./get-stat.js")
, addLocalTarball = require("./add-local-tarball.js")
, writeStream = require('fs-write-stream-atomic')


// 1. cacheDir = path.join(cache,'_git-remotes',sha1(u))
Expand Down Expand Up @@ -205,7 +206,7 @@ function archiveGitRemote (p, u, co, origUrl, cb) {
if (er) return cb(er)
var gzip = zlib.createGzip({ level: 9 })
var args = ["archive", co, "--format=tar", "--prefix=package/"]
var out = fs.createWriteStream(tmp)
var out = writeStream(tmp)
var env = gitEnv()
cb = once(cb)
var cp = git.spawn(args, { env: env, cwd: p })
Expand Down
3 changes: 2 additions & 1 deletion lib/pack.js
Expand Up @@ -11,6 +11,7 @@ var npm = require("./npm.js")
, chain = require("slide").chain
, path = require("path")
, cwd = process.cwd()
, writeStream = require('fs-write-stream-atomic')

pack.usage = "npm pack <pkg>"

Expand Down Expand Up @@ -53,7 +54,7 @@ function pack_ (pkg, cb) {
, data.version
, "package.tgz" )
, from = fs.createReadStream(cached)
, to = fs.createWriteStream(fname)
, to = writeStream(fname)
, errState = null

from.on("error", cb_)
Expand Down
3 changes: 2 additions & 1 deletion lib/utils/error-handler.js
Expand Up @@ -11,6 +11,7 @@ var cbCalled = false
, exitCode = 0
, rollbacks = npm.rollbacks
, chain = require("slide").chain
, writeStream = require('fs-write-stream-atomic')


process.on("exit", function (code) {
Expand Down Expand Up @@ -352,7 +353,7 @@ function writeLogFile (cb) {
wroteLogFile = true

var fs = require("graceful-fs")
, fstr = fs.createWriteStream("npm-debug.log")
, fstr = writeStream("npm-debug.log")
, os = require("os")
, out = ""

Expand Down
1 change: 1 addition & 0 deletions test/tap/cache-add-localdir-fallback.js
Expand Up @@ -9,6 +9,7 @@ npm.load({loglevel : "silent"}, function () {

var cache = requireInject("../../lib/cache.js", {
"graceful-fs": {
WriteStream: require('graceful-fs').WriteStream,
stat: function (file, cb) {
process.nextTick(function () {
switch (file) {
Expand Down

0 comments on commit 6784767

Please sign in to comment.