summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* 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-084-24/+69
|\ \ | | | | | | | | | | | | * 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-074-24/+69
| |\ \ | | | | | | | | | | | | into sverker/maint/ets-no-mbuf-trapping/OTP-15660
| | * | erts: Remove ets traversal yielding if heap fragmentSverker Eriksson2019-03-074-25/+69
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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-077-41/+31
|\ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * 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-067-41/+31
| |\ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * 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-067-40/+30
| | |\ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * 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-067-40/+30
| | | |\ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * 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-067-36/+26
| | | | |\ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * rickard/make-fixes-17/OTP-15657: Remove own configured RM make variable
| | | | | * | | | | | | Remove own configured RM make variableRickard Green2019-03-067-36/+26
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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
| | | | | | | | | | | | |
| * | | | | | | | | | | | [logger] Add benchmark of events per millisecond for handlersSiri Hansen2019-03-071-0/+61
| | | | | | | | | | | | |
* | | | | | | | | | | | | Merge branch 'ingela/ftp/chunk-timing/ERIERL-316/OTP-15659' into maintIngela Anderton Andin2019-03-072-175/+179
|\ \ \ \ \ \ \ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * ingela/ftp/chunk-timing/ERIERL-316/OTP-15659: ftp: Correct test case ftp: Fix timing bug
| * | | | | | | | | | | | | ftp: Correct test caseIngela Anderton Andin2019-03-071-32/+35
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Test case can not make assumptions on how many chunks will delivered from the underlaying TCP stream. Some code commented out that should be used in some form to create a new test case. There might be other issues than the one fixed in the previous commit.
| * | | | | | | | | | | | | ftp: Fix timing bugIngela Anderton Andin2019-03-051-143/+144
| | |/ / / / / / / / / / / | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Change code to not send a message to itself as this allows other messages to come in between. A change in TLS code made this scenario more likely to happen, and the symptom is that the ftp:chunk_recv/1 function hangs.
* | | | | | | | | | | | | Merge branch 'maint-21' into maintRickard Green2019-03-069-8/+73
|\ \ \ \ \ \ \ \ \ \ \ \ \ | | |_|_|_|_|_|_|_|_|_|_|/ | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * maint-21: Updated OTP version Prepare release
| * | | | | | | | | | | | Updated OTP versionOTP-21.2.7Erlang/OTP2019-03-052-1/+2
| | | | | | | | | | | | |
| * | | | | | | | | | | | Prepare releaseErlang/OTP2019-03-057-7/+71
| | | | | | | | | | | | |
| * | | | | | | | | | | | Merge branch 'lukas/erts/fix_inet_buffer_auto_adjust/OTP-15651/OTP-15652' ↵Erlang/OTP2019-03-052-46/+69
| |\ \ \ \ \ \ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | into maint-21 * lukas/erts/fix_inet_buffer_auto_adjust/OTP-15651/OTP-15652: kernel runtime dependency to erts erts: Add yield via timeout to inet read_packet erts: Don't increase buffer when sctp sndbuf is set erts: Only change inet buffer if not set
| * \ \ \ \ \ \ \ \ \ \ \ \ Merge branch 'rickard/make-fixes-21/OTP-15551' into maint-21Erlang/OTP2019-03-0546-137/+215
| |\ \ \ \ \ \ \ \ \ \ \ \ \ | | | |_|_|/ / / / / / / / / | | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * rickard/make-fixes-21/OTP-15551: Fix install phase in build system
* | | | | | | | | | | | | | Merge branch 'lukas/erts/fix_inet_buffer_auto_adjust/OTP-15651/OTP-15652' ↵Rickard Green2019-03-062-46/+69
|\ \ \ \ \ \ \ \ \ \ \ \ \ \ | | |_|/ / / / / / / / / / / | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | into maint * lukas/erts/fix_inet_buffer_auto_adjust/OTP-15651/OTP-15652: kernel runtime dependency to erts erts: Add yield via timeout to inet read_packet erts: Don't increase buffer when sctp sndbuf is set erts: Only change inet buffer if not set
| * | | | | | | | | | | | | kernel runtime dependency to ertsRickard Green2019-03-051-1/+1
| | | | | | | | | | | | | |
| * | | | | | | | | | | | | erts: Add yield via timeout to inet read_packetLukas Larsson2019-02-181-3/+19
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The idea here is that the timeout of 0 will work like a yield so that that we don't starve other ports/processes, but it is faster than the select trigger. We don't deselect on the socket because it does not matter if it is triggered laster or not as we'll just get an EAGAIN. Doing this also circumvents the fact that no select is done on active true style sockets until all I/O has been handled. So in a system with a lot of active true style I/O this will could be very benificial.
| * | | | | | | | | | | | | erts: Don't increase buffer when sctp sndbuf is setLukas Larsson2019-02-181-4/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is most likely a copy-paste bug that has lived in the code unnoticed for 5+ years...
| * | | | | | | | | | | | | erts: Only change inet buffer if not setLukas Larsson2019-02-181-38/+49
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We only want to autoupdate update the buffer if recbuf is set if the buffer has not been set before.