Skip to content

Commit 0b37d7a

Browse files
committed
fix: Limit concurrent FS calls to prevent memory fragmentation
1 parent 5b6d39b commit 0b37d7a

File tree

6 files changed

+23
-13
lines changed

6 files changed

+23
-13
lines changed

packages/raven-node/lib/utils.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ var protocolMap = {
1818

1919
var consoleAlerts = new Set();
2020

21-
var fsLimiter = new Limiter({concurrency: 25);
21+
var fsLimiter = new Limiter({concurrency: 25});
2222

2323
// Default Node.js REPL depth
2424
var MAX_SERIALIZE_EXCEPTION_DEPTH = 3;
@@ -282,7 +282,7 @@ function readSourceFiles(filenames, cb) {
282282
var sourceFiles = {};
283283
var numFilesToRead = filenames.length;
284284
return filenames.forEach(function(filename) {
285-
fsLimiter.push(function (done) {
285+
fsLimiter.push(function(done) {
286286
fs.readFile(filename, function(readErr, file) {
287287
done();
288288

packages/utils/.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
*.js.map
22
*.d.ts
3+
!src/*.d.ts
34
*.js

packages/utils/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
},
1515
"dependencies": {
1616
"@sentry/types": "4.4.1",
17+
"async-limiter": "^1.0.0",
1718
"tslib": "^1.9.3"
1819
},
1920
"devDependencies": {

packages/utils/src/declarations.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
declare module 'async-limiter';

packages/utils/src/fs.ts

+17-10
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,32 @@
1+
import * as Limiter from 'async-limiter';
12
import { mkdir, mkdirSync, readFile, statSync } from 'fs';
23
import { dirname, resolve } from 'path';
34

5+
// tslint:disable-next-line:no-unsafe-any
6+
const fsLimiter = new Limiter({ concurrency: 25 });
47
const _0777 = parseInt('0777', 8);
58

69
/**
7-
* Asynchronously creates the given directory.
10+
* Asynchronously reads given files content.
811
*
9-
* @param path A relative or absolute path to the directory.
10-
* @param mode The permission mode.
11-
* @returns A Promise that resolves when the path has been created.
12+
* @param path A relative or absolute path to the file
13+
* @returns A Promise that resolves when the file has been read.
1214
*/
1315
export async function readFileAsync(path: string): Promise<Error | string> {
1416
// We cannot use util.promisify here because that was only introduced in Node
1517
// 8 and we need to support older Node versions.
1618
return new Promise<Error | string>((res, reject) => {
17-
readFile(path, 'utf8', (err, data) => {
18-
if (err) {
19-
reject(err);
20-
} else {
21-
res(data);
22-
}
19+
// tslint:disable-next-line:no-unsafe-any
20+
fsLimiter.push((done: () => void) => {
21+
readFile(path, 'utf8', (err, data) => {
22+
done();
23+
24+
if (err) {
25+
reject(err);
26+
} else {
27+
res(data);
28+
}
29+
});
2330
});
2431
});
2532
}

packages/utils/test/object.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { clone, deserialize, fill, serialize, safeNormalize, urlEncode } from '../src/object';
1+
import { clone, deserialize, fill, safeNormalize, serialize, urlEncode } from '../src/object';
22

33
const MATRIX = [
44
{ name: 'boolean', object: true, serialized: 'true' },

0 commit comments

Comments
 (0)