Skip to content

Commit 0bd3705

Browse files
committed
Fixed race condition
1 parent fb300c2 commit 0bd3705

File tree

2 files changed

+27
-15
lines changed

2 files changed

+27
-15
lines changed

index.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,9 @@ WriteRequest.prototype.run = function (req) {
181181
if (err) return req.callback(err)
182182

183183
this.req = req
184-
if (!this.writer || this.writer.length !== file.size) return this.makeWriter()
184+
if (!this.writer) {
185+
return this.makeWriter()
186+
}
185187

186188
const end = req.offset + req.size
187189
if (end > file.size && !this.lock()) return

test.js

+24-14
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
const { promisify } = require('util')
12
const test = require('tape')
23
const randomAccessTest = require('random-access-test')
34
const racf = require('./')
@@ -14,20 +15,8 @@ test('write/read concurrent requests', async t => {
1415
const st = storage('random')
1516

1617
const rand = (min, max) => Math.floor(Math.random() * max) + min
17-
18-
const read = (...args) => new Promise((resolve, reject) => {
19-
st.read(...args, (err) => {
20-
if (err) return reject(err)
21-
resolve()
22-
})
23-
})
24-
25-
const write = (...args) => new Promise((resolve, reject) => {
26-
st.write(...args, (err) => {
27-
if (err) return reject(err)
28-
resolve()
29-
})
30-
})
18+
const read = promisify(st.read.bind(st))
19+
const write = promisify(st.write.bind(st))
3120

3221
try {
3322
await new Promise(resolve => st.open(() => resolve()))
@@ -55,3 +44,24 @@ test('write/read concurrent requests', async t => {
5544
t.end(err)
5645
}
5746
})
47+
48+
test('write concurrent requests over the same offset different size', async t => {
49+
const st = storage('random')
50+
51+
const write = promisify(st.write.bind(st))
52+
53+
try {
54+
await new Promise(resolve => st.open(() => resolve()))
55+
56+
await Promise.all([
57+
write(0, Buffer.alloc(10)),
58+
write(0, Buffer.alloc(1)),
59+
write(0, Buffer.alloc(5))
60+
])
61+
62+
t.pass('should write multiple requests over the same offset different size')
63+
t.end()
64+
} catch (err) {
65+
t.end(err)
66+
}
67+
})

0 commit comments

Comments
 (0)