Skip to content

Commit 647fb9b

Browse files
committed
Pull version information from systel.local, when version info is not
present
1 parent 7acc9f6 commit 647fb9b

2 files changed

Lines changed: 47 additions & 4 deletions

File tree

cassandra/metadata.py

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,9 @@ def export_schema_as_string(self):
139139
def refresh(self, connection, timeout, target_type=None, change_type=None, fetch_size=None,
140140
metadata_request_timeout=None, **kwargs):
141141

142-
server_version = self.get_host(connection.original_endpoint).release_version
143-
dse_version = self.get_host(connection.original_endpoint).dse_version
142+
host = self.get_host(connection.original_endpoint)
143+
server_version = host.release_version if host else None
144+
dse_version = host.dse_version if host else None
144145
parser = get_schema_parser(connection, server_version, dse_version, timeout, metadata_request_timeout, fetch_size)
145146

146147
if not target_type:
@@ -3410,7 +3411,32 @@ def __init__(
34103411

34113412

34123413
def get_schema_parser(connection, server_version, dse_version, timeout, metadata_request_timeout, fetch_size=None):
3413-
version = Version(server_version)
3414+
if server_version is None and dse_version is None:
3415+
success, local_result = connection.wait_for_response(
3416+
QueryMessage(
3417+
query=maybe_add_timeout_to_query(
3418+
"SELECT release_version FROM system.local WHERE key='local'",
3419+
metadata_request_timeout),
3420+
consistency_level=ConsistencyLevel.ONE)
3421+
, timeout=timeout, fail_on_error=False)
3422+
if success and local_result.parsed_rows:
3423+
local_rows = dict_factory(local_result.column_names, local_result.parsed_rows)
3424+
local_row = local_rows[0]
3425+
server_version = local_row.get("release_version")
3426+
3427+
success, local_result = connection.wait_for_response(
3428+
QueryMessage(
3429+
query=maybe_add_timeout_to_query(
3430+
"SELECT dse_version FROM system.local WHERE key='local'",
3431+
metadata_request_timeout),
3432+
consistency_level=ConsistencyLevel.ONE)
3433+
, timeout=timeout, fail_on_error=False)
3434+
if success and local_result.parsed_rows:
3435+
local_rows = dict_factory(local_result.column_names, local_result.parsed_rows)
3436+
local_row = local_rows[0]
3437+
server_version = local_row.get("dse_version")
3438+
3439+
version = Version(server_version or "0")
34143440
if dse_version:
34153441
v = Version(dse_version)
34163442
if v >= Version('6.8.0'):

tests/unit/test_metadata.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@
3030
UserType, KeyspaceMetadata, get_schema_parser,
3131
_UnknownStrategy, ColumnMetadata, TableMetadata,
3232
IndexMetadata, Function, Aggregate,
33-
Metadata, TokenMap, ReplicationFactor)
33+
Metadata, TokenMap, ReplicationFactor,
34+
SchemaParserDSE68)
3435
from cassandra.policies import SimpleConvictionPolicy
3536
from cassandra.pool import Host
3637
from tests.util import assertCountEqual
@@ -616,6 +617,22 @@ def test_build_index_as_cql(self):
616617
assert index_meta.as_cql_query() == "CREATE CUSTOM INDEX index_name_here ON keyspace_name_here.table_name_here (column_name_here) USING 'class_name_here'"
617618

618619

620+
class SchemaParserLookupTests(unittest.TestCase):
621+
622+
def test_reads_versions_from_system_local_when_missing(self):
623+
connection = Mock()
624+
local_result = Mock()
625+
local_result.column_names = ["release_version", "dse_version"]
626+
local_result.parsed_rows = [["4.0.0", "6.8.0"]]
627+
connection.wait_for_response.return_value = (True, local_result)
628+
629+
parser = get_schema_parser(connection, None, None, 0.1, None)
630+
631+
assert isinstance(parser, SchemaParserDSE68)
632+
message = connection.wait_for_response.call_args[0][0]
633+
assert "system.local" in message.query
634+
635+
619636
class UnicodeIdentifiersTests(unittest.TestCase):
620637
"""
621638
Exercise cql generation with unicode characters. Keyspace, Table, and Index names

0 commit comments

Comments
 (0)