// Copyright (C) MongoDB, Inc. 2017-present. // // Licensed under the Apache License, Version 2.0 (the "License"); you may // not use this file except in compliance with the License. You may obtain // a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 package readpref // import "go.mongodb.org/mongo-driver/mongo/readpref" import ( "errors" "time" "go.mongodb.org/mongo-driver/tag" ) var ( errInvalidReadPreference = errors.New("can not specify tags or max staleness on primary") ) var primary = ReadPref{mode: PrimaryMode} // Primary constructs a read preference with a PrimaryMode. func Primary() *ReadPref { return &primary } // PrimaryPreferred constructs a read preference with a PrimaryPreferredMode. func PrimaryPreferred(opts ...Option) *ReadPref { // New only returns an error with a mode of Primary rp, _ := New(PrimaryPreferredMode, opts...) return rp } // SecondaryPreferred constructs a read preference with a SecondaryPreferredMode. func SecondaryPreferred(opts ...Option) *ReadPref { // New only returns an error with a mode of Primary rp, _ := New(SecondaryPreferredMode, opts...) return rp } // Secondary constructs a read preference with a SecondaryMode. func Secondary(opts ...Option) *ReadPref { // New only returns an error with a mode of Primary rp, _ := New(SecondaryMode, opts...) return rp } // Nearest constructs a read preference with a NearestMode. func Nearest(opts ...Option) *ReadPref { // New only returns an error with a mode of Primary rp, _ := New(NearestMode, opts...) return rp } // New creates a new ReadPref. func New(mode Mode, opts ...Option) (*ReadPref, error) { rp := &ReadPref{ mode: mode, } if mode == PrimaryMode && len(opts) != 0 { return nil, errInvalidReadPreference } for _, opt := range opts { err := opt(rp) if err != nil { return nil, err } } return rp, nil } // ReadPref determines which servers are considered suitable for read operations. type ReadPref struct { maxStaleness time.Duration maxStalenessSet bool mode Mode tagSets []tag.Set } // MaxStaleness is the maximum amount of time to allow // a server to be considered eligible for selection. The // second return value indicates if this value has been set. func (r *ReadPref) MaxStaleness() (time.Duration, bool) { return r.maxStaleness, r.maxStalenessSet } // Mode indicates the mode of the read preference. func (r *ReadPref) Mode() Mode { return r.mode } // TagSets are multiple tag sets indicating // which servers should be considered. func (r *ReadPref) TagSets() []tag.Set { return r.tagSets }