Uploaded image for project: 'C Driver'
  1. C Driver
  2. CDRIVER-4781

Using socketTimeoutMS=-1 results in an error

    • Type: Icon: Bug Bug
    • Resolution: Fixed
    • Priority: Icon: Unknown Unknown
    • 1.26.0, 1.25.2
    • Affects Version/s: 1.24.0, 1.25.0
    • Component/s: None
    • None

      Summary

      Setting the URI option socketTimeoutMS=-1 results in an error in C driver 1.25.1 with the message: "timeout_msec value 4294967295 exceeds supported 32-bit range"

      Here is a test showing the issue:

      // Regression test for CDRIVER-4781.
      static void
      test_timeout_msec_exceeds (void)
      {
         bson_error_t error;
         mongoc_uri_t *uri = test_framework_get_uri ();
         mongoc_uri_set_option_as_int32 (uri, MONGOC_URI_SOCKETTIMEOUTMS, -1);
         mongoc_client_t *client =
            mongoc_client_new_from_uri_with_error (uri, &error);
         ASSERT_OR_PRINT (client, error);
         test_framework_set_ssl_opts (client);
         bson_t *ping = BCON_NEW ("ping", BCON_INT32 (1));
         bool ok =
            mongoc_client_command_simple (client, "db", ping, NULL, NULL, &error);
         // On commit abb0bb7da8230d342dac5061623c1e4936ed46d9, results in error:
         // "timeout_msec value 4294967295 exceeds supported 32-bit range"
         // On prior commit 3e8a24311c21917420fd7fd2b00637deb4b168ce, results in
         // success.
         ASSERT_OR_PRINT (ok, error);
         bson_destroy (ping);
         mongoc_client_destroy (client);
         mongoc_uri_destroy (uri);
      }
      

      In versions <1.24.0, it was not an error. The error check was added in CDRIVER-4599.

      4294967295 is the result of casting -1 as a uint32_t. mongoc_cluster_t::sockettimeoutms is represented as a uint32_t.

      Proposal: support the value -1 (and possibly negative values) for backwards compatibility. Document use of negative values as deprecated.

      Background & Motivation

      This impacted a customer setting connectTimeoutMS to -1. Refer: https://mongodb.slack.com/archives/C0V2T72R2/p1699631179298719

      Open questions

      1. In versions <1.24.0 was -1 interpreted as "no timeout" or "use default timeout"?
      2. Is 0 considered "no timeout" in the C driver? The URI spec specifies:

      non-negative integer; 0 means no timeout

      But the 1.25.1 C driver documentation claims "0" means "apply the default":

      Setting any of the *timeoutMS options above to 0 will be interpreted as “use the default value”.

            Assignee:
            ezra.chung@mongodb.com Ezra Chung
            Reporter:
            kevin.albertson@mongodb.com Kevin Albertson
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: