156 lines
6.5 KiB
Python
156 lines
6.5 KiB
Python
# Copyright 2013-2016 DataStax, Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
import copy
|
|
from mock import patch
|
|
import six
|
|
|
|
from cassandra.cqlengine import columns
|
|
from cassandra.cqlengine.management import drop_table, sync_table, _get_table_metadata, _update_options
|
|
from cassandra.cqlengine.models import Model
|
|
|
|
from tests.integration.cqlengine.base import BaseCassEngTestCase
|
|
|
|
|
|
class LeveledCompactionTestTable(Model):
|
|
|
|
__options__ = {'compaction': {'class': 'org.apache.cassandra.db.compaction.LeveledCompactionStrategy',
|
|
'sstable_size_in_mb': '64'}}
|
|
|
|
user_id = columns.UUID(primary_key=True)
|
|
name = columns.Text()
|
|
|
|
|
|
class AlterTableTest(BaseCassEngTestCase):
|
|
|
|
def test_alter_is_called_table(self):
|
|
drop_table(LeveledCompactionTestTable)
|
|
sync_table(LeveledCompactionTestTable)
|
|
with patch('cassandra.cqlengine.management._update_options') as mock:
|
|
sync_table(LeveledCompactionTestTable)
|
|
assert mock.called == 1
|
|
|
|
def test_compaction_not_altered_without_changes_leveled(self):
|
|
|
|
class LeveledCompactionChangesDetectionTest(Model):
|
|
|
|
__options__ = {'compaction': {'class': 'org.apache.cassandra.db.compaction.LeveledCompactionStrategy',
|
|
'sstable_size_in_mb': '160',
|
|
'tombstone_threshold': '0.125',
|
|
'tombstone_compaction_interval': '3600'}}
|
|
pk = columns.Integer(primary_key=True)
|
|
|
|
drop_table(LeveledCompactionChangesDetectionTest)
|
|
sync_table(LeveledCompactionChangesDetectionTest)
|
|
|
|
self.assertFalse(_update_options(LeveledCompactionChangesDetectionTest))
|
|
|
|
def test_compaction_not_altered_without_changes_sizetiered(self):
|
|
class SizeTieredCompactionChangesDetectionTest(Model):
|
|
|
|
__options__ = {'compaction': {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy',
|
|
'bucket_high': '20',
|
|
'bucket_low': '10',
|
|
'max_threshold': '200',
|
|
'min_threshold': '100',
|
|
'min_sstable_size': '1000',
|
|
'tombstone_threshold': '0.125',
|
|
'tombstone_compaction_interval': '3600'}}
|
|
pk = columns.Integer(primary_key=True)
|
|
|
|
drop_table(SizeTieredCompactionChangesDetectionTest)
|
|
sync_table(SizeTieredCompactionChangesDetectionTest)
|
|
|
|
self.assertFalse(_update_options(SizeTieredCompactionChangesDetectionTest))
|
|
|
|
def test_alter_actually_alters(self):
|
|
tmp = copy.deepcopy(LeveledCompactionTestTable)
|
|
drop_table(tmp)
|
|
sync_table(tmp)
|
|
tmp.__options__ = {'compaction': {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'}}
|
|
sync_table(tmp)
|
|
|
|
table_meta = _get_table_metadata(tmp)
|
|
|
|
self.assertRegexpMatches(table_meta.export_as_string(), '.*SizeTieredCompactionStrategy.*')
|
|
|
|
def test_alter_options(self):
|
|
|
|
class AlterTable(Model):
|
|
|
|
__options__ = {'compaction': {'class': 'org.apache.cassandra.db.compaction.LeveledCompactionStrategy',
|
|
'sstable_size_in_mb': '64'}}
|
|
user_id = columns.UUID(primary_key=True)
|
|
name = columns.Text()
|
|
|
|
drop_table(AlterTable)
|
|
sync_table(AlterTable)
|
|
table_meta = _get_table_metadata(AlterTable)
|
|
self.assertRegexpMatches(table_meta.export_as_string(), ".*'sstable_size_in_mb': '64'.*")
|
|
AlterTable.__options__['compaction']['sstable_size_in_mb'] = '128'
|
|
sync_table(AlterTable)
|
|
table_meta = _get_table_metadata(AlterTable)
|
|
self.assertRegexpMatches(table_meta.export_as_string(), ".*'sstable_size_in_mb': '128'.*")
|
|
|
|
|
|
class OptionsTest(BaseCassEngTestCase):
|
|
|
|
def _verify_options(self, table_meta, expected_options):
|
|
cql = table_meta.export_as_string()
|
|
|
|
for name, value in expected_options.items():
|
|
if isinstance(value, six.string_types):
|
|
self.assertIn("%s = '%s'" % (name, value), cql)
|
|
else:
|
|
start = cql.find("%s = {" % (name,))
|
|
end = cql.find('}', start)
|
|
for subname, subvalue in value.items():
|
|
attr = "'%s': '%s'" % (subname, subvalue)
|
|
found_at = cql.find(attr, start)
|
|
self.assertTrue(found_at > start)
|
|
self.assertTrue(found_at < end)
|
|
|
|
def test_all_size_tiered_options(self):
|
|
class AllSizeTieredOptionsModel(Model):
|
|
__options__ = {'compaction': {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy',
|
|
'bucket_low': '.3',
|
|
'bucket_high': '2',
|
|
'min_threshold': '2',
|
|
'max_threshold': '64',
|
|
'tombstone_compaction_interval': '86400'}}
|
|
|
|
cid = columns.UUID(primary_key=True)
|
|
name = columns.Text()
|
|
|
|
drop_table(AllSizeTieredOptionsModel)
|
|
sync_table(AllSizeTieredOptionsModel)
|
|
|
|
table_meta = _get_table_metadata(AllSizeTieredOptionsModel)
|
|
self._verify_options(table_meta, AllSizeTieredOptionsModel.__options__)
|
|
|
|
def test_all_leveled_options(self):
|
|
|
|
class AllLeveledOptionsModel(Model):
|
|
__options__ = {'compaction': {'class': 'org.apache.cassandra.db.compaction.LeveledCompactionStrategy',
|
|
'sstable_size_in_mb': '64'}}
|
|
|
|
cid = columns.UUID(primary_key=True)
|
|
name = columns.Text()
|
|
|
|
drop_table(AllLeveledOptionsModel)
|
|
sync_table(AllLeveledOptionsModel)
|
|
|
|
table_meta = _get_table_metadata(AllLeveledOptionsModel)
|
|
self._verify_options(table_meta, AllLeveledOptionsModel.__options__)
|