summaryrefslogtreecommitdiff
path: root/lib
Commit message (Collapse)AuthorAgeFilesLines
* Fix doc attributesAnders Svensson2019-09-121-2/+9
| | | | | | Bungled in commit 56e6e65b, which replaced 15 variants and 6 arities of create_subscription, by 2 arities and an argument map. The old variants are all still exported, just not documented. Add a note to this effect.
* Tweak documentationAnders Svensson2019-09-102-119/+122
| | | | Improve some wording and language, more details, minor fixes.
* Fix handling of non-RPC replyAnders Svensson2019-06-061-1/+1
| | | | | | | | Reception of a reply to a message sent with send/2,3 caused other pending requests to be discarded. Corresponding replies from the server were then discarded and the function calls that sent the requests timed out, which is particularly unfortunate with the default (infinity) timeout.
* Simplify request timersAnders Svensson2019-06-061-47/+40
| | | | | Use erlang:start_timer/3 instead of timer:send_after/2 to remove the need for creating an extra reference to be sent in the timeout message.
* Fix inaccurate commentAnders Svensson2019-06-051-3/+4
|
* Replace create_subscription/1-6 in 15 variantsAnders Svensson2019-06-052-148/+128
| | | | | | | | | | | With create_subscription/2,3 taking a map containing values; arity 2 without a timeout and arity 3 with, for consistency with other functions in the module. The old clauses remain for backwards compatibility (with simplified type specs, good enough to avoid warnings), but are no longer documented. Allow stopTime without startTime to be able to send such an invalid message (according to RFC 5277) to a server.
* Fix documentation/spec of ssh-related optionsAnders Svensson2019-06-052-9/+14
| | | | | | | Only user/password/user_dir were included in the type spec, and SshConnectOption didn't refer to anything. Add host as a more sane synonym for the existing ssh option.
* Be flexible with capabilities specificationAnders Svensson2019-06-032-7/+27
| | | | | | | | | | | Don't require that the user wrap a capability string in a list, and accept the RFC 4721/6241 shorthand for NETCONF capabilities, a capability starting with a colon being appropriately prefixed. Any deep character list will do, but only document string() | [string()] for lack of a builtin deep character list type. For example, allow {capability, ":base:1.1"} instead of requiring {capability, ["urn:ietf:params:netconf:base:1.1"]}.
* Document connect/hello timeout in one placeAnders Svensson2019-06-031-18/+8
| | | | | With the type, not separately for each function in which it's referenced.
* Let capabilities be set for all session establishmentAnders Svensson2019-06-032-155/+224
| | | | | | | | | | | | | | | | | | | | | | | | | | | Commit e69da353 added the possibility of passing capabilities to hello/3, but didn't allow them to be passed into open/2. Not strictly necessary, but simpler than having to call only_open/2 followed by hello/3 if all that's wanted is to add capabilties to the hello message. Commit 63d63920 then added session/3 for multiple channels per connection, but no way of passing capabilities or omitting hello, the former now being a problem if the user wants to send the NETCONF 1.1 base capability. Give the user control over capabilities by allowing them to be passed to session/3, and to open/2 for consistency, but don't do anything about avoiding hello in session/3. That capabilities have to be specified as a list of strings makes little sense for the user, but is because commit e69da353 passed what xmerl:export_simple/3 wanted. Also leave this as is for now. Don't document server capabilities since these depend on the NETCONF version. The history isn't clear, but an option to delay hello by some specified amount of time (or indefinitely) may have been a simpler alternative to what only_open/hello are meant to achieve.
* Handle reception of invalid session-idAnders Svensson2019-06-031-16/+22
| | | | | | | | | | | | | | | | | | | RFC 6241 says the following in 8.1 Capabilities Exchange. A server sending the <hello> element MUST include a <session-id> element containing the session ID for this NETCONF session. A client sending the <hello> element MUST NOT include a <session-id> element. A server receiving a <hello> message with a <session-id> element MUST terminate the NETCONF session. Similarly, a client that does not receive a <session-id> element in the server's <hello> message MUST terminate the NETCONF session (without first sending a <close-session>). This doesn't say anything about the type of session-id, but the XML schema in Appendix B defines it as a positive integer, and receiving an invalid value is reasonably equivalent to not receiving the element at all.
* Add ct_netconfc support for NETCONF 1.1Anders Svensson2019-05-292-285/+625
| | | | | | | | | | | | | | | | | | | | | | | | | The 1.1 base capability can now be passed to hello/3, and the version selected for the session is as required by RFC 6241, 8.1 Capabilities Exchange: Both NETCONF peers MUST verify that the other peer has advertised a common protocol version. When comparing protocol version capability URIs, only the base part is used, in the event any parameters are encoded at the end of the URI string. If no protocol version capability in common is found, the NETCONF peer MUST NOT continue the session. If more than one protocol version URI in common is present, then the highest numbered (most recent) protocol version MUST be used by both peers. Negotiation of 1.1 (or any version greater than 1.0) results in message being chunked as required by RFC 6242, instead of the 1.0 framing (]]>]]>) specified by RFC 4742. For backwards compatibility, the 1.0 base capability is added to any capabilities specified by the user only if no base capability is specified. That is, no user-specified base capability results in 1.0 being added, otherwise it's up to the user to specify all base capabilities.
* Don't treat reception of NETCONF > 1.0 hello as errorAnders Svensson2019-05-161-4/+4
| | | | | | | | | | | | Module ct_netconfc appears to have followed the introduction of NETCONF 1.1 in RFC 6241, but assumes NETCONF 1.0 (RFC 4741). A server supporting the 1.1 can send the corresponding base capability in hello, which caused ct_netconfc to close the connection. Now simply ignore any version but 1.0, and fail only if the server doesn't advertise 1.0. Actual support for 1.1 is still missing: being able to agree on this version with the peer and receive messages that are chunked as specified in RFC 6242.
* Prepare releaseErlang/OTP2019-03-1152-41/+863
|
* Merge branch 'peterdmv/inets/httpd_erl_script_timeout/ERIERL-321/OTP-15669' ↵Péter Dimitrov2019-03-082-4/+17
|\ | | | | | | | | | | | | | | | | into maint * peterdmv/inets/httpd_erl_script_timeout/ERIERL-321/OTP-15669: inets: Fix handling of erl_script_timeout Change-Id: I6a90408de48df6b8b01f44e0b273507bcec27b13
| * inets: Fix handling of erl_script_timeoutPéter Dimitrov2019-03-082-4/+17
| | | | | | | | | | | | | | | | | | | | | | When httpd was started with 'erl_script_timeout', the value of the option was converted to milliseconds before storage. Subsequent calls to httpd:info/1 returned the input value multiplied by 1000. This change fixes the handing of erl_script_timeout by storing the timeout in seconds and converting it to milliseconds before usage. Change-Id: Ic308d83b59ad0884e053f096f995754c89adcbf4
* | Merge branch 'sverker/maint/ets-no-mbuf-trapping/OTP-15660' into maintSverker Eriksson2019-03-081-0/+57
|\ \ | | | | | | | | | | | | * sverker/maint/ets-no-mbuf-trapping/OTP-15660: erts: Remove ets traversal yielding if heap fragment
| * \ Merge branch 'sverker/ets-no-mbuf-trapping/OTP-15660'Sverker Eriksson2019-03-071-0/+57
| |\ \ | | | | | | | | | | | | into sverker/maint/ets-no-mbuf-trapping/OTP-15660
| | * | erts: Remove ets traversal yielding if heap fragmentSverker Eriksson2019-03-071-0/+57
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Many heap fragments do no longer make the GC slow. Even worse, we are not guaranteed that a yield will provoke a GC removing the fragments, which might lead to a one-yield-per-bucket scenario if the heap fragment(s) still remains after each yield.
* | | | Merge branch 'anders/diameter/21.3/OTP-15654' into maintAnders Svensson2019-03-081-2/+4
|\ \ \ \ | | | | | | | | | | | | | | | | | | | | * anders/diameter/21.3/OTP-15654: Update appup for diameter 2.2 in OTP 21.3
| * | | | Update appup for diameter 2.2 in OTP 21.3Anders Svensson2019-03-061-2/+4
| | | | |
* | | | | Merge branch 'anders/diameter/distribution/OTP-15398' into maintAnders Svensson2019-03-0813-56/+985
|\ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * anders/diameter/distribution/OTP-15398: Add diameter_dist_SUITE to exercise diameter_dist:route_session/2 Add consistent hashing to diameter_dist:route_session/2 Add options to diameter_dist:route_session/2 node selection Add diameter_dist for ready spawn_opt callbacks Tweak/document request handler callback Document acknowledgements in transport interface Fix comment typo
| * | | | | Add diameter_dist_SUITE to exercise diameter_dist:route_session/2Anders Svensson2019-03-063-2/+337
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Spread a server over three nodes, one of which terminates a peer connection, the other two to handle requests. Terminate transport on one of the server nodes and ensure that answers come only from the other two.
| * | | | | Add consistent hashing to diameter_dist:route_session/2Anders Svensson2019-03-062-42/+264
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If the Session-Id optional value to node() mapping fails then hash Session-Id to a node by default, instead of selecting the local node as in the parent commit. The previous behaviour is configurable by setting default = local in an options map. Nodes make themselves part of the pool from which nodes are selected by calling diameter_dist:attach/1 with the list of service names they are willing to handle requests for, the local node being selected in the absence of any attached nodes. The original idea was to base the node pool on share_peers and/or use_shared_peers configuration, but that configuration determines where outgoing requests can be sent, while route_session/2 deals with incoming requests, so it's not obvious that conflating the two is a good thing. (Also because share_peers/use_shared_peers can be used in different ways; the former could have been skipped entirely.) The hashing effectively places nodes on a circle, a hashed Session-Id being mapped to the nearest predecessor node (clockwise). Nodes are rehashed with each Session-Id (with the id as salt) for a more even distribution, at the cost of performance, although how high the cost or how even the distribution has yet to be tested. Obviously, the larger the number of attached nodes, the higher the cost. Adding/removing an attached node only affects session ids that hash in the interval between the added/removed node and its successor (hence consistent hashing). Options are tweaked slightly compared to the parent commit, and it is now possible to restrict the optional value mapping to specific Diameter identities, to avoid mapping an id that was generated at the peer when the peer is also implemented with the diameter application. Note that diameter_dist is not yet an officially documented interface, so could change. Documentation is in the module itself.
| * | | | | Add options to diameter_dist:route_session/2 node selectionAnders Svensson2019-03-062-41/+136
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | To be able to restrict how many AVPs will be examined (from the front of a message) when looking for Session-Id, and to decide what to do with if the AVP isn't found. Options are specified as a map of the following form. #{search => non_neg_integer(), default => discard | mfa(), dispatch => list() | mfa()} The search member says how many AVPs to examine at most, from the front of the message. If the optional value of a Session-Id is not the name of a connected node then the default member determines what to do with the request, handle it locally (the default), discard it, or invoke an MFA on the Session-Id | false (if none was found) and diameter_packet record to return a node() | false; if the latter then the request is discarded. If a node is identified then the dispatch MFA is invoked on the node and the request MFA (as three arguments), a list Opts being equivalent to the MFA {erlang, spawn_opt, [Opts]}, and the default being the empty list. Integer- or list-valued options are equivalent to the corresponding map with a single value. Limiting the search is to avoid searching messages containing many AVPs for a Session-Id that is known to occur near the header, since section 8.8 of RFC 6733 says this: When present, the Session-Id SHOULD appear immediately following the Diameter header (see Section 3). There's no guarantee, but in practice it may well be known that peers are respecting the RFC, and in that case limiting the search is a defense against searching messages from a malicious peer unnecessarily. The search is unlimited by default. A default is only used when a search fails to locate a Session-Id, and can be to discard the message, or have a node() or false be returned from an MFA applied to the diameter_packet in question. The local node is chosen by default.
| * | | | | Add diameter_dist for ready spawn_opt callbacksAnders Svensson2019-03-065-4/+227
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | That is, of functions that can be configured as spawn_opt MFAs in transport configuration. This commits adds the spawn_local described in the parent commit, and a route_session that assumes that the local node initiates all sessions with Session-Id returned by diameter:session_id/1, and handles incoming requests on the node on which the id in question was returned, diameter:session_id/1 using node() as optional value in the Session-Id format.
| * | | | | Tweak/document request handler callbackAnders Svensson2019-03-064-45/+74
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The possibility of configuring an MFA as spawn_opt was added in commit fd285079, the callback being passed an arity-0 fun to be applied in an appropriate handler process. Replace the fun by a tuple to be passed to diameter_traffic:request/1, to avoid passing funs between nodes when handler processes are remote. A list-valued spawn_opt is now equivalent to the following configured as {spawn_opt, {Mod, spawn_local, [Opts]}}. spawn_local(ReqT, Opts) -> spawn_opt(diameter_traffic, request, [ReqT], Opts). ReqT is passed by diameter and contains information that the callback may want to decide where to handle the request in question (which wasn't accessible with a fun), but this information isn't exposed in a documented way. The intention is instead to add an own callback implementation to make use of the information. Note that application lookup now takes place in the watchdog process in both the list-valued (or no configuration) and mfa-valued cases. Whether this is good, bad, or (probably) inconsequential remains to be seen.
| * | | | | Document acknowledgements in transport interfaceAnders Svensson2019-03-061-3/+28
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is the {diameter, ack} message from a transport process to its parent that requests that every Diameter request passed to the parent be matched by a incoming send message, the atom false replacing a message() in the case that the request is unanswered, allowing the transport to keep track of the number of outstanding requests. These were added in commit ca09cf7b, and are used to implement the message_cb config in diameter_tcp/sctp, documented in commit cefcaa5c. This commit documents the interface, to make it available to other transport implementations.
| * | | | | Fix comment typoAnders Svensson2019-03-061-2/+2
| | | | | |
* | | | | | Merge branch 'ingela/ssl/ftp/continue/chunk-timing/ERIERL-316/OTP-15666' ↵Ingela Anderton Andin2019-03-082-15/+28
|\ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | into maint * ingela/ssl/ftp/continue/chunk-timing/ERIERL-316/OTP-15666: ssl: Correct active once emulation ftp: New test case
| * | | | | | ssl: Correct active once emulationIngela Anderton Andin2019-03-081-0/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: lib/ftp/test/ftp_SUITE.erl
| * | | | | | ftp: New test caseIngela Anderton Andin2019-03-081-15/+23
| | | | | | |
* | | | | | | Merge branch 'siri/logger/file-logging-improvements' into maintSiri Hansen2019-03-088-205/+923
|\ \ \ \ \ \ \ | |_|_|_|/ / / |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * siri/logger/file-logging-improvements: [logger] Add option file_check to logger_std_h [logger] Add log file rotation by options to logger_std_h [logger] Add better control of file modes in logger_std_h [logger] Refactor logger_std_h [logger] Make sure log file is re-opened with configured file options
| * | | | | | [logger] Add option file_check to logger_std_hSiri Hansen2019-03-083-57/+109
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | OTP-15663 This option indicates how often the handler shall check if the log file still exists and if the inode is changed.
| * | | | | | [logger] Add log file rotation by options to logger_std_hSiri Hansen2019-03-088-156/+778
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | OTP-15479 OTP-15662 New configuration map for logger_std_h: #{type => file, file => file:filename(), modes => [file:mode()], max_no_bytes => pos_integer() | infinity, max_no_files => non_neg_integer(), compress_on_rotate => boolean()} For backwards compatibility, the old variant for specifying the file name via the 'type' parameter is still supported, i.e. {file,FileName} and {file,FileName,Modes}, but it is no longer documented. Rotation scheme: The current log file always has the same name, and the archived files get extensions ".0", ".1", ... The newest archive has extension ".0", and the oldest archive has the highest number. If 'compress_on_rotate' is set to true, the archived files are gzipped and get the additional extension ".gz", e.g. error.log.0.gz. Rotation is turned off by setting 'max_no_bytes' to infinity. Setting 'max_no_files' to 0 does not turn off rotation, but only specifies that no archives are to be saved.
| * | | | | | [logger] Add better control of file modes in logger_std_hSiri Hansen2019-03-064-35/+72
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | OTP-15602 It is allowed to set file modes for the handler to use when opening its log file. The given modes were earlier accepted without any checks, which could make the handler behave unexpectedly. This commit makes sure that * if none of write, append or exclusive is given, then append is added * if raw is not given, it is added * if delayed_write or {delayed_write,_,_} is not given, then delayed_write is added
| * | | | | | [logger] Refactor logger_std_hSiri Hansen2019-02-222-56/+53
| | | | | | |
| * | | | | | [logger] Make sure log file is re-opened with configured file optionsSiri Hansen2019-02-211-25/+35
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Earlier, if the log file had to be re-opened, e.g. due to it being renamed or removed, it would always be opened with the default file options, even if other options were set in the configuration. Now, the configured options are used, except that 'append' is always added and 'exclusive' is always removed.
* | | | | | | Merge branch 'rickard/make-fixes-21/OTP-15657' into maintRickard Green2019-03-071-4/+3
|\ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * rickard/make-fixes-21/OTP-15657: Remove own configured RM make variable
| * \ \ \ \ \ \ Merge 'rickard/make-fixes-20/OTP-15657' into 'rickard/make-fixes-21/OTP-15657'Rickard Green2019-03-061-4/+3
| |\ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * rickard/make-fixes-20/OTP-15657: Remove own configured RM make variable
| | * \ \ \ \ \ \ Merge 'rickard/make-fixes-19/OTP-15657' into 'rickard/make-fixes-20/OTP-15657'Rickard Green2019-03-061-4/+3
| | |\ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * rickard/make-fixes-19/OTP-15657: Remove own configured RM make variable
| | | * \ \ \ \ \ \ Merge 'rickard/make-fixes-18/OTP-15657' into 'rickard/make-fixes-19/OTP-15657'Rickard Green2019-03-061-4/+3
| | | |\ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * rickard/make-fixes-18/OTP-15657: Remove own configured RM make variable
| | | | * \ \ \ \ \ \ Merge 'rickard/make-fixes-17/OTP-15657' into 'rickard/make-fixes-18/OTP-15657'Rickard Green2019-03-061-4/+3
| | | | |\ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * rickard/make-fixes-17/OTP-15657: Remove own configured RM make variable
| | | | | * | | | | | | Remove own configured RM make variableRickard Green2019-03-061-4/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Instead rely on gnu make's pre-defined RM variable which should equal 'rm -f'
* | | | | | | | | | | | Merge branch 'siri/logger/optimize-formatter/OTP-15647' into maintSiri Hansen2019-03-071-11/+60
|\ \ \ \ \ \ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * siri/logger/optimize-formatter/OTP-15647: [logger] Improve formatter performance
| * | | | | | | | | | | | [logger] Improve formatter performanceSiri Hansen2019-03-071-11/+60
| | | | | | | | | | | | |
* | | | | | | | | | | | | Merge branch 'siri/logger/bench' into maintSiri Hansen2019-03-074-3/+104
|\ \ \ \ \ \ \ \ \ \ \ \ \ | |_|_|_|_|_|_|_|/ / / / / |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * siri/logger/bench: [logger] Add benchmark of big log events with chars_limit and max_size [logger] Add max memory usage to statistics in logger_olp Skip logger benchmarks in normal kernel test [logger] Add benchmark of events per millisecond for handlers
| * | | | | | | | | | | | [logger] Add benchmark of big log events with chars_limit and max_sizeSiri Hansen2019-03-071-13/+46
| | | | | | | | | | | | |
| * | | | | | | | | | | | [logger] Add max memory usage to statistics in logger_olpSiri Hansen2019-03-072-3/+9
| | | | | | | | | | | | |
| * | | | | | | | | | | | Skip logger benchmarks in normal kernel testSiri Hansen2019-03-071-0/+1
| | | | | | | | | | | | |