diff --git a/src/libmongoc/src/mongoc/mongoc-server-monitor.c b/src/libmongoc/src/mongoc/mongoc-server-monitor.c index fb9211e9690..b0925d3d174 100644 --- a/src/libmongoc/src/mongoc/mongoc-server-monitor.c +++ b/src/libmongoc/src/mongoc/mongoc-server-monitor.c @@ -20,6 +20,7 @@ #include "mongoc/mcd-rpc.h" #include "mongoc/mongoc-client-private.h" #include "mongoc/mongoc-error-private.h" +#include "mongoc/mongoc-handshake-private.h" #include "mongoc/mongoc-ssl-private.h" #include "mongoc/mongoc-stream-private.h" #include "mongoc/mongoc-topology-background-monitoring-private.h" @@ -1073,7 +1074,11 @@ _server_monitor_check_server ( GOTO (exit); } - if (!bson_empty (&previous_description->topology_version)) { + if (!bson_empty (&previous_description->topology_version) && + _mongoc_handshake_get ()->env == MONGOC_HANDSHAKE_ENV_NONE) { + // Use stream monitoring if: + // - Server supports stream monitoring (indicated by `topologyVersion`). + // - Application is not in an FaaS environment (e.g. AWS Lambda). awaited = true; _server_monitor_heartbeat_started (server_monitor, awaited); MONITOR_LOG (server_monitor, "awaitable hello"); diff --git a/src/libmongoc/tests/test-mongoc-background-monitoring.c b/src/libmongoc/tests/test-mongoc-background-monitoring.c index 912fc861c53..a69288ca083 100644 --- a/src/libmongoc/tests/test-mongoc-background-monitoring.c +++ b/src/libmongoc/tests/test-mongoc-background-monitoring.c @@ -18,6 +18,7 @@ #include "mongoc/mongoc.h" #include "mongoc/mongoc-client-pool-private.h" #include "mongoc/mongoc-client-private.h" +#include "mongoc/mongoc-handshake-private.h" #include "mongoc/mongoc-server-description-private.h" #include "mongoc/mongoc-topology-background-monitoring-private.h" #include "mongoc/mongoc-topology-description-private.h" @@ -390,6 +391,25 @@ test_connect_succeeds (void) tf_destroy (tf); } +void +test_connect_faas_use_polling (void) +{ + test_fixture_t *tf; + mongoc_handshake_t *md = _mongoc_handshake_get (); + md->env = MONGOC_HANDSHAKE_ENV_AWS; + + /* This mock server will not respond to streaming hello, so OBSERVE_SOON + will timeout if the server monitor doesn't detect ENV_AWS and switch to + polling */ + tf = tf_new (TF_AUTO_RESPOND_POLLING_HELLO); + OBSERVE_SOON (tf, tf->observations->n_heartbeat_succeeded == 2); + OBSERVE_SOON (tf, tf->observations->n_heartbeat_failed == 0); + OBSERVE (tf, !tf->observations->awaited); + + tf_destroy (tf); + md->env = MONGOC_HANDSHAKE_ENV_NONE; +} + void test_connect_hangup (void) { @@ -1134,6 +1154,10 @@ test_monitoring_install (TestSuite *suite) /* Tests for initial connection. */ TestSuite_AddMockServerTest ( suite, "/server_monitor_thread/connect/succeeds", test_connect_succeeds); + TestSuite_AddMockServerTest ( + suite, + "/server_monitor_thread/connect/faas_use_polling", + test_connect_faas_use_polling); TestSuite_AddMockServerTest ( suite, "/server_monitor_thread/connect/hangup", test_connect_hangup); TestSuite_AddMockServerTest (