diff --git a/.asf.yaml b/.asf.yaml
index 9018f895a9c..31ee0d40aa4 100644
--- a/.asf.yaml
+++ b/.asf.yaml
@@ -11,6 +11,11 @@ github:
- cdn
- cache
- apache
+ - http/2
+ - http/3
+ - quic
+ - forwardproxy
+ - reverseproxy
- hacktoberfest
features:
# Enable wiki for documentation
@@ -29,9 +34,6 @@ github:
collaborators:
- mtorluemke
- c-taylor
- - moonchen
- - cmcfarlen
- - serrislew
- etapia
protected_branches:
master:
diff --git a/.clang-format b/.clang-format
index cd564fb109c..3bd0b0b3387 100644
--- a/.clang-format
+++ b/.clang-format
@@ -1,16 +1,38 @@
---
-Language: Cpp
+Language: Cpp
AccessModifierOffset: -2
AlignAfterOpenBracket: Align
-AlignConsecutiveMacros: false
-AlignConsecutiveAssignments: true
-AlignConsecutiveDeclarations: false
+AlignArrayOfStructures: Left
+AlignConsecutiveAssignments:
+ Enabled: true
+ AcrossEmptyLines: false
+ AcrossComments: false
+ AlignCompound: true
+ PadOperators: true
+AlignConsecutiveBitFields:
+ Enabled: true
+ AcrossEmptyLines: false
+ AcrossComments: false
+ AlignCompound: false
+ PadOperators: false
+AlignConsecutiveDeclarations:
+ Enabled: false
+ AcrossEmptyLines: false
+ AcrossComments: false
+ AlignCompound: false
+ PadOperators: true
+AlignConsecutiveMacros:
+ Enabled: true
+ AcrossEmptyLines: false
+ AcrossComments: false
+ AlignCompound: false
+ PadOperators: true
AlignEscapedNewlines: Left
-AlignOperands: true
+AlignOperands: Align
AlignTrailingComments: true
-AllowAllArgumentsOnNextLine: true
-AllowAllConstructorInitializersOnNextLine: true
+AllowAllArgumentsOnNextLine: false
AllowAllParametersOfDeclarationOnNextLine: false
+AllowShortEnumsOnASingleLine: true
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: Inline
@@ -21,26 +43,31 @@ AlwaysBreakAfterDefinitionReturnType: All
AlwaysBreakAfterReturnType: AllDefinitions
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: MultiLine
+AttributeMacros:
+ - __capability
BinPackArguments: true
BinPackParameters: true
BraceWrapping:
- AfterCaseLabel: false
- AfterClass: true
- AfterControlStatement: false
- AfterEnum: false
- AfterFunction: true
- AfterNamespace: true
+ AfterCaseLabel: false
+ AfterClass: true
+ AfterControlStatement: Never
+ AfterEnum: false
+ AfterFunction: true
+ AfterNamespace: true
AfterObjCDeclaration: false
- AfterStruct: false
- AfterUnion: false
+ AfterStruct: false
+ AfterUnion: false
AfterExternBlock: false
- BeforeCatch: false
- BeforeElse: false
- IndentBraces: false
+ BeforeCatch: false
+ BeforeElse: false
+ BeforeLambdaBody: false
+ BeforeWhile: false
+ IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakBeforeBinaryOperators: None
+BreakBeforeConceptDeclarations: Always
BreakBeforeBraces: Linux
BreakBeforeInheritanceComma: false
BreakInheritanceList: BeforeColon
@@ -49,17 +76,23 @@ BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: BeforeColon
BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true
-ColumnLimit: 132
-CommentPragmas: '^ IWYU pragma:'
+ColumnLimit: 132
+CommentPragmas: "^ IWYU pragma:"
+QualifierAlignment: Leave
CompactNamespaces: false
-ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 2
ContinuationIndentWidth: 2
Cpp11BracedListStyle: true
DeriveLineEnding: true
DerivePointerAlignment: false
-DisableFormat: false
+DisableFormat: false
+EmptyLineAfterAccessModifier: Never
+EmptyLineBeforeAccessModifier: LogicalBlock
ExperimentalAutoDetectBinPacking: false
+PackConstructorInitializers: NextLine
+BasedOnStyle: ""
+ConstructorInitializerAllOnOneLineOrOnePerLine: false
+AllowAllConstructorInitializersOnNextLine: true
FixNamespaceComments: true
ForEachMacros:
- forv_Vec
@@ -68,72 +101,117 @@ ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
-IncludeBlocks: Preserve
+IfMacros:
+ - KJ_IF_MAYBE
+IncludeBlocks: Preserve
IncludeCategories:
- - Regex: '^"(llvm|llvm-c|clang|clang-c)/'
- Priority: 2
- SortPriority: 0
- - Regex: '^(<|"(gtest|isl|json)/)'
- Priority: 3
- SortPriority: 0
- - Regex: '.*'
- Priority: 1
- SortPriority: 0
-IncludeIsMainRegex: '$'
-IncludeIsMainSourceRegex: ''
+ - Regex: '^"(llvm|llvm-c|clang|clang-c)/'
+ Priority: 2
+ SortPriority: 0
+ CaseSensitive: false
+ - Regex: '^(<|"(gtest|isl|json)/)'
+ Priority: 3
+ SortPriority: 0
+ CaseSensitive: false
+ - Regex: ".*"
+ Priority: 1
+ SortPriority: 0
+ CaseSensitive: false
+IncludeIsMainRegex: "$"
+IncludeIsMainSourceRegex: ""
+IndentAccessModifiers: false
IndentCaseLabels: false
+IndentCaseBlocks: false
IndentGotoLabels: true
IndentPPDirectives: None
-IndentWidth: 2
+IndentExternBlock: AfterExternBlock
+IndentRequiresClause: true
+IndentWidth: 2
IndentWrappedFunctionNames: false
+InsertBraces: false
+InsertTrailingCommas: None
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: false
-MacroBlockBegin: ''
-MacroBlockEnd: ''
+LambdaBodyIndentation: Signature
+MacroBlockBegin: ""
+MacroBlockEnd: ""
MaxEmptyLinesToKeep: 1
NamespaceIndentation: Inner
ObjCBinPackProtocolList: Auto
ObjCBlockIndentWidth: 2
+ObjCBreakBeforeNestedBlockParam: true
ObjCSpaceAfterProperty: true
ObjCSpaceBeforeProtocolList: false
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 30000
PenaltyBreakFirstLessLess: 120
+PenaltyBreakOpenParenthesis: 0
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 200
+PenaltyIndentedWhitespace: 0
PointerAlignment: Right
-ReflowComments: true
-SortIncludes: false
+PPIndentWidth: -1
+ReferenceAlignment: Pointer
+ReflowComments: true
+RemoveBracesLLVM: false
+RequiresClausePosition: OwnLine
+SeparateDefinitionBlocks: Leave
+ShortNamespaceLines: 1
+SortIncludes: Never
+SortJavaStaticImport: Before
SortUsingDeclarations: false
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
+SpaceBeforeCaseColon: false
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
+SpaceBeforeParensOptions:
+ AfterControlStatements: true
+ AfterForeachMacros: true
+ AfterFunctionDefinitionName: false
+ AfterFunctionDeclarationName: false
+ AfterIfMacros: true
+ AfterOverloadedOperator: false
+ AfterRequiresInClause: false
+ AfterRequiresInExpression: false
+ BeforeNonEmptyParentheses: false
+SpaceAroundPointerQualifiers: Default
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyBlock: false
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
-SpacesInAngles: false
+SpacesInAngles: Never
SpacesInConditionalStatement: false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
+SpacesInLineCommentPrefix:
+ Minimum: 1
+ Maximum: -1
SpacesInParentheses: false
SpacesInSquareBrackets: false
SpaceBeforeSquareBrackets: false
-Standard: Latest
+BitFieldColonSpacing: Both
+Standard: Latest
+StatementAttributeLikeMacros:
+ - Q_EMIT
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION
-TabWidth: 8
-UseCRLF: false
-UseTab: Never
-...
-
+TabWidth: 8
+UseCRLF: false
+UseTab: Never
+WhitespaceSensitiveMacros:
+ - STRINGIZE
+ - PP_STRINGIZE
+ - BOOST_PP_STRINGIZE
+ - NS_SWIFT_NAME
+ - CF_SWIFT_NAME
+---
diff --git a/doc/admin-guide/files/records.config.en.rst b/doc/admin-guide/files/records.config.en.rst
index 5f4080f75f8..52b9bec04ad 100644
--- a/doc/admin-guide/files/records.config.en.rst
+++ b/doc/admin-guide/files/records.config.en.rst
@@ -3984,10 +3984,14 @@ Client-Related Configuration
Sets the ALPN string that |TS| will send to the origin in the ClientHello of TLS handshakes.
Configuring this to an empty string (the default configuration) means that the ALPN extension
- will not be sent as a part of the TLS ClientHello.
+ will not be sent as a part of the TLS ClientHello, resulting in HTTP/1.x being negotiated for all
+ origin-side connections.
Configuring the ALPN string provides a mechanism to control origin-side HTTP protocol
- negotiation. Configuring this requires an understanding of the ALPN TLS protocol extension. See
+ negotiation. Including ``h2`` in the ALPN list is required for negotiatnge origin-side HTTP/2
+ connections.
+
+ Configuring this requires an understanding of the ALPN TLS protocol extension. See
`RFC 7301 `_ for details about the ALPN protocol.
See the official `IANA ALPN protocol registration
`_
@@ -4002,27 +4006,27 @@ Client-Related Configuration
- ``http/1.0``
- ``http/1.1``
+ - ``h2``
Here are some example configurations and the consequences of each:
- ================================ ======================================================================
- Value Description
- ================================ ======================================================================
- ``""`` No ALPN extension is sent by |TS| in origin-side TLS handshakes.
- |TS| will assume an HTTP/1.1 connection in this case.
- ``"http/1.1"`` Only HTTP/1.1 is advertized by |TS|. Thus, the origin will
- either negotiate HTTP/1.1, or it will fail the handshake if that
- is not supported by the origin.
- ``"http/1.1,http/1.0"`` Both HTTP/1.1 and HTTP/1.0 are supported by |TS|, but HTTP/1.1
- is preferred.
- ``"h2,http/1.1,http/1.0"`` HTTP/2 is preferred by |TS| over HTTP/1.1 and HTTP/1.0. Thus, if the
- origin supports HTTP/2, it will be used for the connection. If
- not, it will fall back to HTTP/1.1 or, if that is not supported,
- HTTP/1.0. (HTTP/2 to origin is currently not supported by |TS|.)
- ``"h2"`` |TS| only advertizes HTTP/2 support. Thus, the origin will
- either negotiate HTTP/2 or fail the handshake. (HTTP/2 to origin
- is currently not supported by |TS|.)
- ================================ ======================================================================
+ ==================== ======================================================================
+ Value Description
+ ==================== ======================================================================
+ ``""`` No ALPN extension is sent by |TS| in origin-side TLS handshakes. |TS| will
+ assume an HTTP/1.1 connection in this case.
+ ``"http/1.1"`` Only HTTP/1.1 is advertized by |TS|. Thus, the origin will either negotiate
+ HTTP/1.1, or it will fail the handshake if that is not supported by the
+ origin.
+ ``"h2,http/1.1"`` HTTP/2 is preferred by |TS| over HTTP/1.1. Thus, if the origin supports
+ HTTP/2, it will be used for the connection. If not, it will fall back to
+ HTTP/1.1.
+ ``"h2"`` |TS| only advertizes HTTP/2 support. Thus, the origin will
+ either negotiate HTTP/2 or fail the TLS handshake.
+ ==================== ======================================================================
+
+ Note that this is an overridable configuration, so the ALPN can be configured on a per-origin
+ basis via the :ref:`admin-plugins-conf-remap` plugin.
.. ts:cv:: CONFIG proxy.config.ssl.async.handshake.enabled INT 0
@@ -4144,6 +4148,16 @@ HTTP/2 Configuration
Reloading this value affects only new HTTP/2 connections, not the
ones already established.
+.. ts:cv:: CONFIG proxy.config.http2.max_concurrent_streams_out INT 100
+ :reloadable:
+
+ The maximum number of concurrent streams per outbound connection.
+
+.. note::
+
+ Reloading this value affects only new HTTP/2 connections, not the
+ ones already established.
+
.. ts:cv:: CONFIG proxy.config.http2.min_concurrent_streams_in INT 10
:reloadable:
@@ -4151,6 +4165,13 @@ HTTP/2 Configuration
This is used when :ts:cv:`proxy.config.http2.max_active_streams_in` is set
larger than ``0``.
+.. ts:cv:: CONFIG proxy.config.http2.min_concurrent_streams_out INT 10
+ :reloadable:
+
+ The minimum number of concurrent streams per outbound connection.
+ This is used when :ts:cv:`proxy.config.http2.max_active_streams_out` is set
+ larger than ``0``.
+
.. ts:cv:: CONFIG proxy.config.http2.max_active_streams_in INT 0
:reloadable:
@@ -4160,6 +4181,15 @@ HTTP/2 Configuration
:ts:cv:`proxy.config.http2.min_concurrent_streams_in`.
To disable, set to zero (``0``).
+.. ts:cv:: CONFIG proxy.config.http2.max_active_streams_out INT 0
+ :reloadable:
+
+ Limits the maximum number of connection wide active streams.
+ When connection wide active streams are larger than this value,
+ SETTINGS_MAX_CONCURRENT_STREAMS will be reduced to
+ :ts:cv:`proxy.config.http2.min_concurrent_streams_out`.
+ To disable, set to zero (``0``).
+
.. ts:cv:: CONFIG proxy.config.http2.initial_window_size_in INT 65535
:reloadable:
:units: bytes
@@ -4170,6 +4200,16 @@ HTTP/2 Configuration
:ts:cv:`proxy.config.http2.flow_control.policy_in` for how HTTP/2 stream and
session windows are maintained over the lifetime of HTTP/2 sessions.
+.. ts:cv:: CONFIG proxy.config.http2.initial_window_size_out INT 65535
+ :reloadable:
+ :units: bytes
+
+ The initial HTTP/2 stream window size for outbound connections that |TS| as a
+ client advertises to the peer. See IETF RFC 9113 section 5.2 for details
+ concerning HTTP/2 flow control. See
+ :ts:cv:`proxy.config.http2.flow_control.policy_out` for how HTTP/2 stream and
+ session windows are maintained over the lifetime of HTTP/2 sessions.
+
.. ts:cv:: CONFIG proxy.config.http2.flow_control.policy_in INT 0
:reloadable:
@@ -4199,6 +4239,13 @@ HTTP/2 Configuration
a way that shares the window equally among all concurrent streams.
===== ===========================================================================================
+.. ts:cv:: CONFIG proxy.config.http2.flow_control.policy_out INT 0
+ :reloadable:
+
+ Specifies the mechanism |TS| uses to maintian flow control via the HTTP/2
+ stream and session windows for outbound connections. See the corresponding :ts:cv:`proxy.config.http2.flow_control.policy_in`
+ configuration for details concerning how this configuration variable is used.
+
.. ts:cv:: CONFIG proxy.config.http2.max_frame_size INT 16384
:reloadable:
:units: bytes
@@ -4259,6 +4306,13 @@ HTTP/2 Configuration
misconfigured or misbehaving clients are opening a large number of
connections without submitting requests.
+.. ts:cv:: CONFIG proxy.config.http2.no_activity_timeout_out INT 120
+ :reloadable:
+ :units: seconds
+
+ Specifies how long |TS| keeps connections to origins open if a
+ transaction stalls.
+
.. ts:cv:: CONFIG proxy.config.http2.zombie_debug_timeout_in INT 0
:reloadable:
diff --git a/doc/admin-guide/monitoring/statistics/core/http-connection.en.rst b/doc/admin-guide/monitoring/statistics/core/http-connection.en.rst
index a2d95c4e089..667dcf9de15 100644
--- a/doc/admin-guide/monitoring/statistics/core/http-connection.en.rst
+++ b/doc/admin-guide/monitoring/statistics/core/http-connection.en.rst
@@ -183,6 +183,21 @@ HTTP/2
Represents the current number of HTTP/2 active connections from client to the |TS|.
+.. ts:stat:: global proxy.process.http2.total_server_connections integer
+ :type: counter
+
+ Represents the total number of HTTP/2 connections from |TS| to the origin.
+
+.. ts:stat:: global proxy.process.http2.current_server_connections integer
+ :type: gauge
+
+ Represents the current number of HTTP/2 connections from |TS| to the origin.
+
+.. ts:stat:: global proxy.process.http2.current_active_server_connections integer
+ :type: gauge
+
+ Represents the current number of HTTP/2 active connections from |TS| to the origin.
+
.. ts:stat:: global proxy.process.http2.connection_errors integer
:type: counter
diff --git a/doc/admin-guide/monitoring/statistics/core/http-transaction.en.rst b/doc/admin-guide/monitoring/statistics/core/http-transaction.en.rst
index 07a6e60a0d8..9dd730c2be4 100644
--- a/doc/admin-guide/monitoring/statistics/core/http-transaction.en.rst
+++ b/doc/admin-guide/monitoring/statistics/core/http-transaction.en.rst
@@ -165,6 +165,16 @@ HTTP/2
Represents the current number of HTTP/2 streams from client to the |TS|.
+.. ts:stat:: global proxy.process.http2.total_server_streams integer
+ :type: counter
+
+ Represents the total number of HTTP/2 streams from |TS| to the origin.
+
+.. ts:stat:: global proxy.process.http2.current_server_streams integer
+ :type: gauge
+
+ Represents the current number of HTTP/2 streams from |TS| to the origin.
+
.. ts:stat:: global proxy.process.http2.total_transactions_time integer
:type: counter
:units: seconds
diff --git a/doc/developer-guide/api/functions/TSSslSecret.en.rst b/doc/developer-guide/api/functions/TSSslSecret.en.rst
index 87478e22542..9f81d4f5665 100644
--- a/doc/developer-guide/api/functions/TSSslSecret.en.rst
+++ b/doc/developer-guide/api/functions/TSSslSecret.en.rst
@@ -11,6 +11,7 @@
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. See the License for the specific language governing
permissions and limitations under the License.
+
.. include:: /common.defs
.. default-domain:: c
@@ -27,7 +28,7 @@ Synopsis
#include
-.. function:: TSReturnCode TSSslSecretSet(const char * secret_name, int secret_name_length, const char * secret_data, int secret_data_len)
+.. function:: TSReturnCode TSSslSecretSet(const char * secret_name, int secret_name_length, const char * secret_data, int secret_data_length)
Description
===========
@@ -48,12 +49,16 @@ Synopsis
#include
-.. function:: TSReturnCode TSSslSecretGet(const char * secret_name, int secret_name_length, const char ** secret_data_return, int * secret_data_len)
+.. function:: char * TSSslSecretGet(const char * secret_name, int secret_name_length, int * secret_data_length)
Description
===========
-:func:`TSSslSecretGet` fetches the named secret from the current secret map. TS_ERROR is returned if there is no entry for the secret.
+:func:`TSSslSecretGet` fetches the named secret from the current secret map. If there is no secret with the
+given name, the returned pointer will be null, and the :arg:`secret_data_length` output paramter will be set to zero. If
+the returned pointer is not null, it points to a buffer containing the secret data. The :arg:`secret_data_length` output
+parameter will be set to the length of the secret data. The buffer containing the data must be freed by
+calling :func:`TSfree`.
TSSslSecretUpdate
*****************
diff --git a/doc/release-notes/images/branch_mgmt.png b/doc/release-notes/images/branch_mgmt.png
new file mode 100644
index 00000000000..d24817da7a9
Binary files /dev/null and b/doc/release-notes/images/branch_mgmt.png differ
diff --git a/doc/release-notes/images/roadmap.png b/doc/release-notes/images/roadmap.png
index 656c21ecdf8..4f3c2618a7f 100644
Binary files a/doc/release-notes/images/roadmap.png and b/doc/release-notes/images/roadmap.png differ
diff --git a/doc/release-notes/roadmap.en.rst b/doc/release-notes/roadmap.en.rst
index 7afb416ad1f..4c122686c8f 100644
--- a/doc/release-notes/roadmap.en.rst
+++ b/doc/release-notes/roadmap.en.rst
@@ -31,53 +31,75 @@ our `download page `_ to see the
current supported versions.
-For details on the actual developer release process, See
-
Versions, compatibility and schedules
-------------------------------------
-1. We promise to make 1 major release every two years, but the RM and
+1. We aim to make 1 major release every two years, but the RM and
community can of course make more as necessary.
-2. We only make releases off the LTS branches, which are cut every 2 years
- off the master branch.
-3. Master is always open, for any type of change (including incompatible
- changes). But don't break compatibility just for fun!
+2. We cut LTS major and minor releases striaght off the master branch.
+ We will make release branches in a timely manner before making any
+ release candidates.
+3. Master is always open for compatible changes.
4. Master is always stable, i.e. commits should be properly tested and
reviewed before committed to master.
-5. All releases are stable releases, following strict Semantic Versioning.
-6. Minor and patch releases are made at the discretion of the community and
+5. Incompatible changes must be made on the current ``-dev`` branch.
+6. All releases are stable releases, following strict Semantic Versioning.
+7. Minor and patch releases are made at the discretion of the community and
the RM.
-7. Minor releases can include new (small / safe) features, but must be
+8. Minor releases can include new (small / safe) features, but must be
compatible within the LTS major version.
-8. The LTS cycle, 4 years, does not reset when we make a minor release.
-9. The goal is that within a major LTS version, only one minor version is
- continuously supported. For example, if we have made a v9.1.2, and the
- RM makes a v9.2.0 release, do not expect any more releases of v9.1.x.
- The exception here would be serious issues, or security problems.
+9. The LTS cycle, approximately 4 years, does not reset when we make a minor
+ release.
+10. The goal is that within a major LTS version, only one minor version is
+ continuously supported. For example, if we have made a v9.1.2, and the
+ RM makes a v9.2.0 release, do not expect any more releases of v9.1.x.
+ The exception here would be serious issues, or security problems.
+
+Branch Management
+-----------------
+
+As of `v10.0.0`` and forward, we will cut all major and minor branches off
+the main branch (master). The ``-Dev`` branch will be used for incompatible
+changes, and will be merged into master when the next major release is
+in progress.
+
+.. figure:: images/branch_mgmt.png
+ :align: left
+
+The implication of this new process is that we will no longer cherry pick
+PRs from master to a release branch. Rather, each major and minor release
+is taken whole sale from the master branch. For managing your PRs, this means:
+
+1. You do not need to nominate your PR for a backport to a minor release, unless
+ the release branch has been cut. A goal here is that the release branches
+ are stable in preparation of the minor release, while master is still open.
+2. An exception for this are the older LTS releases and minor critical fixes.
+ For such changes, always nominate your PR for backport to those Projects.
+3. The default ``Milestone`` changes for every major and minor release. For
+ example, if the current LTS release is `10.0.1`, the milestone for all new
+ PRs will be `10.1.0` going forward.
+4. We will create tags on the master branch regularly, for coordinating testing
+ efforts. These are not releases!
+5. We will regularly (weekly) merge master to the current ``-Dev`` branch,
+ to keep them in sync.
+
+It is absolutely critical that everyone sets the ``Milestone`` and ``Project``
+fields appropriate in this process. This is how we will manage the releases!
Current Release Schedule and support
------------------------------------
+Master is currently targeted for our first `v10.0.x` release. When this branch
+is created, the new process kicks in and ``Milestones`` must follow the
+next minor release number (e.g. `10.1.0`).
+
.. figure:: images/roadmap.png
- :align: center
+ :align: left
**Note:** These are examples, only the first minor release number of each
major LTS branch is guaranteed to be made. The dates for point releases
are also for illustration.
-How?
-----
-
-As you can see, we no longer make any sort of development releases. Also,
-there's no longer a backport voting process! The latter means that all
-developers and users must make a higher commitment to reviewing changes as
-they go into master and the incompatible release branch. Other than that,
-it's pretty much business as usual, but easier for everyone involved.
-This git branch diagram shows an example how the git tree will be managed:
-
-.. figure:: images/git-versions.svg
- :align: center
-
Burning release numbers, or how our release process works
---------------------------------------------------------
@@ -109,9 +131,9 @@ Release Managers
======= ======= ========= =========== =========
Version Primary Secondary 1st Release Supported
======= ======= ========= =========== =========
-8.x Evan Leif 8/2018 1/2022
-9.x Leif Bryan 1/2020 1/2024
-10.x TBD TBD 1/2022 1/2026
+8.x Evan Leif 8/2018 3/2023
+9.x Evan Bryan 1/2020 3/2025
+10.x Leif Bryan 3/2023 3/2027
======= ======= ========= =========== =========
diff --git a/example/plugins/c-api/basic_auth/basic_auth.c b/example/plugins/c-api/basic_auth/basic_auth.c
index 95a87edc1a4..d798ee6ab15 100644
--- a/example/plugins/c-api/basic_auth/basic_auth.c
+++ b/example/plugins/c-api/basic_auth/basic_auth.c
@@ -52,8 +52,8 @@ base64_decode(const char *input)
*output++ = decode(0) << 2 | decode(1) >> 4;
*output++ = decode(1) << 4 | decode(2) >> 2;
*output++ = decode(2) << 6 | decode(3);
- len -= 4;
- input += 4;
+ len -= 4;
+ input += 4;
}
/*
@@ -139,7 +139,7 @@ handle_dns(TSHttpTxn txnp, TSCont contp)
goto done;
}
*password = '\0';
- password += 1;
+ password += 1;
if (!authorized(user, password)) {
TSError("[%s] %s:%s not authorized", PLUGIN_NAME, user, password);
diff --git a/example/plugins/c-api/bnull_transform/bnull_transform.c b/example/plugins/c-api/bnull_transform/bnull_transform.c
index 8cb2c44dc1a..db41fdbb93b 100644
--- a/example/plugins/c-api/bnull_transform/bnull_transform.c
+++ b/example/plugins/c-api/bnull_transform/bnull_transform.c
@@ -41,7 +41,7 @@
#define PLUGIN_NAME "bnull_transform"
-#define TS_NULL_MUTEX NULL
+#define TS_NULL_MUTEX NULL
#define STATE_BUFFER_DATA 0
#define STATE_OUTPUT_DATA 1
diff --git a/example/plugins/c-api/cache_scan/cache_scan.cc b/example/plugins/c-api/cache_scan/cache_scan.cc
index 4e0d9a952e3..e0546be0be0 100644
--- a/example/plugins/c-api/cache_scan/cache_scan.cc
+++ b/example/plugins/c-api/cache_scan/cache_scan.cc
@@ -68,10 +68,10 @@ handle_scan(TSCont contp, TSEvent event, void *edata)
cache_scan_state *cstate = static_cast(TSContDataGet(contp));
if (event == TS_EVENT_CACHE_REMOVE) {
- cstate->done = 1;
- const char error[] = "Cache remove operation succeeded";
- cstate->cache_vc = static_cast(edata);
- cstate->write_vio = TSVConnWrite(cstate->net_vc, contp, cstate->resp_reader, INT64_MAX);
+ cstate->done = 1;
+ const char error[] = "Cache remove operation succeeded";
+ cstate->cache_vc = static_cast(edata);
+ cstate->write_vio = TSVConnWrite(cstate->net_vc, contp, cstate->resp_reader, INT64_MAX);
cstate->total_bytes += TSIOBufferWrite(cstate->resp_buffer, error, sizeof(error) - 1);
TSVIONBytesSet(cstate->write_vio, cstate->total_bytes);
TSVIOReenable(cstate->write_vio);
@@ -83,8 +83,8 @@ handle_scan(TSCont contp, TSEvent event, void *edata)
const char error[] = "Cache remove operation failed error=";
char rc[12];
snprintf(rc, 12, "%p", edata);
- cstate->cache_vc = static_cast(edata);
- cstate->write_vio = TSVConnWrite(cstate->net_vc, contp, cstate->resp_reader, INT64_MAX);
+ cstate->cache_vc = static_cast(edata);
+ cstate->write_vio = TSVConnWrite(cstate->net_vc, contp, cstate->resp_reader, INT64_MAX);
cstate->total_bytes += TSIOBufferWrite(cstate->resp_buffer, error, sizeof(error) - 1);
cstate->total_bytes += TSIOBufferWrite(cstate->resp_buffer, rc, strlen(rc));
@@ -104,7 +104,7 @@ handle_scan(TSCont contp, TSEvent event, void *edata)
event == TS_EVENT_CACHE_SCAN_OPERATION_FAILED) {
cstate->done = 1;
if (cstate->resp_buffer) {
- const char error[] = "Cache scan operation blocked or failed";
+ const char error[] = "Cache scan operation blocked or failed";
cstate->total_bytes += TSIOBufferWrite(cstate->resp_buffer, error, sizeof(error) - 1);
}
if (cstate->write_vio) {
@@ -159,12 +159,12 @@ handle_scan(TSCont contp, TSEvent event, void *edata)
if (event == TS_EVENT_CACHE_SCAN_DONE) {
cstate->done = 1;
char s[512];
- int s_len = snprintf(s, sizeof(s),
- "
\n