26
26
from threading import RLock
27
27
import struct
28
28
import random
29
+ import itertools
29
30
30
31
murmur3 = None
31
32
try :
@@ -132,11 +133,11 @@ def export_schema_as_string(self):
132
133
"""
133
134
return "\n \n " .join (ks .export_as_string () for ks in self .keyspaces .values ())
134
135
135
- def refresh (self , connection , timeout , target_type = None , change_type = None , ** kwargs ):
136
+ def refresh (self , connection , timeout , target_type = None , change_type = None , fetch_size = None , ** kwargs ):
136
137
137
138
server_version = self .get_host (connection .original_endpoint ).release_version
138
139
dse_version = self .get_host (connection .original_endpoint ).dse_version
139
- parser = get_schema_parser (connection , server_version , dse_version , timeout )
140
+ parser = get_schema_parser (connection , server_version , dse_version , timeout , fetch_size )
140
141
141
142
if not target_type :
142
143
self ._rebuild_all (parser )
@@ -1924,7 +1925,7 @@ def __init__(self, connection, timeout):
1924
1925
self .connection = connection
1925
1926
self .timeout = timeout
1926
1927
1927
- def _handle_results (self , success , result , expected_failures = tuple ()):
1928
+ def _handle_results (self , success , result , expected_failures = tuple (), query_msg = None , timeout = None ):
1928
1929
"""
1929
1930
Given a bool and a ResultSet (the form returned per result from
1930
1931
Connection.wait_for_responses), return a dictionary containing the
@@ -1945,9 +1946,26 @@ def _handle_results(self, success, result, expected_failures=tuple()):
1945
1946
query failed, but raised an instance of an expected failure class, this
1946
1947
will ignore the failure and return an empty list.
1947
1948
"""
1949
+ timeout = timeout or self .timeout
1948
1950
if not success and isinstance (result , expected_failures ):
1949
1951
return []
1950
1952
elif success :
1953
+ if result .paging_state and query_msg :
1954
+ def get_next_pages ():
1955
+ next_result = None
1956
+ while True :
1957
+ query_msg .paging_state = next_result .paging_state if next_result else result .paging_state
1958
+ next_success , next_result = self .connection .wait_for_response (query_msg , timeout = timeout ,
1959
+ fail_on_error = False )
1960
+ if not next_success and isinstance (next_result , expected_failures ):
1961
+ continue
1962
+ elif not next_success :
1963
+ raise next_result
1964
+ if not next_result .paging_state :
1965
+ break
1966
+ yield next_result .parsed_rows
1967
+
1968
+ result .parsed_rows += itertools .chain (* get_next_pages ())
1951
1969
return dict_factory (result .column_names , result .parsed_rows ) if result else []
1952
1970
else :
1953
1971
raise result
@@ -2532,8 +2550,9 @@ class SchemaParserV3(SchemaParserV22):
2532
2550
'read_repair_chance' ,
2533
2551
'speculative_retry' )
2534
2552
2535
- def __init__ (self , connection , timeout ):
2553
+ def __init__ (self , connection , timeout , fetch_size ):
2536
2554
super (SchemaParserV3 , self ).__init__ (connection , timeout )
2555
+ self .fetch_size = fetch_size
2537
2556
self .indexes_result = []
2538
2557
self .keyspace_table_index_rows = defaultdict (lambda : defaultdict (list ))
2539
2558
self .keyspace_view_rows = defaultdict (list )
@@ -2726,17 +2745,18 @@ def _build_trigger_metadata(table_metadata, row):
2726
2745
2727
2746
def _query_all (self ):
2728
2747
cl = ConsistencyLevel .ONE
2748
+ fetch_size = self .fetch_size
2729
2749
queries = [
2730
- QueryMessage (query = self ._SELECT_KEYSPACES , consistency_level = cl ),
2731
- QueryMessage (query = self ._SELECT_TABLES , consistency_level = cl ),
2732
- QueryMessage (query = self ._SELECT_COLUMNS , consistency_level = cl ),
2733
- QueryMessage (query = self ._SELECT_TYPES , consistency_level = cl ),
2734
- QueryMessage (query = self ._SELECT_FUNCTIONS , consistency_level = cl ),
2735
- QueryMessage (query = self ._SELECT_AGGREGATES , consistency_level = cl ),
2736
- QueryMessage (query = self ._SELECT_TRIGGERS , consistency_level = cl ),
2737
- QueryMessage (query = self ._SELECT_INDEXES , consistency_level = cl ),
2738
- QueryMessage (query = self ._SELECT_VIEWS , consistency_level = cl ),
2739
- QueryMessage (query = self ._SELECT_SCYLLA , consistency_level = cl )
2750
+ QueryMessage (query = self ._SELECT_KEYSPACES , fetch_size = fetch_size , consistency_level = cl ),
2751
+ QueryMessage (query = self ._SELECT_TABLES , fetch_size = fetch_size , consistency_level = cl ),
2752
+ QueryMessage (query = self ._SELECT_COLUMNS , fetch_size = fetch_size , consistency_level = cl ),
2753
+ QueryMessage (query = self ._SELECT_TYPES , fetch_size = fetch_size , consistency_level = cl ),
2754
+ QueryMessage (query = self ._SELECT_FUNCTIONS , fetch_size = fetch_size , consistency_level = cl ),
2755
+ QueryMessage (query = self ._SELECT_AGGREGATES , fetch_size = fetch_size , consistency_level = cl ),
2756
+ QueryMessage (query = self ._SELECT_TRIGGERS , fetch_size = fetch_size , consistency_level = cl ),
2757
+ QueryMessage (query = self ._SELECT_INDEXES , fetch_size = fetch_size , consistency_level = cl ),
2758
+ QueryMessage (query = self ._SELECT_VIEWS , fetch_size = fetch_size , consistency_level = cl ),
2759
+ QueryMessage (query = self ._SELECT_SCYLLA , fetch_size = fetch_size , consistency_level = cl )
2740
2760
]
2741
2761
2742
2762
((ks_success , ks_result ),
@@ -2752,16 +2772,16 @@ def _query_all(self):
2752
2772
* queries , timeout = self .timeout , fail_on_error = False
2753
2773
)
2754
2774
2755
- self .keyspaces_result = self ._handle_results (ks_success , ks_result )
2756
- self .tables_result = self ._handle_results (table_success , table_result )
2757
- self .columns_result = self ._handle_results (col_success , col_result )
2758
- self .triggers_result = self ._handle_results (triggers_success , triggers_result )
2759
- self .types_result = self ._handle_results (types_success , types_result )
2760
- self .functions_result = self ._handle_results (functions_success , functions_result )
2761
- self .aggregates_result = self ._handle_results (aggregates_success , aggregates_result )
2762
- self .indexes_result = self ._handle_results (indexes_success , indexes_result )
2763
- self .views_result = self ._handle_results (views_success , views_result )
2764
- self .scylla_result = self ._handle_results (scylla_success , scylla_result , expected_failures = (InvalidRequest ,))
2775
+ self .keyspaces_result = self ._handle_results (ks_success , ks_result , query_msg = queries [ 0 ] )
2776
+ self .tables_result = self ._handle_results (table_success , table_result , query_msg = queries [ 1 ] )
2777
+ self .columns_result = self ._handle_results (col_success , col_result , query_msg = queries [ 2 ] )
2778
+ self .triggers_result = self ._handle_results (triggers_success , triggers_result , query_msg = queries [ 6 ] )
2779
+ self .types_result = self ._handle_results (types_success , types_result , query_msg = queries [ 3 ] )
2780
+ self .functions_result = self ._handle_results (functions_success , functions_result , query_msg = queries [ 4 ] )
2781
+ self .aggregates_result = self ._handle_results (aggregates_success , aggregates_result , query_msg = queries [ 5 ] )
2782
+ self .indexes_result = self ._handle_results (indexes_success , indexes_result , query_msg = queries [ 7 ] )
2783
+ self .views_result = self ._handle_results (views_success , views_result , query_msg = queries [ 8 ] )
2784
+ self .scylla_result = self ._handle_results (scylla_success , scylla_result , expected_failures = (InvalidRequest ,), query_msg = queries [ 9 ] )
2765
2785
2766
2786
self ._aggregate_results ()
2767
2787
@@ -2814,8 +2834,8 @@ class SchemaParserV4(SchemaParserV3):
2814
2834
_SELECT_VIRTUAL_TABLES = 'SELECT * from system_virtual_schema.tables'
2815
2835
_SELECT_VIRTUAL_COLUMNS = 'SELECT * from system_virtual_schema.columns'
2816
2836
2817
- def __init__ (self , connection , timeout ):
2818
- super (SchemaParserV4 , self ).__init__ (connection , timeout )
2837
+ def __init__ (self , connection , timeout , fetch_size ):
2838
+ super (SchemaParserV4 , self ).__init__ (connection , timeout , fetch_size )
2819
2839
self .virtual_keyspaces_rows = defaultdict (list )
2820
2840
self .virtual_tables_rows = defaultdict (list )
2821
2841
self .virtual_columns_rows = defaultdict (lambda : defaultdict (list ))
@@ -2824,21 +2844,22 @@ def _query_all(self):
2824
2844
cl = ConsistencyLevel .ONE
2825
2845
# todo: this duplicates V3; we should find a way for _query_all methods
2826
2846
# to extend each other.
2847
+ fetch_size = self .fetch_size
2827
2848
queries = [
2828
2849
# copied from V3
2829
- QueryMessage (query = self ._SELECT_KEYSPACES , consistency_level = cl ),
2830
- QueryMessage (query = self ._SELECT_TABLES , consistency_level = cl ),
2831
- QueryMessage (query = self ._SELECT_COLUMNS , consistency_level = cl ),
2832
- QueryMessage (query = self ._SELECT_TYPES , consistency_level = cl ),
2833
- QueryMessage (query = self ._SELECT_FUNCTIONS , consistency_level = cl ),
2834
- QueryMessage (query = self ._SELECT_AGGREGATES , consistency_level = cl ),
2835
- QueryMessage (query = self ._SELECT_TRIGGERS , consistency_level = cl ),
2836
- QueryMessage (query = self ._SELECT_INDEXES , consistency_level = cl ),
2837
- QueryMessage (query = self ._SELECT_VIEWS , consistency_level = cl ),
2850
+ QueryMessage (query = self ._SELECT_KEYSPACES , fetch_size = fetch_size , consistency_level = cl ),
2851
+ QueryMessage (query = self ._SELECT_TABLES , fetch_size = fetch_size , consistency_level = cl ),
2852
+ QueryMessage (query = self ._SELECT_COLUMNS , fetch_size = fetch_size , consistency_level = cl ),
2853
+ QueryMessage (query = self ._SELECT_TYPES , fetch_size = fetch_size , consistency_level = cl ),
2854
+ QueryMessage (query = self ._SELECT_FUNCTIONS , fetch_size = fetch_size , consistency_level = cl ),
2855
+ QueryMessage (query = self ._SELECT_AGGREGATES , fetch_size = fetch_size , consistency_level = cl ),
2856
+ QueryMessage (query = self ._SELECT_TRIGGERS , fetch_size = fetch_size , consistency_level = cl ),
2857
+ QueryMessage (query = self ._SELECT_INDEXES , fetch_size = fetch_size , consistency_level = cl ),
2858
+ QueryMessage (query = self ._SELECT_VIEWS , fetch_size = fetch_size , consistency_level = cl ),
2838
2859
# V4-only queries
2839
- QueryMessage (query = self ._SELECT_VIRTUAL_KEYSPACES , consistency_level = cl ),
2840
- QueryMessage (query = self ._SELECT_VIRTUAL_TABLES , consistency_level = cl ),
2841
- QueryMessage (query = self ._SELECT_VIRTUAL_COLUMNS , consistency_level = cl )
2860
+ QueryMessage (query = self ._SELECT_VIRTUAL_KEYSPACES , fetch_size = fetch_size , consistency_level = cl ),
2861
+ QueryMessage (query = self ._SELECT_VIRTUAL_TABLES , fetch_size = fetch_size , consistency_level = cl ),
2862
+ QueryMessage (query = self ._SELECT_VIRTUAL_COLUMNS , fetch_size = fetch_size , consistency_level = cl )
2842
2863
]
2843
2864
2844
2865
responses = self .connection .wait_for_responses (
@@ -2861,29 +2882,29 @@ def _query_all(self):
2861
2882
) = responses
2862
2883
2863
2884
# copied from V3
2864
- self .keyspaces_result = self ._handle_results (ks_success , ks_result )
2865
- self .tables_result = self ._handle_results (table_success , table_result )
2866
- self .columns_result = self ._handle_results (col_success , col_result )
2867
- self .triggers_result = self ._handle_results (triggers_success , triggers_result )
2868
- self .types_result = self ._handle_results (types_success , types_result )
2869
- self .functions_result = self ._handle_results (functions_success , functions_result )
2870
- self .aggregates_result = self ._handle_results (aggregates_success , aggregates_result )
2871
- self .indexes_result = self ._handle_results (indexes_success , indexes_result )
2872
- self .views_result = self ._handle_results (views_success , views_result )
2885
+ self .keyspaces_result = self ._handle_results (ks_success , ks_result , query_msg = queries [ 0 ] )
2886
+ self .tables_result = self ._handle_results (table_success , table_result , query_msg = queries [ 1 ] )
2887
+ self .columns_result = self ._handle_results (col_success , col_result , query_msg = queries [ 2 ] )
2888
+ self .triggers_result = self ._handle_results (triggers_success , triggers_result , query_msg = queries [ 6 ] )
2889
+ self .types_result = self ._handle_results (types_success , types_result , query_msg = queries [ 3 ] )
2890
+ self .functions_result = self ._handle_results (functions_success , functions_result , query_msg = queries [ 4 ] )
2891
+ self .aggregates_result = self ._handle_results (aggregates_success , aggregates_result , query_msg = queries [ 5 ] )
2892
+ self .indexes_result = self ._handle_results (indexes_success , indexes_result , query_msg = queries [ 7 ] )
2893
+ self .views_result = self ._handle_results (views_success , views_result , query_msg = queries [ 8 ] )
2873
2894
# V4-only results
2874
2895
# These tables don't exist in some DSE versions reporting 4.X so we can
2875
2896
# ignore them if we got an error
2876
2897
self .virtual_keyspaces_result = self ._handle_results (
2877
2898
virtual_ks_success , virtual_ks_result ,
2878
- expected_failures = (InvalidRequest ,)
2899
+ expected_failures = (InvalidRequest ,), query_msg = queries [ 9 ]
2879
2900
)
2880
2901
self .virtual_tables_result = self ._handle_results (
2881
2902
virtual_table_success , virtual_table_result ,
2882
- expected_failures = (InvalidRequest ,)
2903
+ expected_failures = (InvalidRequest ,), query_msg = queries [ 10 ]
2883
2904
)
2884
2905
self .virtual_columns_result = self ._handle_results (
2885
2906
virtual_column_success , virtual_column_result ,
2886
- expected_failures = (InvalidRequest ,)
2907
+ expected_failures = (InvalidRequest ,), query_msg = queries [ 11 ]
2887
2908
)
2888
2909
2889
2910
self ._aggregate_results ()
@@ -2948,8 +2969,8 @@ class SchemaParserDSE68(SchemaParserDSE67):
2948
2969
2949
2970
_table_metadata_class = TableMetadataDSE68
2950
2971
2951
- def __init__ (self , connection , timeout ):
2952
- super (SchemaParserDSE68 , self ).__init__ (connection , timeout )
2972
+ def __init__ (self , connection , timeout , fetch_size ):
2973
+ super (SchemaParserDSE68 , self ).__init__ (connection , timeout , fetch_size )
2953
2974
self .keyspace_table_vertex_rows = defaultdict (lambda : defaultdict (list ))
2954
2975
self .keyspace_table_edge_rows = defaultdict (lambda : defaultdict (list ))
2955
2976
@@ -3314,21 +3335,21 @@ def __init__(
3314
3335
self .to_clustering_columns = to_clustering_columns
3315
3336
3316
3337
3317
- def get_schema_parser (connection , server_version , dse_version , timeout ):
3338
+ def get_schema_parser (connection , server_version , dse_version , timeout , fetch_size = None ):
3318
3339
version = Version (server_version )
3319
3340
if dse_version :
3320
3341
v = Version (dse_version )
3321
3342
if v >= Version ('6.8.0' ):
3322
- return SchemaParserDSE68 (connection , timeout )
3343
+ return SchemaParserDSE68 (connection , timeout , fetch_size )
3323
3344
elif v >= Version ('6.7.0' ):
3324
- return SchemaParserDSE67 (connection , timeout )
3345
+ return SchemaParserDSE67 (connection , timeout , fetch_size )
3325
3346
elif v >= Version ('6.0.0' ):
3326
- return SchemaParserDSE60 (connection , timeout )
3347
+ return SchemaParserDSE60 (connection , timeout , fetch_size )
3327
3348
3328
3349
if version >= Version ('4-a' ):
3329
- return SchemaParserV4 (connection , timeout )
3350
+ return SchemaParserV4 (connection , timeout , fetch_size )
3330
3351
elif version >= Version ('3.0.0' ):
3331
- return SchemaParserV3 (connection , timeout )
3352
+ return SchemaParserV3 (connection , timeout , fetch_size )
3332
3353
else :
3333
3354
# we could further specialize by version. Right now just refactoring the
3334
3355
# multi-version parser we have as of C* 2.2.0rc1.
0 commit comments