Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -43,5 +43,11 @@ public ShardingInfo GetShardingInfo()
{
return null;
}

public TabletInfo GetTabletInfo()
{
return null;

}
}
}
7 changes: 6 additions & 1 deletion src/Cassandra/Connections/Connection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -577,6 +577,11 @@ public ShardingInfo ShardingInfo()
return _supportedOptionsInitializer.GetShardingInfo();
}

public TabletInfo TabletInfo()
{
return _supportedOptionsInitializer.GetTabletInfo();
}

private void ReadHandler(byte[] buffer, int bytesReceived)
{
if (_isClosed)
Expand Down Expand Up @@ -853,7 +858,7 @@ private Task<Response> SendOptions()
/// </summary>
private Task<Response> Startup()
{
var request = _startupRequestFactory.CreateStartupRequest(Options);
var request = _startupRequestFactory.CreateStartupRequest(Options, _supportedOptionsInitializer);
// Use the Connect timeout for the startup request timeout
return Send(request, Configuration.SocketOptions.ConnectTimeoutMillis);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,6 @@ internal interface ISupportedOptionsInitializer
Task ApplySupportedOptionsAsync(IConnection connection);
void ApplySupportedFromResponse(Response response);
ShardingInfo GetShardingInfo();
TabletInfo GetTabletInfo();
}
}
12 changes: 12 additions & 0 deletions src/Cassandra/Connections/Control/SupportedOptionsInitializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ internal class SupportedOptionsInitializer : ISupportedOptionsInitializer
private const string ScyllaShardAwarePortSSL = "SCYLLA_SHARD_AWARE_PORT_SSL";

private ShardingInfo _shardingInfo;
private TabletInfo _tabletInfo;

public SupportedOptionsInitializer(Metadata metadata)
{
Expand Down Expand Up @@ -65,13 +66,19 @@ public void ApplySupportedFromResponse(Response response)

ApplyProductTypeOption(supportedResponse.Output.Options);
ApplyScyllaShardingOption(supportedResponse.Output.Options);
ApplyScyllaTabletOption(supportedResponse.Output.Options);
}

public ShardingInfo GetShardingInfo()
{
return _shardingInfo;
}

public TabletInfo GetTabletInfo()
{
return _tabletInfo;
}

private void ApplyProductTypeOption(IDictionary<string, string[]> options)
{
if (!options.TryGetValue(SupportedOptionsInitializer.SupportedProductTypeKey, out var productTypeOptions))
Expand All @@ -90,6 +97,11 @@ private void ApplyProductTypeOption(IDictionary<string, string[]> options)
}
}

private void ApplyScyllaTabletOption(IDictionary<string, string[]> options)
{
_tabletInfo = TabletInfo.ParseTabletInfo(options);
}

private void ApplyScyllaShardingOption(IDictionary<string, string[]> options)
{
if (!options.TryGetValue(SupportedOptionsInitializer.ScyllaShard, out var scyllaShard))
Expand Down
38 changes: 38 additions & 0 deletions src/Cassandra/Connections/TabletInfo.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
using System.Collections.Generic;

namespace Cassandra.Connections
{
public class TabletInfo
{
private const string SCYLLA_TABLETS_STARTUP_OPTION_KEY = "TABLETS_ROUTING_V1";
private const string SCYLLA_TABLETS_STARTUP_OPTION_VALUE = "";
public const string TABLETS_ROUTING_V1_CUSTOM_PAYLOAD_KEY = "tablets-routing-v1";

private bool enabled;

private TabletInfo(bool enabled)
{
this.enabled = enabled;
}

// Currently pertains only to TABLETS_ROUTING_V1
public bool IsEnabled()
{
return enabled;
}

public static TabletInfo ParseTabletInfo(IDictionary<string, string[]> supported)
{
if (supported.TryGetValue(SCYLLA_TABLETS_STARTUP_OPTION_KEY, out var values))
{
return new TabletInfo(
values != null &&
values.Length == 1 &&
values[0] == SCYLLA_TABLETS_STARTUP_OPTION_VALUE
);
}

return new TabletInfo(false);
}
}
}
3 changes: 2 additions & 1 deletion src/Cassandra/Requests/IStartupOptionsFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,12 @@
//

using System.Collections.Generic;
using Cassandra.Connections.Control;

namespace Cassandra.Requests
{
internal interface IStartupOptionsFactory
{
IReadOnlyDictionary<string, string> CreateStartupOptions(ProtocolOptions options);
IReadOnlyDictionary<string, string> CreateStartupOptions(ProtocolOptions options, ISupportedOptionsInitializer supportedOptionsInitializer);
}
}
4 changes: 3 additions & 1 deletion src/Cassandra/Requests/IStartupRequestFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,12 @@
// limitations under the License.
//

using Cassandra.Connections.Control;

namespace Cassandra.Requests
{
internal interface IStartupRequestFactory
{
IRequest CreateStartupRequest(ProtocolOptions protocolOptions);
IRequest CreateStartupRequest(ProtocolOptions protocolOptions, ISupportedOptionsInitializer supportedOptionsInitializer);
}
}
9 changes: 8 additions & 1 deletion src/Cassandra/Requests/StartupOptionsFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
using System;
using System.Collections.Generic;
using Cassandra.Helpers;
using Cassandra.Connections.Control;

namespace Cassandra.Requests
{
Expand All @@ -31,6 +32,7 @@ internal class StartupOptionsFactory : IStartupOptionsFactory
public const string ApplicationNameOption = "APPLICATION_NAME";
public const string ApplicationVersionOption = "APPLICATION_VERSION";
public const string ClientIdOption = "CLIENT_ID";
public const string TabletsRoutingV1Option = "TABLETS_ROUTING_V1";

public const string CqlVersion = "3.0.0";
public const string SnappyCompression = "snappy";
Expand All @@ -47,7 +49,7 @@ public StartupOptionsFactory(Guid clusterId, string appVersion, string appName)
_clusterId = clusterId;
}

public IReadOnlyDictionary<string, string> CreateStartupOptions(ProtocolOptions options)
public IReadOnlyDictionary<string, string> CreateStartupOptions(ProtocolOptions options, ISupportedOptionsInitializer supportedOptionsInitializer = null)
{
var startupOptions = new Dictionary<string, string>
{
Expand Down Expand Up @@ -75,6 +77,11 @@ public IReadOnlyDictionary<string, string> CreateStartupOptions(ProtocolOptions
startupOptions.Add(StartupOptionsFactory.NoCompactOption, "true");
}

if (supportedOptionsInitializer?.GetTabletInfo() != null && supportedOptionsInitializer.GetTabletInfo().IsEnabled())
{
startupOptions.Add(StartupOptionsFactory.TabletsRoutingV1Option, "true");
}

startupOptions.Add(StartupOptionsFactory.DriverNameOption, AssemblyHelpers.GetAssemblyTitle(typeof(StartupOptionsFactory)));
startupOptions.Add(
StartupOptionsFactory.DriverVersionOption, AssemblyHelpers.GetAssemblyInformationalVersion(typeof(StartupOptionsFactory)));
Expand Down
6 changes: 4 additions & 2 deletions src/Cassandra/Requests/StartupRequestFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
// limitations under the License.
//

using Cassandra.Connections.Control;

namespace Cassandra.Requests
{
internal class StartupRequestFactory : IStartupRequestFactory
Expand All @@ -25,9 +27,9 @@ public StartupRequestFactory(IStartupOptionsFactory optionsFactory)
_optionsFactory = optionsFactory;
}

public IRequest CreateStartupRequest(ProtocolOptions protocolOptions)
public IRequest CreateStartupRequest(ProtocolOptions protocolOptions, ISupportedOptionsInitializer supportedOptionsInitializer)
{
return new StartupRequest(_optionsFactory.CreateStartupOptions(protocolOptions));
return new StartupRequest(_optionsFactory.CreateStartupOptions(protocolOptions, supportedOptionsInitializer));
}
}
}