From 9fa15a77227fdf72b3c5592f9761b1f7849981dc Mon Sep 17 00:00:00 2001 From: Bailey Pearson Date: Tue, 30 Nov 2021 09:25:27 -0500 Subject: [PATCH 01/11] fix(NODE-3705): propagate hedge settings through ReadPreference.fromOptions --- src/read_preference.ts | 4 ++- test/functional/readpreference.test.js | 44 ++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/read_preference.ts b/src/read_preference.ts index d0ffd6e3c5..c1746c8322 100644 --- a/src/read_preference.ts +++ b/src/read_preference.ts @@ -156,7 +156,9 @@ export class ReadPreference { } if (typeof readPreference === 'string') { - return new ReadPreference(readPreference as ReadPreferenceMode, readPreferenceTags); + return new ReadPreference(readPreference as ReadPreferenceMode, readPreferenceTags, { + hedge: options.hedge + }); } else if (!(readPreference instanceof ReadPreference) && typeof readPreference === 'object') { const mode = readPreference.mode || readPreference.preference; if (mode && typeof mode === 'string') { diff --git a/test/functional/readpreference.test.js b/test/functional/readpreference.test.js index 49f4ccff7d..4334f88bb8 100644 --- a/test/functional/readpreference.test.js +++ b/test/functional/readpreference.test.js @@ -78,6 +78,50 @@ describe('ReadPreference', function () { }); }); + describe('fromOptions factory method', () => { + const { PRIMARY, SECONDARY } = ReadPreference; + const TAGS = [{ loc: 'dc' }]; + + it('should return undefined if no options are passed', () => { + const readPreference = ReadPreference.fromOptions(); + expect(readPreference).to.be.undefined; + }); + + context('readPreference is string', () => { + it('should accept { readPreference }', function () { + const readPreference = ReadPreference.fromOptions({ + readPreference: PRIMARY + }); + expect(readPreference).to.be.an.instanceOf(ReadPreference); + expect(readPreference.mode).to.equal(PRIMARY); + }); + + it('should accept { readPreference, readPreferenceTags }', function () { + const readPreference = ReadPreference.fromOptions({ + readPreference: SECONDARY, + readPreferenceTags: TAGS + }); + expect(readPreference).to.be.an.instanceOf(ReadPreference); + expect(readPreference.mode).to.equal(SECONDARY); + expect(readPreference.tags).to.eql(TAGS); + }); + + it('should accept { readPreference, readPreferenceTags, hedge }', function () { + const readPreference = ReadPreference.fromOptions({ + readPreference: SECONDARY, + readPreferenceTags: TAGS, + hedge: { + enabled: true + } + }); + expect(readPreference).to.be.an.instanceOf(ReadPreference); + expect(readPreference.mode).to.equal(SECONDARY); + expect(readPreference.tags).to.eql(TAGS); + expect(readPreference.hedge).to.eql({ enabled: true }); + }); + }); + }); + it('Should correctly apply collection level read Preference to count', { metadata: { requires: { mongodb: '>=2.6.0', topology: ['single', 'ssl'] } }, From f4b646011edaf2ebaf1cd40f0fdbe13d9ee96243 Mon Sep 17 00:00:00 2001 From: Bailey Pearson Date: Tue, 30 Nov 2021 13:49:24 -0500 Subject: [PATCH 02/11] Move ::constructor tests and new fromOptions tests to unit testing directory --- test/functional/readpreference.test.js | 108 ----------------------- test/unit/read_preference.test.js | 116 +++++++++++++++++++++++++ 2 files changed, 116 insertions(+), 108 deletions(-) create mode 100644 test/unit/read_preference.test.js diff --git a/test/functional/readpreference.test.js b/test/functional/readpreference.test.js index 4334f88bb8..2888e14bf3 100644 --- a/test/functional/readpreference.test.js +++ b/test/functional/readpreference.test.js @@ -14,114 +14,6 @@ describe('ReadPreference', function () { return setupDatabase(this.configuration); }); - describe('::constructor', function () { - const maxStalenessSeconds = 1234; - const { PRIMARY, SECONDARY, NEAREST } = ReadPreference; - const TAGS = [{ loc: 'dc' }]; - - it('should accept (mode)', function () { - expect(new ReadPreference(PRIMARY)).to.be.an.instanceOf(ReadPreference); - }); - - it('should accept valid (mode, tags)', function () { - expect(new ReadPreference(PRIMARY, [])).to.be.an.instanceOf(ReadPreference); - const p0 = new ReadPreference(NEAREST, TAGS); - expect(p0.mode).to.equal(NEAREST); - }); - - it('should not accept invalid tags', function () { - expect(() => new ReadPreference(PRIMARY, 'invalid')).to.throw( - 'ReadPreference tags must be an array' - ); - expect(() => new ReadPreference(PRIMARY, { loc: 'dc' }, { maxStalenessSeconds })).to.throw( - 'ReadPreference tags must be an array' - ); - }); - - it('should accept (mode, options)', function () { - const p1 = new ReadPreference(SECONDARY, { maxStalenessSeconds }); - expect(p1.mode).to.equal(SECONDARY); - expect(p1.maxStalenessSeconds).to.equal(maxStalenessSeconds); - }); - - it('should not accept mode=primary + tags', function () { - expect(() => new ReadPreference(PRIMARY, TAGS)).to.throw( - 'Primary read preference cannot be combined with tags' - ); - }); - - it('should not accept mode=primary + options.maxStalenessSeconds', function () { - expect(() => new ReadPreference(PRIMARY, null, { maxStalenessSeconds })).to.throw( - 'Primary read preference cannot be combined with maxStalenessSeconds' - ); - }); - - it('should accept (mode=secondary, tags=null, options)', function () { - const p2 = new ReadPreference(SECONDARY, null, { maxStalenessSeconds }); - expect(p2).to.be.an.instanceOf(ReadPreference); - expect(p2.mode).to.equal(SECONDARY); - expect(p2.maxStalenessSeconds).to.equal(maxStalenessSeconds); - }); - - it('should accept (mode=secondary, tags, options)', function () { - const p3 = new ReadPreference(SECONDARY, TAGS, { maxStalenessSeconds }); - expect(p3).to.be.an.instanceOf(ReadPreference); - expect(p3.mode).to.equal(SECONDARY); - expect(p3.tags).to.eql(TAGS); - expect(p3.maxStalenessSeconds).to.equal(maxStalenessSeconds); - }); - - it('should not accept (mode, options, tags)', function () { - expect(() => new ReadPreference(PRIMARY, { maxStalenessSeconds }, TAGS)).to.throw( - 'ReadPreference tags must be an array' - ); - }); - }); - - describe('fromOptions factory method', () => { - const { PRIMARY, SECONDARY } = ReadPreference; - const TAGS = [{ loc: 'dc' }]; - - it('should return undefined if no options are passed', () => { - const readPreference = ReadPreference.fromOptions(); - expect(readPreference).to.be.undefined; - }); - - context('readPreference is string', () => { - it('should accept { readPreference }', function () { - const readPreference = ReadPreference.fromOptions({ - readPreference: PRIMARY - }); - expect(readPreference).to.be.an.instanceOf(ReadPreference); - expect(readPreference.mode).to.equal(PRIMARY); - }); - - it('should accept { readPreference, readPreferenceTags }', function () { - const readPreference = ReadPreference.fromOptions({ - readPreference: SECONDARY, - readPreferenceTags: TAGS - }); - expect(readPreference).to.be.an.instanceOf(ReadPreference); - expect(readPreference.mode).to.equal(SECONDARY); - expect(readPreference.tags).to.eql(TAGS); - }); - - it('should accept { readPreference, readPreferenceTags, hedge }', function () { - const readPreference = ReadPreference.fromOptions({ - readPreference: SECONDARY, - readPreferenceTags: TAGS, - hedge: { - enabled: true - } - }); - expect(readPreference).to.be.an.instanceOf(ReadPreference); - expect(readPreference.mode).to.equal(SECONDARY); - expect(readPreference.tags).to.eql(TAGS); - expect(readPreference.hedge).to.eql({ enabled: true }); - }); - }); - }); - it('Should correctly apply collection level read Preference to count', { metadata: { requires: { mongodb: '>=2.6.0', topology: ['single', 'ssl'] } }, diff --git a/test/unit/read_preference.test.js b/test/unit/read_preference.test.js new file mode 100644 index 0000000000..9845845956 --- /dev/null +++ b/test/unit/read_preference.test.js @@ -0,0 +1,116 @@ +'use strict'; + +const { ReadPreference } = require('../../src'); +const chai = require('chai'); +chai.use(require('chai-subset')); +const expect = chai.expect; + +describe.only('ReadPreference', function () { + describe('::constructor', function () { + const maxStalenessSeconds = 1234; + const { PRIMARY, SECONDARY, NEAREST } = ReadPreference; + const TAGS = [{ loc: 'dc' }]; + + it('should accept (mode)', function () { + expect(new ReadPreference(PRIMARY)).to.be.an.instanceOf(ReadPreference); + }); + + it('should accept valid (mode, tags)', function () { + expect(new ReadPreference(PRIMARY, [])).to.be.an.instanceOf(ReadPreference); + const p0 = new ReadPreference(NEAREST, TAGS); + expect(p0.mode).to.equal(NEAREST); + }); + + it('should not accept invalid tags', function () { + expect(() => new ReadPreference(PRIMARY, 'invalid')).to.throw( + 'ReadPreference tags must be an array' + ); + expect(() => new ReadPreference(PRIMARY, { loc: 'dc' }, { maxStalenessSeconds })).to.throw( + 'ReadPreference tags must be an array' + ); + }); + + it('should accept (mode, options)', function () { + const p1 = new ReadPreference(SECONDARY, { maxStalenessSeconds }); + expect(p1.mode).to.equal(SECONDARY); + expect(p1.maxStalenessSeconds).to.equal(maxStalenessSeconds); + }); + + it('should not accept mode=primary + tags', function () { + expect(() => new ReadPreference(PRIMARY, TAGS)).to.throw( + 'Primary read preference cannot be combined with tags' + ); + }); + + it('should not accept mode=primary + options.maxStalenessSeconds', function () { + expect(() => new ReadPreference(PRIMARY, null, { maxStalenessSeconds })).to.throw( + 'Primary read preference cannot be combined with maxStalenessSeconds' + ); + }); + + it('should accept (mode=secondary, tags=null, options)', function () { + const p2 = new ReadPreference(SECONDARY, null, { maxStalenessSeconds }); + expect(p2).to.be.an.instanceOf(ReadPreference); + expect(p2.mode).to.equal(SECONDARY); + expect(p2.maxStalenessSeconds).to.equal(maxStalenessSeconds); + }); + + it('should accept (mode=secondary, tags, options)', function () { + const p3 = new ReadPreference(SECONDARY, TAGS, { maxStalenessSeconds }); + expect(p3).to.be.an.instanceOf(ReadPreference); + expect(p3.mode).to.equal(SECONDARY); + expect(p3.tags).to.eql(TAGS); + expect(p3.maxStalenessSeconds).to.equal(maxStalenessSeconds); + }); + + it('should not accept (mode, options, tags)', function () { + expect(() => new ReadPreference(PRIMARY, { maxStalenessSeconds }, TAGS)).to.throw( + 'ReadPreference tags must be an array' + ); + }); + }); + + describe('fromOptions factory method', () => { + const { PRIMARY, SECONDARY } = ReadPreference; + const TAGS = [{ loc: 'dc' }]; + + it('should return undefined if no options are passed', () => { + const readPreference = ReadPreference.fromOptions(); + expect(readPreference).to.be.undefined; + }); + + context('readPreference is string', () => { + it('should accept { readPreference }', function () { + const readPreference = ReadPreference.fromOptions({ + readPreference: PRIMARY + }); + expect(readPreference).to.be.an.instanceOf(ReadPreference); + expect(readPreference.mode).to.equal(PRIMARY); + }); + + it('should accept { readPreference, readPreferenceTags }', function () { + const readPreference = ReadPreference.fromOptions({ + readPreference: SECONDARY, + readPreferenceTags: TAGS + }); + expect(readPreference).to.be.an.instanceOf(ReadPreference); + expect(readPreference.mode).to.equal(SECONDARY); + expect(readPreference.tags).to.eql(TAGS); + }); + + it('should accept { readPreference, readPreferenceTags, hedge }', function () { + const readPreference = ReadPreference.fromOptions({ + readPreference: SECONDARY, + readPreferenceTags: TAGS, + hedge: { + enabled: true + } + }); + expect(readPreference).to.be.an.instanceOf(ReadPreference); + expect(readPreference.mode).to.equal(SECONDARY); + expect(readPreference.tags).to.eql(TAGS); + expect(readPreference.hedge).to.eql({ enabled: true }); + }); + }); + }); +}); From f4670bc46afcf5150b5c84801203a6e23a437665 Mon Sep 17 00:00:00 2001 From: Bailey Pearson Date: Tue, 30 Nov 2021 14:00:14 -0500 Subject: [PATCH 03/11] Add maxStalenessSeconds option to read preference construction --- src/read_preference.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/read_preference.ts b/src/read_preference.ts index c1746c8322..e2a713e9ea 100644 --- a/src/read_preference.ts +++ b/src/read_preference.ts @@ -157,6 +157,7 @@ export class ReadPreference { if (typeof readPreference === 'string') { return new ReadPreference(readPreference as ReadPreferenceMode, readPreferenceTags, { + maxStalenessSeconds: options.maxStalenessSeconds, hedge: options.hedge }); } else if (!(readPreference instanceof ReadPreference) && typeof readPreference === 'object') { From f03d1fe2f77e2d77bc6cddcc2ba2471810074d35 Mon Sep 17 00:00:00 2001 From: Bailey Pearson Date: Tue, 30 Nov 2021 14:00:35 -0500 Subject: [PATCH 04/11] Clean up unit tests for read preference --- test/unit/read_preference.test.js | 42 ++++++++++++++++--------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/test/unit/read_preference.test.js b/test/unit/read_preference.test.js index 9845845956..325d575178 100644 --- a/test/unit/read_preference.test.js +++ b/test/unit/read_preference.test.js @@ -6,11 +6,10 @@ chai.use(require('chai-subset')); const expect = chai.expect; describe.only('ReadPreference', function () { + const maxStalenessSeconds = 1234; + const { PRIMARY, SECONDARY, NEAREST } = ReadPreference; + const TAGS = [{ loc: 'dc' }]; describe('::constructor', function () { - const maxStalenessSeconds = 1234; - const { PRIMARY, SECONDARY, NEAREST } = ReadPreference; - const TAGS = [{ loc: 'dc' }]; - it('should accept (mode)', function () { expect(new ReadPreference(PRIMARY)).to.be.an.instanceOf(ReadPreference); }); @@ -18,7 +17,7 @@ describe.only('ReadPreference', function () { it('should accept valid (mode, tags)', function () { expect(new ReadPreference(PRIMARY, [])).to.be.an.instanceOf(ReadPreference); const p0 = new ReadPreference(NEAREST, TAGS); - expect(p0.mode).to.equal(NEAREST); + expect(p0).to.have.property('mode', NEAREST); }); it('should not accept invalid tags', function () { @@ -33,7 +32,7 @@ describe.only('ReadPreference', function () { it('should accept (mode, options)', function () { const p1 = new ReadPreference(SECONDARY, { maxStalenessSeconds }); expect(p1.mode).to.equal(SECONDARY); - expect(p1.maxStalenessSeconds).to.equal(maxStalenessSeconds); + expect(p1).to.have.property('maxStalenessSeconds', maxStalenessSeconds); }); it('should not accept mode=primary + tags', function () { @@ -48,19 +47,25 @@ describe.only('ReadPreference', function () { ); }); + it('should not accept mode=primary + options.hedge enabled', function () { + expect(() => new ReadPreference(PRIMARY, null, { hedge: { enabled: true } })).to.throw( + 'Primary read preference cannot be combined with hedge' + ); + }); + it('should accept (mode=secondary, tags=null, options)', function () { const p2 = new ReadPreference(SECONDARY, null, { maxStalenessSeconds }); expect(p2).to.be.an.instanceOf(ReadPreference); - expect(p2.mode).to.equal(SECONDARY); - expect(p2.maxStalenessSeconds).to.equal(maxStalenessSeconds); + expect(p2).to.have.property('mode', SECONDARY); + expect(p2).to.have.property('maxStalenessSeconds', maxStalenessSeconds); }); it('should accept (mode=secondary, tags, options)', function () { const p3 = new ReadPreference(SECONDARY, TAGS, { maxStalenessSeconds }); expect(p3).to.be.an.instanceOf(ReadPreference); - expect(p3.mode).to.equal(SECONDARY); - expect(p3.tags).to.eql(TAGS); - expect(p3.maxStalenessSeconds).to.equal(maxStalenessSeconds); + expect(p3).to.have.property('mode', SECONDARY); + expect(p3.tags).to.deep.equal(TAGS); + expect(p3).to.have.property('maxStalenessSeconds', maxStalenessSeconds); }); it('should not accept (mode, options, tags)', function () { @@ -71,9 +76,6 @@ describe.only('ReadPreference', function () { }); describe('fromOptions factory method', () => { - const { PRIMARY, SECONDARY } = ReadPreference; - const TAGS = [{ loc: 'dc' }]; - it('should return undefined if no options are passed', () => { const readPreference = ReadPreference.fromOptions(); expect(readPreference).to.be.undefined; @@ -85,7 +87,7 @@ describe.only('ReadPreference', function () { readPreference: PRIMARY }); expect(readPreference).to.be.an.instanceOf(ReadPreference); - expect(readPreference.mode).to.equal(PRIMARY); + expect(readPreference).to.have.property('mode', PRIMARY); }); it('should accept { readPreference, readPreferenceTags }', function () { @@ -94,8 +96,8 @@ describe.only('ReadPreference', function () { readPreferenceTags: TAGS }); expect(readPreference).to.be.an.instanceOf(ReadPreference); - expect(readPreference.mode).to.equal(SECONDARY); - expect(readPreference.tags).to.eql(TAGS); + expect(readPreference).to.have.property('mode', SECONDARY); + expect(readPreference.tags).to.deep.equal(TAGS); }); it('should accept { readPreference, readPreferenceTags, hedge }', function () { @@ -107,9 +109,9 @@ describe.only('ReadPreference', function () { } }); expect(readPreference).to.be.an.instanceOf(ReadPreference); - expect(readPreference.mode).to.equal(SECONDARY); - expect(readPreference.tags).to.eql(TAGS); - expect(readPreference.hedge).to.eql({ enabled: true }); + expect(readPreference).to.have.property('mode', SECONDARY); + expect(readPreference.tags).to.deep.equal(TAGS); + expect(readPreference.hedge).to.deep.equal({ enabled: true }); }); }); }); From 4af66df700bd5187d937ca0d4dbad9307a4d4195 Mon Sep 17 00:00:00 2001 From: Bailey Pearson Date: Tue, 30 Nov 2021 14:17:04 -0500 Subject: [PATCH 05/11] Update unit tests - Add tests covering the maxStalenessSeconds parameter - Add tests covering error scenarios for maxStalenessSeconds && hedge --- test/unit/read_preference.test.js | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/test/unit/read_preference.test.js b/test/unit/read_preference.test.js index 325d575178..4d30ceda8c 100644 --- a/test/unit/read_preference.test.js +++ b/test/unit/read_preference.test.js @@ -100,19 +100,39 @@ describe.only('ReadPreference', function () { expect(readPreference.tags).to.deep.equal(TAGS); }); - it('should accept { readPreference, readPreferenceTags, hedge }', function () { + it('should accept { readPreference, maxStalenessSeconds }', function () { + const readPreference = ReadPreference.fromOptions({ + readPreference: SECONDARY, + maxStalenessSeconds: maxStalenessSeconds + }); + expect(readPreference).to.be.an.instanceOf(ReadPreference); + expect(readPreference).to.have.property('mode', SECONDARY); + expect(readPreference).to.have.property('maxStalenessSeconds', maxStalenessSeconds); + }); + + it('should accept { readPreference, hedge }', function () { const readPreference = ReadPreference.fromOptions({ readPreference: SECONDARY, - readPreferenceTags: TAGS, hedge: { enabled: true } }); expect(readPreference).to.be.an.instanceOf(ReadPreference); expect(readPreference).to.have.property('mode', SECONDARY); - expect(readPreference.tags).to.deep.equal(TAGS); expect(readPreference.hedge).to.deep.equal({ enabled: true }); }); }); + + it('should not accept mode=primary + options.hedge', function () { + expect(() => + ReadPreference.fromOptions({ readPreference: PRIMARY, hedge: { enabled: true } }) + ).to.throw('Primary read preference cannot be combined with hedge'); + }); + + it('should not accept mode=primary + options.maxStalenessSeconds', function () { + expect(() => + ReadPreference.fromOptions({ readPreference: PRIMARY, maxStalenessSeconds }) + ).to.throw('Primary read preference cannot be combined with maxStalenessSeconds'); + }); }); }); From 136de75c9d29167e7133e64f79a5a8e93b22854e Mon Sep 17 00:00:00 2001 From: Bailey Pearson Date: Tue, 30 Nov 2021 14:19:31 -0500 Subject: [PATCH 06/11] Remove .only from spec file --- test/unit/read_preference.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/read_preference.test.js b/test/unit/read_preference.test.js index 4d30ceda8c..7057ce133d 100644 --- a/test/unit/read_preference.test.js +++ b/test/unit/read_preference.test.js @@ -5,7 +5,7 @@ const chai = require('chai'); chai.use(require('chai-subset')); const expect = chai.expect; -describe.only('ReadPreference', function () { +describe('ReadPreference', function () { const maxStalenessSeconds = 1234; const { PRIMARY, SECONDARY, NEAREST } = ReadPreference; const TAGS = [{ loc: 'dc' }]; From 369f450fa6b1ead7824e01fd35e980146398356e Mon Sep 17 00:00:00 2001 From: Bailey Pearson Date: Tue, 30 Nov 2021 16:20:31 -0500 Subject: [PATCH 07/11] Move test file to typescript --- ...erence.test.js => read_preference.test.ts} | 26 ++++++++----------- 1 file changed, 11 insertions(+), 15 deletions(-) rename test/unit/{read_preference.test.js => read_preference.test.ts} (89%) diff --git a/test/unit/read_preference.test.js b/test/unit/read_preference.test.ts similarity index 89% rename from test/unit/read_preference.test.js rename to test/unit/read_preference.test.ts index 7057ce133d..a149eda990 100644 --- a/test/unit/read_preference.test.js +++ b/test/unit/read_preference.test.ts @@ -1,11 +1,7 @@ -'use strict'; +import { ReadPreference } from '../../src'; +import { expect } from 'chai'; -const { ReadPreference } = require('../../src'); -const chai = require('chai'); -chai.use(require('chai-subset')); -const expect = chai.expect; - -describe('ReadPreference', function () { +describe('class ReadPreference', function () { const maxStalenessSeconds = 1234; const { PRIMARY, SECONDARY, NEAREST } = ReadPreference; const TAGS = [{ loc: 'dc' }]; @@ -21,16 +17,16 @@ describe('ReadPreference', function () { }); it('should not accept invalid tags', function () { - expect(() => new ReadPreference(PRIMARY, 'invalid')).to.throw( - 'ReadPreference tags must be an array' - ); - expect(() => new ReadPreference(PRIMARY, { loc: 'dc' }, { maxStalenessSeconds })).to.throw( + expect(() => new ReadPreference(PRIMARY, 'invalid' as any)).to.throw( 'ReadPreference tags must be an array' ); + expect( + () => new ReadPreference(PRIMARY, { loc: 'dc' } as any, { maxStalenessSeconds }) + ).to.throw('ReadPreference tags must be an array'); }); it('should accept (mode, options)', function () { - const p1 = new ReadPreference(SECONDARY, { maxStalenessSeconds }); + const p1 = new ReadPreference(SECONDARY, { maxStalenessSeconds } as any); expect(p1.mode).to.equal(SECONDARY); expect(p1).to.have.property('maxStalenessSeconds', maxStalenessSeconds); }); @@ -69,9 +65,9 @@ describe('ReadPreference', function () { }); it('should not accept (mode, options, tags)', function () { - expect(() => new ReadPreference(PRIMARY, { maxStalenessSeconds }, TAGS)).to.throw( - 'ReadPreference tags must be an array' - ); + expect( + () => new ReadPreference(PRIMARY, { maxStalenessSeconds } as any, TAGS as any) + ).to.throw('ReadPreference tags must be an array'); }); }); From 0b2cdfd93da77cf8ad82b9d43b5d3908fe72bbfd Mon Sep 17 00:00:00 2001 From: Bailey Pearson Date: Tue, 30 Nov 2021 17:01:39 -0500 Subject: [PATCH 08/11] Dummy commit to test authorship From 2307258d29f5686024dc5438fc8d07cf463e2f24 Mon Sep 17 00:00:00 2001 From: Bailey Pearson Date: Tue, 30 Nov 2021 17:08:29 -0500 Subject: [PATCH 09/11] Empty commit - test authorship From b0b54d12de1a68cfc9592c05b506c08f4d32d93c Mon Sep 17 00:00:00 2001 From: Bailey Pearson Date: Tue, 30 Nov 2021 17:12:22 -0500 Subject: [PATCH 10/11] Add meself as contributor --- CONTRIBUTORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index d3c99a84d3..598ac02663 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -58,6 +58,7 @@ - Neal Beeken <> - Durran Jordan <> - Daria Pardue <> +- Bailey Pearson <> ## Community Types From 01cbc7a7d7d8a993c97151f8e25da8ae55de28f0 Mon Sep 17 00:00:00 2001 From: Bailey Pearson Date: Wed, 1 Dec 2021 12:36:51 -0500 Subject: [PATCH 11/11] Test commit signature verify Signed-off-by: Bailey Pearson