refactor: RPC: pass named argument value as string_view #26612

pull stickies-v wants to merge 3 commits into bitcoin:master from stickies-v:rpc-convert-string-view changing 4 files +31 −19
  1. stickies-v commented at 6:20 PM on November 30, 2022: contributor

    Inspired by MarcoFalke's comment. Main purpose of this PR is to minimize copying (potentially large) RPC named arguments when calling .substr() by using std::string_view instead of std::string. Furthermore, cleans up the code by removing unnecessary complexity in ParseNonRFCJSONValue() (done first to avoid refactoring required to concatenate string and string_view), updates some naming and adds a few test cases. Should not introduce any behaviour change.

    Questions

    • ~Was there actually any merit to ParseNonRFCJSONValue() surrounding the value with brackets and then parsing it as an array? I don't see it, and the new approach doesn't fail any tests. Still a bit suspicious about it though.~
      • Cleared up by #26506#pullrequestreview-1211984059
      • If there are no objections to 7727603e44f8f674e0fc8389e78047e2b56e6052, I think we should follow up with a PR to rename ParseNonRFCJSONValue() to a local Parse() helper function (that throws if invalid), remove it from client.h and merge the test coverage we currently have on ParseNonRFCJSONValue() with the coverage we have on UniValue::read().
  2. DrahtBot commented at 6:20 PM on November 30, 2022: contributor

    <!--e57a25ab6845829454e8d69fc972939a-->

    The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.

    <!--021abf342d371248e50ceaed478a90ca-->

    Reviews

    See the guideline for information on the review process.

    Type Reviewers
    ACK ryanofsky, MarcoFalke
    Approach ACK pablomartin4btc

    If your review is incorrectly listed, please react with 👎 to this comment and the bot will ignore it on the next update.

    <!--174a7506f384e20aa4161008e828411d-->

    Conflicts

    No conflicts as of last run.

  3. DrahtBot added the label Needs rebase on Dec 13, 2022
  4. in src/rpc/client.cpp:233 in d53953f990 outdated
     227 | @@ -225,11 +228,14 @@ class CRPCConvertTable
     228 |  public:
     229 |      CRPCConvertTable();
     230 |  
     231 | -    bool convert(const std::string& method, int idx) {
     232 | -        return (members.count(std::make_pair(method, idx)) > 0);
     233 | +    /* Return value as UniValue, and first parse it if it is a non-string parameter */
     234 | +    UniValue ParseIfNonString(std::string_view value, const std::string& method, int idx) {
     235 | +        return (members.count(std::make_pair(method, idx))) > 0 ? ParseNonRFCJSONValue(value) : value;
    


    maflcko commented at 12:22 PM on January 18, 2023:
            return (members.count({method, idx})) > 0 ? ParseNonRFCJSONValue(value) : value;
    

    nit

  5. test: add cases to JSON parsing 1d02e59901
  6. refactor: reduce unnecessary complexity in ParseNonRFCJSONValue
    Since https://github.com/jgarzik/univalue/pull/31, UniValue::read() can now
    parse raw literals directly, so there is no more need to wrap them into an
    array first.
    7727603e44
  7. refactor: use string_view for RPC named argument values
    Minimize copying RPC named argument values when calling .substr() by
    using std::string_view instead of std::string.
    545ff924ab
  8. stickies-v force-pushed on Jan 18, 2023
  9. stickies-v renamed this:
    [WIP] refactor: RPC: pass named argument as string_view
    refactor: RPC: pass named argument value as string_view
    on Jan 18, 2023
  10. stickies-v marked this as ready for review on Jan 18, 2023
  11. stickies-v commented at 5:18 PM on January 18, 2023: contributor

    Rebased now that #26506 is merged, ready for review!

    Also added to PR description:

    If there are no objections to https://github.com/bitcoin/bitcoin/commit/7727603e44f8f674e0fc8389e78047e2b56e6052, I think we should follow up with a PR to rename ParseNonRFCJSONValue() to a local Parse() function, remove it from client.h and merge the test coverage we currently have on ParseNonRFCJSONValue() with the coverage we have on UniValue::read().

  12. DrahtBot removed the label Needs rebase on Jan 18, 2023
  13. DrahtBot added the label Refactoring on Jan 18, 2023
  14. ryanofsky approved
  15. ryanofsky commented at 6:55 PM on March 2, 2023: contributor

    Code review ACK 545ff924ab6303ffabd91fdfc4f0a4962daf133c

    I think the followup ideas in the PR description sound very good too

  16. pablomartin4btc commented at 7:03 PM on March 2, 2023: member

    Approach ACK.

    I've investigated why (if?) we would need to declare const std::string_view. I see that while std::string_view is already read-only by design, declaring it as const can provide additional benefits in terms of communication, const correctness, and optimization but if we expect large values as @MarcoFalke mentioned on his comment perhaps we need to consider it. This is a very interesting article on reasons to pass std::string_view by value, there are links to godbolt snippets where it compares machine code differences on using one or the other approach.

    Is there any benchmark that you think I could run in order to get some stats in terms of gains in performance improvement?

  17. maflcko approved
  18. maflcko commented at 10:36 AM on March 3, 2023: member

    nice

    review ACK 545ff924ab6303ffabd91fdfc4f0a4962daf133c 📻

    <details><summary>Show signature</summary>

    Signature:

    -----BEGIN PGP SIGNED MESSAGE-----
    Hash: SHA512
    
    review ACK 545ff924ab6303ffabd91fdfc4f0a4962daf133c 📻
    -----BEGIN PGP SIGNATURE-----
    
    iQGzBAEBCgAdFiEE+rVPoUahrI9sLGYTzit1aX5ppUgFAlwqrYAACgkQzit1aX5p
    pUhxDQwAnkUGV9vWw6I02mle/ZFfeIWLL4UhIJjNmcc0UH+0DwtK7IM9V74ST0QZ
    8iv5AOTv43xJ9Ltye54nIbJnjIhW1WmZ/nhwTHDqJtQHP2GqF4ao2uQo2nGMEt/G
    O3BixrcDyYHQDOR92bou9pzc7BOJpQ3Imhbq12FmQrVFSDsREF9wyMU0sPm7OypZ
    ZIBSZc8/7n3KzGFd4qwBwQHKP0Do4vngE/PnuW+OF5u8k8+xe1kny4KBSadccpNl
    eeO/VTeH2hip8pgBweKG7iuWRvHNtsEnrRdHIKLpTQh13l1L4VaRiz/GzkeGDEGf
    YdRDOI9f5CT3slSC93hEKODOakmWVxQ/7dvprogcefNpZSq1jYIrK1uK/z1ZSJ1u
    FuvPBv6WZ4AhJkdFA9jzLKEZ/Fr6Bur0qeXJNQdoa7CpHK3tsEJ5KqhhFbjhrxlF
    vDlABZ6iVD2S4hKF7keu7et+cxMSxsB6VvTd/3tI46TxZqGlyv7bE2VuPBGyiNst
    pioPNtzT
    =pTHK
    -----END PGP SIGNATURE-----
    

    </details>

  19. fanquake merged this on Mar 3, 2023
  20. fanquake closed this on Mar 3, 2023

  21. fanquake commented at 2:35 PM on March 3, 2023: member

    I think the followup ideas in the PR description sound very good too @stickies-v will you follow up here?

  22. stickies-v deleted the branch on Mar 3, 2023
  23. sidhujag referenced this in commit 04dac02b35 on Mar 3, 2023
  24. stickies-v commented at 3:00 PM on March 14, 2023: contributor

    @stickies-v will you follow up here?

    Done in #27256 (cc @ryanofsky)

  25. fanquake referenced this in commit 436c185b05 on Jun 2, 2023
  26. bitcoin locked this on Mar 13, 2024

github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin/bitcoin. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2026-04-19 03:13 UTC

This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me