|
21 | 21 | #include "mongoc-trace-private.h"
|
22 | 22 | #include "mongoc-util-private.h"
|
23 | 23 | #include "mongoc-read-prefs-private.h"
|
| 24 | +#include "mongoc-set-private.h" |
24 | 25 |
|
25 | 26 |
|
26 | 27 | static void
|
@@ -487,21 +488,113 @@ mongoc_topology_description_all_sds_have_write_date (const mongoc_topology_descr
|
487 | 488 | return true;
|
488 | 489 | }
|
489 | 490 |
|
| 491 | +/* |
| 492 | + *------------------------------------------------------------------------- |
| 493 | + * |
| 494 | + * _mongoc_topology_description_validate_max_staleness -- |
| 495 | + * |
| 496 | + * If the provided "maxStalenessSeconds" component of the read |
| 497 | + * preference is not valid for this topology, fill out @error and |
| 498 | + * return false. |
| 499 | + * |
| 500 | + * Side effects: |
| 501 | + * None. |
| 502 | + * |
| 503 | + *------------------------------------------------------------------------- |
| 504 | + */ |
| 505 | +bool |
| 506 | +_mongoc_topology_description_validate_max_staleness ( |
| 507 | + const mongoc_topology_description_t *td, |
| 508 | + double max_staleness_seconds, |
| 509 | + bson_error_t *error) |
| 510 | +{ |
| 511 | + int i; |
| 512 | + mongoc_server_description_t *sd; |
| 513 | + int64_t idle_write_period_ms = -1; |
| 514 | + |
| 515 | + if (max_staleness_seconds == NO_MAX_STALENESS) { |
| 516 | + return true; |
| 517 | + } |
| 518 | + |
| 519 | + /* The isMaster response of a replica set member running some future |
| 520 | + * MongoDB version may contain idleWritePeriodMillis. Choose the |
| 521 | + * primary's value or else the most recently updated secondary's value, |
| 522 | + * according to the Server Selection Spec. |
| 523 | + */ |
| 524 | + if (td->type == MONGOC_TOPOLOGY_RS_WITH_PRIMARY) { |
| 525 | + mongoc_server_description_t *primary = NULL; |
| 526 | + |
| 527 | + for (i = 0; i < td->servers->items_len; i++) { |
| 528 | + sd = (mongoc_server_description_t *) mongoc_set_get_item ( |
| 529 | + td->servers, i); |
| 530 | + |
| 531 | + if (sd->type == MONGOC_SERVER_RS_PRIMARY) { |
| 532 | + primary = sd; |
| 533 | + break; |
| 534 | + } |
| 535 | + } |
| 536 | + |
| 537 | + BSON_ASSERT (primary); |
| 538 | + |
| 539 | + idle_write_period_ms = primary->idle_write_period_ms; |
| 540 | + } else if (td->type == MONGOC_TOPOLOGY_RS_NO_PRIMARY) { |
| 541 | + mongoc_server_description_t *last_updated = NULL; |
| 542 | + |
| 543 | + for (i = 0; i < td->servers->items_len; i++) { |
| 544 | + sd = (mongoc_server_description_t *) mongoc_set_get_item ( |
| 545 | + td->servers, i); |
| 546 | + |
| 547 | + if (sd->type != MONGOC_SERVER_RS_SECONDARY) { |
| 548 | + continue; |
| 549 | + } |
| 550 | + |
| 551 | + if (!last_updated || |
| 552 | + sd->last_update_time_usec > last_updated->last_update_time_usec) { |
| 553 | + last_updated = sd; |
| 554 | + } |
| 555 | + } |
| 556 | + |
| 557 | + if (!last_updated) { |
| 558 | + /* no secondaries */ |
| 559 | + return true; |
| 560 | + } |
| 561 | + |
| 562 | + idle_write_period_ms = last_updated->idle_write_period_ms; |
| 563 | + } else { |
| 564 | + /* topology is not a replica set */ |
| 565 | + return true; |
| 566 | + } |
| 567 | + |
| 568 | + if (idle_write_period_ms == -1) { |
| 569 | + idle_write_period_ms = MONGOC_DEFAULT_IDLE_WRITE_PERIOD_MS; |
| 570 | + } |
| 571 | + |
| 572 | + if (max_staleness_seconds * 1000 < |
| 573 | + td->heartbeat_msec + idle_write_period_ms) { |
| 574 | + bson_set_error (error, MONGOC_ERROR_COMMAND, |
| 575 | + MONGOC_ERROR_COMMAND_INVALID_ARG, |
| 576 | + "maxStalenessSeconds must be at least" |
| 577 | + " heartbeatFrequencyMS (%" PRId64 ") +" |
| 578 | + " server's idleWritePeriodMillis (%" PRId64 ")", |
| 579 | + td->heartbeat_msec, idle_write_period_ms); |
| 580 | + return false; |
| 581 | + } |
| 582 | + |
| 583 | + return true; |
| 584 | +} |
| 585 | + |
490 | 586 |
|
491 | 587 | /*
|
492 | 588 | *-------------------------------------------------------------------------
|
493 | 589 | *
|
494 | 590 | * mongoc_topology_description_suitable_servers --
|
495 | 591 | *
|
496 |
| - * Return an array of suitable server descriptions for this |
497 |
| - * operation and read preference. |
| 592 | + * Fill out an array of servers matching the read preference and |
| 593 | + * localThresholdMS. |
498 | 594 | *
|
499 | 595 | * NOTE: this method should only be called while holding the mutex on
|
500 | 596 | * the owning topology object.
|
501 | 597 | *
|
502 |
| - * Returns: |
503 |
| - * Array of server descriptions, or NULL upon failure. |
504 |
| - * |
505 | 598 | * Side effects:
|
506 | 599 | * None.
|
507 | 600 | *
|
|
0 commit comments