Skip to content

Commit bac62f7

Browse files
committed
Merge pull request #1263 from elasticsearch/fix/sniff-on-startup-happens-too-often
When using SniffOnStartup() and newing clients
2 parents 8cf600b + 56a629d commit bac62f7

File tree

7 files changed

+47
-20
lines changed

7 files changed

+47
-20
lines changed

src/Elasticsearch.Net/Connection/Transport.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,11 @@ public Transport(
6565

6666
this._requestHandler = new RequestHandler(this.Settings, this._connectionPool, this.Connection, this._serializer, this._memoryStreamProvider, this);
6767
this._requestHandlerAsync = new RequestHandlerAsync(this.Settings, this._connectionPool, this.Connection, this._serializer, this._memoryStreamProvider, this);
68-
if (this._connectionPool.AcceptsUpdates && this.Settings.SniffsOnStartup)
68+
if (this._connectionPool.AcceptsUpdates && this.Settings.SniffsOnStartup && !this._connectionPool.SniffedOnStartup)
69+
{
6970
Self.SniffClusterState();
71+
this._connectionPool.SniffedOnStartup = true;
72+
}
7073
}
7174

7275
/* PING/SNIFF *** ********************************************/

src/Elasticsearch.Net/ConnectionPool/IConnectionPool.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ public interface IConnectionPool
2424
/// </summary>
2525
bool UsingSsl { get; }
2626

27+
/// <summary>
28+
/// Bookkeeps wheter this connectionpool has seen a sniff on startup.
29+
/// </summary>
30+
bool SniffedOnStartup { get; set; }
31+
2732
/// <summary>
2833
/// Gets the next live Uri to perform the request on
2934
/// </summary>

src/Elasticsearch.Net/ConnectionPool/SingleNodeConnectionPool.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,15 @@ public class SingleNodeConnectionPool : IConnectionPool
1010
public int MaxRetries { get { return 0; } }
1111

1212
public bool AcceptsUpdates { get { return false; } }
13-
13+
1414
public bool UsingSsl { get { return _uri.Scheme == Uri.UriSchemeHttps; } }
1515

16+
public bool SniffedOnStartup
17+
{
18+
get { return false; }
19+
set { }
20+
}
21+
1622
public SingleNodeConnectionPool(Uri uri)
1723
{
1824
//this makes sure that paths stay relative i.e if the root uri is:

src/Elasticsearch.Net/ConnectionPool/StaticConnectionPool.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ public class StaticConnectionPool : IConnectionPool
2222

2323
public bool UsingSsl { get; internal set; }
2424

25+
public bool SniffedOnStartup { get; set; }
26+
2527
public StaticConnectionPool(
2628
IEnumerable<Uri> uris,
2729
bool randomizeOnStartup = true,

src/Nest/Domain/Observers/RestoreObservable.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -109,14 +109,16 @@ public void Dispose()
109109
protected virtual void Dispose(bool disposing)
110110
{
111111
if (_disposed) return;
112+
if (_timer != null) _timer.Dispose();
113+
if (_restoreStatusHumbleObject != null)
114+
{
115+
_restoreStatusHumbleObject.Next -= _nextEventHandlers;
116+
_restoreStatusHumbleObject.Completed -= _completedEentHandlers;
117+
_restoreStatusHumbleObject.Error -= _errorEventHandlers;
112118

113-
_timer.Dispose();
114-
_restoreStatusHumbleObject.Next -= _nextEventHandlers;
115-
_restoreStatusHumbleObject.Completed -= _completedEentHandlers;
116-
_restoreStatusHumbleObject.Error -= _errorEventHandlers;
117-
118-
_restoreStatusHumbleObject.Completed -= StopTimer;
119-
_restoreStatusHumbleObject.Error -= StopTimer;
119+
_restoreStatusHumbleObject.Completed -= StopTimer;
120+
_restoreStatusHumbleObject.Error -= StopTimer;
121+
}
120122

121123
_disposed = true;
122124
}

src/Nest/Domain/Observers/SnapshotObservable.cs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -109,14 +109,17 @@ protected virtual void Dispose(bool disposing)
109109
{
110110
if (_disposed) return;
111111

112-
_timer.Dispose();
112+
if (_timer != null) _timer.Dispose();
113113

114-
_snapshotStatusHumbleObject.Next -= _nextEventHandler;
115-
_snapshotStatusHumbleObject.Completed -= _completedEentHandler;
116-
_snapshotStatusHumbleObject.Error -= _errorEventHandler;
114+
if (_snapshotStatusHumbleObject != null)
115+
{
116+
_snapshotStatusHumbleObject.Next -= _nextEventHandler;
117+
_snapshotStatusHumbleObject.Completed -= _completedEentHandler;
118+
_snapshotStatusHumbleObject.Error -= _errorEventHandler;
117119

118-
_snapshotStatusHumbleObject.Completed -= StopTimer;
119-
_snapshotStatusHumbleObject.Error -= StopTimer;
120+
_snapshotStatusHumbleObject.Completed -= StopTimer;
121+
_snapshotStatusHumbleObject.Error -= StopTimer;
122+
}
120123

121124
_disposed = true;
122125
}

src/Tests/Elasticsearch.Net.Tests.Unit/ConnectionPools/Sniffing/SniffingConnectionPoolTests.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,26 +57,32 @@ public void SniffCalledOnceAndEachEnpointPingedOnce()
5757
var pingCall = FakeCalls.PingAtConnectionLevel(fake);
5858
pingCall.Returns(FakeResponse.Ok(config));
5959
var sniffCall = FakeCalls.Sniff(fake, config, uris);
60-
var transport = FakeCalls.ProvideDefaultTransport(fake);
6160
var getCall = FakeCalls.GetSyncCall(fake);
6261
getCall.Returns(FakeResponse.Ok(config));
6362

64-
var client1 = new ElasticsearchClient(config, transport: transport);
63+
var transport1 = FakeCalls.ProvideRealTranportInstance(fake);
64+
var transport2 = FakeCalls.ProvideRealTranportInstance(fake);
65+
var transport3 = FakeCalls.ProvideRealTranportInstance(fake);
66+
var transport4 = FakeCalls.ProvideRealTranportInstance(fake);
67+
68+
transport1.Should().NotBe(transport2);
69+
70+
var client1 = new ElasticsearchClient(config, transport: transport1);
6571
client1.Info();
6672
client1.Info();
6773
client1.Info();
6874
client1.Info();
69-
var client2 = new ElasticsearchClient(config, transport: transport);
75+
var client2 = new ElasticsearchClient(config, transport: transport2);
7076
client2.Info();
7177
client2.Info();
7278
client2.Info();
7379
client2.Info();
74-
var client3 = new ElasticsearchClient(config, transport: transport);
80+
var client3 = new ElasticsearchClient(config, transport: transport3);
7581
client3.Info();
7682
client3.Info();
7783
client3.Info();
7884
client3.Info();
79-
var client4 = new ElasticsearchClient(config, transport: transport);
85+
var client4 = new ElasticsearchClient(config, transport: transport4);
8086
client4.Info();
8187
client4.Info();
8288
client4.Info();

0 commit comments

Comments
 (0)