diff --git a/CHANGES b/CHANGES index e015c81..300deab 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,7 @@ Change log - Environment object appended to error message when SAP NWRFC SDK not found or can't be loaded - Accidentally added p-queue dependency removed +- Segfault when more Pool more connections requested than available as `ready` and at least 1 is available 2.0.2 (2020-07-21) ------------------ diff --git a/package-lock.json b/package-lock.json index 45b7678..d5c73ce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -946,9 +946,9 @@ } }, "@sinonjs/commons": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.0.tgz", - "integrity": "sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", + "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", "dev": true, "requires": { "type-detect": "4.0.8" @@ -996,9 +996,9 @@ } }, "@types/babel__traverse": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.12.tgz", - "integrity": "sha512-t4CoEokHTfcyfb4hUaF9oOHu9RmmNWnm1CP0YmMqOOfClKascOmvlEM736vlqeScuGvBDsHkf8R2INd4DWreQA==", + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.13.tgz", + "integrity": "sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -1075,9 +1075,9 @@ "dev": true }, "@types/prettier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.0.1.tgz", - "integrity": "sha512-boy4xPNEtiw6N3abRhBi/e7hNvy3Tt8E9ZRAQrwAGzoCGZS/1wjo9KY7JHhnfnEsG5wSjDbymCozUM9a3ea7OQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.0.2.tgz", + "integrity": "sha512-IkVfat549ggtkZUthUzEX49562eGikhSYeVGX97SkMFn+sTZrgRewXjQ4tPKFPCykZHkX1Zfd9OoELGqKU2jJA==", "dev": true }, "@types/stack-utils": { @@ -4516,9 +4516,9 @@ "dev": true }, "yargs": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", - "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "requires": { "cliui": "^6.0.0", @@ -4531,7 +4531,7 @@ "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^18.1.1" + "yargs-parser": "^18.1.2" } } } @@ -4559,9 +4559,9 @@ } }, "execa": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.2.tgz", - "integrity": "sha512-QI2zLa6CjGWdiQsmSkZoGtDx2N+cQIGb3yNolGTdjSQzydzLgYYf8LRuagp7S7fPimjcrzUDSUFd/MgzELMi4Q==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", + "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", "dev": true, "requires": { "cross-spawn": "^7.0.0", @@ -5455,9 +5455,9 @@ "dev": true }, "yargs": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", - "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "requires": { "cliui": "^6.0.0", @@ -5470,7 +5470,7 @@ "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^18.1.1" + "yargs-parser": "^18.1.2" } } } @@ -5818,9 +5818,9 @@ "dev": true }, "jsdom": { - "version": "16.2.2", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.2.2.tgz", - "integrity": "sha512-pDFQbcYtKBHxRaP55zGXCJWgFHkDAYbKcsXEK/3Icu9nKYZkutUXfLBwbD+09XDutkYSHcgfQLZ0qvpAAm9mvg==", + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.3.0.tgz", + "integrity": "sha512-zggeX5UuEknpdZzv15+MS1dPYG0J/TftiiNunOeNxSl3qr8Z6cIlQpN0IdJa44z9aFxZRIVqRncvEhQ7X5DtZg==", "dev": true, "requires": { "abab": "^2.0.3", @@ -5843,7 +5843,7 @@ "tough-cookie": "^3.0.1", "w3c-hr-time": "^1.0.2", "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.0.0", + "webidl-conversions": "^6.1.0", "whatwg-encoding": "^1.0.5", "whatwg-mimetype": "^2.3.0", "whatwg-url": "^8.0.0", @@ -6538,17 +6538,17 @@ } }, "node-notifier": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-7.0.1.tgz", - "integrity": "sha512-VkzhierE7DBmQEElhTGJIoiZa1oqRijOtgOlsXg32KrJRXsPy0NXFBqWGW/wTswnJlDCs5viRYaqWguqzsKcmg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-7.0.2.tgz", + "integrity": "sha512-ux+n4hPVETuTL8+daJXTOC6uKLgMsl1RYfFv7DKRzyvzBapqco0rZZ9g72ZN8VS6V+gvNYHYa/ofcCY8fkJWsA==", "dev": true, "optional": true, "requires": { "growly": "^1.3.0", - "is-wsl": "^2.1.1", - "semver": "^7.2.1", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", "shellwords": "^0.1.1", - "uuid": "^7.0.3", + "uuid": "^8.2.0", "which": "^2.0.2" }, "dependencies": { @@ -6560,9 +6560,9 @@ "optional": true }, "uuid": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", - "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.2.0.tgz", + "integrity": "sha512-CYpGiFTUrmI6OBMkAdjSDM0k5h8SkkiTP4WAjQgDgNB1S3Ou9VBEvr6q0Kv2H1mMk7IWfxYGpMH5sd5AvcIV2Q==", "dev": true, "optional": true }, @@ -6895,9 +6895,9 @@ } }, "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz", + "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -7541,21 +7541,29 @@ } }, "request-promise-core": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", - "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", "dev": true, "requires": { - "lodash": "^4.17.15" + "lodash": "^4.17.19" + }, + "dependencies": { + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true + } } }, "request-promise-native": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", - "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", "dev": true, "requires": { - "request-promise-core": "1.1.3", + "request-promise-core": "1.1.4", "stealthy-require": "^1.1.1", "tough-cookie": "^2.3.3" } @@ -9454,9 +9462,9 @@ } }, "ws": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", - "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", "dev": true }, "xdg-basedir": { diff --git a/src/Pool.cc b/src/Pool.cc index a31b823..0b0d25c 100644 --- a/src/Pool.cc +++ b/src/Pool.cc @@ -121,12 +121,13 @@ namespace node_rfc public: AcquireAsync(Napi::Function &callback, const uint_t clients_requested, Pool *pool) : Napi::AsyncWorker(callback), clients_requested(clients_requested), pool(pool) {} - ~AcquireAsync() {} + ~AcquireAsync() + { + } void Execute() { pool->lockMutex(); - errorInfo.code = RFC_OK; uint_t ii = clients_requested; @@ -136,8 +137,8 @@ namespace node_rfc { if (it != pool->connReady.end()) { - pool->connReady.erase(it); - ready_connections.insert(*it++); + ready_connections.insert(*it); + pool->connReady.erase(it++); } else { @@ -239,7 +240,9 @@ namespace node_rfc public: ReleaseAsync(Napi::Function &callback, Pool *pool, std::set clients) : Napi::AsyncWorker(callback), pool(pool), clients(clients) {} - ~ReleaseAsync() {} + ~ReleaseAsync() + { + } void Execute() { diff --git a/test/pool/acquire-release.spec.js b/test/pool/acquire-release.spec.js index c208ea9..45c7619 100644 --- a/test/pool/acquire-release.spec.js +++ b/test/pool/acquire-release.spec.js @@ -14,7 +14,7 @@ "use strict"; -describe("Pool Acquire/Release/Ready", () => { +describe("Pool Acquire/Release", () => { const setup = require("../utils/setup"); const Pool = setup.Pool; const abapSystem = setup.abapSystem(); @@ -24,7 +24,6 @@ describe("Pool Acquire/Release/Ready", () => { //poolOptions: { low: 2, high: 4 }, }; let pool; - let acquired = []; beforeAll((done) => { pool = new Pool(poolConfiguration); @@ -32,44 +31,54 @@ describe("Pool Acquire/Release/Ready", () => { }); afterAll((done) => { - pool.clearAll(); done(); }); - test("pool: acquire()", function () { + test("pool: acquire()", function (done) { expect.assertions(1); - return pool.acquire().then((client) => { - acquired.push(client); + pool.acquire().then((client) => { expect(client.alive).toBe(true); + done(); }); }); - test("pool: acquire(multiple)", function () { - expect.assertions(4); - return pool.acquire(3).then((clients) => { - acquired.push(...clients); - expect(clients.length).toBe(3); + test("pool: acquire(multiple)", function (done) { + const N = 3; + expect.assertions(N + 1); + pool.acquire(N).then((clients) => { + expect(clients.length).toBe(N); clients.forEach((c) => { expect(c.alive).toBe(true); }); + done(); }); }); - test("pool: release(single)", function () { - expect.assertions(1); - const client = acquired.pop(); - const LEASED = pool.status.leased; - return pool.release(client).then(() => { - expect(acquired.length).toBe(LEASED - 1); + test("pool: release(single)", function (done) { + expect.assertions(3); + pool.acquire((err, client) => { + expect(err).not.toBeDefined(); + const LEASED = pool.status.leased; + pool.release(client, (err) => { + expect(err).not.toBeDefined(); + expect(pool.status.leased).toBe(LEASED - 1); + done(); + }); }); }); - test("pool: release(multiple)", function () { - expect.assertions(1); - const LEASED = pool.status.leased; - const return_clients = acquired.slice(0, 2); - return pool.release(return_clients).then(() => { - expect(pool.status.leased).toBe(LEASED - 2); + test("pool: release(multiple)", function (done) { + expect.assertions(4); + const N = 3; + pool.acquire(N, (err, clients) => { + expect(err).not.toBeDefined(); + expect(clients.length).toBe(N); + const LEASED = pool.status.leased; + pool.release(clients, (err) => { + expect(err).not.toBeDefined(); + expect(pool.status.leased).toBe(LEASED - N); + done(); + }); }); }); diff --git a/test/pool/ready.spec.js b/test/pool/ready.spec.js index e20a788..fa4da66 100644 --- a/test/pool/ready.spec.js +++ b/test/pool/ready.spec.js @@ -34,7 +34,6 @@ describe("Pool Acquire/Release/Ready", () => { }); afterAll((done) => { - pool.clearAll(); done(); });