Skip to content

Commit 7c73c6f

Browse files
committed
Fixed race condition
1 parent fb300c2 commit 7c73c6f

File tree

2 files changed

+29
-16
lines changed

2 files changed

+29
-16
lines changed

index.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,10 @@ ReadRequest.prototype.onread = function (err, buf) {
249249
const req = this.req
250250

251251
if (err && this.retry) {
252-
this.retry = false
252+
if (err.code !== 0) {
253+
this.retry = false
254+
}
255+
253256
if (this.lock(this)) {
254257
this.file.clearFile()
255258
this.run(req)
@@ -294,7 +297,7 @@ class EntryFile {
294297
}
295298

296299
updateSize (size) {
297-
if (!this._truncated) {
300+
if (!this._truncated && size > this._size) {
298301
this._size = size
299302
}
300303

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)