Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CSHARP-2043: Added AssumeIndexesExist option to improve robustness of sharded GridFS #294

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
38 changes: 22 additions & 16 deletions src/MongoDB.Driver.GridFS/GridFSBucket.cs
Original file line number Diff line number Diff line change
Expand Up @@ -814,16 +814,19 @@ private void EnsureIndexes(IReadWriteBindingHandle binding, CancellationToken ca
{
if (!_ensureIndexesDone)
{
var isFilesCollectionEmpty = IsFilesCollectionEmpty(binding, cancellationToken);
if (isFilesCollectionEmpty)
if (!_options.AssumeIndexesExist)
{
if (!FilesCollectionIndexesExist(binding, cancellationToken))
var isFilesCollectionEmpty = IsFilesCollectionEmpty(binding, cancellationToken);
if (isFilesCollectionEmpty)
{
CreateFilesCollectionIndexes(binding, cancellationToken);
}
if (!ChunksCollectionIndexesExist(binding, cancellationToken))
{
CreateChunksCollectionIndexes(binding, cancellationToken);
if (!FilesCollectionIndexesExist(binding, cancellationToken))
{
CreateFilesCollectionIndexes(binding, cancellationToken);
}
if (!ChunksCollectionIndexesExist(binding, cancellationToken))
{
CreateChunksCollectionIndexes(binding, cancellationToken);
}
}
}

Expand All @@ -843,16 +846,19 @@ private async Task EnsureIndexesAsync(IReadWriteBindingHandle binding, Cancellat
{
if (!_ensureIndexesDone)
{
var isFilesCollectionEmpty = await IsFilesCollectionEmptyAsync(binding, cancellationToken).ConfigureAwait(false);
if (isFilesCollectionEmpty)
if (!_options.AssumeIndexesExist)
{
if (!(await FilesCollectionIndexesExistAsync(binding, cancellationToken).ConfigureAwait(false)))
{
await CreateFilesCollectionIndexesAsync(binding, cancellationToken).ConfigureAwait(false);
}
if (!(await ChunksCollectionIndexesExistAsync(binding, cancellationToken).ConfigureAwait(false)))
var isFilesCollectionEmpty = await IsFilesCollectionEmptyAsync(binding, cancellationToken).ConfigureAwait(false);
if (isFilesCollectionEmpty)
{
await CreateChunksCollectionIndexesAsync(binding, cancellationToken).ConfigureAwait(false);
if (!(await FilesCollectionIndexesExistAsync(binding, cancellationToken).ConfigureAwait(false)))
{
await CreateFilesCollectionIndexesAsync(binding, cancellationToken).ConfigureAwait(false);
}
if (!(await ChunksCollectionIndexesExistAsync(binding, cancellationToken).ConfigureAwait(false)))
{
await CreateChunksCollectionIndexesAsync(binding, cancellationToken).ConfigureAwait(false);
}
}
}

Expand Down
29 changes: 29 additions & 0 deletions src/MongoDB.Driver.GridFS/GridFSBucketOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ public class GridFSBucketOptions
private ReadConcern _readConcern;
private ReadPreference _readPreference;
private WriteConcern _writeConcern;
private bool _assumeIndexesExist;

// constructors
/// <summary>
Expand All @@ -51,6 +52,7 @@ public GridFSBucketOptions(GridFSBucketOptions other)
_readConcern = other.ReadConcern;
_readPreference = other.ReadPreference;
_writeConcern = other.WriteConcern;
_assumeIndexesExist = other.AssumeIndexesExist;
}

/// <summary>
Expand All @@ -65,6 +67,7 @@ public GridFSBucketOptions(ImmutableGridFSBucketOptions other)
_readConcern = other.ReadConcern;
_readPreference = other.ReadPreference;
_writeConcern = other.WriteConcern;
_assumeIndexesExist = other.AssumeIndexesExist;
}

// properties
Expand Down Expand Up @@ -135,6 +138,18 @@ public WriteConcern WriteConcern
get { return _writeConcern; }
set { _writeConcern = value; }
}

/// <summary>
/// Gets or sets the assume indexes exist setting
/// </summary>
/// <value>
/// The assume indexes exist setting
/// </value>
public bool AssumeIndexesExist
{
get { return _assumeIndexesExist; }
set { _assumeIndexesExist = value; }
}
}

/// <summary>
Expand Down Expand Up @@ -165,6 +180,7 @@ public static ImmutableGridFSBucketOptions Defaults
private readonly ReadConcern _readConcern;
private readonly ReadPreference _readPreference;
private readonly WriteConcern _writeConcern;
private readonly bool _assumeIndexesExist;

// constructors
/// <summary>
Expand All @@ -174,6 +190,7 @@ public ImmutableGridFSBucketOptions()
{
_bucketName = "fs";
_chunkSizeBytes = 255 * 1024;
_assumeIndexesExist = false;
}

/// <summary>
Expand All @@ -188,6 +205,7 @@ public ImmutableGridFSBucketOptions(GridFSBucketOptions other)
_readConcern = other.ReadConcern;
_readPreference = other.ReadPreference;
_writeConcern = other.WriteConcern;
_assumeIndexesExist = other.AssumeIndexesExist;
}

// properties
Expand Down Expand Up @@ -256,5 +274,16 @@ public WriteConcern WriteConcern
{
get { return _writeConcern; }
}

/// <summary>
/// Gets the assume ensure indexes setting
/// </summary>
/// <value>
/// The assume ensure indexes setting
/// </value>
public bool AssumeIndexesExist
{
get { return _assumeIndexesExist; }
}
}
}
39 changes: 37 additions & 2 deletions tests/MongoDB.Driver.GridFS.Tests/GridFSBucketOptionsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ public void constructor_with_immutable_other_should_initialize_instance()
[Fact]
public void constructor_with_mutable_other_should_initialize_instance()
{
var other = new GridFSBucketOptions { BucketName = "bucket", ChunkSizeBytes = 123, ReadConcern = ReadConcern.Majority, ReadPreference = ReadPreference.Secondary, WriteConcern = WriteConcern.WMajority };
var other = new GridFSBucketOptions { BucketName = "bucket", ChunkSizeBytes = 123, ReadConcern = ReadConcern.Majority, ReadPreference = ReadPreference.Secondary, WriteConcern = WriteConcern.WMajority, AssumeIndexesExist = true };

var result = new GridFSBucketOptions(other);

Expand All @@ -126,6 +126,7 @@ public void constructor_with_mutable_other_should_initialize_instance()
result.ReadConcern.Should().Be(other.ReadConcern);
result.ReadPreference.Should().Be(other.ReadPreference);
result.WriteConcern.Should().Be(other.WriteConcern);
result.AssumeIndexesExist.Should().Be(other.AssumeIndexesExist);
}

[Fact]
Expand All @@ -137,6 +138,7 @@ public void constructor_with_no_arguments_should_initialize_instance_with_defaul
result.ChunkSizeBytes.Should().Be(255 * 1024);
result.ReadPreference.Should().BeNull();
result.WriteConcern.Should().BeNull();
result.AssumeIndexesExist.Should().BeFalse();
}

[Fact]
Expand Down Expand Up @@ -198,6 +200,26 @@ public void WriteConcern_set_should_have_expected_result()

subject.WriteConcern.Should().Be(WriteConcern.WMajority);
}

[Fact]
public void AssumeIndexesExist_get_should_return_expected_result()
{
var subject = new GridFSBucketOptions { AssumeIndexesExist = true };

var result = subject.AssumeIndexesExist;

result.Should().BeTrue();
}

[Fact]
public void AssumeIndexesExist_set_should_have_expected_result()
{
var subject = new GridFSBucketOptions();

subject.AssumeIndexesExist = true;

subject.AssumeIndexesExist.Should().BeTrue();
}
}

public class ImmutableGridFSBucketOptionsTests
Expand Down Expand Up @@ -225,7 +247,7 @@ public void ChunkSizeBytes_get_should_return_expected_result()
[Fact]
public void constructor_with_arguments_should_initialize_instance()
{
var mutable = new GridFSBucketOptions { BucketName = "bucket", ChunkSizeBytes = 123, ReadConcern = ReadConcern.Majority, ReadPreference = ReadPreference.Secondary, WriteConcern = WriteConcern.WMajority };
var mutable = new GridFSBucketOptions { BucketName = "bucket", ChunkSizeBytes = 123, ReadConcern = ReadConcern.Majority, ReadPreference = ReadPreference.Secondary, WriteConcern = WriteConcern.WMajority, AssumeIndexesExist = true };

var result = new ImmutableGridFSBucketOptions(mutable);

Expand All @@ -234,6 +256,7 @@ public void constructor_with_arguments_should_initialize_instance()
result.ReadConcern.Should().Be(ReadConcern.Majority);
result.ReadPreference.Should().Be(ReadPreference.Secondary);
result.WriteConcern.Should().Be(WriteConcern.WMajority);
result.AssumeIndexesExist.Should().BeTrue();
}

[Fact]
Expand All @@ -246,6 +269,7 @@ public void constructor_with_no_arguments_should_initialize_instance_with_defaul
result.ReadConcern.Should().BeNull();
result.ReadPreference.Should().BeNull();
result.WriteConcern.Should().BeNull();
result.AssumeIndexesExist.Should().BeFalse();
}

[Fact]
Expand All @@ -267,6 +291,7 @@ public void Defaults_get_should_return_expected_result()
result.ReadConcern.Should().BeNull();
result.ReadPreference.Should().BeNull();
result.WriteConcern.Should().BeNull();
result.AssumeIndexesExist.Should().BeFalse();
}

[Fact]
Expand Down Expand Up @@ -298,5 +323,15 @@ public void WriteConcern_get_should_return_expected_result()

result.Should().Be(WriteConcern.WMajority);
}

[Fact]
public void AssumeIndexesExist_get_should_return_expected_result()
{
var subject = new ImmutableGridFSBucketOptions(new GridFSBucketOptions { AssumeIndexesExist = true });

var result = subject.AssumeIndexesExist;

result.Should().BeTrue();
}
}
}