From a80c59130e92fa63cd61f782219448da33f3b6f9 Mon Sep 17 00:00:00 2001 From: Saagar Jha Date: Wed, 5 Jun 2019 04:17:03 -0700 Subject: [PATCH 01/16] build: fix configure script to work with Apple Clang 11 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/28071 Reviewed-By: Ben Noordhuis Reviewed-By: Luigi Pinca Reviewed-By: Richard Lau Reviewed-By: Refael Ackermann (רפאל פלחי) --- configure.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.py b/configure.py index cfd4207d32b8b9..22861a10eeac54 100755 --- a/configure.py +++ b/configure.py @@ -709,7 +709,7 @@ def get_llvm_version(cc): def get_xcode_version(cc): return get_version_helper( - cc, r"(^Apple LLVM version) ([0-9]+\.[0-9]+)") + cc, r"(^Apple (?:clang|LLVM) version) ([0-9]+\.[0-9]+)") def get_gas_version(cc): try: From 4879b80d872205e21e2d609cbfd097e9f3b95f65 Mon Sep 17 00:00:00 2001 From: Sam Roberts Date: Thu, 27 Jun 2019 14:37:42 -0700 Subject: [PATCH 02/16] tools: fix v8 testing with devtoolset on ppcle The devtoolset doesn't use or set the CXX, etc, env vars, so ignore them if not present. PR-URL: https://github.com/nodejs/node/pull/28458 Reviewed-By: Richard Lau Reviewed-By: Michael Dawson Reviewed-By: Rich Trott --- tools/make-v8.sh | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tools/make-v8.sh b/tools/make-v8.sh index fd66fda94274df..1a6e175b6158cc 100755 --- a/tools/make-v8.sh +++ b/tools/make-v8.sh @@ -12,7 +12,9 @@ if [[ "$ARCH" == "s390x" ]] || [[ "$ARCH" == "ppc64le" ]]; then export BUILD_TOOLS=/home/iojs/build-tools export LD_LIBRARY_PATH=$BUILD_TOOLS:$LD_LIBRARY_PATH export PATH=$BUILD_TOOLS:$PATH - CXX_PATH=`which $CXX |grep g++` + if [[ X"$CXX" != X ]]; then + CXX_PATH=`which $CXX |grep g++` + fi rm -f "$BUILD_TOOLS/g++" rm -f "$BUILD_TOOLS/gcc" fi @@ -24,8 +26,10 @@ if [[ "$ARCH" == "s390x" ]]; then gn gen -v out.gn/$BUILD_ARCH_TYPE --args='is_component_build=false is_debug=false use_goma=false goma_dir="None" use_custom_libcxx=false v8_target_cpu="s390x" target_cpu="s390x"' ninja -v -C out.gn/$BUILD_ARCH_TYPE d8 cctest inspector-test elif [[ "$ARCH" == "ppc64le" ]]; then - ln -s /usr/bin/$CXX "$BUILD_TOOLS/g++" - ln -s /usr/bin/$CC "$BUILD_TOOLS/gcc" + if [[ X"$CXX" != X ]]; then + ln -s /usr/bin/$CXX "$BUILD_TOOLS/g++" + ln -s /usr/bin/$CC "$BUILD_TOOLS/gcc" + fi g++ --version export PKG_CONFIG_PATH=$BUILD_TOOLS/pkg-config-files gn gen out.gn/$BUILD_ARCH_TYPE --args='is_component_build=false is_debug=false use_goma=false goma_dir="None" use_custom_libcxx=false v8_target_cpu="ppc64" target_cpu="ppc64"' From 4ae8d204cbb18829218e3987c8fd59803f4ccab0 Mon Sep 17 00:00:00 2001 From: Sam Roberts Date: Thu, 27 Jun 2019 14:39:15 -0700 Subject: [PATCH 03/16] tools: move python code out of jenkins shell https://ci.nodejs.org/job/node-test-commit-v8-linux/configure echoes python code into tools and runs it. Move these scripts into tools for better maintainability. Once this lands and is back-ported into LTS branches a bunch of shell code can be deleted from the job. PR-URL: https://github.com/nodejs/node/pull/28458 Reviewed-By: Richard Lau Reviewed-By: Michael Dawson Reviewed-By: Rich Trott --- tools/getarch.py | 10 ++++++++++ tools/getendian.py | 4 ++++ tools/getmachine.py | 3 +++ tools/getnodeversion.py | 1 + 4 files changed, 18 insertions(+) create mode 100644 tools/getarch.py create mode 100644 tools/getendian.py create mode 100644 tools/getmachine.py diff --git a/tools/getarch.py b/tools/getarch.py new file mode 100644 index 00000000000000..3c366525463340 --- /dev/null +++ b/tools/getarch.py @@ -0,0 +1,10 @@ +from __future__ import print_function +from utils import GuessArchitecture +arch = GuessArchitecture() + +# assume 64 bit unless set specifically +print(GuessArchitecture() \ + .replace('ia32', 'x64') \ + .replace('ppc', 'ppc64') \ + .replace('arm', 'arm64') \ + .replace('s390', 's390x')) diff --git a/tools/getendian.py b/tools/getendian.py new file mode 100644 index 00000000000000..0f9fcc1c860584 --- /dev/null +++ b/tools/getendian.py @@ -0,0 +1,4 @@ +from __future__ import print_function +import sys +# "little" or "big" +print(sys.byteorder) diff --git a/tools/getmachine.py b/tools/getmachine.py new file mode 100644 index 00000000000000..046d8b17a797fd --- /dev/null +++ b/tools/getmachine.py @@ -0,0 +1,3 @@ +from __future__ import print_function +import platform +print(platform.machine()) diff --git a/tools/getnodeversion.py b/tools/getnodeversion.py index 59f8aabe49eceb..c9f82160c0f386 100644 --- a/tools/getnodeversion.py +++ b/tools/getnodeversion.py @@ -1,3 +1,4 @@ +from __future__ import print_function import os import re From 81c31005fdd779aadcd4585866162012db736762 Mon Sep 17 00:00:00 2001 From: Vse Mozhet Byt Date: Fri, 23 Nov 2018 15:31:52 -0700 Subject: [PATCH 04/16] lib: fix comment nits in bootstrap\loaders.js Backport-PR-URL: https://github.com/nodejs/node/pull/30338 PR-URL: https://github.com/nodejs/node/pull/24641 Reviewed-By: Luigi Pinca Reviewed-By: Franziska Hinkelmann --- lib/internal/bootstrap/loaders.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/internal/bootstrap/loaders.js b/lib/internal/bootstrap/loaders.js index 06aee591496440..89087320ed0913 100644 --- a/lib/internal/bootstrap/loaders.js +++ b/lib/internal/bootstrap/loaders.js @@ -19,7 +19,7 @@ // can be created using NODE_MODULE_CONTEXT_AWARE_CPP() with the flag // NM_F_LINKED. // - internalBinding(): the private internal C++ binding loader, inaccessible -// from user land because they are only available from NativeModule.require() +// from user land because they are only available from NativeModule.require(). // These C++ bindings are created using NODE_MODULE_CONTEXT_AWARE_INTERNAL() // and have their nm_flags set to NM_F_INTERNAL. // @@ -61,7 +61,7 @@ keys: ObjectKeys, } = Object; - // Set up process.moduleLoadList + // Set up process.moduleLoadList. const moduleLoadList = []; ObjectDefineProperty(process, 'moduleLoadList', { value: moduleLoadList, @@ -70,7 +70,7 @@ writable: false }); - // Set up process.binding() and process._linkedBinding() + // Set up process.binding() and process._linkedBinding(). { const bindingObj = ObjectCreate(null); @@ -93,7 +93,7 @@ }; } - // Set up internalBinding() in the closure + // Set up internalBinding() in the closure. let internalBinding; { const bindingObj = ObjectCreate(null); @@ -115,11 +115,11 @@ }; } - // Create this WeakMap in js-land because V8 has no C++ API for WeakMap + // Create this WeakMap in js-land because V8 has no C++ API for WeakMap. internalBinding('module_wrap').callbackMap = new WeakMap(); const { ContextifyScript } = process.binding('contextify'); - // Set up NativeModule + // Set up NativeModule. function NativeModule(id) { this.filename = `${id}.js`; this.id = id; @@ -128,7 +128,7 @@ this.exportKeys = undefined; this.loaded = false; this.loading = false; - this.script = null; // The ContextifyScript of the module + this.script = null; // The ContextifyScript of the module. } NativeModule._source = getBinding('natives'); @@ -160,7 +160,7 @@ if (!NativeModule.exists(id)) { // Model the error off the internal/errors.js model, but // do not use that module given that it could actually be - // the one causing the error if there's a bug in Node.js + // the one causing the error if there's a bug in Node.js. // eslint-disable-next-line no-restricted-syntax const err = new Error(`No such built-in module: ${id}`); err.code = 'ERR_UNKNOWN_BUILTIN_MODULE'; @@ -201,7 +201,7 @@ if (config.exposeInternals) { NativeModule.nonInternalExists = function(id) { - // Do not expose this to user land even with --expose-internals + // Do not expose this to user land even with --expose-internals. if (id === loaderId) { return false; } @@ -209,7 +209,7 @@ }; NativeModule.isInternal = function(id) { - // Do not expose this to user land even with --expose-internals + // Do not expose this to user land even with --expose-internals. return id === loaderId; }; } else { @@ -243,7 +243,7 @@ }; // Provide named exports for all builtin libraries so that the libraries - // may be imported in a nicer way for esm users. The default export is left + // may be imported in a nicer way for ESM users. The default export is left // as the entire namespace (module.exports) and wrapped in a proxy such // that APMs and other behavior are still left intact. NativeModule.prototype.proxifyExports = function() { From 0f3ae77aaf01d0e5626668446bbcb1e66f408679 Mon Sep 17 00:00:00 2001 From: Myles Borins Date: Wed, 13 Nov 2019 14:03:58 -0800 Subject: [PATCH 05/16] tools: update tzdata to 2019c Refs: https://github.com/nodejs/node/issues/30211 Refs: https://github.com/nodejs/node/pull/30356 PR-URL: https://github.com/nodejs/node/pull/30479 Reviewed-By: Steven R Loomis Reviewed-By: Beth Griggs --- deps/icu-small/source/data/in/icudt64l.dat | Bin 2879744 -> 2880944 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/deps/icu-small/source/data/in/icudt64l.dat b/deps/icu-small/source/data/in/icudt64l.dat index 113b88a48048055426a004b008bdf144aece6ec3..2dcbc120a157ae5dda22e82431285b94104770c5 100644 GIT binary patch delta 21640 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 delta 20359 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 From 3e0709cf5e7b6a44c9b84cb9144dd41ee54cb932 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Zasso?= Date: Tue, 12 Nov 2019 12:35:22 +0100 Subject: [PATCH 06/16] deps: V8: backport fb63e5cf55e9 Original commit message: [Intl] Fix output of hour:'2-digit', hour12: true Bug: chromium:527926 Change-Id: I783ba59c6e4b117163e058032fb04283e1f43c46 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1529260 Reviewed-by: Sathya Gunasekaran Commit-Queue: Frank Tang Cr-Commit-Position: refs/heads/master@{#60379} Refs: https://github.com/v8/v8/commit/fb63e5cf55e93d7b4df51d3f382a6c84d25a5e86 Fixes: https://github.com/nodejs/node/issues/30369 Backport-PR-URL: https://github.com/nodejs/node/pull/30372 --- common.gypi | 2 +- deps/v8/src/objects/intl-objects.cc | 4 +++- deps/v8/test/intl/regress-527926.js | 19 +++++++++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 deps/v8/test/intl/regress-527926.js diff --git a/common.gypi b/common.gypi index 770f99955a26cc..f5786ef89f209f 100644 --- a/common.gypi +++ b/common.gypi @@ -33,7 +33,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.54', + 'v8_embedder_string': '-node.55', # Enable disassembler for `--print-code` v8 options 'v8_enable_disassembler': 1, diff --git a/deps/v8/src/objects/intl-objects.cc b/deps/v8/src/objects/intl-objects.cc index 60c3a0721be228..714099893d903a 100644 --- a/deps/v8/src/objects/intl-objects.cc +++ b/deps/v8/src/objects/intl-objects.cc @@ -138,7 +138,9 @@ icu::SimpleDateFormat* CreateICUDateFormat(Isolate* isolate, status)); icu::UnicodeString pattern; if (U_SUCCESS(status)) - pattern = generator->getBestPattern(skeleton, status); + pattern = generator->getBestPattern(skeleton, + UDATPG_MATCH_HOUR_FIELD_LENGTH, + status); date_format = new icu::SimpleDateFormat(pattern, icu_locale, status); if (U_SUCCESS(status)) { diff --git a/deps/v8/test/intl/regress-527926.js b/deps/v8/test/intl/regress-527926.js new file mode 100644 index 00000000000000..3f464794da19e3 --- /dev/null +++ b/deps/v8/test/intl/regress-527926.js @@ -0,0 +1,19 @@ +// Copyright 2019 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +let date = new Date(2015, 8, 1, 3, 0, 0); +var fmt = new Intl.DateTimeFormat('ru', {hour:'2-digit', minute: '2-digit'}) +assertEquals("03:00", fmt.format(date)); + +fmt = new Intl.DateTimeFormat( + 'en', {hour:'2-digit', minute: '2-digit', hour12: false}); +assertEquals("03:00", fmt.format(date)); + +fmt = new Intl.DateTimeFormat( + 'ru', {hour:'2-digit', minute: '2-digit', hour12: false}); +assertEquals("03:00", fmt.format(date)); + +fmt = new Intl.DateTimeFormat( + 'ru', {hour:'2-digit', minute: '2-digit', hour12: true}); +assertEquals("03:00 AM", fmt.format(date)); From 88e8b7cf83353e575a1e1eb63f81a320002605a4 Mon Sep 17 00:00:00 2001 From: Octavian Soldea Date: Mon, 18 Nov 2019 08:23:59 -0800 Subject: [PATCH 07/16] n-api: correct bug in napi_get_last_error napi_get_last_error returns incorrect napi_status. Backport-PR-URL: https://github.com/nodejs/node/pull/30532 PR-URL: https://github.com/nodejs/node/pull/28702 Reviewed-By: James M Snell Reviewed-By: Gabriel Schulhof Reviewed-By: Colin Ihrig Reviewed-By: Michael Dawson --- src/node_api.cc | 10 ++++++---- src/node_api_types.h | 4 ++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/node_api.cc b/src/node_api.cc index f04a5bbfb930a9..39b4fe8bca595f 100644 --- a/src/node_api.cc +++ b/src/node_api.cc @@ -1407,14 +1407,16 @@ napi_status napi_get_last_error_info(napi_env env, CHECK_ENV(env); CHECK_ARG(env, result); - // you must update this assert to reference the last message - // in the napi_status enum each time a new error message is added. + // The value of the constant below must be updated to reference the last + // message in the `napi_status` enum each time a new error message is added. // We don't have a napi_status_last as this would result in an ABI // change each time a message was added. + const int last_status = napi_date_expected; + static_assert( - node::arraysize(error_messages) == napi_date_expected + 1, + node::arraysize(error_messages) == last_status + 1, "Count of error messages must match count of error values"); - CHECK_LE(env->last_error.error_code, napi_callback_scope_mismatch); + CHECK_LE(env->last_error.error_code, last_status); // Wait until someone requests the last error information to fetch the error // message string diff --git a/src/node_api_types.h b/src/node_api_types.h index 0aece04aeef85b..211e4611c2d70b 100644 --- a/src/node_api_types.h +++ b/src/node_api_types.h @@ -84,6 +84,10 @@ typedef enum { napi_bigint_expected, napi_date_expected, } napi_status; +// Note: when adding a new enum value to `napi_status`, please also update +// `const int last_status` in `napi_get_last_error_info()' definition, +// in file js_native_api_v8.cc. Please also update the definition of +// `napi_status` in doc/api/n-api.md to reflect the newly added value(s). #if NAPI_VERSION >= 4 typedef enum { From 68b2b5cc5110ada9876e33273b1801f1f8088cc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Reis?= Date: Sat, 30 Nov 2019 01:13:48 +0000 Subject: [PATCH 08/16] build,win: propagate error codes in vcbuild Don't exit vcbuild with error code 0 when cctest fails. Backport-PR-URL: https://github.com/nodejs/node/pull/30726 PR-URL: https://github.com/nodejs/node/pull/30724 Refs: https://github.com/nodejs/build/issues/1996 Reviewed-By: Rod Vagg Reviewed-By: Sam Roberts Reviewed-By: Rich Trott --- vcbuild.bat | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/vcbuild.bat b/vcbuild.bat index 26c6b26dee69c0..c7c156e9b41d2d 100644 --- a/vcbuild.bat +++ b/vcbuild.bat @@ -68,7 +68,8 @@ set no_cctest= set cctest= set openssl_no_asm= set doc= -set extra_msbuild_args=^ +set extra_msbuild_args= +set exit_code=0 :next-arg if "%1"=="" goto args-done @@ -559,9 +560,11 @@ if defined no_cctest echo Skipping cctest because no-cctest was specified && got if not exist "%config%\cctest.exe" echo cctest.exe not found. Run "vcbuild test" or "vcbuild cctest" to build it. && goto run-test-py echo running 'cctest %cctest_args%' "%config%\cctest" %cctest_args% +if %errorlevel% neq 0 set exit_code=%errorlevel% :run-test-py echo running 'python tools\test.py %test_args%' python tools\test.py %test_args% +if %errorlevel% neq 0 set exit_code=%errorlevel% goto test-v8 :test-v8 @@ -672,7 +675,7 @@ echo vcbuild.bat no-cctest : skip building cctest.exe goto exit :exit -goto :EOF +exit /b %exit_code% rem *************** From 7e941eb17db2f11c01062fbd09262c2a6a03ec80 Mon Sep 17 00:00:00 2001 From: Yang Guo Date: Fri, 1 Feb 2019 13:21:15 +0100 Subject: [PATCH 09/16] test: do not fail SLOW tests if they are not slow PR-URL: https://github.com/nodejs/node/pull/25868 Refs: https://github.com/nodejs/node/issues/25867 Reviewed-By: Richard Lau Reviewed-By: Daniel Bevenius Reviewed-By: Refael Ackermann Reviewed-By: Anna Henningsen Reviewed-By: Gus Caplan --- tools/test.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/test.py b/tools/test.py index 3ddbb64a91e3d7..1f0a037b47c6e8 100755 --- a/tools/test.py +++ b/tools/test.py @@ -1184,6 +1184,9 @@ def ClassifyTests(self, cases, env): outcomes = reduce(set.union, outcomes_list, set()) unused_rules.difference_update(matches) case.outcomes = set(outcomes) or set([PASS]) + # slow tests may also just pass. + if SLOW in case.outcomes: + case.outcomes.add(PASS) result.append(case) return result, unused_rules From 20f64a96de07bd588e81f8813440181d50097cbe Mon Sep 17 00:00:00 2001 From: ZYSzys Date: Tue, 1 Oct 2019 23:06:44 +0800 Subject: [PATCH 10/16] http2: use the latest settings Fixes: https://github.com/nodejs/node/issues/29764 PR-URL: https://github.com/nodejs/node/pull/29780 Reviewed-By: James M Snell Reviewed-By: Luigi Pinca Reviewed-By: Anna Henningsen Reviewed-By: Colin Ihrig Reviewed-By: Beth Griggs Reviewed-By: Anto Aravinth Reviewed-By: Ruben Bridgewater --- lib/internal/http2/core.js | 1 + test/parallel/test-http2-session-settings.js | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/internal/http2/core.js b/lib/internal/http2/core.js index 5046539c570841..bb9e43ca8ea0bc 100644 --- a/lib/internal/http2/core.js +++ b/lib/internal/http2/core.js @@ -504,6 +504,7 @@ function onSettings() { return; session[kUpdateTimer](); debugSessionObj(session, 'new settings received'); + session[kRemoteSettings] = undefined; session.emit('remoteSettings', session.remoteSettings); } diff --git a/test/parallel/test-http2-session-settings.js b/test/parallel/test-http2-session-settings.js index 6061808082519d..29b6365ef1a3c4 100644 --- a/test/parallel/test-http2-session-settings.js +++ b/test/parallel/test-http2-session-settings.js @@ -38,6 +38,12 @@ server.on( }) ); +server.on('session', (session) => { + session.settings({ + maxConcurrentStreams: 2 + }); +}); + server.listen( 0, common.mustCall(() => { @@ -57,11 +63,18 @@ server.listen( assert.strictEqual(settings.maxFrameSize, 16384); }, 2) ); + + let calledOnce = false; client.on( 'remoteSettings', common.mustCall((settings) => { assert(settings); - }) + assert.strictEqual( + settings.maxConcurrentStreams, + calledOnce ? 2 : (2 ** 32) - 1 + ); + calledOnce = true; + }, 2) ); const headers = { ':path': '/' }; From 894aaa204011681676f5e6e021695a66c1588297 Mon Sep 17 00:00:00 2001 From: Matteo Collina Date: Sun, 27 Oct 2019 01:09:03 +0200 Subject: [PATCH 11/16] stream: extract Readable.from in its own file See: https://github.com/nodejs/readable-stream/pull/420 PR-URL: https://github.com/nodejs/node/pull/30140 Reviewed-By: Anna Henningsen Reviewed-By: Colin Ihrig Reviewed-By: Trivikram Kamat Reviewed-By: Gus Caplan Reviewed-By: Beth Griggs --- lib/_stream_readable.js | 39 ++++-------------------------- lib/internal/streams/from.js | 46 ++++++++++++++++++++++++++++++++++++ node.gyp | 1 + 3 files changed, 51 insertions(+), 35 deletions(-) create mode 100644 lib/internal/streams/from.js diff --git a/lib/_stream_readable.js b/lib/_stream_readable.js index 88193cd3b76219..52bc5019103ea2 100644 --- a/lib/_stream_readable.js +++ b/lib/_stream_readable.js @@ -42,6 +42,7 @@ const { // Lazy loaded to improve the startup performance. let StringDecoder; let createReadableStreamAsyncIterator; +let from; util.inherits(Readable, Stream); @@ -1154,40 +1155,8 @@ function endReadableNT(state, stream) { } Readable.from = function(iterable, opts) { - let iterator; - if (iterable && iterable[Symbol.asyncIterator]) - iterator = iterable[Symbol.asyncIterator](); - else if (iterable && iterable[Symbol.iterator]) - iterator = iterable[Symbol.iterator](); - else - throw new ERR_INVALID_ARG_TYPE('iterable', ['Iterable'], iterable); - - const readable = new Readable({ - objectMode: true, - ...opts - }); - // Reading boolean to protect against _read - // being called before last iteration completion. - let reading = false; - readable._read = function() { - if (!reading) { - reading = true; - next(); - } - }; - async function next() { - try { - const { value, done } = await iterator.next(); - if (done) { - readable.push(null); - } else if (readable.push(await value)) { - next(); - } else { - reading = false; - } - } catch (err) { - readable.destroy(err); - } + if (from === undefined) { + from = require('internal/streams/from'); } - return readable; + return from(Readable, iterable, opts); }; diff --git a/lib/internal/streams/from.js b/lib/internal/streams/from.js new file mode 100644 index 00000000000000..e809f2658d5a9a --- /dev/null +++ b/lib/internal/streams/from.js @@ -0,0 +1,46 @@ +'use strict'; + +const { + ERR_INVALID_ARG_TYPE +} = require('internal/errors').codes; + +function from(Readable, iterable, opts) { + let iterator; + if (iterable && iterable[Symbol.asyncIterator]) + iterator = iterable[Symbol.asyncIterator](); + else if (iterable && iterable[Symbol.iterator]) + iterator = iterable[Symbol.iterator](); + else + throw new ERR_INVALID_ARG_TYPE('iterable', ['Iterable'], iterable); + + const readable = new Readable({ + objectMode: true, + ...opts + }); + // Reading boolean to protect against _read + // being called before last iteration completion. + let reading = false; + readable._read = function() { + if (!reading) { + reading = true; + next(); + } + }; + async function next() { + try { + const { value, done } = await iterator.next(); + if (done) { + readable.push(null); + } else if (readable.push(await value)) { + next(); + } else { + reading = false; + } + } catch (err) { + readable.destroy(err); + } + } + return readable; +} + +module.exports = from; diff --git a/node.gyp b/node.gyp index e50a284b3011f0..dd60ea4a937691 100644 --- a/node.gyp +++ b/node.gyp @@ -178,6 +178,7 @@ 'lib/internal/streams/async_iterator.js', 'lib/internal/streams/buffer_list.js', 'lib/internal/streams/duplexpair.js', + 'lib/internal/streams/from.js', 'lib/internal/streams/legacy.js', 'lib/internal/streams/destroy.js', 'lib/internal/streams/state.js', From 8f3b8ca5156733a12ff3abbe8a277d42e02bceb2 Mon Sep 17 00:00:00 2001 From: Michael Lehenbauer Date: Wed, 27 Nov 2019 08:11:56 -0800 Subject: [PATCH 12/16] http2: fix session memory accounting after pausing The ability to pause input processing was added in 8a4a193 but introduced a session memory accounting mismatch leading to potential NGHTTP2_ENHANCE_YOUR_CALM errors. After pausing (https://github.com/nodejs/node/blob/f36331c1bfa4c4c202346b05dc3bd672f653e4df/src/node_http2.cc#L871), the early return on line 873 skips the DecrementCurrentSessionMemory(stream_buf_.len) call below (line 878). When we later finished processing the input chunk (https://github.com/nodejs/node/blob/f36331c1bfa4c4c202346b05dc3bd672f653e4df/src/node_http2.cc#L1858), we were calling DecrementCurrentSessionMemory(stream_buf_offset_) [line 1875] which was a no-op since we just set stream_buf_offset_ to 0 [line 1873]. The correct amount to decrement by is still stream_buf_.len, since that's the amount we skipped previously (line 878). Fixes: https://github.com/nodejs/node/issues/29223 Refs: https://github.com/nodejs/node/commit/164ac5b241b96089e6bad5bb83ea416966b3245f PR-URL: https://github.com/nodejs/node/pull/30684 Reviewed-By: Anna Henningsen Reviewed-By: Denys Otrishko Reviewed-By: James M Snell Reviewed-By: David Carlier --- src/node_http2.cc | 5 +- ...-http2-large-writes-session-memory-leak.js | 55 +++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 test/parallel/test-http2-large-writes-session-memory-leak.js diff --git a/src/node_http2.cc b/src/node_http2.cc index 21051e1721965b..35e0e8f623e3e6 100644 --- a/src/node_http2.cc +++ b/src/node_http2.cc @@ -1937,7 +1937,10 @@ void Http2Session::OnStreamRead(ssize_t nread, const uv_buf_t& buf_) { buf = uv_buf_init(new_buf, nread); stream_buf_offset_ = 0; stream_buf_ab_.Reset(); - DecrementCurrentSessionMemory(stream_buf_offset_); + + // We have now fully processed the stream_buf_ input chunk (by moving the + // remaining part into buf, which will be accounted for below). + DecrementCurrentSessionMemory(stream_buf_.len); } // Shrink to the actual amount of used data. diff --git a/test/parallel/test-http2-large-writes-session-memory-leak.js b/test/parallel/test-http2-large-writes-session-memory-leak.js new file mode 100644 index 00000000000000..641923c06c9133 --- /dev/null +++ b/test/parallel/test-http2-large-writes-session-memory-leak.js @@ -0,0 +1,55 @@ +'use strict'; +const common = require('../common'); +if (!common.hasCrypto) + common.skip('missing crypto'); +const fixtures = require('../common/fixtures'); +const http2 = require('http2'); + +// Regression test for https://github.com/nodejs/node/issues/29223. +// There was a "leak" in the accounting of session memory leading +// to streams eventually failing with NGHTTP2_ENHANCE_YOUR_CALM. + +const server = http2.createSecureServer({ + key: fixtures.readKey('agent2-key.pem'), + cert: fixtures.readKey('agent2-cert.pem'), +}); + +// Simple server that sends 200k and closes the stream. +const data200k = 'a'.repeat(200 * 1024); +server.on('stream', (stream) => { + stream.write(data200k); + stream.end(); +}); + +server.listen(0, common.mustCall(() => { + const client = http2.connect(`https://localhost:${server.address().port}`, { + ca: fixtures.readKey('agent2-cert.pem'), + servername: 'agent2', + + // Set maxSessionMemory to 1MB so the leak causes errors faster. + maxSessionMemory: 1 + }); + + // Repeatedly create a new stream and read the incoming data. Even though we + // only have one stream active at a time, prior to the fix for #29223, + // session memory would steadily increase and we'd eventually hit the 1MB + // maxSessionMemory limit and get NGHTTP2_ENHANCE_YOUR_CALM errors trying to + // create new streams. + let streamsLeft = 50; + function newStream() { + const stream = client.request({ ':path': '/' }); + + stream.on('data', () => { }); + + stream.on('close', () => { + if (streamsLeft-- > 0) { + newStream(); + } else { + client.destroy(); + server.close(); + } + }); + } + + newStream(); +})); From 25b8fbda3512ce981ef53a7db298471c1fb646b6 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Mon, 23 Dec 2019 12:05:47 -0800 Subject: [PATCH 13/16] doc: allow in header elements Allow use of in header elements without styling side effects. We can add styling later if desired. The goal here is to allow code to be set off in markdown without needing to escape characters and do lint exceptions for terms. This is probably a win in terms of accessibility too although it would be moreso if we had some visual differentiation for inside of headers. As mentioned above, that can always be added at a later time. Backport-PR-URL: https://github.com/nodejs/node/pull/31109 PR-URL: https://github.com/nodejs/node/pull/31086 Reviewed-By: Anna Henningsen Reviewed-By: Ruben Bridgewater --- doc/api_assets/style.css | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/doc/api_assets/style.css b/doc/api_assets/style.css index bdef22b04f78c9..ecb9208135db48 100644 --- a/doc/api_assets/style.css +++ b/doc/api_assets/style.css @@ -20,18 +20,28 @@ body { background: #fff; } -h1 { font-size: 2.5rem } -h2 { font-size: 2rem } -h3 { font-size: 1.75rem } -h4 { font-size: 1.5rem } -h5 { font-size: 1.25rem } -h6 { font-size: 1rem } - -h1, h2, h3, h4, h5, h6 { - margin: 1.5rem 0 1rem; - text-rendering: optimizeLegibility; +h1, h1 code { font-size: 2.5rem; } +h2, h2 code { font-size: 2rem; } +h3, h3 code { font-size: 1.75rem; } +h4, h4 code { font-size: 1.5rem; } +h5, h5 code { font-size: 1.25rem; } +h6, h6 code { font-size: 1rem; } + +h1, h1 code, +h2, h2 code, +h3, h3 code, +h4, h4 code, +h5, h5 code, +h6, h6 code { + background-color: inherit; + color: inherit; + font-family: inherit; font-weight: 700; + line-height: inherit; + margin: 1.5rem 0 1rem; + padding: inherit; position: relative; + text-rendering: optimizeLegibility; } pre, tt, code, .pre, span.type, a.type { From a1b095dd46c69e548243e14ce32b19503eb79267 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Mon, 23 Dec 2019 12:07:51 -0800 Subject: [PATCH 14/16] doc,dns: use code markup/markdown in headers This will allow us to lint for use of `hostname` in prose without flagging `hostname` in code within headers. This also allows us to remove backslash escaping for `[` and `]` inside of header code, which makes the bare markdown more readable. Backport-PR-URL: https://github.com/nodejs/node/pull/31109 PR-URL: https://github.com/nodejs/node/pull/31086 Reviewed-By: Anna Henningsen Reviewed-By: Ruben Bridgewater --- doc/api/dns.md | 74 +++++++++++++++++++++++++------------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/doc/api/dns.md b/doc/api/dns.md index a4e83ee9712e0c..7eb178e328f766 100644 --- a/doc/api/dns.md +++ b/doc/api/dns.md @@ -56,7 +56,7 @@ dns.resolve4('archive.org', (err, addresses) => { There are subtle consequences in choosing one over the other, please consult the [Implementation considerations section][] for more information. -## Class: dns.Resolver +## Class: `dns.Resolver` @@ -97,7 +97,7 @@ The following methods from the `dns` module are available: * [`resolver.reverse()`][`dns.reverse()`] * [`resolver.setServers()`][`dns.setServers()`] -### resolver.cancel() +### `resolver.cancel()` @@ -105,7 +105,7 @@ added: v8.3.0 Cancel all outstanding DNS queries made by this resolver. The corresponding callbacks will be called with an error with code `ECANCELLED`. -## dns.getServers() +## `dns.getServers()` @@ -126,7 +126,7 @@ section if a custom port is used. ] ``` -## dns.lookup(hostname[, options], callback) +## `dns.lookup(hostname[, options], callback)` @@ -243,7 +243,7 @@ dns.lookupService('127.0.0.1', 22, (err, hostname, service) => { If this method is invoked as its [`util.promisify()`][]ed version, it returns a `Promise` for an `Object` with `hostname` and `service` properties. -## dns.resolve(hostname[, rrtype], callback) +## `dns.resolve(hostname[, rrtype], callback)` @@ -275,7 +275,7 @@ records. The type and structure of individual results varies based on `rrtype`: On error, `err` is an [`Error`][] object, where `err.code` is one of the [DNS error codes](#dns_error_codes). -## dns.resolve4(hostname[, options], callback) +## `dns.resolve4(hostname[, options], callback)` @@ -385,7 +385,7 @@ Uses the DNS protocol to resolve `CNAME` records for the `hostname`. The will contain an array of canonical name records available for the `hostname` (e.g. `['bar.example.com']`). -## dns.resolveMx(hostname, callback) +## `dns.resolveMx(hostname, callback)` @@ -399,7 +399,7 @@ Uses the DNS protocol to resolve mail exchange records (`MX` records) for the contain an array of objects containing both a `priority` and `exchange` property (e.g. `[{priority: 10, exchange: 'mx.example.com'}, ...]`). -## dns.resolveNaptr(hostname, callback) +## `dns.resolveNaptr(hostname, callback)` @@ -431,7 +431,7 @@ function will contain an array of objects with the following properties: } ``` -## dns.resolveNs(hostname, callback) +## `dns.resolveNs(hostname, callback)` @@ -445,7 +445,7 @@ Uses the DNS protocol to resolve name server records (`NS` records) for the contain an array of name server records available for `hostname` (e.g. `['ns1.example.com', 'ns2.example.com']`). -## dns.resolvePtr(hostname, callback) +## `dns.resolvePtr(hostname, callback)` @@ -458,7 +458,7 @@ Uses the DNS protocol to resolve pointer records (`PTR` records) for the `hostname`. The `addresses` argument passed to the `callback` function will be an array of strings containing the reply records. -## dns.resolveSoa(hostname, callback) +## `dns.resolveSoa(hostname, callback)` @@ -492,7 +492,7 @@ be an object with the following properties: } ``` -## dns.resolveSrv(hostname, callback) +## `dns.resolveSrv(hostname, callback)` @@ -520,7 +520,7 @@ be an array of objects with the following properties: } ``` -## dns.resolveTxt(hostname, callback) +## `dns.resolveTxt(hostname, callback)` @@ -536,7 +536,7 @@ two-dimensional array of the text records available for `hostname` (e.g. one record. Depending on the use case, these could be either joined together or treated separately. -## dns.reverse(ip, callback) +## `dns.reverse(ip, callback)` @@ -551,7 +551,7 @@ array of hostnames. On error, `err` is an [`Error`][] object, where `err.code` is one of the [DNS error codes][]. -## dns.setServers(servers) +## `dns.setServers(servers)` @@ -594,7 +594,7 @@ The `dns.promises` API provides an alternative set of asynchronous DNS methods that return `Promise` objects rather than using callbacks. The API is accessible via `require('dns').promises`. -### Class: dnsPromises.Resolver +### Class: `dnsPromises.Resolver` @@ -640,7 +640,7 @@ The following methods from the `dnsPromises` API are available: * [`resolver.reverse()`][`dnsPromises.reverse()`] * [`resolver.setServers()`][`dnsPromises.setServers()`] -### dnsPromises.getServers() +### `dnsPromises.getServers()` @@ -661,7 +661,7 @@ section if a custom port is used. ] ``` -### dnsPromises.lookup(hostname[, options]) +### `dnsPromises.lookup(hostname[, options])` @@ -724,7 +724,7 @@ dnsPromises.lookup('example.com', options).then((result) => { }); ``` -### dnsPromises.lookupService(address, port) +### `dnsPromises.lookupService(address, port)` @@ -749,7 +749,7 @@ dnsPromises.lookupService('127.0.0.1', 22).then((result) => { }); ``` -### dnsPromises.resolve(hostname[, rrtype]) +### `dnsPromises.resolve(hostname[, rrtype])` @@ -778,7 +778,7 @@ based on `rrtype`: On error, the `Promise` is rejected with an [`Error`][] object, where `err.code` is one of the [DNS error codes](#dns_error_codes). -### dnsPromises.resolve4(hostname[, options]) +### `dnsPromises.resolve4(hostname[, options])` @@ -793,7 +793,7 @@ Uses the DNS protocol to resolve IPv4 addresses (`A` records) for the `hostname`. On success, the `Promise` is resolved with an array of IPv4 addresses (e.g. `['74.125.79.104', '74.125.79.105', '74.125.79.106']`). -### dnsPromises.resolve6(hostname[, options]) +### `dnsPromises.resolve6(hostname[, options])` @@ -808,7 +808,7 @@ Uses the DNS protocol to resolve IPv6 addresses (`AAAA` records) for the `hostname`. On success, the `Promise` is resolved with an array of IPv6 addresses. -### dnsPromises.resolveAny(hostname) +### `dnsPromises.resolveAny(hostname)` @@ -852,7 +852,7 @@ Here is an example of the result object: minttl: 60 } ] ``` -### dnsPromises.resolveCname(hostname) +### `dnsPromises.resolveCname(hostname)` @@ -862,7 +862,7 @@ Uses the DNS protocol to resolve `CNAME` records for the `hostname`. On success, the `Promise` is resolved with an array of canonical name records available for the `hostname` (e.g. `['bar.example.com']`). -### dnsPromises.resolveMx(hostname) +### `dnsPromises.resolveMx(hostname)` @@ -873,7 +873,7 @@ Uses the DNS protocol to resolve mail exchange records (`MX` records) for the containing both a `priority` and `exchange` property (e.g. `[{priority: 10, exchange: 'mx.example.com'}, ...]`). -### dnsPromises.resolveNaptr(hostname) +### `dnsPromises.resolveNaptr(hostname)` @@ -902,7 +902,7 @@ of objects with the following properties: } ``` -### dnsPromises.resolveNs(hostname) +### `dnsPromises.resolveNs(hostname)` @@ -913,7 +913,7 @@ Uses the DNS protocol to resolve name server records (`NS` records) for the records available for `hostname` (e.g. `['ns1.example.com', 'ns2.example.com']`). -### dnsPromises.resolvePtr(hostname) +### `dnsPromises.resolvePtr(hostname)` @@ -923,7 +923,7 @@ Uses the DNS protocol to resolve pointer records (`PTR` records) for the `hostname`. On success, the `Promise` is resolved with an array of strings containing the reply records. -### dnsPromises.resolveSoa(hostname) +### `dnsPromises.resolveSoa(hostname)` @@ -954,7 +954,7 @@ following properties: } ``` -### dnsPromises.resolveSrv(hostname) +### `dnsPromises.resolveSrv(hostname)` @@ -979,7 +979,7 @@ the following properties: } ``` -### dnsPromises.resolveTxt(hostname) +### `dnsPromises.resolveTxt(hostname)` @@ -992,7 +992,7 @@ of the text records available for `hostname` (e.g. one record. Depending on the use case, these could be either joined together or treated separately. -### dnsPromises.reverse(ip) +### `dnsPromises.reverse(ip)` @@ -1004,7 +1004,7 @@ array of hostnames. On error, the `Promise` is rejected with an [`Error`][] object, where `err.code` is one of the [DNS error codes](#dns_error_codes). -### dnsPromises.setServers(servers) +### `dnsPromises.setServers(servers)` From 77e0318849aa229b24bb5f30d3a919d8e133c226 Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Sun, 20 Oct 2019 10:13:57 +0200 Subject: [PATCH 15/16] stream: increase MAX_HWM MAX_HWM was added in 9208c89 where the highwatermark was changed to always increase in steps of highest power of 2 to prevent increasing hwm excessivly in tiny amounts. Why a limit was added on the highwatermark is unclear but breaks existing usage where a larger read size is used. The invariant for read(n) is that a buffer of size n is always returned. Considering a maximum ceiling on the buffer size breaks this invariant. This PR significantly increases the limit to make it less likely to break the previous invariant and also documents the limit. Fixes: https://github.com/nodejs/node/issues/29933 PR-URL: https://github.com/nodejs/node/pull/29938 Reviewed-By: Anna Henningsen Reviewed-By: Matteo Collina --- doc/api/stream.md | 2 ++ lib/_stream_readable.js | 5 +++-- test/parallel/test-readable-large-hwm.js | 27 ++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 test/parallel/test-readable-large-hwm.js diff --git a/doc/api/stream.md b/doc/api/stream.md index b6da7d98a1f94d..2d437c0eacef3b 100644 --- a/doc/api/stream.md +++ b/doc/api/stream.md @@ -1010,6 +1010,8 @@ buffer will be returned. If the `size` argument is not specified, all of the data contained in the internal buffer will be returned. +The `size` argument must be less than or equal to 1 GB. + The `readable.read()` method should only be called on `Readable` streams operating in paused mode. In flowing mode, `readable.read()` is called automatically until the internal buffer is fully drained. diff --git a/lib/_stream_readable.js b/lib/_stream_readable.js index 52bc5019103ea2..98216b411f5862 100644 --- a/lib/_stream_readable.js +++ b/lib/_stream_readable.js @@ -340,10 +340,11 @@ Readable.prototype.setEncoding = function(enc) { return this; }; -// Don't raise the hwm > 8MB -const MAX_HWM = 0x800000; +// Don't raise the hwm > 1GB +const MAX_HWM = 0x40000000; function computeNewHighWaterMark(n) { if (n >= MAX_HWM) { + // TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE. n = MAX_HWM; } else { // Get the next highest power of 2 to prevent increasing hwm excessively in diff --git a/test/parallel/test-readable-large-hwm.js b/test/parallel/test-readable-large-hwm.js new file mode 100644 index 00000000000000..d5bf25bc0e61c1 --- /dev/null +++ b/test/parallel/test-readable-large-hwm.js @@ -0,0 +1,27 @@ +'use strict'; +const common = require('../common'); +const { Readable } = require('stream'); + +// Make sure that readable completes +// even when reading larger buffer. +const bufferSize = 10 * 1024 * 1024; +let n = 0; +const r = new Readable({ + read() { + // Try to fill readable buffer piece by piece. + r.push(Buffer.alloc(bufferSize / 10)); + + if (n++ > 10) { + r.push(null); + } + } +}); + +r.on('readable', () => { + while (true) { + const ret = r.read(bufferSize); + if (ret === null) + break; + } +}); +r.on('end', common.mustCall()); From 8d5e286872c8587dcafffcabce3edc64d2bdcfc5 Mon Sep 17 00:00:00 2001 From: Beth Griggs Date: Tue, 7 Jan 2020 15:26:46 +0000 Subject: [PATCH 16/16] 2020-01-09, Version 10.18.1 'Dubnium' (LTS) - http2: fix session memory accounting after pausing (Michael Lehenbauer) [#30684](https://github.com/nodejs/node/pull/30684) - n-api: correct bug in napi_get_last_error (Octavian Soldea) [#28702](https://github.com/nodejs/node/pull/28702) - tools: update tzdata to 2019c (Myles Borins) [#30479](https://github.com/nodejs/node/pull/30479) PR-URL: https://github.com/nodejs/node/pull/31248 --- CHANGELOG.md | 3 ++- doc/changelogs/CHANGELOG_V10.md | 28 ++++++++++++++++++++++++++++ src/node_version.h | 2 +- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bddf738e117443..f7d1c7d3e2007e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,7 +33,8 @@ release. 12.0.0
-10.18.0
+10.18.1
+10.18.0
10.17.0
10.16.3
10.16.2
diff --git a/doc/changelogs/CHANGELOG_V10.md b/doc/changelogs/CHANGELOG_V10.md index 1b97546cb3ee7c..2b02844a6a06bc 100644 --- a/doc/changelogs/CHANGELOG_V10.md +++ b/doc/changelogs/CHANGELOG_V10.md @@ -10,6 +10,7 @@ +10.18.1
10.18.0
10.17.0
10.16.3
@@ -57,6 +58,33 @@ * [io.js](CHANGELOG_IOJS.md) * [Archive](CHANGELOG_ARCHIVE.md) + +## 2020-01-09, Version 10.18.1 'Dubnium' (LTS), @BethGriggs + +### Notable changes + +* **http2**: fix session memory accounting after pausing (Michael Lehenbauer) [#30684](https://github.com/nodejs/node/pull/30684) +* **n-api**: correct bug in napi_get_last_error (Octavian Soldea) [#28702](https://github.com/nodejs/node/pull/28702) +* **tools**: update tzdata to 2019c (Myles Borins) [#30479](https://github.com/nodejs/node/pull/30479) + +### Commits + +* [[`a80c59130e`](https://github.com/nodejs/node/commit/a80c59130e)] - **build**: fix configure script to work with Apple Clang 11 (Saagar Jha) [#28071](https://github.com/nodejs/node/pull/28071) +* [[`68b2b5cc51`](https://github.com/nodejs/node/commit/68b2b5cc51)] - **build,win**: propagate error codes in vcbuild (João Reis) [#30724](https://github.com/nodejs/node/pull/30724) +* [[`3e0709cf5e`](https://github.com/nodejs/node/commit/3e0709cf5e)] - **deps**: V8: backport fb63e5cf55e9 (Michaël Zasso) +* [[`25b8fbda35`](https://github.com/nodejs/node/commit/25b8fbda35)] - **doc**: allow in header elements (Rich Trott) [#31086](https://github.com/nodejs/node/pull/31086) +* [[`a1b095dd46`](https://github.com/nodejs/node/commit/a1b095dd46)] - **doc,dns**: use code markup/markdown in headers (Rich Trott) [#31086](https://github.com/nodejs/node/pull/31086) +* [[`8f3b8ca515`](https://github.com/nodejs/node/commit/8f3b8ca515)] - **http2**: fix session memory accounting after pausing (Michael Lehenbauer) [#30684](https://github.com/nodejs/node/pull/30684) +* [[`20f64a96de`](https://github.com/nodejs/node/commit/20f64a96de)] - **http2**: use the latest settings (ZYSzys) [#29780](https://github.com/nodejs/node/pull/29780) +* [[`81c31005fd`](https://github.com/nodejs/node/commit/81c31005fd)] - **lib**: fix comment nits in bootstrap\loaders.js (Vse Mozhet Byt) [#24641](https://github.com/nodejs/node/pull/24641) +* [[`88e8b7cf83`](https://github.com/nodejs/node/commit/88e8b7cf83)] - **n-api**: correct bug in napi_get_last_error (Octavian Soldea) [#28702](https://github.com/nodejs/node/pull/28702) +* [[`77e0318849`](https://github.com/nodejs/node/commit/77e0318849)] - **stream**: increase MAX_HWM (Robert Nagy) [#29938](https://github.com/nodejs/node/pull/29938) +* [[`894aaa2040`](https://github.com/nodejs/node/commit/894aaa2040)] - **stream**: extract Readable.from in its own file (Matteo Collina) [#30140](https://github.com/nodejs/node/pull/30140) +* [[`7e941eb17d`](https://github.com/nodejs/node/commit/7e941eb17d)] - **test**: do not fail SLOW tests if they are not slow (Yang Guo) [#25868](https://github.com/nodejs/node/pull/25868) +* [[`0f3ae77aaf`](https://github.com/nodejs/node/commit/0f3ae77aaf)] - **tools**: update tzdata to 2019c (Myles Borins) [#30479](https://github.com/nodejs/node/pull/30479) +* [[`4ae8d204cb`](https://github.com/nodejs/node/commit/4ae8d204cb)] - **tools**: move python code out of jenkins shell (Sam Roberts) [#28458](https://github.com/nodejs/node/pull/28458) +* [[`4879b80d87`](https://github.com/nodejs/node/commit/4879b80d87)] - **tools**: fix v8 testing with devtoolset on ppcle (Sam Roberts) [#28458](https://github.com/nodejs/node/pull/28458) + ## 2019-12-17, Version 10.18.0 'Dubnium' (LTS), @MylesBorins diff --git a/src/node_version.h b/src/node_version.h index 37671594fcaed2..13151531830c7b 100644 --- a/src/node_version.h +++ b/src/node_version.h @@ -29,7 +29,7 @@ #define NODE_VERSION_IS_LTS 1 #define NODE_VERSION_LTS_CODENAME "Dubnium" -#define NODE_VERSION_IS_RELEASE 0 +#define NODE_VERSION_IS_RELEASE 1 #ifndef NODE_STRINGIFY #define NODE_STRINGIFY(n) NODE_STRINGIFY_HELPER(n)