diff --git a/build.xml b/build.xml index 5a2feff6b2..97d0efd983 100644 --- a/build.xml +++ b/build.xml @@ -35,7 +35,6 @@ - @@ -168,7 +167,6 @@ - @@ -356,16 +354,8 @@ - - - - - - - - @@ -412,9 +402,6 @@ - - @@ -463,7 +450,6 @@ - @@ -573,48 +559,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -710,10 +654,6 @@ - - - - @@ -879,7 +819,7 @@ - + diff --git a/lib/avro-1.4.0-fixes.jar b/lib/avro-1.4.0-fixes.jar deleted file mode 100644 index 6733756d39..0000000000 Binary files a/lib/avro-1.4.0-fixes.jar and /dev/null differ diff --git a/lib/avro-1.4.0-sources-fixes.jar b/lib/avro-1.4.0-sources-fixes.jar deleted file mode 100644 index 2b6e2cbf02..0000000000 Binary files a/lib/avro-1.4.0-sources-fixes.jar and /dev/null differ diff --git a/lib/licenses/avro-1.4.0.txt b/lib/licenses/avro-1.4.0.txt deleted file mode 100644 index d645695673..0000000000 --- a/lib/licenses/avro-1.4.0.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - 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. diff --git a/src/avro/internode.genavro b/src/avro/internode.genavro deleted file mode 100644 index d7ba60f926..0000000000 --- a/src/avro/internode.genavro +++ /dev/null @@ -1,131 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ - -/** - * Cassandra internal/internode communication protocol - * - * NOTE: in order to maintain backwards compatibility you *must* - * only append new fields *and* they must have a default value. - */ -@namespace("org.apache.cassandra") - -protocol InterNode { - @aliases(["org.apache.cassandra.config.avro.IndexType"]) - @namespace("org.apache.cassandra.db.migration.avro") - enum IndexType { - KEYS, - CUSTOM - } - - @aliases(["org.apache.cassandra.config.avro.ColumnDef"]) - @namespace("org.apache.cassandra.db.migration.avro") - record ColumnDef { - bytes name; - string validation_class; - union { IndexType, null } index_type; - union { string, null } index_name; - union { null, map } index_options = null; - } - - @aliases(["org.apache.cassandra.config.avro.CfDef"]) - @namespace("org.apache.cassandra.db.migration.avro") - record CfDef { - string keyspace; - string name; - union { string, null } column_type; - union { string, null } comparator_type; - union { string, null } subcomparator_type; - union { string, null } comment; - union { double, null } read_repair_chance; - boolean replicate_on_write = false; - union { int, null } gc_grace_seconds; - union { null, string } default_validation_class = null; - union { null, string } key_validation_class = null; - union { null, int } min_compaction_threshold = null; - union { null, int } max_compaction_threshold = null; - union { null, double} merge_shards_chance = null; - union { int, null } id; - union { array, null } column_metadata; - union { null, bytes } key_alias = null; - union { null, string } compaction_strategy = null; - union { null, map } compaction_strategy_options = null; - union { null, map } compression_options = null; - union { null, double } bloom_filter_fp_chance = null; - union { null, string } caching = null; - union { null, array } column_aliases = null; - union { null, bytes } value_alias = null; - union { double, null } dclocal_read_repair_chance = 0.0; - union { double, null } row_cache_size; - union { double, null } key_cache_size; - } - - @aliases(["org.apache.cassandra.config.avro.KsDef"]) - @namespace("org.apache.cassandra.db.migration.avro") - record KsDef { - string name; - string strategy_class; - union{ map, null } strategy_options; - union{ int, null } replication_factor; - array cf_defs; - boolean durable_writes = true; - } - - @namespace("org.apache.cassandra.utils.avro") - fixed UUID(16); - - @namespace("org.apache.cassandra.db.migration.avro") - record AddColumnFamily { - CfDef cf; - } - - @namespace("org.apache.cassandra.db.migration.avro") - record AddKeyspace { - KsDef ks; - } - - @namespace("org.apache.cassandra.db.migration.avro") - record DropColumnFamily { - string ksname; - string cfname; - } - - @namespace("org.apache.cassandra.db.migration.avro") - record DropKeyspace { - string ksname; - } - - @namespace("org.apache.cassandra.db.migration.avro") - record UpdateKeyspace { - KsDef oldKs; - KsDef newKs; - } - - @namespace("org.apache.cassandra.db.migration.avro") - record UpdateColumnFamily { - CfDef metadata; - } - - @namespace("org.apache.cassandra.db.migration.avro") - record Migration { - org.apache.cassandra.utils.avro.UUID old_version; - org.apache.cassandra.utils.avro.UUID new_version; - bytes row_mutation; - string classname; - union { AddColumnFamily,DropColumnFamily,AddKeyspace,DropKeyspace,UpdateKeyspace,UpdateColumnFamily } migration; - } -} diff --git a/src/java/org/apache/cassandra/config/Avro.java b/src/java/org/apache/cassandra/config/Avro.java deleted file mode 100644 index c712e07389..0000000000 --- a/src/java/org/apache/cassandra/config/Avro.java +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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. - */ -package org.apache.cassandra.config; - -import java.nio.ByteBuffer; -import java.util.*; - -import org.apache.cassandra.db.ColumnFamilyType; -import org.apache.cassandra.db.marshal.AbstractType; -import org.apache.cassandra.db.marshal.BytesType; -import org.apache.cassandra.db.marshal.CompositeType; -import org.apache.cassandra.db.marshal.TypeParser; -import org.apache.cassandra.db.migration.avro.CfDef; -import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.exceptions.RequestValidationException; -import org.apache.cassandra.io.compress.CompressionParameters; -import org.apache.cassandra.locator.AbstractReplicationStrategy; -import org.apache.cassandra.locator.NetworkTopologyStrategy; -import org.apache.cassandra.thrift.IndexType; -import org.apache.cassandra.utils.ByteBufferUtil; - -import static org.apache.cassandra.config.CFMetaData.Caching; - -/** - * methods to load schema definitions from old-style Avro serialization - */ -public class Avro -{ - @Deprecated - public static KSMetaData ksFromAvro(org.apache.cassandra.db.migration.avro.KsDef ks) - { - Class repStratClass; - try - { - String strategyClassName = KSMetaData.convertOldStrategyName(ks.strategy_class.toString()); - repStratClass = (Class)Class.forName(strategyClassName); - } - catch (Exception ex) - { - throw new RuntimeException("Could not create ReplicationStrategy of type " + ks.strategy_class, ex); - } - - Map strategyOptions = new HashMap(); - if (ks.strategy_options != null) - { - for (Map.Entry e : ks.strategy_options.entrySet()) - { - String name = e.getKey().toString(); - // Silently discard a replication_factor option to NTS. - // The history is, people were creating CFs with the default settings (which in the CLI is NTS) and then - // giving it a replication_factor option, which is nonsensical. Initially our strategy was to silently - // ignore this option, but that turned out to confuse people more. So in 0.8.2 we switched to throwing - // an exception in the NTS constructor, which would be turned into an InvalidRequestException for the - // client. But, it also prevented startup for anyone upgrading without first cleaning that option out. - if (repStratClass == NetworkTopologyStrategy.class && name.trim().toLowerCase().equals("replication_factor")) - continue; - strategyOptions.put(name, e.getValue().toString()); - } - } - maybeAddReplicationFactor(strategyOptions, ks.strategy_class.toString(), ks.replication_factor); - - int cfsz = ks.cf_defs.size(); - List cfMetaData = new ArrayList(cfsz); - - for (CfDef cf_def : ks.cf_defs) - { - double keysCached = cf_def.key_cache_size == null ? -1 : cf_def.key_cache_size; - double rowsCached = cf_def.row_cache_size == null ? -1 : cf_def.row_cache_size; - - if (keysCached > 0 && rowsCached > 0) - cf_def.caching = Caching.ALL.name(); - else if (keysCached <= 0 && rowsCached <= 0) - cf_def.caching = Caching.NONE.name(); - else if (keysCached > 0 && rowsCached <= 0) - cf_def.caching = Caching.KEYS_ONLY.name(); - else - cf_def.caching = Caching.ROWS_ONLY.name(); - - cfMetaData.add(cfFromAvro(cf_def)); - } - - return new KSMetaData(ks.name.toString(), repStratClass, strategyOptions, ks.durable_writes, cfMetaData); - } - - @Deprecated - private static void maybeAddReplicationFactor(Map options, String cls, Integer rf) - { - if (rf != null && (cls.endsWith("SimpleStrategy") || cls.endsWith("OldNetworkTopologyStrategy"))) - options.put("replication_factor", rf.toString()); - } - - @Deprecated - public static CFMetaData cfFromAvro(CfDef cf) - { - AbstractType comparator; - AbstractType subcolumnComparator = null; - AbstractType validator; - AbstractType keyValidator; - - try - { - comparator = TypeParser.parse(cf.comparator_type.toString()); - if (cf.subcomparator_type != null) - subcolumnComparator = TypeParser.parse(cf.subcomparator_type); - validator = TypeParser.parse(cf.default_validation_class); - keyValidator = TypeParser.parse(cf.key_validation_class); - } - catch (Exception ex) - { - throw new RuntimeException("Could not inflate CFMetaData for " + cf, ex); - } - Map column_metadata = new TreeMap(BytesType.instance); - for (org.apache.cassandra.db.migration.avro.ColumnDef aColumn_metadata : cf.column_metadata) - { - ColumnDefinition cd = columnFromAvro(aColumn_metadata); - if (cd.getIndexType() != null && cd.getIndexName() == null) - cd.setIndexName(CFMetaData.getDefaultIndexName(cf.name.toString(), comparator, cd.name)); - column_metadata.put(cd.name, cd); - } - - CFMetaData newCFMD = new CFMetaData(cf.keyspace.toString(), - cf.name.toString(), - ColumnFamilyType.create(cf.column_type.toString()), - comparator, - subcolumnComparator); - - // When we pull up an old avro CfDef which doesn't have these arguments, - // it doesn't default them correctly. Without explicit defaulting, - // grandfathered metadata becomes wrong or causes crashes. - // Isn't AVRO supposed to handle stuff like this? - if (cf.min_compaction_threshold != null) { newCFMD.minCompactionThreshold(cf.min_compaction_threshold); } - if (cf.max_compaction_threshold != null) { newCFMD.maxCompactionThreshold(cf.max_compaction_threshold); } - - if (cf.key_alias != null) - newCFMD.addOrReplaceColumnDefinition(ColumnDefinition.partitionKeyDef(cf.key_alias, keyValidator, null)); - if (cf.column_aliases != null) - { - if (comparator instanceof CompositeType) - { - List> components = ((CompositeType)comparator).types; - for (int i = 0; i < cf.column_aliases.size(); ++i) - if (cf.column_aliases.get(i) != null) - newCFMD.addOrReplaceColumnDefinition(ColumnDefinition.clusteringKeyDef(cf.column_aliases.get(i), components.get(i), i)); - } - else - { - assert cf.column_aliases.size() <= 1; - if (cf.column_aliases.get(0) != null) - newCFMD.addOrReplaceColumnDefinition(ColumnDefinition.clusteringKeyDef(cf.column_aliases.get(0), comparator, null)); - } - } - if (cf.value_alias != null) - newCFMD.addOrReplaceColumnDefinition(ColumnDefinition.compactValueDef(cf.value_alias, validator)); - - if (cf.compaction_strategy != null) - { - try - { - newCFMD.compactionStrategyClass = CFMetaData.createCompactionStrategy(cf.compaction_strategy.toString()); - } - catch (ConfigurationException e) - { - throw new RuntimeException(e); - } - } - if (cf.compaction_strategy_options != null) - { - for (Map.Entry e : cf.compaction_strategy_options.entrySet()) - newCFMD.compactionStrategyOptions.put(e.getKey().toString(), e.getValue().toString()); - } - - CompressionParameters cp; - try - { - cp = CompressionParameters.create(cf.compression_options); - } - catch (ConfigurationException e) - { - throw new RuntimeException(e); - } - - CFMetaData.Caching caching; - - try - { - caching = cf.caching == null ? CFMetaData.DEFAULT_CACHING_STRATEGY : CFMetaData.Caching.fromString(cf.caching.toString()); - } - catch (ConfigurationException e) - { - throw new RuntimeException(e); - } - - return newCFMD.comment(cf.comment.toString()) - .readRepairChance(cf.read_repair_chance) - .dcLocalReadRepairChance(cf.dclocal_read_repair_chance) - .replicateOnWrite(cf.replicate_on_write) - .gcGraceSeconds(cf.gc_grace_seconds) - .defaultValidator(validator) - .keyValidator(keyValidator) - .columnMetadata(column_metadata) - .compressionParameters(cp) - .bloomFilterFpChance(cf.bloom_filter_fp_chance) - .caching(caching); - } - - @Deprecated - public static ColumnDefinition columnFromAvro(org.apache.cassandra.db.migration.avro.ColumnDef cd) - { - IndexType index_type = cd.index_type == null ? null : Enum.valueOf(IndexType.class, cd.index_type.name()); - String index_name = cd.index_name == null ? null : cd.index_name.toString(); - try - { - AbstractType validatorType = TypeParser.parse(cd.validation_class); - ColumnDefinition def = ColumnDefinition.regularDef(ByteBufferUtil.clone(cd.name), validatorType, null); - def.setIndexName(index_name); - def.setIndexType(index_type, getStringMap(cd.index_options)); - return def; - } - catch (RequestValidationException e) - { - throw new RuntimeException(e); - } - } - - public static Map getStringMap(Map charMap) - { - if (charMap == null) - return null; - - Map stringMap = new HashMap(); - - for (Map.Entry entry : charMap.entrySet()) - stringMap.put(entry.getKey().toString(), entry.getValue().toString()); - - - return stringMap; - } -} diff --git a/src/java/org/apache/cassandra/db/DefsTable.java b/src/java/org/apache/cassandra/db/DefsTable.java index 482f2f955c..df551e04a4 100644 --- a/src/java/org/apache/cassandra/db/DefsTable.java +++ b/src/java/org/apache/cassandra/db/DefsTable.java @@ -21,23 +21,15 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.util.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.google.common.collect.Iterables; import com.google.common.collect.MapDifference; import com.google.common.collect.Maps; -import org.apache.avro.io.BinaryDecoder; -import org.apache.avro.io.DecoderFactory; -import org.apache.avro.specific.SpecificDatumReader; -import org.apache.avro.specific.SpecificRecord; import org.apache.cassandra.config.*; import org.apache.cassandra.db.compaction.CompactionManager; import org.apache.cassandra.db.filter.QueryFilter; import org.apache.cassandra.db.marshal.AsciiType; import org.apache.cassandra.db.marshal.UTF8Type; -import org.apache.cassandra.db.migration.avro.KsDef; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.service.MigrationManager; @@ -113,18 +105,6 @@ import org.apache.cassandra.utils.FBUtilities; */ public class DefsTable { - private final static Logger logger = LoggerFactory.getLogger(DefsTable.class); - - // unbuffered decoders - private final static DecoderFactory DIRECT_DECODERS = new DecoderFactory().configureDirectDecoder(true); - - // column name for the schema storing serialized keyspace definitions - // NB: must be an invalid keyspace name - public static final ByteBuffer DEFINITION_SCHEMA_COLUMN_NAME = ByteBufferUtil.bytes("Avro/Schema"); - - public static final String OLD_MIGRATIONS_CF = "Migrations"; - public static final String OLD_SCHEMA_CF = "Schema"; - /* saves keyspace definitions to system schema columnfamilies */ public static synchronized void save(Collection keyspaces) { @@ -175,55 +155,6 @@ public class DefsTable return new Row(ksNameKey, cfsStore.getColumnFamily(QueryFilter.getIdentityFilter(ksNameKey, SystemTable.SCHEMA_COLUMNFAMILIES_CF))); } - /** - * Loads a version of keyspace definitions from storage (using old SCHEMA_CF as a data source) - * Note: If definitions where found in SCHEMA_CF this method would load them into new schema handling table KEYSPACE_CF - * - * @param version The version of the latest migration. - * - * @return Collection of found keyspace definitions - * - * @throws IOException if failed to read SCHEMA_CF or failed to deserialize Avro schema - */ - public static synchronized Collection loadFromStorage(UUID version) throws IOException - { - DecoratedKey vkey = StorageService.getPartitioner().decorateKey(toUTF8Bytes(version)); - Table defs = Table.open(Table.SYSTEM_KS); - ColumnFamilyStore cfStore = defs.getColumnFamilyStore(OLD_SCHEMA_CF); - ColumnFamily cf = cfStore.getColumnFamily(QueryFilter.getIdentityFilter(vkey, OLD_SCHEMA_CF)); - Column avroschema = cf.getColumn(DEFINITION_SCHEMA_COLUMN_NAME); - - Collection keyspaces = Collections.emptyList(); - - if (avroschema != null) - { - ByteBuffer value = avroschema.value(); - org.apache.avro.Schema schema = org.apache.avro.Schema.parse(ByteBufferUtil.string(value)); - - // deserialize keyspaces using schema - keyspaces = new ArrayList(Iterables.size(cf)); - - for (Column column : cf) - { - if (column.name().equals(DEFINITION_SCHEMA_COLUMN_NAME)) - continue; - KsDef ks = deserializeAvro(schema, column.value(), new KsDef()); - keyspaces.add(Avro.ksFromAvro(ks)); - } - - // store deserialized keyspaces into new place - save(keyspaces); - - flushSchemaCFs(); - - logger.info("Truncating deprecated system column families (migrations, schema)..."); - dropColumnFamily(Table.SYSTEM_KS, OLD_MIGRATIONS_CF); - dropColumnFamily(Table.SYSTEM_KS, OLD_SCHEMA_CF); - } - - return keyspaces; - } - /** * Merge remote schema in form of row mutations with local and mutate ks/cf metadata objects * (which also involves fs operations on add/drop ks/cf) @@ -528,28 +459,4 @@ public class DefsTable { FBUtilities.waitOnFuture(SystemTable.schemaCFS(cfName).forceFlush()); } - - private static ByteBuffer toUTF8Bytes(UUID version) - { - return ByteBufferUtil.bytes(version.toString()); - } - - /** - * Deserialize a single object based on the given Schema. - * - * @param writer writer's schema - * @param bytes Array to deserialize from - * @param ob An empty object to deserialize into (must not be null). - * - * @return serialized Avro object - * - * @throws IOException if deserialization failed - */ - public static T deserializeAvro(org.apache.avro.Schema writer, ByteBuffer bytes, T ob) throws IOException - { - BinaryDecoder dec = DIRECT_DECODERS.createBinaryDecoder(ByteBufferUtil.getArray(bytes), null); - SpecificDatumReader reader = new SpecificDatumReader(writer); - reader.setExpected(ob.getSchema()); - return reader.read(ob, dec); - } } diff --git a/test/unit/org/apache/cassandra/config/CFMetaDataTest.java b/test/unit/org/apache/cassandra/config/CFMetaDataTest.java index 162177677e..3627cd82b8 100644 --- a/test/unit/org/apache/cassandra/config/CFMetaDataTest.java +++ b/test/unit/org/apache/cassandra/config/CFMetaDataTest.java @@ -64,7 +64,7 @@ public class CFMetaDataTest extends SchemaLoader } @Test - public void testThriftToAvroConversion() throws Exception + public void testThriftConversion() throws Exception { CfDef cfDef = new CfDef().setDefault_validation_class(AsciiType.class.getCanonicalName()) .setComment("Test comment") @@ -75,7 +75,6 @@ public class CFMetaDataTest extends SchemaLoader // convert Thrift to CFMetaData CFMetaData cfMetaData = CFMetaData.fromThrift(cfDef); - // make a correct Avro object CfDef thriftCfDef = new CfDef(); thriftCfDef.keyspace = KEYSPACE; thriftCfDef.name = COLUMN_FAMILY; diff --git a/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java b/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java index 4433b574a9..ee14ab5dbf 100644 --- a/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java +++ b/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java @@ -58,7 +58,6 @@ public class DatabaseDescriptorTest for (KSMetaData ksm : Schema.instance.getTableDefinitions()) { // Not testing round-trip on the KsDef via serDe() because maps - // cannot be compared in avro. KSMetaData ksmDupe = KSMetaData.fromThrift(ksm.toThrift()); assert ksmDupe != null; assert ksmDupe.equals(ksm);