From 26217071280f909f81fc3711df406a572b547c58 Mon Sep 17 00:00:00 2001 From: Aleksey Yeschenko Date: Tue, 18 Feb 2014 06:50:15 +0300 Subject: [PATCH 001/557] Remove CQL2 patch by Aleksey Yeschenko; reviewed by Jonathan Ellis for CASSANDRA-5918 --- CHANGES.txt | 4 + NEWS.txt | 9 + build.xml | 21 +- doc/cql/CQL.css | 48 - doc/cql/CQL.textile | 712 -------------- interface/cassandra.thrift | 8 +- .../apache/cassandra/thrift/Cassandra.java | 6 +- .../cassandra/thrift/cassandraConstants.java | 2 +- pylib/cqlshlib/helptopics.py | 3 +- .../apache/cassandra/config/CFMetaData.java | 11 - .../cassandra/config/ColumnDefinition.java | 2 +- .../cassandra/cql/AbstractModification.java | 126 --- .../cassandra/cql/AlterTableStatement.java | 202 ---- .../org/apache/cassandra/cql/Attributes.java | 76 -- .../apache/cassandra/cql/BatchStatement.java | 104 -- .../org/apache/cassandra/cql/CFPropDefs.java | 307 ------ .../apache/cassandra/cql/CQLStatement.java | 32 - src/java/org/apache/cassandra/cql/Cql.g | 656 ------------- .../cql/CreateColumnFamilyStatement.java | 253 ----- .../cassandra/cql/CreateIndexStatement.java | 51 - .../cql/CreateKeyspaceStatement.java | 80 -- .../apache/cassandra/cql/DeleteStatement.java | 123 --- .../cassandra/cql/DropIndexStatement.java | 80 -- .../org/apache/cassandra/cql/Operation.java | 55 -- .../apache/cassandra/cql/QueryProcessor.java | 913 ------------------ .../org/apache/cassandra/cql/Relation.java | 86 -- .../cassandra/cql/SelectExpression.java | 164 ---- .../apache/cassandra/cql/SelectStatement.java | 188 ---- .../apache/cassandra/cql/StatementType.java | 32 - src/java/org/apache/cassandra/cql/Term.java | 208 ---- .../apache/cassandra/cql/UpdateStatement.java | 288 ------ .../org/apache/cassandra/cql/WhereClause.java | 192 ---- .../cassandra/cql/hooks/ExecutionContext.java | 48 - .../cql/hooks/PostPreparationHook.java | 38 - .../cassandra/cql/hooks/PreExecutionHook.java | 46 - .../cql/hooks/PreparationContext.java | 39 - .../apache/cassandra/cql3/QueryProcessor.java | 1 - .../apache/cassandra/db/composites/CType.java | 6 +- .../cassandra/db/composites/CellNameType.java | 2 +- .../cassandra/db/marshal/AbstractType.java | 6 - .../cassandra/db/marshal/TimeUUIDType.java | 35 - .../apache/cassandra/db/marshal/UUIDType.java | 41 +- .../apache/cassandra/service/ClientState.java | 45 +- .../cassandra/thrift/CassandraServer.java | 165 +--- .../cassandra/thrift/ThriftClientState.java | 18 - .../transport/messages/StartupMessage.java | 11 +- .../cassandra/triggers/TriggerExecutor.java | 7 +- .../org/apache/cassandra/utils/UUIDGen.java | 21 - .../apache/cassandra/stress/Operation.java | 4 - .../stress/operations/CqlCounterAdder.java | 7 +- .../stress/operations/CqlCounterGetter.java | 16 +- .../operations/CqlIndexedRangeSlicer.java | 15 +- .../stress/operations/CqlInserter.java | 9 +- .../stress/operations/CqlOperation.java | 61 +- .../stress/operations/CqlRangeSlicer.java | 8 +- .../stress/operations/CqlReader.java | 9 +- .../cassandra/stress/settings/CqlVersion.java | 8 - .../cassandra/stress/settings/Legacy.java | 5 +- .../stress/settings/SettingsMode.java | 24 +- 59 files changed, 74 insertions(+), 5663 deletions(-) delete mode 100644 doc/cql/CQL.css delete mode 100644 doc/cql/CQL.textile delete mode 100644 src/java/org/apache/cassandra/cql/AbstractModification.java delete mode 100644 src/java/org/apache/cassandra/cql/AlterTableStatement.java delete mode 100644 src/java/org/apache/cassandra/cql/Attributes.java delete mode 100644 src/java/org/apache/cassandra/cql/BatchStatement.java delete mode 100644 src/java/org/apache/cassandra/cql/CFPropDefs.java delete mode 100644 src/java/org/apache/cassandra/cql/CQLStatement.java delete mode 100644 src/java/org/apache/cassandra/cql/Cql.g delete mode 100644 src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java delete mode 100644 src/java/org/apache/cassandra/cql/CreateIndexStatement.java delete mode 100644 src/java/org/apache/cassandra/cql/CreateKeyspaceStatement.java delete mode 100644 src/java/org/apache/cassandra/cql/DeleteStatement.java delete mode 100644 src/java/org/apache/cassandra/cql/DropIndexStatement.java delete mode 100644 src/java/org/apache/cassandra/cql/Operation.java delete mode 100644 src/java/org/apache/cassandra/cql/QueryProcessor.java delete mode 100644 src/java/org/apache/cassandra/cql/Relation.java delete mode 100644 src/java/org/apache/cassandra/cql/SelectExpression.java delete mode 100644 src/java/org/apache/cassandra/cql/SelectStatement.java delete mode 100644 src/java/org/apache/cassandra/cql/StatementType.java delete mode 100644 src/java/org/apache/cassandra/cql/Term.java delete mode 100644 src/java/org/apache/cassandra/cql/UpdateStatement.java delete mode 100644 src/java/org/apache/cassandra/cql/WhereClause.java delete mode 100644 src/java/org/apache/cassandra/cql/hooks/ExecutionContext.java delete mode 100644 src/java/org/apache/cassandra/cql/hooks/PostPreparationHook.java delete mode 100644 src/java/org/apache/cassandra/cql/hooks/PreExecutionHook.java delete mode 100644 src/java/org/apache/cassandra/cql/hooks/PreparationContext.java diff --git a/CHANGES.txt b/CHANGES.txt index efc54f8034e0..755dd9a85d71 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,3 +1,7 @@ +3.0 + * Remove CQL2 (CASSANDRA-5918) + + 2.1.0-beta2 * Fix ABTC NPE (CASSANDRA-6692) * Allow nodetool to use a file or prompt for password (CASSANDRA-6660) diff --git a/NEWS.txt b/NEWS.txt index 865830cde681..b2d83778e8a6 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -13,6 +13,15 @@ restore snapshots created with the previous major version using the 'sstableloader' tool. You can upgrade the file format of your snapshots using the provided 'sstableupgrade' tool. +3.0 +=== + +Upgrading +--------- + - CQL2 has been removed entirely in this release (previously deprecated + in 2.0.0). Please switch to CQL3 if you haven't already done so. + + 2.1 === diff --git a/build.xml b/build.xml index 7afe3bfe7703..3a5f8bde4f58 100644 --- a/build.xml +++ b/build.xml @@ -202,28 +202,12 @@ - - - - - Building Grammar ${build.src.java}/org/apache/cassandra/cql/Cql.g ... - - - - - - Building Grammar ${build.src.java}/org/apache/cassandra/cql3/Cql.g ... - - - @@ -672,7 +653,7 @@ depends="maven-ant-tasks-retrieve-build,build-project" description="Compile Cassandra classes"/> - diff --git a/doc/cql/CQL.css b/doc/cql/CQL.css deleted file mode 100644 index 2e4a41c0d8f9..000000000000 --- a/doc/cql/CQL.css +++ /dev/null @@ -1,48 +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. - * - */ - -/* Just a sample of some things that might be helpful in rendering CQL.html */ - -pre.sample { - padding: 1ex; - border: 1px solid black; - background-color: #ffe0e0; -} -pre.syntax { - padding: 1ex; - border: 1px solid black; - background-color: #e0e0ff; -} -table { - width: 80%; - border-collapse: collapse; - border: 1px solid black; -} -td { - padding: 2px 1ex; - border: 1px solid black; -} -body { - background-color: white; -} -h2 { - margin-top: 3em; -} diff --git a/doc/cql/CQL.textile b/doc/cql/CQL.textile deleted file mode 100644 index 1cfe8834f920..000000000000 --- a/doc/cql/CQL.textile +++ /dev/null @@ -1,712 +0,0 @@ -==== - -h1. Cassandra Query Language (CQL) v2.0 - -h2. Table of Contents - -{toc} - -h2. Syntax conventions - -To aid in specifying the CQL syntax, we will use the following conventions in this document: - -* Language rules will be given in a BNF(Backus-Naur Form)-like notation, looking like this: - -bc(syntax). - ::= * - ; - -* Nonterminal symbols in syntax rules will have @@. -* Terminal symbols will be shown in @"single quotes"@. -* As an additional shortcut notation to BNF, optional symbols (that can occur zero or one times) will be followed by a @?@ marker. Optional symbols that can occur zero or any number of times will be followed by a @*@ marker. Multiple symbols may be grouped together in @(parentheses)@ to signify that they are all optional or repeatable together. -* In a few cases where meaning is more easily conveyed through prose, we explain a symbol and its expansion without BNF. -* Sample code will also be shown in a code block: - -bc(sample). -SELECT sample_usage FROM cql; - -* References to keywords or pieces of CQL code in running text will be shown in a @fixed-width font@. - -h2. Overall syntax - -CQL consists of statements. As in SQL, some statements directly make changes to data, some look up data, and some change the way data is stored. - -All statements end with a semicolon. - -bc(syntax). - ::= ";" - ; - ::= - | - | - | - ; - ::= - | - | - | - | - ; - ::= - | - | - | - | - | - | - ; - -String literals and identifiers (including keyspace and column family names) are case-sensitive, but CQL keywords are not. We show CQL keywords in this document in @UPPERCASE@ merely as a convention to aid readability. - -Literal values can be expressed in several ways in CQL. - -bc(syntax). - ::= "KEY" - | - | - | - | - | - ; - -* An @@ is a letter followed by any sequence of letters, digits, or the underscore (@_@). -* A @@ is encased in @'single quotes'@. A single quote itself can be represented in a string literal by doubling it, as in SQL: @'Single quote -> '' <-'@. -* An @@ consists of an optional minus sign (@-@) followed by one or more digits (@0-9@). -* A @@ can be expressed in the canonical UUID form: 32 hex digits (@0-9@ or @a-f@, case insensitive), separated by dashes (@-@) after the 8th, 12th, 16th, and 20th digits. Example: @01234567-0123-0123-0123-0123456789ab@ -* A @@ is a series of one or more decimal digits, followed by a period (@.@), and one or more decimal digits following. Note that there is no provision for "e" notation, no optional @+@ sign, and the forms @.42@ and @42.@ are not accepted. Use @0.42@ and @42.0@. -* Whitespace is not significant except to separate terms, and inside string literals. - -Comments in CQL can begin with a double dash (@--@) or a double slash (@//@) and extend to the end of the line. Multiline comments are enclosed in @/* ... */@. - -h2(#storageTypes). Data Storage Types - -__Syntax:__ - -bc(syntax). - ::= "ascii" - | "bigint" - | "blob" - | "boolean" - | "counter" - | "decimal" - | "double" - | "float" - | "int" - | "text" - | "timestamp" - | "uuid" - | "varchar" - | "varint" - ; - -The following table gives additional information on the available data types. - -|_. type|_. description| -|ascii|ASCII character string| -|bigint|64-bit signed long| -|blob|Arbitrary bytes (no validation)| -|boolean|true or false| -|counter|Counter column (64-bit long)| -|decimal|Variable-precision decimal| -|double|64-bit IEEE-754 floating point| -|float|32-bit IEEE-754 floating point| -|int|32-bit signed int| -|text|UTF8 encoded string| -|timestamp|A timestamp. See "Working with dates":#usingdates below for more information.| -|uuid|Type 1 or type 4 UUID| -|varchar|UTF8 encoded string| -|varint|Arbitrary-precision integer| - -_Note: In addition to the recognized types listed above, it is also possible to supply a string containing the name of a class (a sub-class of @AbstractType@ loadable by Cassandra). The class name should either be fully qualified, or relative to the @org.apache.cassandra.db.marshal@ package._ - -h3(#usingdates). Working with dates - -Values serialized with the @timestamp@ type are encoded as 64-bit signed integers representing a number of milliseconds since the standard base time known as "the epoch": January 1 1970 at 00:00:00 GMT. - -Timestamp types can be input in CQL as simple long integers, giving the number of milliseconds since the epoch, as defined above. - -Timestamp types can also be input as string literals in any of the following ISO 8601 formats, each representing the time and date Jan 2, 2003, at 04:05:00 AM, GMT.: - -* @2011-02-03 04:05+0000@ -* @2011-02-03 04:05:00+0000@ -* @2011-02-03T04:05+0000@ -* @2011-02-03T04:05:00+0000@ - -The @+0000@ above is an RFC 822 4-digit time zone specification; @+0000@ refers to GMT. US Pacific Standard Time is @-0800@. The time zone may be omitted if desired-- the date will be interpreted as being in the time zone under which the coordinating Cassandra node is configured. - -* @2011-02-03 04:05@ -* @2011-02-03 04:05:00@ -* @2011-02-03T04:05@ -* @2011-02-03T04:05:00@ - -There are clear difficulties inherent in relying on the time zone configuration being as expected, though, so it is recommended that the time zone always be specified for timestamps when feasible. - -The time of day may also be omitted, if the date is the only piece that matters: - -* @2011-02-03@ -* @2011-02-03+0000@ - -In that case, the time of day will default to 00:00:00, in the specified or default time zone. - -h2. USE - -__Syntax:__ - -bc(syntax). - ::= "USE" - ; - -__Sample:__ - -bc(sample). -USE myApp; - -A @USE@ statement consists of the @USE@ keyword, followed by a valid keyspace name. Its purpose is to assign the per-connection, current working keyspace. All subsequent keyspace-specific actions will be performed in the context of the keyspace selected, unless otherwise specified, until another USE statement is issued or the connection terminates. - -h2. SELECT - -__Syntax:__ - -bc(syntax). - ::= "SELECT" - "FROM" ( "." )? - ( "USING" "CONSISTENCY" )? - ( "WHERE" )? - ( "LIMIT" )? - ; - ::= ( "," )* - | ("FIRST" )? "REVERSED"? - | "COUNT" "(" ")" - ; - ::= ".." - | "*" - ; - ::= "*" - | "1" - ; - ::= - | - | - ; - ::= ( "AND" )* - | "IN" "(" ( "," )* ")" - ; - ::= - ; - ::= "=" | "<" | ">" | "<=" | ">=" - ; - -__Sample:__ - -bc(sample). -SELECT Name, Occupation FROM People WHERE key IN (199, 200, 207); -SELECT FIRST 3 REVERSED 'time199'..'time100' FROM Events; -SELECT COUNT(*) FROM system.Migrations; - -A @SELECT@ is used to read one or more records from a Cassandra column family. It returns a result-set of rows, where each row consists of a key and a collection of columns corresponding to the query. - -h3. Specifying Columns - -bc(sample). -SELECT col1, col2 FROM ... -SELECT range_lo..range_hi FROM ... -SELECT * FROM ... -SELECT FIRST 4 REVERSED range_hi..range_lo FROM ... - -The @SELECT@ expression determines which columns will appear in the results and can take a few different forms, as shown above. The simplest is a comma-separated list of column names. Note that column names in Cassandra can be specified with string literals or integers, in addition to identifiers. - -It is also possible to specify a range of column names. The range notation consists of start and end column names, separated by two periods (@..@). The set of columns returned for a range is start and end inclusive. A single star (@*@) may be used as a range to request "all columns". - -When using a range, it is sometimes useful to limit the number of columns that can be returned as part of each row (since Cassandra is schemaless, it is not necessarily possible to determine ahead of time how many columns will be in the result set). To accomplish this, use the @FIRST@ clause with an integer to specify an upper limit on the number of columns returned per row. The default limit is 10,000 columns. - -The @REVERSED@ option causes the sort order of the columns returned to be reversed. This affects the @FIRST@ clause; when limiting the columns returned, the columns at the end of the range will be selected instead of the ones at the beginning of the range. - -A @SELECT@ expression may also be @COUNT(*)@. In this case, the result will be only one value: the number of rows which matched the query. - -It is worth noting that unlike the projection in a SQL SELECT, there is no guarantee that the results will contain all of the columns specified, because Cassandra is schemaless. - -h3. Column Family - -bc(sample). -SELECT ... FROM MyApp.LocationSnapshots ...; -SELECT ... FROM EventTimeline ...; - -The @FROM@ clause is used to specify the Cassandra column family applicable to a @SELECT@ query. Unlike other operations on column families, the keyspace in which the column family exists may also be specified by giving its name before the column family name, and separating them by a dot (@.@). If the keyspace is not specified, the current keyspace will be used, as per normal. - -h3. Consistency Level - -bc(sample). -SELECT ... USING CONSISTENCY QUORUM; - -Following the column family clause is an optional "consistency level specification":#consistency. - -h3. Filtering rows - -bc(sample). -SELECT ... WHERE KEY = 11194251 AND startdate = '2011-10-08-0500'; -SELECT ... WHERE KEY >= 'AM' and KEY =< 'AZ' AND module = 17; -SELECT ... WHERE keyalias IN ('key1', 'key2', 'key3', ...); - -The @WHERE@ clause provides for filtering the rows that appear in results. The clause can filter on a key name, or range of keys, and in the case of indexed columns, on column values. Key filters are specified using the @KEY@ keyword or key alias name, followed by a relational operator (one of @=@, @>@, @>=@, @<@, and @<=@), and then a term value. When terms appear on both sides of a relational operator it is assumed the filter applies to an indexed column. With column index filters, the term on the left of the operator must be the name of the indexed column, and the term on the right is the value to filter __on__. - -__Note: The greater-than and less-than operators (@>@ and @<@) result in key ranges that are inclusive of the terms. There is no supported notion of "strictly" greater-than or less-than; these operators are merely supported as aliases to @>=@ and @<=@.__ - -h3. Limits - -bc(sample). -SELECT ... WHERE favoriteArtist = 'The Mighty Mighty Bosstones' LIMIT 90000; - -The @LIMIT@ option to a @SELECT@ expression limits the number of rows returned by a query. @LIMIT@ defaults to 10,000 when left unset. - -h2. INSERT - -__Syntax:__ - -bc(syntax). - ::= "INSERT" "INTO" - "(" "," ( "," )* ")" - "VALUES" "(" "," ( "," )* ")" - ( "USING" ( "AND" )* )? - ; - ::= "CONSISTENCY" - | "TIMESTAMP" - | "TTL" - ; - -__Sample:__ - -bc(sample). -INSERT INTO NerdMovies (KEY, 11924) - VALUES ('Serenity', 'Nathan Fillion') - USING CONSISTENCY LOCAL_QUORUM AND TTL 86400; - -An @INSERT@ is used to write one or more columns to a record in a Cassandra column family. No results are returned. - -The first column name in the @INSERT@ list must be the name of the column family key. Also, there must be more than one column name specified (Cassandra rows are not considered to exist with only a key and no associated columns). - -Unlike in SQL, the semantics of @INSERT@ and @UPDATE@ are identical. In either case a record is created if none existed before, and updated when it does. For information on query modifiers and types, see the "@UPDATE@":#update section below. - -h2(#update). UPDATE - -__Syntax:__ - -bc(syntax). - ::= "UPDATE" - ( "USING" ( "AND" )* )? - "SET" ( "," )* - "WHERE" - ; - ::= "=" - | "=" "+" - | "=" "-" - ; - ::= "=" - | "IN" "(" ( "," )* ")" - ; - -__Sample:__ - -bc(sample). -UPDATE NerdMovies USING CONSISTENCY ALL AND TTL 400 - SET 'A 1194' = 'The Empire Strikes Back', - 'B 1194' = 'Han Solo' - WHERE KEY = B70DE1D0-9908-4AE3-BE34-5573E5B09F14; -UPDATE UserActionCounts SET total = total + 2 WHERE keyalias = 523; - -An @UPDATE@ is used to write one or more columns to a record in a Cassandra column family. No results are returned. The row key can be specified using the @KEY@ keyword or by a key alias set per column family. - -h3. Column Family - -Statements begin with the @UPDATE@ keyword followed by a Cassandra column family name. - -h3. Consistency Level - -bc(sample). -UPDATE Foo USING CONSISTENCY EACH_QUORUM ... - -Following the column family identifier is an optional @USING@ clause, which can specify the "consistency level":#consistency for the update, or the timestamp and/or the TTL for the new columns. - -h3. Timestamp - -bc(sample). -UPDATE Foo USING TIMESTAMP=1318452291034 ... - -@UPDATE@ supports setting client-supplied optional timestamp for modification. - -h3. TTL - -bc(sample). -UPDATE Foo USING TTL=6800 ... - -@UPDATE@ supports setting a time to live (TTL), in seconds, for each of the added columns. - -h3. Specifying Columns and Row - -bc(sample). -UPDATE ... SET col1 = val1, col2 = val2 WHERE KEY = key1; -UPDATE ... SET col3 = val3 WHERE KEY IN (key1, key2, key3); -UPDATE ... SET col4 = 22 WHERE keyalias = key4; - -Rows are created or updated by supplying column names and values, after the @SET@ keyword, in term assignment format. Multiple columns can be set by separating the name/value pairs using commas. Each update statement requires a precise set of row keys to be specified using a @WHERE@ clause and the @KEY@ keyword or key alias. - -h3. Updating Counter Columns - -bc(sample). -UPDATE ... SET name1 = name1 + ...; -UPDATE ... SET name1 = name1 - ...; - -Counter columns can be incremented or decremented by an arbitrary numeric value though the assignment of an expression that adds or substracts the value. - -h2. DELETE - -__Syntax:__ - -bc(syntax). - ::= "DELETE" ( ( "," )* )? - "FROM" - ( "USING" ( "AND" )* )? - "WHERE" - ; - ::= "CONSISTENCY" - | "TIMESTAMP" - ; - -__Sample:__ - -bc(sample). -DELETE col1, col2, col3 FROM Planeteers USING CONSISTENCY ONE WHERE KEY = 'Captain'; -DELETE FROM MastersOfTheUniverse WHERE KEY IN ('Man-At-Arms', 'Teela'); - -A @DELETE@ is used to perform the removal of one or more columns from one or more rows. The key can be given using the @KEY@ keyword or by the key alias set per column family. - -h3. Specifying Columns - -Following the @DELETE@ keyword is an optional comma-delimited list of column name terms. When no column names are specified, the remove applies to the entire row(s) matched by the "WHERE clause":#deleterows. - -h3. Column Family - -The column family name follows the list of column names and the keyword @FROM@. - -h3. Consistency Level - -Following the column family identifier is an optional "consistency level specification":#consistency. - -h3(#deleterows). Specifying Rows - -bc(sample). -DELETE ... WHERE KEY = 'some_key_value'; -DELETE ... WHERE keyalias IN (key1, key2); - -The @WHERE@ clause is used to determine to which row(s) a @DELETE@ applies. The first form allows the specification of a single keyname using the @KEY@ keyword (or by key alias) and the @=@ operator. The second form allows a list of keyname terms to be specified using the @IN@ notation and a parenthesized list of comma-delimited keyname terms. - -h2. TRUNCATE - -__Syntax:__ - -bc(syntax). - ::= "TRUNCATE" - ; - -__Sample:__ - -bc(sample). -TRUNCATE super_important_data; - -@TRUNCATE@ accepts a single argument for the column family name, and permanently removes all data from said column family. - -h2. BATCH - -__Syntax:__ - -bc(syntax). - ::= "BEGIN" "BATCH" - ( "USING" ( "AND" )* )? - ( ";" )* - "APPLY" "BATCH" - ; - ::= - | - | - ; - -__Sample:__ - -bc(sample). -BEGIN BATCH USING CONSISTENCY QUORUM AND TTL 8640000 - INSERT INTO users (KEY, password, name) VALUES ('user2', 'ch@ngem3b', 'second user') - UPDATE users SET password = 'ps22dhds' WHERE KEY = 'user2' - INSERT INTO users (KEY, password) VALUES ('user3', 'ch@ngem3c') - DELETE name FROM users WHERE key = 'user2' - INSERT INTO users (KEY, password, name) VALUES ('user4', 'ch@ngem3c', 'Andrew') -APPLY BATCH; - -@BATCH@ supports setting a client-supplied optional global timestamp which will be used for each of the operations included in the batch. - -A single consistency level is used for the entire batch. It appears after the @BEGIN BATCH@ statement, and uses the standard "consistency level specification":#consistency. Batched statements default to @CONSISTENCY.ONE@ when left unspecified. - -Only data modification statements (specifically, @UPDATE@, @INSERT@, and @DELETE@) are allowed in a @BATCH@ statement. @BATCH@ is _not_ an analogue for SQL transactions. - -_NOTE: While there are no isolation guarantees, @UPDATE@ queries are atomic within a given record._ - -h2. CREATE KEYSPACE - -__Syntax:__ - -bc(syntax). - ::= "CREATE" "KEYSPACE" - "WITH" "=" - ( "AND" "=" )* - ; - ::= - | ":" - | ":" - ; - ::= - | - | - ; - -__Sample:__ - -bc(sample). -CREATE KEYSPACE Excelsior WITH strategy_class = 'SimpleStrategy' - AND strategy_options:replication_factor = 1; -CREATE KEYSPACE Excalibur WITH strategy_class = 'NetworkTopologyStrategy' - AND strategy_options:DC1 = 1 AND strategy_options:DC2 = 3; - -The @CREATE KEYSPACE@ statement creates a new top-level namespace (aka "keyspace"). Valid names are any string constructed of alphanumeric characters and underscores. Names which do not work as valid identifiers or integers should be quoted as string literals. Properties such as replication strategy and count are specified during creation using the following accepted keyword arguments: - -|_. keyword|_. required|_. description| -|strategy_class|yes|The name of the replication strategy class which should be used for the new keyspace. Some often-used classes are @SimpleStrategy@ and @NetworkTopologyStrategy@.| -|strategy_options|no|Most strategies require additional arguments which can be supplied by appending the option name to the @strategy_options@ keyword, separated by a colon (@:@). For example, a strategy option of "DC1" with a value of "1" would be specified as @strategy_options:DC1 = 1@; replication_factor for SimpleStrategy could be @strategy_options:replication_factor=3@.| - -h2. CREATE COLUMNFAMILY - -__Syntax:__ - -bc(syntax). - ::= "CREATE" "COLUMNFAMILY" - "(" "PRIMARY" "KEY" - ( "," )* ")" - ( "WITH" "=" - ( "AND" "=" )* )? - ; - ::= - | ":" - | ":" - ; - - ::= - | - | - | - | - ; - -__Sample:__ - -bc(sample). -CREATE COLUMNFAMILY Fish (KEY blob PRIMARY KEY); -CREATE COLUMNFAMILY FastFoodEatings (user text PRIMARY KEY) - WITH comparator=timestamp AND default_validation=int; -CREATE COLUMNFAMILY MonkeyTypes ( - KEY uuid PRIMARY KEY, - species text, - alias text, - population varint -) WITH comment='Important biological records' - AND read_repair_chance = 1.0; - -@CREATE COLUMNFAMILY@ statements create new column family namespaces under the current keyspace. Valid column family names are strings of alphanumeric characters and underscores, which begin with a letter. - -h3(#keytypes). Specifying Key Type - -bc(sample). -CREATE ... (KEY ascii PRIMARY KEY, ... ) ... - -When creating a new column family, you must specify the key type. The list of possible types is identical to column comparators/validators (see "Data Storage Types":#storageTypes), except it probably does not make sense to use @counter@ for a key. It's important to note that the key type you use must be compatible with the partitioner in use. For example, @OrderPreservingPartitioner@ and @CollatingOrderPreservingPartitioner@ both require UTF-8 keys. If you use an identifier for the primary key name, instead of the @KEY@ keyword, a key alias will be set automatically. - -h3. Specifying Column Types (optional) - -bc(sample). -CREATE ... ( ... , name1 type1, name2 type2, ... ) ... - -It is possible to assign columns a type during column family creation. Columns configured with a type are validated accordingly when a write occurs, and intelligent CQL drivers and interfaces will be able to decode the column values correctly when receiving them. Column types are specified as a parenthesized, comma-separated list of column term and type pairs. See "Data Storage Types":#storageTypes for the list of recognized types. - -h3(#cfopts). Column Family Options (optional) - -bc(sample). -CREATE COLUMNFAMILY ... WITH keyword1 = arg1 AND keyword2 = arg2; - -A number of optional keyword arguments can be supplied to control the configuration of a new column family. - -|_. keyword|_. default|_. description| -|comparator|text|Determines the storage type of column names (which itself determines the sorting and validation of column names). Valid values are listed in the "Data Storage Types":#storageTypes table above.| -|comment|none|A free-form, human-readable comment.| -|read_repair_chance|1.0|The probability with which read repairs should be invoked on non-quorum reads.| -|gc_grace_seconds|864000|Time to wait before garbage collecting tombstones (deletion markers).| -|default_validation|text|Determines the default storage type of column values (which itself determines the validation for column values). This option does not affect the types of columns which were defined in a @CREATE COLUMNFAMILY@ statement-- only new columns. Valid values are listed in the "Data Storage Types":#storageTypes table above.| -|min_compaction_threshold|4|Minimum number of SSTables needed to start a minor compaction.| -|max_compaction_threshold|32|Maximum number of SSTables allowed before a minor compaction is forced.| -|replicate_on_write|false| | -|compaction_strategy_options|none|CompactionStrategy specific options such as "sstable_size_in_mb" for LeveledCompactionStrategy and "min_sstable_size" for SizeTieredCompactionStrategy| -|compression_parameters|none|Compression parameters such as "sstable_compressor" and "chunk_length_kb"| - -h2. CREATE INDEX - -__Syntax:__ - -bc(syntax). - ::= "CREATE" "INDEX" ? "ON" - "(" ")" - ; - -__Sample:__ - -bc(sample). -CREATE INDEX userIndex ON NerdMovies (user); -CREATE INDEX ON Mutants (abilityId); - -A @CREATE INDEX@ statement is used to create a new, automatic secondary index on the given column family, for the named column. A name for the index itself can be specified before the @ON@ keyword, if desired. A single column name must be specified inside the parentheses. It is not necessary for the column to exist on any current rows (Cassandra is schemaless), but the column must already have a type (specified during the @CREATE COLUMNFAMILY@, or added afterwards with @ALTER COLUMNFAMILY@. - -h2. DROP KEYSPACE - -__Syntax:__ - -bc(syntax). - ::= "DROP" "KEYSPACE" - ; - -__Sample:__ - -bc(sample). DROP KEYSPACE MyTwitterClone; - -A @DROP KEYSPACE@ statement results in the immediate, irreversible removal of a keyspace, including all column families in it, and all data contained in those column families. - -h2. DROP COLUMNFAMILY - -__Syntax:__ - -bc(syntax). - ::= "DROP" "COLUMNFAMILY" - ; - -__Sample:__ - -bc(sample). DROP COLUMNFAMILY worldSeriesAttendees; - -A @DROP COLUMNFAMILY@ statement results in the immediate, irreversible removal of a column family, including all data contained in it. - -h2. DROP INDEX - -__Syntax:__ - -bc(syntax). - ::= "DROP" "INDEX" - ; - -__Sample:__ - -bc(sample). DROP INDEX cf_col_idx; - -A @DROP INDEX@ statement is used to drop an existing secondary index. - -h2. ALTER COLUMNFAMILY - -__Syntax:__ - -bc(syntax). - ::= "ALTER" "COLUMNFAMILY" - ; - ::= "ALTER" "TYPE" - | "ADD" - | "DROP" - | "WITH" "=" - ( "AND" "=" )* - ; - -An @ALTER@ statement is used to manipulate column family column metadata. It allows you to add new columns, drop existing columns, data storage type of existing columns, or change the column family properties. No results are returned. - -Specify the name of the column family to be changed after the @ALTER COLUMNFAMILY@ keywords, followed by the type of change desired (@ALTER@, @ADD@, @DROP@, or @WITH@), and provide the rest of the needed information, as explained below. - -h3. Changing the type of a typed column - -bc(sample). -ALTER COLUMNFAMILY addamsFamily ALTER lastKnownLocation TYPE uuid; - -@ALTER COLUMNFAMILY ... ALTER@ changes the expected storage type for a column. The column must either be the key alias or already have a type in the column family metadata. The column may or may not already exist in current rows-- but be aware that no validation of existing data is done. The bytes stored in values for that column will remain unchanged, and if existing data is not deserializable according to the new type, this may cause your CQL driver or interface to report errors. - -h3. Adding a typed column - -bc(sample). -ALTER COLUMNFAMILY addamsFamily ADD gravesite varchar; - -The @ALTER COLUMNFAMILY ... ADD@ variant adds a typed column to a column family. The column must not already have a type in the column family metadata. The same warnings from the above @ALTER@ section, about there being no validation of existing data, apply here as well. - -h3. Dropping a typed column - -bc(sample). -ALTER COLUMNFAMILY addamsFamily DROP gender; - -An @ALTER COLUMNFAMILY ... DROP@ statement removes the type of a column from the column family metadata. Note that this does _not_ remove the column from current rows; it just removes the metadata saying that the bytes stored under that column are expected to be deserializable according to a certain type. - -h3. Modifying column family properties - -bc(sample). -ALTER COLUMNFAMILY addamsFamily WITH comment = 'A most excellent and useful column family' AND read_repair_chance = 0.2; - -An @ALTER COLUMNFAMILY ... WITH@ statement makes adjustments to the column family properties, as defined when the column family was created (see "CREATE COLUMNFAMILY options":#cfopts for information about the supported options and values). - -Note that setting any @compaction_strategy_options:*@ parameters has the effect of erasing all previous @compaction_strategy_options:*@ parameters, so you will need to re-specify any such parameters which have already been set, if you want to keep them. The same note applies to the set of @compression_parameters:*@ parameters. - -h2. Common Idioms - -h3(#consistency). Specifying Consistency - -bc(syntax). - ::= "ANY" - | "ONE" - | "QUORUM" - | "ALL" - | "LOCAL_QUORUM" - | "EACH_QUORUM" - ; - -bc(sample). -... USING CONSISTENCY LOCAL_QUORUM ... - -Consistency level specifications are made up the keywords @USING CONSISTENCY@, followed by a consistency level identifier. Valid consistency level identifiers are as listed above. When not specified, @USING CONSISTENCY ONE@ is the default. - -Consult your Cassandra documentation for information about how consistency levels work. - -h1. Versioning - -Versioning of the CQL language adheres to the "Semantic Versioning":http://semver.org guidelines. Versions take the form X.Y.Z where X, Y, and Z are integer values representing major, minor, and patch level respectively. There is no correlation between Cassandra release versions and the CQL language version. - -|_. version|_. description| -|Major|The major version _must_ be bumped when backward incompatible changes are introduced. This should rarely (if ever) occur.| -|Minor|Minor version increments occur when new, but backward compatible, functionality is introduced.| -|Patch|The patch version is incremented when bugs are fixed.| - -h1. Changes - -pre.. -Wed, 12 Oct 2011 16:53:00 -0500 - paul cannon - * Rework whole doc, adding syntax specifics and additional explanations - -Fri, 09 Sep 2011 11:43:00 -0500 - Jonathan Ellis - * add int data type - -pre. Wed, 07 Sep 2011 09:01:00 -0500 - Jonathan Ellis - * Updated version to 2.0; Documented row-based count() - * Updated list of supported data types - -pre. Wed, 10 Aug 2011 11:22:00 -0500 - Eric Evans - * Improved INSERT vs. UPDATE wording. - * Documented counter column incr/descr. - -pre. Sat, 01 Jun 2011 15:58:00 -0600 - Pavel Yaskevich - * Updated to support ALTER (CASSANDRA-1709) - -pre. Tue, 22 Mar 2011 18:10:28 -0700 - Eric Evans - * Initial version, 1.0.0 diff --git a/interface/cassandra.thrift b/interface/cassandra.thrift index a223eb54f453..e46b85e5887a 100644 --- a/interface/cassandra.thrift +++ b/interface/cassandra.thrift @@ -55,7 +55,7 @@ namespace rb CassandraThrift # An effort should be made not to break forward-client-compatibility either # (e.g. one should avoid removing obsolete fields from the IDL), but no # guarantees in this respect are made by the Cassandra project. -const string VERSION = "19.39.0" +const string VERSION = "20.0.0" # @@ -843,7 +843,7 @@ service Cassandra { /** - * @deprecated Will become a no-op in 2.2. Please use the CQL3 version instead. + * @deprecated Throws InvalidRequestException since 3.0. Please use the CQL3 version instead. */ CqlResult execute_cql_query(1:required binary query, 2:required Compression compression) throws (1:InvalidRequestException ire, @@ -863,7 +863,7 @@ service Cassandra { /** - * @deprecated Will become a no-op in 2.2. Please use the CQL3 version instead. + * @deprecated Throws InvalidRequestException since 3.0. Please use the CQL3 version instead. */ CqlPreparedResult prepare_cql_query(1:required binary query, 2:required Compression compression) throws (1:InvalidRequestException ire) @@ -879,7 +879,7 @@ service Cassandra { /** - * @deprecated Will become a no-op in 2.2. Please use the CQL3 version instead. + * @deprecated Throws InvalidRequestException since 3.0. Please use the CQL3 version instead. */ CqlResult execute_prepared_cql_query(1:required i32 itemId, 2:required list values) throws (1:InvalidRequestException ire, diff --git a/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java b/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java index 15b99fa194b5..f29805bd0a73 100644 --- a/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java +++ b/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java @@ -379,7 +379,7 @@ public interface Iface { public String system_update_column_family(CfDef cf_def) throws InvalidRequestException, SchemaDisagreementException, org.apache.thrift.TException; /** - * @deprecated Will become a no-op in 2.2. Please use the CQL3 version instead. + * @deprecated Throws InvalidRequestException since 3.0. Please use the CQL3 version instead. * * @param query * @param compression @@ -397,7 +397,7 @@ public interface Iface { public CqlResult execute_cql3_query(ByteBuffer query, Compression compression, ConsistencyLevel consistency) throws InvalidRequestException, UnavailableException, TimedOutException, SchemaDisagreementException, org.apache.thrift.TException; /** - * @deprecated Will become a no-op in 2.2. Please use the CQL3 version instead. + * @deprecated Throws InvalidRequestException since 3.0. Please use the CQL3 version instead. * * @param query * @param compression @@ -416,7 +416,7 @@ public interface Iface { public CqlPreparedResult prepare_cql3_query(ByteBuffer query, Compression compression) throws InvalidRequestException, org.apache.thrift.TException; /** - * @deprecated Will become a no-op in 2.2. Please use the CQL3 version instead. + * @deprecated Throws InvalidRequestException since 3.0. Please use the CQL3 version instead. * * @param itemId * @param values diff --git a/interface/thrift/gen-java/org/apache/cassandra/thrift/cassandraConstants.java b/interface/thrift/gen-java/org/apache/cassandra/thrift/cassandraConstants.java index 81b0ffbae26e..d9f0008d73e2 100644 --- a/interface/thrift/gen-java/org/apache/cassandra/thrift/cassandraConstants.java +++ b/interface/thrift/gen-java/org/apache/cassandra/thrift/cassandraConstants.java @@ -56,6 +56,6 @@ public class cassandraConstants { - public static final String VERSION = "19.39.0"; + public static final String VERSION = "20.0.0"; } diff --git a/pylib/cqlshlib/helptopics.py b/pylib/cqlshlib/helptopics.py index 710aa7492928..b8e5ba84e417 100644 --- a/pylib/cqlshlib/helptopics.py +++ b/pylib/cqlshlib/helptopics.py @@ -205,8 +205,7 @@ def help_use(self): terminates. As always, when a keyspace name does not work as a normal identifier or - number, it can be quoted using single quotes (CQL 2) or double quotes - (CQL 3). + number, it can be quoted using double quotes. """ def help_create_table(self): diff --git a/src/java/org/apache/cassandra/config/CFMetaData.java b/src/java/org/apache/cassandra/config/CFMetaData.java index 25b731426ee7..31a46cdb7f36 100644 --- a/src/java/org/apache/cassandra/config/CFMetaData.java +++ b/src/java/org/apache/cassandra/config/CFMetaData.java @@ -777,17 +777,6 @@ public Integer getMaxCompactionThreshold() return maxCompactionThreshold; } - // Used by CQL2 only. - public String getCQL2KeyName() - { - if (partitionKeyColumns.size() > 1) - throw new IllegalStateException("Cannot acces column family with composite key from CQL < 3.0.0"); - - // For compatibility sake, we uppercase if it's the default alias as we used to return it that way in resultsets. - String str = partitionKeyColumns.get(0).name.toString(); - return str.equalsIgnoreCase(DEFAULT_KEY_ALIAS) ? str.toUpperCase() : str; - } - public CompressionParameters compressionParameters() { return compressionParameters; diff --git a/src/java/org/apache/cassandra/config/ColumnDefinition.java b/src/java/org/apache/cassandra/config/ColumnDefinition.java index bb1dd713bcf6..bbdc1168edfd 100644 --- a/src/java/org/apache/cassandra/config/ColumnDefinition.java +++ b/src/java/org/apache/cassandra/config/ColumnDefinition.java @@ -55,7 +55,7 @@ public class ColumnDefinition extends ColumnSpecification * column, whose name is not stored in the data contrarily to the column of * type REGULAR. Hence the COMPACT_VALUE type to distinguish it below. * - * Note that thrift/CQL2 only know about definitions of type REGULAR (and + * Note that thrift only knows about definitions of type REGULAR (and * the ones whose componentIndex == null). */ public enum Kind diff --git a/src/java/org/apache/cassandra/cql/AbstractModification.java b/src/java/org/apache/cassandra/cql/AbstractModification.java deleted file mode 100644 index 8da2611d72e8..000000000000 --- a/src/java/org/apache/cassandra/cql/AbstractModification.java +++ /dev/null @@ -1,126 +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.cql; - -import java.nio.ByteBuffer; -import java.util.List; - -import org.apache.cassandra.db.IMutation; -import org.apache.cassandra.db.ConsistencyLevel; -import org.apache.cassandra.exceptions.InvalidRequestException; -import org.apache.cassandra.exceptions.UnauthorizedException; -import org.apache.cassandra.thrift.ThriftClientState; - -public abstract class AbstractModification -{ - public static final ConsistencyLevel defaultConsistency = ConsistencyLevel.ONE; - - protected final String keyspace; - protected final String columnFamily; - protected final ConsistencyLevel cLevel; - protected final Long timestamp; - protected final int timeToLive; - protected final String keyName; - - public AbstractModification(String keyspace, String columnFamily, String keyAlias, Attributes attrs) - { - this(keyspace, columnFamily, keyAlias, attrs.getConsistencyLevel(), attrs.getTimestamp(), attrs.getTimeToLive()); - } - - public AbstractModification(String keyspace, String columnFamily, String keyAlias, ConsistencyLevel cLevel, Long timestamp, int timeToLive) - { - this.keyspace = keyspace; - this.columnFamily = columnFamily; - this.cLevel = cLevel; - this.timestamp = timestamp; - this.timeToLive = timeToLive; - this.keyName = keyAlias.toUpperCase(); - } - - public String getKeyspace() - { - return keyspace; - } - - public String getColumnFamily() - { - return columnFamily; - } - - public ConsistencyLevel getConsistencyLevel() - { - return (cLevel != null) ? cLevel : defaultConsistency; - } - - /** - * True if an explicit consistency level was parsed from the statement. - * - * @return true if a consistency was parsed, false otherwise. - */ - public boolean isSetConsistencyLevel() - { - return cLevel != null; - } - - public long getTimestamp(ThriftClientState clientState) - { - return timestamp == null ? clientState.getQueryState().getTimestamp() : timestamp; - } - - public boolean isSetTimestamp() - { - return timestamp != null; - } - - public int getTimeToLive() - { - return timeToLive; - } - - public String getKeyName() - { - return keyName; - } - - /** - * Convert statement into a list of mutations to apply on the server - * - * @param keyspace The working keyspace - * @param clientState current client status - * - * @return list of the mutations - * - * @throws InvalidRequestException on the wrong request - */ - public abstract List prepareRowMutations(String keyspace, ThriftClientState clientState, List variables) - throws InvalidRequestException, UnauthorizedException; - - /** - * Convert statement into a list of mutations to apply on the server - * - * @param keyspace The working keyspace - * @param clientState current client status - * @param timestamp global timestamp to use for all mutations - * - * @return list of the mutations - * - * @throws InvalidRequestException on the wrong request - */ - public abstract List prepareRowMutations(String keyspace, ThriftClientState clientState, Long timestamp, List variables) - throws InvalidRequestException, UnauthorizedException; -} diff --git a/src/java/org/apache/cassandra/cql/AlterTableStatement.java b/src/java/org/apache/cassandra/cql/AlterTableStatement.java deleted file mode 100644 index 2fda2126a14e..000000000000 --- a/src/java/org/apache/cassandra/cql/AlterTableStatement.java +++ /dev/null @@ -1,202 +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.cql; - -import org.apache.cassandra.config.*; -import org.apache.cassandra.db.marshal.TypeParser; -import org.apache.cassandra.exceptions.*; -import org.apache.cassandra.io.compress.CompressionParameters; - -import java.nio.ByteBuffer; -import java.util.HashMap; -import java.util.Map; - -public class AlterTableStatement -{ - public static enum OperationType - { - ADD, ALTER, DROP, OPTS - } - - public final OperationType oType; - public final String columnFamily, columnName, validator; - private final CFPropDefs cfProps = new CFPropDefs(); - - public AlterTableStatement(String columnFamily, OperationType type, String columnName) - { - this(columnFamily, type, columnName, null); - } - - public AlterTableStatement(String columnFamily, OperationType type, String columnName, String validator) - { - this(columnFamily, type, columnName, validator, null); - } - - public AlterTableStatement(String columnFamily, OperationType type, String columnName, String validator, Map propertyMap) - { - this.columnFamily = columnFamily; - this.oType = type; - this.columnName = columnName; - this.validator = CFPropDefs.comparators.get(validator); // used only for ADD/ALTER commands - - if (propertyMap != null) - { - for (Map.Entry prop : propertyMap.entrySet()) - { - cfProps.addProperty(prop.getKey(), prop.getValue()); - } - } - } - - public CFMetaData getCFMetaData(String keyspace) throws ConfigurationException, InvalidRequestException, SyntaxException - { - CFMetaData meta = Schema.instance.getCFMetaData(keyspace, columnFamily); - CFMetaData cfm = meta.clone(); - - ByteBuffer columnName = this.oType == OperationType.OPTS ? null - : meta.comparator.subtype(0).fromStringCQL2(this.columnName); - - switch (oType) - { - case ADD: - cfm.addColumnDefinition(ColumnDefinition.regularDef(cfm, columnName, TypeParser.parse(validator), null)); - break; - - case ALTER: - // We only look for the first key alias which is ok for CQL2 - ColumnDefinition partionKeyDef = cfm.partitionKeyColumns().get(0); - if (partionKeyDef.name.bytes.equals(columnName)) - { - cfm.keyValidator(TypeParser.parse(validator)); - } - else - { - ColumnDefinition toUpdate = null; - - for (ColumnDefinition columnDef : cfm.regularColumns()) - { - if (columnDef.name.bytes.equals(columnName)) - { - toUpdate = columnDef; - break; - } - } - - if (toUpdate == null) - throw new InvalidRequestException(String.format("Column '%s' was not found in CF '%s'", - this.columnName, - columnFamily)); - - cfm.addOrReplaceColumnDefinition(toUpdate.withNewType(TypeParser.parse(validator))); - } - break; - - case DROP: - ColumnDefinition toDelete = null; - - for (ColumnDefinition columnDef : cfm.regularColumns()) - { - if (columnDef.name.bytes.equals(columnName)) - { - toDelete = columnDef; - } - } - - if (toDelete == null) - throw new InvalidRequestException(String.format("Column '%s' was not found in CF '%s'", - this.columnName, - columnFamily)); - - cfm.removeColumnDefinition(toDelete); - break; - - case OPTS: - if (cfProps == null) - throw new InvalidRequestException(String.format("ALTER COLUMNFAMILY WITH invoked, but no parameters found")); - - cfProps.validate(); - applyPropertiesToCFMetadata(cfm, cfProps); - break; - } - - return cfm; - } - - public String toString() - { - return String.format("AlterTableStatement(cf=%s, type=%s, column=%s, validator=%s)", - columnFamily, - oType, - columnName, - validator); - } - - public static void applyPropertiesToCFMetadata(CFMetaData cfm, CFPropDefs cfProps) throws InvalidRequestException, ConfigurationException - { - if (cfProps.hasProperty(CFPropDefs.KW_COMPACTION_STRATEGY_CLASS)) - cfm.compactionStrategyClass(cfProps.compactionStrategyClass); - - if (cfProps.hasProperty(CFPropDefs.KW_COMPARATOR)) - throw new InvalidRequestException("Can't change CF comparator after creation"); - - if (cfProps.hasProperty(CFPropDefs.KW_COMMENT)) - cfm.comment(cfProps.getProperty(CFPropDefs.KW_COMMENT)); - - if (cfProps.hasProperty(CFPropDefs.KW_DEFAULTVALIDATION)) - { - try - { - cfm.defaultValidator(cfProps.getValidator()); - } - catch (RequestValidationException e) - { - throw new InvalidRequestException(String.format("Invalid validation type %s", - cfProps.getProperty(CFPropDefs.KW_DEFAULTVALIDATION))); - } - } - - cfm.readRepairChance(cfProps.getPropertyDouble(CFPropDefs.KW_READREPAIRCHANCE, cfm.getReadRepairChance())); - cfm.dcLocalReadRepairChance(cfProps.getPropertyDouble(CFPropDefs.KW_DCLOCALREADREPAIRCHANCE, cfm.getDcLocalReadRepair())); - cfm.gcGraceSeconds(cfProps.getPropertyInt(CFPropDefs.KW_GCGRACESECONDS, cfm.getGcGraceSeconds())); - int minCompactionThreshold = cfProps.getPropertyInt(CFPropDefs.KW_MINCOMPACTIONTHRESHOLD, cfm.getMinCompactionThreshold()); - int maxCompactionThreshold = cfProps.getPropertyInt(CFPropDefs.KW_MAXCOMPACTIONTHRESHOLD, cfm.getMaxCompactionThreshold()); - if (minCompactionThreshold <= 0 || maxCompactionThreshold <= 0) - throw new ConfigurationException("Disabling compaction by setting compaction thresholds to 0 has been deprecated, set the compaction option 'enabled' to false instead."); - cfm.minCompactionThreshold(minCompactionThreshold); - cfm.maxCompactionThreshold(maxCompactionThreshold); - cfm.caching(CFMetaData.Caching.fromString(cfProps.getPropertyString(CFPropDefs.KW_CACHING, cfm.getCaching().toString()))); - cfm.rowsPerPartitionToCache(CFMetaData.RowsPerPartitionToCache.fromString(cfProps.getPropertyString(CFPropDefs.KW_ROWS_PER_PARTITION_TO_CACHE, cfm.getRowsPerPartitionToCache().toString()))); - cfm.defaultTimeToLive(cfProps.getPropertyInt(CFPropDefs.KW_DEFAULT_TIME_TO_LIVE, cfm.getDefaultTimeToLive())); - cfm.speculativeRetry(CFMetaData.SpeculativeRetry.fromString(cfProps.getPropertyString(CFPropDefs.KW_SPECULATIVE_RETRY, cfm.getSpeculativeRetry().toString()))); - cfm.populateIoCacheOnFlush(cfProps.getPropertyBoolean(CFPropDefs.KW_POPULATE_IO_CACHE_ON_FLUSH, cfm.populateIoCacheOnFlush())); - cfm.bloomFilterFpChance(cfProps.getPropertyDouble(CFPropDefs.KW_BF_FP_CHANCE, cfm.getBloomFilterFpChance())); - cfm.memtableFlushPeriod(cfProps.getPropertyInt(CFPropDefs.KW_MEMTABLE_FLUSH_PERIOD, cfm.getMemtableFlushPeriod())); - - if (!cfProps.compactionStrategyOptions.isEmpty()) - { - cfm.compactionStrategyOptions(new HashMap()); - for (Map.Entry entry : cfProps.compactionStrategyOptions.entrySet()) - cfm.compactionStrategyOptions.put(entry.getKey(), entry.getValue()); - } - - if (!cfProps.compressionParameters.isEmpty()) - { - cfm.compressionParameters(CompressionParameters.create(cfProps.compressionParameters)); - } - } -} diff --git a/src/java/org/apache/cassandra/cql/Attributes.java b/src/java/org/apache/cassandra/cql/Attributes.java deleted file mode 100644 index faee3b8a0012..000000000000 --- a/src/java/org/apache/cassandra/cql/Attributes.java +++ /dev/null @@ -1,76 +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.cql; - -import org.apache.cassandra.db.ConsistencyLevel; - -/** - * Class to contain attributes for statements - */ -public class Attributes -{ - private ConsistencyLevel cLevel; - private Long timestamp; - private int timeToLive; - - public Attributes() - {} - - public Attributes(ConsistencyLevel cLevel, Long timestamp, int timeToLive) - { - this.cLevel = cLevel; - this.timestamp = timestamp; - this.timeToLive = timeToLive; - } - - public ConsistencyLevel getConsistencyLevel() - { - return cLevel; - } - - public void setConsistencyLevel(ConsistencyLevel cLevel) - { - this.cLevel = cLevel; - } - - public Long getTimestamp() - { - return timestamp; - } - - public void setTimestamp(Long timestamp) - { - this.timestamp = timestamp; - } - - public int getTimeToLive() - { - return timeToLive; - } - - public void setTimeToLive(int timeToLive) - { - this.timeToLive = timeToLive; - } - - public String toString() - { - return String.format("Attributes(consistency=%s, timestamp=%s, timeToLive=%s)", cLevel, timestamp, timeToLive); - } - -} diff --git a/src/java/org/apache/cassandra/cql/BatchStatement.java b/src/java/org/apache/cassandra/cql/BatchStatement.java deleted file mode 100644 index b141bcc5d828..000000000000 --- a/src/java/org/apache/cassandra/cql/BatchStatement.java +++ /dev/null @@ -1,104 +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.cql; - -import java.nio.ByteBuffer; -import java.util.LinkedList; -import java.util.List; - -import org.apache.cassandra.db.IMutation; -import org.apache.cassandra.db.ConsistencyLevel; -import org.apache.cassandra.exceptions.InvalidRequestException; -import org.apache.cassandra.exceptions.UnauthorizedException; -import org.apache.cassandra.thrift.ThriftClientState; - -/** - * A BATCH statement parsed from a CQL query. - * - */ -public class BatchStatement -{ - // statements to execute - protected final List statements; - - // global consistency level - protected final ConsistencyLevel consistency; - - // global timestamp to apply for each mutation - protected final Long timestamp; - - // global time to live - protected final int timeToLive; - - /** - * Creates a new BatchStatement from a list of statements and a - * Thrift consistency level. - * - * @param statements a list of UpdateStatements - * @param attrs additional attributes for statement (CL, timestamp, timeToLive) - */ - public BatchStatement(List statements, Attributes attrs) - { - this.statements = statements; - this.consistency = attrs.getConsistencyLevel(); - this.timestamp = attrs.getTimestamp(); - this.timeToLive = attrs.getTimeToLive(); - } - - public List getStatements() - { - return statements; - } - - public ConsistencyLevel getConsistencyLevel() - { - return consistency; - } - - public int getTimeToLive() - { - return timeToLive; - } - - public long getTimestamp() - { - return timestamp; - } - - public List getMutations(String keyspace, ThriftClientState clientState, List variables) - throws InvalidRequestException, UnauthorizedException - { - List batch = new LinkedList(); - - for (AbstractModification statement : statements) { - batch.addAll(statement.prepareRowMutations(keyspace, clientState, timestamp, variables)); - } - - return batch; - } - - public boolean isSetTimestamp() - { - return timestamp != null; - } - - public String toString() - { - return String.format("BatchStatement(statements=%s, consistency=%s)", statements, consistency); - } -} diff --git a/src/java/org/apache/cassandra/cql/CFPropDefs.java b/src/java/org/apache/cassandra/cql/CFPropDefs.java deleted file mode 100644 index 42e840ea4de8..000000000000 --- a/src/java/org/apache/cassandra/cql/CFPropDefs.java +++ /dev/null @@ -1,307 +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.cql; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import com.google.common.base.Strings; -import com.google.common.collect.Sets; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.db.compaction.AbstractCompactionStrategy; -import org.apache.cassandra.db.marshal.AbstractType; -import org.apache.cassandra.db.marshal.TypeParser; -import org.apache.cassandra.exceptions.InvalidRequestException; -import org.apache.cassandra.exceptions.SyntaxException; -import org.apache.commons.lang3.StringUtils; - -public class CFPropDefs { - private static final Logger logger = LoggerFactory.getLogger(CFPropDefs.class); - - public static final String KW_COMPARATOR = "comparator"; - public static final String KW_COMMENT = "comment"; - public static final String KW_READREPAIRCHANCE = "read_repair_chance"; - public static final String KW_DCLOCALREADREPAIRCHANCE = "dclocal_read_repair_chance"; - public static final String KW_GCGRACESECONDS = "gc_grace_seconds"; - public static final String KW_DEFAULTVALIDATION = "default_validation"; - public static final String KW_MINCOMPACTIONTHRESHOLD = "min_compaction_threshold"; - public static final String KW_MAXCOMPACTIONTHRESHOLD = "max_compaction_threshold"; - public static final String KW_COMPACTION_STRATEGY_CLASS = "compaction_strategy_class"; - public static final String KW_CACHING = "caching"; - public static final String KW_ROWS_PER_PARTITION_TO_CACHE = "rows_per_partition_to_cache"; - public static final String KW_DEFAULT_TIME_TO_LIVE = "default_time_to_live"; - public static final String KW_SPECULATIVE_RETRY = "speculative_retry"; - public static final String KW_POPULATE_IO_CACHE_ON_FLUSH = "populate_io_cache_on_flush"; - public static final String KW_BF_FP_CHANCE = "bloom_filter_fp_chance"; - public static final String KW_MEMTABLE_FLUSH_PERIOD = "memtable_flush_period_in_ms"; - - // Maps CQL short names to the respective Cassandra comparator/validator class names - public static final Map comparators = new HashMap(); - public static final Set keywords = new HashSet(); - public static final Set obsoleteKeywords = new HashSet(); - public static final Set allowedKeywords = new HashSet(); - - public static final String COMPACTION_OPTIONS_PREFIX = "compaction_strategy_options"; - public static final String COMPRESSION_PARAMETERS_PREFIX = "compression_parameters"; - - static - { - comparators.put("ascii", "AsciiType"); - comparators.put("bigint", "LongType"); - comparators.put("blob", "BytesType"); - comparators.put("boolean", "BooleanType"); - comparators.put("counter", "CounterColumnType"); - comparators.put("decimal", "DecimalType"); - comparators.put("double", "DoubleType"); - comparators.put("float", "FloatType"); - comparators.put("int", "Int32Type"); - comparators.put("text", "UTF8Type"); - comparators.put("timestamp", "DateType"); - comparators.put("uuid", "UUIDType"); - comparators.put("varchar", "UTF8Type"); - comparators.put("varint", "IntegerType"); - - keywords.add(KW_COMPARATOR); - keywords.add(KW_COMMENT); - keywords.add(KW_READREPAIRCHANCE); - keywords.add(KW_DCLOCALREADREPAIRCHANCE); - keywords.add(KW_GCGRACESECONDS); - keywords.add(KW_DEFAULTVALIDATION); - keywords.add(KW_MINCOMPACTIONTHRESHOLD); - keywords.add(KW_MAXCOMPACTIONTHRESHOLD); - keywords.add(KW_COMPACTION_STRATEGY_CLASS); - keywords.add(KW_CACHING); - keywords.add(KW_ROWS_PER_PARTITION_TO_CACHE); - keywords.add(KW_DEFAULT_TIME_TO_LIVE); - keywords.add(KW_SPECULATIVE_RETRY); - keywords.add(KW_POPULATE_IO_CACHE_ON_FLUSH); - keywords.add(KW_BF_FP_CHANCE); - keywords.add(KW_MEMTABLE_FLUSH_PERIOD); - - obsoleteKeywords.add("row_cache_size"); - obsoleteKeywords.add("key_cache_size"); - obsoleteKeywords.add("row_cache_save_period_in_seconds"); - obsoleteKeywords.add("key_cache_save_period_in_seconds"); - obsoleteKeywords.add("memtable_throughput_in_mb"); - obsoleteKeywords.add("memtable_operations_in_millions"); - obsoleteKeywords.add("memtable_flush_after_mins"); - obsoleteKeywords.add("row_cache_provider"); - obsoleteKeywords.add("replicate_on_write"); - - allowedKeywords.addAll(keywords); - allowedKeywords.addAll(obsoleteKeywords); - } - - public final Map properties = new HashMap(); - public Class compactionStrategyClass; - public final Map compactionStrategyOptions = new HashMap(); - public final Map compressionParameters = new HashMap(); - - public void validate() throws InvalidRequestException, ConfigurationException - { - compactionStrategyClass = CFMetaData.DEFAULT_COMPACTION_STRATEGY_CLASS; - - // we need to remove parent:key = value pairs from the main properties - Set propsToRemove = new HashSet(); - - // check if we have compaction/compression options - for (String property : properties.keySet()) - { - if (!property.contains(":")) - continue; - - String key = property.split(":")[1]; - String val = properties.get(property); - - if (property.startsWith(COMPACTION_OPTIONS_PREFIX)) - { - compactionStrategyOptions.put(key, val); - propsToRemove.add(property); - } - - if (property.startsWith(COMPRESSION_PARAMETERS_PREFIX)) - { - compressionParameters.put(key, val); - propsToRemove.add(property); - } - } - - for (String property : propsToRemove) - properties.remove(property); - // Catch the case where someone passed a kwarg that is not recognized. - for (String bogus : Sets.difference(properties.keySet(), allowedKeywords)) - throw new InvalidRequestException(bogus + " is not a valid keyword argument for CREATE COLUMNFAMILY"); - for (String obsolete : Sets.intersection(properties.keySet(), obsoleteKeywords)) - logger.warn("Ignoring obsolete property {}", obsolete); - - // Validate min/max compaction thresholds - Integer minCompaction = getPropertyInt(KW_MINCOMPACTIONTHRESHOLD, null); - Integer maxCompaction = getPropertyInt(KW_MAXCOMPACTIONTHRESHOLD, null); - - if ((minCompaction != null) && (maxCompaction != null)) // Both min and max are set - { - if ((minCompaction > maxCompaction) && (maxCompaction != 0)) - throw new InvalidRequestException(String.format("%s cannot be larger than %s", - KW_MINCOMPACTIONTHRESHOLD, - KW_MAXCOMPACTIONTHRESHOLD)); - } - else if (minCompaction != null) // Only the min threshold is set - { - if (minCompaction > CFMetaData.DEFAULT_MAX_COMPACTION_THRESHOLD) - throw new InvalidRequestException(String.format("%s cannot be larger than %s, (default %s)", - KW_MINCOMPACTIONTHRESHOLD, - KW_MAXCOMPACTIONTHRESHOLD, - CFMetaData.DEFAULT_MAX_COMPACTION_THRESHOLD)); - } - else if (maxCompaction != null) // Only the max threshold is set - { - if ((maxCompaction < CFMetaData.DEFAULT_MIN_COMPACTION_THRESHOLD) && (maxCompaction != 0)) - throw new InvalidRequestException(String.format("%s cannot be smaller than %s, (default %s)", - KW_MAXCOMPACTIONTHRESHOLD, - KW_MINCOMPACTIONTHRESHOLD, - CFMetaData.DEFAULT_MIN_COMPACTION_THRESHOLD)); - } - - Integer defaultTimeToLive = getPropertyInt(KW_DEFAULT_TIME_TO_LIVE, null); - - if (defaultTimeToLive != null) - { - if (defaultTimeToLive < 0) - throw new InvalidRequestException(String.format("%s cannot be smaller than %s, (default %s)", - KW_DEFAULT_TIME_TO_LIVE, - 0, - CFMetaData.DEFAULT_DEFAULT_TIME_TO_LIVE)); - } - - CFMetaData.validateCompactionOptions(compactionStrategyClass, compactionStrategyOptions); - } - - /** Map a keyword to the corresponding value */ - public void addProperty(String name, String value) - { - properties.put(name, value); - } - - public Boolean hasProperty(String name) - { - return properties.containsKey(name); - } - - /* If not comparator/validator is not specified, default to text (BytesType is the wrong default for CQL - * since it uses hex terms). If the value specified is not found in the comparators map, assume the user - * knows what they are doing (a custom comparator/validator for example), and pass it on as-is. - */ - - public AbstractType getComparator() throws ConfigurationException, SyntaxException - { - return TypeParser.parse((comparators.get(getPropertyString(KW_COMPARATOR, "text")) != null) - ? comparators.get(getPropertyString(KW_COMPARATOR, "text")) - : getPropertyString(KW_COMPARATOR, "text")); - } - - public AbstractType getValidator() throws ConfigurationException, SyntaxException - { - return TypeParser.parse((comparators.get(getPropertyString(KW_DEFAULTVALIDATION, "text")) != null) - ? comparators.get(getPropertyString(KW_DEFAULTVALIDATION, "text")) - : getPropertyString(KW_DEFAULTVALIDATION, "text")); - } - - public String getProperty(String name) - { - return properties.get(name); - } - - public String getPropertyString(String key, String defaultValue) - { - String value = properties.get(key); - return value != null ? value : defaultValue; - } - - // Return a property value, typed as a Boolean - public Boolean getPropertyBoolean(String key, Boolean defaultValue) - { - String value = properties.get(key); - return (value == null) ? defaultValue : value.toLowerCase().matches("(1|true|yes)"); - } - - // Return a property value, typed as a Double - public Double getPropertyDouble(String key, Double defaultValue) throws InvalidRequestException - { - Double result; - String value = properties.get(key); - - if (value == null) - result = defaultValue; - else - { - try - { - result = Double.valueOf(value); - } - catch (NumberFormatException e) - { - throw new InvalidRequestException(String.format("%s not valid for \"%s\"", value, key)); - } - } - return result; - } - - // Return a property value, typed as an Integer - public Integer getPropertyInt(String key, Integer defaultValue) throws InvalidRequestException - { - Integer result; - String value = properties.get(key); - - if (value == null) - result = defaultValue; - else - { - try - { - result = Integer.valueOf(value); - } - catch (NumberFormatException e) - { - throw new InvalidRequestException(String.format("%s not valid for \"%s\"", value, key)); - } - } - return result; - } - - public Set getPropertySet(String key, Set defaultValue) - { - String value = properties.get(key); - if (Strings.isNullOrEmpty(value)) - return defaultValue; - return Sets.newHashSet(StringUtils.split(value, ',')); - } - - public String toString() - { - return String.format("CFPropDefs(%s, compaction: %s, compression: %s)", - properties.toString(), - compactionStrategyOptions.toString(), - compressionParameters.toString()); - } -} diff --git a/src/java/org/apache/cassandra/cql/CQLStatement.java b/src/java/org/apache/cassandra/cql/CQLStatement.java deleted file mode 100644 index 157ce6764517..000000000000 --- a/src/java/org/apache/cassandra/cql/CQLStatement.java +++ /dev/null @@ -1,32 +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.cql; - -public class CQLStatement -{ - public final StatementType type; - public final Object statement; - public final int boundTerms; - - public CQLStatement(StatementType type, Object statement, int lastMarker) - { - this.type = type; - this.statement = statement; - this.boundTerms = lastMarker + 1; - } -} diff --git a/src/java/org/apache/cassandra/cql/Cql.g b/src/java/org/apache/cassandra/cql/Cql.g deleted file mode 100644 index 3c41f44b40e7..000000000000 --- a/src/java/org/apache/cassandra/cql/Cql.g +++ /dev/null @@ -1,656 +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. - * - */ - -grammar Cql; - -options { - language = Java; -} - -@header { - package org.apache.cassandra.cql; - import java.util.Map; - import java.util.HashMap; - import java.util.Collections; - import java.util.List; - import java.util.ArrayList; - import org.apache.cassandra.exceptions.SyntaxException; - import org.apache.cassandra.utils.Pair; - import org.apache.cassandra.db.ConsistencyLevel; - - import static org.apache.cassandra.cql.AlterTableStatement.OperationType; -} - -@members { - private List recognitionErrors = new ArrayList(); - private int currentBindMarkerIdx = -1; - - public void displayRecognitionError(String[] tokenNames, RecognitionException e) - { - String hdr = getErrorHeader(e); - String msg = getErrorMessage(e, tokenNames); - recognitionErrors.add(hdr + " " + msg); - } - - public List getRecognitionErrors() - { - return recognitionErrors; - } - - public void throwLastRecognitionError() throws SyntaxException - { - if (recognitionErrors.size() > 0) - throw new SyntaxException(recognitionErrors.get((recognitionErrors.size()-1))); - } - - // used by UPDATE of the counter columns to validate if '-' was supplied by user - public void validateMinusSupplied(Object op, final Term value, IntStream stream) throws MissingTokenException - { - if (op == null && Long.parseLong(value.getText()) > 0) - throw new MissingTokenException(102, stream, value); - } -} - -@lexer::header { - package org.apache.cassandra.cql; - import org.apache.cassandra.exceptions.SyntaxException; -} - -@lexer::members { - List tokens = new ArrayList(); - - public void emit(Token token) { - state.token = token; - tokens.add(token); - } - - public Token nextToken() { - super.nextToken(); - if (tokens.size() == 0) - return Token.EOF_TOKEN; - return tokens.remove(0); - } - - private List recognitionErrors = new ArrayList(); - - public void displayRecognitionError(String[] tokenNames, RecognitionException e) - { - String hdr = getErrorHeader(e); - String msg = getErrorMessage(e, tokenNames); - recognitionErrors.add(hdr + " " + msg); - } - - public List getRecognitionErrors() - { - return recognitionErrors; - } - - public void throwLastRecognitionError() throws SyntaxException - { - if (recognitionErrors.size() > 0) - throw new SyntaxException(recognitionErrors.get((recognitionErrors.size()-1))); - } -} - -query returns [CQLStatement stmnt] - : selectStatement { $stmnt = new CQLStatement(StatementType.SELECT, $selectStatement.expr, currentBindMarkerIdx); } - | insertStatement endStmnt { $stmnt = new CQLStatement(StatementType.INSERT, $insertStatement.expr, currentBindMarkerIdx); } - | updateStatement endStmnt { $stmnt = new CQLStatement(StatementType.UPDATE, $updateStatement.expr, currentBindMarkerIdx); } - | batchStatement { $stmnt = new CQLStatement(StatementType.BATCH, $batchStatement.expr, currentBindMarkerIdx); } - | useStatement { $stmnt = new CQLStatement(StatementType.USE, $useStatement.keyspace, currentBindMarkerIdx); } - | truncateStatement { $stmnt = new CQLStatement(StatementType.TRUNCATE, $truncateStatement.cf, currentBindMarkerIdx); } - | deleteStatement endStmnt { $stmnt = new CQLStatement(StatementType.DELETE, $deleteStatement.expr, currentBindMarkerIdx); } - | createKeyspaceStatement { $stmnt = new CQLStatement(StatementType.CREATE_KEYSPACE, $createKeyspaceStatement.expr, currentBindMarkerIdx); } - | createColumnFamilyStatement { $stmnt = new CQLStatement(StatementType.CREATE_COLUMNFAMILY, $createColumnFamilyStatement.expr, currentBindMarkerIdx); } - | createIndexStatement { $stmnt = new CQLStatement(StatementType.CREATE_INDEX, $createIndexStatement.expr, currentBindMarkerIdx); } - | dropIndexStatement { $stmnt = new CQLStatement(StatementType.DROP_INDEX, $dropIndexStatement.expr, currentBindMarkerIdx); } - | dropKeyspaceStatement { $stmnt = new CQLStatement(StatementType.DROP_KEYSPACE, $dropKeyspaceStatement.ksp, currentBindMarkerIdx); } - | dropColumnFamilyStatement { $stmnt = new CQLStatement(StatementType.DROP_COLUMNFAMILY, $dropColumnFamilyStatement.cfam, currentBindMarkerIdx); } - | alterTableStatement { $stmnt = new CQLStatement(StatementType.ALTER_TABLE, $alterTableStatement.expr, currentBindMarkerIdx); } - ; - -// USE ; -useStatement returns [String keyspace] - : K_USE name=( IDENT | INTEGER | STRING_LITERAL ) { $keyspace = $name.text; } endStmnt - ; - -/** - * SELECT - * (REVERSED)? - * FROM - * - * USING - * CONSISTENCY - * WHERE - * KEY = "key1" AND KEY = "key2" AND - * COL > 1 AND COL < 100 - * LIMIT ; - */ -selectStatement returns [SelectStatement expr] - : { - int numRecords = 10000; - SelectExpression expression = null; - boolean isCountOp = false; - ConsistencyLevel cLevel = ConsistencyLevel.ONE; - } - K_SELECT - ( s1=selectExpression { expression = s1; } - | K_COUNT '(' s2=selectExpression ')' { expression = s2; isCountOp = true; } - ) - K_FROM (keyspace=(IDENT | STRING_LITERAL | INTEGER) '.')? columnFamily=( IDENT | STRING_LITERAL | INTEGER ) - ( K_USING K_CONSISTENCY K_LEVEL { cLevel = ConsistencyLevel.valueOf($K_LEVEL.text.toUpperCase()); } )? - ( K_WHERE whereClause )? - ( K_LIMIT rows=INTEGER { numRecords = Integer.parseInt($rows.text); } )? - endStmnt - { - return new SelectStatement(expression, - isCountOp, - $keyspace.text, - $columnFamily.text, - cLevel, - $whereClause.clause, - numRecords); - } - ; - -// [FIRST n] [REVERSED] name1[[[,name2],nameN],...] -// [FIRST n] [REVERSED] name1..nameN -selectExpression returns [SelectExpression expr] - : { - int count = 10000; - boolean reversed = false; - boolean hasFirstSet = false; - } - ( K_FIRST { hasFirstSet = true; } cols=INTEGER { count = Integer.parseInt($cols.text); } )? - ( K_REVERSED { reversed = true; } )? - ( first=term { $expr = new SelectExpression(first, count, reversed, hasFirstSet); } - (',' next=term { $expr.and(next); })* - | start=term RANGEOP finish=term { $expr = new SelectExpression(start, finish, count, reversed, false, hasFirstSet); } - | '\*' { $expr = new SelectExpression(new Term(), new Term(), count, reversed, true, hasFirstSet); } - ) - ; - -// relation [[AND relation] ...] -whereClause returns [WhereClause clause] - @init { - WhereClause inClause = new WhereClause(); - } - : first=relation { $clause = new WhereClause(first); } - (K_AND next=relation { $clause.and(next); })* - | key_alias=term { inClause.setKeyAlias(key_alias.getText()); } - K_IN '(' f1=term { inClause.andKeyEquals(f1); } - (',' fN=term { inClause.andKeyEquals(fN); } )* ')' - { inClause.setMultiKey(true); $clause = inClause; } - ; - -/** - * INSERT INTO - * - * (KEY, , , ...) - * VALUES - * (, , , ...) - * (USING - * CONSISTENCY - * (AND TIMESTAMP )? - * )?; - * - * Consistency level is set to ONE by default - */ -insertStatement returns [UpdateStatement expr] - : { - Attributes attrs = new Attributes(); - - List columnNames = new ArrayList(); - List columnValues = new ArrayList(); - } - K_INSERT K_INTO (keyspace=(IDENT | STRING_LITERAL | INTEGER) '.')? columnFamily=( IDENT | STRING_LITERAL | INTEGER ) - '(' key_alias=term ( ',' column_name=term { columnNames.add($column_name.item); } )+ ')' - K_VALUES - '(' key=term ( ',' column_value=term { columnValues.add($column_value.item); })+ ')' - ( usingClause[attrs] )? - { - return new UpdateStatement($keyspace.text, $columnFamily.text, key_alias.getText(), columnNames, columnValues, Collections.singletonList(key), attrs); - } - ; - -usingClause[Attributes attrs] - : K_USING usingClauseObjective[attrs] ( K_AND? usingClauseObjective[attrs] )* - ; - -usingClauseDelete[Attributes attrs] - : K_USING usingClauseDeleteObjective[attrs] ( K_AND? usingClauseDeleteObjective[attrs] )* - ; - -usingClauseDeleteObjective[Attributes attrs] - : K_CONSISTENCY K_LEVEL { attrs.setConsistencyLevel(ConsistencyLevel.valueOf($K_LEVEL.text.toUpperCase())); } - | K_TIMESTAMP ts=INTEGER { attrs.setTimestamp(Long.valueOf($ts.text)); } - ; - -usingClauseObjective[Attributes attrs] - : usingClauseDeleteObjective[attrs] - | K_TTL t=INTEGER { attrs.setTimeToLive(Integer.parseInt($t.text)); } - ; - -/** - * BEGIN BATCH [USING CONSISTENCY ] - * UPDATE SET name1 = value1 WHERE KEY = keyname1; - * UPDATE SET name2 = value2 WHERE KEY = keyname2; - * UPDATE SET name3 = value3 WHERE KEY = keyname3; - * ... - * APPLY BATCH - * - * OR - * - * BEGIN BATCH [USING CONSISTENCY ] - * INSERT INTO (KEY, ) VALUES ('', ''); - * INSERT INTO (KEY, ) VALUES ('', ''); - * ... - * APPLY BATCH - * - * OR - * - * BEGIN BATCH [USING CONSISTENCY ] - * DELETE name1, name2 FROM WHERE key = - * DELETE name3, name4 FROM WHERE key = - * ... - * APPLY BATCH - */ -batchStatement returns [BatchStatement expr] - : { - Attributes attrs = new Attributes(); - attrs.setConsistencyLevel(ConsistencyLevel.ONE); - - List statements = new ArrayList(); - } - K_BEGIN K_BATCH ( usingClause[attrs] )? - s1=batchStatementObjective ';'? { statements.add(s1); } ( sN=batchStatementObjective ';'? { statements.add(sN); } )* - K_APPLY K_BATCH endStmnt - { - return new BatchStatement(statements, attrs); - } - ; - -batchStatementObjective returns [AbstractModification statement] - : i=insertStatement { $statement = i; } - | u=updateStatement { $statement = u; } - | d=deleteStatement { $statement = d; } - ; - -/** - * UPDATE - * - * (USING - * CONSISTENCY.ONE - * (AND TIMESTAMP )? - * )? - * SET - * name1 = value1, - * name2 = value2 - * WHERE - * KEY = keyname; - */ -updateStatement returns [UpdateStatement expr] - : { - Attributes attrs = new Attributes(); - Map columns = new HashMap(); - List keyList = null; - } - K_UPDATE (keyspace=(IDENT | STRING_LITERAL | INTEGER) '.')? columnFamily=( IDENT | STRING_LITERAL | INTEGER ) - ( usingClause[attrs] )? - K_SET termPairWithOperation[columns] (',' termPairWithOperation[columns])* - K_WHERE ( key_alias=term ('=' key=term { keyList = Collections.singletonList(key); } - | - K_IN '(' keys=termList { keyList = $keys.items; } ')' )) - { - return new UpdateStatement($keyspace.text, $columnFamily.text, key_alias.getText(), columns, keyList, attrs); - } - ; - -/** - * DELETE - * name1, name2 - * FROM - * - * USING - * CONSISTENCY. - * WHERE - * KEY = keyname; - */ -deleteStatement returns [DeleteStatement expr] - : { - Attributes attrs = new Attributes(); - List keyList = null; - List columnsList = Collections.emptyList(); - } - K_DELETE - ( cols=termList { columnsList = $cols.items; })? - K_FROM (keyspace=(IDENT | STRING_LITERAL | INTEGER) '.')? columnFamily=( IDENT | STRING_LITERAL | INTEGER ) - ( usingClauseDelete[attrs] )? - ( K_WHERE key_alias=term ('=' key=term { keyList = Collections.singletonList(key); } - | K_IN '(' keys=termList { keyList = $keys.items; } ')') - )? - { - return new DeleteStatement(columnsList, $keyspace.text, $columnFamily.text, key_alias.getText(), keyList, attrs); - } - ; - - - -/** CREATE KEYSPACE WITH attr1 = value1 AND attr2 = value2; */ -createKeyspaceStatement returns [CreateKeyspaceStatement expr] - : { - Map attrs = new HashMap(); - } - K_CREATE K_KEYSPACE keyspace=( IDENT | STRING_LITERAL | INTEGER ) - K_WITH a1=( COMPIDENT | IDENT ) '=' v1=( STRING_LITERAL | INTEGER | IDENT ) { attrs.put($a1.text, $v1.text); } - ( K_AND aN=( COMPIDENT | IDENT ) '=' vN=( STRING_LITERAL | INTEGER | IDENT ) { attrs.put($aN.text, $vN.text); } )* - endStmnt - { - return new CreateKeyspaceStatement($keyspace.text, attrs); - } - ; - -/** - * CREATE COLUMNFAMILY ( - * , - * , - * - * ) WITH comparator = [AND ...]; - */ -createColumnFamilyStatement returns [CreateColumnFamilyStatement expr] - : K_CREATE K_COLUMNFAMILY name=( IDENT | STRING_LITERAL | INTEGER ) { $expr = new CreateColumnFamilyStatement($name.text); } - ( '(' createCfamColumns[expr] ( ',' createCfamColumns[expr] )* ')' )? - ( K_WITH prop1=(COMPIDENT | IDENT) '=' arg1=createCfamKeywordArgument { $expr.addProperty($prop1.text, $arg1.arg); } - ( K_AND propN=(COMPIDENT | IDENT) '=' argN=createCfamKeywordArgument { $expr.addProperty($propN.text, $argN.arg); } )* - )? - endStmnt - ; - -createCfamColumns[CreateColumnFamilyStatement expr] - : n=term v=createCfamColumnValidator { $expr.addColumn(n, $v.validator); } - | k=term v=createCfamColumnValidator K_PRIMARY K_KEY { $expr.setKeyAlias(k.getText()); $expr.setKeyType($v.validator); } - ; - -createCfamColumnValidator returns [String validator] - : comparatorType { $validator = $comparatorType.text; } - | STRING_LITERAL { $validator = $STRING_LITERAL.text; } - ; - -createCfamKeywordArgument returns [String arg] - : comparatorType { $arg = $comparatorType.text; } - | value=( STRING_LITERAL | IDENT | INTEGER | FLOAT ) { $arg = $value.text; } - ; - -/** CREATE INDEX [indexName] ON columnFamily (columnName); */ -createIndexStatement returns [CreateIndexStatement expr] - : K_CREATE K_INDEX (idxName=IDENT)? K_ON cf=( IDENT | STRING_LITERAL | INTEGER ) '(' columnName=term ')' endStmnt - { $expr = new CreateIndexStatement($idxName.text, $cf.text, columnName); } - ; -/** - * DROP INDEX ON . - * DROP INDEX - */ -dropIndexStatement returns [DropIndexStatement expr] - : - K_DROP K_INDEX index=( IDENT | STRING_LITERAL | INTEGER ) endStmnt - { $expr = new DropIndexStatement($index.text); } - ; - -/** DROP KEYSPACE ; */ -dropKeyspaceStatement returns [String ksp] - : K_DROP K_KEYSPACE name=( IDENT | STRING_LITERAL | INTEGER ) endStmnt { $ksp = $name.text; } - ; - - -alterTableStatement returns [AlterTableStatement expr] - : - { - OperationType type = null; - String columnFamily = null, columnName = null, validator = null; - Map propertyMap = null; - } - K_ALTER K_COLUMNFAMILY name=( IDENT | STRING_LITERAL | INTEGER ) { columnFamily = $name.text; } - ( K_ALTER { type = OperationType.ALTER; } - (col=( IDENT | STRING_LITERAL | INTEGER ) { columnName = $col.text; }) - K_TYPE alterValidator=comparatorType { validator = $alterValidator.text; } - | K_ADD { type = OperationType.ADD; } - (col=( IDENT | STRING_LITERAL | INTEGER ) { columnName = $col.text; }) - addValidator=comparatorType { validator = $addValidator.text; } - | K_DROP { type = OperationType.DROP; } - (col=( IDENT | STRING_LITERAL | INTEGER ) { columnName = $col.text; }) - | K_WITH { type = OperationType.OPTS; propertyMap = new HashMap(); } - prop1=(COMPIDENT | IDENT) '=' arg1=createCfamKeywordArgument { propertyMap.put($prop1.text, $arg1.arg); } - ( K_AND propN=(COMPIDENT | IDENT) '=' argN=createCfamKeywordArgument { propertyMap.put($propN.text, $argN.arg); } )* ) - endStmnt - { - $expr = new AlterTableStatement(columnFamily, type, columnName, validator, propertyMap); - } - ; - -/** DROP COLUMNFAMILY ; */ -dropColumnFamilyStatement returns [String cfam] - : K_DROP K_COLUMNFAMILY name=( IDENT | STRING_LITERAL | INTEGER ) endStmnt { $cfam = $name.text; } - ; - -comparatorType - : 'blob' | 'ascii' | 'text' | 'varchar' | 'int' | 'varint' | 'bigint' | 'uuid' | 'counter' | 'boolean' | 'timestamp' | 'float' | 'double' | 'decimal' - ; - -term returns [Term item] - : (( t=K_KEY | t=STRING_LITERAL | t=INTEGER | t=UUID | t=IDENT | t=FLOAT ) { $item = new Term($t.text, $t.type); } - | t=QMARK { $item = new Term($t.text, $t.type, ++currentBindMarkerIdx); } - ) - ; - -termList returns [List items] - : { $items = new ArrayList(); } - t1=term { $items.add(t1); } (',' tN=term { $items.add(tN); })* - ; - -// term = term -termPair[Map columns] - : key=term '=' value=term { columns.put(key, value); } - ; - -intTerm returns [Term integer] - : t=INTEGER { $integer = new Term($t.text, $t.type); } - ; - -termPairWithOperation[Map columns] - : key=term '=' (value=term { columns.put(key, new Operation(value)); } - | c=term ( '+' v=term { columns.put(key, new Operation(c, org.apache.cassandra.cql.Operation.OperationType.PLUS, v)); } - | op='-'? v=intTerm - { validateMinusSupplied(op, v, input); - if (op != null) v = new Term(-(Long.valueOf(v.getText())), v.getType()); - columns.put(key, new Operation(c, org.apache.cassandra.cql.Operation.OperationType.MINUS, v)); } )) - ; - -// Note: ranges are inclusive so >= and >, and < and <= all have the same semantics. -relation returns [Relation rel] - : name=term type=('=' | '<' | '<=' | '>=' | '>') t=term - { return new Relation($name.item, $type.text, $t.item); } - ; - -// TRUNCATE ; -truncateStatement returns [Pair cf] - : K_TRUNCATE (keyspace=( IDENT | STRING_LITERAL | INTEGER ) '.')? columnFamily=( IDENT | STRING_LITERAL | INTEGER ) { $cf = Pair.create($keyspace.text, $columnFamily.text); } endStmnt - ; - -endStmnt - : ';'? EOF - ; - - -// Case-insensitive keywords -K_SELECT: S E L E C T; -K_FROM: F R O M; -K_WHERE: W H E R E; -K_AND: A N D; -K_KEY: K E Y; -K_INSERT: I N S E R T; -K_UPDATE: U P D A T E; -K_WITH: W I T H; -K_LIMIT: L I M I T; -K_USING: U S I N G; -K_CONSISTENCY: C O N S I S T E N C Y; -K_LEVEL: ( O N E - | Q U O R U M - | A L L - | A N Y - | L O C A L '_' Q U O R U M - | E A C H '_' Q U O R U M - | T W O - | T H R E E - ) - ; -K_USE: U S E; -K_FIRST: F I R S T; -K_REVERSED: R E V E R S E D; -K_COUNT: C O U N T; -K_SET: S E T; -K_BEGIN: B E G I N; -K_APPLY: A P P L Y; -K_BATCH: B A T C H; -K_TRUNCATE: T R U N C A T E; -K_DELETE: D E L E T E; -K_IN: I N; -K_CREATE: C R E A T E; -K_KEYSPACE: ( K E Y S P A C E - | S C H E M A ); -K_COLUMNFAMILY:( C O L U M N F A M I L Y - | T A B L E ); -K_INDEX: I N D E X; -K_ON: O N; -K_DROP: D R O P; -K_PRIMARY: P R I M A R Y; -K_INTO: I N T O; -K_VALUES: V A L U E S; -K_TIMESTAMP: T I M E S T A M P; -K_TTL: T T L; -K_ALTER: A L T E R; -K_ADD: A D D; -K_TYPE: T Y P E; - -// Case-insensitive alpha characters -fragment A: ('a'|'A'); -fragment B: ('b'|'B'); -fragment C: ('c'|'C'); -fragment D: ('d'|'D'); -fragment E: ('e'|'E'); -fragment F: ('f'|'F'); -fragment G: ('g'|'G'); -fragment H: ('h'|'H'); -fragment I: ('i'|'I'); -fragment J: ('j'|'J'); -fragment K: ('k'|'K'); -fragment L: ('l'|'L'); -fragment M: ('m'|'M'); -fragment N: ('n'|'N'); -fragment O: ('o'|'O'); -fragment P: ('p'|'P'); -fragment Q: ('q'|'Q'); -fragment R: ('r'|'R'); -fragment S: ('s'|'S'); -fragment T: ('t'|'T'); -fragment U: ('u'|'U'); -fragment V: ('v'|'V'); -fragment W: ('w'|'W'); -fragment X: ('x'|'X'); -fragment Y: ('y'|'Y'); -fragment Z: ('z'|'Z'); - -STRING_LITERAL - : '\'' - { StringBuilder b = new StringBuilder(); } - ( c=~('\'') { b.appendCodePoint(c);} - | '\'' '\'' { b.appendCodePoint('\'');} - )* - '\'' - { setText(b.toString()); } - ; - -fragment DIGIT - : '0'..'9' - ; - -fragment LETTER - : ('A'..'Z' | 'a'..'z') - ; - -fragment HEX - : ('A'..'F' | 'a'..'f' | '0'..'9') - ; - -RANGEOP - : '..' - ; - -INTEGER - : '-'? DIGIT+ - ; - -QMARK - : '?' - ; - - -/* Normally a lexer only emits one token at a time, but ours is tricked out - * to support multiple (see @lexer::members near the top of the grammar). - */ -FLOAT - : d=INTEGER r=RANGEOP - { - $d.setType(INTEGER); - emit($d); - $r.setType(RANGEOP); - emit($r); - } - | INTEGER '.' INTEGER - ; - -IDENT - : LETTER (LETTER | DIGIT | '_')* - ; - -COMPIDENT - : IDENT ( ':' (IDENT | INTEGER))* - ; - -UUID - : HEX HEX HEX HEX HEX HEX HEX HEX '-' - HEX HEX HEX HEX '-' - HEX HEX HEX HEX '-' - HEX HEX HEX HEX '-' - HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX - ; - -WS - : (' ' | '\t' | '\n' | '\r')+ { $channel = HIDDEN; } - ; - -COMMENT - : ('--' | '//') .* ('\n'|'\r') { $channel = HIDDEN; } - ; - -MULTILINE_COMMENT - : '/*' .* '*/' { $channel = HIDDEN; } - ; diff --git a/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java b/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java deleted file mode 100644 index e568dd7dcbb3..000000000000 --- a/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java +++ /dev/null @@ -1,253 +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.cql; - -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.config.ColumnDefinition; -import org.apache.cassandra.db.composites.SimpleDenseCellNameType; -import org.apache.cassandra.db.ColumnFamilyType; -import org.apache.cassandra.db.marshal.AbstractType; -import org.apache.cassandra.db.marshal.TypeParser; -import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.exceptions.InvalidRequestException; -import org.apache.cassandra.exceptions.SyntaxException; -import org.apache.cassandra.utils.ByteBufferUtil; -import org.apache.cassandra.io.compress.CompressionParameters; - -/** A CREATE COLUMNFAMILY parsed from a CQL query statement. */ -public class CreateColumnFamilyStatement -{ - private final String name; - private final Map columns = new HashMap(); - private final List keyValidator = new ArrayList(); - private ByteBuffer keyAlias = null; - private final CFPropDefs cfProps = new CFPropDefs(); - - public CreateColumnFamilyStatement(String name) - { - this.name = name; - } - - /** Perform validation of parsed params */ - private void validate(List variables) throws InvalidRequestException - { - // Ensure that exactly one key has been specified. - if (keyValidator.size() < 1) - throw new InvalidRequestException("You must specify a PRIMARY KEY"); - else if (keyValidator.size() > 1) - throw new InvalidRequestException("You may only specify one PRIMARY KEY"); - - AbstractType comparator; - - try - { - cfProps.validate(); - comparator = cfProps.getComparator(); - } - catch (ConfigurationException e) - { - throw new InvalidRequestException(e.toString()); - } - catch (SyntaxException e) - { - throw new InvalidRequestException(e.toString()); - } - - for (Map.Entry column : columns.entrySet()) - { - ByteBuffer name = column.getKey().getByteBuffer(comparator, variables); - - if (keyAlias != null && keyAlias.equals(name)) - throw new InvalidRequestException("Invalid column name: " - + column.getKey().getText() - + ", because it equals to the key_alias."); - - } - } - - /** Map a column name to a validator for its value */ - public void addColumn(Term term, String comparator) - { - columns.put(term, comparator); - } - - public void setKeyType(String validator) - { - keyValidator.add(validator); - } - - public String getKeyType() - { - return keyValidator.get(0); - } - - public void setKeyAlias(String alias) - { - // if we got KEY in input we don't need to set an alias - if (!alias.toUpperCase().equals("KEY")) - keyAlias = ByteBufferUtil.bytes(alias); - } - - /** Map a keyword to the corresponding value */ - public void addProperty(String name, String value) - { - cfProps.addProperty(name, value); - } - - /** Name of the column family to create */ - public String getName() - { - return name; - } - - // Column definitions - private List getColumns(CFMetaData cfm) throws InvalidRequestException - { - List columnDefs = new ArrayList<>(columns.size()); - - for (Map.Entry col : columns.entrySet()) - { - try - { - ByteBuffer columnName = cfm.comparator.asAbstractType().fromStringCQL2(col.getKey().getText()); - String validatorClassName = CFPropDefs.comparators.containsKey(col.getValue()) - ? CFPropDefs.comparators.get(col.getValue()) - : col.getValue(); - AbstractType validator = TypeParser.parse(validatorClassName); - columnDefs.add(ColumnDefinition.regularDef(cfm, columnName, validator, null)); - } - catch (ConfigurationException e) - { - InvalidRequestException ex = new InvalidRequestException(e.toString()); - ex.initCause(e); - throw ex; - } - catch (SyntaxException e) - { - InvalidRequestException ex = new InvalidRequestException(e.toString()); - ex.initCause(e); - throw ex; - } - } - - return columnDefs; - } - - /** - * Returns a CFMetaData instance based on the parameters parsed from this - * CREATE statement, or defaults where applicable. - * - * @param keyspace keyspace to apply this column family to - * @return a CFMetaData instance corresponding to the values parsed from this statement - * @throws InvalidRequestException on failure to validate parsed parameters - */ - public CFMetaData getCFMetaData(String keyspace, List variables) throws InvalidRequestException - { - validate(variables); - - CFMetaData newCFMD; - try - { - AbstractType comparator = cfProps.getComparator(); - - newCFMD = new CFMetaData(keyspace, - name, - ColumnFamilyType.Standard, - new SimpleDenseCellNameType(comparator)); - - if (CFMetaData.DEFAULT_COMPRESSOR != null && cfProps.compressionParameters.isEmpty()) - cfProps.compressionParameters.put(CompressionParameters.SSTABLE_COMPRESSION, CFMetaData.DEFAULT_COMPRESSOR); - int maxCompactionThreshold = getPropertyInt(CFPropDefs.KW_MAXCOMPACTIONTHRESHOLD, CFMetaData.DEFAULT_MAX_COMPACTION_THRESHOLD); - int minCompactionThreshold = getPropertyInt(CFPropDefs.KW_MINCOMPACTIONTHRESHOLD, CFMetaData.DEFAULT_MIN_COMPACTION_THRESHOLD); - if (minCompactionThreshold <= 0 || maxCompactionThreshold <= 0) - throw new ConfigurationException("Disabling compaction by setting compaction thresholds to 0 has been deprecated, set the compaction option 'enabled' to false instead."); - - newCFMD.addAllColumnDefinitions(getColumns(newCFMD)) - .comment(cfProps.getProperty(CFPropDefs.KW_COMMENT)) - .readRepairChance(getPropertyDouble(CFPropDefs.KW_READREPAIRCHANCE, CFMetaData.DEFAULT_READ_REPAIR_CHANCE)) - .dcLocalReadRepairChance(getPropertyDouble(CFPropDefs.KW_DCLOCALREADREPAIRCHANCE, CFMetaData.DEFAULT_DCLOCAL_READ_REPAIR_CHANCE)) - .gcGraceSeconds(getPropertyInt(CFPropDefs.KW_GCGRACESECONDS, CFMetaData.DEFAULT_GC_GRACE_SECONDS)) - .defaultValidator(cfProps.getValidator()) - .minCompactionThreshold(minCompactionThreshold) - .maxCompactionThreshold(maxCompactionThreshold) - .keyValidator(TypeParser.parse(CFPropDefs.comparators.get(getKeyType()))) - .compactionStrategyClass(cfProps.compactionStrategyClass) - .compactionStrategyOptions(cfProps.compactionStrategyOptions) - .compressionParameters(CompressionParameters.create(cfProps.compressionParameters)) - .caching(CFMetaData.Caching.fromString(getPropertyString(CFPropDefs.KW_CACHING, CFMetaData.DEFAULT_CACHING_STRATEGY.toString()))) - .rowsPerPartitionToCache(CFMetaData.RowsPerPartitionToCache.fromString(cfProps.getPropertyString(CFPropDefs.KW_ROWS_PER_PARTITION_TO_CACHE, CFMetaData.DEFAULT_ROWS_PER_PARTITION_TO_CACHE.toString()))) - .speculativeRetry(CFMetaData.SpeculativeRetry.fromString(getPropertyString(CFPropDefs.KW_SPECULATIVE_RETRY, CFMetaData.DEFAULT_SPECULATIVE_RETRY.toString()))) - .bloomFilterFpChance(getPropertyDouble(CFPropDefs.KW_BF_FP_CHANCE, null)) - .memtableFlushPeriod(getPropertyInt(CFPropDefs.KW_MEMTABLE_FLUSH_PERIOD, 0)) - .defaultTimeToLive(getPropertyInt(CFPropDefs.KW_DEFAULT_TIME_TO_LIVE, CFMetaData.DEFAULT_DEFAULT_TIME_TO_LIVE)) - .populateIoCacheOnFlush(getPropertyBoolean(CFPropDefs.KW_POPULATE_IO_CACHE_ON_FLUSH, CFMetaData.DEFAULT_POPULATE_IO_CACHE_ON_FLUSH)); - - // CQL2 can have null keyAliases - if (keyAlias != null) - newCFMD.addColumnDefinition(ColumnDefinition.partitionKeyDef(newCFMD, keyAlias, newCFMD.getKeyValidator(), null)); - } - catch (ConfigurationException e) - { - throw new InvalidRequestException(e.toString()); - } - catch (SyntaxException e) - { - throw new InvalidRequestException(e.toString()); - } - return newCFMD; - } - - private String getPropertyString(String key, String defaultValue) - { - return cfProps.getPropertyString(key, defaultValue); - } - - private Boolean getPropertyBoolean(String key, Boolean defaultValue) - { - return cfProps.getPropertyBoolean(key, defaultValue); - } - - private Double getPropertyDouble(String key, Double defaultValue) throws InvalidRequestException - { - return cfProps.getPropertyDouble(key, defaultValue); - } - - private Integer getPropertyInt(String key, Integer defaultValue) throws InvalidRequestException - { - return cfProps.getPropertyInt(key, defaultValue); - } - - private Set getPropertySet(String key, Set defaultValue) - { - return cfProps.getPropertySet(key, defaultValue); - } - - public Map getColumns() - { - return columns; - } - -} - diff --git a/src/java/org/apache/cassandra/cql/CreateIndexStatement.java b/src/java/org/apache/cassandra/cql/CreateIndexStatement.java deleted file mode 100644 index 54b5eef43b92..000000000000 --- a/src/java/org/apache/cassandra/cql/CreateIndexStatement.java +++ /dev/null @@ -1,51 +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.cql; - -/** A CREATE INDEX statement parsed from a CQL query. */ -public class CreateIndexStatement -{ - private final String columnFamily; - private final String indexName; - private final Term columnName; - - public CreateIndexStatement(String indexName, String columnFamily, Term columnName) - { - this.indexName = indexName; - this.columnFamily = columnFamily; - this.columnName = columnName; - } - - /** Column family namespace. */ - public String getColumnFamily() - { - return columnFamily; - } - - /** Column name to index. */ - public Term getColumnName() - { - return columnName; - } - - /** Index name (or null). */ - public String getIndexName() - { - return indexName; - } -} diff --git a/src/java/org/apache/cassandra/cql/CreateKeyspaceStatement.java b/src/java/org/apache/cassandra/cql/CreateKeyspaceStatement.java deleted file mode 100644 index 8c2aa1ba204b..000000000000 --- a/src/java/org/apache/cassandra/cql/CreateKeyspaceStatement.java +++ /dev/null @@ -1,80 +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.cql; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.cassandra.exceptions.InvalidRequestException; - -/** A CREATE KEYSPACE statement parsed from a CQL query. */ -public class CreateKeyspaceStatement -{ - private final String name; - private final Map attrs; - private String strategyClass; - private final Map strategyOptions = new HashMap(); - - /** - * Creates a new CreateKeyspaceStatement instance for a given - * keyspace name and keyword arguments. - * - * @param name the name of the keyspace to create - * @param attrs map of the raw keyword arguments that followed the WITH keyword. - */ - public CreateKeyspaceStatement(String name, Map attrs) - { - this.name = name; - this.attrs = attrs; - } - - /** - * The CqlParser only goes as far as extracting the keyword arguments - * from these statements, so this method is responsible for processing and - * validating, and must be called prior to access. - * - * @throws InvalidRequestException if arguments are missing or unacceptable - */ - public void validate() throws InvalidRequestException - { - // required - if (!attrs.containsKey("strategy_class")) - throw new InvalidRequestException("missing required argument \"strategy_class\""); - strategyClass = attrs.get("strategy_class"); - - // optional - for (String key : attrs.keySet()) - if ((key.contains(":")) && (key.startsWith("strategy_options"))) - strategyOptions.put(key.split(":")[1], attrs.get(key)); - } - - public String getName() - { - return name; - } - - public String getStrategyClass() - { - return strategyClass; - } - - public Map getStrategyOptions() - { - return strategyOptions; - } -} diff --git a/src/java/org/apache/cassandra/cql/DeleteStatement.java b/src/java/org/apache/cassandra/cql/DeleteStatement.java deleted file mode 100644 index 71942e486dc4..000000000000 --- a/src/java/org/apache/cassandra/cql/DeleteStatement.java +++ /dev/null @@ -1,123 +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.cql; - -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.List; - -import org.apache.cassandra.auth.Permission; -import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.config.Schema; -import org.apache.cassandra.db.Mutation; -import org.apache.cassandra.db.composites.CellName; -import org.apache.cassandra.db.IMutation; -import org.apache.cassandra.db.marshal.AbstractType; -import org.apache.cassandra.exceptions.InvalidRequestException; -import org.apache.cassandra.exceptions.UnauthorizedException; -import org.apache.cassandra.thrift.ThriftClientState; - -import static org.apache.cassandra.thrift.ThriftValidation.validateColumnFamily; -import static org.apache.cassandra.cql.QueryProcessor.validateColumnName; - -/** - * A DELETE parsed from a CQL query statement. - * - */ -public class DeleteStatement extends AbstractModification -{ - private List columns; - private List keys; - - public DeleteStatement(List columns, String keyspace, String columnFamily, String keyName, List keys, Attributes attrs) - { - super(keyspace, columnFamily, keyName, attrs); - - this.columns = columns; - this.keys = keys; - } - - public List getColumns() - { - return columns; - } - - public List getKeys() - { - return keys; - } - - public List prepareRowMutations(String keyspace, ThriftClientState clientState, List variables) - throws InvalidRequestException, UnauthorizedException - { - return prepareRowMutations(keyspace, clientState, null, variables); - } - - public List prepareRowMutations(String keyspace, ThriftClientState clientState, Long timestamp, List variables) - throws InvalidRequestException, UnauthorizedException - { - CFMetaData metadata = validateColumnFamily(keyspace, columnFamily); - - clientState.hasColumnFamilyAccess(keyspace, columnFamily, Permission.MODIFY); - AbstractType keyType = Schema.instance.getCFMetaData(keyspace, columnFamily).getKeyValidator(); - - List mutations = new ArrayList(keys.size()); - - for (Term key : keys) - mutations.add(mutationForKey(key.getByteBuffer(keyType, variables), keyspace, timestamp, clientState, variables, metadata)); - - return mutations; - } - - public Mutation mutationForKey(ByteBuffer key, String keyspace, Long timestamp, ThriftClientState clientState, List variables, CFMetaData metadata) - throws InvalidRequestException - { - Mutation mutation = new Mutation(keyspace, key); - - QueryProcessor.validateKeyAlias(metadata, keyName); - - if (columns.size() < 1) - { - // No columns, delete the partition - mutation.delete(columnFamily, (timestamp == null) ? getTimestamp(clientState) : timestamp); - } - else - { - // Delete specific columns - AbstractType at = metadata.comparator.asAbstractType(); - for (Term column : columns) - { - CellName columnName = metadata.comparator.cellFromByteBuffer(column.getByteBuffer(at, variables)); - validateColumnName(columnName); - mutation.delete(columnFamily, columnName, (timestamp == null) ? getTimestamp(clientState) : timestamp); - } - } - - return mutation; - } - - public String toString() - { - return String.format("DeleteStatement(columns=%s, keyspace=%s, columnFamily=%s, consistency=%s keys=%s)", - columns, - keyspace, - columnFamily, - cLevel, - keys); - } -} diff --git a/src/java/org/apache/cassandra/cql/DropIndexStatement.java b/src/java/org/apache/cassandra/cql/DropIndexStatement.java deleted file mode 100644 index bc9bbbc510c9..000000000000 --- a/src/java/org/apache/cassandra/cql/DropIndexStatement.java +++ /dev/null @@ -1,80 +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.cql; - -import org.apache.cassandra.config.*; -import org.apache.cassandra.exceptions.InvalidRequestException; - -public class DropIndexStatement -{ - public final String indexName; - private String keyspace; - - public DropIndexStatement(String indexName) - { - this.indexName = indexName; - } - - public void setKeyspace(String keyspace) - { - this.keyspace = keyspace; - } - - public String getColumnFamily() throws InvalidRequestException - { - return findIndexedCF().cfName; - } - - public CFMetaData generateCFMetadataUpdate() throws InvalidRequestException - { - return updateCFMetadata(findIndexedCF()); - } - - private CFMetaData updateCFMetadata(CFMetaData cfm) - { - ColumnDefinition column = findIndexedColumn(cfm); - assert column != null; - CFMetaData cloned = cfm.clone(); - ColumnDefinition toChange = cloned.getColumnDefinition(column.name); - assert toChange.getIndexName() != null && toChange.getIndexName().equals(indexName); - toChange.setIndexName(null); - toChange.setIndexType(null, null); - return cloned; - } - - private CFMetaData findIndexedCF() throws InvalidRequestException - { - KSMetaData ksm = Schema.instance.getKSMetaData(keyspace); - for (CFMetaData cfm : ksm.cfMetaData().values()) - { - if (findIndexedColumn(cfm) != null) - return cfm; - } - throw new InvalidRequestException("Index '" + indexName + "' could not be found in any of the column families of keyspace '" + keyspace + "'"); - } - - private ColumnDefinition findIndexedColumn(CFMetaData cfm) - { - for (ColumnDefinition column : cfm.regularColumns()) - { - if (column.getIndexType() != null && column.getIndexName() != null && column.getIndexName().equals(indexName)) - return column; - } - return null; - } -} diff --git a/src/java/org/apache/cassandra/cql/Operation.java b/src/java/org/apache/cassandra/cql/Operation.java deleted file mode 100644 index 0f0643378510..000000000000 --- a/src/java/org/apache/cassandra/cql/Operation.java +++ /dev/null @@ -1,55 +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.cql; - -public class Operation -{ - public static enum OperationType - { PLUS, MINUS } - - public final OperationType type; - public final Term a, b; - - // unary operation - public Operation(Term a) - { - this.a = a; - type = null; - b = null; - } - - // binary operation - public Operation(Term a, OperationType type, Term b) - { - this.a = a; - this.type = type; - this.b = b; - } - - public boolean isUnary() - { - return type == null && b == null; - } - - public String toString() - { - return (isUnary()) - ? String.format("UnaryOperation(%s)", a) - : String.format("BinaryOperation(%s, %s, %s)", a, type, b); - } -} diff --git a/src/java/org/apache/cassandra/cql/QueryProcessor.java b/src/java/org/apache/cassandra/cql/QueryProcessor.java deleted file mode 100644 index 3d5c3f15c415..000000000000 --- a/src/java/org/apache/cassandra/cql/QueryProcessor.java +++ /dev/null @@ -1,913 +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.cql; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.*; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.TimeoutException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.apache.cassandra.auth.Permission; -import org.apache.cassandra.config.*; -import org.apache.cassandra.cli.CliUtils; -import org.apache.cassandra.cql.hooks.ExecutionContext; -import org.apache.cassandra.cql.hooks.PostPreparationHook; -import org.apache.cassandra.cql.hooks.PreExecutionHook; -import org.apache.cassandra.cql.hooks.PreparationContext; -import org.apache.cassandra.db.CounterCell; -import org.apache.cassandra.db.*; -import org.apache.cassandra.db.composites.CellName; -import org.apache.cassandra.db.composites.CellNameType; -import org.apache.cassandra.db.composites.Composite; -import org.apache.cassandra.db.context.CounterContext; -import org.apache.cassandra.db.filter.*; -import org.apache.cassandra.db.index.SecondaryIndexManager; -import org.apache.cassandra.db.marshal.AbstractType; -import org.apache.cassandra.db.marshal.AsciiType; -import org.apache.cassandra.db.marshal.TypeParser; -import org.apache.cassandra.dht.*; -import org.apache.cassandra.exceptions.*; -import org.apache.cassandra.serializers.MarshalException; -import org.apache.cassandra.service.StorageProxy; -import org.apache.cassandra.service.StorageService; -import org.apache.cassandra.service.MigrationManager; -import org.apache.cassandra.thrift.Column; -import org.apache.cassandra.thrift.CqlMetadata; -import org.apache.cassandra.thrift.CqlResult; -import org.apache.cassandra.thrift.CqlResultType; -import org.apache.cassandra.thrift.CqlRow; -import org.apache.cassandra.thrift.CqlPreparedResult; -import org.apache.cassandra.thrift.ThriftValidation; -import org.apache.cassandra.thrift.ThriftClientState; -import org.apache.cassandra.utils.ByteBufferUtil; -import org.apache.cassandra.utils.FBUtilities; -import org.apache.cassandra.utils.Pair; -import org.apache.cassandra.utils.SemanticVersion; -import org.antlr.runtime.*; - - -import static org.apache.cassandra.thrift.ThriftValidation.validateColumnFamily; - -public class QueryProcessor -{ - public static final SemanticVersion CQL_VERSION = new SemanticVersion("2.0.0"); - - private static final Logger logger = LoggerFactory.getLogger(QueryProcessor.class); - - public static final String DEFAULT_KEY_NAME = CFMetaData.DEFAULT_KEY_ALIAS.toUpperCase(); - - private static final List preExecutionHooks = new CopyOnWriteArrayList<>(); - private static final List postPreparationHooks = new CopyOnWriteArrayList<>(); - - public static void addPreExecutionHook(PreExecutionHook hook) - { - preExecutionHooks.add(hook); - } - - public static void removePreExecutionHook(PreExecutionHook hook) - { - preExecutionHooks.remove(hook); - } - - public static void addPostPreparationHook(PostPreparationHook hook) - { - postPreparationHooks.add(hook); - } - - public static void removePostPreparationHook(PostPreparationHook hook) - { - postPreparationHooks.remove(hook); - } - - private static List getSlice(CFMetaData metadata, SelectStatement select, List variables, long now) - throws InvalidRequestException, ReadTimeoutException, UnavailableException, IsBootstrappingException - { - List commands = new ArrayList(); - - // ...of a list of column names - if (!select.isColumnRange()) - { - SortedSet columnNames = getColumnNames(select, metadata, variables); - validateColumnNames(columnNames); - - for (Term rawKey: select.getKeys()) - { - ByteBuffer key = rawKey.getByteBuffer(metadata.getKeyValidator(),variables); - - validateKey(key); - commands.add(new SliceByNamesReadCommand(metadata.ksName, key, select.getColumnFamily(), now, new NamesQueryFilter(columnNames))); - } - } - // ...a range (slice) of column names - else - { - AbstractType at = metadata.comparator.asAbstractType(); - Composite start = metadata.comparator.fromByteBuffer(select.getColumnStart().getByteBuffer(at,variables)); - Composite finish = metadata.comparator.fromByteBuffer(select.getColumnFinish().getByteBuffer(at,variables)); - - for (Term rawKey : select.getKeys()) - { - ByteBuffer key = rawKey.getByteBuffer(metadata.getKeyValidator(),variables); - - validateKey(key); - validateSliceFilter(metadata, start, finish, select.isColumnsReversed()); - commands.add(new SliceFromReadCommand(metadata.ksName, - key, - select.getColumnFamily(), - now, - new SliceQueryFilter(start, finish, select.isColumnsReversed(), select.getColumnsLimit()))); - } - } - - return StorageProxy.read(commands, select.getConsistencyLevel()); - } - - private static SortedSet getColumnNames(SelectStatement select, CFMetaData metadata, List variables) - throws InvalidRequestException - { - String keyString = metadata.getCQL2KeyName(); - List selectColumnNames = select.getColumnNames(); - SortedSet columnNames = new TreeSet<>(metadata.comparator); - for (Term column : selectColumnNames) - { - // skip the key for the slice op; we'll add it to the resultset in extractThriftColumns - if (!column.getText().equalsIgnoreCase(keyString)) - columnNames.add(metadata.comparator.cellFromByteBuffer(column.getByteBuffer(metadata.comparator.asAbstractType(),variables))); - } - return columnNames; - } - - private static List multiRangeSlice(CFMetaData metadata, SelectStatement select, List variables, long now) - throws ReadTimeoutException, UnavailableException, InvalidRequestException - { - IPartitioner p = StorageService.getPartitioner(); - - AbstractType keyType = Schema.instance.getCFMetaData(metadata.ksName, select.getColumnFamily()).getKeyValidator(); - - ByteBuffer startKeyBytes = (select.getKeyStart() != null) - ? select.getKeyStart().getByteBuffer(keyType,variables) - : null; - - ByteBuffer finishKeyBytes = (select.getKeyFinish() != null) - ? select.getKeyFinish().getByteBuffer(keyType,variables) - : null; - - RowPosition startKey = RowPosition.forKey(startKeyBytes, p), finishKey = RowPosition.forKey(finishKeyBytes, p); - if (startKey.compareTo(finishKey) > 0 && !finishKey.isMinimum(p)) - { - if (p instanceof RandomPartitioner) - throw new InvalidRequestException("Start key sorts after end key. This is not allowed; you probably should not specify end key at all, under RandomPartitioner"); - else - throw new InvalidRequestException("Start key must sort before (or equal to) finish key in your partitioner!"); - } - AbstractBounds bounds = new Bounds(startKey, finishKey); - - IDiskAtomFilter columnFilter = filterFromSelect(select, metadata, variables); - validateFilter(metadata, columnFilter); - - List columnRelations = select.getColumnRelations(); - List expressions = new ArrayList(columnRelations.size()); - for (Relation columnRelation : columnRelations) - { - // Left and right side of relational expression encoded according to comparator/validator. - ByteBuffer entity = columnRelation.getEntity().getByteBuffer(metadata.comparator.asAbstractType(), variables); - ByteBuffer value = columnRelation.getValue().getByteBuffer(metadata.getValueValidatorForFullCellName(entity), variables); - - expressions.add(new IndexExpression(entity, - IndexExpression.Operator.valueOf(columnRelation.operator().toString()), - value)); - } - - int limit = select.isKeyRange() && select.getKeyStart() != null - ? select.getNumRecords() + 1 - : select.getNumRecords(); - - List rows = StorageProxy.getRangeSlice(new RangeSliceCommand(metadata.ksName, - select.getColumnFamily(), - now, - columnFilter, - bounds, - expressions, - limit), - select.getConsistencyLevel()); - - // if start key was set and relation was "greater than" - if (select.getKeyStart() != null && !select.includeStartKey() && !rows.isEmpty()) - { - if (rows.get(0).key.key.equals(startKeyBytes)) - rows.remove(0); - } - - // if finish key was set and relation was "less than" - if (select.getKeyFinish() != null && !select.includeFinishKey() && !rows.isEmpty()) - { - int lastIndex = rows.size() - 1; - if (rows.get(lastIndex).key.key.equals(finishKeyBytes)) - rows.remove(lastIndex); - } - - return rows.subList(0, select.getNumRecords() < rows.size() ? select.getNumRecords() : rows.size()); - } - - private static IDiskAtomFilter filterFromSelect(SelectStatement select, CFMetaData metadata, List variables) - throws InvalidRequestException - { - if (select.isColumnRange() || select.getColumnNames().size() == 0) - { - AbstractType comparator = metadata.comparator.asAbstractType(); - return new SliceQueryFilter(metadata.comparator.fromByteBuffer(select.getColumnStart().getByteBuffer(comparator, variables)), - metadata.comparator.fromByteBuffer(select.getColumnFinish().getByteBuffer(comparator, variables)), - select.isColumnsReversed(), - select.getColumnsLimit()); - } - else - { - return new NamesQueryFilter(getColumnNames(select, metadata, variables)); - } - } - - /* Test for SELECT-specific taboos */ - private static void validateSelect(String keyspace, SelectStatement select, List variables) throws InvalidRequestException - { - select.getConsistencyLevel().validateForRead(keyspace); - - // Finish key w/o start key (KEY < foo) - if (!select.isKeyRange() && (select.getKeyFinish() != null)) - throw new InvalidRequestException("Key range clauses must include a start key (i.e. KEY > term)"); - - // Key range and by-key(s) combined (KEY > foo AND KEY = bar) - if (select.isKeyRange() && select.getKeys().size() > 0) - throw new InvalidRequestException("You cannot combine key range and by-key clauses in a SELECT"); - - // Start and finish keys, *and* column relations (KEY > foo AND KEY < bar and name1 = value1). - if (select.isKeyRange() && (select.getKeyFinish() != null) && (select.getColumnRelations().size() > 0)) - throw new InvalidRequestException("You cannot combine key range and by-column clauses in a SELECT"); - - // Can't use more than one KEY = - if (!select.isMultiKey() && select.getKeys().size() > 1) - throw new InvalidRequestException("You cannot use more than one KEY = in a SELECT"); - - if (select.getColumnRelations().size() > 0) - { - ColumnFamilyStore cfstore = Keyspace.open(keyspace).getColumnFamilyStore(select.getColumnFamily()); - CellNameType comparator = cfstore.metadata.comparator; - AbstractType at = comparator.asAbstractType(); - SecondaryIndexManager idxManager = cfstore.indexManager; - for (Relation relation : select.getColumnRelations()) - { - ByteBuffer name = relation.getEntity().getByteBuffer(at, variables); - if ((relation.operator() == RelationType.EQ) && idxManager.indexes(comparator.cellFromByteBuffer(name))) - return; - } - throw new InvalidRequestException("No indexed columns present in by-columns clause with \"equals\" operator"); - } - } - - public static void validateKey(ByteBuffer key) throws InvalidRequestException - { - if (key == null || key.remaining() == 0) - { - throw new InvalidRequestException("Key may not be empty"); - } - - // check that key can be handled by FBUtilities.writeShortByteArray - if (key.remaining() > FBUtilities.MAX_UNSIGNED_SHORT) - { - throw new InvalidRequestException("Key length of " + key.remaining() + - " is longer than maximum of " + FBUtilities.MAX_UNSIGNED_SHORT); - } - } - - public static void validateKeyAlias(CFMetaData cfm, String key) throws InvalidRequestException - { - assert key.toUpperCase().equals(key); // should always be uppercased by caller - String realKeyAlias = cfm.getCQL2KeyName().toUpperCase(); - if (!realKeyAlias.equals(key)) - throw new InvalidRequestException(String.format("Expected key '%s' to be present in WHERE clause for '%s'", realKeyAlias, cfm.cfName)); - } - - private static void validateColumnNames(Iterable columns) - throws InvalidRequestException - { - for (CellName name : columns) - { - if (name.dataSize() > org.apache.cassandra.db.Cell.MAX_NAME_LENGTH) - throw new InvalidRequestException(String.format("column name is too long (%s > %s)", - name.dataSize(), - org.apache.cassandra.db.Cell.MAX_NAME_LENGTH)); - if (name.isEmpty()) - throw new InvalidRequestException("zero-length column name"); - } - } - - public static void validateColumnName(CellName column) - throws InvalidRequestException - { - validateColumnNames(Arrays.asList(column)); - } - - public static void validateColumn(CFMetaData metadata, CellName name, ByteBuffer value) - throws InvalidRequestException - { - validateColumnName(name); - AbstractType validator = metadata.getValueValidator(name); - - try - { - if (validator != null) - validator.validate(value); - } - catch (MarshalException me) - { - throw new InvalidRequestException(String.format("Invalid column value for column (name=%s); %s", - ByteBufferUtil.bytesToHex(name.toByteBuffer()), - me.getMessage())); - } - } - - private static void validateFilter(CFMetaData metadata, IDiskAtomFilter filter) - throws InvalidRequestException - { - if (filter instanceof SliceQueryFilter) - validateSliceFilter(metadata, (SliceQueryFilter)filter); - else - validateColumnNames(((NamesQueryFilter)filter).columns); - } - - private static void validateSliceFilter(CFMetaData metadata, SliceQueryFilter range) - throws InvalidRequestException - { - validateSliceFilter(metadata, range.start(), range.finish(), range.reversed); - } - - private static void validateSliceFilter(CFMetaData metadata, Composite start, Composite finish, boolean reversed) - throws InvalidRequestException - { - CellNameType comparator = metadata.comparator; - Comparator orderedComparator = reversed ? comparator.reverseComparator(): comparator; - if (!start.isEmpty() && !finish.isEmpty() && orderedComparator.compare(start, finish) > 0) - throw new InvalidRequestException("range finish must come after start in traversal order"); - } - - public static CqlResult processStatement(CQLStatement statement, ExecutionContext context) - throws RequestExecutionException, RequestValidationException - { - String keyspace = null; - ThriftClientState clientState = context.clientState; - List variables = context.variables; - - // Some statements won't have (or don't need) a keyspace (think USE, or CREATE). - if (statement.type != StatementType.SELECT && StatementType.REQUIRES_KEYSPACE.contains(statement.type)) - keyspace = clientState.getKeyspace(); - - CqlResult result = new CqlResult(); - - if (!preExecutionHooks.isEmpty()) - for (PreExecutionHook hook : preExecutionHooks) - statement = hook.processStatement(statement, context); - - if (logger.isDebugEnabled()) logger.debug("CQL statement type: {}", statement.type.toString()); - CFMetaData metadata; - switch (statement.type) - { - case SELECT: - SelectStatement select = (SelectStatement)statement.statement; - - final String oldKeyspace = clientState.getRawKeyspace(); - - if (select.isSetKeyspace()) - { - keyspace = CliUtils.unescapeSQLString(select.getKeyspace()); - ThriftValidation.validateKeyspace(keyspace); - } - else if (oldKeyspace == null) - throw new InvalidRequestException("no keyspace has been specified"); - else - keyspace = oldKeyspace; - - clientState.hasColumnFamilyAccess(keyspace, select.getColumnFamily(), Permission.SELECT); - metadata = validateColumnFamily(keyspace, select.getColumnFamily()); - - // need to do this in here because we need a CFMD.getKeyName() - select.extractKeyAliasFromColumns(metadata); - - if (select.getKeys().size() > 0) - validateKeyAlias(metadata, select.getKeyAlias()); - - validateSelect(keyspace, select, variables); - - List rows; - - long now = System.currentTimeMillis(); - // By-key - if (!select.isKeyRange() && (select.getKeys().size() > 0)) - { - rows = getSlice(metadata, select, variables, now); - } - else - { - rows = multiRangeSlice(metadata, select, variables, now); - } - - // count resultset is a single column named "count" - result.type = CqlResultType.ROWS; - if (select.isCountOperation()) - { - validateCountOperation(select); - - ByteBuffer countBytes = ByteBufferUtil.bytes("count"); - result.schema = new CqlMetadata(Collections.emptyMap(), - Collections.emptyMap(), - "AsciiType", - "LongType"); - List columns = Collections.singletonList(new Column(countBytes).setValue(ByteBufferUtil.bytes((long) rows.size()))); - result.rows = Collections.singletonList(new CqlRow(countBytes, columns)); - return result; - } - - // otherwise create resultset from query results - result.schema = new CqlMetadata(new HashMap(), - new HashMap(), - TypeParser.getShortName(metadata.comparator.asAbstractType()), - TypeParser.getShortName(metadata.getDefaultValidator())); - List cqlRows = new ArrayList(rows.size()); - for (org.apache.cassandra.db.Row row : rows) - { - List thriftColumns = new ArrayList(); - if (select.isColumnRange()) - { - if (select.isFullWildcard()) - { - // prepend key - ByteBuffer keyName = ByteBufferUtil.bytes(metadata.getCQL2KeyName()); - thriftColumns.add(new Column(keyName).setValue(row.key.key).setTimestamp(-1)); - result.schema.name_types.put(keyName, TypeParser.getShortName(AsciiType.instance)); - result.schema.value_types.put(keyName, TypeParser.getShortName(metadata.getKeyValidator())); - } - - // preserve comparator order - if (row.cf != null) - { - for (org.apache.cassandra.db.Cell c : row.cf.getSortedColumns()) - { - if (c.isMarkedForDelete(now)) - continue; - - ColumnDefinition cd = metadata.getColumnDefinition(c.name()); - if (cd != null) - result.schema.value_types.put(c.name().toByteBuffer(), TypeParser.getShortName(cd.type)); - - thriftColumns.add(thriftify(c)); - } - } - } - else - { - String keyString = metadata.getCQL2KeyName(); - - // order columns in the order they were asked for - for (Term term : select.getColumnNames()) - { - if (term.getText().equalsIgnoreCase(keyString)) - { - // preserve case of key as it was requested - ByteBuffer requestedKey = ByteBufferUtil.bytes(term.getText()); - thriftColumns.add(new Column(requestedKey).setValue(row.key.key).setTimestamp(-1)); - result.schema.name_types.put(requestedKey, TypeParser.getShortName(AsciiType.instance)); - result.schema.value_types.put(requestedKey, TypeParser.getShortName(metadata.getKeyValidator())); - continue; - } - - if (row.cf == null) - continue; - - ByteBuffer nameBytes; - try - { - nameBytes = term.getByteBuffer(metadata.comparator.asAbstractType(), variables); - } - catch (InvalidRequestException e) - { - throw new AssertionError(e); - } - - CellName name = metadata.comparator.cellFromByteBuffer(nameBytes); - ColumnDefinition cd = metadata.getColumnDefinition(name); - if (cd != null) - result.schema.value_types.put(nameBytes, TypeParser.getShortName(cd.type)); - org.apache.cassandra.db.Cell c = row.cf.getColumn(name); - if (c == null || c.isMarkedForDelete(System.currentTimeMillis())) - thriftColumns.add(new Column().setName(nameBytes)); - else - thriftColumns.add(thriftify(c)); - } - } - - // Create a new row, add the columns to it, and then add it to the list of rows - CqlRow cqlRow = new CqlRow(); - cqlRow.key = row.key.key; - cqlRow.columns = thriftColumns; - if (select.isColumnsReversed()) - Collections.reverse(cqlRow.columns); - cqlRows.add(cqlRow); - } - - result.rows = cqlRows; - return result; - - case INSERT: // insert uses UpdateStatement - case UPDATE: - UpdateStatement update = (UpdateStatement)statement.statement; - update.getConsistencyLevel().validateForWrite(keyspace); - - keyspace = update.keyspace == null ? clientState.getKeyspace() : update.keyspace; - // permission is checked in prepareRowMutations() - List rowMutations = update.prepareRowMutations(keyspace, clientState, variables); - - for (IMutation mutation : rowMutations) - { - validateKey(mutation.key()); - } - - StorageProxy.mutateWithTriggers(rowMutations, update.getConsistencyLevel(), false); - - result.type = CqlResultType.VOID; - return result; - - case BATCH: - BatchStatement batch = (BatchStatement) statement.statement; - batch.getConsistencyLevel().validateForWrite(keyspace); - - if (batch.getTimeToLive() != 0) - throw new InvalidRequestException("Global TTL on the BATCH statement is not supported."); - - for (AbstractModification up : batch.getStatements()) - { - if (up.isSetConsistencyLevel()) - throw new InvalidRequestException( - "Consistency level must be set on the BATCH, not individual statements"); - - if (batch.isSetTimestamp() && up.isSetTimestamp()) - throw new InvalidRequestException( - "Timestamp must be set either on BATCH or individual statements"); - } - - List mutations = batch.getMutations(keyspace, clientState, variables); - for (IMutation mutation : mutations) - { - validateKey(mutation.key()); - } - - StorageProxy.mutateWithTriggers(mutations, batch.getConsistencyLevel(), false); - - result.type = CqlResultType.VOID; - return result; - - case USE: - clientState.validateLogin(); - clientState.setKeyspace(CliUtils.unescapeSQLString((String) statement.statement)); - - result.type = CqlResultType.VOID; - return result; - - case TRUNCATE: - Pair columnFamily = (Pair)statement.statement; - keyspace = columnFamily.left == null ? clientState.getKeyspace() : columnFamily.left; - - validateColumnFamily(keyspace, columnFamily.right); - clientState.hasColumnFamilyAccess(keyspace, columnFamily.right, Permission.MODIFY); - - try - { - StorageProxy.truncateBlocking(keyspace, columnFamily.right); - } - catch (TimeoutException e) - { - throw new TruncateException(e); - } - catch (IOException e) - { - throw new RuntimeException(e); - } - - result.type = CqlResultType.VOID; - return result; - - case DELETE: - DeleteStatement delete = (DeleteStatement)statement.statement; - - keyspace = delete.keyspace == null ? clientState.getKeyspace() : delete.keyspace; - // permission is checked in prepareRowMutations() - List deletions = delete.prepareRowMutations(keyspace, clientState, variables); - for (IMutation deletion : deletions) - { - validateKey(deletion.key()); - } - - StorageProxy.mutateWithTriggers(deletions, delete.getConsistencyLevel(), false); - - result.type = CqlResultType.VOID; - return result; - - case CREATE_KEYSPACE: - CreateKeyspaceStatement create = (CreateKeyspaceStatement)statement.statement; - create.validate(); - ThriftValidation.validateKeyspaceNotSystem(create.getName()); - clientState.hasAllKeyspacesAccess(Permission.CREATE); - - try - { - KSMetaData ksm = KSMetaData.newKeyspace(create.getName(), - create.getStrategyClass(), - create.getStrategyOptions(), - true); - ThriftValidation.validateKeyspaceNotYetExisting(ksm.name); - MigrationManager.announceNewKeyspace(ksm); - } - catch (ConfigurationException e) - { - InvalidRequestException ex = new InvalidRequestException(e.getMessage()); - ex.initCause(e); - throw ex; - } - - result.type = CqlResultType.VOID; - return result; - - case CREATE_COLUMNFAMILY: - CreateColumnFamilyStatement createCf = (CreateColumnFamilyStatement)statement.statement; - clientState.hasKeyspaceAccess(keyspace, Permission.CREATE); - - try - { - MigrationManager.announceNewColumnFamily(createCf.getCFMetaData(keyspace, variables)); - } - catch (ConfigurationException e) - { - InvalidRequestException ex = new InvalidRequestException(e.toString()); - ex.initCause(e); - throw ex; - } - - result.type = CqlResultType.VOID; - return result; - - case CREATE_INDEX: - CreateIndexStatement createIdx = (CreateIndexStatement)statement.statement; - clientState.hasColumnFamilyAccess(keyspace, createIdx.getColumnFamily(), Permission.ALTER); - CFMetaData oldCfm = Schema.instance.getCFMetaData(keyspace, createIdx.getColumnFamily()); - if (oldCfm == null) - throw new InvalidRequestException("No such column family: " + createIdx.getColumnFamily()); - - boolean columnExists = false; - ByteBuffer columnName = createIdx.getColumnName().getByteBuffer(); - // mutating oldCfm directly would be bad, but mutating a copy is fine. - CFMetaData cfm = oldCfm.clone(); - for (ColumnDefinition cd : cfm.regularColumns()) - { - if (cd.name.bytes.equals(columnName)) - { - if (cd.getIndexType() != null) - throw new InvalidRequestException("Index already exists"); - if (logger.isDebugEnabled()) - logger.debug("Updating column {} definition for index {}", cfm.comparator.getString(cfm.comparator.fromByteBuffer(columnName)), createIdx.getIndexName()); - cd.setIndexType(IndexType.KEYS, Collections.emptyMap()); - cd.setIndexName(createIdx.getIndexName()); - columnExists = true; - break; - } - } - if (!columnExists) - throw new InvalidRequestException("No column definition found for column " + oldCfm.comparator.getString(cfm.comparator.fromByteBuffer(columnName))); - - try - { - cfm.addDefaultIndexNames(); - MigrationManager.announceColumnFamilyUpdate(cfm, true); // As far as metadata are concerned, CQL2 == thrift - } - catch (ConfigurationException e) - { - InvalidRequestException ex = new InvalidRequestException(e.toString()); - ex.initCause(e); - throw ex; - } - - result.type = CqlResultType.VOID; - return result; - - case DROP_INDEX: - DropIndexStatement dropIdx = (DropIndexStatement)statement.statement; - keyspace = clientState.getKeyspace(); - dropIdx.setKeyspace(keyspace); - clientState.hasColumnFamilyAccess(keyspace, dropIdx.getColumnFamily(), Permission.ALTER); - - try - { - CFMetaData updatedCF = dropIdx.generateCFMetadataUpdate(); - MigrationManager.announceColumnFamilyUpdate(updatedCF, true); // As far as metadata are concerned, CQL2 == thrift - } - catch (ConfigurationException e) - { - InvalidRequestException ex = new InvalidRequestException(e.toString()); - ex.initCause(e); - throw ex; - } - - result.type = CqlResultType.VOID; - return result; - - case DROP_KEYSPACE: - String deleteKeyspace = (String)statement.statement; - ThriftValidation.validateKeyspaceNotSystem(deleteKeyspace); - clientState.hasKeyspaceAccess(deleteKeyspace, Permission.DROP); - - try - { - MigrationManager.announceKeyspaceDrop(deleteKeyspace); - } - catch (ConfigurationException e) - { - InvalidRequestException ex = new InvalidRequestException(e.getMessage()); - ex.initCause(e); - throw ex; - } - - result.type = CqlResultType.VOID; - return result; - - case DROP_COLUMNFAMILY: - String deleteColumnFamily = (String)statement.statement; - clientState.hasColumnFamilyAccess(keyspace, deleteColumnFamily, Permission.DROP); - - try - { - MigrationManager.announceColumnFamilyDrop(keyspace, deleteColumnFamily); - } - catch (ConfigurationException e) - { - InvalidRequestException ex = new InvalidRequestException(e.getMessage()); - ex.initCause(e); - throw ex; - } - - result.type = CqlResultType.VOID; - return result; - - case ALTER_TABLE: - AlterTableStatement alterTable = (AlterTableStatement) statement.statement; - - validateColumnFamily(keyspace, alterTable.columnFamily); - clientState.hasColumnFamilyAccess(keyspace, alterTable.columnFamily, Permission.ALTER); - - try - { - MigrationManager.announceColumnFamilyUpdate(alterTable.getCFMetaData(keyspace), true); // As far as metadata are concerned, CQL2 == thrift - } - catch (ConfigurationException e) - { - InvalidRequestException ex = new InvalidRequestException(e.getMessage()); - ex.initCause(e); - throw ex; - } - - result.type = CqlResultType.VOID; - return result; - } - return null; // We should never get here. - } - - public static CqlResult process(String queryString, ThriftClientState clientState) - throws RequestValidationException, RequestExecutionException - { - logger.trace("CQL QUERY: {}", queryString); - return processStatement(getStatement(queryString), - new ExecutionContext(clientState, queryString, Collections.emptyList())); - } - - public static CqlPreparedResult prepare(String queryString, ThriftClientState clientState) - throws RequestValidationException - { - logger.trace("CQL QUERY: {}", queryString); - - CQLStatement statement = getStatement(queryString); - int statementId = makeStatementId(queryString); - logger.trace("Discovered "+ statement.boundTerms + " bound variables."); - - clientState.getPrepared().put(statementId, statement); - logger.trace(String.format("Stored prepared statement #%d with %d bind markers", - statementId, - statement.boundTerms)); - - if (!postPreparationHooks.isEmpty()) - { - PreparationContext context = new PreparationContext(clientState, queryString, statement); - for (PostPreparationHook hook : postPreparationHooks) - hook.processStatement(statement, context); - } - - return new CqlPreparedResult(statementId, statement.boundTerms); - } - - public static CqlResult processPrepared(CQLStatement statement, ThriftClientState clientState, List variables) - throws RequestValidationException, RequestExecutionException - { - // Check to see if there are any bound variables to verify - if (!(variables.isEmpty() && (statement.boundTerms == 0))) - { - if (variables.size() != statement.boundTerms) - throw new InvalidRequestException(String.format("there were %d markers(?) in CQL but %d bound variables", - statement.boundTerms, - variables.size())); - - // at this point there is a match in count between markers and variables that is non-zero - - if (logger.isTraceEnabled()) - for (int i = 0; i < variables.size(); i++) - logger.trace("[{}] '{}'", i+1, variables.get(i)); - } - - return processStatement(statement, new ExecutionContext(clientState, null, variables)); - } - - private static final int makeStatementId(String cql) - { - // use the hash of the string till something better is provided - return cql.hashCode(); - } - - private static Column thriftify(org.apache.cassandra.db.Cell c) - { - ByteBuffer value = (c instanceof CounterCell) - ? ByteBufferUtil.bytes(CounterContext.instance().total(c.value())) - : c.value(); - return new Column(c.name().toByteBuffer()).setValue(value).setTimestamp(c.timestamp()); - } - - private static CQLStatement getStatement(String queryStr) throws SyntaxException - { - try - { - // Lexer and parser - CharStream stream = new ANTLRStringStream(queryStr); - CqlLexer lexer = new CqlLexer(stream); - TokenStream tokenStream = new CommonTokenStream(lexer); - CqlParser parser = new CqlParser(tokenStream); - - // Parse the query string to a statement instance - CQLStatement statement = parser.query(); - - // The lexer and parser queue up any errors they may have encountered - // along the way, if necessary, we turn them into exceptions here. - lexer.throwLastRecognitionError(); - parser.throwLastRecognitionError(); - - return statement; - } - catch (RuntimeException re) - { - SyntaxException ire = new SyntaxException("Failed parsing statement: [" + queryStr + "] reason: " + re.getClass().getSimpleName() + " " + re.getMessage()); - throw ire; - } - catch (RecognitionException e) - { - SyntaxException ire = new SyntaxException("Invalid or malformed CQL query string: " + e.getMessage()); - throw ire; - } - } - - private static void validateCountOperation(SelectStatement select) throws InvalidRequestException - { - if (select.isWildcard()) - return; // valid count(*) - - if (!select.isColumnRange()) - { - List columnNames = select.getColumnNames(); - String firstColumn = columnNames.get(0).getText(); - - if (columnNames.size() == 1 && (firstColumn.equals("*") || firstColumn.equals("1"))) - return; // valid count(*) || count(1) - } - - throw new InvalidRequestException("Only COUNT(*) and COUNT(1) operations are currently supported."); - } -} diff --git a/src/java/org/apache/cassandra/cql/Relation.java b/src/java/org/apache/cassandra/cql/Relation.java deleted file mode 100644 index 669c5f2f0cbc..000000000000 --- a/src/java/org/apache/cassandra/cql/Relation.java +++ /dev/null @@ -1,86 +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.cql; - -/** - * Relations encapsulate the relationship between an entity of some kind, and - * a value (term). For example, > "start" or "colname1" = "somevalue". - * - */ -public class Relation -{ - private final Term entity; - private final RelationType relationType; - private final Term value; - - /** - * Creates a new relation. - * - * @param entity the kind of relation this is; what the term is being compared to. - * @param type the type that describes how this entity relates to the value. - * @param value the value being compared. - */ - public Relation(Term entity, String type, Term value) - { - this.entity = entity; - this.relationType = RelationType.forString(type); - this.value = value; - } - - public RelationType operator() - { - return relationType; - } - - public Term getEntity() - { - return entity; - } - - public Term getValue() - { - return value; - } - - @Override - public String toString() - { - return String.format("Relation(%s, %s, %s)", entity, relationType, value); - } -} - -enum RelationType -{ - EQ, LT, LTE, GTE, GT; - - public static RelationType forString(String s) - { - if (s.equals("=")) - return EQ; - else if (s.equals("<")) - return LT; - else if (s.equals("<=")) - return LTE; - else if (s.equals(">=")) - return GTE; - else if (s.equals(">")) - return GT; - - return null; - } -} diff --git a/src/java/org/apache/cassandra/cql/SelectExpression.java b/src/java/org/apache/cassandra/cql/SelectExpression.java deleted file mode 100644 index 4d3cb2f511be..000000000000 --- a/src/java/org/apache/cassandra/cql/SelectExpression.java +++ /dev/null @@ -1,164 +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.cql; - -import java.util.ArrayList; -import java.util.List; - -/** - * Select expressions are analogous to the projection in a SQL query. They - * determine which columns will appear in the result set. SelectExpression - * instances encapsulate a parsed expression from a SELECT - * statement. - * - * See: doc/cql/CQL.html#SpecifyingColumns - */ -public class SelectExpression -{ - public static final int MAX_COLUMNS_DEFAULT = 10000; - - private int numColumns = MAX_COLUMNS_DEFAULT; - private boolean reverseColumns = false; - private final boolean hasFirstSet; - private final boolean wildcard; - private final Term start, finish; - private final List columns; - - /** - * Create a new SelectExpression for a range (slice) of columns. - * - * @param start the starting column name - * @param finish the finishing column name - * @param count the number of columns to limit the results to - * @param reverse true to reverse column order - * @param wildcard determines weather this statement is wildcard - * @param firstSet determines weather "FIRST" keyword was set - */ - public SelectExpression(Term start, Term finish, int count, boolean reverse, boolean wildcard, boolean firstSet) - { - this.start = start; - this.finish = finish; - numColumns = count; - reverseColumns = reverse; - this.wildcard = wildcard; - hasFirstSet = firstSet; - this.columns = null; - } - - /** - * Create a new SelectExpression for a list of columns. - * - * @param first the first (possibly only) column name to select on. - * @param count the number of columns to limit the results on - * @param reverse true to reverse column order - * @param firstSet determines weather "FIRST" keyword was set - */ - public SelectExpression(Term first, int count, boolean reverse, boolean firstSet) - { - wildcard = false; - columns = new ArrayList(); - columns.add(first); - numColumns = count; - reverseColumns = reverse; - hasFirstSet = firstSet; - start = null; - finish = null; - } - - /** - * Add an additional column name to a SelectExpression. - * - * @param addTerm - */ - public void and(Term addTerm) - { - assert !isColumnRange(); // Not possible when invoked by parser - columns.add(addTerm); - } - - public boolean isColumnRange() - { - return (start != null); - } - - public boolean isColumnList() - { - return !isColumnRange(); - } - public int getColumnsLimit() - { - return numColumns; - } - - public boolean isColumnsReversed() - { - return reverseColumns; - } - - public void setColumnsReversed(boolean reversed) - { - reverseColumns = reversed; - } - - public void setColumnsLimit(int limit) - { - numColumns = limit; - } - - /** - * @return weather expression includes "FIRST" keyword - */ - public boolean hasFirstSet() - { - return hasFirstSet; - } - - public Term getStart() - { - return start; - } - - public Term getFinish() - { - return finish; - } - - public List getColumns() - { - return columns; - } - - public boolean isWildcard() - { - return wildcard; - } - - public String toString() - { - return String.format("SelectExpression [numColumns=%s, reverseColumns=%s, hasFirstSet=%s, wildcard=%s, start=%s, finish=%s, columns=%s]", - numColumns, - reverseColumns, - hasFirstSet, - wildcard, - start, - finish, - columns); - } - - -} diff --git a/src/java/org/apache/cassandra/cql/SelectStatement.java b/src/java/org/apache/cassandra/cql/SelectStatement.java deleted file mode 100644 index b4ccd5660b69..000000000000 --- a/src/java/org/apache/cassandra/cql/SelectStatement.java +++ /dev/null @@ -1,188 +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.cql; - -import java.util.List; -import java.util.Set; - -import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.db.ConsistencyLevel; - -/** - * Encapsulates a completely parsed SELECT query, including the target - * column family, expression, result count, and ordering clause. - * - */ -public class SelectStatement -{ - private final SelectExpression expression; - private final boolean isCountOper; - private final String columnFamily; - private final String keyspace; - private final ConsistencyLevel cLevel; - private final WhereClause clause; - private final int numRecords; - - public SelectStatement(SelectExpression expression, boolean isCountOper, String keyspace, String columnFamily, - ConsistencyLevel cLevel, WhereClause clause, int numRecords) - { - this.expression = expression; - this.isCountOper = isCountOper; - this.keyspace = keyspace; - this.columnFamily = columnFamily; - this.cLevel = cLevel; - this.clause = (clause != null) ? clause : new WhereClause(); - this.numRecords = numRecords; - } - - public boolean isKeyRange() - { - return clause.isKeyRange(); - } - - public Set getKeys() - { - return clause.getKeys(); - } - - public Term getKeyStart() - { - return clause.getStartKey(); - } - - public Term getKeyFinish() - { - return clause.getFinishKey(); - } - - public List getColumnRelations() - { - return clause.getColumnRelations(); - } - - public boolean isColumnRange() - { - return expression.isColumnRange(); - } - - public boolean isWildcard() - { - return expression.isWildcard(); - } - public boolean isFullWildcard() - { - return expression.isWildcard() && !expression.hasFirstSet(); - } - - public List getColumnNames() - { - return expression.getColumns(); - } - - public Term getColumnStart() - { - return expression.getStart(); - } - - public Term getColumnFinish() - { - return expression.getFinish(); - } - - public boolean isSetKeyspace() - { - return keyspace != null; - } - - public String getKeyspace() - { - return keyspace; - } - - public String getColumnFamily() - { - return columnFamily; - } - - public boolean isColumnsReversed() - { - return expression.isColumnsReversed(); - } - - public ConsistencyLevel getConsistencyLevel() - { - return cLevel; - } - - public int getNumRecords() - { - return numRecords; - } - - public int getColumnsLimit() - { - return expression.getColumnsLimit(); - } - - public boolean isCountOperation() - { - return isCountOper; - } - - public boolean includeStartKey() - { - return clause.includeStartKey(); - } - - public boolean includeFinishKey() - { - return clause.includeFinishKey(); - } - - public String getKeyAlias() - { - return clause.getKeyAlias(); - } - - public boolean isMultiKey() - { - return clause.isMultiKey(); - } - - public void extractKeyAliasFromColumns(CFMetaData cfm) - { - clause.extractKeysFromColumns(cfm); - } - - public List getClauseRelations() - { - return clause.getClauseRelations(); - } - - public String toString() - { - return String.format("SelectStatement [expression=%s, isCountOper=%s, columnFamily=%s, keyspace=%s, cLevel=%s, clause=%s, numRecords=%s]", - expression, - isCountOper, - columnFamily, - keyspace, - cLevel, - clause, - numRecords); - } -} diff --git a/src/java/org/apache/cassandra/cql/StatementType.java b/src/java/org/apache/cassandra/cql/StatementType.java deleted file mode 100644 index 94db6a323c9a..000000000000 --- a/src/java/org/apache/cassandra/cql/StatementType.java +++ /dev/null @@ -1,32 +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.cql; - -import java.util.EnumSet; - -public enum StatementType -{ - SELECT, INSERT, UPDATE, BATCH, USE, TRUNCATE, DELETE, CREATE_KEYSPACE, CREATE_COLUMNFAMILY, CREATE_INDEX, DROP_INDEX, - DROP_KEYSPACE, DROP_COLUMNFAMILY, ALTER_TABLE; - - /** Statement types that don't require a keyspace to be set */ - private static final EnumSet TOP_LEVEL = EnumSet.of(USE, CREATE_KEYSPACE, DROP_KEYSPACE); - - /** Statement types that require a keyspace to be set */ - public static final EnumSet REQUIRES_KEYSPACE = EnumSet.complementOf(TOP_LEVEL); -} diff --git a/src/java/org/apache/cassandra/cql/Term.java b/src/java/org/apache/cassandra/cql/Term.java deleted file mode 100644 index 6e47bfa46737..000000000000 --- a/src/java/org/apache/cassandra/cql/Term.java +++ /dev/null @@ -1,208 +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.cql; - -import java.nio.ByteBuffer; -import java.util.List; - -import org.apache.cassandra.db.marshal.AbstractType; -import org.apache.cassandra.db.marshal.AsciiType; -import org.apache.cassandra.db.marshal.FloatType; -import org.apache.cassandra.db.marshal.IntegerType; -import org.apache.cassandra.db.marshal.LexicalUUIDType; -import org.apache.cassandra.exceptions.InvalidRequestException; -import org.apache.cassandra.serializers.MarshalException; - -/** A term parsed from a CQL statement. */ -public class Term -{ - private final String text; - private final TermType type; - private Integer bindIndex = -1; - - public Term(String text, TermType type) - { - this.text = text == null ? "" : text; - this.type = type; - } - - /** - * Create new Term instance from a string, and an integer that corresponds - * with the token ID from CQLParser. - * - * @param text the text representation of the term. - * @param type the term's type as an integer token ID. - */ - public Term(String text, int type) - { - this(text == null ? "" : text, TermType.forInt(type)); - } - - public Term(long value, TermType type) - { - this(String.valueOf(value), type); - } - - protected Term() - { - this("", TermType.STRING); - } - - public Term(String text, int type, int index) - { - this(text, type); - this.bindIndex = index; - } - - /** - * Returns the text parsed to create this term. - * - * @return the string term acquired from a CQL statement. - */ - public String getText() - { - return text; - } - - /** - * Returns the typed value, serialized to a ByteBuffer according to a - * comparator/validator. - * - * @return a ByteBuffer of the value. - * @throws InvalidRequestException if unable to coerce the string to its type. - */ - public ByteBuffer getByteBuffer(AbstractType validator, List variables) throws InvalidRequestException - { - try - { - if (!isBindMarker()) return validator.fromStringCQL2(text); - - // must be a marker term so check for a CqlBindValue stored in the term - if (bindIndex == null) - throw new AssertionError("a marker Term was encountered with no index value"); - - return variables.get(bindIndex); - } - catch (MarshalException e) - { - throw new InvalidRequestException(e.getMessage()); - } - } - - /** - * Returns the typed value, serialized to a ByteBuffer. - * - * @return a ByteBuffer of the value. - * @throws InvalidRequestException if unable to coerce the string to its type. - */ - public ByteBuffer getByteBuffer() throws InvalidRequestException - { - switch (type) - { - case STRING: - return AsciiType.instance.fromString(text); - case INTEGER: - return IntegerType.instance.fromString(text); - case UUID: - // we specifically want the Lexical class here, not "UUIDType," because we're supposed to have - // a uuid-shaped string here, and UUIDType also accepts integer or date strings (and turns them into version 1 uuids). - return LexicalUUIDType.instance.fromString(text); - case FLOAT: - return FloatType.instance.fromString(text); - } - - // FIXME: handle scenario that should never happen - return null; - } - - /** - * Obtain the term's type. - * - * @return the type - */ - public TermType getType() - { - return type; - } - - public String toString() - { - return String.format("Term(%s, type=%s)", getText(), type); - } - - public boolean isBindMarker() - { - return type==TermType.QMARK; - } - - @Override - public int hashCode() - { - final int prime = 31; - int result = 1; - result = prime * result + ((text == null) ? 0 : text.hashCode()); - result = prime * result + ((type == null) ? 0 : type.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - Term other = (Term) obj; - if (type==TermType.QMARK) return false; // markers are never equal - if (text == null) - { - if (other.text != null) - return false; - } else if (!text.equals(other.text)) - return false; - if (type != other.type) - return false; - return true; - } - - -} - -enum TermType -{ - STRING, INTEGER, UUID, FLOAT, QMARK; - - static TermType forInt(int type) - { - if ((type == CqlParser.STRING_LITERAL) || (type == CqlParser.IDENT)) - return STRING; - else if (type == CqlParser.INTEGER) - return INTEGER; - else if (type == CqlParser.UUID) - return UUID; - else if (type == CqlParser.FLOAT) - return FLOAT; - else if (type == CqlParser.QMARK) - return QMARK; - - // FIXME: handled scenario that should never occur. - return null; - } -} diff --git a/src/java/org/apache/cassandra/cql/UpdateStatement.java b/src/java/org/apache/cassandra/cql/UpdateStatement.java deleted file mode 100644 index 16a0d76a2d64..000000000000 --- a/src/java/org/apache/cassandra/cql/UpdateStatement.java +++ /dev/null @@ -1,288 +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.cql; - -import java.nio.ByteBuffer; -import java.util.*; - -import org.apache.cassandra.auth.Permission; -import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.config.Schema; -import org.apache.cassandra.db.*; -import org.apache.cassandra.db.composites.CellName; -import org.apache.cassandra.db.composites.CellNameType; -import org.apache.cassandra.db.marshal.AbstractType; -import org.apache.cassandra.exceptions.InvalidRequestException; -import org.apache.cassandra.exceptions.UnauthorizedException; -import org.apache.cassandra.thrift.ThriftClientState; - -import static org.apache.cassandra.cql.QueryProcessor.validateColumn; -import static org.apache.cassandra.cql.QueryProcessor.validateKey; -import static org.apache.cassandra.thrift.ThriftValidation.validateColumnFamily; - -/** - * An UPDATE statement parsed from a CQL query statement. - * - */ -public class UpdateStatement extends AbstractModification -{ - private Map columns; - private List columnNames, columnValues; - private final List keys; - - /** - * Creates a new UpdateStatement from a column family name, columns map, consistency - * level, and key term. - * - * @param keyspace Keyspace (optional) - * @param columnFamily column family name - * @param keyName alias key name - * @param columns a map of column name/values pairs - * @param keys the keys to update - * @param attrs additional attributes for statement (CL, timestamp, timeToLive) - */ - public UpdateStatement(String keyspace, - String columnFamily, - String keyName, - Map columns, - List keys, - Attributes attrs) - { - super(keyspace, columnFamily, keyName, attrs); - - this.columns = columns; - this.keys = keys; - } - - /** - * Creates a new UpdateStatement from a column family name, a consistency level, - * key, and lists of column names and values. It is intended for use with the - * alternate update format, INSERT. - * - * @param keyspace Keyspace (optional) - * @param columnFamily column family name - * @param keyName alias key name - * @param columnNames list of column names - * @param columnValues list of column values (corresponds to names) - * @param keys the keys to update - * @param attrs additional attributes for statement (CL, timestamp, timeToLive) - */ - public UpdateStatement(String keyspace, - String columnFamily, - String keyName, - List columnNames, - List columnValues, - List keys, - Attributes attrs) - { - super(keyspace, columnFamily, keyName, attrs); - - this.columnNames = columnNames; - this.columnValues = columnValues; - this.keys = keys; - } - - /** - * Returns the consistency level of this UPDATE statement, either - * one parsed from the CQL statement, or the default level otherwise. - * - * @return the consistency level as a Thrift enum. - */ - public ConsistencyLevel getConsistencyLevel() - { - return (cLevel != null) ? cLevel : defaultConsistency; - } - - /** - * True if an explicit consistency level was parsed from the statement. - * - * @return true if a consistency was parsed, false otherwise. - */ - public boolean isSetConsistencyLevel() - { - return (cLevel != null); - } - - /** {@inheritDoc} */ - public List prepareRowMutations(String keyspace, ThriftClientState clientState, List variables) - throws InvalidRequestException, UnauthorizedException - { - return prepareRowMutations(keyspace, clientState, null, variables); - } - - /** {@inheritDoc} */ - public List prepareRowMutations(String keyspace, ThriftClientState clientState, Long timestamp, List variables) - throws InvalidRequestException, UnauthorizedException - { - boolean hasCommutativeOperation = false; - - for (Map.Entry column : getColumns().entrySet()) - { - if (!column.getValue().isUnary()) - hasCommutativeOperation = true; - - if (hasCommutativeOperation && column.getValue().isUnary()) - throw new InvalidRequestException("Mix of commutative and non-commutative operations is not allowed."); - } - - CFMetaData metadata = validateColumnFamily(keyspace, columnFamily, hasCommutativeOperation); - if (hasCommutativeOperation) - getConsistencyLevel().validateCounterForWrite(metadata); - - QueryProcessor.validateKeyAlias(metadata, keyName); - - clientState.hasColumnFamilyAccess(keyspace, columnFamily, Permission.MODIFY); - - List mutations = new LinkedList<>(); - - for (Term key: keys) - mutations.add(mutationForKey(keyspace, key.getByteBuffer(getKeyType(keyspace),variables), metadata, timestamp, clientState, variables)); - - return mutations; - } - - /** - * Compute a mutation for a single key - * - * - * @param keyspace working keyspace - * @param key key to change - * @param metadata information about CF - * @param timestamp global timestamp to use for every key mutation - * - * @param clientState - * @return mutation - * - * @throws InvalidRequestException on the wrong request - */ - private IMutation mutationForKey(String keyspace, ByteBuffer key, CFMetaData metadata, Long timestamp, ThriftClientState clientState, List variables) - throws InvalidRequestException - { - validateKey(key); - CellNameType comparator = metadata.comparator; - AbstractType at = comparator.asAbstractType(); - - // if true we need to wrap Mutation into CounterMutation - boolean hasCounterColumn = false; - Mutation mutation = new Mutation(keyspace, key); - - for (Map.Entry column : getColumns().entrySet()) - { - CellName colName = comparator.cellFromByteBuffer(column.getKey().getByteBuffer(at, variables)); - Operation op = column.getValue(); - - if (op.isUnary()) - { - if (hasCounterColumn) - throw new InvalidRequestException("Mix of commutative and non-commutative operations is not allowed."); - - ByteBuffer colValue = op.a.getByteBuffer(metadata.getValueValidator(colName),variables); - - validateColumn(metadata, colName, colValue); - mutation.add(columnFamily, - colName, - colValue, - (timestamp == null) ? getTimestamp(clientState) : timestamp, - getTimeToLive()); - } - else - { - hasCounterColumn = true; - - if (!column.getKey().getText().equals(op.a.getText())) - throw new InvalidRequestException("Only expressions like X = X + are supported."); - - long value; - - try - { - value = Long.parseLong(op.b.getText()); - } - catch (NumberFormatException e) - { - throw new InvalidRequestException(String.format("'%s' is an invalid value, should be a long.", - op.b.getText())); - } - - mutation.addCounter(columnFamily, colName, value); - } - } - - return (hasCounterColumn) ? new CounterMutation(mutation, getConsistencyLevel()) : mutation; - } - - public String getColumnFamily() - { - return columnFamily; - } - - public List getKeys() - { - return keys; - } - - public Map getColumns() throws InvalidRequestException - { - // Created from an UPDATE - if (columns != null) - return columns; - - // Created from an INSERT - - // Don't hate, validate. - if (columnNames.size() != columnValues.size()) - throw new InvalidRequestException("unmatched column names/values"); - if (columnNames.size() < 1) - throw new InvalidRequestException("no columns specified for INSERT"); - - columns = new HashMap(); - - for (int i = 0; i < columnNames.size(); i++) - columns.put(columnNames.get(i), new Operation(columnValues.get(i))); - - return columns; - } - - public String toString() - { - return String.format("UpdateStatement(keyspace=%s, columnFamily=%s, keys=%s, columns=%s, consistency=%s, timestamp=%s, timeToLive=%s)", - keyspace, - columnFamily, - keys, - columns, - getConsistencyLevel(), - timestamp, - timeToLive); - } - - public AbstractType getKeyType(String keyspace) - { - return Schema.instance.getCFMetaData(keyspace, columnFamily).getKeyValidator(); - } - - public List getColumnNames() - { - return columnNames; - } - - public List getColumnValues() - { - return columnValues; - } - -} diff --git a/src/java/org/apache/cassandra/cql/WhereClause.java b/src/java/org/apache/cassandra/cql/WhereClause.java deleted file mode 100644 index 3df510219b22..000000000000 --- a/src/java/org/apache/cassandra/cql/WhereClause.java +++ /dev/null @@ -1,192 +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.cql; - -import java.util.ArrayList; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; - -import org.apache.cassandra.config.CFMetaData; - -/** - * WhereClauses encapsulate all of the predicates of a SELECT query. - * - */ -public class WhereClause -{ - // all relations (except for ` IN (.., .., ..)` which can be directly interpreted) from parser - // are stored into this array and are filtered to the keys/columns by extractKeysFromColumns(...) - private final List clauseRelations = new ArrayList(); - private final List columns = new ArrayList(); - - // added to either by the parser from an IN clause or by extractKeysFromColumns - private final Set keys = new LinkedHashSet(); - private Term startKey, finishKey; - private boolean includeStartKey = false, includeFinishKey = false, multiKey = false; - // set by extractKeysFromColumns - private String keyAlias = null; - - /** - * Create a new WhereClause with the first parsed relation. - * - * @param firstRelation key or column relation - */ - public WhereClause(Relation firstRelation) - { - and(firstRelation); - } - - public WhereClause() - {} - - /** - * Add an additional relation to this WHERE clause. - * - * @param relation the relation to add. - */ - public void and(Relation relation) - { - clauseRelations.add(relation); - } - - /** - * The same as KEY = to avoid using Relation object - * @param key key to include into clause - */ - public void andKeyEquals(Term key) - { - keys.add(key); - } - - public List getColumnRelations() - { - return columns; - } - - public boolean isKeyRange() - { - return startKey != null; - } - - public Term getStartKey() - { - return startKey; - } - - public Term getFinishKey() - { - return finishKey; - } - - public Set getKeys() - { - return keys; - } - - public boolean includeStartKey() - { - return includeStartKey; - } - - public boolean includeFinishKey() - { - return includeFinishKey; - } - - public void setKeyAlias(String alias) - { - keyAlias = alias.toUpperCase(); - } - - public boolean isMultiKey() { - return multiKey; - } - - public void setMultiKey(boolean multiKey) - { - this.multiKey = multiKey; - } - - public String getKeyAlias() - { - // TODO fix special casing here, key alias should always be set post-extract - // key alias as not related to keys in here, it can be unset when we have a query like - // SELECT * FROM WHERE key = 1 and col > 2 and col < 3; - // it will be always set when statement looks like this - // SELECT * FROM WHERE IN (.., .., ..); - // key is NULL when KEY keyword is used or when key alias given by user was not recognized - // validateKeyAlias will throw an exception for us in that case - return keyAlias == null ? QueryProcessor.DEFAULT_KEY_NAME : keyAlias; - } - - public void extractKeysFromColumns(CFMetaData cfm) - { - String realKeyAlias = cfm.getCQL2KeyName(); - - if (!keys.isEmpty()) - return; // we already have key(s) set ( IN (.., ...) construction used) - - for (Relation relation : clauseRelations) - { - String name = relation.getEntity().getText().toUpperCase(); - if (name.equals(realKeyAlias)) - { - if (keyAlias == null) // setting found key as an alias - keyAlias = name; - - if (relation.operator() == RelationType.EQ) - { - keys.add(relation.getValue()); - } - else if ((relation.operator() == RelationType.GT) || (relation.operator() == RelationType.GTE)) - { - startKey = relation.getValue(); - includeStartKey = relation.operator() == RelationType.GTE; - } - else if ((relation.operator() == RelationType.LT) || (relation.operator() == RelationType.LTE)) - { - finishKey = relation.getValue(); - includeFinishKey = relation.operator() == RelationType.LTE; - } - } - else - { - columns.add(relation); - } - } - } - - public List getClauseRelations() - { - return clauseRelations; - } - - public String toString() - { - return String.format("WhereClause [keys=%s, startKey=%s, finishKey=%s, columns=%s, includeStartKey=%s, includeFinishKey=%s, multiKey=%s, keyAlias=%s]", - keys, - startKey, - finishKey, - columns, - includeStartKey, - includeFinishKey, - multiKey, - keyAlias); - } -} diff --git a/src/java/org/apache/cassandra/cql/hooks/ExecutionContext.java b/src/java/org/apache/cassandra/cql/hooks/ExecutionContext.java deleted file mode 100644 index deb785cc3e3a..000000000000 --- a/src/java/org/apache/cassandra/cql/hooks/ExecutionContext.java +++ /dev/null @@ -1,48 +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.cql.hooks; - -import java.nio.ByteBuffer; -import java.util.List; - -import com.google.common.base.Optional; - -import org.apache.cassandra.thrift.ThriftClientState; - -/** - * Contextual information about the execution of a CQLStatement. - * Used by {@link org.apache.cassandra.cql.hooks.PreExecutionHook} - * - * The CQL string representing the statement being executed is optional - * and is not present for prepared statements. Contexts created for the - * execution of regular (i.e. non-prepared) statements will always - * contain a CQL string. - */ -public class ExecutionContext -{ - public final ThriftClientState clientState; - public final Optional queryString; - public final List variables; - - public ExecutionContext(ThriftClientState clientState, String queryString, List variables) - { - this.clientState = clientState; - this.queryString = Optional.fromNullable(queryString); - this.variables = variables; - } -} diff --git a/src/java/org/apache/cassandra/cql/hooks/PostPreparationHook.java b/src/java/org/apache/cassandra/cql/hooks/PostPreparationHook.java deleted file mode 100644 index 1de9c70e09f5..000000000000 --- a/src/java/org/apache/cassandra/cql/hooks/PostPreparationHook.java +++ /dev/null @@ -1,38 +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.cql.hooks; - -import org.apache.cassandra.cql.CQLStatement; -import org.apache.cassandra.exceptions.RequestValidationException; - -/** - * Run directly after a CQL Statement is prepared in - * {@link org.apache.cassandra.cql.QueryProcessor}. - */ -public interface PostPreparationHook -{ - /** - * Called in QueryProcessor, once a CQL statement has been prepared. - * - * @param statement the statement to perform additional processing on - * @param context preparation context containing additional info - * about the operation and statement - * @throws RequestValidationException - */ - void processStatement(CQLStatement statement, PreparationContext context) throws RequestValidationException; -} diff --git a/src/java/org/apache/cassandra/cql/hooks/PreExecutionHook.java b/src/java/org/apache/cassandra/cql/hooks/PreExecutionHook.java deleted file mode 100644 index 29ed38eb69d2..000000000000 --- a/src/java/org/apache/cassandra/cql/hooks/PreExecutionHook.java +++ /dev/null @@ -1,46 +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.cql.hooks; - -import org.apache.cassandra.cql.CQLStatement; -import org.apache.cassandra.exceptions.RequestExecutionException; -import org.apache.cassandra.exceptions.RequestValidationException; - -/** - * Run before the CQL Statement is executed in - * {@link org.apache.cassandra.cql.QueryProcessor}. The CQLStatement - * returned from the processStatement method is what is actually executed - * by the QueryProcessor. - */ -public interface PreExecutionHook -{ - /** - * Perform pre-processing on a CQL statement prior to it being - * executed by the QueryProcessor. If required, implementations - * may modify the statement as the returned instance is what - * is actually executed. - * - * @param statement the statement to perform pre-processing on - * @param context execution context containing additional info - * about the operation and statement - * @return the actual statement that will be executed, possibly - * a modification of the initial statement - * @throws RequestExecutionException, RequestValidationException - */ - CQLStatement processStatement(CQLStatement statement, ExecutionContext context) throws RequestExecutionException, RequestValidationException; -} diff --git a/src/java/org/apache/cassandra/cql/hooks/PreparationContext.java b/src/java/org/apache/cassandra/cql/hooks/PreparationContext.java deleted file mode 100644 index 00cce78b0b17..000000000000 --- a/src/java/org/apache/cassandra/cql/hooks/PreparationContext.java +++ /dev/null @@ -1,39 +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.cql.hooks; - -import org.apache.cassandra.cql.CQLStatement; -import org.apache.cassandra.thrift.ThriftClientState; - -/** - * Contextual information about the preparation of a CQLStatement. - * Used by {@link org.apache.cassandra.cql.hooks.PostPreparationHook} - */ -public class PreparationContext -{ - public final ThriftClientState clientState; - public final String queryString; - public final CQLStatement statement; - - public PreparationContext(ThriftClientState clientState, String queryString, CQLStatement statement) - { - this.clientState = clientState; - this.queryString = queryString; - this.statement = statement; - } -} diff --git a/src/java/org/apache/cassandra/cql3/QueryProcessor.java b/src/java/org/apache/cassandra/cql3/QueryProcessor.java index 5acb367807c9..bd888524cd4a 100644 --- a/src/java/org/apache/cassandra/cql3/QueryProcessor.java +++ b/src/java/org/apache/cassandra/cql3/QueryProcessor.java @@ -50,7 +50,6 @@ public class QueryProcessor private static final Logger logger = LoggerFactory.getLogger(QueryProcessor.class); private static final MemoryMeter meter = new MemoryMeter().withGuessing(MemoryMeter.Guess.FALLBACK_BEST); private static final long MAX_CACHE_PREPARED_MEMORY = Runtime.getRuntime().maxMemory() / 256; - private static final int MAX_CACHE_PREPARED_COUNT = 10000; private static EntryWeigher cqlMemoryUsageWeigher = new EntryWeigher() { diff --git a/src/java/org/apache/cassandra/db/composites/CType.java b/src/java/org/apache/cassandra/db/composites/CType.java index c2516f5117f6..0e26b1f57f9c 100644 --- a/src/java/org/apache/cassandra/db/composites/CType.java +++ b/src/java/org/apache/cassandra/db/composites/CType.java @@ -97,19 +97,19 @@ public interface CType extends Comparator /** * Deserialize a Composite from a ByteBuffer. * - * This is meant for thrift/cql2 to convert the fully serialized buffer we + * This is meant for thrift to convert the fully serialized buffer we * get from the clients to composites. */ public Composite fromByteBuffer(ByteBuffer bb); /** - * Returns a AbstractType corresponding to this CType for thrift/cql2 sake. + * Returns a AbstractType corresponding to this CType for thrift sake. * * If the CType is a "simple" one, this just return the wrapped type, otherwise * it returns the corresponding org.apache.cassandra.db.marshal.CompositeType. * * This is only meant to be use for backward compatibility (particularly for - * thrift/cql2) but it's not meant to be used internally. + * thrift) but it's not meant to be used internally. */ public AbstractType asAbstractType(); diff --git a/src/java/org/apache/cassandra/db/composites/CellNameType.java b/src/java/org/apache/cassandra/db/composites/CellNameType.java index 7128c914f822..e4fa0e2d9a64 100644 --- a/src/java/org/apache/cassandra/db/composites/CellNameType.java +++ b/src/java/org/apache/cassandra/db/composites/CellNameType.java @@ -144,7 +144,7 @@ public interface CellNameType extends CType * Deserialize a Composite from a ByteBuffer. * * This is equilvalent to CType#fromByteBuffer but assumes the buffer is a full cell - * name. This is meant for thrift/cql2 to convert the fully serialized buffer we + * name. This is meant for thrift to convert the fully serialized buffer we * get from the clients. */ public CellName cellFromByteBuffer(ByteBuffer bb); diff --git a/src/java/org/apache/cassandra/db/marshal/AbstractType.java b/src/java/org/apache/cassandra/db/marshal/AbstractType.java index ce233de7583b..c148366e7c3b 100644 --- a/src/java/org/apache/cassandra/db/marshal/AbstractType.java +++ b/src/java/org/apache/cassandra/db/marshal/AbstractType.java @@ -84,12 +84,6 @@ public String getString(ByteBuffer bytes) /** get a byte representation of the given string. */ public abstract ByteBuffer fromString(String source) throws MarshalException; - /** for compatibility with TimeUUID in CQL2. See TimeUUIDType (that overrides it). */ - public ByteBuffer fromStringCQL2(String source) throws MarshalException - { - return fromString(source); - } - /* validate that the byte array is a valid sequence for the type we are supposed to be comparing */ public void validate(ByteBuffer bytes) throws MarshalException { diff --git a/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java b/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java index 51cf47a459ab..b16b3dde3fca 100644 --- a/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java +++ b/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java @@ -83,41 +83,6 @@ private static int compareTimestampBytes(ByteBuffer o1, ByteBuffer o2) return (o1.get(o1Pos + 3) & 0xFF) - (o2.get(o2Pos + 3) & 0xFF); } - // This accepts dates are valid TimeUUID represensation, which is bogus - // (see #4936) but kept for CQL2 for compatibility sake. - @Override - public ByteBuffer fromStringCQL2(String source) throws MarshalException - { - // Return an empty ByteBuffer for an empty string. - if (source.isEmpty()) - return ByteBufferUtil.EMPTY_BYTE_BUFFER; - - ByteBuffer idBytes = null; - - // ffffffff-ffff-ffff-ffff-ffffffffff - if (regexPattern.matcher(source).matches()) - { - UUID uuid = null; - try - { - uuid = UUID.fromString(source); - idBytes = decompose(uuid); - } - catch (IllegalArgumentException e) - { - throw new MarshalException(String.format("unable to make UUID from '%s'", source), e); - } - - if (uuid.version() != 1) - throw new MarshalException("TimeUUID supports only version 1 UUIDs"); - } else - { - idBytes = ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes(DateType.dateStringToTimestamp(source))); - } - - return idBytes; - } - public ByteBuffer fromString(String source) throws MarshalException { // Return an empty ByteBuffer for an empty string. diff --git a/src/java/org/apache/cassandra/db/marshal/UUIDType.java b/src/java/org/apache/cassandra/db/marshal/UUIDType.java index 4b0751e261b4..cb2dd33dd081 100644 --- a/src/java/org/apache/cassandra/db/marshal/UUIDType.java +++ b/src/java/org/apache/cassandra/db/marshal/UUIDType.java @@ -17,9 +17,7 @@ */ package org.apache.cassandra.db.marshal; - import java.nio.ByteBuffer; -import java.text.ParseException; import java.util.UUID; import org.apache.cassandra.cql3.CQL3Type; @@ -28,9 +26,6 @@ import org.apache.cassandra.serializers.UUIDSerializer; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.UUIDGen; -import org.apache.commons.lang3.time.DateUtils; - -import static org.apache.cassandra.serializers.TimestampSerializer.iso8601Patterns; /** * Compares UUIDs using the following criteria:
@@ -165,52 +160,20 @@ public ByteBuffer fromString(String source) throws MarshalException if (source.isEmpty()) return ByteBufferUtil.EMPTY_BYTE_BUFFER; - ByteBuffer idBytes = null; - // ffffffff-ffff-ffff-ffff-ffffffffff if (TimeUUIDType.regexPattern.matcher(source).matches()) { - UUID uuid; try { - uuid = UUID.fromString(source); - idBytes = ByteBuffer.wrap(UUIDGen.decompose(uuid)); + return ByteBuffer.wrap(UUIDGen.decompose(UUID.fromString(source))); } catch (IllegalArgumentException e) { throw new MarshalException(String.format("unable to make UUID from '%s'", source), e); } - } else if (source.toLowerCase().equals("now")) - { - idBytes = ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes()); - } - // Milliseconds since epoch? - else if (source.matches("^\\d+$")) - { - try - { - idBytes = ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes(Long.parseLong(source))); - } - catch (NumberFormatException e) - { - throw new MarshalException(String.format("unable to make version 1 UUID from '%s'", source), e); - } - } - // Last chance, attempt to parse as date-time string - else - { - try - { - long timestamp = DateUtils.parseDate(source, iso8601Patterns).getTime(); - idBytes = ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes(timestamp)); - } - catch (ParseException e1) - { - throw new MarshalException(String.format("unable to coerce '%s' to version 1 UUID", source), e1); - } } - return idBytes; + throw new MarshalException(String.format("unable to coerce '%s' to version 1 UUID", source)); } public CQL3Type asCQL3Type() diff --git a/src/java/org/apache/cassandra/service/ClientState.java b/src/java/org/apache/cassandra/service/ClientState.java index 7f312a939943..7c3ba22bb37d 100644 --- a/src/java/org/apache/cassandra/service/ClientState.java +++ b/src/java/org/apache/cassandra/service/ClientState.java @@ -31,6 +31,7 @@ import org.apache.cassandra.auth.*; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.config.Schema; +import org.apache.cassandra.cql3.QueryProcessor; import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.exceptions.AuthenticationException; @@ -73,8 +74,6 @@ public class ClientState private volatile AuthenticatedUser user; private volatile String keyspace; - private SemanticVersion cqlVersion; - // isInternal is used to mark ClientState as used by some internal component // that should have an ability to modify system keyspace. private final boolean isInternal; @@ -241,54 +240,14 @@ private static void validateKeyspace(String keyspace) throws InvalidRequestExcep throw new InvalidRequestException("You have not set a keyspace for this session"); } - public void setCQLVersion(String str) throws InvalidRequestException - { - SemanticVersion version; - try - { - version = new SemanticVersion(str); - } - catch (IllegalArgumentException e) - { - throw new InvalidRequestException(e.getMessage()); - } - - SemanticVersion cql = org.apache.cassandra.cql.QueryProcessor.CQL_VERSION; - SemanticVersion cql3 = org.apache.cassandra.cql3.QueryProcessor.CQL_VERSION; - - // We've made some backward incompatible changes between CQL3 beta1 and the final. - // It's ok because it was a beta, but it still mean we don't support 3.0.0-beta1 so reject it. - SemanticVersion cql3Beta = new SemanticVersion("3.0.0-beta1"); - if (version.equals(cql3Beta)) - throw new InvalidRequestException(String.format("There has been a few syntax breaking changes between 3.0.0-beta1 and 3.0.0 " - + "(mainly the syntax for options of CREATE KEYSPACE and CREATE TABLE). 3.0.0-beta1 " - + " is not supported; please upgrade to 3.0.0")); - if (version.isSupportedBy(cql)) - cqlVersion = cql; - else if (version.isSupportedBy(cql3)) - cqlVersion = cql3; - else - throw new InvalidRequestException(String.format("Provided version %s is not supported by this server (supported: %s)", - version, - StringUtils.join(getCQLSupportedVersion(), ", "))); - } - public AuthenticatedUser getUser() { return user; } - public SemanticVersion getCQLVersion() - { - return cqlVersion; - } - public static SemanticVersion[] getCQLSupportedVersion() { - SemanticVersion cql = org.apache.cassandra.cql.QueryProcessor.CQL_VERSION; - SemanticVersion cql3 = org.apache.cassandra.cql3.QueryProcessor.CQL_VERSION; - - return new SemanticVersion[]{ cql, cql3 }; + return new SemanticVersion[]{ QueryProcessor.CQL_VERSION }; } private static LoadingCache, Set> initPermissionsCache() diff --git a/src/java/org/apache/cassandra/thrift/CassandraServer.java b/src/java/org/apache/cassandra/thrift/CassandraServer.java index 650c74e3d52a..a5af55d57657 100644 --- a/src/java/org/apache/cassandra/thrift/CassandraServer.java +++ b/src/java/org/apache/cassandra/thrift/CassandraServer.java @@ -44,8 +44,6 @@ import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.config.Schema; -import org.apache.cassandra.cql.CQLStatement; -import org.apache.cassandra.cql.QueryProcessor; import org.apache.cassandra.cql3.QueryOptions; import org.apache.cassandra.db.*; import org.apache.cassandra.db.composites.*; @@ -71,7 +69,6 @@ import org.apache.cassandra.tracing.Tracing; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.Pair; -import org.apache.cassandra.utils.SemanticVersion; import org.apache.cassandra.utils.UUIDGen; import org.apache.thrift.TException; @@ -83,8 +80,6 @@ public class CassandraServer implements Cassandra.Iface private final static List EMPTY_COLUMNS = Collections.emptyList(); - private volatile boolean loggedCQL2Warning = false; - /* * RequestScheduler to perform the scheduling of incoming requests */ @@ -1895,67 +1890,13 @@ private static String uncompress(ByteBuffer query, Compression compression) thro return queryString; } - private void validateCQLVersion(int major) throws InvalidRequestException - { - /* - * The rules are: - * - If no version are set, we don't validate anything. The reason is - * that 1) old CQL2 client might not have called set_cql_version - * and 2) some client may have removed the set_cql_version for CQL3 - * when updating to 1.2.0. A CQL3 client upgrading from pre-1.2 - * shouldn't be in that case however since set_cql_version uses to - * be mandatory (for CQL3). - * - Otherwise, checks the major matches whatever was set. - */ - SemanticVersion versionSet = state().getCQLVersion(); - if (versionSet == null) - return; - - if (versionSet.major != major) - throw new InvalidRequestException( - "Cannot execute/prepare CQL" + major + " statement since the CQL has been set to CQL" + versionSet.major - + "(This might mean your client hasn't been upgraded correctly to use the new CQL3 methods introduced in Cassandra 1.2+)."); - } - - public CqlResult execute_cql_query(ByteBuffer query, Compression compression) - throws InvalidRequestException, UnavailableException, TimedOutException, SchemaDisagreementException, TException + public CqlResult execute_cql_query(ByteBuffer query, Compression compression) throws TException { - validateCQLVersion(2); - maybeLogCQL2Warning(); - - try - { - String queryString = uncompress(query, compression); - if (startSessionIfRequested()) - { - Tracing.instance.begin("execute_cql_query", - ImmutableMap.of("query", queryString)); - } - else - { - logger.debug("execute_cql_query"); - } - - return QueryProcessor.process(queryString, state()); - } - catch (RequestExecutionException e) - { - throw ThriftConversion.rethrow(e); - } - catch (RequestValidationException e) - { - throw ThriftConversion.toThrift(e); - } - finally - { - Tracing.instance.stopSession(); - } + throw new InvalidRequestException("CQL2 has been removed in Cassandra 3.0. Please use CQL3 instead"); } - public CqlResult execute_cql3_query(ByteBuffer query, Compression compression, ConsistencyLevel cLevel) - throws InvalidRequestException, UnavailableException, TimedOutException, SchemaDisagreementException, TException + public CqlResult execute_cql3_query(ByteBuffer query, Compression compression, ConsistencyLevel cLevel) throws TException { - validateCQLVersion(3); try { String queryString = uncompress(query, compression); @@ -1986,36 +1927,14 @@ public CqlResult execute_cql3_query(ByteBuffer query, Compression compression, C } } - public CqlPreparedResult prepare_cql_query(ByteBuffer query, Compression compression) - throws InvalidRequestException, TException + public CqlPreparedResult prepare_cql_query(ByteBuffer query, Compression compression) throws TException { - if (logger.isDebugEnabled()) - logger.debug("prepare_cql_query"); - - validateCQLVersion(2); - maybeLogCQL2Warning(); - - String queryString = uncompress(query, compression); - ThriftClientState cState = state(); - - try - { - cState.validateLogin(); - return QueryProcessor.prepare(queryString, cState); - } - catch (RequestValidationException e) - { - throw ThriftConversion.toThrift(e); - } + throw new InvalidRequestException("CQL2 has been removed in Cassandra 3.0. Please use CQL3 instead"); } - public CqlPreparedResult prepare_cql3_query(ByteBuffer query, Compression compression) - throws InvalidRequestException, TException + public CqlPreparedResult prepare_cql3_query(ByteBuffer query, Compression compression) throws TException { - if (logger.isDebugEnabled()) - logger.debug("prepare_cql3_query"); - - validateCQLVersion(3); + logger.debug("prepare_cql3_query"); String queryString = uncompress(query, compression); ThriftClientState cState = state(); @@ -2031,52 +1950,13 @@ public CqlPreparedResult prepare_cql3_query(ByteBuffer query, Compression compre } } - public CqlResult execute_prepared_cql_query(int itemId, List bindVariables) - throws InvalidRequestException, UnavailableException, TimedOutException, SchemaDisagreementException, TException + public CqlResult execute_prepared_cql_query(int itemId, List bindVariables) throws TException { - validateCQLVersion(2); - maybeLogCQL2Warning(); - - if (startSessionIfRequested()) - { - // TODO we don't have [typed] access to CQL bind variables here. CASSANDRA-4560 is open to add support. - Tracing.instance.begin("execute_prepared_cql_query", Collections.emptyMap()); - } - else - { - logger.debug("execute_prepared_cql_query"); - } - - try - { - ThriftClientState cState = state(); - CQLStatement statement = cState.getPrepared().get(itemId); - - if (statement == null) - throw new InvalidRequestException(String.format("Prepared query with ID %d not found", itemId)); - logger.trace("Retrieved prepared statement #{} with {} bind markers", itemId, statement.boundTerms); - - return QueryProcessor.processPrepared(statement, cState, bindVariables); - } - catch (RequestExecutionException e) - { - throw ThriftConversion.rethrow(e); - } - catch (RequestValidationException e) - { - throw ThriftConversion.toThrift(e); - } - finally - { - Tracing.instance.stopSession(); - } + throw new InvalidRequestException("CQL2 has been removed in Cassandra 3.0. Please use CQL3 instead"); } - public CqlResult execute_prepared_cql3_query(int itemId, List bindVariables, ConsistencyLevel cLevel) - throws InvalidRequestException, UnavailableException, TimedOutException, SchemaDisagreementException, TException + public CqlResult execute_prepared_cql3_query(int itemId, List bindVariables, ConsistencyLevel cLevel) throws TException { - validateCQLVersion(3); - if (startSessionIfRequested()) { // TODO we don't have [typed] access to CQL bind variables here. CASSANDRA-4560 is open to add support. @@ -2118,31 +1998,10 @@ public CqlResult execute_prepared_cql3_query(int itemId, List bindVa } /* - * Deprecated, but if a client sets CQL2, it is a no-op for compatibility sake. - * If it sets CQL3 however, we throw an IRE because this mean the client - * hasn't been updated for Cassandra 1.2 and should start using the new - * execute_cql3_query, etc... and there is no point no warning it early. + * No-op since 3.0. */ - public void set_cql_version(String version) throws InvalidRequestException + public void set_cql_version(String version) { - try - { - state().setCQLVersion(version); - } - catch (org.apache.cassandra.exceptions.InvalidRequestException e) - { - throw new InvalidRequestException(e.getMessage()); - } - } - - private void maybeLogCQL2Warning() - { - if (!loggedCQL2Warning) - { - logger.warn("CQL2 has been deprecated since Cassandra 2.0, and will be removed entirely in version 2.2." - + " Please switch to CQL3 before then."); - loggedCQL2Warning = true; - } } public ByteBuffer trace_next_query() throws TException diff --git a/src/java/org/apache/cassandra/thrift/ThriftClientState.java b/src/java/org/apache/cassandra/thrift/ThriftClientState.java index 56dcf6fc7560..319169f6ff10 100644 --- a/src/java/org/apache/cassandra/thrift/ThriftClientState.java +++ b/src/java/org/apache/cassandra/thrift/ThriftClientState.java @@ -18,10 +18,8 @@ package org.apache.cassandra.thrift; import java.net.SocketAddress; -import java.util.*; import org.apache.cassandra.config.DatabaseDescriptor; -import org.apache.cassandra.cql.CQLStatement; import org.apache.cassandra.service.ClientState; import org.apache.cassandra.service.QueryState; @@ -34,19 +32,8 @@ */ public class ThriftClientState extends ClientState { - private static final int MAX_CACHE_PREPARED = 10000; // Enough to keep buggy clients from OOM'ing us - private final QueryState queryState; - // An LRU map of prepared statements - private final Map prepared = new LinkedHashMap(16, 0.75f, true) - { - protected boolean removeEldestEntry(Map.Entry eldest) - { - return size() > MAX_CACHE_PREPARED; - } - }; - public ThriftClientState(SocketAddress remoteAddress) { super(remoteAddress); @@ -58,11 +45,6 @@ public QueryState getQueryState() return queryState; } - public Map getPrepared() - { - return prepared; - } - public String getSchedulingValue() { switch(DatabaseDescriptor.getRequestSchedulerId()) diff --git a/src/java/org/apache/cassandra/transport/messages/StartupMessage.java b/src/java/org/apache/cassandra/transport/messages/StartupMessage.java index d2b4350bd55c..5ae7a75c9b41 100644 --- a/src/java/org/apache/cassandra/transport/messages/StartupMessage.java +++ b/src/java/org/apache/cassandra/transport/messages/StartupMessage.java @@ -23,8 +23,6 @@ import org.jboss.netty.buffer.ChannelBuffer; import org.apache.cassandra.config.DatabaseDescriptor; -import org.apache.cassandra.exceptions.InvalidRequestException; -import org.apache.cassandra.service.ClientState; import org.apache.cassandra.service.QueryState; import org.apache.cassandra.transport.*; import org.apache.cassandra.utils.SemanticVersion; @@ -66,23 +64,20 @@ public StartupMessage(Map options) public Message.Response execute(QueryState state) { - ClientState cState = state.getClientState(); String cqlVersion = options.get(CQL_VERSION); if (cqlVersion == null) throw new ProtocolException("Missing value CQL_VERSION in STARTUP message"); try { - cState.setCQLVersion(cqlVersion); + if (new SemanticVersion(cqlVersion).compareTo(new SemanticVersion("2.99.0")) < 0) + throw new ProtocolException(String.format("CQL version %s is not supported by the binary protocol (supported version are >= 3.0.0)", cqlVersion)); } - catch (InvalidRequestException e) + catch (IllegalArgumentException e) { throw new ProtocolException(e.getMessage()); } - if (cState.getCQLVersion().compareTo(new SemanticVersion("2.99.0")) < 0) - throw new ProtocolException(String.format("CQL version %s is not supported by the binary protocol (supported version are >= 3.0.0)", cqlVersion)); - if (options.containsKey(COMPRESSION)) { String compression = options.get(COMPRESSION).toLowerCase(); diff --git a/src/java/org/apache/cassandra/triggers/TriggerExecutor.java b/src/java/org/apache/cassandra/triggers/TriggerExecutor.java index 91d0ea05a88d..8d7f42bd62b1 100644 --- a/src/java/org/apache/cassandra/triggers/TriggerExecutor.java +++ b/src/java/org/apache/cassandra/triggers/TriggerExecutor.java @@ -28,9 +28,8 @@ import com.google.common.collect.Maps; import org.apache.cassandra.config.TriggerDefinition; -import org.apache.cassandra.cql.QueryProcessor; +import org.apache.cassandra.cql3.QueryProcessor; import org.apache.cassandra.db.*; -import org.apache.cassandra.db.composites.CellName; import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.utils.FBUtilities; @@ -92,8 +91,8 @@ private void validate(Collection tmutations) throws InvalidRequestExce { QueryProcessor.validateKey(mutation.key()); for (ColumnFamily tcf : mutation.getColumnFamilies()) - for (CellName tName : tcf.getColumnNames()) - QueryProcessor.validateColumn(tcf.metadata(), tName, tcf.getColumn(tName).value()); + for (Cell cell : tcf) + cell.validateFields(tcf.metadata()); } } diff --git a/src/java/org/apache/cassandra/utils/UUIDGen.java b/src/java/org/apache/cassandra/utils/UUIDGen.java index f3857447c8eb..e5ab7fe1c331 100644 --- a/src/java/org/apache/cassandra/utils/UUIDGen.java +++ b/src/java/org/apache/cassandra/utils/UUIDGen.java @@ -164,27 +164,6 @@ private static long fromUnixTimestamp(long timestamp) { return (timestamp - START_EPOCH) * 10000; } - /** - * Converts a milliseconds-since-epoch timestamp into the 16 byte representation - * of a type 1 UUID (a time-based UUID). - * - *

Deprecated: This method goes again the principle of a time - * UUID and should not be used. For queries based on timestamp, minTimeUUID() and - * maxTimeUUID() can be used but this method has questionable usefulness. This is - * only kept because CQL2 uses it (see TimeUUID.fromStringCQL2) and we - * don't want to break compatibility.

- * - *

Warning: This method is not guaranteed to return unique UUIDs; Multiple - * invocations using identical timestamps will result in identical UUIDs.

- * - * @param timeMillis - * @return a type 1 UUID represented as a byte[] - */ - public static byte[] getTimeUUIDBytes(long timeMillis) - { - return createTimeUUIDBytes(instance.createTimeUnsafe(timeMillis)); - } - /** * Converts a 100-nanoseconds precision timestamp into the 16 byte representation * of a type 1 UUID (a time-based UUID). diff --git a/tools/stress/src/org/apache/cassandra/stress/Operation.java b/tools/stress/src/org/apache/cassandra/stress/Operation.java index 4519b1903649..198f7fecb035 100644 --- a/tools/stress/src/org/apache/cassandra/stress/Operation.java +++ b/tools/stress/src/org/apache/cassandra/stress/Operation.java @@ -131,10 +131,6 @@ public boolean isCql3() { return settings.mode.cqlVersion == CqlVersion.CQL3; } - public boolean isCql2() - { - return settings.mode.cqlVersion == CqlVersion.CQL2; - } public Object getCqlCache() { return cqlCache; diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/CqlCounterAdder.java b/tools/stress/src/org/apache/cassandra/stress/operations/CqlCounterAdder.java index aae99b596a30..910b6edcde8e 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/CqlCounterAdder.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/CqlCounterAdder.java @@ -35,12 +35,9 @@ public CqlCounterAdder(State state, long idx) @Override protected String buildQuery() { - String counterCF = state.isCql2() ? "Counter1" : "Counter3"; + String counterCF = "Counter3"; - StringBuilder query = new StringBuilder("UPDATE ").append(wrapInQuotesIfRequired(counterCF)); - - if (state.isCql2()) - query.append(" USING CONSISTENCY ").append(state.settings.command.consistencyLevel); + StringBuilder query = new StringBuilder("UPDATE ").append(wrapInQuotes(counterCF)); query.append(" SET "); diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/CqlCounterGetter.java b/tools/stress/src/org/apache/cassandra/stress/operations/CqlCounterGetter.java index 31fd20d44177..61866675288f 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/CqlCounterGetter.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/CqlCounterGetter.java @@ -42,21 +42,7 @@ protected List getQueryParameters(byte[] key) @Override protected String buildQuery() { - StringBuilder query = new StringBuilder("SELECT "); - - if (state.isCql2()) - query.append("FIRST ").append(state.settings.columns.maxColumnsPerKey).append(" ''..''"); - else - query.append("*"); - - String counterCF = state.isCql2() ? "Counter1" : "Counter3"; - - query.append(" FROM ").append(wrapInQuotesIfRequired(counterCF)); - - if (state.isCql2()) - query.append(" USING CONSISTENCY ").append(state.settings.command.consistencyLevel); - - return query.append(" WHERE KEY=?").toString(); + return "SELECT * FROM \"Counter3\" USING CONSISTENCY " + state.settings.command.consistencyLevel + " WHERE KEY=?"; } @Override diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/CqlIndexedRangeSlicer.java b/tools/stress/src/org/apache/cassandra/stress/operations/CqlIndexedRangeSlicer.java index ff43322bca06..25af04a4c61b 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/CqlIndexedRangeSlicer.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/CqlIndexedRangeSlicer.java @@ -48,21 +48,10 @@ protected List getQueryParameters(byte[] key) @Override protected String buildQuery() { - StringBuilder query = new StringBuilder("SELECT "); - - if (state.isCql2()) - query.append(state.settings.columns.maxColumnsPerKey).append(" ''..''"); - else - query.append("*"); - - query.append(" FROM Standard1"); - - if (state.isCql2()) - query.append(" USING CONSISTENCY ").append(state.settings.command.consistencyLevel); - + StringBuilder query = new StringBuilder("SELECT * FROM \"Standard1\""); final String columnName = getColumnName(1); query.append(" WHERE ").append(columnName).append("=?") - .append(" AND KEY > ? LIMIT ").append(((SettingsCommandMulti)state.settings.command).keysAtOnce); + .append(" AND KEY > ? LIMIT ").append(((SettingsCommandMulti)state.settings.command).keysAtOnce); return query.toString(); } diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/CqlInserter.java b/tools/stress/src/org/apache/cassandra/stress/operations/CqlInserter.java index 8d964f57b911..1f8987d92084 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/CqlInserter.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/CqlInserter.java @@ -38,10 +38,7 @@ public CqlInserter(State state, long idx) @Override protected String buildQuery() { - StringBuilder query = new StringBuilder("UPDATE ").append(wrapInQuotesIfRequired(state.settings.schema.columnFamily)); - - if (state.isCql2()) - query.append(" USING CONSISTENCY ").append(state.settings.command.consistencyLevel); + StringBuilder query = new StringBuilder("UPDATE ").append(wrapInQuotes(state.settings.schema.columnFamily)); query.append(" SET "); @@ -55,12 +52,12 @@ protected String buildQuery() if (state.isCql3()) throw new UnsupportedOperationException("Cannot use UUIDs in column names with CQL3"); - query.append(wrapInQuotesIfRequired(UUIDGen.getTimeUUID().toString())) + query.append(wrapInQuotes(UUIDGen.getTimeUUID().toString())) .append(" = ?"); } else { - query.append(wrapInQuotesIfRequired("C" + i)).append(" = ?"); + query.append(wrapInQuotes("C" + i)).append(" = ?"); } } diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/CqlOperation.java b/tools/stress/src/org/apache/cassandra/stress/operations/CqlOperation.java index b17f52042a79..8674cc03e860 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/CqlOperation.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/CqlOperation.java @@ -268,10 +268,7 @@ public void run(JavaDriverClient client) throws IOException public ClientWrapper wrap(ThriftClient client) { - return state.isCql3() - ? new Cql3CassandraClientWrapper(client) - : new Cql2CassandraClientWrapper(client); - + return new Cql3CassandraClientWrapper(client); } public ClientWrapper wrap(JavaDriverClient client) @@ -302,7 +299,7 @@ private JavaDriverWrapper(JavaDriverClient client) @Override public V execute(String query, ByteBuffer key, List queryParams, ResultHandler handler) { - String formattedQuery = formatCqlQuery(query, queryParams, state.isCql3()); + String formattedQuery = formatCqlQuery(query, queryParams); return handler.javaDriverHandler().apply(client.execute(formattedQuery, ThriftConversion.fromThrift(state.settings.command.consistencyLevel))); } @@ -334,7 +331,7 @@ private SimpleClientWrapper(SimpleClient client) @Override public V execute(String query, ByteBuffer key, List queryParams, ResultHandler handler) { - String formattedQuery = formatCqlQuery(query, queryParams, state.isCql3()); + String formattedQuery = formatCqlQuery(query, queryParams); return handler.thriftHandler().apply(client.execute(formattedQuery, ThriftConversion.fromThrift(state.settings.command.consistencyLevel))); } @@ -367,7 +364,7 @@ private Cql3CassandraClientWrapper(ThriftClient client) @Override public V execute(String query, ByteBuffer key, List queryParams, ResultHandler handler) throws TException { - String formattedQuery = formatCqlQuery(query, queryParams, true); + String formattedQuery = formatCqlQuery(query, queryParams); return handler.simpleNativeHandler().apply( client.execute_cql3_query(formattedQuery, key, Compression.NONE, state.settings.command.consistencyLevel) ); @@ -389,40 +386,6 @@ public Object createPreparedStatement(String cqlQuery) throws TException } } - // client wrapper for Cql2 - private final class Cql2CassandraClientWrapper implements ClientWrapper - { - final ThriftClient client; - private Cql2CassandraClientWrapper(ThriftClient client) - { - this.client = client; - } - - @Override - public V execute(String query, ByteBuffer key, List queryParams, ResultHandler handler) throws TException - { - String formattedQuery = formatCqlQuery(query, queryParams, false); - return handler.simpleNativeHandler().apply( - client.execute_cql_query(formattedQuery, key, Compression.NONE) - ); - } - - @Override - public V execute(Object preparedStatementId, ByteBuffer key, List queryParams, ResultHandler handler) throws TException - { - Integer id = (Integer) preparedStatementId; - return handler.simpleNativeHandler().apply( - client.execute_prepared_cql_query(id, key, queryParams) - ); - } - - @Override - public Object createPreparedStatement(String cqlQuery) throws TException - { - return client.prepare_cql_query(cqlQuery, Compression.NONE); - } - } - // interface for building functions to standardise results from each client protected static interface ResultHandler { @@ -632,11 +595,9 @@ public byte[][] apply(CqlResult result) } - private static String getUnQuotedCqlBlob(ByteBuffer term, boolean isCQL3) + private static String getUnQuotedCqlBlob(ByteBuffer term) { - return isCQL3 - ? "0x" + ByteBufferUtil.bytesToHex(term) - : ByteBufferUtil.bytesToHex(term); + return "0x" + ByteBufferUtil.bytesToHex(term); } /** @@ -647,7 +608,7 @@ private static String getUnQuotedCqlBlob(ByteBuffer term, boolean isCQL3) * @param parms sequence of string query parameters * @return formatted CQL query string */ - private static String formatCqlQuery(String query, List parms, boolean isCql3) + private static String formatCqlQuery(String query, List parms) { int marker, position = 0; StringBuilder result = new StringBuilder(); @@ -658,7 +619,7 @@ private static String formatCqlQuery(String query, List parms, boole for (ByteBuffer parm : parms) { result.append(query.substring(position, marker)); - result.append(getUnQuotedCqlBlob(parm, isCql3)); + result.append(getUnQuotedCqlBlob(parm)); position = marker + 1; if (-1 == (marker = query.indexOf('?', position + 1))) @@ -671,11 +632,9 @@ private static String formatCqlQuery(String query, List parms, boole return result.toString(); } - protected String wrapInQuotesIfRequired(String string) + protected String wrapInQuotes(String string) { - return state.settings.mode.cqlVersion == CqlVersion.CQL3 - ? "\"" + string + "\"" - : string; + return "\"" + string + "\""; } } diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/CqlRangeSlicer.java b/tools/stress/src/org/apache/cassandra/stress/operations/CqlRangeSlicer.java index 76ba9663bb94..cce47fc60364 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/CqlRangeSlicer.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/CqlRangeSlicer.java @@ -41,13 +41,7 @@ protected List getQueryParameters(byte[] key) @Override protected String buildQuery() { - StringBuilder query = new StringBuilder("SELECT FIRST ").append(state.settings.columns.maxColumnsPerKey) - .append(" ''..'' FROM ").append(state.settings.schema.columnFamily); - - if (state.isCql2()) - query.append(" USING CONSISTENCY ").append(state.settings.command.consistencyLevel); - - return query.append(" WHERE KEY > ?").toString(); + return "SELECT FIRST " + state.settings.columns.maxColumnsPerKey + " ''..'' FROM " + state.settings.schema.columnFamily + " WHERE KEY > ?"; } @Override diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/CqlReader.java b/tools/stress/src/org/apache/cassandra/stress/operations/CqlReader.java index 44da43f25bb4..aa949d427aad 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/CqlReader.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/CqlReader.java @@ -42,10 +42,7 @@ protected String buildQuery() if (state.settings.columns.names == null) { - if (state.isCql2()) - query.append("FIRST ").append(state.settings.columns.maxColumnsPerKey).append(" ''..''"); - else - query.append("*"); + query.append("*"); } else { @@ -57,10 +54,8 @@ protected String buildQuery() } } - query.append(" FROM ").append(wrapInQuotesIfRequired(state.settings.schema.columnFamily)); + query.append(" FROM ").append(wrapInQuotes(state.settings.schema.columnFamily)); - if (state.isCql2()) - query.append(" USING CONSISTENCY ").append(state.settings.command.consistencyLevel); query.append(" WHERE KEY=?"); return query.toString(); } diff --git a/tools/stress/src/org/apache/cassandra/stress/settings/CqlVersion.java b/tools/stress/src/org/apache/cassandra/stress/settings/CqlVersion.java index d7d09f6d09be..1e963c7f871d 100644 --- a/tools/stress/src/org/apache/cassandra/stress/settings/CqlVersion.java +++ b/tools/stress/src/org/apache/cassandra/stress/settings/CqlVersion.java @@ -25,7 +25,6 @@ public enum CqlVersion { NOCQL(null), - CQL2("2.0.0"), CQL3("3.0.0"); public final String connectVersion; @@ -41,8 +40,6 @@ static CqlVersion get(String version) return NOCQL; switch(version.charAt(0)) { - case '2': - return CQL2; case '3': return CQL3; default: @@ -55,11 +52,6 @@ public boolean isCql() return this != NOCQL; } - public boolean isCql2() - { - return this == CQL2; - } - public boolean isCql3() { return this == CQL3; diff --git a/tools/stress/src/org/apache/cassandra/stress/settings/Legacy.java b/tools/stress/src/org/apache/cassandra/stress/settings/Legacy.java index 5c793e6eced2..5ddb346c291d 100644 --- a/tools/stress/src/org/apache/cassandra/stress/settings/Legacy.java +++ b/tools/stress/src/org/apache/cassandra/stress/settings/Legacy.java @@ -60,7 +60,6 @@ public class Legacy implements Serializable availableOptions.addOption("i", "progress-interval", true, "Progress Report Interval (seconds), default:10"); availableOptions.addOption("g", "keys-per-call", true, "Number of keys to get_range_slices or multiget per call, default:1000"); availableOptions.addOption("l", "replication-factor", true, "Replication Factor to use when creating needed column families, default:1"); - availableOptions.addOption("L", "enable-cql", false, "Perform queries using CQL2 (Cassandra Query Language v 2.0.0)"); availableOptions.addOption("L3", "enable-cql3", false, "Perform queries using CQL3 (Cassandra Query Language v 3.0.0)"); availableOptions.addOption("b", "enable-native-protocol", false, "Use the binary native protocol (only work along with -L3)"); availableOptions.addOption("P", "use-prepared-statements", false, "Perform queries using prepared statements (only applicable to CQL)."); @@ -233,9 +232,7 @@ else if (cmd.hasOption("r")) r.add("-schema", "replication(" + rep + ")"); } - if (cmd.hasOption("L")) - r.add("-mode", cmd.hasOption("P") ? "prepared cql2" : "cql2"); - else if (cmd.hasOption("L3")) + if (cmd.hasOption("L3")) r.add("-mode", (cmd.hasOption("P") ? "prepared" : "") + (cmd.hasOption("b") ? "native" : "") + "cql3"); else r.add("-mode", "thrift"); diff --git a/tools/stress/src/org/apache/cassandra/stress/settings/SettingsMode.java b/tools/stress/src/org/apache/cassandra/stress/settings/SettingsMode.java index eef8c39618cd..93cfe0581232 100644 --- a/tools/stress/src/org/apache/cassandra/stress/settings/SettingsMode.java +++ b/tools/stress/src/org/apache/cassandra/stress/settings/SettingsMode.java @@ -54,14 +54,6 @@ else if (options instanceof Cql3SimpleNativeOptions) style = opts.usePrepared.setByUser() ? ConnectionStyle.CQL_PREPARED : ConnectionStyle.CQL; compression = ProtocolOptions.Compression.NONE.name(); } - else if (options instanceof Cql2Options) - { - cqlVersion = CqlVersion.CQL2; - api = ConnectionAPI.THRIFT; - Cql2Options opts = (Cql2Options) options; - style = opts.usePrepared.setByUser() ? ConnectionStyle.CQL_PREPARED : ConnectionStyle.CQL; - compression = ProtocolOptions.Compression.NONE.name(); - } else if (options instanceof ThriftOptions) { ThriftOptions opts = (ThriftOptions) options; @@ -110,18 +102,6 @@ public List options() } } - private static final class Cql2Options extends GroupedOptions - { - final OptionSimple api = new OptionSimple("cql2", "", null, "", true); - final OptionSimple usePrepared = new OptionSimple("prepared", "", null, "", false); - - @Override - public List options() - { - return Arrays.asList(usePrepared, api); - } - } - private static final class ThriftOptions extends GroupedOptions { final OptionSimple api = new OptionSimple("thrift", "", null, "", true); @@ -146,7 +126,7 @@ public static SettingsMode get(Map clArgs) return new SettingsMode(opts); } - GroupedOptions options = GroupedOptions.select(params, new ThriftOptions(), new Cql2Options(), new Cql3Options(), new Cql3SimpleNativeOptions()); + GroupedOptions options = GroupedOptions.select(params, new ThriftOptions(), new Cql3Options(), new Cql3SimpleNativeOptions()); if (options == null) { printHelp(); @@ -158,7 +138,7 @@ public static SettingsMode get(Map clArgs) public static void printHelp() { - GroupedOptions.printOptions(System.out, "-mode", new ThriftOptions(), new Cql2Options(), new Cql3Options(), new Cql3SimpleNativeOptions()); + GroupedOptions.printOptions(System.out, "-mode", new ThriftOptions(), new Cql3Options(), new Cql3SimpleNativeOptions()); } public static Runnable helpPrinter() From 1a4fe6346d3a6b409f27ebc2b1ab34aed5ebc59b Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Fri, 28 Feb 2014 11:03:45 -0600 Subject: [PATCH 002/557] fix changes for b2 --- CHANGES.txt | 69 ++++++++++++++++++++--------------------------------- 1 file changed, 26 insertions(+), 43 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 3b3b951b54b7..53e1e6fb2194 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -11,6 +11,32 @@ Merged from 2.0: * Pool CqlRecordWriter clients by inetaddress rather than Range (CASSANDRA-6665) * Fix compaction_history timestamps (CASSANDRA-6784) + * Compare scores of full replica ordering in DES (CASSANDRA-6883) + * fix CME in SessionInfo updateProgress affecting netstats (CASSANDRA-6577) + * Allow repairing between specific replicas (CASSANDRA-6440) + * Allow per-dc enabling of hints (CASSANDRA-6157) + * Add compatibility for Hadoop 0.2.x (CASSANDRA-5201) + * Fix EstimatedHistogram races (CASSANDRA-6682) + * Failure detector correctly converts initial value to nanos (CASSANDRA-6658) + * Add nodetool taketoken to relocate vnodes (CASSANDRA-4445) + * Fix upgradesstables NPE for non-CF-based indexes (CASSANDRA-6645) + * Expose bulk loading progress over JMX (CASSANDRA-4757) + * Correctly handle null with IF conditions and TTL (CASSANDRA-6623) + * Account for range/row tombstones in tombstone drop + time histogram (CASSANDRA-6522) + * Stop CommitLogSegment.close() from calling sync() (CASSANDRA-6652) + * Make commitlog failure handling configurable (CASSANDRA-6364) + * Avoid overlaps in LCS (CASSANDRA-6688) + * Improve support for paginating over composites (CASSANDRA-4851) + * Fix count(*) queries in a mixed cluster (CASSANDRA-6707) + * Improve repair tasks(snapshot, differencing) concurrency (CASSANDRA-6566) + * Fix replaying pre-2.0 commit logs (CASSANDRA-6714) + * Add static columns to CQL3 (CASSANDRA-6561) + * Optimize single partition batch statements (CASSANDRA-6737) + * Disallow post-query re-ordering when paging (CASSANDRA-6722) + * Fix potential paging bug with deleted columns (CASSANDRA-6748) + * Catch memtable flush exceptions during shutdown (CASSANDRA-6735) + * Fix upgradesstables NPE for non-CF-based indexes (CASSANDRA-6645) 2.1.0-beta1 @@ -51,49 +77,6 @@ Merged from 2.0: * Lift limitation that order by columns must be selected for IN queries (CASSANDRA-4911) -2.0.6 - * Compare scores of full replica ordering in DES (CASSANDRA-6883) - * fix CME in SessionInfo updateProgress affecting netstats (CASSANDRA-6577) - * Allow repairing between specific replicas (CASSANDRA-6440) - * Allow per-dc enabling of hints (CASSANDRA-6157) - * Add compatibility for Hadoop 0.2.x (CASSANDRA-5201) - * Fix EstimatedHistogram races (CASSANDRA-6682) - * Failure detector correctly converts initial value to nanos (CASSANDRA-6658) - * Add nodetool taketoken to relocate vnodes (CASSANDRA-4445) - * Fix upgradesstables NPE for non-CF-based indexes (CASSANDRA-6645) - * Expose bulk loading progress over JMX (CASSANDRA-4757) - * Correctly handle null with IF conditions and TTL (CASSANDRA-6623) - * Account for range/row tombstones in tombstone drop - time histogram (CASSANDRA-6522) - * Stop CommitLogSegment.close() from calling sync() (CASSANDRA-6652) - * Make commitlog failure handling configurable (CASSANDRA-6364) - * Avoid overlaps in LCS (CASSANDRA-6688) - * Improve support for paginating over composites (CASSANDRA-4851) - * Fix count(*) queries in a mixed cluster (CASSANDRA-6707) - * Improve repair tasks(snapshot, differencing) concurrency (CASSANDRA-6566) - * Fix replaying pre-2.0 commit logs (CASSANDRA-6714) - * Add static columns to CQL3 (CASSANDRA-6561) - * Optimize single partition batch statements (CASSANDRA-6737) - * Disallow post-query re-ordering when paging (CASSANDRA-6722) - * Fix potential paging bug with deleted columns (CASSANDRA-6748) -Merged from 1.2: - * Catch memtable flush exceptions during shutdown (CASSANDRA-6735) - * Fix broken streams when replacing with same IP (CASSANDRA-6622) - * Fix upgradesstables NPE for non-CF-based indexes (CASSANDRA-6645) - * Fix partition and range deletes not triggering flush (CASSANDRA-6655) - * Fix mean cells and mean row size per sstable calculations (CASSANDRA-6667) - * Compact hints after partial replay to clean out tombstones (CASSANDRA-6666) - * Log USING TTL/TIMESTAMP in a counter update warning (CASSANDRA-6649) - * Don't exchange schema between nodes with different versions (CASSANDRA-6695) - * Use real node messaging versions for schema exchange decisions (CASSANDRA-6700) - * IN on the last clustering columns + ORDER BY DESC yield no results (CASSANDRA-6701) - * Fix SecondaryIndexManager#deleteFromIndexes() (CASSANDRA-6711) - * Fix snapshot repair not snapshotting coordinator itself (CASSANDRA-6713) - * Support negative timestamps for CQL3 dates in query string (CASSANDRA-6718) - * Avoid NPEs when receiving table changes for an unknown keyspace (CASSANDRA-5631) - * Fix bootstrapping when there is no schema (CASSANDRA-6685) - - 2.0.5 * Reduce garbage generated by bloom filter lookups (CASSANDRA-6609) * Add ks.cf names to tombstone logging (CASSANDRA-6597) From 7d8092b6602d2d92bd3ef215153ff5e686fab106 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Mon, 3 Mar 2014 01:18:52 -0500 Subject: [PATCH 003/557] use junit asserts --- .../cassandra/db/RangeTombstoneTest.java | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java b/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java index 15ef19a8a32e..d240206366b8 100644 --- a/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java +++ b/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java @@ -44,6 +44,7 @@ import org.apache.cassandra.utils.ByteBufferUtil; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.apache.cassandra.Util.dk; @@ -99,17 +100,17 @@ public void simpleQueryWithRangeTombstoneTest() throws Exception cf = cfs.getColumnFamily(QueryFilter.getNamesFilter(dk(key), CFNAME, columns, System.currentTimeMillis())); for (int i : live) - assert isLive(cf, cf.getColumn(b(i))) : "Cell " + i + " should be live"; + assertTrue("Cell " + i + " should be live", isLive(cf, cf.getColumn(b(i)))); for (int i : dead) - assert !isLive(cf, cf.getColumn(b(i))) : "Cell " + i + " shouldn't be live"; + assertTrue("Cell " + i + " shouldn't be live", !isLive(cf, cf.getColumn(b(i)))); // Queries by slices cf = cfs.getColumnFamily(QueryFilter.getSliceFilter(dk(key), CFNAME, b(7), b(30), false, Integer.MAX_VALUE, System.currentTimeMillis())); for (int i : new int[]{ 7, 8, 9, 11, 13, 15, 17, 28, 29, 30 }) - assert isLive(cf, cf.getColumn(b(i))) : "Cell " + i + " should be live"; + assertTrue("Cell " + i + " should be live", isLive(cf, cf.getColumn(b(i)))); for (int i : new int[]{ 10, 12, 14, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27 }) - assert !isLive(cf, cf.getColumn(b(i))) : "Cell " + i + " shouldn't be live"; + assertTrue("Cell " + i + " shouldn't be live", !isLive(cf, cf.getColumn(b(i)))); } @Test @@ -252,22 +253,22 @@ public void overlappingRangeTest() throws Exception cf = cfs.getColumnFamily(QueryFilter.getIdentityFilter(dk(key), CFNAME, System.currentTimeMillis())); for (int i = 0; i < 5; i++) - assert isLive(cf, cf.getColumn(b(i))) : "Cell " + i + " should be live"; + assertTrue("Cell " + i + " should be live", isLive(cf, cf.getColumn(b(i)))); for (int i = 16; i < 20; i++) - assert isLive(cf, cf.getColumn(b(i))) : "Cell " + i + " should be live"; + assertTrue("Cell " + i + " should be live", isLive(cf, cf.getColumn(b(i)))); for (int i = 5; i <= 15; i++) - assert !isLive(cf, cf.getColumn(b(i))) : "Cell " + i + " shouldn't be live"; + assertTrue("Cell " + i + " shouldn't be live", !isLive(cf, cf.getColumn(b(i)))); // Compact everything and re-test CompactionManager.instance.performMaximal(cfs); cf = cfs.getColumnFamily(QueryFilter.getIdentityFilter(dk(key), CFNAME, System.currentTimeMillis())); for (int i = 0; i < 5; i++) - assert isLive(cf, cf.getColumn(b(i))) : "Cell " + i + " should be live"; + assertTrue("Cell " + i + " should be live", isLive(cf, cf.getColumn(b(i)))); for (int i = 16; i < 20; i++) - assert isLive(cf, cf.getColumn(b(i))) : "Cell " + i + " should be live"; + assertTrue("Cell " + i + " should be live", isLive(cf, cf.getColumn(b(i)))); for (int i = 5; i <= 15; i++) - assert !isLive(cf, cf.getColumn(b(i))) : "Cell " + i + " shouldn't be live"; + assertTrue("Cell " + i + " shouldn't be live", !isLive(cf, cf.getColumn(b(i)))); } @Test @@ -296,9 +297,9 @@ public void reverseQueryTest() throws Exception // Get the last value of the row cf = cfs.getColumnFamily(QueryFilter.getSliceFilter(dk(key), CFNAME, Composites.EMPTY, Composites.EMPTY, true, 1, System.currentTimeMillis())); - assert !cf.isEmpty(); + assertFalse(cf.isEmpty()); int last = i(cf.getSortedColumns().iterator().next().name()); - assert last == 1 : "Last column should be column 1 since column 2 has been deleted"; + assertTrue("Last column should be column 1 since column 2 has been deleted", last == 1); } @Test From 630d3b9c777e4b9e371300f9b3578312412970d0 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Tue, 4 Mar 2014 21:44:34 -0500 Subject: [PATCH 004/557] use junit assertions --- .../db/compaction/CompactionsPurgeTest.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java index 42445b510065..11c4402c6c61 100644 --- a/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java @@ -36,6 +36,8 @@ import static org.apache.cassandra.db.KeyspaceTest.assertColumns; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.apache.cassandra.cql3.QueryProcessor.processInternal; @@ -89,7 +91,7 @@ public void testMajorCompactionPurge() throws ExecutionException, InterruptedExc cfs.invalidateCachedRow(key); ColumnFamily cf = cfs.getColumnFamily(QueryFilter.getIdentityFilter(key, cfName, System.currentTimeMillis())); assertColumns(cf, "5"); - assert cf.getColumn(cellname(String.valueOf(5))) != null; + assertNotNull(cf.getColumn(cellname(String.valueOf(5)))); } @Test @@ -140,7 +142,7 @@ public void testMinorCompactionPurge() // verify that minor compaction does GC when key is provably not // present in a non-compacted sstable ColumnFamily cf = cfs.getColumnFamily(QueryFilter.getIdentityFilter(key2, cfName, System.currentTimeMillis())); - assert cf == null; + assertNull(cf); // verify that minor compaction still GC when key is present // in a non-compacted sstable but the timestamp ensures we won't miss anything @@ -219,13 +221,13 @@ public void testCompactionPurgeOneFile() throws ExecutionException, InterruptedE rm.apply(); } cfs.forceBlockingFlush(); - assert cfs.getSSTables().size() == 1 : cfs.getSSTables(); // inserts & deletes were in the same memtable -> only deletes in sstable + assertEquals(String.valueOf(cfs.getSSTables()), 1, cfs.getSSTables().size()); // inserts & deletes were in the same memtable -> only deletes in sstable // compact and test that the row is completely gone Util.compactAll(cfs, Integer.MAX_VALUE).get(); - assert cfs.getSSTables().isEmpty(); + assertTrue(cfs.getSSTables().isEmpty()); ColumnFamily cf = keyspace.getColumnFamilyStore(cfName).getColumnFamily(QueryFilter.getIdentityFilter(key, cfName, System.currentTimeMillis())); - assert cf == null : cf; + assertNull(String.valueOf(cf), cf); } @Test @@ -273,7 +275,7 @@ public void testCompactionPurgeCachedRow() throws ExecutionException, Interrupte ColumnFamily cf = cfs.getColumnFamily(QueryFilter.getIdentityFilter(key, cfName, System.currentTimeMillis())); assertEquals(10, cf.getColumnCount()); for (Cell c : cf) - assert !c.isMarkedForDelete(System.currentTimeMillis()); + assertFalse(c.isMarkedForDelete(System.currentTimeMillis())); } @Test @@ -317,7 +319,7 @@ public void testCompactionPurgeTombstonedRow() throws ExecutionException, Interr cf = cfs.getColumnFamily(filter); assertEquals(10, cf.getColumnCount()); for (Cell c : cf) - assert !c.isMarkedForDelete(System.currentTimeMillis()); + assertFalse(c.isMarkedForDelete(System.currentTimeMillis())); } @Test From 60fb923018a6fd2dabf04a1d4500f7b29a23a6f1 Mon Sep 17 00:00:00 2001 From: Jonathan Ellis Date: Wed, 5 Mar 2014 07:57:25 -0600 Subject: [PATCH 005/557] add Thrift get_multi_slice call patch by Ed Capriolo; reviewed by Tyler Hobbs for CASSANDRA-6757 --- CHANGES.txt | 1 + interface/cassandra.thrift | 37 +- .../apache/cassandra/thrift/Cassandra.java | 3071 ++++++++++++----- .../apache/cassandra/thrift/ColumnSlice.java | 551 +++ .../cassandra/thrift/MultiSliceRequest.java | 1042 ++++++ .../cassandra/thrift/cassandraConstants.java | 2 +- .../cassandra/thrift/CassandraServer.java | 68 + test/system/test_thrift_server.py | 34 + .../cassandra/db/ColumnFamilyStoreTest.java | 1 + .../cassandra/thrift/MultiSliceTest.java | 149 + 10 files changed, 4050 insertions(+), 906 deletions(-) create mode 100644 interface/thrift/gen-java/org/apache/cassandra/thrift/ColumnSlice.java create mode 100644 interface/thrift/gen-java/org/apache/cassandra/thrift/MultiSliceRequest.java create mode 100644 test/unit/org/apache/cassandra/thrift/MultiSliceTest.java diff --git a/CHANGES.txt b/CHANGES.txt index e32422540e7e..1c0941b49d4c 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,5 +1,6 @@ 3.0 * Remove CQL2 (CASSANDRA-5918) + * add Thrift get_multi_slice call (CASSANDRA-6757) 2.1.0-beta2 diff --git a/interface/cassandra.thrift b/interface/cassandra.thrift index e46b85e5887a..b6b06dc71dcf 100644 --- a/interface/cassandra.thrift +++ b/interface/cassandra.thrift @@ -55,7 +55,7 @@ namespace rb CassandraThrift # An effort should be made not to break forward-client-compatibility either # (e.g. one should avoid removing obsolete fields from the IDL), but no # guarantees in this respect are made by the Cassandra project. -const string VERSION = "20.0.0" +const string VERSION = "20.1.0" # @@ -563,6 +563,35 @@ struct CfSplit { 3: required i64 row_count } +/** The ColumnSlice is used to select a set of columns from inside a row. + * If start or finish are unspecified they will default to the start-of + * end-of value. + * @param start. The start of the ColumnSlice inclusive + * @param finish. The end of the ColumnSlice inclusive + */ +struct ColumnSlice { + 1: optional binary start, + 2: optional binary finish +} + +/** + * Used to perform multiple slices on a single row key in one rpc operation + * @param key. The row key to be multi sliced + * @param column_parent. The column family (super columns are unsupported) + * @param column_slices. 0 to many ColumnSlice objects each will be used to select columns + * @param reversed. Direction of slice + * @param count. Maximum number of columns + * @param consistency_level. Level to perform the operation at + */ +struct MultiSliceRequest { + 1: optional binary key, + 2: optional ColumnParent column_parent, + 3: optional list column_slices, + 4: optional bool reversed=false, + 5: optional i32 count=1000, + 6: optional ConsistencyLevel consistency_level=ConsistencyLevel.ONE +} + service Cassandra { # auth methods void login(1: required AuthenticationRequest auth_request) throws (1:AuthenticationException authnx, 2:AuthorizationException authzx), @@ -741,7 +770,11 @@ service Cassandra { void truncate(1:required string cfname) throws (1: InvalidRequestException ire, 2: UnavailableException ue, 3: TimedOutException te), - + /** + * Select multiple slices of a key in a single RPC operation + */ + list get_multi_slice(1:required MultiSliceRequest request) + throws (1:InvalidRequestException ire, 2:UnavailableException ue, 3:TimedOutException te), // Meta-APIs -- APIs to get information about the node or cluster, // rather than user data. The nodeprobe program provides usage examples. diff --git a/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java b/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java index f29805bd0a73..bf15559a790e 100644 --- a/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java +++ b/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java @@ -247,6 +247,13 @@ public interface Iface { */ public void truncate(String cfname) throws InvalidRequestException, UnavailableException, TimedOutException, org.apache.thrift.TException; + /** + * Select multiple slices of a key in a single RPC operation + * + * @param request + */ + public List get_multi_slice(MultiSliceRequest request) throws InvalidRequestException, UnavailableException, TimedOutException, org.apache.thrift.TException; + /** * for each schema version present in the cluster, returns a list of nodes at that version. * hosts that do not respond will be under the key DatabaseDescriptor.INITIAL_VERSION. @@ -480,6 +487,8 @@ public interface AsyncIface { public void truncate(String cfname, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException; + public void get_multi_slice(MultiSliceRequest request, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException; + public void describe_schema_versions(org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException; public void describe_keyspaces(org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException; @@ -1138,6 +1147,38 @@ public void recv_truncate() throws InvalidRequestException, UnavailableException return; } + public List get_multi_slice(MultiSliceRequest request) throws InvalidRequestException, UnavailableException, TimedOutException, org.apache.thrift.TException + { + send_get_multi_slice(request); + return recv_get_multi_slice(); + } + + public void send_get_multi_slice(MultiSliceRequest request) throws org.apache.thrift.TException + { + get_multi_slice_args args = new get_multi_slice_args(); + args.setRequest(request); + sendBase("get_multi_slice", args); + } + + public List recv_get_multi_slice() throws InvalidRequestException, UnavailableException, TimedOutException, org.apache.thrift.TException + { + get_multi_slice_result result = new get_multi_slice_result(); + receiveBase(result, "get_multi_slice"); + if (result.isSetSuccess()) { + return result.success; + } + if (result.ire != null) { + throw result.ire; + } + if (result.ue != null) { + throw result.ue; + } + if (result.te != null) { + throw result.te; + } + throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, "get_multi_slice failed: unknown result"); + } + public Map> describe_schema_versions() throws InvalidRequestException, org.apache.thrift.TException { send_describe_schema_versions(); @@ -2576,6 +2617,38 @@ public void getResult() throws InvalidRequestException, UnavailableException, Ti } } + public void get_multi_slice(MultiSliceRequest request, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException { + checkReady(); + get_multi_slice_call method_call = new get_multi_slice_call(request, resultHandler, this, ___protocolFactory, ___transport); + this.___currentMethod = method_call; + ___manager.call(method_call); + } + + public static class get_multi_slice_call extends org.apache.thrift.async.TAsyncMethodCall { + private MultiSliceRequest request; + public get_multi_slice_call(MultiSliceRequest request, org.apache.thrift.async.AsyncMethodCallback resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException { + super(client, protocolFactory, transport, resultHandler, false); + this.request = request; + } + + public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException { + prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage("get_multi_slice", org.apache.thrift.protocol.TMessageType.CALL, 0)); + get_multi_slice_args args = new get_multi_slice_args(); + args.setRequest(request); + args.write(prot); + prot.writeMessageEnd(); + } + + public List getResult() throws InvalidRequestException, UnavailableException, TimedOutException, org.apache.thrift.TException { + if (getState() != org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) { + throw new IllegalStateException("Method call not finished!"); + } + org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array()); + org.apache.thrift.protocol.TProtocol prot = client.getProtocolFactory().getProtocol(memoryTransport); + return (new Client(prot)).recv_get_multi_slice(); + } + } + public void describe_schema_versions(org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException { checkReady(); describe_schema_versions_call method_call = new describe_schema_versions_call(resultHandler, this, ___protocolFactory, ___transport); @@ -3457,6 +3530,7 @@ protected Processor(I iface, Map extends org.apache.thrift.ProcessFunction { + public get_multi_slice() { + super("get_multi_slice"); + } + + public get_multi_slice_args getEmptyArgsInstance() { + return new get_multi_slice_args(); + } + + protected boolean isOneway() { + return false; + } + + public get_multi_slice_result getResult(I iface, get_multi_slice_args args) throws org.apache.thrift.TException { + get_multi_slice_result result = new get_multi_slice_result(); + try { + result.success = iface.get_multi_slice(args.request); + } catch (InvalidRequestException ire) { + result.ire = ire; + } catch (UnavailableException ue) { + result.ue = ue; + } catch (TimedOutException te) { + result.te = te; + } + return result; + } + } + public static class describe_schema_versions extends org.apache.thrift.ProcessFunction { public describe_schema_versions() { super("describe_schema_versions"); @@ -4660,6 +4762,7 @@ protected AsyncProcessor(I iface, Map extends org.apache.thrift.AsyncProcessFunction>> { - public describe_schema_versions() { - super("describe_schema_versions"); + public static class get_multi_slice extends org.apache.thrift.AsyncProcessFunction> { + public get_multi_slice() { + super("get_multi_slice"); } - public describe_schema_versions_args getEmptyArgsInstance() { - return new describe_schema_versions_args(); + public get_multi_slice_args getEmptyArgsInstance() { + return new get_multi_slice_args(); } - public AsyncMethodCallback>> getResultHandler(final AsyncFrameBuffer fb, final int seqid) { + public AsyncMethodCallback> getResultHandler(final AsyncFrameBuffer fb, final int seqid) { final org.apache.thrift.AsyncProcessFunction fcall = this; - return new AsyncMethodCallback>>() { - public void onComplete(Map> o) { - describe_schema_versions_result result = new describe_schema_versions_result(); + return new AsyncMethodCallback>() { + public void onComplete(List o) { + get_multi_slice_result result = new get_multi_slice_result(); result.success = o; try { fcall.sendResponse(fb,result, org.apache.thrift.protocol.TMessageType.REPLY,seqid); @@ -5903,67 +6006,20 @@ public void onComplete(Map> o) { public void onError(Exception e) { byte msgType = org.apache.thrift.protocol.TMessageType.REPLY; org.apache.thrift.TBase msg; - describe_schema_versions_result result = new describe_schema_versions_result(); + get_multi_slice_result result = new get_multi_slice_result(); if (e instanceof InvalidRequestException) { result.ire = (InvalidRequestException) e; result.setIreIsSet(true); msg = result; } - else - { - msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION; - msg = (org.apache.thrift.TBase)new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage()); - } - try { - fcall.sendResponse(fb,msg,msgType,seqid); - return; - } catch (Exception ex) { - LOGGER.error("Exception writing to internal frame buffer", ex); - } - fb.close(); - } - }; - } - - protected boolean isOneway() { - return false; - } - - public void start(I iface, describe_schema_versions_args args, org.apache.thrift.async.AsyncMethodCallback>> resultHandler) throws TException { - iface.describe_schema_versions(resultHandler); - } - } - - public static class describe_keyspaces extends org.apache.thrift.AsyncProcessFunction> { - public describe_keyspaces() { - super("describe_keyspaces"); - } - - public describe_keyspaces_args getEmptyArgsInstance() { - return new describe_keyspaces_args(); - } - - public AsyncMethodCallback> getResultHandler(final AsyncFrameBuffer fb, final int seqid) { - final org.apache.thrift.AsyncProcessFunction fcall = this; - return new AsyncMethodCallback>() { - public void onComplete(List o) { - describe_keyspaces_result result = new describe_keyspaces_result(); - result.success = o; - try { - fcall.sendResponse(fb,result, org.apache.thrift.protocol.TMessageType.REPLY,seqid); - return; - } catch (Exception e) { - LOGGER.error("Exception writing to internal frame buffer", e); + else if (e instanceof UnavailableException) { + result.ue = (UnavailableException) e; + result.setUeIsSet(true); + msg = result; } - fb.close(); - } - public void onError(Exception e) { - byte msgType = org.apache.thrift.protocol.TMessageType.REPLY; - org.apache.thrift.TBase msg; - describe_keyspaces_result result = new describe_keyspaces_result(); - if (e instanceof InvalidRequestException) { - result.ire = (InvalidRequestException) e; - result.setIreIsSet(true); + else if (e instanceof TimedOutException) { + result.te = (TimedOutException) e; + result.setTeIsSet(true); msg = result; } else @@ -5986,127 +6042,25 @@ protected boolean isOneway() { return false; } - public void start(I iface, describe_keyspaces_args args, org.apache.thrift.async.AsyncMethodCallback> resultHandler) throws TException { - iface.describe_keyspaces(resultHandler); + public void start(I iface, get_multi_slice_args args, org.apache.thrift.async.AsyncMethodCallback> resultHandler) throws TException { + iface.get_multi_slice(args.request,resultHandler); } } - public static class describe_cluster_name extends org.apache.thrift.AsyncProcessFunction { - public describe_cluster_name() { - super("describe_cluster_name"); - } - - public describe_cluster_name_args getEmptyArgsInstance() { - return new describe_cluster_name_args(); - } - - public AsyncMethodCallback getResultHandler(final AsyncFrameBuffer fb, final int seqid) { - final org.apache.thrift.AsyncProcessFunction fcall = this; - return new AsyncMethodCallback() { - public void onComplete(String o) { - describe_cluster_name_result result = new describe_cluster_name_result(); - result.success = o; - try { - fcall.sendResponse(fb,result, org.apache.thrift.protocol.TMessageType.REPLY,seqid); - return; - } catch (Exception e) { - LOGGER.error("Exception writing to internal frame buffer", e); - } - fb.close(); - } - public void onError(Exception e) { - byte msgType = org.apache.thrift.protocol.TMessageType.REPLY; - org.apache.thrift.TBase msg; - describe_cluster_name_result result = new describe_cluster_name_result(); - { - msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION; - msg = (org.apache.thrift.TBase)new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage()); - } - try { - fcall.sendResponse(fb,msg,msgType,seqid); - return; - } catch (Exception ex) { - LOGGER.error("Exception writing to internal frame buffer", ex); - } - fb.close(); - } - }; - } - - protected boolean isOneway() { - return false; - } - - public void start(I iface, describe_cluster_name_args args, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws TException { - iface.describe_cluster_name(resultHandler); - } - } - - public static class describe_version extends org.apache.thrift.AsyncProcessFunction { - public describe_version() { - super("describe_version"); - } - - public describe_version_args getEmptyArgsInstance() { - return new describe_version_args(); - } - - public AsyncMethodCallback getResultHandler(final AsyncFrameBuffer fb, final int seqid) { - final org.apache.thrift.AsyncProcessFunction fcall = this; - return new AsyncMethodCallback() { - public void onComplete(String o) { - describe_version_result result = new describe_version_result(); - result.success = o; - try { - fcall.sendResponse(fb,result, org.apache.thrift.protocol.TMessageType.REPLY,seqid); - return; - } catch (Exception e) { - LOGGER.error("Exception writing to internal frame buffer", e); - } - fb.close(); - } - public void onError(Exception e) { - byte msgType = org.apache.thrift.protocol.TMessageType.REPLY; - org.apache.thrift.TBase msg; - describe_version_result result = new describe_version_result(); - { - msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION; - msg = (org.apache.thrift.TBase)new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage()); - } - try { - fcall.sendResponse(fb,msg,msgType,seqid); - return; - } catch (Exception ex) { - LOGGER.error("Exception writing to internal frame buffer", ex); - } - fb.close(); - } - }; - } - - protected boolean isOneway() { - return false; - } - - public void start(I iface, describe_version_args args, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws TException { - iface.describe_version(resultHandler); - } - } - - public static class describe_ring extends org.apache.thrift.AsyncProcessFunction> { - public describe_ring() { - super("describe_ring"); + public static class describe_schema_versions extends org.apache.thrift.AsyncProcessFunction>> { + public describe_schema_versions() { + super("describe_schema_versions"); } - public describe_ring_args getEmptyArgsInstance() { - return new describe_ring_args(); + public describe_schema_versions_args getEmptyArgsInstance() { + return new describe_schema_versions_args(); } - public AsyncMethodCallback> getResultHandler(final AsyncFrameBuffer fb, final int seqid) { + public AsyncMethodCallback>> getResultHandler(final AsyncFrameBuffer fb, final int seqid) { final org.apache.thrift.AsyncProcessFunction fcall = this; - return new AsyncMethodCallback>() { - public void onComplete(List o) { - describe_ring_result result = new describe_ring_result(); + return new AsyncMethodCallback>>() { + public void onComplete(Map> o) { + describe_schema_versions_result result = new describe_schema_versions_result(); result.success = o; try { fcall.sendResponse(fb,result, org.apache.thrift.protocol.TMessageType.REPLY,seqid); @@ -6119,7 +6073,223 @@ public void onComplete(List o) { public void onError(Exception e) { byte msgType = org.apache.thrift.protocol.TMessageType.REPLY; org.apache.thrift.TBase msg; - describe_ring_result result = new describe_ring_result(); + describe_schema_versions_result result = new describe_schema_versions_result(); + if (e instanceof InvalidRequestException) { + result.ire = (InvalidRequestException) e; + result.setIreIsSet(true); + msg = result; + } + else + { + msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION; + msg = (org.apache.thrift.TBase)new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage()); + } + try { + fcall.sendResponse(fb,msg,msgType,seqid); + return; + } catch (Exception ex) { + LOGGER.error("Exception writing to internal frame buffer", ex); + } + fb.close(); + } + }; + } + + protected boolean isOneway() { + return false; + } + + public void start(I iface, describe_schema_versions_args args, org.apache.thrift.async.AsyncMethodCallback>> resultHandler) throws TException { + iface.describe_schema_versions(resultHandler); + } + } + + public static class describe_keyspaces extends org.apache.thrift.AsyncProcessFunction> { + public describe_keyspaces() { + super("describe_keyspaces"); + } + + public describe_keyspaces_args getEmptyArgsInstance() { + return new describe_keyspaces_args(); + } + + public AsyncMethodCallback> getResultHandler(final AsyncFrameBuffer fb, final int seqid) { + final org.apache.thrift.AsyncProcessFunction fcall = this; + return new AsyncMethodCallback>() { + public void onComplete(List o) { + describe_keyspaces_result result = new describe_keyspaces_result(); + result.success = o; + try { + fcall.sendResponse(fb,result, org.apache.thrift.protocol.TMessageType.REPLY,seqid); + return; + } catch (Exception e) { + LOGGER.error("Exception writing to internal frame buffer", e); + } + fb.close(); + } + public void onError(Exception e) { + byte msgType = org.apache.thrift.protocol.TMessageType.REPLY; + org.apache.thrift.TBase msg; + describe_keyspaces_result result = new describe_keyspaces_result(); + if (e instanceof InvalidRequestException) { + result.ire = (InvalidRequestException) e; + result.setIreIsSet(true); + msg = result; + } + else + { + msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION; + msg = (org.apache.thrift.TBase)new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage()); + } + try { + fcall.sendResponse(fb,msg,msgType,seqid); + return; + } catch (Exception ex) { + LOGGER.error("Exception writing to internal frame buffer", ex); + } + fb.close(); + } + }; + } + + protected boolean isOneway() { + return false; + } + + public void start(I iface, describe_keyspaces_args args, org.apache.thrift.async.AsyncMethodCallback> resultHandler) throws TException { + iface.describe_keyspaces(resultHandler); + } + } + + public static class describe_cluster_name extends org.apache.thrift.AsyncProcessFunction { + public describe_cluster_name() { + super("describe_cluster_name"); + } + + public describe_cluster_name_args getEmptyArgsInstance() { + return new describe_cluster_name_args(); + } + + public AsyncMethodCallback getResultHandler(final AsyncFrameBuffer fb, final int seqid) { + final org.apache.thrift.AsyncProcessFunction fcall = this; + return new AsyncMethodCallback() { + public void onComplete(String o) { + describe_cluster_name_result result = new describe_cluster_name_result(); + result.success = o; + try { + fcall.sendResponse(fb,result, org.apache.thrift.protocol.TMessageType.REPLY,seqid); + return; + } catch (Exception e) { + LOGGER.error("Exception writing to internal frame buffer", e); + } + fb.close(); + } + public void onError(Exception e) { + byte msgType = org.apache.thrift.protocol.TMessageType.REPLY; + org.apache.thrift.TBase msg; + describe_cluster_name_result result = new describe_cluster_name_result(); + { + msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION; + msg = (org.apache.thrift.TBase)new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage()); + } + try { + fcall.sendResponse(fb,msg,msgType,seqid); + return; + } catch (Exception ex) { + LOGGER.error("Exception writing to internal frame buffer", ex); + } + fb.close(); + } + }; + } + + protected boolean isOneway() { + return false; + } + + public void start(I iface, describe_cluster_name_args args, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws TException { + iface.describe_cluster_name(resultHandler); + } + } + + public static class describe_version extends org.apache.thrift.AsyncProcessFunction { + public describe_version() { + super("describe_version"); + } + + public describe_version_args getEmptyArgsInstance() { + return new describe_version_args(); + } + + public AsyncMethodCallback getResultHandler(final AsyncFrameBuffer fb, final int seqid) { + final org.apache.thrift.AsyncProcessFunction fcall = this; + return new AsyncMethodCallback() { + public void onComplete(String o) { + describe_version_result result = new describe_version_result(); + result.success = o; + try { + fcall.sendResponse(fb,result, org.apache.thrift.protocol.TMessageType.REPLY,seqid); + return; + } catch (Exception e) { + LOGGER.error("Exception writing to internal frame buffer", e); + } + fb.close(); + } + public void onError(Exception e) { + byte msgType = org.apache.thrift.protocol.TMessageType.REPLY; + org.apache.thrift.TBase msg; + describe_version_result result = new describe_version_result(); + { + msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION; + msg = (org.apache.thrift.TBase)new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage()); + } + try { + fcall.sendResponse(fb,msg,msgType,seqid); + return; + } catch (Exception ex) { + LOGGER.error("Exception writing to internal frame buffer", ex); + } + fb.close(); + } + }; + } + + protected boolean isOneway() { + return false; + } + + public void start(I iface, describe_version_args args, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws TException { + iface.describe_version(resultHandler); + } + } + + public static class describe_ring extends org.apache.thrift.AsyncProcessFunction> { + public describe_ring() { + super("describe_ring"); + } + + public describe_ring_args getEmptyArgsInstance() { + return new describe_ring_args(); + } + + public AsyncMethodCallback> getResultHandler(final AsyncFrameBuffer fb, final int seqid) { + final org.apache.thrift.AsyncProcessFunction fcall = this; + return new AsyncMethodCallback>() { + public void onComplete(List o) { + describe_ring_result result = new describe_ring_result(); + result.success = o; + try { + fcall.sendResponse(fb,result, org.apache.thrift.protocol.TMessageType.REPLY,seqid); + return; + } catch (Exception e) { + LOGGER.error("Exception writing to internal frame buffer", e); + } + fb.close(); + } + public void onError(Exception e) { + byte msgType = org.apache.thrift.protocol.TMessageType.REPLY; + org.apache.thrift.TBase msg; + describe_ring_result result = new describe_ring_result(); if (e instanceof InvalidRequestException) { result.ire = (InvalidRequestException) e; result.setIreIsSet(true); @@ -11615,14 +11785,14 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, get_slice_result st case 0: // SUCCESS if (schemeField.type == org.apache.thrift.protocol.TType.LIST) { { - org.apache.thrift.protocol.TList _list216 = iprot.readListBegin(); - struct.success = new ArrayList(_list216.size); - for (int _i217 = 0; _i217 < _list216.size; ++_i217) + org.apache.thrift.protocol.TList _list224 = iprot.readListBegin(); + struct.success = new ArrayList(_list224.size); + for (int _i225 = 0; _i225 < _list224.size; ++_i225) { - ColumnOrSuperColumn _elem218; - _elem218 = new ColumnOrSuperColumn(); - _elem218.read(iprot); - struct.success.add(_elem218); + ColumnOrSuperColumn _elem226; + _elem226 = new ColumnOrSuperColumn(); + _elem226.read(iprot); + struct.success.add(_elem226); } iprot.readListEnd(); } @@ -11677,9 +11847,9 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, get_slice_result s oprot.writeFieldBegin(SUCCESS_FIELD_DESC); { oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.success.size())); - for (ColumnOrSuperColumn _iter219 : struct.success) + for (ColumnOrSuperColumn _iter227 : struct.success) { - _iter219.write(oprot); + _iter227.write(oprot); } oprot.writeListEnd(); } @@ -11734,9 +11904,9 @@ public void write(org.apache.thrift.protocol.TProtocol prot, get_slice_result st if (struct.isSetSuccess()) { { oprot.writeI32(struct.success.size()); - for (ColumnOrSuperColumn _iter220 : struct.success) + for (ColumnOrSuperColumn _iter228 : struct.success) { - _iter220.write(oprot); + _iter228.write(oprot); } } } @@ -11757,14 +11927,14 @@ public void read(org.apache.thrift.protocol.TProtocol prot, get_slice_result str BitSet incoming = iprot.readBitSet(4); if (incoming.get(0)) { { - org.apache.thrift.protocol.TList _list221 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32()); - struct.success = new ArrayList(_list221.size); - for (int _i222 = 0; _i222 < _list221.size; ++_i222) + org.apache.thrift.protocol.TList _list229 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32()); + struct.success = new ArrayList(_list229.size); + for (int _i230 = 0; _i230 < _list229.size; ++_i230) { - ColumnOrSuperColumn _elem223; - _elem223 = new ColumnOrSuperColumn(); - _elem223.read(iprot); - struct.success.add(_elem223); + ColumnOrSuperColumn _elem231; + _elem231 = new ColumnOrSuperColumn(); + _elem231.read(iprot); + struct.success.add(_elem231); } } struct.setSuccessIsSet(true); @@ -13764,13 +13934,13 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, multiget_slice_args case 1: // KEYS if (schemeField.type == org.apache.thrift.protocol.TType.LIST) { { - org.apache.thrift.protocol.TList _list224 = iprot.readListBegin(); - struct.keys = new ArrayList(_list224.size); - for (int _i225 = 0; _i225 < _list224.size; ++_i225) + org.apache.thrift.protocol.TList _list232 = iprot.readListBegin(); + struct.keys = new ArrayList(_list232.size); + for (int _i233 = 0; _i233 < _list232.size; ++_i233) { - ByteBuffer _elem226; - _elem226 = iprot.readBinary(); - struct.keys.add(_elem226); + ByteBuffer _elem234; + _elem234 = iprot.readBinary(); + struct.keys.add(_elem234); } iprot.readListEnd(); } @@ -13824,9 +13994,9 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, multiget_slice_arg oprot.writeFieldBegin(KEYS_FIELD_DESC); { oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, struct.keys.size())); - for (ByteBuffer _iter227 : struct.keys) + for (ByteBuffer _iter235 : struct.keys) { - oprot.writeBinary(_iter227); + oprot.writeBinary(_iter235); } oprot.writeListEnd(); } @@ -13866,9 +14036,9 @@ public void write(org.apache.thrift.protocol.TProtocol prot, multiget_slice_args TTupleProtocol oprot = (TTupleProtocol) prot; { oprot.writeI32(struct.keys.size()); - for (ByteBuffer _iter228 : struct.keys) + for (ByteBuffer _iter236 : struct.keys) { - oprot.writeBinary(_iter228); + oprot.writeBinary(_iter236); } } struct.column_parent.write(oprot); @@ -13880,13 +14050,13 @@ public void write(org.apache.thrift.protocol.TProtocol prot, multiget_slice_args public void read(org.apache.thrift.protocol.TProtocol prot, multiget_slice_args struct) throws org.apache.thrift.TException { TTupleProtocol iprot = (TTupleProtocol) prot; { - org.apache.thrift.protocol.TList _list229 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32()); - struct.keys = new ArrayList(_list229.size); - for (int _i230 = 0; _i230 < _list229.size; ++_i230) + org.apache.thrift.protocol.TList _list237 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32()); + struct.keys = new ArrayList(_list237.size); + for (int _i238 = 0; _i238 < _list237.size; ++_i238) { - ByteBuffer _elem231; - _elem231 = iprot.readBinary(); - struct.keys.add(_elem231); + ByteBuffer _elem239; + _elem239 = iprot.readBinary(); + struct.keys.add(_elem239); } } struct.setKeysIsSet(true); @@ -14475,26 +14645,26 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, multiget_slice_resu case 0: // SUCCESS if (schemeField.type == org.apache.thrift.protocol.TType.MAP) { { - org.apache.thrift.protocol.TMap _map232 = iprot.readMapBegin(); - struct.success = new HashMap>(2*_map232.size); - for (int _i233 = 0; _i233 < _map232.size; ++_i233) + org.apache.thrift.protocol.TMap _map240 = iprot.readMapBegin(); + struct.success = new HashMap>(2*_map240.size); + for (int _i241 = 0; _i241 < _map240.size; ++_i241) { - ByteBuffer _key234; - List _val235; - _key234 = iprot.readBinary(); + ByteBuffer _key242; + List _val243; + _key242 = iprot.readBinary(); { - org.apache.thrift.protocol.TList _list236 = iprot.readListBegin(); - _val235 = new ArrayList(_list236.size); - for (int _i237 = 0; _i237 < _list236.size; ++_i237) + org.apache.thrift.protocol.TList _list244 = iprot.readListBegin(); + _val243 = new ArrayList(_list244.size); + for (int _i245 = 0; _i245 < _list244.size; ++_i245) { - ColumnOrSuperColumn _elem238; - _elem238 = new ColumnOrSuperColumn(); - _elem238.read(iprot); - _val235.add(_elem238); + ColumnOrSuperColumn _elem246; + _elem246 = new ColumnOrSuperColumn(); + _elem246.read(iprot); + _val243.add(_elem246); } iprot.readListEnd(); } - struct.success.put(_key234, _val235); + struct.success.put(_key242, _val243); } iprot.readMapEnd(); } @@ -14549,14 +14719,14 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, multiget_slice_res oprot.writeFieldBegin(SUCCESS_FIELD_DESC); { oprot.writeMapBegin(new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.LIST, struct.success.size())); - for (Map.Entry> _iter239 : struct.success.entrySet()) + for (Map.Entry> _iter247 : struct.success.entrySet()) { - oprot.writeBinary(_iter239.getKey()); + oprot.writeBinary(_iter247.getKey()); { - oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, _iter239.getValue().size())); - for (ColumnOrSuperColumn _iter240 : _iter239.getValue()) + oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, _iter247.getValue().size())); + for (ColumnOrSuperColumn _iter248 : _iter247.getValue()) { - _iter240.write(oprot); + _iter248.write(oprot); } oprot.writeListEnd(); } @@ -14614,14 +14784,14 @@ public void write(org.apache.thrift.protocol.TProtocol prot, multiget_slice_resu if (struct.isSetSuccess()) { { oprot.writeI32(struct.success.size()); - for (Map.Entry> _iter241 : struct.success.entrySet()) + for (Map.Entry> _iter249 : struct.success.entrySet()) { - oprot.writeBinary(_iter241.getKey()); + oprot.writeBinary(_iter249.getKey()); { - oprot.writeI32(_iter241.getValue().size()); - for (ColumnOrSuperColumn _iter242 : _iter241.getValue()) + oprot.writeI32(_iter249.getValue().size()); + for (ColumnOrSuperColumn _iter250 : _iter249.getValue()) { - _iter242.write(oprot); + _iter250.write(oprot); } } } @@ -14644,25 +14814,25 @@ public void read(org.apache.thrift.protocol.TProtocol prot, multiget_slice_resul BitSet incoming = iprot.readBitSet(4); if (incoming.get(0)) { { - org.apache.thrift.protocol.TMap _map243 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.LIST, iprot.readI32()); - struct.success = new HashMap>(2*_map243.size); - for (int _i244 = 0; _i244 < _map243.size; ++_i244) + org.apache.thrift.protocol.TMap _map251 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.LIST, iprot.readI32()); + struct.success = new HashMap>(2*_map251.size); + for (int _i252 = 0; _i252 < _map251.size; ++_i252) { - ByteBuffer _key245; - List _val246; - _key245 = iprot.readBinary(); + ByteBuffer _key253; + List _val254; + _key253 = iprot.readBinary(); { - org.apache.thrift.protocol.TList _list247 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32()); - _val246 = new ArrayList(_list247.size); - for (int _i248 = 0; _i248 < _list247.size; ++_i248) + org.apache.thrift.protocol.TList _list255 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32()); + _val254 = new ArrayList(_list255.size); + for (int _i256 = 0; _i256 < _list255.size; ++_i256) { - ColumnOrSuperColumn _elem249; - _elem249 = new ColumnOrSuperColumn(); - _elem249.read(iprot); - _val246.add(_elem249); + ColumnOrSuperColumn _elem257; + _elem257 = new ColumnOrSuperColumn(); + _elem257.read(iprot); + _val254.add(_elem257); } } - struct.success.put(_key245, _val246); + struct.success.put(_key253, _val254); } } struct.setSuccessIsSet(true); @@ -15283,13 +15453,13 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, multiget_count_args case 1: // KEYS if (schemeField.type == org.apache.thrift.protocol.TType.LIST) { { - org.apache.thrift.protocol.TList _list250 = iprot.readListBegin(); - struct.keys = new ArrayList(_list250.size); - for (int _i251 = 0; _i251 < _list250.size; ++_i251) + org.apache.thrift.protocol.TList _list258 = iprot.readListBegin(); + struct.keys = new ArrayList(_list258.size); + for (int _i259 = 0; _i259 < _list258.size; ++_i259) { - ByteBuffer _elem252; - _elem252 = iprot.readBinary(); - struct.keys.add(_elem252); + ByteBuffer _elem260; + _elem260 = iprot.readBinary(); + struct.keys.add(_elem260); } iprot.readListEnd(); } @@ -15343,9 +15513,9 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, multiget_count_arg oprot.writeFieldBegin(KEYS_FIELD_DESC); { oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, struct.keys.size())); - for (ByteBuffer _iter253 : struct.keys) + for (ByteBuffer _iter261 : struct.keys) { - oprot.writeBinary(_iter253); + oprot.writeBinary(_iter261); } oprot.writeListEnd(); } @@ -15385,9 +15555,9 @@ public void write(org.apache.thrift.protocol.TProtocol prot, multiget_count_args TTupleProtocol oprot = (TTupleProtocol) prot; { oprot.writeI32(struct.keys.size()); - for (ByteBuffer _iter254 : struct.keys) + for (ByteBuffer _iter262 : struct.keys) { - oprot.writeBinary(_iter254); + oprot.writeBinary(_iter262); } } struct.column_parent.write(oprot); @@ -15399,13 +15569,13 @@ public void write(org.apache.thrift.protocol.TProtocol prot, multiget_count_args public void read(org.apache.thrift.protocol.TProtocol prot, multiget_count_args struct) throws org.apache.thrift.TException { TTupleProtocol iprot = (TTupleProtocol) prot; { - org.apache.thrift.protocol.TList _list255 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32()); - struct.keys = new ArrayList(_list255.size); - for (int _i256 = 0; _i256 < _list255.size; ++_i256) + org.apache.thrift.protocol.TList _list263 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32()); + struct.keys = new ArrayList(_list263.size); + for (int _i264 = 0; _i264 < _list263.size; ++_i264) { - ByteBuffer _elem257; - _elem257 = iprot.readBinary(); - struct.keys.add(_elem257); + ByteBuffer _elem265; + _elem265 = iprot.readBinary(); + struct.keys.add(_elem265); } } struct.setKeysIsSet(true); @@ -15978,15 +16148,15 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, multiget_count_resu case 0: // SUCCESS if (schemeField.type == org.apache.thrift.protocol.TType.MAP) { { - org.apache.thrift.protocol.TMap _map258 = iprot.readMapBegin(); - struct.success = new HashMap(2*_map258.size); - for (int _i259 = 0; _i259 < _map258.size; ++_i259) + org.apache.thrift.protocol.TMap _map266 = iprot.readMapBegin(); + struct.success = new HashMap(2*_map266.size); + for (int _i267 = 0; _i267 < _map266.size; ++_i267) { - ByteBuffer _key260; - int _val261; - _key260 = iprot.readBinary(); - _val261 = iprot.readI32(); - struct.success.put(_key260, _val261); + ByteBuffer _key268; + int _val269; + _key268 = iprot.readBinary(); + _val269 = iprot.readI32(); + struct.success.put(_key268, _val269); } iprot.readMapEnd(); } @@ -16041,10 +16211,10 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, multiget_count_res oprot.writeFieldBegin(SUCCESS_FIELD_DESC); { oprot.writeMapBegin(new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.I32, struct.success.size())); - for (Map.Entry _iter262 : struct.success.entrySet()) + for (Map.Entry _iter270 : struct.success.entrySet()) { - oprot.writeBinary(_iter262.getKey()); - oprot.writeI32(_iter262.getValue()); + oprot.writeBinary(_iter270.getKey()); + oprot.writeI32(_iter270.getValue()); } oprot.writeMapEnd(); } @@ -16099,10 +16269,10 @@ public void write(org.apache.thrift.protocol.TProtocol prot, multiget_count_resu if (struct.isSetSuccess()) { { oprot.writeI32(struct.success.size()); - for (Map.Entry _iter263 : struct.success.entrySet()) + for (Map.Entry _iter271 : struct.success.entrySet()) { - oprot.writeBinary(_iter263.getKey()); - oprot.writeI32(_iter263.getValue()); + oprot.writeBinary(_iter271.getKey()); + oprot.writeI32(_iter271.getValue()); } } } @@ -16123,15 +16293,15 @@ public void read(org.apache.thrift.protocol.TProtocol prot, multiget_count_resul BitSet incoming = iprot.readBitSet(4); if (incoming.get(0)) { { - org.apache.thrift.protocol.TMap _map264 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.I32, iprot.readI32()); - struct.success = new HashMap(2*_map264.size); - for (int _i265 = 0; _i265 < _map264.size; ++_i265) + org.apache.thrift.protocol.TMap _map272 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.I32, iprot.readI32()); + struct.success = new HashMap(2*_map272.size); + for (int _i273 = 0; _i273 < _map272.size; ++_i273) { - ByteBuffer _key266; - int _val267; - _key266 = iprot.readBinary(); - _val267 = iprot.readI32(); - struct.success.put(_key266, _val267); + ByteBuffer _key274; + int _val275; + _key274 = iprot.readBinary(); + _val275 = iprot.readI32(); + struct.success.put(_key274, _val275); } } struct.setSuccessIsSet(true); @@ -17409,14 +17579,14 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, get_range_slices_re case 0: // SUCCESS if (schemeField.type == org.apache.thrift.protocol.TType.LIST) { { - org.apache.thrift.protocol.TList _list268 = iprot.readListBegin(); - struct.success = new ArrayList(_list268.size); - for (int _i269 = 0; _i269 < _list268.size; ++_i269) + org.apache.thrift.protocol.TList _list276 = iprot.readListBegin(); + struct.success = new ArrayList(_list276.size); + for (int _i277 = 0; _i277 < _list276.size; ++_i277) { - KeySlice _elem270; - _elem270 = new KeySlice(); - _elem270.read(iprot); - struct.success.add(_elem270); + KeySlice _elem278; + _elem278 = new KeySlice(); + _elem278.read(iprot); + struct.success.add(_elem278); } iprot.readListEnd(); } @@ -17471,9 +17641,9 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, get_range_slices_r oprot.writeFieldBegin(SUCCESS_FIELD_DESC); { oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.success.size())); - for (KeySlice _iter271 : struct.success) + for (KeySlice _iter279 : struct.success) { - _iter271.write(oprot); + _iter279.write(oprot); } oprot.writeListEnd(); } @@ -17528,9 +17698,9 @@ public void write(org.apache.thrift.protocol.TProtocol prot, get_range_slices_re if (struct.isSetSuccess()) { { oprot.writeI32(struct.success.size()); - for (KeySlice _iter272 : struct.success) + for (KeySlice _iter280 : struct.success) { - _iter272.write(oprot); + _iter280.write(oprot); } } } @@ -17551,14 +17721,14 @@ public void read(org.apache.thrift.protocol.TProtocol prot, get_range_slices_res BitSet incoming = iprot.readBitSet(4); if (incoming.get(0)) { { - org.apache.thrift.protocol.TList _list273 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32()); - struct.success = new ArrayList(_list273.size); - for (int _i274 = 0; _i274 < _list273.size; ++_i274) + org.apache.thrift.protocol.TList _list281 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32()); + struct.success = new ArrayList(_list281.size); + for (int _i282 = 0; _i282 < _list281.size; ++_i282) { - KeySlice _elem275; - _elem275 = new KeySlice(); - _elem275.read(iprot); - struct.success.add(_elem275); + KeySlice _elem283; + _elem283 = new KeySlice(); + _elem283.read(iprot); + struct.success.add(_elem283); } } struct.setSuccessIsSet(true); @@ -18837,14 +19007,14 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, get_paged_slice_res case 0: // SUCCESS if (schemeField.type == org.apache.thrift.protocol.TType.LIST) { { - org.apache.thrift.protocol.TList _list276 = iprot.readListBegin(); - struct.success = new ArrayList(_list276.size); - for (int _i277 = 0; _i277 < _list276.size; ++_i277) + org.apache.thrift.protocol.TList _list284 = iprot.readListBegin(); + struct.success = new ArrayList(_list284.size); + for (int _i285 = 0; _i285 < _list284.size; ++_i285) { - KeySlice _elem278; - _elem278 = new KeySlice(); - _elem278.read(iprot); - struct.success.add(_elem278); + KeySlice _elem286; + _elem286 = new KeySlice(); + _elem286.read(iprot); + struct.success.add(_elem286); } iprot.readListEnd(); } @@ -18899,9 +19069,9 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, get_paged_slice_re oprot.writeFieldBegin(SUCCESS_FIELD_DESC); { oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.success.size())); - for (KeySlice _iter279 : struct.success) + for (KeySlice _iter287 : struct.success) { - _iter279.write(oprot); + _iter287.write(oprot); } oprot.writeListEnd(); } @@ -18956,9 +19126,9 @@ public void write(org.apache.thrift.protocol.TProtocol prot, get_paged_slice_res if (struct.isSetSuccess()) { { oprot.writeI32(struct.success.size()); - for (KeySlice _iter280 : struct.success) + for (KeySlice _iter288 : struct.success) { - _iter280.write(oprot); + _iter288.write(oprot); } } } @@ -18979,14 +19149,14 @@ public void read(org.apache.thrift.protocol.TProtocol prot, get_paged_slice_resu BitSet incoming = iprot.readBitSet(4); if (incoming.get(0)) { { - org.apache.thrift.protocol.TList _list281 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32()); - struct.success = new ArrayList(_list281.size); - for (int _i282 = 0; _i282 < _list281.size; ++_i282) + org.apache.thrift.protocol.TList _list289 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32()); + struct.success = new ArrayList(_list289.size); + for (int _i290 = 0; _i290 < _list289.size; ++_i290) { - KeySlice _elem283; - _elem283 = new KeySlice(); - _elem283.read(iprot); - struct.success.add(_elem283); + KeySlice _elem291; + _elem291 = new KeySlice(); + _elem291.read(iprot); + struct.success.add(_elem291); } } struct.setSuccessIsSet(true); @@ -20264,14 +20434,14 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, get_indexed_slices_ case 0: // SUCCESS if (schemeField.type == org.apache.thrift.protocol.TType.LIST) { { - org.apache.thrift.protocol.TList _list284 = iprot.readListBegin(); - struct.success = new ArrayList(_list284.size); - for (int _i285 = 0; _i285 < _list284.size; ++_i285) + org.apache.thrift.protocol.TList _list292 = iprot.readListBegin(); + struct.success = new ArrayList(_list292.size); + for (int _i293 = 0; _i293 < _list292.size; ++_i293) { - KeySlice _elem286; - _elem286 = new KeySlice(); - _elem286.read(iprot); - struct.success.add(_elem286); + KeySlice _elem294; + _elem294 = new KeySlice(); + _elem294.read(iprot); + struct.success.add(_elem294); } iprot.readListEnd(); } @@ -20326,9 +20496,9 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, get_indexed_slices oprot.writeFieldBegin(SUCCESS_FIELD_DESC); { oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.success.size())); - for (KeySlice _iter287 : struct.success) + for (KeySlice _iter295 : struct.success) { - _iter287.write(oprot); + _iter295.write(oprot); } oprot.writeListEnd(); } @@ -20383,9 +20553,9 @@ public void write(org.apache.thrift.protocol.TProtocol prot, get_indexed_slices_ if (struct.isSetSuccess()) { { oprot.writeI32(struct.success.size()); - for (KeySlice _iter288 : struct.success) + for (KeySlice _iter296 : struct.success) { - _iter288.write(oprot); + _iter296.write(oprot); } } } @@ -20406,14 +20576,14 @@ public void read(org.apache.thrift.protocol.TProtocol prot, get_indexed_slices_r BitSet incoming = iprot.readBitSet(4); if (incoming.get(0)) { { - org.apache.thrift.protocol.TList _list289 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32()); - struct.success = new ArrayList(_list289.size); - for (int _i290 = 0; _i290 < _list289.size; ++_i290) + org.apache.thrift.protocol.TList _list297 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32()); + struct.success = new ArrayList(_list297.size); + for (int _i298 = 0; _i298 < _list297.size; ++_i298) { - KeySlice _elem291; - _elem291 = new KeySlice(); - _elem291.read(iprot); - struct.success.add(_elem291); + KeySlice _elem299; + _elem299 = new KeySlice(); + _elem299.read(iprot); + struct.success.add(_elem299); } } struct.setSuccessIsSet(true); @@ -23809,14 +23979,14 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, cas_args struct) th case 3: // EXPECTED if (schemeField.type == org.apache.thrift.protocol.TType.LIST) { { - org.apache.thrift.protocol.TList _list292 = iprot.readListBegin(); - struct.expected = new ArrayList(_list292.size); - for (int _i293 = 0; _i293 < _list292.size; ++_i293) + org.apache.thrift.protocol.TList _list300 = iprot.readListBegin(); + struct.expected = new ArrayList(_list300.size); + for (int _i301 = 0; _i301 < _list300.size; ++_i301) { - Column _elem294; - _elem294 = new Column(); - _elem294.read(iprot); - struct.expected.add(_elem294); + Column _elem302; + _elem302 = new Column(); + _elem302.read(iprot); + struct.expected.add(_elem302); } iprot.readListEnd(); } @@ -23828,14 +23998,14 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, cas_args struct) th case 4: // UPDATES if (schemeField.type == org.apache.thrift.protocol.TType.LIST) { { - org.apache.thrift.protocol.TList _list295 = iprot.readListBegin(); - struct.updates = new ArrayList(_list295.size); - for (int _i296 = 0; _i296 < _list295.size; ++_i296) + org.apache.thrift.protocol.TList _list303 = iprot.readListBegin(); + struct.updates = new ArrayList(_list303.size); + for (int _i304 = 0; _i304 < _list303.size; ++_i304) { - Column _elem297; - _elem297 = new Column(); - _elem297.read(iprot); - struct.updates.add(_elem297); + Column _elem305; + _elem305 = new Column(); + _elem305.read(iprot); + struct.updates.add(_elem305); } iprot.readListEnd(); } @@ -23889,9 +24059,9 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, cas_args struct) t oprot.writeFieldBegin(EXPECTED_FIELD_DESC); { oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.expected.size())); - for (Column _iter298 : struct.expected) + for (Column _iter306 : struct.expected) { - _iter298.write(oprot); + _iter306.write(oprot); } oprot.writeListEnd(); } @@ -23901,9 +24071,9 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, cas_args struct) t oprot.writeFieldBegin(UPDATES_FIELD_DESC); { oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.updates.size())); - for (Column _iter299 : struct.updates) + for (Column _iter307 : struct.updates) { - _iter299.write(oprot); + _iter307.write(oprot); } oprot.writeListEnd(); } @@ -23951,18 +24121,18 @@ public void write(org.apache.thrift.protocol.TProtocol prot, cas_args struct) th if (struct.isSetExpected()) { { oprot.writeI32(struct.expected.size()); - for (Column _iter300 : struct.expected) + for (Column _iter308 : struct.expected) { - _iter300.write(oprot); + _iter308.write(oprot); } } } if (struct.isSetUpdates()) { { oprot.writeI32(struct.updates.size()); - for (Column _iter301 : struct.updates) + for (Column _iter309 : struct.updates) { - _iter301.write(oprot); + _iter309.write(oprot); } } } @@ -23982,28 +24152,28 @@ public void read(org.apache.thrift.protocol.TProtocol prot, cas_args struct) thr BitSet incoming = iprot.readBitSet(2); if (incoming.get(0)) { { - org.apache.thrift.protocol.TList _list302 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32()); - struct.expected = new ArrayList(_list302.size); - for (int _i303 = 0; _i303 < _list302.size; ++_i303) + org.apache.thrift.protocol.TList _list310 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32()); + struct.expected = new ArrayList(_list310.size); + for (int _i311 = 0; _i311 < _list310.size; ++_i311) { - Column _elem304; - _elem304 = new Column(); - _elem304.read(iprot); - struct.expected.add(_elem304); + Column _elem312; + _elem312 = new Column(); + _elem312.read(iprot); + struct.expected.add(_elem312); } } struct.setExpectedIsSet(true); } if (incoming.get(1)) { { - org.apache.thrift.protocol.TList _list305 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32()); - struct.updates = new ArrayList(_list305.size); - for (int _i306 = 0; _i306 < _list305.size; ++_i306) + org.apache.thrift.protocol.TList _list313 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32()); + struct.updates = new ArrayList(_list313.size); + for (int _i314 = 0; _i314 < _list313.size; ++_i314) { - Column _elem307; - _elem307 = new Column(); - _elem307.read(iprot); - struct.updates.add(_elem307); + Column _elem315; + _elem315 = new Column(); + _elem315.read(iprot); + struct.updates.add(_elem315); } } struct.setUpdatesIsSet(true); @@ -27589,38 +27759,38 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, batch_mutate_args s case 1: // MUTATION_MAP if (schemeField.type == org.apache.thrift.protocol.TType.MAP) { { - org.apache.thrift.protocol.TMap _map308 = iprot.readMapBegin(); - struct.mutation_map = new HashMap>>(2*_map308.size); - for (int _i309 = 0; _i309 < _map308.size; ++_i309) + org.apache.thrift.protocol.TMap _map316 = iprot.readMapBegin(); + struct.mutation_map = new HashMap>>(2*_map316.size); + for (int _i317 = 0; _i317 < _map316.size; ++_i317) { - ByteBuffer _key310; - Map> _val311; - _key310 = iprot.readBinary(); + ByteBuffer _key318; + Map> _val319; + _key318 = iprot.readBinary(); { - org.apache.thrift.protocol.TMap _map312 = iprot.readMapBegin(); - _val311 = new HashMap>(2*_map312.size); - for (int _i313 = 0; _i313 < _map312.size; ++_i313) + org.apache.thrift.protocol.TMap _map320 = iprot.readMapBegin(); + _val319 = new HashMap>(2*_map320.size); + for (int _i321 = 0; _i321 < _map320.size; ++_i321) { - String _key314; - List _val315; - _key314 = iprot.readString(); + String _key322; + List _val323; + _key322 = iprot.readString(); { - org.apache.thrift.protocol.TList _list316 = iprot.readListBegin(); - _val315 = new ArrayList(_list316.size); - for (int _i317 = 0; _i317 < _list316.size; ++_i317) + org.apache.thrift.protocol.TList _list324 = iprot.readListBegin(); + _val323 = new ArrayList(_list324.size); + for (int _i325 = 0; _i325 < _list324.size; ++_i325) { - Mutation _elem318; - _elem318 = new Mutation(); - _elem318.read(iprot); - _val315.add(_elem318); + Mutation _elem326; + _elem326 = new Mutation(); + _elem326.read(iprot); + _val323.add(_elem326); } iprot.readListEnd(); } - _val311.put(_key314, _val315); + _val319.put(_key322, _val323); } iprot.readMapEnd(); } - struct.mutation_map.put(_key310, _val311); + struct.mutation_map.put(_key318, _val319); } iprot.readMapEnd(); } @@ -27656,19 +27826,19 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, batch_mutate_args oprot.writeFieldBegin(MUTATION_MAP_FIELD_DESC); { oprot.writeMapBegin(new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.MAP, struct.mutation_map.size())); - for (Map.Entry>> _iter319 : struct.mutation_map.entrySet()) + for (Map.Entry>> _iter327 : struct.mutation_map.entrySet()) { - oprot.writeBinary(_iter319.getKey()); + oprot.writeBinary(_iter327.getKey()); { - oprot.writeMapBegin(new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.LIST, _iter319.getValue().size())); - for (Map.Entry> _iter320 : _iter319.getValue().entrySet()) + oprot.writeMapBegin(new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.LIST, _iter327.getValue().size())); + for (Map.Entry> _iter328 : _iter327.getValue().entrySet()) { - oprot.writeString(_iter320.getKey()); + oprot.writeString(_iter328.getKey()); { - oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, _iter320.getValue().size())); - for (Mutation _iter321 : _iter320.getValue()) + oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, _iter328.getValue().size())); + for (Mutation _iter329 : _iter328.getValue()) { - _iter321.write(oprot); + _iter329.write(oprot); } oprot.writeListEnd(); } @@ -27704,19 +27874,19 @@ public void write(org.apache.thrift.protocol.TProtocol prot, batch_mutate_args s TTupleProtocol oprot = (TTupleProtocol) prot; { oprot.writeI32(struct.mutation_map.size()); - for (Map.Entry>> _iter322 : struct.mutation_map.entrySet()) + for (Map.Entry>> _iter330 : struct.mutation_map.entrySet()) { - oprot.writeBinary(_iter322.getKey()); + oprot.writeBinary(_iter330.getKey()); { - oprot.writeI32(_iter322.getValue().size()); - for (Map.Entry> _iter323 : _iter322.getValue().entrySet()) + oprot.writeI32(_iter330.getValue().size()); + for (Map.Entry> _iter331 : _iter330.getValue().entrySet()) { - oprot.writeString(_iter323.getKey()); + oprot.writeString(_iter331.getKey()); { - oprot.writeI32(_iter323.getValue().size()); - for (Mutation _iter324 : _iter323.getValue()) + oprot.writeI32(_iter331.getValue().size()); + for (Mutation _iter332 : _iter331.getValue()) { - _iter324.write(oprot); + _iter332.write(oprot); } } } @@ -27730,36 +27900,36 @@ public void write(org.apache.thrift.protocol.TProtocol prot, batch_mutate_args s public void read(org.apache.thrift.protocol.TProtocol prot, batch_mutate_args struct) throws org.apache.thrift.TException { TTupleProtocol iprot = (TTupleProtocol) prot; { - org.apache.thrift.protocol.TMap _map325 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.MAP, iprot.readI32()); - struct.mutation_map = new HashMap>>(2*_map325.size); - for (int _i326 = 0; _i326 < _map325.size; ++_i326) + org.apache.thrift.protocol.TMap _map333 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.MAP, iprot.readI32()); + struct.mutation_map = new HashMap>>(2*_map333.size); + for (int _i334 = 0; _i334 < _map333.size; ++_i334) { - ByteBuffer _key327; - Map> _val328; - _key327 = iprot.readBinary(); + ByteBuffer _key335; + Map> _val336; + _key335 = iprot.readBinary(); { - org.apache.thrift.protocol.TMap _map329 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.LIST, iprot.readI32()); - _val328 = new HashMap>(2*_map329.size); - for (int _i330 = 0; _i330 < _map329.size; ++_i330) + org.apache.thrift.protocol.TMap _map337 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.LIST, iprot.readI32()); + _val336 = new HashMap>(2*_map337.size); + for (int _i338 = 0; _i338 < _map337.size; ++_i338) { - String _key331; - List _val332; - _key331 = iprot.readString(); + String _key339; + List _val340; + _key339 = iprot.readString(); { - org.apache.thrift.protocol.TList _list333 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32()); - _val332 = new ArrayList(_list333.size); - for (int _i334 = 0; _i334 < _list333.size; ++_i334) + org.apache.thrift.protocol.TList _list341 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32()); + _val340 = new ArrayList(_list341.size); + for (int _i342 = 0; _i342 < _list341.size; ++_i342) { - Mutation _elem335; - _elem335 = new Mutation(); - _elem335.read(iprot); - _val332.add(_elem335); + Mutation _elem343; + _elem343 = new Mutation(); + _elem343.read(iprot); + _val340.add(_elem343); } } - _val328.put(_key331, _val332); + _val336.put(_key339, _val340); } } - struct.mutation_map.put(_key327, _val328); + struct.mutation_map.put(_key335, _val336); } } struct.setMutation_mapIsSet(true); @@ -28793,38 +28963,38 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, atomic_batch_mutate case 1: // MUTATION_MAP if (schemeField.type == org.apache.thrift.protocol.TType.MAP) { { - org.apache.thrift.protocol.TMap _map336 = iprot.readMapBegin(); - struct.mutation_map = new HashMap>>(2*_map336.size); - for (int _i337 = 0; _i337 < _map336.size; ++_i337) + org.apache.thrift.protocol.TMap _map344 = iprot.readMapBegin(); + struct.mutation_map = new HashMap>>(2*_map344.size); + for (int _i345 = 0; _i345 < _map344.size; ++_i345) { - ByteBuffer _key338; - Map> _val339; - _key338 = iprot.readBinary(); + ByteBuffer _key346; + Map> _val347; + _key346 = iprot.readBinary(); { - org.apache.thrift.protocol.TMap _map340 = iprot.readMapBegin(); - _val339 = new HashMap>(2*_map340.size); - for (int _i341 = 0; _i341 < _map340.size; ++_i341) + org.apache.thrift.protocol.TMap _map348 = iprot.readMapBegin(); + _val347 = new HashMap>(2*_map348.size); + for (int _i349 = 0; _i349 < _map348.size; ++_i349) { - String _key342; - List _val343; - _key342 = iprot.readString(); + String _key350; + List _val351; + _key350 = iprot.readString(); { - org.apache.thrift.protocol.TList _list344 = iprot.readListBegin(); - _val343 = new ArrayList(_list344.size); - for (int _i345 = 0; _i345 < _list344.size; ++_i345) + org.apache.thrift.protocol.TList _list352 = iprot.readListBegin(); + _val351 = new ArrayList(_list352.size); + for (int _i353 = 0; _i353 < _list352.size; ++_i353) { - Mutation _elem346; - _elem346 = new Mutation(); - _elem346.read(iprot); - _val343.add(_elem346); + Mutation _elem354; + _elem354 = new Mutation(); + _elem354.read(iprot); + _val351.add(_elem354); } iprot.readListEnd(); } - _val339.put(_key342, _val343); + _val347.put(_key350, _val351); } iprot.readMapEnd(); } - struct.mutation_map.put(_key338, _val339); + struct.mutation_map.put(_key346, _val347); } iprot.readMapEnd(); } @@ -28860,19 +29030,19 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, atomic_batch_mutat oprot.writeFieldBegin(MUTATION_MAP_FIELD_DESC); { oprot.writeMapBegin(new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.MAP, struct.mutation_map.size())); - for (Map.Entry>> _iter347 : struct.mutation_map.entrySet()) + for (Map.Entry>> _iter355 : struct.mutation_map.entrySet()) { - oprot.writeBinary(_iter347.getKey()); + oprot.writeBinary(_iter355.getKey()); { - oprot.writeMapBegin(new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.LIST, _iter347.getValue().size())); - for (Map.Entry> _iter348 : _iter347.getValue().entrySet()) + oprot.writeMapBegin(new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.LIST, _iter355.getValue().size())); + for (Map.Entry> _iter356 : _iter355.getValue().entrySet()) { - oprot.writeString(_iter348.getKey()); + oprot.writeString(_iter356.getKey()); { - oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, _iter348.getValue().size())); - for (Mutation _iter349 : _iter348.getValue()) + oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, _iter356.getValue().size())); + for (Mutation _iter357 : _iter356.getValue()) { - _iter349.write(oprot); + _iter357.write(oprot); } oprot.writeListEnd(); } @@ -28908,19 +29078,19 @@ public void write(org.apache.thrift.protocol.TProtocol prot, atomic_batch_mutate TTupleProtocol oprot = (TTupleProtocol) prot; { oprot.writeI32(struct.mutation_map.size()); - for (Map.Entry>> _iter350 : struct.mutation_map.entrySet()) + for (Map.Entry>> _iter358 : struct.mutation_map.entrySet()) { - oprot.writeBinary(_iter350.getKey()); + oprot.writeBinary(_iter358.getKey()); { - oprot.writeI32(_iter350.getValue().size()); - for (Map.Entry> _iter351 : _iter350.getValue().entrySet()) + oprot.writeI32(_iter358.getValue().size()); + for (Map.Entry> _iter359 : _iter358.getValue().entrySet()) { - oprot.writeString(_iter351.getKey()); + oprot.writeString(_iter359.getKey()); { - oprot.writeI32(_iter351.getValue().size()); - for (Mutation _iter352 : _iter351.getValue()) + oprot.writeI32(_iter359.getValue().size()); + for (Mutation _iter360 : _iter359.getValue()) { - _iter352.write(oprot); + _iter360.write(oprot); } } } @@ -28934,36 +29104,36 @@ public void write(org.apache.thrift.protocol.TProtocol prot, atomic_batch_mutate public void read(org.apache.thrift.protocol.TProtocol prot, atomic_batch_mutate_args struct) throws org.apache.thrift.TException { TTupleProtocol iprot = (TTupleProtocol) prot; { - org.apache.thrift.protocol.TMap _map353 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.MAP, iprot.readI32()); - struct.mutation_map = new HashMap>>(2*_map353.size); - for (int _i354 = 0; _i354 < _map353.size; ++_i354) + org.apache.thrift.protocol.TMap _map361 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.MAP, iprot.readI32()); + struct.mutation_map = new HashMap>>(2*_map361.size); + for (int _i362 = 0; _i362 < _map361.size; ++_i362) { - ByteBuffer _key355; - Map> _val356; - _key355 = iprot.readBinary(); + ByteBuffer _key363; + Map> _val364; + _key363 = iprot.readBinary(); { - org.apache.thrift.protocol.TMap _map357 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.LIST, iprot.readI32()); - _val356 = new HashMap>(2*_map357.size); - for (int _i358 = 0; _i358 < _map357.size; ++_i358) + org.apache.thrift.protocol.TMap _map365 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.LIST, iprot.readI32()); + _val364 = new HashMap>(2*_map365.size); + for (int _i366 = 0; _i366 < _map365.size; ++_i366) { - String _key359; - List _val360; - _key359 = iprot.readString(); + String _key367; + List _val368; + _key367 = iprot.readString(); { - org.apache.thrift.protocol.TList _list361 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32()); - _val360 = new ArrayList(_list361.size); - for (int _i362 = 0; _i362 < _list361.size; ++_i362) + org.apache.thrift.protocol.TList _list369 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32()); + _val368 = new ArrayList(_list369.size); + for (int _i370 = 0; _i370 < _list369.size; ++_i370) { - Mutation _elem363; - _elem363 = new Mutation(); - _elem363.read(iprot); - _val360.add(_elem363); + Mutation _elem371; + _elem371 = new Mutation(); + _elem371.read(iprot); + _val368.add(_elem371); } } - _val356.put(_key359, _val360); + _val364.put(_key367, _val368); } } - struct.mutation_map.put(_key355, _val356); + struct.mutation_map.put(_key363, _val364); } } struct.setMutation_mapIsSet(true); @@ -30482,20 +30652,22 @@ public void read(org.apache.thrift.protocol.TProtocol prot, truncate_result stru } - public static class describe_schema_versions_args implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { - private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("describe_schema_versions_args"); + public static class get_multi_slice_args implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { + private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("get_multi_slice_args"); + private static final org.apache.thrift.protocol.TField REQUEST_FIELD_DESC = new org.apache.thrift.protocol.TField("request", org.apache.thrift.protocol.TType.STRUCT, (short)1); private static final Map, SchemeFactory> schemes = new HashMap, SchemeFactory>(); static { - schemes.put(StandardScheme.class, new describe_schema_versions_argsStandardSchemeFactory()); - schemes.put(TupleScheme.class, new describe_schema_versions_argsTupleSchemeFactory()); + schemes.put(StandardScheme.class, new get_multi_slice_argsStandardSchemeFactory()); + schemes.put(TupleScheme.class, new get_multi_slice_argsTupleSchemeFactory()); } + public MultiSliceRequest request; // required /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */ public enum _Fields implements org.apache.thrift.TFieldIdEnum { -; + REQUEST((short)1, "request"); private static final Map byName = new HashMap(); @@ -30510,6 +30682,8 @@ public enum _Fields implements org.apache.thrift.TFieldIdEnum { */ public static _Fields findByThriftId(int fieldId) { switch(fieldId) { + case 1: // REQUEST + return REQUEST; default: return null; } @@ -30548,37 +30722,87 @@ public String getFieldName() { return _fieldName; } } + + // isset id assignments public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap; static { Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); + tmpMap.put(_Fields.REQUEST, new org.apache.thrift.meta_data.FieldMetaData("request", org.apache.thrift.TFieldRequirementType.REQUIRED, + new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, MultiSliceRequest.class))); metaDataMap = Collections.unmodifiableMap(tmpMap); - org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(describe_schema_versions_args.class, metaDataMap); + org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(get_multi_slice_args.class, metaDataMap); } - public describe_schema_versions_args() { + public get_multi_slice_args() { + } + + public get_multi_slice_args( + MultiSliceRequest request) + { + this(); + this.request = request; } /** * Performs a deep copy on other. */ - public describe_schema_versions_args(describe_schema_versions_args other) { + public get_multi_slice_args(get_multi_slice_args other) { + if (other.isSetRequest()) { + this.request = new MultiSliceRequest(other.request); + } } - public describe_schema_versions_args deepCopy() { - return new describe_schema_versions_args(this); + public get_multi_slice_args deepCopy() { + return new get_multi_slice_args(this); } @Override public void clear() { + this.request = null; + } + + public MultiSliceRequest getRequest() { + return this.request; + } + + public get_multi_slice_args setRequest(MultiSliceRequest request) { + this.request = request; + return this; + } + + public void unsetRequest() { + this.request = null; + } + + /** Returns true if field request is set (has been assigned a value) and false otherwise */ + public boolean isSetRequest() { + return this.request != null; + } + + public void setRequestIsSet(boolean value) { + if (!value) { + this.request = null; + } } public void setFieldValue(_Fields field, Object value) { switch (field) { + case REQUEST: + if (value == null) { + unsetRequest(); + } else { + setRequest((MultiSliceRequest)value); + } + break; + } } public Object getFieldValue(_Fields field) { switch (field) { + case REQUEST: + return getRequest(); + } throw new IllegalStateException(); } @@ -30590,6 +30814,8 @@ public boolean isSet(_Fields field) { } switch (field) { + case REQUEST: + return isSetRequest(); } throw new IllegalStateException(); } @@ -30598,15 +30824,24 @@ public boolean isSet(_Fields field) { public boolean equals(Object that) { if (that == null) return false; - if (that instanceof describe_schema_versions_args) - return this.equals((describe_schema_versions_args)that); + if (that instanceof get_multi_slice_args) + return this.equals((get_multi_slice_args)that); return false; } - public boolean equals(describe_schema_versions_args that) { + public boolean equals(get_multi_slice_args that) { if (that == null) return false; + boolean this_present_request = true && this.isSetRequest(); + boolean that_present_request = true && that.isSetRequest(); + if (this_present_request || that_present_request) { + if (!(this_present_request && that_present_request)) + return false; + if (!this.request.equals(that.request)) + return false; + } + return true; } @@ -30614,17 +30849,32 @@ public boolean equals(describe_schema_versions_args that) { public int hashCode() { HashCodeBuilder builder = new HashCodeBuilder(); + boolean present_request = true && (isSetRequest()); + builder.append(present_request); + if (present_request) + builder.append(request); + return builder.toHashCode(); } @Override - public int compareTo(describe_schema_versions_args other) { + public int compareTo(get_multi_slice_args other) { if (!getClass().equals(other.getClass())) { return getClass().getName().compareTo(other.getClass().getName()); } int lastComparison = 0; + lastComparison = Boolean.valueOf(isSetRequest()).compareTo(other.isSetRequest()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetRequest()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.request, other.request); + if (lastComparison != 0) { + return lastComparison; + } + } return 0; } @@ -30642,16 +30892,29 @@ public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache. @Override public String toString() { - StringBuilder sb = new StringBuilder("describe_schema_versions_args("); + StringBuilder sb = new StringBuilder("get_multi_slice_args("); boolean first = true; + sb.append("request:"); + if (this.request == null) { + sb.append("null"); + } else { + sb.append(this.request); + } + first = false; sb.append(")"); return sb.toString(); } public void validate() throws org.apache.thrift.TException { // check for required fields + if (request == null) { + throw new org.apache.thrift.protocol.TProtocolException("Required field 'request' was not present! Struct: " + toString()); + } // check for sub-struct validity + if (request != null) { + request.validate(); + } } private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException { @@ -30670,15 +30933,15 @@ private void readObject(java.io.ObjectInputStream in) throws java.io.IOException } } - private static class describe_schema_versions_argsStandardSchemeFactory implements SchemeFactory { - public describe_schema_versions_argsStandardScheme getScheme() { - return new describe_schema_versions_argsStandardScheme(); + private static class get_multi_slice_argsStandardSchemeFactory implements SchemeFactory { + public get_multi_slice_argsStandardScheme getScheme() { + return new get_multi_slice_argsStandardScheme(); } } - private static class describe_schema_versions_argsStandardScheme extends StandardScheme { + private static class get_multi_slice_argsStandardScheme extends StandardScheme { - public void read(org.apache.thrift.protocol.TProtocol iprot, describe_schema_versions_args struct) throws org.apache.thrift.TException { + public void read(org.apache.thrift.protocol.TProtocol iprot, get_multi_slice_args struct) throws org.apache.thrift.TException { org.apache.thrift.protocol.TField schemeField; iprot.readStructBegin(); while (true) @@ -30688,6 +30951,15 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, describe_schema_ver break; } switch (schemeField.id) { + case 1: // REQUEST + if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) { + struct.request = new MultiSliceRequest(); + struct.request.read(iprot); + struct.setRequestIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; default: org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); } @@ -30699,56 +30971,71 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, describe_schema_ver struct.validate(); } - public void write(org.apache.thrift.protocol.TProtocol oprot, describe_schema_versions_args struct) throws org.apache.thrift.TException { + public void write(org.apache.thrift.protocol.TProtocol oprot, get_multi_slice_args struct) throws org.apache.thrift.TException { struct.validate(); oprot.writeStructBegin(STRUCT_DESC); + if (struct.request != null) { + oprot.writeFieldBegin(REQUEST_FIELD_DESC); + struct.request.write(oprot); + oprot.writeFieldEnd(); + } oprot.writeFieldStop(); oprot.writeStructEnd(); } } - private static class describe_schema_versions_argsTupleSchemeFactory implements SchemeFactory { - public describe_schema_versions_argsTupleScheme getScheme() { - return new describe_schema_versions_argsTupleScheme(); + private static class get_multi_slice_argsTupleSchemeFactory implements SchemeFactory { + public get_multi_slice_argsTupleScheme getScheme() { + return new get_multi_slice_argsTupleScheme(); } } - private static class describe_schema_versions_argsTupleScheme extends TupleScheme { + private static class get_multi_slice_argsTupleScheme extends TupleScheme { @Override - public void write(org.apache.thrift.protocol.TProtocol prot, describe_schema_versions_args struct) throws org.apache.thrift.TException { + public void write(org.apache.thrift.protocol.TProtocol prot, get_multi_slice_args struct) throws org.apache.thrift.TException { TTupleProtocol oprot = (TTupleProtocol) prot; + struct.request.write(oprot); } @Override - public void read(org.apache.thrift.protocol.TProtocol prot, describe_schema_versions_args struct) throws org.apache.thrift.TException { + public void read(org.apache.thrift.protocol.TProtocol prot, get_multi_slice_args struct) throws org.apache.thrift.TException { TTupleProtocol iprot = (TTupleProtocol) prot; + struct.request = new MultiSliceRequest(); + struct.request.read(iprot); + struct.setRequestIsSet(true); } } } - public static class describe_schema_versions_result implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { - private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("describe_schema_versions_result"); + public static class get_multi_slice_result implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { + private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("get_multi_slice_result"); - private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField("success", org.apache.thrift.protocol.TType.MAP, (short)0); + private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField("success", org.apache.thrift.protocol.TType.LIST, (short)0); private static final org.apache.thrift.protocol.TField IRE_FIELD_DESC = new org.apache.thrift.protocol.TField("ire", org.apache.thrift.protocol.TType.STRUCT, (short)1); + private static final org.apache.thrift.protocol.TField UE_FIELD_DESC = new org.apache.thrift.protocol.TField("ue", org.apache.thrift.protocol.TType.STRUCT, (short)2); + private static final org.apache.thrift.protocol.TField TE_FIELD_DESC = new org.apache.thrift.protocol.TField("te", org.apache.thrift.protocol.TType.STRUCT, (short)3); private static final Map, SchemeFactory> schemes = new HashMap, SchemeFactory>(); static { - schemes.put(StandardScheme.class, new describe_schema_versions_resultStandardSchemeFactory()); - schemes.put(TupleScheme.class, new describe_schema_versions_resultTupleSchemeFactory()); + schemes.put(StandardScheme.class, new get_multi_slice_resultStandardSchemeFactory()); + schemes.put(TupleScheme.class, new get_multi_slice_resultTupleSchemeFactory()); } - public Map> success; // required + public List success; // required public InvalidRequestException ire; // required + public UnavailableException ue; // required + public TimedOutException te; // required /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */ public enum _Fields implements org.apache.thrift.TFieldIdEnum { SUCCESS((short)0, "success"), - IRE((short)1, "ire"); + IRE((short)1, "ire"), + UE((short)2, "ue"), + TE((short)3, "te"); private static final Map byName = new HashMap(); @@ -30767,6 +31054,10 @@ public static _Fields findByThriftId(int fieldId) { return SUCCESS; case 1: // IRE return IRE; + case 2: // UE + return UE; + case 3: // TE + return TE; default: return null; } @@ -30811,78 +31102,88 @@ public String getFieldName() { static { Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); tmpMap.put(_Fields.SUCCESS, new org.apache.thrift.meta_data.FieldMetaData("success", org.apache.thrift.TFieldRequirementType.DEFAULT, - new org.apache.thrift.meta_data.MapMetaData(org.apache.thrift.protocol.TType.MAP, - new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING), - new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, - new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING))))); + new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, + new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, ColumnOrSuperColumn.class)))); tmpMap.put(_Fields.IRE, new org.apache.thrift.meta_data.FieldMetaData("ire", org.apache.thrift.TFieldRequirementType.DEFAULT, new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRUCT))); + tmpMap.put(_Fields.UE, new org.apache.thrift.meta_data.FieldMetaData("ue", org.apache.thrift.TFieldRequirementType.DEFAULT, + new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRUCT))); + tmpMap.put(_Fields.TE, new org.apache.thrift.meta_data.FieldMetaData("te", org.apache.thrift.TFieldRequirementType.DEFAULT, + new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRUCT))); metaDataMap = Collections.unmodifiableMap(tmpMap); - org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(describe_schema_versions_result.class, metaDataMap); + org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(get_multi_slice_result.class, metaDataMap); } - public describe_schema_versions_result() { + public get_multi_slice_result() { } - public describe_schema_versions_result( - Map> success, - InvalidRequestException ire) + public get_multi_slice_result( + List success, + InvalidRequestException ire, + UnavailableException ue, + TimedOutException te) { this(); this.success = success; this.ire = ire; + this.ue = ue; + this.te = te; } /** * Performs a deep copy on other. */ - public describe_schema_versions_result(describe_schema_versions_result other) { + public get_multi_slice_result(get_multi_slice_result other) { if (other.isSetSuccess()) { - Map> __this__success = new HashMap>(other.success.size()); - for (Map.Entry> other_element : other.success.entrySet()) { - - String other_element_key = other_element.getKey(); - List other_element_value = other_element.getValue(); - - String __this__success_copy_key = other_element_key; - - List __this__success_copy_value = new ArrayList(other_element_value); - - __this__success.put(__this__success_copy_key, __this__success_copy_value); + List __this__success = new ArrayList(other.success.size()); + for (ColumnOrSuperColumn other_element : other.success) { + __this__success.add(new ColumnOrSuperColumn(other_element)); } this.success = __this__success; } if (other.isSetIre()) { this.ire = new InvalidRequestException(other.ire); } + if (other.isSetUe()) { + this.ue = new UnavailableException(other.ue); + } + if (other.isSetTe()) { + this.te = new TimedOutException(other.te); + } } - public describe_schema_versions_result deepCopy() { - return new describe_schema_versions_result(this); + public get_multi_slice_result deepCopy() { + return new get_multi_slice_result(this); } @Override public void clear() { this.success = null; this.ire = null; + this.ue = null; + this.te = null; } public int getSuccessSize() { return (this.success == null) ? 0 : this.success.size(); } - public void putToSuccess(String key, List val) { + public java.util.Iterator getSuccessIterator() { + return (this.success == null) ? null : this.success.iterator(); + } + + public void addToSuccess(ColumnOrSuperColumn elem) { if (this.success == null) { - this.success = new HashMap>(); + this.success = new ArrayList(); } - this.success.put(key, val); + this.success.add(elem); } - public Map> getSuccess() { + public List getSuccess() { return this.success; } - public describe_schema_versions_result setSuccess(Map> success) { + public get_multi_slice_result setSuccess(List success) { this.success = success; return this; } @@ -30906,7 +31207,7 @@ public InvalidRequestException getIre() { return this.ire; } - public describe_schema_versions_result setIre(InvalidRequestException ire) { + public get_multi_slice_result setIre(InvalidRequestException ire) { this.ire = ire; return this; } @@ -30926,13 +31227,61 @@ public void setIreIsSet(boolean value) { } } + public UnavailableException getUe() { + return this.ue; + } + + public get_multi_slice_result setUe(UnavailableException ue) { + this.ue = ue; + return this; + } + + public void unsetUe() { + this.ue = null; + } + + /** Returns true if field ue is set (has been assigned a value) and false otherwise */ + public boolean isSetUe() { + return this.ue != null; + } + + public void setUeIsSet(boolean value) { + if (!value) { + this.ue = null; + } + } + + public TimedOutException getTe() { + return this.te; + } + + public get_multi_slice_result setTe(TimedOutException te) { + this.te = te; + return this; + } + + public void unsetTe() { + this.te = null; + } + + /** Returns true if field te is set (has been assigned a value) and false otherwise */ + public boolean isSetTe() { + return this.te != null; + } + + public void setTeIsSet(boolean value) { + if (!value) { + this.te = null; + } + } + public void setFieldValue(_Fields field, Object value) { switch (field) { case SUCCESS: if (value == null) { unsetSuccess(); } else { - setSuccess((Map>)value); + setSuccess((List)value); } break; @@ -30944,6 +31293,22 @@ public void setFieldValue(_Fields field, Object value) { } break; + case UE: + if (value == null) { + unsetUe(); + } else { + setUe((UnavailableException)value); + } + break; + + case TE: + if (value == null) { + unsetTe(); + } else { + setTe((TimedOutException)value); + } + break; + } } @@ -30955,6 +31320,12 @@ public Object getFieldValue(_Fields field) { case IRE: return getIre(); + case UE: + return getUe(); + + case TE: + return getTe(); + } throw new IllegalStateException(); } @@ -30970,6 +31341,10 @@ public boolean isSet(_Fields field) { return isSetSuccess(); case IRE: return isSetIre(); + case UE: + return isSetUe(); + case TE: + return isSetTe(); } throw new IllegalStateException(); } @@ -30978,12 +31353,12 @@ public boolean isSet(_Fields field) { public boolean equals(Object that) { if (that == null) return false; - if (that instanceof describe_schema_versions_result) - return this.equals((describe_schema_versions_result)that); + if (that instanceof get_multi_slice_result) + return this.equals((get_multi_slice_result)that); return false; } - public boolean equals(describe_schema_versions_result that) { + public boolean equals(get_multi_slice_result that) { if (that == null) return false; @@ -31005,6 +31380,24 @@ public boolean equals(describe_schema_versions_result that) { return false; } + boolean this_present_ue = true && this.isSetUe(); + boolean that_present_ue = true && that.isSetUe(); + if (this_present_ue || that_present_ue) { + if (!(this_present_ue && that_present_ue)) + return false; + if (!this.ue.equals(that.ue)) + return false; + } + + boolean this_present_te = true && this.isSetTe(); + boolean that_present_te = true && that.isSetTe(); + if (this_present_te || that_present_te) { + if (!(this_present_te && that_present_te)) + return false; + if (!this.te.equals(that.te)) + return false; + } + return true; } @@ -31022,11 +31415,21 @@ public int hashCode() { if (present_ire) builder.append(ire); + boolean present_ue = true && (isSetUe()); + builder.append(present_ue); + if (present_ue) + builder.append(ue); + + boolean present_te = true && (isSetTe()); + builder.append(present_te); + if (present_te) + builder.append(te); + return builder.toHashCode(); } @Override - public int compareTo(describe_schema_versions_result other) { + public int compareTo(get_multi_slice_result other) { if (!getClass().equals(other.getClass())) { return getClass().getName().compareTo(other.getClass().getName()); } @@ -31053,6 +31456,26 @@ public int compareTo(describe_schema_versions_result other) { return lastComparison; } } + lastComparison = Boolean.valueOf(isSetUe()).compareTo(other.isSetUe()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetUe()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.ue, other.ue); + if (lastComparison != 0) { + return lastComparison; + } + } + lastComparison = Boolean.valueOf(isSetTe()).compareTo(other.isSetTe()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetTe()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.te, other.te); + if (lastComparison != 0) { + return lastComparison; + } + } return 0; } @@ -31070,7 +31493,7 @@ public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache. @Override public String toString() { - StringBuilder sb = new StringBuilder("describe_schema_versions_result("); + StringBuilder sb = new StringBuilder("get_multi_slice_result("); boolean first = true; sb.append("success:"); @@ -31088,6 +31511,22 @@ public String toString() { sb.append(this.ire); } first = false; + if (!first) sb.append(", "); + sb.append("ue:"); + if (this.ue == null) { + sb.append("null"); + } else { + sb.append(this.ue); + } + first = false; + if (!first) sb.append(", "); + sb.append("te:"); + if (this.te == null) { + sb.append("null"); + } else { + sb.append(this.te); + } + first = false; sb.append(")"); return sb.toString(); } @@ -31113,15 +31552,15 @@ private void readObject(java.io.ObjectInputStream in) throws java.io.IOException } } - private static class describe_schema_versions_resultStandardSchemeFactory implements SchemeFactory { - public describe_schema_versions_resultStandardScheme getScheme() { - return new describe_schema_versions_resultStandardScheme(); + private static class get_multi_slice_resultStandardSchemeFactory implements SchemeFactory { + public get_multi_slice_resultStandardScheme getScheme() { + return new get_multi_slice_resultStandardScheme(); } } - private static class describe_schema_versions_resultStandardScheme extends StandardScheme { + private static class get_multi_slice_resultStandardScheme extends StandardScheme { - public void read(org.apache.thrift.protocol.TProtocol iprot, describe_schema_versions_result struct) throws org.apache.thrift.TException { + public void read(org.apache.thrift.protocol.TProtocol iprot, get_multi_slice_result struct) throws org.apache.thrift.TException { org.apache.thrift.protocol.TField schemeField; iprot.readStructBegin(); while (true) @@ -31132,29 +31571,18 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, describe_schema_ver } switch (schemeField.id) { case 0: // SUCCESS - if (schemeField.type == org.apache.thrift.protocol.TType.MAP) { + if (schemeField.type == org.apache.thrift.protocol.TType.LIST) { { - org.apache.thrift.protocol.TMap _map364 = iprot.readMapBegin(); - struct.success = new HashMap>(2*_map364.size); - for (int _i365 = 0; _i365 < _map364.size; ++_i365) + org.apache.thrift.protocol.TList _list372 = iprot.readListBegin(); + struct.success = new ArrayList(_list372.size); + for (int _i373 = 0; _i373 < _list372.size; ++_i373) { - String _key366; - List _val367; - _key366 = iprot.readString(); - { - org.apache.thrift.protocol.TList _list368 = iprot.readListBegin(); - _val367 = new ArrayList(_list368.size); - for (int _i369 = 0; _i369 < _list368.size; ++_i369) - { - String _elem370; - _elem370 = iprot.readString(); - _val367.add(_elem370); - } - iprot.readListEnd(); - } - struct.success.put(_key366, _val367); + ColumnOrSuperColumn _elem374; + _elem374 = new ColumnOrSuperColumn(); + _elem374.read(iprot); + struct.success.add(_elem374); } - iprot.readMapEnd(); + iprot.readListEnd(); } struct.setSuccessIsSet(true); } else { @@ -31170,6 +31598,24 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, describe_schema_ver org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); } break; + case 2: // UE + if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) { + struct.ue = new UnavailableException(); + struct.ue.read(iprot); + struct.setUeIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + case 3: // TE + if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) { + struct.te = new TimedOutException(); + struct.te.read(iprot); + struct.setTeIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; default: org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); } @@ -31181,27 +31627,19 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, describe_schema_ver struct.validate(); } - public void write(org.apache.thrift.protocol.TProtocol oprot, describe_schema_versions_result struct) throws org.apache.thrift.TException { + public void write(org.apache.thrift.protocol.TProtocol oprot, get_multi_slice_result struct) throws org.apache.thrift.TException { struct.validate(); oprot.writeStructBegin(STRUCT_DESC); if (struct.success != null) { oprot.writeFieldBegin(SUCCESS_FIELD_DESC); { - oprot.writeMapBegin(new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.LIST, struct.success.size())); - for (Map.Entry> _iter371 : struct.success.entrySet()) + oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.success.size())); + for (ColumnOrSuperColumn _iter375 : struct.success) { - oprot.writeString(_iter371.getKey()); - { - oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, _iter371.getValue().size())); - for (String _iter372 : _iter371.getValue()) - { - oprot.writeString(_iter372); - } - oprot.writeListEnd(); - } + _iter375.write(oprot); } - oprot.writeMapEnd(); + oprot.writeListEnd(); } oprot.writeFieldEnd(); } @@ -31210,22 +31648,32 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, describe_schema_ve struct.ire.write(oprot); oprot.writeFieldEnd(); } + if (struct.ue != null) { + oprot.writeFieldBegin(UE_FIELD_DESC); + struct.ue.write(oprot); + oprot.writeFieldEnd(); + } + if (struct.te != null) { + oprot.writeFieldBegin(TE_FIELD_DESC); + struct.te.write(oprot); + oprot.writeFieldEnd(); + } oprot.writeFieldStop(); oprot.writeStructEnd(); } } - private static class describe_schema_versions_resultTupleSchemeFactory implements SchemeFactory { - public describe_schema_versions_resultTupleScheme getScheme() { - return new describe_schema_versions_resultTupleScheme(); + private static class get_multi_slice_resultTupleSchemeFactory implements SchemeFactory { + public get_multi_slice_resultTupleScheme getScheme() { + return new get_multi_slice_resultTupleScheme(); } } - private static class describe_schema_versions_resultTupleScheme extends TupleScheme { + private static class get_multi_slice_resultTupleScheme extends TupleScheme { @Override - public void write(org.apache.thrift.protocol.TProtocol prot, describe_schema_versions_result struct) throws org.apache.thrift.TException { + public void write(org.apache.thrift.protocol.TProtocol prot, get_multi_slice_result struct) throws org.apache.thrift.TException { TTupleProtocol oprot = (TTupleProtocol) prot; BitSet optionals = new BitSet(); if (struct.isSetSuccess()) { @@ -31234,52 +31682,47 @@ public void write(org.apache.thrift.protocol.TProtocol prot, describe_schema_ver if (struct.isSetIre()) { optionals.set(1); } - oprot.writeBitSet(optionals, 2); + if (struct.isSetUe()) { + optionals.set(2); + } + if (struct.isSetTe()) { + optionals.set(3); + } + oprot.writeBitSet(optionals, 4); if (struct.isSetSuccess()) { { oprot.writeI32(struct.success.size()); - for (Map.Entry> _iter373 : struct.success.entrySet()) + for (ColumnOrSuperColumn _iter376 : struct.success) { - oprot.writeString(_iter373.getKey()); - { - oprot.writeI32(_iter373.getValue().size()); - for (String _iter374 : _iter373.getValue()) - { - oprot.writeString(_iter374); - } - } + _iter376.write(oprot); } } } if (struct.isSetIre()) { struct.ire.write(oprot); } + if (struct.isSetUe()) { + struct.ue.write(oprot); + } + if (struct.isSetTe()) { + struct.te.write(oprot); + } } @Override - public void read(org.apache.thrift.protocol.TProtocol prot, describe_schema_versions_result struct) throws org.apache.thrift.TException { + public void read(org.apache.thrift.protocol.TProtocol prot, get_multi_slice_result struct) throws org.apache.thrift.TException { TTupleProtocol iprot = (TTupleProtocol) prot; - BitSet incoming = iprot.readBitSet(2); + BitSet incoming = iprot.readBitSet(4); if (incoming.get(0)) { { - org.apache.thrift.protocol.TMap _map375 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.LIST, iprot.readI32()); - struct.success = new HashMap>(2*_map375.size); - for (int _i376 = 0; _i376 < _map375.size; ++_i376) + org.apache.thrift.protocol.TList _list377 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32()); + struct.success = new ArrayList(_list377.size); + for (int _i378 = 0; _i378 < _list377.size; ++_i378) { - String _key377; - List _val378; - _key377 = iprot.readString(); - { - org.apache.thrift.protocol.TList _list379 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32()); - _val378 = new ArrayList(_list379.size); - for (int _i380 = 0; _i380 < _list379.size; ++_i380) - { - String _elem381; - _elem381 = iprot.readString(); - _val378.add(_elem381); - } - } - struct.success.put(_key377, _val378); + ColumnOrSuperColumn _elem379; + _elem379 = new ColumnOrSuperColumn(); + _elem379.read(iprot); + struct.success.add(_elem379); } } struct.setSuccessIsSet(true); @@ -31289,19 +31732,29 @@ public void read(org.apache.thrift.protocol.TProtocol prot, describe_schema_vers struct.ire.read(iprot); struct.setIreIsSet(true); } + if (incoming.get(2)) { + struct.ue = new UnavailableException(); + struct.ue.read(iprot); + struct.setUeIsSet(true); + } + if (incoming.get(3)) { + struct.te = new TimedOutException(); + struct.te.read(iprot); + struct.setTeIsSet(true); + } } } } - public static class describe_keyspaces_args implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { - private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("describe_keyspaces_args"); + public static class describe_schema_versions_args implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { + private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("describe_schema_versions_args"); private static final Map, SchemeFactory> schemes = new HashMap, SchemeFactory>(); static { - schemes.put(StandardScheme.class, new describe_keyspaces_argsStandardSchemeFactory()); - schemes.put(TupleScheme.class, new describe_keyspaces_argsTupleSchemeFactory()); + schemes.put(StandardScheme.class, new describe_schema_versions_argsStandardSchemeFactory()); + schemes.put(TupleScheme.class, new describe_schema_versions_argsTupleSchemeFactory()); } @@ -31364,20 +31817,20 @@ public String getFieldName() { static { Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); metaDataMap = Collections.unmodifiableMap(tmpMap); - org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(describe_keyspaces_args.class, metaDataMap); + org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(describe_schema_versions_args.class, metaDataMap); } - public describe_keyspaces_args() { + public describe_schema_versions_args() { } /** * Performs a deep copy on other. */ - public describe_keyspaces_args(describe_keyspaces_args other) { + public describe_schema_versions_args(describe_schema_versions_args other) { } - public describe_keyspaces_args deepCopy() { - return new describe_keyspaces_args(this); + public describe_schema_versions_args deepCopy() { + return new describe_schema_versions_args(this); } @Override @@ -31410,12 +31863,12 @@ public boolean isSet(_Fields field) { public boolean equals(Object that) { if (that == null) return false; - if (that instanceof describe_keyspaces_args) - return this.equals((describe_keyspaces_args)that); + if (that instanceof describe_schema_versions_args) + return this.equals((describe_schema_versions_args)that); return false; } - public boolean equals(describe_keyspaces_args that) { + public boolean equals(describe_schema_versions_args that) { if (that == null) return false; @@ -31430,7 +31883,7 @@ public int hashCode() { } @Override - public int compareTo(describe_keyspaces_args other) { + public int compareTo(describe_schema_versions_args other) { if (!getClass().equals(other.getClass())) { return getClass().getName().compareTo(other.getClass().getName()); } @@ -31454,7 +31907,7 @@ public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache. @Override public String toString() { - StringBuilder sb = new StringBuilder("describe_keyspaces_args("); + StringBuilder sb = new StringBuilder("describe_schema_versions_args("); boolean first = true; sb.append(")"); @@ -31482,15 +31935,15 @@ private void readObject(java.io.ObjectInputStream in) throws java.io.IOException } } - private static class describe_keyspaces_argsStandardSchemeFactory implements SchemeFactory { - public describe_keyspaces_argsStandardScheme getScheme() { - return new describe_keyspaces_argsStandardScheme(); + private static class describe_schema_versions_argsStandardSchemeFactory implements SchemeFactory { + public describe_schema_versions_argsStandardScheme getScheme() { + return new describe_schema_versions_argsStandardScheme(); } } - private static class describe_keyspaces_argsStandardScheme extends StandardScheme { + private static class describe_schema_versions_argsStandardScheme extends StandardScheme { - public void read(org.apache.thrift.protocol.TProtocol iprot, describe_keyspaces_args struct) throws org.apache.thrift.TException { + public void read(org.apache.thrift.protocol.TProtocol iprot, describe_schema_versions_args struct) throws org.apache.thrift.TException { org.apache.thrift.protocol.TField schemeField; iprot.readStructBegin(); while (true) @@ -31511,7 +31964,7 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, describe_keyspaces_ struct.validate(); } - public void write(org.apache.thrift.protocol.TProtocol oprot, describe_keyspaces_args struct) throws org.apache.thrift.TException { + public void write(org.apache.thrift.protocol.TProtocol oprot, describe_schema_versions_args struct) throws org.apache.thrift.TException { struct.validate(); oprot.writeStructBegin(STRUCT_DESC); @@ -31521,40 +31974,40 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, describe_keyspaces } - private static class describe_keyspaces_argsTupleSchemeFactory implements SchemeFactory { - public describe_keyspaces_argsTupleScheme getScheme() { - return new describe_keyspaces_argsTupleScheme(); + private static class describe_schema_versions_argsTupleSchemeFactory implements SchemeFactory { + public describe_schema_versions_argsTupleScheme getScheme() { + return new describe_schema_versions_argsTupleScheme(); } } - private static class describe_keyspaces_argsTupleScheme extends TupleScheme { + private static class describe_schema_versions_argsTupleScheme extends TupleScheme { @Override - public void write(org.apache.thrift.protocol.TProtocol prot, describe_keyspaces_args struct) throws org.apache.thrift.TException { + public void write(org.apache.thrift.protocol.TProtocol prot, describe_schema_versions_args struct) throws org.apache.thrift.TException { TTupleProtocol oprot = (TTupleProtocol) prot; } @Override - public void read(org.apache.thrift.protocol.TProtocol prot, describe_keyspaces_args struct) throws org.apache.thrift.TException { + public void read(org.apache.thrift.protocol.TProtocol prot, describe_schema_versions_args struct) throws org.apache.thrift.TException { TTupleProtocol iprot = (TTupleProtocol) prot; } } } - public static class describe_keyspaces_result implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { - private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("describe_keyspaces_result"); + public static class describe_schema_versions_result implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { + private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("describe_schema_versions_result"); - private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField("success", org.apache.thrift.protocol.TType.LIST, (short)0); + private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField("success", org.apache.thrift.protocol.TType.MAP, (short)0); private static final org.apache.thrift.protocol.TField IRE_FIELD_DESC = new org.apache.thrift.protocol.TField("ire", org.apache.thrift.protocol.TType.STRUCT, (short)1); private static final Map, SchemeFactory> schemes = new HashMap, SchemeFactory>(); static { - schemes.put(StandardScheme.class, new describe_keyspaces_resultStandardSchemeFactory()); - schemes.put(TupleScheme.class, new describe_keyspaces_resultTupleSchemeFactory()); + schemes.put(StandardScheme.class, new describe_schema_versions_resultStandardSchemeFactory()); + schemes.put(TupleScheme.class, new describe_schema_versions_resultTupleSchemeFactory()); } - public List success; // required + public Map> success; // required public InvalidRequestException ire; // required /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */ @@ -31623,19 +32076,21 @@ public String getFieldName() { static { Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); tmpMap.put(_Fields.SUCCESS, new org.apache.thrift.meta_data.FieldMetaData("success", org.apache.thrift.TFieldRequirementType.DEFAULT, - new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, - new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, KsDef.class)))); + new org.apache.thrift.meta_data.MapMetaData(org.apache.thrift.protocol.TType.MAP, + new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING), + new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, + new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING))))); tmpMap.put(_Fields.IRE, new org.apache.thrift.meta_data.FieldMetaData("ire", org.apache.thrift.TFieldRequirementType.DEFAULT, new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRUCT))); metaDataMap = Collections.unmodifiableMap(tmpMap); - org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(describe_keyspaces_result.class, metaDataMap); + org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(describe_schema_versions_result.class, metaDataMap); } - public describe_keyspaces_result() { + public describe_schema_versions_result() { } - public describe_keyspaces_result( - List success, + public describe_schema_versions_result( + Map> success, InvalidRequestException ire) { this(); @@ -31646,11 +32101,19 @@ public describe_keyspaces_result( /** * Performs a deep copy on other. */ - public describe_keyspaces_result(describe_keyspaces_result other) { + public describe_schema_versions_result(describe_schema_versions_result other) { if (other.isSetSuccess()) { - List __this__success = new ArrayList(other.success.size()); - for (KsDef other_element : other.success) { - __this__success.add(new KsDef(other_element)); + Map> __this__success = new HashMap>(other.success.size()); + for (Map.Entry> other_element : other.success.entrySet()) { + + String other_element_key = other_element.getKey(); + List other_element_value = other_element.getValue(); + + String __this__success_copy_key = other_element_key; + + List __this__success_copy_value = new ArrayList(other_element_value); + + __this__success.put(__this__success_copy_key, __this__success_copy_value); } this.success = __this__success; } @@ -31659,8 +32122,8 @@ public describe_keyspaces_result(describe_keyspaces_result other) { } } - public describe_keyspaces_result deepCopy() { - return new describe_keyspaces_result(this); + public describe_schema_versions_result deepCopy() { + return new describe_schema_versions_result(this); } @Override @@ -31673,22 +32136,18 @@ public int getSuccessSize() { return (this.success == null) ? 0 : this.success.size(); } - public java.util.Iterator getSuccessIterator() { - return (this.success == null) ? null : this.success.iterator(); - } - - public void addToSuccess(KsDef elem) { + public void putToSuccess(String key, List val) { if (this.success == null) { - this.success = new ArrayList(); + this.success = new HashMap>(); } - this.success.add(elem); + this.success.put(key, val); } - public List getSuccess() { + public Map> getSuccess() { return this.success; } - public describe_keyspaces_result setSuccess(List success) { + public describe_schema_versions_result setSuccess(Map> success) { this.success = success; return this; } @@ -31712,7 +32171,7 @@ public InvalidRequestException getIre() { return this.ire; } - public describe_keyspaces_result setIre(InvalidRequestException ire) { + public describe_schema_versions_result setIre(InvalidRequestException ire) { this.ire = ire; return this; } @@ -31738,7 +32197,7 @@ public void setFieldValue(_Fields field, Object value) { if (value == null) { unsetSuccess(); } else { - setSuccess((List)value); + setSuccess((Map>)value); } break; @@ -31784,12 +32243,12 @@ public boolean isSet(_Fields field) { public boolean equals(Object that) { if (that == null) return false; - if (that instanceof describe_keyspaces_result) - return this.equals((describe_keyspaces_result)that); + if (that instanceof describe_schema_versions_result) + return this.equals((describe_schema_versions_result)that); return false; } - public boolean equals(describe_keyspaces_result that) { + public boolean equals(describe_schema_versions_result that) { if (that == null) return false; @@ -31832,7 +32291,7 @@ public int hashCode() { } @Override - public int compareTo(describe_keyspaces_result other) { + public int compareTo(describe_schema_versions_result other) { if (!getClass().equals(other.getClass())) { return getClass().getName().compareTo(other.getClass().getName()); } @@ -31876,7 +32335,7 @@ public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache. @Override public String toString() { - StringBuilder sb = new StringBuilder("describe_keyspaces_result("); + StringBuilder sb = new StringBuilder("describe_schema_versions_result("); boolean first = true; sb.append("success:"); @@ -31919,15 +32378,15 @@ private void readObject(java.io.ObjectInputStream in) throws java.io.IOException } } - private static class describe_keyspaces_resultStandardSchemeFactory implements SchemeFactory { - public describe_keyspaces_resultStandardScheme getScheme() { - return new describe_keyspaces_resultStandardScheme(); + private static class describe_schema_versions_resultStandardSchemeFactory implements SchemeFactory { + public describe_schema_versions_resultStandardScheme getScheme() { + return new describe_schema_versions_resultStandardScheme(); } } - private static class describe_keyspaces_resultStandardScheme extends StandardScheme { + private static class describe_schema_versions_resultStandardScheme extends StandardScheme { - public void read(org.apache.thrift.protocol.TProtocol iprot, describe_keyspaces_result struct) throws org.apache.thrift.TException { + public void read(org.apache.thrift.protocol.TProtocol iprot, describe_schema_versions_result struct) throws org.apache.thrift.TException { org.apache.thrift.protocol.TField schemeField; iprot.readStructBegin(); while (true) @@ -31938,18 +32397,29 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, describe_keyspaces_ } switch (schemeField.id) { case 0: // SUCCESS - if (schemeField.type == org.apache.thrift.protocol.TType.LIST) { + if (schemeField.type == org.apache.thrift.protocol.TType.MAP) { { - org.apache.thrift.protocol.TList _list382 = iprot.readListBegin(); - struct.success = new ArrayList(_list382.size); - for (int _i383 = 0; _i383 < _list382.size; ++_i383) + org.apache.thrift.protocol.TMap _map380 = iprot.readMapBegin(); + struct.success = new HashMap>(2*_map380.size); + for (int _i381 = 0; _i381 < _map380.size; ++_i381) { - KsDef _elem384; - _elem384 = new KsDef(); - _elem384.read(iprot); - struct.success.add(_elem384); + String _key382; + List _val383; + _key382 = iprot.readString(); + { + org.apache.thrift.protocol.TList _list384 = iprot.readListBegin(); + _val383 = new ArrayList(_list384.size); + for (int _i385 = 0; _i385 < _list384.size; ++_i385) + { + String _elem386; + _elem386 = iprot.readString(); + _val383.add(_elem386); + } + iprot.readListEnd(); + } + struct.success.put(_key382, _val383); } - iprot.readListEnd(); + iprot.readMapEnd(); } struct.setSuccessIsSet(true); } else { @@ -31976,19 +32446,27 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, describe_keyspaces_ struct.validate(); } - public void write(org.apache.thrift.protocol.TProtocol oprot, describe_keyspaces_result struct) throws org.apache.thrift.TException { + public void write(org.apache.thrift.protocol.TProtocol oprot, describe_schema_versions_result struct) throws org.apache.thrift.TException { struct.validate(); oprot.writeStructBegin(STRUCT_DESC); if (struct.success != null) { oprot.writeFieldBegin(SUCCESS_FIELD_DESC); { - oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.success.size())); - for (KsDef _iter385 : struct.success) + oprot.writeMapBegin(new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.LIST, struct.success.size())); + for (Map.Entry> _iter387 : struct.success.entrySet()) { - _iter385.write(oprot); + oprot.writeString(_iter387.getKey()); + { + oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, _iter387.getValue().size())); + for (String _iter388 : _iter387.getValue()) + { + oprot.writeString(_iter388); + } + oprot.writeListEnd(); + } } - oprot.writeListEnd(); + oprot.writeMapEnd(); } oprot.writeFieldEnd(); } @@ -32003,16 +32481,16 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, describe_keyspaces } - private static class describe_keyspaces_resultTupleSchemeFactory implements SchemeFactory { - public describe_keyspaces_resultTupleScheme getScheme() { - return new describe_keyspaces_resultTupleScheme(); + private static class describe_schema_versions_resultTupleSchemeFactory implements SchemeFactory { + public describe_schema_versions_resultTupleScheme getScheme() { + return new describe_schema_versions_resultTupleScheme(); } } - private static class describe_keyspaces_resultTupleScheme extends TupleScheme { + private static class describe_schema_versions_resultTupleScheme extends TupleScheme { @Override - public void write(org.apache.thrift.protocol.TProtocol prot, describe_keyspaces_result struct) throws org.apache.thrift.TException { + public void write(org.apache.thrift.protocol.TProtocol prot, describe_schema_versions_result struct) throws org.apache.thrift.TException { TTupleProtocol oprot = (TTupleProtocol) prot; BitSet optionals = new BitSet(); if (struct.isSetSuccess()) { @@ -32025,9 +32503,16 @@ public void write(org.apache.thrift.protocol.TProtocol prot, describe_keyspaces_ if (struct.isSetSuccess()) { { oprot.writeI32(struct.success.size()); - for (KsDef _iter386 : struct.success) + for (Map.Entry> _iter389 : struct.success.entrySet()) { - _iter386.write(oprot); + oprot.writeString(_iter389.getKey()); + { + oprot.writeI32(_iter389.getValue().size()); + for (String _iter390 : _iter389.getValue()) + { + oprot.writeString(_iter390); + } + } } } } @@ -32037,19 +32522,29 @@ public void write(org.apache.thrift.protocol.TProtocol prot, describe_keyspaces_ } @Override - public void read(org.apache.thrift.protocol.TProtocol prot, describe_keyspaces_result struct) throws org.apache.thrift.TException { + public void read(org.apache.thrift.protocol.TProtocol prot, describe_schema_versions_result struct) throws org.apache.thrift.TException { TTupleProtocol iprot = (TTupleProtocol) prot; BitSet incoming = iprot.readBitSet(2); if (incoming.get(0)) { { - org.apache.thrift.protocol.TList _list387 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32()); - struct.success = new ArrayList(_list387.size); - for (int _i388 = 0; _i388 < _list387.size; ++_i388) + org.apache.thrift.protocol.TMap _map391 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.LIST, iprot.readI32()); + struct.success = new HashMap>(2*_map391.size); + for (int _i392 = 0; _i392 < _map391.size; ++_i392) { - KsDef _elem389; - _elem389 = new KsDef(); - _elem389.read(iprot); - struct.success.add(_elem389); + String _key393; + List _val394; + _key393 = iprot.readString(); + { + org.apache.thrift.protocol.TList _list395 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32()); + _val394 = new ArrayList(_list395.size); + for (int _i396 = 0; _i396 < _list395.size; ++_i396) + { + String _elem397; + _elem397 = iprot.readString(); + _val394.add(_elem397); + } + } + struct.success.put(_key393, _val394); } } struct.setSuccessIsSet(true); @@ -32064,14 +32559,14 @@ public void read(org.apache.thrift.protocol.TProtocol prot, describe_keyspaces_r } - public static class describe_cluster_name_args implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { - private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("describe_cluster_name_args"); + public static class describe_keyspaces_args implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { + private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("describe_keyspaces_args"); private static final Map, SchemeFactory> schemes = new HashMap, SchemeFactory>(); static { - schemes.put(StandardScheme.class, new describe_cluster_name_argsStandardSchemeFactory()); - schemes.put(TupleScheme.class, new describe_cluster_name_argsTupleSchemeFactory()); + schemes.put(StandardScheme.class, new describe_keyspaces_argsStandardSchemeFactory()); + schemes.put(TupleScheme.class, new describe_keyspaces_argsTupleSchemeFactory()); } @@ -32134,20 +32629,20 @@ public String getFieldName() { static { Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); metaDataMap = Collections.unmodifiableMap(tmpMap); - org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(describe_cluster_name_args.class, metaDataMap); + org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(describe_keyspaces_args.class, metaDataMap); } - public describe_cluster_name_args() { + public describe_keyspaces_args() { } /** * Performs a deep copy on other. */ - public describe_cluster_name_args(describe_cluster_name_args other) { + public describe_keyspaces_args(describe_keyspaces_args other) { } - public describe_cluster_name_args deepCopy() { - return new describe_cluster_name_args(this); + public describe_keyspaces_args deepCopy() { + return new describe_keyspaces_args(this); } @Override @@ -32180,12 +32675,12 @@ public boolean isSet(_Fields field) { public boolean equals(Object that) { if (that == null) return false; - if (that instanceof describe_cluster_name_args) - return this.equals((describe_cluster_name_args)that); + if (that instanceof describe_keyspaces_args) + return this.equals((describe_keyspaces_args)that); return false; } - public boolean equals(describe_cluster_name_args that) { + public boolean equals(describe_keyspaces_args that) { if (that == null) return false; @@ -32200,7 +32695,7 @@ public int hashCode() { } @Override - public int compareTo(describe_cluster_name_args other) { + public int compareTo(describe_keyspaces_args other) { if (!getClass().equals(other.getClass())) { return getClass().getName().compareTo(other.getClass().getName()); } @@ -32224,7 +32719,7 @@ public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache. @Override public String toString() { - StringBuilder sb = new StringBuilder("describe_cluster_name_args("); + StringBuilder sb = new StringBuilder("describe_keyspaces_args("); boolean first = true; sb.append(")"); @@ -32252,15 +32747,15 @@ private void readObject(java.io.ObjectInputStream in) throws java.io.IOException } } - private static class describe_cluster_name_argsStandardSchemeFactory implements SchemeFactory { - public describe_cluster_name_argsStandardScheme getScheme() { - return new describe_cluster_name_argsStandardScheme(); + private static class describe_keyspaces_argsStandardSchemeFactory implements SchemeFactory { + public describe_keyspaces_argsStandardScheme getScheme() { + return new describe_keyspaces_argsStandardScheme(); } } - private static class describe_cluster_name_argsStandardScheme extends StandardScheme { + private static class describe_keyspaces_argsStandardScheme extends StandardScheme { - public void read(org.apache.thrift.protocol.TProtocol iprot, describe_cluster_name_args struct) throws org.apache.thrift.TException { + public void read(org.apache.thrift.protocol.TProtocol iprot, describe_keyspaces_args struct) throws org.apache.thrift.TException { org.apache.thrift.protocol.TField schemeField; iprot.readStructBegin(); while (true) @@ -32281,7 +32776,7 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, describe_cluster_na struct.validate(); } - public void write(org.apache.thrift.protocol.TProtocol oprot, describe_cluster_name_args struct) throws org.apache.thrift.TException { + public void write(org.apache.thrift.protocol.TProtocol oprot, describe_keyspaces_args struct) throws org.apache.thrift.TException { struct.validate(); oprot.writeStructBegin(STRUCT_DESC); @@ -32291,43 +32786,46 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, describe_cluster_n } - private static class describe_cluster_name_argsTupleSchemeFactory implements SchemeFactory { - public describe_cluster_name_argsTupleScheme getScheme() { - return new describe_cluster_name_argsTupleScheme(); + private static class describe_keyspaces_argsTupleSchemeFactory implements SchemeFactory { + public describe_keyspaces_argsTupleScheme getScheme() { + return new describe_keyspaces_argsTupleScheme(); } } - private static class describe_cluster_name_argsTupleScheme extends TupleScheme { + private static class describe_keyspaces_argsTupleScheme extends TupleScheme { @Override - public void write(org.apache.thrift.protocol.TProtocol prot, describe_cluster_name_args struct) throws org.apache.thrift.TException { + public void write(org.apache.thrift.protocol.TProtocol prot, describe_keyspaces_args struct) throws org.apache.thrift.TException { TTupleProtocol oprot = (TTupleProtocol) prot; } @Override - public void read(org.apache.thrift.protocol.TProtocol prot, describe_cluster_name_args struct) throws org.apache.thrift.TException { + public void read(org.apache.thrift.protocol.TProtocol prot, describe_keyspaces_args struct) throws org.apache.thrift.TException { TTupleProtocol iprot = (TTupleProtocol) prot; } } } - public static class describe_cluster_name_result implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { - private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("describe_cluster_name_result"); + public static class describe_keyspaces_result implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { + private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("describe_keyspaces_result"); - private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField("success", org.apache.thrift.protocol.TType.STRING, (short)0); + private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField("success", org.apache.thrift.protocol.TType.LIST, (short)0); + private static final org.apache.thrift.protocol.TField IRE_FIELD_DESC = new org.apache.thrift.protocol.TField("ire", org.apache.thrift.protocol.TType.STRUCT, (short)1); private static final Map, SchemeFactory> schemes = new HashMap, SchemeFactory>(); static { - schemes.put(StandardScheme.class, new describe_cluster_name_resultStandardSchemeFactory()); - schemes.put(TupleScheme.class, new describe_cluster_name_resultTupleSchemeFactory()); + schemes.put(StandardScheme.class, new describe_keyspaces_resultStandardSchemeFactory()); + schemes.put(TupleScheme.class, new describe_keyspaces_resultTupleSchemeFactory()); } - public String success; // required + public List success; // required + public InvalidRequestException ire; // required /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */ public enum _Fields implements org.apache.thrift.TFieldIdEnum { - SUCCESS((short)0, "success"); + SUCCESS((short)0, "success"), + IRE((short)1, "ire"); private static final Map byName = new HashMap(); @@ -32344,6 +32842,8 @@ public static _Fields findByThriftId(int fieldId) { switch(fieldId) { case 0: // SUCCESS return SUCCESS; + case 1: // IRE + return IRE; default: return null; } @@ -32388,44 +32888,72 @@ public String getFieldName() { static { Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); tmpMap.put(_Fields.SUCCESS, new org.apache.thrift.meta_data.FieldMetaData("success", org.apache.thrift.TFieldRequirementType.DEFAULT, - new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING))); + new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, + new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, KsDef.class)))); + tmpMap.put(_Fields.IRE, new org.apache.thrift.meta_data.FieldMetaData("ire", org.apache.thrift.TFieldRequirementType.DEFAULT, + new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRUCT))); metaDataMap = Collections.unmodifiableMap(tmpMap); - org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(describe_cluster_name_result.class, metaDataMap); + org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(describe_keyspaces_result.class, metaDataMap); } - public describe_cluster_name_result() { + public describe_keyspaces_result() { } - public describe_cluster_name_result( - String success) + public describe_keyspaces_result( + List success, + InvalidRequestException ire) { this(); this.success = success; + this.ire = ire; } /** * Performs a deep copy on other. */ - public describe_cluster_name_result(describe_cluster_name_result other) { + public describe_keyspaces_result(describe_keyspaces_result other) { if (other.isSetSuccess()) { - this.success = other.success; + List __this__success = new ArrayList(other.success.size()); + for (KsDef other_element : other.success) { + __this__success.add(new KsDef(other_element)); + } + this.success = __this__success; + } + if (other.isSetIre()) { + this.ire = new InvalidRequestException(other.ire); } } - public describe_cluster_name_result deepCopy() { - return new describe_cluster_name_result(this); + public describe_keyspaces_result deepCopy() { + return new describe_keyspaces_result(this); } @Override public void clear() { this.success = null; + this.ire = null; } - public String getSuccess() { + public int getSuccessSize() { + return (this.success == null) ? 0 : this.success.size(); + } + + public java.util.Iterator getSuccessIterator() { + return (this.success == null) ? null : this.success.iterator(); + } + + public void addToSuccess(KsDef elem) { + if (this.success == null) { + this.success = new ArrayList(); + } + this.success.add(elem); + } + + public List getSuccess() { return this.success; } - public describe_cluster_name_result setSuccess(String success) { + public describe_keyspaces_result setSuccess(List success) { this.success = success; return this; } @@ -32445,13 +32973,45 @@ public void setSuccessIsSet(boolean value) { } } + public InvalidRequestException getIre() { + return this.ire; + } + + public describe_keyspaces_result setIre(InvalidRequestException ire) { + this.ire = ire; + return this; + } + + public void unsetIre() { + this.ire = null; + } + + /** Returns true if field ire is set (has been assigned a value) and false otherwise */ + public boolean isSetIre() { + return this.ire != null; + } + + public void setIreIsSet(boolean value) { + if (!value) { + this.ire = null; + } + } + public void setFieldValue(_Fields field, Object value) { switch (field) { case SUCCESS: if (value == null) { unsetSuccess(); } else { - setSuccess((String)value); + setSuccess((List)value); + } + break; + + case IRE: + if (value == null) { + unsetIre(); + } else { + setIre((InvalidRequestException)value); } break; @@ -32463,6 +33023,9 @@ public Object getFieldValue(_Fields field) { case SUCCESS: return getSuccess(); + case IRE: + return getIre(); + } throw new IllegalStateException(); } @@ -32476,6 +33039,8 @@ public boolean isSet(_Fields field) { switch (field) { case SUCCESS: return isSetSuccess(); + case IRE: + return isSetIre(); } throw new IllegalStateException(); } @@ -32484,12 +33049,12 @@ public boolean isSet(_Fields field) { public boolean equals(Object that) { if (that == null) return false; - if (that instanceof describe_cluster_name_result) - return this.equals((describe_cluster_name_result)that); + if (that instanceof describe_keyspaces_result) + return this.equals((describe_keyspaces_result)that); return false; } - public boolean equals(describe_cluster_name_result that) { + public boolean equals(describe_keyspaces_result that) { if (that == null) return false; @@ -32502,6 +33067,15 @@ public boolean equals(describe_cluster_name_result that) { return false; } + boolean this_present_ire = true && this.isSetIre(); + boolean that_present_ire = true && that.isSetIre(); + if (this_present_ire || that_present_ire) { + if (!(this_present_ire && that_present_ire)) + return false; + if (!this.ire.equals(that.ire)) + return false; + } + return true; } @@ -32514,11 +33088,16 @@ public int hashCode() { if (present_success) builder.append(success); + boolean present_ire = true && (isSetIre()); + builder.append(present_ire); + if (present_ire) + builder.append(ire); + return builder.toHashCode(); } @Override - public int compareTo(describe_cluster_name_result other) { + public int compareTo(describe_keyspaces_result other) { if (!getClass().equals(other.getClass())) { return getClass().getName().compareTo(other.getClass().getName()); } @@ -32535,6 +33114,16 @@ public int compareTo(describe_cluster_name_result other) { return lastComparison; } } + lastComparison = Boolean.valueOf(isSetIre()).compareTo(other.isSetIre()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetIre()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.ire, other.ire); + if (lastComparison != 0) { + return lastComparison; + } + } return 0; } @@ -32552,7 +33141,683 @@ public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache. @Override public String toString() { - StringBuilder sb = new StringBuilder("describe_cluster_name_result("); + StringBuilder sb = new StringBuilder("describe_keyspaces_result("); + boolean first = true; + + sb.append("success:"); + if (this.success == null) { + sb.append("null"); + } else { + sb.append(this.success); + } + first = false; + if (!first) sb.append(", "); + sb.append("ire:"); + if (this.ire == null) { + sb.append("null"); + } else { + sb.append(this.ire); + } + first = false; + sb.append(")"); + return sb.toString(); + } + + public void validate() throws org.apache.thrift.TException { + // check for required fields + // check for sub-struct validity + } + + private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException { + try { + write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out))); + } catch (org.apache.thrift.TException te) { + throw new java.io.IOException(te); + } + } + + private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException { + try { + read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in))); + } catch (org.apache.thrift.TException te) { + throw new java.io.IOException(te); + } + } + + private static class describe_keyspaces_resultStandardSchemeFactory implements SchemeFactory { + public describe_keyspaces_resultStandardScheme getScheme() { + return new describe_keyspaces_resultStandardScheme(); + } + } + + private static class describe_keyspaces_resultStandardScheme extends StandardScheme { + + public void read(org.apache.thrift.protocol.TProtocol iprot, describe_keyspaces_result struct) throws org.apache.thrift.TException { + org.apache.thrift.protocol.TField schemeField; + iprot.readStructBegin(); + while (true) + { + schemeField = iprot.readFieldBegin(); + if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { + break; + } + switch (schemeField.id) { + case 0: // SUCCESS + if (schemeField.type == org.apache.thrift.protocol.TType.LIST) { + { + org.apache.thrift.protocol.TList _list398 = iprot.readListBegin(); + struct.success = new ArrayList(_list398.size); + for (int _i399 = 0; _i399 < _list398.size; ++_i399) + { + KsDef _elem400; + _elem400 = new KsDef(); + _elem400.read(iprot); + struct.success.add(_elem400); + } + iprot.readListEnd(); + } + struct.setSuccessIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + case 1: // IRE + if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) { + struct.ire = new InvalidRequestException(); + struct.ire.read(iprot); + struct.setIreIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + default: + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + iprot.readFieldEnd(); + } + iprot.readStructEnd(); + + // check for required fields of primitive type, which can't be checked in the validate method + struct.validate(); + } + + public void write(org.apache.thrift.protocol.TProtocol oprot, describe_keyspaces_result struct) throws org.apache.thrift.TException { + struct.validate(); + + oprot.writeStructBegin(STRUCT_DESC); + if (struct.success != null) { + oprot.writeFieldBegin(SUCCESS_FIELD_DESC); + { + oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.success.size())); + for (KsDef _iter401 : struct.success) + { + _iter401.write(oprot); + } + oprot.writeListEnd(); + } + oprot.writeFieldEnd(); + } + if (struct.ire != null) { + oprot.writeFieldBegin(IRE_FIELD_DESC); + struct.ire.write(oprot); + oprot.writeFieldEnd(); + } + oprot.writeFieldStop(); + oprot.writeStructEnd(); + } + + } + + private static class describe_keyspaces_resultTupleSchemeFactory implements SchemeFactory { + public describe_keyspaces_resultTupleScheme getScheme() { + return new describe_keyspaces_resultTupleScheme(); + } + } + + private static class describe_keyspaces_resultTupleScheme extends TupleScheme { + + @Override + public void write(org.apache.thrift.protocol.TProtocol prot, describe_keyspaces_result struct) throws org.apache.thrift.TException { + TTupleProtocol oprot = (TTupleProtocol) prot; + BitSet optionals = new BitSet(); + if (struct.isSetSuccess()) { + optionals.set(0); + } + if (struct.isSetIre()) { + optionals.set(1); + } + oprot.writeBitSet(optionals, 2); + if (struct.isSetSuccess()) { + { + oprot.writeI32(struct.success.size()); + for (KsDef _iter402 : struct.success) + { + _iter402.write(oprot); + } + } + } + if (struct.isSetIre()) { + struct.ire.write(oprot); + } + } + + @Override + public void read(org.apache.thrift.protocol.TProtocol prot, describe_keyspaces_result struct) throws org.apache.thrift.TException { + TTupleProtocol iprot = (TTupleProtocol) prot; + BitSet incoming = iprot.readBitSet(2); + if (incoming.get(0)) { + { + org.apache.thrift.protocol.TList _list403 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32()); + struct.success = new ArrayList(_list403.size); + for (int _i404 = 0; _i404 < _list403.size; ++_i404) + { + KsDef _elem405; + _elem405 = new KsDef(); + _elem405.read(iprot); + struct.success.add(_elem405); + } + } + struct.setSuccessIsSet(true); + } + if (incoming.get(1)) { + struct.ire = new InvalidRequestException(); + struct.ire.read(iprot); + struct.setIreIsSet(true); + } + } + } + + } + + public static class describe_cluster_name_args implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { + private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("describe_cluster_name_args"); + + + private static final Map, SchemeFactory> schemes = new HashMap, SchemeFactory>(); + static { + schemes.put(StandardScheme.class, new describe_cluster_name_argsStandardSchemeFactory()); + schemes.put(TupleScheme.class, new describe_cluster_name_argsTupleSchemeFactory()); + } + + + /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */ + public enum _Fields implements org.apache.thrift.TFieldIdEnum { +; + + private static final Map byName = new HashMap(); + + static { + for (_Fields field : EnumSet.allOf(_Fields.class)) { + byName.put(field.getFieldName(), field); + } + } + + /** + * Find the _Fields constant that matches fieldId, or null if its not found. + */ + public static _Fields findByThriftId(int fieldId) { + switch(fieldId) { + default: + return null; + } + } + + /** + * Find the _Fields constant that matches fieldId, throwing an exception + * if it is not found. + */ + public static _Fields findByThriftIdOrThrow(int fieldId) { + _Fields fields = findByThriftId(fieldId); + if (fields == null) throw new IllegalArgumentException("Field " + fieldId + " doesn't exist!"); + return fields; + } + + /** + * Find the _Fields constant that matches name, or null if its not found. + */ + public static _Fields findByName(String name) { + return byName.get(name); + } + + private final short _thriftId; + private final String _fieldName; + + _Fields(short thriftId, String fieldName) { + _thriftId = thriftId; + _fieldName = fieldName; + } + + public short getThriftFieldId() { + return _thriftId; + } + + public String getFieldName() { + return _fieldName; + } + } + public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap; + static { + Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); + metaDataMap = Collections.unmodifiableMap(tmpMap); + org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(describe_cluster_name_args.class, metaDataMap); + } + + public describe_cluster_name_args() { + } + + /** + * Performs a deep copy on other. + */ + public describe_cluster_name_args(describe_cluster_name_args other) { + } + + public describe_cluster_name_args deepCopy() { + return new describe_cluster_name_args(this); + } + + @Override + public void clear() { + } + + public void setFieldValue(_Fields field, Object value) { + switch (field) { + } + } + + public Object getFieldValue(_Fields field) { + switch (field) { + } + throw new IllegalStateException(); + } + + /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */ + public boolean isSet(_Fields field) { + if (field == null) { + throw new IllegalArgumentException(); + } + + switch (field) { + } + throw new IllegalStateException(); + } + + @Override + public boolean equals(Object that) { + if (that == null) + return false; + if (that instanceof describe_cluster_name_args) + return this.equals((describe_cluster_name_args)that); + return false; + } + + public boolean equals(describe_cluster_name_args that) { + if (that == null) + return false; + + return true; + } + + @Override + public int hashCode() { + HashCodeBuilder builder = new HashCodeBuilder(); + + return builder.toHashCode(); + } + + @Override + public int compareTo(describe_cluster_name_args other) { + if (!getClass().equals(other.getClass())) { + return getClass().getName().compareTo(other.getClass().getName()); + } + + int lastComparison = 0; + + return 0; + } + + public _Fields fieldForId(int fieldId) { + return _Fields.findByThriftId(fieldId); + } + + public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException { + schemes.get(iprot.getScheme()).getScheme().read(iprot, this); + } + + public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException { + schemes.get(oprot.getScheme()).getScheme().write(oprot, this); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("describe_cluster_name_args("); + boolean first = true; + + sb.append(")"); + return sb.toString(); + } + + public void validate() throws org.apache.thrift.TException { + // check for required fields + // check for sub-struct validity + } + + private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException { + try { + write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out))); + } catch (org.apache.thrift.TException te) { + throw new java.io.IOException(te); + } + } + + private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException { + try { + read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in))); + } catch (org.apache.thrift.TException te) { + throw new java.io.IOException(te); + } + } + + private static class describe_cluster_name_argsStandardSchemeFactory implements SchemeFactory { + public describe_cluster_name_argsStandardScheme getScheme() { + return new describe_cluster_name_argsStandardScheme(); + } + } + + private static class describe_cluster_name_argsStandardScheme extends StandardScheme { + + public void read(org.apache.thrift.protocol.TProtocol iprot, describe_cluster_name_args struct) throws org.apache.thrift.TException { + org.apache.thrift.protocol.TField schemeField; + iprot.readStructBegin(); + while (true) + { + schemeField = iprot.readFieldBegin(); + if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { + break; + } + switch (schemeField.id) { + default: + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + iprot.readFieldEnd(); + } + iprot.readStructEnd(); + + // check for required fields of primitive type, which can't be checked in the validate method + struct.validate(); + } + + public void write(org.apache.thrift.protocol.TProtocol oprot, describe_cluster_name_args struct) throws org.apache.thrift.TException { + struct.validate(); + + oprot.writeStructBegin(STRUCT_DESC); + oprot.writeFieldStop(); + oprot.writeStructEnd(); + } + + } + + private static class describe_cluster_name_argsTupleSchemeFactory implements SchemeFactory { + public describe_cluster_name_argsTupleScheme getScheme() { + return new describe_cluster_name_argsTupleScheme(); + } + } + + private static class describe_cluster_name_argsTupleScheme extends TupleScheme { + + @Override + public void write(org.apache.thrift.protocol.TProtocol prot, describe_cluster_name_args struct) throws org.apache.thrift.TException { + TTupleProtocol oprot = (TTupleProtocol) prot; + } + + @Override + public void read(org.apache.thrift.protocol.TProtocol prot, describe_cluster_name_args struct) throws org.apache.thrift.TException { + TTupleProtocol iprot = (TTupleProtocol) prot; + } + } + + } + + public static class describe_cluster_name_result implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { + private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("describe_cluster_name_result"); + + private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField("success", org.apache.thrift.protocol.TType.STRING, (short)0); + + private static final Map, SchemeFactory> schemes = new HashMap, SchemeFactory>(); + static { + schemes.put(StandardScheme.class, new describe_cluster_name_resultStandardSchemeFactory()); + schemes.put(TupleScheme.class, new describe_cluster_name_resultTupleSchemeFactory()); + } + + public String success; // required + + /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */ + public enum _Fields implements org.apache.thrift.TFieldIdEnum { + SUCCESS((short)0, "success"); + + private static final Map byName = new HashMap(); + + static { + for (_Fields field : EnumSet.allOf(_Fields.class)) { + byName.put(field.getFieldName(), field); + } + } + + /** + * Find the _Fields constant that matches fieldId, or null if its not found. + */ + public static _Fields findByThriftId(int fieldId) { + switch(fieldId) { + case 0: // SUCCESS + return SUCCESS; + default: + return null; + } + } + + /** + * Find the _Fields constant that matches fieldId, throwing an exception + * if it is not found. + */ + public static _Fields findByThriftIdOrThrow(int fieldId) { + _Fields fields = findByThriftId(fieldId); + if (fields == null) throw new IllegalArgumentException("Field " + fieldId + " doesn't exist!"); + return fields; + } + + /** + * Find the _Fields constant that matches name, or null if its not found. + */ + public static _Fields findByName(String name) { + return byName.get(name); + } + + private final short _thriftId; + private final String _fieldName; + + _Fields(short thriftId, String fieldName) { + _thriftId = thriftId; + _fieldName = fieldName; + } + + public short getThriftFieldId() { + return _thriftId; + } + + public String getFieldName() { + return _fieldName; + } + } + + // isset id assignments + public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap; + static { + Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); + tmpMap.put(_Fields.SUCCESS, new org.apache.thrift.meta_data.FieldMetaData("success", org.apache.thrift.TFieldRequirementType.DEFAULT, + new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING))); + metaDataMap = Collections.unmodifiableMap(tmpMap); + org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(describe_cluster_name_result.class, metaDataMap); + } + + public describe_cluster_name_result() { + } + + public describe_cluster_name_result( + String success) + { + this(); + this.success = success; + } + + /** + * Performs a deep copy on other. + */ + public describe_cluster_name_result(describe_cluster_name_result other) { + if (other.isSetSuccess()) { + this.success = other.success; + } + } + + public describe_cluster_name_result deepCopy() { + return new describe_cluster_name_result(this); + } + + @Override + public void clear() { + this.success = null; + } + + public String getSuccess() { + return this.success; + } + + public describe_cluster_name_result setSuccess(String success) { + this.success = success; + return this; + } + + public void unsetSuccess() { + this.success = null; + } + + /** Returns true if field success is set (has been assigned a value) and false otherwise */ + public boolean isSetSuccess() { + return this.success != null; + } + + public void setSuccessIsSet(boolean value) { + if (!value) { + this.success = null; + } + } + + public void setFieldValue(_Fields field, Object value) { + switch (field) { + case SUCCESS: + if (value == null) { + unsetSuccess(); + } else { + setSuccess((String)value); + } + break; + + } + } + + public Object getFieldValue(_Fields field) { + switch (field) { + case SUCCESS: + return getSuccess(); + + } + throw new IllegalStateException(); + } + + /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */ + public boolean isSet(_Fields field) { + if (field == null) { + throw new IllegalArgumentException(); + } + + switch (field) { + case SUCCESS: + return isSetSuccess(); + } + throw new IllegalStateException(); + } + + @Override + public boolean equals(Object that) { + if (that == null) + return false; + if (that instanceof describe_cluster_name_result) + return this.equals((describe_cluster_name_result)that); + return false; + } + + public boolean equals(describe_cluster_name_result that) { + if (that == null) + return false; + + boolean this_present_success = true && this.isSetSuccess(); + boolean that_present_success = true && that.isSetSuccess(); + if (this_present_success || that_present_success) { + if (!(this_present_success && that_present_success)) + return false; + if (!this.success.equals(that.success)) + return false; + } + + return true; + } + + @Override + public int hashCode() { + HashCodeBuilder builder = new HashCodeBuilder(); + + boolean present_success = true && (isSetSuccess()); + builder.append(present_success); + if (present_success) + builder.append(success); + + return builder.toHashCode(); + } + + @Override + public int compareTo(describe_cluster_name_result other) { + if (!getClass().equals(other.getClass())) { + return getClass().getName().compareTo(other.getClass().getName()); + } + + int lastComparison = 0; + + lastComparison = Boolean.valueOf(isSetSuccess()).compareTo(other.isSetSuccess()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetSuccess()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.success, other.success); + if (lastComparison != 0) { + return lastComparison; + } + } + return 0; + } + + public _Fields fieldForId(int fieldId) { + return _Fields.findByThriftId(fieldId); + } + + public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException { + schemes.get(iprot.getScheme()).getScheme().read(iprot, this); + } + + public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException { + schemes.get(oprot.getScheme()).getScheme().write(oprot, this); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("describe_cluster_name_result("); boolean first = true; sb.append("success:"); @@ -34034,14 +35299,14 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, describe_ring_resul case 0: // SUCCESS if (schemeField.type == org.apache.thrift.protocol.TType.LIST) { { - org.apache.thrift.protocol.TList _list390 = iprot.readListBegin(); - struct.success = new ArrayList(_list390.size); - for (int _i391 = 0; _i391 < _list390.size; ++_i391) + org.apache.thrift.protocol.TList _list406 = iprot.readListBegin(); + struct.success = new ArrayList(_list406.size); + for (int _i407 = 0; _i407 < _list406.size; ++_i407) { - TokenRange _elem392; - _elem392 = new TokenRange(); - _elem392.read(iprot); - struct.success.add(_elem392); + TokenRange _elem408; + _elem408 = new TokenRange(); + _elem408.read(iprot); + struct.success.add(_elem408); } iprot.readListEnd(); } @@ -34078,9 +35343,9 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, describe_ring_resu oprot.writeFieldBegin(SUCCESS_FIELD_DESC); { oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.success.size())); - for (TokenRange _iter393 : struct.success) + for (TokenRange _iter409 : struct.success) { - _iter393.write(oprot); + _iter409.write(oprot); } oprot.writeListEnd(); } @@ -34119,9 +35384,9 @@ public void write(org.apache.thrift.protocol.TProtocol prot, describe_ring_resul if (struct.isSetSuccess()) { { oprot.writeI32(struct.success.size()); - for (TokenRange _iter394 : struct.success) + for (TokenRange _iter410 : struct.success) { - _iter394.write(oprot); + _iter410.write(oprot); } } } @@ -34136,14 +35401,14 @@ public void read(org.apache.thrift.protocol.TProtocol prot, describe_ring_result BitSet incoming = iprot.readBitSet(2); if (incoming.get(0)) { { - org.apache.thrift.protocol.TList _list395 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32()); - struct.success = new ArrayList(_list395.size); - for (int _i396 = 0; _i396 < _list395.size; ++_i396) + org.apache.thrift.protocol.TList _list411 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32()); + struct.success = new ArrayList(_list411.size); + for (int _i412 = 0; _i412 < _list411.size; ++_i412) { - TokenRange _elem397; - _elem397 = new TokenRange(); - _elem397.read(iprot); - struct.success.add(_elem397); + TokenRange _elem413; + _elem413 = new TokenRange(); + _elem413.read(iprot); + struct.success.add(_elem413); } } struct.setSuccessIsSet(true); @@ -34910,14 +36175,14 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, describe_local_ring case 0: // SUCCESS if (schemeField.type == org.apache.thrift.protocol.TType.LIST) { { - org.apache.thrift.protocol.TList _list398 = iprot.readListBegin(); - struct.success = new ArrayList(_list398.size); - for (int _i399 = 0; _i399 < _list398.size; ++_i399) + org.apache.thrift.protocol.TList _list414 = iprot.readListBegin(); + struct.success = new ArrayList(_list414.size); + for (int _i415 = 0; _i415 < _list414.size; ++_i415) { - TokenRange _elem400; - _elem400 = new TokenRange(); - _elem400.read(iprot); - struct.success.add(_elem400); + TokenRange _elem416; + _elem416 = new TokenRange(); + _elem416.read(iprot); + struct.success.add(_elem416); } iprot.readListEnd(); } @@ -34954,9 +36219,9 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, describe_local_rin oprot.writeFieldBegin(SUCCESS_FIELD_DESC); { oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.success.size())); - for (TokenRange _iter401 : struct.success) + for (TokenRange _iter417 : struct.success) { - _iter401.write(oprot); + _iter417.write(oprot); } oprot.writeListEnd(); } @@ -34995,9 +36260,9 @@ public void write(org.apache.thrift.protocol.TProtocol prot, describe_local_ring if (struct.isSetSuccess()) { { oprot.writeI32(struct.success.size()); - for (TokenRange _iter402 : struct.success) + for (TokenRange _iter418 : struct.success) { - _iter402.write(oprot); + _iter418.write(oprot); } } } @@ -35012,14 +36277,14 @@ public void read(org.apache.thrift.protocol.TProtocol prot, describe_local_ring_ BitSet incoming = iprot.readBitSet(2); if (incoming.get(0)) { { - org.apache.thrift.protocol.TList _list403 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32()); - struct.success = new ArrayList(_list403.size); - for (int _i404 = 0; _i404 < _list403.size; ++_i404) + org.apache.thrift.protocol.TList _list419 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32()); + struct.success = new ArrayList(_list419.size); + for (int _i420 = 0; _i420 < _list419.size; ++_i420) { - TokenRange _elem405; - _elem405 = new TokenRange(); - _elem405.read(iprot); - struct.success.add(_elem405); + TokenRange _elem421; + _elem421 = new TokenRange(); + _elem421.read(iprot); + struct.success.add(_elem421); } } struct.setSuccessIsSet(true); @@ -35674,15 +36939,15 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, describe_token_map_ case 0: // SUCCESS if (schemeField.type == org.apache.thrift.protocol.TType.MAP) { { - org.apache.thrift.protocol.TMap _map406 = iprot.readMapBegin(); - struct.success = new HashMap(2*_map406.size); - for (int _i407 = 0; _i407 < _map406.size; ++_i407) + org.apache.thrift.protocol.TMap _map422 = iprot.readMapBegin(); + struct.success = new HashMap(2*_map422.size); + for (int _i423 = 0; _i423 < _map422.size; ++_i423) { - String _key408; - String _val409; - _key408 = iprot.readString(); - _val409 = iprot.readString(); - struct.success.put(_key408, _val409); + String _key424; + String _val425; + _key424 = iprot.readString(); + _val425 = iprot.readString(); + struct.success.put(_key424, _val425); } iprot.readMapEnd(); } @@ -35719,10 +36984,10 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, describe_token_map oprot.writeFieldBegin(SUCCESS_FIELD_DESC); { oprot.writeMapBegin(new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRING, struct.success.size())); - for (Map.Entry _iter410 : struct.success.entrySet()) + for (Map.Entry _iter426 : struct.success.entrySet()) { - oprot.writeString(_iter410.getKey()); - oprot.writeString(_iter410.getValue()); + oprot.writeString(_iter426.getKey()); + oprot.writeString(_iter426.getValue()); } oprot.writeMapEnd(); } @@ -35761,10 +37026,10 @@ public void write(org.apache.thrift.protocol.TProtocol prot, describe_token_map_ if (struct.isSetSuccess()) { { oprot.writeI32(struct.success.size()); - for (Map.Entry _iter411 : struct.success.entrySet()) + for (Map.Entry _iter427 : struct.success.entrySet()) { - oprot.writeString(_iter411.getKey()); - oprot.writeString(_iter411.getValue()); + oprot.writeString(_iter427.getKey()); + oprot.writeString(_iter427.getValue()); } } } @@ -35779,15 +37044,15 @@ public void read(org.apache.thrift.protocol.TProtocol prot, describe_token_map_r BitSet incoming = iprot.readBitSet(2); if (incoming.get(0)) { { - org.apache.thrift.protocol.TMap _map412 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRING, iprot.readI32()); - struct.success = new HashMap(2*_map412.size); - for (int _i413 = 0; _i413 < _map412.size; ++_i413) + org.apache.thrift.protocol.TMap _map428 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRING, iprot.readI32()); + struct.success = new HashMap(2*_map428.size); + for (int _i429 = 0; _i429 < _map428.size; ++_i429) { - String _key414; - String _val415; - _key414 = iprot.readString(); - _val415 = iprot.readString(); - struct.success.put(_key414, _val415); + String _key430; + String _val431; + _key430 = iprot.readString(); + _val431 = iprot.readString(); + struct.success.put(_key430, _val431); } } struct.setSuccessIsSet(true); @@ -39005,13 +40270,13 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, describe_splits_res case 0: // SUCCESS if (schemeField.type == org.apache.thrift.protocol.TType.LIST) { { - org.apache.thrift.protocol.TList _list416 = iprot.readListBegin(); - struct.success = new ArrayList(_list416.size); - for (int _i417 = 0; _i417 < _list416.size; ++_i417) + org.apache.thrift.protocol.TList _list432 = iprot.readListBegin(); + struct.success = new ArrayList(_list432.size); + for (int _i433 = 0; _i433 < _list432.size; ++_i433) { - String _elem418; - _elem418 = iprot.readString(); - struct.success.add(_elem418); + String _elem434; + _elem434 = iprot.readString(); + struct.success.add(_elem434); } iprot.readListEnd(); } @@ -39048,9 +40313,9 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, describe_splits_re oprot.writeFieldBegin(SUCCESS_FIELD_DESC); { oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, struct.success.size())); - for (String _iter419 : struct.success) + for (String _iter435 : struct.success) { - oprot.writeString(_iter419); + oprot.writeString(_iter435); } oprot.writeListEnd(); } @@ -39089,9 +40354,9 @@ public void write(org.apache.thrift.protocol.TProtocol prot, describe_splits_res if (struct.isSetSuccess()) { { oprot.writeI32(struct.success.size()); - for (String _iter420 : struct.success) + for (String _iter436 : struct.success) { - oprot.writeString(_iter420); + oprot.writeString(_iter436); } } } @@ -39106,13 +40371,13 @@ public void read(org.apache.thrift.protocol.TProtocol prot, describe_splits_resu BitSet incoming = iprot.readBitSet(2); if (incoming.get(0)) { { - org.apache.thrift.protocol.TList _list421 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32()); - struct.success = new ArrayList(_list421.size); - for (int _i422 = 0; _i422 < _list421.size; ++_i422) + org.apache.thrift.protocol.TList _list437 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32()); + struct.success = new ArrayList(_list437.size); + for (int _i438 = 0; _i438 < _list437.size; ++_i438) { - String _elem423; - _elem423 = iprot.readString(); - struct.success.add(_elem423); + String _elem439; + _elem439 = iprot.readString(); + struct.success.add(_elem439); } } struct.setSuccessIsSet(true); @@ -40801,14 +42066,14 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, describe_splits_ex_ case 0: // SUCCESS if (schemeField.type == org.apache.thrift.protocol.TType.LIST) { { - org.apache.thrift.protocol.TList _list424 = iprot.readListBegin(); - struct.success = new ArrayList(_list424.size); - for (int _i425 = 0; _i425 < _list424.size; ++_i425) + org.apache.thrift.protocol.TList _list440 = iprot.readListBegin(); + struct.success = new ArrayList(_list440.size); + for (int _i441 = 0; _i441 < _list440.size; ++_i441) { - CfSplit _elem426; - _elem426 = new CfSplit(); - _elem426.read(iprot); - struct.success.add(_elem426); + CfSplit _elem442; + _elem442 = new CfSplit(); + _elem442.read(iprot); + struct.success.add(_elem442); } iprot.readListEnd(); } @@ -40845,9 +42110,9 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, describe_splits_ex oprot.writeFieldBegin(SUCCESS_FIELD_DESC); { oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.success.size())); - for (CfSplit _iter427 : struct.success) + for (CfSplit _iter443 : struct.success) { - _iter427.write(oprot); + _iter443.write(oprot); } oprot.writeListEnd(); } @@ -40886,9 +42151,9 @@ public void write(org.apache.thrift.protocol.TProtocol prot, describe_splits_ex_ if (struct.isSetSuccess()) { { oprot.writeI32(struct.success.size()); - for (CfSplit _iter428 : struct.success) + for (CfSplit _iter444 : struct.success) { - _iter428.write(oprot); + _iter444.write(oprot); } } } @@ -40903,14 +42168,14 @@ public void read(org.apache.thrift.protocol.TProtocol prot, describe_splits_ex_r BitSet incoming = iprot.readBitSet(2); if (incoming.get(0)) { { - org.apache.thrift.protocol.TList _list429 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32()); - struct.success = new ArrayList(_list429.size); - for (int _i430 = 0; _i430 < _list429.size; ++_i430) + org.apache.thrift.protocol.TList _list445 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32()); + struct.success = new ArrayList(_list445.size); + for (int _i446 = 0; _i446 < _list445.size; ++_i446) { - CfSplit _elem431; - _elem431 = new CfSplit(); - _elem431.read(iprot); - struct.success.add(_elem431); + CfSplit _elem447; + _elem447 = new CfSplit(); + _elem447.read(iprot); + struct.success.add(_elem447); } } struct.setSuccessIsSet(true); @@ -51505,13 +52770,13 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, execute_prepared_cq case 2: // VALUES if (schemeField.type == org.apache.thrift.protocol.TType.LIST) { { - org.apache.thrift.protocol.TList _list432 = iprot.readListBegin(); - struct.values = new ArrayList(_list432.size); - for (int _i433 = 0; _i433 < _list432.size; ++_i433) + org.apache.thrift.protocol.TList _list448 = iprot.readListBegin(); + struct.values = new ArrayList(_list448.size); + for (int _i449 = 0; _i449 < _list448.size; ++_i449) { - ByteBuffer _elem434; - _elem434 = iprot.readBinary(); - struct.values.add(_elem434); + ByteBuffer _elem450; + _elem450 = iprot.readBinary(); + struct.values.add(_elem450); } iprot.readListEnd(); } @@ -51545,9 +52810,9 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, execute_prepared_c oprot.writeFieldBegin(VALUES_FIELD_DESC); { oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, struct.values.size())); - for (ByteBuffer _iter435 : struct.values) + for (ByteBuffer _iter451 : struct.values) { - oprot.writeBinary(_iter435); + oprot.writeBinary(_iter451); } oprot.writeListEnd(); } @@ -51573,9 +52838,9 @@ public void write(org.apache.thrift.protocol.TProtocol prot, execute_prepared_cq oprot.writeI32(struct.itemId); { oprot.writeI32(struct.values.size()); - for (ByteBuffer _iter436 : struct.values) + for (ByteBuffer _iter452 : struct.values) { - oprot.writeBinary(_iter436); + oprot.writeBinary(_iter452); } } } @@ -51586,13 +52851,13 @@ public void read(org.apache.thrift.protocol.TProtocol prot, execute_prepared_cql struct.itemId = iprot.readI32(); struct.setItemIdIsSet(true); { - org.apache.thrift.protocol.TList _list437 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32()); - struct.values = new ArrayList(_list437.size); - for (int _i438 = 0; _i438 < _list437.size; ++_i438) + org.apache.thrift.protocol.TList _list453 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32()); + struct.values = new ArrayList(_list453.size); + for (int _i454 = 0; _i454 < _list453.size; ++_i454) { - ByteBuffer _elem439; - _elem439 = iprot.readBinary(); - struct.values.add(_elem439); + ByteBuffer _elem455; + _elem455 = iprot.readBinary(); + struct.values.add(_elem455); } } struct.setValuesIsSet(true); @@ -52903,13 +54168,13 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, execute_prepared_cq case 2: // VALUES if (schemeField.type == org.apache.thrift.protocol.TType.LIST) { { - org.apache.thrift.protocol.TList _list440 = iprot.readListBegin(); - struct.values = new ArrayList(_list440.size); - for (int _i441 = 0; _i441 < _list440.size; ++_i441) + org.apache.thrift.protocol.TList _list456 = iprot.readListBegin(); + struct.values = new ArrayList(_list456.size); + for (int _i457 = 0; _i457 < _list456.size; ++_i457) { - ByteBuffer _elem442; - _elem442 = iprot.readBinary(); - struct.values.add(_elem442); + ByteBuffer _elem458; + _elem458 = iprot.readBinary(); + struct.values.add(_elem458); } iprot.readListEnd(); } @@ -52951,9 +54216,9 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, execute_prepared_c oprot.writeFieldBegin(VALUES_FIELD_DESC); { oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, struct.values.size())); - for (ByteBuffer _iter443 : struct.values) + for (ByteBuffer _iter459 : struct.values) { - oprot.writeBinary(_iter443); + oprot.writeBinary(_iter459); } oprot.writeListEnd(); } @@ -52984,9 +54249,9 @@ public void write(org.apache.thrift.protocol.TProtocol prot, execute_prepared_cq oprot.writeI32(struct.itemId); { oprot.writeI32(struct.values.size()); - for (ByteBuffer _iter444 : struct.values) + for (ByteBuffer _iter460 : struct.values) { - oprot.writeBinary(_iter444); + oprot.writeBinary(_iter460); } } oprot.writeI32(struct.consistency.getValue()); @@ -52998,13 +54263,13 @@ public void read(org.apache.thrift.protocol.TProtocol prot, execute_prepared_cql struct.itemId = iprot.readI32(); struct.setItemIdIsSet(true); { - org.apache.thrift.protocol.TList _list445 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32()); - struct.values = new ArrayList(_list445.size); - for (int _i446 = 0; _i446 < _list445.size; ++_i446) + org.apache.thrift.protocol.TList _list461 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32()); + struct.values = new ArrayList(_list461.size); + for (int _i462 = 0; _i462 < _list461.size; ++_i462) { - ByteBuffer _elem447; - _elem447 = iprot.readBinary(); - struct.values.add(_elem447); + ByteBuffer _elem463; + _elem463 = iprot.readBinary(); + struct.values.add(_elem463); } } struct.setValuesIsSet(true); diff --git a/interface/thrift/gen-java/org/apache/cassandra/thrift/ColumnSlice.java b/interface/thrift/gen-java/org/apache/cassandra/thrift/ColumnSlice.java new file mode 100644 index 000000000000..67b88a33d720 --- /dev/null +++ b/interface/thrift/gen-java/org/apache/cassandra/thrift/ColumnSlice.java @@ -0,0 +1,551 @@ +/** + * Autogenerated by Thrift Compiler (0.9.1) + * + * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + * @generated + */ +package org.apache.cassandra.thrift; +/* + * + * 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. + * + */ + + +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.thrift.scheme.IScheme; +import org.apache.thrift.scheme.SchemeFactory; +import org.apache.thrift.scheme.StandardScheme; + +import org.apache.thrift.scheme.TupleScheme; +import org.apache.thrift.protocol.TTupleProtocol; +import org.apache.thrift.protocol.TProtocolException; +import org.apache.thrift.EncodingUtils; +import org.apache.thrift.TException; +import org.apache.thrift.async.AsyncMethodCallback; +import org.apache.thrift.server.AbstractNonblockingServer.*; +import java.util.List; +import java.util.ArrayList; +import java.util.Map; +import java.util.HashMap; +import java.util.EnumMap; +import java.util.Set; +import java.util.HashSet; +import java.util.EnumSet; +import java.util.Collections; +import java.util.BitSet; +import java.nio.ByteBuffer; +import java.util.Arrays; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The ColumnSlice is used to select a set of columns from inside a row. + * If start or finish are unspecified they will default to the start-of + * end-of value. + * @param start. The start of the ColumnSlice inclusive + * @param finish. The end of the ColumnSlice inclusive + */ +public class ColumnSlice implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { + private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("ColumnSlice"); + + private static final org.apache.thrift.protocol.TField START_FIELD_DESC = new org.apache.thrift.protocol.TField("start", org.apache.thrift.protocol.TType.STRING, (short)1); + private static final org.apache.thrift.protocol.TField FINISH_FIELD_DESC = new org.apache.thrift.protocol.TField("finish", org.apache.thrift.protocol.TType.STRING, (short)2); + + private static final Map, SchemeFactory> schemes = new HashMap, SchemeFactory>(); + static { + schemes.put(StandardScheme.class, new ColumnSliceStandardSchemeFactory()); + schemes.put(TupleScheme.class, new ColumnSliceTupleSchemeFactory()); + } + + public ByteBuffer start; // optional + public ByteBuffer finish; // optional + + /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */ + public enum _Fields implements org.apache.thrift.TFieldIdEnum { + START((short)1, "start"), + FINISH((short)2, "finish"); + + private static final Map byName = new HashMap(); + + static { + for (_Fields field : EnumSet.allOf(_Fields.class)) { + byName.put(field.getFieldName(), field); + } + } + + /** + * Find the _Fields constant that matches fieldId, or null if its not found. + */ + public static _Fields findByThriftId(int fieldId) { + switch(fieldId) { + case 1: // START + return START; + case 2: // FINISH + return FINISH; + default: + return null; + } + } + + /** + * Find the _Fields constant that matches fieldId, throwing an exception + * if it is not found. + */ + public static _Fields findByThriftIdOrThrow(int fieldId) { + _Fields fields = findByThriftId(fieldId); + if (fields == null) throw new IllegalArgumentException("Field " + fieldId + " doesn't exist!"); + return fields; + } + + /** + * Find the _Fields constant that matches name, or null if its not found. + */ + public static _Fields findByName(String name) { + return byName.get(name); + } + + private final short _thriftId; + private final String _fieldName; + + _Fields(short thriftId, String fieldName) { + _thriftId = thriftId; + _fieldName = fieldName; + } + + public short getThriftFieldId() { + return _thriftId; + } + + public String getFieldName() { + return _fieldName; + } + } + + // isset id assignments + private _Fields optionals[] = {_Fields.START,_Fields.FINISH}; + public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap; + static { + Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); + tmpMap.put(_Fields.START, new org.apache.thrift.meta_data.FieldMetaData("start", org.apache.thrift.TFieldRequirementType.OPTIONAL, + new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING , true))); + tmpMap.put(_Fields.FINISH, new org.apache.thrift.meta_data.FieldMetaData("finish", org.apache.thrift.TFieldRequirementType.OPTIONAL, + new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING , true))); + metaDataMap = Collections.unmodifiableMap(tmpMap); + org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(ColumnSlice.class, metaDataMap); + } + + public ColumnSlice() { + } + + /** + * Performs a deep copy on other. + */ + public ColumnSlice(ColumnSlice other) { + if (other.isSetStart()) { + this.start = org.apache.thrift.TBaseHelper.copyBinary(other.start); +; + } + if (other.isSetFinish()) { + this.finish = org.apache.thrift.TBaseHelper.copyBinary(other.finish); +; + } + } + + public ColumnSlice deepCopy() { + return new ColumnSlice(this); + } + + @Override + public void clear() { + this.start = null; + this.finish = null; + } + + public byte[] getStart() { + setStart(org.apache.thrift.TBaseHelper.rightSize(start)); + return start == null ? null : start.array(); + } + + public ByteBuffer bufferForStart() { + return start; + } + + public ColumnSlice setStart(byte[] start) { + setStart(start == null ? (ByteBuffer)null : ByteBuffer.wrap(start)); + return this; + } + + public ColumnSlice setStart(ByteBuffer start) { + this.start = start; + return this; + } + + public void unsetStart() { + this.start = null; + } + + /** Returns true if field start is set (has been assigned a value) and false otherwise */ + public boolean isSetStart() { + return this.start != null; + } + + public void setStartIsSet(boolean value) { + if (!value) { + this.start = null; + } + } + + public byte[] getFinish() { + setFinish(org.apache.thrift.TBaseHelper.rightSize(finish)); + return finish == null ? null : finish.array(); + } + + public ByteBuffer bufferForFinish() { + return finish; + } + + public ColumnSlice setFinish(byte[] finish) { + setFinish(finish == null ? (ByteBuffer)null : ByteBuffer.wrap(finish)); + return this; + } + + public ColumnSlice setFinish(ByteBuffer finish) { + this.finish = finish; + return this; + } + + public void unsetFinish() { + this.finish = null; + } + + /** Returns true if field finish is set (has been assigned a value) and false otherwise */ + public boolean isSetFinish() { + return this.finish != null; + } + + public void setFinishIsSet(boolean value) { + if (!value) { + this.finish = null; + } + } + + public void setFieldValue(_Fields field, Object value) { + switch (field) { + case START: + if (value == null) { + unsetStart(); + } else { + setStart((ByteBuffer)value); + } + break; + + case FINISH: + if (value == null) { + unsetFinish(); + } else { + setFinish((ByteBuffer)value); + } + break; + + } + } + + public Object getFieldValue(_Fields field) { + switch (field) { + case START: + return getStart(); + + case FINISH: + return getFinish(); + + } + throw new IllegalStateException(); + } + + /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */ + public boolean isSet(_Fields field) { + if (field == null) { + throw new IllegalArgumentException(); + } + + switch (field) { + case START: + return isSetStart(); + case FINISH: + return isSetFinish(); + } + throw new IllegalStateException(); + } + + @Override + public boolean equals(Object that) { + if (that == null) + return false; + if (that instanceof ColumnSlice) + return this.equals((ColumnSlice)that); + return false; + } + + public boolean equals(ColumnSlice that) { + if (that == null) + return false; + + boolean this_present_start = true && this.isSetStart(); + boolean that_present_start = true && that.isSetStart(); + if (this_present_start || that_present_start) { + if (!(this_present_start && that_present_start)) + return false; + if (!this.start.equals(that.start)) + return false; + } + + boolean this_present_finish = true && this.isSetFinish(); + boolean that_present_finish = true && that.isSetFinish(); + if (this_present_finish || that_present_finish) { + if (!(this_present_finish && that_present_finish)) + return false; + if (!this.finish.equals(that.finish)) + return false; + } + + return true; + } + + @Override + public int hashCode() { + HashCodeBuilder builder = new HashCodeBuilder(); + + boolean present_start = true && (isSetStart()); + builder.append(present_start); + if (present_start) + builder.append(start); + + boolean present_finish = true && (isSetFinish()); + builder.append(present_finish); + if (present_finish) + builder.append(finish); + + return builder.toHashCode(); + } + + @Override + public int compareTo(ColumnSlice other) { + if (!getClass().equals(other.getClass())) { + return getClass().getName().compareTo(other.getClass().getName()); + } + + int lastComparison = 0; + + lastComparison = Boolean.valueOf(isSetStart()).compareTo(other.isSetStart()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetStart()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.start, other.start); + if (lastComparison != 0) { + return lastComparison; + } + } + lastComparison = Boolean.valueOf(isSetFinish()).compareTo(other.isSetFinish()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetFinish()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.finish, other.finish); + if (lastComparison != 0) { + return lastComparison; + } + } + return 0; + } + + public _Fields fieldForId(int fieldId) { + return _Fields.findByThriftId(fieldId); + } + + public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException { + schemes.get(iprot.getScheme()).getScheme().read(iprot, this); + } + + public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException { + schemes.get(oprot.getScheme()).getScheme().write(oprot, this); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("ColumnSlice("); + boolean first = true; + + if (isSetStart()) { + sb.append("start:"); + if (this.start == null) { + sb.append("null"); + } else { + org.apache.thrift.TBaseHelper.toString(this.start, sb); + } + first = false; + } + if (isSetFinish()) { + if (!first) sb.append(", "); + sb.append("finish:"); + if (this.finish == null) { + sb.append("null"); + } else { + org.apache.thrift.TBaseHelper.toString(this.finish, sb); + } + first = false; + } + sb.append(")"); + return sb.toString(); + } + + public void validate() throws org.apache.thrift.TException { + // check for required fields + // check for sub-struct validity + } + + private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException { + try { + write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out))); + } catch (org.apache.thrift.TException te) { + throw new java.io.IOException(te); + } + } + + private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException { + try { + read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in))); + } catch (org.apache.thrift.TException te) { + throw new java.io.IOException(te); + } + } + + private static class ColumnSliceStandardSchemeFactory implements SchemeFactory { + public ColumnSliceStandardScheme getScheme() { + return new ColumnSliceStandardScheme(); + } + } + + private static class ColumnSliceStandardScheme extends StandardScheme { + + public void read(org.apache.thrift.protocol.TProtocol iprot, ColumnSlice struct) throws org.apache.thrift.TException { + org.apache.thrift.protocol.TField schemeField; + iprot.readStructBegin(); + while (true) + { + schemeField = iprot.readFieldBegin(); + if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { + break; + } + switch (schemeField.id) { + case 1: // START + if (schemeField.type == org.apache.thrift.protocol.TType.STRING) { + struct.start = iprot.readBinary(); + struct.setStartIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + case 2: // FINISH + if (schemeField.type == org.apache.thrift.protocol.TType.STRING) { + struct.finish = iprot.readBinary(); + struct.setFinishIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + default: + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + iprot.readFieldEnd(); + } + iprot.readStructEnd(); + + // check for required fields of primitive type, which can't be checked in the validate method + struct.validate(); + } + + public void write(org.apache.thrift.protocol.TProtocol oprot, ColumnSlice struct) throws org.apache.thrift.TException { + struct.validate(); + + oprot.writeStructBegin(STRUCT_DESC); + if (struct.start != null) { + if (struct.isSetStart()) { + oprot.writeFieldBegin(START_FIELD_DESC); + oprot.writeBinary(struct.start); + oprot.writeFieldEnd(); + } + } + if (struct.finish != null) { + if (struct.isSetFinish()) { + oprot.writeFieldBegin(FINISH_FIELD_DESC); + oprot.writeBinary(struct.finish); + oprot.writeFieldEnd(); + } + } + oprot.writeFieldStop(); + oprot.writeStructEnd(); + } + + } + + private static class ColumnSliceTupleSchemeFactory implements SchemeFactory { + public ColumnSliceTupleScheme getScheme() { + return new ColumnSliceTupleScheme(); + } + } + + private static class ColumnSliceTupleScheme extends TupleScheme { + + @Override + public void write(org.apache.thrift.protocol.TProtocol prot, ColumnSlice struct) throws org.apache.thrift.TException { + TTupleProtocol oprot = (TTupleProtocol) prot; + BitSet optionals = new BitSet(); + if (struct.isSetStart()) { + optionals.set(0); + } + if (struct.isSetFinish()) { + optionals.set(1); + } + oprot.writeBitSet(optionals, 2); + if (struct.isSetStart()) { + oprot.writeBinary(struct.start); + } + if (struct.isSetFinish()) { + oprot.writeBinary(struct.finish); + } + } + + @Override + public void read(org.apache.thrift.protocol.TProtocol prot, ColumnSlice struct) throws org.apache.thrift.TException { + TTupleProtocol iprot = (TTupleProtocol) prot; + BitSet incoming = iprot.readBitSet(2); + if (incoming.get(0)) { + struct.start = iprot.readBinary(); + struct.setStartIsSet(true); + } + if (incoming.get(1)) { + struct.finish = iprot.readBinary(); + struct.setFinishIsSet(true); + } + } + } + +} + diff --git a/interface/thrift/gen-java/org/apache/cassandra/thrift/MultiSliceRequest.java b/interface/thrift/gen-java/org/apache/cassandra/thrift/MultiSliceRequest.java new file mode 100644 index 000000000000..9d4878cbfa56 --- /dev/null +++ b/interface/thrift/gen-java/org/apache/cassandra/thrift/MultiSliceRequest.java @@ -0,0 +1,1042 @@ +/** + * Autogenerated by Thrift Compiler (0.9.1) + * + * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + * @generated + */ +package org.apache.cassandra.thrift; +/* + * + * 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. + * + */ + + +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.thrift.scheme.IScheme; +import org.apache.thrift.scheme.SchemeFactory; +import org.apache.thrift.scheme.StandardScheme; + +import org.apache.thrift.scheme.TupleScheme; +import org.apache.thrift.protocol.TTupleProtocol; +import org.apache.thrift.protocol.TProtocolException; +import org.apache.thrift.EncodingUtils; +import org.apache.thrift.TException; +import org.apache.thrift.async.AsyncMethodCallback; +import org.apache.thrift.server.AbstractNonblockingServer.*; +import java.util.List; +import java.util.ArrayList; +import java.util.Map; +import java.util.HashMap; +import java.util.EnumMap; +import java.util.Set; +import java.util.HashSet; +import java.util.EnumSet; +import java.util.Collections; +import java.util.BitSet; +import java.nio.ByteBuffer; +import java.util.Arrays; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Used to perform multiple slices on a single row key in one rpc operation + * @param key. The row key to be multi sliced + * @param column_parent. The column family (super columns are unsupported) + * @param column_slices. 0 to many ColumnSlice objects each will be used to select columns + * @param reversed. Direction of slice + * @param count. Maximum number of columns + * @param consistency_level. Level to perform the operation at + */ +public class MultiSliceRequest implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { + private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("MultiSliceRequest"); + + private static final org.apache.thrift.protocol.TField KEY_FIELD_DESC = new org.apache.thrift.protocol.TField("key", org.apache.thrift.protocol.TType.STRING, (short)1); + private static final org.apache.thrift.protocol.TField COLUMN_PARENT_FIELD_DESC = new org.apache.thrift.protocol.TField("column_parent", org.apache.thrift.protocol.TType.STRUCT, (short)2); + private static final org.apache.thrift.protocol.TField COLUMN_SLICES_FIELD_DESC = new org.apache.thrift.protocol.TField("column_slices", org.apache.thrift.protocol.TType.LIST, (short)3); + private static final org.apache.thrift.protocol.TField REVERSED_FIELD_DESC = new org.apache.thrift.protocol.TField("reversed", org.apache.thrift.protocol.TType.BOOL, (short)4); + private static final org.apache.thrift.protocol.TField COUNT_FIELD_DESC = new org.apache.thrift.protocol.TField("count", org.apache.thrift.protocol.TType.I32, (short)5); + private static final org.apache.thrift.protocol.TField CONSISTENCY_LEVEL_FIELD_DESC = new org.apache.thrift.protocol.TField("consistency_level", org.apache.thrift.protocol.TType.I32, (short)6); + + private static final Map, SchemeFactory> schemes = new HashMap, SchemeFactory>(); + static { + schemes.put(StandardScheme.class, new MultiSliceRequestStandardSchemeFactory()); + schemes.put(TupleScheme.class, new MultiSliceRequestTupleSchemeFactory()); + } + + public ByteBuffer key; // optional + public ColumnParent column_parent; // optional + public List column_slices; // optional + public boolean reversed; // optional + public int count; // optional + /** + * + * @see ConsistencyLevel + */ + public ConsistencyLevel consistency_level; // optional + + /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */ + public enum _Fields implements org.apache.thrift.TFieldIdEnum { + KEY((short)1, "key"), + COLUMN_PARENT((short)2, "column_parent"), + COLUMN_SLICES((short)3, "column_slices"), + REVERSED((short)4, "reversed"), + COUNT((short)5, "count"), + /** + * + * @see ConsistencyLevel + */ + CONSISTENCY_LEVEL((short)6, "consistency_level"); + + private static final Map byName = new HashMap(); + + static { + for (_Fields field : EnumSet.allOf(_Fields.class)) { + byName.put(field.getFieldName(), field); + } + } + + /** + * Find the _Fields constant that matches fieldId, or null if its not found. + */ + public static _Fields findByThriftId(int fieldId) { + switch(fieldId) { + case 1: // KEY + return KEY; + case 2: // COLUMN_PARENT + return COLUMN_PARENT; + case 3: // COLUMN_SLICES + return COLUMN_SLICES; + case 4: // REVERSED + return REVERSED; + case 5: // COUNT + return COUNT; + case 6: // CONSISTENCY_LEVEL + return CONSISTENCY_LEVEL; + default: + return null; + } + } + + /** + * Find the _Fields constant that matches fieldId, throwing an exception + * if it is not found. + */ + public static _Fields findByThriftIdOrThrow(int fieldId) { + _Fields fields = findByThriftId(fieldId); + if (fields == null) throw new IllegalArgumentException("Field " + fieldId + " doesn't exist!"); + return fields; + } + + /** + * Find the _Fields constant that matches name, or null if its not found. + */ + public static _Fields findByName(String name) { + return byName.get(name); + } + + private final short _thriftId; + private final String _fieldName; + + _Fields(short thriftId, String fieldName) { + _thriftId = thriftId; + _fieldName = fieldName; + } + + public short getThriftFieldId() { + return _thriftId; + } + + public String getFieldName() { + return _fieldName; + } + } + + // isset id assignments + private static final int __REVERSED_ISSET_ID = 0; + private static final int __COUNT_ISSET_ID = 1; + private byte __isset_bitfield = 0; + private _Fields optionals[] = {_Fields.KEY,_Fields.COLUMN_PARENT,_Fields.COLUMN_SLICES,_Fields.REVERSED,_Fields.COUNT,_Fields.CONSISTENCY_LEVEL}; + public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap; + static { + Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); + tmpMap.put(_Fields.KEY, new org.apache.thrift.meta_data.FieldMetaData("key", org.apache.thrift.TFieldRequirementType.OPTIONAL, + new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING , true))); + tmpMap.put(_Fields.COLUMN_PARENT, new org.apache.thrift.meta_data.FieldMetaData("column_parent", org.apache.thrift.TFieldRequirementType.OPTIONAL, + new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, ColumnParent.class))); + tmpMap.put(_Fields.COLUMN_SLICES, new org.apache.thrift.meta_data.FieldMetaData("column_slices", org.apache.thrift.TFieldRequirementType.OPTIONAL, + new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, + new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, ColumnSlice.class)))); + tmpMap.put(_Fields.REVERSED, new org.apache.thrift.meta_data.FieldMetaData("reversed", org.apache.thrift.TFieldRequirementType.OPTIONAL, + new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.BOOL))); + tmpMap.put(_Fields.COUNT, new org.apache.thrift.meta_data.FieldMetaData("count", org.apache.thrift.TFieldRequirementType.OPTIONAL, + new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32))); + tmpMap.put(_Fields.CONSISTENCY_LEVEL, new org.apache.thrift.meta_data.FieldMetaData("consistency_level", org.apache.thrift.TFieldRequirementType.OPTIONAL, + new org.apache.thrift.meta_data.EnumMetaData(org.apache.thrift.protocol.TType.ENUM, ConsistencyLevel.class))); + metaDataMap = Collections.unmodifiableMap(tmpMap); + org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(MultiSliceRequest.class, metaDataMap); + } + + public MultiSliceRequest() { + this.reversed = false; + + this.count = 1000; + + this.consistency_level = org.apache.cassandra.thrift.ConsistencyLevel.ONE; + + } + + /** + * Performs a deep copy on other. + */ + public MultiSliceRequest(MultiSliceRequest other) { + __isset_bitfield = other.__isset_bitfield; + if (other.isSetKey()) { + this.key = org.apache.thrift.TBaseHelper.copyBinary(other.key); +; + } + if (other.isSetColumn_parent()) { + this.column_parent = new ColumnParent(other.column_parent); + } + if (other.isSetColumn_slices()) { + List __this__column_slices = new ArrayList(other.column_slices.size()); + for (ColumnSlice other_element : other.column_slices) { + __this__column_slices.add(new ColumnSlice(other_element)); + } + this.column_slices = __this__column_slices; + } + this.reversed = other.reversed; + this.count = other.count; + if (other.isSetConsistency_level()) { + this.consistency_level = other.consistency_level; + } + } + + public MultiSliceRequest deepCopy() { + return new MultiSliceRequest(this); + } + + @Override + public void clear() { + this.key = null; + this.column_parent = null; + this.column_slices = null; + this.reversed = false; + + this.count = 1000; + + this.consistency_level = org.apache.cassandra.thrift.ConsistencyLevel.ONE; + + } + + public byte[] getKey() { + setKey(org.apache.thrift.TBaseHelper.rightSize(key)); + return key == null ? null : key.array(); + } + + public ByteBuffer bufferForKey() { + return key; + } + + public MultiSliceRequest setKey(byte[] key) { + setKey(key == null ? (ByteBuffer)null : ByteBuffer.wrap(key)); + return this; + } + + public MultiSliceRequest setKey(ByteBuffer key) { + this.key = key; + return this; + } + + public void unsetKey() { + this.key = null; + } + + /** Returns true if field key is set (has been assigned a value) and false otherwise */ + public boolean isSetKey() { + return this.key != null; + } + + public void setKeyIsSet(boolean value) { + if (!value) { + this.key = null; + } + } + + public ColumnParent getColumn_parent() { + return this.column_parent; + } + + public MultiSliceRequest setColumn_parent(ColumnParent column_parent) { + this.column_parent = column_parent; + return this; + } + + public void unsetColumn_parent() { + this.column_parent = null; + } + + /** Returns true if field column_parent is set (has been assigned a value) and false otherwise */ + public boolean isSetColumn_parent() { + return this.column_parent != null; + } + + public void setColumn_parentIsSet(boolean value) { + if (!value) { + this.column_parent = null; + } + } + + public int getColumn_slicesSize() { + return (this.column_slices == null) ? 0 : this.column_slices.size(); + } + + public java.util.Iterator getColumn_slicesIterator() { + return (this.column_slices == null) ? null : this.column_slices.iterator(); + } + + public void addToColumn_slices(ColumnSlice elem) { + if (this.column_slices == null) { + this.column_slices = new ArrayList(); + } + this.column_slices.add(elem); + } + + public List getColumn_slices() { + return this.column_slices; + } + + public MultiSliceRequest setColumn_slices(List column_slices) { + this.column_slices = column_slices; + return this; + } + + public void unsetColumn_slices() { + this.column_slices = null; + } + + /** Returns true if field column_slices is set (has been assigned a value) and false otherwise */ + public boolean isSetColumn_slices() { + return this.column_slices != null; + } + + public void setColumn_slicesIsSet(boolean value) { + if (!value) { + this.column_slices = null; + } + } + + public boolean isReversed() { + return this.reversed; + } + + public MultiSliceRequest setReversed(boolean reversed) { + this.reversed = reversed; + setReversedIsSet(true); + return this; + } + + public void unsetReversed() { + __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __REVERSED_ISSET_ID); + } + + /** Returns true if field reversed is set (has been assigned a value) and false otherwise */ + public boolean isSetReversed() { + return EncodingUtils.testBit(__isset_bitfield, __REVERSED_ISSET_ID); + } + + public void setReversedIsSet(boolean value) { + __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __REVERSED_ISSET_ID, value); + } + + public int getCount() { + return this.count; + } + + public MultiSliceRequest setCount(int count) { + this.count = count; + setCountIsSet(true); + return this; + } + + public void unsetCount() { + __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __COUNT_ISSET_ID); + } + + /** Returns true if field count is set (has been assigned a value) and false otherwise */ + public boolean isSetCount() { + return EncodingUtils.testBit(__isset_bitfield, __COUNT_ISSET_ID); + } + + public void setCountIsSet(boolean value) { + __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __COUNT_ISSET_ID, value); + } + + /** + * + * @see ConsistencyLevel + */ + public ConsistencyLevel getConsistency_level() { + return this.consistency_level; + } + + /** + * + * @see ConsistencyLevel + */ + public MultiSliceRequest setConsistency_level(ConsistencyLevel consistency_level) { + this.consistency_level = consistency_level; + return this; + } + + public void unsetConsistency_level() { + this.consistency_level = null; + } + + /** Returns true if field consistency_level is set (has been assigned a value) and false otherwise */ + public boolean isSetConsistency_level() { + return this.consistency_level != null; + } + + public void setConsistency_levelIsSet(boolean value) { + if (!value) { + this.consistency_level = null; + } + } + + public void setFieldValue(_Fields field, Object value) { + switch (field) { + case KEY: + if (value == null) { + unsetKey(); + } else { + setKey((ByteBuffer)value); + } + break; + + case COLUMN_PARENT: + if (value == null) { + unsetColumn_parent(); + } else { + setColumn_parent((ColumnParent)value); + } + break; + + case COLUMN_SLICES: + if (value == null) { + unsetColumn_slices(); + } else { + setColumn_slices((List)value); + } + break; + + case REVERSED: + if (value == null) { + unsetReversed(); + } else { + setReversed((Boolean)value); + } + break; + + case COUNT: + if (value == null) { + unsetCount(); + } else { + setCount((Integer)value); + } + break; + + case CONSISTENCY_LEVEL: + if (value == null) { + unsetConsistency_level(); + } else { + setConsistency_level((ConsistencyLevel)value); + } + break; + + } + } + + public Object getFieldValue(_Fields field) { + switch (field) { + case KEY: + return getKey(); + + case COLUMN_PARENT: + return getColumn_parent(); + + case COLUMN_SLICES: + return getColumn_slices(); + + case REVERSED: + return Boolean.valueOf(isReversed()); + + case COUNT: + return Integer.valueOf(getCount()); + + case CONSISTENCY_LEVEL: + return getConsistency_level(); + + } + throw new IllegalStateException(); + } + + /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */ + public boolean isSet(_Fields field) { + if (field == null) { + throw new IllegalArgumentException(); + } + + switch (field) { + case KEY: + return isSetKey(); + case COLUMN_PARENT: + return isSetColumn_parent(); + case COLUMN_SLICES: + return isSetColumn_slices(); + case REVERSED: + return isSetReversed(); + case COUNT: + return isSetCount(); + case CONSISTENCY_LEVEL: + return isSetConsistency_level(); + } + throw new IllegalStateException(); + } + + @Override + public boolean equals(Object that) { + if (that == null) + return false; + if (that instanceof MultiSliceRequest) + return this.equals((MultiSliceRequest)that); + return false; + } + + public boolean equals(MultiSliceRequest that) { + if (that == null) + return false; + + boolean this_present_key = true && this.isSetKey(); + boolean that_present_key = true && that.isSetKey(); + if (this_present_key || that_present_key) { + if (!(this_present_key && that_present_key)) + return false; + if (!this.key.equals(that.key)) + return false; + } + + boolean this_present_column_parent = true && this.isSetColumn_parent(); + boolean that_present_column_parent = true && that.isSetColumn_parent(); + if (this_present_column_parent || that_present_column_parent) { + if (!(this_present_column_parent && that_present_column_parent)) + return false; + if (!this.column_parent.equals(that.column_parent)) + return false; + } + + boolean this_present_column_slices = true && this.isSetColumn_slices(); + boolean that_present_column_slices = true && that.isSetColumn_slices(); + if (this_present_column_slices || that_present_column_slices) { + if (!(this_present_column_slices && that_present_column_slices)) + return false; + if (!this.column_slices.equals(that.column_slices)) + return false; + } + + boolean this_present_reversed = true && this.isSetReversed(); + boolean that_present_reversed = true && that.isSetReversed(); + if (this_present_reversed || that_present_reversed) { + if (!(this_present_reversed && that_present_reversed)) + return false; + if (this.reversed != that.reversed) + return false; + } + + boolean this_present_count = true && this.isSetCount(); + boolean that_present_count = true && that.isSetCount(); + if (this_present_count || that_present_count) { + if (!(this_present_count && that_present_count)) + return false; + if (this.count != that.count) + return false; + } + + boolean this_present_consistency_level = true && this.isSetConsistency_level(); + boolean that_present_consistency_level = true && that.isSetConsistency_level(); + if (this_present_consistency_level || that_present_consistency_level) { + if (!(this_present_consistency_level && that_present_consistency_level)) + return false; + if (!this.consistency_level.equals(that.consistency_level)) + return false; + } + + return true; + } + + @Override + public int hashCode() { + HashCodeBuilder builder = new HashCodeBuilder(); + + boolean present_key = true && (isSetKey()); + builder.append(present_key); + if (present_key) + builder.append(key); + + boolean present_column_parent = true && (isSetColumn_parent()); + builder.append(present_column_parent); + if (present_column_parent) + builder.append(column_parent); + + boolean present_column_slices = true && (isSetColumn_slices()); + builder.append(present_column_slices); + if (present_column_slices) + builder.append(column_slices); + + boolean present_reversed = true && (isSetReversed()); + builder.append(present_reversed); + if (present_reversed) + builder.append(reversed); + + boolean present_count = true && (isSetCount()); + builder.append(present_count); + if (present_count) + builder.append(count); + + boolean present_consistency_level = true && (isSetConsistency_level()); + builder.append(present_consistency_level); + if (present_consistency_level) + builder.append(consistency_level.getValue()); + + return builder.toHashCode(); + } + + @Override + public int compareTo(MultiSliceRequest other) { + if (!getClass().equals(other.getClass())) { + return getClass().getName().compareTo(other.getClass().getName()); + } + + int lastComparison = 0; + + lastComparison = Boolean.valueOf(isSetKey()).compareTo(other.isSetKey()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetKey()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.key, other.key); + if (lastComparison != 0) { + return lastComparison; + } + } + lastComparison = Boolean.valueOf(isSetColumn_parent()).compareTo(other.isSetColumn_parent()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetColumn_parent()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.column_parent, other.column_parent); + if (lastComparison != 0) { + return lastComparison; + } + } + lastComparison = Boolean.valueOf(isSetColumn_slices()).compareTo(other.isSetColumn_slices()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetColumn_slices()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.column_slices, other.column_slices); + if (lastComparison != 0) { + return lastComparison; + } + } + lastComparison = Boolean.valueOf(isSetReversed()).compareTo(other.isSetReversed()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetReversed()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.reversed, other.reversed); + if (lastComparison != 0) { + return lastComparison; + } + } + lastComparison = Boolean.valueOf(isSetCount()).compareTo(other.isSetCount()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetCount()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.count, other.count); + if (lastComparison != 0) { + return lastComparison; + } + } + lastComparison = Boolean.valueOf(isSetConsistency_level()).compareTo(other.isSetConsistency_level()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetConsistency_level()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.consistency_level, other.consistency_level); + if (lastComparison != 0) { + return lastComparison; + } + } + return 0; + } + + public _Fields fieldForId(int fieldId) { + return _Fields.findByThriftId(fieldId); + } + + public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException { + schemes.get(iprot.getScheme()).getScheme().read(iprot, this); + } + + public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException { + schemes.get(oprot.getScheme()).getScheme().write(oprot, this); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("MultiSliceRequest("); + boolean first = true; + + if (isSetKey()) { + sb.append("key:"); + if (this.key == null) { + sb.append("null"); + } else { + org.apache.thrift.TBaseHelper.toString(this.key, sb); + } + first = false; + } + if (isSetColumn_parent()) { + if (!first) sb.append(", "); + sb.append("column_parent:"); + if (this.column_parent == null) { + sb.append("null"); + } else { + sb.append(this.column_parent); + } + first = false; + } + if (isSetColumn_slices()) { + if (!first) sb.append(", "); + sb.append("column_slices:"); + if (this.column_slices == null) { + sb.append("null"); + } else { + sb.append(this.column_slices); + } + first = false; + } + if (isSetReversed()) { + if (!first) sb.append(", "); + sb.append("reversed:"); + sb.append(this.reversed); + first = false; + } + if (isSetCount()) { + if (!first) sb.append(", "); + sb.append("count:"); + sb.append(this.count); + first = false; + } + if (isSetConsistency_level()) { + if (!first) sb.append(", "); + sb.append("consistency_level:"); + if (this.consistency_level == null) { + sb.append("null"); + } else { + sb.append(this.consistency_level); + } + first = false; + } + sb.append(")"); + return sb.toString(); + } + + public void validate() throws org.apache.thrift.TException { + // check for required fields + // check for sub-struct validity + if (column_parent != null) { + column_parent.validate(); + } + } + + private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException { + try { + write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out))); + } catch (org.apache.thrift.TException te) { + throw new java.io.IOException(te); + } + } + + private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException { + try { + // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor. + __isset_bitfield = 0; + read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in))); + } catch (org.apache.thrift.TException te) { + throw new java.io.IOException(te); + } + } + + private static class MultiSliceRequestStandardSchemeFactory implements SchemeFactory { + public MultiSliceRequestStandardScheme getScheme() { + return new MultiSliceRequestStandardScheme(); + } + } + + private static class MultiSliceRequestStandardScheme extends StandardScheme { + + public void read(org.apache.thrift.protocol.TProtocol iprot, MultiSliceRequest struct) throws org.apache.thrift.TException { + org.apache.thrift.protocol.TField schemeField; + iprot.readStructBegin(); + while (true) + { + schemeField = iprot.readFieldBegin(); + if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { + break; + } + switch (schemeField.id) { + case 1: // KEY + if (schemeField.type == org.apache.thrift.protocol.TType.STRING) { + struct.key = iprot.readBinary(); + struct.setKeyIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + case 2: // COLUMN_PARENT + if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) { + struct.column_parent = new ColumnParent(); + struct.column_parent.read(iprot); + struct.setColumn_parentIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + case 3: // COLUMN_SLICES + if (schemeField.type == org.apache.thrift.protocol.TType.LIST) { + { + org.apache.thrift.protocol.TList _list216 = iprot.readListBegin(); + struct.column_slices = new ArrayList(_list216.size); + for (int _i217 = 0; _i217 < _list216.size; ++_i217) + { + ColumnSlice _elem218; + _elem218 = new ColumnSlice(); + _elem218.read(iprot); + struct.column_slices.add(_elem218); + } + iprot.readListEnd(); + } + struct.setColumn_slicesIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + case 4: // REVERSED + if (schemeField.type == org.apache.thrift.protocol.TType.BOOL) { + struct.reversed = iprot.readBool(); + struct.setReversedIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + case 5: // COUNT + if (schemeField.type == org.apache.thrift.protocol.TType.I32) { + struct.count = iprot.readI32(); + struct.setCountIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + case 6: // CONSISTENCY_LEVEL + if (schemeField.type == org.apache.thrift.protocol.TType.I32) { + struct.consistency_level = ConsistencyLevel.findByValue(iprot.readI32()); + struct.setConsistency_levelIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + default: + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + iprot.readFieldEnd(); + } + iprot.readStructEnd(); + + // check for required fields of primitive type, which can't be checked in the validate method + struct.validate(); + } + + public void write(org.apache.thrift.protocol.TProtocol oprot, MultiSliceRequest struct) throws org.apache.thrift.TException { + struct.validate(); + + oprot.writeStructBegin(STRUCT_DESC); + if (struct.key != null) { + if (struct.isSetKey()) { + oprot.writeFieldBegin(KEY_FIELD_DESC); + oprot.writeBinary(struct.key); + oprot.writeFieldEnd(); + } + } + if (struct.column_parent != null) { + if (struct.isSetColumn_parent()) { + oprot.writeFieldBegin(COLUMN_PARENT_FIELD_DESC); + struct.column_parent.write(oprot); + oprot.writeFieldEnd(); + } + } + if (struct.column_slices != null) { + if (struct.isSetColumn_slices()) { + oprot.writeFieldBegin(COLUMN_SLICES_FIELD_DESC); + { + oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.column_slices.size())); + for (ColumnSlice _iter219 : struct.column_slices) + { + _iter219.write(oprot); + } + oprot.writeListEnd(); + } + oprot.writeFieldEnd(); + } + } + if (struct.isSetReversed()) { + oprot.writeFieldBegin(REVERSED_FIELD_DESC); + oprot.writeBool(struct.reversed); + oprot.writeFieldEnd(); + } + if (struct.isSetCount()) { + oprot.writeFieldBegin(COUNT_FIELD_DESC); + oprot.writeI32(struct.count); + oprot.writeFieldEnd(); + } + if (struct.consistency_level != null) { + if (struct.isSetConsistency_level()) { + oprot.writeFieldBegin(CONSISTENCY_LEVEL_FIELD_DESC); + oprot.writeI32(struct.consistency_level.getValue()); + oprot.writeFieldEnd(); + } + } + oprot.writeFieldStop(); + oprot.writeStructEnd(); + } + + } + + private static class MultiSliceRequestTupleSchemeFactory implements SchemeFactory { + public MultiSliceRequestTupleScheme getScheme() { + return new MultiSliceRequestTupleScheme(); + } + } + + private static class MultiSliceRequestTupleScheme extends TupleScheme { + + @Override + public void write(org.apache.thrift.protocol.TProtocol prot, MultiSliceRequest struct) throws org.apache.thrift.TException { + TTupleProtocol oprot = (TTupleProtocol) prot; + BitSet optionals = new BitSet(); + if (struct.isSetKey()) { + optionals.set(0); + } + if (struct.isSetColumn_parent()) { + optionals.set(1); + } + if (struct.isSetColumn_slices()) { + optionals.set(2); + } + if (struct.isSetReversed()) { + optionals.set(3); + } + if (struct.isSetCount()) { + optionals.set(4); + } + if (struct.isSetConsistency_level()) { + optionals.set(5); + } + oprot.writeBitSet(optionals, 6); + if (struct.isSetKey()) { + oprot.writeBinary(struct.key); + } + if (struct.isSetColumn_parent()) { + struct.column_parent.write(oprot); + } + if (struct.isSetColumn_slices()) { + { + oprot.writeI32(struct.column_slices.size()); + for (ColumnSlice _iter220 : struct.column_slices) + { + _iter220.write(oprot); + } + } + } + if (struct.isSetReversed()) { + oprot.writeBool(struct.reversed); + } + if (struct.isSetCount()) { + oprot.writeI32(struct.count); + } + if (struct.isSetConsistency_level()) { + oprot.writeI32(struct.consistency_level.getValue()); + } + } + + @Override + public void read(org.apache.thrift.protocol.TProtocol prot, MultiSliceRequest struct) throws org.apache.thrift.TException { + TTupleProtocol iprot = (TTupleProtocol) prot; + BitSet incoming = iprot.readBitSet(6); + if (incoming.get(0)) { + struct.key = iprot.readBinary(); + struct.setKeyIsSet(true); + } + if (incoming.get(1)) { + struct.column_parent = new ColumnParent(); + struct.column_parent.read(iprot); + struct.setColumn_parentIsSet(true); + } + if (incoming.get(2)) { + { + org.apache.thrift.protocol.TList _list221 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32()); + struct.column_slices = new ArrayList(_list221.size); + for (int _i222 = 0; _i222 < _list221.size; ++_i222) + { + ColumnSlice _elem223; + _elem223 = new ColumnSlice(); + _elem223.read(iprot); + struct.column_slices.add(_elem223); + } + } + struct.setColumn_slicesIsSet(true); + } + if (incoming.get(3)) { + struct.reversed = iprot.readBool(); + struct.setReversedIsSet(true); + } + if (incoming.get(4)) { + struct.count = iprot.readI32(); + struct.setCountIsSet(true); + } + if (incoming.get(5)) { + struct.consistency_level = ConsistencyLevel.findByValue(iprot.readI32()); + struct.setConsistency_levelIsSet(true); + } + } + } + +} + diff --git a/interface/thrift/gen-java/org/apache/cassandra/thrift/cassandraConstants.java b/interface/thrift/gen-java/org/apache/cassandra/thrift/cassandraConstants.java index d9f0008d73e2..f84243ec40e3 100644 --- a/interface/thrift/gen-java/org/apache/cassandra/thrift/cassandraConstants.java +++ b/interface/thrift/gen-java/org/apache/cassandra/thrift/cassandraConstants.java @@ -56,6 +56,6 @@ public class cassandraConstants { - public static final String VERSION = "20.0.0"; + public static final String VERSION = "20.1.0"; } diff --git a/src/java/org/apache/cassandra/thrift/CassandraServer.java b/src/java/org/apache/cassandra/thrift/CassandraServer.java index a5af55d57657..a64cf7435259 100644 --- a/src/java/org/apache/cassandra/thrift/CassandraServer.java +++ b/src/java/org/apache/cassandra/thrift/CassandraServer.java @@ -1997,6 +1997,74 @@ public CqlResult execute_prepared_cql3_query(int itemId, List bindVa } } + @Override + public List get_multi_slice(MultiSliceRequest request) + throws InvalidRequestException, UnavailableException, TimedOutException + { + if (startSessionIfRequested()) + { + Map traceParameters = ImmutableMap.of("key", ByteBufferUtil.bytesToHex(request.key), + "column_parent", request.column_parent.toString(), + "consistency_level", request.consistency_level.name(), + "count", String.valueOf(request.count), + "column_slices", request.column_slices.toString()); + Tracing.instance.begin("get_multi_slice", traceParameters); + } + else + { + logger.debug("get_multi_slice"); + } + try + { + ClientState cState = state(); + String keyspace = cState.getKeyspace(); + state().hasColumnFamilyAccess(keyspace, request.getColumn_parent().column_family, Permission.SELECT); + CFMetaData metadata = ThriftValidation.validateColumnFamily(keyspace, request.getColumn_parent().column_family); + if (metadata.cfType == ColumnFamilyType.Super) + throw new org.apache.cassandra.exceptions.InvalidRequestException("get_multi_slice does not support super columns"); + ThriftValidation.validateColumnParent(metadata, request.getColumn_parent()); + org.apache.cassandra.db.ConsistencyLevel consistencyLevel = ThriftConversion.fromThrift(request.getConsistency_level()); + consistencyLevel.validateForRead(keyspace); + List commands = new ArrayList<>(1); + ColumnSlice [] slices = new ColumnSlice[request.getColumn_slices().size()]; + for (int i = 0 ; i < request.getColumn_slices().size() ; i++) + { + fixOptionalSliceParameters(request.getColumn_slices().get(i)); + Composite start = metadata.comparator.fromByteBuffer(request.getColumn_slices().get(i).start); + Composite finish = metadata.comparator.fromByteBuffer(request.getColumn_slices().get(i).finish); + int compare = metadata.comparator.compare(start, finish); + if (!request.reversed && compare > 0) + throw new InvalidRequestException(String.format("Column slice at index %d had start greater than finish", i)); + else if (request.reversed && compare < 0) + throw new InvalidRequestException(String.format("Reversed column slice at index %d had start less than finish", i)); + slices[i] = new ColumnSlice(start, finish); + } + SliceQueryFilter filter = new SliceQueryFilter(slices, request.reversed, request.count); + ThriftValidation.validateKey(metadata, request.key); + commands.add(ReadCommand.create(keyspace, request.key, request.column_parent.getColumn_family(), System.currentTimeMillis(), filter)); + return getSlice(commands, request.column_parent.isSetSuper_column(), consistencyLevel).entrySet().iterator().next().getValue(); + } + catch (RequestValidationException e) + { + throw ThriftConversion.toThrift(e); + } + finally + { + Tracing.instance.stopSession(); + } + } + + /** + * Set the to start-of end-of value of "" for start and finish. + * @param columnSlice + */ + private static void fixOptionalSliceParameters(org.apache.cassandra.thrift.ColumnSlice columnSlice) { + if (!columnSlice.isSetStart()) + columnSlice.setStart(new byte[0]); + if (!columnSlice.isSetFinish()) + columnSlice.setFinish(new byte[0]); + } + /* * No-op since 3.0. */ diff --git a/test/system/test_thrift_server.py b/test/system/test_thrift_server.py index 7ecc8f123ad6..2de7b058d58f 100644 --- a/test/system/test_thrift_server.py +++ b/test/system/test_thrift_server.py @@ -217,8 +217,35 @@ def get_range_slice(client, parent, predicate, start, end, count, cl, row_filter kr = KeyRange(start, end, count=count, row_filter=row_filter) return client.get_range_slices(parent, predicate, kr, cl) +def _insert_six_columns(key='abc'): + CL = ConsistencyLevel.ONE + client.insert(key, ColumnParent('Standard1'), Column('a', '1', 0), CL) + client.insert(key, ColumnParent('Standard1'), Column('b', '2', 0), CL) + client.insert(key, ColumnParent('Standard1'), Column('c', '3', 0), CL) + client.insert(key, ColumnParent('Standard1'), Column('d', '4', 0), CL) + client.insert(key, ColumnParent('Standard1'), Column('e', '5', 0), CL) + client.insert(key, ColumnParent('Standard1'), Column('f', '6', 0), CL) + +def _big_multi_slice(key='abc'): + c1 = ColumnSlice() + c1.start = 'a' + c1.finish = 'c' + c2 = ColumnSlice() + c2.start = 'e' + c2.finish = 'f' + m = MultiSliceRequest() + m.key = key + m.column_parent = ColumnParent('Standard1') + m.column_slices = [ c1, c2 ] + m.reversed = False + m.count = 10 + m.consistency_level = ConsistencyLevel.ONE + return client.get_multi_slice(m) + +_MULTI_SLICE_COLUMNS = [Column('a', '1', 0),Column('b', '2', 0), Column('c', '3', 0), Column('e','5',0) , Column('f','6',0)] class TestMutations(ThriftTester): + def test_insert(self): _set_keyspace('Keyspace1') _insert_simple(False) @@ -2064,6 +2091,13 @@ def test_get_range_slice_after_deletion(self): assert len(result[0].columns) == 1, result[0].columns assert result[0].columns[0].super_column.name == 'sc1' + def test_multi_slice(self): + _set_keyspace('Keyspace1') + _insert_six_columns('abc') + L = [result.column + for result in _big_multi_slice('abc')] + assert L == _MULTI_SLICE_COLUMNS, L + class TestTruncate(ThriftTester): def test_truncate(self): diff --git a/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java b/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java index ac2f5670a553..58927fba0f1a 100644 --- a/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java +++ b/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java @@ -44,6 +44,7 @@ import org.apache.cassandra.db.composites.*; import org.apache.cassandra.db.columniterator.IdentityQueryFilter; import org.apache.cassandra.db.filter.*; +import org.apache.cassandra.db.filter.ColumnSlice; import org.apache.cassandra.db.index.SecondaryIndex; import org.apache.cassandra.db.marshal.LexicalUUIDType; import org.apache.cassandra.db.marshal.LongType; diff --git a/test/unit/org/apache/cassandra/thrift/MultiSliceTest.java b/test/unit/org/apache/cassandra/thrift/MultiSliceTest.java new file mode 100644 index 000000000000..d1c913bf2b4d --- /dev/null +++ b/test/unit/org/apache/cassandra/thrift/MultiSliceTest.java @@ -0,0 +1,149 @@ +package org.apache.cassandra.thrift; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import junit.framework.Assert; + +import org.apache.cassandra.SchemaLoader; +import org.apache.cassandra.config.Schema; +import org.apache.cassandra.service.EmbeddedCassandraService; +import org.apache.cassandra.utils.ByteBufferUtil; +import org.apache.thrift.TException; +import org.junit.BeforeClass; +import org.junit.Test; + +public class MultiSliceTest extends SchemaLoader +{ + private static CassandraServer server; + + @BeforeClass + public static void setup() throws IOException, TException + { + Schema.instance.clear(); // Schema are now written on disk and will be reloaded + new EmbeddedCassandraService().start(); + ThriftSessionManager.instance.setCurrentSocket(new InetSocketAddress(9160)); + server = new CassandraServer(); + server.set_keyspace("Keyspace1"); + } + + private static MultiSliceRequest makeMultiSliceRequest(ByteBuffer key) + { + ColumnParent cp = new ColumnParent("Standard1"); + MultiSliceRequest req = new MultiSliceRequest(); + req.setKey(key); + req.setCount(1000); + req.reversed = false; + req.setColumn_parent(cp); + return req; + } + + @Test + public void test_multi_slice_optional_column_slice() throws TException + { + ColumnParent cp = new ColumnParent("Standard1"); + ByteBuffer key = ByteBuffer.wrap("multi_slice".getBytes()); + List expected = new ArrayList(); + for (char a = 'a'; a <= 'z'; a++) + expected.add(a + ""); + + addTheAlphabetToRow(key, cp); + MultiSliceRequest req = makeMultiSliceRequest(key); + req.setColumn_slices(new ArrayList()); + req.getColumn_slices().add(new ColumnSlice()); + List list = server.get_multi_slice(req); + assertColumnNameMatches(expected, list); + } + + @Test + public void test_multi_slice() throws TException + { + ColumnParent cp = new ColumnParent("Standard1"); + ByteBuffer key = ByteBuffer.wrap("multi_slice_two_slice".getBytes()); + addTheAlphabetToRow(key, cp); + MultiSliceRequest req = makeMultiSliceRequest(key); + req.setColumn_slices(Arrays.asList(columnSliceFrom("a", "e"), columnSliceFrom("i", "n"))); + assertColumnNameMatches(Arrays.asList("a", "b", "c", "d", "e", "i", "j", "k" , "l", "m" , "n"), server.get_multi_slice(req)); + } + + @Test + public void test_with_overlap() throws TException + { + ColumnParent cp = new ColumnParent("Standard1"); + ByteBuffer key = ByteBuffer.wrap("overlap".getBytes()); + addTheAlphabetToRow(key, cp); + MultiSliceRequest req = makeMultiSliceRequest(key); + req.setColumn_slices(Arrays.asList(columnSliceFrom("a", "e"), columnSliceFrom("d", "g"))); + assertColumnNameMatches(Arrays.asList("a", "b", "c", "d", "e", "f", "g"), server.get_multi_slice(req)); + } + + @Test + public void test_with_overlap_reversed() throws TException + { + ColumnParent cp = new ColumnParent("Standard1"); + ByteBuffer key = ByteBuffer.wrap("overlap_reversed".getBytes()); + addTheAlphabetToRow(key, cp); + MultiSliceRequest req = makeMultiSliceRequest(key); + req.reversed = true; + req.setColumn_slices(Arrays.asList(columnSliceFrom("e", "a"), columnSliceFrom("g", "d"))); + assertColumnNameMatches(Arrays.asList("g", "f", "e", "d", "c", "b", "a"), server.get_multi_slice(req)); + } + + @Test(expected=InvalidRequestException.class) + public void test_that_column_slice_is_proper() throws TException + { + ByteBuffer key = ByteBuffer.wrap("overlap".getBytes()); + MultiSliceRequest req = makeMultiSliceRequest(key); + req.reversed = true; + req.setColumn_slices(Arrays.asList(columnSliceFrom("a", "e"), columnSliceFrom("g", "d"))); + assertColumnNameMatches(Arrays.asList("a", "b", "c", "d", "e", "f", "g"), server.get_multi_slice(req)); + } + + @Test + public void test_with_overlap_reversed_with_count() throws TException + { + ColumnParent cp = new ColumnParent("Standard1"); + ByteBuffer key = ByteBuffer.wrap("overlap_reversed_count".getBytes()); + addTheAlphabetToRow(key, cp); + MultiSliceRequest req = makeMultiSliceRequest(key); + req.setCount(6); + req.reversed = true; + req.setColumn_slices(Arrays.asList(columnSliceFrom("e", "a"), columnSliceFrom("g", "d"))); + assertColumnNameMatches(Arrays.asList("g", "e", "d", "c", "b", "a"), server.get_multi_slice(req)); + } + + private static void addTheAlphabetToRow(ByteBuffer key, ColumnParent parent) + throws InvalidRequestException, UnavailableException, TimedOutException + { + for (char a = 'a'; a <= 'z'; a++) { + Column c1 = new Column(); + c1.setName(ByteBufferUtil.bytes(String.valueOf(a))); + c1.setValue(new byte [0]); + c1.setTimestamp(System.nanoTime()); + server.insert(key, parent, c1, ConsistencyLevel.ONE); + } + } + + private static void assertColumnNameMatches(List expected , List actual) + { + Assert.assertEquals(actual+" "+expected +" did not have same number of elements", actual.size(), expected.size()); + for (int i = 0 ; i< expected.size() ; i++) + { + Assert.assertEquals(actual.get(i) +" did not equal "+ expected.get(i), + new String(actual.get(i).getColumn().getName()), expected.get(i)); + } + } + + private ColumnSlice columnSliceFrom(String startInclusive, String endInclusive) + { + ColumnSlice cs = new ColumnSlice(); + cs.setStart(ByteBufferUtil.bytes(startInclusive)); + cs.setFinish(ByteBufferUtil.bytes(endInclusive)); + return cs; + } +} \ No newline at end of file From b173ce207b311a57f288269eebf13375a2459a99 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Wed, 5 Mar 2014 23:57:37 -0500 Subject: [PATCH 006/557] use junit asserts --- .../db/compaction/CompactionsTest.java | 67 ++++++++++++------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java index 1497b3a2ae80..ac47bb622e1a 100644 --- a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java @@ -18,22 +18,35 @@ */ package org.apache.cassandra.db.compaction; -import java.io.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertNotNull; + +import java.io.File; import java.nio.ByteBuffer; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import java.util.Set; +import java.util.UUID; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; -import com.google.common.base.Function; -import com.google.common.collect.Iterables; -import com.google.common.collect.Sets; -import org.junit.Test; -import org.junit.runner.RunWith; - import org.apache.cassandra.OrderedJUnit4ClassRunner; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; -import org.apache.cassandra.db.*; +import org.apache.cassandra.db.ColumnFamily; +import org.apache.cassandra.db.ColumnFamilyStore; +import org.apache.cassandra.db.DataRange; +import org.apache.cassandra.db.DecoratedKey; +import org.apache.cassandra.db.Keyspace; +import org.apache.cassandra.db.Mutation; +import org.apache.cassandra.db.RangeTombstone; +import org.apache.cassandra.db.RowPosition; +import org.apache.cassandra.db.SuperColumns; +import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.db.columniterator.OnDiskAtomIterator; import org.apache.cassandra.db.filter.QueryFilter; import org.apache.cassandra.dht.BytesToken; @@ -45,8 +58,13 @@ import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.Pair; +import org.junit.Ignore; +import org.junit.Test; +import org.junit.runner.RunWith; -import static org.junit.Assert.*; +import com.google.common.base.Function; +import com.google.common.collect.Iterables; +import com.google.common.collect.Sets; @RunWith(OrderedJUnit4ClassRunner.class) public class CompactionsTest extends SchemaLoader @@ -115,7 +133,7 @@ public void testSingleSSTableCompactionWithLeveledCompaction() throws Exception ColumnFamilyStore store = testSingleSSTableCompaction(LeveledCompactionStrategy.class.getCanonicalName()); LeveledCompactionStrategy strategy = (LeveledCompactionStrategy) store.getCompactionStrategy(); // tombstone removal compaction should not promote level - assert strategy.getLevelSize(0) == 1; + assertEquals(1, strategy.getLevelSize(0)); } @Test @@ -151,8 +169,8 @@ public void testSuperColumnTombstones() throws ExecutionException, InterruptedEx SSTableScanner scanner = sstable.getScanner(DataRange.forKeyRange(keyRange)); OnDiskAtomIterator iter = scanner.next(); assertEquals(key, iter.getKey()); - assert iter.next() instanceof RangeTombstone; - assert !iter.hasNext(); + assertTrue(iter.next() instanceof RangeTombstone); + assertFalse(iter.hasNext()); } public static void assertMaxTimestamp(ColumnFamilyStore cfs, long maxTimestampExpected) @@ -187,7 +205,7 @@ public void testEchoedRow() cfs.forceBlockingFlush(); } Collection toCompact = cfs.getSSTables(); - assert toCompact.size() == 2; + assertEquals(2, toCompact.size()); // Reinserting the same keys. We will compact only the previous sstable, but we need those new ones // to make sure we use EchoedRow, otherwise it won't be used because purge can be done. @@ -203,7 +221,7 @@ public void testEchoedRow() for (SSTableReader sstable : cfs.getSSTables()) if (!toCompact.contains(sstable)) tmpSSTable = sstable; - assert tmpSSTable != null; + assertNotNull(tmpSSTable); // Force compaction on first sstables. Since each row is in only one sstable, we will be using EchoedRow. Util.compact(cfs, toCompact); @@ -248,7 +266,7 @@ public void testUserDefinedCompaction() throws Exception cfs.forceBlockingFlush(); Collection sstables = cfs.getSSTables(); - assert sstables.size() == 1; + assertEquals(1, sstables.size()); SSTableReader sstable = sstables.iterator().next(); int prevGeneration = sstable.descriptor.generation; @@ -262,8 +280,8 @@ public void testUserDefinedCompaction() throws Exception } while (CompactionManager.instance.getPendingTasks() > 0 || CompactionManager.instance.getActiveCompactions() > 0); // CF should have only one sstable with generation number advanced sstables = cfs.getSSTables(); - assert sstables.size() == 1; - assert sstables.iterator().next().descriptor.generation == prevGeneration + 1; + assertEquals(1, sstables.size()); + assertEquals( prevGeneration + 1, sstables.iterator().next().descriptor.generation); } @Test @@ -277,7 +295,7 @@ public void testCompactionLog() throws Exception cfs.forceBlockingFlush(); Collection sstables = cfs.getSSTables(); - assert !sstables.isEmpty(); + assertFalse(sstables.isEmpty()); Set generations = Sets.newHashSet(Iterables.transform(sstables, new Function() { public Integer apply(SSTableReader sstable) @@ -288,11 +306,11 @@ public Integer apply(SSTableReader sstable) UUID taskId = SystemKeyspace.startCompaction(cfs, sstables); Map, Map> compactionLogs = SystemKeyspace.getUnfinishedCompactions(); Set unfinishedCompactions = compactionLogs.get(Pair.create(KEYSPACE1, cf)).keySet(); - assert unfinishedCompactions.containsAll(generations); + assertTrue(unfinishedCompactions.containsAll(generations)); SystemKeyspace.finishCompaction(taskId); compactionLogs = SystemKeyspace.getUnfinishedCompactions(); - assert !compactionLogs.containsKey(Pair.create(KEYSPACE1, cf)); + assertFalse(compactionLogs.containsKey(Pair.create(KEYSPACE1, cf))); } private void testDontPurgeAccidentaly(String k, String cfname) throws InterruptedException @@ -316,7 +334,7 @@ private void testDontPurgeAccidentaly(String k, String cfname) throws Interrupte Collection sstablesBefore = cfs.getSSTables(); QueryFilter filter = QueryFilter.getIdentityFilter(key, cfname, System.currentTimeMillis()); - assert !(cfs.getColumnFamily(filter).getColumnCount() == 0); + assertTrue(0 != cfs.getColumnFamily(filter).getColumnCount()); // Remove key rm = new Mutation(KEYSPACE1, key.key); @@ -324,7 +342,7 @@ private void testDontPurgeAccidentaly(String k, String cfname) throws Interrupte rm.apply(); ColumnFamily cf = cfs.getColumnFamily(filter); - assert cf == null || cf.getColumnCount() == 0 : "should be empty: " + cf; + assertTrue( "should be empty: " + cf, cf == null || cf.getColumnCount() == 0); // Sleep one second so that the removal is indeed purgeable even with gcgrace == 0 Thread.sleep(1000); @@ -340,7 +358,7 @@ private void testDontPurgeAccidentaly(String k, String cfname) throws Interrupte Util.compact(cfs, toCompact); cf = cfs.getColumnFamily(filter); - assert cf == null || cf.getColumnCount() == 0 : "should be empty: " + cf; + assertTrue( "should be empty: " + cf, cf == null || cf.getColumnCount() == 0); } private static Range rangeFor(int start, int end) @@ -367,6 +385,7 @@ private static void insertRowWithKey(int key) } @Test + @Ignore("making ranges based on the keys, not on the tokens") public void testNeedsCleanup() { Keyspace keyspace = Keyspace.open(KEYSPACE1); From 572d328762bee9100549963a6826fdb9f633af2a Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Sat, 8 Mar 2014 21:38:23 -0500 Subject: [PATCH 007/557] simply: no need for iterator to get first item in List --- .../org/apache/cassandra/cql3/statements/UpdateStatement.java | 2 +- test/unit/org/apache/cassandra/db/RowIterationTest.java | 4 ++-- .../org/apache/cassandra/io/sstable/SSTableReaderTest.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/java/org/apache/cassandra/cql3/statements/UpdateStatement.java b/src/java/org/apache/cassandra/cql3/statements/UpdateStatement.java index 85ca069860d5..b0c7db8cb51f 100644 --- a/src/java/org/apache/cassandra/cql3/statements/UpdateStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/UpdateStatement.java @@ -71,7 +71,7 @@ public void addUpdateForKey(ColumnFamily cf, ByteBuffer key, Composite prefix, U if (cfm.comparator.isDense()) { if (prefix.isEmpty()) - throw new InvalidRequestException(String.format("Missing PRIMARY KEY part %s", cfm.clusteringColumns().iterator().next())); + throw new InvalidRequestException(String.format("Missing PRIMARY KEY part %s", cfm.clusteringColumns().get(0))); // An empty name for the compact value is what we use to recognize the case where there is not column // outside the PK, see CreateStatement. diff --git a/test/unit/org/apache/cassandra/db/RowIterationTest.java b/test/unit/org/apache/cassandra/db/RowIterationTest.java index bfba858ccfd4..34fbf82f10e6 100644 --- a/test/unit/org/apache/cassandra/db/RowIterationTest.java +++ b/test/unit/org/apache/cassandra/db/RowIterationTest.java @@ -82,7 +82,7 @@ public void testRowIterationDeletionTime() rm.apply(); store.forceBlockingFlush(); - ColumnFamily cf = Util.getRangeSlice(store).iterator().next().cf; + ColumnFamily cf = Util.getRangeSlice(store).get(0).cf; assert cf.deletionInfo().equals(delInfo2); } @@ -100,7 +100,7 @@ public void testRowIterationDeletion() rm.apply(); store.forceBlockingFlush(); - ColumnFamily cf = Util.getRangeSlice(store).iterator().next().cf; + ColumnFamily cf = Util.getRangeSlice(store).get(0).cf; assert cf != null; } } diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java index bd50538fe1d5..ecaa27621d09 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java @@ -201,7 +201,7 @@ public void testGetPositionsForRangesWithKeyCache() throws ExecutionException, I long p6 = sstable.getPosition(k(6), SSTableReader.Operator.EQ).position; long p7 = sstable.getPosition(k(7), SSTableReader.Operator.EQ).position; - Pair p = sstable.getPositionsForRanges(makeRanges(t(2), t(6))).iterator().next(); + Pair p = sstable.getPositionsForRanges(makeRanges(t(2), t(6))).get(0); // range are start exclusive so we should start at 3 assert p.left == p3; From 67ba0507cdde9389bdd79044be6bf8960a8d67c1 Mon Sep 17 00:00:00 2001 From: Vijay Date: Sun, 9 Mar 2014 14:48:11 -0700 Subject: [PATCH 008/557] nodetool no longer shows node joining patch by driftx; reviewed by Vijay for CASSANDRA-6811 --- .../org/apache/cassandra/tools/NodeTool.java | 70 +++++++++++-------- 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src/java/org/apache/cassandra/tools/NodeTool.java b/src/java/org/apache/cassandra/tools/NodeTool.java index d24e013dd09c..51207398251a 100644 --- a/src/java/org/apache/cassandra/tools/NodeTool.java +++ b/src/java/org/apache/cassandra/tools/NodeTool.java @@ -506,41 +506,49 @@ private void printDc(NodeProbe probe, String format, else System.out.println(); - for (Map.Entry entry : filteredOwnerships.entrySet()) + for (Map.Entry entry : endpointsToTokens.entries()) { - String endpoint = entry.getKey().getHostAddress(); - for (String token : endpointsToTokens.get(endpoint)) + String endpoint = entry.getKey(); + String rack; + try { - String rack; - try - { - rack = probe.getEndpointSnitchInfoProxy().getRack(endpoint); - } catch (UnknownHostException e) - { - rack = "Unknown"; - } + rack = probe.getEndpointSnitchInfoProxy().getRack(endpoint); + } + catch (UnknownHostException e) + { + rack = "Unknown"; + } - String status = liveNodes.contains(endpoint) - ? "Up" - : deadNodes.contains(endpoint) - ? "Down" - : "?"; - - String state = "Normal"; - - if (joiningNodes.contains(endpoint)) - state = "Joining"; - else if (leavingNodes.contains(endpoint)) - state = "Leaving"; - else if (movingNodes.contains(endpoint)) - state = "Moving"; - - String load = loadMap.containsKey(endpoint) - ? loadMap.get(endpoint) - : "?"; - String owns = new DecimalFormat("##0.00%").format(entry.getValue()); - System.out.printf(format, endpoint, rack, status, state, load, owns, token); + String status = liveNodes.contains(endpoint) + ? "Up" + : deadNodes.contains(endpoint) + ? "Down" + : "?"; + + String state = "Normal"; + + if (joiningNodes.contains(endpoint)) + state = "Joining"; + else if (leavingNodes.contains(endpoint)) + state = "Leaving"; + else if (movingNodes.contains(endpoint)) + state = "Moving"; + + String load = loadMap.containsKey(endpoint) + ? loadMap.get(endpoint) + : "?"; + String owns; + try + { + InetAddress ep = InetAddress.getByName(endpoint); + Float percent = filteredOwnerships.get(ep); + owns = (percent != null) ? new DecimalFormat("##0.00%").format(percent) : "?"; + } + catch (UnknownHostException e) + { + throw new RuntimeException(e); } + System.out.printf(format, endpoint, rack, status, state, load, owns, entry.getValue()); } System.out.println(); } From 2037a8d7acb4d3a3a44204f077663fbd5869995c Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Tue, 11 Mar 2014 22:47:11 -0400 Subject: [PATCH 009/557] use junit assertions over assert --- .../org/apache/cassandra/config/DefsTest.java | 123 +++++++++--------- 1 file changed, 62 insertions(+), 61 deletions(-) diff --git a/test/unit/org/apache/cassandra/config/DefsTest.java b/test/unit/org/apache/cassandra/config/DefsTest.java index 1251ff7cdd9a..6c06648022ca 100644 --- a/test/unit/org/apache/cassandra/config/DefsTest.java +++ b/test/unit/org/apache/cassandra/config/DefsTest.java @@ -40,6 +40,7 @@ import org.apache.cassandra.utils.ByteBufferUtil; import static org.apache.cassandra.Util.cellname; +import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -68,7 +69,7 @@ public void testCFMetaDataApply() throws ConfigurationException .maxCompactionThreshold(500); // we'll be adding this one later. make sure it's not already there. - assert cfm.getColumnDefinition(ByteBuffer.wrap(new byte[] { 5 })) == null; + Assert.assertNull(cfm.getColumnDefinition(ByteBuffer.wrap(new byte[] { 5 }))); CFMetaData cfNew = cfm.clone(); @@ -80,14 +81,14 @@ public void testCFMetaDataApply() throws ConfigurationException // remove one. ColumnDefinition removeIndexDef = ColumnDefinition.regularDef(cfm, ByteBuffer.wrap(new byte[] { 0 }), BytesType.instance, null) .setIndex("0", IndexType.KEYS, null); - assert cfNew.removeColumnDefinition(removeIndexDef); + Assert.assertTrue(cfNew.removeColumnDefinition(removeIndexDef)); cfm.apply(cfNew); for (int i = 1; i < cfm.allColumns().size(); i++) - assert cfm.getColumnDefinition(ByteBuffer.wrap(new byte[] { 1 })) != null; - assert cfm.getColumnDefinition(ByteBuffer.wrap(new byte[] { 0 })) == null; - assert cfm.getColumnDefinition(ByteBuffer.wrap(new byte[] { 5 })) != null; + Assert.assertNotNull(cfm.getColumnDefinition(ByteBuffer.wrap(new byte[] { 1 }))); + Assert.assertNull(cfm.getColumnDefinition(ByteBuffer.wrap(new byte[] { 0 }))); + Assert.assertNotNull(cfm.getColumnDefinition(ByteBuffer.wrap(new byte[] { 5 }))); } @Test @@ -95,11 +96,11 @@ public void testInvalidNames() { String[] valid = {"1", "a", "_1", "b_", "__", "1_a"}; for (String s : valid) - assert CFMetaData.isNameValid(s); + Assert.assertTrue(CFMetaData.isNameValid(s)); String[] invalid = {"b@t", "dash-y", "", " ", "dot.s", ".hidden"}; for (String s : invalid) - assert !CFMetaData.isNameValid(s); + Assert.assertFalse(CFMetaData.isNameValid(s)); } @Ignore @@ -112,12 +113,12 @@ public void saveAndRestore() DefsTables.dumpToStorage(first); List defs = new ArrayList(DefsTables.loadFromStorage(first)); - assert defs.size() > 0; - assert defs.size() == Schema.instance.getNonSystemKeyspaces().size(); + Assert.assertTrue(defs.size() > 0); + Assert.assertEquals(defs.size(), Schema.instance.getNonSystemKeyspaces().size()); for (KSMetaData loaded : defs) { KSMetaData defined = Schema.instance.getKeyspaceDefinition(loaded.name); - assert defined.equals(loaded) : String.format("%s != %s", loaded, defined); + Assert.assertTrue(String.format("%s != %s", loaded, defined), defined.equals(loaded)); } */ } @@ -145,11 +146,11 @@ public void addNewCfWithNullComment() throws ConfigurationException CFMetaData newCf = addTestCF(original.name, cf, null); - assert !Schema.instance.getKSMetaData(ks).cfMetaData().containsKey(newCf.cfName); + Assert.assertFalse(Schema.instance.getKSMetaData(ks).cfMetaData().containsKey(newCf.cfName)); MigrationManager.announceNewColumnFamily(newCf); - assert Schema.instance.getKSMetaData(ks).cfMetaData().containsKey(newCf.cfName); - assert Schema.instance.getKSMetaData(ks).cfMetaData().get(newCf.cfName).equals(newCf); + Assert.assertTrue(Schema.instance.getKSMetaData(ks).cfMetaData().containsKey(newCf.cfName)); + Assert.assertEquals(newCf, Schema.instance.getKSMetaData(ks).cfMetaData().get(newCf.cfName)); } @Test @@ -161,11 +162,11 @@ public void addNewCF() throws ConfigurationException CFMetaData newCf = addTestCF(original.name, cf, "A New Column Family"); - assert !Schema.instance.getKSMetaData(ks).cfMetaData().containsKey(newCf.cfName); + Assert.assertFalse(Schema.instance.getKSMetaData(ks).cfMetaData().containsKey(newCf.cfName)); MigrationManager.announceNewColumnFamily(newCf); - assert Schema.instance.getKSMetaData(ks).cfMetaData().containsKey(newCf.cfName); - assert Schema.instance.getKSMetaData(ks).cfMetaData().get(newCf.cfName).equals(newCf); + Assert.assertTrue(Schema.instance.getKSMetaData(ks).cfMetaData().containsKey(newCf.cfName)); + Assert.assertEquals(newCf, Schema.instance.getKSMetaData(ks).cfMetaData().get(newCf.cfName)); // now read and write to it. CellName col0 = cellname("col0"); @@ -174,13 +175,13 @@ public void addNewCF() throws ConfigurationException rm.add(cf, col0, ByteBufferUtil.bytes("value0"), 1L); rm.apply(); ColumnFamilyStore store = Keyspace.open(ks).getColumnFamilyStore(cf); - assert store != null; + Assert.assertNotNull(store); store.forceBlockingFlush(); ColumnFamily cfam = store.getColumnFamily(Util.namesQueryFilter(store, dk, col0)); - assert cfam.getColumn(col0) != null; + Assert.assertNotNull(cfam.getColumn(col0)); Cell col = cfam.getColumn(col0); - assert ByteBufferUtil.bytes("value0").equals(col.value()); + Assert.assertEquals(ByteBufferUtil.bytes("value0"), col.value()); } @Test @@ -189,9 +190,9 @@ public void dropCf() throws ConfigurationException DecoratedKey dk = Util.dk("dropCf"); // sanity final KSMetaData ks = Schema.instance.getKSMetaData("Keyspace1"); - assert ks != null; + Assert.assertNotNull(ks); final CFMetaData cfm = ks.cfMetaData().get("Standard1"); - assert cfm != null; + Assert.assertNotNull(cfm); // write some data, force a flush, then verify that files exist on disk. Mutation rm = new Mutation(ks.name, dk.key); @@ -199,13 +200,13 @@ public void dropCf() throws ConfigurationException rm.add(cfm.cfName, cellname("col" + i), ByteBufferUtil.bytes("anyvalue"), 1L); rm.apply(); ColumnFamilyStore store = Keyspace.open(cfm.ksName).getColumnFamilyStore(cfm.cfName); - assert store != null; + Assert.assertNotNull(store); store.forceBlockingFlush(); - assert store.directories.sstableLister().list().size() > 0; + Assert.assertTrue(store.directories.sstableLister().list().size() > 0); MigrationManager.announceColumnFamilyDrop(ks.name, cfm.cfName); - assert !Schema.instance.getKSMetaData(ks.name).cfMetaData().containsKey(cfm.cfName); + Assert.assertFalse(Schema.instance.getKSMetaData(ks.name).cfMetaData().containsKey(cfm.cfName)); // any write should fail. rm = new Mutation(ks.name, dk.key); @@ -219,7 +220,7 @@ public void dropCf() throws ConfigurationException { success = false; } - assert !success : "This mutation should have failed since the CF no longer exists."; + Assert.assertFalse("This mutation should have failed since the CF no longer exists.", success); // verify that the files are gone. for (File file : store.directories.sstableLister().listFiles()) @@ -239,8 +240,8 @@ public void addNewKS() throws ConfigurationException MigrationManager.announceNewKeyspace(newKs); - assert Schema.instance.getKSMetaData(newCf.ksName) != null; - assert Schema.instance.getKSMetaData(newCf.ksName).equals(newKs); + Assert.assertNotNull(Schema.instance.getKSMetaData(newCf.ksName)); + Assert.assertEquals(Schema.instance.getKSMetaData(newCf.ksName), newKs); // test reads and writes. CellName col0 = cellname("col0"); @@ -248,13 +249,13 @@ public void addNewKS() throws ConfigurationException rm.add(newCf.cfName, col0, ByteBufferUtil.bytes("value0"), 1L); rm.apply(); ColumnFamilyStore store = Keyspace.open(newCf.ksName).getColumnFamilyStore(newCf.cfName); - assert store != null; + Assert.assertNotNull(store); store.forceBlockingFlush(); ColumnFamily cfam = store.getColumnFamily(Util.namesQueryFilter(store, dk, col0)); - assert cfam.getColumn(col0) != null; + Assert.assertNotNull(cfam.getColumn(col0)); Cell col = cfam.getColumn(col0); - assert ByteBufferUtil.bytes("value0").equals(col.value()); + Assert.assertEquals(ByteBufferUtil.bytes("value0"), col.value()); } @Test @@ -263,9 +264,9 @@ public void dropKS() throws ConfigurationException DecoratedKey dk = Util.dk("dropKs"); // sanity final KSMetaData ks = Schema.instance.getKSMetaData("Keyspace1"); - assert ks != null; + Assert.assertNotNull(ks); final CFMetaData cfm = ks.cfMetaData().get("Standard2"); - assert cfm != null; + Assert.assertNotNull(cfm); // write some data, force a flush, then verify that files exist on disk. Mutation rm = new Mutation(ks.name, dk.key); @@ -273,13 +274,13 @@ public void dropKS() throws ConfigurationException rm.add(cfm.cfName, cellname("col" + i), ByteBufferUtil.bytes("anyvalue"), 1L); rm.apply(); ColumnFamilyStore store = Keyspace.open(cfm.ksName).getColumnFamilyStore(cfm.cfName); - assert store != null; + Assert.assertNotNull(store); store.forceBlockingFlush(); - assert store.directories.sstableLister().list().size() > 0; + Assert.assertTrue(store.directories.sstableLister().list().size() > 0); MigrationManager.announceKeyspaceDrop(ks.name); - assert Schema.instance.getKSMetaData(ks.name) == null; + Assert.assertNull(Schema.instance.getKSMetaData(ks.name)); // write should fail. rm = new Mutation(ks.name, dk.key); @@ -293,7 +294,7 @@ public void dropKS() throws ConfigurationException { success = false; } - assert !success : "This mutation should have failed since the CF no longer exists."; + Assert.assertFalse("This mutation should have failed since the CF no longer exists.", success); // reads should fail too. boolean threw = false; @@ -305,7 +306,7 @@ public void dropKS() throws ConfigurationException { threw = true; } - assert threw; + Assert.assertTrue(threw); } @Test @@ -314,9 +315,9 @@ public void dropKSUnflushed() throws ConfigurationException DecoratedKey dk = Util.dk("dropKs"); // sanity final KSMetaData ks = Schema.instance.getKSMetaData("Keyspace3"); - assert ks != null; + Assert.assertNotNull(ks); final CFMetaData cfm = ks.cfMetaData().get("Standard1"); - assert cfm != null; + Assert.assertNotNull(cfm); // write some data Mutation rm = new Mutation(ks.name, dk.key); @@ -326,29 +327,29 @@ public void dropKSUnflushed() throws ConfigurationException MigrationManager.announceKeyspaceDrop(ks.name); - assert Schema.instance.getKSMetaData(ks.name) == null; + Assert.assertNull(Schema.instance.getKSMetaData(ks.name)); } @Test public void createEmptyKsAddNewCf() throws ConfigurationException { - assert Schema.instance.getKSMetaData("EmptyKeyspace") == null; + Assert.assertNull(Schema.instance.getKSMetaData("EmptyKeyspace")); KSMetaData newKs = KSMetaData.testMetadata("EmptyKeyspace", SimpleStrategy.class, KSMetaData.optsWithRF(5)); MigrationManager.announceNewKeyspace(newKs); - assert Schema.instance.getKSMetaData("EmptyKeyspace") != null; + Assert.assertNotNull(Schema.instance.getKSMetaData("EmptyKeyspace")); CFMetaData newCf = addTestCF("EmptyKeyspace", "AddedLater", "A new CF to add to an empty KS"); //should not exist until apply - assert !Schema.instance.getKSMetaData(newKs.name).cfMetaData().containsKey(newCf.cfName); + Assert.assertFalse(Schema.instance.getKSMetaData(newKs.name).cfMetaData().containsKey(newCf.cfName)); //add the new CF to the empty space MigrationManager.announceNewColumnFamily(newCf); - assert Schema.instance.getKSMetaData(newKs.name).cfMetaData().containsKey(newCf.cfName); - assert Schema.instance.getKSMetaData(newKs.name).cfMetaData().get(newCf.cfName).equals(newCf); + Assert.assertTrue(Schema.instance.getKSMetaData(newKs.name).cfMetaData().containsKey(newCf.cfName)); + Assert.assertEquals(Schema.instance.getKSMetaData(newKs.name).cfMetaData().get(newCf.cfName), newCf); // now read and write to it. CellName col0 = cellname("col0"); @@ -357,13 +358,13 @@ public void createEmptyKsAddNewCf() throws ConfigurationException rm.add(newCf.cfName, col0, ByteBufferUtil.bytes("value0"), 1L); rm.apply(); ColumnFamilyStore store = Keyspace.open(newKs.name).getColumnFamilyStore(newCf.cfName); - assert store != null; + Assert.assertNotNull(store); store.forceBlockingFlush(); ColumnFamily cfam = store.getColumnFamily(Util.namesQueryFilter(store, dk, col0)); - assert cfam.getColumn(col0) != null; + Assert.assertNotNull(cfam.getColumn(col0)); Cell col = cfam.getColumn(col0); - assert ByteBufferUtil.bytes("value0").equals(col.value()); + Assert.assertEquals(ByteBufferUtil.bytes("value0"), col.value()); } @Test @@ -375,8 +376,8 @@ public void testUpdateKeyspace() throws ConfigurationException MigrationManager.announceNewKeyspace(oldKs); - assert Schema.instance.getKSMetaData(cf.ksName) != null; - assert Schema.instance.getKSMetaData(cf.ksName).equals(oldKs); + Assert.assertNotNull(Schema.instance.getKSMetaData(cf.ksName)); + Assert.assertEquals(Schema.instance.getKSMetaData(cf.ksName), oldKs); // names should match. KSMetaData newBadKs2 = KSMetaData.testMetadata(cf.ksName + "trash", SimpleStrategy.class, KSMetaData.optsWithRF(4)); @@ -394,8 +395,8 @@ public void testUpdateKeyspace() throws ConfigurationException MigrationManager.announceKeyspaceUpdate(newKs); KSMetaData newFetchedKs = Schema.instance.getKSMetaData(newKs.name); - assert newFetchedKs.strategyClass.equals(newKs.strategyClass); - assert !newFetchedKs.strategyClass.equals(oldKs.strategyClass); + Assert.assertEquals(newFetchedKs.strategyClass, newKs.strategyClass); + Assert.assertFalse(newFetchedKs.strategyClass.equals(oldKs.strategyClass)); } @Test @@ -406,9 +407,9 @@ public void testUpdateColumnFamilyNoIndexes() throws ConfigurationException KSMetaData ksm = KSMetaData.testMetadata(cf.ksName, SimpleStrategy.class, KSMetaData.optsWithRF(1), cf); MigrationManager.announceNewKeyspace(ksm); - assert Schema.instance.getKSMetaData(cf.ksName) != null; - assert Schema.instance.getKSMetaData(cf.ksName).equals(ksm); - assert Schema.instance.getCFMetaData(cf.ksName, cf.cfName) != null; + Assert.assertNotNull(Schema.instance.getKSMetaData(cf.ksName)); + Assert.assertEquals(Schema.instance.getKSMetaData(cf.ksName), ksm); + Assert.assertNotNull(Schema.instance.getCFMetaData(cf.ksName, cf.cfName)); // updating certain fields should fail. CFMetaData newCfm = cf.clone(); @@ -438,10 +439,10 @@ public void testUpdateColumnFamilyNoIndexes() throws ConfigurationException // can't test changing the reconciler because there is only one impl. // check the cumulative affect. - assert Schema.instance.getCFMetaData(cf.ksName, cf.cfName).getComment().equals(newCfm.getComment()); - assert Schema.instance.getCFMetaData(cf.ksName, cf.cfName).getReadRepairChance() == newCfm.getReadRepairChance(); - assert Schema.instance.getCFMetaData(cf.ksName, cf.cfName).getGcGraceSeconds() == newCfm.getGcGraceSeconds(); - assert Schema.instance.getCFMetaData(cf.ksName, cf.cfName).getDefaultValidator() == UTF8Type.instance; + Assert.assertEquals(Schema.instance.getCFMetaData(cf.ksName, cf.cfName).getComment(), newCfm.getComment()); + Assert.assertEquals(Schema.instance.getCFMetaData(cf.ksName, cf.cfName).getReadRepairChance(), newCfm.getReadRepairChance(), 0.0001); + Assert.assertEquals(Schema.instance.getCFMetaData(cf.ksName, cf.cfName).getGcGraceSeconds(), newCfm.getGcGraceSeconds()); + Assert.assertEquals(UTF8Type.instance, Schema.instance.getCFMetaData(cf.ksName, cf.cfName).getDefaultValidator()); // Change cfId newCfm = new CFMetaData(cf.ksName, cf.cfName, cf.cfType, cf.comparator, UUID.randomUUID()); @@ -518,9 +519,9 @@ public void testDropIndex() throws ConfigurationException MigrationManager.announceColumnFamilyUpdate(meta, false); // check - assert cfs.indexManager.getIndexes().isEmpty(); + Assert.assertTrue(cfs.indexManager.getIndexes().isEmpty()); SSTableDeletingTask.waitForDeletions(); - assert !new File(desc.filenameFor(Component.DATA)).exists(); + Assert.assertFalse(new File(desc.filenameFor(Component.DATA)).exists()); } private CFMetaData addTestCF(String ks, String cf, String comment) From b78cf8bee450df2e913a4f0f2f7ca148fcb4ab5f Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Sat, 15 Mar 2014 00:35:27 -0400 Subject: [PATCH 010/557] fix path variable --- bin/cassandra.in.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/cassandra.in.sh b/bin/cassandra.in.sh index 26170accb3ac..835c50cb7582 100644 --- a/bin/cassandra.in.sh +++ b/bin/cassandra.in.sh @@ -28,7 +28,7 @@ fi # it's just used here in constructing the classpath. cassandra_bin="$CASSANDRA_HOME/build/classes/main" cassandra_bin="$cassandra_bin:$CASSANDRA_HOME/build/classes/thrift" -#cassandra_bin="$cassandra_home/build/cassandra.jar" +#cassandra_bin="$CASSANDRA_HOME/build/cassandra.jar" # JAVA_HOME can optionally be set here #JAVA_HOME=/usr/local/jdk6 @@ -45,4 +45,4 @@ if [ "$JVM_VENDOR" != "OpenJDK" -o "$JVM_VERSION" \> "1.6.0" ] \ || [ "$JVM_VERSION" = "1.6.0" -a "$JVM_PATCH_VERSION" -ge 23 ] then JAVA_AGENT="$JAVA_AGENT -javaagent:$CASSANDRA_HOME/lib/jamm-0.2.6.jar" -fi \ No newline at end of file +fi From 593bd619acff2303e648b48d8a630dfc8d65be93 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Sat, 15 Mar 2014 01:35:24 -0400 Subject: [PATCH 011/557] presize collection --- .../cassandra/db/compaction/SizeTieredCompactionStrategy.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategy.java b/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategy.java index 63d983c17357..1fa5ff85f7f8 100644 --- a/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategy.java +++ b/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategy.java @@ -242,7 +242,7 @@ public int compare(SSTableReader o1, SSTableReader o2) private static Map getHotnessMap(Collection sstables) { - Map hotness = new HashMap<>(); + Map hotness = new HashMap<>(sstables.size()); for (SSTableReader sstable : sstables) hotness.put(sstable, hotness(sstable)); return hotness; From b74c2ade5c7f633262f7c292b21e3f77727a281f Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Sun, 16 Mar 2014 16:23:53 -0400 Subject: [PATCH 012/557] use parameterized logging --- .../config/YamlConfigurationLoader.java | 2 +- .../apache/cassandra/gms/FailureDetector.java | 2 +- .../gms/GossipDigestSynVerbHandler.java | 2 +- .../org/apache/cassandra/gms/Gossiper.java | 34 +++++++++---------- .../cassandra/io/sstable/SSTableWriter.java | 4 +-- .../cassandra/net/MessagingService.java | 2 +- .../PendingRangeCalculatorService.java | 2 +- .../locator/NetworkTopologyStrategyTest.java | 4 +-- .../streaming/StreamingTransferTest.java | 10 +++--- 9 files changed, 31 insertions(+), 31 deletions(-) diff --git a/src/java/org/apache/cassandra/config/YamlConfigurationLoader.java b/src/java/org/apache/cassandra/config/YamlConfigurationLoader.java index 4a1280c9af1c..5cd7c8f79bb4 100644 --- a/src/java/org/apache/cassandra/config/YamlConfigurationLoader.java +++ b/src/java/org/apache/cassandra/config/YamlConfigurationLoader.java @@ -120,7 +120,7 @@ private void logConfig(byte[] configBytes) configMap.put(sensitiveKey, ""); } } - logger.info("Node configuration:[" + Joiner.on("; ").join(configMap.entrySet()) + "]"); + logger.info("Node configuration:[{}]", Joiner.on("; ").join(configMap.entrySet())); } private static class MissingPropertiesChecker extends PropertyUtils diff --git a/src/java/org/apache/cassandra/gms/FailureDetector.java b/src/java/org/apache/cassandra/gms/FailureDetector.java index 4ecf23537d82..291f312072d8 100644 --- a/src/java/org/apache/cassandra/gms/FailureDetector.java +++ b/src/java/org/apache/cassandra/gms/FailureDetector.java @@ -226,7 +226,7 @@ public void interpret(InetAddress ep) long now = System.nanoTime(); double phi = hbWnd.phi(now); if (logger.isTraceEnabled()) - logger.trace("PHI for " + ep + " : " + phi); + logger.trace("PHI for {} : {}", ep, phi); if (PHI_FACTOR * phi > getPhiConvictThreshold()) { diff --git a/src/java/org/apache/cassandra/gms/GossipDigestSynVerbHandler.java b/src/java/org/apache/cassandra/gms/GossipDigestSynVerbHandler.java index 0f3a1e649e07..a1d1d9b5750d 100644 --- a/src/java/org/apache/cassandra/gms/GossipDigestSynVerbHandler.java +++ b/src/java/org/apache/cassandra/gms/GossipDigestSynVerbHandler.java @@ -68,7 +68,7 @@ public void doVerb(MessageIn message, int id) sb.append(gDigest); sb.append(" "); } - logger.trace("Gossip syn digests are : " + sb.toString()); + logger.trace("Gossip syn digests are : {}", sb); } doSort(gDigestList); diff --git a/src/java/org/apache/cassandra/gms/Gossiper.java b/src/java/org/apache/cassandra/gms/Gossiper.java index a7c4f97bac02..690f8132a7ae 100644 --- a/src/java/org/apache/cassandra/gms/Gossiper.java +++ b/src/java/org/apache/cassandra/gms/Gossiper.java @@ -130,7 +130,7 @@ public void run() /* Update the local heartbeat counter. */ endpointStateMap.get(FBUtilities.getBroadcastAddress()).getHeartBeatState().updateHeartBeat(); if (logger.isTraceEnabled()) - logger.trace("My heartbeat is now " + endpointStateMap.get(FBUtilities.getBroadcastAddress()).getHeartBeatState().getHeartBeatVersion()); + logger.trace("My heartbeat is now {}", endpointStateMap.get(FBUtilities.getBroadcastAddress()).getHeartBeatState().getHeartBeatVersion()); final List gDigests = new ArrayList(); Gossiper.instance.makeRandomGossipDigest(gDigests); @@ -413,7 +413,7 @@ private void makeRandomGossipDigest(List gDigests) sb.append(gDigest); sb.append(" "); } - logger.trace("Gossip Digests are : " + sb.toString()); + logger.trace("Gossip Digests are : {}", sb); } } @@ -745,7 +745,7 @@ EndpointState getStateForVersionBiggerThan(InetAddress forEndpoint, int version) { reqdEndpointState = new EndpointState(epState.getHeartBeatState()); if (logger.isTraceEnabled()) - logger.trace("local heartbeat version " + localHbVersion + " greater than " + version + " for " + forEndpoint); + logger.trace("local heartbeat version {} greater than {} for {}", localHbVersion, version, forEndpoint); } /* Accumulate all application states whose versions are greater than "version" variable */ for (Entry entry : epState.getApplicationStateMap().entrySet()) @@ -759,7 +759,7 @@ EndpointState getStateForVersionBiggerThan(InetAddress forEndpoint, int version) } final ApplicationState key = entry.getKey(); if (logger.isTraceEnabled()) - logger.trace("Adding state " + key + ": " + value.value); + logger.trace("Adding state {}: {}" , key, value.value); reqdEndpointState.addApplicationState(key, value); } } @@ -863,12 +863,12 @@ private void realMarkAlive(final InetAddress addr, final EndpointState localStat liveEndpoints.add(addr); unreachableEndpoints.remove(addr); expireTimeEndpointMap.remove(addr); - logger.debug("removing expire time for endpoint : " + addr); + logger.debug("removing expire time for endpoint : {}", addr); logger.info("InetAddress {} is now UP", addr); for (IEndpointStateChangeSubscriber subscriber : subscribers) subscriber.onAlive(addr, localState); if (logger.isTraceEnabled()) - logger.trace("Notified " + subscribers); + logger.trace("Notified {}", subscribers); } private void markDead(InetAddress addr, EndpointState localState) @@ -882,7 +882,7 @@ private void markDead(InetAddress addr, EndpointState localState) for (IEndpointStateChangeSubscriber subscriber : subscribers) subscriber.onDead(addr, localState); if (logger.isTraceEnabled()) - logger.trace("Notified " + subscribers); + logger.trace("Notified {}", subscribers); } /** @@ -901,7 +901,7 @@ private void handleMajorStateChange(InetAddress ep, EndpointState epState) logger.info("Node {} is now part of the cluster", ep); } if (logger.isTraceEnabled()) - logger.trace("Adding endpoint state for " + ep); + logger.trace("Adding endpoint state for {}", ep); endpointStateMap.put(ep, epState); // the node restarted: it is up to the subscriber to take whatever action is necessary @@ -945,7 +945,7 @@ void applyStateLocally(Map epStateMap) if (justRemovedEndpoints.containsKey(ep)) { if (logger.isTraceEnabled()) - logger.trace("Ignoring gossip for " + ep + " because it is quarantined"); + logger.trace("Ignoring gossip for {} because it is quarantined", ep); continue; } @@ -960,12 +960,12 @@ void applyStateLocally(Map epStateMap) int localGeneration = localEpStatePtr.getHeartBeatState().getGeneration(); int remoteGeneration = remoteState.getHeartBeatState().getGeneration(); if (logger.isTraceEnabled()) - logger.trace(ep + "local generation " + localGeneration + ", remote generation " + remoteGeneration); + logger.trace("{} local generation {}, remote generation {}", ep, localGeneration, remoteGeneration); if (remoteGeneration > localGeneration) { if (logger.isTraceEnabled()) - logger.trace("Updating heartbeat state generation to " + remoteGeneration + " from " + localGeneration + " for " + ep); + logger.trace("Updating heartbeat state generation to {} from {} for {}", remoteGeneration, localGeneration, ep); // major state change will handle the update by inserting the remote state directly handleMajorStateChange(ep, remoteState); } @@ -980,14 +980,14 @@ else if (remoteGeneration == localGeneration) // generation has not changed, app applyNewStates(ep, localEpStatePtr, remoteState); } else if (logger.isTraceEnabled()) - logger.trace("Ignoring remote version " + remoteMaxVersion + " <= " + localMaxVersion + " for " + ep); + logger.trace("Ignoring remote version {} <= {} for {}", remoteMaxVersion, localMaxVersion, ep); if (!localEpStatePtr.isAlive() && !isDeadState(localEpStatePtr)) // unless of course, it was dead markAlive(ep, localEpStatePtr); } else { if (logger.isTraceEnabled()) - logger.trace("Ignoring remote generation " + remoteGeneration + " < " + localGeneration); + logger.trace("Ignoring remote generation {} < {}", remoteGeneration, localGeneration); } } else @@ -1006,7 +1006,7 @@ private void applyNewStates(InetAddress addr, EndpointState localState, Endpoint localState.setHeartBeatState(remoteState.getHeartBeatState()); if (logger.isTraceEnabled()) - logger.trace("Updating heartbeat state version to " + localState.getHeartBeatState().getHeartBeatVersion() + " from " + oldVersion + " for " + addr + " ..."); + logger.trace("Updating heartbeat state version to {} from {} for {} ...", localState.getHeartBeatState().getHeartBeatVersion(), oldVersion, addr); // we need to make two loops here, one to apply, then another to notify, this way all states in an update are present and current when the notifications are received for (Entry remoteEntry : remoteState.getApplicationStateMap().entrySet()) @@ -1047,7 +1047,7 @@ private void requestAll(GossipDigest gDigest, List deltaGossipDige /* We are here since we have no data for this endpoint locally so request everthing. */ deltaGossipDigestList.add(new GossipDigest(gDigest.getEndpoint(), remoteGeneration, 0)); if (logger.isTraceEnabled()) - logger.trace("requestAll for " + gDigest.getEndpoint()); + logger.trace("requestAll for {}", gDigest.getEndpoint()); } /* Send all the data with version greater than maxRemoteVersion */ @@ -1152,7 +1152,7 @@ public void start(int generationNbr, Map prelo //notify snitches that Gossiper is about to start DatabaseDescriptor.getEndpointSnitch().gossiperStarting(); if (logger.isTraceEnabled()) - logger.trace("gossip started with generation " + localState.getHeartBeatState().getGeneration()); + logger.trace("gossip started with generation {}", localState.getHeartBeatState().getGeneration()); scheduledGossipTask = executor.scheduleWithFixedDelay(new GossipTask(), Gossiper.intervalInMillis, @@ -1244,7 +1244,7 @@ public void addSavedEndpoint(InetAddress ep) endpointStateMap.put(ep, epState); unreachableEndpoints.put(ep, System.nanoTime()); if (logger.isTraceEnabled()) - logger.trace("Adding saved endpoint " + ep + " " + epState.getHeartBeatState().getGeneration()); + logger.trace("Adding saved endpoint {} {}", ep, epState.getHeartBeatState().getGeneration()); } public void addLocalApplicationState(ApplicationState state, VersionedValue value) diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java b/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java index a7fd881dd766..b7e8f058a593 100644 --- a/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java +++ b/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java @@ -158,7 +158,7 @@ private void afterAppend(DecoratedKey decoratedKey, long dataPosition, RowIndexE first = lastWrittenKey; if (logger.isTraceEnabled()) - logger.trace("wrote " + decoratedKey + " at " + dataPosition); + logger.trace("wrote {} at {}", decoratedKey, dataPosition); iwriter.append(decoratedKey, index); dbuilder.addPotentialBoundary(dataPosition); } @@ -471,7 +471,7 @@ public void append(DecoratedKey key, RowIndexEntry indexEntry) } if (logger.isTraceEnabled()) - logger.trace("wrote index entry: " + indexEntry + " at " + indexPosition); + logger.trace("wrote index entry: {} at {}", indexEntry, indexPosition); summary.maybeAddEntry(key, indexPosition); builder.addPotentialBoundary(indexPosition); diff --git a/src/java/org/apache/cassandra/net/MessagingService.java b/src/java/org/apache/cassandra/net/MessagingService.java index 97135760dcfb..73662c16279e 100644 --- a/src/java/org/apache/cassandra/net/MessagingService.java +++ b/src/java/org/apache/cassandra/net/MessagingService.java @@ -622,7 +622,7 @@ public void sendReply(MessageOut message, int id, InetAddress to) public void sendOneWay(MessageOut message, int id, InetAddress to) { if (logger.isTraceEnabled()) - logger.trace(FBUtilities.getBroadcastAddress() + " sending " + message.verb + " to " + id + "@" + to); + logger.trace("{} sending {} to {}@{}", FBUtilities.getBroadcastAddress(), message.verb, id, to); if (to.equals(FBUtilities.getBroadcastAddress())) logger.trace("Message-to-self {} going over MessagingService", message); diff --git a/src/java/org/apache/cassandra/service/PendingRangeCalculatorService.java b/src/java/org/apache/cassandra/service/PendingRangeCalculatorService.java index c2b18143a3de..2e201bfaa03a 100644 --- a/src/java/org/apache/cassandra/service/PendingRangeCalculatorService.java +++ b/src/java/org/apache/cassandra/service/PendingRangeCalculatorService.java @@ -202,6 +202,6 @@ public static void calculatePendingRanges(AbstractReplicationStrategy strategy, tm.setPendingRanges(keyspaceName, pendingRanges); if (logger.isDebugEnabled()) - logger.debug("Pending ranges:\n" + (pendingRanges.isEmpty() ? "" : tm.printPendingRanges())); + logger.debug("Pending ranges:\n{}", (pendingRanges.isEmpty() ? "" : tm.printPendingRanges())); } } diff --git a/test/unit/org/apache/cassandra/locator/NetworkTopologyStrategyTest.java b/test/unit/org/apache/cassandra/locator/NetworkTopologyStrategyTest.java index d4d5a85878aa..be93faa58611 100644 --- a/test/unit/org/apache/cassandra/locator/NetworkTopologyStrategyTest.java +++ b/test/unit/org/apache/cassandra/locator/NetworkTopologyStrategyTest.java @@ -121,7 +121,7 @@ public void testLargeCluster() throws UnknownHostException, ConfigurationExcepti byte[] ipBytes = new byte[]{10, (byte)dc, (byte)rack, (byte)ep}; InetAddress address = InetAddress.getByAddress(ipBytes); StringToken token = new StringToken(String.format("%02x%02x%02x", ep, rack, dc)); - logger.debug("adding node " + address + " at " + token); + logger.debug("adding node {} at {}", address, token); tokens.put(address, token); } } @@ -137,7 +137,7 @@ public void testLargeCluster() throws UnknownHostException, ConfigurationExcepti Assert.assertEquals(totalRF, endpoints.size()); Assert.assertEquals(totalRF, epSet.size()); - logger.debug(testToken + ": " + endpoints.toString()); + logger.debug("{}: {}", testToken, endpoints); } } diff --git a/test/unit/org/apache/cassandra/streaming/StreamingTransferTest.java b/test/unit/org/apache/cassandra/streaming/StreamingTransferTest.java index f09b6a4a3f41..ac0b30a2a429 100644 --- a/test/unit/org/apache/cassandra/streaming/StreamingTransferTest.java +++ b/test/unit/org/apache/cassandra/streaming/StreamingTransferTest.java @@ -131,7 +131,7 @@ public void testRequestEmpty() throws Exception private List createAndTransfer(ColumnFamilyStore cfs, Mutator mutator, boolean transferSSTables) throws Exception { // write a temporary SSTable, and unregister it - logger.debug("Mutating " + cfs.name); + logger.debug("Mutating {}", cfs.name); long timestamp = 1234; for (int i = 1; i <= 3; i++) mutator.mutate("key" + i, "col" + i, timestamp); @@ -140,7 +140,7 @@ private List createAndTransfer(ColumnFamilyStore cfs, Mutator mutator, b assertEquals(1, cfs.getSSTables().size()); // transfer the first and last key - logger.debug("Transferring " + cfs.name); + logger.debug("Transferring {}", cfs.name); int[] offs; if (transferSSTables) { @@ -179,7 +179,7 @@ private List createAndTransfer(ColumnFamilyStore cfs, Mutator mutator, b for (int off : offs) keys.add("key" + off); - logger.debug("... everything looks good for " + cfs.name); + logger.debug("... everything looks good for {}", cfs.name); return keys; } @@ -232,7 +232,7 @@ public void mutate(String key, String col, long timestamp) throws Exception cf.addColumn(column(col, "v", timestamp)); cf.addColumn(new Cell(cellname("birthdate"), ByteBufferUtil.bytes(val), timestamp)); Mutation rm = new Mutation("Keyspace1", ByteBufferUtil.bytes(key), cf); - logger.debug("Applying row to transfer " + rm); + logger.debug("Applying row to transfer {}", rm); rm.apply(); } }, transferSSTables); @@ -456,7 +456,7 @@ public void mutate(String key, String colName, long timestamp) throws Exception cf.addColumn(column(colName, "value", timestamp)); cf.addColumn(new Cell(cellname("birthdate"), ByteBufferUtil.bytes(new Date(timestamp).toString()), timestamp)); Mutation rm = new Mutation("Keyspace1", ByteBufferUtil.bytes(key), cf); - logger.debug("Applying row to transfer " + rm); + logger.debug("Applying row to transfer {}", rm); rm.apply(); } }; From aabc43973eaa097d004e7d2cd09ff1576b38c0eb Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Tue, 18 Mar 2014 20:50:05 -0400 Subject: [PATCH 013/557] prefer assertEquals to assertTrue --- test/unit/org/apache/cassandra/db/RangeTombstoneTest.java | 2 +- test/unit/org/apache/cassandra/utils/CounterIdTest.java | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java b/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java index 89f8b2ac4086..d8d3b602cd2f 100644 --- a/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java +++ b/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java @@ -299,7 +299,7 @@ public void reverseQueryTest() throws Exception assertFalse(cf.isEmpty()); int last = i(cf.getSortedColumns().iterator().next().name()); - assertTrue("Last column should be column 1 since column 2 has been deleted", last == 1); + assertEquals("Last column should be column 1 since column 2 has been deleted", 1, last); } @Test diff --git a/test/unit/org/apache/cassandra/utils/CounterIdTest.java b/test/unit/org/apache/cassandra/utils/CounterIdTest.java index 2b6cb3267444..9dd999ec8792 100644 --- a/test/unit/org/apache/cassandra/utils/CounterIdTest.java +++ b/test/unit/org/apache/cassandra/utils/CounterIdTest.java @@ -23,7 +23,6 @@ import org.apache.cassandra.db.SystemKeyspace; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; public class CounterIdTest extends SchemaLoader { @@ -38,12 +37,12 @@ public void testGetCurrentIdFromSystemKeyspace() CounterId.renewLocalId(); CounterId id1 = CounterId.getLocalId(); assertEquals(id1, SystemKeyspace.getCurrentLocalCounterId()); - assertTrue(id1.compareTo(id0) == 1); + assertEquals(1, id1.compareTo(id0)); CounterId.renewLocalId(); CounterId id2 = CounterId.getLocalId(); assertEquals(id2, SystemKeyspace.getCurrentLocalCounterId()); - assertTrue(id2.compareTo(id1) == 1); + assertEquals(1, id2.compareTo(id1)); } } From 283175ee6032a652080f3767fa1fcac0ca74af0e Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Tue, 18 Mar 2014 20:54:29 -0400 Subject: [PATCH 014/557] don't rely on the Integer cache for equality --- test/unit/org/apache/cassandra/utils/BTreeTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/unit/org/apache/cassandra/utils/BTreeTest.java b/test/unit/org/apache/cassandra/utils/BTreeTest.java index b4a960b11d11..9ccb75fee47a 100644 --- a/test/unit/org/apache/cassandra/utils/BTreeTest.java +++ b/test/unit/org/apache/cassandra/utils/BTreeTest.java @@ -23,6 +23,7 @@ import java.util.Random; import java.util.concurrent.ThreadLocalRandom; +import static org.junit.Assert.assertEquals; import org.junit.Test; import org.apache.cassandra.utils.btree.BTree; @@ -119,7 +120,7 @@ private static void checkResult(int count, Object[] btree) assert vs.size() == count; int i = 0; for (Integer j : vs) - assert j == ints[i++]; + assertEquals(j, ints[i++]); } } From 2639ac2ae94f8a2d773cf333a2631772df479325 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Tue, 18 Mar 2014 21:03:50 -0400 Subject: [PATCH 015/557] remove dead code --- .../cassandra/locator/OldNetworkTopologyStrategyTest.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/unit/org/apache/cassandra/locator/OldNetworkTopologyStrategyTest.java b/test/unit/org/apache/cassandra/locator/OldNetworkTopologyStrategyTest.java index 14cb54dbf611..4ae21c02211a 100644 --- a/test/unit/org/apache/cassandra/locator/OldNetworkTopologyStrategyTest.java +++ b/test/unit/org/apache/cassandra/locator/OldNetworkTopologyStrategyTest.java @@ -43,7 +43,6 @@ public class OldNetworkTopologyStrategyTest extends SchemaLoader { - private List endpointTokens; private List keyTokens; private TokenMetadata tmd; private Map> expectedResults; @@ -51,7 +50,6 @@ public class OldNetworkTopologyStrategyTest extends SchemaLoader @Before public void init() { - endpointTokens = new ArrayList(); keyTokens = new ArrayList(); tmd = new TokenMetadata(); expectedResults = new HashMap>(); @@ -145,7 +143,6 @@ private ArrayList buildResult(String... addresses) throws UnknownHo private void addEndpoint(String endpointTokenID, String keyTokenID, String endpointAddress) throws UnknownHostException { BigIntegerToken endpointToken = new BigIntegerToken(endpointTokenID); - endpointTokens.add(endpointToken); BigIntegerToken keyToken = new BigIntegerToken(keyTokenID); keyTokens.add(keyToken); From 6f24097f66b1575045e5f222cd5de6bc70c505e6 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Sun, 23 Mar 2014 01:03:16 -0400 Subject: [PATCH 016/557] simplify --- .../org/apache/cassandra/cql3/statements/CQL3CasConditions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/cassandra/cql3/statements/CQL3CasConditions.java b/src/java/org/apache/cassandra/cql3/statements/CQL3CasConditions.java index 9451ce9005af..835e0e9ea376 100644 --- a/src/java/org/apache/cassandra/cql3/statements/CQL3CasConditions.java +++ b/src/java/org/apache/cassandra/cql3/statements/CQL3CasConditions.java @@ -66,7 +66,7 @@ public void addExist(Composite prefix) throws InvalidRequestException { RowCondition previous = conditions.put(prefix, new ExistCondition(prefix, now)); // this should be prevented by the parser, but it doesn't hurt to check - if (previous != null && previous instanceof NotExistCondition) + if (previous instanceof NotExistCondition) throw new InvalidRequestException("Cannot mix IF EXISTS and IF NOT EXISTS conditions for the same row"); } From 1cd818c6b4b36e1b4c55e52bb7d4bcc2af1dc322 Mon Sep 17 00:00:00 2001 From: Aleksey Yeschenko Date: Thu, 27 Mar 2014 16:02:23 +0300 Subject: [PATCH 017/557] Get rid of redundant cfs arg in ABSC#cloneToHeap() --- .../org/apache/cassandra/db/ArrayBackedSortedColumns.java | 4 ++-- src/java/org/apache/cassandra/db/Memtable.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java b/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java index 4a8390133640..ba8f2782d5a8 100644 --- a/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java +++ b/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java @@ -86,7 +86,7 @@ private ArrayBackedSortedColumns(ArrayBackedSortedColumns original) this.isSorted = original.isSorted; } - public static ColumnFamily cloneToHeap(ColumnFamily value, ColumnFamilyStore cfs) + public static ColumnFamily cloneToHeap(ColumnFamily value) { if (value.getColumnCount() == 0) return value; @@ -95,7 +95,7 @@ public static ColumnFamily cloneToHeap(ColumnFamily value, ColumnFamilyStore cfs int i = 0; for (Cell cell : value) cells[i++] = cell.localCopy(HeapAllocator.instance); - ColumnFamily r = new ArrayBackedSortedColumns(cfs.metadata, value.isInsertReversed(), cells, i, i); + ColumnFamily r = new ArrayBackedSortedColumns(value.metadata, value.isInsertReversed(), cells, i, i); r.delete(value); return r; } diff --git a/src/java/org/apache/cassandra/db/Memtable.java b/src/java/org/apache/cassandra/db/Memtable.java index 91dcf2dae342..415e3bc5c00d 100644 --- a/src/java/org/apache/cassandra/db/Memtable.java +++ b/src/java/org/apache/cassandra/db/Memtable.java @@ -259,7 +259,7 @@ public Map.Entry next() { DecoratedKey key = (DecoratedKey) entry.getKey(); key = new DecoratedKey(key.token, HeapAllocator.instance.clone(key.key)); - ColumnFamily columns = ArrayBackedSortedColumns.cloneToHeap(entry.getValue(), cfs); + ColumnFamily columns = ArrayBackedSortedColumns.cloneToHeap(entry.getValue()); entry = new AbstractMap.SimpleImmutableEntry<>(key, columns); } // Store the reference to the current entry so that remove() can update the current size. From 6e9140ab6004e6eb6eac6f05073d158a40c0645f Mon Sep 17 00:00:00 2001 From: Jonathan Ellis Date: Wed, 2 Apr 2014 20:36:56 -0500 Subject: [PATCH 018/557] optimize fetching multiple cells by name from CF patch by Benedict Elliott Smith; reviewed by jbellis and ayeschenko for CASSANDRA-6933 --- .../db/ArrayBackedSortedColumns.java | 52 ++++++++++ .../cassandra/db/AtomicBTreeColumns.java | 7 ++ .../cassandra/db/CollationController.java | 6 +- .../org/apache/cassandra/db/ColumnFamily.java | 2 + .../cassandra/db/filter/NamesQueryFilter.java | 15 +-- .../service/AbstractRowResolver.java | 7 +- .../cassandra/utils/SearchIterator.java | 26 +++++ .../utils/btree/BTreeSearchIterator.java | 67 +++++++++++++ .../apache/cassandra/utils/btree/Cursor.java | 12 +-- .../apache/cassandra/utils/btree/Path.java | 46 ++++++--- .../apache/cassandra/utils/LongBTreeTest.java | 96 +++++++++++++++++++ .../db/ArrayBackedSortedColumnsTest.java | 43 +++++++++ 12 files changed, 349 insertions(+), 30 deletions(-) create mode 100644 src/java/org/apache/cassandra/utils/SearchIterator.java create mode 100644 src/java/org/apache/cassandra/utils/btree/BTreeSearchIterator.java diff --git a/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java b/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java index e04867a6bf99..0fe4448e8b0a 100644 --- a/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java +++ b/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java @@ -35,6 +35,7 @@ import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.db.filter.ColumnSlice; import org.apache.cassandra.utils.memory.AbstractAllocator; +import org.apache.cassandra.utils.SearchIterator; /** * A ColumnFamily backed by an array. @@ -437,6 +438,57 @@ public Iterator reverseIterator(ColumnSlice[] slices) return new SlicesIterator(Arrays.asList(cells).subList(0, size), getComparator(), slices, !reversed); } + public SearchIterator searchIterator() + { + maybeSortCells(); + return new SearchIterator() + { + // the first index that we could find the next key at, i.e. one larger + // than the last key's location + private int i = 0; + + // We assume a uniform distribution of keys, + // so we keep track of how many keys were skipped to satisfy last lookup, and only look at twice that + // many keys for next lookup initially, extending to whole range only if we couldn't find it in that subrange + private int range = size / 2; + + public boolean hasNext() + { + return i < size; + } + + public Cell next(CellName name) + { + assert sortedSize == size; + assert hasNext(); + + // optimize for runs of sequential matches, as in CollationController + // checking to see if we've found the desired cells yet (CASSANDRA-6933) + if (metadata.comparator.compare(name, cells[i].name()) == 0) + return cells[i++]; + + // use range to manually force a better bsearch "pivot" by breaking it into two calls: + // first for i..i+range, then i+range..size if necessary. + // https://issues.apache.org/jira/browse/CASSANDRA-6933?focusedCommentId=13958264&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13958264 + int limit = Math.min(size, i + range); + int i2 = binarySearch(i + 1, limit, name, internalComparator()); + if (-1 - i2 == limit) + i2 = binarySearch(limit, size, name, internalComparator()); + // i2 can't be zero since we already checked cells[i] above + if (i2 > 0) + { + range = i2 - i; + i = i2 + 1; + return cells[i2]; + } + i2 = -1 - i2; + range = i2 - i; + i = i2; + return null; + } + }; + } + private static class SlicesIterator extends AbstractIterator { private final List cells; diff --git a/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java b/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java index 8cbeb832898d..84192355ed33 100644 --- a/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java +++ b/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java @@ -36,7 +36,9 @@ import org.apache.cassandra.db.index.SecondaryIndexManager; import org.apache.cassandra.db.filter.ColumnSlice; import org.apache.cassandra.utils.ObjectSizes; +import org.apache.cassandra.utils.SearchIterator; import org.apache.cassandra.utils.btree.BTree; +import org.apache.cassandra.utils.btree.BTreeSearchIterator; import org.apache.cassandra.utils.btree.BTreeSet; import org.apache.cassandra.utils.btree.UpdateFunction; @@ -119,6 +121,11 @@ protected void delete(RangeTombstone tombstone) delete(new DeletionInfo(tombstone, getComparator())); } + public SearchIterator searchIterator() + { + return new BTreeSearchIterator<>(ref.tree, asymmetricComparator()); + } + public void delete(DeletionInfo info) { if (info.isLive()) diff --git a/src/java/org/apache/cassandra/db/CollationController.java b/src/java/org/apache/cassandra/db/CollationController.java index 151a7c511870..74113e082d42 100644 --- a/src/java/org/apache/cassandra/db/CollationController.java +++ b/src/java/org/apache/cassandra/db/CollationController.java @@ -34,6 +34,7 @@ import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.tracing.Tracing; +import org.apache.cassandra.utils.SearchIterator; import org.apache.cassandra.utils.memory.HeapAllocator; public class CollationController @@ -171,10 +172,11 @@ private void reduceNameFilter(QueryFilter filter, ColumnFamily container, long s if (container == null) return; - for (Iterator iterator = ((NamesQueryFilter) filter.filter).columns.iterator(); iterator.hasNext(); ) + SearchIterator searchIter = container.searchIterator(); + for (Iterator iterator = ((NamesQueryFilter) filter.filter).columns.iterator(); iterator.hasNext() && searchIter.hasNext(); ) { CellName filterColumn = iterator.next(); - Cell cell = container.getColumn(filterColumn); + Cell cell = searchIter.next(filterColumn); if (cell != null && cell.timestamp() > sstableTimestamp) iterator.remove(); } diff --git a/src/java/org/apache/cassandra/db/ColumnFamily.java b/src/java/org/apache/cassandra/db/ColumnFamily.java index e7aab377708b..e9eb05a620a1 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamily.java +++ b/src/java/org/apache/cassandra/db/ColumnFamily.java @@ -189,6 +189,8 @@ public DeletionInfo.InOrderTester inOrderDeletionTester() public abstract void delete(DeletionTime deletionTime); protected abstract void delete(RangeTombstone tombstone); + public abstract SearchIterator searchIterator(); + /** * Purges top-level and range tombstones whose localDeletionTime is older than gcBefore. * @param gcBefore a timestamp (in seconds) before which tombstones should be purged diff --git a/src/java/org/apache/cassandra/db/filter/NamesQueryFilter.java b/src/java/org/apache/cassandra/db/filter/NamesQueryFilter.java index d6d1332edbd1..03e3f12c397e 100644 --- a/src/java/org/apache/cassandra/db/filter/NamesQueryFilter.java +++ b/src/java/org/apache/cassandra/db/filter/NamesQueryFilter.java @@ -39,6 +39,7 @@ import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.io.util.FileDataInput; +import org.apache.cassandra.utils.SearchIterator; public class NamesQueryFilter implements IDiskAtomFilter { @@ -183,13 +184,15 @@ private static class ByNameColumnIterator extends AbstractIterator i { private final ColumnFamily cf; private final DecoratedKey key; - private final Iterator iter; + private final Iterator names; + private final SearchIterator cells; - public ByNameColumnIterator(Iterator iter, ColumnFamily cf, DecoratedKey key) + public ByNameColumnIterator(Iterator names, ColumnFamily cf, DecoratedKey key) { - this.iter = iter; + this.names = names; this.cf = cf; this.key = key; + this.cells = cf.searchIterator(); } public ColumnFamily getColumnFamily() @@ -204,10 +207,10 @@ public DecoratedKey getKey() protected OnDiskAtom computeNext() { - while (iter.hasNext()) + while (names.hasNext() && cells.hasNext()) { - CellName current = iter.next(); - Cell cell = cf.getColumn(current); + CellName current = names.next(); + Cell cell = cells.next(current); if (cell != null) return cell; } diff --git a/src/java/org/apache/cassandra/service/AbstractRowResolver.java b/src/java/org/apache/cassandra/service/AbstractRowResolver.java index 47a00dae7b4f..e27dc00141cc 100644 --- a/src/java/org/apache/cassandra/service/AbstractRowResolver.java +++ b/src/java/org/apache/cassandra/service/AbstractRowResolver.java @@ -18,9 +18,10 @@ package org.apache.cassandra.service; import java.nio.ByteBuffer; -import java.util.Set; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; -import org.cliffc.high_scale_lib.NonBlockingHashSet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,7 +35,7 @@ public abstract class AbstractRowResolver implements IResponseResolver> replies = new NonBlockingHashSet>(); + protected final List> replies = Collections.synchronizedList(new ArrayList>()); protected final DecoratedKey key; public AbstractRowResolver(ByteBuffer key, String keyspaceName) diff --git a/src/java/org/apache/cassandra/utils/SearchIterator.java b/src/java/org/apache/cassandra/utils/SearchIterator.java new file mode 100644 index 000000000000..004b02aacd02 --- /dev/null +++ b/src/java/org/apache/cassandra/utils/SearchIterator.java @@ -0,0 +1,26 @@ +/* + * 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.utils; + +public interface SearchIterator +{ + + public boolean hasNext(); + public V next(K key); + +} diff --git a/src/java/org/apache/cassandra/utils/btree/BTreeSearchIterator.java b/src/java/org/apache/cassandra/utils/btree/BTreeSearchIterator.java new file mode 100644 index 000000000000..7a83238c5777 --- /dev/null +++ b/src/java/org/apache/cassandra/utils/btree/BTreeSearchIterator.java @@ -0,0 +1,67 @@ +/* + * 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.utils.btree; + +import java.util.Comparator; + +import org.apache.cassandra.utils.SearchIterator; + +import static org.apache.cassandra.utils.btree.BTree.getKeyEnd; + +public class BTreeSearchIterator extends Path implements SearchIterator +{ + + final Comparator comparator; + public BTreeSearchIterator(Object[] btree, Comparator comparator) + { + init(btree); + this.comparator = comparator; + } + + public V next(K target) + { + while (depth > 0) + { + byte successorParentDepth = findSuccessorParentDepth(); + if (successorParentDepth < 0) + break; // we're in last section of tree, so can only search down + int successorParentIndex = indexes[successorParentDepth] + 1; + Object[] successParentNode = path[successorParentDepth]; + Object successorParentKey = successParentNode[successorParentIndex]; + int c = BTree.compare(comparator, target, successorParentKey); + if (c < 0) + break; + if (c == 0) + { + depth = successorParentDepth; + indexes[successorParentDepth]++; + return (V) successorParentKey; + } + depth = successorParentDepth; + indexes[successorParentDepth]++; + } + if (find(comparator, target, Op.CEIL, true)) + return (V) currentKey(); + return null; + } + + public boolean hasNext() + { + return depth != 0 || indexes[0] != getKeyEnd(path[0]); + } +} diff --git a/src/java/org/apache/cassandra/utils/btree/Cursor.java b/src/java/org/apache/cassandra/utils/btree/Cursor.java index bc88442f4bcb..132a7768a3b2 100644 --- a/src/java/org/apache/cassandra/utils/btree/Cursor.java +++ b/src/java/org/apache/cassandra/utils/btree/Cursor.java @@ -93,7 +93,7 @@ public void reset(Object[] btree, Comparator comparator, V lowerBound, boolea private void _reset(Object[] btree, Comparator comparator, Object lowerBound, boolean inclusiveLowerBound, Object upperBound, boolean inclusiveUpperBound, boolean forwards) { - ensureDepth(btree); + init(btree); if (lowerBound == null) lowerBound = NEGATIVE_INFINITY; if (upperBound == null) @@ -101,16 +101,16 @@ private void _reset(Object[] btree, Comparator comparator, Object lowerBound, this.forwards = forwards; - Path findLast = new Path(this.path.length); + Path findLast = new Path(this.path.length, btree); if (forwards) { - findLast.find(btree, comparator, upperBound, inclusiveUpperBound ? Op.HIGHER : Op.CEIL, true); - find(btree, comparator, lowerBound, inclusiveLowerBound ? Op.CEIL : Op.HIGHER, true); + findLast.find(comparator, upperBound, inclusiveUpperBound ? Op.HIGHER : Op.CEIL, true); + find(comparator, lowerBound, inclusiveLowerBound ? Op.CEIL : Op.HIGHER, true); } else { - findLast.find(btree, comparator, lowerBound, inclusiveLowerBound ? Op.LOWER : Op.FLOOR, false); - find(btree, comparator, upperBound, inclusiveUpperBound ? Op.FLOOR : Op.LOWER, false); + findLast.find(comparator, lowerBound, inclusiveLowerBound ? Op.LOWER : Op.FLOOR, false); + find(comparator, upperBound, inclusiveUpperBound ? Op.FLOOR : Op.LOWER, false); } int c = this.compareTo(findLast, forwards); if (forwards ? c > 0 : c < 0) diff --git a/src/java/org/apache/cassandra/utils/btree/Path.java b/src/java/org/apache/cassandra/utils/btree/Path.java index 148c713cdead..49e2d4bd3a7e 100644 --- a/src/java/org/apache/cassandra/utils/btree/Path.java +++ b/src/java/org/apache/cassandra/utils/btree/Path.java @@ -34,7 +34,7 @@ * * Path is only intended to be used via Cursor. */ -class Path +public class Path { // operations corresponding to the ones in NavigableSet static enum Op @@ -50,16 +50,17 @@ static enum Op // the index within the node of our path at a given depth byte[] indexes; // current depth. nothing in path[i] for i > depth is valid. - byte depth = -1; + byte depth; Path() { } - Path(int depth) + Path(int depth, Object[] btree) { this.path = new Object[depth][]; this.indexes = new byte[depth]; + this.path[0] = btree; } - void ensureDepth(Object[] btree) + void init(Object[] btree) { int depth = BTree.depth(btree); if (path == null || path.length < depth) @@ -67,32 +68,36 @@ void ensureDepth(Object[] btree) path = new Object[depth][]; indexes = new byte[depth]; } + path[0] = btree; } /** * Find the provided key in the tree rooted at node, and store the root to it in the path * - * @param node the tree to search in * @param comparator the comparator defining the order on the tree * @param target the key to search for * @param mode the type of search to perform * @param forwards if the path should be setup for forward or backward iteration * @param */ - void find(Object[] node, Comparator comparator, Object target, Op mode, boolean forwards) + boolean find(Comparator comparator, Object target, Op mode, boolean forwards) { // TODO : should not require parameter 'forwards' - consider modifying index to represent both // child and key position, as opposed to just key position (which necessitates a different value depending // on which direction you're moving in. Prerequisite for making Path public and using to implement general // search - depth = -1; + Object[] node = path[depth]; + int lb = indexes[depth]; + assert lb == 0 || forwards; + pop(); while (true) { int keyEnd = getKeyEnd(node); // search for the target in the current node - int i = BTree.find(comparator, target, node, 0, keyEnd); + int i = BTree.find(comparator, target, node, lb, keyEnd); + lb = 0; if (i >= 0) { // exact match. transform exclusive bounds into the correct index by moving back or forwards one @@ -105,7 +110,7 @@ void find(Object[] node, Comparator comparator, Object target, Op mode, b case LOWER: predecessor(); } - return; + return true; } // traverse into the appropriate child @@ -141,16 +146,16 @@ else if (i >= keyEnd) push(node, i); } - return; + return false; } } - private boolean isRoot() + boolean isRoot() { return depth == 0; } - private void pop() + void pop() { depth--; } @@ -165,7 +170,7 @@ byte currentIndex() return indexes[depth]; } - private void push(Object[] node, int index) + void push(Object[] node, int index) { path[++depth] = node; indexes[depth] = (byte) index; @@ -176,6 +181,21 @@ void setIndex(int index) indexes[depth] = (byte) index; } + byte findSuccessorParentDepth() + { + byte depth = this.depth; + depth--; + while (depth >= 0) + { + int ub = indexes[depth] + 1; + Object[] node = path[depth]; + if (ub < getBranchKeyEnd(node)) + return depth; + depth--; + } + return -1; + } + // move to the next key in the tree void successor() { diff --git a/test/long/org/apache/cassandra/utils/LongBTreeTest.java b/test/long/org/apache/cassandra/utils/LongBTreeTest.java index 514d166830ac..498a9c97f1c3 100644 --- a/test/long/org/apache/cassandra/utils/LongBTreeTest.java +++ b/test/long/org/apache/cassandra/utils/LongBTreeTest.java @@ -20,11 +20,21 @@ import java.util.*; import java.util.concurrent.Callable; +import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; +import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; +import javax.annotation.Nullable; + +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; +import com.google.common.collect.Iterators; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFutureTask; @@ -37,7 +47,9 @@ import com.yammer.metrics.stats.Snapshot; import org.apache.cassandra.concurrent.NamedThreadFactory; import org.apache.cassandra.utils.btree.BTree; +import org.apache.cassandra.utils.btree.BTreeSearchIterator; import org.apache.cassandra.utils.btree.BTreeSet; +import org.apache.cassandra.utils.btree.UpdateFunction; // TODO : should probably lower fan-factor for tests to make them more intensive public class LongBTreeTest @@ -103,6 +115,51 @@ public void testSlicingSmallRandomTrees() throws ExecutionException, Interrupted testInsertions(10000, 50, 10, 10, false); } + @Test + public void testSearchIterator() throws InterruptedException + { + int threads = Runtime.getRuntime().availableProcessors(); + final CountDownLatch latch = new CountDownLatch(threads); + final AtomicLong errors = new AtomicLong(); + final AtomicLong count = new AtomicLong(); + final int perThreadTrees = 100; + final int perTreeSelections = 100; + final long totalCount = threads * perThreadTrees * perTreeSelections; + for (int t = 0 ; t < threads ; t++) + { + MODIFY.execute(new Runnable() + { + public void run() + { + ThreadLocalRandom random = ThreadLocalRandom.current(); + for (int i = 0 ; i < perThreadTrees ; i++) + { + Object[] tree = randomTree(10000, random); + for (int j = 0 ; j < perTreeSelections ; j++) + { + BTreeSearchIterator searchIterator = new BTreeSearchIterator<>(tree, ICMP); + for (Integer key : randomSelection(tree, random)) + if (key != searchIterator.next(key)) + errors.incrementAndGet(); + for (Integer key : randomMix(tree, random)) + if (key != searchIterator.next(key)) + if (BTree.find(tree, ICMP, key) == key) + errors.incrementAndGet(); + count.incrementAndGet(); + } + } + latch.countDown(); + } + }); + } + while (latch.getCount() > 0) + { + latch.await(10L, TimeUnit.SECONDS); + System.out.println(String.format("%.0f%% complete %s", 100 * count.get() / (double) totalCount, errors.get() > 0 ? ("Errors: " + errors.get()) : "")); + assert errors.get() == 0; + } + } + private static void testInsertions(int totalCount, int perTestCount, int testKeyRatio, int modificationBatchSize, boolean quickEquality) throws ExecutionException, InterruptedException { int batchesPerTest = perTestCount / modificationBatchSize; @@ -354,4 +411,43 @@ public void remove() }; } + private static Object[] randomTree(int maxSize, Random random) + { + TreeSet build = new TreeSet<>(); + int size = random.nextInt(maxSize); + for (int i = 0 ; i < size ; i++) + { + build.add(random.nextInt()); + } + return BTree.build(build, ICMP, true, UpdateFunction.NoOp.instance()); + } + + private static Iterable randomSelection(Object[] iter, final Random rnd) + { + final float proportion = rnd.nextFloat(); + return Iterables.filter(new BTreeSet<>(iter, ICMP), new Predicate() + { + public boolean apply(@Nullable Integer integer) + { + return rnd.nextFloat() < proportion; + } + }); + } + + private static Iterable randomMix(Object[] iter, final Random rnd) + { + final float proportion = rnd.nextFloat(); + return Iterables.transform(new BTreeSet<>(iter, ICMP), new Function() + { + int last = Integer.MIN_VALUE; + + public Integer apply(Integer v) + { + if (rnd.nextFloat() < proportion) + return last = v; + return last = (v - last) / 2; + } + }); + } + } diff --git a/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java b/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java index a1c98f341362..33d35995e876 100644 --- a/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java +++ b/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java @@ -32,6 +32,7 @@ import org.apache.cassandra.db.composites.*; import org.apache.cassandra.db.filter.ColumnSlice; import org.apache.cassandra.db.marshal.Int32Type; +import org.apache.cassandra.utils.SearchIterator; public class ArrayBackedSortedColumnsTest extends SchemaLoader { @@ -213,6 +214,43 @@ private void testIteratorInternal(boolean reversed) assertSame(map.iterator(), map.iterator(ColumnSlice.ALL_COLUMNS_ARRAY)); } + @Test + public void testSearchIterator() + { + CellNameType type = new SimpleDenseCellNameType(Int32Type.instance); + ColumnFamily map = ArrayBackedSortedColumns.factory.create(metadata(), false); + + int[] values = new int[]{ 1, 2, 3, 5, 9, 15, 21, 22 }; + + for (int i = 0; i < values.length; ++i) + map.addColumn(new Cell(type.makeCellName(values[i]))); + + SearchIterator iter = map.searchIterator(); + for (int i = 0 ; i < values.length ; i++) + assertSame(values[i], iter.next(type.makeCellName(values[i]))); + + iter = map.searchIterator(); + for (int i = 0 ; i < values.length ; i+=2) + assertSame(values[i], iter.next(type.makeCellName(values[i]))); + + iter = map.searchIterator(); + for (int i = 0 ; i < values.length ; i+=4) + assertSame(values[i], iter.next(type.makeCellName(values[i]))); + + iter = map.searchIterator(); + for (int i = 0 ; i < values.length ; i+=1) + { + if (i % 2 == 0) + { + Cell cell = iter.next(type.makeCellName(values[i] - 1)); + if (i > 0 && values[i - 1] == values[i] - 1) + assertSame(values[i - 1], cell); + else + assertNull(cell); + } + } + } + private void assertSame(Iterable c1, Iterable c2) { assertSame(c1.iterator(), c2.iterator()); @@ -226,6 +264,11 @@ private void assertSame(Iterator iter1, Iterator iter2) fail("The collection don't have the same size"); } + private void assertSame(int name, Cell cell) + { + int value = ByteBufferUtil.toInt(cell.name().toByteBuffer()); + assert name == value : "Expected " + name + " but got " + value; + } private void assertSame(int[] names, Iterator iter) { for (int name : names) From 4ebf82cc306ce4ef719abbb960d3f44b33f173af Mon Sep 17 00:00:00 2001 From: Aleksey Yeschenko Date: Thu, 3 Apr 2014 05:42:59 +0300 Subject: [PATCH 019/557] Throw IllegalStateException instead of using asserts --- .../org/apache/cassandra/db/ArrayBackedSortedColumns.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java b/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java index 0fe4448e8b0a..d79edd32463b 100644 --- a/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java +++ b/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java @@ -441,6 +441,7 @@ public Iterator reverseIterator(ColumnSlice[] slices) public SearchIterator searchIterator() { maybeSortCells(); + return new SearchIterator() { // the first index that we could find the next key at, i.e. one larger @@ -459,8 +460,8 @@ public boolean hasNext() public Cell next(CellName name) { - assert sortedSize == size; - assert hasNext(); + if (!isSorted || !hasNext()) + throw new IllegalStateException(); // optimize for runs of sequential matches, as in CollationController // checking to see if we've found the desired cells yet (CASSANDRA-6933) From 9baf92af2b09721fd0e2b99131a8bdb75dd2d7b6 Mon Sep 17 00:00:00 2001 From: Aleksey Yeschenko Date: Fri, 4 Apr 2014 02:15:02 +0300 Subject: [PATCH 020/557] Add missing CHANGES.txt entry for CASSANDRA-6933 --- CHANGES.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES.txt b/CHANGES.txt index 9bc8cf9c4e68..667cb74e8ef1 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,6 +1,7 @@ 3.0 * Remove CQL2 (CASSANDRA-5918) - * add Thrift get_multi_slice call (CASSANDRA-6757) + * Add Thrift get_multi_slice call (CASSANDRA-6757) + * Optimize fetching multiple cells by name (CASSANDRA-6933) 2.1.0-beta2 From 28d82160fc9e1082755ff770d189dacbabbeef80 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Thu, 3 Apr 2014 18:29:58 -0500 Subject: [PATCH 021/557] Revert "Fix LatencyMetrics returning infinity." This reverts commit 5e51aa4e6d1d868bb82a1aa2ffaed4613b24ffc1. --- .../apache/cassandra/metrics/LatencyMetrics.java | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/java/org/apache/cassandra/metrics/LatencyMetrics.java b/src/java/org/apache/cassandra/metrics/LatencyMetrics.java index ef1dee908e00..b53449c46eb5 100644 --- a/src/java/org/apache/cassandra/metrics/LatencyMetrics.java +++ b/src/java/org/apache/cassandra/metrics/LatencyMetrics.java @@ -85,11 +85,8 @@ public LatencyMetrics(MetricNameFactory factory, String namePrefix) public void addNano(long nanos) { // convert to microseconds. 1 millionth - synchronized (this) - { - latency.update(nanos, TimeUnit.NANOSECONDS); - totalLatency.inc(nanos / 1000); - } + latency.update(nanos, TimeUnit.NANOSECONDS); + totalLatency.inc(nanos / 1000); totalLatencyHistogram.add(nanos / 1000); recentLatencyHistogram.add(nanos / 1000); } @@ -103,13 +100,8 @@ public void release() @Deprecated public double getRecentLatency() { - long ops = 0; - long n = 0; - synchronized (this) - { - ops = latency.count(); - n = totalLatency.count(); - } + long ops = latency.count(); + long n = totalLatency.count(); try { return ((double) n - lastLatency) / (ops - lastOpCount); From ca75b97e59b56768741f7ba0a7f2ff206588c573 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Thu, 3 Apr 2014 18:30:43 -0500 Subject: [PATCH 022/557] getRecentLatency returns zero instead of infinity Patch by Benedict, reviewed by brandonwilliams for CASSANDRA-6920 --- src/java/org/apache/cassandra/metrics/LatencyMetrics.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/cassandra/metrics/LatencyMetrics.java b/src/java/org/apache/cassandra/metrics/LatencyMetrics.java index b53449c46eb5..b456e2aeeb90 100644 --- a/src/java/org/apache/cassandra/metrics/LatencyMetrics.java +++ b/src/java/org/apache/cassandra/metrics/LatencyMetrics.java @@ -98,10 +98,12 @@ public void release() } @Deprecated - public double getRecentLatency() + public synchronized double getRecentLatency() { long ops = latency.count(); long n = totalLatency.count(); + if (ops == lastOpCount) + return 0; try { return ((double) n - lastLatency) / (ops - lastOpCount); From c18ce589efdf480ad4623298ffb7038eb4091afb Mon Sep 17 00:00:00 2001 From: Jonathan Ellis Date: Mon, 7 Apr 2014 15:51:35 -0500 Subject: [PATCH 023/557] Move sstableRandomAccessReader to nio2 patch by Josh McKenzie; reviewed by Benedict Elliott Smith for CASSANDRA-4050 --- CHANGES.txt | 2 + .../CompressedRandomAccessReader.java | 104 +++++----- .../compress/CompressedThrottledReader.java | 2 +- .../cassandra/io/util/AbstractDataInput.java | 24 ++- .../io/util/MappedFileDataInput.java | 34 ++-- .../cassandra/io/util/MemoryInputStream.java | 19 +- .../cassandra/io/util/RandomAccessReader.java | 177 +++++++++--------- .../cassandra/io/util/ThrottledReader.java | 2 +- .../cassandra/utils/ByteBufferUtil.java | 9 + .../utils/vint/EncodedDataInputStream.java | 18 +- .../io/util/BufferedRandomAccessFileTest.java | 38 ---- 11 files changed, 208 insertions(+), 221 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 64a53b863ed5..8338f1b0f7e6 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,6 @@ 3.0 + * Move sstable RandomAccessReader to nio2, which allows using the + FILE_SHARE_DELETE flag on Windows (CASSANDRA-4050) * Remove CQL2 (CASSANDRA-5918) * Add Thrift get_multi_slice call (CASSANDRA-6757) * Optimize fetching multiple cells by name (CASSANDRA-6933) diff --git a/src/java/org/apache/cassandra/io/compress/CompressedRandomAccessReader.java b/src/java/org/apache/cassandra/io/compress/CompressedRandomAccessReader.java index 131a4d6ff492..d71964ca8904 100644 --- a/src/java/org/apache/cassandra/io/compress/CompressedRandomAccessReader.java +++ b/src/java/org/apache/cassandra/io/compress/CompressedRandomAccessReader.java @@ -79,70 +79,80 @@ protected CompressedRandomAccessReader(String dataFilePath, CompressionMetadata compressed = ByteBuffer.wrap(new byte[metadata.compressor().initialCompressedBufferLength(metadata.chunkLength())]); } + protected ByteBuffer allocateBuffer(int bufferSize) + { + assert Integer.bitCount(bufferSize) == 1; + return ByteBuffer.allocate(bufferSize); + } + @Override protected void reBuffer() { try { - decompressChunk(metadata.chunkFor(current)); - } - catch (CorruptBlockException e) - { - throw new CorruptSSTableException(e, getPath()); - } - catch (IOException e) - { - throw new FSReadError(e, getPath()); - } - } - - private void decompressChunk(CompressionMetadata.Chunk chunk) throws IOException - { - if (channel.position() != chunk.offset) - channel.position(chunk.offset); + long position = current(); + assert position < metadata.dataLength; - if (compressed.capacity() < chunk.length) - compressed = ByteBuffer.wrap(new byte[chunk.length]); - else - compressed.clear(); - compressed.limit(chunk.length); + CompressionMetadata.Chunk chunk = metadata.chunkFor(position); - if (channel.read(compressed) != chunk.length) - throw new CorruptBlockException(getPath(), chunk); + if (channel.position() != chunk.offset) + channel.position(chunk.offset); - // technically flip() is unnecessary since all the remaining work uses the raw array, but if that changes - // in the future this will save a lot of hair-pulling - compressed.flip(); - try - { - validBufferBytes = metadata.compressor().uncompress(compressed.array(), 0, chunk.length, buffer, 0); - } - catch (IOException e) - { - throw new CorruptBlockException(getPath(), chunk); - } + if (compressed.capacity() < chunk.length) + compressed = ByteBuffer.wrap(new byte[chunk.length]); + else + compressed.clear(); + compressed.limit(chunk.length); - if (metadata.parameters.getCrcCheckChance() > FBUtilities.threadLocalRandom().nextDouble()) - { + if (channel.read(compressed) != chunk.length) + throw new CorruptBlockException(getPath(), chunk); - if (metadata.hasPostCompressionAdlerChecksums) + // technically flip() is unnecessary since all the remaining work uses the raw array, but if that changes + // in the future this will save a lot of hair-pulling + compressed.flip(); + buffer.clear(); + int decompressedBytes; + try { - checksum.update(compressed.array(), 0, chunk.length); + decompressedBytes = metadata.compressor().uncompress(compressed.array(), 0, chunk.length, buffer.array(), 0); + buffer.limit(decompressedBytes); } - else + catch (IOException e) { - checksum.update(buffer, 0, validBufferBytes); + throw new CorruptBlockException(getPath(), chunk); } - if (checksum(chunk) != (int) checksum.getValue()) - throw new CorruptBlockException(getPath(), chunk); + if (metadata.parameters.getCrcCheckChance() > FBUtilities.threadLocalRandom().nextDouble()) + { - // reset checksum object back to the original (blank) state - checksum.reset(); - } + if (metadata.hasPostCompressionAdlerChecksums) + { + checksum.update(compressed.array(), 0, chunk.length); + } + else + { + checksum.update(buffer.array(), 0, decompressedBytes); + } - // buffer offset is always aligned - bufferOffset = current & ~(buffer.length - 1); + if (checksum(chunk) != (int) checksum.getValue()) + throw new CorruptBlockException(getPath(), chunk); + + // reset checksum object back to the original (blank) state + checksum.reset(); + } + + // buffer offset is always aligned + bufferOffset = position & ~(buffer.capacity() - 1); + buffer.position((int) (position - bufferOffset)); + } + catch (CorruptBlockException e) + { + throw new CorruptSSTableException(e, getPath()); + } + catch (IOException e) + { + throw new FSReadError(e, getPath()); + } } private int checksum(CompressionMetadata.Chunk chunk) throws IOException diff --git a/src/java/org/apache/cassandra/io/compress/CompressedThrottledReader.java b/src/java/org/apache/cassandra/io/compress/CompressedThrottledReader.java index c5ae79597cf7..2495d17f17e1 100644 --- a/src/java/org/apache/cassandra/io/compress/CompressedThrottledReader.java +++ b/src/java/org/apache/cassandra/io/compress/CompressedThrottledReader.java @@ -37,7 +37,7 @@ public CompressedThrottledReader(String file, CompressionMetadata metadata, Rate protected void reBuffer() { - limiter.acquire(buffer.length); + limiter.acquire(buffer.capacity()); super.reBuffer(); } diff --git a/src/java/org/apache/cassandra/io/util/AbstractDataInput.java b/src/java/org/apache/cassandra/io/util/AbstractDataInput.java index ff8b6b276d06..281526046eeb 100644 --- a/src/java/org/apache/cassandra/io/util/AbstractDataInput.java +++ b/src/java/org/apache/cassandra/io/util/AbstractDataInput.java @@ -21,12 +21,20 @@ public abstract class AbstractDataInput extends InputStream implements DataInput { - protected abstract void seekInternal(int position); - protected abstract int getPosition(); + protected abstract void seek(long position) throws IOException; + protected abstract long getPosition(); + protected abstract long getPositionLimit(); - /* - !! DataInput methods below are copied from the implementation in Apache Harmony RandomAccessFile. - */ + public int skipBytes(int n) throws IOException + { + if (n <= 0) + return 0; + long oldPosition = getPosition(); + seek(Math.min(getPositionLimit(), oldPosition + n)); + long skipped = getPosition() - oldPosition; + assert skipped >= 0 && skipped <= n; + return (int) skipped; + } /** * Reads a boolean from the current position in this file. Blocks until one @@ -214,7 +222,7 @@ public int readInt() throws IOException { public final String readLine() throws IOException { StringBuilder line = new StringBuilder(80); // Typical line length boolean foundTerminator = false; - int unreadPosition = 0; + long unreadPosition = -1; while (true) { int nextByte = read(); switch (nextByte) { @@ -222,7 +230,7 @@ public final String readLine() throws IOException { return line.length() != 0 ? line.toString() : null; case (byte) '\r': if (foundTerminator) { - seekInternal(unreadPosition); + seek(unreadPosition); return line.toString(); } foundTerminator = true; @@ -233,7 +241,7 @@ public final String readLine() throws IOException { return line.toString(); default: if (foundTerminator) { - seekInternal(unreadPosition); + seek(unreadPosition); return line.toString(); } line.append((char) nextByte); diff --git a/src/java/org/apache/cassandra/io/util/MappedFileDataInput.java b/src/java/org/apache/cassandra/io/util/MappedFileDataInput.java index f397ddc31fb2..047925693e23 100644 --- a/src/java/org/apache/cassandra/io/util/MappedFileDataInput.java +++ b/src/java/org/apache/cassandra/io/util/MappedFileDataInput.java @@ -24,7 +24,7 @@ import org.apache.cassandra.utils.ByteBufferUtil; -public class MappedFileDataInput extends AbstractDataInput implements FileDataInput +public class MappedFileDataInput extends AbstractDataInput implements FileDataInput, DataInput { private final MappedByteBuffer buffer; private final String filename; @@ -49,12 +49,6 @@ public MappedFileDataInput(MappedByteBuffer buffer, String filename, long segmen this.position = position; } - // don't make this public, this is only for seeking WITHIN the current mapped segment - protected void seekInternal(int pos) - { - position = pos; - } - // Only use when we know the seek in within the mapped segment. Throws an // IOException otherwise. public void seek(long pos) throws IOException @@ -63,17 +57,22 @@ public void seek(long pos) throws IOException if (inSegmentPos < 0 || inSegmentPos > buffer.capacity()) throw new IOException(String.format("Seek position %d is not within mmap segment (seg offs: %d, length: %d)", pos, segmentOffset, buffer.capacity())); - seekInternal((int) inSegmentPos); + position = (int) inSegmentPos; } public long getFilePointer() { - return segmentOffset + (long)position; + return segmentOffset + position; } - protected int getPosition() + protected long getPosition() { - return position; + return segmentOffset + position; + } + + protected long getPositionLimit() + { + return segmentOffset + buffer.capacity(); } @Override @@ -85,7 +84,7 @@ public boolean markSupported() public void reset(FileMark mark) throws IOException { assert mark instanceof MappedFileDataInputMark; - seekInternal(((MappedFileDataInputMark) mark).position); + position = ((MappedFileDataInputMark) mark).position; } public FileMark mark() @@ -162,17 +161,6 @@ public final void readFully(byte[] buffer, int offset, int count) throws IOExcep throw new UnsupportedOperationException("use readBytes instead"); } - public int skipBytes(int n) throws IOException - { - assert n >= 0 : "skipping negative bytes is illegal: " + n; - if (n == 0) - return 0; - int oldPosition = position; - assert ((long)oldPosition) + n <= Integer.MAX_VALUE; - position = Math.min(buffer.capacity(), position + n); - return position - oldPosition; - } - private static class MappedFileDataInputMark implements FileMark { int position; diff --git a/src/java/org/apache/cassandra/io/util/MemoryInputStream.java b/src/java/org/apache/cassandra/io/util/MemoryInputStream.java index eee030a15383..73ccc1be8ac1 100644 --- a/src/java/org/apache/cassandra/io/util/MemoryInputStream.java +++ b/src/java/org/apache/cassandra/io/util/MemoryInputStream.java @@ -17,9 +17,10 @@ */ package org.apache.cassandra.io.util; +import java.io.DataInput; import java.io.IOException; -public class MemoryInputStream extends AbstractDataInput +public class MemoryInputStream extends AbstractDataInput implements DataInput { private final Memory mem; private int position = 0; @@ -40,20 +41,24 @@ public void readFully(byte[] buffer, int offset, int count) throws IOException position += count; } - protected void seekInternal(int pos) + protected void seek(long pos) { - position = pos; + position = (int) pos; } - protected int getPosition() + protected long getPosition() { return position; } - public int skipBytes(int n) throws IOException + protected long getPositionLimit() { - seekInternal(getPosition() + n); - return position; + return mem.size(); + } + + protected long length() + { + return mem.size(); } public void close() diff --git a/src/java/org/apache/cassandra/io/util/RandomAccessReader.java b/src/java/org/apache/cassandra/io/util/RandomAccessReader.java index 8347cd999853..e39551054e06 100644 --- a/src/java/org/apache/cassandra/io/util/RandomAccessReader.java +++ b/src/java/org/apache/cassandra/io/util/RandomAccessReader.java @@ -20,12 +20,14 @@ import java.io.*; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; +import java.nio.file.StandardOpenOption; import com.google.common.annotations.VisibleForTesting; import org.apache.cassandra.io.FSReadError; +import org.apache.cassandra.utils.ByteBufferUtil; -public class RandomAccessReader extends RandomAccessFile implements FileDataInput +public class RandomAccessReader extends AbstractDataInput implements FileDataInput { public static final long CACHE_FLUSH_INTERVAL_IN_BYTES = (long) Math.pow(2, 27); // 128mb @@ -36,17 +38,13 @@ public class RandomAccessReader extends RandomAccessFile implements FileDataInpu private final String filePath; // buffer which will cache file blocks - protected byte[] buffer; + protected ByteBuffer buffer; - // `current` as current position in file // `bufferOffset` is the offset of the beginning of the buffer // `markedPointer` folds the offset of the last file mark - protected long bufferOffset, current = 0, markedPointer; - // `validBufferBytes` is the number of bytes in the buffer that are actually valid; - // this will be LESS than buffer capacity if buffer is not full! - protected int validBufferBytes = 0; + protected long bufferOffset, markedPointer; - // channel liked with the file, used to retrieve data and force updates. + // channel linked with the file, used to retrieve data and force updates. protected final FileChannel channel; private final long fileLength; @@ -55,19 +53,23 @@ public class RandomAccessReader extends RandomAccessFile implements FileDataInpu protected RandomAccessReader(File file, int bufferSize, PoolingSegmentedFile owner) throws FileNotFoundException { - super(file, "r"); - this.owner = owner; - channel = super.getChannel(); filePath = file.getAbsolutePath(); + try + { + channel = FileChannel.open(file.toPath(), StandardOpenOption.READ); + } + catch (IOException e) + { + throw new FileNotFoundException(filePath); + } + // allocating required size of the buffer if (bufferSize <= 0) throw new IllegalArgumentException("bufferSize must be positive"); - buffer = new byte[bufferSize]; - // we can cache file length in read-only mode try { @@ -77,7 +79,13 @@ protected RandomAccessReader(File file, int bufferSize, PoolingSegmentedFile own { throw new FSReadError(e, filePath); } - validBufferBytes = -1; // that will trigger reBuffer() on demand by read/seek operations + buffer = allocateBuffer(bufferSize); + buffer.limit(0); + } + + protected ByteBuffer allocateBuffer(int bufferSize) + { + return ByteBuffer.allocate((int) Math.min(fileLength, bufferSize)); } public static RandomAccessReader open(File file, PoolingSegmentedFile owner) @@ -97,7 +105,7 @@ static RandomAccessReader open(File file, int bufferSize, PoolingSegmentedFile o { return new RandomAccessReader(file, bufferSize, owner); } - catch (FileNotFoundException e) + catch (IOException e) { throw new RuntimeException(e); } @@ -109,31 +117,31 @@ static RandomAccessReader open(SequentialWriter writer) return open(new File(writer.getPath()), DEFAULT_BUFFER_SIZE, null); } + // channel extends FileChannel, impl SeekableByteChannel. Safe to cast. + public FileChannel getChannel() + { + return channel; + } + /** * Read data from file starting from current currentOffset to populate buffer. */ protected void reBuffer() { - resetBuffer(); + bufferOffset += buffer.position(); + buffer.clear(); + assert bufferOffset < fileLength; try { - if (bufferOffset >= channel.size()) - return; - channel.position(bufferOffset); // setting channel position - - int read = 0; - - while (read < buffer.length) + while (buffer.hasRemaining()) { - int n = super.read(buffer, read, buffer.length - read); + int n = channel.read(buffer); if (n < 0) break; - read += n; } - - validBufferBytes = read; + buffer.flip(); } catch (IOException e) { @@ -144,7 +152,12 @@ protected void reBuffer() @Override public long getFilePointer() { - return current; + return current(); + } + + protected long current() + { + return bufferOffset + (buffer == null ? 0 : buffer.position()); } public String getPath() @@ -154,7 +167,7 @@ public String getPath() public int getTotalBufferSize() { - return buffer.length; + return buffer.capacity(); } public void reset() @@ -164,14 +177,14 @@ public void reset() public long bytesPastMark() { - long bytes = current - markedPointer; + long bytes = current() - markedPointer; assert bytes >= 0; return bytes; } public FileMark mark() { - markedPointer = current; + markedPointer = current(); return new BufferedRandomAccessFileMark(markedPointer); } @@ -184,7 +197,7 @@ public void reset(FileMark mark) public long bytesPastMark(FileMark mark) { assert mark instanceof BufferedRandomAccessFileMark; - long bytes = current - ((BufferedRandomAccessFileMark) mark).pointer; + long bytes = current() - ((BufferedRandomAccessFileMark) mark).pointer; assert bytes >= 0; return bytes; } @@ -202,17 +215,6 @@ public long bytesRemaining() return length() - getFilePointer(); } - protected int bufferCursor() - { - return (int) (current - bufferOffset); - } - - protected void resetBuffer() - { - bufferOffset = current; - validBufferBytes = 0; - } - @Override public void close() { @@ -233,11 +235,12 @@ public void close() public void deallocate() { + bufferOffset += buffer.position(); buffer = null; // makes sure we don't use this after it's ostensibly closed try { - super.close(); + channel.close(); } catch (IOException e) { @@ -270,17 +273,28 @@ public void seek(long newPosition) if (newPosition < 0) throw new IllegalArgumentException("new position should not be negative"); - if (newPosition > length()) // it is save to call length() in read-only mode - throw new IllegalArgumentException(String.format("unable to seek to position %d in %s (%d bytes) in read-only mode", + if (newPosition >= length()) // it is save to call length() in read-only mode + { + if (newPosition > length()) + throw new IllegalArgumentException(String.format("unable to seek to position %d in %s (%d bytes) in read-only mode", newPosition, getPath(), length())); + buffer.limit(0); + bufferOffset = newPosition; + return; + } - current = newPosition; - - if (newPosition > (bufferOffset + validBufferBytes) || newPosition < bufferOffset) - reBuffer(); + if (newPosition >= bufferOffset && newPosition < bufferOffset + buffer.limit()) + { + buffer.position((int) (newPosition - bufferOffset)); + return; + } + // Set current location to newPosition and clear buffer so reBuffer calculates from newPosition + bufferOffset = newPosition; + buffer.clear(); + reBuffer(); + assert current() == newPosition; } - @Override // -1 will be returned if there is nothing to read; higher-level methods like readInt // or readFully (from RandomAccessFile) will throw EOFException but this should not public int read() @@ -291,12 +305,10 @@ public int read() if (isEOF()) return -1; // required by RandomAccessFile - if (current >= bufferOffset + buffer.length || validBufferBytes == -1) + if (!buffer.hasRemaining()) reBuffer(); - assert current >= bufferOffset && current < bufferOffset + validBufferBytes; - - return ((int) buffer[(int) (current++ - bufferOffset)]) & 0xff; + return (int)buffer.get() & 0xff; } @Override @@ -319,47 +331,41 @@ public int read(byte[] buff, int offset, int length) if (isEOF()) return -1; - if (current >= bufferOffset + buffer.length || validBufferBytes == -1) + if (!buffer.hasRemaining()) reBuffer(); - assert current >= bufferOffset && current < bufferOffset + validBufferBytes - : String.format("File (%s), current offset %d, buffer offset %d, buffer limit %d", - getPath(), - current, - bufferOffset, - validBufferBytes); - - int toCopy = Math.min(length, validBufferBytes - bufferCursor()); - - System.arraycopy(buffer, bufferCursor(), buff, offset, toCopy); - current += toCopy; - + int toCopy = Math.min(length, buffer.remaining()); + buffer.get(buff, offset, toCopy); return toCopy; } public ByteBuffer readBytes(int length) throws EOFException { assert length >= 0 : "buffer length should not be negative: " + length; - - byte[] buff = new byte[length]; - try { - readFully(buff); // reading data buffer + ByteBuffer result = ByteBuffer.allocate(length); + while (result.hasRemaining()) + { + if (isEOF()) + throw new EOFException(); + if (!buffer.hasRemaining()) + reBuffer(); + ByteBufferUtil.put(buffer, result); + } + result.flip(); + return result; } catch (EOFException e) { throw e; } - catch (IOException e) + catch (Exception e) { throw new FSReadError(e, filePath); } - - return ByteBuffer.wrap(buff); } - @Override public long length() { return fileLength; @@ -367,24 +373,11 @@ public long length() public long getPosition() { - return current; - } - - @Override - public void write(int value) - { - throw new UnsupportedOperationException(); + return bufferOffset + buffer.position(); } - @Override - public void write(byte[] buffer) - { - throw new UnsupportedOperationException(); - } - - @Override - public void write(byte[] buffer, int offset, int length) + public long getPositionLimit() { - throw new UnsupportedOperationException(); + return length(); } } diff --git a/src/java/org/apache/cassandra/io/util/ThrottledReader.java b/src/java/org/apache/cassandra/io/util/ThrottledReader.java index b12a8a8867c9..b9b645a4cfeb 100644 --- a/src/java/org/apache/cassandra/io/util/ThrottledReader.java +++ b/src/java/org/apache/cassandra/io/util/ThrottledReader.java @@ -38,7 +38,7 @@ protected ThrottledReader(File file, RateLimiter limiter) throws FileNotFoundExc protected void reBuffer() { - limiter.acquire(buffer.length); + limiter.acquire(buffer.capacity()); super.reBuffer(); } diff --git a/src/java/org/apache/cassandra/utils/ByteBufferUtil.java b/src/java/org/apache/cassandra/utils/ByteBufferUtil.java index f20a46a73ffb..91aa6f717796 100644 --- a/src/java/org/apache/cassandra/utils/ByteBufferUtil.java +++ b/src/java/org/apache/cassandra/utils/ByteBufferUtil.java @@ -273,6 +273,15 @@ public static void arrayCopy(ByteBuffer src, int srcPos, ByteBuffer dst, int dst FastByteOperations.copy(src, srcPos, dst, dstPos, length); } + public static int put(ByteBuffer src, ByteBuffer trg) + { + int length = Math.min(src.remaining(), trg.remaining()); + arrayCopy(src, src.position(), trg, trg.position(), length); + trg.position(trg.position() + length); + src.position(src.position() + length); + return length; + } + public static void writeWithLength(ByteBuffer bytes, DataOutputPlus out) throws IOException { out.writeInt(bytes.remaining()); diff --git a/src/java/org/apache/cassandra/utils/vint/EncodedDataInputStream.java b/src/java/org/apache/cassandra/utils/vint/EncodedDataInputStream.java index b35d180c17d6..6385e5cff09b 100644 --- a/src/java/org/apache/cassandra/utils/vint/EncodedDataInputStream.java +++ b/src/java/org/apache/cassandra/utils/vint/EncodedDataInputStream.java @@ -25,10 +25,10 @@ /** * Borrows idea from * https://developers.google.com/protocol-buffers/docs/encoding#varints - * + * * Should be used with EncodedDataOutputStream */ -public class EncodedDataInputStream extends AbstractDataInput +public class EncodedDataInputStream extends AbstractDataInput implements DataInput { private DataInput input; @@ -47,12 +47,22 @@ public int read() throws IOException return input.readByte() & 0xFF; } - protected void seekInternal(int position) + protected void seek(long position) + { + throw new UnsupportedOperationException(); + } + + protected long getPosition() + { + throw new UnsupportedOperationException(); + } + + protected long getPositionLimit() { throw new UnsupportedOperationException(); } - protected int getPosition() + protected long length() { throw new UnsupportedOperationException(); } diff --git a/test/unit/org/apache/cassandra/io/util/BufferedRandomAccessFileTest.java b/test/unit/org/apache/cassandra/io/util/BufferedRandomAccessFileTest.java index 75de2618eced..8053553e1622 100644 --- a/test/unit/org/apache/cassandra/io/util/BufferedRandomAccessFileTest.java +++ b/test/unit/org/apache/cassandra/io/util/BufferedRandomAccessFileTest.java @@ -547,34 +547,6 @@ public Object call() } }, IllegalArgumentException.class); - // Any write() call should fail - expectException(new Callable() - { - public Object call() throws IOException - { - copy.write(1); - return null; - } - }, UnsupportedOperationException.class); - - expectException(new Callable() - { - public Object call() throws IOException - { - copy.write(new byte[1]); - return null; - } - }, UnsupportedOperationException.class); - - expectException(new Callable() - { - public Object call() throws IOException - { - copy.write(new byte[3], 0, 2); - return null; - } - }, UnsupportedOperationException.class); - copy.seek(0); copy.skipBytes(5); @@ -619,16 +591,6 @@ public void testSetNegativeLength() throws IOException, IllegalArgumentException } } - @Test (expected=IOException.class) - public void testSetLengthDuringReadMode() throws IOException - { - File tmpFile = File.createTempFile("set_length_during_read_mode", "bin"); - try (RandomAccessReader file = RandomAccessReader.open(tmpFile)) - { - file.setLength(4L); - } - } - private SequentialWriter createTempFile(String name) throws IOException { File tempFile = File.createTempFile(name, null); From f6671a7ac42515b057615ae3ac38bdb81715f98e Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Wed, 9 Apr 2014 22:51:05 -0400 Subject: [PATCH 024/557] simplify: no need for iterator to get first item in a list --- src/java/org/apache/cassandra/service/RowDataResolver.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/cassandra/service/RowDataResolver.java b/src/java/org/apache/cassandra/service/RowDataResolver.java index 5422d82a44f4..a10da2e3cec1 100644 --- a/src/java/org/apache/cassandra/service/RowDataResolver.java +++ b/src/java/org/apache/cassandra/service/RowDataResolver.java @@ -92,7 +92,7 @@ public Row resolve() throws DigestMismatchException } else { - resolved = replies.iterator().next().payload.row().cf; + resolved = replies.get(0).payload.row().cf; } if (logger.isDebugEnabled()) @@ -161,7 +161,7 @@ static ColumnFamily resolveSuperset(Iterable versions, long now) public Row getData() { - return replies.iterator().next().payload.row(); + return replies.get(0).payload.row(); } public boolean isDataPresent() From 333986428e6556f68c5889046d79afad8cb8e8f9 Mon Sep 17 00:00:00 2001 From: Benedict Elliott Smith Date: Thu, 10 Apr 2014 19:21:42 +0300 Subject: [PATCH 025/557] Fix ABSC.SearchIterator#next() (CASSANDRA-6933 follow-up) patch by Benedict Elliott Smith; reviewed by Aleksey Yeschenko for CASSANDRA-6933 --- .../org/apache/cassandra/db/ArrayBackedSortedColumns.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java b/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java index d79edd32463b..dcb6a379dcf7 100644 --- a/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java +++ b/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java @@ -465,8 +465,9 @@ public Cell next(CellName name) // optimize for runs of sequential matches, as in CollationController // checking to see if we've found the desired cells yet (CASSANDRA-6933) - if (metadata.comparator.compare(name, cells[i].name()) == 0) - return cells[i++]; + int c = metadata.comparator.compare(name, cells[i].name()); + if (c <= 0) + return c < 0 ? null : cells[i++]; // use range to manually force a better bsearch "pivot" by breaking it into two calls: // first for i..i+range, then i+range..size if necessary. From 4d0691759a19f1faafe889d765145ae6a5096397 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Tue, 15 Apr 2014 20:36:16 -0400 Subject: [PATCH 026/557] Allow cassandra to compile under java 8 patch by dbrosius reviewed by jmckenzie for cassandra-7028 --- CHANGES.txt | 1 + build.xml | 11 +++++-- lib/antlr-3.2.jar | Bin 1928009 -> 0 bytes lib/antlr-runtime-3.5.2.jar | Bin 0 -> 167761 bytes ...{antlr-3.2.txt => antlr-runtime-3.5.2.txt} | 0 lib/licenses/stringtemplate-4.0.2.txt | 27 ++++++++++++++++++ lib/stringtemplate-4.0.2.jar | Bin 0 -> 226406 bytes src/java/org/apache/cassandra/cql3/Cql.g | 22 ++++++++++---- 8 files changed, 53 insertions(+), 8 deletions(-) delete mode 100644 lib/antlr-3.2.jar create mode 100644 lib/antlr-runtime-3.5.2.jar rename lib/licenses/{antlr-3.2.txt => antlr-runtime-3.5.2.txt} (100%) create mode 100644 lib/licenses/stringtemplate-4.0.2.txt create mode 100644 lib/stringtemplate-4.0.2.jar diff --git a/CHANGES.txt b/CHANGES.txt index cbf82deb1157..2fbf3aeaa8a3 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -4,6 +4,7 @@ * Remove CQL2 (CASSANDRA-5918) * Add Thrift get_multi_slice call (CASSANDRA-6757) * Optimize fetching multiple cells by name (CASSANDRA-6933) + * Allow compilation in java 8 (CASSANDRA-7208) 2.1.0-beta2 diff --git a/build.xml b/build.xml index 8c4cb7b597bd..9326424b586e 100644 --- a/build.xml +++ b/build.xml @@ -190,7 +190,7 @@ Building Grammar ${build.src.java}/org/apache/cassandra/cli/Cli.g .... @@ -211,7 +211,7 @@ Building Grammar ${build.src.java}/org/apache/cassandra/cql3/Cql.g ... @@ -330,7 +330,9 @@ - + + + @@ -403,6 +405,7 @@ + @@ -444,6 +447,8 @@ + + diff --git a/lib/antlr-3.2.jar b/lib/antlr-3.2.jar deleted file mode 100644 index fdd167d4444c0c380d8e6c87e95e342a06b0d08d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1928009 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 t&1j9Mkl?Is)U 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

`gq4(SOPrr7$!qKY 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

SFN_ZdCqEo%yo2r##%t=n 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

y#x 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%0D+MzuCyy2^*WDkR|R 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

  • 8!ma* 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

    ~%*KRzLvFqK|2mEa5e_`u`Q0#ir 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�Zz6m|0)y?W4(X5J$18B-4q`1;0lN-(mUcSkF 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 literal 0 HcmV?d00001 diff --git a/src/java/org/apache/cassandra/cql3/Cql.g b/src/java/org/apache/cassandra/cql3/Cql.g index 4c1f2dc1b794..6b4ad292ab4c 100644 --- a/src/java/org/apache/cassandra/cql3/Cql.g +++ b/src/java/org/apache/cassandra/cql3/Cql.g @@ -171,7 +171,7 @@ options { { super.nextToken(); if (tokens.size() == 0) - return Token.EOF_TOKEN; + return new CommonToken(Token.EOF); return tokens.remove(0); } @@ -900,7 +900,16 @@ term returns [Term.Raw term] ; columnOperation[List> operations] - : key=cident '=' t=term ('+' c=cident )? + : key=cident columnOperationDifferentiator[operations, key] + ; + +columnOperationDifferentiator[List> operations, ColumnIdentifier key] + : '=' normalColumnOperation[operations, key] + | '[' k=term ']' specializedColumnOperation[operations, key, k] + ; + +normalColumnOperation[List> operations, ColumnIdentifier key] + : t=term ('+' c=cident )? { if (c == null) { @@ -913,13 +922,13 @@ columnOperation[List> operations] addRawUpdate(operations, key, new Operation.Prepend(t)); } } - | key=cident '=' c=cident sig=('+' | '-') t=term + | c=cident sig=('+' | '-') t=term { if (!key.equals(c)) addRecognitionError("Only expressions of the form X = X " + $sig.text + " are supported."); addRawUpdate(operations, key, $sig.text.equals("+") ? new Operation.Addition(t) : new Operation.Substraction(t)); } - | key=cident '=' c=cident i=INTEGER + | c=cident i=INTEGER { // Note that this production *is* necessary because X = X - 3 will in fact be lexed as [ X, '=', X, INTEGER]. if (!key.equals(c)) @@ -927,7 +936,10 @@ columnOperation[List> operations] addRecognitionError("Only expressions of the form X = X " + ($i.text.charAt(0) == '-' ? '-' : '+') + " are supported."); addRawUpdate(operations, key, new Operation.Addition(Constants.Literal.integer($i.text))); } - | key=cident '[' k=term ']' '=' t=term + ; + +specializedColumnOperation[List> operations, ColumnIdentifier key, Term.Raw k] + : '=' t=term { addRawUpdate(operations, key, new Operation.SetElement(k, t)); } From f9fb5339daa62f1840fb47c4213187e2b58e39a4 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Tue, 22 Apr 2014 11:25:07 -0500 Subject: [PATCH 027/557] Make commitlog archiver thread pool name consistent Patch by Chris Lohfink, reviewed by brandonwilliams for CASSANDRA-7043 --- .../org/apache/cassandra/db/commitlog/CommitLogArchiver.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogArchiver.java b/src/java/org/apache/cassandra/db/commitlog/CommitLogArchiver.java index 1385ea4c923e..616143577436 100644 --- a/src/java/org/apache/cassandra/db/commitlog/CommitLogArchiver.java +++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogArchiver.java @@ -51,7 +51,7 @@ public class CommitLogArchiver } public final Map> archivePending = new ConcurrentHashMap>(); - public final ExecutorService executor = new JMXEnabledThreadPoolExecutor("commitlog_archiver"); + public final ExecutorService executor = new JMXEnabledThreadPoolExecutor("CommitLogArchiver"); private final String archiveCommand; private final String restoreCommand; private final String restoreDirectories; From 15e7ac7d37a49c7ff852057f6f124aee611470da Mon Sep 17 00:00:00 2001 From: Jonathan Ellis Date: Tue, 22 Apr 2014 12:31:28 -0500 Subject: [PATCH 028/557] force Windows to use non-mapped i/o patch by Josh McKenzie; reviewed by Benedict Elliott Smith for CASSANDRA-6993 --- .../cassandra/config/DatabaseDescriptor.java | 35 ++++++++++++------- .../apache/cassandra/utils/FBUtilities.java | 6 ++-- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java index 9f8a0dfa4080..cf11b770d25e 100644 --- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java +++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java @@ -189,23 +189,34 @@ else if (conf.commitlog_sync_batch_window_in_ms != null) if (conf.commitlog_total_space_in_mb == null) conf.commitlog_total_space_in_mb = hasLargeAddressSpace() ? 1024 : 32; - /* evaluate the DiskAccessMode Config directive, which also affects indexAccessMode selection */ - if (conf.disk_access_mode == Config.DiskAccessMode.auto) + if (FBUtilities.isUnix()) { - conf.disk_access_mode = hasLargeAddressSpace() ? Config.DiskAccessMode.mmap : Config.DiskAccessMode.standard; - indexAccessMode = conf.disk_access_mode; - logger.info("DiskAccessMode 'auto' determined to be {}, indexAccessMode is {}", conf.disk_access_mode, indexAccessMode); - } - else if (conf.disk_access_mode == Config.DiskAccessMode.mmap_index_only) - { - conf.disk_access_mode = Config.DiskAccessMode.standard; - indexAccessMode = Config.DiskAccessMode.mmap; - logger.info("DiskAccessMode is {}, indexAccessMode is {}", conf.disk_access_mode, indexAccessMode); + /* evaluate the DiskAccessMode Config directive, which also affects indexAccessMode selection */ + if (conf.disk_access_mode == Config.DiskAccessMode.auto) + { + conf.disk_access_mode = hasLargeAddressSpace() ? Config.DiskAccessMode.mmap : Config.DiskAccessMode.standard; + indexAccessMode = conf.disk_access_mode; + logger.info("DiskAccessMode 'auto' determined to be {}, indexAccessMode is {}", conf.disk_access_mode, indexAccessMode); + } + else if (conf.disk_access_mode == Config.DiskAccessMode.mmap_index_only) + { + conf.disk_access_mode = Config.DiskAccessMode.standard; + indexAccessMode = Config.DiskAccessMode.mmap; + logger.info("DiskAccessMode is {}, indexAccessMode is {}", conf.disk_access_mode, indexAccessMode); + } + else + { + indexAccessMode = conf.disk_access_mode; + logger.info("DiskAccessMode is {}, indexAccessMode is {}", conf.disk_access_mode, indexAccessMode); + } } + // Always force standard mode access on Windows - CASSANDRA-6993. Windows won't allow deletion of hard-links to files that + // are memory-mapped which causes trouble with snapshots. else { + conf.disk_access_mode = Config.DiskAccessMode.standard; indexAccessMode = conf.disk_access_mode; - logger.info("DiskAccessMode is {}, indexAccessMode is {}", conf.disk_access_mode, indexAccessMode); + logger.info("Non-unix environment detected. DiskAccessMode set to {}, indexAccessMode {}", conf.disk_access_mode, indexAccessMode); } /* Authentication and authorization backend, implementing IAuthenticator and IAuthorizer */ diff --git a/src/java/org/apache/cassandra/utils/FBUtilities.java b/src/java/org/apache/cassandra/utils/FBUtilities.java index 12c393afaa3e..a8c95de2d72b 100644 --- a/src/java/org/apache/cassandra/utils/FBUtilities.java +++ b/src/java/org/apache/cassandra/utils/FBUtilities.java @@ -70,11 +70,11 @@ public class FBUtilities public static final BigInteger TWO = new BigInteger("2"); private static final String DEFAULT_TRIGGER_DIR = "triggers"; - private static final String OPERATING_SYSTEM = System.getProperty("os.name").toLowerCase(); - private static volatile InetAddress localInetAddress; private static volatile InetAddress broadcastInetAddress; + private static final boolean isWindows = System.getProperty("os.name").startsWith("Windows"); + public static int getAvailableProcessors() { if (System.getProperty("cassandra.available_processors") != null) @@ -691,6 +691,6 @@ public static File getToolsOutputDirectory() public static boolean isUnix() { - return OPERATING_SYSTEM.contains("nix") || OPERATING_SYSTEM.contains("nux") || OPERATING_SYSTEM.contains("aix"); + return !isWindows; } } From 5bbc54fe70b95611f8397c36dcd07fa3605627a1 Mon Sep 17 00:00:00 2001 From: Jason Brown Date: Tue, 22 Apr 2014 10:37:49 -0700 Subject: [PATCH 029/557] merged cassandra-2.1 to trunk (for CASSANDRA-7033) --- CHANGES.txt | 1 + .../operations/CqlIndexedRangeSlicer.java | 9 ++++--- .../stress/operations/CqlOperation.java | 14 ++++------ .../stress/operations/CqlReader.java | 27 ++++++++++--------- 4 files changed, 26 insertions(+), 25 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 284f8a600d8f..fa1e3af28fef 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -57,6 +57,7 @@ * Clean up IndexInfo on keyspace/table drops (CASSANDRA-6924) * Only snapshot relative SSTables when sequential repair (CASSANDRA-7024) * Require nodetool rebuild_index to specify index names (CASSANDRA-7038) + * fix cassandra stress errors on reads with native protocol (CASANDRA-7033) Merged from 2.0: * Use LOCAL_QUORUM for data reads at LOCAL_SERIAL (CASSANDRA-6939) * Log a warning for large batches (CASSANDRA-6487) diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/CqlIndexedRangeSlicer.java b/tools/stress/src/org/apache/cassandra/stress/operations/CqlIndexedRangeSlicer.java index 6febe269038e..961c8fe25dc4 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/CqlIndexedRangeSlicer.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/CqlIndexedRangeSlicer.java @@ -47,10 +47,13 @@ protected List getQueryParameters(byte[] key) @Override protected String buildQuery() { - final String indexColumn = (state.settings.columns.namestrs.get(1)); - StringBuilder query = new StringBuilder("SELECT * FROM "); + StringBuilder query = new StringBuilder("SELECT"); + query.append(wrapInQuotes("key")); + query.append(" FROM "); query.append(wrapInQuotes(state.type.table)); - query.append(" WHERE ").append(indexColumn).append("=?") + + final String columnName = (state.settings.columns.namestrs.get(1)); + query.append(" WHERE ").append(columnName).append("=?") .append(" AND KEY > ? LIMIT ").append(state.settings.command.keysAtOnce); return query.toString(); } diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/CqlOperation.java b/tools/stress/src/org/apache/cassandra/stress/operations/CqlOperation.java index 6da145ebcc49..11fb6379a90c 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/CqlOperation.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/CqlOperation.java @@ -145,7 +145,7 @@ protected CqlRunOpTestNonEmpty(ClientWrapper client, String query, Object queryI @Override public boolean validate(Integer result) { - return true; + return result > 0; } @Override @@ -195,12 +195,8 @@ public boolean validate(ByteBuffer[][] result) if (result.length != expect.size()) return false; for (int i = 0 ; i < result.length ; i++) - { - List resultRow = Arrays.asList(result[i]); - resultRow = resultRow.subList(1, resultRow.size()); - if (expect.get(i) != null && !expect.get(i).equals(resultRow)) + if (expect.get(i) != null && !expect.get(i).equals(Arrays.asList(result[i]))) return false; - } return true; } } @@ -473,9 +469,9 @@ public ByteBuffer[][] apply(ResultSet result) for (int i = 0 ; i < r.length ; i++) { Row row = rows.get(i); - r[i] = new ByteBuffer[row.getColumnDefinitions().size() - 1]; - for (int j = 1 ; j < row.getColumnDefinitions().size() ; j++) - r[i][j - 1] = row.getBytes(j); + r[i] = new ByteBuffer[row.getColumnDefinitions().size()]; + for (int j = 0 ; j < row.getColumnDefinitions().size() ; j++) + r[i][j] = row.getBytes(j); } return r; } diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/CqlReader.java b/tools/stress/src/org/apache/cassandra/stress/operations/CqlReader.java index c9d88703b770..b2ea8c10501b 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/CqlReader.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/CqlReader.java @@ -22,11 +22,13 @@ import java.nio.ByteBuffer; -import java.util.ArrayList; +import java.nio.charset.CharacterCodingException; import java.util.Arrays; import java.util.Collections; import java.util.List; +import org.apache.cassandra.utils.ByteBufferUtil; + public class CqlReader extends CqlOperation { @@ -46,11 +48,18 @@ protected String buildQuery() } else { - for (int i = 0; i < state.settings.columns.names.size() ; i++) + try + { + for (int i = 0; i < state.settings.columns.names.size() ; i++) + { + if (i > 0) + query.append(","); + query.append(wrapInQuotes(ByteBufferUtil.string(state.settings.columns.names.get(i)))); + } + } + catch (CharacterCodingException e) { - if (i > 0) - query.append(","); - query.append('?'); + throw new IllegalStateException(e); } } @@ -63,14 +72,6 @@ protected String buildQuery() @Override protected List getQueryParameters(byte[] key) { - if (state.settings.columns.names != null) - { - final List queryParams = new ArrayList<>(); - for (ByteBuffer name : state.settings.columns.names) - queryParams.add(name); - queryParams.add(ByteBuffer.wrap(key)); - return queryParams; - } return Collections.singletonList(ByteBuffer.wrap(key)); } From 8cf97db307b48a715e0fdd23e9f2445c9f0ad40c Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Wed, 23 Apr 2014 23:06:16 -0400 Subject: [PATCH 030/557] bump cqlsh's DEFAULT_CQLVER to 3.1.6 --- bin/cqlsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/cqlsh b/bin/cqlsh index d7025cffed61..9ba74cac9072 100755 --- a/bin/cqlsh +++ b/bin/cqlsh @@ -135,7 +135,7 @@ if os.path.exists(OLD_HISTORY): DEFAULT_HOST = '127.0.0.1' DEFAULT_PORT = 9042 -DEFAULT_CQLVER = '3.1.5' +DEFAULT_CQLVER = '3.1.6' DEFAULT_TIME_FORMAT = '%Y-%m-%d %H:%M:%S%z' DEFAULT_FLOAT_PRECISION = 5 From afe2e140796f8527520a1a702afae0855a90d24e Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Mon, 28 Apr 2014 23:14:05 -0400 Subject: [PATCH 031/557] quell all the 'internal proprietary API' warnings induced by Unsafe and friends --- build.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/build.xml b/build.xml index 9326424b586e..2a6f6fee317d 100644 --- a/build.xml +++ b/build.xml @@ -672,6 +672,7 @@ destdir="${build.classes.main}" includeantruntime="false" source="${source.version}" target="${target.version}"> + From 1b51bec1455265de050fa85f1a2f90c26d28f591 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Tue, 29 Apr 2014 21:07:09 -0400 Subject: [PATCH 032/557] fix compile --- .../org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java b/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java index 131a755d9034..968fb935806d 100644 --- a/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java +++ b/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java @@ -223,7 +223,7 @@ public void testSearchIterator() int[] values = new int[]{ 1, 2, 3, 5, 9, 15, 21, 22 }; for (int i = 0; i < values.length; ++i) - map.addColumn(new Cell(type.makeCellName(values[i]))); + map.addColumn(new BufferCell(type.makeCellName(values[i]))); SearchIterator iter = map.searchIterator(); for (int i = 0 ; i < values.length ; i++) From e02d5b354fb25f37580ad1c96453d225104f1a8e Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Tue, 29 Apr 2014 20:07:07 -0500 Subject: [PATCH 033/557] fix comment --- test/unit/org/apache/cassandra/db/ScrubTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/org/apache/cassandra/db/ScrubTest.java b/test/unit/org/apache/cassandra/db/ScrubTest.java index 220e2a421138..7dc7c5cb2648 100644 --- a/test/unit/org/apache/cassandra/db/ScrubTest.java +++ b/test/unit/org/apache/cassandra/db/ScrubTest.java @@ -187,7 +187,7 @@ public void testScrubOutOfOrder() throws Exception * The test also assumes an ordered partitioner. * ColumnFamily cf = ArrayBackedSortedColumns.factory.create(cfs.metadata); - cf.addColumn(new Cell(ByteBufferUtil.bytes("someName"), ByteBufferUtil.bytes("someValue"), 0L)); + cf.addColumn(new BufferCell(ByteBufferUtil.bytes("someName"), ByteBufferUtil.bytes("someValue"), 0L)); SSTableWriter writer = new SSTableWriter(cfs.getTempSSTablePath(new File(System.getProperty("corrupt-sstable-root"))), cfs.metadata.getIndexInterval(), From dbf3e1c574d08dee0450feaf8cc7e0d4df0e0ba8 Mon Sep 17 00:00:00 2001 From: Jonathan Ellis Date: Wed, 30 Apr 2014 12:45:45 -0500 Subject: [PATCH 034/557] fix build --- .../org/apache/cassandra/service/AbstractRowResolver.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/cassandra/service/AbstractRowResolver.java b/src/java/org/apache/cassandra/service/AbstractRowResolver.java index 1fbb92bf4833..a84a6b6f6f2d 100644 --- a/src/java/org/apache/cassandra/service/AbstractRowResolver.java +++ b/src/java/org/apache/cassandra/service/AbstractRowResolver.java @@ -18,7 +18,9 @@ package org.apache.cassandra.service; import java.nio.ByteBuffer; +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.concurrent.ConcurrentLinkedQueue; import org.slf4j.Logger; @@ -34,8 +36,8 @@ public abstract class AbstractRowResolver implements IResponseResolver> replies = new ConcurrentLinkedQueue<>(); + // synchronizedList gives us thread-safety without the overhead of guaranteeing uniqueness like a Set would + protected final Collection> replies = Collections.synchronizedList(new ArrayList>()); protected final DecoratedKey key; public AbstractRowResolver(ByteBuffer key, String keyspaceName) From cf3f5b6efbe80a95bfc57e40e60ef5531eddc71e Mon Sep 17 00:00:00 2001 From: Jonathan Ellis Date: Wed, 30 Apr 2014 14:07:51 -0500 Subject: [PATCH 035/557] fix build --- src/java/org/apache/cassandra/service/AbstractRowResolver.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/cassandra/service/AbstractRowResolver.java b/src/java/org/apache/cassandra/service/AbstractRowResolver.java index a84a6b6f6f2d..9e287cf7a6a0 100644 --- a/src/java/org/apache/cassandra/service/AbstractRowResolver.java +++ b/src/java/org/apache/cassandra/service/AbstractRowResolver.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.List; import java.util.concurrent.ConcurrentLinkedQueue; import org.slf4j.Logger; @@ -37,7 +38,7 @@ public abstract class AbstractRowResolver implements IResponseResolver> replies = Collections.synchronizedList(new ArrayList>()); + protected final List> replies = Collections.synchronizedList(new ArrayList>()); protected final DecoratedKey key; public AbstractRowResolver(ByteBuffer key, String keyspaceName) From 43f19eb576004ac7694e76425d37cf876c01673c Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Wed, 30 Apr 2014 18:15:43 -0400 Subject: [PATCH 036/557] trivial StringBuilder usage fixes --- .../org/apache/cassandra/stress/settings/GroupedOptions.java | 2 +- .../src/org/apache/cassandra/stress/settings/Legacy.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/stress/src/org/apache/cassandra/stress/settings/GroupedOptions.java b/tools/stress/src/org/apache/cassandra/stress/settings/GroupedOptions.java index d0e63b0159d2..e35152160829 100644 --- a/tools/stress/src/org/apache/cassandra/stress/settings/GroupedOptions.java +++ b/tools/stress/src/org/apache/cassandra/stress/settings/GroupedOptions.java @@ -85,7 +85,7 @@ public static void printOptions(PrintStream out, String command, GroupedOptions. } firstRow = false; - StringBuilder sb = new StringBuilder("Usage: " + command); + StringBuilder sb = new StringBuilder("Usage: ").append(command); for (Option option : grouping.options()) { sb.append(" "); diff --git a/tools/stress/src/org/apache/cassandra/stress/settings/Legacy.java b/tools/stress/src/org/apache/cassandra/stress/settings/Legacy.java index 5ddb346c291d..eb04290d1d53 100644 --- a/tools/stress/src/org/apache/cassandra/stress/settings/Legacy.java +++ b/tools/stress/src/org/apache/cassandra/stress/settings/Legacy.java @@ -216,12 +216,12 @@ else if (cmd.hasOption("r")) { StringBuilder rep = new StringBuilder(); if (cmd.hasOption("R")) - rep.append("strategy=" + cmd.getOptionValue("R")); + rep.append("strategy=").append(cmd.getOptionValue("R")); if (cmd.hasOption("l")) { if (rep.length() > 0) rep.append(","); - rep.append("factor=" + cmd.getOptionValue("l")); + rep.append("factor=").append(cmd.getOptionValue("l")); } if (cmd.hasOption("O")) { From e78b002b131bb34792dd7a04f26d9a3a57c531c1 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Wed, 30 Apr 2014 18:20:26 -0400 Subject: [PATCH 037/557] use parameterized logging --- src/java/org/apache/cassandra/service/StorageService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index 51be5e728dfb..d94c0cd0dfdf 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -822,7 +822,7 @@ private void joinTokenRing(int delay) throws ConfigurationException { bootstrapTokens = BootStrapper.getRandomTokens(tokenMetadata, DatabaseDescriptor.getNumTokens()); if (DatabaseDescriptor.getNumTokens() == 1) - logger.warn("Generated random token " + bootstrapTokens + ". Random tokens will result in an unbalanced ring; see http://wiki.apache.org/cassandra/Operations"); + logger.warn("Generated random token {}. Random tokens will result in an unbalanced ring; see http://wiki.apache.org/cassandra/Operations", bootstrapTokens); else logger.info("Generated random tokens. tokens are {}", bootstrapTokens); } @@ -877,10 +877,10 @@ else if (frac > 1.0) } bootstrapTokens.add(midpoint); } - logger.info("Split previous range (" + left + ", " + right + "] into " + bootstrapTokens); + logger.info("Split previous range ({}, {}] into {}", left, right, bootstrapTokens); } else - logger.info("Using saved tokens " + bootstrapTokens); + logger.info("Using saved tokens {}", bootstrapTokens); } } From 73ef82f384ca9c95933cd92d0e389f2f0dff7ab8 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Thu, 1 May 2014 20:28:26 -0400 Subject: [PATCH 038/557] make RestorableEWMA a static inner class --- src/java/org/apache/cassandra/metrics/RestorableMeter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/cassandra/metrics/RestorableMeter.java b/src/java/org/apache/cassandra/metrics/RestorableMeter.java index 4df46654eda8..c421618059d3 100644 --- a/src/java/org/apache/cassandra/metrics/RestorableMeter.java +++ b/src/java/org/apache/cassandra/metrics/RestorableMeter.java @@ -144,7 +144,7 @@ public double meanRate() { } } - class RestorableEWMA { + static class RestorableEWMA { private volatile boolean initialized = false; private volatile double rate = 0.0; // average rate in terms of events per nanosecond From d24513e04630333255f82aa75fb2f7bd5afd1be7 Mon Sep 17 00:00:00 2001 From: Sylvain Lebresne Date: Tue, 13 May 2014 14:07:00 +0200 Subject: [PATCH 039/557] Remove duplicate compiler flag --- build.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/build.xml b/build.xml index 98da4d95fb3d..19e18b4bdf3e 100644 --- a/build.xml +++ b/build.xml @@ -680,7 +680,6 @@ - From 3ce2ce7144df8ac4cc6d6c401f1c6c4f4c2b51c5 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Thu, 15 May 2014 22:23:02 -0400 Subject: [PATCH 040/557] minor cleanups in trigger sample --- .../src/org/apache/cassandra/triggers/InvertedIndex.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/triggers/src/org/apache/cassandra/triggers/InvertedIndex.java b/examples/triggers/src/org/apache/cassandra/triggers/InvertedIndex.java index 11e98b5335e6..fa90053fde71 100644 --- a/examples/triggers/src/org/apache/cassandra/triggers/InvertedIndex.java +++ b/examples/triggers/src/org/apache/cassandra/triggers/InvertedIndex.java @@ -41,13 +41,15 @@ public Collection augment(ByteBuffer key, ColumnFamily update) { List mutations = new ArrayList<>(update.getColumnCount()); + String indexKeySpace = properties.getProperty("keyspace"); + String indexColumnFamily = properties.getProperty("columnfamily") for (Cell cell : update) { // Skip the row marker and other empty values, since they lead to an empty key. if (cell.value().remaining() > 0) { - Mutation mutation = new Mutation(properties.getProperty("keyspace"), cell.value()); - mutation.add(properties.getProperty("columnfamily"), cell.name(), key, System.currentTimeMillis()); + Mutation mutation = new Mutation(indexKeySpace, cell.value()); + mutation.add(indexColumnFamily, cell.name(), key, System.currentTimeMillis()); mutations.add(mutation); } } From 401ed436ab0ca1f9294fbdd26d3da78ee70e9c3f Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Thu, 15 May 2014 22:32:41 -0400 Subject: [PATCH 041/557] fix typo --- .../src/org/apache/cassandra/triggers/InvertedIndex.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/triggers/src/org/apache/cassandra/triggers/InvertedIndex.java b/examples/triggers/src/org/apache/cassandra/triggers/InvertedIndex.java index fa90053fde71..cdcb962a6b7e 100644 --- a/examples/triggers/src/org/apache/cassandra/triggers/InvertedIndex.java +++ b/examples/triggers/src/org/apache/cassandra/triggers/InvertedIndex.java @@ -42,7 +42,7 @@ public Collection augment(ByteBuffer key, ColumnFamily update) List mutations = new ArrayList<>(update.getColumnCount()); String indexKeySpace = properties.getProperty("keyspace"); - String indexColumnFamily = properties.getProperty("columnfamily") + String indexColumnFamily = properties.getProperty("columnfamily"); for (Cell cell : update) { // Skip the row marker and other empty values, since they lead to an empty key. From a1f9b7c71e6ba549e61a1d5f5214796f355347a9 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Thu, 15 May 2014 23:07:35 -0400 Subject: [PATCH 042/557] add the sample properties file to the example trigger jar so it can be loaded --- examples/triggers/build.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/triggers/build.xml b/examples/triggers/build.xml index 293b08d7944c..450def677337 100644 --- a/examples/triggers/build.xml +++ b/examples/triggers/build.xml @@ -24,6 +24,7 @@ + @@ -50,6 +51,9 @@ + + + From 7879e7f9b6f0d95b85f24923bb93229ab129fca2 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Fri, 16 May 2014 06:34:38 -0400 Subject: [PATCH 043/557] minor nit: use the keyspace parameter --- test/unit/org/apache/cassandra/db/CommitLogTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/org/apache/cassandra/db/CommitLogTest.java b/test/unit/org/apache/cassandra/db/CommitLogTest.java index 660e91ee5d30..c4a1fe14e28e 100644 --- a/test/unit/org/apache/cassandra/db/CommitLogTest.java +++ b/test/unit/org/apache/cassandra/db/CommitLogTest.java @@ -171,7 +171,7 @@ public void testDeleteIfNotDirty() throws Exception private static int getMaxRecordDataSize(String keyspace, ByteBuffer key, String table, CellName column) { - Mutation rm = new Mutation("Keyspace1", bytes("k")); + Mutation rm = new Mutation(keyspace, bytes("k")); rm.add("Standard1", Util.cellname("c1"), ByteBuffer.allocate(0), 0); int max = (DatabaseDescriptor.getCommitLogSegmentSize() / 2); From 0c45727c4b53693e3a1d2fbc1b538bddacad6a0a Mon Sep 17 00:00:00 2001 From: Marcus Eriksson Date: Fri, 16 May 2014 16:24:09 +0200 Subject: [PATCH 044/557] Make incremental repair default Patch by marcuse; reviewed by jbellis for CASSANDRA-7250 --- CHANGES.txt | 1 + src/java/org/apache/cassandra/tools/NodeTool.java | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index e541e7e589f2..c7b2cf29243c 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -5,6 +5,7 @@ * Add Thrift get_multi_slice call (CASSANDRA-6757) * Optimize fetching multiple cells by name (CASSANDRA-6933) * Allow compilation in java 8 (CASSANDRA-7208) + * Make incremental repair default (CASSANDRA-7250) 2.1.0-rc1 * Add PowerShell Windows launch scripts (CASSANDRA-7001) diff --git a/src/java/org/apache/cassandra/tools/NodeTool.java b/src/java/org/apache/cassandra/tools/NodeTool.java index 8f2f26165adf..64ebd9eebc61 100644 --- a/src/java/org/apache/cassandra/tools/NodeTool.java +++ b/src/java/org/apache/cassandra/tools/NodeTool.java @@ -1604,8 +1604,8 @@ public static class Repair extends NodeToolCmd @Option(title = "primary_range", name = {"-pr", "--partitioner-range"}, description = "Use -pr to repair only the first range returned by the partitioner") private boolean primaryRange = false; - @Option(title = "incremental_repair", name = {"-inc", "--incremental"}, description = "Use -inc to use the new incremental repair") - private boolean incrementalRepair = false; + @Option(title = "full", name = {"-full", "--full"}, description = "Use -full to issue a full repair.") + private boolean fullRepair = false; @Override public void execute(NodeProbe probe) @@ -1626,9 +1626,9 @@ else if (localDC) else if(!specificHosts.isEmpty()) hosts = newArrayList(specificHosts); if (!startToken.isEmpty() || !endToken.isEmpty()) - probe.forceRepairRangeAsync(System.out, keyspace, !parallel, dataCenters,hosts, startToken, endToken, !incrementalRepair); + probe.forceRepairRangeAsync(System.out, keyspace, !parallel, dataCenters,hosts, startToken, endToken, fullRepair); else - probe.forceRepairAsync(System.out, keyspace, !parallel, dataCenters, hosts, primaryRange, !incrementalRepair, cfnames); + probe.forceRepairAsync(System.out, keyspace, !parallel, dataCenters, hosts, primaryRange, fullRepair, cfnames); } catch (Exception e) { throw new RuntimeException("Error occurred during repair", e); From 35801be6f4c85328fe8e73054eed5f91f3df115f Mon Sep 17 00:00:00 2001 From: Sylvain Lebresne Date: Fri, 23 May 2014 09:33:25 +0200 Subject: [PATCH 045/557] Fix broken paging state with prepared statement patch by slebresne; reviewed by thobbs for CASSANDRA-7120 --- CHANGES.txt | 1 + .../org/apache/cassandra/cql3/ResultSet.java | 38 ++++++++++--------- .../cql3/statements/SelectStatement.java | 5 +-- .../cassandra/service/pager/PagingState.java | 6 +++ .../transport/messages/ResultMessage.java | 11 +++++- 5 files changed, 40 insertions(+), 21 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 6c05bf5ecdfe..06b042e4c70c 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -31,6 +31,7 @@ * Fix nodetool netstats (CASSANDRA-7270) * Fix potential ClassCastException in HintedHandoffManager (CASSANDRA-7284) * Use prepared statements internally (CASSANDRA-6975) + * Fix broken paging state with prepared statement (CASSANDRA-7120) Merged from 2.0: * Always reallocate buffers in HSHA (CASSANDRA-6285) * (Hadoop) support authentication in CqlRecordReader (CASSANDRA-7221) diff --git a/src/java/org/apache/cassandra/cql3/ResultSet.java b/src/java/org/apache/cassandra/cql3/ResultSet.java index eea0475f6510..25635fa845fe 100644 --- a/src/java/org/apache/cassandra/cql3/ResultSet.java +++ b/src/java/org/apache/cassandra/cql3/ResultSet.java @@ -92,6 +92,16 @@ public void trim(int limit) } } + public ResultSet withPagingState(PagingState state) + { + if (state == null) + return this; + + // The metadata is shared by all execution of a given statement. So if there is a paging state + // we need to copy the metadata + return new ResultSet(metadata.withPagingState(state), rows); + } + public ResultSet makeCountResult(ColumnIdentifier alias) { assert metadata.names != null; @@ -238,7 +248,7 @@ public static class Metadata { public static final CBCodec codec = new Codec(); - public static final Metadata EMPTY = new Metadata(EnumSet.of(Flag.NO_METADATA), 0); + public static final Metadata EMPTY = new Metadata(EnumSet.of(Flag.NO_METADATA), null, 0, null); public final EnumSet flags; // Please note that columnCount can actually be smaller than names, even if names is not null. This is @@ -247,27 +257,21 @@ public static class Metadata // (CASSANDRA-4911). So the serialization code will exclude any columns in name whose index is >= columnCount. public final List names; public final int columnCount; - public PagingState pagingState; + public final PagingState pagingState; public Metadata(List names) { - this(EnumSet.noneOf(Flag.class), names); + this(EnumSet.noneOf(Flag.class), names, names.size(), null); if (!names.isEmpty() && allInSameCF()) flags.add(Flag.GLOBAL_TABLES_SPEC); } - private Metadata(EnumSet flags, List names) + private Metadata(EnumSet flags, List names, int columnCount, PagingState pagingState) { this.flags = flags; this.names = names; - this.columnCount = names.size(); - } - - private Metadata(EnumSet flags, int columnCount) - { - this.flags = flags; - this.names = null; this.columnCount = columnCount; + this.pagingState = pagingState; } // The maximum number of values that the ResultSet can hold. This can be bigger than columnCount due to CASSANDRA-4911 @@ -301,14 +305,14 @@ private boolean allInSameCF() return true; } - public Metadata setHasMorePages(PagingState pagingState) + public Metadata withPagingState(PagingState pagingState) { if (pagingState == null) return this; - flags.add(Flag.HAS_MORE_PAGES); - this.pagingState = pagingState; - return this; + EnumSet newFlags = EnumSet.copyOf(flags); + newFlags.add(Flag.HAS_MORE_PAGES); + return new Metadata(newFlags, names, columnCount, pagingState); } public void setSkipMetadata() @@ -354,7 +358,7 @@ public Metadata decode(ByteBuf body, int version) state = PagingState.deserialize(CBUtil.readValue(body)); if (flags.contains(Flag.NO_METADATA)) - return new Metadata(flags, columnCount).setHasMorePages(state); + return new Metadata(flags, null, columnCount, state); boolean globalTablesSpec = flags.contains(Flag.GLOBAL_TABLES_SPEC); @@ -376,7 +380,7 @@ public Metadata decode(ByteBuf body, int version) AbstractType type = DataType.toType(DataType.codec.decodeOne(body, version)); names.add(new ColumnSpecification(ksName, cfName, colName, type)); } - return new Metadata(flags, names).setHasMorePages(state); + return new Metadata(flags, names, names.size(), state); } public void encode(Metadata m, ByteBuf dest, int version) diff --git a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java index 1f9688ab7e15..765cbac36cf6 100644 --- a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java @@ -223,9 +223,8 @@ public ResultMessage.Rows execute(QueryState state, QueryOptions options) throws List page = pager.fetchPage(pageSize); ResultMessage.Rows msg = processResults(page, options, limit, now); - if (!pager.isExhausted()) - msg.result.metadata.setHasMorePages(pager.state()); - return msg; + + return pager.isExhausted() ? msg : msg.withPagingState(pager.state()); } } diff --git a/src/java/org/apache/cassandra/service/pager/PagingState.java b/src/java/org/apache/cassandra/service/pager/PagingState.java index 9d42d5cf466e..bbae921025f2 100644 --- a/src/java/org/apache/cassandra/service/pager/PagingState.java +++ b/src/java/org/apache/cassandra/service/pager/PagingState.java @@ -79,4 +79,10 @@ private int serializedSize() + 2 + cellName.remaining() + 4; } + + @Override + public String toString() + { + return String.format("PagingState(key=%s, cellname=%s, remaining=%d", ByteBufferUtil.bytesToHex(partitionKey), ByteBufferUtil.bytesToHex(cellName), remaining); + } } diff --git a/src/java/org/apache/cassandra/transport/messages/ResultMessage.java b/src/java/org/apache/cassandra/transport/messages/ResultMessage.java index 7ca9251d1bfc..9fe1d40b3ca7 100644 --- a/src/java/org/apache/cassandra/transport/messages/ResultMessage.java +++ b/src/java/org/apache/cassandra/transport/messages/ResultMessage.java @@ -26,6 +26,7 @@ import org.apache.cassandra.cql3.ResultSet; import org.apache.cassandra.cql3.statements.SelectStatement; import org.apache.cassandra.cql3.statements.ParsedStatement; +import org.apache.cassandra.service.pager.PagingState; import org.apache.cassandra.transport.*; import org.apache.cassandra.thrift.CqlPreparedResult; import org.apache.cassandra.thrift.CqlResult; @@ -219,6 +220,11 @@ public Rows(ResultSet result) this.result = result; } + public Rows withPagingState(PagingState state) + { + return new Rows(result.withPagingState(state)); + } + public CqlResult toThriftResult() { return result.toThriftResult(); @@ -229,7 +235,6 @@ public String toString() { return "ROWS " + result; } - } public static class Prepared extends ResultMessage @@ -276,7 +281,11 @@ public int encodedSize(ResultMessage msg, int version) }; public final MD5Digest statementId; + + /** Describes the variables to be bound in the prepared statement */ public final ResultSet.Metadata metadata; + + /** Describes the results of executing this prepared statement */ public final ResultSet.Metadata resultMetadata; // statement id for CQL-over-thrift compatibility. The binary protocol ignore that. From f5ee620bf9f47194b4326a4194c8d85e35ca4545 Mon Sep 17 00:00:00 2001 From: Marcus Eriksson Date: Tue, 27 May 2014 08:31:07 +0200 Subject: [PATCH 046/557] Make parallel repairs default (needed to make incremental repairs work) Patch by marcuse; reviewed by jbellis for CASSANDRA-7250 --- src/java/org/apache/cassandra/tools/NodeTool.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/java/org/apache/cassandra/tools/NodeTool.java b/src/java/org/apache/cassandra/tools/NodeTool.java index 64ebd9eebc61..77f10ecc4285 100644 --- a/src/java/org/apache/cassandra/tools/NodeTool.java +++ b/src/java/org/apache/cassandra/tools/NodeTool.java @@ -1583,8 +1583,8 @@ public static class Repair extends NodeToolCmd @Arguments(usage = "[ ...]", description = "The keyspace followed by one or many column families") private List args = new ArrayList<>(); - @Option(title = "parallel", name = {"-par", "--parallel"}, description = "Use -par to carry out a parallel repair") - private boolean parallel = false; + @Option(title = "seqential", name = {"-seq", "--sequential"}, description = "Use -seq to carry out a sequential repair") + private boolean sequential = false; @Option(title = "local_dc", name = {"-local", "--in-local-dc"}, description = "Use -local to only repair against nodes in the same datacenter") private boolean localDC = false; @@ -1626,9 +1626,9 @@ else if (localDC) else if(!specificHosts.isEmpty()) hosts = newArrayList(specificHosts); if (!startToken.isEmpty() || !endToken.isEmpty()) - probe.forceRepairRangeAsync(System.out, keyspace, !parallel, dataCenters,hosts, startToken, endToken, fullRepair); + probe.forceRepairRangeAsync(System.out, keyspace, sequential, dataCenters,hosts, startToken, endToken, fullRepair); else - probe.forceRepairAsync(System.out, keyspace, !parallel, dataCenters, hosts, primaryRange, fullRepair, cfnames); + probe.forceRepairAsync(System.out, keyspace, sequential, dataCenters, hosts, primaryRange, fullRepair, cfnames); } catch (Exception e) { throw new RuntimeException("Error occurred during repair", e); From 1def02f19dee6781ae28e5443be9fc0bb098f43d Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Wed, 4 Jun 2014 00:09:14 -0400 Subject: [PATCH 047/557] imports cleanup --- .../concurrent/JMXEnabledSharedExecutorPool.java | 1 - .../cassandra/concurrent/SharedExecutorPool.java | 1 - src/java/org/apache/cassandra/cql3/Attributes.java | 1 - .../org/apache/cassandra/cql3/BatchQueryOptions.java | 1 - src/java/org/apache/cassandra/cql3/Constants.java | 1 - src/java/org/apache/cassandra/cql3/Lists.java | 2 -- src/java/org/apache/cassandra/cql3/Maps.java | 1 - .../cql3/statements/ModificationStatement.java | 2 -- src/java/org/apache/cassandra/db/BatchlogManager.java | 1 - .../apache/cassandra/db/ColumnFamilySerializer.java | 1 - .../org/apache/cassandra/db/NativeCounterCell.java | 2 -- src/java/org/apache/cassandra/db/RangeTombstone.java | 1 - src/java/org/apache/cassandra/db/SystemKeyspace.java | 1 - .../db/columniterator/SimpleSliceReader.java | 1 - .../cassandra/db/commitlog/CommitLogDescriptor.java | 1 - .../cassandra/db/commitlog/CommitLogSegment.java | 1 - .../cassandra/db/compaction/AbstractCompactedRow.java | 1 - .../db/compaction/AbstractCompactionStrategy.java | 1 - .../cassandra/db/compaction/CompactionManager.java | 1 - .../cassandra/db/compaction/CompactionTask.java | 3 --- .../db/compaction/SizeTieredCompactionStrategy.java | 1 - .../org/apache/cassandra/db/compaction/Upgrader.java | 2 -- .../org/apache/cassandra/db/index/SecondaryIndex.java | 1 - .../org/apache/cassandra/db/marshal/DateType.java | 2 -- .../org/apache/cassandra/db/marshal/ListType.java | 2 -- src/java/org/apache/cassandra/db/marshal/MapType.java | 2 -- src/java/org/apache/cassandra/db/marshal/SetType.java | 1 - .../org/apache/cassandra/db/marshal/TimeUUIDType.java | 1 - .../org/apache/cassandra/db/marshal/TupleType.java | 2 -- .../org/apache/cassandra/db/marshal/UserType.java | 1 - .../apache/cassandra/hadoop/cql3/CqlConfigHelper.java | 1 - .../apache/cassandra/hadoop/cql3/CqlInputFormat.java | 2 -- .../apache/cassandra/hadoop/cql3/CqlRecordReader.java | 1 - .../hadoop/pig/AbstractCassandraStorage.java | 2 -- .../cassandra/io/compress/CompressionMetadata.java | 1 - .../cassandra/io/util/DataOutputStreamPlus.java | 3 --- src/java/org/apache/cassandra/io/util/Memory.java | 1 - .../apache/cassandra/metrics/FileCacheMetrics.java | 1 - src/java/org/apache/cassandra/net/MessageOut.java | 1 - .../apache/cassandra/serializers/ListSerializer.java | 1 - .../apache/cassandra/serializers/MapSerializer.java | 1 - .../apache/cassandra/serializers/SetSerializer.java | 2 -- .../apache/cassandra/service/AbstractRowResolver.java | 2 -- .../org/apache/cassandra/service/ClientState.java | 1 - .../ScheduledRangeTransferExecutorService.java | 1 - .../cassandra/service/pager/AbstractQueryPager.java | 1 - .../org/apache/cassandra/streaming/StreamReader.java | 1 - .../apache/cassandra/streaming/StreamReceiveTask.java | 1 - .../streaming/compress/CompressedStreamReader.java | 1 - .../cassandra/streaming/compress/CompressionInfo.java | 1 - .../streaming/messages/OutgoingFileMessage.java | 1 - .../cassandra/streaming/messages/PrepareMessage.java | 1 - .../cassandra/streaming/messages/ReceivedMessage.java | 1 - .../cassandra/streaming/messages/RetryMessage.java | 1 - .../cassandra/streaming/messages/StreamMessage.java | 1 - .../cassandra/tools/SSTableRepairedAtSetter.java | 11 ----------- src/java/org/apache/cassandra/transport/CBUtil.java | 3 --- .../apache/cassandra/transport/FrameCompressor.java | 2 -- src/java/org/apache/cassandra/transport/Server.java | 2 -- .../org/apache/cassandra/transport/SimpleClient.java | 2 -- .../cassandra/transport/messages/BatchMessage.java | 1 - .../cassandra/transport/messages/PrepareMessage.java | 1 - .../cassandra/transport/messages/QueryMessage.java | 1 - .../org/apache/cassandra/utils/BooleanSerializer.java | 1 - src/java/org/apache/cassandra/utils/CLibrary.java | 2 -- .../org/apache/cassandra/utils/btree/Builder.java | 1 - .../org/apache/cassandra/utils/btree/NodeBuilder.java | 1 - .../apache/cassandra/utils/concurrent/WaitQueue.java | 4 ---- 68 files changed, 103 deletions(-) diff --git a/src/java/org/apache/cassandra/concurrent/JMXEnabledSharedExecutorPool.java b/src/java/org/apache/cassandra/concurrent/JMXEnabledSharedExecutorPool.java index d70e524cf9f3..54bb7722618f 100644 --- a/src/java/org/apache/cassandra/concurrent/JMXEnabledSharedExecutorPool.java +++ b/src/java/org/apache/cassandra/concurrent/JMXEnabledSharedExecutorPool.java @@ -18,7 +18,6 @@ package org.apache.cassandra.concurrent; import java.lang.management.ManagementFactory; -import java.util.List; import javax.management.MBeanServer; import javax.management.ObjectName; diff --git a/src/java/org/apache/cassandra/concurrent/SharedExecutorPool.java b/src/java/org/apache/cassandra/concurrent/SharedExecutorPool.java index e03ec5717475..4640b97d8aac 100644 --- a/src/java/org/apache/cassandra/concurrent/SharedExecutorPool.java +++ b/src/java/org/apache/cassandra/concurrent/SharedExecutorPool.java @@ -19,7 +19,6 @@ import java.util.List; import java.util.Map; -import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentSkipListMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.atomic.AtomicInteger; diff --git a/src/java/org/apache/cassandra/cql3/Attributes.java b/src/java/org/apache/cassandra/cql3/Attributes.java index 435757b7a7b7..df40b0c24a3b 100644 --- a/src/java/org/apache/cassandra/cql3/Attributes.java +++ b/src/java/org/apache/cassandra/cql3/Attributes.java @@ -18,7 +18,6 @@ package org.apache.cassandra.cql3; import java.nio.ByteBuffer; -import java.util.List; import org.apache.cassandra.db.ExpiringCell; import org.apache.cassandra.db.marshal.Int32Type; diff --git a/src/java/org/apache/cassandra/cql3/BatchQueryOptions.java b/src/java/org/apache/cassandra/cql3/BatchQueryOptions.java index 2bb807188a30..2fcee5b2a0f6 100644 --- a/src/java/org/apache/cassandra/cql3/BatchQueryOptions.java +++ b/src/java/org/apache/cassandra/cql3/BatchQueryOptions.java @@ -24,7 +24,6 @@ import org.apache.cassandra.db.ConsistencyLevel; import org.apache.cassandra.service.QueryState; -import org.apache.cassandra.service.pager.PagingState; public abstract class BatchQueryOptions { diff --git a/src/java/org/apache/cassandra/cql3/Constants.java b/src/java/org/apache/cassandra/cql3/Constants.java index 58b11dda1c52..fe0fc785838d 100644 --- a/src/java/org/apache/cassandra/cql3/Constants.java +++ b/src/java/org/apache/cassandra/cql3/Constants.java @@ -18,7 +18,6 @@ package org.apache.cassandra.cql3; import java.nio.ByteBuffer; -import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/java/org/apache/cassandra/cql3/Lists.java b/src/java/org/apache/cassandra/cql3/Lists.java index c214fa81af8c..ad325841917a 100644 --- a/src/java/org/apache/cassandra/cql3/Lists.java +++ b/src/java/org/apache/cassandra/cql3/Lists.java @@ -19,8 +19,6 @@ import java.nio.ByteBuffer; import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; import java.util.List; import java.util.concurrent.atomic.AtomicReference; diff --git a/src/java/org/apache/cassandra/cql3/Maps.java b/src/java/org/apache/cassandra/cql3/Maps.java index e6beb7ea5dc6..f6900ae45b72 100644 --- a/src/java/org/apache/cassandra/cql3/Maps.java +++ b/src/java/org/apache/cassandra/cql3/Maps.java @@ -19,7 +19,6 @@ import java.nio.ByteBuffer; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; diff --git a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java index 621006bab0ea..a302af0ebf08 100644 --- a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java @@ -33,8 +33,6 @@ import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.db.filter.ColumnSlice; import org.apache.cassandra.db.filter.SliceQueryFilter; -import org.apache.cassandra.db.marshal.CompositeType; -import org.apache.cassandra.db.marshal.UTF8Type; import org.apache.cassandra.db.marshal.BooleanType; import org.apache.cassandra.exceptions.*; import org.apache.cassandra.service.ClientState; diff --git a/src/java/org/apache/cassandra/db/BatchlogManager.java b/src/java/org/apache/cassandra/db/BatchlogManager.java index d49c62093900..3ab09cc50ebe 100644 --- a/src/java/org/apache/cassandra/db/BatchlogManager.java +++ b/src/java/org/apache/cassandra/db/BatchlogManager.java @@ -38,7 +38,6 @@ import org.apache.cassandra.concurrent.DebuggableScheduledThreadPoolExecutor; import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.DatabaseDescriptor; -import org.apache.cassandra.cql3.QueryProcessor; import org.apache.cassandra.cql3.UntypedResultSet; import org.apache.cassandra.db.compaction.CompactionManager; import org.apache.cassandra.db.marshal.UUIDType; diff --git a/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java b/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java index f1393698141e..5ce2bfa091f6 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java @@ -18,7 +18,6 @@ package org.apache.cassandra.db; import java.io.DataInput; -import java.io.DataOutput; import java.io.IOException; import java.util.UUID; diff --git a/src/java/org/apache/cassandra/db/NativeCounterCell.java b/src/java/org/apache/cassandra/db/NativeCounterCell.java index 374eb23babb7..2828e1329b58 100644 --- a/src/java/org/apache/cassandra/db/NativeCounterCell.java +++ b/src/java/org/apache/cassandra/db/NativeCounterCell.java @@ -17,8 +17,6 @@ */ package org.apache.cassandra.db; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; import java.security.MessageDigest; import org.apache.cassandra.config.CFMetaData; diff --git a/src/java/org/apache/cassandra/db/RangeTombstone.java b/src/java/org/apache/cassandra/db/RangeTombstone.java index ffae7ba13b0f..8aff8bbd96a5 100644 --- a/src/java/org/apache/cassandra/db/RangeTombstone.java +++ b/src/java/org/apache/cassandra/db/RangeTombstone.java @@ -18,7 +18,6 @@ package org.apache.cassandra.db; import java.io.DataInput; -import java.io.DataOutput; import java.io.IOException; import java.security.MessageDigest; import java.util.*; diff --git a/src/java/org/apache/cassandra/db/SystemKeyspace.java b/src/java/org/apache/cassandra/db/SystemKeyspace.java index 9cb6e94fe679..19b818a9e661 100644 --- a/src/java/org/apache/cassandra/db/SystemKeyspace.java +++ b/src/java/org/apache/cassandra/db/SystemKeyspace.java @@ -29,7 +29,6 @@ import com.google.common.collect.Iterables; import com.google.common.collect.SetMultimap; import com.google.common.collect.Sets; -import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/java/org/apache/cassandra/db/columniterator/SimpleSliceReader.java b/src/java/org/apache/cassandra/db/columniterator/SimpleSliceReader.java index 702bddc0c563..bdbf4bd0d9a6 100644 --- a/src/java/org/apache/cassandra/db/columniterator/SimpleSliceReader.java +++ b/src/java/org/apache/cassandra/db/columniterator/SimpleSliceReader.java @@ -28,7 +28,6 @@ import org.apache.cassandra.db.composites.CellNameType; import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.io.sstable.CorruptSSTableException; -import org.apache.cassandra.io.sstable.Descriptor; import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.io.util.FileDataInput; import org.apache.cassandra.tracing.Tracing; diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogDescriptor.java b/src/java/org/apache/cassandra/db/commitlog/CommitLogDescriptor.java index 91c81e1bfbc3..e50a5853b497 100644 --- a/src/java/org/apache/cassandra/db/commitlog/CommitLogDescriptor.java +++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogDescriptor.java @@ -30,7 +30,6 @@ import org.apache.cassandra.io.FSReadError; import org.apache.cassandra.net.MessagingService; -import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.PureJavaCrc32; public class CommitLogDescriptor diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java b/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java index 78ba82411631..ef43d12063bf 100644 --- a/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java +++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java @@ -43,7 +43,6 @@ import org.apache.cassandra.config.Schema; import org.apache.cassandra.db.ColumnFamily; import org.apache.cassandra.db.Mutation; -import org.apache.cassandra.io.FSReadError; import org.apache.cassandra.io.FSWriteError; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.utils.CLibrary; diff --git a/src/java/org/apache/cassandra/db/compaction/AbstractCompactedRow.java b/src/java/org/apache/cassandra/db/compaction/AbstractCompactedRow.java index c49bee59e631..1d2bf48d4c89 100644 --- a/src/java/org/apache/cassandra/db/compaction/AbstractCompactedRow.java +++ b/src/java/org/apache/cassandra/db/compaction/AbstractCompactedRow.java @@ -18,7 +18,6 @@ package org.apache.cassandra.db.compaction; import java.io.Closeable; -import java.io.DataOutput; import java.io.IOException; import java.security.MessageDigest; diff --git a/src/java/org/apache/cassandra/db/compaction/AbstractCompactionStrategy.java b/src/java/org/apache/cassandra/db/compaction/AbstractCompactionStrategy.java index 1bbc93d8f5d7..1b7786ed0a55 100644 --- a/src/java/org/apache/cassandra/db/compaction/AbstractCompactionStrategy.java +++ b/src/java/org/apache/cassandra/db/compaction/AbstractCompactionStrategy.java @@ -21,7 +21,6 @@ import com.google.common.collect.ImmutableMap; import com.google.common.base.Predicate; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import com.google.common.util.concurrent.RateLimiter; import org.slf4j.Logger; diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java index 227f9082de6c..86feb93594c3 100644 --- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java +++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java @@ -35,7 +35,6 @@ import java.util.concurrent.Future; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.SynchronousQueue; -import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import javax.management.MBeanServer; import javax.management.ObjectName; diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionTask.java b/src/java/org/apache/cassandra/db/compaction/CompactionTask.java index c1c55046cb72..349caf3fa19a 100644 --- a/src/java/org/apache/cassandra/db/compaction/CompactionTask.java +++ b/src/java/org/apache/cassandra/db/compaction/CompactionTask.java @@ -20,7 +20,6 @@ import java.io.File; import java.io.IOException; import java.util.Collection; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -29,7 +28,6 @@ import java.util.concurrent.TimeUnit; import com.google.common.base.Predicate; -import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.google.common.collect.Sets; import org.apache.commons.lang3.StringUtils; @@ -38,7 +36,6 @@ import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.ColumnFamilyStore; -import org.apache.cassandra.db.RowIndexEntry; import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.db.compaction.CompactionManager.CompactionExecutorStatsCollector; import org.apache.cassandra.io.sstable.SSTableReader; diff --git a/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategy.java b/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategy.java index c6cef59b78b6..2fa188ca219c 100644 --- a/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategy.java +++ b/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategy.java @@ -31,7 +31,6 @@ import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.sstable.SSTableReader; -import org.apache.cassandra.service.ActiveRepairService; import org.apache.cassandra.utils.Pair; public class SizeTieredCompactionStrategy extends AbstractCompactionStrategy diff --git a/src/java/org/apache/cassandra/db/compaction/Upgrader.java b/src/java/org/apache/cassandra/db/compaction/Upgrader.java index 734fe23cb572..c48a6aa3379b 100644 --- a/src/java/org/apache/cassandra/db/compaction/Upgrader.java +++ b/src/java/org/apache/cassandra/db/compaction/Upgrader.java @@ -18,7 +18,6 @@ package org.apache.cassandra.db.compaction; import java.io.File; -import java.io.IOException; import java.util.*; import com.google.common.base.Throwables; @@ -27,7 +26,6 @@ import org.apache.cassandra.db.DecoratedKey; import org.apache.cassandra.io.sstable.*; import org.apache.cassandra.io.sstable.metadata.MetadataCollector; -import org.apache.cassandra.utils.CLibrary; import org.apache.cassandra.utils.CloseableIterator; import org.apache.cassandra.utils.OutputHandler; diff --git a/src/java/org/apache/cassandra/db/index/SecondaryIndex.java b/src/java/org/apache/cassandra/db/index/SecondaryIndex.java index 4f95a5a1309c..3b18a157fbc8 100644 --- a/src/java/org/apache/cassandra/db/index/SecondaryIndex.java +++ b/src/java/org/apache/cassandra/db/index/SecondaryIndex.java @@ -52,7 +52,6 @@ import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.FBUtilities; -import org.apache.cassandra.utils.memory.MemtableAllocator; /** * Abstract base class for different types of secondary indexes. diff --git a/src/java/org/apache/cassandra/db/marshal/DateType.java b/src/java/org/apache/cassandra/db/marshal/DateType.java index 7003097dcb39..69e7a99f3a91 100644 --- a/src/java/org/apache/cassandra/db/marshal/DateType.java +++ b/src/java/org/apache/cassandra/db/marshal/DateType.java @@ -18,7 +18,6 @@ package org.apache.cassandra.db.marshal; import java.nio.ByteBuffer; -import java.text.ParseException; import java.util.Date; import org.slf4j.Logger; @@ -29,7 +28,6 @@ import org.apache.cassandra.serializers.TimestampSerializer; import org.apache.cassandra.serializers.MarshalException; import org.apache.cassandra.utils.ByteBufferUtil; -import org.apache.commons.lang3.time.DateUtils; public class DateType extends AbstractType { diff --git a/src/java/org/apache/cassandra/db/marshal/ListType.java b/src/java/org/apache/cassandra/db/marshal/ListType.java index 171e17921ada..e7f1fbbbbe6a 100644 --- a/src/java/org/apache/cassandra/db/marshal/ListType.java +++ b/src/java/org/apache/cassandra/db/marshal/ListType.java @@ -24,9 +24,7 @@ import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.SyntaxException; import org.apache.cassandra.serializers.CollectionSerializer; -import org.apache.cassandra.serializers.TypeSerializer; import org.apache.cassandra.serializers.ListSerializer; -import org.apache.cassandra.utils.ByteBufferUtil; public class ListType extends CollectionType> { diff --git a/src/java/org/apache/cassandra/db/marshal/MapType.java b/src/java/org/apache/cassandra/db/marshal/MapType.java index dbf6721035c4..27d42302caf5 100644 --- a/src/java/org/apache/cassandra/db/marshal/MapType.java +++ b/src/java/org/apache/cassandra/db/marshal/MapType.java @@ -24,10 +24,8 @@ import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.SyntaxException; import org.apache.cassandra.serializers.CollectionSerializer; -import org.apache.cassandra.serializers.TypeSerializer; import org.apache.cassandra.serializers.MapSerializer; import org.apache.cassandra.utils.Pair; -import org.apache.cassandra.utils.ByteBufferUtil; public class MapType extends CollectionType> { diff --git a/src/java/org/apache/cassandra/db/marshal/SetType.java b/src/java/org/apache/cassandra/db/marshal/SetType.java index d2f7f12231ad..70e1f7b88b90 100644 --- a/src/java/org/apache/cassandra/db/marshal/SetType.java +++ b/src/java/org/apache/cassandra/db/marshal/SetType.java @@ -23,7 +23,6 @@ import org.apache.cassandra.db.Cell; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.SyntaxException; -import org.apache.cassandra.serializers.TypeSerializer; import org.apache.cassandra.serializers.SetSerializer; public class SetType extends CollectionType> diff --git a/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java b/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java index 21dc5b9af9a2..573b3686c48e 100644 --- a/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java +++ b/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java @@ -26,7 +26,6 @@ import org.apache.cassandra.serializers.MarshalException; import org.apache.cassandra.serializers.TimeUUIDSerializer; import org.apache.cassandra.utils.ByteBufferUtil; -import org.apache.cassandra.utils.UUIDGen; public class TimeUUIDType extends AbstractType { diff --git a/src/java/org/apache/cassandra/db/marshal/TupleType.java b/src/java/org/apache/cassandra/db/marshal/TupleType.java index e754b514c763..34b7eb039c96 100644 --- a/src/java/org/apache/cassandra/db/marshal/TupleType.java +++ b/src/java/org/apache/cassandra/db/marshal/TupleType.java @@ -18,7 +18,6 @@ package org.apache.cassandra.db.marshal; import java.nio.ByteBuffer; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -29,7 +28,6 @@ import org.apache.cassandra.exceptions.SyntaxException; import org.apache.cassandra.serializers.*; import org.apache.cassandra.utils.ByteBufferUtil; -import org.apache.cassandra.utils.Pair; /** * This is essentially like a CompositeType, but it's not primarily meant for comparison, just diff --git a/src/java/org/apache/cassandra/db/marshal/UserType.java b/src/java/org/apache/cassandra/db/marshal/UserType.java index 44c208f32ee9..3c6ca8443944 100644 --- a/src/java/org/apache/cassandra/db/marshal/UserType.java +++ b/src/java/org/apache/cassandra/db/marshal/UserType.java @@ -19,7 +19,6 @@ import java.nio.ByteBuffer; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import com.google.common.base.Objects; diff --git a/src/java/org/apache/cassandra/hadoop/cql3/CqlConfigHelper.java b/src/java/org/apache/cassandra/hadoop/cql3/CqlConfigHelper.java index 63279d17e78b..b375ce258a3e 100644 --- a/src/java/org/apache/cassandra/hadoop/cql3/CqlConfigHelper.java +++ b/src/java/org/apache/cassandra/hadoop/cql3/CqlConfigHelper.java @@ -20,7 +20,6 @@ * */ import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; import java.security.KeyManagementException; import java.security.KeyStore; diff --git a/src/java/org/apache/cassandra/hadoop/cql3/CqlInputFormat.java b/src/java/org/apache/cassandra/hadoop/cql3/CqlInputFormat.java index e1cdf32799bf..09bd80c1751c 100644 --- a/src/java/org/apache/cassandra/hadoop/cql3/CqlInputFormat.java +++ b/src/java/org/apache/cassandra/hadoop/cql3/CqlInputFormat.java @@ -18,8 +18,6 @@ package org.apache.cassandra.hadoop.cql3; import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.Map; import org.apache.cassandra.hadoop.AbstractColumnFamilyInputFormat; import org.apache.hadoop.mapred.InputSplit; diff --git a/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordReader.java b/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordReader.java index a97718b732b6..4c452b378295 100644 --- a/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordReader.java +++ b/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordReader.java @@ -31,7 +31,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.cassandra.db.marshal.AbstractType; -import org.apache.cassandra.db.marshal.BytesType; import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.hadoop.ColumnFamilySplit; import org.apache.cassandra.hadoop.ConfigHelper; diff --git a/src/java/org/apache/cassandra/hadoop/pig/AbstractCassandraStorage.java b/src/java/org/apache/cassandra/hadoop/pig/AbstractCassandraStorage.java index 361baa4cc84d..536cdb33ae41 100644 --- a/src/java/org/apache/cassandra/hadoop/pig/AbstractCassandraStorage.java +++ b/src/java/org/apache/cassandra/hadoop/pig/AbstractCassandraStorage.java @@ -25,8 +25,6 @@ import java.nio.charset.CharacterCodingException; import java.util.*; -import com.google.common.collect.Iterables; - import org.apache.cassandra.db.Cell; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.SyntaxException; diff --git a/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java b/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java index abb067fb4efb..3d6cb71703dc 100644 --- a/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java +++ b/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java @@ -50,7 +50,6 @@ import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.io.util.Memory; -import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.Pair; /** diff --git a/src/java/org/apache/cassandra/io/util/DataOutputStreamPlus.java b/src/java/org/apache/cassandra/io/util/DataOutputStreamPlus.java index 6f2e21a94cd8..7c1c9d887590 100644 --- a/src/java/org/apache/cassandra/io/util/DataOutputStreamPlus.java +++ b/src/java/org/apache/cassandra/io/util/DataOutputStreamPlus.java @@ -19,9 +19,6 @@ import java.io.IOException; import java.io.OutputStream; -import java.nio.ByteBuffer; - -import org.apache.cassandra.utils.ByteBufferUtil; /** * When possible use {@link DataOutputStreamAndChannel} instead of this class, as it will diff --git a/src/java/org/apache/cassandra/io/util/Memory.java b/src/java/org/apache/cassandra/io/util/Memory.java index 67dee818dbab..b908a9db111b 100644 --- a/src/java/org/apache/cassandra/io/util/Memory.java +++ b/src/java/org/apache/cassandra/io/util/Memory.java @@ -20,7 +20,6 @@ import java.nio.ByteBuffer; import java.nio.ByteOrder; -import com.sun.jna.Native; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.utils.memory.MemoryUtil; import sun.misc.Unsafe; diff --git a/src/java/org/apache/cassandra/metrics/FileCacheMetrics.java b/src/java/org/apache/cassandra/metrics/FileCacheMetrics.java index 42444f349ef8..5f6bd20136f4 100644 --- a/src/java/org/apache/cassandra/metrics/FileCacheMetrics.java +++ b/src/java/org/apache/cassandra/metrics/FileCacheMetrics.java @@ -22,7 +22,6 @@ import com.yammer.metrics.Metrics; import com.yammer.metrics.core.Gauge; import com.yammer.metrics.core.Meter; -import com.yammer.metrics.core.MetricName; import com.yammer.metrics.util.RatioGauge; import org.apache.cassandra.service.FileCacheService; diff --git a/src/java/org/apache/cassandra/net/MessageOut.java b/src/java/org/apache/cassandra/net/MessageOut.java index c78b13fd929d..70c4f5ce2877 100644 --- a/src/java/org/apache/cassandra/net/MessageOut.java +++ b/src/java/org/apache/cassandra/net/MessageOut.java @@ -18,7 +18,6 @@ package org.apache.cassandra.net; -import java.io.DataOutputStream; import java.io.IOException; import java.net.InetAddress; import java.util.Collections; diff --git a/src/java/org/apache/cassandra/serializers/ListSerializer.java b/src/java/org/apache/cassandra/serializers/ListSerializer.java index b64c012bf6c7..16fdd212f931 100644 --- a/src/java/org/apache/cassandra/serializers/ListSerializer.java +++ b/src/java/org/apache/cassandra/serializers/ListSerializer.java @@ -22,7 +22,6 @@ import java.nio.ByteBuffer; import java.util.*; -import org.apache.cassandra.utils.ByteBufferUtil; public class ListSerializer extends CollectionSerializer> { diff --git a/src/java/org/apache/cassandra/serializers/MapSerializer.java b/src/java/org/apache/cassandra/serializers/MapSerializer.java index 34e7c05b71d3..51a658512282 100644 --- a/src/java/org/apache/cassandra/serializers/MapSerializer.java +++ b/src/java/org/apache/cassandra/serializers/MapSerializer.java @@ -22,7 +22,6 @@ import java.nio.ByteBuffer; import java.util.*; -import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.Pair; public class MapSerializer extends CollectionSerializer> diff --git a/src/java/org/apache/cassandra/serializers/SetSerializer.java b/src/java/org/apache/cassandra/serializers/SetSerializer.java index 136b4e0370ae..4e7df64669b4 100644 --- a/src/java/org/apache/cassandra/serializers/SetSerializer.java +++ b/src/java/org/apache/cassandra/serializers/SetSerializer.java @@ -22,8 +22,6 @@ import java.nio.ByteBuffer; import java.util.*; -import org.apache.cassandra.utils.ByteBufferUtil; - public class SetSerializer extends CollectionSerializer> { // interning instances diff --git a/src/java/org/apache/cassandra/service/AbstractRowResolver.java b/src/java/org/apache/cassandra/service/AbstractRowResolver.java index 9e287cf7a6a0..6db2569a379b 100644 --- a/src/java/org/apache/cassandra/service/AbstractRowResolver.java +++ b/src/java/org/apache/cassandra/service/AbstractRowResolver.java @@ -19,10 +19,8 @@ import java.nio.ByteBuffer; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.concurrent.ConcurrentLinkedQueue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/java/org/apache/cassandra/service/ClientState.java b/src/java/org/apache/cassandra/service/ClientState.java index a3a65a0c8c73..e2049ace0fef 100644 --- a/src/java/org/apache/cassandra/service/ClientState.java +++ b/src/java/org/apache/cassandra/service/ClientState.java @@ -26,7 +26,6 @@ import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.google.common.collect.Sets; -import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/java/org/apache/cassandra/service/ScheduledRangeTransferExecutorService.java b/src/java/org/apache/cassandra/service/ScheduledRangeTransferExecutorService.java index 860619ae0d65..b8117b9ba507 100644 --- a/src/java/org/apache/cassandra/service/ScheduledRangeTransferExecutorService.java +++ b/src/java/org/apache/cassandra/service/ScheduledRangeTransferExecutorService.java @@ -32,7 +32,6 @@ import org.apache.cassandra.cql3.UntypedResultSet; import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.dht.Token; -import org.apache.cassandra.utils.ByteBufferUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/java/org/apache/cassandra/service/pager/AbstractQueryPager.java b/src/java/org/apache/cassandra/service/pager/AbstractQueryPager.java index fc57a133a39c..28ef7b18869d 100644 --- a/src/java/org/apache/cassandra/service/pager/AbstractQueryPager.java +++ b/src/java/org/apache/cassandra/service/pager/AbstractQueryPager.java @@ -27,7 +27,6 @@ import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.Schema; import org.apache.cassandra.db.*; -import org.apache.cassandra.db.composites.CellName; import org.apache.cassandra.db.filter.ColumnCounter; import org.apache.cassandra.db.filter.IDiskAtomFilter; import org.apache.cassandra.exceptions.RequestExecutionException; diff --git a/src/java/org/apache/cassandra/streaming/StreamReader.java b/src/java/org/apache/cassandra/streaming/StreamReader.java index 7963629b851e..c2ede90e551a 100644 --- a/src/java/org/apache/cassandra/streaming/StreamReader.java +++ b/src/java/org/apache/cassandra/streaming/StreamReader.java @@ -40,7 +40,6 @@ import org.apache.cassandra.io.sstable.Component; import org.apache.cassandra.io.sstable.Descriptor; import org.apache.cassandra.io.sstable.SSTableWriter; -import org.apache.cassandra.service.ActiveRepairService; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.streaming.messages.FileMessageHeader; import org.apache.cassandra.utils.ByteBufferUtil; diff --git a/src/java/org/apache/cassandra/streaming/StreamReceiveTask.java b/src/java/org/apache/cassandra/streaming/StreamReceiveTask.java index b4d5392f780f..9a2568d3658d 100644 --- a/src/java/org/apache/cassandra/streaming/StreamReceiveTask.java +++ b/src/java/org/apache/cassandra/streaming/StreamReceiveTask.java @@ -27,7 +27,6 @@ import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.io.sstable.SSTableWriter; -import org.apache.cassandra.service.ActiveRepairService; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.Pair; diff --git a/src/java/org/apache/cassandra/streaming/compress/CompressedStreamReader.java b/src/java/org/apache/cassandra/streaming/compress/CompressedStreamReader.java index 3c13d11d1400..ec116284ffc4 100644 --- a/src/java/org/apache/cassandra/streaming/compress/CompressedStreamReader.java +++ b/src/java/org/apache/cassandra/streaming/compress/CompressedStreamReader.java @@ -32,7 +32,6 @@ import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.io.compress.CompressionMetadata; import org.apache.cassandra.io.sstable.SSTableWriter; -import org.apache.cassandra.service.ActiveRepairService; import org.apache.cassandra.streaming.ProgressInfo; import org.apache.cassandra.streaming.StreamReader; import org.apache.cassandra.streaming.StreamSession; diff --git a/src/java/org/apache/cassandra/streaming/compress/CompressionInfo.java b/src/java/org/apache/cassandra/streaming/compress/CompressionInfo.java index 8cfcd95f6029..907a1c7c751f 100644 --- a/src/java/org/apache/cassandra/streaming/compress/CompressionInfo.java +++ b/src/java/org/apache/cassandra/streaming/compress/CompressionInfo.java @@ -18,7 +18,6 @@ package org.apache.cassandra.streaming.compress; import java.io.DataInput; -import java.io.DataOutput; import java.io.IOException; import org.apache.cassandra.db.TypeSizes; diff --git a/src/java/org/apache/cassandra/streaming/messages/OutgoingFileMessage.java b/src/java/org/apache/cassandra/streaming/messages/OutgoingFileMessage.java index b012869aa9c0..466e2cb8119c 100644 --- a/src/java/org/apache/cassandra/streaming/messages/OutgoingFileMessage.java +++ b/src/java/org/apache/cassandra/streaming/messages/OutgoingFileMessage.java @@ -23,7 +23,6 @@ import org.apache.cassandra.io.compress.CompressionMetadata; import org.apache.cassandra.io.sstable.SSTableReader; -import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.io.util.DataOutputStreamAndChannel; import org.apache.cassandra.streaming.StreamSession; import org.apache.cassandra.streaming.StreamWriter; diff --git a/src/java/org/apache/cassandra/streaming/messages/PrepareMessage.java b/src/java/org/apache/cassandra/streaming/messages/PrepareMessage.java index 0bc598261b76..7efe075b503a 100644 --- a/src/java/org/apache/cassandra/streaming/messages/PrepareMessage.java +++ b/src/java/org/apache/cassandra/streaming/messages/PrepareMessage.java @@ -23,7 +23,6 @@ import java.util.ArrayList; import java.util.Collection; -import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.io.util.DataOutputStreamAndChannel; import org.apache.cassandra.streaming.StreamRequest; import org.apache.cassandra.streaming.StreamSession; diff --git a/src/java/org/apache/cassandra/streaming/messages/ReceivedMessage.java b/src/java/org/apache/cassandra/streaming/messages/ReceivedMessage.java index e556651f9860..f206d0d9008d 100644 --- a/src/java/org/apache/cassandra/streaming/messages/ReceivedMessage.java +++ b/src/java/org/apache/cassandra/streaming/messages/ReceivedMessage.java @@ -22,7 +22,6 @@ import java.nio.channels.ReadableByteChannel; import java.util.UUID; -import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.io.util.DataOutputStreamAndChannel; import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.streaming.StreamSession; diff --git a/src/java/org/apache/cassandra/streaming/messages/RetryMessage.java b/src/java/org/apache/cassandra/streaming/messages/RetryMessage.java index 50b88738c025..8d5707a7db04 100644 --- a/src/java/org/apache/cassandra/streaming/messages/RetryMessage.java +++ b/src/java/org/apache/cassandra/streaming/messages/RetryMessage.java @@ -22,7 +22,6 @@ import java.nio.channels.ReadableByteChannel; import java.util.UUID; -import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.io.util.DataOutputStreamAndChannel; import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.streaming.StreamSession; diff --git a/src/java/org/apache/cassandra/streaming/messages/StreamMessage.java b/src/java/org/apache/cassandra/streaming/messages/StreamMessage.java index 360b59e254e7..e527db1444a6 100644 --- a/src/java/org/apache/cassandra/streaming/messages/StreamMessage.java +++ b/src/java/org/apache/cassandra/streaming/messages/StreamMessage.java @@ -20,7 +20,6 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.ReadableByteChannel; -import java.nio.channels.WritableByteChannel; import org.apache.cassandra.io.util.DataOutputStreamAndChannel; import org.apache.cassandra.streaming.StreamSession; diff --git a/src/java/org/apache/cassandra/tools/SSTableRepairedAtSetter.java b/src/java/org/apache/cassandra/tools/SSTableRepairedAtSetter.java index 623e71b6e722..8d2946e458c4 100644 --- a/src/java/org/apache/cassandra/tools/SSTableRepairedAtSetter.java +++ b/src/java/org/apache/cassandra/tools/SSTableRepairedAtSetter.java @@ -22,20 +22,9 @@ import java.io.PrintStream; import java.nio.file.Files; import java.nio.file.attribute.FileTime; -import java.util.EnumSet; -import java.util.Map; -import java.util.Set; -import org.apache.cassandra.config.DatabaseDescriptor; -import org.apache.cassandra.db.ColumnFamilyStore; -import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.io.sstable.Component; import org.apache.cassandra.io.sstable.Descriptor; -import org.apache.cassandra.io.sstable.metadata.CompactionMetadata; -import org.apache.cassandra.io.sstable.metadata.MetadataComponent; -import org.apache.cassandra.io.sstable.metadata.MetadataType; -import org.apache.cassandra.io.sstable.metadata.StatsMetadata; -import org.apache.cassandra.io.sstable.metadata.ValidationMetadata; import org.apache.cassandra.service.ActiveRepairService; /** diff --git a/src/java/org/apache/cassandra/transport/CBUtil.java b/src/java/org/apache/cassandra/transport/CBUtil.java index e5e6f05e889e..eac687d44e3c 100644 --- a/src/java/org/apache/cassandra/transport/CBUtil.java +++ b/src/java/org/apache/cassandra/transport/CBUtil.java @@ -32,13 +32,10 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.PooledByteBufAllocator; -import io.netty.buffer.Unpooled; -import io.netty.util.AttributeKey; import io.netty.util.CharsetUtil; import org.apache.cassandra.db.ConsistencyLevel; import org.apache.cassandra.db.TypeSizes; -import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.Pair; import org.apache.cassandra.utils.UUIDGen; diff --git a/src/java/org/apache/cassandra/transport/FrameCompressor.java b/src/java/org/apache/cassandra/transport/FrameCompressor.java index 9617ec28972f..23bfce729528 100644 --- a/src/java/org/apache/cassandra/transport/FrameCompressor.java +++ b/src/java/org/apache/cassandra/transport/FrameCompressor.java @@ -20,11 +20,9 @@ import java.io.IOException; import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; import org.xerial.snappy.Snappy; import org.xerial.snappy.SnappyError; -import net.jpountz.lz4.LZ4Exception; import net.jpountz.lz4.LZ4Factory; public interface FrameCompressor diff --git a/src/java/org/apache/cassandra/transport/Server.java b/src/java/org/apache/cassandra/transport/Server.java index 2fed8895e365..2a351b01dd28 100644 --- a/src/java/org/apache/cassandra/transport/Server.java +++ b/src/java/org/apache/cassandra/transport/Server.java @@ -27,8 +27,6 @@ import javax.net.ssl.SSLContext; import javax.net.ssl.SSLEngine; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.PooledByteBufAllocator; import io.netty.util.Version; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/java/org/apache/cassandra/transport/SimpleClient.java b/src/java/org/apache/cassandra/transport/SimpleClient.java index 3cf9b7b80b88..1a4a77685bfd 100644 --- a/src/java/org/apache/cassandra/transport/SimpleClient.java +++ b/src/java/org/apache/cassandra/transport/SimpleClient.java @@ -25,7 +25,6 @@ import java.util.List; import java.util.Map; import java.util.concurrent.BlockingQueue; -import java.util.concurrent.Executors; import java.util.concurrent.SynchronousQueue; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLEngine; @@ -39,7 +38,6 @@ import io.netty.channel.ChannelOption; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.util.internal.logging.InternalLoggerFactory; import io.netty.util.internal.logging.Slf4JLoggerFactory; import org.apache.cassandra.cql3.QueryOptions; diff --git a/src/java/org/apache/cassandra/transport/messages/BatchMessage.java b/src/java/org/apache/cassandra/transport/messages/BatchMessage.java index ec96ed112b35..2199ca0268ec 100644 --- a/src/java/org/apache/cassandra/transport/messages/BatchMessage.java +++ b/src/java/org/apache/cassandra/transport/messages/BatchMessage.java @@ -29,7 +29,6 @@ import org.apache.cassandra.cql3.statements.BatchStatement; import org.apache.cassandra.cql3.statements.ModificationStatement; import org.apache.cassandra.cql3.statements.ParsedStatement; -import org.apache.cassandra.db.ConsistencyLevel; import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.exceptions.PreparedQueryNotFoundException; import org.apache.cassandra.service.QueryState; diff --git a/src/java/org/apache/cassandra/transport/messages/PrepareMessage.java b/src/java/org/apache/cassandra/transport/messages/PrepareMessage.java index 2899cf81e7ef..44daa4082363 100644 --- a/src/java/org/apache/cassandra/transport/messages/PrepareMessage.java +++ b/src/java/org/apache/cassandra/transport/messages/PrepareMessage.java @@ -22,7 +22,6 @@ import com.google.common.collect.ImmutableMap; import io.netty.buffer.ByteBuf; -import org.apache.cassandra.cql3.QueryProcessor; import org.apache.cassandra.service.QueryState; import org.apache.cassandra.tracing.Tracing; import org.apache.cassandra.transport.*; diff --git a/src/java/org/apache/cassandra/transport/messages/QueryMessage.java b/src/java/org/apache/cassandra/transport/messages/QueryMessage.java index 377cdaf687c6..b8b15effca2c 100644 --- a/src/java/org/apache/cassandra/transport/messages/QueryMessage.java +++ b/src/java/org/apache/cassandra/transport/messages/QueryMessage.java @@ -24,7 +24,6 @@ import com.google.common.collect.ImmutableMap; import io.netty.buffer.ByteBuf; -import org.apache.cassandra.cql3.QueryHandler; import org.apache.cassandra.cql3.QueryOptions; import org.apache.cassandra.db.ConsistencyLevel; import org.apache.cassandra.exceptions.*; diff --git a/src/java/org/apache/cassandra/utils/BooleanSerializer.java b/src/java/org/apache/cassandra/utils/BooleanSerializer.java index f1707c355e33..8f3abde67de1 100644 --- a/src/java/org/apache/cassandra/utils/BooleanSerializer.java +++ b/src/java/org/apache/cassandra/utils/BooleanSerializer.java @@ -18,7 +18,6 @@ package org.apache.cassandra.utils; import java.io.DataInput; -import java.io.DataOutput; import java.io.IOException; import org.apache.cassandra.io.IVersionedSerializer; diff --git a/src/java/org/apache/cassandra/utils/CLibrary.java b/src/java/org/apache/cassandra/utils/CLibrary.java index 1d3c0145fb4d..612d9662a58f 100644 --- a/src/java/org/apache/cassandra/utils/CLibrary.java +++ b/src/java/org/apache/cassandra/utils/CLibrary.java @@ -18,8 +18,6 @@ package org.apache.cassandra.utils; import java.io.FileDescriptor; -import java.io.FileNotFoundException; -import java.io.IOException; import java.io.RandomAccessFile; import java.lang.reflect.Field; diff --git a/src/java/org/apache/cassandra/utils/btree/Builder.java b/src/java/org/apache/cassandra/utils/btree/Builder.java index f6677d4dc7b9..aa4c5dc26d9d 100644 --- a/src/java/org/apache/cassandra/utils/btree/Builder.java +++ b/src/java/org/apache/cassandra/utils/btree/Builder.java @@ -18,7 +18,6 @@ */ package org.apache.cassandra.utils.btree; -import java.util.Collection; import java.util.Comparator; import static org.apache.cassandra.utils.btree.BTree.EMPTY_LEAF; diff --git a/src/java/org/apache/cassandra/utils/btree/NodeBuilder.java b/src/java/org/apache/cassandra/utils/btree/NodeBuilder.java index ba6cf2178c9a..331aa2f30922 100644 --- a/src/java/org/apache/cassandra/utils/btree/NodeBuilder.java +++ b/src/java/org/apache/cassandra/utils/btree/NodeBuilder.java @@ -25,7 +25,6 @@ import static org.apache.cassandra.utils.btree.BTree.EMPTY_BRANCH; import static org.apache.cassandra.utils.btree.BTree.FAN_FACTOR; -import static org.apache.cassandra.utils.btree.BTree.POSITIVE_INFINITY; import static org.apache.cassandra.utils.btree.BTree.compare; import static org.apache.cassandra.utils.btree.BTree.find; import static org.apache.cassandra.utils.btree.BTree.getKeyEnd; diff --git a/src/java/org/apache/cassandra/utils/concurrent/WaitQueue.java b/src/java/org/apache/cassandra/utils/concurrent/WaitQueue.java index 2322210d60b1..df3d38d71cd7 100644 --- a/src/java/org/apache/cassandra/utils/concurrent/WaitQueue.java +++ b/src/java/org/apache/cassandra/utils/concurrent/WaitQueue.java @@ -19,12 +19,8 @@ package org.apache.cassandra.utils.concurrent; import com.yammer.metrics.core.TimerContext; -import org.slf4j.*; -import java.util.ArrayList; import java.util.Iterator; -import java.util.List; -import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; import java.util.concurrent.locks.LockSupport; From a4504388a8761b42f4f28604d98ac668ca496d55 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Thu, 12 Jun 2014 18:42:21 -0500 Subject: [PATCH 048/557] Track metrics at a keyspace level Patch by brandonwilliams, reviewed by yukim for CASSANDRA-6539 --- CHANGES.txt | 1 + src/java/org/apache/cassandra/db/Table.java | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/CHANGES.txt b/CHANGES.txt index f37eda4f112f..28b5f295ddea 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 1.2.17 + * Track metrics at a keyspace level (CASSANDRA-6539) * Add replace_address_first_boot flag to only replace if not bootstrapped (CASSANDRA-7356) * Enable keepalive for native protocol (CASSANDRA-7380) * Check internal addresses for seeds (CASSANDRA-6523) diff --git a/src/java/org/apache/cassandra/db/Table.java b/src/java/org/apache/cassandra/db/Table.java index e6df98268af4..611fd9a08495 100644 --- a/src/java/org/apache/cassandra/db/Table.java +++ b/src/java/org/apache/cassandra/db/Table.java @@ -42,6 +42,7 @@ import org.apache.cassandra.locator.AbstractReplicationStrategy; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.tracing.Tracing; +import org.apache.cassandra.metrics.KeyspaceMetrics; /** * It represents a Keyspace. @@ -74,6 +75,7 @@ public class Table private final ConcurrentMap columnFamilyStores = new ConcurrentHashMap(); private final Object[] indexLocks; private volatile AbstractReplicationStrategy replicationStrategy; + public final KeyspaceMetrics metric; public static final Function tableTransformer = new Function() { public Table apply(String tableName) @@ -132,6 +134,7 @@ public static Table clear(String table, Schema schema) throws IOException { for (ColumnFamilyStore cfs : t.getColumnFamilyStores()) t.unloadCf(cfs); + t.metric.release(); } return t; } @@ -271,6 +274,7 @@ private Table(String table, boolean loadSSTables) logger.debug("Initializing {}.{}", name, cfm.cfName); initCf(cfm.cfId, cfm.cfName, loadSSTables); } + this.metric = new KeyspaceMetrics(this); } public void createReplicationStrategy(KSMetaData ksm) From bbd130ebbf2c1ebfe4f8514dedb20c9dabe4fbd4 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Thu, 12 Jun 2014 18:49:09 -0500 Subject: [PATCH 049/557] Track metrics at a keyspace level Patch by brandonwilliams, reviewed by yukim for CASSANDRA-6539 --- CHANGES.txt | 2 +- .../org/apache/cassandra/db/Keyspace.java | 5 + .../cassandra/metrics/KeyspaceMetrics.java | 202 ++++++++++++++++++ 3 files changed, 208 insertions(+), 1 deletion(-) create mode 100644 src/java/org/apache/cassandra/metrics/KeyspaceMetrics.java diff --git a/CHANGES.txt b/CHANGES.txt index a2a978e2f4a3..576355cdd292 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -16,7 +16,7 @@ * Fix infinite loop on exception while streaming (CASSANDRA-7330) * Reference sstables before populating key cache (CASSANDRA-7234) Merged from 1.2: -1.2.17 + * Tracke metrics at a keyspace level (CASSANDRA-6539) * Add replace_address_first_boot flag to only replace if not bootstrapped (CASSANDRA-7356) * Enable keepalive for native protocol (CASSANDRA-7380) * Check internal addresses for seeds (CASSANDRA-6523) diff --git a/src/java/org/apache/cassandra/db/Keyspace.java b/src/java/org/apache/cassandra/db/Keyspace.java index 714956a9eab5..d92bea7cc5cb 100644 --- a/src/java/org/apache/cassandra/db/Keyspace.java +++ b/src/java/org/apache/cassandra/db/Keyspace.java @@ -27,6 +27,7 @@ import com.google.common.base.Function; import com.google.common.collect.Iterables; +import org.apache.cassandra.metrics.KeyspaceMetrics; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -62,6 +63,8 @@ public class Keyspace */ public static final ReentrantReadWriteLock switchLock = new ReentrantReadWriteLock(); + public final KeyspaceMetrics metric; + // It is possible to call Keyspace.open without a running daemon, so it makes sense to ensure // proper directories here as well as in CassandraDaemon. static @@ -133,6 +136,7 @@ public static Keyspace clear(String keyspaceName, Schema schema) { for (ColumnFamilyStore cfs : t.getColumnFamilyStores()) t.unloadCf(cfs); + t.metric.release(); } return t; } @@ -259,6 +263,7 @@ private Keyspace(String keyspaceName, boolean loadSSTables) metadata = Schema.instance.getKSMetaData(keyspaceName); assert metadata != null : "Unknown keyspace " + keyspaceName; createReplicationStrategy(metadata); + metric = new KeyspaceMetrics(this); for (CFMetaData cfm : new ArrayList(metadata.cfMetaData().values())) { diff --git a/src/java/org/apache/cassandra/metrics/KeyspaceMetrics.java b/src/java/org/apache/cassandra/metrics/KeyspaceMetrics.java new file mode 100644 index 000000000000..4a0980f384f5 --- /dev/null +++ b/src/java/org/apache/cassandra/metrics/KeyspaceMetrics.java @@ -0,0 +1,202 @@ +/* + * 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.metrics; + +import java.util.ArrayList; +import java.util.List; + +import com.yammer.metrics.Metrics; +import com.yammer.metrics.core.*; +import com.yammer.metrics.stats.Snapshot; + +import org.apache.cassandra.db.ColumnFamilyStore; +import org.apache.cassandra.db.Keyspace; + +/** + * Metrics for {@link ColumnFamilyStore}. + */ +public class KeyspaceMetrics +{ + /** Total amount of data stored in the memtable, including column related overhead. */ + public final Gauge memtableDataSize; + /** Total amount of data stored in the memtables (2i and pending flush memtables included). */ + public final Gauge allMemtablesDataSize; + /** Total number of columns present in the memtable. */ + public final Gauge memtableColumnsCount; + /** Number of times flush has resulted in the memtable being switched out. */ + public final Gauge memtableSwitchCount; + /** Estimated number of tasks pending for this column family */ + public final Gauge pendingTasks; + /** Estimate of number of pending compactios for this CF */ + public final Gauge pendingCompactions; + /** Disk space used by SSTables belonging to this CF */ + public final Gauge liveDiskSpaceUsed; + /** Total disk space used by SSTables belonging to this CF, including obsolete ones waiting to be GC'd */ + public final Gauge totalDiskSpaceUsed; + /** Disk space used by bloom filter */ + public final Gauge bloomFilterDiskSpaceUsed; + + private final MetricNameFactory factory; + + /** + * Creates metrics for given {@link ColumnFamilyStore}. + * + * @param ks Keyspace to measure metrics + */ + public KeyspaceMetrics(final Keyspace ks) + { + factory = new KeyspaceMetricNameFactory(ks); + + memtableColumnsCount = Metrics.newGauge(factory.createMetricName("MemtableColumnsCount"), new Gauge() + { + public Long value() + { + long total = 0; + for (ColumnFamilyStore cf : ks.getColumnFamilyStores()) + { + total += cf.metric.memtableColumnsCount.value(); + } + return total; + } + }); + memtableDataSize = Metrics.newGauge(factory.createMetricName("MemtableDataSize"), new Gauge() + { + public Long value() + { + long total = 0; + for (ColumnFamilyStore cf : ks.getColumnFamilyStores()) + { + total += cf.metric.memtableDataSize.value(); + } + return total; + } + }); + allMemtablesDataSize = Metrics.newGauge(factory.createMetricName("AllMemtablesDataSize"), new Gauge() + { + public Long value() + { + long total = 0; + for (ColumnFamilyStore cf : ks.getColumnFamilyStores()) + { + total += cf.metric.allMemtablesDataSize.value(); + } + return total; + } + }); + memtableSwitchCount = Metrics.newGauge(factory.createMetricName("MemtableSwitchCount"), new Gauge() + { + public Long value() + { + long sum = 0; + for (ColumnFamilyStore cf : ks.getColumnFamilyStores()) + sum += cf.metric.memtableSwitchCount.count(); + return sum; + } + }); + pendingCompactions = Metrics.newGauge(factory.createMetricName("PendingCompactions"), new Gauge() + { + public Integer value() + { + int sum = 0; + for (ColumnFamilyStore cf : ks.getColumnFamilyStores()) + { + sum += cf.metric.pendingCompactions.value(); + } + return sum; + } + }); + pendingTasks = Metrics.newGauge(factory.createMetricName("PendingTasks"), new Gauge() + { + public Integer value() + { + return Keyspace.switchLock.getQueueLength(); + } + }); + liveDiskSpaceUsed = Metrics.newGauge(factory.createMetricName("LiveDiskSpaceUsed"), new Gauge() + { + public Long value() + { + long sum = 0; + for (ColumnFamilyStore cf : ks.getColumnFamilyStores()) + { + sum += cf.metric.liveDiskSpaceUsed.count(); + } + return sum; + } + }); + totalDiskSpaceUsed = Metrics.newGauge(factory.createMetricName("TotalDiskSpaceUsed"), new Gauge() + { + public Long value() + { + long sum = 0; + for (ColumnFamilyStore cf : ks.getColumnFamilyStores()) + { + sum += cf.metric.totalDiskSpaceUsed.count(); + } + return sum; + } + }); + bloomFilterDiskSpaceUsed = Metrics.newGauge(factory.createMetricName("BloomFilterDiskSpaceUsed"), new Gauge() + { + public Long value() + { + long total = 0; + for (ColumnFamilyStore cf : ks.getColumnFamilyStores()) + total += cf.metric.bloomFilterDiskSpaceUsed.value(); + return total; + } + }); + } + + /** + * Release all associated metrics. + */ + public void release() + { + Metrics.defaultRegistry().removeMetric(factory.createMetricName("AllMemtablesDataSize")); + Metrics.defaultRegistry().removeMetric(factory.createMetricName("MemtableDataSize")); + Metrics.defaultRegistry().removeMetric(factory.createMetricName("MemtableSwitchCount")); + Metrics.defaultRegistry().removeMetric(factory.createMetricName("PendingTasks")); + Metrics.defaultRegistry().removeMetric(factory.createMetricName("LiveDiskSpaceUsed")); + Metrics.defaultRegistry().removeMetric(factory.createMetricName("TotalDiskSpaceUsed")); + Metrics.defaultRegistry().removeMetric(factory.createMetricName("BloomFilterDiskSpaceUsed")); + } + + class KeyspaceMetricNameFactory implements MetricNameFactory + { + private final String keyspaceName; + + KeyspaceMetricNameFactory(Keyspace ks) + { + this.keyspaceName = ks.getName(); + } + + public MetricName createMetricName(String metricName) + { + String groupName = ColumnFamilyMetrics.class.getPackage().getName(); + + StringBuilder mbeanName = new StringBuilder(); + mbeanName.append(groupName).append(":"); + mbeanName.append("type=Keyspace"); + mbeanName.append(",keyspace=").append(keyspaceName); + mbeanName.append(",name=").append(metricName); + + return new MetricName(groupName, "keyspace", metricName, keyspaceName, mbeanName.toString()); + } + } +} From 8ff5262f0d77ce9b350cdde599bf847f9f28a395 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Fri, 13 Jun 2014 16:14:42 -0500 Subject: [PATCH 050/557] Use RandomStringGenerator instead of WordGenerator so BitSetTest passes on windows. Patch by Ala' Alkhaldi, reviewed by Joshua McKenzie for CASSANDRA-7060 --- test/unit/org/apache/cassandra/utils/BitSetTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/unit/org/apache/cassandra/utils/BitSetTest.java b/test/unit/org/apache/cassandra/utils/BitSetTest.java index e9f92114c0c4..59bc5e42d013 100644 --- a/test/unit/org/apache/cassandra/utils/BitSetTest.java +++ b/test/unit/org/apache/cassandra/utils/BitSetTest.java @@ -29,7 +29,7 @@ import org.junit.Assert; import org.apache.cassandra.io.util.DataOutputBuffer; -import org.apache.cassandra.utils.KeyGenerator.WordGenerator; +import org.apache.cassandra.utils.KeyGenerator.RandomStringGenerator; import org.apache.cassandra.utils.obs.IBitSet; import org.apache.cassandra.utils.obs.OffHeapBitSet; import org.apache.cassandra.utils.obs.OpenBitSet; @@ -44,10 +44,10 @@ public class BitSetTest @Test public void compareBitSets() { - BloomFilter bf2 = (BloomFilter) FilterFactory.getFilter(KeyGenerator.WordGenerator.WORDS / 2, FilterTestHelper.MAX_FAILURE_RATE, false); - BloomFilter bf3 = (BloomFilter) FilterFactory.getFilter(KeyGenerator.WordGenerator.WORDS / 2, FilterTestHelper.MAX_FAILURE_RATE, true); - int skipEven = KeyGenerator.WordGenerator.WORDS % 2 == 0 ? 0 : 2; - WordGenerator gen1 = new KeyGenerator.WordGenerator(skipEven, 2); + BloomFilter bf2 = (BloomFilter) FilterFactory.getFilter(FilterTestHelper.ELEMENTS / 2, FilterTestHelper.MAX_FAILURE_RATE, false); + BloomFilter bf3 = (BloomFilter) FilterFactory.getFilter(FilterTestHelper.ELEMENTS / 2, FilterTestHelper.MAX_FAILURE_RATE, true); + + RandomStringGenerator gen1 = new KeyGenerator.RandomStringGenerator(new Random().nextInt(), FilterTestHelper.ELEMENTS); // make sure both bitsets are empty. compare(bf2.bitset, bf3.bitset); From 45afe1d935be9057fe3aa08f2d7b9300501402ff Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Sat, 14 Jun 2014 01:29:58 -0400 Subject: [PATCH 051/557] don't rely on toString being a stable implementation, where possible --- src/java/org/apache/cassandra/db/ColumnFamilyStore.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java index e2d92488b277..ae191f0e4ab2 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java @@ -463,7 +463,7 @@ public static void scrubDataDirectories(CFMetaData metadata) { public boolean accept(File pathname) { - return pathname.toString().endsWith(StreamLockfile.FILE_EXT); + return pathname.getPath().endsWith(StreamLockfile.FILE_EXT); } }; for (File dir : directories.getCFDirectories()) From b34237150afc15c50ca0a281f77a67e73b229bd6 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Wed, 18 Jun 2014 14:06:59 -0500 Subject: [PATCH 052/557] Clean up gossiper fully after shadow round. Patch by brandonwilliams, reviewed by thobbs for CASSANDRA-7318 --- CHANGES.txt | 1 + src/java/org/apache/cassandra/gms/Gossiper.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/CHANGES.txt b/CHANGES.txt index 6837e16cfcac..7d3c59e37881 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -29,6 +29,7 @@ Merged from 2.0: * Make StreamSession#closeSession() idempotent (CASSANDRA-7262) * Fix infinite loop on exception while streaming (CASSANDRA-7330) Merged from 1.2: + * Fix problem truncating on a node that was previously in a dead state (CASSANDRA-7318) * Don't insert tombstones that hide indexed values into 2i (CASSANDRA-7268) * Track metrics at a keyspace level (CASSANDRA-6539) * Add replace_address_first_boot flag to only replace if not bootstrapped diff --git a/src/java/org/apache/cassandra/gms/Gossiper.java b/src/java/org/apache/cassandra/gms/Gossiper.java index ed29274c45fe..521b69222b73 100644 --- a/src/java/org/apache/cassandra/gms/Gossiper.java +++ b/src/java/org/apache/cassandra/gms/Gossiper.java @@ -704,6 +704,8 @@ public EndpointState getEndpointStateForEndpoint(InetAddress ep) public void resetEndpointStateMap() { endpointStateMap.clear(); + unreachableEndpoints.clear(); + liveEndpoints.clear(); } public Set> getEndpointStates() From 46c3896c62dcd6bca33c9ac2fa07e722e702f9dc Mon Sep 17 00:00:00 2001 From: Russ Hatch Date: Wed, 18 Jun 2014 22:32:11 -0400 Subject: [PATCH 053/557] enable code coverage using JaCoCo patch by rhatch reviewed by dbrosius for cassandra-7226 --- CHANGES.txt | 2 ++ build.xml | 91 ++++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 86 insertions(+), 7 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 68a86fbdd4f2..288fdcfd0657 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -6,6 +6,8 @@ * Optimize fetching multiple cells by name (CASSANDRA-6933) * Allow compilation in java 8 (CASSANDRA-7208) * Make incremental repair default (CASSANDRA-7250) + * Enable code coverage thru JaCoCo (CASSANDRA-7226) + 2.1.0 diff --git a/build.xml b/build.xml index 3c5afc6675bf..8595fa9c850a 100644 --- a/build.xml +++ b/build.xml @@ -102,6 +102,11 @@ + + + + + @@ -167,6 +172,7 @@ + @@ -175,6 +181,7 @@ + @@ -371,6 +378,8 @@ + + @@ -423,6 +432,8 @@ artifactId="cassandra-parent" version="${version}"/> + + - - - - @@ -546,6 +552,23 @@ + + + + + + + + + + + + + + + @@ -663,7 +686,7 @@ --> - + @@ -1050,7 +1073,14 @@ + + + + + @@ -1060,7 +1090,7 @@ - + @@ -1132,6 +1162,18 @@ + + + + + + + + + + @@ -1236,6 +1278,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 93c99a65e70cd21c8b4e26c161b990b0155449b9 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Wed, 18 Jun 2014 23:30:02 -0400 Subject: [PATCH 054/557] switch external naming of 'column families' to 'tables' patch by dbrosius reviewed by jbellis for cassandra-7369 --- CHANGES.txt | 1 + .../triggers/conf/InvertedIndex.properties | 2 +- .../cassandra/triggers/InvertedIndex.java | 2 +- .../apache/cassandra/auth/DataResource.java | 2 +- .../org/apache/cassandra/config/Schema.java | 2 +- .../cql3/statements/AlterTableStatement.java | 2 +- .../cql3/statements/CreateTableStatement.java | 4 +- .../cassandra/db/ColumnFamilySerializer.java | 2 +- .../cassandra/db/ColumnFamilyStore.java | 2 +- .../apache/cassandra/db/ConsistencyLevel.java | 2 +- .../cassandra/db/HintedHandOffManager.java | 4 +- .../org/apache/cassandra/db/Keyspace.java | 4 +- .../org/apache/cassandra/db/Mutation.java | 2 +- .../cassandra/db/commitlog/CommitLog.java | 2 +- .../db/commitlog/CommitLogSegment.java | 2 +- .../exceptions/AlreadyExistsException.java | 2 +- .../AbstractColumnFamilyInputFormat.java | 2 +- .../apache/cassandra/hadoop/ConfigHelper.java | 2 +- .../hadoop/pig/AbstractCassandraStorage.java | 2 +- .../hadoop/pig/CassandraStorage.java | 2 +- .../cassandra/hadoop/pig/CqlStorage.java | 2 +- .../sstable/AbstractSSTableSimpleWriter.java | 2 +- .../cassandra/io/sstable/SSTableLoader.java | 2 +- .../cassandra/repair/RepairSession.java | 2 +- .../cassandra/service/MigrationManager.java | 12 ++-- .../cassandra/service/StorageService.java | 8 +-- .../cassandra/thrift/CassandraServer.java | 4 +- .../cassandra/thrift/ThriftValidation.java | 24 +++---- .../org/apache/cassandra/tools/NodeProbe.java | 12 ++-- .../org/apache/cassandra/tools/NodeTool.java | 68 +++++++++---------- .../apache/cassandra/tools/SSTableExport.java | 2 +- .../apache/cassandra/tools/SSTableImport.java | 2 +- .../cassandra/tools/SSTableLevelResetter.java | 6 +- .../cassandra/tools/StandaloneScrubber.java | 4 +- .../cassandra/tools/StandaloneSplitter.java | 2 +- .../cassandra/tools/StandaloneUpgrader.java | 2 +- .../cassandra/triggers/TriggerExecutor.java | 4 +- .../apache/cassandra/utils/StatusLogger.java | 2 +- test/unit/org/apache/cassandra/Util.java | 2 +- .../org/apache/cassandra/config/DefsTest.java | 2 +- 40 files changed, 105 insertions(+), 104 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 288fdcfd0657..393b49425df6 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -7,6 +7,7 @@ * Allow compilation in java 8 (CASSANDRA-7208) * Make incremental repair default (CASSANDRA-7250) * Enable code coverage thru JaCoCo (CASSANDRA-7226) + * Switch external naming of 'column families' to 'tables' (CASSANDRA-4369) diff --git a/examples/triggers/conf/InvertedIndex.properties b/examples/triggers/conf/InvertedIndex.properties index 3ec2bb04bb76..ea49a86574de 100644 --- a/examples/triggers/conf/InvertedIndex.properties +++ b/examples/triggers/conf/InvertedIndex.properties @@ -16,4 +16,4 @@ # under the License. keyspace=Keyspace1 -columnfamily=InvertedIndex +table=InvertedIndex diff --git a/examples/triggers/src/org/apache/cassandra/triggers/InvertedIndex.java b/examples/triggers/src/org/apache/cassandra/triggers/InvertedIndex.java index cdcb962a6b7e..2053387a274d 100644 --- a/examples/triggers/src/org/apache/cassandra/triggers/InvertedIndex.java +++ b/examples/triggers/src/org/apache/cassandra/triggers/InvertedIndex.java @@ -42,7 +42,7 @@ public Collection augment(ByteBuffer key, ColumnFamily update) List mutations = new ArrayList<>(update.getColumnCount()); String indexKeySpace = properties.getProperty("keyspace"); - String indexColumnFamily = properties.getProperty("columnfamily"); + String indexColumnFamily = properties.getProperty("table"); for (Cell cell : update) { // Skip the row marker and other empty values, since they lead to an empty key. diff --git a/src/java/org/apache/cassandra/auth/DataResource.java b/src/java/org/apache/cassandra/auth/DataResource.java index 6aa8addc4ace..9c7a777acd8b 100644 --- a/src/java/org/apache/cassandra/auth/DataResource.java +++ b/src/java/org/apache/cassandra/auth/DataResource.java @@ -180,7 +180,7 @@ public String getKeyspace() public String getColumnFamily() { if (!isColumnFamilyLevel()) - throw new IllegalStateException(String.format("%s data resource has no column family", level)); + throw new IllegalStateException(String.format("%s data resource has no table", level)); return columnFamily; } diff --git a/src/java/org/apache/cassandra/config/Schema.java b/src/java/org/apache/cassandra/config/Schema.java index 106ad9baf440..56422e3f9ed5 100644 --- a/src/java/org/apache/cassandra/config/Schema.java +++ b/src/java/org/apache/cassandra/config/Schema.java @@ -325,7 +325,7 @@ public void load(CFMetaData cfm) Pair key = Pair.create(cfm.ksName, cfm.cfName); if (cfIdMap.containsKey(key)) - throw new RuntimeException(String.format("Attempting to load already loaded column family %s.%s", cfm.ksName, cfm.cfName)); + throw new RuntimeException(String.format("Attempting to load already loaded table %s.%s", cfm.ksName, cfm.cfName)); logger.debug("Adding {} to cfIdMap", cfm); cfIdMap.put(key, cfm.cfId); diff --git a/src/java/org/apache/cassandra/cql3/statements/AlterTableStatement.java b/src/java/org/apache/cassandra/cql3/statements/AlterTableStatement.java index cff0e8f3cde6..0d61ede4d2a7 100644 --- a/src/java/org/apache/cassandra/cql3/statements/AlterTableStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/AlterTableStatement.java @@ -226,7 +226,7 @@ public void announceMigration(boolean isLocalOnly) throws RequestValidationExcep break; case OPTS: if (cfProps == null) - throw new InvalidRequestException(String.format("ALTER COLUMNFAMILY WITH invoked, but no parameters found")); + throw new InvalidRequestException(String.format("ALTER TABLE WITH invoked, but no parameters found")); cfProps.validate(); cfProps.applyToCFMetadata(cfm); diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateTableStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateTableStatement.java index d7648459bbc5..21ff9cf45708 100644 --- a/src/java/org/apache/cassandra/cql3/statements/CreateTableStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/CreateTableStatement.java @@ -183,9 +183,9 @@ public ParsedStatement.Prepared prepare() throws RequestValidationException { // Column family name if (!columnFamily().matches("\\w+")) - throw new InvalidRequestException(String.format("\"%s\" is not a valid column family name (must be alphanumeric character only: [0-9A-Za-z]+)", columnFamily())); + throw new InvalidRequestException(String.format("\"%s\" is not a valid table name (must be alphanumeric character only: [0-9A-Za-z]+)", columnFamily())); if (columnFamily().length() > Schema.NAME_LENGTH) - throw new InvalidRequestException(String.format("Column family names shouldn't be more than %s characters long (got \"%s\")", Schema.NAME_LENGTH, columnFamily())); + throw new InvalidRequestException(String.format("Table names shouldn't be more than %s characters long (got \"%s\")", Schema.NAME_LENGTH, columnFamily())); for (Multiset.Entry entry : definedNames.entrySet()) if (entry.getCount() > 1) diff --git a/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java b/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java index 5ce2bfa091f6..e2aeb6c5df12 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java @@ -70,7 +70,7 @@ public void serialize(ColumnFamily cf, DataOutputPlus out, int version) columnSerializer.serialize(cell, out); written++; } - assert count == written: "Column family had " + count + " columns, but " + written + " written"; + assert count == written: "Table had " + count + " columns, but " + written + " written"; } catch (IOException e) { diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java index ae191f0e4ab2..39753528049d 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java @@ -1499,7 +1499,7 @@ public ColumnFamily getColumnFamily(DecoratedKey key, private ColumnFamily getThroughCache(UUID cfId, QueryFilter filter) { assert isRowCacheEnabled() - : String.format("Row cache is not enabled on column family [" + name + "]"); + : String.format("Row cache is not enabled on table [" + name + "]"); RowCacheKey key = new RowCacheKey(cfId, filter.key); diff --git a/src/java/org/apache/cassandra/db/ConsistencyLevel.java b/src/java/org/apache/cassandra/db/ConsistencyLevel.java index 7583a90fa39e..5bba9838f42d 100644 --- a/src/java/org/apache/cassandra/db/ConsistencyLevel.java +++ b/src/java/org/apache/cassandra/db/ConsistencyLevel.java @@ -347,7 +347,7 @@ public boolean isSerialConsistency() public void validateCounterForWrite(CFMetaData metadata) throws InvalidRequestException { if (this == ConsistencyLevel.ANY) - throw new InvalidRequestException("Consistency level ANY is not yet supported for counter columnfamily " + metadata.cfName); + throw new InvalidRequestException("Consistency level ANY is not yet supported for counter table " + metadata.cfName); if (isSerialConsistency()) throw new InvalidRequestException("Counter operations are inherently non-serializable"); diff --git a/src/java/org/apache/cassandra/db/HintedHandOffManager.java b/src/java/org/apache/cassandra/db/HintedHandOffManager.java index 20fa0cdc5b77..ad351cd57fa4 100644 --- a/src/java/org/apache/cassandra/db/HintedHandOffManager.java +++ b/src/java/org/apache/cassandra/db/HintedHandOffManager.java @@ -416,7 +416,7 @@ private void doDeliverHintsToEndpoint(InetAddress endpoint) } catch (UnknownColumnFamilyException e) { - logger.debug("Skipping delivery of hint for deleted columnfamily", e); + logger.debug("Skipping delivery of hint for deleted table", e); deleteHint(hostIdBytes, hint.name(), hint.timestamp()); continue; } @@ -429,7 +429,7 @@ private void doDeliverHintsToEndpoint(InetAddress endpoint) { if (hint.timestamp() <= SystemKeyspace.getTruncatedAt(cfId)) { - logger.debug("Skipping delivery of hint for truncated columnfamily {}", cfId); + logger.debug("Skipping delivery of hint for truncated table {}", cfId); mutation = mutation.without(cfId); } } diff --git a/src/java/org/apache/cassandra/db/Keyspace.java b/src/java/org/apache/cassandra/db/Keyspace.java index 54054c5e0656..60183db272f4 100644 --- a/src/java/org/apache/cassandra/db/Keyspace.java +++ b/src/java/org/apache/cassandra/db/Keyspace.java @@ -210,7 +210,7 @@ public void snapshot(String snapshotName, String columnFamilyName) throws IOExce } if ((columnFamilyName != null) && !tookSnapShot) - throw new IOException("Failed taking snapshot. Column family " + columnFamilyName + " does not exist."); + throw new IOException("Failed taking snapshot. Table " + columnFamilyName + " does not exist."); } /** @@ -379,7 +379,7 @@ public void apply(Mutation mutation, boolean writeCommitLog, boolean updateIndex ColumnFamilyStore cfs = columnFamilyStores.get(cf.id()); if (cfs == null) { - logger.error("Attempting to mutate non-existant column family {}", cf.id()); + logger.error("Attempting to mutate non-existant table {}", cf.id()); continue; } diff --git a/src/java/org/apache/cassandra/db/Mutation.java b/src/java/org/apache/cassandra/db/Mutation.java index 6eb56b7a08d9..26285b88c995 100644 --- a/src/java/org/apache/cassandra/db/Mutation.java +++ b/src/java/org/apache/cassandra/db/Mutation.java @@ -144,7 +144,7 @@ public void add(ColumnFamily columnFamily) ColumnFamily prev = modifications.put(columnFamily.id(), columnFamily); if (prev != null) // developer error - throw new IllegalArgumentException("ColumnFamily " + columnFamily + " already has modifications in this mutation: " + prev); + throw new IllegalArgumentException("Table " + columnFamily + " already has modifications in this mutation: " + prev); } /** diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLog.java b/src/java/org/apache/cassandra/db/commitlog/CommitLog.java index eaa1b3ce0805..a9cc00d6d9c5 100644 --- a/src/java/org/apache/cassandra/db/commitlog/CommitLog.java +++ b/src/java/org/apache/cassandra/db/commitlog/CommitLog.java @@ -253,7 +253,7 @@ public void discardColumnFamily(final UUID cfId) */ public void discardCompletedSegments(final UUID cfId, final ReplayPosition context) { - logger.debug("discard completed log segments for {}, column family {}", context, cfId); + logger.debug("discard completed log segments for {}, table {}", context, cfId); // Go thru the active segment files, which are ordered oldest to newest, marking the // flushed CF as clean, until we reach the segment file containing the ReplayPosition passed diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java b/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java index ef43d12063bf..cc95df9f2395 100644 --- a/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java +++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java @@ -437,7 +437,7 @@ void markDirty(Mutation mutation, int allocatedPosition) // check for deleted CFS CFMetaData cfm = columnFamily.metadata(); if (cfm.isPurged()) - logger.error("Attempted to write commit log entry for unrecognized column family: {}", columnFamily.id()); + logger.error("Attempted to write commit log entry for unrecognized table: {}", columnFamily.id()); else ensureAtleast(cfDirty, cfm.cfId, allocatedPosition); } diff --git a/src/java/org/apache/cassandra/exceptions/AlreadyExistsException.java b/src/java/org/apache/cassandra/exceptions/AlreadyExistsException.java index 45305688425e..1829c5cb1f6c 100644 --- a/src/java/org/apache/cassandra/exceptions/AlreadyExistsException.java +++ b/src/java/org/apache/cassandra/exceptions/AlreadyExistsException.java @@ -31,7 +31,7 @@ private AlreadyExistsException(String ksName, String cfName, String msg) public AlreadyExistsException(String ksName, String cfName) { - this(ksName, cfName, String.format("Cannot add already existing column family \"%s\" to keyspace \"%s\"", cfName, ksName)); + this(ksName, cfName, String.format("Cannot add already existing table \"%s\" to keyspace \"%s\"", cfName, ksName)); } public AlreadyExistsException(String ksName) diff --git a/src/java/org/apache/cassandra/hadoop/AbstractColumnFamilyInputFormat.java b/src/java/org/apache/cassandra/hadoop/AbstractColumnFamilyInputFormat.java index e8de0f2e8a68..83685191efc0 100644 --- a/src/java/org/apache/cassandra/hadoop/AbstractColumnFamilyInputFormat.java +++ b/src/java/org/apache/cassandra/hadoop/AbstractColumnFamilyInputFormat.java @@ -78,7 +78,7 @@ protected void validateConfiguration(Configuration conf) { if (ConfigHelper.getInputKeyspace(conf) == null || ConfigHelper.getInputColumnFamily(conf) == null) { - throw new UnsupportedOperationException("you must set the keyspace and columnfamily with setInputColumnFamily()"); + throw new UnsupportedOperationException("you must set the keyspace and table with setInputColumnFamily()"); } if (ConfigHelper.getInputInitialAddress(conf) == null) throw new UnsupportedOperationException("You must set the initial output address to a Cassandra node with setInputInitialAddress"); diff --git a/src/java/org/apache/cassandra/hadoop/ConfigHelper.java b/src/java/org/apache/cassandra/hadoop/ConfigHelper.java index f062bfc56fda..64bc5d3c15e5 100644 --- a/src/java/org/apache/cassandra/hadoop/ConfigHelper.java +++ b/src/java/org/apache/cassandra/hadoop/ConfigHelper.java @@ -85,7 +85,7 @@ public static void setInputColumnFamily(Configuration conf, String keyspace, Str throw new UnsupportedOperationException("keyspace may not be null"); if (columnFamily == null) - throw new UnsupportedOperationException("columnfamily may not be null"); + throw new UnsupportedOperationException("table may not be null"); conf.set(INPUT_KEYSPACE_CONFIG, keyspace); conf.set(INPUT_COLUMNFAMILY_CONFIG, columnFamily); diff --git a/src/java/org/apache/cassandra/hadoop/pig/AbstractCassandraStorage.java b/src/java/org/apache/cassandra/hadoop/pig/AbstractCassandraStorage.java index 536cdb33ae41..19c049a93e2e 100644 --- a/src/java/org/apache/cassandra/hadoop/pig/AbstractCassandraStorage.java +++ b/src/java/org/apache/cassandra/hadoop/pig/AbstractCassandraStorage.java @@ -528,7 +528,7 @@ protected void initSchema(String signature) throws IOException properties.setProperty(signature, sb.toString()); } else - throw new IOException(String.format("Column family '%s' not found in keyspace '%s'", + throw new IOException(String.format("Table '%s' not found in keyspace '%s'", column_family, keyspace)); } diff --git a/src/java/org/apache/cassandra/hadoop/pig/CassandraStorage.java b/src/java/org/apache/cassandra/hadoop/pig/CassandraStorage.java index 14d30d50f264..246789c73137 100644 --- a/src/java/org/apache/cassandra/hadoop/pig/CassandraStorage.java +++ b/src/java/org/apache/cassandra/hadoop/pig/CassandraStorage.java @@ -810,7 +810,7 @@ private void setLocationFromUri(String location) throws IOException } catch (Exception e) { - throw new IOException("Expected 'cassandra://[username:password@]/" + + throw new IOException("Expected 'cassandra://[username:password@]/" + "[?slice_start=&slice_end=[&reversed=true][&limit=1]" + "[&allow_deletes=true][&widerows=true][&use_secondary=true]" + "[&comparator=][&split_size=][&partitioner=]" + diff --git a/src/java/org/apache/cassandra/hadoop/pig/CqlStorage.java b/src/java/org/apache/cassandra/hadoop/pig/CqlStorage.java index 6f17468d9bba..04e1fa7c5950 100644 --- a/src/java/org/apache/cassandra/hadoop/pig/CqlStorage.java +++ b/src/java/org/apache/cassandra/hadoop/pig/CqlStorage.java @@ -671,7 +671,7 @@ private void setLocationFromUri(String location) throws IOException } catch (Exception e) { - throw new IOException("Expected 'cql://[username:password@]/" + + throw new IOException("Expected 'cql://[username:password@]/
    " + "[?[page_size=][&columns=][&output_query=]" + "[&where_clause=][&split_size=][&partitioner=][&use_secondary=true|false]" + "[&init_address=][&rpc_port=]]': " + e.getMessage()); diff --git a/src/java/org/apache/cassandra/io/sstable/AbstractSSTableSimpleWriter.java b/src/java/org/apache/cassandra/io/sstable/AbstractSSTableSimpleWriter.java index 1b407c5ddd7b..c2113d822c22 100644 --- a/src/java/org/apache/cassandra/io/sstable/AbstractSSTableSimpleWriter.java +++ b/src/java/org/apache/cassandra/io/sstable/AbstractSSTableSimpleWriter.java @@ -106,7 +106,7 @@ public void newRow(ByteBuffer key) throws IOException public void newSuperColumn(ByteBuffer name) { if (!columnFamily.metadata().isSuper()) - throw new IllegalStateException("Cannot add a super column to a standard column family"); + throw new IllegalStateException("Cannot add a super column to a standard table"); currentSuperColumn = name; } diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableLoader.java b/src/java/org/apache/cassandra/io/sstable/SSTableLoader.java index bbb1277c007e..b8371dabc04a 100644 --- a/src/java/org/apache/cassandra/io/sstable/SSTableLoader.java +++ b/src/java/org/apache/cassandra/io/sstable/SSTableLoader.java @@ -98,7 +98,7 @@ public boolean accept(File dir, String name) CFMetaData metadata = client.getCFMetaData(keyspace, desc.cfname); if (metadata == null) { - outputHandler.output(String.format("Skipping file %s: column family %s.%s doesn't exist", name, keyspace, desc.cfname)); + outputHandler.output(String.format("Skipping file %s: table %s.%s doesn't exist", name, keyspace, desc.cfname)); return false; } diff --git a/src/java/org/apache/cassandra/repair/RepairSession.java b/src/java/org/apache/cassandra/repair/RepairSession.java index 346f3f473e0f..9274342a2f15 100644 --- a/src/java/org/apache/cassandra/repair/RepairSession.java +++ b/src/java/org/apache/cassandra/repair/RepairSession.java @@ -230,7 +230,7 @@ public void syncComplete(RepairJobDesc desc, NodePair nodes, boolean success) if (job.completedSynchronization()) { RepairJob completedJob = syncingJobs.remove(job.desc.columnFamily); - String remaining = syncingJobs.size() == 0 ? "" : String.format(" (%d remaining column family to sync for this session)", syncingJobs.size()); + String remaining = syncingJobs.size() == 0 ? "" : String.format(" (%d remaining table to sync for this session)", syncingJobs.size()); if (completedJob != null && completedJob.isFailed()) logger.warn(String.format("[repair #%s] %s sync failed%s", getId(), desc.columnFamily, remaining)); else diff --git a/src/java/org/apache/cassandra/service/MigrationManager.java b/src/java/org/apache/cassandra/service/MigrationManager.java index a6408ecba2cc..3c60af06dafb 100644 --- a/src/java/org/apache/cassandra/service/MigrationManager.java +++ b/src/java/org/apache/cassandra/service/MigrationManager.java @@ -241,11 +241,11 @@ public static void announceNewColumnFamily(CFMetaData cfm, boolean announceLocal KSMetaData ksm = Schema.instance.getKSMetaData(cfm.ksName); if (ksm == null) - throw new ConfigurationException(String.format("Cannot add column family '%s' to non existing keyspace '%s'.", cfm.cfName, cfm.ksName)); + throw new ConfigurationException(String.format("Cannot add table '%s' to non existing keyspace '%s'.", cfm.cfName, cfm.ksName)); else if (ksm.cfMetaData().containsKey(cfm.cfName)) throw new AlreadyExistsException(cfm.ksName, cfm.cfName); - logger.info(String.format("Create new ColumnFamily: %s", cfm)); + logger.info(String.format("Create new table: %s", cfm)); announce(addSerializedKeyspace(cfm.toSchema(FBUtilities.timestampMicros()), cfm.ksName), announceLocally); } @@ -287,11 +287,11 @@ public static void announceColumnFamilyUpdate(CFMetaData cfm, boolean fromThrift CFMetaData oldCfm = Schema.instance.getCFMetaData(cfm.ksName, cfm.cfName); if (oldCfm == null) - throw new ConfigurationException(String.format("Cannot update non existing column family '%s' in keyspace '%s'.", cfm.cfName, cfm.ksName)); + throw new ConfigurationException(String.format("Cannot update non existing table '%s' in keyspace '%s'.", cfm.cfName, cfm.ksName)); oldCfm.validateCompatility(cfm); - logger.info(String.format("Update ColumnFamily '%s/%s' From %s To %s", cfm.ksName, cfm.cfName, oldCfm, cfm)); + logger.info(String.format("Update table '%s/%s' From %s To %s", cfm.ksName, cfm.cfName, oldCfm, cfm)); announce(addSerializedKeyspace(oldCfm.toSchemaUpdate(cfm, FBUtilities.timestampMicros(), fromThrift), cfm.ksName), announceLocally); } @@ -329,9 +329,9 @@ public static void announceColumnFamilyDrop(String ksName, String cfName, boolea { CFMetaData oldCfm = Schema.instance.getCFMetaData(ksName, cfName); if (oldCfm == null) - throw new ConfigurationException(String.format("Cannot drop non existing column family '%s' in keyspace '%s'.", cfName, ksName)); + throw new ConfigurationException(String.format("Cannot drop non existing table '%s' in keyspace '%s'.", cfName, ksName)); - logger.info(String.format("Drop ColumnFamily '%s/%s'", oldCfm.ksName, oldCfm.cfName)); + logger.info(String.format("Drop table '%s/%s'", oldCfm.ksName, oldCfm.cfName)); announce(addSerializedKeyspace(oldCfm.dropFromSchema(FBUtilities.timestampMicros()), ksName), announceLocally); } diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index e3957046a712..77f675750e76 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -2350,9 +2350,9 @@ public void takeColumnFamilySnapshot(String keyspaceName, String columnFamilyNam throw new IOException("Cannot snapshot until bootstrap completes"); if (columnFamilyName == null) - throw new IOException("You must supply a column family name"); + throw new IOException("You must supply a table name"); if (columnFamilyName.contains(".")) - throw new IllegalArgumentException("Cannot take a snapshot of a secondary index by itself. Run snapshot on the column family that owns the index."); + throw new IllegalArgumentException("Cannot take a snapshot of a secondary index by itself. Run snapshot on the table that owns the index."); if (tag == null || tag.equals("")) throw new IOException("You must supply a snapshot name."); @@ -2486,7 +2486,7 @@ public Iterable getValidColumnFamilies(boolean allowIndexes, { if(!allowIndexes) { - logger.warn("Operation not allowed on secondary Index column family ({})", cfName); + logger.warn("Operation not allowed on secondary Index table ({})", cfName); continue; } @@ -2500,7 +2500,7 @@ public Iterable getValidColumnFamilies(boolean allowIndexes, { Collection< SecondaryIndex > indexes = cfStore.indexManager.getIndexesByNames(new HashSet<>(Arrays.asList(cfName))); if (indexes.isEmpty()) - logger.warn(String.format("Invalid column family index specified: %s/%s. Proceeding with others.", baseCfName, idxName)); + logger.warn(String.format("Invalid index specified: %s/%s. Proceeding with others.", baseCfName, idxName)); else valid.add(Iterables.get(indexes, 0).getIndexCfs()); } diff --git a/src/java/org/apache/cassandra/thrift/CassandraServer.java b/src/java/org/apache/cassandra/thrift/CassandraServer.java index 868c701d1ba1..82b97efce98d 100644 --- a/src/java/org/apache/cassandra/thrift/CassandraServer.java +++ b/src/java/org/apache/cassandra/thrift/CassandraServer.java @@ -1636,7 +1636,7 @@ public String system_update_keyspace(KsDef ks_def) state().hasKeyspaceAccess(ks_def.name, Permission.ALTER); ThriftValidation.validateKeyspace(ks_def.name); if (ks_def.getCf_defs() != null && ks_def.getCf_defs().size() > 0) - throw new InvalidRequestException("Keyspace update must not contain any column family definitions."); + throw new InvalidRequestException("Keyspace update must not contain any table definitions."); MigrationManager.announceKeyspaceUpdate(KSMetaData.fromThrift(ks_def)); return Schema.instance.getVersion().toString(); @@ -1661,7 +1661,7 @@ public String system_update_column_family(CfDef cf_def) CFMetaData oldCfm = Schema.instance.getCFMetaData(cf_def.keyspace, cf_def.name); if (oldCfm == null) - throw new InvalidRequestException("Could not find column family definition to modify."); + throw new InvalidRequestException("Could not find table definition to modify."); if (!oldCfm.isThriftCompatible()) throw new InvalidRequestException("Cannot modify CQL3 table " + oldCfm.cfName + " as it may break the schema. You should use cqlsh to modify CQL3 tables instead."); diff --git a/src/java/org/apache/cassandra/thrift/ThriftValidation.java b/src/java/org/apache/cassandra/thrift/ThriftValidation.java index 3b5663b8a600..b2c7e86ffd55 100644 --- a/src/java/org/apache/cassandra/thrift/ThriftValidation.java +++ b/src/java/org/apache/cassandra/thrift/ThriftValidation.java @@ -93,12 +93,12 @@ public static CFMetaData validateColumnFamily(String keyspaceName, String cfName if (isCommutativeOp) { if (!metadata.isCounter()) - throw new org.apache.cassandra.exceptions.InvalidRequestException("invalid operation for non commutative columnfamily " + cfName); + throw new org.apache.cassandra.exceptions.InvalidRequestException("invalid operation for non commutative table " + cfName); } else { if (metadata.isCounter()) - throw new org.apache.cassandra.exceptions.InvalidRequestException("invalid operation for commutative columnfamily " + cfName); + throw new org.apache.cassandra.exceptions.InvalidRequestException("invalid operation for commutative table " + cfName); } return metadata; } @@ -108,11 +108,11 @@ public static CFMetaData validateColumnFamily(String keyspaceName, String cfName { validateKeyspace(keyspaceName); if (cfName.isEmpty()) - throw new org.apache.cassandra.exceptions.InvalidRequestException("non-empty columnfamily is required"); + throw new org.apache.cassandra.exceptions.InvalidRequestException("non-empty table is required"); CFMetaData metadata = Schema.instance.getCFMetaData(keyspaceName, cfName); if (metadata == null) - throw new org.apache.cassandra.exceptions.InvalidRequestException("unconfigured columnfamily " + cfName); + throw new org.apache.cassandra.exceptions.InvalidRequestException("unconfigured table " + cfName); return metadata; } @@ -154,7 +154,7 @@ public static void validateColumnParent(CFMetaData metadata, ColumnParent column { if (column_parent.super_column != null) { - throw new org.apache.cassandra.exceptions.InvalidRequestException("columnfamily alone is required for standard CF " + metadata.cfName); + throw new org.apache.cassandra.exceptions.InvalidRequestException("table alone is required for standard CF " + metadata.cfName); } } @@ -207,7 +207,7 @@ private static void validateColumnNames(CFMetaData metadata, ByteBuffer superCol if (superColumnName.remaining() == 0) throw new org.apache.cassandra.exceptions.InvalidRequestException("supercolumn name must not be empty"); if (metadata.cfType == ColumnFamilyType.Standard) - throw new org.apache.cassandra.exceptions.InvalidRequestException("supercolumn specified to ColumnFamily " + metadata.cfName + " containing normal columns"); + throw new org.apache.cassandra.exceptions.InvalidRequestException("supercolumn specified to table " + metadata.cfName + " containing normal columns"); } AbstractType comparator = SuperColumns.getComparatorFor(metadata, superColumnName); boolean isCQL3Table = !metadata.isThriftCompatible(); @@ -311,7 +311,7 @@ public static void validateColumnOrSuperColumn(CFMetaData metadata, ColumnOrSupe if (cosc.column != null) { if (isCommutative) - throw new org.apache.cassandra.exceptions.InvalidRequestException("invalid operation for commutative columnfamily " + metadata.cfName); + throw new org.apache.cassandra.exceptions.InvalidRequestException("invalid operation for commutative table " + metadata.cfName); validateTtl(cosc.column); validateColumnPath(metadata, new ColumnPath(metadata.cfName).setSuper_column((ByteBuffer)null).setColumn(cosc.column.name)); @@ -321,7 +321,7 @@ public static void validateColumnOrSuperColumn(CFMetaData metadata, ColumnOrSupe if (cosc.super_column != null) { if (isCommutative) - throw new org.apache.cassandra.exceptions.InvalidRequestException("invalid operation for commutative columnfamily " + metadata.cfName); + throw new org.apache.cassandra.exceptions.InvalidRequestException("invalid operation for commutative table " + metadata.cfName); for (Column c : cosc.super_column.columns) { @@ -333,7 +333,7 @@ public static void validateColumnOrSuperColumn(CFMetaData metadata, ColumnOrSupe if (cosc.counter_column != null) { if (!isCommutative) - throw new org.apache.cassandra.exceptions.InvalidRequestException("invalid operation for non commutative columnfamily " + metadata.cfName); + throw new org.apache.cassandra.exceptions.InvalidRequestException("invalid operation for non commutative table " + metadata.cfName); validateColumnPath(metadata, new ColumnPath(metadata.cfName).setSuper_column((ByteBuffer)null).setColumn(cosc.counter_column.name)); } @@ -341,7 +341,7 @@ public static void validateColumnOrSuperColumn(CFMetaData metadata, ColumnOrSupe if (cosc.counter_super_column != null) { if (!isCommutative) - throw new org.apache.cassandra.exceptions.InvalidRequestException("invalid operation for non commutative columnfamily " + metadata.cfName); + throw new org.apache.cassandra.exceptions.InvalidRequestException("invalid operation for non commutative table " + metadata.cfName); for (CounterColumn c : cosc.counter_super_column.columns) validateColumnPath(metadata, new ColumnPath(metadata.cfName).setSuper_column(cosc.counter_super_column.name).setColumn(c.name)); @@ -401,7 +401,7 @@ public static void validateDeletion(CFMetaData metadata, Deletion del) throws or if (metadata.cfType == ColumnFamilyType.Standard && del.super_column != null) { - String msg = String.format("Deletion of super columns is not possible on a standard ColumnFamily (KeySpace=%s ColumnFamily=%s Deletion=%s)", metadata.ksName, metadata.cfName, del); + String msg = String.format("Deletion of super columns is not possible on a standard table (KeySpace=%s Table=%s Deletion=%s)", metadata.ksName, metadata.cfName, del); throw new org.apache.cassandra.exceptions.InvalidRequestException(msg); } @@ -412,7 +412,7 @@ public static void validateDeletion(CFMetaData metadata, Deletion del) throws or } else if (!del.isSetTimestamp()) { - throw new org.apache.cassandra.exceptions.InvalidRequestException("Deletion timestamp is not optional for non commutative column family " + metadata.cfName); + throw new org.apache.cassandra.exceptions.InvalidRequestException("Deletion timestamp is not optional for non commutative table " + metadata.cfName); } } diff --git a/src/java/org/apache/cassandra/tools/NodeProbe.java b/src/java/org/apache/cassandra/tools/NodeProbe.java index a60ab840f31e..79814ba71e74 100644 --- a/src/java/org/apache/cassandra/tools/NodeProbe.java +++ b/src/java/org/apache/cassandra/tools/NodeProbe.java @@ -207,7 +207,7 @@ public void forceKeyspaceCleanup(PrintStream out, String keyspaceName, String... { case ABORTED: failed = true; - out.println("Aborted cleaning up atleast one column family in keyspace "+keyspaceName+", check server logs for more information."); + out.println("Aborted cleaning up atleast one table in keyspace "+keyspaceName+", check server logs for more information."); break; } } @@ -218,7 +218,7 @@ public void scrub(PrintStream out, boolean disableSnapshot, boolean skipCorrupte { case ABORTED: failed = true; - out.println("Aborted scrubbing atleast one column family in keyspace "+keyspaceName+", check server logs for more information."); + out.println("Aborted scrubbing atleast one table in keyspace "+keyspaceName+", check server logs for more information."); break; } } @@ -229,7 +229,7 @@ public void upgradeSSTables(PrintStream out, String keyspaceName, boolean exclud { case ABORTED: failed = true; - out.println("Aborted upgrading sstables for atleast one column family in keyspace "+keyspaceName+", check server logs for more information."); + out.println("Aborted upgrading sstables for atleast one table in keyspace "+keyspaceName+", check server logs for more information."); break; } } @@ -466,7 +466,7 @@ public void takeSnapshot(String snapshotName, String columnFamily, String... key { if (keyspaces.length != 1) { - throw new IOException("When specifying the column family for a snapshot, you must specify one and only one keyspace"); + throw new IOException("When specifying the table for a snapshot, you must specify one and only one keyspace"); } ssProxy.takeColumnFamilySnapshot(keyspaces[0], columnFamily, snapshotName); } @@ -1034,7 +1034,7 @@ public Object getColumnFamilyMetric(String ks, String cf, String metricName) case "TombstoneScannedHistogram": return JMX.newMBeanProxy(mbeanServerConn, oName, JmxReporter.HistogramMBean.class); default: - throw new RuntimeException("Unknown column family metric."); + throw new RuntimeException("Unknown table metric."); } } catch (MalformedObjectNameException e) @@ -1174,7 +1174,7 @@ public int compare(Entry e1, Entry cfnames = new ArrayList<>(); - @Option(name = "-i", description = "Ignore the list of column families and display the remaining cfs") + @Option(name = "-i", description = "Ignore the list of tables and display the remaining cfs") private boolean ignore = false; @Override @@ -821,15 +821,15 @@ public void verifyColumnFamilies() { for (String ks : filter.keySet()) if (verifier.get(ks).size() > 0) - throw new IllegalArgumentException("Unknown column families: " + verifier.get(ks).toString() + " in keyspace: " + ks); + throw new IllegalArgumentException("Unknown tables: " + verifier.get(ks).toString() + " in keyspace: " + ks); } } } - @Command(name = "cfhistograms", description = "Print statistic histograms for a given column family") + @Command(name = "cfhistograms", description = "Print statistic histograms for a given table") public static class CfHistograms extends NodeToolCmd { - @Arguments(usage = " ", description = "The keyspace and column family name") + @Arguments(usage = "
    ", description = "The keyspace and table name") private List args = new ArrayList<>(); @Override @@ -893,7 +893,7 @@ public void execute(NodeProbe probe) @Command(name = "cleanup", description = "Triggers the immediate cleanup of keys no longer belonging to a node. By default, clean all keyspaces") public static class Cleanup extends NodeToolCmd { - @Arguments(usage = "[ ...]", description = "The keyspace followed by one or many column families") + @Arguments(usage = "[ ...]", description = "The keyspace followed by one or many tables") private List args = new ArrayList<>(); @Override @@ -954,10 +954,10 @@ public void execute(NodeProbe probe) } } - @Command(name = "compact", description = "Force a (major) compaction on one or more column families") + @Command(name = "compact", description = "Force a (major) compaction on one or more tables") public static class Compact extends NodeToolCmd { - @Arguments(usage = "[ ...]", description = "The keyspace followed by one or many column families") + @Arguments(usage = "[ ...]", description = "The keyspace followed by one or many tables") private List args = new ArrayList<>(); @Override @@ -979,10 +979,10 @@ public void execute(NodeProbe probe) } } - @Command(name = "flush", description = "Flush one or more column families") + @Command(name = "flush", description = "Flush one or more tables") public static class Flush extends NodeToolCmd { - @Arguments(usage = "[ ...]", description = "The keyspace followed by one or many column families") + @Arguments(usage = "[ ...]", description = "The keyspace followed by one or many tables") private List args = new ArrayList<>(); @Override @@ -1004,10 +1004,10 @@ public void execute(NodeProbe probe) } } - @Command(name = "scrub", description = "Scrub (rebuild sstables for) one or more column families") + @Command(name = "scrub", description = "Scrub (rebuild sstables for) one or more tables") public static class Scrub extends NodeToolCmd { - @Arguments(usage = "[ ...]", description = "The keyspace followed by one or many column families") + @Arguments(usage = "[ ...]", description = "The keyspace followed by one or many tables") private List args = new ArrayList<>(); @Option(title = "disable_snapshot", @@ -1039,10 +1039,10 @@ public void execute(NodeProbe probe) } } - @Command(name = "disableautocompaction", description = "Disable autocompaction for the given keyspace and column family") + @Command(name = "disableautocompaction", description = "Disable autocompaction for the given keyspace and table") public static class DisableAutoCompaction extends NodeToolCmd { - @Arguments(usage = "[ ...]", description = "The keyspace followed by one or many column families") + @Arguments(usage = "[ ...]", description = "The keyspace followed by one or many tables") private List args = new ArrayList<>(); @Override @@ -1064,10 +1064,10 @@ public void execute(NodeProbe probe) } } - @Command(name = "enableautocompaction", description = "Enable autocompaction for the given keyspace and column family") + @Command(name = "enableautocompaction", description = "Enable autocompaction for the given keyspace and table") public static class EnableAutoCompaction extends NodeToolCmd { - @Arguments(usage = "[ ...]", description = "The keyspace followed by one or many column families") + @Arguments(usage = "[ ...]", description = "The keyspace followed by one or many tables") private List args = new ArrayList<>(); @Override @@ -1089,10 +1089,10 @@ public void execute(NodeProbe probe) } } - @Command(name = "upgradesstables", description = "Rewrite sstables (for the requested column families) that are not on the current version (thus upgrading them to said current version)") + @Command(name = "upgradesstables", description = "Rewrite sstables (for the requested tables) that are not on the current version (thus upgrading them to said current version)") public static class UpgradeSSTable extends NodeToolCmd { - @Arguments(usage = "[ ...]", description = "The keyspace followed by one or many column families") + @Arguments(usage = "[ ...]", description = "The keyspace followed by one or many tables") private List args = new ArrayList<>(); @Option(title = "include_all", name = {"-a", "--include-all-sstables"}, description = "Use -a to include all sstables, even those already on the current version") @@ -1282,10 +1282,10 @@ public void execute(NodeProbe probe) } } - @Command(name = "getcompactionthreshold", description = "Print min and max compaction thresholds for a given column family") + @Command(name = "getcompactionthreshold", description = "Print min and max compaction thresholds for a given table") public static class GetCompactionThreshold extends NodeToolCmd { - @Arguments(usage = " ", description = "The keyspace with a column family") + @Arguments(usage = "
    ", description = "The keyspace with a table") private List args = new ArrayList<>(); @Override @@ -1325,7 +1325,7 @@ public void execute(NodeProbe probe) @Command(name = "getendpoints", description = "Print the end points that owns the key") public static class GetEndpoints extends NodeToolCmd { - @Arguments(usage = " ", description = "The keyspace, the column family, and the key for which we need to find the endpoint") + @Arguments(usage = "
    ", description = "The keyspace, the table, and the key for which we need to find the endpoint") private List args = new ArrayList<>(); @Override @@ -1347,7 +1347,7 @@ public void execute(NodeProbe probe) @Command(name = "getsstables", description = "Print the sstable filenames that own the key") public static class GetSSTables extends NodeToolCmd { - @Arguments(usage = " ", description = "The keyspace, the column family, and the key") + @Arguments(usage = "
    ", description = "The keyspace, the table, and the key") private List args = new ArrayList<>(); @Override @@ -1530,7 +1530,7 @@ public void execute(NodeProbe probe) @Command(name = "refresh", description = "Load newly placed SSTables to the system without restart") public static class Refresh extends NodeToolCmd { - @Arguments(usage = " ", description = "The keyspace and column family name") + @Arguments(usage = "
    ", description = "The keyspace and table name") private List args = new ArrayList<>(); @Override @@ -1577,10 +1577,10 @@ public void execute(NodeProbe probe) } } - @Command(name = "repair", description = "Repair one or more column families") + @Command(name = "repair", description = "Repair one or more tables") public static class Repair extends NodeToolCmd { - @Arguments(usage = "[ ...]", description = "The keyspace followed by one or many column families") + @Arguments(usage = "[ ...]", description = "The keyspace followed by one or many tables") private List args = new ArrayList<>(); @Option(title = "seqential", name = {"-seq", "--sequential"}, description = "Use -seq to carry out a sequential repair") @@ -1654,10 +1654,10 @@ public void execute(NodeProbe probe) } } - @Command(name = "setcompactionthreshold", description = "Set min and max compaction thresholds for a given column family") + @Command(name = "setcompactionthreshold", description = "Set min and max compaction thresholds for a given table") public static class SetCompactionThreshold extends NodeToolCmd { - @Arguments(title = " ", usage = " ", description = "The keyspace, the column family, min and max threshold", required = true) + @Arguments(title = "
    ", usage = "
    ", description = "The keyspace, the table, min and max threshold", required = true) private List args = new ArrayList<>(); @Override @@ -1715,13 +1715,13 @@ public void execute(NodeProbe probe) } } - @Command(name = "snapshot", description = "Take a snapshot of specified keyspaces or a snapshot of the specified column family") + @Command(name = "snapshot", description = "Take a snapshot of specified keyspaces or a snapshot of the specified table") public static class Snapshot extends NodeToolCmd { @Arguments(usage = "[]", description = "List of keyspaces. By default, all keyspaces") private List keyspaces = new ArrayList<>(); - @Option(title = "cfname", name = {"-cf", "--column-family"}, description = "The column family name (you must specify one and only one keyspace for using this option)") + @Option(title = "table", name = {"-cf", "--column-family", "--table"}, description = "The table name (you must specify one and only one keyspace for using this option)") private String columnFamily = null; @Option(title = "tag", name = {"-t", "--tag"}, description = "The name of the snapshot") @@ -2135,10 +2135,10 @@ public void execute(NodeProbe probe) } } - @Command(name = "rebuild_index", description = "A full rebuild of native secondary indexes for a given column family") + @Command(name = "rebuild_index", description = "A full rebuild of native secondary indexes for a given table") public static class RebuildIndex extends NodeToolCmd { - @Arguments(usage = " ", description = "The keyspace and column family name followed by a list of index names (IndexNameExample: Standard3.IdxName Standard3.IdxName1)") + @Arguments(usage = "
    ", description = "The keyspace and table name followed by a list of index names (IndexNameExample: Standard3.IdxName Standard3.IdxName1)") List args = new ArrayList<>(); @Override @@ -2232,7 +2232,7 @@ public void execute(NodeProbe probe) } } - @Command(name = "drain", description = "Drain the node (stop accepting writes and flush all column families)") + @Command(name = "drain", description = "Drain the node (stop accepting writes and flush all tables)") public static class Drain extends NodeToolCmd { @Override @@ -2243,7 +2243,7 @@ public void execute(NodeProbe probe) probe.drain(); } catch (IOException | InterruptedException | ExecutionException e) { - throw new RuntimeException("Error occured during flushing", e); + throw new RuntimeException("Error occurred during flushing", e); } } } diff --git a/src/java/org/apache/cassandra/tools/SSTableExport.java b/src/java/org/apache/cassandra/tools/SSTableExport.java index 41e9fdcfdb06..a63825ebc863 100644 --- a/src/java/org/apache/cassandra/tools/SSTableExport.java +++ b/src/java/org/apache/cassandra/tools/SSTableExport.java @@ -430,7 +430,7 @@ public static void main(String[] args) throws ConfigurationException } catch (IllegalArgumentException e) { - System.err.println(String.format("The provided column family is not part of this cassandra keyspace: keyspace = %s, column family = %s", + System.err.println(String.format("The provided table is not part of this cassandra keyspace: keyspace = %s, table = %s", descriptor.ksname, descriptor.cfname)); System.exit(1); } diff --git a/src/java/org/apache/cassandra/tools/SSTableImport.java b/src/java/org/apache/cassandra/tools/SSTableImport.java index 4e7bf0643d79..f5873a4f1a8a 100644 --- a/src/java/org/apache/cassandra/tools/SSTableImport.java +++ b/src/java/org/apache/cassandra/tools/SSTableImport.java @@ -79,7 +79,7 @@ public class SSTableImport optKeyspace.setRequired(true); options.addOption(optKeyspace); - Option optColfamily = new Option(COLUMN_FAMILY_OPTION, true, "Column Family name."); + Option optColfamily = new Option(COLUMN_FAMILY_OPTION, true, "Table name."); optColfamily.setRequired(true); options.addOption(optColfamily); diff --git a/src/java/org/apache/cassandra/tools/SSTableLevelResetter.java b/src/java/org/apache/cassandra/tools/SSTableLevelResetter.java index 2d95ad2b4cde..6e32643d8320 100644 --- a/src/java/org/apache/cassandra/tools/SSTableLevelResetter.java +++ b/src/java/org/apache/cassandra/tools/SSTableLevelResetter.java @@ -44,7 +44,7 @@ public static void main(String[] args) throws IOException if (args.length == 0) { out.println("This command should be run with Cassandra stopped!"); - out.println("Usage: sstablelevelreset "); + out.println("Usage: sstablelevelreset
    "); System.exit(1); } @@ -52,7 +52,7 @@ public static void main(String[] args) throws IOException { out.println("This command should be run with Cassandra stopped, otherwise you will get very strange behavior"); out.println("Verify that Cassandra is not running and then execute the command like this:"); - out.println("Usage: sstablelevelreset --really-reset "); + out.println("Usage: sstablelevelreset --really-reset
    "); System.exit(1); } @@ -78,7 +78,7 @@ public static void main(String[] args) throws IOException if (!foundSSTable) { - out.println("Found no sstables, did you give the correct keyspace/columnfamily?"); + out.println("Found no sstables, did you give the correct keyspace/table?"); } } } diff --git a/src/java/org/apache/cassandra/tools/StandaloneScrubber.java b/src/java/org/apache/cassandra/tools/StandaloneScrubber.java index 78d4d9ec2ed9..4dffa74c88fe 100644 --- a/src/java/org/apache/cassandra/tools/StandaloneScrubber.java +++ b/src/java/org/apache/cassandra/tools/StandaloneScrubber.java @@ -54,7 +54,7 @@ public static void main(String args[]) DatabaseDescriptor.loadSchemas(); if (Schema.instance.getCFMetaData(options.keyspaceName, options.cfName) == null) - throw new IllegalArgumentException(String.format("Unknown keyspace/columnFamily %s.%s", + throw new IllegalArgumentException(String.format("Unknown keyspace/table %s.%s", options.keyspaceName, options.cfName)); @@ -233,7 +233,7 @@ public static void printUsage(CmdLineOptions options) String usage = String.format("%s [options] ", TOOL_NAME); StringBuilder header = new StringBuilder(); header.append("--\n"); - header.append("Scrub the sstable for the provided column family." ); + header.append("Scrub the sstable for the provided table." ); header.append("\n--\n"); header.append("Options are:"); new HelpFormatter().printHelp(usage, header.toString(), options, ""); diff --git a/src/java/org/apache/cassandra/tools/StandaloneSplitter.java b/src/java/org/apache/cassandra/tools/StandaloneSplitter.java index 9353ce98c817..f3725fd06b25 100644 --- a/src/java/org/apache/cassandra/tools/StandaloneSplitter.java +++ b/src/java/org/apache/cassandra/tools/StandaloneSplitter.java @@ -79,7 +79,7 @@ else if (!ksName.equals(desc.ksname)) if (cfName == null) cfName = desc.cfname; else if (!cfName.equals(desc.cfname)) - throw new IllegalArgumentException("All sstables must be part of the same column family"); + throw new IllegalArgumentException("All sstables must be part of the same table"); Set components = new HashSet(Arrays.asList(new Component[]{ Component.DATA, diff --git a/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java b/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java index 55f206e57020..5d8625beba84 100644 --- a/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java +++ b/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java @@ -48,7 +48,7 @@ public static void main(String args[]) throws IOException DatabaseDescriptor.loadSchemas(); if (Schema.instance.getCFMetaData(options.keyspace, options.cf) == null) - throw new IllegalArgumentException(String.format("Unknown keyspace/columnFamily %s.%s", + throw new IllegalArgumentException(String.format("Unknown keyspace/table %s.%s", options.keyspace, options.cf)); diff --git a/src/java/org/apache/cassandra/triggers/TriggerExecutor.java b/src/java/org/apache/cassandra/triggers/TriggerExecutor.java index 001529d40679..7ae31f447c86 100644 --- a/src/java/org/apache/cassandra/triggers/TriggerExecutor.java +++ b/src/java/org/apache/cassandra/triggers/TriggerExecutor.java @@ -150,7 +150,7 @@ private void validateForSinglePartition(AbstractType keyValidator, for (ColumnFamily cf : mutation.getColumnFamilies()) { if (! cf.id().equals(cfId)) - throw new InvalidRequestException("Column family of additional mutation does not match primary update cf"); + throw new InvalidRequestException("table of additional mutation does not match primary update table"); } } validate(tmutations); @@ -196,7 +196,7 @@ private List executeInternal(ByteBuffer key, ColumnFamily columnFamily } catch (Exception ex) { - throw new RuntimeException(String.format("Exception while creating trigger on CF with ID: %s", columnFamily.id()), ex); + throw new RuntimeException(String.format("Exception while creating trigger on table with ID: %s", columnFamily.id()), ex); } finally { diff --git a/src/java/org/apache/cassandra/utils/StatusLogger.java b/src/java/org/apache/cassandra/utils/StatusLogger.java index 66ff985068fd..acd923d2dcc3 100644 --- a/src/java/org/apache/cassandra/utils/StatusLogger.java +++ b/src/java/org/apache/cassandra/utils/StatusLogger.java @@ -109,7 +109,7 @@ public static void log() rowCacheKeysToSave == Integer.MAX_VALUE ? "all" : rowCacheKeysToSave)); // per-CF stats - logger.info(String.format("%-25s%20s", "ColumnFamily", "Memtable ops,data")); + logger.info(String.format("%-25s%20s", "Table", "Memtable ops,data")); for (ColumnFamilyStore cfs : ColumnFamilyStore.all()) { logger.info(String.format("%-25s%20s", diff --git a/test/unit/org/apache/cassandra/Util.java b/test/unit/org/apache/cassandra/Util.java index d2fe9491f4ce..6f48023e729f 100644 --- a/test/unit/org/apache/cassandra/Util.java +++ b/test/unit/org/apache/cassandra/Util.java @@ -205,7 +205,7 @@ public static ColumnFamilyStore writeColumnFamily(List mutations) public static ColumnFamily getColumnFamily(Keyspace keyspace, DecoratedKey key, String cfName) { ColumnFamilyStore cfStore = keyspace.getColumnFamilyStore(cfName); - assert cfStore != null : "Column family " + cfName + " has not been defined"; + assert cfStore != null : "Table " + cfName + " has not been defined"; return cfStore.getColumnFamily(QueryFilter.getIdentityFilter(key, cfName, System.currentTimeMillis())); } diff --git a/test/unit/org/apache/cassandra/config/DefsTest.java b/test/unit/org/apache/cassandra/config/DefsTest.java index e153a935a2f0..17224078b68d 100644 --- a/test/unit/org/apache/cassandra/config/DefsTest.java +++ b/test/unit/org/apache/cassandra/config/DefsTest.java @@ -159,7 +159,7 @@ public void addNewCF() throws ConfigurationException final String cf = "BrandNewCf"; KSMetaData original = Schema.instance.getKSMetaData(ks); - CFMetaData newCf = addTestCF(original.name, cf, "A New Column Family"); + CFMetaData newCf = addTestCF(original.name, cf, "A New Table"); Assert.assertFalse(Schema.instance.getKSMetaData(ks).cfMetaData().containsKey(newCf.cfName)); MigrationManager.announceNewColumnFamily(newCf); From eb56b490bad44f2ffa04e6b52f3cf0eaaa9c7e4a Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Fri, 20 Jun 2014 00:45:18 -0400 Subject: [PATCH 055/557] don't mask class' template parameter --- src/java/org/apache/cassandra/utils/btree/Path.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/java/org/apache/cassandra/utils/btree/Path.java b/src/java/org/apache/cassandra/utils/btree/Path.java index db6d64e02b0d..b1b0e03c8625 100644 --- a/src/java/org/apache/cassandra/utils/btree/Path.java +++ b/src/java/org/apache/cassandra/utils/btree/Path.java @@ -94,9 +94,9 @@ void moveStart(Object[] node, boolean forwards) * @param target the key to search for * @param mode the type of search to perform * @param forwards if the path should be setup for forward or backward iteration - * @param + * @param */ - boolean find(Comparator comparator, Object target, Op mode, boolean forwards) + boolean find(Comparator comparator, Object target, Op mode, boolean forwards) { // TODO : should not require parameter 'forwards' - consider modifying index to represent both // child and key position, as opposed to just key position (which necessitates a different value depending @@ -321,7 +321,7 @@ Object currentKey() return currentNode()[currentIndex()]; } - int compareTo(Path that, boolean forwards) + int compareTo(Path that, boolean forwards) { int d = Math.min(this.depth, that.depth); for (int i = 0; i <= d; i++) From e77b70eecce36250ecbe4a4fd977813d0096b859 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Fri, 20 Jun 2014 11:37:22 -0500 Subject: [PATCH 056/557] Allow browsing in jacoco-report Patch by Russ Hatch, reviewed by brandonwilliams for CASSANDRA-7226 --- build.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/build.xml b/build.xml index 8595fa9c850a..02e1f98fbb6b 100644 --- a/build.xml +++ b/build.xml @@ -1299,7 +1299,10 @@ - + + + + From d2a3827a65f208eae7aed129dcb6dc582ac1f3d5 Mon Sep 17 00:00:00 2001 From: lyubent Date: Fri, 20 Jun 2014 12:55:35 -0500 Subject: [PATCH 057/557] Reduce unit test times due to schema loading Patch by Lyuben Todorov; reviewed by Tyler Hobbs for CASSANDRA-6968 --- .../cassandra/db/LongFlushMemtableTest.java | 22 +- .../apache/cassandra/db/LongKeyspaceTest.java | 26 +- .../db/commitlog/ComitLogStress.java | 1 + .../db/compaction/LongCompactionsTest.java | 24 +- .../LongLeveledCompactionStrategyTest.java | 29 +- .../AbstractSerializationsTester.java | 2 +- .../org/apache/cassandra/SchemaLoader.java | 83 +++-- .../cassandra/cache/AutoSavingCacheTest.java | 25 +- .../cassandra/cache/CacheProviderTest.java | 22 +- .../org/apache/cassandra/cli/CliTest.java | 36 +- .../cassandra/config/CFMetaDataTest.java | 27 +- .../org/apache/cassandra/config/DefsTest.java | 58 ++- .../org/apache/cassandra/cql3/DeleteTest.java | 4 +- .../db/ArrayBackedSortedColumnsTest.java | 22 +- .../cassandra/db/BatchlogManagerTest.java | 45 ++- .../org/apache/cassandra/db/CleanupTest.java | 19 +- .../cassandra/db/CollationControllerTest.java | 29 +- .../cassandra/db/ColumnFamilyStoreTest.java | 346 ++++++++++-------- .../apache/cassandra/db/ColumnFamilyTest.java | 50 ++- .../apache/cassandra/db/CommitLogTest.java | 49 ++- .../apache/cassandra/db/CounterCacheTest.java | 29 +- .../apache/cassandra/db/CounterCellTest.java | 2 +- .../cassandra/db/CounterMutationTest.java | 58 +-- .../cassandra/db/HintedHandOffTest.java | 18 +- .../org/apache/cassandra/db/KeyCacheTest.java | 25 +- .../apache/cassandra/db/KeyCollisionTest.java | 21 +- .../org/apache/cassandra/db/KeyspaceTest.java | 120 +++--- .../apache/cassandra/db/MultitableTest.java | 38 +- .../org/apache/cassandra/db/NameSortTest.java | 32 +- .../cassandra/db/RangeTombstoneTest.java | 21 +- .../apache/cassandra/db/ReadMessageTest.java | 44 ++- .../cassandra/db/RecoveryManager2Test.java | 27 +- .../cassandra/db/RecoveryManager3Test.java | 38 +- .../cassandra/db/RecoveryManagerTest.java | 55 ++- .../db/RecoveryManagerTruncateTest.java | 25 +- .../apache/cassandra/db/RemoveCellTest.java | 25 +- .../cassandra/db/RemoveColumnFamilyTest.java | 25 +- .../db/RemoveColumnFamilyWithFlush1Test.java | 25 +- .../db/RemoveColumnFamilyWithFlush2Test.java | 25 +- .../cassandra/db/RemoveSubCellTest.java | 34 +- .../org/apache/cassandra/db/RowCacheTest.java | 49 ++- .../apache/cassandra/db/RowIterationTest.java | 20 +- .../unit/org/apache/cassandra/db/RowTest.java | 27 +- .../org/apache/cassandra/db/ScrubTest.java | 65 ++-- .../cassandra/db/SerializationsTest.java | 20 +- .../org/apache/cassandra/db/TimeSortTest.java | 53 ++- .../db/compaction/AntiCompactionTest.java | 21 +- .../BlacklistingCompactionsTest.java | 22 +- .../db/compaction/CompactionsPurgeTest.java | 51 ++- .../db/compaction/CompactionsTest.java | 60 ++- .../LeveledCompactionStrategyTest.java | 55 ++- .../db/compaction/OneCompactionTest.java | 29 +- .../SizeTieredCompactionStrategyTest.java | 24 +- .../db/compaction/TTLExpiryTest.java | 39 +- .../db/index/PerRowSecondaryIndexTest.java | 26 +- .../db/marshal/CompositeTypeTest.java | 37 +- .../db/marshal/DynamicCompositeTypeTest.java | 35 +- .../cassandra/dht/BootStrapperTest.java | 12 +- .../cassandra/io/BloomFilterTrackerTest.java | 3 +- .../io/sstable/IndexSummaryManagerTest.java | 56 ++- .../io/sstable/LegacySSTableTest.java | 17 +- .../io/sstable/SSTableLoaderTest.java | 26 +- .../io/sstable/SSTableMetadataTest.java | 59 ++- .../io/sstable/SSTableReaderTest.java | 68 ++-- .../io/sstable/SSTableScannerTest.java | 17 +- .../io/sstable/SSTableSimpleWriterTest.java | 24 +- .../cassandra/io/sstable/SSTableUtils.java | 14 +- .../OldNetworkTopologyStrategyTest.java | 3 +- .../ReplicationStrategyEndpointCacheTest.java | 19 +- .../cassandra/locator/SimpleStrategyTest.java | 20 +- .../cassandra/repair/DifferencerTest.java | 23 +- .../cassandra/repair/ValidatorTest.java | 19 +- .../AntiEntropyServiceCounterTest.java | 4 +- .../AntiEntropyServiceStandardTest.java | 4 +- .../AntiEntropyServiceTestAbstract.java | 22 +- .../service/EmbeddedCassandraServiceTest.java | 23 +- .../service/LeaveAndBootstrapTest.java | 139 +++---- .../apache/cassandra/service/MoveTest.java | 102 +++--- .../cassandra/service/QueryPagerTest.java | 46 ++- .../cassandra/service/RelocateTest.java | 1 - .../apache/cassandra/service/RemoveTest.java | 1 - .../cassandra/service/RowResolverTest.java | 43 ++- .../cassandra/service/StorageProxyTest.java | 3 +- .../streaming/StreamTransferTaskTest.java | 23 +- .../streaming/StreamingTransferTest.java | 54 ++- .../cassandra/thrift/MultiSliceTest.java | 22 +- .../thrift/ThriftValidationTest.java | 40 +- .../cassandra/tools/SSTableExportTest.java | 63 +++- .../cassandra/tools/SSTableImportTest.java | 42 ++- .../triggers/TriggersSchemaTest.java | 10 +- .../cassandra/triggers/TriggersTest.java | 10 +- .../cassandra/utils/EncodedStreamsTest.java | 33 +- 92 files changed, 2380 insertions(+), 924 deletions(-) diff --git a/test/long/org/apache/cassandra/db/LongFlushMemtableTest.java b/test/long/org/apache/cassandra/db/LongFlushMemtableTest.java index 4bb8fdde19e3..211f72f5c88b 100644 --- a/test/long/org/apache/cassandra/db/LongFlushMemtableTest.java +++ b/test/long/org/apache/cassandra/db/LongFlushMemtableTest.java @@ -24,22 +24,36 @@ import java.io.IOException; import java.nio.ByteBuffer; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.db.marshal.UTF8Type; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.service.MigrationManager; import org.apache.cassandra.utils.ByteBufferUtil; -public class LongFlushMemtableTest extends SchemaLoader +public class LongFlushMemtableTest { + public static final String KEYSPACE1 = "LongFlushMemtableTest"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.loadSchema(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1)); + } + @Test public void testFlushMemtables() throws IOException, ConfigurationException { - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); for (int i = 0; i < 100; i++) { CFMetaData metadata = CFMetaData.denseCFMetaData(keyspace.getName(), "_CF" + i, UTF8Type.instance); @@ -50,8 +64,8 @@ public void testFlushMemtables() throws IOException, ConfigurationException { for (int i = 0; i < 100; i++) { - Mutation rm = new Mutation("Keyspace1", ByteBufferUtil.bytes("key" + j)); - ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "_CF" + i); + Mutation rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("key" + j)); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "_CF" + i); // don't cheat by allocating this outside of the loop; that defeats the purpose of deliberately using lots of memory ByteBuffer value = ByteBuffer.allocate(100000); cf.addColumn(new BufferCell(Util.cellname("c"), value)); diff --git a/test/long/org/apache/cassandra/db/LongKeyspaceTest.java b/test/long/org/apache/cassandra/db/LongKeyspaceTest.java index 7a5b8370959e..fe22da849baf 100644 --- a/test/long/org/apache/cassandra/db/LongKeyspaceTest.java +++ b/test/long/org/apache/cassandra/db/LongKeyspaceTest.java @@ -18,27 +18,43 @@ package org.apache.cassandra.db; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; +import org.apache.cassandra.config.KSMetaData; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.WrappedRunnable; import static org.apache.cassandra.Util.column; import org.apache.cassandra.Util; - -public class LongKeyspaceTest extends SchemaLoader +public class LongKeyspaceTest { + public static final String KEYSPACE1 = "LongKeyspaceTest"; + public static final String CF_STANDARD = "Standard1"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD)); + } + @Test public void testGetRowMultiColumn() throws Throwable { - final Keyspace keyspace = Keyspace.open("Keyspace1"); + final Keyspace keyspace = Keyspace.open(KEYSPACE1); final ColumnFamilyStore cfStore = keyspace.getColumnFamilyStore("Standard1"); for (int i = 1; i < 5000; i += 100) { - Mutation rm = new Mutation("Keyspace1", Util.dk("key" + i).getKey()); - ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + Mutation rm = new Mutation(KEYSPACE1, Util.dk("key" + i).getKey()); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); for (int j = 0; j < i; j++) cf.addColumn(column("c" + j, "v" + j, 1L)); rm.add(cf); diff --git a/test/long/org/apache/cassandra/db/commitlog/ComitLogStress.java b/test/long/org/apache/cassandra/db/commitlog/ComitLogStress.java index 5b334ccbc36b..dc908047c5b1 100644 --- a/test/long/org/apache/cassandra/db/commitlog/ComitLogStress.java +++ b/test/long/org/apache/cassandra/db/commitlog/ComitLogStress.java @@ -52,6 +52,7 @@ public static void main(String[] args) throws Exception { ScheduledExecutorService scheduled = Executors.newScheduledThreadPool(1); org.apache.cassandra.SchemaLoader.loadSchema(); + org.apache.cassandra.SchemaLoader.schemaDefinition(""); // leave def. blank to maintain old behaviour final AtomicLong count = new AtomicLong(); final long start = System.currentTimeMillis(); System.out.println(String.format(format, "seconds", "max_mb", "allocated_mb", "free_mb", "diffrence", "count")); diff --git a/test/long/org/apache/cassandra/db/compaction/LongCompactionsTest.java b/test/long/org/apache/cassandra/db/compaction/LongCompactionsTest.java index 94bc09f26a5d..7bc8ef50aba7 100644 --- a/test/long/org/apache/cassandra/db/compaction/LongCompactionsTest.java +++ b/test/long/org/apache/cassandra/db/compaction/LongCompactionsTest.java @@ -24,21 +24,39 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; -import org.apache.cassandra.config.Schema; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; +import org.apache.cassandra.config.KSMetaData; +import org.apache.cassandra.config.Schema; import org.apache.cassandra.Util; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.db.*; import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.io.sstable.SSTableUtils; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; import static org.junit.Assert.assertEquals; -public class LongCompactionsTest extends SchemaLoader +public class LongCompactionsTest { public static final String KEYSPACE1 = "Keyspace1"; + public static final String CF_STANDARD = "Standard1"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + Map compactionOptions = new HashMap<>(); + compactionOptions.put("tombstone_compaction_interval", "1"); + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD) + .compactionStrategyOptions(compactionOptions)); + } /** * Test compaction with a very wide row. @@ -87,7 +105,7 @@ protected void testCompaction(int sstableCount, int rowsPerSSTable, int colsPerR // last sstable has highest timestamps cols[i] = Util.column(String.valueOf(i), String.valueOf(i), k); } - rows.put(key, SSTableUtils.createCF(Long.MIN_VALUE, Integer.MIN_VALUE, cols)); + rows.put(key, SSTableUtils.createCF(KEYSPACE1, CF_STANDARD, Long.MIN_VALUE, Integer.MIN_VALUE, cols)); } SSTableReader sstable = SSTableUtils.prepare().write(rows); sstables.add(sstable); diff --git a/test/long/org/apache/cassandra/db/compaction/LongLeveledCompactionStrategyTest.java b/test/long/org/apache/cassandra/db/compaction/LongLeveledCompactionStrategyTest.java index b071001f6968..159b641551a0 100644 --- a/test/long/org/apache/cassandra/db/compaction/LongLeveledCompactionStrategyTest.java +++ b/test/long/org/apache/cassandra/db/compaction/LongLeveledCompactionStrategyTest.java @@ -18,25 +18,44 @@ package org.apache.cassandra.db.compaction; import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.concurrent.*; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.*; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.FBUtilities; -public class LongLeveledCompactionStrategyTest extends SchemaLoader +public class LongLeveledCompactionStrategyTest { + public static final String KEYSPACE1 = "LongLeveledCompactionStrategyTest"; + public static final String CF_STANDARDLVL = "StandardLeveled"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + Map leveledOptions = new HashMap<>(); + leveledOptions.put("sstable_size_in_mb", "1"); + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARDLVL) + .compactionStrategyClass(LeveledCompactionStrategy.class) + .compactionStrategyOptions(leveledOptions)); + } + @Test public void testParallelLeveledCompaction() throws Exception { - String ksname = "Keyspace1"; + String ksname = KEYSPACE1; String cfname = "StandardLeveled"; Keyspace keyspace = Keyspace.open(ksname); ColumnFamilyStore store = keyspace.getColumnFamilyStore(cfname); diff --git a/test/unit/org/apache/cassandra/AbstractSerializationsTester.java b/test/unit/org/apache/cassandra/AbstractSerializationsTester.java index 1c97eae831cc..15e5d34ea749 100644 --- a/test/unit/org/apache/cassandra/AbstractSerializationsTester.java +++ b/test/unit/org/apache/cassandra/AbstractSerializationsTester.java @@ -32,7 +32,7 @@ import java.util.HashMap; import java.util.Map; -public class AbstractSerializationsTester extends SchemaLoader +public class AbstractSerializationsTester { protected static final String CUR_VER = System.getProperty("cassandra.version", "2.1"); protected static final Map VERSION_MAP = new HashMap () diff --git a/test/unit/org/apache/cassandra/SchemaLoader.java b/test/unit/org/apache/cassandra/SchemaLoader.java index a9d69fd1ea1f..066f45486ab0 100644 --- a/test/unit/org/apache/cassandra/SchemaLoader.java +++ b/test/unit/org/apache/cassandra/SchemaLoader.java @@ -57,11 +57,6 @@ public static void loadSchema() throws ConfigurationException // Migrations aren't happy if gossiper is not started. Even if we don't use migrations though, // some tests now expect us to start gossip for them. startGossiper(); - - // if you're messing with low-level sstable stuff, it can be useful to inject the schema directly - // Schema.instance.load(schemaDefinition()); - for (KSMetaData ksm : schemaDefinition()) - MigrationManager.announceNewKeyspace(ksm); } public static void prepareServer() @@ -84,32 +79,27 @@ public void uncaughtException(Thread t, Throwable e) public static void startGossiper() { - Gossiper.instance.start((int) (System.currentTimeMillis() / 1000)); - } - - @AfterClass - public static void stopGossiper() - { - Gossiper.instance.stop(); + if (!Gossiper.instance.isEnabled()) + Gossiper.instance.start((int) (System.currentTimeMillis() / 1000)); } - public static Collection schemaDefinition() throws ConfigurationException + public static void schemaDefinition(String testName) throws ConfigurationException { List schema = new ArrayList(); // A whole bucket of shorthand - String ks1 = "Keyspace1"; - String ks2 = "Keyspace2"; - String ks3 = "Keyspace3"; - String ks4 = "Keyspace4"; - String ks5 = "Keyspace5"; - String ks6 = "Keyspace6"; - String ks_kcs = "KeyCacheSpace"; - String ks_rcs = "RowCacheSpace"; - String ks_ccs = "CounterCacheSpace"; - String ks_nocommit = "NoCommitlogSpace"; - String ks_prsi = "PerRowSecondaryIndex"; - String ks_cql = "cql_keyspace"; + String ks1 = testName + "Keyspace1"; + String ks2 = testName + "Keyspace2"; + String ks3 = testName + "Keyspace3"; + String ks4 = testName + "Keyspace4"; + String ks5 = testName + "Keyspace5"; + String ks6 = testName + "Keyspace6"; + String ks_kcs = testName + "KeyCacheSpace"; + String ks_rcs = testName + "RowCacheSpace"; + String ks_ccs = testName + "CounterCacheSpace"; + String ks_nocommit = testName + "NoCommitlogSpace"; + String ks_prsi = testName + "PerRowSecondaryIndex"; + String ks_cql = testName + "cql_keyspace"; Class simple = SimpleStrategy.class; @@ -306,7 +296,30 @@ public static Collection schemaDefinition() throws ConfigurationExce if (Boolean.parseBoolean(System.getProperty("cassandra.test.compression", "false"))) useCompression(schema); - return schema; + // if you're messing with low-level sstable stuff, it can be useful to inject the schema directly + // Schema.instance.load(schemaDefinition()); + for (KSMetaData ksm : schema) + MigrationManager.announceNewKeyspace(ksm, false); + } + + public static void createKeyspace(String keyspaceName, + Class strategy, + Map options, + CFMetaData... cfmetas) throws ConfigurationException + { + createKeyspace(keyspaceName, true, true, strategy, options, cfmetas); + } + + public static void createKeyspace(String keyspaceName, + boolean durable, + boolean announceLocally, + Class strategy, + Map options, + CFMetaData... cfmetas) throws ConfigurationException + { + KSMetaData ksm = durable ? KSMetaData.testMetadata(keyspaceName, strategy, options, cfmetas) + : KSMetaData.testMetadataNotDurable(keyspaceName, strategy, options, cfmetas); + MigrationManager.announceNewKeyspace(ksm, announceLocally); } private static ColumnDefinition integerColumn(String ksName, String cfName) @@ -335,7 +348,7 @@ private static ColumnDefinition utf8Column(String ksName, String cfName) ColumnDefinition.Kind.REGULAR); } - private static CFMetaData perRowIndexedCFMD(String ksName, String cfName) + public static CFMetaData perRowIndexedCFMD(String ksName, String cfName) { final Map indexOptions = Collections.singletonMap( SecondaryIndex.CUSTOM_INDEX_OPTION_NAME, @@ -359,19 +372,19 @@ private static void useCompression(List schema) } } - private static CFMetaData standardCFMD(String ksName, String cfName) + public static CFMetaData standardCFMD(String ksName, String cfName) { return CFMetaData.denseCFMetaData(ksName, cfName, BytesType.instance); } - private static CFMetaData superCFMD(String ksName, String cfName, AbstractType subcc) + public static CFMetaData superCFMD(String ksName, String cfName, AbstractType subcc) { return superCFMD(ksName, cfName, BytesType.instance, subcc); } - private static CFMetaData superCFMD(String ksName, String cfName, AbstractType cc, AbstractType subcc) + public static CFMetaData superCFMD(String ksName, String cfName, AbstractType cc, AbstractType subcc) { return CFMetaData.denseCFMetaData(ksName, cfName, cc, subcc); } - private static CFMetaData indexCFMD(String ksName, String cfName, final Boolean withIdxType) throws ConfigurationException + public static CFMetaData indexCFMD(String ksName, String cfName, final Boolean withIdxType) throws ConfigurationException { CFMetaData cfm = CFMetaData.sparseCFMetaData(ksName, cfName, BytesType.instance).keyValidator(AsciiType.instance); @@ -380,7 +393,7 @@ private static CFMetaData indexCFMD(String ksName, String cfName, final Boolean return cfm.addColumnDefinition(ColumnDefinition.regularDef(cfm, cName, LongType.instance, null) .setIndex(withIdxType ? ByteBufferUtil.bytesToHex(cName) : null, keys, null)); } - private static CFMetaData compositeIndexCFMD(String ksName, String cfName, final Boolean withIdxType) throws ConfigurationException + public static CFMetaData compositeIndexCFMD(String ksName, String cfName, final Boolean withIdxType) throws ConfigurationException { final CompositeType composite = CompositeType.getInstance(Arrays.asList(new AbstractType[]{UTF8Type.instance, UTF8Type.instance})); CFMetaData cfm = CFMetaData.sparseCFMetaData(ksName, cfName, composite); @@ -438,7 +451,7 @@ public static void mkdirs() DatabaseDescriptor.createAllDirectories(); } - protected void insertData(String keyspace, String columnFamily, int offset, int numberOfRows) + public static void insertData(String keyspace, String columnFamily, int offset, int numberOfRows) { for (int i = offset; i < offset + numberOfRows; i++) { @@ -450,7 +463,7 @@ protected void insertData(String keyspace, String columnFamily, int offset, int } /* usually used to populate the cache */ - protected void readData(String keyspace, String columnFamily, int offset, int numberOfRows) + public static void readData(String keyspace, String columnFamily, int offset, int numberOfRows) { ColumnFamilyStore store = Keyspace.open(keyspace).getColumnFamilyStore(columnFamily); for (int i = offset; i < offset + numberOfRows; i++) @@ -460,7 +473,7 @@ protected void readData(String keyspace, String columnFamily, int offset, int nu } } - protected static void cleanupSavedCaches() + public static void cleanupSavedCaches() { File cachesDir = new File(DatabaseDescriptor.getSavedCachesLocation()); diff --git a/test/unit/org/apache/cassandra/cache/AutoSavingCacheTest.java b/test/unit/org/apache/cassandra/cache/AutoSavingCacheTest.java index 28afef1e0e05..683062cc9e4b 100644 --- a/test/unit/org/apache/cassandra/cache/AutoSavingCacheTest.java +++ b/test/unit/org/apache/cassandra/cache/AutoSavingCacheTest.java @@ -18,28 +18,45 @@ package org.apache.cassandra.cache; import org.junit.Assert; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.db.RowIndexEntry; import org.apache.cassandra.db.Mutation; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.service.CacheService; import org.apache.cassandra.utils.ByteBufferUtil; -public class AutoSavingCacheTest extends SchemaLoader +public class AutoSavingCacheTest { + private static final String KEYSPACE1 = "AutoSavingCacheTest1"; + private static final String CF_STANDARD1 = "Standard1"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1)); + } + @Test public void testSerializeAndLoadKeyCache() throws Exception { - ColumnFamilyStore cfs = Keyspace.open("Keyspace1").getColumnFamilyStore("Standard1"); + ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF_STANDARD1); for (int i = 0; i < 2; i++) { - Mutation rm = new Mutation("Keyspace1", ByteBufferUtil.bytes("key1")); - rm.add("Standard1", Util.cellname("c1"), ByteBufferUtil.bytes(i), 0); + Mutation rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("key1")); + rm.add(CF_STANDARD1, Util.cellname("c1"), ByteBufferUtil.bytes(i), 0); rm.apply(); cfs.forceBlockingFlush(); } diff --git a/test/unit/org/apache/cassandra/cache/CacheProviderTest.java b/test/unit/org/apache/cassandra/cache/CacheProviderTest.java index 71d4f8019e01..fe266164fc1c 100644 --- a/test/unit/org/apache/cassandra/cache/CacheProviderTest.java +++ b/test/unit/org/apache/cassandra/cache/CacheProviderTest.java @@ -26,18 +26,22 @@ import java.util.List; import java.util.UUID; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.ArrayBackedSortedColumns; import org.apache.cassandra.db.ColumnFamily; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import com.googlecode.concurrentlinkedhashmap.Weighers; import static org.apache.cassandra.Util.column; import static org.junit.Assert.*; -public class CacheProviderTest extends SchemaLoader +public class CacheProviderTest { MeasureableString key1 = new MeasureableString("key1"); MeasureableString key2 = new MeasureableString("key2"); @@ -45,8 +49,18 @@ public class CacheProviderTest extends SchemaLoader MeasureableString key4 = new MeasureableString("key4"); MeasureableString key5 = new MeasureableString("key5"); private static final long CAPACITY = 4; - private String keyspaceName = "Keyspace1"; - private String cfName = "Standard1"; + private static final String KEYSPACE1 = "CacheProviderTest1"; + private static final String CF_STANDARD1 = "Standard1"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1)); + } private void simpleCase(ColumnFamily cf, ICache cache) { @@ -100,7 +114,7 @@ public void run() private ColumnFamily createCF() { - ColumnFamily cf = ArrayBackedSortedColumns.factory.create(keyspaceName, cfName); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, CF_STANDARD1); cf.addColumn(column("vijay", "great", 1)); cf.addColumn(column("awesome", "vijay", 1)); return cf; diff --git a/test/unit/org/apache/cassandra/cli/CliTest.java b/test/unit/org/apache/cassandra/cli/CliTest.java index 5d28c70bf467..8c5a848c5d42 100644 --- a/test/unit/org/apache/cassandra/cli/CliTest.java +++ b/test/unit/org/apache/cassandra/cli/CliTest.java @@ -19,10 +19,14 @@ package org.apache.cassandra.cli; import org.apache.cassandra.SchemaLoader; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.config.Schema; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.service.EmbeddedCassandraService; import org.apache.cassandra.thrift.*; import org.apache.thrift.TException; +import org.junit.BeforeClass; import org.junit.Test; import java.io.ByteArrayOutputStream; @@ -33,11 +37,14 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -public class CliTest extends SchemaLoader +public class CliTest { + private static final String KEYSPACE1 = "CliTest"; + private static final String CF_STANDARD1 = "Standard1"; + // please add new statements here so they could be auto-runned by this test. private String[] statements = { - "use TestKeySpace;", + "use " + KEYSPACE1, "create column family SecondaryIndicesWithoutIdxName" + " with comparator = UTF8Type" + " and default_validation_class = UTF8Type" + @@ -136,7 +143,7 @@ public class CliTest extends SchemaLoader "drop index on '123'.617070;", "drop index on '123'.'-617071';", "drop index on CF3.'big world';", - "update keyspace TestKeySpace with durable_writes = false;", + "update keyspace " + KEYSPACE1 + " with durable_writes = false;", "assume 123 comparator as utf8;", "assume 123 sub_comparator as integer;", "assume 123 validator as lexicaluuid;", @@ -179,9 +186,9 @@ public class CliTest extends SchemaLoader "set myCF['key']['scName']['firstname'] = 'John';", "get myCF['key']['scName']", "assume CF3 keys as utf8;", - "use TestKEYSpace;", - "update keyspace TestKeySpace with placement_strategy='org.apache.cassandra.locator.NetworkTopologyStrategy';", - "update keyspace TestKeySpace with strategy_options=[{DC1:3, DC2:4, DC5:1}];", + "use " + KEYSPACE1 + ";", + "update keyspace " + KEYSPACE1 + " with placement_strategy='org.apache.cassandra.locator.NetworkTopologyStrategy';", + "update keyspace " + KEYSPACE1 + " with strategy_options={DC1:3, DC2:4, DC5:1};", "describe cluster;", "help describe cluster;", "show cluster name", @@ -212,9 +219,20 @@ public class CliTest extends SchemaLoader "HELP", "?", "show schema", - "show schema TestKeySpace" + "show schema " + KEYSPACE1 }; + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.startGossiper(); + SchemaLoader.createKeyspace(KEYSPACE1, true, false, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1)); + } + @Test public void testCli() throws IOException, TException, TimedOutException, NotFoundException, SchemaDisagreementException, NoSuchFieldException, InvalidRequestException, UnavailableException, InstantiationException, IllegalAccessException { @@ -236,13 +254,13 @@ public void testCli() throws IOException, TException, TimedOutException, NotFoun try { // dropping in case it exists e.g. could be left from previous run - CliMain.processStatement("drop keyspace TestKeySpace;"); + CliMain.processStatement(String.format("drop keyspace %s;", KEYSPACE1)); } catch (Exception e) { // TODO check before drop so we don't have this fragile ignored exception block } - CliMain.processStatement("create keyspace TestKeySpace;"); + CliMain.processStatement(String.format("create keyspace %s;", KEYSPACE1)); for (String statement : statements) { diff --git a/test/unit/org/apache/cassandra/config/CFMetaDataTest.java b/test/unit/org/apache/cassandra/config/CFMetaDataTest.java index 71f21a2edcbc..2b98da9cb0f0 100644 --- a/test/unit/org/apache/cassandra/config/CFMetaDataTest.java +++ b/test/unit/org/apache/cassandra/config/CFMetaDataTest.java @@ -29,22 +29,25 @@ import org.apache.cassandra.db.*; import org.apache.cassandra.db.marshal.AsciiType; import org.apache.cassandra.db.marshal.UTF8Type; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.compress.*; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.thrift.CfDef; import org.apache.cassandra.thrift.ColumnDef; import org.apache.cassandra.thrift.IndexType; import org.apache.cassandra.utils.ByteBufferUtil; +import org.junit.BeforeClass; import org.junit.Test; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; -public class CFMetaDataTest extends SchemaLoader +public class CFMetaDataTest { - private static String KEYSPACE = "Keyspace1"; - private static String COLUMN_FAMILY = "Standard1"; + private static final String KEYSPACE1 = "CFMetaDataTest1"; + private static final String CF_STANDARD1 = "Standard1"; private static List columnDefs = new ArrayList(); @@ -59,21 +62,31 @@ public class CFMetaDataTest extends SchemaLoader .setIndex_type(IndexType.KEYS)); } + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1)); + } + @Test public void testThriftConversion() throws Exception { CfDef cfDef = new CfDef().setDefault_validation_class(AsciiType.class.getCanonicalName()) .setComment("Test comment") .setColumn_metadata(columnDefs) - .setKeyspace(KEYSPACE) - .setName(COLUMN_FAMILY); + .setKeyspace(KEYSPACE1) + .setName(CF_STANDARD1); // convert Thrift to CFMetaData CFMetaData cfMetaData = CFMetaData.fromThrift(cfDef); CfDef thriftCfDef = new CfDef(); - thriftCfDef.keyspace = KEYSPACE; - thriftCfDef.name = COLUMN_FAMILY; + thriftCfDef.keyspace = KEYSPACE1; + thriftCfDef.name = CF_STANDARD1; thriftCfDef.default_validation_class = cfDef.default_validation_class; thriftCfDef.comment = cfDef.comment; thriftCfDef.column_metadata = new ArrayList(); diff --git a/test/unit/org/apache/cassandra/config/DefsTest.java b/test/unit/org/apache/cassandra/config/DefsTest.java index 17224078b68d..206a3364cf55 100644 --- a/test/unit/org/apache/cassandra/config/DefsTest.java +++ b/test/unit/org/apache/cassandra/config/DefsTest.java @@ -40,17 +40,47 @@ import static org.apache.cassandra.Util.cellname; import org.junit.Assert; +import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(OrderedJUnit4ClassRunner.class) -public class DefsTest extends SchemaLoader +public class DefsTest { + private static final String KEYSPACE1 = "Keyspace1"; + private static final String KEYSPACE3 = "Keyspace3"; + private static final String KEYSPACE6 = "Keyspace6"; + private static final String EMPTYKEYSPACE = "DefsTestEmptyKeyspace"; + private static final String CF_STANDARD1 = "Standard1"; + private static final String CF_STANDARD2 = "Standard2"; + private static final String CF_INDEXED = "Indexed1"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.startGossiper(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD2)); + SchemaLoader.createKeyspace(KEYSPACE3, true, false, + SimpleStrategy.class, + KSMetaData.optsWithRF(5), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1), + SchemaLoader.indexCFMD(KEYSPACE3, CF_INDEXED, true)); + SchemaLoader.createKeyspace(KEYSPACE6, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.indexCFMD(KEYSPACE6, CF_INDEXED, true)); + } + @Test public void testCFMetaDataApply() throws ConfigurationException { - CFMetaData cfm = new CFMetaData("Keyspace1", + CFMetaData cfm = new CFMetaData(KEYSPACE1, "TestApplyCFM_CF", ColumnFamilyType.Standard, new SimpleDenseCellNameType(BytesType.instance)); @@ -139,7 +169,7 @@ public void addNewCfToBogusKeyspace() @Test public void addNewCfWithNullComment() throws ConfigurationException { - final String ks = "Keyspace1"; + final String ks = KEYSPACE1; final String cf = "BrandNewCfWithNull"; KSMetaData original = Schema.instance.getKSMetaData(ks); @@ -155,7 +185,7 @@ public void addNewCfWithNullComment() throws ConfigurationException @Test public void addNewCF() throws ConfigurationException { - final String ks = "Keyspace1"; + final String ks = KEYSPACE1; final String cf = "BrandNewCf"; KSMetaData original = Schema.instance.getKSMetaData(ks); @@ -188,7 +218,7 @@ public void dropCf() throws ConfigurationException { DecoratedKey dk = Util.dk("dropCf"); // sanity - final KSMetaData ks = Schema.instance.getKSMetaData("Keyspace1"); + final KSMetaData ks = Schema.instance.getKSMetaData(KEYSPACE1); Assert.assertNotNull(ks); final CFMetaData cfm = ks.cfMetaData().get("Standard1"); Assert.assertNotNull(cfm); @@ -262,7 +292,7 @@ public void dropKS() throws ConfigurationException { DecoratedKey dk = Util.dk("dropKs"); // sanity - final KSMetaData ks = Schema.instance.getKSMetaData("Keyspace1"); + final KSMetaData ks = Schema.instance.getKSMetaData(KEYSPACE1); Assert.assertNotNull(ks); final CFMetaData cfm = ks.cfMetaData().get("Standard2"); Assert.assertNotNull(cfm); @@ -313,7 +343,7 @@ public void dropKSUnflushed() throws ConfigurationException { DecoratedKey dk = Util.dk("dropKs"); // sanity - final KSMetaData ks = Schema.instance.getKSMetaData("Keyspace3"); + final KSMetaData ks = Schema.instance.getKSMetaData(KEYSPACE3); Assert.assertNotNull(ks); final CFMetaData cfm = ks.cfMetaData().get("Standard1"); Assert.assertNotNull(cfm); @@ -332,14 +362,14 @@ public void dropKSUnflushed() throws ConfigurationException @Test public void createEmptyKsAddNewCf() throws ConfigurationException { - Assert.assertNull(Schema.instance.getKSMetaData("EmptyKeyspace")); + Assert.assertNull(Schema.instance.getKSMetaData(EMPTYKEYSPACE)); - KSMetaData newKs = KSMetaData.testMetadata("EmptyKeyspace", SimpleStrategy.class, KSMetaData.optsWithRF(5)); + KSMetaData newKs = KSMetaData.testMetadata(EMPTYKEYSPACE, SimpleStrategy.class, KSMetaData.optsWithRF(5)); MigrationManager.announceNewKeyspace(newKs); - Assert.assertNotNull(Schema.instance.getKSMetaData("EmptyKeyspace")); + Assert.assertNotNull(Schema.instance.getKSMetaData(EMPTYKEYSPACE)); - CFMetaData newCf = addTestCF("EmptyKeyspace", "AddedLater", "A new CF to add to an empty KS"); + CFMetaData newCf = addTestCF(EMPTYKEYSPACE, "AddedLater", "A new CF to add to an empty KS"); //should not exist until apply Assert.assertFalse(Schema.instance.getKSMetaData(newKs.name).cfMetaData().containsKey(newCf.cfName)); @@ -498,11 +528,11 @@ public void testUpdateColumnFamilyNoIndexes() throws ConfigurationException public void testDropIndex() throws ConfigurationException { // persist keyspace definition in the system keyspace - Schema.instance.getKSMetaData("Keyspace6").toSchema(System.currentTimeMillis()).apply(); - ColumnFamilyStore cfs = Keyspace.open("Keyspace6").getColumnFamilyStore("Indexed1"); + Schema.instance.getKSMetaData(KEYSPACE6).toSchema(System.currentTimeMillis()).apply(); + ColumnFamilyStore cfs = Keyspace.open(KEYSPACE6).getColumnFamilyStore("Indexed1"); // insert some data. save the sstable descriptor so we can make sure it's marked for delete after the drop - Mutation rm = new Mutation("Keyspace6", ByteBufferUtil.bytes("k1")); + Mutation rm = new Mutation(KEYSPACE6, ByteBufferUtil.bytes("k1")); rm.add("Indexed1", cellname("notbirthdate"), ByteBufferUtil.bytes(1L), 0); rm.add("Indexed1", cellname("birthdate"), ByteBufferUtil.bytes(1L), 0); rm.apply(); diff --git a/test/unit/org/apache/cassandra/cql3/DeleteTest.java b/test/unit/org/apache/cassandra/cql3/DeleteTest.java index 3395dcc80d26..bb3409540d6f 100644 --- a/test/unit/org/apache/cassandra/cql3/DeleteTest.java +++ b/test/unit/org/apache/cassandra/cql3/DeleteTest.java @@ -16,7 +16,7 @@ import java.io.IOException; -public class DeleteTest extends SchemaLoader +public class DeleteTest { private static EmbeddedCassandraService cassandra; @@ -35,7 +35,7 @@ public class DeleteTest extends SchemaLoader @BeforeClass() public static void setup() throws ConfigurationException, IOException { - + SchemaLoader.loadSchema(); Schema.instance.clear(); // Schema are now written on disk and will be reloaded cassandra = new EmbeddedCassandraService(); cassandra.start(); diff --git a/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java b/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java index 968fb935806d..46fe812871be 100644 --- a/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java +++ b/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java @@ -21,21 +21,39 @@ package org.apache.cassandra.db; import java.util.*; + +import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.*; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.config.Schema; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.db.composites.*; import org.apache.cassandra.db.filter.ColumnSlice; import org.apache.cassandra.db.marshal.Int32Type; import org.apache.cassandra.utils.SearchIterator; -public class ArrayBackedSortedColumnsTest extends SchemaLoader +public class ArrayBackedSortedColumnsTest { + private static final String KEYSPACE1 = "ArrayBackedSortedColumnsTest"; + private static final String CF_STANDARD1 = "Standard1"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1)); + } + @Test public void testAdd() { @@ -45,7 +63,7 @@ public void testAdd() private CFMetaData metadata() { - return Schema.instance.getCFMetaData("Keyspace1", "Standard1"); + return Schema.instance.getCFMetaData(KEYSPACE1, CF_STANDARD1); } private void testAddInternal(boolean reversed) diff --git a/test/unit/org/apache/cassandra/db/BatchlogManagerTest.java b/test/unit/org/apache/cassandra/db/BatchlogManagerTest.java index 57f68442d080..6f36fe95215d 100644 --- a/test/unit/org/apache/cassandra/db/BatchlogManagerTest.java +++ b/test/unit/org/apache/cassandra/db/BatchlogManagerTest.java @@ -23,17 +23,21 @@ import java.util.concurrent.ExecutionException; import com.google.common.collect.Lists; +import org.junit.BeforeClass; import org.junit.Before; import org.junit.Test; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; import org.apache.cassandra.config.DatabaseDescriptor; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.cql3.QueryProcessor; import org.apache.cassandra.cql3.UntypedResultSet; import org.apache.cassandra.db.composites.CellNameType; import org.apache.cassandra.db.commitlog.ReplayPosition; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.locator.TokenMetadata; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.UUIDGen; @@ -43,8 +47,25 @@ import static org.apache.cassandra.utils.ByteBufferUtil.bytes; -public class BatchlogManagerTest extends SchemaLoader +public class BatchlogManagerTest { + private static final String KEYSPACE1 = "BatchlogManagerTest1"; + private static final String CF_STANDARD1 = "Standard1"; + private static final String CF_STANDARD2 = "Standard2"; + private static final String CF_STANDARD3 = "Standard3"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD2), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD3)); + } + @Before public void setUp() throws Exception { @@ -62,10 +83,10 @@ public void testReplay() throws Exception // Generate 1000 mutations and put them all into the batchlog. // Half (500) ready to be replayed, half not. - CellNameType comparator = Keyspace.open("Keyspace1").getColumnFamilyStore("Standard1").metadata.comparator; + CellNameType comparator = Keyspace.open(KEYSPACE1).getColumnFamilyStore("Standard1").metadata.comparator; for (int i = 0; i < 1000; i++) { - Mutation mutation = new Mutation("Keyspace1", bytes(i)); + Mutation mutation = new Mutation(KEYSPACE1, bytes(i)); mutation.add("Standard1", comparator.makeCellName(bytes(i)), bytes(i), System.currentTimeMillis()); long timestamp = i < 500 @@ -94,7 +115,7 @@ public void testReplay() throws Exception for (int i = 0; i < 1000; i++) { - UntypedResultSet result = QueryProcessor.executeInternal(String.format("SELECT * FROM \"Keyspace1\".\"Standard1\" WHERE key = intAsBlob(%d)", i)); + UntypedResultSet result = QueryProcessor.executeInternal(String.format("SELECT * FROM \"%s\".\"%s\" WHERE key = intAsBlob(%d)", KEYSPACE1, CF_STANDARD1, i)); if (i < 500) { assertEquals(bytes(i), result.one().getBytes("key")); @@ -108,23 +129,23 @@ public void testReplay() throws Exception } // Ensure that no stray mutations got somehow applied. - UntypedResultSet result = QueryProcessor.executeInternal(String.format("SELECT count(*) FROM \"Keyspace1\".\"Standard1\"")); + UntypedResultSet result = QueryProcessor.executeInternal(String.format("SELECT count(*) FROM \"%s\".\"%s\"", KEYSPACE1, CF_STANDARD1)); assertEquals(500, result.one().getLong("count")); } @Test public void testTruncatedReplay() throws InterruptedException, ExecutionException { - CellNameType comparator2 = Keyspace.open("Keyspace1").getColumnFamilyStore("Standard2").metadata.comparator; - CellNameType comparator3 = Keyspace.open("Keyspace1").getColumnFamilyStore("Standard3").metadata.comparator; + CellNameType comparator2 = Keyspace.open(KEYSPACE1).getColumnFamilyStore("Standard2").metadata.comparator; + CellNameType comparator3 = Keyspace.open(KEYSPACE1).getColumnFamilyStore("Standard3").metadata.comparator; // Generate 2000 mutations (1000 batchlog entries) and put them all into the batchlog. // Each batchlog entry with a mutation for Standard2 and Standard3. // In the middle of the process, 'truncate' Standard2. for (int i = 0; i < 1000; i++) { - Mutation mutation1 = new Mutation("Keyspace1", bytes(i)); + Mutation mutation1 = new Mutation(KEYSPACE1, bytes(i)); mutation1.add("Standard2", comparator2.makeCellName(bytes(i)), bytes(i), 0); - Mutation mutation2 = new Mutation("Keyspace1", bytes(i)); + Mutation mutation2 = new Mutation(KEYSPACE1, bytes(i)); mutation2.add("Standard3", comparator3.makeCellName(bytes(i)), bytes(i), 0); List mutations = Lists.newArrayList(mutation1, mutation2); @@ -132,7 +153,7 @@ public void testTruncatedReplay() throws InterruptedException, ExecutionExceptio long timestamp = System.currentTimeMillis() - DatabaseDescriptor.getWriteRpcTimeout() * 2; if (i == 500) - SystemKeyspace.saveTruncationRecord(Keyspace.open("Keyspace1").getColumnFamilyStore("Standard2"), + SystemKeyspace.saveTruncationRecord(Keyspace.open(KEYSPACE1).getColumnFamilyStore("Standard2"), timestamp, ReplayPosition.NONE); @@ -158,7 +179,7 @@ public void testTruncatedReplay() throws InterruptedException, ExecutionExceptio // We should see half of Standard2-targeted mutations written after the replay and all of Standard3 mutations applied. for (int i = 0; i < 1000; i++) { - UntypedResultSet result = QueryProcessor.executeInternal(String.format("SELECT * FROM \"Keyspace1\".\"Standard2\" WHERE key = intAsBlob(%d)", i)); + UntypedResultSet result = QueryProcessor.executeInternal(String.format("SELECT * FROM \"%s\".\"%s\" WHERE key = intAsBlob(%d)", KEYSPACE1, CF_STANDARD2,i)); if (i >= 500) { assertEquals(bytes(i), result.one().getBytes("key")); @@ -173,7 +194,7 @@ public void testTruncatedReplay() throws InterruptedException, ExecutionExceptio for (int i = 0; i < 1000; i++) { - UntypedResultSet result = QueryProcessor.executeInternal(String.format("SELECT * FROM \"Keyspace1\".\"Standard3\" WHERE key = intAsBlob(%d)", i)); + UntypedResultSet result = QueryProcessor.executeInternal(String.format("SELECT * FROM \"%s\".\"%s\" WHERE key = intAsBlob(%d)", KEYSPACE1, CF_STANDARD3, i)); assertEquals(bytes(i), result.one().getBytes("key")); assertEquals(bytes(i), result.one().getBytes("column1")); assertEquals(bytes(i), result.one().getBytes("value")); diff --git a/test/unit/org/apache/cassandra/db/CleanupTest.java b/test/unit/org/apache/cassandra/db/CleanupTest.java index 79a8470fbfa9..213c5b8369d1 100644 --- a/test/unit/org/apache/cassandra/db/CleanupTest.java +++ b/test/unit/org/apache/cassandra/db/CleanupTest.java @@ -31,22 +31,26 @@ import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.filter.IDiskAtomFilter; import org.apache.cassandra.db.columniterator.IdentityQueryFilter; import org.apache.cassandra.db.compaction.CompactionManager; import org.apache.cassandra.db.index.SecondaryIndex; import org.apache.cassandra.dht.BytesToken; import org.apache.cassandra.dht.Range; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.locator.TokenMetadata; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.ByteBufferUtil; +import org.junit.BeforeClass; import org.junit.Test; -public class CleanupTest extends SchemaLoader +public class CleanupTest { public static final int LOOPS = 200; - public static final String KEYSPACE1 = "Keyspace1"; + public static final String KEYSPACE1 = "CleanupTest1"; public static final String CF1 = "Indexed1"; public static final String CF2 = "Standard1"; public static final ByteBuffer COLUMN = ByteBufferUtil.bytes("birthdate"); @@ -57,6 +61,17 @@ public class CleanupTest extends SchemaLoader VALUE.flip(); } + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF2), + SchemaLoader.indexCFMD(KEYSPACE1, CF1, true)); + } + @Test public void testCleanup() throws ExecutionException, InterruptedException { diff --git a/test/unit/org/apache/cassandra/db/CollationControllerTest.java b/test/unit/org/apache/cassandra/db/CollationControllerTest.java index 22c60b8f4979..923cb9ee1342 100644 --- a/test/unit/org/apache/cassandra/db/CollationControllerTest.java +++ b/test/unit/org/apache/cassandra/db/CollationControllerTest.java @@ -18,24 +18,43 @@ */ package org.apache.cassandra.db; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.composites.CellName; import org.apache.cassandra.db.filter.QueryFilter; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; import static org.junit.Assert.assertEquals; -public class CollationControllerTest extends SchemaLoader +public class CollationControllerTest { + private static final String KEYSPACE1 = "CollationControllerTest"; + private static final String CF = "Standard1"; + private static final String CFGCGRACE = "StandardGCGS0"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF), + SchemaLoader.standardCFMD(KEYSPACE1, CFGCGRACE).gcGraceSeconds(0)); + } + @Test public void getTopLevelColumnsSkipsSSTablesModifiedBeforeRowDelete() { - Keyspace keyspace = Keyspace.open("Keyspace1"); - ColumnFamilyStore cfs = keyspace.getColumnFamilyStore("Standard1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); + ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF); Mutation rm; DecoratedKey dk = Util.dk("key1"); @@ -83,8 +102,8 @@ public void getTopLevelColumnsSkipsSSTablesModifiedBeforeRowDelete() @Test public void ensureTombstonesAppliedAfterGCGS() { - Keyspace keyspace = Keyspace.open("Keyspace1"); - ColumnFamilyStore cfs = keyspace.getColumnFamilyStore("StandardGCGS0"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); + ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CFGCGRACE); cfs.disableAutoCompaction(); Mutation rm; diff --git a/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java b/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java index dda9b658bd20..467a451a0d36 100644 --- a/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java +++ b/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java @@ -45,17 +45,14 @@ import com.google.common.collect.Sets; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; +import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.apache.cassandra.OrderedJUnit4ClassRunner; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; -import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.config.ColumnDefinition; -import org.apache.cassandra.config.DatabaseDescriptor; -import org.apache.cassandra.config.IndexType; -import org.apache.cassandra.config.Schema; +import org.apache.cassandra.config.*; import org.apache.cassandra.db.columniterator.IdentityQueryFilter; import org.apache.cassandra.db.composites.CellName; import org.apache.cassandra.db.composites.CellNameType; @@ -67,13 +64,16 @@ import org.apache.cassandra.db.filter.QueryFilter; import org.apache.cassandra.db.filter.SliceQueryFilter; import org.apache.cassandra.db.index.SecondaryIndex; +import org.apache.cassandra.db.marshal.IntegerType; import org.apache.cassandra.db.marshal.LexicalUUIDType; import org.apache.cassandra.db.marshal.LongType; +import org.apache.cassandra.db.marshal.UTF8Type; import org.apache.cassandra.dht.Bounds; import org.apache.cassandra.dht.ExcludingBounds; import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.dht.IncludingExcludingBounds; import org.apache.cassandra.dht.Range; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.sstable.Component; import org.apache.cassandra.io.sstable.Descriptor; import org.apache.cassandra.io.sstable.SSTableDeletingTask; @@ -82,6 +82,7 @@ import org.apache.cassandra.io.sstable.SSTableWriter; import org.apache.cassandra.io.sstable.metadata.MetadataCollector; import org.apache.cassandra.io.util.FileUtils; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.service.ActiveRepairService; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.thrift.SlicePredicate; @@ -91,6 +92,7 @@ import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.Pair; import org.apache.cassandra.utils.WrappedRunnable; +import org.apache.thrift.TException; import static org.apache.cassandra.Util.cellname; import static org.apache.cassandra.Util.column; @@ -104,9 +106,22 @@ import static org.junit.Assert.assertTrue; @RunWith(OrderedJUnit4ClassRunner.class) -public class ColumnFamilyStoreTest extends SchemaLoader +public class ColumnFamilyStoreTest { static byte[] bytes1, bytes2; + public static final String KEYSPACE1 = "ColumnFamilyStoreTest1"; + public static final String KEYSPACE2 = "ColumnFamilyStoreTest2"; + public static final String KEYSPACE3 = "ColumnFamilyStoreTest3"; + public static final String CF_STANDARD1 = "Standard1"; + public static final String CF_STANDARD2 = "Standard2"; + public static final String CF_STANDARD3 = "Standard3"; + public static final String CF_STANDARD4 = "Standard4"; + public static final String CF_STANDARDINT = "StandardInteger1"; + public static final String CF_SUPER1 = "Super1"; + public static final String CF_SUPER6 = "Super6"; + public static final String CF_INDEX1 = "Indexed1"; + public static final String CF_INDEX2 = "Indexed2"; + public static final String CF_INDEX3 = "Indexed3"; static { @@ -117,22 +132,51 @@ public class ColumnFamilyStoreTest extends SchemaLoader random.nextBytes(bytes2); } + @BeforeClass + public static void defineSchema() throws ConfigurationException, IOException, TException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD2), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD3), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD4), + SchemaLoader.indexCFMD(KEYSPACE1, CF_INDEX1, true), + SchemaLoader.indexCFMD(KEYSPACE1, CF_INDEX2, false), + SchemaLoader.superCFMD(KEYSPACE1, CF_SUPER1, LongType.instance), + SchemaLoader.superCFMD(KEYSPACE1, CF_SUPER6, LexicalUUIDType.instance, UTF8Type.instance), + CFMetaData.denseCFMetaData(KEYSPACE1, CF_STANDARDINT, IntegerType.instance)); + SchemaLoader.createKeyspace(KEYSPACE2, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE2, CF_STANDARD1), + SchemaLoader.indexCFMD(KEYSPACE2, CF_INDEX1, true), + SchemaLoader.compositeIndexCFMD(KEYSPACE2, CF_INDEX2, true), + SchemaLoader.compositeIndexCFMD(KEYSPACE2, CF_INDEX3, true).gcGraceSeconds(0)); + SchemaLoader.createKeyspace(KEYSPACE3, + SimpleStrategy.class, + KSMetaData.optsWithRF(5), + SchemaLoader.indexCFMD(KEYSPACE3, CF_INDEX1, true)); + } + @Test // create two sstables, and verify that we only deserialize data from the most recent one public void testTimeSortedQuery() { - Keyspace keyspace = Keyspace.open("Keyspace1"); - ColumnFamilyStore cfs = keyspace.getColumnFamilyStore("Standard1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); + ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF_STANDARD1); cfs.truncateBlocking(); Mutation rm; - rm = new Mutation("Keyspace1", ByteBufferUtil.bytes("key1")); - rm.add("Standard1", cellname("Column1"), ByteBufferUtil.bytes("asdf"), 0); + rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("key1")); + rm.add(CF_STANDARD1, cellname("Column1"), ByteBufferUtil.bytes("asdf"), 0); rm.apply(); cfs.forceBlockingFlush(); - rm = new Mutation("Keyspace1", ByteBufferUtil.bytes("key1")); - rm.add("Standard1", cellname("Column1"), ByteBufferUtil.bytes("asdf"), 1); + rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("key1")); + rm.add(CF_STANDARD1, cellname("Column1"), ByteBufferUtil.bytes("asdf"), 1); rm.apply(); cfs.forceBlockingFlush(); @@ -144,40 +188,40 @@ public void testTimeSortedQuery() @Test public void testGetColumnWithWrongBF() { - Keyspace keyspace = Keyspace.open("Keyspace1"); - ColumnFamilyStore cfs = keyspace.getColumnFamilyStore("Standard1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); + ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF_STANDARD1); cfs.truncateBlocking(); List rms = new LinkedList<>(); - Mutation rm = new Mutation("Keyspace1", ByteBufferUtil.bytes("key1")); - rm.add("Standard1", cellname("Column1"), ByteBufferUtil.bytes("asdf"), 0); - rm.add("Standard1", cellname("Column2"), ByteBufferUtil.bytes("asdf"), 0); + Mutation rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("key1")); + rm.add(CF_STANDARD1, cellname("Column1"), ByteBufferUtil.bytes("asdf"), 0); + rm.add(CF_STANDARD1, cellname("Column2"), ByteBufferUtil.bytes("asdf"), 0); rms.add(rm); Util.writeColumnFamily(rms); List ssTables = keyspace.getAllSSTables(); assertEquals(1, ssTables.size()); ssTables.get(0).forceFilterFailures(); - ColumnFamily cf = cfs.getColumnFamily(QueryFilter.getIdentityFilter(Util.dk("key2"), "Standard1", System.currentTimeMillis())); + ColumnFamily cf = cfs.getColumnFamily(QueryFilter.getIdentityFilter(Util.dk("key2"), CF_STANDARD1, System.currentTimeMillis())); assertNull(cf); } @Test public void testEmptyRow() throws Exception { - Keyspace keyspace = Keyspace.open("Keyspace1"); - final ColumnFamilyStore store = keyspace.getColumnFamilyStore("Standard2"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); + final ColumnFamilyStore store = keyspace.getColumnFamilyStore(CF_STANDARD2); Mutation rm; - rm = new Mutation("Keyspace1", ByteBufferUtil.bytes("key1")); - rm.delete("Standard2", System.currentTimeMillis()); + rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("key1")); + rm.delete(CF_STANDARD2, System.currentTimeMillis()); rm.apply(); Runnable r = new WrappedRunnable() { public void runMayThrow() throws IOException { - QueryFilter sliceFilter = QueryFilter.getSliceFilter(Util.dk("key1"), "Standard2", Composites.EMPTY, Composites.EMPTY, false, 1, System.currentTimeMillis()); + QueryFilter sliceFilter = QueryFilter.getSliceFilter(Util.dk("key1"), CF_STANDARD2, Composites.EMPTY, Composites.EMPTY, false, 1, System.currentTimeMillis()); ColumnFamily cf = store.getColumnFamily(sliceFilter); assertTrue(cf.isMarkedForDelete()); assertFalse(cf.hasColumns()); @@ -209,29 +253,29 @@ public void testSkipStartKey() @Test public void testIndexScan() { - ColumnFamilyStore cfs = Keyspace.open("Keyspace1").getColumnFamilyStore("Indexed1"); + ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF_INDEX1); Mutation rm; CellName nobirthdate = cellname("notbirthdate"); CellName birthdate = cellname("birthdate"); - rm = new Mutation("Keyspace1", ByteBufferUtil.bytes("k1")); - rm.add("Indexed1", nobirthdate, ByteBufferUtil.bytes(1L), 0); - rm.add("Indexed1", birthdate, ByteBufferUtil.bytes(1L), 0); + rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("k1")); + rm.add(CF_INDEX1, nobirthdate, ByteBufferUtil.bytes(1L), 0); + rm.add(CF_INDEX1, birthdate, ByteBufferUtil.bytes(1L), 0); rm.apply(); - rm = new Mutation("Keyspace1", ByteBufferUtil.bytes("k2")); - rm.add("Indexed1", nobirthdate, ByteBufferUtil.bytes(2L), 0); - rm.add("Indexed1", birthdate, ByteBufferUtil.bytes(2L), 0); + rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("k2")); + rm.add(CF_INDEX1, nobirthdate, ByteBufferUtil.bytes(2L), 0); + rm.add(CF_INDEX1, birthdate, ByteBufferUtil.bytes(2L), 0); rm.apply(); - rm = new Mutation("Keyspace1", ByteBufferUtil.bytes("k3")); - rm.add("Indexed1", nobirthdate, ByteBufferUtil.bytes(2L), 0); - rm.add("Indexed1", birthdate, ByteBufferUtil.bytes(1L), 0); + rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("k3")); + rm.add(CF_INDEX1, nobirthdate, ByteBufferUtil.bytes(2L), 0); + rm.add(CF_INDEX1, birthdate, ByteBufferUtil.bytes(1L), 0); rm.apply(); - rm = new Mutation("Keyspace1", ByteBufferUtil.bytes("k4aaaa")); - rm.add("Indexed1", nobirthdate, ByteBufferUtil.bytes(2L), 0); - rm.add("Indexed1", birthdate, ByteBufferUtil.bytes(3L), 0); + rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("k4aaaa")); + rm.add(CF_INDEX1, nobirthdate, ByteBufferUtil.bytes(2L), 0); + rm.add(CF_INDEX1, birthdate, ByteBufferUtil.bytes(3L), 0); rm.apply(); // basic single-expression query @@ -294,12 +338,12 @@ public void testIndexScan() public void testLargeScan() { Mutation rm; - ColumnFamilyStore cfs = Keyspace.open("Keyspace1").getColumnFamilyStore("Indexed1"); + ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF_INDEX1); for (int i = 0; i < 100; i++) { - rm = new Mutation("Keyspace1", ByteBufferUtil.bytes("key" + i)); - rm.add("Indexed1", cellname("birthdate"), ByteBufferUtil.bytes(34L), 0); - rm.add("Indexed1", cellname("notbirthdate"), ByteBufferUtil.bytes((long) (i % 2)), 0); + rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("key" + i)); + rm.add(CF_INDEX1, cellname("birthdate"), ByteBufferUtil.bytes(34L), 0); + rm.add(CF_INDEX1, cellname("notbirthdate"), ByteBufferUtil.bytes((long) (i % 2)), 0); rm.applyUnsafe(); } @@ -322,11 +366,11 @@ public void testLargeScan() @Test public void testIndexDeletions() throws IOException { - ColumnFamilyStore cfs = Keyspace.open("Keyspace3").getColumnFamilyStore("Indexed1"); + ColumnFamilyStore cfs = Keyspace.open(KEYSPACE3).getColumnFamilyStore(CF_INDEX1); Mutation rm; - rm = new Mutation("Keyspace3", ByteBufferUtil.bytes("k1")); - rm.add("Indexed1", cellname("birthdate"), ByteBufferUtil.bytes(1L), 0); + rm = new Mutation(KEYSPACE3, ByteBufferUtil.bytes("k1")); + rm.add(CF_INDEX1, cellname("birthdate"), ByteBufferUtil.bytes(1L), 0); rm.apply(); IndexExpression expr = new IndexExpression(ByteBufferUtil.bytes("birthdate"), IndexExpression.Operator.EQ, ByteBufferUtil.bytes(1L)); @@ -339,8 +383,8 @@ public void testIndexDeletions() throws IOException assert "k1".equals( key ); // delete the column directly - rm = new Mutation("Keyspace3", ByteBufferUtil.bytes("k1")); - rm.delete("Indexed1", cellname("birthdate"), 1); + rm = new Mutation(KEYSPACE3, ByteBufferUtil.bytes("k1")); + rm.delete(CF_INDEX1, cellname("birthdate"), 1); rm.apply(); rows = cfs.search(range, clause, filter, 100); assert rows.isEmpty(); @@ -354,8 +398,8 @@ public void testIndexDeletions() throws IOException assert rows.isEmpty(); // resurrect w/ a newer timestamp - rm = new Mutation("Keyspace3", ByteBufferUtil.bytes("k1")); - rm.add("Indexed1", cellname("birthdate"), ByteBufferUtil.bytes(1L), 2); + rm = new Mutation(KEYSPACE3, ByteBufferUtil.bytes("k1")); + rm.add(CF_INDEX1, cellname("birthdate"), ByteBufferUtil.bytes(1L), 2); rm.apply(); rows = cfs.search(range, clause, filter, 100); assert rows.size() == 1 : StringUtils.join(rows, ","); @@ -363,8 +407,8 @@ public void testIndexDeletions() throws IOException assert "k1".equals( key ); // verify that row and delete w/ older timestamp does nothing - rm = new Mutation("Keyspace3", ByteBufferUtil.bytes("k1")); - rm.delete("Indexed1", 1); + rm = new Mutation(KEYSPACE3, ByteBufferUtil.bytes("k1")); + rm.delete(CF_INDEX1, 1); rm.apply(); rows = cfs.search(range, clause, filter, 100); assert rows.size() == 1 : StringUtils.join(rows, ","); @@ -372,8 +416,8 @@ public void testIndexDeletions() throws IOException assert "k1".equals( key ); // similarly, column delete w/ older timestamp should do nothing - rm = new Mutation("Keyspace3", ByteBufferUtil.bytes("k1")); - rm.delete("Indexed1", cellname("birthdate"), 1); + rm = new Mutation(KEYSPACE3, ByteBufferUtil.bytes("k1")); + rm.delete(CF_INDEX1, cellname("birthdate"), 1); rm.apply(); rows = cfs.search(range, clause, filter, 100); assert rows.size() == 1 : StringUtils.join(rows, ","); @@ -381,31 +425,31 @@ public void testIndexDeletions() throws IOException assert "k1".equals( key ); // delete the entire row (w/ newer timestamp this time) - rm = new Mutation("Keyspace3", ByteBufferUtil.bytes("k1")); - rm.delete("Indexed1", 3); + rm = new Mutation(KEYSPACE3, ByteBufferUtil.bytes("k1")); + rm.delete(CF_INDEX1, 3); rm.apply(); rows = cfs.search(range, clause, filter, 100); assert rows.isEmpty() : StringUtils.join(rows, ","); // make sure obsolete mutations don't generate an index entry - rm = new Mutation("Keyspace3", ByteBufferUtil.bytes("k1")); - rm.add("Indexed1", cellname("birthdate"), ByteBufferUtil.bytes(1L), 3); + rm = new Mutation(KEYSPACE3, ByteBufferUtil.bytes("k1")); + rm.add(CF_INDEX1, cellname("birthdate"), ByteBufferUtil.bytes(1L), 3); rm.apply(); rows = cfs.search(range, clause, filter, 100); assert rows.isEmpty() : StringUtils.join(rows, ","); // try insert followed by row delete in the same mutation - rm = new Mutation("Keyspace3", ByteBufferUtil.bytes("k1")); - rm.add("Indexed1", cellname("birthdate"), ByteBufferUtil.bytes(1L), 1); - rm.delete("Indexed1", 2); + rm = new Mutation(KEYSPACE3, ByteBufferUtil.bytes("k1")); + rm.add(CF_INDEX1, cellname("birthdate"), ByteBufferUtil.bytes(1L), 1); + rm.delete(CF_INDEX1, 2); rm.apply(); rows = cfs.search(range, clause, filter, 100); assert rows.isEmpty() : StringUtils.join(rows, ","); // try row delete followed by insert in the same mutation - rm = new Mutation("Keyspace3", ByteBufferUtil.bytes("k1")); - rm.delete("Indexed1", 3); - rm.add("Indexed1", cellname("birthdate"), ByteBufferUtil.bytes(1L), 4); + rm = new Mutation(KEYSPACE3, ByteBufferUtil.bytes("k1")); + rm.delete(CF_INDEX1, 3); + rm.add(CF_INDEX1, cellname("birthdate"), ByteBufferUtil.bytes(1L), 4); rm.apply(); rows = cfs.search(range, clause, filter, 100); assert rows.size() == 1 : StringUtils.join(rows, ","); @@ -416,17 +460,17 @@ public void testIndexDeletions() throws IOException @Test public void testIndexUpdate() throws IOException { - Keyspace keyspace = Keyspace.open("Keyspace2"); - ColumnFamilyStore cfs = keyspace.getColumnFamilyStore("Indexed1"); + Keyspace keyspace = Keyspace.open(KEYSPACE2); + ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF_INDEX1); CellName birthdate = cellname("birthdate"); // create a row and update the birthdate value, test that the index query fetches the new version Mutation rm; - rm = new Mutation("Keyspace2", ByteBufferUtil.bytes("k1")); - rm.add("Indexed1", birthdate, ByteBufferUtil.bytes(1L), 1); + rm = new Mutation(KEYSPACE2, ByteBufferUtil.bytes("k1")); + rm.add(CF_INDEX1, birthdate, ByteBufferUtil.bytes(1L), 1); rm.apply(); - rm = new Mutation("Keyspace2", ByteBufferUtil.bytes("k1")); - rm.add("Indexed1", birthdate, ByteBufferUtil.bytes(2L), 2); + rm = new Mutation(KEYSPACE2, ByteBufferUtil.bytes("k1")); + rm.add(CF_INDEX1, birthdate, ByteBufferUtil.bytes(2L), 2); rm.apply(); IndexExpression expr = new IndexExpression(ByteBufferUtil.bytes("birthdate"), IndexExpression.Operator.EQ, ByteBufferUtil.bytes(1L)); @@ -438,16 +482,16 @@ public void testIndexUpdate() throws IOException expr = new IndexExpression(ByteBufferUtil.bytes("birthdate"), IndexExpression.Operator.EQ, ByteBufferUtil.bytes(2L)); clause = Arrays.asList(expr); - rows = keyspace.getColumnFamilyStore("Indexed1").search(range, clause, filter, 100); + rows = keyspace.getColumnFamilyStore(CF_INDEX1).search(range, clause, filter, 100); String key = ByteBufferUtil.string(rows.get(0).key.getKey()); assert "k1".equals( key ); // update the birthdate value with an OLDER timestamp, and test that the index ignores this - rm = new Mutation("Keyspace2", ByteBufferUtil.bytes("k1")); - rm.add("Indexed1", birthdate, ByteBufferUtil.bytes(3L), 0); + rm = new Mutation(KEYSPACE2, ByteBufferUtil.bytes("k1")); + rm.add(CF_INDEX1, birthdate, ByteBufferUtil.bytes(3L), 0); rm.apply(); - rows = keyspace.getColumnFamilyStore("Indexed1").search(range, clause, filter, 100); + rows = keyspace.getColumnFamilyStore(CF_INDEX1).search(range, clause, filter, 100); key = ByteBufferUtil.string(rows.get(0).key.getKey()); assert "k1".equals( key ); @@ -457,11 +501,11 @@ public void testIndexUpdate() throws IOException public void testIndexUpdateOverwritingExpiringColumns() throws Exception { // see CASSANDRA-7268 - Keyspace keyspace = Keyspace.open("Keyspace2"); + Keyspace keyspace = Keyspace.open(KEYSPACE2); // create a row and update the birthdate value with an expiring column Mutation rm; - rm = new Mutation("Keyspace2", ByteBufferUtil.bytes("k100")); + rm = new Mutation(KEYSPACE2, ByteBufferUtil.bytes("k100")); rm.add("Indexed1", cellname("birthdate"), ByteBufferUtil.bytes(100L), 1, 1000); rm.apply(); @@ -476,7 +520,7 @@ public void testIndexUpdateOverwritingExpiringColumns() throws Exception TimeUnit.SECONDS.sleep(1); // now overwrite with the same name/value/ttl, but the local expiry time will be different - rm = new Mutation("Keyspace2", ByteBufferUtil.bytes("k100")); + rm = new Mutation(KEYSPACE2, ByteBufferUtil.bytes("k100")); rm.add("Indexed1", cellname("birthdate"), ByteBufferUtil.bytes(100L), 1, 1000); rm.apply(); @@ -484,7 +528,7 @@ public void testIndexUpdateOverwritingExpiringColumns() throws Exception assertEquals(1, rows.size()); // check that modifying the indexed value using the same timestamp behaves as expected - rm = new Mutation("Keyspace2", ByteBufferUtil.bytes("k101")); + rm = new Mutation(KEYSPACE2, ByteBufferUtil.bytes("k101")); rm.add("Indexed1", cellname("birthdate"), ByteBufferUtil.bytes(101L), 1, 1000); rm.apply(); @@ -494,7 +538,7 @@ public void testIndexUpdateOverwritingExpiringColumns() throws Exception assertEquals(1, rows.size()); TimeUnit.SECONDS.sleep(1); - rm = new Mutation("Keyspace2", ByteBufferUtil.bytes("k101")); + rm = new Mutation(KEYSPACE2, ByteBufferUtil.bytes("k101")); rm.add("Indexed1", cellname("birthdate"), ByteBufferUtil.bytes(102L), 1, 1000); rm.apply(); // search for the old value @@ -510,8 +554,8 @@ public void testIndexUpdateOverwritingExpiringColumns() throws Exception @Test public void testDeleteOfInconsistentValuesInKeysIndex() throws Exception { - String keySpace = "Keyspace2"; - String cfName = "Indexed1"; + String keySpace = KEYSPACE2; + String cfName = CF_INDEX1; Keyspace keyspace = Keyspace.open(keySpace); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfName); @@ -573,8 +617,8 @@ public void testDeleteOfInconsistentValuesInKeysIndex() throws Exception @Test public void testDeleteOfInconsistentValuesFromCompositeIndex() throws Exception { - String keySpace = "Keyspace2"; - String cfName = "Indexed2"; + String keySpace = KEYSPACE2; + String cfName = CF_INDEX2; Keyspace keyspace = Keyspace.open(keySpace); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfName); @@ -646,8 +690,8 @@ public void testDeleteOfInconsistentValuesFromCompositeIndex() throws Exception @Test public void testDeleteCompositeIndex() throws Exception { - String keySpace = "Keyspace2"; - String cfName = "Indexed3"; // has gcGrace 0 + String keySpace = KEYSPACE2; + String cfName = CF_INDEX3; // has gcGrace 0 Keyspace keyspace = Keyspace.open(keySpace); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfName); @@ -692,30 +736,30 @@ public void testDeleteCompositeIndex() throws Exception @Test public void testIndexScanWithLimitOne() { - ColumnFamilyStore cfs = Keyspace.open("Keyspace1").getColumnFamilyStore("Indexed1"); + ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF_INDEX1); Mutation rm; CellName nobirthdate = cellname("notbirthdate"); CellName birthdate = cellname("birthdate"); - rm = new Mutation("Keyspace1", ByteBufferUtil.bytes("kk1")); - rm.add("Indexed1", nobirthdate, ByteBufferUtil.bytes(1L), 0); - rm.add("Indexed1", birthdate, ByteBufferUtil.bytes(1L), 0); + rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("kk1")); + rm.add(CF_INDEX1, nobirthdate, ByteBufferUtil.bytes(1L), 0); + rm.add(CF_INDEX1, birthdate, ByteBufferUtil.bytes(1L), 0); rm.apply(); - rm = new Mutation("Keyspace1", ByteBufferUtil.bytes("kk2")); - rm.add("Indexed1", nobirthdate, ByteBufferUtil.bytes(2L), 0); - rm.add("Indexed1", birthdate, ByteBufferUtil.bytes(1L), 0); + rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("kk2")); + rm.add(CF_INDEX1, nobirthdate, ByteBufferUtil.bytes(2L), 0); + rm.add(CF_INDEX1, birthdate, ByteBufferUtil.bytes(1L), 0); rm.apply(); - rm = new Mutation("Keyspace1", ByteBufferUtil.bytes("kk3")); - rm.add("Indexed1", nobirthdate, ByteBufferUtil.bytes(2L), 0); - rm.add("Indexed1", birthdate, ByteBufferUtil.bytes(1L), 0); + rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("kk3")); + rm.add(CF_INDEX1, nobirthdate, ByteBufferUtil.bytes(2L), 0); + rm.add(CF_INDEX1, birthdate, ByteBufferUtil.bytes(1L), 0); rm.apply(); - rm = new Mutation("Keyspace1", ByteBufferUtil.bytes("kk4")); - rm.add("Indexed1", nobirthdate, ByteBufferUtil.bytes(2L), 0); - rm.add("Indexed1", birthdate, ByteBufferUtil.bytes(1L), 0); + rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("kk4")); + rm.add(CF_INDEX1, nobirthdate, ByteBufferUtil.bytes(2L), 0); + rm.add(CF_INDEX1, birthdate, ByteBufferUtil.bytes(1L), 0); rm.apply(); // basic single-expression query @@ -733,13 +777,13 @@ public void testIndexScanWithLimitOne() @Test public void testIndexCreate() throws IOException, InterruptedException, ExecutionException { - Keyspace keyspace = Keyspace.open("Keyspace1"); - ColumnFamilyStore cfs = keyspace.getColumnFamilyStore("Indexed2"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); + ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF_INDEX2); // create a row and update the birthdate value, test that the index query fetches the new version Mutation rm; - rm = new Mutation("Keyspace1", ByteBufferUtil.bytes("k1")); - rm.add("Indexed2", cellname("birthdate"), ByteBufferUtil.bytes(1L), 1); + rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("k1")); + rm.add(CF_INDEX2, cellname("birthdate"), ByteBufferUtil.bytes(1L), 1); rm.apply(); ColumnDefinition old = cfs.metadata.getColumnDefinition(ByteBufferUtil.bytes("birthdate")); @@ -767,7 +811,7 @@ private void queryBirthdate(Keyspace keyspace) throws CharacterCodingException IndexExpression expr = new IndexExpression(ByteBufferUtil.bytes("birthdate"), IndexExpression.Operator.EQ, ByteBufferUtil.bytes(1L)); List clause = Arrays.asList(expr); IDiskAtomFilter filter = new IdentityQueryFilter(); - List rows = keyspace.getColumnFamilyStore("Indexed2").search(Util.range("", ""), clause, filter, 100); + List rows = keyspace.getColumnFamilyStore(CF_INDEX2).search(Util.range("", ""), clause, filter, 100); assert rows.size() == 1 : StringUtils.join(rows, ","); assertEquals("k1", ByteBufferUtil.string(rows.get(0).key.getKey())); } @@ -775,19 +819,19 @@ private void queryBirthdate(Keyspace keyspace) throws CharacterCodingException @Test public void testCassandra6778() throws CharacterCodingException { - String cfname = "StandardInteger1"; - Keyspace keyspace = Keyspace.open("Keyspace1"); + String cfname = CF_STANDARDINT; + Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfname); // insert two columns that represent the same integer but have different binary forms (the // second one is padded with extra zeros) - Mutation rm = new Mutation("Keyspace1", ByteBufferUtil.bytes("k1")); + Mutation rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("k1")); CellName column1 = cellname(ByteBuffer.wrap(new byte[]{1})); rm.add(cfname, column1, ByteBufferUtil.bytes("data1"), 1); rm.apply(); cfs.forceBlockingFlush(); - rm = new Mutation("Keyspace1", ByteBufferUtil.bytes("k1")); + rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("k1")); CellName column2 = cellname(ByteBuffer.wrap(new byte[]{0, 0, 1})); rm.add(cfname, column2, ByteBufferUtil.bytes("data2"), 2); rm.apply(); @@ -795,7 +839,7 @@ public void testCassandra6778() throws CharacterCodingException // fetch by the first column name; we should get the second version of the column value SliceByNamesReadCommand cmd = new SliceByNamesReadCommand( - "Keyspace1", ByteBufferUtil.bytes("k1"), cfname, System.currentTimeMillis(), + KEYSPACE1, ByteBufferUtil.bytes("k1"), cfname, System.currentTimeMillis(), new NamesQueryFilter(FBUtilities.singleton(column1, cfs.getComparator()))); ColumnFamily cf = cmd.getRow(keyspace).cf; @@ -806,7 +850,7 @@ public void testCassandra6778() throws CharacterCodingException // fetch by the second column name; we should get the second version of the column value cmd = new SliceByNamesReadCommand( - "Keyspace1", ByteBufferUtil.bytes("k1"), cfname, System.currentTimeMillis(), + KEYSPACE1, ByteBufferUtil.bytes("k1"), cfname, System.currentTimeMillis(), new NamesQueryFilter(FBUtilities.singleton(column2, cfs.getComparator()))); cf = cmd.getRow(keyspace).cf; @@ -832,8 +876,8 @@ public void testInclusiveBounds() @Test public void testDeleteSuperRowSticksAfterFlush() throws Throwable { - String keyspaceName = "Keyspace1"; - String cfName= "Super1"; + String keyspaceName = KEYSPACE1; + String cfName= CF_SUPER1; ByteBuffer scfName = ByteBufferUtil.bytes("SuperDuper"); Keyspace keyspace = Keyspace.open(keyspaceName); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfName); @@ -933,8 +977,8 @@ private static void putColsStandard(ColumnFamilyStore cfs, DecoratedKey key, Cel public void testDeleteStandardRowSticksAfterFlush() throws Throwable { // test to make sure flushing after a delete doesn't resurrect delted cols. - String keyspaceName = "Keyspace1"; - String cfName = "Standard1"; + String keyspaceName = KEYSPACE1; + String cfName = CF_STANDARD1; Keyspace keyspace = Keyspace.open(keyspaceName); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfName); DecoratedKey key = Util.dk("f-flush-resurrection"); @@ -988,16 +1032,16 @@ public void testDeleteStandardRowSticksAfterFlush() throws Throwable private ColumnFamilyStore insertKey1Key2() { - ColumnFamilyStore cfs = Keyspace.open("Keyspace2").getColumnFamilyStore("Standard1"); + ColumnFamilyStore cfs = Keyspace.open(KEYSPACE2).getColumnFamilyStore(CF_STANDARD1); List rms = new LinkedList<>(); Mutation rm; - rm = new Mutation("Keyspace2", ByteBufferUtil.bytes("key1")); - rm.add("Standard1", cellname("Column1"), ByteBufferUtil.bytes("asdf"), 0); + rm = new Mutation(KEYSPACE2, ByteBufferUtil.bytes("key1")); + rm.add(CF_STANDARD1, cellname("Column1"), ByteBufferUtil.bytes("asdf"), 0); rms.add(rm); Util.writeColumnFamily(rms); - rm = new Mutation("Keyspace2", ByteBufferUtil.bytes("key2")); - rm.add("Standard1", cellname("Column1"), ByteBufferUtil.bytes("asdf"), 0); + rm = new Mutation(KEYSPACE2, ByteBufferUtil.bytes("key2")); + rm.add(CF_STANDARD1, cellname("Column1"), ByteBufferUtil.bytes("asdf"), 0); rms.add(rm); return Util.writeColumnFamily(rms); } @@ -1009,8 +1053,8 @@ public void testBackupAfterFlush() throws Throwable for (int version = 1; version <= 2; ++version) { - Descriptor existing = new Descriptor(cfs.directories.getDirectoryForNewSSTables(), "Keyspace2", "Standard1", version, Descriptor.Type.FINAL); - Descriptor desc = new Descriptor(Directories.getBackupsDirectory(existing), "Keyspace2", "Standard1", version, Descriptor.Type.FINAL); + Descriptor existing = new Descriptor(cfs.directories.getDirectoryForNewSSTables(), KEYSPACE2, CF_STANDARD1, version, Descriptor.Type.FINAL); + Descriptor desc = new Descriptor(Directories.getBackupsDirectory(existing), KEYSPACE2, CF_STANDARD1, version, Descriptor.Type.FINAL); for (Component c : new Component[]{ Component.DATA, Component.PRIMARY_INDEX, Component.FILTER, Component.STATS }) assertTrue("can not find backedup file:" + desc.filenameFor(c), new File(desc.filenameFor(c)).exists()); } @@ -1020,8 +1064,8 @@ public void testBackupAfterFlush() throws Throwable @Test public void testSliceByNamesCommandOnUUIDTypeSCF() throws Throwable { - String keyspaceName = "Keyspace1"; - String cfName = "Super6"; + String keyspaceName = KEYSPACE1; + String cfName = CF_SUPER6; ByteBuffer superColName = LexicalUUIDType.instance.fromString("a4ed3562-0e8e-4b41-bdfd-c45a2774682d"); Keyspace keyspace = Keyspace.open(keyspaceName); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfName); @@ -1051,8 +1095,8 @@ public void testSliceByNamesCommandOnUUIDTypeSCF() throws Throwable @Test public void testSliceByNamesCommandOldMetadata() throws Throwable { - String keyspaceName = "Keyspace1"; - String cfName= "Standard1"; + String keyspaceName = KEYSPACE1; + String cfName= CF_STANDARD1; DecoratedKey key = Util.dk("slice-name-old-metadata"); CellName cname = cellname("c1"); Keyspace keyspace = Keyspace.open(keyspaceName); @@ -1081,7 +1125,7 @@ public void testSliceByNamesCommandOldMetadata() throws Throwable Cell cell = cf.getColumn(cname); assert cell.value().equals(ByteBufferUtil.bytes("a")) : "expecting a, got " + ByteBufferUtil.string(cell.value()); - Keyspace.clear("Keyspace1"); // CASSANDRA-7195 + Keyspace.clear(KEYSPACE1); // CASSANDRA-7195 } private static void assertTotalColCount(Collection rows, int expectedCount) @@ -1098,8 +1142,8 @@ private static void assertTotalColCount(Collection rows, int expectedCount) @Test public void testRangeSliceColumnsLimit() throws Throwable { - String keyspaceName = "Keyspace1"; - String cfName = "Standard1"; + String keyspaceName = KEYSPACE1; + String cfName = CF_STANDARD1; Keyspace keyspace = Keyspace.open(keyspaceName); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfName); cfs.clearUnsafe(); @@ -1214,8 +1258,8 @@ public void testRangeSliceColumnsLimit() throws Throwable @Test public void testRangeSlicePaging() throws Throwable { - String keyspaceName = "Keyspace1"; - String cfName = "Standard1"; + String keyspaceName = KEYSPACE1; + String cfName = CF_STANDARD1; Keyspace keyspace = Keyspace.open(keyspaceName); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfName); cfs.clearUnsafe(); @@ -1350,8 +1394,8 @@ private static DecoratedKey idk(int i) @Test public void testRangeSliceInclusionExclusion() throws Throwable { - String keyspaceName = "Keyspace1"; - String cfName = "Standard1"; + String keyspaceName = KEYSPACE1; + String cfName = CF_STANDARD1; Keyspace keyspace = Keyspace.open(keyspaceName); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfName); cfs.clearUnsafe(); @@ -1404,16 +1448,16 @@ public void testRangeSliceInclusionExclusion() throws Throwable public void testKeysSearcher() throws Exception { // Create secondary index and flush to disk - Keyspace keyspace = Keyspace.open("Keyspace1"); - ColumnFamilyStore store = keyspace.getColumnFamilyStore("Indexed1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); + ColumnFamilyStore store = keyspace.getColumnFamilyStore(CF_INDEX1); store.truncateBlocking(); for (int i = 0; i < 10; i++) { ByteBuffer key = ByteBufferUtil.bytes(String.valueOf("k" + i)); - Mutation rm = new Mutation("Keyspace1", key); - rm.add("Indexed1", cellname("birthdate"), LongType.instance.decompose(1L), System.currentTimeMillis()); + Mutation rm = new Mutation(KEYSPACE1, key); + rm.add(CF_INDEX1, cellname("birthdate"), LongType.instance.decompose(1L), System.currentTimeMillis()); rm.apply(); } @@ -1446,8 +1490,8 @@ public void testMultiRangeSomeEmptyNoIndex() throws Throwable new ColumnSlice(cellname("colE"), cellname("colC")), new ColumnSlice(cellname("colA"), Composites.EMPTY) }; - String tableName = "Keyspace1"; - String cfName = "Standard1"; + String tableName = KEYSPACE1; + String cfName = CF_STANDARD1; Keyspace table = Keyspace.open(tableName); ColumnFamilyStore cfs = table.getColumnFamilyStore(cfName); cfs.clearUnsafe(); @@ -1495,8 +1539,8 @@ public void testMultiRangeSomeEmptyIndexed() throws Throwable new ColumnSlice(cellname("colE"), cellname("colC")), new ColumnSlice(cellname("colA"), Composites.EMPTY) }; - String tableName = "Keyspace1"; - String cfName = "Standard1"; + String tableName = KEYSPACE1; + String cfName = CF_STANDARD1; Keyspace table = Keyspace.open(tableName); ColumnFamilyStore cfs = table.getColumnFamilyStore(cfName); cfs.clearUnsafe(); @@ -1544,8 +1588,8 @@ public void testMultiRangeContiguousNoIndex() throws Throwable new ColumnSlice(cellname("colE"), cellname("colC")), new ColumnSlice(cellname("colA"), Composites.EMPTY) }; - String tableName = "Keyspace1"; - String cfName = "Standard1"; + String tableName = KEYSPACE1; + String cfName = CF_STANDARD1; Keyspace table = Keyspace.open(tableName); ColumnFamilyStore cfs = table.getColumnFamilyStore(cfName); cfs.clearUnsafe(); @@ -1594,8 +1638,8 @@ public void testMultiRangeContiguousIndexed() throws Throwable new ColumnSlice(cellname("colE"), cellname("colC")), new ColumnSlice(cellname("colA"), Composites.EMPTY) }; - String tableName = "Keyspace1"; - String cfName = "Standard1"; + String tableName = KEYSPACE1; + String cfName = CF_STANDARD1; Keyspace table = Keyspace.open(tableName); ColumnFamilyStore cfs = table.getColumnFamilyStore(cfName); cfs.clearUnsafe(); @@ -1642,8 +1686,8 @@ public void testMultiRangeIndexed() throws Throwable new ColumnSlice(cellname("colE"), cellname("colC")), new ColumnSlice(cellname("colA"), Composites.EMPTY) }; - String keyspaceName = "Keyspace1"; - String cfName = "Standard1"; + String keyspaceName = KEYSPACE1; + String cfName = CF_STANDARD1; Keyspace keyspace = Keyspace.open(keyspaceName); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfName); cfs.clearUnsafe(); @@ -1709,8 +1753,8 @@ public void testMultipleRangesSlicesInMemory() throws Throwable @Test public void testRemoveUnfinishedCompactionLeftovers() throws Throwable { - String ks = "Keyspace1"; - String cf = "Standard3"; // should be empty + String ks = KEYSPACE1; + String cf = CF_STANDARD3; // should be empty final CFMetaData cfmeta = Schema.instance.getCFMetaData(ks, cf); Directories dir = new Directories(cfmeta); @@ -1775,8 +1819,8 @@ protected SSTableWriter getWriter() @Test public void testFailedToRemoveUnfinishedCompactionLeftovers() throws Throwable { - final String ks = "Keyspace1"; - final String cf = "Standard4"; // should be empty + final String ks = KEYSPACE1; + final String cf = CF_STANDARD4; // should be empty final CFMetaData cfmeta = Schema.instance.getCFMetaData(ks, cf); Directories dir = new Directories(cfmeta); @@ -1827,8 +1871,8 @@ protected SSTableWriter getWriter() @Test public void testLoadNewSSTablesAvoidsOverwrites() throws Throwable { - String ks = "Keyspace1"; - String cf = "Standard1"; + String ks = KEYSPACE1; + String cf = CF_STANDARD1; ColumnFamilyStore cfs = Keyspace.open(ks).getColumnFamilyStore(cf); cfs.truncateBlocking(); SSTableDeletingTask.waitForDeletions(); @@ -1903,8 +1947,8 @@ public void testLoadNewSSTablesAvoidsOverwrites() throws Throwable private ColumnFamilyStore prepareMultiRangeSlicesTest(int valueSize, boolean flush) throws Throwable { - String keyspaceName = "Keyspace1"; - String cfName = "Standard1"; + String keyspaceName = KEYSPACE1; + String cfName = CF_STANDARD1; Keyspace keyspace = Keyspace.open(keyspaceName); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfName); cfs.clearUnsafe(); @@ -2167,7 +2211,7 @@ private void printRow(ColumnFamilyStore cfs, String rowKey, Collection col { DecoratedKey ROW = Util.dk(rowKey); System.err.println("Original:"); - ColumnFamily cf = cfs.getColumnFamily(QueryFilter.getIdentityFilter(ROW, "Standard1", System.currentTimeMillis())); + ColumnFamily cf = cfs.getColumnFamily(QueryFilter.getIdentityFilter(ROW, CF_STANDARD1, System.currentTimeMillis())); System.err.println("Row key: " + rowKey + " Cols: " + Iterables.transform(cf.getSortedColumns(), new Function() { diff --git a/test/unit/org/apache/cassandra/db/ColumnFamilyTest.java b/test/unit/org/apache/cassandra/db/ColumnFamilyTest.java index 69a851e68b27..2cae90aa2a8a 100644 --- a/test/unit/org/apache/cassandra/db/ColumnFamilyTest.java +++ b/test/unit/org/apache/cassandra/db/ColumnFamilyTest.java @@ -25,13 +25,20 @@ import java.util.TreeMap; import com.google.common.collect.Iterables; +import org.apache.cassandra.config.CFMetaData; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; +import org.apache.cassandra.config.KSMetaData; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.db.composites.CellName; import org.apache.cassandra.db.context.CounterContext; +import org.apache.cassandra.db.marshal.BytesType; +import org.apache.cassandra.db.marshal.CounterColumnType; import org.apache.cassandra.io.sstable.ColumnStats; import org.apache.cassandra.io.util.DataOutputBuffer; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.CounterId; @@ -45,9 +52,24 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -public class ColumnFamilyTest extends SchemaLoader +public class ColumnFamilyTest { static int version = MessagingService.current_version; + private static final String KEYSPACE1 = "Keyspace1"; + private static final String CF_STANDARD1 = "Standard1"; + private static final String CF_COUNTER1 = "Counter1"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1), + CFMetaData.denseCFMetaData(KEYSPACE1, CF_COUNTER1, BytesType.instance) + .defaultValidator(CounterColumnType.instance)); + } // TODO test SuperColumns more @@ -56,7 +78,7 @@ public void testSingleColumn() throws IOException { ColumnFamily cf; - cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, CF_STANDARD1); cf.addColumn(column("C", "v", 1)); DataOutputBuffer bufOut = new DataOutputBuffer(); ColumnFamily.serializer.serialize(cf, bufOut, version); @@ -64,7 +86,7 @@ public void testSingleColumn() throws IOException ByteArrayInputStream bufIn = new ByteArrayInputStream(bufOut.getData(), 0, bufOut.getLength()); cf = ColumnFamily.serializer.deserialize(new DataInputStream(bufIn), version); assert cf != null; - assert cf.metadata().cfName.equals("Standard1"); + assert cf.metadata().cfName.equals(CF_STANDARD1); assert cf.getSortedColumns().size() == 1; } @@ -80,7 +102,7 @@ public void testManyColumns() throws IOException } // write - cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, CF_STANDARD1); DataOutputBuffer bufOut = new DataOutputBuffer(); for (String cName : map.navigableKeySet()) { @@ -102,7 +124,7 @@ public void testManyColumns() throws IOException @Test public void testGetColumnCount() { - ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, CF_STANDARD1); cf.addColumn(column("col1", "", 1)); cf.addColumn(column("col2", "", 2)); @@ -115,8 +137,8 @@ public void testGetColumnCount() @Test public void testDigest() { - ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); - ColumnFamily cf2 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, CF_STANDARD1); + ColumnFamily cf2 = ArrayBackedSortedColumns.factory.create(KEYSPACE1, CF_STANDARD1); ByteBuffer digest = ColumnFamily.digest(cf); @@ -157,7 +179,7 @@ public void testDigest() @Test public void testTimestamp() { - ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, CF_STANDARD1); cf.addColumn(column("col1", "val1", 2)); cf.addColumn(column("col1", "val2", 2)); // same timestamp, new value @@ -169,9 +191,9 @@ public void testTimestamp() @Test public void testMergeAndAdd() { - ColumnFamily cf_new = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); - ColumnFamily cf_old = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); - ColumnFamily cf_result = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf_new = ArrayBackedSortedColumns.factory.create(KEYSPACE1, CF_STANDARD1); + ColumnFamily cf_old = ArrayBackedSortedColumns.factory.create(KEYSPACE1, CF_STANDARD1); + ColumnFamily cf_result = ArrayBackedSortedColumns.factory.create(KEYSPACE1, CF_STANDARD1); ByteBuffer val = ByteBufferUtil.bytes("sample value"); ByteBuffer val2 = ByteBufferUtil.bytes("x value "); @@ -207,7 +229,7 @@ public void testColumnStatsRecordsRowDeletesCorrectly() long timestamp = System.currentTimeMillis(); int localDeletionTime = (int) (System.currentTimeMillis() / 1000); - ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, CF_STANDARD1); cf.delete(new DeletionInfo(timestamp, localDeletionTime)); ColumnStats stats = cf.getColumnStats(); assertEquals(timestamp, stats.maxTimestamp); @@ -240,14 +262,14 @@ public void testCounterDeletion() assertTrue(counter.reconcile(tombstone) == tombstone); // check that a range tombstone overrides the counter cell, even with a lower timestamp than the counter - ColumnFamily cf0 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Counter1"); + ColumnFamily cf0 = ArrayBackedSortedColumns.factory.create(KEYSPACE1, CF_COUNTER1); cf0.addColumn(counter); cf0.delete(new RangeTombstone(cellname("counter0"), cellname("counter2"), 0L, (int) (System.currentTimeMillis() / 1000))); assertTrue(cf0.deletionInfo().isDeleted(counter)); assertTrue(cf0.deletionInfo().inOrderTester(false).isDeleted(counter)); // check that a top-level deletion info overrides the counter cell, even with a lower timestamp than the counter - ColumnFamily cf1 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Counter1"); + ColumnFamily cf1 = ArrayBackedSortedColumns.factory.create(KEYSPACE1, CF_COUNTER1); cf1.addColumn(counter); cf1.delete(new DeletionInfo(0L, (int) (System.currentTimeMillis() / 1000))); assertTrue(cf1.deletionInfo().isDeleted(counter)); diff --git a/test/unit/org/apache/cassandra/db/CommitLogTest.java b/test/unit/org/apache/cassandra/db/CommitLogTest.java index c4a1fe14e28e..7e308676487f 100644 --- a/test/unit/org/apache/cassandra/db/CommitLogTest.java +++ b/test/unit/org/apache/cassandra/db/CommitLogTest.java @@ -26,22 +26,41 @@ import java.util.zip.Checksum; import org.junit.Assert; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; import org.apache.cassandra.config.Config; import org.apache.cassandra.config.DatabaseDescriptor; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.commitlog.CommitLog; import org.apache.cassandra.db.commitlog.CommitLogDescriptor; import org.apache.cassandra.db.commitlog.CommitLogSegment; import org.apache.cassandra.db.composites.CellName; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.net.MessagingService; import static org.apache.cassandra.utils.ByteBufferUtil.bytes; -public class CommitLogTest extends SchemaLoader +public class CommitLogTest { + private static final String KEYSPACE1 = "CommitLogTest"; + private static final String CF1 = "Standard1"; + private static final String CF2 = "Standard2"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF1), + SchemaLoader.standardCFMD(KEYSPACE1, CF2)); + } + @Test public void testRecoveryWithEmptyLog() throws Exception { @@ -102,8 +121,8 @@ public void testDontDeleteIfDirty() throws Exception { CommitLog.instance.resetUnsafe(); // Roughly 32 MB mutation - Mutation rm = new Mutation("Keyspace1", bytes("k")); - rm.add("Standard1", Util.cellname("c1"), ByteBuffer.allocate(DatabaseDescriptor.getCommitLogSegmentSize()/4), 0); + Mutation rm = new Mutation(KEYSPACE1, bytes("k")); + rm.add(CF1, Util.cellname("c1"), ByteBuffer.allocate(DatabaseDescriptor.getCommitLogSegmentSize()/4), 0); // Adding it 5 times CommitLog.instance.add(rm); @@ -113,8 +132,8 @@ public void testDontDeleteIfDirty() throws Exception CommitLog.instance.add(rm); // Adding new mutation on another CF - Mutation rm2 = new Mutation("Keyspace1", bytes("k")); - rm2.add("Standard2", Util.cellname("c1"), ByteBuffer.allocate(4), 0); + Mutation rm2 = new Mutation(KEYSPACE1, bytes("k")); + rm2.add(CF2, Util.cellname("c1"), ByteBuffer.allocate(4), 0); CommitLog.instance.add(rm2); assert CommitLog.instance.activeSegments() == 2 : "Expecting 2 segments, got " + CommitLog.instance.activeSegments(); @@ -132,8 +151,8 @@ public void testDeleteIfNotDirty() throws Exception DatabaseDescriptor.getCommitLogSegmentSize(); CommitLog.instance.resetUnsafe(); // Roughly 32 MB mutation - Mutation rm = new Mutation("Keyspace1", bytes("k")); - rm.add("Standard1", Util.cellname("c1"), ByteBuffer.allocate((DatabaseDescriptor.getCommitLogSegmentSize()/4) - 1), 0); + Mutation rm = new Mutation(KEYSPACE1, bytes("k")); + rm.add(CF1, Util.cellname("c1"), ByteBuffer.allocate((DatabaseDescriptor.getCommitLogSegmentSize()/4) - 1), 0); // Adding it twice (won't change segment) CommitLog.instance.add(rm); @@ -149,8 +168,8 @@ public void testDeleteIfNotDirty() throws Exception assert CommitLog.instance.activeSegments() == 1 : "Expecting 1 segment, got " + CommitLog.instance.activeSegments(); // Adding new mutation on another CF, large enough (including CL entry overhead) that a new segment is created - Mutation rm2 = new Mutation("Keyspace1", bytes("k")); - rm2.add("Standard2", Util.cellname("c1"), ByteBuffer.allocate((DatabaseDescriptor.getCommitLogSegmentSize()/2) - 100), 0); + Mutation rm2 = new Mutation(KEYSPACE1, bytes("k")); + rm2.add(CF2, Util.cellname("c1"), ByteBuffer.allocate((DatabaseDescriptor.getCommitLogSegmentSize()/2) - 100), 0); CommitLog.instance.add(rm2); // also forces a new segment, since each entry-with-overhead is just under half the CL size CommitLog.instance.add(rm2); @@ -172,7 +191,7 @@ public void testDeleteIfNotDirty() throws Exception private static int getMaxRecordDataSize(String keyspace, ByteBuffer key, String table, CellName column) { Mutation rm = new Mutation(keyspace, bytes("k")); - rm.add("Standard1", Util.cellname("c1"), ByteBuffer.allocate(0), 0); + rm.add(CF1, Util.cellname("c1"), ByteBuffer.allocate(0), 0); int max = (DatabaseDescriptor.getCommitLogSegmentSize() / 2); max -= CommitLogSegment.ENTRY_OVERHEAD_SIZE; // log entry overhead @@ -181,7 +200,7 @@ private static int getMaxRecordDataSize(String keyspace, ByteBuffer key, String private static int getMaxRecordDataSize() { - return getMaxRecordDataSize("Keyspace1", bytes("k"), "Standard1", Util.cellname("c1")); + return getMaxRecordDataSize(KEYSPACE1, bytes("k"), CF1, Util.cellname("c1")); } // CASSANDRA-3615 @@ -190,8 +209,8 @@ public void testEqualRecordLimit() throws Exception { CommitLog.instance.resetUnsafe(); - Mutation rm = new Mutation("Keyspace1", bytes("k")); - rm.add("Standard1", Util.cellname("c1"), ByteBuffer.allocate(getMaxRecordDataSize()), 0); + Mutation rm = new Mutation(KEYSPACE1, bytes("k")); + rm.add(CF1, Util.cellname("c1"), ByteBuffer.allocate(getMaxRecordDataSize()), 0); CommitLog.instance.add(rm); } @@ -201,8 +220,8 @@ public void testExceedRecordLimit() throws Exception CommitLog.instance.resetUnsafe(); try { - Mutation rm = new Mutation("Keyspace1", bytes("k")); - rm.add("Standard1", Util.cellname("c1"), ByteBuffer.allocate(1 + getMaxRecordDataSize()), 0); + Mutation rm = new Mutation(KEYSPACE1, bytes("k")); + rm.add(CF1, Util.cellname("c1"), ByteBuffer.allocate(1 + getMaxRecordDataSize()), 0); CommitLog.instance.add(rm); throw new AssertionError("mutation larger than limit was accepted"); } diff --git a/test/unit/org/apache/cassandra/db/CounterCacheTest.java b/test/unit/org/apache/cassandra/db/CounterCacheTest.java index cb2d97ab8e77..71f8b2033693 100644 --- a/test/unit/org/apache/cassandra/db/CounterCacheTest.java +++ b/test/unit/org/apache/cassandra/db/CounterCacheTest.java @@ -20,10 +20,15 @@ import java.util.concurrent.ExecutionException; import org.junit.AfterClass; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; +import org.apache.cassandra.config.KSMetaData; +import org.apache.cassandra.db.marshal.CounterColumnType; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.WriteTimeoutException; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.service.CacheService; import org.apache.cassandra.utils.FBUtilities; @@ -33,21 +38,31 @@ import static org.apache.cassandra.Util.cellname; import static org.apache.cassandra.utils.ByteBufferUtil.bytes; -public class CounterCacheTest extends SchemaLoader +public class CounterCacheTest { - private static final String KS = "CounterCacheSpace"; + private static final String KEYSPACE1 = "CounterCacheTest"; private static final String CF = "Counter1"; + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF).defaultValidator(CounterColumnType.instance)); + } + @AfterClass public static void cleanup() { - cleanupSavedCaches(); + SchemaLoader.cleanupSavedCaches(); } @Test public void testReadWrite() { - ColumnFamilyStore cfs = Keyspace.open(KS).getColumnFamilyStore(CF); + ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF); CacheService.instance.invalidateCounterCache(); assertEquals(0, CacheService.instance.counterCache.size()); @@ -71,14 +86,14 @@ public void testReadWrite() @Test public void testSaveLoad() throws ExecutionException, InterruptedException, WriteTimeoutException { - ColumnFamilyStore cfs = Keyspace.open(KS).getColumnFamilyStore(CF); + ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF); CacheService.instance.invalidateCounterCache(); ColumnFamily cells = ArrayBackedSortedColumns.factory.create(cfs.metadata); cells.addColumn(new BufferCounterUpdateCell(cellname(1), 1L, FBUtilities.timestampMicros())); cells.addColumn(new BufferCounterUpdateCell(cellname(2), 2L, FBUtilities.timestampMicros())); - new CounterMutation(new Mutation(KS, bytes(1), cells), ConsistencyLevel.ONE).apply(); - new CounterMutation(new Mutation(KS, bytes(2), cells), ConsistencyLevel.ONE).apply(); + new CounterMutation(new Mutation(KEYSPACE1, bytes(1), cells), ConsistencyLevel.ONE).apply(); + new CounterMutation(new Mutation(KEYSPACE1, bytes(2), cells), ConsistencyLevel.ONE).apply(); // flush the counter cache and invalidate CacheService.instance.counterCache.submitWrite(Integer.MAX_VALUE).get(); diff --git a/test/unit/org/apache/cassandra/db/CounterCellTest.java b/test/unit/org/apache/cassandra/db/CounterCellTest.java index 21826d22cf08..6b4c6367acfd 100644 --- a/test/unit/org/apache/cassandra/db/CounterCellTest.java +++ b/test/unit/org/apache/cassandra/db/CounterCellTest.java @@ -41,7 +41,7 @@ import static org.apache.cassandra.Util.cellname; import static org.apache.cassandra.db.context.CounterContext.ContextState; -public class CounterCellTest extends SchemaLoader +public class CounterCellTest { private static final CounterContext cc = new CounterContext(); diff --git a/test/unit/org/apache/cassandra/db/CounterMutationTest.java b/test/unit/org/apache/cassandra/db/CounterMutationTest.java index 431531c4733c..0aa33c506018 100644 --- a/test/unit/org/apache/cassandra/db/CounterMutationTest.java +++ b/test/unit/org/apache/cassandra/db/CounterMutationTest.java @@ -19,12 +19,17 @@ import java.nio.ByteBuffer; +import org.junit.BeforeClass; import org.junit.Test; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.db.context.CounterContext; import org.apache.cassandra.db.filter.QueryFilter; +import org.apache.cassandra.db.marshal.CounterColumnType; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.WriteTimeoutException; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.FBUtilities; import static org.junit.Assert.assertEquals; @@ -34,36 +39,47 @@ import static org.apache.cassandra.Util.dk; import static org.apache.cassandra.utils.ByteBufferUtil.bytes; -public class CounterMutationTest extends SchemaLoader +public class CounterMutationTest { - private static final String KS = "CounterCacheSpace"; + private static final String KEYSPACE1 = "CounterMutationTest"; private static final String CF1 = "Counter1"; private static final String CF2 = "Counter2"; + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF1).defaultValidator(CounterColumnType.instance), + SchemaLoader.standardCFMD(KEYSPACE1, CF2).defaultValidator(CounterColumnType.instance)); + } + @Test public void testSingleCell() throws WriteTimeoutException { - ColumnFamilyStore cfs = Keyspace.open(KS).getColumnFamilyStore(CF1); + ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF1); cfs.truncateBlocking(); // Do the initial update (+1) ColumnFamily cells = ArrayBackedSortedColumns.factory.create(cfs.metadata); cells.addCounter(cellname(1), 1L); - new CounterMutation(new Mutation(KS, bytes(1), cells), ConsistencyLevel.ONE).apply(); + new CounterMutation(new Mutation(KEYSPACE1, bytes(1), cells), ConsistencyLevel.ONE).apply(); ColumnFamily current = cfs.getColumnFamily(QueryFilter.getIdentityFilter(dk(bytes(1)), CF1, System.currentTimeMillis())); assertEquals(1L, CounterContext.instance().total(current.getColumn(cellname(1)).value())); // Make another increment (+2) cells = ArrayBackedSortedColumns.factory.create(cfs.metadata); cells.addCounter(cellname(1), 2L); - new CounterMutation(new Mutation(KS, bytes(1), cells), ConsistencyLevel.ONE).apply(); + new CounterMutation(new Mutation(KEYSPACE1, bytes(1), cells), ConsistencyLevel.ONE).apply(); current = cfs.getColumnFamily(QueryFilter.getIdentityFilter(dk(bytes(1)), CF1, System.currentTimeMillis())); assertEquals(3L, CounterContext.instance().total(current.getColumn(cellname(1)).value())); // Decrement to 0 (-3) cells = ArrayBackedSortedColumns.factory.create(cfs.metadata); cells.addCounter(cellname(1), -3L); - new CounterMutation(new Mutation(KS, bytes(1), cells), ConsistencyLevel.ONE).apply(); + new CounterMutation(new Mutation(KEYSPACE1, bytes(1), cells), ConsistencyLevel.ONE).apply(); current = cfs.getColumnFamily(QueryFilter.getIdentityFilter(dk(bytes(1)), CF1, System.currentTimeMillis())); assertEquals(0L, CounterContext.instance().total(current.getColumn(cellname(1)).value())); assertEquals(ClockAndCount.create(3L, 0L), cfs.getCachedCounter(bytes(1), cellname(1))); @@ -72,14 +88,14 @@ public void testSingleCell() throws WriteTimeoutException @Test public void testTwoCells() throws WriteTimeoutException { - ColumnFamilyStore cfs = Keyspace.open(KS).getColumnFamilyStore(CF1); + ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF1); cfs.truncateBlocking(); // Do the initial update (+1, -1) ColumnFamily cells = ArrayBackedSortedColumns.factory.create(cfs.metadata); cells.addCounter(cellname(1), 1L); cells.addCounter(cellname(2), -1L); - new CounterMutation(new Mutation(KS, bytes(1), cells), ConsistencyLevel.ONE).apply(); + new CounterMutation(new Mutation(KEYSPACE1, bytes(1), cells), ConsistencyLevel.ONE).apply(); ColumnFamily current = cfs.getColumnFamily(QueryFilter.getIdentityFilter(dk(bytes(1)), CF1, System.currentTimeMillis())); assertEquals(1L, CounterContext.instance().total(current.getColumn(cellname(1)).value())); assertEquals(-1L, CounterContext.instance().total(current.getColumn(cellname(2)).value())); @@ -88,7 +104,7 @@ public void testTwoCells() throws WriteTimeoutException cells = ArrayBackedSortedColumns.factory.create(cfs.metadata); cells.addCounter(cellname(1), 2L); cells.addCounter(cellname(2), -2L); - new CounterMutation(new Mutation(KS, bytes(1), cells), ConsistencyLevel.ONE).apply(); + new CounterMutation(new Mutation(KEYSPACE1, bytes(1), cells), ConsistencyLevel.ONE).apply(); current = cfs.getColumnFamily(QueryFilter.getIdentityFilter(dk(bytes(1)), CF1, System.currentTimeMillis())); assertEquals(3L, CounterContext.instance().total(current.getColumn(cellname(1)).value())); @@ -96,7 +112,7 @@ public void testTwoCells() throws WriteTimeoutException cells = ArrayBackedSortedColumns.factory.create(cfs.metadata); cells.addCounter(cellname(1), -3L); cells.addCounter(cellname(2), 3L); - new CounterMutation(new Mutation(KS, bytes(1), cells), ConsistencyLevel.ONE).apply(); + new CounterMutation(new Mutation(KEYSPACE1, bytes(1), cells), ConsistencyLevel.ONE).apply(); current = cfs.getColumnFamily(QueryFilter.getIdentityFilter(dk(bytes(1)), CF1, System.currentTimeMillis())); assertEquals(0L, CounterContext.instance().total(current.getColumn(cellname(1)).value())); assertEquals(0L, CounterContext.instance().total(current.getColumn(cellname(2)).value())); @@ -109,8 +125,8 @@ public void testTwoCells() throws WriteTimeoutException @Test public void testBatch() throws WriteTimeoutException { - ColumnFamilyStore cfs1 = Keyspace.open(KS).getColumnFamilyStore(CF1); - ColumnFamilyStore cfs2 = Keyspace.open(KS).getColumnFamilyStore(CF2); + ColumnFamilyStore cfs1 = Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF1); + ColumnFamilyStore cfs2 = Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF2); cfs1.truncateBlocking(); cfs2.truncateBlocking(); @@ -124,7 +140,7 @@ public void testBatch() throws WriteTimeoutException cells2.addCounter(cellname(1), 2L); cells2.addCounter(cellname(2), -2L); - Mutation mutation = new Mutation(KS, bytes(1)); + Mutation mutation = new Mutation(KEYSPACE1, bytes(1)); mutation.add(cells1); mutation.add(cells2); @@ -149,14 +165,14 @@ public void testBatch() throws WriteTimeoutException @Test public void testDeletes() throws WriteTimeoutException { - ColumnFamilyStore cfs = Keyspace.open(KS).getColumnFamilyStore(CF1); + ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF1); cfs.truncateBlocking(); // Do the initial update (+1, -1) ColumnFamily cells = ArrayBackedSortedColumns.factory.create(cfs.metadata); cells.addCounter(cellname(1), 1L); cells.addCounter(cellname(2), 1L); - new CounterMutation(new Mutation(KS, bytes(1), cells), ConsistencyLevel.ONE).apply(); + new CounterMutation(new Mutation(KEYSPACE1, bytes(1), cells), ConsistencyLevel.ONE).apply(); ColumnFamily current = cfs.getColumnFamily(QueryFilter.getIdentityFilter(dk(bytes(1)), CF1, System.currentTimeMillis())); assertEquals(1L, CounterContext.instance().total(current.getColumn(cellname(1)).value())); assertEquals(1L, CounterContext.instance().total(current.getColumn(cellname(2)).value())); @@ -165,7 +181,7 @@ public void testDeletes() throws WriteTimeoutException cells = ArrayBackedSortedColumns.factory.create(cfs.metadata); cells.addTombstone(cellname(1), (int) System.currentTimeMillis() / 1000, FBUtilities.timestampMicros()); cells.addCounter(cellname(2), 1L); - new CounterMutation(new Mutation(KS, bytes(1), cells), ConsistencyLevel.ONE).apply(); + new CounterMutation(new Mutation(KEYSPACE1, bytes(1), cells), ConsistencyLevel.ONE).apply(); current = cfs.getColumnFamily(QueryFilter.getIdentityFilter(dk(bytes(1)), CF1, System.currentTimeMillis())); assertNull(current.getColumn(cellname(1))); assertEquals(2L, CounterContext.instance().total(current.getColumn(cellname(2)).value())); @@ -173,12 +189,12 @@ public void testDeletes() throws WriteTimeoutException // Increment the first counter, make sure it's still shadowed by the tombstone cells = ArrayBackedSortedColumns.factory.create(cfs.metadata); cells.addCounter(cellname(1), 1L); - new CounterMutation(new Mutation(KS, bytes(1), cells), ConsistencyLevel.ONE).apply(); + new CounterMutation(new Mutation(KEYSPACE1, bytes(1), cells), ConsistencyLevel.ONE).apply(); current = cfs.getColumnFamily(QueryFilter.getIdentityFilter(dk(bytes(1)), CF1, System.currentTimeMillis())); assertNull(current.getColumn(cellname(1))); // Get rid of the complete partition - Mutation mutation = new Mutation(KS, bytes(1)); + Mutation mutation = new Mutation(KEYSPACE1, bytes(1)); mutation.delete(CF1, FBUtilities.timestampMicros()); new CounterMutation(mutation, ConsistencyLevel.ONE).apply(); current = cfs.getColumnFamily(QueryFilter.getIdentityFilter(dk(bytes(1)), CF1, System.currentTimeMillis())); @@ -189,7 +205,7 @@ public void testDeletes() throws WriteTimeoutException cells = ArrayBackedSortedColumns.factory.create(cfs.metadata); cells.addCounter(cellname(1), 1L); cells.addCounter(cellname(2), 1L); - new CounterMutation(new Mutation(KS, bytes(1), cells), ConsistencyLevel.ONE).apply(); + new CounterMutation(new Mutation(KEYSPACE1, bytes(1), cells), ConsistencyLevel.ONE).apply(); current = cfs.getColumnFamily(QueryFilter.getIdentityFilter(dk(bytes(1)), CF1, System.currentTimeMillis())); assertNull(current.getColumn(cellname(1))); assertNull(current.getColumn(cellname(2))); @@ -198,7 +214,7 @@ public void testDeletes() throws WriteTimeoutException @Test public void testDuplicateCells() throws WriteTimeoutException { - ColumnFamilyStore cfs = Keyspace.open(KS).getColumnFamilyStore(CF1); + ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF1); cfs.truncateBlocking(); ColumnFamily cells = ArrayBackedSortedColumns.factory.create(cfs.metadata); @@ -206,7 +222,7 @@ public void testDuplicateCells() throws WriteTimeoutException cells.addCounter(cellname(1), 2L); cells.addCounter(cellname(1), 3L); cells.addCounter(cellname(1), 4L); - new CounterMutation(new Mutation(KS, bytes(1), cells), ConsistencyLevel.ONE).apply(); + new CounterMutation(new Mutation(KEYSPACE1, bytes(1), cells), ConsistencyLevel.ONE).apply(); ColumnFamily current = cfs.getColumnFamily(QueryFilter.getIdentityFilter(dk(bytes(1)), CF1, System.currentTimeMillis())); ByteBuffer context = current.getColumn(cellname(1)).value(); diff --git a/test/unit/org/apache/cassandra/db/HintedHandOffTest.java b/test/unit/org/apache/cassandra/db/HintedHandOffTest.java index 9bc07249fa82..e0a78a9ad874 100644 --- a/test/unit/org/apache/cassandra/db/HintedHandOffTest.java +++ b/test/unit/org/apache/cassandra/db/HintedHandOffTest.java @@ -25,30 +25,44 @@ import java.util.UUID; import java.util.concurrent.TimeUnit; +import org.junit.BeforeClass; import org.junit.Test; import com.google.common.collect.Iterators; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.cql3.UntypedResultSet; import org.apache.cassandra.db.compaction.CompactionManager; import org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy; import org.apache.cassandra.db.marshal.Int32Type; import org.apache.cassandra.db.marshal.UUIDType; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; import static org.junit.Assert.assertEquals; import static org.apache.cassandra.cql3.QueryProcessor.executeInternal; -public class HintedHandOffTest extends SchemaLoader +public class HintedHandOffTest { - public static final String KEYSPACE4 = "Keyspace4"; + public static final String KEYSPACE4 = "HintedHandOffTest4"; public static final String STANDARD1_CF = "Standard1"; public static final String COLUMN1 = "column1"; + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE4, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE4, STANDARD1_CF)); + } + // Test compaction of hints column family. It shouldn't remove all columns on compaction. @Test public void testCompactionOfHintsCF() throws Exception diff --git a/test/unit/org/apache/cassandra/db/KeyCacheTest.java b/test/unit/org/apache/cassandra/db/KeyCacheTest.java index c0560ab261fb..0d3fa631e677 100644 --- a/test/unit/org/apache/cassandra/db/KeyCacheTest.java +++ b/test/unit/org/apache/cassandra/db/KeyCacheTest.java @@ -26,31 +26,46 @@ import com.google.common.util.concurrent.Uninterruptibles; import org.junit.AfterClass; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; import org.apache.cassandra.cache.KeyCacheKey; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.composites.*; import org.apache.cassandra.db.compaction.CompactionManager; import org.apache.cassandra.db.filter.QueryFilter; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.service.CacheService; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.ByteBufferUtil; import static org.junit.Assert.assertEquals; -public class KeyCacheTest extends SchemaLoader +public class KeyCacheTest { - private static final String KEYSPACE1 = "KeyCacheSpace"; + private static final String KEYSPACE1 = "KeyCacheTest1"; private static final String COLUMN_FAMILY1 = "Standard1"; private static final String COLUMN_FAMILY2 = "Standard2"; + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, COLUMN_FAMILY1), + SchemaLoader.standardCFMD(KEYSPACE1, COLUMN_FAMILY2)); + } + @AfterClass public static void cleanup() { - cleanupSavedCaches(); + SchemaLoader.cleanupSavedCaches(); } @Test @@ -65,11 +80,11 @@ public void testKeyCacheLoad() throws Exception assertKeyCacheSize(0, KEYSPACE1, COLUMN_FAMILY2); // insert data and force to disk - insertData(KEYSPACE1, COLUMN_FAMILY2, 0, 100); + SchemaLoader.insertData(KEYSPACE1, COLUMN_FAMILY2, 0, 100); store.forceBlockingFlush(); // populate the cache - readData(KEYSPACE1, COLUMN_FAMILY2, 0, 100); + SchemaLoader.readData(KEYSPACE1, COLUMN_FAMILY2, 0, 100); assertKeyCacheSize(100, KEYSPACE1, COLUMN_FAMILY2); // really? our caches don't implement the map interface? (hence no .addAll) diff --git a/test/unit/org/apache/cassandra/db/KeyCollisionTest.java b/test/unit/org/apache/cassandra/db/KeyCollisionTest.java index 18698727a8c8..23d8abc2af63 100644 --- a/test/unit/org/apache/cassandra/db/KeyCollisionTest.java +++ b/test/unit/org/apache/cassandra/db/KeyCollisionTest.java @@ -22,6 +22,7 @@ import java.nio.ByteBuffer; import java.util.*; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; @@ -31,6 +32,8 @@ import org.apache.cassandra.db.marshal.IntegerType; import org.apache.cassandra.dht.*; import org.apache.cassandra.config.*; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.*; import static org.apache.cassandra.Util.dk; @@ -43,12 +46,22 @@ * length partitioner that takes the length of the key as token, making * collision easy and predictable. */ -public class KeyCollisionTest extends SchemaLoader +public class KeyCollisionTest { IPartitioner oldPartitioner; - private static final String KEYSPACE = "Keyspace1"; + private static final String KEYSPACE1 = "KeyCollisionTest1"; private static final String CF = "Standard1"; + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF)); + } + protected void setUp() { oldPartitioner = DatabaseDescriptor.getPartitioner(); @@ -63,7 +76,7 @@ protected void tearDown() @Test public void testGetSliceWithCollision() throws Exception { - Keyspace keyspace = Keyspace.open(KEYSPACE); + Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF); cfs.clearUnsafe(); @@ -88,7 +101,7 @@ private void insert(String... keys) private void insert(String key) { Mutation rm; - rm = new Mutation(KEYSPACE, ByteBufferUtil.bytes(key)); + rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes(key)); rm.add(CF, Util.cellname("column"), ByteBufferUtil.bytes("asdf"), 0); rm.apply(); } diff --git a/test/unit/org/apache/cassandra/db/KeyspaceTest.java b/test/unit/org/apache/cassandra/db/KeyspaceTest.java index 12e6d9f669ec..a71b0dd14fad 100644 --- a/test/unit/org/apache/cassandra/db/KeyspaceTest.java +++ b/test/unit/org/apache/cassandra/db/KeyspaceTest.java @@ -27,14 +27,23 @@ import com.google.common.collect.Iterables; import org.apache.commons.lang3.StringUtils; +import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.*; import org.apache.cassandra.SchemaLoader; +import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.DatabaseDescriptor; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.composites.*; import org.apache.cassandra.db.compaction.CompactionManager; import org.apache.cassandra.db.filter.QueryFilter; +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.IntegerType; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.WrappedRunnable; import static org.apache.cassandra.Util.column; import static org.apache.cassandra.Util.expiringColumn; @@ -44,11 +53,38 @@ import org.apache.cassandra.utils.ByteBufferUtil; -public class KeyspaceTest extends SchemaLoader +public class KeyspaceTest { private static final DecoratedKey TEST_KEY = Util.dk("key1"); private static final DecoratedKey TEST_SLICE_KEY = Util.dk("key1-slicerange"); + private static final String KEYSPACE1 = "Keyspace1"; + private static final String CF_STANDARD1 = "Standard1"; + private static final String CF_STANDARD2 = "Standard2"; + private static final String CF_STANDARDLONG = "StandardLong1"; + private static final String CF_STANDARDCOMPOSITE2 = "StandardComposite2"; + + private static final String KEYSPACE2 = "Keyspace2"; + private static final String CF_STANDARD3 = "Standard3"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + AbstractType compositeMaxMin = CompositeType.getInstance(Arrays.asList(new AbstractType[]{BytesType.instance, IntegerType.instance})); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD2), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARDLONG), + CFMetaData.denseCFMetaData(KEYSPACE1, CF_STANDARDCOMPOSITE2, compositeMaxMin)); + SchemaLoader.createKeyspace(KEYSPACE2, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE2, CF_STANDARD3)); + } + public static void reTest(ColumnFamilyStore cfs, Runnable verify) throws Exception { verify.run(); @@ -59,12 +95,12 @@ public static void reTest(ColumnFamilyStore cfs, Runnable verify) throws Excepti @Test public void testGetRowNoColumns() throws Throwable { - final Keyspace keyspace = Keyspace.open("Keyspace2"); + final Keyspace keyspace = Keyspace.open(KEYSPACE2); final ColumnFamilyStore cfStore = keyspace.getColumnFamilyStore("Standard3"); - ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace2", "Standard3"); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE2, "Standard3"); cf.addColumn(column("col1","val1", 1L)); - Mutation rm = new Mutation("Keyspace2", TEST_KEY.getKey(), cf); + Mutation rm = new Mutation(KEYSPACE2, TEST_KEY.getKey(), cf); rm.apply(); Runnable verify = new WrappedRunnable() @@ -89,14 +125,14 @@ public void runMayThrow() throws Exception @Test public void testGetRowSingleColumn() throws Throwable { - final Keyspace keyspace = Keyspace.open("Keyspace1"); + final Keyspace keyspace = Keyspace.open(KEYSPACE1); final ColumnFamilyStore cfStore = keyspace.getColumnFamilyStore("Standard1"); - ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); cf.addColumn(column("col1","val1", 1L)); cf.addColumn(column("col2","val2", 1L)); cf.addColumn(column("col3","val3", 1L)); - Mutation rm = new Mutation("Keyspace1", TEST_KEY.getKey(), cf); + Mutation rm = new Mutation(KEYSPACE1, TEST_KEY.getKey(), cf); rm.apply(); Runnable verify = new WrappedRunnable() @@ -118,15 +154,15 @@ public void runMayThrow() throws Exception @Test public void testGetRowSliceByRange() throws Throwable { - DecoratedKey key = TEST_SLICE_KEY; - Keyspace keyspace = Keyspace.open("Keyspace1"); + DecoratedKey key = TEST_SLICE_KEY; + Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore cfStore = keyspace.getColumnFamilyStore("Standard1"); - ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); // First write "a", "b", "c" cf.addColumn(column("a", "val1", 1L)); cf.addColumn(column("b", "val2", 1L)); cf.addColumn(column("c", "val3", 1L)); - Mutation rm = new Mutation("Keyspace1", key.getKey(), cf); + Mutation rm = new Mutation(KEYSPACE1, key.getKey(), cf); rm.apply(); cf = cfStore.getColumnFamily(key, cellname("b"), cellname("c"), false, 100, System.currentTimeMillis()); @@ -142,10 +178,10 @@ public void testGetRowSliceByRange() throws Throwable @Test public void testGetSliceNoMatch() throws Throwable { - Keyspace keyspace = Keyspace.open("Keyspace1"); - ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard2"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard2"); cf.addColumn(column("col1", "val1", 1)); - Mutation rm = new Mutation("Keyspace1", ByteBufferUtil.bytes("row1000"), cf); + Mutation rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("row1000"), cf); rm.apply(); validateGetSliceNoMatch(keyspace); @@ -162,17 +198,17 @@ public void testGetSliceNoMatch() throws Throwable public void testGetSliceWithCutoff() throws Throwable { // tests slicing against data from one row in a memtable and then flushed to an sstable - final Keyspace keyspace = Keyspace.open("Keyspace1"); + final Keyspace keyspace = Keyspace.open(KEYSPACE1); final ColumnFamilyStore cfStore = keyspace.getColumnFamilyStore("Standard1"); final DecoratedKey ROW = Util.dk("row4"); final NumberFormat fmt = new DecimalFormat("000"); - ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); // at this rate, we're getting 78-79 cos/block, assuming the blocks are set to be about 4k. // so if we go to 300, we'll get at least 4 blocks, which is plenty for testing. for (int i = 0; i < 300; i++) cf.addColumn(column("col" + fmt.format(i), "omg!thisisthevalue!"+i, 1L)); - Mutation rm = new Mutation("Keyspace1", ROW.getKey(), cf); + Mutation rm = new Mutation(KEYSPACE1, ROW.getKey(), cf); rm.apply(); Runnable verify = new WrappedRunnable() @@ -219,15 +255,15 @@ public void runMayThrow() throws Exception @Test public void testReversedWithFlushing() { - final Keyspace keyspace = Keyspace.open("Keyspace1"); + final Keyspace keyspace = Keyspace.open(KEYSPACE1); final ColumnFamilyStore cfs = keyspace.getColumnFamilyStore("StandardLong1"); final DecoratedKey ROW = Util.dk("row4"); for (int i = 0; i < 10; i++) { - ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "StandardLong1"); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "StandardLong1"); cf.addColumn(new BufferCell(cellname((long)i), ByteBufferUtil.EMPTY_BYTE_BUFFER, 0)); - Mutation rm = new Mutation("Keyspace1", ROW.getKey(), cf); + Mutation rm = new Mutation(KEYSPACE1, ROW.getKey(), cf); rm.apply(); } @@ -235,9 +271,9 @@ public void testReversedWithFlushing() for (int i = 10; i < 20; i++) { - ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "StandardLong1"); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "StandardLong1"); cf.addColumn(new BufferCell(cellname((long)i), ByteBufferUtil.EMPTY_BYTE_BUFFER, 0)); - Mutation rm = new Mutation("Keyspace1", ROW.getKey(), cf); + Mutation rm = new Mutation(KEYSPACE1, ROW.getKey(), cf); rm.apply(); cf = cfs.getColumnFamily(ROW, Composites.EMPTY, Composites.EMPTY, true, 1, System.currentTimeMillis()); @@ -264,21 +300,21 @@ private void validateGetSliceNoMatch(Keyspace keyspace) public void testGetSliceFromBasic() throws Throwable { // tests slicing against data from one row in a memtable and then flushed to an sstable - final Keyspace keyspace = Keyspace.open("Keyspace1"); + final Keyspace keyspace = Keyspace.open(KEYSPACE1); final ColumnFamilyStore cfStore = keyspace.getColumnFamilyStore("Standard1"); final DecoratedKey ROW = Util.dk("row1"); - ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); cf.addColumn(column("col1", "val1", 1L)); cf.addColumn(column("col3", "val3", 1L)); cf.addColumn(column("col4", "val4", 1L)); cf.addColumn(column("col5", "val5", 1L)); cf.addColumn(column("col7", "val7", 1L)); cf.addColumn(column("col9", "val9", 1L)); - Mutation rm = new Mutation("Keyspace1", ROW.getKey(), cf); + Mutation rm = new Mutation(KEYSPACE1, ROW.getKey(), cf); rm.apply(); - rm = new Mutation("Keyspace1", ROW.getKey()); + rm = new Mutation(KEYSPACE1, ROW.getKey()); rm.delete("Standard1", cellname("col4"), 2L); rm.apply(); @@ -319,15 +355,15 @@ public void runMayThrow() throws Exception public void testGetSliceWithExpiration() throws Throwable { // tests slicing against data from one row with expiring column in a memtable and then flushed to an sstable - final Keyspace keyspace = Keyspace.open("Keyspace1"); + final Keyspace keyspace = Keyspace.open(KEYSPACE1); final ColumnFamilyStore cfStore = keyspace.getColumnFamilyStore("Standard1"); final DecoratedKey ROW = Util.dk("row5"); - ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); cf.addColumn(column("col1", "val1", 1L)); cf.addColumn(expiringColumn("col2", "val2", 1L, 60)); // long enough not to be tombstoned cf.addColumn(column("col3", "val3", 1L)); - Mutation rm = new Mutation("Keyspace1", ROW.getKey(), cf); + Mutation rm = new Mutation(KEYSPACE1, ROW.getKey(), cf); rm.apply(); Runnable verify = new WrappedRunnable() @@ -353,26 +389,26 @@ public void runMayThrow() throws Exception public void testGetSliceFromAdvanced() throws Throwable { // tests slicing against data from one row spread across two sstables - final Keyspace keyspace = Keyspace.open("Keyspace1"); + final Keyspace keyspace = Keyspace.open(KEYSPACE1); final ColumnFamilyStore cfStore = keyspace.getColumnFamilyStore("Standard1"); final DecoratedKey ROW = Util.dk("row2"); - ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); cf.addColumn(column("col1", "val1", 1L)); cf.addColumn(column("col2", "val2", 1L)); cf.addColumn(column("col3", "val3", 1L)); cf.addColumn(column("col4", "val4", 1L)); cf.addColumn(column("col5", "val5", 1L)); cf.addColumn(column("col6", "val6", 1L)); - Mutation rm = new Mutation("Keyspace1", ROW.getKey(), cf); + Mutation rm = new Mutation(KEYSPACE1, ROW.getKey(), cf); rm.apply(); cfStore.forceBlockingFlush(); - cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); cf.addColumn(column("col1", "valx", 2L)); cf.addColumn(column("col2", "valx", 2L)); cf.addColumn(column("col3", "valx", 2L)); - rm = new Mutation("Keyspace1", ROW.getKey(), cf); + rm = new Mutation(KEYSPACE1, ROW.getKey(), cf); rm.apply(); Runnable verify = new WrappedRunnable() @@ -402,13 +438,13 @@ public void runMayThrow() throws Exception public void testGetSliceFromLarge() throws Throwable { // tests slicing against 1000 columns in an sstable - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore cfStore = keyspace.getColumnFamilyStore("Standard1"); DecoratedKey key = Util.dk("row3"); - ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); for (int i = 1000; i < 2000; i++) cf.addColumn(column("col" + i, ("v" + i), 1L)); - Mutation rm = new Mutation("Keyspace1", key.getKey(), cf); + Mutation rm = new Mutation(KEYSPACE1, key.getKey(), cf); rm.apply(); cfStore.forceBlockingFlush(); @@ -430,18 +466,18 @@ public void testGetSliceFromLarge() throws Throwable @Test public void testLimitSSTables() throws CharacterCodingException { - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore cfStore = keyspace.getColumnFamilyStore("Standard1"); cfStore.disableAutoCompaction(); DecoratedKey key = Util.dk("row_maxmin"); for (int j = 0; j < 10; j++) { - ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); for (int i = 1000 + (j*100); i < 1000 + ((j+1)*100); i++) { cf.addColumn(column("col" + i, ("v" + i), i)); } - Mutation rm = new Mutation("Keyspace1", key.getKey(), cf); + Mutation rm = new Mutation(KEYSPACE1, key.getKey(), cf); rm.apply(); cfStore.forceBlockingFlush(); } @@ -494,7 +530,7 @@ public void testLimitSSTablesComposites() --------------------- then we slice out col1 = a5 and col2 > 85 -> which should let us just check 2 sstables and get 2 columns */ - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore("StandardComposite2"); cfs.disableAutoCompaction(); @@ -505,7 +541,7 @@ public void testLimitSSTablesComposites() { for (int i = 0; i < 10; i++) { - Mutation rm = new Mutation("Keyspace1", key.getKey()); + Mutation rm = new Mutation(KEYSPACE1, key.getKey()); CellName colName = type.makeCellName(ByteBufferUtil.bytes("a" + i), ByteBufferUtil.bytes(j*10 + i)); rm.add("StandardComposite2", colName, ByteBufferUtil.EMPTY_BYTE_BUFFER, 0); rm.apply(); diff --git a/test/unit/org/apache/cassandra/db/MultitableTest.java b/test/unit/org/apache/cassandra/db/MultitableTest.java index cc11163dd883..536ba1c15e01 100644 --- a/test/unit/org/apache/cassandra/db/MultitableTest.java +++ b/test/unit/org/apache/cassandra/db/MultitableTest.java @@ -20,33 +20,55 @@ * */ -import org.apache.cassandra.Util; +import org.junit.BeforeClass; import org.junit.Test; import static org.apache.cassandra.db.KeyspaceTest.assertColumns; import org.apache.cassandra.SchemaLoader; +import org.apache.cassandra.Util; import static org.apache.cassandra.Util.column; +import org.apache.cassandra.config.KSMetaData; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; -public class MultitableTest extends SchemaLoader +public class MultitableTest { + private static final String KEYSPACE1 = "MultitableTest1"; + private static final String KEYSPACE2 = "MultitableTest2"; + private static final String CF1 = "Standard1"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF1)); + SchemaLoader.createKeyspace(KEYSPACE2, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE2, CF1)); + } + @Test public void testSameCFs() { - Keyspace keyspace1 = Keyspace.open("Keyspace1"); - Keyspace keyspace2 = Keyspace.open("Keyspace2"); + Keyspace keyspace1 = Keyspace.open(KEYSPACE1); + Keyspace keyspace2 = Keyspace.open(KEYSPACE2); Mutation rm; DecoratedKey dk = Util.dk("keymulti"); ColumnFamily cf; - cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); cf.addColumn(column("col1", "val1", 1L)); - rm = new Mutation("Keyspace1", dk.getKey(), cf); + rm = new Mutation(KEYSPACE1, dk.getKey(), cf); rm.apply(); - cf = ArrayBackedSortedColumns.factory.create("Keyspace2", "Standard1"); + cf = ArrayBackedSortedColumns.factory.create(KEYSPACE2, "Standard1"); cf.addColumn(column("col2", "val2", 1L)); - rm = new Mutation("Keyspace2", dk.getKey(), cf); + rm = new Mutation(KEYSPACE2, dk.getKey(), cf); rm.apply(); keyspace1.getColumnFamilyStore("Standard1").forceBlockingFlush(); diff --git a/test/unit/org/apache/cassandra/db/NameSortTest.java b/test/unit/org/apache/cassandra/db/NameSortTest.java index 6bd71c7a8fc5..c4361d863d49 100644 --- a/test/unit/org/apache/cassandra/db/NameSortTest.java +++ b/test/unit/org/apache/cassandra/db/NameSortTest.java @@ -26,12 +26,32 @@ import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.config.KSMetaData; +import org.apache.cassandra.db.marshal.LongType; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.ByteBufferUtil; +import org.junit.BeforeClass; import org.junit.Test; -public class NameSortTest extends SchemaLoader +public class NameSortTest { + private static final String KEYSPACE1 = "NameSortTest"; + private static final String CF = "Standard1"; + private static final String CFSUPER = "Super1"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF), + SchemaLoader.superCFMD(KEYSPACE1, CFSUPER, LongType.instance)); + } + @Test public void testNameSort1() throws IOException { @@ -55,7 +75,7 @@ public void testNameSort100() throws IOException private void testNameSort(int N) throws IOException { - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); for (int i = 0; i < N; ++i) { @@ -66,7 +86,7 @@ private void testNameSort(int N) throws IOException for (int j = 0; j < 8; ++j) { ByteBuffer bytes = j % 2 == 0 ? ByteBufferUtil.bytes("a") : ByteBufferUtil.bytes("b"); - rm = new Mutation("Keyspace1", key); + rm = new Mutation(KEYSPACE1, key); rm.add("Standard1", Util.cellname("Cell-" + j), bytes, j); rm.applyUnsafe(); } @@ -74,11 +94,11 @@ private void testNameSort(int N) throws IOException // super for (int j = 0; j < 8; ++j) { - rm = new Mutation("Keyspace1", key); + rm = new Mutation(KEYSPACE1, key); for (int k = 0; k < 4; ++k) { String value = (j + k) % 2 == 0 ? "a" : "b"; - addMutation(rm, "Super1", "SuperColumn-" + j, k, value, k); + addMutation(rm, CFSUPER, "SuperColumn-" + j, k, value, k); } rm.applyUnsafe(); } @@ -87,7 +107,7 @@ private void testNameSort(int N) throws IOException validateNameSort(keyspace, N); keyspace.getColumnFamilyStore("Standard1").forceBlockingFlush(); - keyspace.getColumnFamilyStore("Super1").forceBlockingFlush(); + keyspace.getColumnFamilyStore(CFSUPER).forceBlockingFlush(); validateNameSort(keyspace, N); } diff --git a/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java b/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java index 60ccf9f76b16..a7a961d9e98d 100644 --- a/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java +++ b/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java @@ -28,12 +28,11 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterators; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; -import org.apache.cassandra.config.ColumnDefinition; -import org.apache.cassandra.config.DatabaseDescriptor; -import org.apache.cassandra.config.IndexType; +import org.apache.cassandra.config.*; import org.apache.cassandra.db.columniterator.OnDiskAtomIterator; import org.apache.cassandra.db.compaction.CompactionManager; import org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy; @@ -48,8 +47,10 @@ import org.apache.cassandra.db.index.SecondaryIndex; import org.apache.cassandra.db.index.SecondaryIndexSearcher; import org.apache.cassandra.db.marshal.Int32Type; +import org.apache.cassandra.db.marshal.IntegerType; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.concurrent.OpOrder; import org.apache.cassandra.utils.memory.MemtableAllocator; @@ -59,11 +60,21 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -public class RangeTombstoneTest extends SchemaLoader +public class RangeTombstoneTest { - private static final String KSNAME = "Keyspace1"; + private static final String KSNAME = "RangeTombstoneTest"; private static final String CFNAME = "StandardInteger1"; + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KSNAME, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + CFMetaData.denseCFMetaData(KSNAME, CFNAME, IntegerType.instance)); + } + @Test public void simpleQueryWithRangeTombstoneTest() throws Exception { diff --git a/test/unit/org/apache/cassandra/db/ReadMessageTest.java b/test/unit/org/apache/cassandra/db/ReadMessageTest.java index 6d19d3a73c4b..d32df49cf17c 100644 --- a/test/unit/org/apache/cassandra/db/ReadMessageTest.java +++ b/test/unit/org/apache/cassandra/db/ReadMessageTest.java @@ -25,26 +25,50 @@ import java.util.SortedSet; import java.util.TreeSet; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; import org.apache.cassandra.config.DatabaseDescriptor; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.composites.*; import org.apache.cassandra.db.filter.NamesQueryFilter; import org.apache.cassandra.db.filter.SliceQueryFilter; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.util.DataOutputBuffer; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; -public class ReadMessageTest extends SchemaLoader +public class ReadMessageTest { + private static final String KEYSPACE1 = "ReadMessageTest1"; + private static final String KEYSPACENOCOMMIT = "ReadMessageTest_NoCommit"; + private static final String CF = "Standard1"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF)); + SchemaLoader.createKeyspace(KEYSPACENOCOMMIT, + false, + true, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACENOCOMMIT, CF)); + } + @Test public void testMakeReadMessage() throws IOException { - CellNameType type = Keyspace.open("Keyspace1").getColumnFamilyStore("Standard1").getComparator(); + CellNameType type = Keyspace.open(KEYSPACE1).getColumnFamilyStore("Standard1").getComparator(); SortedSet colList = new TreeSet(type); colList.add(Util.cellname("col1")); @@ -54,15 +78,15 @@ public void testMakeReadMessage() throws IOException DecoratedKey dk = Util.dk("row1"); long ts = System.currentTimeMillis(); - rm = new SliceByNamesReadCommand("Keyspace1", dk.getKey(), "Standard1", ts, new NamesQueryFilter(colList)); + rm = new SliceByNamesReadCommand(KEYSPACE1, dk.getKey(), "Standard1", ts, new NamesQueryFilter(colList)); rm2 = serializeAndDeserializeReadMessage(rm); assert rm2.toString().equals(rm.toString()); - rm = new SliceFromReadCommand("Keyspace1", dk.getKey(), "Standard1", ts, new SliceQueryFilter(Composites.EMPTY, Composites.EMPTY, true, 2)); + rm = new SliceFromReadCommand(KEYSPACE1, dk.getKey(), "Standard1", ts, new SliceQueryFilter(Composites.EMPTY, Composites.EMPTY, true, 2)); rm2 = serializeAndDeserializeReadMessage(rm); assert rm2.toString().equals(rm.toString()); - rm = new SliceFromReadCommand("Keyspace1", dk.getKey(), "Standard1", ts, new SliceQueryFilter(Util.cellname("a"), Util.cellname("z"), true, 5)); + rm = new SliceFromReadCommand(KEYSPACE1, dk.getKey(), "Standard1", ts, new SliceQueryFilter(Util.cellname("a"), Util.cellname("z"), true, 5)); rm2 = serializeAndDeserializeReadMessage(rm); assert rm2.toString().equals(rm.toString()); } @@ -81,17 +105,17 @@ private ReadCommand serializeAndDeserializeReadMessage(ReadCommand rm) throws IO @Test public void testGetColumn() { - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); CellNameType type = keyspace.getColumnFamilyStore("Standard1").getComparator(); Mutation rm; DecoratedKey dk = Util.dk("key1"); // add data - rm = new Mutation("Keyspace1", dk.getKey()); + rm = new Mutation(KEYSPACE1, dk.getKey()); rm.add("Standard1", Util.cellname("Column1"), ByteBufferUtil.bytes("abcd"), 0); rm.apply(); - ReadCommand command = new SliceByNamesReadCommand("Keyspace1", dk.getKey(), "Standard1", System.currentTimeMillis(), new NamesQueryFilter(FBUtilities.singleton(Util.cellname("Column1"), type))); + ReadCommand command = new SliceByNamesReadCommand(KEYSPACE1, dk.getKey(), "Standard1", System.currentTimeMillis(), new NamesQueryFilter(FBUtilities.singleton(Util.cellname("Column1"), type))); Row row = command.getRow(keyspace); Cell col = row.cf.getColumn(Util.cellname("Column1")); assertEquals(col.value(), ByteBuffer.wrap("abcd".getBytes())); @@ -100,11 +124,11 @@ public void testGetColumn() @Test public void testNoCommitLog() throws Exception { - Mutation rm = new Mutation("Keyspace1", ByteBufferUtil.bytes("row")); + Mutation rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("row")); rm.add("Standard1", Util.cellname("commit1"), ByteBufferUtil.bytes("abcd"), 0); rm.apply(); - rm = new Mutation("NoCommitlogSpace", ByteBufferUtil.bytes("row")); + rm = new Mutation(KEYSPACENOCOMMIT, ByteBufferUtil.bytes("row")); rm.add("Standard1", Util.cellname("commit2"), ByteBufferUtil.bytes("abcd"), 0); rm.apply(); diff --git a/test/unit/org/apache/cassandra/db/RecoveryManager2Test.java b/test/unit/org/apache/cassandra/db/RecoveryManager2Test.java index ede3e9b74366..03d358fcd878 100644 --- a/test/unit/org/apache/cassandra/db/RecoveryManager2Test.java +++ b/test/unit/org/apache/cassandra/db/RecoveryManager2Test.java @@ -21,6 +21,7 @@ */ +import org.junit.BeforeClass; import org.junit.Test; import org.slf4j.Logger; @@ -28,15 +29,33 @@ import static org.apache.cassandra.Util.column; import org.apache.cassandra.SchemaLoader; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.compaction.CompactionManager; import org.apache.cassandra.db.commitlog.CommitLog; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; -public class RecoveryManager2Test extends SchemaLoader +public class RecoveryManager2Test { private static Logger logger = LoggerFactory.getLogger(RecoveryManager2Test.class); + private static final String KEYSPACE1 = "RecoveryManager2Test"; + private static final String CF_STANDARD1 = "Standard1"; + private static final String CF_STANDARD2 = "Standard2"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD2)); + } + @Test /* test that commit logs do not replay flushed data */ public void testWithFlush() throws Exception @@ -55,7 +74,7 @@ public void testWithFlush() throws Exception insertRow("Standard1", key); } - Keyspace keyspace1 = Keyspace.open("Keyspace1"); + Keyspace keyspace1 = Keyspace.open(KEYSPACE1); ColumnFamilyStore cfs = keyspace1.getColumnFamilyStore("Standard1"); logger.debug("forcing flush"); cfs.forceBlockingFlush(); @@ -70,9 +89,9 @@ public void testWithFlush() throws Exception private void insertRow(String cfname, String key) { - ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", cfname); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, cfname); cf.addColumn(column("col1", "val1", 1L)); - Mutation rm = new Mutation("Keyspace1", ByteBufferUtil.bytes(key), cf); + Mutation rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes(key), cf); rm.apply(); } } diff --git a/test/unit/org/apache/cassandra/db/RecoveryManager3Test.java b/test/unit/org/apache/cassandra/db/RecoveryManager3Test.java index c9bc86a3c039..13d649d18975 100644 --- a/test/unit/org/apache/cassandra/db/RecoveryManager3Test.java +++ b/test/unit/org/apache/cassandra/db/RecoveryManager3Test.java @@ -24,37 +24,61 @@ import java.io.File; import java.io.IOException; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; import org.apache.cassandra.config.DatabaseDescriptor; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.commitlog.CommitLog; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.util.FileUtils; +import org.apache.cassandra.locator.SimpleStrategy; import static org.apache.cassandra.Util.column; import static org.apache.cassandra.db.KeyspaceTest.assertColumns; -public class RecoveryManager3Test extends SchemaLoader +public class RecoveryManager3Test { + private static final String KEYSPACE1 = "RecoveryManager3Test1"; + private static final String CF_STANDARD1 = "Standard1"; + + private static final String KEYSPACE2 = "RecoveryManager3Test2"; + private static final String CF_STANDARD3 = "Standard3"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1)); + SchemaLoader.createKeyspace(KEYSPACE2, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE2, CF_STANDARD3)); + } + @Test public void testMissingHeader() throws IOException { - Keyspace keyspace1 = Keyspace.open("Keyspace1"); - Keyspace keyspace2 = Keyspace.open("Keyspace2"); + Keyspace keyspace1 = Keyspace.open(KEYSPACE1); + Keyspace keyspace2 = Keyspace.open(KEYSPACE2); Mutation rm; DecoratedKey dk = Util.dk("keymulti"); ColumnFamily cf; - cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); cf.addColumn(column("col1", "val1", 1L)); - rm = new Mutation("Keyspace1", dk.getKey(), cf); + rm = new Mutation(KEYSPACE1, dk.getKey(), cf); rm.apply(); - cf = ArrayBackedSortedColumns.factory.create("Keyspace2", "Standard3"); + cf = ArrayBackedSortedColumns.factory.create(KEYSPACE2, "Standard3"); cf.addColumn(column("col2", "val2", 1L)); - rm = new Mutation("Keyspace2", dk.getKey(), cf); + rm = new Mutation(KEYSPACE2, dk.getKey(), cf); rm.apply(); keyspace1.getColumnFamilyStore("Standard1").clearUnsafe(); diff --git a/test/unit/org/apache/cassandra/db/RecoveryManagerTest.java b/test/unit/org/apache/cassandra/db/RecoveryManagerTest.java index 687df5a881d1..5d4928c4a5b4 100644 --- a/test/unit/org/apache/cassandra/db/RecoveryManagerTest.java +++ b/test/unit/org/apache/cassandra/db/RecoveryManagerTest.java @@ -24,7 +24,14 @@ import org.apache.cassandra.OrderedJUnit4ClassRunner; import org.apache.cassandra.Util; +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.KSMetaData; +import org.apache.cassandra.db.marshal.BytesType; +import org.apache.cassandra.db.marshal.CounterColumnType; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import org.junit.Assert; +import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; @@ -37,8 +44,30 @@ import static org.apache.cassandra.Util.cellname; @RunWith(OrderedJUnit4ClassRunner.class) -public class RecoveryManagerTest extends SchemaLoader +public class RecoveryManagerTest { + private static final String KEYSPACE1 = "RecoveryManagerTest1"; + private static final String CF_STANDARD1 = "Standard1"; + private static final String CF_COUNTER1 = "Counter1"; + + private static final String KEYSPACE2 = "RecoveryManagerTest2"; + private static final String CF_STANDARD3 = "Standard3"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1), + CFMetaData.denseCFMetaData(KEYSPACE1, CF_COUNTER1, BytesType.instance).defaultValidator(CounterColumnType.instance)); + SchemaLoader.createKeyspace(KEYSPACE2, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE2, CF_STANDARD3)); + } + @Test public void testNothingToRecover() throws IOException { CommitLog.instance.recover(); @@ -47,21 +76,21 @@ public void testNothingToRecover() throws IOException { @Test public void testOne() throws IOException { - Keyspace keyspace1 = Keyspace.open("Keyspace1"); - Keyspace keyspace2 = Keyspace.open("Keyspace2"); + Keyspace keyspace1 = Keyspace.open(KEYSPACE1); + Keyspace keyspace2 = Keyspace.open(KEYSPACE2); Mutation rm; DecoratedKey dk = Util.dk("keymulti"); ColumnFamily cf; - cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); cf.addColumn(column("col1", "val1", 1L)); - rm = new Mutation("Keyspace1", dk.getKey(), cf); + rm = new Mutation(KEYSPACE1, dk.getKey(), cf); rm.apply(); - cf = ArrayBackedSortedColumns.factory.create("Keyspace2", "Standard3"); + cf = ArrayBackedSortedColumns.factory.create(KEYSPACE2, "Standard3"); cf.addColumn(column("col2", "val2", 1L)); - rm = new Mutation("Keyspace2", dk.getKey(), cf); + rm = new Mutation(KEYSPACE2, dk.getKey(), cf); rm.apply(); keyspace1.getColumnFamilyStore("Standard1").clearUnsafe(); @@ -77,7 +106,7 @@ public void testOne() throws IOException @Test public void testRecoverCounter() throws IOException { - Keyspace keyspace1 = Keyspace.open("Keyspace1"); + Keyspace keyspace1 = Keyspace.open(KEYSPACE1); Mutation rm; DecoratedKey dk = Util.dk("key"); @@ -85,9 +114,9 @@ public void testRecoverCounter() throws IOException for (int i = 0; i < 10; ++i) { - cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Counter1"); + cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Counter1"); cf.addColumn(BufferCounterCell.createLocal(cellname("col"), 1L, 1L, Long.MIN_VALUE)); - rm = new Mutation("Keyspace1", dk.getKey(), cf); + rm = new Mutation(KEYSPACE1, dk.getKey(), cf); rm.apply(); } @@ -111,14 +140,14 @@ public void testRecoverPIT() throws Exception Date date = CommitLogArchiver.format.parse("2112:12:12 12:12:12"); long timeMS = date.getTime() - 5000; - Keyspace keyspace1 = Keyspace.open("Keyspace1"); + Keyspace keyspace1 = Keyspace.open(KEYSPACE1); DecoratedKey dk = Util.dk("dkey"); for (int i = 0; i < 10; ++i) { long ts = TimeUnit.MILLISECONDS.toMicros(timeMS + (i * 1000)); - ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); cf.addColumn(column("name-" + i, "value", ts)); - Mutation rm = new Mutation("Keyspace1", dk.getKey(), cf); + Mutation rm = new Mutation(KEYSPACE1, dk.getKey(), cf); rm.apply(); } keyspace1.getColumnFamilyStore("Standard1").clearUnsafe(); diff --git a/test/unit/org/apache/cassandra/db/RecoveryManagerTruncateTest.java b/test/unit/org/apache/cassandra/db/RecoveryManagerTruncateTest.java index 1f7d3886770b..23caaf8eb8d2 100644 --- a/test/unit/org/apache/cassandra/db/RecoveryManagerTruncateTest.java +++ b/test/unit/org/apache/cassandra/db/RecoveryManagerTruncateTest.java @@ -26,28 +26,45 @@ import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.commitlog.CommitLog; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.utils.ByteBufferUtil; /** * Test for the truncate operation. */ -public class RecoveryManagerTruncateTest extends SchemaLoader +public class RecoveryManagerTruncateTest { + private static final String KEYSPACE1 = "RecoveryManagerTruncateTest"; + private static final String CF_STANDARD1 = "Standard1"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1)); + } + @Test public void testTruncate() throws IOException { - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore("Standard1"); Mutation rm; ColumnFamily cf; // add a single cell - cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); cf.addColumn(column("col1", "val1", 1L)); - rm = new Mutation("Keyspace1", ByteBufferUtil.bytes("keymulti"), cf); + rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("keymulti"), cf); rm.apply(); // Make sure data was written diff --git a/test/unit/org/apache/cassandra/db/RemoveCellTest.java b/test/unit/org/apache/cassandra/db/RemoveCellTest.java index 77ff02d49e20..ac941b54d064 100644 --- a/test/unit/org/apache/cassandra/db/RemoveCellTest.java +++ b/test/unit/org/apache/cassandra/db/RemoveCellTest.java @@ -18,6 +18,7 @@ */ package org.apache.cassandra.db; +import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.assertFalse; @@ -25,27 +26,43 @@ import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.filter.QueryFilter; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.ByteBufferUtil; -public class RemoveCellTest extends SchemaLoader +public class RemoveCellTest { + private static final String KEYSPACE1 = "RemoveCellTest"; + private static final String CF_STANDARD1 = "Standard1"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1)); + } + @Test public void testRemoveColumn() { - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore("Standard1"); Mutation rm; DecoratedKey dk = Util.dk("key1"); // add data - rm = new Mutation("Keyspace1", dk.getKey()); + rm = new Mutation(KEYSPACE1, dk.getKey()); rm.add("Standard1", Util.cellname("Column1"), ByteBufferUtil.bytes("asdf"), 0); rm.apply(); store.forceBlockingFlush(); // remove - rm = new Mutation("Keyspace1", dk.getKey()); + rm = new Mutation(KEYSPACE1, dk.getKey()); rm.delete("Standard1", Util.cellname("Column1"), 1); rm.apply(); diff --git a/test/unit/org/apache/cassandra/db/RemoveColumnFamilyTest.java b/test/unit/org/apache/cassandra/db/RemoveColumnFamilyTest.java index 09eed7148293..c8bab477d27c 100644 --- a/test/unit/org/apache/cassandra/db/RemoveColumnFamilyTest.java +++ b/test/unit/org/apache/cassandra/db/RemoveColumnFamilyTest.java @@ -18,6 +18,7 @@ */ package org.apache.cassandra.db; +import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.assertNull; @@ -25,26 +26,42 @@ import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.config.KSMetaData; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.ByteBufferUtil; -public class RemoveColumnFamilyTest extends SchemaLoader +public class RemoveColumnFamilyTest { + private static final String KEYSPACE1 = "RemoveColumnFamilyTest"; + private static final String CF_STANDARD1 = "Standard1"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1)); + } + @Test public void testRemoveColumnFamily() { - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore("Standard1"); Mutation rm; DecoratedKey dk = Util.dk("key1"); // add data - rm = new Mutation("Keyspace1", dk.getKey()); + rm = new Mutation(KEYSPACE1, dk.getKey()); rm.add("Standard1", Util.cellname("Column1"), ByteBufferUtil.bytes("asdf"), 0); rm.apply(); // remove - rm = new Mutation("Keyspace1", dk.getKey()); + rm = new Mutation(KEYSPACE1, dk.getKey()); rm.delete("Standard1", 1); rm.apply(); diff --git a/test/unit/org/apache/cassandra/db/RemoveColumnFamilyWithFlush1Test.java b/test/unit/org/apache/cassandra/db/RemoveColumnFamilyWithFlush1Test.java index f898f1687c3a..830eba536c69 100644 --- a/test/unit/org/apache/cassandra/db/RemoveColumnFamilyWithFlush1Test.java +++ b/test/unit/org/apache/cassandra/db/RemoveColumnFamilyWithFlush1Test.java @@ -18,6 +18,7 @@ */ package org.apache.cassandra.db; +import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.assertNull; @@ -25,28 +26,44 @@ import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.config.KSMetaData; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.ByteBufferUtil; -public class RemoveColumnFamilyWithFlush1Test extends SchemaLoader +public class RemoveColumnFamilyWithFlush1Test { + private static final String KEYSPACE1 = "RemoveColumnFamilyWithFlush1Test"; + private static final String CF_STANDARD1 = "Standard1"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1)); + } + @Test public void testRemoveColumnFamilyWithFlush1() { - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore("Standard1"); Mutation rm; DecoratedKey dk = Util.dk("key1"); // add data - rm = new Mutation("Keyspace1", dk.getKey()); + rm = new Mutation(KEYSPACE1, dk.getKey()); rm.add("Standard1", Util.cellname("Column1"), ByteBufferUtil.bytes("asdf"), 0); rm.add("Standard1", Util.cellname("Column2"), ByteBufferUtil.bytes("asdf"), 0); rm.apply(); store.forceBlockingFlush(); // remove - rm = new Mutation("Keyspace1", dk.getKey()); + rm = new Mutation(KEYSPACE1, dk.getKey()); rm.delete("Standard1", 1); rm.apply(); diff --git a/test/unit/org/apache/cassandra/db/RemoveColumnFamilyWithFlush2Test.java b/test/unit/org/apache/cassandra/db/RemoveColumnFamilyWithFlush2Test.java index 1e910adbae6c..d2ba51f3f2bf 100644 --- a/test/unit/org/apache/cassandra/db/RemoveColumnFamilyWithFlush2Test.java +++ b/test/unit/org/apache/cassandra/db/RemoveColumnFamilyWithFlush2Test.java @@ -18,6 +18,7 @@ */ package org.apache.cassandra.db; +import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.assertNull; @@ -25,25 +26,41 @@ import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.config.KSMetaData; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.ByteBufferUtil; -public class RemoveColumnFamilyWithFlush2Test extends SchemaLoader +public class RemoveColumnFamilyWithFlush2Test { + private static final String KEYSPACE1 = "RemoveColumnFamilyWithFlush2Test"; + private static final String CF_STANDARD1 = "Standard1"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1)); + } + @Test public void testRemoveColumnFamilyWithFlush2() { - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore("Standard1"); Mutation rm; DecoratedKey dk = Util.dk("key1"); // add data - rm = new Mutation("Keyspace1", dk.getKey()); + rm = new Mutation(KEYSPACE1, dk.getKey()); rm.add("Standard1", Util.cellname("Column1"), ByteBufferUtil.bytes("asdf"), 0); rm.apply(); // remove - rm = new Mutation("Keyspace1", dk.getKey()); + rm = new Mutation(KEYSPACE1, dk.getKey()); rm.delete("Standard1", 1); rm.apply(); store.forceBlockingFlush(); diff --git a/test/unit/org/apache/cassandra/db/RemoveSubCellTest.java b/test/unit/org/apache/cassandra/db/RemoveSubCellTest.java index cec1bce67c9c..db27bef32dc6 100644 --- a/test/unit/org/apache/cassandra/db/RemoveSubCellTest.java +++ b/test/unit/org/apache/cassandra/db/RemoveSubCellTest.java @@ -21,12 +21,17 @@ import java.nio.ByteBuffer; import java.util.concurrent.TimeUnit; +import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.composites.*; import org.apache.cassandra.db.filter.QueryFilter; +import org.apache.cassandra.db.marshal.LongType; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import static org.apache.cassandra.Util.getBytes; import org.apache.cassandra.Util; @@ -36,25 +41,38 @@ import com.google.common.util.concurrent.Uninterruptibles; -public class RemoveSubCellTest extends SchemaLoader +public class RemoveSubCellTest { + private static final String KEYSPACE1 = "RemoveSubCellTest"; + private static final String CF_SUPER1 = "Super1"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.superCFMD(KEYSPACE1, CF_SUPER1, LongType.instance)); + } + @Test public void testRemoveSubColumn() { - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore("Super1"); Mutation rm; DecoratedKey dk = Util.dk("key1"); // add data - rm = new Mutation("Keyspace1", dk.getKey()); + rm = new Mutation(KEYSPACE1, dk.getKey()); Util.addMutation(rm, "Super1", "SC1", 1, "asdf", 0); rm.apply(); store.forceBlockingFlush(); CellName cname = CellNames.compositeDense(ByteBufferUtil.bytes("SC1"), getBytes(1L)); // remove - rm = new Mutation("Keyspace1", dk.getKey()); + rm = new Mutation(KEYSPACE1, dk.getKey()); rm.delete("Super1", cname, 1); rm.apply(); @@ -66,13 +84,13 @@ public void testRemoveSubColumn() @Test public void testRemoveSubColumnAndContainer() { - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore("Super1"); Mutation rm; DecoratedKey dk = Util.dk("key2"); // add data - rm = new Mutation("Keyspace1", dk.getKey()); + rm = new Mutation(KEYSPACE1, dk.getKey()); Util.addMutation(rm, "Super1", "SC1", 1, "asdf", 0); rm.apply(); store.forceBlockingFlush(); @@ -80,7 +98,7 @@ public void testRemoveSubColumnAndContainer() // remove the SC ByteBuffer scName = ByteBufferUtil.bytes("SC1"); CellName cname = CellNames.compositeDense(scName, getBytes(1L)); - rm = new Mutation("Keyspace1", dk.getKey()); + rm = new Mutation(KEYSPACE1, dk.getKey()); rm.deleteRange("Super1", SuperColumns.startOf(scName), SuperColumns.endOf(scName), 1); rm.apply(); @@ -90,7 +108,7 @@ public void testRemoveSubColumnAndContainer() Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS); // remove the column itself - rm = new Mutation("Keyspace1", dk.getKey()); + rm = new Mutation(KEYSPACE1, dk.getKey()); rm.delete("Super1", cname, 2); rm.apply(); diff --git a/test/unit/org/apache/cassandra/db/RowCacheTest.java b/test/unit/org/apache/cassandra/db/RowCacheTest.java index 7b6ff999ab97..4bed2add1a65 100644 --- a/test/unit/org/apache/cassandra/db/RowCacheTest.java +++ b/test/unit/org/apache/cassandra/db/RowCacheTest.java @@ -23,30 +23,51 @@ import java.util.Collection; import org.junit.AfterClass; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.cache.CachingOptions; import org.apache.cassandra.cache.RowCacheKey; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.composites.*; import org.apache.cassandra.db.compaction.CompactionManager; import org.apache.cassandra.db.filter.QueryFilter; +import org.apache.cassandra.db.marshal.IntegerType; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.dht.BytesToken; import org.apache.cassandra.locator.TokenMetadata; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.service.CacheService; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.ByteBufferUtil; import static org.junit.Assert.assertEquals; -public class RowCacheTest extends SchemaLoader +public class RowCacheTest { - private String KEYSPACE = "RowCacheSpace"; - private String COLUMN_FAMILY = "CachedCF"; + private static final String KEYSPACE_CACHED = "RowCacheTest"; + private static final String CF_CACHED = "CachedCF"; + private static final String CF_CACHEDINT = "CachedIntCF"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE_CACHED, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE_CACHED, CF_CACHED).caching(CachingOptions.ALL), + SchemaLoader.standardCFMD(KEYSPACE_CACHED, CF_CACHEDINT) + .defaultValidator(IntegerType.instance) + .caching(new CachingOptions(new CachingOptions.KeyCache(CachingOptions.KeyCache.Type.ALL), + new CachingOptions.RowCache(CachingOptions.RowCache.Type.HEAD, 100)))); + } @AfterClass public static void cleanup() { - cleanupSavedCaches(); + SchemaLoader.cleanupSavedCaches(); } @Test @@ -54,8 +75,8 @@ public void testRowCache() throws Exception { CompactionManager.instance.disableAutoCompaction(); - Keyspace keyspace = Keyspace.open(KEYSPACE); - ColumnFamilyStore cachedStore = keyspace.getColumnFamilyStore(COLUMN_FAMILY); + Keyspace keyspace = Keyspace.open(KEYSPACE_CACHED); + ColumnFamilyStore cachedStore = keyspace.getColumnFamilyStore(CF_CACHED); // empty the row cache CacheService.instance.invalidateRowCache(); @@ -64,7 +85,7 @@ public void testRowCache() throws Exception CacheService.instance.setRowCacheCapacityInMB(1); // inserting 100 rows into both column families - insertData(KEYSPACE, COLUMN_FAMILY, 0, 100); + SchemaLoader.insertData(KEYSPACE_CACHED, CF_CACHED, 0, 100); // now reading rows one by one and checking if row change grows for (int i = 0; i < 100; i++) @@ -87,7 +108,7 @@ public void testRowCache() throws Exception } // insert 10 more keys - insertData(KEYSPACE, COLUMN_FAMILY, 100, 10); + SchemaLoader.insertData(KEYSPACE_CACHED, CF_CACHED, 100, 10); for (int i = 100; i < 110; i++) { @@ -134,7 +155,7 @@ public void testRowCacheCleanup() throws Exception CacheService.instance.setRowCacheCapacityInMB(1); rowCacheLoad(100, Integer.MAX_VALUE, 1000); - ColumnFamilyStore store = Keyspace.open(KEYSPACE).getColumnFamilyStore(COLUMN_FAMILY); + ColumnFamilyStore store = Keyspace.open(KEYSPACE_CACHED).getColumnFamilyStore(CF_CACHED); assertEquals(CacheService.instance.rowCache.getKeySet().size(), 100); store.cleanupCache(); assertEquals(CacheService.instance.rowCache.getKeySet().size(), 100); @@ -161,7 +182,7 @@ public void testRowCacheRange() { CompactionManager.instance.disableAutoCompaction(); - Keyspace keyspace = Keyspace.open(KEYSPACE); + Keyspace keyspace = Keyspace.open(KEYSPACE_CACHED); String cf = "CachedIntCF"; ColumnFamilyStore cachedStore = keyspace.getColumnFamilyStore(cf); long startRowCacheHits = cachedStore.metric.rowCacheHit.count(); @@ -175,7 +196,7 @@ public void testRowCacheRange() ByteBuffer key = ByteBufferUtil.bytes("rowcachekey"); DecoratedKey dk = cachedStore.partitioner.decorateKey(key); RowCacheKey rck = new RowCacheKey(cachedStore.metadata.cfId, dk); - Mutation mutation = new Mutation(KEYSPACE, key); + Mutation mutation = new Mutation(KEYSPACE_CACHED, key); for (int i = 0; i < 200; i++) mutation.add(cf, Util.cellname(i), ByteBufferUtil.bytes("val" + i), System.currentTimeMillis()); mutation.applyUnsafe(); @@ -234,15 +255,15 @@ public void rowCacheLoad(int totalKeys, int keysToSave, int offset) throws Excep { CompactionManager.instance.disableAutoCompaction(); - ColumnFamilyStore store = Keyspace.open(KEYSPACE).getColumnFamilyStore(COLUMN_FAMILY); + ColumnFamilyStore store = Keyspace.open(KEYSPACE_CACHED).getColumnFamilyStore(CF_CACHED); // empty the cache CacheService.instance.invalidateRowCache(); assert CacheService.instance.rowCache.size() == 0; // insert data and fill the cache - insertData(KEYSPACE, COLUMN_FAMILY, offset, totalKeys); - readData(KEYSPACE, COLUMN_FAMILY, offset, totalKeys); + SchemaLoader.insertData(KEYSPACE_CACHED, CF_CACHED, offset, totalKeys); + SchemaLoader.readData(KEYSPACE_CACHED, CF_CACHED, offset, totalKeys); assert CacheService.instance.rowCache.size() == totalKeys; // force the cache to disk diff --git a/test/unit/org/apache/cassandra/db/RowIterationTest.java b/test/unit/org/apache/cassandra/db/RowIterationTest.java index 8464a35a572f..10d89034b023 100644 --- a/test/unit/org/apache/cassandra/db/RowIterationTest.java +++ b/test/unit/org/apache/cassandra/db/RowIterationTest.java @@ -25,20 +25,36 @@ import org.apache.cassandra.Util; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.composites.*; +import org.apache.cassandra.db.marshal.LongType; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.FBUtilities; import static org.junit.Assert.assertEquals; import org.apache.cassandra.utils.ByteBufferUtil; -public class RowIterationTest extends SchemaLoader +public class RowIterationTest { - public static final String KEYSPACE1 = "Keyspace2"; + public static final String KEYSPACE1 = "RowIterationTest"; public static final InetAddress LOCAL = FBUtilities.getBroadcastAddress(); + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, "Standard3"), + SchemaLoader.superCFMD(KEYSPACE1, "Super3", LongType.instance)); + } + @Test public void testRowIteration() { diff --git a/test/unit/org/apache/cassandra/db/RowTest.java b/test/unit/org/apache/cassandra/db/RowTest.java index 22e112e8d76d..910f9e116687 100644 --- a/test/unit/org/apache/cassandra/db/RowTest.java +++ b/test/unit/org/apache/cassandra/db/RowTest.java @@ -22,10 +22,14 @@ import java.util.concurrent.TimeUnit; import com.google.common.util.concurrent.Uninterruptibles; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.composites.CellNames; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.ByteBufferUtil; import static org.apache.cassandra.Util.column; @@ -34,15 +38,28 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -public class RowTest extends SchemaLoader +public class RowTest { + private static final String KEYSPACE1 = "RowTest"; + private static final String CF_STANDARD1 = "Standard1"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1)); + } + @Test public void testDiffColumnFamily() { - ColumnFamily cf1 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf1 = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); cf1.addColumn(column("one", "onev", 0)); - ColumnFamily cf2 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf2 = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); DeletionInfo delInfo = new DeletionInfo(0, 0); cf2.delete(delInfo); @@ -86,10 +103,10 @@ public void testDiffColumnFamily() @Test public void testResolve() { - ColumnFamily cf1 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf1 = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); cf1.addColumn(column("one", "A", 0)); - ColumnFamily cf2 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf2 = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); cf2.addColumn(column("one", "B", 1)); cf2.addColumn(column("two", "C", 1)); diff --git a/test/unit/org/apache/cassandra/db/ScrubTest.java b/test/unit/org/apache/cassandra/db/ScrubTest.java index e0bbb64847b7..24a6787f2e1b 100644 --- a/test/unit/org/apache/cassandra/db/ScrubTest.java +++ b/test/unit/org/apache/cassandra/db/ScrubTest.java @@ -30,10 +30,17 @@ import java.util.Set; import java.util.concurrent.ExecutionException; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.cql3.QueryProcessor; +import org.apache.cassandra.db.marshal.BytesType; +import org.apache.cassandra.db.marshal.CounterColumnType; +import org.apache.cassandra.db.marshal.UUIDType; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.RequestExecutionException; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.UUIDGen; import org.apache.commons.lang3.StringUtils; +import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; @@ -58,12 +65,28 @@ import static org.junit.Assert.fail; @RunWith(OrderedJUnit4ClassRunner.class) -public class ScrubTest extends SchemaLoader +public class ScrubTest { - public String KEYSPACE = "Keyspace1"; - public String CF = "Standard1"; - public String CF3 = "Standard2"; - public String COUNTER_CF = "Counter1"; + public static final String KEYSPACE = "Keyspace1"; + public static final String CF = "Standard1"; + public static final String CF2 = "Standard2"; + public static final String CF3 = "Standard3"; + public static final String COUNTER_CF = "Counter1"; + public static final String CF_UUID = "UUIDKeys"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.loadSchema(); + SchemaLoader.createKeyspace(KEYSPACE, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE, CF), + SchemaLoader.standardCFMD(KEYSPACE, CF2), + SchemaLoader.standardCFMD(KEYSPACE, CF3), + CFMetaData.denseCFMetaData(KEYSPACE, COUNTER_CF, BytesType.instance).defaultValidator(CounterColumnType.instance), + SchemaLoader.standardCFMD(KEYSPACE, CF_UUID).keyValidator(UUIDType.instance)); + } @Test public void testScrubOneRow() throws ExecutionException, InterruptedException @@ -138,10 +161,10 @@ public void testScrubDeletedRow() throws ExecutionException, InterruptedExceptio { CompactionManager.instance.disableAutoCompaction(); Keyspace keyspace = Keyspace.open(KEYSPACE); - ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF3); + ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF2); cfs.clearUnsafe(); - ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE, CF3); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE, CF2); cf.delete(new DeletionInfo(0, 1)); // expired tombstone Mutation rm = new Mutation(KEYSPACE, ByteBufferUtil.bytes(1), cf); rm.applyUnsafe(); @@ -178,7 +201,7 @@ public void testScrubOutOfOrder() throws Exception { CompactionManager.instance.disableAutoCompaction(); Keyspace keyspace = Keyspace.open(KEYSPACE); - String columnFamily = "Standard3"; + String columnFamily = CF3; ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(columnFamily); cfs.clearUnsafe(); @@ -283,12 +306,12 @@ protected void fillCounterCF(ColumnFamilyStore cfs, int rowsPerSSTable) throws W @Test public void testScrubColumnValidation() throws InterruptedException, RequestExecutionException, ExecutionException { - QueryProcessor.process("CREATE TABLE \"Keyspace1\".test_compact_static_columns (a bigint, b timeuuid, c boolean static, d text, PRIMARY KEY (a, b))", ConsistencyLevel.ONE); + QueryProcessor.process(String.format("CREATE TABLE \"%s\".test_compact_static_columns (a bigint, b timeuuid, c boolean static, d text, PRIMARY KEY (a, b))", KEYSPACE), ConsistencyLevel.ONE); - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore("test_compact_static_columns"); - QueryProcessor.executeInternal("INSERT INTO \"Keyspace1\".test_compact_static_columns (a, b, c, d) VALUES (123, c3db07e8-b602-11e3-bc6b-e0b9a54a6d93, true, 'foobar')"); + QueryProcessor.executeInternal(String.format("INSERT INTO \"%s\".test_compact_static_columns (a, b, c, d) VALUES (123, c3db07e8-b602-11e3-bc6b-e0b9a54a6d93, true, 'foobar')", KEYSPACE)); cfs.forceBlockingFlush(); CompactionManager.instance.performScrub(cfs, false); } @@ -299,12 +322,12 @@ public void testScrubColumnValidation() throws InterruptedException, RequestExec @Test public void testColumnNameEqualToDefaultKeyAlias() throws ExecutionException, InterruptedException { - Keyspace keyspace = Keyspace.open("Keyspace1"); - ColumnFamilyStore cfs = keyspace.getColumnFamilyStore("UUIDKeys"); + Keyspace keyspace = Keyspace.open(KEYSPACE); + ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF_UUID); - ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "UUIDKeys"); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE, CF_UUID); cf.addColumn(column(CFMetaData.DEFAULT_KEY_ALIAS, "not a uuid", 1L)); - Mutation mutation = new Mutation("Keyspace1", ByteBufferUtil.bytes(UUIDGen.getTimeUUID()), cf); + Mutation mutation = new Mutation(KEYSPACE, ByteBufferUtil.bytes(UUIDGen.getTimeUUID()), cf); mutation.applyUnsafe(); cfs.forceBlockingFlush(); CompactionManager.instance.performScrub(cfs, false); @@ -319,19 +342,19 @@ public void testColumnNameEqualToDefaultKeyAlias() throws ExecutionException, In @Test public void testValidationCompactStorage() throws Exception { - QueryProcessor.process("CREATE TABLE \"Keyspace1\".test_compact_dynamic_columns (a int, b text, c text, PRIMARY KEY (a, b)) WITH COMPACT STORAGE", ConsistencyLevel.ONE); + QueryProcessor.process(String.format("CREATE TABLE \"%s\".test_compact_dynamic_columns (a int, b text, c text, PRIMARY KEY (a, b)) WITH COMPACT STORAGE", KEYSPACE), ConsistencyLevel.ONE); - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore("test_compact_dynamic_columns"); - QueryProcessor.executeInternal("INSERT INTO \"Keyspace1\".test_compact_dynamic_columns (a, b, c) VALUES (0, 'a', 'foo')"); - QueryProcessor.executeInternal("INSERT INTO \"Keyspace1\".test_compact_dynamic_columns (a, b, c) VALUES (0, 'b', 'bar')"); - QueryProcessor.executeInternal("INSERT INTO \"Keyspace1\".test_compact_dynamic_columns (a, b, c) VALUES (0, 'c', 'boo')"); + QueryProcessor.executeInternal(String.format("INSERT INTO \"%s\".test_compact_dynamic_columns (a, b, c) VALUES (0, 'a', 'foo')", KEYSPACE)); + QueryProcessor.executeInternal(String.format("INSERT INTO \"%s\".test_compact_dynamic_columns (a, b, c) VALUES (0, 'b', 'bar')", KEYSPACE)); + QueryProcessor.executeInternal(String.format("INSERT INTO \"%s\".test_compact_dynamic_columns (a, b, c) VALUES (0, 'c', 'boo')", KEYSPACE)); cfs.forceBlockingFlush(); CompactionManager.instance.performScrub(cfs, true); // Scrub is silent, but it will remove broken records. So reading everything back to make sure nothing to "scrubbed away" - UntypedResultSet rs = QueryProcessor.executeInternal("SELECT * FROM \"Keyspace1\".test_compact_dynamic_columns"); + UntypedResultSet rs = QueryProcessor.executeInternal(String.format("SELECT * FROM \"%s\".test_compact_dynamic_columns", KEYSPACE)); assertEquals(3, rs.size()); Iterator iter = rs.iterator(); diff --git a/test/unit/org/apache/cassandra/db/SerializationsTest.java b/test/unit/org/apache/cassandra/db/SerializationsTest.java index 0dd6b8f3dd75..a50bbae35786 100644 --- a/test/unit/org/apache/cassandra/db/SerializationsTest.java +++ b/test/unit/org/apache/cassandra/db/SerializationsTest.java @@ -19,16 +19,21 @@ package org.apache.cassandra.db; import org.apache.cassandra.AbstractSerializationsTester; +import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.composites.*; import org.apache.cassandra.db.filter.*; import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.db.marshal.BytesType; +import org.apache.cassandra.db.marshal.LongType; import org.apache.cassandra.dht.AbstractBounds; import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.util.DataOutputStreamAndChannel; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.net.CallbackInfo; import org.apache.cassandra.net.MessageIn; import org.apache.cassandra.net.MessageOut; @@ -36,6 +41,7 @@ import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.ByteBufferUtil; +import org.junit.BeforeClass; import org.junit.Test; import java.io.DataInputStream; @@ -47,6 +53,7 @@ public class SerializationsTest extends AbstractSerializationsTester { Statics statics = new Statics(); + private static final String KEYSPACE1 = "Keyspace1"; private ByteBuffer startCol = ByteBufferUtil.bytes("Start"); private ByteBuffer stopCol = ByteBufferUtil.bytes("Stop"); private Composite emptyCol = Composites.EMPTY; @@ -56,6 +63,17 @@ public class SerializationsTest extends AbstractSerializationsTester public SliceQueryFilter nonEmptyRangePred = new SliceQueryFilter(CellNames.simpleDense(startCol), CellNames.simpleDense(stopCol), true, 100); public SliceQueryFilter nonEmptyRangeSCPred = new SliceQueryFilter(CellNames.compositeDense(statics.SC, startCol), CellNames.compositeDense(statics.SC, stopCol), true, 100); + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, "Standard1"), + SchemaLoader.superCFMD(KEYSPACE1, "Super1", LongType.instance)); + } + private void testRangeSliceCommandWrite() throws IOException { IPartitioner part = StorageService.getPartitioner(); @@ -339,7 +357,7 @@ private static CellName cn(String s) private static class Statics { - private final String KS = "Keyspace1"; + private final String KS = KEYSPACE1; private final ByteBuffer Key = ByteBufferUtil.bytes("Key01"); private final SortedSet NamedCols = new TreeSet(new SimpleDenseCellNameType(BytesType.instance)) {{ diff --git a/test/unit/org/apache/cassandra/db/TimeSortTest.java b/test/unit/org/apache/cassandra/db/TimeSortTest.java index 80c0ff106f6a..77890fb474ec 100644 --- a/test/unit/org/apache/cassandra/db/TimeSortTest.java +++ b/test/unit/org/apache/cassandra/db/TimeSortTest.java @@ -21,6 +21,7 @@ import java.io.IOException; import java.util.*; +import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.assertEquals; @@ -29,28 +30,44 @@ import static org.apache.cassandra.Util.getBytes; import org.apache.cassandra.Util; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.composites.*; import org.apache.cassandra.db.filter.QueryFilter; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.ByteBufferUtil; -public class TimeSortTest extends SchemaLoader +public class TimeSortTest { + private static final String KEYSPACE1 = "TimeSortTest"; + private static final String CF_STANDARD1 = "StandardLong1"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1)); + } + @Test public void testMixedSources() { - Keyspace keyspace = Keyspace.open("Keyspace1"); - ColumnFamilyStore cfStore = keyspace.getColumnFamilyStore("StandardLong1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); + ColumnFamilyStore cfStore = keyspace.getColumnFamilyStore(CF_STANDARD1); Mutation rm; DecoratedKey key = Util.dk("key0"); - rm = new Mutation("Keyspace1", key.getKey()); - rm.add("StandardLong1", cellname(100), ByteBufferUtil.bytes("a"), 100); + rm = new Mutation(KEYSPACE1, key.getKey()); + rm.add(CF_STANDARD1, cellname(100), ByteBufferUtil.bytes("a"), 100); rm.apply(); cfStore.forceBlockingFlush(); - rm = new Mutation("Keyspace1", key.getKey()); - rm.add("StandardLong1", cellname(0), ByteBufferUtil.bytes("b"), 0); + rm = new Mutation(KEYSPACE1, key.getKey()); + rm.add(CF_STANDARD1, cellname(0), ByteBufferUtil.bytes("b"), 0); rm.apply(); ColumnFamily cf = cfStore.getColumnFamily(key, cellname(10), Composites.EMPTY, false, 1000, System.currentTimeMillis()); @@ -61,15 +78,15 @@ public void testMixedSources() @Test public void testTimeSort() throws IOException { - Keyspace keyspace = Keyspace.open("Keyspace1"); - ColumnFamilyStore cfStore = keyspace.getColumnFamilyStore("StandardLong1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); + ColumnFamilyStore cfStore = keyspace.getColumnFamilyStore(CF_STANDARD1); for (int i = 900; i < 1000; ++i) { - Mutation rm = new Mutation("Keyspace1", ByteBufferUtil.bytes(Integer.toString(i))); + Mutation rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes(Integer.toString(i))); for (int j = 0; j < 8; ++j) { - rm.add("StandardLong1", cellname(j * 2), ByteBufferUtil.bytes("a"), j * 2); + rm.add(CF_STANDARD1, cellname(j * 2), ByteBufferUtil.bytes("a"), j * 2); } rm.apply(); } @@ -81,16 +98,16 @@ public void testTimeSort() throws IOException // interleave some new data to test memtable + sstable DecoratedKey key = Util.dk("900"); - Mutation rm = new Mutation("Keyspace1", key.getKey()); + Mutation rm = new Mutation(KEYSPACE1, key.getKey()); for (int j = 0; j < 4; ++j) { - rm.add("StandardLong1", cellname(j * 2 + 1), ByteBufferUtil.bytes("b"), j * 2 + 1); + rm.add(CF_STANDARD1, cellname(j * 2 + 1), ByteBufferUtil.bytes("b"), j * 2 + 1); } rm.apply(); // and some overwrites - rm = new Mutation("Keyspace1", key.getKey()); - rm.add("StandardLong1", cellname(0), ByteBufferUtil.bytes("c"), 100); - rm.add("StandardLong1", cellname(10), ByteBufferUtil.bytes("c"), 100); + rm = new Mutation(KEYSPACE1, key.getKey()); + rm.add(CF_STANDARD1, cellname(0), ByteBufferUtil.bytes("c"), 100); + rm.add(CF_STANDARD1, cellname(10), ByteBufferUtil.bytes("c"), 100); rm.apply(); // verify @@ -107,7 +124,7 @@ public void testTimeSort() throws IOException TreeSet columnNames = new TreeSet(cfStore.getComparator()); columnNames.add(cellname(10)); columnNames.add(cellname(0)); - cf = cfStore.getColumnFamily(QueryFilter.getNamesFilter(Util.dk("900"), "StandardLong1", columnNames, System.currentTimeMillis())); + cf = cfStore.getColumnFamily(QueryFilter.getNamesFilter(Util.dk("900"), CF_STANDARD1, columnNames, System.currentTimeMillis())); assert "c".equals(ByteBufferUtil.string(cf.getColumn(cellname(0)).value())); assert "c".equals(ByteBufferUtil.string(cf.getColumn(cellname(10)).value())); } @@ -119,7 +136,7 @@ private void validateTimeSort(Keyspace keyspace) DecoratedKey key = Util.dk(Integer.toString(i)); for (int j = 0; j < 8; j += 3) { - ColumnFamilyStore cfs = keyspace.getColumnFamilyStore("StandardLong1"); + ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF_STANDARD1); ColumnFamily cf = cfs.getColumnFamily(key, cellname(j * 2), Composites.EMPTY, false, 1000, System.currentTimeMillis()); Collection cells = cf.getSortedColumns(); assert cells.size() == 8 - j; diff --git a/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java b/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java index b8637a894078..ac628ee9d36c 100644 --- a/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java @@ -22,6 +22,11 @@ import java.util.Collection; import java.util.List; import java.util.concurrent.ExecutionException; + +import org.apache.cassandra.config.KSMetaData; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; @@ -41,11 +46,21 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -public class AntiCompactionTest extends SchemaLoader +public class AntiCompactionTest { - private static final String KEYSPACE1 = "Keyspace1"; + private static final String KEYSPACE1 = "AntiCompactionTest"; private static final String CF = "Standard1"; + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF)); + } + @Test public void antiCompactOne() throws InterruptedException, ExecutionException, IOException { @@ -58,7 +73,7 @@ public void antiCompactOne() throws InterruptedException, ExecutionException, IO DecoratedKey key = Util.dk(Integer.toString(i)); Mutation rm = new Mutation(KEYSPACE1, key.getKey()); for (int j = 0; j < 10; j++) - rm.add("Standard1", Util.cellname(Integer.toString(j)), + rm.add(CF, Util.cellname(Integer.toString(j)), ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp, 0); diff --git a/test/unit/org/apache/cassandra/db/compaction/BlacklistingCompactionsTest.java b/test/unit/org/apache/cassandra/db/compaction/BlacklistingCompactionsTest.java index e6626ea68f86..8beea7f20365 100644 --- a/test/unit/org/apache/cassandra/db/compaction/BlacklistingCompactionsTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/BlacklistingCompactionsTest.java @@ -31,20 +31,34 @@ import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.*; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.io.util.FileUtils; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.ByteBufferUtil; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.apache.cassandra.Util.cellname; -public class BlacklistingCompactionsTest extends SchemaLoader +public class BlacklistingCompactionsTest { - public static final String KEYSPACE = "Keyspace1"; + private static final String KEYSPACE1 = "BlacklistingCompactionsTest"; + private static final String CF_STANDARD1 = "Standard1"; @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1)); + closeStdErr(); + } + public static void closeStdErr() { // These tests generate an error message per CorruptSSTableException since it goes through @@ -70,7 +84,7 @@ public void testBlacklistingWithLeveledCompactionStrategy() throws Exception public void testBlacklisting(String compactionStrategy) throws Exception { // this test does enough rows to force multiple block indexes to be used - Keyspace keyspace = Keyspace.open(KEYSPACE); + Keyspace keyspace = Keyspace.open(KEYSPACE1); final ColumnFamilyStore cfs = keyspace.getColumnFamilyStore("Standard1"); final int ROWS_PER_SSTABLE = 10; @@ -89,7 +103,7 @@ public void testBlacklisting(String compactionStrategy) throws Exception for (int i = 0; i < ROWS_PER_SSTABLE; i++) { DecoratedKey key = Util.dk(String.valueOf(i % 2)); - Mutation rm = new Mutation(KEYSPACE, key.getKey()); + Mutation rm = new Mutation(KEYSPACE1, key.getKey()); long timestamp = j * ROWS_PER_SSTABLE + i; rm.add("Standard1", cellname(i / 2), ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp); maxTimestampExpected = Math.max(timestamp, maxTimestampExpected); diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java index 80608f546a94..e8656c4d7868 100644 --- a/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java @@ -22,8 +22,14 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; +import org.apache.cassandra.cache.CachingOptions; +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.*; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; @@ -45,10 +51,43 @@ import org.apache.cassandra.utils.ByteBufferUtil; -public class CompactionsPurgeTest extends SchemaLoader +public class CompactionsPurgeTest { - public static final String KEYSPACE1 = "Keyspace1"; - public static final String KEYSPACE2 = "Keyspace2"; + private static final String KEYSPACE1 = "CompactionsPurgeTest1"; + private static final String CF_STANDARD1 = "Standard1"; + private static final String CF_STANDARD2 = "Standard2"; + private static final String KEYSPACE2 = "CompactionsPurgeTest2"; + private static final String KEYSPACE_CACHED = "CompactionsPurgeTestCached"; + private static final String CF_CACHED = "CachedCF"; + private static final String KEYSPACE_CQL = "cql_keyspace"; + private static final String CF_CQL = "table1"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD2)); + SchemaLoader.createKeyspace(KEYSPACE2, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE2, CF_STANDARD1)); + SchemaLoader.createKeyspace(KEYSPACE_CACHED, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE_CACHED, CF_CACHED).caching(CachingOptions.ALL)); + SchemaLoader.createKeyspace(KEYSPACE_CQL, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + CFMetaData.compile("CREATE TABLE " + CF_CQL + " (" + + "k int PRIMARY KEY," + + "v1 text," + + "v2 int" + + ")", KEYSPACE_CQL)); + } @Test public void testMajorCompactionPurge() throws ExecutionException, InterruptedException @@ -235,8 +274,8 @@ public void testCompactionPurgeCachedRow() throws ExecutionException, Interrupte { CompactionManager.instance.disableAutoCompaction(); - String keyspaceName = "RowCacheSpace"; - String cfName = "CachedCF"; + String keyspaceName = KEYSPACE_CACHED; + String cfName = CF_CACHED; Keyspace keyspace = Keyspace.open(keyspaceName); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfName); @@ -283,7 +322,7 @@ public void testCompactionPurgeTombstonedRow() throws ExecutionException, Interr { CompactionManager.instance.disableAutoCompaction(); - String keyspaceName = "Keyspace1"; + String keyspaceName = KEYSPACE1; String cfName = "Standard1"; Keyspace keyspace = Keyspace.open(keyspaceName); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfName); diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java index 58473b43517a..808a87e19044 100644 --- a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java @@ -21,37 +21,37 @@ import java.io.File; import java.io.IOException; import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; -import java.util.UUID; +import java.util.*; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import org.apache.cassandra.OrderedJUnit4ClassRunner; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.*; import org.apache.cassandra.db.columniterator.OnDiskAtomIterator; import org.apache.cassandra.db.filter.QueryFilter; +import org.apache.cassandra.db.marshal.BytesType; +import org.apache.cassandra.db.marshal.LongType; import org.apache.cassandra.dht.BytesToken; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.sstable.Component; import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.io.sstable.SSTableScanner; import org.apache.cassandra.io.sstable.SSTableWriter; import org.apache.cassandra.io.sstable.metadata.MetadataCollector; import org.apache.cassandra.io.sstable.metadata.StatsMetadata; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.Pair; +import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -63,15 +63,39 @@ import static org.junit.Assert.*; @RunWith(OrderedJUnit4ClassRunner.class) -public class CompactionsTest extends SchemaLoader +public class CompactionsTest { - private static final String STANDARD1 = "Standard1"; - public static final String KEYSPACE1 = "Keyspace1"; + private static final String KEYSPACE1 = "Keyspace1"; + private static final String CF_STANDARD1 = "CF_STANDARD1"; + private static final String CF_STANDARD2 = "Standard2"; + private static final String CF_STANDARD3 = "Standard3"; + private static final String CF_STANDARD4 = "Standard4"; + private static final String CF_SUPER1 = "Super1"; + private static final String CF_SUPER5 = "Super5"; + private static final String CF_SUPERGC = "SuperDirectGC"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + Map compactionOptions = new HashMap<>(); + compactionOptions.put("tombstone_compaction_interval", "1"); + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1).compactionStrategyOptions(compactionOptions), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD2), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD3), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD4), + SchemaLoader.superCFMD(KEYSPACE1, CF_SUPER1, LongType.instance), + SchemaLoader.superCFMD(KEYSPACE1, CF_SUPER5, BytesType.instance), + SchemaLoader.superCFMD(KEYSPACE1, CF_SUPERGC, BytesType.instance).gcGraceSeconds(0)); + } public ColumnFamilyStore testSingleSSTableCompaction(String strategyClassName) throws Exception { Keyspace keyspace = Keyspace.open(KEYSPACE1); - ColumnFamilyStore store = keyspace.getColumnFamilyStore(STANDARD1); + ColumnFamilyStore store = keyspace.getColumnFamilyStore(CF_STANDARD1); store.clearUnsafe(); store.metadata.gcGraceSeconds(1); store.setCompactionStrategyClass(strategyClassName); @@ -79,7 +103,7 @@ public ColumnFamilyStore testSingleSSTableCompaction(String strategyClassName) t // disable compaction while flushing store.disableAutoCompaction(); - long timestamp = populate(KEYSPACE1, STANDARD1, 0, 9, 3); //ttl=3s + long timestamp = populate(KEYSPACE1, CF_STANDARD1, 0, 9, 3); //ttl=3s store.forceBlockingFlush(); assertEquals(1, store.getSSTables().size()); @@ -180,7 +204,7 @@ public void testSuperColumnTombstones() throws ExecutionException, InterruptedEx public void testUncheckedTombstoneSizeTieredCompaction() throws Exception { Keyspace keyspace = Keyspace.open(KEYSPACE1); - ColumnFamilyStore store = keyspace.getColumnFamilyStore(STANDARD1); + ColumnFamilyStore store = keyspace.getColumnFamilyStore(CF_STANDARD1); store.clearUnsafe(); store.metadata.gcGraceSeconds(1); store.metadata.compactionStrategyOptions.put("tombstone_compaction_interval", "1"); @@ -192,11 +216,11 @@ public void testUncheckedTombstoneSizeTieredCompaction() throws Exception store.disableAutoCompaction(); //Populate sstable1 with with keys [0..9] - populate(KEYSPACE1, STANDARD1, 0, 9, 3); //ttl=3s + populate(KEYSPACE1, CF_STANDARD1, 0, 9, 3); //ttl=3s store.forceBlockingFlush(); //Populate sstable2 with with keys [10..19] (keys do not overlap with SSTable1) - long timestamp2 = populate(KEYSPACE1, STANDARD1, 10, 19, 3); //ttl=3s + long timestamp2 = populate(KEYSPACE1, CF_STANDARD1, 10, 19, 3); //ttl=3s store.forceBlockingFlush(); assertEquals(2, store.getSSTables().size()); @@ -456,7 +480,7 @@ public void testCompactionLog() throws Exception String cf = "Standard4"; ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore(cf); - insertData(KEYSPACE1, cf, 0, 1); + SchemaLoader.insertData(KEYSPACE1, cf, 0, 1); cfs.forceBlockingFlush(); Collection sstables = cfs.getSSTables(); @@ -545,7 +569,7 @@ private static void insertRowWithKey(int key) long timestamp = System.currentTimeMillis(); DecoratedKey decoratedKey = Util.dk(String.format("%03d", key)); Mutation rm = new Mutation(KEYSPACE1, decoratedKey.getKey()); - rm.add("Standard1", Util.cellname("col"), ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp, 1000); + rm.add("CF_STANDARD1", Util.cellname("col"), ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp, 1000); rm.apply(); } @@ -554,7 +578,7 @@ private static void insertRowWithKey(int key) public void testNeedsCleanup() { Keyspace keyspace = Keyspace.open(KEYSPACE1); - ColumnFamilyStore store = keyspace.getColumnFamilyStore("Standard1"); + ColumnFamilyStore store = keyspace.getColumnFamilyStore("CF_STANDARD1"); store.clearUnsafe(); // disable compaction while flushing diff --git a/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java b/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java index defb087ab50e..71bf6e5722c3 100644 --- a/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java @@ -18,23 +18,24 @@ package org.apache.cassandra.db.compaction; import java.nio.ByteBuffer; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.UUID; +import java.util.*; import org.junit.After; import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.apache.cassandra.OrderedJUnit4ClassRunner; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.*; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.repair.RepairJobDesc; import org.apache.cassandra.repair.Validator; import org.apache.cassandra.service.ActiveRepairService; @@ -45,16 +46,32 @@ import static org.junit.Assert.assertTrue; @RunWith(OrderedJUnit4ClassRunner.class) -public class LeveledCompactionStrategyTest extends SchemaLoader +public class LeveledCompactionStrategyTest { - private String ksname = "Keyspace1"; - private String cfname = "StandardLeveled"; - private Keyspace keyspace = Keyspace.open(ksname); - private ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfname); + private static final String KEYSPACE1 = "LeveledCompactionStrategyTest"; + private static final String CF_STANDARDDLEVELED = "StandardLeveled"; + private Keyspace keyspace; + private ColumnFamilyStore cfs; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + Map leveledOptions = new HashMap<>(); + leveledOptions.put("sstable_size_in_mb", "1"); + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARDDLEVELED) + .compactionStrategyClass(LeveledCompactionStrategy.class) + .compactionStrategyOptions(leveledOptions)); + } @Before public void enableCompaction() { + keyspace = Keyspace.open(KEYSPACE1); + cfs = keyspace.getColumnFamilyStore(CF_STANDARDDLEVELED); cfs.enableAutoCompaction(); } @@ -83,10 +100,10 @@ public void testValidationMultipleSSTablePerLevel() throws Exception for (int r = 0; r < rows; r++) { DecoratedKey key = Util.dk(String.valueOf(r)); - Mutation rm = new Mutation(ksname, key.getKey()); + Mutation rm = new Mutation(KEYSPACE1, key.getKey()); for (int c = 0; c < columns; c++) { - rm.add(cfname, Util.cellname("column" + c), value, 0); + rm.add(CF_STANDARDDLEVELED, Util.cellname("column" + c), value, 0); } rm.apply(); cfs.forceBlockingFlush(); @@ -99,10 +116,10 @@ public void testValidationMultipleSSTablePerLevel() throws Exception assert strategy.getLevelSize(2) > 0; Range range = new Range<>(Util.token(""), Util.token("")); - int gcBefore = keyspace.getColumnFamilyStore(cfname).gcBefore(System.currentTimeMillis()); + int gcBefore = keyspace.getColumnFamilyStore(CF_STANDARDDLEVELED).gcBefore(System.currentTimeMillis()); UUID parentRepSession = UUID.randomUUID(); ActiveRepairService.instance.registerParentRepairSession(parentRepSession, Arrays.asList(cfs), Arrays.asList(range)); - RepairJobDesc desc = new RepairJobDesc(parentRepSession, UUID.randomUUID(), ksname, cfname, range); + RepairJobDesc desc = new RepairJobDesc(parentRepSession, UUID.randomUUID(), KEYSPACE1, CF_STANDARDDLEVELED, range); Validator validator = new Validator(desc, FBUtilities.getBroadcastAddress(), gcBefore); CompactionManager.instance.submitValidation(cfs, validator).get(); } @@ -128,10 +145,10 @@ public void testCompactionProgress() throws Exception for (int r = 0; r < rows; r++) { DecoratedKey key = Util.dk(String.valueOf(r)); - Mutation rm = new Mutation(ksname, key.getKey()); + Mutation rm = new Mutation(KEYSPACE1, key.getKey()); for (int c = 0; c < columns; c++) { - rm.add(cfname, Util.cellname("column" + c), value, 0); + rm.add(CF_STANDARDDLEVELED, Util.cellname("column" + c), value, 0); } rm.apply(); cfs.forceBlockingFlush(); @@ -167,10 +184,10 @@ public void testMutateLevel() throws Exception for (int r = 0; r < rows; r++) { DecoratedKey key = Util.dk(String.valueOf(r)); - Mutation rm = new Mutation(ksname, key.getKey()); + Mutation rm = new Mutation(KEYSPACE1, key.getKey()); for (int c = 0; c < columns; c++) { - rm.add(cfname, Util.cellname("column" + c), value, 0); + rm.add(CF_STANDARDDLEVELED, Util.cellname("column" + c), value, 0); } rm.apply(); cfs.forceBlockingFlush(); @@ -213,10 +230,10 @@ public void testNewRepairedSSTable() throws Exception for (int r = 0; r < rows; r++) { DecoratedKey key = Util.dk(String.valueOf(r)); - Mutation rm = new Mutation(ksname, key.getKey()); + Mutation rm = new Mutation(KEYSPACE1, key.getKey()); for (int c = 0; c < columns; c++) { - rm.add(cfname, Util.cellname("column" + c), value, 0); + rm.add(CF_STANDARDDLEVELED, Util.cellname("column" + c), value, 0); } rm.apply(); cfs.forceBlockingFlush(); diff --git a/test/unit/org/apache/cassandra/db/compaction/OneCompactionTest.java b/test/unit/org/apache/cassandra/db/compaction/OneCompactionTest.java index bc3fe3513af6..375dfe8ca119 100644 --- a/test/unit/org/apache/cassandra/db/compaction/OneCompactionTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/OneCompactionTest.java @@ -18,12 +18,15 @@ */ package org.apache.cassandra.db.compaction; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.Set; import java.util.HashSet; import org.apache.cassandra.Util; +import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.assertEquals; @@ -31,22 +34,42 @@ import org.apache.cassandra.db.*; import org.apache.cassandra.SchemaLoader; +import org.apache.cassandra.config.KSMetaData; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.ByteBufferUtil; -public class OneCompactionTest extends SchemaLoader +public class OneCompactionTest { + public static final String KEYSPACE1 = "OneCompactionTest"; + private static final String CF_STANDARD1 = "Standard1"; + private static final String CF_STANDARD2 = "Standard2"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + Map leveledOptions = new HashMap<>(); + leveledOptions.put("sstable_size_in_mb", "1"); + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1).compactionStrategyOptions(leveledOptions), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD2)); + } + private void testCompaction(String columnFamilyName, int insertsPerTable) throws ExecutionException, InterruptedException { CompactionManager.instance.disableAutoCompaction(); - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore(columnFamilyName); Set inserted = new HashSet(); for (int j = 0; j < insertsPerTable; j++) { DecoratedKey key = Util.dk(String.valueOf(j)); - Mutation rm = new Mutation("Keyspace1", key.getKey()); + Mutation rm = new Mutation(KEYSPACE1, key.getKey()); rm.add(columnFamilyName, Util.cellname("0"), ByteBufferUtil.EMPTY_BYTE_BUFFER, j); rm.apply(); inserted.add(key); diff --git a/test/unit/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyTest.java b/test/unit/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyTest.java index 6132dad73549..ef886e7e97ff 100644 --- a/test/unit/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyTest.java @@ -20,13 +20,16 @@ import java.nio.ByteBuffer; import java.util.*; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.*; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.metrics.RestorableMeter; import org.apache.cassandra.utils.Pair; @@ -38,8 +41,23 @@ import static org.junit.Assert.*; -public class SizeTieredCompactionStrategyTest extends SchemaLoader +public class SizeTieredCompactionStrategyTest { + public static final String KEYSPACE1 = "SizeTieredCompactionStrategyTest"; + private static final String CF_STANDARD1 = "Standard1"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + Map leveledOptions = new HashMap<>(); + leveledOptions.put("sstable_size_in_mb", "1"); + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1) + .compactionStrategyOptions(leveledOptions)); + } @Test public void testOptionsValidation() throws ConfigurationException @@ -146,7 +164,7 @@ public void testGetBuckets() @Test public void testPrepBucket() throws Exception { - String ksname = "Keyspace1"; + String ksname = KEYSPACE1; String cfname = "Standard1"; Keyspace keyspace = Keyspace.open(ksname); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfname); @@ -190,7 +208,7 @@ public void testPrepBucket() throws Exception @Test public void testFilterColdSSTables() throws Exception { - String ksname = "Keyspace1"; + String ksname = KEYSPACE1; String cfname = "Standard1"; Keyspace keyspace = Keyspace.open(ksname); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfname); diff --git a/test/unit/org/apache/cassandra/db/compaction/TTLExpiryTest.java b/test/unit/org/apache/cassandra/db/compaction/TTLExpiryTest.java index b98af68ae59d..3a2bc4aac095 100644 --- a/test/unit/org/apache/cassandra/db/compaction/TTLExpiryTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/TTLExpiryTest.java @@ -20,31 +20,48 @@ * */ +import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.apache.cassandra.OrderedJUnit4ClassRunner; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.*; import org.apache.cassandra.db.columniterator.OnDiskAtomIterator; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.io.sstable.SSTableScanner; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.ByteBufferUtil; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @RunWith(OrderedJUnit4ClassRunner.class) -public class TTLExpiryTest extends SchemaLoader +public class TTLExpiryTest { + public static final String KEYSPACE1 = "TTLExpiryTest"; + private static final String CF_STANDARD1 = "Standard1"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1)); + } + @Test public void testSimpleExpire() throws InterruptedException { - ColumnFamilyStore cfs = Keyspace.open("Keyspace1").getColumnFamilyStore("Standard1"); + ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore("Standard1"); cfs.disableAutoCompaction(); cfs.metadata.gcGraceSeconds(0); long timestamp = System.currentTimeMillis(); - Mutation rm = new Mutation("Keyspace1", Util.dk("ttl").getKey()); + Mutation rm = new Mutation(KEYSPACE1, Util.dk("ttl").getKey()); rm.add("Standard1", Util.cellname("col"), ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp, @@ -57,21 +74,21 @@ public void testSimpleExpire() throws InterruptedException rm.apply(); cfs.forceBlockingFlush(); - rm = new Mutation("Keyspace1", Util.dk("ttl").getKey()); + rm = new Mutation(KEYSPACE1, Util.dk("ttl").getKey()); rm.add("Standard1", Util.cellname("col2"), ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp, 1); rm.apply(); cfs.forceBlockingFlush(); - rm = new Mutation("Keyspace1", Util.dk("ttl").getKey()); + rm = new Mutation(KEYSPACE1, Util.dk("ttl").getKey()); rm.add("Standard1", Util.cellname("col3"), ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp, 1); rm.apply(); cfs.forceBlockingFlush(); - rm = new Mutation("Keyspace1", Util.dk("ttl").getKey()); + rm = new Mutation(KEYSPACE1, Util.dk("ttl").getKey()); rm.add("Standard1", Util.cellname("col311"), ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp, @@ -88,11 +105,11 @@ public void testSimpleExpire() throws InterruptedException @Test public void testNoExpire() throws InterruptedException { - ColumnFamilyStore cfs = Keyspace.open("Keyspace1").getColumnFamilyStore("Standard1"); + ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore("Standard1"); cfs.disableAutoCompaction(); cfs.metadata.gcGraceSeconds(0); long timestamp = System.currentTimeMillis(); - Mutation rm = new Mutation("Keyspace1", Util.dk("ttl").getKey()); + Mutation rm = new Mutation(KEYSPACE1, Util.dk("ttl").getKey()); rm.add("Standard1", Util.cellname("col"), ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp, @@ -105,14 +122,14 @@ public void testNoExpire() throws InterruptedException rm.apply(); cfs.forceBlockingFlush(); - rm = new Mutation("Keyspace1", Util.dk("ttl").getKey()); + rm = new Mutation(KEYSPACE1, Util.dk("ttl").getKey()); rm.add("Standard1", Util.cellname("col2"), ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp, 1); rm.apply(); cfs.forceBlockingFlush(); - rm = new Mutation("Keyspace1", Util.dk("ttl").getKey()); + rm = new Mutation(KEYSPACE1, Util.dk("ttl").getKey()); rm.add("Standard1", Util.cellname("col3"), ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp, @@ -120,7 +137,7 @@ public void testNoExpire() throws InterruptedException rm.apply(); cfs.forceBlockingFlush(); DecoratedKey noTTLKey = Util.dk("nottl"); - rm = new Mutation("Keyspace1", noTTLKey.getKey()); + rm = new Mutation(KEYSPACE1, noTTLKey.getKey()); rm.add("Standard1", Util.cellname("col311"), ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp); diff --git a/test/unit/org/apache/cassandra/db/index/PerRowSecondaryIndexTest.java b/test/unit/org/apache/cassandra/db/index/PerRowSecondaryIndexTest.java index 158dd2cbbd67..e3121824e203 100644 --- a/test/unit/org/apache/cassandra/db/index/PerRowSecondaryIndexTest.java +++ b/test/unit/org/apache/cassandra/db/index/PerRowSecondaryIndexTest.java @@ -23,11 +23,13 @@ import java.util.Set; import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; import org.apache.cassandra.config.DatabaseDescriptor; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.Cell; import org.apache.cassandra.db.ColumnFamily; import org.apache.cassandra.db.ColumnFamilyStore; @@ -36,12 +38,13 @@ import org.apache.cassandra.db.composites.CellName; import org.apache.cassandra.db.filter.QueryFilter; import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.concurrent.OpOrder; import static org.junit.Assert.*; -public class PerRowSecondaryIndexTest extends SchemaLoader +public class PerRowSecondaryIndexTest { // test that when index(key) is called on a PRSI index, @@ -50,6 +53,19 @@ public class PerRowSecondaryIndexTest extends SchemaLoader // indexed & stashes it in a static variable for inspection // in the test. + private static final String KEYSPACE1 = "PerRowSecondaryIndexTest"; + private static final String CF_INDEXED = "Indexed1"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.perRowIndexedCFMD(KEYSPACE1, CF_INDEXED)); + } + @Before public void clearTestStub() { @@ -61,7 +77,7 @@ public void testIndexInsertAndUpdate() { // create a row then test that the configured index instance was able to read the row Mutation rm; - rm = new Mutation("PerRowSecondaryIndex", ByteBufferUtil.bytes("k1")); + rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("k1")); rm.add("Indexed1", Util.cellname("indexed"), ByteBufferUtil.bytes("foo"), 1); rm.apply(); @@ -70,7 +86,7 @@ public void testIndexInsertAndUpdate() assertEquals(ByteBufferUtil.bytes("foo"), indexedRow.getColumn(Util.cellname("indexed")).value()); // update the row and verify what was indexed - rm = new Mutation("PerRowSecondaryIndex", ByteBufferUtil.bytes("k1")); + rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("k1")); rm.add("Indexed1", Util.cellname("indexed"), ByteBufferUtil.bytes("bar"), 2); rm.apply(); @@ -85,7 +101,7 @@ public void testColumnDelete() { // issue a column delete and test that the configured index instance was notified to update Mutation rm; - rm = new Mutation("PerRowSecondaryIndex", ByteBufferUtil.bytes("k2")); + rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("k2")); rm.delete("Indexed1", Util.cellname("indexed"), 1); rm.apply(); @@ -103,7 +119,7 @@ public void testRowDelete() { // issue a row level delete and test that the configured index instance was notified to update Mutation rm; - rm = new Mutation("PerRowSecondaryIndex", ByteBufferUtil.bytes("k3")); + rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("k3")); rm.delete("Indexed1", 1); rm.apply(); diff --git a/test/unit/org/apache/cassandra/db/marshal/CompositeTypeTest.java b/test/unit/org/apache/cassandra/db/marshal/CompositeTypeTest.java index f6067806a48d..35be43de1efd 100644 --- a/test/unit/org/apache/cassandra/db/marshal/CompositeTypeTest.java +++ b/test/unit/org/apache/cassandra/db/marshal/CompositeTypeTest.java @@ -19,28 +19,30 @@ package org.apache.cassandra.db.marshal; import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.UUID; +import java.util.*; -import org.apache.cassandra.serializers.MarshalException; +import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.fail; import static org.junit.Assert.assertEquals; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.SyntaxException; import org.apache.cassandra.db.*; import org.apache.cassandra.db.composites.CellNames; import org.apache.cassandra.db.filter.QueryFilter; +import org.apache.cassandra.locator.SimpleStrategy; +import org.apache.cassandra.serializers.MarshalException; import org.apache.cassandra.utils.*; -public class CompositeTypeTest extends SchemaLoader +public class CompositeTypeTest { - private static final String cfName = "StandardComposite"; + private static final String KEYSPACE1 = "CompositeTypeTest"; + private static final String CF_STANDARDCOMPOSITE = "StandardComposite"; private static final CompositeType comparator; static { @@ -59,6 +61,17 @@ public class CompositeTypeTest extends SchemaLoader uuids[i] = UUIDGen.getTimeUUID(); } + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + AbstractType composite = CompositeType.getInstance(Arrays.asList(new AbstractType[]{BytesType.instance, TimeUUIDType.instance, IntegerType.instance})); + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + CFMetaData.denseCFMetaData(KEYSPACE1, CF_STANDARDCOMPOSITE, composite)); + } + @Test public void testEndOfComponent() { @@ -164,8 +177,8 @@ public void testValidate() @Test public void testFullRound() throws Exception { - Keyspace keyspace = Keyspace.open("Keyspace1"); - ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfName); + Keyspace keyspace = Keyspace.open(KEYSPACE1); + ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF_STANDARDCOMPOSITE); ByteBuffer cname1 = createCompositeKey("test1", null, -1, false); ByteBuffer cname2 = createCompositeKey("test1", uuids[0], 24, false); @@ -174,7 +187,7 @@ public void testFullRound() throws Exception ByteBuffer cname5 = createCompositeKey("test2", uuids[1], 42, false); ByteBuffer key = ByteBufferUtil.bytes("k"); - Mutation rm = new Mutation("Keyspace1", key); + Mutation rm = new Mutation(KEYSPACE1, key); addColumn(rm, cname5); addColumn(rm, cname1); addColumn(rm, cname4); @@ -182,7 +195,7 @@ public void testFullRound() throws Exception addColumn(rm, cname3); rm.apply(); - ColumnFamily cf = cfs.getColumnFamily(QueryFilter.getIdentityFilter(Util.dk("k"), cfName, System.currentTimeMillis())); + ColumnFamily cf = cfs.getColumnFamily(QueryFilter.getIdentityFilter(Util.dk("k"), CF_STANDARDCOMPOSITE, System.currentTimeMillis())); Iterator iter = cf.getSortedColumns().iterator(); @@ -258,7 +271,7 @@ public void testEscapeUnescape() private void addColumn(Mutation rm, ByteBuffer cname) { - rm.add(cfName, CellNames.simpleDense(cname), ByteBufferUtil.EMPTY_BYTE_BUFFER, 0); + rm.add(CF_STANDARDCOMPOSITE, CellNames.simpleDense(cname), ByteBufferUtil.EMPTY_BYTE_BUFFER, 0); } private ByteBuffer createCompositeKey(String s, UUID uuid, int i, boolean lastIsOne) diff --git a/test/unit/org/apache/cassandra/db/marshal/DynamicCompositeTypeTest.java b/test/unit/org/apache/cassandra/db/marshal/DynamicCompositeTypeTest.java index 26d2e62f4c46..fa10dbbdedac 100644 --- a/test/unit/org/apache/cassandra/db/marshal/DynamicCompositeTypeTest.java +++ b/test/unit/org/apache/cassandra/db/marshal/DynamicCompositeTypeTest.java @@ -24,25 +24,31 @@ import java.util.Map; import java.util.UUID; -import org.apache.cassandra.serializers.MarshalException; +import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.fail; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.*; import org.apache.cassandra.db.composites.*; import org.apache.cassandra.db.filter.QueryFilter; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; +import org.apache.cassandra.serializers.MarshalException; import org.apache.cassandra.utils.*; -public class DynamicCompositeTypeTest extends SchemaLoader +public class DynamicCompositeTypeTest { - private static final String cfName = "StandardDynamicComposite"; + private static final String KEYSPACE1 = "DynamicCompositeType"; + private static final String CF_STANDARDDYNCOMPOSITE = "StandardDynamicComposite"; + private static Map> aliases = new HashMap<>(); private static final DynamicCompositeType comparator; static { - Map> aliases = new HashMap>(); aliases.put((byte)'b', BytesType.instance); aliases.put((byte)'t', TimeUUIDType.instance); comparator = DynamicCompositeType.getInstance(aliases); @@ -56,6 +62,17 @@ public class DynamicCompositeTypeTest extends SchemaLoader uuids[i] = UUIDGen.getTimeUUID(); } + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + AbstractType dynamicComposite = DynamicCompositeType.getInstance(aliases); + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + CFMetaData.denseCFMetaData(KEYSPACE1, CF_STANDARDDYNCOMPOSITE, dynamicComposite)); + } + @Test public void testEndOfComponent() { @@ -163,8 +180,8 @@ public void testValidate() @Test public void testFullRound() throws Exception { - Keyspace keyspace = Keyspace.open("Keyspace1"); - ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfName); + Keyspace keyspace = Keyspace.open(KEYSPACE1); + ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF_STANDARDDYNCOMPOSITE); ByteBuffer cname1 = createDynamicCompositeKey("test1", null, -1, false); ByteBuffer cname2 = createDynamicCompositeKey("test1", uuids[0], 24, false); @@ -173,7 +190,7 @@ public void testFullRound() throws Exception ByteBuffer cname5 = createDynamicCompositeKey("test2", uuids[1], 42, false); ByteBuffer key = ByteBufferUtil.bytes("k"); - Mutation rm = new Mutation("Keyspace1", key); + Mutation rm = new Mutation(KEYSPACE1, key); addColumn(rm, cname5); addColumn(rm, cname1); addColumn(rm, cname4); @@ -181,7 +198,7 @@ public void testFullRound() throws Exception addColumn(rm, cname3); rm.apply(); - ColumnFamily cf = cfs.getColumnFamily(QueryFilter.getIdentityFilter(Util.dk("k"), cfName, System.currentTimeMillis())); + ColumnFamily cf = cfs.getColumnFamily(QueryFilter.getIdentityFilter(Util.dk("k"), CF_STANDARDDYNCOMPOSITE, System.currentTimeMillis())); Iterator iter = cf.getSortedColumns().iterator(); @@ -232,7 +249,7 @@ public void testCompatibility() throws Exception private void addColumn(Mutation rm, ByteBuffer cname) { - rm.add(cfName, CellNames.simpleDense(cname), ByteBufferUtil.EMPTY_BYTE_BUFFER, 0); + rm.add(CF_STANDARDDYNCOMPOSITE, CellNames.simpleDense(cname), ByteBufferUtil.EMPTY_BYTE_BUFFER, 0); } private ByteBuffer createDynamicCompositeKey(String s, UUID uuid, int i, boolean lastIsOne) diff --git a/test/unit/org/apache/cassandra/dht/BootStrapperTest.java b/test/unit/org/apache/cassandra/dht/BootStrapperTest.java index ffad335153eb..b95572f8b40c 100644 --- a/test/unit/org/apache/cassandra/dht/BootStrapperTest.java +++ b/test/unit/org/apache/cassandra/dht/BootStrapperTest.java @@ -25,6 +25,7 @@ import java.util.Set; import java.util.Map; +import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; @@ -32,6 +33,7 @@ import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.config.Schema; import org.apache.cassandra.db.Keyspace; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.gms.IFailureDetectionEventListener; import org.apache.cassandra.gms.IFailureDetector; import org.apache.cassandra.locator.TokenMetadata; @@ -40,8 +42,16 @@ import static org.junit.Assert.*; @RunWith(OrderedJUnit4ClassRunner.class) -public class BootStrapperTest extends SchemaLoader +public class BootStrapperTest { + @BeforeClass + public static void setup() throws ConfigurationException + { + SchemaLoader.startGossiper(); + SchemaLoader.prepareServer(); + SchemaLoader.schemaDefinition("BootStrapperTest"); + } + @Test public void testSourceTargetComputation() throws UnknownHostException { diff --git a/test/unit/org/apache/cassandra/io/BloomFilterTrackerTest.java b/test/unit/org/apache/cassandra/io/BloomFilterTrackerTest.java index 4943a3a7e0c3..afcf2a5659d0 100644 --- a/test/unit/org/apache/cassandra/io/BloomFilterTrackerTest.java +++ b/test/unit/org/apache/cassandra/io/BloomFilterTrackerTest.java @@ -23,12 +23,11 @@ import org.junit.Test; -import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.io.sstable.BloomFilterTracker; import static org.junit.Assert.assertEquals; -public class BloomFilterTrackerTest extends SchemaLoader +public class BloomFilterTrackerTest { @Test public void testAddingFalsePositives() diff --git a/test/unit/org/apache/cassandra/io/sstable/IndexSummaryManagerTest.java b/test/unit/org/apache/cassandra/io/sstable/IndexSummaryManagerTest.java index 5281449f9253..83c9daa2c827 100644 --- a/test/unit/org/apache/cassandra/io/sstable/IndexSummaryManagerTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/IndexSummaryManagerTest.java @@ -26,6 +26,7 @@ import org.junit.After; import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; import org.slf4j.Logger; @@ -33,8 +34,12 @@ import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.cache.CachingOptions; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.*; import org.apache.cassandra.db.filter.QueryFilter; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.metrics.RestorableMeter; import static org.apache.cassandra.io.sstable.Downsampling.BASE_SAMPLING_LEVEL; @@ -46,7 +51,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; -public class IndexSummaryManagerTest extends SchemaLoader +public class IndexSummaryManagerTest { private static final Logger logger = LoggerFactory.getLogger(IndexSummaryManagerTest.class); @@ -54,11 +59,28 @@ public class IndexSummaryManagerTest extends SchemaLoader int originalMaxIndexInterval; long originalCapacity; + private static final String KEYSPACE1 = "IndexSummaryManagerTest"; + // index interval of 8, no key caching + private static final String CF_STANDARDLOWiINTERVAL = "StandardLowIndexInterval"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARDLOWiINTERVAL) + .minIndexInterval(8) + .maxIndexInterval(256) + .caching(CachingOptions.NONE)); + } + @Before public void beforeTest() { - String ksname = "Keyspace1"; - String cfname = "StandardLowIndexInterval"; // index interval of 8, no key caching + String ksname = KEYSPACE1; + String cfname = CF_STANDARDLOWiINTERVAL; // index interval of 8, no key caching Keyspace keyspace = Keyspace.open(ksname); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfname); originalMinIndexInterval = cfs.metadata.getMinIndexInterval(); @@ -69,8 +91,8 @@ public void beforeTest() @After public void afterTest() { - String ksname = "Keyspace1"; - String cfname = "StandardLowIndexInterval"; // index interval of 8, no key caching + String ksname = KEYSPACE1; + String cfname = CF_STANDARDLOWiINTERVAL; // index interval of 8, no key caching Keyspace keyspace = Keyspace.open(ksname); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfname); cfs.metadata.minIndexInterval(originalMinIndexInterval); @@ -162,8 +184,8 @@ private void createSSTables(String ksname, String cfname, int numSSTables, int n @Test public void testChangeMinIndexInterval() throws IOException { - String ksname = "Keyspace1"; - String cfname = "StandardLowIndexInterval"; // index interval of 8, no key caching + String ksname = KEYSPACE1; + String cfname = CF_STANDARDLOWiINTERVAL; // index interval of 8, no key caching Keyspace keyspace = Keyspace.open(ksname); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfname); int numSSTables = 1; @@ -234,8 +256,8 @@ public void testChangeMinIndexInterval() throws IOException @Test public void testChangeMaxIndexInterval() throws IOException { - String ksname = "Keyspace1"; - String cfname = "StandardLowIndexInterval"; // index interval of 8, no key caching + String ksname = KEYSPACE1; + String cfname = CF_STANDARDLOWiINTERVAL; // index interval of 8, no key caching Keyspace keyspace = Keyspace.open(ksname); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfname); int numSSTables = 1; @@ -274,8 +296,8 @@ public void testChangeMaxIndexInterval() throws IOException @Test(timeout = 10000) public void testRedistributeSummaries() throws IOException { - String ksname = "Keyspace1"; - String cfname = "StandardLowIndexInterval"; // index interval of 8, no key caching + String ksname = KEYSPACE1; + String cfname = CF_STANDARDLOWiINTERVAL; // index interval of 8, no key caching Keyspace keyspace = Keyspace.open(ksname); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfname); int numSSTables = 4; @@ -395,8 +417,8 @@ public void testRedistributeSummaries() throws IOException @Test public void testRebuildAtSamplingLevel() throws IOException { - String ksname = "Keyspace1"; - String cfname = "StandardLowIndexInterval"; + String ksname = KEYSPACE1; + String cfname = CF_STANDARDLOWiINTERVAL; Keyspace keyspace = Keyspace.open(ksname); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfname); cfs.truncateBlocking(); @@ -452,8 +474,8 @@ public void testJMXFunctions() throws IOException manager.setMemoryPoolCapacityInMB(10); assertEquals(10, manager.getMemoryPoolCapacityInMB()); - String ksname = "Keyspace1"; - String cfname = "StandardLowIndexInterval"; // index interval of 8, no key caching + String ksname = KEYSPACE1; + String cfname = CF_STANDARDLOWiINTERVAL; // index interval of 8, no key caching Keyspace keyspace = Keyspace.open(ksname); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfname); cfs.truncateBlocking(); @@ -478,7 +500,7 @@ public void testJMXFunctions() throws IOException assertTrue(manager.getAverageIndexInterval() >= cfs.metadata.getMinIndexInterval()); Map intervals = manager.getIndexIntervals(); for (Map.Entry entry : intervals.entrySet()) - if (entry.getKey().contains("StandardLowIndexInterval")) + if (entry.getKey().contains(CF_STANDARDLOWiINTERVAL)) assertEquals(cfs.metadata.getMinIndexInterval(), entry.getValue(), 0.001); manager.setMemoryPoolCapacityInMB(0); @@ -487,7 +509,7 @@ public void testJMXFunctions() throws IOException intervals = manager.getIndexIntervals(); for (Map.Entry entry : intervals.entrySet()) { - if (entry.getKey().contains("StandardLowIndexInterval")) + if (entry.getKey().contains(CF_STANDARDLOWiINTERVAL)) assertTrue(entry.getValue() >= cfs.metadata.getMinIndexInterval()); } } diff --git a/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java b/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java index 2dc07ec000af..0a7f2c4d07a8 100644 --- a/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java @@ -31,6 +31,7 @@ import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.ColumnFamily; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.DecoratedKey; @@ -41,6 +42,8 @@ import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.streaming.StreamPlan; import org.apache.cassandra.streaming.StreamSession; @@ -50,16 +53,26 @@ /** * Tests backwards compatibility for SSTables */ -public class LegacySSTableTest extends SchemaLoader +public class LegacySSTableTest { public static final String LEGACY_SSTABLE_PROP = "legacy-sstable-root"; - public static final String KSNAME = "Keyspace1"; + public static final String KSNAME = "LegacySSTableTest"; public static final String CFNAME = "Standard1"; public static Set TEST_DATA; public static File LEGACY_SSTABLE_ROOT; @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KSNAME, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KSNAME, CFNAME)); + beforeClass(); + } + public static void beforeClass() { Keyspace.setInitialized(); diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableLoaderTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableLoaderTest.java index 39beb9450a80..815fc681b264 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableLoaderTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableLoaderTest.java @@ -27,12 +27,14 @@ import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.config.Schema; import org.apache.cassandra.db.DecoratedKey; import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.db.Row; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; @@ -40,12 +42,24 @@ import static org.junit.Assert.assertEquals; -public class SSTableLoaderTest extends SchemaLoader +public class SSTableLoaderTest { + public static final String KEYSPACE1 = "SSTableLoaderTest"; + public static final String CF_STANDARD = "Standard1"; + @BeforeClass + public static void defineSchema() throws Exception + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD)); + setup(); + } + public static void setup() throws Exception { - Keyspace.setInitialized(); StorageService.instance.initServer(); } @@ -53,9 +67,9 @@ public static void setup() throws Exception public void testLoadingSSTable() throws Exception { File tempdir = Files.createTempDir(); - File dataDir = new File(tempdir.getAbsolutePath() + File.separator + "Keyspace1" + File.separator + "Standard1"); + File dataDir = new File(tempdir.getAbsolutePath() + File.separator + KEYSPACE1 + File.separator + CF_STANDARD); assert dataDir.mkdirs(); - CFMetaData cfmeta = Schema.instance.getCFMetaData("Keyspace1", "Standard1"); + CFMetaData cfmeta = Schema.instance.getCFMetaData(KEYSPACE1, CF_STANDARD); SSTableSimpleUnsortedWriter writer = new SSTableSimpleUnsortedWriter(dataDir, cfmeta, StorageService.getPartitioner(), @@ -69,7 +83,7 @@ public void testLoadingSSTable() throws Exception { public void init(String keyspace) { - for (Range range : StorageService.instance.getLocalRanges("Keyspace1")) + for (Range range : StorageService.instance.getLocalRanges(KEYSPACE1)) addRangeForEndpoint(range, FBUtilities.getBroadcastAddress()); setPartitioner(StorageService.getPartitioner()); } @@ -82,7 +96,7 @@ public CFMetaData getCFMetaData(String keyspace, String cfName) loader.stream().get(); - List rows = Util.getRangeSlice(Keyspace.open("Keyspace1").getColumnFamilyStore("Standard1")); + List rows = Util.getRangeSlice(Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF_STANDARD)); assertEquals(1, rows.size()); assertEquals(key, rows.get(0).key); assertEquals(ByteBufferUtil.bytes(100), rows.get(0).cf.getColumn(Util.cellname("col1")).value()); diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableMetadataTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableMetadataTest.java index 72307c556fe6..19d984a7b5f6 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableMetadataTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableMetadataTest.java @@ -23,15 +23,22 @@ import java.nio.ByteBuffer; import java.nio.charset.CharacterCodingException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.concurrent.ExecutionException; + +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.*; import org.apache.cassandra.db.composites.*; import org.apache.cassandra.db.context.CounterContext; +import org.apache.cassandra.db.marshal.*; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.CounterId; @@ -41,18 +48,40 @@ import static org.apache.cassandra.Util.cellname; -public class SSTableMetadataTest extends SchemaLoader +public class SSTableMetadataTest { + public static final String KEYSPACE1 = "SSTableMetadataTest"; + public static final String CF_STANDARD = "Standard1"; + public static final String CF_STANDARD2 = "Standard2"; + public static final String CF_STANDARD3 = "Standard3"; + public static final String CF_STANDARDCOMPOSITE2 = "StandardComposite2"; + public static final String CF_COUNTER1 = "Counter1"; + + @BeforeClass + public static void defineSchema() throws Exception + { + AbstractType compositeMaxMin = CompositeType.getInstance(Arrays.asList(new AbstractType[]{BytesType.instance, IntegerType.instance})); + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD2), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD3), + CFMetaData.denseCFMetaData(KEYSPACE1, CF_STANDARDCOMPOSITE2, compositeMaxMin), + CFMetaData.denseCFMetaData(KEYSPACE1, CF_COUNTER1, BytesType.instance).defaultValidator(CounterColumnType.instance)); + } + @Test public void testTrackMaxDeletionTime() { - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore("Standard1"); long timestamp = System.currentTimeMillis(); for(int i = 0; i < 10; i++) { DecoratedKey key = Util.dk(Integer.toString(i)); - Mutation rm = new Mutation("Keyspace1", key.getKey()); + Mutation rm = new Mutation(KEYSPACE1, key.getKey()); for (int j = 0; j < 10; j++) rm.add("Standard1", cellname(Integer.toString(j)), ByteBufferUtil.EMPTY_BYTE_BUFFER, @@ -60,7 +89,7 @@ public void testTrackMaxDeletionTime() 10 + j); rm.apply(); } - Mutation rm = new Mutation("Keyspace1", Util.dk("longttl").getKey()); + Mutation rm = new Mutation(KEYSPACE1, Util.dk("longttl").getKey()); rm.add("Standard1", cellname("col"), ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp, @@ -76,7 +105,7 @@ public void testTrackMaxDeletionTime() assertEquals(ttltimestamp + 10000, firstDelTime, 10); } - rm = new Mutation("Keyspace1", Util.dk("longttl2").getKey()); + rm = new Mutation(KEYSPACE1, Util.dk("longttl2").getKey()); rm.add("Standard1", cellname("col"), ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp, @@ -119,11 +148,11 @@ public void testTrackMaxDeletionTime() @Test public void testWithDeletes() throws ExecutionException, InterruptedException { - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore("Standard2"); long timestamp = System.currentTimeMillis(); DecoratedKey key = Util.dk("deletetest"); - Mutation rm = new Mutation("Keyspace1", key.getKey()); + Mutation rm = new Mutation(KEYSPACE1, key.getKey()); for (int i = 0; i<5; i++) rm.add("Standard2", cellname("deletecolumn" + i), ByteBufferUtil.EMPTY_BYTE_BUFFER, @@ -143,7 +172,7 @@ public void testWithDeletes() throws ExecutionException, InterruptedException firstMaxDelTime = sstable.getSSTableMetadata().maxLocalDeletionTime; assertEquals(ttltimestamp + 1000, firstMaxDelTime, 10); } - rm = new Mutation("Keyspace1", key.getKey()); + rm = new Mutation(KEYSPACE1, key.getKey()); rm.delete("Standard2", cellname("todelete"), timestamp + 1); rm.apply(); store.forceBlockingFlush(); @@ -169,13 +198,13 @@ public void testWithDeletes() throws ExecutionException, InterruptedException @Test public void trackMaxMinColNames() throws CharacterCodingException, ExecutionException, InterruptedException { - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore("Standard3"); store.getCompactionStrategy(); for (int j = 0; j < 8; j++) { DecoratedKey key = Util.dk("row"+j); - Mutation rm = new Mutation("Keyspace1", key.getKey()); + Mutation rm = new Mutation(KEYSPACE1, key.getKey()); for (int i = 100; i<150; i++) { rm.add("Standard3", cellname(j + "col" + i), ByteBufferUtil.EMPTY_BYTE_BUFFER, System.currentTimeMillis()); @@ -190,7 +219,7 @@ public void trackMaxMinColNames() throws CharacterCodingException, ExecutionExce assertEquals(ByteBufferUtil.string(sstable.getSSTableMetadata().maxColumnNames.get(0)), "7col149"); } DecoratedKey key = Util.dk("row2"); - Mutation rm = new Mutation("Keyspace1", key.getKey()); + Mutation rm = new Mutation(KEYSPACE1, key.getKey()); for (int i = 101; i<299; i++) { rm.add("Standard3", cellname(9 + "col" + i), ByteBufferUtil.EMPTY_BYTE_BUFFER, System.currentTimeMillis()); @@ -221,7 +250,7 @@ public void testMaxMinComposites() throws CharacterCodingException, ExecutionExc --------------------- meaning max columns are b9 and 9, min is a0 and 0 */ - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore("StandardComposite2"); @@ -230,7 +259,7 @@ public void testMaxMinComposites() throws CharacterCodingException, ExecutionExc ByteBuffer key = ByteBufferUtil.bytes("k"); for (int i = 0; i < 10; i++) { - Mutation rm = new Mutation("Keyspace1", key); + Mutation rm = new Mutation(KEYSPACE1, key); CellName colName = type.makeCellName(ByteBufferUtil.bytes("a"+(9-i)), ByteBufferUtil.bytes(i)); rm.add("StandardComposite2", colName, ByteBufferUtil.EMPTY_BYTE_BUFFER, 0); rm.apply(); @@ -240,7 +269,7 @@ public void testMaxMinComposites() throws CharacterCodingException, ExecutionExc key = ByteBufferUtil.bytes("k2"); for (int i = 0; i < 10; i++) { - Mutation rm = new Mutation("Keyspace1", key); + Mutation rm = new Mutation(KEYSPACE1, key); CellName colName = type.makeCellName(ByteBufferUtil.bytes("b"+(9-i)), ByteBufferUtil.bytes(i)); rm.add("StandardComposite2", colName, ByteBufferUtil.EMPTY_BYTE_BUFFER, 0); rm.apply(); @@ -260,7 +289,7 @@ public void testMaxMinComposites() throws CharacterCodingException, ExecutionExc @Test public void testLegacyCounterShardTracking() { - ColumnFamilyStore cfs = Keyspace.open("Keyspace1").getColumnFamilyStore("Counter1"); + ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore("Counter1"); // A cell with all shards CounterContext.ContextState state = CounterContext.ContextState.allocate(1, 1, 1); diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java index 69971620cabf..01ca340c3117 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java @@ -34,11 +34,13 @@ import java.util.concurrent.ThreadPoolExecutor; import com.google.common.collect.Sets; +import org.apache.cassandra.cache.CachingOptions; +import org.apache.cassandra.config.KSMetaData; +import org.apache.cassandra.locator.SimpleStrategy; import org.junit.Assert; +import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.apache.cassandra.OrderedJUnit4ClassRunner; import org.apache.cassandra.SchemaLoader; @@ -75,19 +77,39 @@ import static org.junit.Assert.assertTrue; @RunWith(OrderedJUnit4ClassRunner.class) -public class SSTableReaderTest extends SchemaLoader +public class SSTableReaderTest { - private static final Logger logger = LoggerFactory.getLogger(SSTableReaderTest.class); + public static final String KEYSPACE1 = "SSTableReaderTest"; + public static final String CF_STANDARD = "Standard1"; + public static final String CF_STANDARD2 = "Standard2"; + public static final String CF_INDEXED = "Indexed1"; + public static final String CF_STANDARDLOWINDEXINTERVAL = "StandardLowIndexInterval"; static Token t(int i) { return StorageService.getPartitioner().getToken(ByteBufferUtil.bytes(String.valueOf(i))); } + @BeforeClass + public static void defineSchema() throws Exception + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD2), + SchemaLoader.indexCFMD(KEYSPACE1, CF_INDEXED, true), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARDLOWINDEXINTERVAL) + .minIndexInterval(8) + .maxIndexInterval(256) + .caching(CachingOptions.NONE)); + } + @Test public void testGetPositionsForRanges() throws ExecutionException, InterruptedException { - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore("Standard2"); // insert data and compact to a single sstable @@ -95,7 +117,7 @@ public void testGetPositionsForRanges() throws ExecutionException, InterruptedEx for (int j = 0; j < 10; j++) { ByteBuffer key = ByteBufferUtil.bytes(String.valueOf(j)); - Mutation rm = new Mutation("Keyspace1", key); + Mutation rm = new Mutation(KEYSPACE1, key); rm.add("Standard2", cellname("0"), ByteBufferUtil.EMPTY_BYTE_BUFFER, j); rm.apply(); } @@ -128,7 +150,7 @@ public void testSpannedIndexPositions() throws IOException, ExecutionException, { MmappedSegmentedFile.MAX_SEGMENT_SIZE = 40; // each index entry is ~11 bytes, so this will generate lots of segments - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore("Standard1"); // insert a bunch of data and compact to a single sstable @@ -136,7 +158,7 @@ public void testSpannedIndexPositions() throws IOException, ExecutionException, for (int j = 0; j < 100; j += 2) { ByteBuffer key = ByteBufferUtil.bytes(String.valueOf(j)); - Mutation rm = new Mutation("Keyspace1", key); + Mutation rm = new Mutation(KEYSPACE1, key); rm.add("Standard1", cellname("0"), ByteBufferUtil.EMPTY_BYTE_BUFFER, j); rm.apply(); } @@ -165,13 +187,13 @@ public void testSpannedIndexPositions() throws IOException, ExecutionException, public void testPersistentStatistics() { - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore("Standard1"); for (int j = 0; j < 100; j += 2) { ByteBuffer key = ByteBufferUtil.bytes(String.valueOf(j)); - Mutation rm = new Mutation("Keyspace1", key); + Mutation rm = new Mutation(KEYSPACE1, key); rm.add("Standard1", cellname("0"), ByteBufferUtil.EMPTY_BYTE_BUFFER, j); rm.apply(); } @@ -190,7 +212,7 @@ private void clearAndLoad(ColumnFamilyStore cfs) @Test public void testGetPositionsForRangesWithKeyCache() throws ExecutionException, InterruptedException { - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore("Standard2"); CacheService.instance.keyCache.setCapacity(100); @@ -199,7 +221,7 @@ public void testGetPositionsForRangesWithKeyCache() throws ExecutionException, I for (int j = 0; j < 10; j++) { ByteBuffer key = ByteBufferUtil.bytes(String.valueOf(j)); - Mutation rm = new Mutation("Keyspace1", key); + Mutation rm = new Mutation(KEYSPACE1, key); rm.add("Standard2", cellname("0"), ByteBufferUtil.EMPTY_BYTE_BUFFER, j); rm.apply(); } @@ -225,10 +247,10 @@ public void testGetPositionsForRangesWithKeyCache() throws ExecutionException, I public void testPersistentStatisticsWithSecondaryIndex() { // Create secondary index and flush to disk - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore("Indexed1"); ByteBuffer key = ByteBufferUtil.bytes(String.valueOf("k1")); - Mutation rm = new Mutation("Keyspace1", key); + Mutation rm = new Mutation(KEYSPACE1, key); rm.add("Indexed1", cellname("birthdate"), ByteBufferUtil.bytes(1L), System.currentTimeMillis()); rm.apply(); store.forceBlockingFlush(); @@ -240,7 +262,7 @@ public void testPersistentStatisticsWithSecondaryIndex() @Test public void testOpeningSSTable() throws Exception { - String ks = "Keyspace1"; + String ks = KEYSPACE1; String cf = "Standard1"; // clear and create just one sstable for this test @@ -281,10 +303,10 @@ public void testOpeningSSTable() throws Exception @Test public void testLoadingSummaryUsesCorrectPartitioner() throws Exception { - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore("Indexed1"); ByteBuffer key = ByteBufferUtil.bytes(String.valueOf("k1")); - Mutation rm = new Mutation("Keyspace1", key); + Mutation rm = new Mutation(KEYSPACE1, key); rm.add("Indexed1", cellname("birthdate"), ByteBufferUtil.bytes(1L), System.currentTimeMillis()); rm.apply(); store.forceBlockingFlush(); @@ -308,10 +330,10 @@ public void testLoadingSummaryUsesCorrectPartitioner() throws Exception @Test public void testGetScannerForNoIntersectingRanges() { - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore("Standard1"); ByteBuffer key = ByteBufferUtil.bytes(String.valueOf("k1")); - Mutation rm = new Mutation("Keyspace1", key); + Mutation rm = new Mutation(KEYSPACE1, key); rm.add("Standard1", cellname("xyz"), ByteBufferUtil.bytes("abc"), 0); rm.apply(); store.forceBlockingFlush(); @@ -328,7 +350,7 @@ public void testGetScannerForNoIntersectingRanges() @Test public void testGetPositionsForRangesFromTableOpenedForBulkLoading() throws IOException, ExecutionException, InterruptedException { - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore("Standard2"); // insert data and compact to a single sstable. The @@ -338,7 +360,7 @@ public void testGetPositionsForRangesFromTableOpenedForBulkLoading() throws IOEx for (int j = 0; j < 130; j++) { ByteBuffer key = ByteBufferUtil.bytes(String.valueOf(j)); - Mutation rm = new Mutation("Keyspace1", key); + Mutation rm = new Mutation(KEYSPACE1, key); rm.add("Standard2", cellname("0"), ByteBufferUtil.EMPTY_BYTE_BUFFER, j); rm.apply(); } @@ -364,7 +386,7 @@ public void testGetPositionsForRangesFromTableOpenedForBulkLoading() throws IOEx @Test public void testIndexSummaryReplacement() throws IOException, ExecutionException, InterruptedException { - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); final ColumnFamilyStore store = keyspace.getColumnFamilyStore("StandardLowIndexInterval"); // index interval of 8, no key caching CompactionManager.instance.disableAutoCompaction(); @@ -372,7 +394,7 @@ public void testIndexSummaryReplacement() throws IOException, ExecutionException for (int j = 0; j < NUM_ROWS; j++) { ByteBuffer key = ByteBufferUtil.bytes(String.format("%3d", j)); - Mutation rm = new Mutation("Keyspace1", key); + Mutation rm = new Mutation(KEYSPACE1, key); rm.add("StandardLowIndexInterval", Util.cellname("0"), ByteBufferUtil.bytes(String.format("%3d", j)), j); rm.apply(); } diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableScannerTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableScannerTest.java index ff1a3054f506..681efb694367 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableScannerTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableScannerTest.java @@ -21,10 +21,12 @@ import java.util.ArrayList; import java.util.Collection; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.*; import org.apache.cassandra.db.columniterator.IdentityQueryFilter; import org.apache.cassandra.db.compaction.ICompactionScanner; @@ -32,15 +34,26 @@ import org.apache.cassandra.dht.BytesToken; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.ByteBufferUtil; import static org.junit.Assert.*; -public class SSTableScannerTest extends SchemaLoader +public class SSTableScannerTest { - public static final String KEYSPACE = "Keyspace1"; + public static final String KEYSPACE = "SSTableScannerTest"; public static final String TABLE = "Standard1"; + @BeforeClass + public static void defineSchema() throws Exception + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE, TABLE)); + } + private static String toKey(int key) { return String.format("%03d", key); diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableSimpleWriterTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableSimpleWriterTest.java index 15980a49689c..df9c56bd78de 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableSimpleWriterTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableSimpleWriterTest.java @@ -20,27 +20,43 @@ import java.io.File; -import org.apache.cassandra.config.Schema; -import org.apache.cassandra.dht.IPartitioner; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.config.KSMetaData; +import org.apache.cassandra.config.Schema; import org.apache.cassandra.db.*; import org.apache.cassandra.db.marshal.IntegerType; +import org.apache.cassandra.dht.IPartitioner; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.service.StorageService; import static org.apache.cassandra.utils.ByteBufferUtil.bytes; import static org.apache.cassandra.utils.ByteBufferUtil.toInt; -public class SSTableSimpleWriterTest extends SchemaLoader +public class SSTableSimpleWriterTest { + public static final String KEYSPACE = "SSTableSimpleWriterTest"; + public static final String CF_STANDARDINT = "StandardInteger1"; + + @BeforeClass + public static void defineSchema() throws Exception + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE, CF_STANDARDINT)); + } + @Test public void testSSTableSimpleUnsortedWriter() throws Exception { final int INC = 5; final int NBCOL = 10; - String keyspaceName = "Keyspace1"; + String keyspaceName = KEYSPACE; String cfname = "StandardInteger1"; Keyspace t = Keyspace.open(keyspaceName); // make sure we create the directory diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java b/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java index d39f96803772..32d07ac49b7c 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java @@ -37,9 +37,21 @@ public class SSTableUtils public static String KEYSPACENAME = "Keyspace1"; public static String CFNAME = "Standard1"; + public SSTableUtils(String ksname, String cfname) + { + KEYSPACENAME = ksname; + CFNAME = cfname; + } + + /**/ public static ColumnFamily createCF(long mfda, int ldt, Cell... cols) { - ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACENAME, CFNAME); + return createCF(KEYSPACENAME, CFNAME, mfda, ldt, cols); + } + + public static ColumnFamily createCF(String ksname, String cfname, long mfda, int ldt, Cell... cols) + { + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(ksname, cfname); cf.delete(new DeletionInfo(mfda, ldt)); for (Cell col : cols) cf.addColumn(col); diff --git a/test/unit/org/apache/cassandra/locator/OldNetworkTopologyStrategyTest.java b/test/unit/org/apache/cassandra/locator/OldNetworkTopologyStrategyTest.java index 4ae21c02211a..517167f6f5ee 100644 --- a/test/unit/org/apache/cassandra/locator/OldNetworkTopologyStrategyTest.java +++ b/test/unit/org/apache/cassandra/locator/OldNetworkTopologyStrategyTest.java @@ -31,7 +31,6 @@ import java.util.Map; import java.util.Set; -import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.dht.BigIntegerToken; import org.apache.cassandra.dht.Range; @@ -41,7 +40,7 @@ import org.junit.Before; import org.junit.Test; -public class OldNetworkTopologyStrategyTest extends SchemaLoader +public class OldNetworkTopologyStrategyTest { private List keyTokens; private TokenMetadata tmd; diff --git a/test/unit/org/apache/cassandra/locator/ReplicationStrategyEndpointCacheTest.java b/test/unit/org/apache/cassandra/locator/ReplicationStrategyEndpointCacheTest.java index 91f6111318d2..2a41e501e4d0 100644 --- a/test/unit/org/apache/cassandra/locator/ReplicationStrategyEndpointCacheTest.java +++ b/test/unit/org/apache/cassandra/locator/ReplicationStrategyEndpointCacheTest.java @@ -22,28 +22,39 @@ import java.net.InetAddress; import java.util.*; -import org.apache.cassandra.db.Keyspace; - import org.apache.commons.lang3.StringUtils; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; +import org.apache.cassandra.config.KSMetaData; +import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.dht.BigIntegerToken; import org.apache.cassandra.dht.Token; -public class ReplicationStrategyEndpointCacheTest extends SchemaLoader +public class ReplicationStrategyEndpointCacheTest { private TokenMetadata tmd; private Token searchToken; private AbstractReplicationStrategy strategy; + public static final String KEYSPACE = "ReplicationStrategyEndpointCacheTest"; + + @BeforeClass + public static void defineSchema() throws Exception + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE, + SimpleStrategy.class, + KSMetaData.optsWithRF(5)); + } public void setup(Class stratClass, Map strategyOptions) throws Exception { tmd = new TokenMetadata(); searchToken = new BigIntegerToken(String.valueOf(15)); - strategy = getStrategyWithNewTokenMetadata(Keyspace.open("Keyspace3").getReplicationStrategy(), tmd); + strategy = getStrategyWithNewTokenMetadata(Keyspace.open(KEYSPACE).getReplicationStrategy(), tmd); tmd.updateNormalToken(new BigIntegerToken(String.valueOf(10)), InetAddress.getByName("127.0.0.1")); tmd.updateNormalToken(new BigIntegerToken(String.valueOf(20)), InetAddress.getByName("127.0.0.2")); diff --git a/test/unit/org/apache/cassandra/locator/SimpleStrategyTest.java b/test/unit/org/apache/cassandra/locator/SimpleStrategyTest.java index d4978ae6f503..87c8613db45a 100644 --- a/test/unit/org/apache/cassandra/locator/SimpleStrategyTest.java +++ b/test/unit/org/apache/cassandra/locator/SimpleStrategyTest.java @@ -26,25 +26,37 @@ import java.util.HashSet; import java.util.List; -import org.apache.cassandra.config.Schema; -import org.apache.cassandra.service.PendingRangeCalculatorService; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.config.KSMetaData; +import org.apache.cassandra.config.Schema; import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.dht.*; +import org.apache.cassandra.service.PendingRangeCalculatorService; import org.apache.cassandra.service.StorageServiceAccessor; import org.apache.cassandra.utils.ByteBufferUtil; import static org.junit.Assert.*; -public class SimpleStrategyTest extends SchemaLoader +public class SimpleStrategyTest { + public static final String KEYSPACE1 = "SimpleStrategyTest"; + + @BeforeClass + public static void defineSchema() throws Exception + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1)); + } + @Test public void tryValidKeyspace() { - assert Keyspace.open("Keyspace1").getReplicationStrategy() != null; + assert Keyspace.open(KEYSPACE1).getReplicationStrategy() != null; } @Test diff --git a/test/unit/org/apache/cassandra/repair/DifferencerTest.java b/test/unit/org/apache/cassandra/repair/DifferencerTest.java index bc0f0de64cc5..e1ff26e77c82 100644 --- a/test/unit/org/apache/cassandra/repair/DifferencerTest.java +++ b/test/unit/org/apache/cassandra/repair/DifferencerTest.java @@ -24,15 +24,18 @@ import java.util.UUID; import org.junit.After; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.dht.Murmur3Partitioner; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.net.MessageIn; import org.apache.cassandra.net.MessageOut; import org.apache.cassandra.net.MessagingService; @@ -46,9 +49,21 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -public class DifferencerTest extends SchemaLoader +public class DifferencerTest { private static final IPartitioner partirioner = new Murmur3Partitioner(); + public static final String KEYSPACE1 = "DifferencerTest"; + public static final String CF_STANDARD = "Standard1"; + + @BeforeClass + public static void defineSchema() throws Exception + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD)); + } @After public void tearDown() @@ -86,7 +101,7 @@ public MessageIn handleMessage(MessageIn message, int id, InetAddress to) } }); Range range = new Range<>(partirioner.getMinimumToken(), partirioner.getRandomToken()); - RepairJobDesc desc = new RepairJobDesc(UUID.randomUUID(), UUID.randomUUID(), "Keyspace1", "Standard1", range); + RepairJobDesc desc = new RepairJobDesc(UUID.randomUUID(), UUID.randomUUID(), KEYSPACE1, "Standard1", range); MerkleTree tree1 = createInitialTree(desc); MerkleTree tree2 = createInitialTree(desc); @@ -106,12 +121,12 @@ public void testDifference() throws Throwable { Range range = new Range<>(partirioner.getMinimumToken(), partirioner.getRandomToken()); UUID parentRepairSession = UUID.randomUUID(); - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore("Standard1"); ActiveRepairService.instance.registerParentRepairSession(parentRepairSession, Arrays.asList(cfs), Arrays.asList(range)); - RepairJobDesc desc = new RepairJobDesc(parentRepairSession, UUID.randomUUID(), "Keyspace1", "Standard1", range); + RepairJobDesc desc = new RepairJobDesc(parentRepairSession, UUID.randomUUID(), KEYSPACE1, "Standard1", range); MerkleTree tree1 = createInitialTree(desc); MerkleTree tree2 = createInitialTree(desc); diff --git a/test/unit/org/apache/cassandra/repair/ValidatorTest.java b/test/unit/org/apache/cassandra/repair/ValidatorTest.java index c3ce810ef100..e18ce9bbe0e7 100644 --- a/test/unit/org/apache/cassandra/repair/ValidatorTest.java +++ b/test/unit/org/apache/cassandra/repair/ValidatorTest.java @@ -23,9 +23,11 @@ import java.util.UUID; import org.junit.After; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.BufferDecoratedKey; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.DecoratedKey; @@ -37,6 +39,7 @@ import org.apache.cassandra.dht.Token; import org.apache.cassandra.io.sstable.ColumnStats; import org.apache.cassandra.io.util.DataOutputPlus; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.net.MessageIn; import org.apache.cassandra.net.MessageOut; import org.apache.cassandra.net.MessagingService; @@ -50,12 +53,22 @@ import static org.junit.Assert.*; -public class ValidatorTest extends SchemaLoader +public class ValidatorTest { - private final String keyspace = "Keyspace1"; - private final String columnFamily = "Standard1"; + private static final String keyspace = "ValidatorTest"; + private static final String columnFamily = "Standard1"; private final IPartitioner partitioner = StorageService.getPartitioner(); + @BeforeClass + public static void defineSchema() throws Exception + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(keyspace, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(keyspace, columnFamily)); + } + @After public void tearDown() { diff --git a/test/unit/org/apache/cassandra/service/AntiEntropyServiceCounterTest.java b/test/unit/org/apache/cassandra/service/AntiEntropyServiceCounterTest.java index 4a82183fdc0f..3f1c3aac9b2b 100644 --- a/test/unit/org/apache/cassandra/service/AntiEntropyServiceCounterTest.java +++ b/test/unit/org/apache/cassandra/service/AntiEntropyServiceCounterTest.java @@ -32,8 +32,8 @@ public class AntiEntropyServiceCounterTest extends AntiEntropyServiceTestAbstrac { public void init() { - keyspaceName = "Keyspace5"; - cfname = "Counter1"; + keyspaceName = AntiEntropyServiceTestAbstract.KEYSPACE5; + cfname = AntiEntropyServiceTestAbstract.CF_COUNTER;; } public List getWriteData() diff --git a/test/unit/org/apache/cassandra/service/AntiEntropyServiceStandardTest.java b/test/unit/org/apache/cassandra/service/AntiEntropyServiceStandardTest.java index f4025cce23b7..c83a7301f991 100644 --- a/test/unit/org/apache/cassandra/service/AntiEntropyServiceStandardTest.java +++ b/test/unit/org/apache/cassandra/service/AntiEntropyServiceStandardTest.java @@ -31,8 +31,8 @@ public class AntiEntropyServiceStandardTest extends AntiEntropyServiceTestAbstra { public void init() { - keyspaceName = "Keyspace5"; - cfname = "Standard1"; + keyspaceName = AntiEntropyServiceStandardTest.KEYSPACE5; + cfname = AntiEntropyServiceStandardTest.CF_STANDRAD1; } public List getWriteData() diff --git a/test/unit/org/apache/cassandra/service/AntiEntropyServiceTestAbstract.java b/test/unit/org/apache/cassandra/service/AntiEntropyServiceTestAbstract.java index ac39de6a6380..efa47c10d4ef 100644 --- a/test/unit/org/apache/cassandra/service/AntiEntropyServiceTestAbstract.java +++ b/test/unit/org/apache/cassandra/service/AntiEntropyServiceTestAbstract.java @@ -27,9 +27,11 @@ import com.google.common.collect.Sets; import org.junit.After; import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.concurrent.Stage; import org.apache.cassandra.concurrent.StageManager; import org.apache.cassandra.config.DatabaseDescriptor; @@ -38,16 +40,18 @@ import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.gms.Gossiper; import org.apache.cassandra.locator.AbstractReplicationStrategy; import org.apache.cassandra.locator.TokenMetadata; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.repair.RepairJobDesc; import org.apache.cassandra.utils.FBUtilities; import static org.junit.Assert.assertEquals; -public abstract class AntiEntropyServiceTestAbstract extends SchemaLoader +public abstract class AntiEntropyServiceTestAbstract { // keyspace and column family to test against public ActiveRepairService aes; @@ -66,11 +70,27 @@ public abstract class AntiEntropyServiceTestAbstract extends SchemaLoader public abstract List getWriteData(); + public static final String KEYSPACE5 = "Keyspace5"; + public static final String CF_STANDRAD1 = "Standard1"; + public static final String CF_COUNTER = "Counter1"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE5, + SimpleStrategy.class, + KSMetaData.optsWithRF(2), + SchemaLoader.standardCFMD(KEYSPACE5, CF_COUNTER), + SchemaLoader.standardCFMD(KEYSPACE5, CF_STANDRAD1)); + } + @Before public void prepare() throws Exception { if (!initialized) { + SchemaLoader.startGossiper(); initialized = true; init(); diff --git a/test/unit/org/apache/cassandra/service/EmbeddedCassandraServiceTest.java b/test/unit/org/apache/cassandra/service/EmbeddedCassandraServiceTest.java index 24b5a745c9f1..143788684bbc 100644 --- a/test/unit/org/apache/cassandra/service/EmbeddedCassandraServiceTest.java +++ b/test/unit/org/apache/cassandra/service/EmbeddedCassandraServiceTest.java @@ -27,7 +27,8 @@ import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.config.DatabaseDescriptor; -import org.apache.cassandra.config.Schema; +import org.apache.cassandra.config.KSMetaData; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.thrift.*; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.thrift.TException; @@ -47,10 +48,23 @@ * Tests connect to localhost:9160 when the embedded server is running. * */ -public class EmbeddedCassandraServiceTest extends SchemaLoader +public class EmbeddedCassandraServiceTest { private static EmbeddedCassandraService cassandra; + private static final String KEYSPACE1 = "EmbeddedCassandraServiceTest"; + private static final String CF_STANDARD = "Standard1"; + + @BeforeClass + public static void defineSchema() throws Exception + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD)); + setup(); + } /** * Set embedded cassandra up and spawn it in a new thread. @@ -59,10 +73,9 @@ public class EmbeddedCassandraServiceTest extends SchemaLoader * @throws IOException * @throws InterruptedException */ - @BeforeClass public static void setup() throws TTransportException, IOException, InterruptedException { - Schema.instance.clear(); // Schema are now written on disk and will be reloaded + // unique ks / cfs mean no need to clear the schema cassandra = new EmbeddedCassandraService(); cassandra.start(); } @@ -72,7 +85,7 @@ public void testEmbeddedCassandraService() throws AuthenticationException, AuthorizationException, InvalidRequestException, UnavailableException, TimedOutException, TException, NotFoundException, CharacterCodingException { Cassandra.Client client = getClient(); - client.set_keyspace("Keyspace1"); + client.set_keyspace(KEYSPACE1); ByteBuffer key_user_id = ByteBufferUtil.bytes("1"); diff --git a/test/unit/org/apache/cassandra/service/LeaveAndBootstrapTest.java b/test/unit/org/apache/cassandra/service/LeaveAndBootstrapTest.java index eef8c86bc3a7..bf34ba61fddb 100644 --- a/test/unit/org/apache/cassandra/service/LeaveAndBootstrapTest.java +++ b/test/unit/org/apache/cassandra/service/LeaveAndBootstrapTest.java @@ -23,9 +23,6 @@ import java.net.UnknownHostException; import java.util.*; -import org.apache.cassandra.db.SystemKeyspace; -import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.config.Schema; import org.junit.Test; import static org.junit.Assert.*; @@ -36,6 +33,8 @@ import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; import org.apache.cassandra.config.KSMetaData; +import org.apache.cassandra.config.Schema; +import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.dht.*; import org.apache.cassandra.gms.ApplicationState; import org.apache.cassandra.gms.Gossiper; @@ -48,19 +47,23 @@ public class LeaveAndBootstrapTest { private static final IPartitioner partitioner = new RandomPartitioner(); private static IPartitioner oldPartitioner; + private static final String KEYSPACE1 = "LeaveAndBootstrapTestKeyspace1"; + private static final String KEYSPACE2 = "LeaveAndBootstrapTestKeyspace2"; + private static final String KEYSPACE3 = "LeaveAndBootstrapTestKeyspace3"; + private static final String KEYSPACE4 = "LeaveAndBootstrapTestKeyspace4"; @BeforeClass - public static void setup() throws ConfigurationException + public static void defineSchema() throws Exception { oldPartitioner = StorageService.instance.setPartitionerUnsafe(partitioner); SchemaLoader.loadSchema(); + SchemaLoader.schemaDefinition("LeaveAndBootstrapTest"); } @AfterClass public static void tearDown() { StorageService.instance.setPartitionerUnsafe(oldPartitioner); - SchemaLoader.stopGossiper(); } /** @@ -185,55 +188,55 @@ public void testSimultaneousMove() throws UnknownHostException Map keyspaceStrategyMap = new HashMap(); for (int i=1; i<=4; i++) { - keyspaceStrategyMap.put("Keyspace" + i, getStrategy("Keyspace" + i, tmd)); + keyspaceStrategyMap.put("LeaveAndBootstrapTestKeyspace" + i, getStrategy("LeaveAndBootstrapTestKeyspace" + i, tmd)); } // pre-calculate the results. Map> expectedEndpoints = new HashMap>(); - expectedEndpoints.put("Keyspace1", HashMultimap.create()); - expectedEndpoints.get("Keyspace1").putAll(new BigIntegerToken("5"), makeAddrs("127.0.0.2")); - expectedEndpoints.get("Keyspace1").putAll(new BigIntegerToken("15"), makeAddrs("127.0.0.3")); - expectedEndpoints.get("Keyspace1").putAll(new BigIntegerToken("25"), makeAddrs("127.0.0.4")); - expectedEndpoints.get("Keyspace1").putAll(new BigIntegerToken("35"), makeAddrs("127.0.0.5")); - expectedEndpoints.get("Keyspace1").putAll(new BigIntegerToken("45"), makeAddrs("127.0.0.6")); - expectedEndpoints.get("Keyspace1").putAll(new BigIntegerToken("55"), makeAddrs("127.0.0.7", "127.0.0.8", "127.0.1.1")); - expectedEndpoints.get("Keyspace1").putAll(new BigIntegerToken("65"), makeAddrs("127.0.0.8")); - expectedEndpoints.get("Keyspace1").putAll(new BigIntegerToken("75"), makeAddrs("127.0.0.9", "127.0.1.2", "127.0.0.1")); - expectedEndpoints.get("Keyspace1").putAll(new BigIntegerToken("85"), makeAddrs("127.0.0.10", "127.0.0.1")); - expectedEndpoints.get("Keyspace1").putAll(new BigIntegerToken("95"), makeAddrs("127.0.0.1")); - expectedEndpoints.put("Keyspace2", HashMultimap.create()); - expectedEndpoints.get("Keyspace2").putAll(new BigIntegerToken("5"), makeAddrs("127.0.0.2")); - expectedEndpoints.get("Keyspace2").putAll(new BigIntegerToken("15"), makeAddrs("127.0.0.3")); - expectedEndpoints.get("Keyspace2").putAll(new BigIntegerToken("25"), makeAddrs("127.0.0.4")); - expectedEndpoints.get("Keyspace2").putAll(new BigIntegerToken("35"), makeAddrs("127.0.0.5")); - expectedEndpoints.get("Keyspace2").putAll(new BigIntegerToken("45"), makeAddrs("127.0.0.6")); - expectedEndpoints.get("Keyspace2").putAll(new BigIntegerToken("55"), makeAddrs("127.0.0.7", "127.0.0.8", "127.0.1.1")); - expectedEndpoints.get("Keyspace2").putAll(new BigIntegerToken("65"), makeAddrs("127.0.0.8")); - expectedEndpoints.get("Keyspace2").putAll(new BigIntegerToken("75"), makeAddrs("127.0.0.9", "127.0.1.2", "127.0.0.1")); - expectedEndpoints.get("Keyspace2").putAll(new BigIntegerToken("85"), makeAddrs("127.0.0.10", "127.0.0.1")); - expectedEndpoints.get("Keyspace2").putAll(new BigIntegerToken("95"), makeAddrs("127.0.0.1")); - expectedEndpoints.put("Keyspace3", HashMultimap.create()); - expectedEndpoints.get("Keyspace3").putAll(new BigIntegerToken("5"), makeAddrs("127.0.0.2", "127.0.0.3", "127.0.0.4", "127.0.0.5", "127.0.0.6")); - expectedEndpoints.get("Keyspace3").putAll(new BigIntegerToken("15"), makeAddrs("127.0.0.3", "127.0.0.4", "127.0.0.5", "127.0.0.6", "127.0.0.7", "127.0.1.1", "127.0.0.8")); - expectedEndpoints.get("Keyspace3").putAll(new BigIntegerToken("25"), makeAddrs("127.0.0.4", "127.0.0.5", "127.0.0.6", "127.0.0.7", "127.0.0.8", "127.0.1.2", "127.0.0.1", "127.0.1.1")); - expectedEndpoints.get("Keyspace3").putAll(new BigIntegerToken("35"), makeAddrs("127.0.0.5", "127.0.0.6", "127.0.0.7", "127.0.0.8", "127.0.0.9", "127.0.1.2", "127.0.0.1", "127.0.0.2", "127.0.1.1")); - expectedEndpoints.get("Keyspace3").putAll(new BigIntegerToken("45"), makeAddrs("127.0.0.6", "127.0.0.7", "127.0.0.8", "127.0.0.9", "127.0.0.10", "127.0.1.2", "127.0.0.1", "127.0.0.2", "127.0.1.1", "127.0.0.3")); - expectedEndpoints.get("Keyspace3").putAll(new BigIntegerToken("55"), makeAddrs("127.0.0.7", "127.0.0.8", "127.0.0.9", "127.0.0.10", "127.0.0.1", "127.0.0.2", "127.0.0.3", "127.0.0.4", "127.0.1.1", "127.0.1.2")); - expectedEndpoints.get("Keyspace3").putAll(new BigIntegerToken("65"), makeAddrs("127.0.0.8", "127.0.0.9", "127.0.0.10", "127.0.0.1", "127.0.0.2", "127.0.1.2", "127.0.0.3", "127.0.0.4")); - expectedEndpoints.get("Keyspace3").putAll(new BigIntegerToken("75"), makeAddrs("127.0.0.9", "127.0.0.10", "127.0.0.1", "127.0.0.2", "127.0.0.3", "127.0.1.2", "127.0.0.4", "127.0.0.5")); - expectedEndpoints.get("Keyspace3").putAll(new BigIntegerToken("85"), makeAddrs("127.0.0.10", "127.0.0.1", "127.0.0.2", "127.0.0.3", "127.0.0.4", "127.0.0.5")); - expectedEndpoints.get("Keyspace3").putAll(new BigIntegerToken("95"), makeAddrs("127.0.0.1", "127.0.0.2", "127.0.0.3", "127.0.0.4", "127.0.0.5")); - expectedEndpoints.put("Keyspace4", HashMultimap.create()); - expectedEndpoints.get("Keyspace4").putAll(new BigIntegerToken("5"), makeAddrs("127.0.0.2", "127.0.0.3", "127.0.0.4")); - expectedEndpoints.get("Keyspace4").putAll(new BigIntegerToken("15"), makeAddrs("127.0.0.3", "127.0.0.4", "127.0.0.5")); - expectedEndpoints.get("Keyspace4").putAll(new BigIntegerToken("25"), makeAddrs("127.0.0.4", "127.0.0.5", "127.0.0.6")); - expectedEndpoints.get("Keyspace4").putAll(new BigIntegerToken("35"), makeAddrs("127.0.0.5", "127.0.0.6", "127.0.0.7", "127.0.1.1", "127.0.0.8")); - expectedEndpoints.get("Keyspace4").putAll(new BigIntegerToken("45"), makeAddrs("127.0.0.6", "127.0.0.7", "127.0.0.8", "127.0.1.2", "127.0.0.1", "127.0.1.1")); - expectedEndpoints.get("Keyspace4").putAll(new BigIntegerToken("55"), makeAddrs("127.0.0.7", "127.0.0.8", "127.0.0.9", "127.0.0.1", "127.0.0.2", "127.0.1.1", "127.0.1.2")); - expectedEndpoints.get("Keyspace4").putAll(new BigIntegerToken("65"), makeAddrs("127.0.0.8", "127.0.0.9", "127.0.0.10", "127.0.1.2", "127.0.0.1", "127.0.0.2")); - expectedEndpoints.get("Keyspace4").putAll(new BigIntegerToken("75"), makeAddrs("127.0.0.9", "127.0.0.10", "127.0.0.1", "127.0.1.2", "127.0.0.2", "127.0.0.3")); - expectedEndpoints.get("Keyspace4").putAll(new BigIntegerToken("85"), makeAddrs("127.0.0.10", "127.0.0.1", "127.0.0.2", "127.0.0.3")); - expectedEndpoints.get("Keyspace4").putAll(new BigIntegerToken("95"), makeAddrs("127.0.0.1", "127.0.0.2", "127.0.0.3")); + expectedEndpoints.put(KEYSPACE1, HashMultimap.create()); + expectedEndpoints.get(KEYSPACE1).putAll(new BigIntegerToken("5"), makeAddrs("127.0.0.2")); + expectedEndpoints.get(KEYSPACE1).putAll(new BigIntegerToken("15"), makeAddrs("127.0.0.3")); + expectedEndpoints.get(KEYSPACE1).putAll(new BigIntegerToken("25"), makeAddrs("127.0.0.4")); + expectedEndpoints.get(KEYSPACE1).putAll(new BigIntegerToken("35"), makeAddrs("127.0.0.5")); + expectedEndpoints.get(KEYSPACE1).putAll(new BigIntegerToken("45"), makeAddrs("127.0.0.6")); + expectedEndpoints.get(KEYSPACE1).putAll(new BigIntegerToken("55"), makeAddrs("127.0.0.7", "127.0.0.8", "127.0.1.1")); + expectedEndpoints.get(KEYSPACE1).putAll(new BigIntegerToken("65"), makeAddrs("127.0.0.8")); + expectedEndpoints.get(KEYSPACE1).putAll(new BigIntegerToken("75"), makeAddrs("127.0.0.9", "127.0.1.2", "127.0.0.1")); + expectedEndpoints.get(KEYSPACE1).putAll(new BigIntegerToken("85"), makeAddrs("127.0.0.10", "127.0.0.1")); + expectedEndpoints.get(KEYSPACE1).putAll(new BigIntegerToken("95"), makeAddrs("127.0.0.1")); + expectedEndpoints.put(KEYSPACE2, HashMultimap.create()); + expectedEndpoints.get(KEYSPACE2).putAll(new BigIntegerToken("5"), makeAddrs("127.0.0.2")); + expectedEndpoints.get(KEYSPACE2).putAll(new BigIntegerToken("15"), makeAddrs("127.0.0.3")); + expectedEndpoints.get(KEYSPACE2).putAll(new BigIntegerToken("25"), makeAddrs("127.0.0.4")); + expectedEndpoints.get(KEYSPACE2).putAll(new BigIntegerToken("35"), makeAddrs("127.0.0.5")); + expectedEndpoints.get(KEYSPACE2).putAll(new BigIntegerToken("45"), makeAddrs("127.0.0.6")); + expectedEndpoints.get(KEYSPACE2).putAll(new BigIntegerToken("55"), makeAddrs("127.0.0.7", "127.0.0.8", "127.0.1.1")); + expectedEndpoints.get(KEYSPACE2).putAll(new BigIntegerToken("65"), makeAddrs("127.0.0.8")); + expectedEndpoints.get(KEYSPACE2).putAll(new BigIntegerToken("75"), makeAddrs("127.0.0.9", "127.0.1.2", "127.0.0.1")); + expectedEndpoints.get(KEYSPACE2).putAll(new BigIntegerToken("85"), makeAddrs("127.0.0.10", "127.0.0.1")); + expectedEndpoints.get(KEYSPACE2).putAll(new BigIntegerToken("95"), makeAddrs("127.0.0.1")); + expectedEndpoints.put(KEYSPACE3, HashMultimap.create()); + expectedEndpoints.get(KEYSPACE3).putAll(new BigIntegerToken("5"), makeAddrs("127.0.0.2", "127.0.0.3", "127.0.0.4", "127.0.0.5", "127.0.0.6")); + expectedEndpoints.get(KEYSPACE3).putAll(new BigIntegerToken("15"), makeAddrs("127.0.0.3", "127.0.0.4", "127.0.0.5", "127.0.0.6", "127.0.0.7", "127.0.1.1", "127.0.0.8")); + expectedEndpoints.get(KEYSPACE3).putAll(new BigIntegerToken("25"), makeAddrs("127.0.0.4", "127.0.0.5", "127.0.0.6", "127.0.0.7", "127.0.0.8", "127.0.1.2", "127.0.0.1", "127.0.1.1")); + expectedEndpoints.get(KEYSPACE3).putAll(new BigIntegerToken("35"), makeAddrs("127.0.0.5", "127.0.0.6", "127.0.0.7", "127.0.0.8", "127.0.0.9", "127.0.1.2", "127.0.0.1", "127.0.0.2", "127.0.1.1")); + expectedEndpoints.get(KEYSPACE3).putAll(new BigIntegerToken("45"), makeAddrs("127.0.0.6", "127.0.0.7", "127.0.0.8", "127.0.0.9", "127.0.0.10", "127.0.1.2", "127.0.0.1", "127.0.0.2", "127.0.1.1", "127.0.0.3")); + expectedEndpoints.get(KEYSPACE3).putAll(new BigIntegerToken("55"), makeAddrs("127.0.0.7", "127.0.0.8", "127.0.0.9", "127.0.0.10", "127.0.0.1", "127.0.0.2", "127.0.0.3", "127.0.0.4", "127.0.1.1", "127.0.1.2")); + expectedEndpoints.get(KEYSPACE3).putAll(new BigIntegerToken("65"), makeAddrs("127.0.0.8", "127.0.0.9", "127.0.0.10", "127.0.0.1", "127.0.0.2", "127.0.1.2", "127.0.0.3", "127.0.0.4")); + expectedEndpoints.get(KEYSPACE3).putAll(new BigIntegerToken("75"), makeAddrs("127.0.0.9", "127.0.0.10", "127.0.0.1", "127.0.0.2", "127.0.0.3", "127.0.1.2", "127.0.0.4", "127.0.0.5")); + expectedEndpoints.get(KEYSPACE3).putAll(new BigIntegerToken("85"), makeAddrs("127.0.0.10", "127.0.0.1", "127.0.0.2", "127.0.0.3", "127.0.0.4", "127.0.0.5")); + expectedEndpoints.get(KEYSPACE3).putAll(new BigIntegerToken("95"), makeAddrs("127.0.0.1", "127.0.0.2", "127.0.0.3", "127.0.0.4", "127.0.0.5")); + expectedEndpoints.put(KEYSPACE4, HashMultimap.create()); + expectedEndpoints.get(KEYSPACE4).putAll(new BigIntegerToken("5"), makeAddrs("127.0.0.2", "127.0.0.3", "127.0.0.4")); + expectedEndpoints.get(KEYSPACE4).putAll(new BigIntegerToken("15"), makeAddrs("127.0.0.3", "127.0.0.4", "127.0.0.5")); + expectedEndpoints.get(KEYSPACE4).putAll(new BigIntegerToken("25"), makeAddrs("127.0.0.4", "127.0.0.5", "127.0.0.6")); + expectedEndpoints.get(KEYSPACE4).putAll(new BigIntegerToken("35"), makeAddrs("127.0.0.5", "127.0.0.6", "127.0.0.7", "127.0.1.1", "127.0.0.8")); + expectedEndpoints.get(KEYSPACE4).putAll(new BigIntegerToken("45"), makeAddrs("127.0.0.6", "127.0.0.7", "127.0.0.8", "127.0.1.2", "127.0.0.1", "127.0.1.1")); + expectedEndpoints.get(KEYSPACE4).putAll(new BigIntegerToken("55"), makeAddrs("127.0.0.7", "127.0.0.8", "127.0.0.9", "127.0.0.1", "127.0.0.2", "127.0.1.1", "127.0.1.2")); + expectedEndpoints.get(KEYSPACE4).putAll(new BigIntegerToken("65"), makeAddrs("127.0.0.8", "127.0.0.9", "127.0.0.10", "127.0.1.2", "127.0.0.1", "127.0.0.2")); + expectedEndpoints.get(KEYSPACE4).putAll(new BigIntegerToken("75"), makeAddrs("127.0.0.9", "127.0.0.10", "127.0.0.1", "127.0.1.2", "127.0.0.2", "127.0.0.3")); + expectedEndpoints.get(KEYSPACE4).putAll(new BigIntegerToken("85"), makeAddrs("127.0.0.10", "127.0.0.1", "127.0.0.2", "127.0.0.3")); + expectedEndpoints.get(KEYSPACE4).putAll(new BigIntegerToken("95"), makeAddrs("127.0.0.1", "127.0.0.2", "127.0.0.3")); PendingRangeCalculatorService.instance.blockUntilFinished(); @@ -338,24 +341,24 @@ public void testSimultaneousMove() throws UnknownHostException ss.onChange(boot1, ApplicationState.STATUS, valueFactory.normal(Collections.singleton(keyTokens.get(5)))); // adjust precalcuated results. this changes what the epected endpoints are. - expectedEndpoints.get("Keyspace1").get(new BigIntegerToken("55")).removeAll(makeAddrs("127.0.0.7", "127.0.0.8")); - expectedEndpoints.get("Keyspace1").get(new BigIntegerToken("85")).removeAll(makeAddrs("127.0.0.10")); - expectedEndpoints.get("Keyspace2").get(new BigIntegerToken("55")).removeAll(makeAddrs("127.0.0.7", "127.0.0.8")); - expectedEndpoints.get("Keyspace2").get(new BigIntegerToken("85")).removeAll(makeAddrs("127.0.0.10")); - expectedEndpoints.get("Keyspace3").get(new BigIntegerToken("15")).removeAll(makeAddrs("127.0.0.7", "127.0.0.8")); - expectedEndpoints.get("Keyspace3").get(new BigIntegerToken("25")).removeAll(makeAddrs("127.0.0.7", "127.0.1.2", "127.0.0.1")); - expectedEndpoints.get("Keyspace3").get(new BigIntegerToken("35")).removeAll(makeAddrs("127.0.0.7", "127.0.0.2")); - expectedEndpoints.get("Keyspace3").get(new BigIntegerToken("45")).removeAll(makeAddrs("127.0.0.7", "127.0.0.10", "127.0.0.3")); - expectedEndpoints.get("Keyspace3").get(new BigIntegerToken("55")).removeAll(makeAddrs("127.0.0.7", "127.0.0.10", "127.0.0.4")); - expectedEndpoints.get("Keyspace3").get(new BigIntegerToken("65")).removeAll(makeAddrs("127.0.0.10")); - expectedEndpoints.get("Keyspace3").get(new BigIntegerToken("75")).removeAll(makeAddrs("127.0.0.10")); - expectedEndpoints.get("Keyspace3").get(new BigIntegerToken("85")).removeAll(makeAddrs("127.0.0.10")); - expectedEndpoints.get("Keyspace4").get(new BigIntegerToken("35")).removeAll(makeAddrs("127.0.0.7", "127.0.0.8")); - expectedEndpoints.get("Keyspace4").get(new BigIntegerToken("45")).removeAll(makeAddrs("127.0.0.7", "127.0.1.2", "127.0.0.1")); - expectedEndpoints.get("Keyspace4").get(new BigIntegerToken("55")).removeAll(makeAddrs("127.0.0.2", "127.0.0.7")); - expectedEndpoints.get("Keyspace4").get(new BigIntegerToken("65")).removeAll(makeAddrs("127.0.0.10")); - expectedEndpoints.get("Keyspace4").get(new BigIntegerToken("75")).removeAll(makeAddrs("127.0.0.10")); - expectedEndpoints.get("Keyspace4").get(new BigIntegerToken("85")).removeAll(makeAddrs("127.0.0.10")); + expectedEndpoints.get(KEYSPACE1).get(new BigIntegerToken("55")).removeAll(makeAddrs("127.0.0.7", "127.0.0.8")); + expectedEndpoints.get(KEYSPACE1).get(new BigIntegerToken("85")).removeAll(makeAddrs("127.0.0.10")); + expectedEndpoints.get(KEYSPACE2).get(new BigIntegerToken("55")).removeAll(makeAddrs("127.0.0.7", "127.0.0.8")); + expectedEndpoints.get(KEYSPACE2).get(new BigIntegerToken("85")).removeAll(makeAddrs("127.0.0.10")); + expectedEndpoints.get(KEYSPACE3).get(new BigIntegerToken("15")).removeAll(makeAddrs("127.0.0.7", "127.0.0.8")); + expectedEndpoints.get(KEYSPACE3).get(new BigIntegerToken("25")).removeAll(makeAddrs("127.0.0.7", "127.0.1.2", "127.0.0.1")); + expectedEndpoints.get(KEYSPACE3).get(new BigIntegerToken("35")).removeAll(makeAddrs("127.0.0.7", "127.0.0.2")); + expectedEndpoints.get(KEYSPACE3).get(new BigIntegerToken("45")).removeAll(makeAddrs("127.0.0.7", "127.0.0.10", "127.0.0.3")); + expectedEndpoints.get(KEYSPACE3).get(new BigIntegerToken("55")).removeAll(makeAddrs("127.0.0.7", "127.0.0.10", "127.0.0.4")); + expectedEndpoints.get(KEYSPACE3).get(new BigIntegerToken("65")).removeAll(makeAddrs("127.0.0.10")); + expectedEndpoints.get(KEYSPACE3).get(new BigIntegerToken("75")).removeAll(makeAddrs("127.0.0.10")); + expectedEndpoints.get(KEYSPACE3).get(new BigIntegerToken("85")).removeAll(makeAddrs("127.0.0.10")); + expectedEndpoints.get(KEYSPACE4).get(new BigIntegerToken("35")).removeAll(makeAddrs("127.0.0.7", "127.0.0.8")); + expectedEndpoints.get(KEYSPACE4).get(new BigIntegerToken("45")).removeAll(makeAddrs("127.0.0.7", "127.0.1.2", "127.0.0.1")); + expectedEndpoints.get(KEYSPACE4).get(new BigIntegerToken("55")).removeAll(makeAddrs("127.0.0.2", "127.0.0.7")); + expectedEndpoints.get(KEYSPACE4).get(new BigIntegerToken("65")).removeAll(makeAddrs("127.0.0.10")); + expectedEndpoints.get(KEYSPACE4).get(new BigIntegerToken("75")).removeAll(makeAddrs("127.0.0.10")); + expectedEndpoints.get(KEYSPACE4).get(new BigIntegerToken("85")).removeAll(makeAddrs("127.0.0.10")); PendingRangeCalculatorService.instance.blockUntilFinished(); diff --git a/test/unit/org/apache/cassandra/service/MoveTest.java b/test/unit/org/apache/cassandra/service/MoveTest.java index a3fd89c5dd2f..c01f4af1b5be 100644 --- a/test/unit/org/apache/cassandra/service/MoveTest.java +++ b/test/unit/org/apache/cassandra/service/MoveTest.java @@ -48,6 +48,10 @@ public class MoveTest { private static final IPartitioner partitioner = new RandomPartitioner(); private static IPartitioner oldPartitioner; + private static final String KEYSPACE1 = "MoveTestKeyspace1"; + private static final String KEYSPACE2 = "MoveTestKeyspace2"; + private static final String KEYSPACE3 = "MoveTestKeyspace3"; + private static final String KEYSPACE4 = "MoveTestKeyspace4"; /* * NOTE: the tests above uses RandomPartitioner, which is not the default @@ -60,13 +64,13 @@ public static void setup() throws ConfigurationException { oldPartitioner = StorageService.instance.setPartitionerUnsafe(partitioner); SchemaLoader.loadSchema(); + SchemaLoader.schemaDefinition("MoveTest"); } @AfterClass public static void tearDown() { StorageService.instance.setPartitionerUnsafe(oldPartitioner); - SchemaLoader.stopGossiper(); } /* @@ -203,7 +207,7 @@ public void testSimultaneousMove() throws UnknownHostException Map keyspaceStrategyMap = new HashMap(); for (int i = 1; i <= 4; i++) { - keyspaceStrategyMap.put("Keyspace" + i, getStrategy("Keyspace" + i, tmd)); + keyspaceStrategyMap.put("MoveTestKeyspace" + i, getStrategy("MoveTestKeyspace" + i, tmd)); } /** @@ -222,7 +226,7 @@ public void testSimultaneousMove() throws UnknownHostException * } */ - Multimap> keyspace1ranges = keyspaceStrategyMap.get("Keyspace1").getAddressRanges(); + Multimap> keyspace1ranges = keyspaceStrategyMap.get(KEYSPACE1).getAddressRanges(); Collection> ranges1 = keyspace1ranges.get(InetAddress.getByName("127.0.0.1")); assertEquals(1, collectionSize(ranges1)); assertEquals(generateRange(97, 0), ranges1.iterator().next()); @@ -271,7 +275,7 @@ public void testSimultaneousMove() throws UnknownHostException * } */ - Multimap> keyspace3ranges = keyspaceStrategyMap.get("Keyspace3").getAddressRanges(); + Multimap> keyspace3ranges = keyspaceStrategyMap.get(KEYSPACE3).getAddressRanges(); ranges1 = keyspace3ranges.get(InetAddress.getByName("127.0.0.1")); assertEquals(collectionSize(ranges1), 5); assertTrue(ranges1.equals(generateRanges(97, 0, 70, 87, 50, 67, 87, 97, 67, 70))); @@ -319,7 +323,7 @@ public void testSimultaneousMove() throws UnknownHostException * /127.0.0.10=[(70,87], (87,97], (67,70]] * } */ - Multimap> keyspace4ranges = keyspaceStrategyMap.get("Keyspace4").getAddressRanges(); + Multimap> keyspace4ranges = keyspaceStrategyMap.get(KEYSPACE4).getAddressRanges(); ranges1 = keyspace4ranges.get(InetAddress.getByName("127.0.0.1")); assertEquals(collectionSize(ranges1), 3); assertTrue(ranges1.equals(generateRanges(97, 0, 70, 87, 87, 97))); @@ -353,50 +357,50 @@ public void testSimultaneousMove() throws UnknownHostException // pre-calculate the results. Map> expectedEndpoints = new HashMap>(); - expectedEndpoints.put("Keyspace1", HashMultimap.create()); - expectedEndpoints.get("Keyspace1").putAll(new BigIntegerToken("5"), makeAddrs("127.0.0.2")); - expectedEndpoints.get("Keyspace1").putAll(new BigIntegerToken("15"), makeAddrs("127.0.0.3")); - expectedEndpoints.get("Keyspace1").putAll(new BigIntegerToken("25"), makeAddrs("127.0.0.4")); - expectedEndpoints.get("Keyspace1").putAll(new BigIntegerToken("35"), makeAddrs("127.0.0.5")); - expectedEndpoints.get("Keyspace1").putAll(new BigIntegerToken("45"), makeAddrs("127.0.0.6")); - expectedEndpoints.get("Keyspace1").putAll(new BigIntegerToken("55"), makeAddrs("127.0.0.7", "127.0.1.1")); - expectedEndpoints.get("Keyspace1").putAll(new BigIntegerToken("65"), makeAddrs("127.0.0.7")); - expectedEndpoints.get("Keyspace1").putAll(new BigIntegerToken("75"), makeAddrs("127.0.0.9", "127.0.1.2")); - expectedEndpoints.get("Keyspace1").putAll(new BigIntegerToken("85"), makeAddrs("127.0.0.9")); - expectedEndpoints.get("Keyspace1").putAll(new BigIntegerToken("95"), makeAddrs("127.0.0.10")); - expectedEndpoints.put("Keyspace2", HashMultimap.create()); - expectedEndpoints.get("Keyspace2").putAll(new BigIntegerToken("5"), makeAddrs("127.0.0.2")); - expectedEndpoints.get("Keyspace2").putAll(new BigIntegerToken("15"), makeAddrs("127.0.0.3")); - expectedEndpoints.get("Keyspace2").putAll(new BigIntegerToken("25"), makeAddrs("127.0.0.4")); - expectedEndpoints.get("Keyspace2").putAll(new BigIntegerToken("35"), makeAddrs("127.0.0.5")); - expectedEndpoints.get("Keyspace2").putAll(new BigIntegerToken("45"), makeAddrs("127.0.0.6")); - expectedEndpoints.get("Keyspace2").putAll(new BigIntegerToken("55"), makeAddrs("127.0.0.7", "127.0.1.1")); - expectedEndpoints.get("Keyspace2").putAll(new BigIntegerToken("65"), makeAddrs("127.0.0.7")); - expectedEndpoints.get("Keyspace2").putAll(new BigIntegerToken("75"), makeAddrs("127.0.0.9", "127.0.1.2")); - expectedEndpoints.get("Keyspace2").putAll(new BigIntegerToken("85"), makeAddrs("127.0.0.9")); - expectedEndpoints.get("Keyspace2").putAll(new BigIntegerToken("95"), makeAddrs("127.0.0.10")); - expectedEndpoints.put("Keyspace3", HashMultimap.create()); - expectedEndpoints.get("Keyspace3").putAll(new BigIntegerToken("5"), makeAddrs("127.0.0.2", "127.0.0.3", "127.0.0.4", "127.0.0.5", "127.0.0.6")); - expectedEndpoints.get("Keyspace3").putAll(new BigIntegerToken("15"), makeAddrs("127.0.0.3", "127.0.0.4", "127.0.0.5", "127.0.0.6", "127.0.0.7", "127.0.1.1")); - expectedEndpoints.get("Keyspace3").putAll(new BigIntegerToken("25"), makeAddrs("127.0.0.4", "127.0.0.5", "127.0.0.6", "127.0.0.7", "127.0.0.8", "127.0.1.1")); - expectedEndpoints.get("Keyspace3").putAll(new BigIntegerToken("35"), makeAddrs("127.0.0.5", "127.0.0.6", "127.0.0.7", "127.0.0.8", "127.0.0.9", "127.0.1.1", "127.0.1.2")); - expectedEndpoints.get("Keyspace3").putAll(new BigIntegerToken("45"), makeAddrs("127.0.0.6", "127.0.0.7", "127.0.0.8", "127.0.0.9", "127.0.0.10", "127.0.1.1", "127.0.1.2")); - expectedEndpoints.get("Keyspace3").putAll(new BigIntegerToken("55"), makeAddrs("127.0.0.7", "127.0.0.8", "127.0.0.9", "127.0.0.10", "127.0.0.1", "127.0.1.1", "127.0.1.2")); - expectedEndpoints.get("Keyspace3").putAll(new BigIntegerToken("65"), makeAddrs("127.0.0.7", "127.0.0.8", "127.0.0.9", "127.0.0.10", "127.0.0.1", "127.0.1.2")); - expectedEndpoints.get("Keyspace3").putAll(new BigIntegerToken("75"), makeAddrs("127.0.0.9", "127.0.0.10", "127.0.0.1", "127.0.0.2", "127.0.0.3", "127.0.1.2")); - expectedEndpoints.get("Keyspace3").putAll(new BigIntegerToken("85"), makeAddrs("127.0.0.9", "127.0.0.10", "127.0.0.1", "127.0.0.2", "127.0.0.3")); - expectedEndpoints.get("Keyspace3").putAll(new BigIntegerToken("95"), makeAddrs("127.0.0.10", "127.0.0.1", "127.0.0.2", "127.0.0.3", "127.0.0.4")); - expectedEndpoints.put("Keyspace4", HashMultimap.create()); - expectedEndpoints.get("Keyspace4").putAll(new BigIntegerToken("5"), makeAddrs("127.0.0.2", "127.0.0.3", "127.0.0.4")); - expectedEndpoints.get("Keyspace4").putAll(new BigIntegerToken("15"), makeAddrs("127.0.0.3", "127.0.0.4", "127.0.0.5")); - expectedEndpoints.get("Keyspace4").putAll(new BigIntegerToken("25"), makeAddrs("127.0.0.4", "127.0.0.5", "127.0.0.6")); - expectedEndpoints.get("Keyspace4").putAll(new BigIntegerToken("35"), makeAddrs("127.0.0.5", "127.0.0.6", "127.0.0.7", "127.0.1.1")); - expectedEndpoints.get("Keyspace4").putAll(new BigIntegerToken("45"), makeAddrs("127.0.0.6", "127.0.0.7", "127.0.0.8", "127.0.1.1")); - expectedEndpoints.get("Keyspace4").putAll(new BigIntegerToken("55"), makeAddrs("127.0.0.7", "127.0.0.8", "127.0.0.9", "127.0.1.1", "127.0.1.2")); - expectedEndpoints.get("Keyspace4").putAll(new BigIntegerToken("65"), makeAddrs("127.0.0.7", "127.0.0.8", "127.0.0.9", "127.0.1.2")); - expectedEndpoints.get("Keyspace4").putAll(new BigIntegerToken("75"), makeAddrs("127.0.0.9", "127.0.0.10", "127.0.0.1", "127.0.1.2")); - expectedEndpoints.get("Keyspace4").putAll(new BigIntegerToken("85"), makeAddrs("127.0.0.9", "127.0.0.10", "127.0.0.1")); - expectedEndpoints.get("Keyspace4").putAll(new BigIntegerToken("95"), makeAddrs("127.0.0.10", "127.0.0.1", "127.0.0.2")); + expectedEndpoints.put(KEYSPACE1, HashMultimap.create()); + expectedEndpoints.get(KEYSPACE1).putAll(new BigIntegerToken("5"), makeAddrs("127.0.0.2")); + expectedEndpoints.get(KEYSPACE1).putAll(new BigIntegerToken("15"), makeAddrs("127.0.0.3")); + expectedEndpoints.get(KEYSPACE1).putAll(new BigIntegerToken("25"), makeAddrs("127.0.0.4")); + expectedEndpoints.get(KEYSPACE1).putAll(new BigIntegerToken("35"), makeAddrs("127.0.0.5")); + expectedEndpoints.get(KEYSPACE1).putAll(new BigIntegerToken("45"), makeAddrs("127.0.0.6")); + expectedEndpoints.get(KEYSPACE1).putAll(new BigIntegerToken("55"), makeAddrs("127.0.0.7", "127.0.1.1")); + expectedEndpoints.get(KEYSPACE1).putAll(new BigIntegerToken("65"), makeAddrs("127.0.0.7")); + expectedEndpoints.get(KEYSPACE1).putAll(new BigIntegerToken("75"), makeAddrs("127.0.0.9", "127.0.1.2")); + expectedEndpoints.get(KEYSPACE1).putAll(new BigIntegerToken("85"), makeAddrs("127.0.0.9")); + expectedEndpoints.get(KEYSPACE1).putAll(new BigIntegerToken("95"), makeAddrs("127.0.0.10")); + expectedEndpoints.put(KEYSPACE2, HashMultimap.create()); + expectedEndpoints.get(KEYSPACE2).putAll(new BigIntegerToken("5"), makeAddrs("127.0.0.2")); + expectedEndpoints.get(KEYSPACE2).putAll(new BigIntegerToken("15"), makeAddrs("127.0.0.3")); + expectedEndpoints.get(KEYSPACE2).putAll(new BigIntegerToken("25"), makeAddrs("127.0.0.4")); + expectedEndpoints.get(KEYSPACE2).putAll(new BigIntegerToken("35"), makeAddrs("127.0.0.5")); + expectedEndpoints.get(KEYSPACE2).putAll(new BigIntegerToken("45"), makeAddrs("127.0.0.6")); + expectedEndpoints.get(KEYSPACE2).putAll(new BigIntegerToken("55"), makeAddrs("127.0.0.7", "127.0.1.1")); + expectedEndpoints.get(KEYSPACE2).putAll(new BigIntegerToken("65"), makeAddrs("127.0.0.7")); + expectedEndpoints.get(KEYSPACE2).putAll(new BigIntegerToken("75"), makeAddrs("127.0.0.9", "127.0.1.2")); + expectedEndpoints.get(KEYSPACE2).putAll(new BigIntegerToken("85"), makeAddrs("127.0.0.9")); + expectedEndpoints.get(KEYSPACE2).putAll(new BigIntegerToken("95"), makeAddrs("127.0.0.10")); + expectedEndpoints.put(KEYSPACE3, HashMultimap.create()); + expectedEndpoints.get(KEYSPACE3).putAll(new BigIntegerToken("5"), makeAddrs("127.0.0.2", "127.0.0.3", "127.0.0.4", "127.0.0.5", "127.0.0.6")); + expectedEndpoints.get(KEYSPACE3).putAll(new BigIntegerToken("15"), makeAddrs("127.0.0.3", "127.0.0.4", "127.0.0.5", "127.0.0.6", "127.0.0.7", "127.0.1.1")); + expectedEndpoints.get(KEYSPACE3).putAll(new BigIntegerToken("25"), makeAddrs("127.0.0.4", "127.0.0.5", "127.0.0.6", "127.0.0.7", "127.0.0.8", "127.0.1.1")); + expectedEndpoints.get(KEYSPACE3).putAll(new BigIntegerToken("35"), makeAddrs("127.0.0.5", "127.0.0.6", "127.0.0.7", "127.0.0.8", "127.0.0.9", "127.0.1.1", "127.0.1.2")); + expectedEndpoints.get(KEYSPACE3).putAll(new BigIntegerToken("45"), makeAddrs("127.0.0.6", "127.0.0.7", "127.0.0.8", "127.0.0.9", "127.0.0.10", "127.0.1.1", "127.0.1.2")); + expectedEndpoints.get(KEYSPACE3).putAll(new BigIntegerToken("55"), makeAddrs("127.0.0.7", "127.0.0.8", "127.0.0.9", "127.0.0.10", "127.0.0.1", "127.0.1.1", "127.0.1.2")); + expectedEndpoints.get(KEYSPACE3).putAll(new BigIntegerToken("65"), makeAddrs("127.0.0.7", "127.0.0.8", "127.0.0.9", "127.0.0.10", "127.0.0.1", "127.0.1.2")); + expectedEndpoints.get(KEYSPACE3).putAll(new BigIntegerToken("75"), makeAddrs("127.0.0.9", "127.0.0.10", "127.0.0.1", "127.0.0.2", "127.0.0.3", "127.0.1.2")); + expectedEndpoints.get(KEYSPACE3).putAll(new BigIntegerToken("85"), makeAddrs("127.0.0.9", "127.0.0.10", "127.0.0.1", "127.0.0.2", "127.0.0.3")); + expectedEndpoints.get(KEYSPACE3).putAll(new BigIntegerToken("95"), makeAddrs("127.0.0.10", "127.0.0.1", "127.0.0.2", "127.0.0.3", "127.0.0.4")); + expectedEndpoints.put(KEYSPACE4, HashMultimap.create()); + expectedEndpoints.get(KEYSPACE4).putAll(new BigIntegerToken("5"), makeAddrs("127.0.0.2", "127.0.0.3", "127.0.0.4")); + expectedEndpoints.get(KEYSPACE4).putAll(new BigIntegerToken("15"), makeAddrs("127.0.0.3", "127.0.0.4", "127.0.0.5")); + expectedEndpoints.get(KEYSPACE4).putAll(new BigIntegerToken("25"), makeAddrs("127.0.0.4", "127.0.0.5", "127.0.0.6")); + expectedEndpoints.get(KEYSPACE4).putAll(new BigIntegerToken("35"), makeAddrs("127.0.0.5", "127.0.0.6", "127.0.0.7", "127.0.1.1")); + expectedEndpoints.get(KEYSPACE4).putAll(new BigIntegerToken("45"), makeAddrs("127.0.0.6", "127.0.0.7", "127.0.0.8", "127.0.1.1")); + expectedEndpoints.get(KEYSPACE4).putAll(new BigIntegerToken("55"), makeAddrs("127.0.0.7", "127.0.0.8", "127.0.0.9", "127.0.1.1", "127.0.1.2")); + expectedEndpoints.get(KEYSPACE4).putAll(new BigIntegerToken("65"), makeAddrs("127.0.0.7", "127.0.0.8", "127.0.0.9", "127.0.1.2")); + expectedEndpoints.get(KEYSPACE4).putAll(new BigIntegerToken("75"), makeAddrs("127.0.0.9", "127.0.0.10", "127.0.0.1", "127.0.1.2")); + expectedEndpoints.get(KEYSPACE4).putAll(new BigIntegerToken("85"), makeAddrs("127.0.0.9", "127.0.0.10", "127.0.0.1")); + expectedEndpoints.get(KEYSPACE4).putAll(new BigIntegerToken("95"), makeAddrs("127.0.0.10", "127.0.0.1", "127.0.0.2")); for (Map.Entry keyspaceStrategy : keyspaceStrategyMap.entrySet()) { diff --git a/test/unit/org/apache/cassandra/service/QueryPagerTest.java b/test/unit/org/apache/cassandra/service/QueryPagerTest.java index e71e97ac8561..6d9ed60d7e4f 100644 --- a/test/unit/org/apache/cassandra/service/QueryPagerTest.java +++ b/test/unit/org/apache/cassandra/service/QueryPagerTest.java @@ -29,11 +29,15 @@ import org.apache.cassandra.Util; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.OrderedJUnit4ClassRunner; +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.*; import org.apache.cassandra.db.composites.*; import org.apache.cassandra.db.filter.*; import org.apache.cassandra.db.marshal.CompositeType; import org.apache.cassandra.dht.*; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.service.pager.*; import org.apache.cassandra.utils.ByteBufferUtil; @@ -43,10 +47,31 @@ import static org.apache.cassandra.utils.ByteBufferUtil.bytes; @RunWith(OrderedJUnit4ClassRunner.class) -public class QueryPagerTest extends SchemaLoader +public class QueryPagerTest { - private static final String KS = "Keyspace1"; - private static final String CF = "Standard1"; + public static final String KEYSPACE1 = "QueryPagerTest"; + public static final String CF_STANDARD = "Standard1"; + public static final String KEYSPACE_CQL = "cql_keyspace"; + public static final String CF_CQL = "table2"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD)); + SchemaLoader.createKeyspace(KEYSPACE_CQL, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + CFMetaData.compile("CREATE TABLE " + CF_CQL + " (" + + "k text," + + "c text," + + "v text," + + "PRIMARY KEY (k, c))", KEYSPACE_CQL)); + addData(); + } private static String string(CellName name) { @@ -65,7 +90,6 @@ private static String string(ByteBuffer bb) } } - @BeforeClass public static void addData() { cfs().clearUnsafe(); @@ -81,8 +105,8 @@ public static void addData() */ for (int i = 0; i < nbKeys; i++) { - Mutation rm = new Mutation(KS, bytes("k" + i)); - ColumnFamily cf = rm.addOrGet(CF); + Mutation rm = new Mutation(KEYSPACE1, bytes("k" + i)); + ColumnFamily cf = rm.addOrGet(CF_STANDARD); for (int j = 0; j < nbCols; j++) cf.addColumn(Util.column("c" + j, "", 0)); @@ -93,7 +117,7 @@ public static void addData() private static ColumnFamilyStore cfs() { - return Keyspace.open(KS).getColumnFamilyStore(CF); + return Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF_STANDARD); } private static String toString(List rows) @@ -120,7 +144,7 @@ private static ReadCommand namesQuery(String key, String... names) SortedSet s = new TreeSet(cfs().metadata.comparator); for (String name : names) s.add(CellNames.simpleDense(bytes(name))); - return new SliceByNamesReadCommand(KS, bytes(key), CF, System.currentTimeMillis(), new NamesQueryFilter(s, true)); + return new SliceByNamesReadCommand(KEYSPACE1, bytes(key), CF_STANDARD, System.currentTimeMillis(), new NamesQueryFilter(s, true)); } private static ReadCommand sliceQuery(String key, String start, String end, int count) @@ -132,7 +156,7 @@ private static ReadCommand sliceQuery(String key, String start, String end, bool { SliceQueryFilter filter = new SliceQueryFilter(CellNames.simpleDense(bytes(start)), CellNames.simpleDense(bytes(end)), reversed, count); // Note: for MultiQueryTest, we need the same timestamp/expireBefore for all queries, so we just use 0 as it doesn't matter here. - return new SliceFromReadCommand(KS, bytes(key), CF, 0, filter); + return new SliceFromReadCommand(KEYSPACE1, bytes(key), CF_STANDARD, 0, filter); } private static RangeSliceCommand rangeNamesQuery(AbstractBounds range, int count, String... names) @@ -140,13 +164,13 @@ private static RangeSliceCommand rangeNamesQuery(AbstractBounds ran SortedSet s = new TreeSet(cfs().metadata.comparator); for (String name : names) s.add(CellNames.simpleDense(bytes(name))); - return new RangeSliceCommand(KS, CF, System.currentTimeMillis(), new NamesQueryFilter(s, true), range, count); + return new RangeSliceCommand(KEYSPACE1, CF_STANDARD, System.currentTimeMillis(), new NamesQueryFilter(s, true), range, count); } private static RangeSliceCommand rangeSliceQuery(AbstractBounds range, int count, String start, String end) { SliceQueryFilter filter = new SliceQueryFilter(CellNames.simpleDense(bytes(start)), CellNames.simpleDense(bytes(end)), false, Integer.MAX_VALUE); - return new RangeSliceCommand(KS, CF, System.currentTimeMillis(), filter, range, count); + return new RangeSliceCommand(KEYSPACE1, CF_STANDARD, System.currentTimeMillis(), filter, range, count); } private static void assertRow(Row r, String key, String... names) diff --git a/test/unit/org/apache/cassandra/service/RelocateTest.java b/test/unit/org/apache/cassandra/service/RelocateTest.java index e8f66ad98421..22a992c48231 100644 --- a/test/unit/org/apache/cassandra/service/RelocateTest.java +++ b/test/unit/org/apache/cassandra/service/RelocateTest.java @@ -82,7 +82,6 @@ public static void setUp() throws Exception public static void tearDown() throws Exception { StorageService.instance.setPartitionerUnsafe(oldPartitioner); - SchemaLoader.stopGossiper(); } /** Setup a virtual node ring */ diff --git a/test/unit/org/apache/cassandra/service/RemoveTest.java b/test/unit/org/apache/cassandra/service/RemoveTest.java index 649a3f2a607b..2574dcf2c897 100644 --- a/test/unit/org/apache/cassandra/service/RemoveTest.java +++ b/test/unit/org/apache/cassandra/service/RemoveTest.java @@ -69,7 +69,6 @@ public static void setupClass() throws ConfigurationException public static void tearDownClass() { StorageService.instance.setPartitionerUnsafe(oldPartitioner); - SchemaLoader.stopGossiper(); } @Before diff --git a/test/unit/org/apache/cassandra/service/RowResolverTest.java b/test/unit/org/apache/cassandra/service/RowResolverTest.java index 286d0378e8c9..825944c1c553 100644 --- a/test/unit/org/apache/cassandra/service/RowResolverTest.java +++ b/test/unit/org/apache/cassandra/service/RowResolverTest.java @@ -23,26 +23,43 @@ import java.util.Arrays; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.ArrayBackedSortedColumns; import org.apache.cassandra.db.ColumnFamily; import org.apache.cassandra.db.DeletionInfo; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import static org.junit.Assert.*; import static org.apache.cassandra.Util.column; import static org.apache.cassandra.db.KeyspaceTest.*; -public class RowResolverTest extends SchemaLoader +public class RowResolverTest { + public static final String KEYSPACE1 = "Keyspace1"; + public static final String CF_STANDARD = "Standard1"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD)); + } + @Test public void testResolveSupersetNewer() { - ColumnFamily cf1 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf1 = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); cf1.addColumn(column("c1", "v1", 0)); - ColumnFamily cf2 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf2 = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); cf2.addColumn(column("c1", "v2", 1)); ColumnFamily resolved = RowDataResolver.resolveSuperset(Arrays.asList(cf1, cf2), System.currentTimeMillis()); @@ -54,10 +71,10 @@ public void testResolveSupersetNewer() @Test public void testResolveSupersetDisjoint() { - ColumnFamily cf1 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf1 = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); cf1.addColumn(column("c1", "v1", 0)); - ColumnFamily cf2 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf2 = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); cf2.addColumn(column("c2", "v2", 1)); ColumnFamily resolved = RowDataResolver.resolveSuperset(Arrays.asList(cf1, cf2), System.currentTimeMillis()); @@ -69,7 +86,7 @@ public void testResolveSupersetDisjoint() @Test public void testResolveSupersetNullOne() { - ColumnFamily cf2 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf2 = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); cf2.addColumn(column("c2", "v2", 1)); ColumnFamily resolved = RowDataResolver.resolveSuperset(Arrays.asList(null, cf2), System.currentTimeMillis()); @@ -81,7 +98,7 @@ public void testResolveSupersetNullOne() @Test public void testResolveSupersetNullTwo() { - ColumnFamily cf1 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf1 = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); cf1.addColumn(column("c1", "v1", 0)); ColumnFamily resolved = RowDataResolver.resolveSuperset(Arrays.asList(cf1, null), System.currentTimeMillis()); @@ -100,10 +117,10 @@ public void testResolveSupersetNullBoth() public void testResolveDeleted() { // one CF with columns timestamped before a delete in another cf - ColumnFamily cf1 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf1 = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); cf1.addColumn(column("one", "A", 0)); - ColumnFamily cf2 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf2 = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); cf2.delete(new DeletionInfo(1L, (int) (System.currentTimeMillis() / 1000))); ColumnFamily resolved = RowDataResolver.resolveSuperset(Arrays.asList(cf1, cf2), System.currentTimeMillis()); @@ -118,19 +135,19 @@ public void testResolveMultipleDeleted() { // deletes and columns with interleaved timestamp, with out of order return sequence - ColumnFamily cf1 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf1 = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); cf1.delete(new DeletionInfo(0L, (int) (System.currentTimeMillis() / 1000))); // these columns created after the previous deletion - ColumnFamily cf2 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf2 = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); cf2.addColumn(column("one", "A", 1)); cf2.addColumn(column("two", "A", 1)); //this column created after the next delete - ColumnFamily cf3 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf3 = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); cf3.addColumn(column("two", "B", 3)); - ColumnFamily cf4 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamily cf4 = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); cf4.delete(new DeletionInfo(2L, (int) (System.currentTimeMillis() / 1000))); ColumnFamily resolved = RowDataResolver.resolveSuperset(Arrays.asList(cf1, cf2, cf3, cf4), System.currentTimeMillis()); diff --git a/test/unit/org/apache/cassandra/service/StorageProxyTest.java b/test/unit/org/apache/cassandra/service/StorageProxyTest.java index 6fbc80adb19e..c8afac0e7366 100644 --- a/test/unit/org/apache/cassandra/service/StorageProxyTest.java +++ b/test/unit/org/apache/cassandra/service/StorageProxyTest.java @@ -25,7 +25,6 @@ import org.junit.Test; import static org.junit.Assert.assertEquals; -import org.apache.cassandra.SchemaLoader; import static org.apache.cassandra.Util.token; import static org.apache.cassandra.Util.rp; @@ -39,7 +38,7 @@ import org.apache.cassandra.locator.TokenMetadata; import org.apache.cassandra.utils.ByteBufferUtil; -public class StorageProxyTest extends SchemaLoader +public class StorageProxyTest { private static Range range(RowPosition left, RowPosition right) { diff --git a/test/unit/org/apache/cassandra/streaming/StreamTransferTaskTest.java b/test/unit/org/apache/cassandra/streaming/StreamTransferTaskTest.java index c6c04b05cc45..f9ae82e5330b 100644 --- a/test/unit/org/apache/cassandra/streaming/StreamTransferTaskTest.java +++ b/test/unit/org/apache/cassandra/streaming/StreamTransferTaskTest.java @@ -22,25 +22,42 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.FBUtilities; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; -public class StreamTransferTaskTest extends SchemaLoader +public class StreamTransferTaskTest { + public static final String KEYSPACE1 = "StreamTransferTaskTest"; + public static final String CF_STANDARD = "Standard1"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD)); + } + @Test public void testScheduleTimeout() throws Exception { - String ks = "Keyspace1"; + String ks = KEYSPACE1; String cf = "Standard1"; StreamSession session = new StreamSession(FBUtilities.getBroadcastAddress(), 0); @@ -49,7 +66,7 @@ public void testScheduleTimeout() throws Exception // create two sstables for (int i = 0; i < 2; i++) { - insertData(ks, cf, i, 1); + SchemaLoader.insertData(ks, cf, i, 1); cfs.forceBlockingFlush(); } diff --git a/test/unit/org/apache/cassandra/streaming/StreamingTransferTest.java b/test/unit/org/apache/cassandra/streaming/StreamingTransferTest.java index 47136a09f140..52b2236a35af 100644 --- a/test/unit/org/apache/cassandra/streaming/StreamingTransferTest.java +++ b/test/unit/org/apache/cassandra/streaming/StreamingTransferTest.java @@ -35,17 +35,23 @@ import org.apache.cassandra.OrderedJUnit4ClassRunner; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.DatabaseDescriptor; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.*; import org.apache.cassandra.db.columniterator.IdentityQueryFilter; import org.apache.cassandra.db.context.CounterContext; import org.apache.cassandra.db.filter.IDiskAtomFilter; import org.apache.cassandra.db.filter.QueryFilter; +import org.apache.cassandra.db.marshal.BytesType; +import org.apache.cassandra.db.marshal.CounterColumnType; +import org.apache.cassandra.db.marshal.IntegerType; import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.io.sstable.SSTableUtils; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.CounterId; @@ -57,16 +63,42 @@ import static org.apache.cassandra.Util.column; @RunWith(OrderedJUnit4ClassRunner.class) -public class StreamingTransferTest extends SchemaLoader +public class StreamingTransferTest { private static final Logger logger = LoggerFactory.getLogger(StreamingTransferTest.class); public static final InetAddress LOCAL = FBUtilities.getBroadcastAddress(); + public static final String KEYSPACE1 = "StreamingTransferTest1"; + public static final String CF_STANDARD = "Standard1"; + public static final String CF_COUNTER = "Counter1"; + public static final String CF_STANDARDINT = "StandardInteger1"; + public static final String CF_INDEX = "Indexed1"; + public static final String KEYSPACE_CACHEKEY = "KeyStreamingTransferTestSpace"; + public static final String CF_STANDARD2 = "Standard2"; + public static final String CF_STANDARD3 = "Standard3"; + public static final String KEYSPACE2 = "StreamingTransferTest2"; @BeforeClass - public static void setup() throws Exception + public static void defineSchema() throws Exception { + SchemaLoader.prepareServer(); StorageService.instance.initServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD), + CFMetaData.denseCFMetaData(KEYSPACE1, CF_COUNTER, BytesType.instance).defaultValidator(CounterColumnType.instance), + CFMetaData.denseCFMetaData(KEYSPACE1, CF_STANDARDINT, IntegerType.instance), + SchemaLoader.indexCFMD(KEYSPACE1, CF_INDEX, true)); + SchemaLoader.createKeyspace(KEYSPACE2, + SimpleStrategy.class, + KSMetaData.optsWithRF(1)); + SchemaLoader.createKeyspace(KEYSPACE_CACHEKEY, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE_CACHEKEY, CF_STANDARD), + SchemaLoader.standardCFMD(KEYSPACE_CACHEKEY, CF_STANDARD2), + SchemaLoader.standardCFMD(KEYSPACE_CACHEKEY, CF_STANDARD3)); } /** @@ -105,7 +137,7 @@ public void testRequestEmpty() throws Exception ranges.add(new Range<>(p.getToken(ByteBufferUtil.bytes("key2")), p.getMinimumToken())); StreamResultFuture futureResult = new StreamPlan("StreamingTransferTest") - .requestRanges(LOCAL, "Keyspace2", ranges) + .requestRanges(LOCAL, KEYSPACE2, ranges) .execute(); UUID planId = futureResult.planId; @@ -219,7 +251,7 @@ private Collection makeStreamingDetails( private void doTransferTable(boolean transferSSTables) throws Exception { - final Keyspace keyspace = Keyspace.open("Keyspace1"); + final Keyspace keyspace = Keyspace.open(KEYSPACE1); final ColumnFamilyStore cfs = keyspace.getColumnFamilyStore("Indexed1"); List keys = createAndTransfer(cfs, new Mutator() @@ -230,7 +262,7 @@ public void mutate(String key, String col, long timestamp) throws Exception ColumnFamily cf = ArrayBackedSortedColumns.factory.create(keyspace.getName(), cfs.name); cf.addColumn(column(col, "v", timestamp)); cf.addColumn(new BufferCell(cellname("birthdate"), ByteBufferUtil.bytes(val), timestamp)); - Mutation rm = new Mutation("Keyspace1", ByteBufferUtil.bytes(key), cf); + Mutation rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes(key), cf); logger.debug("Applying row to transfer {}", rm); rm.apply(); } @@ -258,7 +290,7 @@ public void mutate(String key, String col, long timestamp) throws Exception @Test public void testTransferRangeTombstones() throws Exception { - String ks = "Keyspace1"; + String ks = KEYSPACE1; String cfname = "StandardInteger1"; Keyspace keyspace = Keyspace.open(ks); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfname); @@ -301,7 +333,7 @@ public void testTransferTableViaSSTables() throws Exception @Test public void testTransferTableCounter() throws Exception { - final Keyspace keyspace = Keyspace.open("Keyspace1"); + final Keyspace keyspace = Keyspace.open(KEYSPACE1); final ColumnFamilyStore cfs = keyspace.getColumnFamilyStore("Counter1"); final CounterContext cc = new CounterContext(); @@ -358,7 +390,7 @@ public void testTransferTableMultiple() throws Exception content.add("test"); content.add("test2"); content.add("test3"); - SSTableReader sstable = SSTableUtils.prepare().write(content); + SSTableReader sstable = new SSTableUtils(KEYSPACE1, CF_STANDARD).prepare().write(content); String keyspaceName = sstable.getKeyspaceName(); String cfname = sstable.getColumnFamilyName(); @@ -397,7 +429,7 @@ public void testTransferTableMultiple() throws Exception @Test public void testTransferOfMultipleColumnFamilies() throws Exception { - String keyspace = "KeyCacheSpace"; + String keyspace = KEYSPACE_CACHEKEY; IPartitioner p = StorageService.getPartitioner(); String[] columnFamilies = new String[] { "Standard1", "Standard2", "Standard3" }; List ssTableReaders = new ArrayList<>(); @@ -445,7 +477,7 @@ public void testTransferOfMultipleColumnFamilies() throws Exception @Test public void testRandomSSTableTransfer() throws Exception { - final Keyspace keyspace = Keyspace.open("Keyspace1"); + final Keyspace keyspace = Keyspace.open(KEYSPACE1); final ColumnFamilyStore cfs = keyspace.getColumnFamilyStore("Standard1"); Mutator mutator = new Mutator() { @@ -454,7 +486,7 @@ public void mutate(String key, String colName, long timestamp) throws Exception ColumnFamily cf = ArrayBackedSortedColumns.factory.create(keyspace.getName(), cfs.name); cf.addColumn(column(colName, "value", timestamp)); cf.addColumn(new BufferCell(cellname("birthdate"), ByteBufferUtil.bytes(new Date(timestamp).toString()), timestamp)); - Mutation rm = new Mutation("Keyspace1", ByteBufferUtil.bytes(key), cf); + Mutation rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes(key), cf); logger.debug("Applying row to transfer {}", rm); rm.apply(); } diff --git a/test/unit/org/apache/cassandra/thrift/MultiSliceTest.java b/test/unit/org/apache/cassandra/thrift/MultiSliceTest.java index 50e409e19a11..9716876b95f2 100644 --- a/test/unit/org/apache/cassandra/thrift/MultiSliceTest.java +++ b/test/unit/org/apache/cassandra/thrift/MultiSliceTest.java @@ -28,25 +28,33 @@ import junit.framework.Assert; import org.apache.cassandra.SchemaLoader; -import org.apache.cassandra.config.Schema; +import org.apache.cassandra.config.KSMetaData; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.service.EmbeddedCassandraService; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.thrift.TException; import org.junit.BeforeClass; import org.junit.Test; -public class MultiSliceTest extends SchemaLoader +public class MultiSliceTest { private static CassandraServer server; - + public static final String KEYSPACE1 = "MultiSliceTest"; + public static final String CF_STANDARD = "Standard1"; + @BeforeClass - public static void setup() throws IOException, TException + public static void defineSchema() throws ConfigurationException, IOException, TException { - Schema.instance.clear(); // Schema are now written on disk and will be reloaded + SchemaLoader.prepareServer(); new EmbeddedCassandraService().start(); - ThriftSessionManager.instance.setCurrentSocket(new InetSocketAddress(9160)); + ThriftSessionManager.instance.setCurrentSocket(new InetSocketAddress(9160)); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD)); server = new CassandraServer(); - server.set_keyspace("Keyspace1"); + server.set_keyspace(KEYSPACE1); } private static MultiSliceRequest makeMultiSliceRequest(ByteBuffer key) diff --git a/test/unit/org/apache/cassandra/thrift/ThriftValidationTest.java b/test/unit/org/apache/cassandra/thrift/ThriftValidationTest.java index df0f98cf39d3..e81dd3d4f169 100644 --- a/test/unit/org/apache/cassandra/thrift/ThriftValidationTest.java +++ b/test/unit/org/apache/cassandra/thrift/ThriftValidationTest.java @@ -20,40 +20,62 @@ * */ -import org.apache.cassandra.db.marshal.LongType; -import org.apache.cassandra.exceptions.*; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.config.*; -import org.apache.cassandra.db.marshal.AsciiType; +import org.apache.cassandra.db.marshal.*; +import org.apache.cassandra.exceptions.*; import org.apache.cassandra.locator.LocalStrategy; import org.apache.cassandra.locator.NetworkTopologyStrategy; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.ByteBufferUtil; +import org.apache.thrift.TException; +import java.io.IOException; import java.util.Arrays; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertEquals; -public class ThriftValidationTest extends SchemaLoader +public class ThriftValidationTest { + public static final String KEYSPACE1 = "MultiSliceTest"; + public static final String CF_STANDARD = "Standard1"; + public static final String CF_COUNTER = "Counter1"; + public static final String CF_UUID = "UUIDKeys"; + public static final String CF_STANDARDLONG3 = "StandardLong3"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException, IOException, TException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD), + CFMetaData.denseCFMetaData(KEYSPACE1, CF_COUNTER, BytesType.instance).defaultValidator(CounterColumnType.instance), + SchemaLoader.standardCFMD(KEYSPACE1, CF_UUID).keyValidator(UUIDType.instance), + CFMetaData.denseCFMetaData(KEYSPACE1, CF_STANDARDLONG3, IntegerType.instance)); + } + @Test(expected=org.apache.cassandra.exceptions.InvalidRequestException.class) public void testValidateCommutativeWithStandard() throws org.apache.cassandra.exceptions.InvalidRequestException { - ThriftValidation.validateColumnFamily("Keyspace1", "Standard1", true); + ThriftValidation.validateColumnFamily(KEYSPACE1, "Standard1", true); } @Test public void testValidateCommutativeWithCounter() throws org.apache.cassandra.exceptions.InvalidRequestException { - ThriftValidation.validateColumnFamily("Keyspace1", "Counter1", true); + ThriftValidation.validateColumnFamily(KEYSPACE1, "Counter1", true); } @Test public void testColumnNameEqualToKeyAlias() throws org.apache.cassandra.exceptions.InvalidRequestException { - CFMetaData metaData = Schema.instance.getCFMetaData("Keyspace1", "Standard1"); + CFMetaData metaData = Schema.instance.getCFMetaData(KEYSPACE1, "Standard1"); CFMetaData newMetadata = metaData.copy(); boolean gotException = false; @@ -98,7 +120,7 @@ public void testColumnNameEqualToKeyAlias() throws org.apache.cassandra.exceptio @Test public void testColumnNameEqualToDefaultKeyAlias() throws org.apache.cassandra.exceptions.InvalidRequestException { - CFMetaData metaData = Schema.instance.getCFMetaData("Keyspace1", "UUIDKeys"); + CFMetaData metaData = Schema.instance.getCFMetaData(KEYSPACE1, "UUIDKeys"); ColumnDefinition definition = metaData.getColumnDefinition(ByteBufferUtil.bytes(CFMetaData.DEFAULT_KEY_ALIAS)); assertNotNull(definition); assertEquals(ColumnDefinition.Kind.PARTITION_KEY, definition.kind); @@ -116,7 +138,7 @@ public void testColumnNameEqualToDefaultKeyAlias() throws org.apache.cassandra.e @Test public void testColumnNameEqualToDefaultColumnAlias() throws org.apache.cassandra.exceptions.InvalidRequestException { - CFMetaData metaData = Schema.instance.getCFMetaData("Keyspace1", "StandardLong3"); + CFMetaData metaData = Schema.instance.getCFMetaData(KEYSPACE1, "StandardLong3"); ColumnDefinition definition = metaData.getColumnDefinition(ByteBufferUtil.bytes(CFMetaData.DEFAULT_COLUMN_ALIAS + 1)); assertNotNull(definition); diff --git a/test/unit/org/apache/cassandra/tools/SSTableExportTest.java b/test/unit/org/apache/cassandra/tools/SSTableExportTest.java index d9133f67a31f..dbc6703d41c9 100644 --- a/test/unit/org/apache/cassandra/tools/SSTableExportTest.java +++ b/test/unit/org/apache/cassandra/tools/SSTableExportTest.java @@ -34,23 +34,50 @@ import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.*; import org.apache.cassandra.db.filter.QueryFilter; +import org.apache.cassandra.db.marshal.BytesType; +import org.apache.cassandra.db.marshal.CounterColumnType; import org.apache.cassandra.db.marshal.UTF8Type; +import org.apache.cassandra.db.marshal.UUIDType; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.sstable.Descriptor; import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.io.sstable.SSTableWriter; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.service.ActiveRepairService; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.UUIDGen; +import org.apache.thrift.TException; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.JSONValue; import org.json.simple.parser.ParseException; +import org.junit.BeforeClass; import org.junit.Test; -public class SSTableExportTest extends SchemaLoader +public class SSTableExportTest { + public static final String KEYSPACE1 = "SSTableExportTest"; + public static final String CF_STANDARD = "Standard1"; + public static final String CF_COUNTER = "Counter1"; + public static final String CF_UUID = "UUIDKeys"; + public static final String CF_VALSWITHQUOTES = "ValuesWithQuotes"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException, IOException, TException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD), + CFMetaData.denseCFMetaData(KEYSPACE1, CF_COUNTER, BytesType.instance).defaultValidator(CounterColumnType.instance), + SchemaLoader.standardCFMD(KEYSPACE1, CF_UUID).keyValidator(UUIDType.instance), + CFMetaData.denseCFMetaData(KEYSPACE1, CF_VALSWITHQUOTES, BytesType.instance).defaultValidator(UTF8Type.instance)); + } + public String asHex(String str) { return bytesToHex(ByteBufferUtil.bytes(str)); @@ -59,8 +86,8 @@ public String asHex(String str) @Test public void testEnumeratekeys() throws IOException { - File tempSS = tempSSTableFile("Keyspace1", "Standard1"); - ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + File tempSS = tempSSTableFile(KEYSPACE1, "Standard1"); + ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE); // Add rowA @@ -94,8 +121,8 @@ public void testEnumeratekeys() throws IOException @Test public void testExportSimpleCf() throws IOException, ParseException { - File tempSS = tempSSTableFile("Keyspace1", "Standard1"); - ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + File tempSS = tempSSTableFile(KEYSPACE1, "Standard1"); + ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE); int nowInSec = (int)(System.currentTimeMillis() / 1000) + 42; //live for 42 seconds @@ -149,9 +176,9 @@ public void testExportSimpleCf() throws IOException, ParseException @Test public void testRoundTripStandardCf() throws IOException { - ColumnFamilyStore cfs = Keyspace.open("Keyspace1").getColumnFamilyStore("Standard1"); - File tempSS = tempSSTableFile("Keyspace1", "Standard1"); - ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore("Standard1"); + File tempSS = tempSSTableFile(KEYSPACE1, "Standard1"); + ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE); // Add rowA @@ -171,8 +198,8 @@ public void testRoundTripStandardCf() throws IOException SSTableExport.export(reader, new PrintStream(tempJson.getPath()), new String[]{asHex("rowExclude")}); // Import JSON to another SSTable file - File tempSS2 = tempSSTableFile("Keyspace1", "Standard1"); - new SSTableImport().importJson(tempJson.getPath(), "Keyspace1", "Standard1", tempSS2.getPath()); + File tempSS2 = tempSSTableFile(KEYSPACE1, "Standard1"); + new SSTableImport().importJson(tempJson.getPath(), KEYSPACE1, "Standard1", tempSS2.getPath()); reader = SSTableReader.open(Descriptor.fromFilename(tempSS2.getPath())); QueryFilter qf = Util.namesQueryFilter(cfs, Util.dk("rowA"), "name"); @@ -189,8 +216,8 @@ public void testRoundTripStandardCf() throws IOException @Test public void testExportCounterCf() throws IOException, ParseException { - File tempSS = tempSSTableFile("Keyspace1", "Counter1"); - ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create("Keyspace1", "Counter1"); + File tempSS = tempSSTableFile(KEYSPACE1, "Counter1"); + ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Counter1"); SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE); // Add rowA @@ -220,8 +247,8 @@ public void testExportCounterCf() throws IOException, ParseException @Test public void testEscapingDoubleQuotes() throws IOException, ParseException { - File tempSS = tempSSTableFile("Keyspace1", "ValuesWithQuotes"); - ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create("Keyspace1", "ValuesWithQuotes"); + File tempSS = tempSSTableFile(KEYSPACE1, "ValuesWithQuotes"); + ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "ValuesWithQuotes"); SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE); // Add rowA @@ -251,8 +278,8 @@ public void testEscapingDoubleQuotes() throws IOException, ParseException @Test public void testExportColumnsWithMetadata() throws IOException, ParseException { - File tempSS = tempSSTableFile("Keyspace1", "Standard1"); - ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1"); + File tempSS = tempSSTableFile(KEYSPACE1, "Standard1"); + ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE); // Add rowA @@ -312,8 +339,8 @@ public void testExportColumnsWithMetadata() throws IOException, ParseException @Test public void testColumnNameEqualToDefaultKeyAlias() throws IOException, ParseException { - File tempSS = tempSSTableFile("Keyspace1", "UUIDKeys"); - ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create("Keyspace1", "UUIDKeys"); + File tempSS = tempSSTableFile(KEYSPACE1, "UUIDKeys"); + ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "UUIDKeys"); SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE); // Add a row diff --git a/test/unit/org/apache/cassandra/tools/SSTableImportTest.java b/test/unit/org/apache/cassandra/tools/SSTableImportTest.java index 2fdeaf4dca26..dba840861dc9 100644 --- a/test/unit/org/apache/cassandra/tools/SSTableImportTest.java +++ b/test/unit/org/apache/cassandra/tools/SSTableImportTest.java @@ -27,26 +27,48 @@ import java.net.URI; import java.net.URISyntaxException; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.*; import org.apache.cassandra.db.columniterator.OnDiskAtomIterator; import org.apache.cassandra.db.filter.QueryFilter; +import org.apache.cassandra.db.marshal.BytesType; +import org.apache.cassandra.db.marshal.CounterColumnType; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.io.sstable.Descriptor; import org.apache.cassandra.io.sstable.SSTableReader; -import org.apache.cassandra.utils.ByteBufferUtil; +import org.apache.thrift.TException; -public class SSTableImportTest extends SchemaLoader +public class SSTableImportTest { + public static final String KEYSPACE1 = "SSTableImportTest"; + public static final String CF_STANDARD = "Standard1"; + public static final String CF_COUNTER = "Counter1"; + + @BeforeClass + public static void defineSchema() throws ConfigurationException, IOException, TException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD), + CFMetaData.denseCFMetaData(KEYSPACE1, CF_COUNTER, BytesType.instance).defaultValidator(CounterColumnType.instance)); + } + @Test public void testImportSimpleCf() throws IOException, URISyntaxException { // Import JSON to temp SSTable file String jsonUrl = resourcePath("SimpleCF.json"); - File tempSS = tempSSTableFile("Keyspace1", "Standard1"); - new SSTableImport(true).importJson(jsonUrl, "Keyspace1", "Standard1", tempSS.getPath()); + File tempSS = tempSSTableFile(KEYSPACE1, "Standard1"); + new SSTableImport(true).importJson(jsonUrl, KEYSPACE1, "Standard1", tempSS.getPath()); // Verify results SSTableReader reader = SSTableReader.open(Descriptor.fromFilename(tempSS.getPath())); @@ -78,9 +100,9 @@ private String resourcePath(String name) throws URISyntaxException public void testImportUnsortedMode() throws IOException, URISyntaxException { String jsonUrl = resourcePath("UnsortedCF.json"); - File tempSS = tempSSTableFile("Keyspace1", "Standard1"); + File tempSS = tempSSTableFile(KEYSPACE1, "Standard1"); - new SSTableImport().importJson(jsonUrl, "Keyspace1", "Standard1", tempSS.getPath()); + new SSTableImport().importJson(jsonUrl, KEYSPACE1, "Standard1", tempSS.getPath()); SSTableReader reader = SSTableReader.open(Descriptor.fromFilename(tempSS.getPath())); QueryFilter qf = QueryFilter.getIdentityFilter(Util.dk("rowA"), "Standard1", System.currentTimeMillis()); @@ -101,8 +123,8 @@ public void testImportWithDeletionInfoMetadata() throws IOException, URISyntaxEx { // Import JSON to temp SSTable file String jsonUrl = resourcePath("SimpleCFWithDeletionInfo.json"); - File tempSS = tempSSTableFile("Keyspace1", "Standard1"); - new SSTableImport(true).importJson(jsonUrl, "Keyspace1", "Standard1", tempSS.getPath()); + File tempSS = tempSSTableFile(KEYSPACE1, "Standard1"); + new SSTableImport(true).importJson(jsonUrl, KEYSPACE1, "Standard1", tempSS.getPath()); // Verify results SSTableReader reader = SSTableReader.open(Descriptor.fromFilename(tempSS.getPath())); @@ -125,8 +147,8 @@ public void testImportCounterCf() throws IOException, URISyntaxException { // Import JSON to temp SSTable file String jsonUrl = resourcePath("CounterCF.json"); - File tempSS = tempSSTableFile("Keyspace1", "Counter1"); - new SSTableImport(true).importJson(jsonUrl, "Keyspace1", "Counter1", tempSS.getPath()); + File tempSS = tempSSTableFile(KEYSPACE1, "Counter1"); + new SSTableImport(true).importJson(jsonUrl, KEYSPACE1, "Counter1", tempSS.getPath()); // Verify results SSTableReader reader = SSTableReader.open(Descriptor.fromFilename(tempSS.getPath())); diff --git a/test/unit/org/apache/cassandra/triggers/TriggersSchemaTest.java b/test/unit/org/apache/cassandra/triggers/TriggersSchemaTest.java index c6a1ac5fd693..577e7d3e75b0 100644 --- a/test/unit/org/apache/cassandra/triggers/TriggersSchemaTest.java +++ b/test/unit/org/apache/cassandra/triggers/TriggersSchemaTest.java @@ -19,6 +19,7 @@ import java.util.Collections; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; @@ -26,6 +27,7 @@ import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.config.Schema; import org.apache.cassandra.config.TriggerDefinition; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.service.MigrationManager; @@ -33,13 +35,19 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -public class TriggersSchemaTest extends SchemaLoader +public class TriggersSchemaTest { String ksName = "ks" + System.nanoTime(); String cfName = "cf" + System.nanoTime(); String triggerName = "trigger_" + System.nanoTime(); String triggerClass = "org.apache.cassandra.triggers.NoSuchTrigger.class"; + @BeforeClass + public static void beforeTest() throws ConfigurationException + { + SchemaLoader.loadSchema(); + } + @Test public void newKsContainsCfWithTrigger() throws Exception { diff --git a/test/unit/org/apache/cassandra/triggers/TriggersTest.java b/test/unit/org/apache/cassandra/triggers/TriggersTest.java index 74fde6960ed6..41d4bb87d330 100644 --- a/test/unit/org/apache/cassandra/triggers/TriggersTest.java +++ b/test/unit/org/apache/cassandra/triggers/TriggersTest.java @@ -24,6 +24,7 @@ import org.junit.AfterClass; import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; @@ -35,6 +36,7 @@ import org.apache.cassandra.db.ColumnFamily; import org.apache.cassandra.db.ConsistencyLevel; import org.apache.cassandra.db.Mutation; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.RequestExecutionException; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.thrift.*; @@ -46,7 +48,7 @@ import static org.apache.cassandra.utils.ByteBufferUtil.bytes; import static org.apache.cassandra.utils.ByteBufferUtil.toInt; -public class TriggersTest extends SchemaLoader +public class TriggersTest { private static boolean triggerCreated = false; private static ThriftServer thriftServer; @@ -55,6 +57,12 @@ public class TriggersTest extends SchemaLoader private static String cfName = "test_table"; private static String otherCf = "other_table"; + @BeforeClass + public static void beforeTest() throws ConfigurationException + { + SchemaLoader.loadSchema(); + } + @Before public void setup() throws Exception { diff --git a/test/unit/org/apache/cassandra/utils/EncodedStreamsTest.java b/test/unit/org/apache/cassandra/utils/EncodedStreamsTest.java index 2a67d422d7dc..957979f0f934 100644 --- a/test/unit/org/apache/cassandra/utils/EncodedStreamsTest.java +++ b/test/unit/org/apache/cassandra/utils/EncodedStreamsTest.java @@ -26,25 +26,42 @@ import java.io.IOException; import org.apache.cassandra.SchemaLoader; +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.ArrayBackedSortedColumns; import org.apache.cassandra.db.ColumnFamily; import org.apache.cassandra.db.TypeSizes; +import org.apache.cassandra.db.marshal.BytesType; +import org.apache.cassandra.db.marshal.CounterColumnType; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.utils.vint.EncodedDataInputStream; import org.apache.cassandra.utils.vint.EncodedDataOutputStream; import org.junit.Assert; +import org.junit.BeforeClass; import org.junit.Test; -public class EncodedStreamsTest extends SchemaLoader +public class EncodedStreamsTest { - private String keyspaceName = "Keyspace1"; - private String standardCFName = "Standard1"; - private String counterCFName = "Counter1"; - private String superCFName = "Super1"; - + private static final String KEYSPACE1 = "Keyspace1"; + private static final String CF_STANDARD = "Standard1"; + private static final String CF_COUNTER = "Counter1"; private int version = MessagingService.current_version; + @BeforeClass + public static void defineSchema() throws ConfigurationException + { + SchemaLoader.prepareServer(); + SchemaLoader.createKeyspace(KEYSPACE1, + SimpleStrategy.class, + KSMetaData.optsWithRF(1), + SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD), + CFMetaData.denseCFMetaData(KEYSPACE1, CF_COUNTER, BytesType.instance) + .defaultValidator(CounterColumnType.instance)); + } + @Test public void testStreams() throws IOException { @@ -97,7 +114,7 @@ public void testStreams() throws IOException private ColumnFamily createCF() { - ColumnFamily cf = ArrayBackedSortedColumns.factory.create(keyspaceName, standardCFName); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, CF_STANDARD); cf.addColumn(column("vijay", "try", 1)); cf.addColumn(column("to", "be_nice", 1)); return cf; @@ -105,7 +122,7 @@ private ColumnFamily createCF() private ColumnFamily createCounterCF() { - ColumnFamily cf = ArrayBackedSortedColumns.factory.create(keyspaceName, counterCFName); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, CF_COUNTER); cf.addCounter(cellname("vijay"), 1); cf.addCounter(cellname("wants"), 1000000); return cf; From d4833593bed5db45fe718e37b685537b5a4ace9e Mon Sep 17 00:00:00 2001 From: Benedict Elliott Smith Date: Mon, 23 Jun 2014 16:52:50 +0100 Subject: [PATCH 058/557] Fix heap size calculation for CompoundSparseCellName/.WithCollection patch by Benedict Elliott Smith; reviewed by Dave Brosius CASSANDRA-7421 --- CHANGES.txt | 2 ++ .../cassandra/cql3/ColumnIdentifier.java | 2 +- .../cassandra/db/AtomicBTreeColumns.java | 4 ++-- .../org/apache/cassandra/db/BufferCell.java | 4 ++-- src/java/org/apache/cassandra/db/Cell.java | 2 +- .../org/apache/cassandra/db/NativeCell.java | 2 +- .../cassandra/db/NativeCounterCell.java | 2 +- .../cassandra/db/NativeDeletedCell.java | 2 +- .../cassandra/db/NativeExpiringCell.java | 2 +- .../apache/cassandra/db/RowIndexEntry.java | 2 +- .../cassandra/db/composites/CellName.java | 2 +- .../db/composites/CompoundComposite.java | 8 +++---- .../db/composites/CompoundDenseCellName.java | 2 +- .../db/composites/CompoundSparseCellName.java | 22 +++++++++++++++---- .../db/composites/SimpleDenseCellName.java | 2 +- .../db/composites/SimpleSparseCellName.java | 4 ++-- .../SimpleSparseInternedCellName.java | 2 +- .../cassandra/io/sstable/IndexHelper.java | 2 +- 18 files changed, 42 insertions(+), 26 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 4f68cf7b693e..04b148c20d36 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,6 @@ 2.1.0-rc2 + * Fix heap size calculation for CompoundSparseCellName and + CompoundSparseCellName.WithCollection (CASSANDRA-7421) * Allow counter mutations in UNLOGGED batches (CASSANDRA-7351) * Modify reconcile logic to always pick a tombstone over a counter cell (CASSANDRA-7346) diff --git a/src/java/org/apache/cassandra/cql3/ColumnIdentifier.java b/src/java/org/apache/cassandra/cql3/ColumnIdentifier.java index 1b232cffd0d8..fa151d29a6fa 100644 --- a/src/java/org/apache/cassandra/cql3/ColumnIdentifier.java +++ b/src/java/org/apache/cassandra/cql3/ColumnIdentifier.java @@ -89,7 +89,7 @@ public long unsharedHeapSize() + ObjectSizes.sizeOf(text); } - public long excessHeapSizeExcludingData() + public long unsharedHeapSizeExcludingData() { return EMPTY_SIZE + ObjectSizes.sizeOnHeapExcludingData(bytes) diff --git a/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java b/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java index 0e38784ef236..03cd0c56d02a 100644 --- a/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java +++ b/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java @@ -344,7 +344,7 @@ public Cell apply(Cell insert) indexer.insert(insert); insert = insert.localCopy(metadata, allocator, writeOp); this.dataSize += insert.cellDataSize(); - this.heapSize += insert.excessHeapSizeExcludingData(); + this.heapSize += insert.unsharedHeapSizeExcludingData(); if (inserted == null) inserted = new ArrayList<>(); inserted.add(insert); @@ -359,7 +359,7 @@ public Cell apply(Cell existing, Cell update) { reconciled = reconciled.localCopy(metadata, allocator, writeOp); dataSize += reconciled.cellDataSize() - existing.cellDataSize(); - heapSize += reconciled.excessHeapSizeExcludingData() - existing.excessHeapSizeExcludingData(); + heapSize += reconciled.unsharedHeapSizeExcludingData() - existing.unsharedHeapSizeExcludingData(); if (inserted == null) inserted = new ArrayList<>(); inserted.add(reconciled); diff --git a/src/java/org/apache/cassandra/db/BufferCell.java b/src/java/org/apache/cassandra/db/BufferCell.java index 93251c8d1374..a7d632d90813 100644 --- a/src/java/org/apache/cassandra/db/BufferCell.java +++ b/src/java/org/apache/cassandra/db/BufferCell.java @@ -84,9 +84,9 @@ public long timestamp() { } @Override - public long excessHeapSizeExcludingData() + public long unsharedHeapSizeExcludingData() { - return EMPTY_SIZE + name.excessHeapSizeExcludingData() + ObjectSizes.sizeOnHeapExcludingData(value); + return EMPTY_SIZE + name.unsharedHeapSizeExcludingData() + ObjectSizes.sizeOnHeapExcludingData(value); } @Override diff --git a/src/java/org/apache/cassandra/db/Cell.java b/src/java/org/apache/cassandra/db/Cell.java index f91376db7dae..7c3926ac9d99 100644 --- a/src/java/org/apache/cassandra/db/Cell.java +++ b/src/java/org/apache/cassandra/db/Cell.java @@ -51,7 +51,7 @@ public interface Cell extends OnDiskAtom // returns the size of the Cell and all references on the heap, excluding any costs associated with byte arrays // that would be allocated by a localCopy, as these will be accounted for by the allocator - public long excessHeapSizeExcludingData(); + public long unsharedHeapSizeExcludingData(); public int serializedSize(CellNameType type, TypeSizes typeSizes); diff --git a/src/java/org/apache/cassandra/db/NativeCell.java b/src/java/org/apache/cassandra/db/NativeCell.java index 1c8ebd976a3e..dac5674690d1 100644 --- a/src/java/org/apache/cassandra/db/NativeCell.java +++ b/src/java/org/apache/cassandra/db/NativeCell.java @@ -75,7 +75,7 @@ public void updateDigest(MessageDigest digest) } @Override - public long excessHeapSizeExcludingData() + public long unsharedHeapSizeExcludingData() { return SIZE; } diff --git a/src/java/org/apache/cassandra/db/NativeCounterCell.java b/src/java/org/apache/cassandra/db/NativeCounterCell.java index d0df17e366d9..3fe73ceb040b 100644 --- a/src/java/org/apache/cassandra/db/NativeCounterCell.java +++ b/src/java/org/apache/cassandra/db/NativeCounterCell.java @@ -167,7 +167,7 @@ public CounterCell localCopy(CFMetaData metadata, MemtableAllocator allocator, O } @Override - public long excessHeapSizeExcludingData() + public long unsharedHeapSizeExcludingData() { return SIZE; } diff --git a/src/java/org/apache/cassandra/db/NativeDeletedCell.java b/src/java/org/apache/cassandra/db/NativeDeletedCell.java index 20118a4ff43a..e90063596980 100644 --- a/src/java/org/apache/cassandra/db/NativeDeletedCell.java +++ b/src/java/org/apache/cassandra/db/NativeDeletedCell.java @@ -112,7 +112,7 @@ public boolean equals(Cell cell) } @Override - public long excessHeapSizeExcludingData() + public long unsharedHeapSizeExcludingData() { return SIZE; } diff --git a/src/java/org/apache/cassandra/db/NativeExpiringCell.java b/src/java/org/apache/cassandra/db/NativeExpiringCell.java index fcadb16403d0..f2655115a3d7 100644 --- a/src/java/org/apache/cassandra/db/NativeExpiringCell.java +++ b/src/java/org/apache/cassandra/db/NativeExpiringCell.java @@ -160,7 +160,7 @@ public ExpiringCell localCopy(CFMetaData metadata, MemtableAllocator allocator, } @Override - public long excessHeapSizeExcludingData() + public long unsharedHeapSizeExcludingData() { return SIZE; } diff --git a/src/java/org/apache/cassandra/db/RowIndexEntry.java b/src/java/org/apache/cassandra/db/RowIndexEntry.java index 618cd6176e31..05c563c7d2ff 100644 --- a/src/java/org/apache/cassandra/db/RowIndexEntry.java +++ b/src/java/org/apache/cassandra/db/RowIndexEntry.java @@ -207,7 +207,7 @@ public long unsharedHeapSize() { long entrySize = 0; for (IndexHelper.IndexInfo idx : columnsIndex) - entrySize += idx.excessHeapSize(); + entrySize += idx.unsharedHeapSize(); return BASE_SIZE + entrySize diff --git a/src/java/org/apache/cassandra/db/composites/CellName.java b/src/java/org/apache/cassandra/db/composites/CellName.java index 22b3fbd80a34..4d778d37151f 100644 --- a/src/java/org/apache/cassandra/db/composites/CellName.java +++ b/src/java/org/apache/cassandra/db/composites/CellName.java @@ -74,5 +74,5 @@ public interface CellName extends Composite @Override public CellName copy(CFMetaData cfm, AbstractAllocator allocator); - public long excessHeapSizeExcludingData(); + public long unsharedHeapSizeExcludingData(); } diff --git a/src/java/org/apache/cassandra/db/composites/CompoundComposite.java b/src/java/org/apache/cassandra/db/composites/CompoundComposite.java index e16b48a79b35..7a21b01fe846 100644 --- a/src/java/org/apache/cassandra/db/composites/CompoundComposite.java +++ b/src/java/org/apache/cassandra/db/composites/CompoundComposite.java @@ -28,7 +28,7 @@ */ public class CompoundComposite extends AbstractComposite { - private static final long EMPTY_SIZE = ObjectSizes.measure(new CompoundComposite(null, 0, false)); + private static final long HEAP_SIZE = ObjectSizes.measure(new CompoundComposite(null, 0, false)); // We could use a List, but we'll create such object *a lot* and using a array+size is not // all that harder, so we save the List object allocation. @@ -73,12 +73,12 @@ protected ByteBuffer[] elementsCopy(AbstractAllocator allocator) public long unsharedHeapSize() { - return EMPTY_SIZE + ObjectSizes.sizeOnHeapOf(elements); + return HEAP_SIZE + ObjectSizes.sizeOnHeapOf(elements); } - public long excessHeapSizeExcludingData() + public long unsharedHeapSizeExcludingData() { - return EMPTY_SIZE + ObjectSizes.sizeOnHeapExcludingData(elements); + return HEAP_SIZE + ObjectSizes.sizeOnHeapExcludingData(elements); } public Composite copy(CFMetaData cfm, AbstractAllocator allocator) diff --git a/src/java/org/apache/cassandra/db/composites/CompoundDenseCellName.java b/src/java/org/apache/cassandra/db/composites/CompoundDenseCellName.java index 0a157c2f5d52..1f471a889438 100644 --- a/src/java/org/apache/cassandra/db/composites/CompoundDenseCellName.java +++ b/src/java/org/apache/cassandra/db/composites/CompoundDenseCellName.java @@ -73,7 +73,7 @@ public long unsharedHeapSize() } @Override - public long excessHeapSizeExcludingData() + public long unsharedHeapSizeExcludingData() { return HEAP_SIZE + ObjectSizes.sizeOnHeapExcludingData(elements); } diff --git a/src/java/org/apache/cassandra/db/composites/CompoundSparseCellName.java b/src/java/org/apache/cassandra/db/composites/CompoundSparseCellName.java index ad7bb732a1c6..03af6d0190a2 100644 --- a/src/java/org/apache/cassandra/db/composites/CompoundSparseCellName.java +++ b/src/java/org/apache/cassandra/db/composites/CompoundSparseCellName.java @@ -50,6 +50,18 @@ public class CompoundSparseCellName extends CompoundComposite implements CellNam this.columnName = columnName; } + @Override + public long unsharedHeapSize() + { + return HEAP_SIZE + ObjectSizes.sizeOnHeapOf(elements); + } + + @Override + public long unsharedHeapSizeExcludingData() + { + return HEAP_SIZE + ObjectSizes.sizeOnHeapExcludingData(elements); + } + public int size() { return size + 1; @@ -156,13 +168,15 @@ public CellName copy(CFMetaData cfm, AbstractAllocator allocator) @Override public long unsharedHeapSize() { - return super.unsharedHeapSize() + ObjectSizes.sizeOnHeapOf(collectionElement); + return HEAP_SIZE + ObjectSizes.sizeOnHeapOf(elements) + + ObjectSizes.sizeOnHeapExcludingData(collectionElement); } @Override - public long excessHeapSizeExcludingData() + public long unsharedHeapSizeExcludingData() { - return super.excessHeapSizeExcludingData() + ObjectSizes.sizeOnHeapExcludingData(collectionElement); + return HEAP_SIZE + ObjectSizes.sizeOnHeapExcludingData(elements) + + ObjectSizes.sizeOnHeapExcludingData(collectionElement); } } -} +} \ No newline at end of file diff --git a/src/java/org/apache/cassandra/db/composites/SimpleDenseCellName.java b/src/java/org/apache/cassandra/db/composites/SimpleDenseCellName.java index 5c0f9762fb8d..2ca7d2335352 100644 --- a/src/java/org/apache/cassandra/db/composites/SimpleDenseCellName.java +++ b/src/java/org/apache/cassandra/db/composites/SimpleDenseCellName.java @@ -67,7 +67,7 @@ public long unsharedHeapSize() } @Override - public long excessHeapSizeExcludingData() + public long unsharedHeapSizeExcludingData() { return EMPTY_SIZE + ObjectSizes.sizeOnHeapExcludingData(element); } diff --git a/src/java/org/apache/cassandra/db/composites/SimpleSparseCellName.java b/src/java/org/apache/cassandra/db/composites/SimpleSparseCellName.java index a7fafba535b3..c6351f1dbd2a 100644 --- a/src/java/org/apache/cassandra/db/composites/SimpleSparseCellName.java +++ b/src/java/org/apache/cassandra/db/composites/SimpleSparseCellName.java @@ -87,9 +87,9 @@ public boolean isSameCQL3RowAs(CellNameType type, CellName other) return true; } - public long excessHeapSizeExcludingData() + public long unsharedHeapSizeExcludingData() { - return EMPTY_SIZE + columnName.excessHeapSizeExcludingData(); + return EMPTY_SIZE + columnName.unsharedHeapSizeExcludingData(); } public long unsharedHeapSize() diff --git a/src/java/org/apache/cassandra/db/composites/SimpleSparseInternedCellName.java b/src/java/org/apache/cassandra/db/composites/SimpleSparseInternedCellName.java index c5708d824393..c61372046e9d 100644 --- a/src/java/org/apache/cassandra/db/composites/SimpleSparseInternedCellName.java +++ b/src/java/org/apache/cassandra/db/composites/SimpleSparseInternedCellName.java @@ -31,7 +31,7 @@ public class SimpleSparseInternedCellName extends SimpleSparseCellName } @Override - public long excessHeapSizeExcludingData() + public long unsharedHeapSizeExcludingData() { return 0; } diff --git a/src/java/org/apache/cassandra/io/sstable/IndexHelper.java b/src/java/org/apache/cassandra/io/sstable/IndexHelper.java index 72a708bafcc2..7099a151a2d5 100644 --- a/src/java/org/apache/cassandra/io/sstable/IndexHelper.java +++ b/src/java/org/apache/cassandra/io/sstable/IndexHelper.java @@ -205,7 +205,7 @@ public long serializedSize(IndexInfo info, TypeSizes typeSizes) } } - public long excessHeapSize() + public long unsharedHeapSize() { return EMPTY_SIZE + firstName.unsharedHeapSize() + lastName.unsharedHeapSize(); } From 2a3e2021f134ad51de0f025b253907ee5f391a86 Mon Sep 17 00:00:00 2001 From: stinkymatt Date: Mon, 23 Jun 2014 21:41:19 +0100 Subject: [PATCH 059/557] Permit configurable timestamps with cassandra-stress (CASSANDRA-7416) patch by Matt Kennedy; reviewed by Benedict Elliott Smith for CASSANDRA-7416 --- CHANGES.txt | 1 + .../apache/cassandra/stress/operations/CqlInserter.java | 2 ++ .../apache/cassandra/stress/operations/ThriftInserter.java | 4 +++- .../apache/cassandra/stress/settings/SettingsColumn.java | 7 +++++-- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 7124ec48d5d5..3b14fbebbcf0 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0 + * Permit configurable timestamps with cassandra-stress (CASSANDRA-7416) * Move sstable RandomAccessReader to nio2, which allows using the FILE_SHARE_DELETE flag on Windows (CASSANDRA-4050) * Remove CQL2 (CASSANDRA-5918) diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/CqlInserter.java b/tools/stress/src/org/apache/cassandra/stress/operations/CqlInserter.java index 45e375b32ca9..b459e0456072 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/CqlInserter.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/CqlInserter.java @@ -41,6 +41,8 @@ public CqlInserter(State state, long idx) protected String buildQuery() { StringBuilder query = new StringBuilder("UPDATE ").append(wrapInQuotes(state.type.table)); + if (state.settings.columns.timestamp != null) + query.append(" USING TIMESTAMP ").append(state.settings.columns.timestamp); query.append(" SET "); diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/ThriftInserter.java b/tools/stress/src/org/apache/cassandra/stress/operations/ThriftInserter.java index 7077a9504979..73515ae59735 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/ThriftInserter.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/ThriftInserter.java @@ -109,7 +109,9 @@ protected List generateColumns(ByteBuffer key) for (int i = 0 ; i < values.size() ; i++) columns.get(i) .setValue(values.get(i)) - .setTimestamp(FBUtilities.timestampMicros()); + .setTimestamp(state.settings.columns.timestamp != null + ? Long.parseLong(state.settings.columns.timestamp) + : FBUtilities.timestampMicros()); return columns; } diff --git a/tools/stress/src/org/apache/cassandra/stress/settings/SettingsColumn.java b/tools/stress/src/org/apache/cassandra/stress/settings/SettingsColumn.java index 7e20ec6f0312..4fac5d064836 100644 --- a/tools/stress/src/org/apache/cassandra/stress/settings/SettingsColumn.java +++ b/tools/stress/src/org/apache/cassandra/stress/settings/SettingsColumn.java @@ -42,6 +42,7 @@ public class SettingsColumn implements Serializable public final List names; public final List namestrs; public final String comparator; + public final String timestamp; public final boolean useTimeUUIDComparator; public final int superColumns; public final boolean useSuperColumns; @@ -66,6 +67,7 @@ public SettingsColumn(Options options, NameOptions name, CountOptions count) dataGenFactory = options.generator.get(); useSuperColumns = superColumns > 0; { + timestamp = options.timestamp.value(); comparator = options.comparator.value(); AbstractType parsed = null; @@ -149,6 +151,7 @@ private static abstract class Options extends GroupedOptions final OptionSimple superColumns = new OptionSimple("super=", "[0-9]+", "0", "Number of super columns to use (no super columns used if not specified)", false); final OptionSimple comparator = new OptionSimple("comparator=", "TimeUUIDType|AsciiType|UTF8Type", "AsciiType", "Column Comparator to use", false); final OptionSimple slice = new OptionSimple("slice", "", null, "If set, range slices will be used for reads, otherwise a names query will be", false); + final OptionSimple timestamp = new OptionSimple("timestamp=", "[0-9]+", null, "If set, all columns will be written with the given timestamp", false); final OptionDistribution size = new OptionDistribution("size=", "FIXED(34)", "Cell size distribution"); final OptionDataGen generator = new OptionDataGen("data=", "REPEAT(50)"); } @@ -160,7 +163,7 @@ private static final class NameOptions extends Options @Override public List options() { - return Arrays.asList(name, slice, superColumns, comparator, size, generator); + return Arrays.asList(name, slice, superColumns, comparator, timestamp, size, generator); } } @@ -171,7 +174,7 @@ private static final class CountOptions extends Options @Override public List options() { - return Arrays.asList(count, slice, superColumns, comparator, size, generator); + return Arrays.asList(count, slice, superColumns, comparator, timestamp, size, generator); } } From 33c5e19a2649986989b0d3236ec511593e63f20c Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Tue, 24 Jun 2014 11:14:05 -0500 Subject: [PATCH 060/557] Rename code coverage test. Patch by Russ Hatch, reviewed by brandonwilliams for CASSANDRA-7226 --- build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.xml b/build.xml index 02e1f98fbb6b..db738bf5dd11 100644 --- a/build.xml +++ b/build.xml @@ -1292,7 +1292,7 @@ - + From eb396399ce9bf6d830a71728a2bddba940c7e0c6 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Wed, 25 Jun 2014 13:43:38 -0500 Subject: [PATCH 061/557] Exclude stress/thrift from jacoco Patch by Russ Hatch, reviewed by brandonwilliams for CASSANDRA-7226 --- build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.xml b/build.xml index db738bf5dd11..d87da5220c7c 100644 --- a/build.xml +++ b/build.xml @@ -1294,7 +1294,7 @@ - + From ae0f63463d5ff4e49b6dfa209d03dfaa98105d56 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Thu, 26 Jun 2014 10:08:53 -0500 Subject: [PATCH 062/557] Expose global CF metrics Patch by Chris Lohfink, reviewed by brandonwilliams for CASSANDRA-7273 --- .../cassandra/db/ColumnFamilyStore.java | 4 +- .../org/apache/cassandra/db/Keyspace.java | 2 +- .../metrics/ColumnFamilyMetrics.java | 345 ++++++++++++++---- .../cassandra/metrics/KeyspaceMetrics.java | 253 +++++++------ .../cassandra/metrics/LatencyMetrics.java | 28 +- .../org/apache/cassandra/db/KeyspaceTest.java | 16 +- 6 files changed, 439 insertions(+), 209 deletions(-) diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java index 39753528049d..db3ed1586870 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java @@ -2674,12 +2674,12 @@ private void validateCompactionThresholds(int minThreshold, int maxThreshold) public double getTombstonesPerSlice() { - return metric.tombstoneScannedHistogram.getSnapshot().getMedian(); + return metric.tombstoneScannedHistogram.cf.getSnapshot().getMedian(); } public double getLiveCellsPerSlice() { - return metric.liveScannedHistogram.getSnapshot().getMedian(); + return metric.liveScannedHistogram.cf.getSnapshot().getMedian(); } // End JMX get/set. diff --git a/src/java/org/apache/cassandra/db/Keyspace.java b/src/java/org/apache/cassandra/db/Keyspace.java index 60183db272f4..9c686b7885be 100644 --- a/src/java/org/apache/cassandra/db/Keyspace.java +++ b/src/java/org/apache/cassandra/db/Keyspace.java @@ -273,12 +273,12 @@ private Keyspace(String keyspaceName, boolean loadSSTables) assert metadata != null : "Unknown keyspace " + keyspaceName; createReplicationStrategy(metadata); + this.metric = new KeyspaceMetrics(this); for (CFMetaData cfm : new ArrayList(metadata.cfMetaData().values())) { logger.debug("Initializing {}.{}", getName(), cfm.cfName); initCf(cfm.cfId, cfm.cfName, loadSSTables); } - this.metric = new KeyspaceMetrics(this); } public void createReplicationStrategy(KSMetaData ksm) diff --git a/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java b/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java index f4682da5096c..75a21dce31fb 100644 --- a/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java +++ b/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java @@ -17,17 +17,23 @@ */ package org.apache.cassandra.metrics; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.ConcurrentMap; import java.util.concurrent.TimeUnit; -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.*; -import com.yammer.metrics.util.RatioGauge; - import org.apache.cassandra.db.ColumnFamilyStore; +import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.io.sstable.metadata.MetadataCollector; import org.apache.cassandra.utils.EstimatedHistogram; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import com.yammer.metrics.Metrics; +import com.yammer.metrics.core.*; +import com.yammer.metrics.util.RatioGauge; + /** * Metrics for {@link ColumnFamilyStore}. */ @@ -56,7 +62,7 @@ public class ColumnFamilyMetrics /** Histogram of estimated number of columns. */ public final Gauge estimatedColumnCountHistogram; /** Histogram of the number of sstable data files accessed per read */ - public final Histogram sstablesPerReadHistogram; + public final ColumnFamilyHistogram sstablesPerReadHistogram; /** (Local) read metrics */ public final LatencyMetrics readLatency; /** (Local) range slice metrics */ @@ -92,9 +98,9 @@ public class ColumnFamilyMetrics /** Key cache hit rate for this CF */ public final Gauge keyCacheHitRate; /** Tombstones scanned in queries on this CF */ - public final Histogram tombstoneScannedHistogram; + public final ColumnFamilyHistogram tombstoneScannedHistogram; /** Live cells scanned in queries on this CF */ - public final Histogram liveScannedHistogram; + public final ColumnFamilyHistogram liveScannedHistogram; /** Disk space used by snapshot files which */ public final Gauge trueSnapshotsSize; /** Row cache hits, but result out of range */ @@ -111,14 +117,28 @@ public class ColumnFamilyMetrics public final Timer waitingOnFreeMemtableSpace; private final MetricNameFactory factory; + private static final MetricNameFactory globalNameFactory = new AllColumnFamilyMetricNameFactory();; public final Counter speculativeRetries; // for backward compatibility @Deprecated public final EstimatedHistogram sstablesPerRead = new EstimatedHistogram(35); @Deprecated public final EstimatedHistogram recentSSTablesPerRead = new EstimatedHistogram(35); - - + + public final static LatencyMetrics globalReadLatency = new LatencyMetrics(globalNameFactory, "Read"); + public final static LatencyMetrics globalWriteLatency = new LatencyMetrics(globalNameFactory, "Write"); + public final static LatencyMetrics globalRangeLatency = new LatencyMetrics(globalNameFactory, "Range"); + + /** + * stores metrics that will be rolled into a single global metric + */ + public final static ConcurrentMap> allColumnFamilyMetrics = Maps.newConcurrentMap(); + + /** + * Stores all metric names created that can be used when unregistering + */ + public final static Set all = Sets.newHashSet(); + /** * Creates metrics for given {@link ColumnFamilyStore}. * @@ -128,35 +148,35 @@ public ColumnFamilyMetrics(final ColumnFamilyStore cfs) { factory = new ColumnFamilyMetricNameFactory(cfs); - memtableColumnsCount = Metrics.newGauge(factory.createMetricName("MemtableColumnsCount"), new Gauge() + memtableColumnsCount = createColumnFamilyGauge("MemtableColumnsCount", new Gauge() { public Long value() { return cfs.getDataTracker().getView().getCurrentMemtable().getOperations(); } }); - memtableOnHeapSize = Metrics.newGauge(factory.createMetricName("MemtableHeapSize"), new Gauge() + memtableOnHeapSize = createColumnFamilyGauge("MemtableOnHeapSize", new Gauge() { public Long value() { return cfs.getDataTracker().getView().getCurrentMemtable().getAllocator().onHeap().owns(); } }); - memtableOffHeapSize = Metrics.newGauge(factory.createMetricName("MemtableHeapSize"), new Gauge() + memtableOffHeapSize = createColumnFamilyGauge("MemtableOffHeapSize", new Gauge() { public Long value() { return cfs.getDataTracker().getView().getCurrentMemtable().getAllocator().offHeap().owns(); } }); - memtableLiveDataSize = Metrics.newGauge(factory.createMetricName("MemtableLiveDataSize"), new Gauge() + memtableLiveDataSize = createColumnFamilyGauge("MemtableLiveDataSize", new Gauge() { public Long value() { return cfs.getDataTracker().getView().getCurrentMemtable().getLiveDataSize(); } }); - allMemtablesOnHeapSize = Metrics.newGauge(factory.createMetricName("AllMemtablesHeapSize"), new Gauge() + allMemtablesOnHeapSize = createColumnFamilyGauge("AllMemtablesHeapSize", new Gauge() { public Long value() { @@ -166,7 +186,7 @@ public Long value() return size; } }); - allMemtablesOffHeapSize = Metrics.newGauge(factory.createMetricName("AllMemtablesHeapSize"), new Gauge() + allMemtablesOffHeapSize = createColumnFamilyGauge("AllMemtablesOffHeapSize", new Gauge() { public Long value() { @@ -176,7 +196,7 @@ public Long value() return size; } }); - allMemtablesLiveDataSize = Metrics.newGauge(factory.createMetricName("AllMemtablesLiveDataSize"), new Gauge() + allMemtablesLiveDataSize = createColumnFamilyGauge("AllMemtablesLiveDataSize", new Gauge() { public Long value() { @@ -186,7 +206,7 @@ public Long value() return size; } }); - memtableSwitchCount = Metrics.newCounter(factory.createMetricName("MemtableSwitchCount")); + memtableSwitchCount = createColumnFamilyCounter("MemtableSwitchCount"); estimatedRowSizeHistogram = Metrics.newGauge(factory.createMetricName("EstimatedRowSizeHistogram"), new Gauge() { public long[] value() @@ -215,8 +235,8 @@ public long[] value() return histogram; } }); - sstablesPerReadHistogram = Metrics.newHistogram(factory.createMetricName("SSTablesPerReadHistogram"), true); - compressionRatio = Metrics.newGauge(factory.createMetricName("CompressionRatio"), new Gauge() + sstablesPerReadHistogram = createColumnFamilyHistogram("SSTablesPerReadHistogram", cfs.keyspace.metric.sstablesPerReadHistogram); + compressionRatio = createColumnFamilyGauge("CompressionRatio", new Gauge() { public Double value() { @@ -232,28 +252,47 @@ public Double value() } return total != 0 ? sum / total : 0; } + }, new Gauge() // global gauge + { + public Double value() + { + double sum = 0; + int total = 0; + for (Keyspace keyspace : Keyspace.all()) + { + for (SSTableReader sstable : keyspace.getAllSSTables()) + { + if (sstable.getCompressionRatio() != MetadataCollector.NO_COMPRESSION_RATIO) + { + sum += sstable.getCompressionRatio(); + total++; + } + } + } + return total != 0 ? sum / total : 0; + } }); - readLatency = new LatencyMetrics(factory, "Read"); - writeLatency = new LatencyMetrics(factory, "Write"); - rangeLatency = new LatencyMetrics(factory, "Range"); - pendingFlushes = Metrics.newCounter(factory.createMetricName("PendingFlushes")); - pendingCompactions = Metrics.newGauge(factory.createMetricName("PendingCompactions"), new Gauge() + readLatency = new LatencyMetrics(factory, "Read", cfs.keyspace.metric.readLatency, globalReadLatency); + writeLatency = new LatencyMetrics(factory, "Write", cfs.keyspace.metric.writeLatency, globalWriteLatency); + rangeLatency = new LatencyMetrics(factory, "Range", cfs.keyspace.metric.rangeLatency, globalRangeLatency); + pendingFlushes = createColumnFamilyCounter("PendingFlushes"); + pendingCompactions = createColumnFamilyGauge("PendingCompactions", new Gauge() { public Integer value() { return cfs.getCompactionStrategy().getEstimatedRemainingTasks(); } }); - liveSSTableCount = Metrics.newGauge(factory.createMetricName("LiveSSTableCount"), new Gauge() + liveSSTableCount = createColumnFamilyGauge("LiveSSTableCount", new Gauge() { public Integer value() { return cfs.getDataTracker().getSSTables().size(); } }); - liveDiskSpaceUsed = Metrics.newCounter(factory.createMetricName("LiveDiskSpaceUsed")); - totalDiskSpaceUsed = Metrics.newCounter(factory.createMetricName("TotalDiskSpaceUsed")); - minRowSize = Metrics.newGauge(factory.createMetricName("MinRowSize"), new Gauge() + liveDiskSpaceUsed = createColumnFamilyCounter("LiveDiskSpaceUsed"); + totalDiskSpaceUsed = createColumnFamilyCounter("TotalDiskSpaceUsed"); + minRowSize = createColumnFamilyGauge("MinRowSize", new Gauge() { public Long value() { @@ -265,8 +304,19 @@ public Long value() } return min; } + }, new Gauge() // global gauge + { + public Long value() + { + long min = Long.MAX_VALUE; + for (Metric cfGauge : allColumnFamilyMetrics.get("MinRowSize")) + { + min = Math.min(min, ((Gauge) cfGauge).value().longValue()); + } + return min; + } }); - maxRowSize = Metrics.newGauge(factory.createMetricName("MaxRowSize"), new Gauge() + maxRowSize = createColumnFamilyGauge("MaxRowSize", new Gauge() { public Long value() { @@ -278,8 +328,19 @@ public Long value() } return max; } + }, new Gauge() // global gauge + { + public Long value() + { + long max = 0; + for (Metric cfGauge : allColumnFamilyMetrics.get("MaxRowSize")) + { + max = Math.max(max, ((Gauge) cfGauge).value().longValue()); + } + return max; + } }); - meanRowSize = Metrics.newGauge(factory.createMetricName("MeanRowSize"), new Gauge() + meanRowSize = createColumnFamilyGauge("MeanRowSize", new Gauge() { public Long value() { @@ -293,8 +354,25 @@ public Long value() } return count > 0 ? sum / count : 0; } + }, new Gauge() // global gauge + { + public Long value() + { + long sum = 0; + long count = 0; + for (Keyspace keyspace : Keyspace.all()) + { + for (SSTableReader sstable : keyspace.getAllSSTables()) + { + long n = sstable.getEstimatedRowSize().count(); + sum += sstable.getEstimatedRowSize().mean() * n; + count += n; + } + } + return count > 0 ? sum / count : 0; + } }); - bloomFilterFalsePositives = Metrics.newGauge(factory.createMetricName("BloomFilterFalsePositives"), new Gauge() + bloomFilterFalsePositives = createColumnFamilyGauge("BloomFilterFalsePositives", new Gauge() { public Long value() { @@ -304,7 +382,7 @@ public Long value() return count; } }); - recentBloomFilterFalsePositives = Metrics.newGauge(factory.createMetricName("RecentBloomFilterFalsePositives"), new Gauge() + recentBloomFilterFalsePositives = createColumnFamilyGauge("RecentBloomFilterFalsePositives", new Gauge() { public Long value() { @@ -314,7 +392,7 @@ public Long value() return count; } }); - bloomFilterFalseRatio = Metrics.newGauge(factory.createMetricName("BloomFilterFalseRatio"), new Gauge() + bloomFilterFalseRatio = createColumnFamilyGauge("BloomFilterFalseRatio", new Gauge() { public Double value() { @@ -329,8 +407,26 @@ public Double value() return 0d; return (double) falseCount / (trueCount + falseCount); } + }, new Gauge() // global gauge + { + public Double value() + { + long falseCount = 0L; + long trueCount = 0L; + for (Keyspace keyspace : Keyspace.all()) + { + for (SSTableReader sstable : keyspace.getAllSSTables()) + { + falseCount += sstable.getBloomFilterFalsePositiveCount(); + trueCount += sstable.getBloomFilterTruePositiveCount(); + } + } + if (falseCount == 0L && trueCount == 0L) + return 0d; + return (double) falseCount / (trueCount + falseCount); + } }); - recentBloomFilterFalseRatio = Metrics.newGauge(factory.createMetricName("RecentBloomFilterFalseRatio"), new Gauge() + recentBloomFilterFalseRatio = createColumnFamilyGauge("RecentBloomFilterFalseRatio", new Gauge() { public Double value() { @@ -345,8 +441,26 @@ public Double value() return 0d; return (double) falseCount / (trueCount + falseCount); } + }, new Gauge() // global gauge + { + public Double value() + { + long falseCount = 0L; + long trueCount = 0L; + for (Keyspace keyspace : Keyspace.all()) + { + for (SSTableReader sstable : keyspace.getAllSSTables()) + { + falseCount += sstable.getRecentBloomFilterFalsePositiveCount(); + trueCount += sstable.getRecentBloomFilterTruePositiveCount(); + } + } + if (falseCount == 0L && trueCount == 0L) + return 0d; + return (double) falseCount / (trueCount + falseCount); + } }); - bloomFilterDiskSpaceUsed = Metrics.newGauge(factory.createMetricName("BloomFilterDiskSpaceUsed"), new Gauge() + bloomFilterDiskSpaceUsed = createColumnFamilyGauge("BloomFilterDiskSpaceUsed", new Gauge() { public Long value() { @@ -356,7 +470,7 @@ public Long value() return total; } }); - speculativeRetries = Metrics.newCounter(factory.createMetricName("SpeculativeRetries")); + speculativeRetries = createColumnFamilyCounter("SpeculativeRetries"); keyCacheHitRate = Metrics.newGauge(factory.createMetricName("KeyCacheHitRate"), new RatioGauge() { protected double getNumerator() @@ -375,22 +489,22 @@ protected double getDenominator() return Math.max(requests, 1); // to avoid NaN. } }); - tombstoneScannedHistogram = Metrics.newHistogram(factory.createMetricName("TombstoneScannedHistogram"), true); - liveScannedHistogram = Metrics.newHistogram(factory.createMetricName("LiveScannedHistogram"), true); + tombstoneScannedHistogram = createColumnFamilyHistogram("TombstoneScannedHistogram", cfs.keyspace.metric.tombstoneScannedHistogram); + liveScannedHistogram = createColumnFamilyHistogram("LiveScannedHistogram", cfs.keyspace.metric.liveScannedHistogram); coordinatorReadLatency = Metrics.newTimer(factory.createMetricName("CoordinatorReadLatency"), TimeUnit.MICROSECONDS, TimeUnit.SECONDS); coordinatorScanLatency = Metrics.newTimer(factory.createMetricName("CoordinatorScanLatency"), TimeUnit.MICROSECONDS, TimeUnit.SECONDS); waitingOnFreeMemtableSpace = Metrics.newTimer(factory.createMetricName("WaitingOnFreeMemtableSpace"), TimeUnit.MICROSECONDS, TimeUnit.SECONDS); - trueSnapshotsSize = Metrics.newGauge(factory.createMetricName("SnapshotsSize"), new Gauge() + trueSnapshotsSize = createColumnFamilyGauge("SnapshotsSize", new Gauge() { public Long value() { return cfs.trueSnapshotsSize(); } }); - rowCacheHitOutOfRange = Metrics.newCounter(factory.createMetricName("RowCacheHitOutOfRange")); - rowCacheHit = Metrics.newCounter(factory.createMetricName("RowCacheHit")); - rowCacheMiss = Metrics.newCounter(factory.createMetricName("RowCacheMiss")); + rowCacheHitOutOfRange = createColumnFamilyCounter("RowCacheHitOutOfRange"); + rowCacheHit = createColumnFamilyCounter("RowCacheHit"); + rowCacheMiss = createColumnFamilyCounter("RowCacheMiss"); } public void updateSSTableIterated(int count) @@ -405,41 +519,124 @@ public void updateSSTableIterated(int count) */ public void release() { + for(String name : all) + { + allColumnFamilyMetrics.get(name).remove(Metrics.defaultRegistry().allMetrics().get(factory.createMetricName(name))); + Metrics.defaultRegistry().removeMetric(factory.createMetricName(name)); + } readLatency.release(); writeLatency.release(); rangeLatency.release(); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("AllMemtablesDataSize")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("MemtableColumnsCount")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("MemtableDataSize")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("MemtableSwitchCount")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("CompressionRatio")); Metrics.defaultRegistry().removeMetric(factory.createMetricName("EstimatedRowSizeHistogram")); Metrics.defaultRegistry().removeMetric(factory.createMetricName("EstimatedColumnCountHistogram")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("SSTablesPerReadHistogram")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("PendingFlushes")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("LiveSSTableCount")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("LiveDiskSpaceUsed")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("TotalDiskSpaceUsed")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("MinRowSize")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("MaxRowSize")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("MeanRowSize")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("BloomFilterFalsePositives")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("RecentBloomFilterFalsePositives")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("BloomFilterFalseRatio")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("RecentBloomFilterFalseRatio")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("BloomFilterDiskSpaceUsed")); Metrics.defaultRegistry().removeMetric(factory.createMetricName("KeyCacheHitRate")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("SpeculativeRetries")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("TombstoneScannedHistogram")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("LiveScannedHistogram")); Metrics.defaultRegistry().removeMetric(factory.createMetricName("CoordinatorReadLatency")); Metrics.defaultRegistry().removeMetric(factory.createMetricName("CoordinatorScanLatency")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("SnapshotsSize")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("RowCacheHitOutOfRange")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("RowCacheHit")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("RowCacheHitMiss")); + Metrics.defaultRegistry().removeMetric(factory.createMetricName("WaitingOnFreeMemtableSpace")); } + + /** + * Create a gauge that will be part of a merged version of all column families. The global gauge + * will merge each CF gauge by adding their values + */ + protected Gauge createColumnFamilyGauge(final String name, Gauge gauge) + { + return createColumnFamilyGauge(name, gauge, new Gauge() + { + public Long value() + { + long total = 0; + for (Metric cfGauge : allColumnFamilyMetrics.get(name)) + { + total = total + ((Gauge) cfGauge).value().longValue(); + } + return total; + } + }); + } + + /** + * Create a gauge that will be part of a merged version of all column families. The global gauge + * is defined as the globalGauge parameter + */ + protected Gauge createColumnFamilyGauge(String name, Gauge gauge, Gauge globalGauge) + { + Gauge cfGauge = Metrics.newGauge(factory.createMetricName(name), gauge); + if (register(name, cfGauge)) + { + Metrics.newGauge(globalNameFactory.createMetricName(name), globalGauge); + } + return cfGauge; + } + + /** + * Creates a counter that will also have a global counter thats the sum of all counters across + * different column families + */ + protected Counter createColumnFamilyCounter(final String name) + { + Counter cfCounter = Metrics.newCounter(factory.createMetricName(name)); + if (register(name, cfCounter)) + { + Metrics.newGauge(globalNameFactory.createMetricName(name), new Gauge() + { + public Long value() + { + long total = 0; + for (Metric cfGauge : allColumnFamilyMetrics.get(name)) + { + total += ((Counter) cfGauge).count(); + } + return total; + } + }); + } + return cfCounter; + } + + /** + * Create a histogram-like interface that will register both a CF, keyspace and global level + * histogram and forward any updates to both + */ + protected ColumnFamilyHistogram createColumnFamilyHistogram(String name, Histogram keyspaceHistogram) + { + Histogram cfHistogram = Metrics.newHistogram(factory.createMetricName(name), true); + register(name, cfHistogram); + return new ColumnFamilyHistogram(cfHistogram, keyspaceHistogram, Metrics.newHistogram(globalNameFactory.createMetricName(name), true)); + } + + /** + * Registers a metric to be removed when unloading CF. + * @return true if first time metric with that name has been registered + */ + private boolean register(String name, Metric metric) + { + boolean ret = allColumnFamilyMetrics.putIfAbsent(name, new HashSet()) == null; + allColumnFamilyMetrics.get(name).add(metric); + all.add(name); + return ret; + } + + public class ColumnFamilyHistogram + { + public final Histogram[] all; + public final Histogram cf; + private ColumnFamilyHistogram(Histogram cf, Histogram keyspace, Histogram global) + { + this.cf = cf; + this.all = new Histogram[]{cf, keyspace, global}; + } + + public void update(long i) + { + for(Histogram histo : all) + { + histo.update(i); + } + } + } + class ColumnFamilyMetricNameFactory implements MetricNameFactory { private final String keyspaceName; @@ -468,5 +665,17 @@ public MetricName createMetricName(String metricName) return new MetricName(groupName, type, metricName, keyspaceName + "." + columnFamilyName, mbeanName.toString()); } } - + + static class AllColumnFamilyMetricNameFactory implements MetricNameFactory + { + public MetricName createMetricName(String metricName) + { + String groupName = ColumnFamilyMetrics.class.getPackage().getName(); + StringBuilder mbeanName = new StringBuilder(); + mbeanName.append(groupName).append(":"); + mbeanName.append("type=ColumnFamily"); + mbeanName.append(",name=").append(metricName); + return new MetricName(groupName, "ColumnFamily", metricName, "all", mbeanName.toString()); + } + } } diff --git a/src/java/org/apache/cassandra/metrics/KeyspaceMetrics.java b/src/java/org/apache/cassandra/metrics/KeyspaceMetrics.java index c5afcc1e9547..92fabf1a47b1 100644 --- a/src/java/org/apache/cassandra/metrics/KeyspaceMetrics.java +++ b/src/java/org/apache/cassandra/metrics/KeyspaceMetrics.java @@ -17,50 +17,66 @@ */ package org.apache.cassandra.metrics; -import java.util.ArrayList; -import java.util.List; - -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.*; -import com.yammer.metrics.stats.Snapshot; +import java.util.Set; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.Keyspace; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import com.yammer.metrics.Metrics; +import com.yammer.metrics.core.*; + /** * Metrics for {@link ColumnFamilyStore}. */ public class KeyspaceMetrics { - /** Total amount of data stored in the memtable, including column related overhead. */ + /** Total amount of live data stored in the memtable, excluding any data structure overhead */ public final Gauge memtableLiveDataSize; /** Total amount of data stored in the memtable that resides on-heap, including column related overhead and overwritten rows. */ public final Gauge memtableOnHeapDataSize; /** Total amount of data stored in the memtable that resides off-heap, including column related overhead and overwritten rows. */ public final Gauge memtableOffHeapDataSize; + /** Total amount of live data stored in the memtables (2i and pending flush memtables included) that resides off-heap, excluding any data structure overhead */ + public final Gauge allMemtablesLiveDataSize; /** Total amount of data stored in the memtables (2i and pending flush memtables included) that resides on-heap. */ public final Gauge allMemtablesOnHeapDataSize; /** Total amount of data stored in the memtables (2i and pending flush memtables included) that resides off-heap. */ public final Gauge allMemtablesOffHeapDataSize; - /** Total amount of live data stored in the memtables (2i and pending flush memtables included) that resides off-heap, excluding any data structure overhead */ - public final Gauge allMemtablesLiveDataSize; /** Total number of columns present in the memtable. */ public final Gauge memtableColumnsCount; /** Number of times flush has resulted in the memtable being switched out. */ public final Gauge memtableSwitchCount; /** Estimated number of tasks pending for this column family */ - public final Gauge pendingFlushes; + public final Gauge pendingFlushes; /** Estimate of number of pending compactios for this CF */ - public final Gauge pendingCompactions; + public final Gauge pendingCompactions; /** Disk space used by SSTables belonging to this CF */ public final Gauge liveDiskSpaceUsed; /** Total disk space used by SSTables belonging to this CF, including obsolete ones waiting to be GC'd */ public final Gauge totalDiskSpaceUsed; /** Disk space used by bloom filter */ public final Gauge bloomFilterDiskSpaceUsed; - - private final MetricNameFactory factory; - + /** (Local) read metrics */ + public final LatencyMetrics readLatency; + /** (Local) range slice metrics */ + public final LatencyMetrics rangeLatency; + /** (Local) write metrics */ + public final LatencyMetrics writeLatency; + /** Histogram of the number of sstable data files accessed per read */ + public final Histogram sstablesPerReadHistogram; + /** Tombstones scanned in queries on this Keyspace */ + public final Histogram tombstoneScannedHistogram; + /** Live cells scanned in queries on this Keyspace */ + public final Histogram liveScannedHistogram; + + public final MetricNameFactory factory; + private Keyspace keyspace; + + /** set containing names of all the metrics stored here, for releasing later */ + private Set allMetrics = Sets.newHashSet(); + /** * Creates metrics for given {@link ColumnFamilyStore}. * @@ -69,159 +85,108 @@ public class KeyspaceMetrics public KeyspaceMetrics(final Keyspace ks) { factory = new KeyspaceMetricNameFactory(ks); - - memtableColumnsCount = Metrics.newGauge(factory.createMetricName("MemtableColumnsCount"), new Gauge() + keyspace = ks; + memtableColumnsCount = createKeyspaceGauge("MemtableColumnsCount", new MetricValue() { - public Long value() + public Long getValue(ColumnFamilyMetrics metric) { - long total = 0; - for (ColumnFamilyStore cf : ks.getColumnFamilyStores()) - { - total += cf.metric.memtableColumnsCount.value(); - } - return total; + return metric.memtableColumnsCount.value(); } }); - memtableOnHeapDataSize = Metrics.newGauge(factory.createMetricName("MemtableOnHeapDataSize"), new Gauge() + memtableLiveDataSize = createKeyspaceGauge("MemtableLiveDataSize", new MetricValue() { - public Long value() + public Long getValue(ColumnFamilyMetrics metric) { - long total = 0; - for (ColumnFamilyStore cf : ks.getColumnFamilyStores()) - { - total += cf.metric.memtableOnHeapSize.value(); - } - return total; + return metric.memtableLiveDataSize.value(); } - }); - memtableOffHeapDataSize = Metrics.newGauge(factory.createMetricName("MemtableOffHeapDataSize"), new Gauge() + }); + memtableOnHeapDataSize = createKeyspaceGauge("MemtableOnHeapDataSize", new MetricValue() { - public Long value() + public Long getValue(ColumnFamilyMetrics metric) { - long total = 0; - for (ColumnFamilyStore cf : ks.getColumnFamilyStores()) - { - total += cf.metric.memtableOffHeapSize.value(); - } - return total; + return metric.memtableOnHeapSize.value(); } }); - memtableLiveDataSize = Metrics.newGauge(factory.createMetricName("MemtableLiveDataSize"), new Gauge() + memtableOffHeapDataSize = createKeyspaceGauge("MemtableOffHeapDataSize", new MetricValue() { - public Long value() + public Long getValue(ColumnFamilyMetrics metric) { - long total = 0; - for (ColumnFamilyStore cf : ks.getColumnFamilyStores()) - { - total += cf.metric.memtableLiveDataSize.value(); - } - return total; + return metric.memtableOffHeapSize.value(); } }); - allMemtablesOnHeapDataSize = Metrics.newGauge(factory.createMetricName("AllMemtablesOnHeapDataSize"), new Gauge() + allMemtablesLiveDataSize = createKeyspaceGauge("AllMemtablesLiveDataSize", new MetricValue() { - public Long value() + public Long getValue(ColumnFamilyMetrics metric) { - long total = 0; - for (ColumnFamilyStore cf : ks.getColumnFamilyStores()) - { - total += cf.metric.allMemtablesOnHeapSize.value(); - } - return total; + return metric.allMemtablesLiveDataSize.value(); } }); - allMemtablesOffHeapDataSize = Metrics.newGauge(factory.createMetricName("AllMemtablesOffHeapDataSize"), new Gauge() + allMemtablesOnHeapDataSize = createKeyspaceGauge("AllMemtablesOnHeapDataSize", new MetricValue() { - public Long value() + public Long getValue(ColumnFamilyMetrics metric) { - long total = 0; - for (ColumnFamilyStore cf : ks.getColumnFamilyStores()) - { - total += cf.metric.allMemtablesOffHeapSize.value(); - } - return total; + return metric.allMemtablesOnHeapSize.value(); } }); - allMemtablesLiveDataSize = Metrics.newGauge(factory.createMetricName("AllMemtablesLiveDataSize"), new Gauge() + allMemtablesOffHeapDataSize = createKeyspaceGauge("AllMemtablesOffHeapDataSize", new MetricValue() { - public Long value() + public Long getValue(ColumnFamilyMetrics metric) { - long total = 0; - for (ColumnFamilyStore cf : ks.getColumnFamilyStores()) - { - total += cf.metric.allMemtablesLiveDataSize.value(); - } - return total; + return metric.allMemtablesOffHeapSize.value(); } }); - memtableSwitchCount = Metrics.newGauge(factory.createMetricName("MemtableSwitchCount"), new Gauge() + memtableSwitchCount = createKeyspaceGauge("MemtableSwitchCount", new MetricValue() { - public Long value() + public Long getValue(ColumnFamilyMetrics metric) { - long sum = 0; - for (ColumnFamilyStore cf : ks.getColumnFamilyStores()) - sum += cf.metric.memtableSwitchCount.count(); - return sum; + return metric.memtableSwitchCount.count(); } }); - pendingCompactions = Metrics.newGauge(factory.createMetricName("PendingCompactions"), new Gauge() + pendingCompactions = createKeyspaceGauge("PendingCompactions", new MetricValue() { - public Integer value() + public Long getValue(ColumnFamilyMetrics metric) { - int sum = 0; - for (ColumnFamilyStore cf : ks.getColumnFamilyStores()) - { - sum += cf.metric.pendingCompactions.value(); - } - return sum; + return (long) metric.pendingCompactions.value(); } }); - pendingFlushes = Metrics.newGauge(factory.createMetricName("PendingFlushes"), new Gauge() + pendingFlushes = createKeyspaceGauge("PendingFlushes", new MetricValue() { - public Integer value() + public Long getValue(ColumnFamilyMetrics metric) { - int sum = 0; - for (ColumnFamilyStore cf : ks.getColumnFamilyStores()) - { - sum += cf.metric.pendingFlushes.count(); - } - return sum; + return (long) metric.pendingFlushes.count(); } }); - liveDiskSpaceUsed = Metrics.newGauge(factory.createMetricName("LiveDiskSpaceUsed"), new Gauge() + liveDiskSpaceUsed = createKeyspaceGauge("LiveDiskSpaceUsed", new MetricValue() { - public Long value() + public Long getValue(ColumnFamilyMetrics metric) { - long sum = 0; - for (ColumnFamilyStore cf : ks.getColumnFamilyStores()) - { - sum += cf.metric.liveDiskSpaceUsed.count(); - } - return sum; + return metric.liveDiskSpaceUsed.count(); } }); - totalDiskSpaceUsed = Metrics.newGauge(factory.createMetricName("TotalDiskSpaceUsed"), new Gauge() + totalDiskSpaceUsed = createKeyspaceGauge("TotalDiskSpaceUsed", new MetricValue() { - public Long value() + public Long getValue(ColumnFamilyMetrics metric) { - long sum = 0; - for (ColumnFamilyStore cf : ks.getColumnFamilyStores()) - { - sum += cf.metric.totalDiskSpaceUsed.count(); - } - return sum; + return metric.totalDiskSpaceUsed.count(); } }); - bloomFilterDiskSpaceUsed = Metrics.newGauge(factory.createMetricName("BloomFilterDiskSpaceUsed"), new Gauge() + bloomFilterDiskSpaceUsed = createKeyspaceGauge("BloomFilterDiskSpaceUsed", new MetricValue() { - public Long value() + public Long getValue(ColumnFamilyMetrics metric) { - long total = 0; - for (ColumnFamilyStore cf : ks.getColumnFamilyStores()) - total += cf.metric.bloomFilterDiskSpaceUsed.value(); - return total; + return metric.bloomFilterDiskSpaceUsed.value(); } }); + // latency metrics for ColumnFamilyMetrics to update + readLatency = new LatencyMetrics(factory, "Read"); + writeLatency = new LatencyMetrics(factory, "Write"); + rangeLatency = new LatencyMetrics(factory, "Range"); + // create histograms for ColumnFamilyMetrics to replicate updates to + sstablesPerReadHistogram = Metrics.newHistogram(factory.createMetricName("SSTablesPerReadHistogram"), true); + tombstoneScannedHistogram = Metrics.newHistogram(factory.createMetricName("TombstoneScannedHistogram"), true); + liveScannedHistogram = Metrics.newHistogram(factory.createMetricName("LiveScannedHistogram"), true); + // add manually since histograms do not use createKeyspaceGauge method + allMetrics.addAll(Lists.newArrayList("SSTablesPerReadHistogram", "TombstoneScannedHistogram", "LiveScannedHistogram")); } /** @@ -229,18 +194,50 @@ public Long value() */ public void release() { - Metrics.defaultRegistry().removeMetric(factory.createMetricName("AllMemtablesLiveDataSize")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("AllMemtablesOnHeapDataSize")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("AllMemtablesOffHeapDataSize")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("MemtableLiveDataSize")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("MemtableOnHeapDataSize")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("MemtableOffHeapDataSize")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("MemtableColumnsCount")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("MemtableSwitchCount")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("PendingFlushes")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("LiveDiskSpaceUsed")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("TotalDiskSpaceUsed")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("BloomFilterDiskSpaceUsed")); + for(String name : allMetrics) + { + Metrics.defaultRegistry().removeMetric(factory.createMetricName(name)); + } + // latency metrics contain multiple metrics internally and need to be released manually + readLatency.release(); + writeLatency.release(); + rangeLatency.release(); + } + + /** + * Represents a column family metric value. + */ + private interface MetricValue + { + /** + * get value of a metric + * @param columnfamilymetrics of a column family in this keyspace + * @return current value of a metric + */ + public Long getValue(ColumnFamilyMetrics metric); + } + + /** + * Creates a gauge that will sum the current value of a metric for all column families in this keyspace + * @param name + * @param MetricValue + * @return Gauge>Long> that computes sum of MetricValue.getValue() + */ + private Gauge createKeyspaceGauge(String name, final MetricValue extractor) + { + allMetrics.add(name); + return Metrics.newGauge(factory.createMetricName(name), new Gauge() + { + public Long value() + { + long sum = 0; + for (ColumnFamilyStore cf : keyspace.getColumnFamilyStores()) + { + sum += extractor.getValue(cf.metric); + } + return sum; + } + }); } class KeyspaceMetricNameFactory implements MetricNameFactory diff --git a/src/java/org/apache/cassandra/metrics/LatencyMetrics.java b/src/java/org/apache/cassandra/metrics/LatencyMetrics.java index b456e2aeeb90..28256feecc0a 100644 --- a/src/java/org/apache/cassandra/metrics/LatencyMetrics.java +++ b/src/java/org/apache/cassandra/metrics/LatencyMetrics.java @@ -17,14 +17,17 @@ */ package org.apache.cassandra.metrics; +import java.util.List; import java.util.concurrent.TimeUnit; +import org.apache.cassandra.utils.EstimatedHistogram; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; import com.yammer.metrics.Metrics; import com.yammer.metrics.core.Counter; import com.yammer.metrics.core.Timer; -import org.apache.cassandra.utils.EstimatedHistogram; - /** * Metrics about latencies */ @@ -35,6 +38,9 @@ public class LatencyMetrics /** Total latency in micro sec */ public final Counter totalLatency; + /** parent metrics to replicate any updates to **/ + private List parents = Lists.newArrayList(); + protected final MetricNameFactory factory; protected final String namePrefix; @@ -80,6 +86,20 @@ public LatencyMetrics(MetricNameFactory factory, String namePrefix) latency = Metrics.newTimer(factory.createMetricName(namePrefix + "Latency"), TimeUnit.MICROSECONDS, TimeUnit.SECONDS); totalLatency = Metrics.newCounter(factory.createMetricName(namePrefix + "TotalLatency")); } + + /** + * Create LatencyMetrics with given group, type, prefix to append to each metric name, and scope. Any updates + * to this will also run on parent + * + * @param factory MetricName factory to use + * @param namePrefix Prefix to append to each metric name + * @param parents... any amount of parents to replicate updates to + */ + public LatencyMetrics(MetricNameFactory factory, String namePrefix, LatencyMetrics ... parents) + { + this(factory, namePrefix); + this.parents.addAll(ImmutableList.copyOf(parents)); + } /** takes nanoseconds **/ public void addNano(long nanos) @@ -89,6 +109,10 @@ public void addNano(long nanos) totalLatency.inc(nanos / 1000); totalLatencyHistogram.add(nanos / 1000); recentLatencyHistogram.add(nanos / 1000); + for(LatencyMetrics parent : parents) + { + parent.addNano(nanos); + } } public void release() diff --git a/test/unit/org/apache/cassandra/db/KeyspaceTest.java b/test/unit/org/apache/cassandra/db/KeyspaceTest.java index a71b0dd14fad..0bd428d7bd06 100644 --- a/test/unit/org/apache/cassandra/db/KeyspaceTest.java +++ b/test/unit/org/apache/cassandra/db/KeyspaceTest.java @@ -481,18 +481,18 @@ public void testLimitSSTables() throws CharacterCodingException rm.apply(); cfStore.forceBlockingFlush(); } - cfStore.metric.sstablesPerReadHistogram.clear(); + cfStore.metric.sstablesPerReadHistogram.cf.clear(); ColumnFamily cf = cfStore.getColumnFamily(key, Composites.EMPTY, cellname("col1499"), false, 1000, System.currentTimeMillis()); - assertEquals(cfStore.metric.sstablesPerReadHistogram.max(), 5, 0.1); + assertEquals(cfStore.metric.sstablesPerReadHistogram.cf.max(), 5, 0.1); int i = 0; for (Cell c : cf.getSortedColumns()) { assertEquals(ByteBufferUtil.string(c.name().toByteBuffer()), "col" + (1000 + i++)); } assertEquals(i, 500); - cfStore.metric.sstablesPerReadHistogram.clear(); + cfStore.metric.sstablesPerReadHistogram.cf.clear(); cf = cfStore.getColumnFamily(key, cellname("col1500"), cellname("col2000"), false, 1000, System.currentTimeMillis()); - assertEquals(cfStore.metric.sstablesPerReadHistogram.max(), 5, 0.1); + assertEquals(cfStore.metric.sstablesPerReadHistogram.cf.max(), 5, 0.1); for (Cell c : cf.getSortedColumns()) { @@ -501,9 +501,9 @@ public void testLimitSSTables() throws CharacterCodingException assertEquals(i, 1000); // reverse - cfStore.metric.sstablesPerReadHistogram.clear(); + cfStore.metric.sstablesPerReadHistogram.cf.clear(); cf = cfStore.getColumnFamily(key, cellname("col2000"), cellname("col1500"), true, 1000, System.currentTimeMillis()); - assertEquals(cfStore.metric.sstablesPerReadHistogram.max(), 5, 0.1); + assertEquals(cfStore.metric.sstablesPerReadHistogram.cf.max(), 5, 0.1); i = 500; for (Cell c : cf.getSortedColumns()) { @@ -550,13 +550,13 @@ public void testLimitSSTablesComposites() } Composite start = type.builder().add(ByteBufferUtil.bytes("a5")).add(ByteBufferUtil.bytes(85)).build(); Composite finish = type.builder().add(ByteBufferUtil.bytes("a5")).build().end(); - cfs.metric.sstablesPerReadHistogram.clear(); + cfs.metric.sstablesPerReadHistogram.cf.clear(); ColumnFamily cf = cfs.getColumnFamily(key, start, finish, false, 1000, System.currentTimeMillis()); int colCount = 0; for (Cell c : cf) colCount++; assertEquals(2, colCount); - assertEquals(2, cfs.metric.sstablesPerReadHistogram.max(), 0.1); + assertEquals(2, cfs.metric.sstablesPerReadHistogram.cf.max(), 0.1); } private void validateSliceLarge(ColumnFamilyStore cfStore) throws IOException From c027183ea4e901cf1d44e06704f6d78f84405bb4 Mon Sep 17 00:00:00 2001 From: Jonathan Ellis Date: Fri, 27 Jun 2014 14:04:55 -0500 Subject: [PATCH 063/557] fix build on os x --- build.xml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/build.xml b/build.xml index 5e4a85badf54..27ac9c57663f 100644 --- a/build.xml +++ b/build.xml @@ -693,13 +693,17 @@ name="build-project"> - + - + From e90c493cb27e563d473befd1c932284d40df4f9c Mon Sep 17 00:00:00 2001 From: Marcus Eriksson Date: Wed, 2 Jul 2014 15:00:30 +0200 Subject: [PATCH 064/557] Fix CommitLogTest --- test/unit/org/apache/cassandra/db/CommitLogTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/org/apache/cassandra/db/CommitLogTest.java b/test/unit/org/apache/cassandra/db/CommitLogTest.java index 22b6e6b7a06f..b875987e3f3c 100644 --- a/test/unit/org/apache/cassandra/db/CommitLogTest.java +++ b/test/unit/org/apache/cassandra/db/CommitLogTest.java @@ -297,7 +297,7 @@ public void testCommitFailurePolicy_stop() DatabaseDescriptor.setCommitFailurePolicy(Config.CommitFailurePolicy.stop); commitDir.setWritable(false); - Mutation rm = new Mutation("Keyspace1", bytes("k")); + Mutation rm = new Mutation(KEYSPACE1, bytes("k")); rm.add("Standard1", Util.cellname("c1"), ByteBuffer.allocate(100), 0); // Adding it twice (won't change segment) From d13a996e45a3294a7c16102bf9d3da881ae2c732 Mon Sep 17 00:00:00 2001 From: Yuki Morishita Date: Mon, 7 Jul 2014 10:53:01 -0500 Subject: [PATCH 065/557] Shorten SSTable path patch by yukim; reviewed by Josh McKenzie for CASSANDRA-6962 --- CHANGES.txt | 1 + NEWS.txt | 7 + .../org/apache/cassandra/db/Directories.java | 64 +++++++--- .../db/compaction/CompactionManager.java | 2 +- .../db/compaction/CompactionManagerMBean.java | 3 +- .../cassandra/io/sstable/Descriptor.java | 102 +++++++++++---- .../apache/cassandra/io/sstable/SSTable.java | 9 +- .../apache/cassandra/db/DirectoriesTest.java | 2 +- .../db/compaction/CompactionsTest.java | 2 +- .../cassandra/io/sstable/DescriptorTest.java | 120 ++++++++++++++++++ .../cassandra/io/sstable/SSTableUtils.java | 8 +- 11 files changed, 265 insertions(+), 55 deletions(-) create mode 100644 test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java diff --git a/CHANGES.txt b/CHANGES.txt index e80ab9f47187..5cbf4bb8abc2 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -9,6 +9,7 @@ * Make incremental repair default (CASSANDRA-7250) * Enable code coverage thru JaCoCo (CASSANDRA-7226) * Switch external naming of 'column families' to 'tables' (CASSANDRA-4369) + * Shorten SSTable path (CASSANDRA-6962) 2.1.1 diff --git a/NEWS.txt b/NEWS.txt index 232cdf7e9d23..b51faeccc1ec 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -16,6 +16,13 @@ using the provided 'sstableupgrade' tool. 3.0 === +New features +------------ + - SSTable file name is changed. Now you don't have Keyspace/CF name + in file name. Also, secondary index has its own directory under parent's + directory. + + Upgrading --------- - CQL2 has been removed entirely in this release (previously deprecated diff --git a/src/java/org/apache/cassandra/db/Directories.java b/src/java/org/apache/cassandra/db/Directories.java index 431948141a89..d62ebeb37503 100644 --- a/src/java/org/apache/cassandra/db/Directories.java +++ b/src/java/org/apache/cassandra/db/Directories.java @@ -191,7 +191,15 @@ public Directories(CFMetaData metadata) String cfId = ByteBufferUtil.bytesToHex(ByteBufferUtil.bytes(metadata.cfId)); int idx = metadata.cfName.indexOf(SECONDARY_INDEX_NAME_SEPARATOR); // secondary indicies go in the same directory as the base cf - String directoryName = idx > 0 ? metadata.cfName.substring(0, idx) + "-" + cfId : metadata.cfName + "-" + cfId; + String directoryName; + if (idx >= 0) + { + directoryName = metadata.cfName.substring(0, idx) + "-" + cfId + File.separator + metadata.cfName.substring(idx); + } + else + { + directoryName = metadata.cfName + "-" + cfId; + } this.dataPaths = new File[dataDirectories.length]; // If upgraded from version less than 2.1, use existing directories @@ -318,7 +326,19 @@ public int compare(DataDirectory a, DataDirectory b) public static File getSnapshotDirectory(Descriptor desc, String snapshotName) { - return getOrCreate(desc.directory, SNAPSHOT_SUBDIR, snapshotName); + return getSnapshotDirectory(desc.directory, snapshotName); + } + + public static File getSnapshotDirectory(File location, String snapshotName) + { + if (location.getName().startsWith(SECONDARY_INDEX_NAME_SEPARATOR)) + { + return getOrCreate(location.getParentFile(), SNAPSHOT_SUBDIR, snapshotName, location.getName()); + } + else + { + return getOrCreate(location, SNAPSHOT_SUBDIR, snapshotName); + } } public File getSnapshotManifestFile(String snapshotName) @@ -328,7 +348,19 @@ public File getSnapshotManifestFile(String snapshotName) public static File getBackupsDirectory(Descriptor desc) { - return getOrCreate(desc.directory, BACKUPS_SUBDIR); + return getBackupsDirectory(desc.directory); + } + + public static File getBackupsDirectory(File location) + { + if (location.getName().startsWith(SECONDARY_INDEX_NAME_SEPARATOR)) + { + return getOrCreate(location.getParentFile(), BACKUPS_SUBDIR, location.getName()); + } + else + { + return getOrCreate(location, BACKUPS_SUBDIR); + } } public SSTableLister sstableLister() @@ -439,7 +471,7 @@ private void filter() if (snapshotName != null) { - new File(location, join(SNAPSHOT_SUBDIR, snapshotName)).listFiles(getFilter()); + getSnapshotDirectory(location, snapshotName).listFiles(getFilter()); continue; } @@ -447,28 +479,29 @@ private void filter() location.listFiles(getFilter()); if (includeBackups) - new File(location, BACKUPS_SUBDIR).listFiles(getFilter()); + getBackupsDirectory(location).listFiles(getFilter()); } filtered = true; } private FileFilter getFilter() { - // Note: the prefix needs to include cfname + separator to distinguish between a cfs and it's secondary indexes - final String sstablePrefix = getSSTablePrefix(); return new FileFilter() { // This function always return false since accepts adds to the components map public boolean accept(File file) { - // we are only interested in the SSTable files that belong to the specific ColumnFamily - if (file.isDirectory() || !file.getName().startsWith(sstablePrefix)) + if (file.isDirectory()) return false; Pair pair = SSTable.tryComponentFromFilename(file.getParentFile(), file.getName()); if (pair == null) return false; + // we are only interested in the SSTable files that belong to the specific ColumnFamily + if (!pair.left.ksname.equals(metadata.ksName) || !pair.left.cfname.equals(metadata.cfName)) + return false; + if (skipTemporary && pair.left.type.isTemporary) return false; @@ -569,11 +602,6 @@ public long trueSnapshotsSize() return result; } - private String getSSTablePrefix() - { - return metadata.ksName + Component.separator + metadata.cfName + Component.separator; - } - public long getTrueAllocatedSizeIn(File input) { if (!input.isDirectory()) @@ -662,7 +690,6 @@ private class TrueFilesSizeVisitor extends SimpleFileVisitor private final AtomicLong size = new AtomicLong(0); private final Set visited = newHashSet(); //count each file only once private final Set alive; - private final String prefix = getSSTablePrefix(); public TrueFilesSizeVisitor() { @@ -675,8 +702,11 @@ public TrueFilesSizeVisitor() private boolean isAcceptable(Path file) { - String fileName = file.toFile().getName(); - return fileName.startsWith(prefix) + String fileName = file.toFile().getName(); + Pair pair = SSTable.tryComponentFromFilename(file.getParent().toFile(), fileName); + return pair != null + && pair.left.ksname.equals(metadata.ksName) + && pair.left.cfname.equals(metadata.cfName) && !visited.contains(fileName) && !alive.contains(fileName); } diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java index 0f38e53a0ab9..d5718143d7bc 100644 --- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java +++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java @@ -479,7 +479,7 @@ public void forceUserDefinedCompaction(String dataFiles) } // group by keyspace/columnfamily ColumnFamilyStore cfs = Keyspace.open(desc.ksname).getColumnFamilyStore(desc.cfname); - descriptors.put(cfs, cfs.directories.find(filename.trim())); + descriptors.put(cfs, cfs.directories.find(new File(filename.trim()).getName())); } List> futures = new ArrayList<>(); diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionManagerMBean.java b/src/java/org/apache/cassandra/db/compaction/CompactionManagerMBean.java index acf1e52e4099..6900b9f4da8e 100644 --- a/src/java/org/apache/cassandra/db/compaction/CompactionManagerMBean.java +++ b/src/java/org/apache/cassandra/db/compaction/CompactionManagerMBean.java @@ -66,7 +66,8 @@ public interface CompactionManagerMBean * If you do so, user defined compaction is performed several times to the groups of files * in the same keyspace/columnfamily. * - * @param dataFiles a comma separated list of sstable filename to compact + * @param dataFiles a comma separated list of sstable file to compact. + * must contain keyspace and columnfamily name in path(for 2.1+) or file name itself. */ public void forceUserDefinedCompaction(String dataFiles); diff --git a/src/java/org/apache/cassandra/io/sstable/Descriptor.java b/src/java/org/apache/cassandra/io/sstable/Descriptor.java index 4415db4b7cbb..db5b60c15905 100644 --- a/src/java/org/apache/cassandra/io/sstable/Descriptor.java +++ b/src/java/org/apache/cassandra/io/sstable/Descriptor.java @@ -18,10 +18,13 @@ package org.apache.cassandra.io.sstable; import java.io.File; +import java.util.ArrayDeque; +import java.util.Deque; import java.util.StringTokenizer; import com.google.common.base.Objects; +import org.apache.cassandra.db.Directories; import org.apache.cassandra.io.sstable.metadata.IMetadataSerializer; import org.apache.cassandra.io.sstable.metadata.LegacyMetadataSerializer; import org.apache.cassandra.io.sstable.metadata.MetadataSerializer; @@ -60,6 +63,7 @@ public static class Version // jb (2.0.1): switch from crc32 to adler32 for compression checksums // checksum the compressed data // ka (2.1.0): new Statistics.db file format + // new file name format // index summaries can be downsampled and the sampling level is persisted // switch uncompressed checksums to adler32 // tracks presense of legacy (local and remote) counter shards @@ -75,6 +79,7 @@ public static class Version public final boolean hasAllAdlerChecksums; public final boolean hasRepairedAt; public final boolean tracksLegacyCounterShards; + public final boolean newFileName; public Version(String version) { @@ -86,6 +91,7 @@ public Version(String version) hasAllAdlerChecksums = version.compareTo("ka") >= 0; hasRepairedAt = version.compareTo("ka") >= 0; tracksLegacyCounterShards = version.compareTo("ka") >= 0; + newFileName = version.compareTo("ka") >= 0; } /** @@ -188,8 +194,11 @@ public String baseFilename() private void appendFileName(StringBuilder buff) { - buff.append(ksname).append(separator); - buff.append(cfname).append(separator); + if (!version.newFileName) + { + buff.append(ksname).append(separator); + buff.append(cfname).append(separator); + } if (type.isTemporary) buff.append(type.marker).append(separator); buff.append(version).append(separator); @@ -230,13 +239,20 @@ public static Descriptor fromFilename(String filename, boolean skipComponent) return fromFilename(file.getParentFile(), file.getName(), skipComponent).left; } - public static Pair fromFilename(File directory, String name) + public static Pair fromFilename(File directory, String name) { return fromFilename(directory, name, false); } /** - * Filename of the form "--[tmp-][-]-" + * Filename of the form is vary by version: + * + *
      + *
    • <ksname>-<cfname>-(tmp-)?<version>-<gen>-<component> for cassandra 2.0 and before
    • + *
    • (<tmp marker>-)?<version>-<gen>-<component> for cassandra 2.1 and later
    • + *
    + * + * If this is for SSTable of secondary index, directory should ends with index name for 2.1+. * * @param directory The directory of the SSTable files * @param name The name of the SSTable file @@ -244,43 +260,79 @@ public static Pair fromFilename(File directory, String name) * * @return A Descriptor for the SSTable, and the Component remainder. */ - public static Pair fromFilename(File directory, String name, boolean skipComponent) + public static Pair fromFilename(File directory, String name, boolean skipComponent) { + File parentDirectory = directory != null ? directory : new File("."); + // tokenize the filename StringTokenizer st = new StringTokenizer(name, String.valueOf(separator)); String nexttok; - // all filenames must start with keyspace and column family - String ksname = st.nextToken(); - String cfname = st.nextToken(); + // read tokens backwards to determine version + Deque tokenStack = new ArrayDeque<>(); + while (st.hasMoreTokens()) + { + tokenStack.push(st.nextToken()); + } + + // component suffix + String component = skipComponent ? null : tokenStack.pop(); + + // generation + int generation = Integer.parseInt(tokenStack.pop()); + + // version + nexttok = tokenStack.pop(); + if (!Version.validate(nexttok)) + throw new UnsupportedOperationException("SSTable " + name + " is too old to open. Upgrade to 2.0 first, and run upgradesstables"); + Version version = new Version(nexttok); // optional temporary marker - nexttok = st.nextToken(); Type type = Type.FINAL; - if (nexttok.equals(Type.TEMP.marker)) + nexttok = tokenStack.peek(); + if (Type.TEMP.marker.equals(nexttok)) { type = Type.TEMP; - nexttok = st.nextToken(); + tokenStack.pop(); } - else if (nexttok.equals(Type.TEMPLINK.marker)) + else if (Type.TEMPLINK.marker.equals(nexttok)) { type = Type.TEMPLINK; - nexttok = st.nextToken(); + tokenStack.pop(); } - if (!Version.validate(nexttok)) - throw new UnsupportedOperationException("SSTable " + name + " is too old to open. Upgrade to 2.0 first, and run upgradesstables"); - Version version = new Version(nexttok); - - nexttok = st.nextToken(); - int generation = Integer.parseInt(nexttok); + // ks/cf names + String ksname, cfname; + if (version.newFileName) + { + // for 2.1+ read ks and cf names from directory + File cfDirectory = parentDirectory; + // check if this is secondary index + String indexName = ""; + if (cfDirectory.getName().startsWith(Directories.SECONDARY_INDEX_NAME_SEPARATOR)) + { + indexName = cfDirectory.getName(); + cfDirectory = cfDirectory.getParentFile(); + } + if (cfDirectory.getName().equals(Directories.BACKUPS_SUBDIR)) + { + cfDirectory = cfDirectory.getParentFile(); + } + else if (cfDirectory.getParentFile().getName().equals(Directories.SNAPSHOT_SUBDIR)) + { + cfDirectory = cfDirectory.getParentFile().getParentFile(); + } + cfname = cfDirectory.getName().split("-")[0] + indexName; + ksname = cfDirectory.getParentFile().getName(); + } + else + { + cfname = tokenStack.pop(); + ksname = tokenStack.pop(); + } + assert tokenStack.isEmpty() : "Invalid file name " + name + " in " + directory; - // component suffix - String component = null; - if (!skipComponent) - component = st.nextToken(); - directory = directory != null ? directory : new File("."); - return Pair.create(new Descriptor(version, directory, ksname, cfname, generation, type), component); + return Pair.create(new Descriptor(version, parentDirectory, ksname, cfname, generation, type), component); } /** diff --git a/src/java/org/apache/cassandra/io/sstable/SSTable.java b/src/java/org/apache/cassandra/io/sstable/SSTable.java index 6eff369c0aa0..dee024abc84c 100644 --- a/src/java/org/apache/cassandra/io/sstable/SSTable.java +++ b/src/java/org/apache/cassandra/io/sstable/SSTable.java @@ -150,18 +150,17 @@ public String getKeyspaceName() } /** - * @return A Descriptor,Component pair. If component is of unknown type, returns CUSTOM component. + * @return Descriptor and Component pair. null if given file is not acceptable as SSTable component. + * If component is of unknown type, returns CUSTOM component. */ - public static Pair tryComponentFromFilename(File dir, String name) + public static Pair tryComponentFromFilename(File dir, String name) { try { return Component.fromFilename(dir, name); } - catch (NoSuchElementException e) + catch (Throwable e) { - // A NoSuchElementException is thrown if the name does not match the Descriptor format - // This is the less impacting change (all calls to this method test for null return) return null; } } diff --git a/test/unit/org/apache/cassandra/db/DirectoriesTest.java b/test/unit/org/apache/cassandra/db/DirectoriesTest.java index 9e6b26b36d32..3e29a896cfe9 100644 --- a/test/unit/org/apache/cassandra/db/DirectoriesTest.java +++ b/test/unit/org/apache/cassandra/db/DirectoriesTest.java @@ -173,7 +173,7 @@ public void testSSTableLister() { if (f.getPath().contains(Directories.SNAPSHOT_SUBDIR) || f.getPath().contains(Directories.BACKUPS_SUBDIR)) assert !listed.contains(f) : f + " should not be listed"; - else if (f.getName().contains("-tmp-")) + else if (f.getName().contains("tmp-")) assert !listed.contains(f) : f + " should not be listed"; else assert listed.contains(f) : f + " is missing"; diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java index e7900051a6f0..e784051b1103 100644 --- a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java @@ -367,7 +367,7 @@ public void testUserDefinedCompaction() throws Exception SSTableReader sstable = sstables.iterator().next(); int prevGeneration = sstable.descriptor.generation; - String file = new File(sstable.descriptor.filenameFor(Component.DATA)).getName(); + String file = new File(sstable.descriptor.filenameFor(Component.DATA)).getAbsolutePath(); // submit user defined compaction on flushed sstable CompactionManager.instance.forceUserDefinedCompaction(file); // wait until user defined compaction finishes diff --git a/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java b/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java new file mode 100644 index 000000000000..71145f7b17cc --- /dev/null +++ b/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java @@ -0,0 +1,120 @@ +/* + * 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.io.sstable; + +import java.io.File; +import java.io.IOException; +import java.util.UUID; + +import org.apache.commons.lang3.StringUtils; +import org.junit.Test; + +import org.apache.cassandra.db.Directories; +import org.apache.cassandra.utils.ByteBufferUtil; +import org.apache.cassandra.utils.Pair; + +import static org.junit.Assert.*; + +public class DescriptorTest +{ + private final String ksname = "ks"; + private final String cfname = "cf"; + private final String cfId = ByteBufferUtil.bytesToHex(ByteBufferUtil.bytes(UUID.randomUUID())); + private final File tempDataDir; + + public DescriptorTest() throws IOException + { + // create CF directories, one without CFID and one with it + tempDataDir = File.createTempFile("DescriptorTest", null).getParentFile(); + } + + @Test + public void testFromFilename() throws Exception + { + File cfIdDir = new File(tempDataDir.getAbsolutePath() + File.separator + ksname + File.separator + cfname + '-' + cfId); + testFromFilenameFor(cfIdDir); + } + + @Test + public void testFromFilenameInBackup() throws Exception + { + File backupDir = new File(StringUtils.join(new String[]{tempDataDir.getAbsolutePath(), ksname, cfname + '-' + cfId, Directories.BACKUPS_SUBDIR}, File.separator)); + testFromFilenameFor(backupDir); + } + + @Test + public void testFromFilenameInSnapshot() throws Exception + { + File snapshotDir = new File(StringUtils.join(new String[]{tempDataDir.getAbsolutePath(), ksname, cfname + '-' + cfId, Directories.SNAPSHOT_SUBDIR, "snapshot_name"}, File.separator)); + testFromFilenameFor(snapshotDir); + } + + @Test + public void testFromFilenameInLegacyDirectory() throws Exception + { + File cfDir = new File(tempDataDir.getAbsolutePath() + File.separator + ksname + File.separator + cfname); + testFromFilenameFor(cfDir); + } + + private void testFromFilenameFor(File dir) + { + // normal + checkFromFilename(new Descriptor(dir, ksname, cfname, 1, Descriptor.Type.FINAL), false); + // skip component (for streaming lock file) + checkFromFilename(new Descriptor(dir, ksname, cfname, 2, Descriptor.Type.FINAL), true); + // tmp + checkFromFilename(new Descriptor(dir, ksname, cfname, 3, Descriptor.Type.TEMP), false); + // secondary index + String idxName = "myidx"; + File idxDir = new File(dir.getAbsolutePath() + File.separator + Directories.SECONDARY_INDEX_NAME_SEPARATOR + idxName); + checkFromFilename(new Descriptor(idxDir, ksname, cfname + Directories.SECONDARY_INDEX_NAME_SEPARATOR + idxName, 4, Descriptor.Type.FINAL), false); + // secondary index tmp + checkFromFilename(new Descriptor(idxDir, ksname, cfname + Directories.SECONDARY_INDEX_NAME_SEPARATOR + idxName, 5, Descriptor.Type.TEMP), false); + + // legacy version + checkFromFilename(new Descriptor("ja", dir, ksname, cfname, 1, Descriptor.Type.FINAL), false); + // legacy tmp + checkFromFilename(new Descriptor("ja", dir, ksname, cfname, 2, Descriptor.Type.TEMP), false); + // legacy secondary index + checkFromFilename(new Descriptor("ja", dir, ksname, cfname + Directories.SECONDARY_INDEX_NAME_SEPARATOR + idxName, 3, Descriptor.Type.FINAL), false); + } + + private void checkFromFilename(Descriptor original, boolean skipComponent) + { + File file = new File(skipComponent ? original.baseFilename() : original.filenameFor(Component.DATA)); + + Pair pair = Descriptor.fromFilename(file.getParentFile(), file.getName(), skipComponent); + Descriptor desc = pair.left; + + assertEquals(original.directory, desc.directory); + assertEquals(original.ksname, desc.ksname); + assertEquals(original.cfname, desc.cfname); + assertEquals(original.version, desc.version); + assertEquals(original.generation, desc.generation); + assertEquals(original.type, desc.type); + + if (skipComponent) + { + assertNull(pair.right); + } + else + { + assertEquals(Component.DATA.name(), pair.right); + } + } +} diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java b/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java index 32d07ac49b7c..157f89b75abd 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java @@ -69,10 +69,10 @@ public static File tempSSTableFile(String keyspaceName, String cfname, int gener if(!tempdir.delete() || !tempdir.mkdir()) throw new IOException("Temporary directory creation failed."); tempdir.deleteOnExit(); - File keyspaceDir = new File(tempdir, keyspaceName); - keyspaceDir.mkdir(); - keyspaceDir.deleteOnExit(); - File datafile = new File(new Descriptor(keyspaceDir, keyspaceName, cfname, generation, Descriptor.Type.FINAL).filenameFor("Data.db")); + File cfDir = new File(tempdir, keyspaceName + File.separator + cfname); + cfDir.mkdirs(); + cfDir.deleteOnExit(); + File datafile = new File(new Descriptor(cfDir, keyspaceName, cfname, generation, Descriptor.Type.FINAL).filenameFor("Data.db")); if (!datafile.createNewFile()) throw new IOException("unable to create file " + datafile); datafile.deleteOnExit(); From 871de53a83639922d6dcbe0b5a0c52ddc7591fe2 Mon Sep 17 00:00:00 2001 From: Yuki Morishita Date: Mon, 7 Jul 2014 11:10:49 -0500 Subject: [PATCH 066/557] Update SSTable decriptor version for 3.0 --- src/java/org/apache/cassandra/io/sstable/Descriptor.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/java/org/apache/cassandra/io/sstable/Descriptor.java b/src/java/org/apache/cassandra/io/sstable/Descriptor.java index db5b60c15905..6911b48d1457 100644 --- a/src/java/org/apache/cassandra/io/sstable/Descriptor.java +++ b/src/java/org/apache/cassandra/io/sstable/Descriptor.java @@ -50,7 +50,7 @@ public class Descriptor public static class Version { // This needs to be at the begining for initialization sake - public static final String current_version = "ka"; + public static final String current_version = "la"; // ja (2.0.0): super columns are serialized as composites (note that there is no real format change, // this is mostly a marker to know if we should expect super columns or not. We do need @@ -63,10 +63,10 @@ public static class Version // jb (2.0.1): switch from crc32 to adler32 for compression checksums // checksum the compressed data // ka (2.1.0): new Statistics.db file format - // new file name format // index summaries can be downsampled and the sampling level is persisted // switch uncompressed checksums to adler32 // tracks presense of legacy (local and remote) counter shards + // la (3.0.0): new file name format public static final Version CURRENT = new Version(current_version); @@ -91,7 +91,7 @@ public Version(String version) hasAllAdlerChecksums = version.compareTo("ka") >= 0; hasRepairedAt = version.compareTo("ka") >= 0; tracksLegacyCounterShards = version.compareTo("ka") >= 0; - newFileName = version.compareTo("ka") >= 0; + newFileName = version.compareTo("la") >= 0; } /** From 8f7678967c4a042f8e351e8948a44e8b54671240 Mon Sep 17 00:00:00 2001 From: Sylvain Lebresne Date: Mon, 7 Jul 2014 18:16:54 +0200 Subject: [PATCH 067/557] Fix test built --- test/unit/org/apache/cassandra/cql3/CQLTester.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/unit/org/apache/cassandra/cql3/CQLTester.java b/test/unit/org/apache/cassandra/cql3/CQLTester.java index 38aff2b709fb..3363e16c122c 100644 --- a/test/unit/org/apache/cassandra/cql3/CQLTester.java +++ b/test/unit/org/apache/cassandra/cql3/CQLTester.java @@ -62,8 +62,6 @@ public abstract class CQLTester private String currentTable; private final Set currentTypes = new HashSet<>(); - private final Set currentTypes = new HashSet<>(); - @BeforeClass public static void setUpClass() throws Throwable { From d5265bb326bcf4703e866ca96241842d9dce974f Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Tue, 8 Jul 2014 12:17:13 -0500 Subject: [PATCH 068/557] fix nodetool alignment --- src/java/org/apache/cassandra/tools/NodeTool.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/cassandra/tools/NodeTool.java b/src/java/org/apache/cassandra/tools/NodeTool.java index 13d7ebb86e1a..05b01702dbd4 100644 --- a/src/java/org/apache/cassandra/tools/NodeTool.java +++ b/src/java/org/apache/cassandra/tools/NodeTool.java @@ -1835,7 +1835,8 @@ public void execute(NodeProbe probe) { ownerships = probe.effectiveOwnership(keyspace); hasEffectiveOwns = true; - } catch (IllegalStateException e) + } + catch (IllegalStateException e) { ownerships = probe.getOwnership(); System.out.printf("Note: Ownership information does not include topology; for complete information, specify a keyspace%n"); @@ -1943,7 +1944,7 @@ private String getFormat( buf.append(addressPlaceholder); // address buf.append("%-9s "); // load if (!isTokenPerNode) - buf.append("%-6s "); // "Tokens" + buf.append("%-11s "); // "Tokens" if (hasEffectiveOwns) buf.append("%-16s "); // "Owns (effective)" else From e2bb7d223dbd2ab7b18045158863771c935dc5c0 Mon Sep 17 00:00:00 2001 From: Jake Luciani Date: Wed, 9 Jul 2014 16:39:08 -0400 Subject: [PATCH 069/557] Fix LegacySSTableTest KS name --- .../unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java b/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java index c15eb5115349..f0767dbb181f 100644 --- a/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java @@ -56,7 +56,7 @@ public class LegacySSTableTest { public static final String LEGACY_SSTABLE_PROP = "legacy-sstable-root"; - public static final String KSNAME = "LegacySSTableTest"; + public static final String KSNAME = "Keyspace1"; public static final String CFNAME = "Standard1"; public static Set TEST_DATA; From b453f0897bac7f8e928588d7b288ea3e65082353 Mon Sep 17 00:00:00 2001 From: lyubent Date: Wed, 9 Jul 2014 15:41:13 -0500 Subject: [PATCH 070/557] Use unsafe mutations where possible in unit tests Patch by Lyuben Todorov; reviewed by Tyler Hobbs for CASSANDRA-6969 --- CHANGES.txt | 1 + test/unit/org/apache/cassandra/Util.java | 2 +- .../cassandra/cache/AutoSavingCacheTest.java | 2 +- .../org/apache/cassandra/config/DefsTest.java | 20 ++--- .../cassandra/db/BatchlogManagerTest.java | 4 +- .../cassandra/db/CollationControllerTest.java | 12 +-- .../cassandra/db/ColumnFamilyStoreTest.java | 78 +++++++++---------- .../cassandra/db/HintedHandOffTest.java | 4 +- .../org/apache/cassandra/db/KeyCacheTest.java | 4 +- .../apache/cassandra/db/KeyCollisionTest.java | 2 +- .../org/apache/cassandra/db/KeyspaceTest.java | 30 +++---- .../apache/cassandra/db/MultitableTest.java | 4 +- .../cassandra/db/RangeTombstoneTest.java | 40 +++++----- .../db/RecoveryManagerTruncateTest.java | 2 +- .../apache/cassandra/db/RemoveCellTest.java | 4 +- .../cassandra/db/RemoveColumnFamilyTest.java | 4 +- .../db/RemoveColumnFamilyWithFlush1Test.java | 4 +- .../db/RemoveColumnFamilyWithFlush2Test.java | 4 +- .../cassandra/db/RemoveSubCellTest.java | 10 +-- .../apache/cassandra/db/RowIterationTest.java | 8 +- .../org/apache/cassandra/db/TimeSortTest.java | 10 +-- .../db/compaction/AntiCompactionTest.java | 2 +- .../BlacklistingCompactionsTest.java | 2 +- .../db/compaction/CompactionsPurgeTest.java | 34 ++++---- .../db/compaction/CompactionsTest.java | 18 ++--- .../LeveledCompactionStrategyTest.java | 8 +- .../db/compaction/OneCompactionTest.java | 2 +- .../SizeTieredCompactionStrategyTest.java | 4 +- .../db/compaction/TTLExpiryTest.java | 16 ++-- .../db/index/PerRowSecondaryIndexTest.java | 8 +- .../db/marshal/CompositeTypeTest.java | 2 +- .../db/marshal/DynamicCompositeTypeTest.java | 2 +- .../io/sstable/IndexSummaryManagerTest.java | 4 +- .../io/sstable/SSTableMetadataTest.java | 26 +++---- .../io/sstable/SSTableReaderTest.java | 20 ++--- .../io/sstable/SSTableScannerTest.java | 2 +- .../streaming/StreamingTransferTest.java | 6 +- 37 files changed, 203 insertions(+), 202 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 7f7452052c71..ff0a1c618401 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -10,6 +10,7 @@ * Enable code coverage thru JaCoCo (CASSANDRA-7226) * Switch external naming of 'column families' to 'tables' (CASSANDRA-4369) * Shorten SSTable path (CASSANDRA-6962) + * Use unsafe mutations for most unit tests (CASSANDRA-6969) 2.1.1 diff --git a/test/unit/org/apache/cassandra/Util.java b/test/unit/org/apache/cassandra/Util.java index a8747c414cfe..e06bd95135e7 100644 --- a/test/unit/org/apache/cassandra/Util.java +++ b/test/unit/org/apache/cassandra/Util.java @@ -190,7 +190,7 @@ public static ColumnFamilyStore writeColumnFamily(List mutations) UUID cfid = first.getColumnFamilyIds().iterator().next(); for (Mutation rm : mutations) - rm.apply(); + rm.applyUnsafe(); ColumnFamilyStore store = Keyspace.open(keyspaceName).getColumnFamilyStore(cfid); store.forceBlockingFlush(); diff --git a/test/unit/org/apache/cassandra/cache/AutoSavingCacheTest.java b/test/unit/org/apache/cassandra/cache/AutoSavingCacheTest.java index 683062cc9e4b..3da45555e8f7 100644 --- a/test/unit/org/apache/cassandra/cache/AutoSavingCacheTest.java +++ b/test/unit/org/apache/cassandra/cache/AutoSavingCacheTest.java @@ -57,7 +57,7 @@ public void testSerializeAndLoadKeyCache() throws Exception { Mutation rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("key1")); rm.add(CF_STANDARD1, Util.cellname("c1"), ByteBufferUtil.bytes(i), 0); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); } diff --git a/test/unit/org/apache/cassandra/config/DefsTest.java b/test/unit/org/apache/cassandra/config/DefsTest.java index 206a3364cf55..6df67bc44c05 100644 --- a/test/unit/org/apache/cassandra/config/DefsTest.java +++ b/test/unit/org/apache/cassandra/config/DefsTest.java @@ -202,7 +202,7 @@ public void addNewCF() throws ConfigurationException DecoratedKey dk = Util.dk("key0"); Mutation rm = new Mutation(ks, dk.getKey()); rm.add(cf, col0, ByteBufferUtil.bytes("value0"), 1L); - rm.apply(); + rm.applyUnsafe(); ColumnFamilyStore store = Keyspace.open(ks).getColumnFamilyStore(cf); Assert.assertNotNull(store); store.forceBlockingFlush(); @@ -227,7 +227,7 @@ public void dropCf() throws ConfigurationException Mutation rm = new Mutation(ks.name, dk.getKey()); for (int i = 0; i < 100; i++) rm.add(cfm.cfName, cellname("col" + i), ByteBufferUtil.bytes("anyvalue"), 1L); - rm.apply(); + rm.applyUnsafe(); ColumnFamilyStore store = Keyspace.open(cfm.ksName).getColumnFamilyStore(cfm.cfName); Assert.assertNotNull(store); store.forceBlockingFlush(); @@ -243,7 +243,7 @@ public void dropCf() throws ConfigurationException try { rm.add("Standard1", cellname("col0"), ByteBufferUtil.bytes("value0"), 1L); - rm.apply(); + rm.applyUnsafe(); } catch (Throwable th) { @@ -276,7 +276,7 @@ public void addNewKS() throws ConfigurationException CellName col0 = cellname("col0"); Mutation rm = new Mutation(newCf.ksName, dk.getKey()); rm.add(newCf.cfName, col0, ByteBufferUtil.bytes("value0"), 1L); - rm.apply(); + rm.applyUnsafe(); ColumnFamilyStore store = Keyspace.open(newCf.ksName).getColumnFamilyStore(newCf.cfName); Assert.assertNotNull(store); store.forceBlockingFlush(); @@ -301,7 +301,7 @@ public void dropKS() throws ConfigurationException Mutation rm = new Mutation(ks.name, dk.getKey()); for (int i = 0; i < 100; i++) rm.add(cfm.cfName, cellname("col" + i), ByteBufferUtil.bytes("anyvalue"), 1L); - rm.apply(); + rm.applyUnsafe(); ColumnFamilyStore store = Keyspace.open(cfm.ksName).getColumnFamilyStore(cfm.cfName); Assert.assertNotNull(store); store.forceBlockingFlush(); @@ -317,7 +317,7 @@ public void dropKS() throws ConfigurationException try { rm.add("Standard1", cellname("col0"), ByteBufferUtil.bytes("value0"), 1L); - rm.apply(); + rm.applyUnsafe(); } catch (Throwable th) { @@ -352,7 +352,7 @@ public void dropKSUnflushed() throws ConfigurationException Mutation rm = new Mutation(ks.name, dk.getKey()); for (int i = 0; i < 100; i++) rm.add(cfm.cfName, cellname("col" + i), ByteBufferUtil.bytes("anyvalue"), 1L); - rm.apply(); + rm.applyUnsafe(); MigrationManager.announceKeyspaceDrop(ks.name); @@ -385,7 +385,7 @@ public void createEmptyKsAddNewCf() throws ConfigurationException DecoratedKey dk = Util.dk("key0"); Mutation rm = new Mutation(newKs.name, dk.getKey()); rm.add(newCf.cfName, col0, ByteBufferUtil.bytes("value0"), 1L); - rm.apply(); + rm.applyUnsafe(); ColumnFamilyStore store = Keyspace.open(newKs.name).getColumnFamilyStore(newCf.cfName); Assert.assertNotNull(store); store.forceBlockingFlush(); @@ -528,14 +528,14 @@ public void testUpdateColumnFamilyNoIndexes() throws ConfigurationException public void testDropIndex() throws ConfigurationException { // persist keyspace definition in the system keyspace - Schema.instance.getKSMetaData(KEYSPACE6).toSchema(System.currentTimeMillis()).apply(); + Schema.instance.getKSMetaData(KEYSPACE6).toSchema(System.currentTimeMillis()).applyUnsafe(); ColumnFamilyStore cfs = Keyspace.open(KEYSPACE6).getColumnFamilyStore("Indexed1"); // insert some data. save the sstable descriptor so we can make sure it's marked for delete after the drop Mutation rm = new Mutation(KEYSPACE6, ByteBufferUtil.bytes("k1")); rm.add("Indexed1", cellname("notbirthdate"), ByteBufferUtil.bytes(1L), 0); rm.add("Indexed1", cellname("birthdate"), ByteBufferUtil.bytes(1L), 0); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); ColumnFamilyStore indexedCfs = cfs.indexManager.getIndexForColumn(ByteBufferUtil.bytes("birthdate")).getIndexCfs(); Descriptor desc = indexedCfs.getSSTables().iterator().next().descriptor; diff --git a/test/unit/org/apache/cassandra/db/BatchlogManagerTest.java b/test/unit/org/apache/cassandra/db/BatchlogManagerTest.java index 6f36fe95215d..6313ca9de103 100644 --- a/test/unit/org/apache/cassandra/db/BatchlogManagerTest.java +++ b/test/unit/org/apache/cassandra/db/BatchlogManagerTest.java @@ -97,7 +97,7 @@ public void testReplay() throws Exception UUIDGen.getTimeUUID(), MessagingService.current_version, timestamp) - .apply(); + .applyUnsafe(); } // Flush the batchlog to disk (see CASSANDRA-6822). @@ -167,7 +167,7 @@ public void testTruncatedReplay() throws InterruptedException, ExecutionExceptio UUIDGen.getTimeUUID(), MessagingService.current_version, timestamp * 1000) - .apply(); + .applyUnsafe(); } // Flush the batchlog to disk (see CASSANDRA-6822). diff --git a/test/unit/org/apache/cassandra/db/CollationControllerTest.java b/test/unit/org/apache/cassandra/db/CollationControllerTest.java index 923cb9ee1342..c227816c2ed1 100644 --- a/test/unit/org/apache/cassandra/db/CollationControllerTest.java +++ b/test/unit/org/apache/cassandra/db/CollationControllerTest.java @@ -61,26 +61,26 @@ public void getTopLevelColumnsSkipsSSTablesModifiedBeforeRowDelete() // add data rm = new Mutation(keyspace.getName(), dk.getKey()); rm.add(cfs.name, Util.cellname("Column1"), ByteBufferUtil.bytes("asdf"), 0); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); // remove rm = new Mutation(keyspace.getName(), dk.getKey()); rm.delete(cfs.name, 10); - rm.apply(); + rm.applyUnsafe(); // add another mutation because sstable maxtimestamp isn't set // correctly during flush if the most recent mutation is a row delete rm = new Mutation(keyspace.getName(), Util.dk("key2").getKey()); rm.add(cfs.name, Util.cellname("Column1"), ByteBufferUtil.bytes("zxcv"), 20); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); // add yet one more mutation rm = new Mutation(keyspace.getName(), dk.getKey()); rm.add(cfs.name, Util.cellname("Column1"), ByteBufferUtil.bytes("foobar"), 30); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); // A NamesQueryFilter goes down one code path (through collectTimeOrderedData()) @@ -113,13 +113,13 @@ public void ensureTombstonesAppliedAfterGCGS() // add data rm = new Mutation(keyspace.getName(), dk.getKey()); rm.add(cfs.name, cellName, ByteBufferUtil.bytes("asdf"), 0); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); // remove rm = new Mutation(keyspace.getName(), dk.getKey()); rm.delete(cfs.name, cellName, 0); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); // use "realistic" query times since we'll compare these numbers to the local deletion time of the tombstone diff --git a/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java b/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java index 467a451a0d36..386be01accf3 100644 --- a/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java +++ b/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java @@ -172,12 +172,12 @@ public void testTimeSortedQuery() Mutation rm; rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("key1")); rm.add(CF_STANDARD1, cellname("Column1"), ByteBufferUtil.bytes("asdf"), 0); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("key1")); rm.add(CF_STANDARD1, cellname("Column1"), ByteBufferUtil.bytes("asdf"), 1); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); cfs.getRecentSSTablesPerReadHistogram(); // resets counts @@ -215,7 +215,7 @@ public void testEmptyRow() throws Exception rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("key1")); rm.delete(CF_STANDARD2, System.currentTimeMillis()); - rm.apply(); + rm.applyUnsafe(); Runnable r = new WrappedRunnable() { @@ -261,22 +261,22 @@ public void testIndexScan() rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("k1")); rm.add(CF_INDEX1, nobirthdate, ByteBufferUtil.bytes(1L), 0); rm.add(CF_INDEX1, birthdate, ByteBufferUtil.bytes(1L), 0); - rm.apply(); + rm.applyUnsafe(); rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("k2")); rm.add(CF_INDEX1, nobirthdate, ByteBufferUtil.bytes(2L), 0); rm.add(CF_INDEX1, birthdate, ByteBufferUtil.bytes(2L), 0); - rm.apply(); + rm.applyUnsafe(); rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("k3")); rm.add(CF_INDEX1, nobirthdate, ByteBufferUtil.bytes(2L), 0); rm.add(CF_INDEX1, birthdate, ByteBufferUtil.bytes(1L), 0); - rm.apply(); + rm.applyUnsafe(); rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("k4aaaa")); rm.add(CF_INDEX1, nobirthdate, ByteBufferUtil.bytes(2L), 0); rm.add(CF_INDEX1, birthdate, ByteBufferUtil.bytes(3L), 0); - rm.apply(); + rm.applyUnsafe(); // basic single-expression query IndexExpression expr = new IndexExpression(ByteBufferUtil.bytes("birthdate"), IndexExpression.Operator.EQ, ByteBufferUtil.bytes(1L)); @@ -371,7 +371,7 @@ public void testIndexDeletions() throws IOException rm = new Mutation(KEYSPACE3, ByteBufferUtil.bytes("k1")); rm.add(CF_INDEX1, cellname("birthdate"), ByteBufferUtil.bytes(1L), 0); - rm.apply(); + rm.applyUnsafe(); IndexExpression expr = new IndexExpression(ByteBufferUtil.bytes("birthdate"), IndexExpression.Operator.EQ, ByteBufferUtil.bytes(1L)); List clause = Arrays.asList(expr); @@ -385,7 +385,7 @@ public void testIndexDeletions() throws IOException // delete the column directly rm = new Mutation(KEYSPACE3, ByteBufferUtil.bytes("k1")); rm.delete(CF_INDEX1, cellname("birthdate"), 1); - rm.apply(); + rm.applyUnsafe(); rows = cfs.search(range, clause, filter, 100); assert rows.isEmpty(); @@ -400,7 +400,7 @@ public void testIndexDeletions() throws IOException // resurrect w/ a newer timestamp rm = new Mutation(KEYSPACE3, ByteBufferUtil.bytes("k1")); rm.add(CF_INDEX1, cellname("birthdate"), ByteBufferUtil.bytes(1L), 2); - rm.apply(); + rm.applyUnsafe(); rows = cfs.search(range, clause, filter, 100); assert rows.size() == 1 : StringUtils.join(rows, ","); key = ByteBufferUtil.string(rows.get(0).key.getKey()); @@ -409,7 +409,7 @@ public void testIndexDeletions() throws IOException // verify that row and delete w/ older timestamp does nothing rm = new Mutation(KEYSPACE3, ByteBufferUtil.bytes("k1")); rm.delete(CF_INDEX1, 1); - rm.apply(); + rm.applyUnsafe(); rows = cfs.search(range, clause, filter, 100); assert rows.size() == 1 : StringUtils.join(rows, ","); key = ByteBufferUtil.string(rows.get(0).key.getKey()); @@ -418,7 +418,7 @@ public void testIndexDeletions() throws IOException // similarly, column delete w/ older timestamp should do nothing rm = new Mutation(KEYSPACE3, ByteBufferUtil.bytes("k1")); rm.delete(CF_INDEX1, cellname("birthdate"), 1); - rm.apply(); + rm.applyUnsafe(); rows = cfs.search(range, clause, filter, 100); assert rows.size() == 1 : StringUtils.join(rows, ","); key = ByteBufferUtil.string(rows.get(0).key.getKey()); @@ -427,14 +427,14 @@ public void testIndexDeletions() throws IOException // delete the entire row (w/ newer timestamp this time) rm = new Mutation(KEYSPACE3, ByteBufferUtil.bytes("k1")); rm.delete(CF_INDEX1, 3); - rm.apply(); + rm.applyUnsafe(); rows = cfs.search(range, clause, filter, 100); assert rows.isEmpty() : StringUtils.join(rows, ","); // make sure obsolete mutations don't generate an index entry rm = new Mutation(KEYSPACE3, ByteBufferUtil.bytes("k1")); rm.add(CF_INDEX1, cellname("birthdate"), ByteBufferUtil.bytes(1L), 3); - rm.apply(); + rm.applyUnsafe(); rows = cfs.search(range, clause, filter, 100); assert rows.isEmpty() : StringUtils.join(rows, ","); @@ -442,7 +442,7 @@ public void testIndexDeletions() throws IOException rm = new Mutation(KEYSPACE3, ByteBufferUtil.bytes("k1")); rm.add(CF_INDEX1, cellname("birthdate"), ByteBufferUtil.bytes(1L), 1); rm.delete(CF_INDEX1, 2); - rm.apply(); + rm.applyUnsafe(); rows = cfs.search(range, clause, filter, 100); assert rows.isEmpty() : StringUtils.join(rows, ","); @@ -450,7 +450,7 @@ public void testIndexDeletions() throws IOException rm = new Mutation(KEYSPACE3, ByteBufferUtil.bytes("k1")); rm.delete(CF_INDEX1, 3); rm.add(CF_INDEX1, cellname("birthdate"), ByteBufferUtil.bytes(1L), 4); - rm.apply(); + rm.applyUnsafe(); rows = cfs.search(range, clause, filter, 100); assert rows.size() == 1 : StringUtils.join(rows, ","); key = ByteBufferUtil.string(rows.get(0).key.getKey()); @@ -468,10 +468,10 @@ public void testIndexUpdate() throws IOException Mutation rm; rm = new Mutation(KEYSPACE2, ByteBufferUtil.bytes("k1")); rm.add(CF_INDEX1, birthdate, ByteBufferUtil.bytes(1L), 1); - rm.apply(); + rm.applyUnsafe(); rm = new Mutation(KEYSPACE2, ByteBufferUtil.bytes("k1")); rm.add(CF_INDEX1, birthdate, ByteBufferUtil.bytes(2L), 2); - rm.apply(); + rm.applyUnsafe(); IndexExpression expr = new IndexExpression(ByteBufferUtil.bytes("birthdate"), IndexExpression.Operator.EQ, ByteBufferUtil.bytes(1L)); List clause = Arrays.asList(expr); @@ -489,7 +489,7 @@ public void testIndexUpdate() throws IOException // update the birthdate value with an OLDER timestamp, and test that the index ignores this rm = new Mutation(KEYSPACE2, ByteBufferUtil.bytes("k1")); rm.add(CF_INDEX1, birthdate, ByteBufferUtil.bytes(3L), 0); - rm.apply(); + rm.applyUnsafe(); rows = keyspace.getColumnFamilyStore(CF_INDEX1).search(range, clause, filter, 100); key = ByteBufferUtil.string(rows.get(0).key.getKey()); @@ -507,7 +507,7 @@ public void testIndexUpdateOverwritingExpiringColumns() throws Exception Mutation rm; rm = new Mutation(KEYSPACE2, ByteBufferUtil.bytes("k100")); rm.add("Indexed1", cellname("birthdate"), ByteBufferUtil.bytes(100L), 1, 1000); - rm.apply(); + rm.applyUnsafe(); IndexExpression expr = new IndexExpression(ByteBufferUtil.bytes("birthdate"), IndexExpression.Operator.EQ, ByteBufferUtil.bytes(100L)); List clause = Arrays.asList(expr); @@ -522,7 +522,7 @@ public void testIndexUpdateOverwritingExpiringColumns() throws Exception // now overwrite with the same name/value/ttl, but the local expiry time will be different rm = new Mutation(KEYSPACE2, ByteBufferUtil.bytes("k100")); rm.add("Indexed1", cellname("birthdate"), ByteBufferUtil.bytes(100L), 1, 1000); - rm.apply(); + rm.applyUnsafe(); rows = keyspace.getColumnFamilyStore("Indexed1").search(range, clause, filter, 100); assertEquals(1, rows.size()); @@ -530,7 +530,7 @@ public void testIndexUpdateOverwritingExpiringColumns() throws Exception // check that modifying the indexed value using the same timestamp behaves as expected rm = new Mutation(KEYSPACE2, ByteBufferUtil.bytes("k101")); rm.add("Indexed1", cellname("birthdate"), ByteBufferUtil.bytes(101L), 1, 1000); - rm.apply(); + rm.applyUnsafe(); expr = new IndexExpression(ByteBufferUtil.bytes("birthdate"), IndexExpression.Operator.EQ, ByteBufferUtil.bytes(101L)); clause = Arrays.asList(expr); @@ -540,7 +540,7 @@ public void testIndexUpdateOverwritingExpiringColumns() throws Exception TimeUnit.SECONDS.sleep(1); rm = new Mutation(KEYSPACE2, ByteBufferUtil.bytes("k101")); rm.add("Indexed1", cellname("birthdate"), ByteBufferUtil.bytes(102L), 1, 1000); - rm.apply(); + rm.applyUnsafe(); // search for the old value rows = keyspace.getColumnFamilyStore("Indexed1").search(range, clause, filter, 100); assertEquals(0, rows.size()); @@ -570,7 +570,7 @@ public void testDeleteOfInconsistentValuesInKeysIndex() throws Exception Mutation rm; rm = new Mutation(keySpace, rowKey); rm.add(cfName, colName, val1, 0); - rm.apply(); + rm.applyUnsafe(); IndexExpression expr = new IndexExpression(ByteBufferUtil.bytes("birthdate"), IndexExpression.Operator.EQ, val1); List clause = Arrays.asList(expr); IDiskAtomFilter filter = new IdentityQueryFilter(); @@ -638,7 +638,7 @@ public void testDeleteOfInconsistentValuesFromCompositeIndex() throws Exception Mutation rm; rm = new Mutation(keySpace, rowKey); rm.add(cfName, compositeName, val1, 0); - rm.apply(); + rm.applyUnsafe(); // test that the index query fetches this version IndexExpression expr = new IndexExpression(colName, IndexExpression.Operator.EQ, val1); @@ -710,12 +710,12 @@ public void testDeleteCompositeIndex() throws Exception Mutation rm; rm = new Mutation(keySpace, rowKey); rm.add(cfName, compositeName, val1, 0); - rm.apply(); + rm.applyUnsafe(); // Now delete the value and flush too. rm = new Mutation(keySpace, rowKey); rm.delete(cfName, 1); - rm.apply(); + rm.applyUnsafe(); // We want the data to be gcable, but even if gcGrace == 0, we still need to wait 1 second // since we won't gc on a tie. @@ -745,22 +745,22 @@ public void testIndexScanWithLimitOne() rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("kk1")); rm.add(CF_INDEX1, nobirthdate, ByteBufferUtil.bytes(1L), 0); rm.add(CF_INDEX1, birthdate, ByteBufferUtil.bytes(1L), 0); - rm.apply(); + rm.applyUnsafe(); rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("kk2")); rm.add(CF_INDEX1, nobirthdate, ByteBufferUtil.bytes(2L), 0); rm.add(CF_INDEX1, birthdate, ByteBufferUtil.bytes(1L), 0); - rm.apply(); + rm.applyUnsafe(); rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("kk3")); rm.add(CF_INDEX1, nobirthdate, ByteBufferUtil.bytes(2L), 0); rm.add(CF_INDEX1, birthdate, ByteBufferUtil.bytes(1L), 0); - rm.apply(); + rm.applyUnsafe(); rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("kk4")); rm.add(CF_INDEX1, nobirthdate, ByteBufferUtil.bytes(2L), 0); rm.add(CF_INDEX1, birthdate, ByteBufferUtil.bytes(1L), 0); - rm.apply(); + rm.applyUnsafe(); // basic single-expression query IndexExpression expr1 = new IndexExpression(ByteBufferUtil.bytes("birthdate"), IndexExpression.Operator.EQ, ByteBufferUtil.bytes(1L)); @@ -784,7 +784,7 @@ public void testIndexCreate() throws IOException, InterruptedException, Executio Mutation rm; rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("k1")); rm.add(CF_INDEX2, cellname("birthdate"), ByteBufferUtil.bytes(1L), 1); - rm.apply(); + rm.applyUnsafe(); ColumnDefinition old = cfs.metadata.getColumnDefinition(ByteBufferUtil.bytes("birthdate")); ColumnDefinition cd = ColumnDefinition.regularDef(cfs.metadata, old.name.bytes, old.type, null).setIndex("birthdate_index", IndexType.KEYS, null); @@ -828,13 +828,13 @@ public void testCassandra6778() throws CharacterCodingException Mutation rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("k1")); CellName column1 = cellname(ByteBuffer.wrap(new byte[]{1})); rm.add(cfname, column1, ByteBufferUtil.bytes("data1"), 1); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("k1")); CellName column2 = cellname(ByteBuffer.wrap(new byte[]{0, 0, 1})); rm.add(cfname, column2, ByteBufferUtil.bytes("data2"), 2); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); // fetch by the first column name; we should get the second version of the column value @@ -908,7 +908,7 @@ public void testDeleteSuperRowSticksAfterFlush() throws Throwable // delete Mutation rm = new Mutation(keyspace.getName(), key.getKey()); rm.deleteRange(cfName, SuperColumns.startOf(scfName), SuperColumns.endOf(scfName), 2); - rm.apply(); + rm.applyUnsafe(); // verify delete. assertRowAndColCount(1, 0, false, cfs.getRangeSlice(Util.range("f", "g"), null, ThriftValidation.asIFilter(sp, cfs.metadata, scfName), 100)); @@ -961,7 +961,7 @@ private static void putColsSuper(ColumnFamilyStore cfs, DecoratedKey key, ByteBu for (Cell col : cols) cf.addColumn(col.withUpdatedName(CellNames.compositeDense(scfName, col.name().toByteBuffer()))); Mutation rm = new Mutation(cfs.keyspace.getName(), key.getKey(), cf); - rm.apply(); + rm.applyUnsafe(); } private static void putColsStandard(ColumnFamilyStore cfs, DecoratedKey key, Cell... cols) throws Throwable @@ -970,7 +970,7 @@ private static void putColsStandard(ColumnFamilyStore cfs, DecoratedKey key, Cel for (Cell col : cols) cf.addColumn(col); Mutation rm = new Mutation(cfs.keyspace.getName(), key.getKey(), cf); - rm.apply(); + rm.applyUnsafe(); } @Test @@ -1003,7 +1003,7 @@ public void testDeleteStandardRowSticksAfterFlush() throws Throwable // delete (from sstable and memtable) Mutation rm = new Mutation(keyspace.getName(), key.getKey()); rm.delete(cfs.name, 2); - rm.apply(); + rm.applyUnsafe(); // verify delete assertRowAndColCount(1, 0, true, cfs.getRangeSlice(Util.range("f", "g"), null, ThriftValidation.asIFilter(sp, cfs.metadata, null), 100)); @@ -1458,7 +1458,7 @@ public void testKeysSearcher() throws Exception ByteBuffer key = ByteBufferUtil.bytes(String.valueOf("k" + i)); Mutation rm = new Mutation(KEYSPACE1, key); rm.add(CF_INDEX1, cellname("birthdate"), LongType.instance.decompose(1L), System.currentTimeMillis()); - rm.apply(); + rm.applyUnsafe(); } store.forceBlockingFlush(); diff --git a/test/unit/org/apache/cassandra/db/HintedHandOffTest.java b/test/unit/org/apache/cassandra/db/HintedHandOffTest.java index e0a78a9ad874..c49cc7a5d96a 100644 --- a/test/unit/org/apache/cassandra/db/HintedHandOffTest.java +++ b/test/unit/org/apache/cassandra/db/HintedHandOffTest.java @@ -83,7 +83,7 @@ public void testCompactionOfHintsCF() throws Exception System.currentTimeMillis(), HintedHandOffManager.calculateHintTTL(rm), UUID.randomUUID()) - .apply(); + .applyUnsafe(); // flush data to disk hintStore.forceBlockingFlush(); @@ -126,7 +126,7 @@ public void testTruncateHints() throws Exception System.currentTimeMillis(), HintedHandOffManager.calculateHintTTL(rm), UUID.randomUUID()) - .apply(); + .applyUnsafe(); assert getNoOfHints() == 1; diff --git a/test/unit/org/apache/cassandra/db/KeyCacheTest.java b/test/unit/org/apache/cassandra/db/KeyCacheTest.java index 0d3fa631e677..ad3a6bcfcc3a 100644 --- a/test/unit/org/apache/cassandra/db/KeyCacheTest.java +++ b/test/unit/org/apache/cassandra/db/KeyCacheTest.java @@ -139,10 +139,10 @@ public void testKeyCache() throws ExecutionException, InterruptedException // inserts rm = new Mutation(KEYSPACE1, key1.getKey()); rm.add(COLUMN_FAMILY1, Util.cellname("1"), ByteBufferUtil.EMPTY_BYTE_BUFFER, 0); - rm.apply(); + rm.applyUnsafe(); rm = new Mutation(KEYSPACE1, key2.getKey()); rm.add(COLUMN_FAMILY1, Util.cellname("2"), ByteBufferUtil.EMPTY_BYTE_BUFFER, 0); - rm.apply(); + rm.applyUnsafe(); // to make sure we have SSTable cfs.forceBlockingFlush(); diff --git a/test/unit/org/apache/cassandra/db/KeyCollisionTest.java b/test/unit/org/apache/cassandra/db/KeyCollisionTest.java index 23d8abc2af63..883999fd6180 100644 --- a/test/unit/org/apache/cassandra/db/KeyCollisionTest.java +++ b/test/unit/org/apache/cassandra/db/KeyCollisionTest.java @@ -103,7 +103,7 @@ private void insert(String key) Mutation rm; rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes(key)); rm.add(CF, Util.cellname("column"), ByteBufferUtil.bytes("asdf"), 0); - rm.apply(); + rm.applyUnsafe(); } public static class LengthPartitioner extends AbstractPartitioner diff --git a/test/unit/org/apache/cassandra/db/KeyspaceTest.java b/test/unit/org/apache/cassandra/db/KeyspaceTest.java index 0bd428d7bd06..27a4e20235cf 100644 --- a/test/unit/org/apache/cassandra/db/KeyspaceTest.java +++ b/test/unit/org/apache/cassandra/db/KeyspaceTest.java @@ -101,7 +101,7 @@ public void testGetRowNoColumns() throws Throwable ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE2, "Standard3"); cf.addColumn(column("col1","val1", 1L)); Mutation rm = new Mutation(KEYSPACE2, TEST_KEY.getKey(), cf); - rm.apply(); + rm.applyUnsafe(); Runnable verify = new WrappedRunnable() { @@ -133,7 +133,7 @@ public void testGetRowSingleColumn() throws Throwable cf.addColumn(column("col2","val2", 1L)); cf.addColumn(column("col3","val3", 1L)); Mutation rm = new Mutation(KEYSPACE1, TEST_KEY.getKey(), cf); - rm.apply(); + rm.applyUnsafe(); Runnable verify = new WrappedRunnable() { @@ -163,7 +163,7 @@ public void testGetRowSliceByRange() throws Throwable cf.addColumn(column("b", "val2", 1L)); cf.addColumn(column("c", "val3", 1L)); Mutation rm = new Mutation(KEYSPACE1, key.getKey(), cf); - rm.apply(); + rm.applyUnsafe(); cf = cfStore.getColumnFamily(key, cellname("b"), cellname("c"), false, 100, System.currentTimeMillis()); assertEquals(2, cf.getColumnCount()); @@ -182,7 +182,7 @@ public void testGetSliceNoMatch() throws Throwable ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard2"); cf.addColumn(column("col1", "val1", 1)); Mutation rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("row1000"), cf); - rm.apply(); + rm.applyUnsafe(); validateGetSliceNoMatch(keyspace); keyspace.getColumnFamilyStore("Standard2").forceBlockingFlush(); @@ -209,7 +209,7 @@ public void testGetSliceWithCutoff() throws Throwable for (int i = 0; i < 300; i++) cf.addColumn(column("col" + fmt.format(i), "omg!thisisthevalue!"+i, 1L)); Mutation rm = new Mutation(KEYSPACE1, ROW.getKey(), cf); - rm.apply(); + rm.applyUnsafe(); Runnable verify = new WrappedRunnable() { @@ -264,7 +264,7 @@ public void testReversedWithFlushing() ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "StandardLong1"); cf.addColumn(new BufferCell(cellname((long)i), ByteBufferUtil.EMPTY_BYTE_BUFFER, 0)); Mutation rm = new Mutation(KEYSPACE1, ROW.getKey(), cf); - rm.apply(); + rm.applyUnsafe(); } cfs.forceBlockingFlush(); @@ -274,7 +274,7 @@ public void testReversedWithFlushing() ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "StandardLong1"); cf.addColumn(new BufferCell(cellname((long)i), ByteBufferUtil.EMPTY_BYTE_BUFFER, 0)); Mutation rm = new Mutation(KEYSPACE1, ROW.getKey(), cf); - rm.apply(); + rm.applyUnsafe(); cf = cfs.getColumnFamily(ROW, Composites.EMPTY, Composites.EMPTY, true, 1, System.currentTimeMillis()); assertEquals(1, Iterables.size(cf.getColumnNames())); @@ -312,11 +312,11 @@ public void testGetSliceFromBasic() throws Throwable cf.addColumn(column("col7", "val7", 1L)); cf.addColumn(column("col9", "val9", 1L)); Mutation rm = new Mutation(KEYSPACE1, ROW.getKey(), cf); - rm.apply(); + rm.applyUnsafe(); rm = new Mutation(KEYSPACE1, ROW.getKey()); rm.delete("Standard1", cellname("col4"), 2L); - rm.apply(); + rm.applyUnsafe(); Runnable verify = new WrappedRunnable() { @@ -364,7 +364,7 @@ public void testGetSliceWithExpiration() throws Throwable cf.addColumn(expiringColumn("col2", "val2", 1L, 60)); // long enough not to be tombstoned cf.addColumn(column("col3", "val3", 1L)); Mutation rm = new Mutation(KEYSPACE1, ROW.getKey(), cf); - rm.apply(); + rm.applyUnsafe(); Runnable verify = new WrappedRunnable() { @@ -401,7 +401,7 @@ public void testGetSliceFromAdvanced() throws Throwable cf.addColumn(column("col5", "val5", 1L)); cf.addColumn(column("col6", "val6", 1L)); Mutation rm = new Mutation(KEYSPACE1, ROW.getKey(), cf); - rm.apply(); + rm.applyUnsafe(); cfStore.forceBlockingFlush(); cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); @@ -409,7 +409,7 @@ public void testGetSliceFromAdvanced() throws Throwable cf.addColumn(column("col2", "valx", 2L)); cf.addColumn(column("col3", "valx", 2L)); rm = new Mutation(KEYSPACE1, ROW.getKey(), cf); - rm.apply(); + rm.applyUnsafe(); Runnable verify = new WrappedRunnable() { @@ -445,7 +445,7 @@ public void testGetSliceFromLarge() throws Throwable for (int i = 1000; i < 2000; i++) cf.addColumn(column("col" + i, ("v" + i), 1L)); Mutation rm = new Mutation(KEYSPACE1, key.getKey(), cf); - rm.apply(); + rm.applyUnsafe(); cfStore.forceBlockingFlush(); validateSliceLarge(cfStore); @@ -478,7 +478,7 @@ public void testLimitSSTables() throws CharacterCodingException cf.addColumn(column("col" + i, ("v" + i), i)); } Mutation rm = new Mutation(KEYSPACE1, key.getKey(), cf); - rm.apply(); + rm.applyUnsafe(); cfStore.forceBlockingFlush(); } cfStore.metric.sstablesPerReadHistogram.cf.clear(); @@ -544,7 +544,7 @@ public void testLimitSSTablesComposites() Mutation rm = new Mutation(KEYSPACE1, key.getKey()); CellName colName = type.makeCellName(ByteBufferUtil.bytes("a" + i), ByteBufferUtil.bytes(j*10 + i)); rm.add("StandardComposite2", colName, ByteBufferUtil.EMPTY_BYTE_BUFFER, 0); - rm.apply(); + rm.applyUnsafe(); } cfs.forceBlockingFlush(); } diff --git a/test/unit/org/apache/cassandra/db/MultitableTest.java b/test/unit/org/apache/cassandra/db/MultitableTest.java index 536ba1c15e01..fd04b76ec4c4 100644 --- a/test/unit/org/apache/cassandra/db/MultitableTest.java +++ b/test/unit/org/apache/cassandra/db/MultitableTest.java @@ -64,12 +64,12 @@ public void testSameCFs() cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); cf.addColumn(column("col1", "val1", 1L)); rm = new Mutation(KEYSPACE1, dk.getKey(), cf); - rm.apply(); + rm.applyUnsafe(); cf = ArrayBackedSortedColumns.factory.create(KEYSPACE2, "Standard1"); cf.addColumn(column("col2", "val2", 1L)); rm = new Mutation(KEYSPACE2, dk.getKey(), cf); - rm.apply(); + rm.applyUnsafe(); keyspace1.getColumnFamilyStore("Standard1").forceBlockingFlush(); keyspace2.getColumnFamilyStore("Standard1").forceBlockingFlush(); diff --git a/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java b/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java index 4c8c8b4393b4..d1d3c46c0c3c 100644 --- a/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java +++ b/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java @@ -89,25 +89,25 @@ public void simpleQueryWithRangeTombstoneTest() throws Exception rm = new Mutation(KSNAME, ByteBufferUtil.bytes(key)); for (int i = 0; i < 40; i += 2) add(rm, i, 0); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); rm = new Mutation(KSNAME, ByteBufferUtil.bytes(key)); cf = rm.addOrGet(CFNAME); delete(cf, 10, 22, 1); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); rm = new Mutation(KSNAME, ByteBufferUtil.bytes(key)); for (int i = 1; i < 40; i += 2) add(rm, i, 2); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); rm = new Mutation(KSNAME, ByteBufferUtil.bytes(key)); cf = rm.addOrGet(CFNAME); delete(cf, 19, 27, 3); - rm.apply(); + rm.applyUnsafe(); // We don't flush to test with both a range tomsbtone in memtable and in sstable // Queries by name @@ -149,17 +149,17 @@ public void rangeTombstoneFilteringTest() throws Exception rm = new Mutation(KSNAME, ByteBufferUtil.bytes(key)); for (int i = 0; i < 40; i += 2) add(rm, i, 0); - rm.apply(); + rm.applyUnsafe(); rm = new Mutation(KSNAME, ByteBufferUtil.bytes(key)); cf = rm.addOrGet(CFNAME); delete(cf, 5, 10, 1); - rm.apply(); + rm.applyUnsafe(); rm = new Mutation(KSNAME, ByteBufferUtil.bytes(key)); cf = rm.addOrGet(CFNAME); delete(cf, 15, 20, 2); - rm.apply(); + rm.applyUnsafe(); cf = cfs.getColumnFamily(QueryFilter.getSliceFilter(dk(key), CFNAME, b(11), b(14), false, Integer.MAX_VALUE, System.currentTimeMillis())); Collection rt = rangeTombstones(cf); @@ -250,25 +250,25 @@ public void overlappingRangeTest() throws Exception rm = new Mutation(KSNAME, ByteBufferUtil.bytes(key)); for (int i = 0; i < 20; i++) add(rm, i, 0); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); rm = new Mutation(KSNAME, ByteBufferUtil.bytes(key)); cf = rm.addOrGet(CFNAME); delete(cf, 5, 15, 1); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); rm = new Mutation(KSNAME, ByteBufferUtil.bytes(key)); cf = rm.addOrGet(CFNAME); delete(cf, 5, 10, 1); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); rm = new Mutation(KSNAME, ByteBufferUtil.bytes(key)); cf = rm.addOrGet(CFNAME); delete(cf, 5, 8, 2); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); cf = cfs.getColumnFamily(QueryFilter.getIdentityFilter(dk(key), CFNAME, System.currentTimeMillis())); @@ -305,14 +305,14 @@ public void reverseQueryTest() throws Exception rm = new Mutation(KSNAME, ByteBufferUtil.bytes(key)); add(rm, 2, 0); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); rm = new Mutation(KSNAME, ByteBufferUtil.bytes(key)); // Deletes everything but without being a row tombstone delete(rm.addOrGet(CFNAME), 0, 10, 1); add(rm, 1, 2); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); // Get the last value of the row @@ -344,14 +344,14 @@ public void testRangeTombstoneCompaction() throws Exception Mutation rm = new Mutation(KSNAME, key); for (int i = 0; i < 10; i += 2) add(rm, i, 0); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); rm = new Mutation(KSNAME, key); ColumnFamily cf = rm.addOrGet(CFNAME); for (int i = 0; i < 10; i += 2) delete(cf, 0, 7, 0); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); // there should be 2 sstables @@ -401,18 +401,18 @@ public void testOverwritesToDeletedColumns() throws Exception Mutation rm = new Mutation(KSNAME, key); add(rm, 1, 0); - rm.apply(); + rm.applyUnsafe(); // add a RT which hides the column we just inserted rm = new Mutation(KSNAME, key); ColumnFamily cf = rm.addOrGet(CFNAME); delete(cf, 0, 1, 1); - rm.apply(); + rm.applyUnsafe(); // now re-insert that column rm = new Mutation(KSNAME, key); add(rm, 1, 2); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); @@ -445,14 +445,14 @@ private void runCompactionWithRangeTombstoneAndCheckSecondaryIndex() throws Exce Mutation rm = new Mutation(KSNAME, key); for (int i = 0; i < 10; i++) add(rm, i, 0); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); rm = new Mutation(KSNAME, key); ColumnFamily cf = rm.addOrGet(CFNAME); for (int i = 0; i < 10; i += 2) delete(cf, 0, 7, 0); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); // We should have indexed 1 column diff --git a/test/unit/org/apache/cassandra/db/RecoveryManagerTruncateTest.java b/test/unit/org/apache/cassandra/db/RecoveryManagerTruncateTest.java index 23caaf8eb8d2..d0f7cff934ea 100644 --- a/test/unit/org/apache/cassandra/db/RecoveryManagerTruncateTest.java +++ b/test/unit/org/apache/cassandra/db/RecoveryManagerTruncateTest.java @@ -65,7 +65,7 @@ public void testTruncate() throws IOException cf = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); cf.addColumn(column("col1", "val1", 1L)); rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("keymulti"), cf); - rm.apply(); + rm.applyUnsafe(); // Make sure data was written assertNotNull(getFromTable(keyspace, "Standard1", "keymulti", "col1")); diff --git a/test/unit/org/apache/cassandra/db/RemoveCellTest.java b/test/unit/org/apache/cassandra/db/RemoveCellTest.java index ac941b54d064..1edb964c316d 100644 --- a/test/unit/org/apache/cassandra/db/RemoveCellTest.java +++ b/test/unit/org/apache/cassandra/db/RemoveCellTest.java @@ -58,13 +58,13 @@ public void testRemoveColumn() // add data rm = new Mutation(KEYSPACE1, dk.getKey()); rm.add("Standard1", Util.cellname("Column1"), ByteBufferUtil.bytes("asdf"), 0); - rm.apply(); + rm.applyUnsafe(); store.forceBlockingFlush(); // remove rm = new Mutation(KEYSPACE1, dk.getKey()); rm.delete("Standard1", Util.cellname("Column1"), 1); - rm.apply(); + rm.applyUnsafe(); ColumnFamily retrieved = store.getColumnFamily(Util.namesQueryFilter(store, dk, "Column1")); assertFalse(retrieved.getColumn(Util.cellname("Column1")).isLive()); diff --git a/test/unit/org/apache/cassandra/db/RemoveColumnFamilyTest.java b/test/unit/org/apache/cassandra/db/RemoveColumnFamilyTest.java index c8bab477d27c..fec8711f9371 100644 --- a/test/unit/org/apache/cassandra/db/RemoveColumnFamilyTest.java +++ b/test/unit/org/apache/cassandra/db/RemoveColumnFamilyTest.java @@ -58,12 +58,12 @@ public void testRemoveColumnFamily() // add data rm = new Mutation(KEYSPACE1, dk.getKey()); rm.add("Standard1", Util.cellname("Column1"), ByteBufferUtil.bytes("asdf"), 0); - rm.apply(); + rm.applyUnsafe(); // remove rm = new Mutation(KEYSPACE1, dk.getKey()); rm.delete("Standard1", 1); - rm.apply(); + rm.applyUnsafe(); ColumnFamily retrieved = store.getColumnFamily(QueryFilter.getIdentityFilter(dk, "Standard1", System.currentTimeMillis())); assert retrieved.isMarkedForDelete(); diff --git a/test/unit/org/apache/cassandra/db/RemoveColumnFamilyWithFlush1Test.java b/test/unit/org/apache/cassandra/db/RemoveColumnFamilyWithFlush1Test.java index 830eba536c69..72827d06a260 100644 --- a/test/unit/org/apache/cassandra/db/RemoveColumnFamilyWithFlush1Test.java +++ b/test/unit/org/apache/cassandra/db/RemoveColumnFamilyWithFlush1Test.java @@ -59,13 +59,13 @@ public void testRemoveColumnFamilyWithFlush1() rm = new Mutation(KEYSPACE1, dk.getKey()); rm.add("Standard1", Util.cellname("Column1"), ByteBufferUtil.bytes("asdf"), 0); rm.add("Standard1", Util.cellname("Column2"), ByteBufferUtil.bytes("asdf"), 0); - rm.apply(); + rm.applyUnsafe(); store.forceBlockingFlush(); // remove rm = new Mutation(KEYSPACE1, dk.getKey()); rm.delete("Standard1", 1); - rm.apply(); + rm.applyUnsafe(); ColumnFamily retrieved = store.getColumnFamily(QueryFilter.getIdentityFilter(dk, "Standard1", System.currentTimeMillis())); assert retrieved.isMarkedForDelete(); diff --git a/test/unit/org/apache/cassandra/db/RemoveColumnFamilyWithFlush2Test.java b/test/unit/org/apache/cassandra/db/RemoveColumnFamilyWithFlush2Test.java index d2ba51f3f2bf..ef7f7f28ed2d 100644 --- a/test/unit/org/apache/cassandra/db/RemoveColumnFamilyWithFlush2Test.java +++ b/test/unit/org/apache/cassandra/db/RemoveColumnFamilyWithFlush2Test.java @@ -58,11 +58,11 @@ public void testRemoveColumnFamilyWithFlush2() // add data rm = new Mutation(KEYSPACE1, dk.getKey()); rm.add("Standard1", Util.cellname("Column1"), ByteBufferUtil.bytes("asdf"), 0); - rm.apply(); + rm.applyUnsafe(); // remove rm = new Mutation(KEYSPACE1, dk.getKey()); rm.delete("Standard1", 1); - rm.apply(); + rm.applyUnsafe(); store.forceBlockingFlush(); ColumnFamily retrieved = store.getColumnFamily(QueryFilter.getIdentityFilter(dk, "Standard1", System.currentTimeMillis())); diff --git a/test/unit/org/apache/cassandra/db/RemoveSubCellTest.java b/test/unit/org/apache/cassandra/db/RemoveSubCellTest.java index db27bef32dc6..3fa5c2f37559 100644 --- a/test/unit/org/apache/cassandra/db/RemoveSubCellTest.java +++ b/test/unit/org/apache/cassandra/db/RemoveSubCellTest.java @@ -67,14 +67,14 @@ public void testRemoveSubColumn() // add data rm = new Mutation(KEYSPACE1, dk.getKey()); Util.addMutation(rm, "Super1", "SC1", 1, "asdf", 0); - rm.apply(); + rm.applyUnsafe(); store.forceBlockingFlush(); CellName cname = CellNames.compositeDense(ByteBufferUtil.bytes("SC1"), getBytes(1L)); // remove rm = new Mutation(KEYSPACE1, dk.getKey()); rm.delete("Super1", cname, 1); - rm.apply(); + rm.applyUnsafe(); ColumnFamily retrieved = store.getColumnFamily(QueryFilter.getIdentityFilter(dk, "Super1", System.currentTimeMillis())); assertFalse(retrieved.getColumn(cname).isLive()); @@ -92,7 +92,7 @@ public void testRemoveSubColumnAndContainer() // add data rm = new Mutation(KEYSPACE1, dk.getKey()); Util.addMutation(rm, "Super1", "SC1", 1, "asdf", 0); - rm.apply(); + rm.applyUnsafe(); store.forceBlockingFlush(); // remove the SC @@ -100,7 +100,7 @@ public void testRemoveSubColumnAndContainer() CellName cname = CellNames.compositeDense(scName, getBytes(1L)); rm = new Mutation(KEYSPACE1, dk.getKey()); rm.deleteRange("Super1", SuperColumns.startOf(scName), SuperColumns.endOf(scName), 1); - rm.apply(); + rm.applyUnsafe(); // Mark current time and make sure the next insert happens at least // one second after the previous one (since gc resolution is the second) @@ -110,7 +110,7 @@ public void testRemoveSubColumnAndContainer() // remove the column itself rm = new Mutation(KEYSPACE1, dk.getKey()); rm.delete("Super1", cname, 2); - rm.apply(); + rm.applyUnsafe(); ColumnFamily retrieved = store.getColumnFamily(filter); assertFalse(retrieved.getColumn(cname).isLive()); diff --git a/test/unit/org/apache/cassandra/db/RowIterationTest.java b/test/unit/org/apache/cassandra/db/RowIterationTest.java index 10d89034b023..ee7bf1a3cc5d 100644 --- a/test/unit/org/apache/cassandra/db/RowIterationTest.java +++ b/test/unit/org/apache/cassandra/db/RowIterationTest.java @@ -67,7 +67,7 @@ public void testRowIteration() DecoratedKey key = Util.dk(String.valueOf(i)); Mutation rm = new Mutation(KEYSPACE1, key.getKey()); rm.add("Super3", CellNames.compositeDense(ByteBufferUtil.bytes("sc"), ByteBufferUtil.bytes(String.valueOf(i))), ByteBuffer.wrap(new byte[ROWS_PER_SSTABLE * 10 - i * 2]), i); - rm.apply(); + rm.applyUnsafe(); inserted.add(key); } store.forceBlockingFlush(); @@ -86,7 +86,7 @@ public void testRowIterationDeletionTime() Mutation rm = new Mutation(KEYSPACE1, key.getKey()); rm.delete(CF_NAME, 0); rm.add(CF_NAME, Util.cellname("c"), ByteBufferUtil.bytes("values"), 0L); - rm.apply(); + rm.applyUnsafe(); store.forceBlockingFlush(); // Delete row in second sstable with higher timestamp @@ -95,7 +95,7 @@ public void testRowIterationDeletionTime() rm.add(CF_NAME, Util.cellname("c"), ByteBufferUtil.bytes("values"), 1L); DeletionInfo delInfo2 = rm.getColumnFamilies().iterator().next().deletionInfo(); assert delInfo2.getTopLevelDeletion().markedForDeleteAt == 1L; - rm.apply(); + rm.applyUnsafe(); store.forceBlockingFlush(); ColumnFamily cf = Util.getRangeSlice(store).get(0).cf; @@ -113,7 +113,7 @@ public void testRowIterationDeletion() // Delete a row in first sstable Mutation rm = new Mutation(KEYSPACE1, key.getKey()); rm.delete(CF_NAME, 0); - rm.apply(); + rm.applyUnsafe(); store.forceBlockingFlush(); ColumnFamily cf = Util.getRangeSlice(store).get(0).cf; diff --git a/test/unit/org/apache/cassandra/db/TimeSortTest.java b/test/unit/org/apache/cassandra/db/TimeSortTest.java index 77890fb474ec..1d9fb10a1464 100644 --- a/test/unit/org/apache/cassandra/db/TimeSortTest.java +++ b/test/unit/org/apache/cassandra/db/TimeSortTest.java @@ -63,12 +63,12 @@ public void testMixedSources() rm = new Mutation(KEYSPACE1, key.getKey()); rm.add(CF_STANDARD1, cellname(100), ByteBufferUtil.bytes("a"), 100); - rm.apply(); + rm.applyUnsafe(); cfStore.forceBlockingFlush(); rm = new Mutation(KEYSPACE1, key.getKey()); rm.add(CF_STANDARD1, cellname(0), ByteBufferUtil.bytes("b"), 0); - rm.apply(); + rm.applyUnsafe(); ColumnFamily cf = cfStore.getColumnFamily(key, cellname(10), Composites.EMPTY, false, 1000, System.currentTimeMillis()); Collection cells = cf.getSortedColumns(); @@ -88,7 +88,7 @@ public void testTimeSort() throws IOException { rm.add(CF_STANDARD1, cellname(j * 2), ByteBufferUtil.bytes("a"), j * 2); } - rm.apply(); + rm.applyUnsafe(); } validateTimeSort(keyspace); @@ -103,12 +103,12 @@ public void testTimeSort() throws IOException { rm.add(CF_STANDARD1, cellname(j * 2 + 1), ByteBufferUtil.bytes("b"), j * 2 + 1); } - rm.apply(); + rm.applyUnsafe(); // and some overwrites rm = new Mutation(KEYSPACE1, key.getKey()); rm.add(CF_STANDARD1, cellname(0), ByteBufferUtil.bytes("c"), 100); rm.add(CF_STANDARD1, cellname(10), ByteBufferUtil.bytes("c"), 100); - rm.apply(); + rm.applyUnsafe(); // verify ColumnFamily cf = cfStore.getColumnFamily(key, cellname(0), Composites.EMPTY, false, 1000, System.currentTimeMillis()); diff --git a/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java b/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java index ac628ee9d36c..e47f0e965a6b 100644 --- a/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java @@ -77,7 +77,7 @@ public void antiCompactOne() throws InterruptedException, ExecutionException, IO ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp, 0); - rm.apply(); + rm.applyUnsafe(); } store.forceBlockingFlush(); Collection sstables = store.getUnrepairedSSTables(); diff --git a/test/unit/org/apache/cassandra/db/compaction/BlacklistingCompactionsTest.java b/test/unit/org/apache/cassandra/db/compaction/BlacklistingCompactionsTest.java index 8beea7f20365..85f5330f3cc1 100644 --- a/test/unit/org/apache/cassandra/db/compaction/BlacklistingCompactionsTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/BlacklistingCompactionsTest.java @@ -107,7 +107,7 @@ public void testBlacklisting(String compactionStrategy) throws Exception long timestamp = j * ROWS_PER_SSTABLE + i; rm.add("Standard1", cellname(i / 2), ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp); maxTimestampExpected = Math.max(timestamp, maxTimestampExpected); - rm.apply(); + rm.applyUnsafe(); inserted.add(key); } cfs.forceBlockingFlush(); diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java index e8656c4d7868..00923b1f329d 100644 --- a/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java @@ -107,7 +107,7 @@ public void testMajorCompactionPurge() throws ExecutionException, InterruptedExc { rm.add(cfName, cellname(String.valueOf(i)), ByteBufferUtil.EMPTY_BYTE_BUFFER, 0); } - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); // deletes @@ -115,14 +115,14 @@ public void testMajorCompactionPurge() throws ExecutionException, InterruptedExc { rm = new Mutation(KEYSPACE1, key.getKey()); rm.delete(cfName, cellname(String.valueOf(i)), 1); - rm.apply(); + rm.applyUnsafe(); } cfs.forceBlockingFlush(); // resurrect one column rm = new Mutation(KEYSPACE1, key.getKey()); rm.add(cfName, cellname(String.valueOf(5)), ByteBufferUtil.EMPTY_BYTE_BUFFER, 2); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); // major compact and test that all columns but the resurrected one is completely gone @@ -152,7 +152,7 @@ public void testMinorCompactionPurge() { rm.add(cfName, cellname(String.valueOf(i)), ByteBufferUtil.EMPTY_BYTE_BUFFER, 0); } - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); // deletes @@ -160,7 +160,7 @@ public void testMinorCompactionPurge() { rm = new Mutation(KEYSPACE2, key.getKey()); rm.delete(cfName, cellname(String.valueOf(i)), 1); - rm.apply(); + rm.applyUnsafe(); } cfs.forceBlockingFlush(); } @@ -174,7 +174,7 @@ public void testMinorCompactionPurge() Collection sstablesIncomplete = cfs.getSSTables(); rm = new Mutation(KEYSPACE2, key1.getKey()); rm.add(cfName, cellname(String.valueOf(5)), ByteBufferUtil.EMPTY_BYTE_BUFFER, 2); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); cfs.getCompactionStrategy().getUserDefinedTask(sstablesIncomplete, Integer.MAX_VALUE).execute(null); @@ -207,19 +207,19 @@ public void testMinTimestampPurge() rm = new Mutation(KEYSPACE2, key3.getKey()); rm.add(cfName, cellname("c1"), ByteBufferUtil.EMPTY_BYTE_BUFFER, 8); rm.add(cfName, cellname("c2"), ByteBufferUtil.EMPTY_BYTE_BUFFER, 8); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); // delete c1 rm = new Mutation(KEYSPACE2, key3.getKey()); rm.delete(cfName, cellname("c1"), 10); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); Collection sstablesIncomplete = cfs.getSSTables(); // delete c2 so we have new delete in a diffrent SSTable rm = new Mutation(KEYSPACE2, key3.getKey()); rm.delete(cfName, cellname("c2"), 9); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); // compact the sstables with the c1/c2 data and the c1 tombstone @@ -250,14 +250,14 @@ public void testCompactionPurgeOneFile() throws ExecutionException, InterruptedE { rm.add(cfName, cellname(String.valueOf(i)), ByteBufferUtil.EMPTY_BYTE_BUFFER, 0); } - rm.apply(); + rm.applyUnsafe(); // deletes for (int i = 0; i < 5; i++) { rm = new Mutation(KEYSPACE1, key.getKey()); rm.delete(cfName, cellname(String.valueOf(i)), 1); - rm.apply(); + rm.applyUnsafe(); } cfs.forceBlockingFlush(); assertEquals(String.valueOf(cfs.getSSTables()), 1, cfs.getSSTables().size()); // inserts & deletes were in the same memtable -> only deletes in sstable @@ -288,7 +288,7 @@ public void testCompactionPurgeCachedRow() throws ExecutionException, Interrupte { rm.add(cfName, cellname(String.valueOf(i)), ByteBufferUtil.EMPTY_BYTE_BUFFER, 0); } - rm.apply(); + rm.applyUnsafe(); // move the key up in row cache cfs.getColumnFamily(QueryFilter.getIdentityFilter(key, cfName, System.currentTimeMillis())); @@ -296,7 +296,7 @@ public void testCompactionPurgeCachedRow() throws ExecutionException, Interrupte // deletes row rm = new Mutation(keyspaceName, key.getKey()); rm.delete(cfName, 1); - rm.apply(); + rm.applyUnsafe(); // flush and major compact cfs.forceBlockingFlush(); @@ -308,7 +308,7 @@ public void testCompactionPurgeCachedRow() throws ExecutionException, Interrupte { rm.add(cfName, cellname(String.valueOf(i)), ByteBufferUtil.EMPTY_BYTE_BUFFER, 0); } - rm.apply(); + rm.applyUnsafe(); // Check that the second insert did went in ColumnFamily cf = cfs.getColumnFamily(QueryFilter.getIdentityFilter(key, cfName, System.currentTimeMillis())); @@ -334,12 +334,12 @@ public void testCompactionPurgeTombstonedRow() throws ExecutionException, Interr rm = new Mutation(keyspaceName, key.getKey()); for (int i = 0; i < 10; i++) rm.add(cfName, cellname(String.valueOf(i)), ByteBufferUtil.EMPTY_BYTE_BUFFER, i); - rm.apply(); + rm.applyUnsafe(); // deletes row with timestamp such that not all columns are deleted rm = new Mutation(keyspaceName, key.getKey()); rm.delete(cfName, 4); - rm.apply(); + rm.applyUnsafe(); ColumnFamily cf = cfs.getColumnFamily(filter); assertTrue(cf.isMarkedForDelete()); @@ -352,7 +352,7 @@ public void testCompactionPurgeTombstonedRow() throws ExecutionException, Interr rm = new Mutation(keyspaceName, key.getKey()); for (int i = 0; i < 5; i++) rm.add(cfName, cellname(String.valueOf(i)), ByteBufferUtil.EMPTY_BYTE_BUFFER, i); - rm.apply(); + rm.applyUnsafe(); // Check that the second insert went in cf = cfs.getColumnFamily(filter); diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java index e784051b1103..5be732e4f986 100644 --- a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java @@ -140,7 +140,7 @@ private long populate(String ks, String cf, int startRowKey, int endRowKey, int ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp, j > 0 ? ttl : 0); // let first column never expire, since deleting all columns does not produce sstable - rm.apply(); + rm.applyUnsafe(); } return timestamp; } @@ -178,13 +178,13 @@ public void testSuperColumnTombstones() throws ExecutionException, InterruptedEx rm.add("Super1", Util.cellname(scName, ByteBufferUtil.bytes(0)), ByteBufferUtil.EMPTY_BYTE_BUFFER, FBUtilities.timestampMicros()); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); // shadow the subcolumn with a supercolumn tombstone rm = new Mutation(KEYSPACE1, key.getKey()); rm.deleteRange("Super1", SuperColumns.startOf(scName), SuperColumns.endOf(scName), FBUtilities.timestampMicros()); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); CompactionManager.instance.performMaximal(cfs); @@ -296,7 +296,7 @@ public void testEchoedRow() DecoratedKey key = Util.dk(String.valueOf(i)); Mutation rm = new Mutation(KEYSPACE1, key.getKey()); rm.add("Standard2", Util.cellname(String.valueOf(i)), ByteBufferUtil.EMPTY_BYTE_BUFFER, i); - rm.apply(); + rm.applyUnsafe(); if (i % 2 == 0) cfs.forceBlockingFlush(); @@ -311,7 +311,7 @@ public void testEchoedRow() DecoratedKey key = Util.dk(String.valueOf(i)); Mutation rm = new Mutation(KEYSPACE1, key.getKey()); rm.add("Standard2", Util.cellname(String.valueOf(i)), ByteBufferUtil.EMPTY_BYTE_BUFFER, i); - rm.apply(); + rm.applyUnsafe(); } cfs.forceBlockingFlush(); SSTableReader tmpSSTable = null; @@ -358,7 +358,7 @@ public void testUserDefinedCompaction() throws Exception rm.add(cfname, Util.cellname("col"), ByteBufferUtil.EMPTY_BYTE_BUFFER, System.currentTimeMillis()); - rm.apply(); + rm.applyUnsafe(); } cfs.forceBlockingFlush(); Collection sstables = cfs.getSSTables(); @@ -504,7 +504,7 @@ private void testDontPurgeAccidentaly(String k, String cfname) throws Interrupte DecoratedKey key = Util.dk(k); Mutation rm = new Mutation(KEYSPACE1, key.getKey()); rm.add(cfname, Util.cellname(ByteBufferUtil.bytes("sc"), ByteBufferUtil.bytes("c")), ByteBufferUtil.EMPTY_BYTE_BUFFER, 0); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); @@ -516,7 +516,7 @@ private void testDontPurgeAccidentaly(String k, String cfname) throws Interrupte // Remove key rm = new Mutation(KEYSPACE1, key.getKey()); rm.delete(cfname, 2); - rm.apply(); + rm.applyUnsafe(); ColumnFamily cf = cfs.getColumnFamily(filter); assertTrue("should be empty: " + cf, cf == null || !cf.hasColumns()); @@ -558,7 +558,7 @@ private static void insertRowWithKey(int key) DecoratedKey decoratedKey = Util.dk(String.format("%03d", key)); Mutation rm = new Mutation(KEYSPACE1, decoratedKey.getKey()); rm.add("CF_STANDARD1", Util.cellname("col"), ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp, 1000); - rm.apply(); + rm.applyUnsafe(); } @Test diff --git a/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java b/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java index 71bf6e5722c3..5f9b72b9739e 100644 --- a/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java @@ -105,7 +105,7 @@ public void testValidationMultipleSSTablePerLevel() throws Exception { rm.add(CF_STANDARDDLEVELED, Util.cellname("column" + c), value, 0); } - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); } @@ -150,7 +150,7 @@ public void testCompactionProgress() throws Exception { rm.add(CF_STANDARDDLEVELED, Util.cellname("column" + c), value, 0); } - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); } @@ -189,7 +189,7 @@ public void testMutateLevel() throws Exception { rm.add(CF_STANDARDDLEVELED, Util.cellname("column" + c), value, 0); } - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); } waitForLeveling(cfs); @@ -235,7 +235,7 @@ public void testNewRepairedSSTable() throws Exception { rm.add(CF_STANDARDDLEVELED, Util.cellname("column" + c), value, 0); } - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); } waitForLeveling(cfs); diff --git a/test/unit/org/apache/cassandra/db/compaction/OneCompactionTest.java b/test/unit/org/apache/cassandra/db/compaction/OneCompactionTest.java index 375dfe8ca119..216c9cfbaa52 100644 --- a/test/unit/org/apache/cassandra/db/compaction/OneCompactionTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/OneCompactionTest.java @@ -71,7 +71,7 @@ private void testCompaction(String columnFamilyName, int insertsPerTable) throws DecoratedKey key = Util.dk(String.valueOf(j)); Mutation rm = new Mutation(KEYSPACE1, key.getKey()); rm.add(columnFamilyName, Util.cellname("0"), ByteBufferUtil.EMPTY_BYTE_BUFFER, j); - rm.apply(); + rm.applyUnsafe(); inserted.add(key); store.forceBlockingFlush(); assertEquals(inserted.size(), Util.getRangeSlice(store).size()); diff --git a/test/unit/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyTest.java b/test/unit/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyTest.java index ef886e7e97ff..56fa7a1e0d8d 100644 --- a/test/unit/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyTest.java @@ -180,7 +180,7 @@ public void testPrepBucket() throws Exception DecoratedKey key = Util.dk(String.valueOf(r)); Mutation rm = new Mutation(ksname, key.getKey()); rm.add(cfname, Util.cellname("column"), value, 0); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); } cfs.forceBlockingFlush(); @@ -224,7 +224,7 @@ public void testFilterColdSSTables() throws Exception DecoratedKey key = Util.dk(String.valueOf(r)); Mutation rm = new Mutation(ksname, key.getKey()); rm.add(cfname, Util.cellname("column"), value, 0); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); } cfs.forceBlockingFlush(); diff --git a/test/unit/org/apache/cassandra/db/compaction/TTLExpiryTest.java b/test/unit/org/apache/cassandra/db/compaction/TTLExpiryTest.java index 3a2bc4aac095..f3a693c248ed 100644 --- a/test/unit/org/apache/cassandra/db/compaction/TTLExpiryTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/TTLExpiryTest.java @@ -71,7 +71,7 @@ public void testSimpleExpire() throws InterruptedException timestamp, 1); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); rm = new Mutation(KEYSPACE1, Util.dk("ttl").getKey()); @@ -79,21 +79,21 @@ public void testSimpleExpire() throws InterruptedException ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp, 1); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); rm = new Mutation(KEYSPACE1, Util.dk("ttl").getKey()); rm.add("Standard1", Util.cellname("col3"), ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp, 1); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); rm = new Mutation(KEYSPACE1, Util.dk("ttl").getKey()); rm.add("Standard1", Util.cellname("col311"), ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp, 1); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); Thread.sleep(2000); // wait for ttl to expire @@ -119,7 +119,7 @@ public void testNoExpire() throws InterruptedException timestamp, 1); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); rm = new Mutation(KEYSPACE1, Util.dk("ttl").getKey()); @@ -127,21 +127,21 @@ public void testNoExpire() throws InterruptedException ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp, 1); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); rm = new Mutation(KEYSPACE1, Util.dk("ttl").getKey()); rm.add("Standard1", Util.cellname("col3"), ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp, 1); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); DecoratedKey noTTLKey = Util.dk("nottl"); rm = new Mutation(KEYSPACE1, noTTLKey.getKey()); rm.add("Standard1", Util.cellname("col311"), ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); Thread.sleep(2000); // wait for ttl to expire assertEquals(4, cfs.getSSTables().size()); diff --git a/test/unit/org/apache/cassandra/db/index/PerRowSecondaryIndexTest.java b/test/unit/org/apache/cassandra/db/index/PerRowSecondaryIndexTest.java index e3121824e203..3097099cb720 100644 --- a/test/unit/org/apache/cassandra/db/index/PerRowSecondaryIndexTest.java +++ b/test/unit/org/apache/cassandra/db/index/PerRowSecondaryIndexTest.java @@ -79,7 +79,7 @@ public void testIndexInsertAndUpdate() Mutation rm; rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("k1")); rm.add("Indexed1", Util.cellname("indexed"), ByteBufferUtil.bytes("foo"), 1); - rm.apply(); + rm.applyUnsafe(); ColumnFamily indexedRow = PerRowSecondaryIndexTest.TestIndex.LAST_INDEXED_ROW; assertNotNull(indexedRow); @@ -88,7 +88,7 @@ public void testIndexInsertAndUpdate() // update the row and verify what was indexed rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("k1")); rm.add("Indexed1", Util.cellname("indexed"), ByteBufferUtil.bytes("bar"), 2); - rm.apply(); + rm.applyUnsafe(); indexedRow = PerRowSecondaryIndexTest.TestIndex.LAST_INDEXED_ROW; assertNotNull(indexedRow); @@ -103,7 +103,7 @@ public void testColumnDelete() Mutation rm; rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("k2")); rm.delete("Indexed1", Util.cellname("indexed"), 1); - rm.apply(); + rm.applyUnsafe(); ColumnFamily indexedRow = PerRowSecondaryIndexTest.TestIndex.LAST_INDEXED_ROW; assertNotNull(indexedRow); @@ -121,7 +121,7 @@ public void testRowDelete() Mutation rm; rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("k3")); rm.delete("Indexed1", 1); - rm.apply(); + rm.applyUnsafe(); ColumnFamily indexedRow = PerRowSecondaryIndexTest.TestIndex.LAST_INDEXED_ROW; assertNotNull(indexedRow); diff --git a/test/unit/org/apache/cassandra/db/marshal/CompositeTypeTest.java b/test/unit/org/apache/cassandra/db/marshal/CompositeTypeTest.java index 35be43de1efd..3e75c1a5069e 100644 --- a/test/unit/org/apache/cassandra/db/marshal/CompositeTypeTest.java +++ b/test/unit/org/apache/cassandra/db/marshal/CompositeTypeTest.java @@ -193,7 +193,7 @@ public void testFullRound() throws Exception addColumn(rm, cname4); addColumn(rm, cname2); addColumn(rm, cname3); - rm.apply(); + rm.applyUnsafe(); ColumnFamily cf = cfs.getColumnFamily(QueryFilter.getIdentityFilter(Util.dk("k"), CF_STANDARDCOMPOSITE, System.currentTimeMillis())); diff --git a/test/unit/org/apache/cassandra/db/marshal/DynamicCompositeTypeTest.java b/test/unit/org/apache/cassandra/db/marshal/DynamicCompositeTypeTest.java index fa10dbbdedac..7056a40c20f3 100644 --- a/test/unit/org/apache/cassandra/db/marshal/DynamicCompositeTypeTest.java +++ b/test/unit/org/apache/cassandra/db/marshal/DynamicCompositeTypeTest.java @@ -196,7 +196,7 @@ public void testFullRound() throws Exception addColumn(rm, cname4); addColumn(rm, cname2); addColumn(rm, cname3); - rm.apply(); + rm.applyUnsafe(); ColumnFamily cf = cfs.getColumnFamily(QueryFilter.getIdentityFilter(Util.dk("k"), CF_STANDARDDYNCOMPOSITE, System.currentTimeMillis())); diff --git a/test/unit/org/apache/cassandra/io/sstable/IndexSummaryManagerTest.java b/test/unit/org/apache/cassandra/io/sstable/IndexSummaryManagerTest.java index 83c9daa2c827..72cc80c136cc 100644 --- a/test/unit/org/apache/cassandra/io/sstable/IndexSummaryManagerTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/IndexSummaryManagerTest.java @@ -432,7 +432,7 @@ public void testRebuildAtSamplingLevel() throws IOException DecoratedKey key = Util.dk(String.valueOf(row)); Mutation rm = new Mutation(ksname, key.getKey()); rm.add(cfname, Util.cellname("column"), value, 0); - rm.apply(); + rm.applyUnsafe(); } cfs.forceBlockingFlush(); @@ -492,7 +492,7 @@ public void testJMXFunctions() throws IOException DecoratedKey key = Util.dk(String.valueOf(row)); Mutation rm = new Mutation(ksname, key.getKey()); rm.add(cfname, Util.cellname("column"), value, 0); - rm.apply(); + rm.applyUnsafe(); } cfs.forceBlockingFlush(); } diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableMetadataTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableMetadataTest.java index 19d984a7b5f6..7af40fd1dc8e 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableMetadataTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableMetadataTest.java @@ -87,14 +87,14 @@ public void testTrackMaxDeletionTime() ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp, 10 + j); - rm.apply(); + rm.applyUnsafe(); } Mutation rm = new Mutation(KEYSPACE1, Util.dk("longttl").getKey()); rm.add("Standard1", cellname("col"), ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp, 10000); - rm.apply(); + rm.applyUnsafe(); store.forceBlockingFlush(); assertEquals(1, store.getSSTables().size()); int ttltimestamp = (int)(System.currentTimeMillis()/1000); @@ -110,7 +110,7 @@ public void testTrackMaxDeletionTime() ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp, 20000); - rm.apply(); + rm.applyUnsafe(); ttltimestamp = (int) (System.currentTimeMillis()/1000); store.forceBlockingFlush(); assertEquals(2, store.getSSTables().size()); @@ -162,7 +162,7 @@ public void testWithDeletes() throws ExecutionException, InterruptedException ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp, 1000); - rm.apply(); + rm.applyUnsafe(); store.forceBlockingFlush(); assertEquals(1,store.getSSTables().size()); int ttltimestamp = (int) (System.currentTimeMillis()/1000); @@ -174,7 +174,7 @@ public void testWithDeletes() throws ExecutionException, InterruptedException } rm = new Mutation(KEYSPACE1, key.getKey()); rm.delete("Standard2", cellname("todelete"), timestamp + 1); - rm.apply(); + rm.applyUnsafe(); store.forceBlockingFlush(); assertEquals(2,store.getSSTables().size()); boolean foundDelete = false; @@ -209,7 +209,7 @@ public void trackMaxMinColNames() throws CharacterCodingException, ExecutionExce { rm.add("Standard3", cellname(j + "col" + i), ByteBufferUtil.EMPTY_BYTE_BUFFER, System.currentTimeMillis()); } - rm.apply(); + rm.applyUnsafe(); } store.forceBlockingFlush(); assertEquals(1, store.getSSTables().size()); @@ -224,7 +224,7 @@ public void trackMaxMinColNames() throws CharacterCodingException, ExecutionExce { rm.add("Standard3", cellname(9 + "col" + i), ByteBufferUtil.EMPTY_BYTE_BUFFER, System.currentTimeMillis()); } - rm.apply(); + rm.applyUnsafe(); store.forceBlockingFlush(); store.forceMajorCompaction(); @@ -262,7 +262,7 @@ public void testMaxMinComposites() throws CharacterCodingException, ExecutionExc Mutation rm = new Mutation(KEYSPACE1, key); CellName colName = type.makeCellName(ByteBufferUtil.bytes("a"+(9-i)), ByteBufferUtil.bytes(i)); rm.add("StandardComposite2", colName, ByteBufferUtil.EMPTY_BYTE_BUFFER, 0); - rm.apply(); + rm.applyUnsafe(); } cfs.forceBlockingFlush(); @@ -272,7 +272,7 @@ public void testMaxMinComposites() throws CharacterCodingException, ExecutionExc Mutation rm = new Mutation(KEYSPACE1, key); CellName colName = type.makeCellName(ByteBufferUtil.bytes("b"+(9-i)), ByteBufferUtil.bytes(i)); rm.add("StandardComposite2", colName, ByteBufferUtil.EMPTY_BYTE_BUFFER, 0); - rm.apply(); + rm.applyUnsafe(); } cfs.forceBlockingFlush(); cfs.forceMajorCompaction(); @@ -298,7 +298,7 @@ public void testLegacyCounterShardTracking() state.writeRemote(CounterId.fromInt(3), 1L, 1L); ColumnFamily cells = ArrayBackedSortedColumns.factory.create(cfs.metadata); cells.addColumn(new BufferCounterCell(cellname("col"), state.context, 1L, Long.MIN_VALUE)); - new Mutation(Util.dk("k").getKey(), cells).apply(); + new Mutation(Util.dk("k").getKey(), cells).applyUnsafe(); cfs.forceBlockingFlush(); assertTrue(cfs.getSSTables().iterator().next().getSSTableMetadata().hasLegacyCounterShards); cfs.truncateBlocking(); @@ -309,7 +309,7 @@ public void testLegacyCounterShardTracking() state.writeRemote(CounterId.fromInt(3), 1L, 1L); cells = ArrayBackedSortedColumns.factory.create(cfs.metadata); cells.addColumn(new BufferCounterCell(cellname("col"), state.context, 1L, Long.MIN_VALUE)); - new Mutation(Util.dk("k").getKey(), cells).apply(); + new Mutation(Util.dk("k").getKey(), cells).applyUnsafe(); cfs.forceBlockingFlush(); assertTrue(cfs.getSSTables().iterator().next().getSSTableMetadata().hasLegacyCounterShards); cfs.truncateBlocking(); @@ -320,7 +320,7 @@ public void testLegacyCounterShardTracking() state.writeLocal(CounterId.fromInt(2), 1L, 1L); cells = ArrayBackedSortedColumns.factory.create(cfs.metadata); cells.addColumn(new BufferCounterCell(cellname("col"), state.context, 1L, Long.MIN_VALUE)); - new Mutation(Util.dk("k").getKey(), cells).apply(); + new Mutation(Util.dk("k").getKey(), cells).applyUnsafe(); cfs.forceBlockingFlush(); assertTrue(cfs.getSSTables().iterator().next().getSSTableMetadata().hasLegacyCounterShards); cfs.truncateBlocking(); @@ -330,7 +330,7 @@ public void testLegacyCounterShardTracking() state.writeGlobal(CounterId.fromInt(1), 1L, 1L); cells = ArrayBackedSortedColumns.factory.create(cfs.metadata); cells.addColumn(new BufferCounterCell(cellname("col"), state.context, 1L, Long.MIN_VALUE)); - new Mutation(Util.dk("k").getKey(), cells).apply(); + new Mutation(Util.dk("k").getKey(), cells).applyUnsafe(); cfs.forceBlockingFlush(); assertFalse(cfs.getSSTables().iterator().next().getSSTableMetadata().hasLegacyCounterShards); cfs.truncateBlocking(); diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java index 01ca340c3117..921ccf45cd5f 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java @@ -119,7 +119,7 @@ public void testGetPositionsForRanges() throws ExecutionException, InterruptedEx ByteBuffer key = ByteBufferUtil.bytes(String.valueOf(j)); Mutation rm = new Mutation(KEYSPACE1, key); rm.add("Standard2", cellname("0"), ByteBufferUtil.EMPTY_BYTE_BUFFER, j); - rm.apply(); + rm.applyUnsafe(); } store.forceBlockingFlush(); CompactionManager.instance.performMaximal(store); @@ -160,7 +160,7 @@ public void testSpannedIndexPositions() throws IOException, ExecutionException, ByteBuffer key = ByteBufferUtil.bytes(String.valueOf(j)); Mutation rm = new Mutation(KEYSPACE1, key); rm.add("Standard1", cellname("0"), ByteBufferUtil.EMPTY_BYTE_BUFFER, j); - rm.apply(); + rm.applyUnsafe(); } store.forceBlockingFlush(); CompactionManager.instance.performMaximal(store); @@ -195,7 +195,7 @@ public void testPersistentStatistics() ByteBuffer key = ByteBufferUtil.bytes(String.valueOf(j)); Mutation rm = new Mutation(KEYSPACE1, key); rm.add("Standard1", cellname("0"), ByteBufferUtil.EMPTY_BYTE_BUFFER, j); - rm.apply(); + rm.applyUnsafe(); } store.forceBlockingFlush(); @@ -223,7 +223,7 @@ public void testGetPositionsForRangesWithKeyCache() throws ExecutionException, I ByteBuffer key = ByteBufferUtil.bytes(String.valueOf(j)); Mutation rm = new Mutation(KEYSPACE1, key); rm.add("Standard2", cellname("0"), ByteBufferUtil.EMPTY_BYTE_BUFFER, j); - rm.apply(); + rm.applyUnsafe(); } store.forceBlockingFlush(); CompactionManager.instance.performMaximal(store); @@ -252,7 +252,7 @@ public void testPersistentStatisticsWithSecondaryIndex() ByteBuffer key = ByteBufferUtil.bytes(String.valueOf("k1")); Mutation rm = new Mutation(KEYSPACE1, key); rm.add("Indexed1", cellname("birthdate"), ByteBufferUtil.bytes(1L), System.currentTimeMillis()); - rm.apply(); + rm.applyUnsafe(); store.forceBlockingFlush(); // check if opening and querying works @@ -285,7 +285,7 @@ public void testOpeningSSTable() throws Exception Mutation rm = new Mutation(ks, key.getKey()); rm.add(cf, cellname("col"), ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp); - rm.apply(); + rm.applyUnsafe(); } store.forceBlockingFlush(); @@ -308,7 +308,7 @@ public void testLoadingSummaryUsesCorrectPartitioner() throws Exception ByteBuffer key = ByteBufferUtil.bytes(String.valueOf("k1")); Mutation rm = new Mutation(KEYSPACE1, key); rm.add("Indexed1", cellname("birthdate"), ByteBufferUtil.bytes(1L), System.currentTimeMillis()); - rm.apply(); + rm.applyUnsafe(); store.forceBlockingFlush(); ColumnFamilyStore indexCfs = store.indexManager.getIndexForColumn(ByteBufferUtil.bytes("birthdate")).getIndexCfs(); @@ -335,7 +335,7 @@ public void testGetScannerForNoIntersectingRanges() ByteBuffer key = ByteBufferUtil.bytes(String.valueOf("k1")); Mutation rm = new Mutation(KEYSPACE1, key); rm.add("Standard1", cellname("xyz"), ByteBufferUtil.bytes("abc"), 0); - rm.apply(); + rm.applyUnsafe(); store.forceBlockingFlush(); boolean foundScanner = false; for (SSTableReader s : store.getSSTables()) @@ -362,7 +362,7 @@ public void testGetPositionsForRangesFromTableOpenedForBulkLoading() throws IOEx ByteBuffer key = ByteBufferUtil.bytes(String.valueOf(j)); Mutation rm = new Mutation(KEYSPACE1, key); rm.add("Standard2", cellname("0"), ByteBufferUtil.EMPTY_BYTE_BUFFER, j); - rm.apply(); + rm.applyUnsafe(); } store.forceBlockingFlush(); CompactionManager.instance.performMaximal(store); @@ -396,7 +396,7 @@ public void testIndexSummaryReplacement() throws IOException, ExecutionException ByteBuffer key = ByteBufferUtil.bytes(String.format("%3d", j)); Mutation rm = new Mutation(KEYSPACE1, key); rm.add("StandardLowIndexInterval", Util.cellname("0"), ByteBufferUtil.bytes(String.format("%3d", j)), j); - rm.apply(); + rm.applyUnsafe(); } store.forceBlockingFlush(); CompactionManager.instance.performMaximal(store); diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableScannerTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableScannerTest.java index 681efb694367..d0449478ebfb 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableScannerTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableScannerTest.java @@ -86,7 +86,7 @@ private static void insertRowWithKey(int key) DecoratedKey decoratedKey = Util.dk(toKey(key)); Mutation rm = new Mutation(KEYSPACE, decoratedKey.getKey()); rm.add(TABLE, Util.cellname("col"), ByteBufferUtil.EMPTY_BYTE_BUFFER, timestamp, 1000); - rm.apply(); + rm.applyUnsafe(); } private static void assertScanMatches(SSTableReader sstable, int scanStart, int scanEnd, int expectedStart, int expectedEnd) diff --git a/test/unit/org/apache/cassandra/streaming/StreamingTransferTest.java b/test/unit/org/apache/cassandra/streaming/StreamingTransferTest.java index 52b2236a35af..d7e5f45df74c 100644 --- a/test/unit/org/apache/cassandra/streaming/StreamingTransferTest.java +++ b/test/unit/org/apache/cassandra/streaming/StreamingTransferTest.java @@ -264,7 +264,7 @@ public void mutate(String key, String col, long timestamp) throws Exception cf.addColumn(new BufferCell(cellname("birthdate"), ByteBufferUtil.bytes(val), timestamp)); Mutation rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes(key), cf); logger.debug("Applying row to transfer {}", rm); - rm.apply(); + rm.applyUnsafe(); } }, transferSSTables); @@ -304,7 +304,7 @@ public void testTransferRangeTombstones() throws Exception // add RangeTombstones cf.delete(new DeletionInfo(cellname(2), cellname(3), cf.getComparator(), 1, (int) (System.currentTimeMillis() / 1000))); cf.delete(new DeletionInfo(cellname(5), cellname(7), cf.getComparator(), 1, (int) (System.currentTimeMillis() / 1000))); - rm.apply(); + rm.applyUnsafe(); cfs.forceBlockingFlush(); SSTableReader sstable = cfs.getSSTables().iterator().next(); @@ -488,7 +488,7 @@ public void mutate(String key, String colName, long timestamp) throws Exception cf.addColumn(new BufferCell(cellname("birthdate"), ByteBufferUtil.bytes(new Date(timestamp).toString()), timestamp)); Mutation rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes(key), cf); logger.debug("Applying row to transfer {}", rm); - rm.apply(); + rm.applyUnsafe(); } }; // write a lot more data so the data is spread in more than 1 chunk. From ae03e1bab709bcadcd973899be04e0c06a7df7a9 Mon Sep 17 00:00:00 2001 From: Josh McKenzie Date: Wed, 9 Jul 2014 15:51:51 -0500 Subject: [PATCH 071/557] Fix race condition during pending range calculation Patch by Josh McKenzie; reviewed by Tyler Hobbs for CASSANDRA-7390 --- CHANGES.txt | 1 + .../cassandra/locator/TokenMetadata.java | 129 ++++++++++++++- .../PendingRangeCalculatorService.java | 154 +++--------------- .../apache/cassandra/service/MoveTest.java | 15 +- 4 files changed, 159 insertions(+), 140 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index ff0a1c618401..f2cd8449dda0 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -11,6 +11,7 @@ * Switch external naming of 'column families' to 'tables' (CASSANDRA-4369) * Shorten SSTable path (CASSANDRA-6962) * Use unsafe mutations for most unit tests (CASSANDRA-6969) + * Fix race condition during calculation of pending ranges (CASSANDRA-7390) 2.1.1 diff --git a/src/java/org/apache/cassandra/locator/TokenMetadata.java b/src/java/org/apache/cassandra/locator/TokenMetadata.java index f41b1e7c502e..c4e35429ee45 100644 --- a/src/java/org/apache/cassandra/locator/TokenMetadata.java +++ b/src/java/org/apache/cassandra/locator/TokenMetadata.java @@ -752,9 +752,123 @@ public List> getPendingRanges(String keyspaceName, InetAddress endp return ranges; } - public void setPendingRanges(String keyspaceName, Multimap, InetAddress> rangeMap) + /** + * Calculate pending ranges according to bootsrapping and leaving nodes. Reasoning is: + * + * (1) When in doubt, it is better to write too much to a node than too little. That is, if + * there are multiple nodes moving, calculate the biggest ranges a node could have. Cleaning + * up unneeded data afterwards is better than missing writes during movement. + * (2) When a node leaves, ranges for other nodes can only grow (a node might get additional + * ranges, but it will not lose any of its current ranges as a result of a leave). Therefore + * we will first remove _all_ leaving tokens for the sake of calculation and then check what + * ranges would go where if all nodes are to leave. This way we get the biggest possible + * ranges with regard current leave operations, covering all subsets of possible final range + * values. + * (3) When a node bootstraps, ranges of other nodes can only get smaller. Without doing + * complex calculations to see if multiple bootstraps overlap, we simply base calculations + * on the same token ring used before (reflecting situation after all leave operations have + * completed). Bootstrapping nodes will be added and removed one by one to that metadata and + * checked what their ranges would be. This will give us the biggest possible ranges the + * node could have. It might be that other bootstraps make our actual final ranges smaller, + * but it does not matter as we can clean up the data afterwards. + * + * NOTE: This is heavy and ineffective operation. This will be done only once when a node + * changes state in the cluster, so it should be manageable. + */ + public void calculatePendingRanges(AbstractReplicationStrategy strategy, String keyspaceName) { - pendingRanges.put(keyspaceName, rangeMap); + lock.readLock().lock(); + try + { + Multimap, InetAddress> newPendingRanges = HashMultimap.create(); + + if (bootstrapTokens.isEmpty() && leavingEndpoints.isEmpty() && movingEndpoints.isEmpty() && relocatingTokens.isEmpty()) + { + if (logger.isDebugEnabled()) + logger.debug("No bootstrapping, leaving or moving nodes, and no relocating tokens -> empty pending ranges for {}", keyspaceName); + + pendingRanges.put(keyspaceName, newPendingRanges); + return; + } + + Multimap> addressRanges = strategy.getAddressRanges(); + + // Copy of metadata reflecting the situation after all leave operations are finished. + TokenMetadata allLeftMetadata = cloneAfterAllLeft(); + + // get all ranges that will be affected by leaving nodes + Set> affectedRanges = new HashSet>(); + for (InetAddress endpoint : leavingEndpoints) + affectedRanges.addAll(addressRanges.get(endpoint)); + + // for each of those ranges, find what new nodes will be responsible for the range when + // all leaving nodes are gone. + for (Range range : affectedRanges) + { + Set currentEndpoints = ImmutableSet.copyOf(strategy.calculateNaturalEndpoints(range.right, cloneOnlyTokenMap())); + Set newEndpoints = ImmutableSet.copyOf(strategy.calculateNaturalEndpoints(range.right, allLeftMetadata)); + newPendingRanges.putAll(range, Sets.difference(newEndpoints, currentEndpoints)); + } + + // At this stage newPendingRanges has been updated according to leave operations. We can + // now continue the calculation by checking bootstrapping nodes. + + // For each of the bootstrapping nodes, simply add and remove them one by one to + // allLeftMetadata and check in between what their ranges would be. + Multimap bootstrapAddresses = bootstrapTokens.inverse(); + for (InetAddress endpoint : bootstrapAddresses.keySet()) + { + Collection tokens = bootstrapAddresses.get(endpoint); + + allLeftMetadata.updateNormalTokens(tokens, endpoint); + for (Range range : strategy.getAddressRanges(allLeftMetadata).get(endpoint)) + newPendingRanges.put(range, endpoint); + allLeftMetadata.removeEndpoint(endpoint); + } + + // At this stage newPendingRanges has been updated according to leaving and bootstrapping nodes. + // We can now finish the calculation by checking moving and relocating nodes. + + // For each of the moving nodes, we do the same thing we did for bootstrapping: + // simply add and remove them one by one to allLeftMetadata and check in between what their ranges would be. + for (Pair moving : movingEndpoints) + { + InetAddress endpoint = moving.right; // address of the moving node + + // moving.left is a new token of the endpoint + allLeftMetadata.updateNormalToken(moving.left, endpoint); + + for (Range range : strategy.getAddressRanges(allLeftMetadata).get(endpoint)) + { + newPendingRanges.put(range, endpoint); + } + + allLeftMetadata.removeEndpoint(endpoint); + } + + // Ranges being relocated. + for (Map.Entry relocating : relocatingTokens.entrySet()) + { + InetAddress endpoint = relocating.getValue(); // address of the moving node + Token token = relocating.getKey(); + + allLeftMetadata.updateNormalToken(token, endpoint); + + for (Range range : strategy.getAddressRanges(allLeftMetadata).get(endpoint)) + newPendingRanges.put(range, endpoint); + + allLeftMetadata.removeEndpoint(endpoint); + } + + pendingRanges.put(keyspaceName, newPendingRanges); + + if (logger.isDebugEnabled()) + logger.debug("Pending ranges:\n{}", (pendingRanges.isEmpty() ? "" : printPendingRanges())); + } + finally + { + lock.readLock().unlock(); + } } public Token getPredecessor(Token token) @@ -906,12 +1020,15 @@ public void clearUnsafe() lock.writeLock().lock(); try { - bootstrapTokens.clear(); tokenToEndpointMap.clear(); - topology.clear(); + endpointToHostIdMap.clear(); + bootstrapTokens.clear(); leavingEndpoints.clear(); pendingRanges.clear(); - endpointToHostIdMap.clear(); + movingEndpoints.clear(); + relocatingTokens.clear(); + sortedTokens.clear(); + topology.clear(); invalidateCachedRings(); } finally @@ -978,7 +1095,7 @@ public String toString() return sb.toString(); } - public String printPendingRanges() + private String printPendingRanges() { StringBuilder sb = new StringBuilder(); diff --git a/src/java/org/apache/cassandra/service/PendingRangeCalculatorService.java b/src/java/org/apache/cassandra/service/PendingRangeCalculatorService.java index 74624d2ee27c..2276c4a8b4e4 100644 --- a/src/java/org/apache/cassandra/service/PendingRangeCalculatorService.java +++ b/src/java/org/apache/cassandra/service/PendingRangeCalculatorService.java @@ -18,30 +18,16 @@ package org.apache.cassandra.service; -import org.apache.cassandra.utils.BiMultiValMap; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Multimap; -import com.google.common.collect.Sets; - import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutor; import org.apache.cassandra.concurrent.NamedThreadFactory; import org.apache.cassandra.config.Schema; import org.apache.cassandra.db.Keyspace; -import org.apache.cassandra.dht.Range; -import org.apache.cassandra.dht.Token; import org.apache.cassandra.locator.AbstractReplicationStrategy; -import org.apache.cassandra.locator.TokenMetadata; -import org.apache.cassandra.utils.Pair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.net.InetAddress; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.Collection; import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; public class PendingRangeCalculatorService { @@ -51,9 +37,18 @@ public class PendingRangeCalculatorService private final JMXEnabledThreadPoolExecutor executor = new JMXEnabledThreadPoolExecutor(1, Integer.MAX_VALUE, TimeUnit.SECONDS, new LinkedBlockingQueue(1), new NamedThreadFactory("PendingRangeCalculator"), "internal"); + private AtomicInteger updateJobs = new AtomicInteger(0); + public PendingRangeCalculatorService() { - executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy()); + executor.setRejectedExecutionHandler(new RejectedExecutionHandler() + { + public void rejectedExecution(Runnable r, ThreadPoolExecutor e) + { + PendingRangeCalculatorService.instance.finishUpdate(); + } + } + ); } private static class PendingRangeTask implements Runnable @@ -65,21 +60,27 @@ public void run() { calculatePendingRanges(Keyspace.open(keyspaceName).getReplicationStrategy(), keyspaceName); } + PendingRangeCalculatorService.instance.finishUpdate(); logger.debug("finished calculation for {} keyspaces in {}ms", Schema.instance.getNonSystemKeyspaces().size(), System.currentTimeMillis() - start); } } - public Future update() + private void finishUpdate() { - return executor.submit(new PendingRangeTask()); + updateJobs.decrementAndGet(); + } + + public void update() + { + updateJobs.incrementAndGet(); + executor.submit(new PendingRangeTask()); } public void blockUntilFinished() { - while (true) + // We want to be sure the job we're blocking for is actually finished and we can't trust the TPE's active job count + while (updateJobs.get() > 0) { - if (executor.getActiveCount() + executor.getPendingTasks() == 0) - break; try { Thread.sleep(100); @@ -91,117 +92,10 @@ public void blockUntilFinished() } } - /** - * Calculate pending ranges according to bootsrapping and leaving nodes. Reasoning is: - * - * (1) When in doubt, it is better to write too much to a node than too little. That is, if - * there are multiple nodes moving, calculate the biggest ranges a node could have. Cleaning - * up unneeded data afterwards is better than missing writes during movement. - * (2) When a node leaves, ranges for other nodes can only grow (a node might get additional - * ranges, but it will not lose any of its current ranges as a result of a leave). Therefore - * we will first remove _all_ leaving tokens for the sake of calculation and then check what - * ranges would go where if all nodes are to leave. This way we get the biggest possible - * ranges with regard current leave operations, covering all subsets of possible final range - * values. - * (3) When a node bootstraps, ranges of other nodes can only get smaller. Without doing - * complex calculations to see if multiple bootstraps overlap, we simply base calculations - * on the same token ring used before (reflecting situation after all leave operations have - * completed). Bootstrapping nodes will be added and removed one by one to that metadata and - * checked what their ranges would be. This will give us the biggest possible ranges the - * node could have. It might be that other bootstraps make our actual final ranges smaller, - * but it does not matter as we can clean up the data afterwards. - * - * NOTE: This is heavy and ineffective operation. This will be done only once when a node - * changes state in the cluster, so it should be manageable. - */ + // public & static for testing purposes public static void calculatePendingRanges(AbstractReplicationStrategy strategy, String keyspaceName) { - TokenMetadata tm = StorageService.instance.getTokenMetadata(); - Multimap, InetAddress> pendingRanges = HashMultimap.create(); - BiMultiValMap bootstrapTokens = tm.getBootstrapTokens(); - Set leavingEndpoints = tm.getLeavingEndpoints(); - - if (bootstrapTokens.isEmpty() && leavingEndpoints.isEmpty() && tm.getMovingEndpoints().isEmpty() && tm.getRelocatingRanges().isEmpty()) - { - if (logger.isDebugEnabled()) - logger.debug("No bootstrapping, leaving or moving nodes, and no relocating tokens -> empty pending ranges for {}", keyspaceName); - tm.setPendingRanges(keyspaceName, pendingRanges); - return; - } - - Multimap> addressRanges = strategy.getAddressRanges(); - - // Copy of metadata reflecting the situation after all leave operations are finished. - TokenMetadata allLeftMetadata = tm.cloneAfterAllLeft(); - - // get all ranges that will be affected by leaving nodes - Set> affectedRanges = new HashSet>(); - for (InetAddress endpoint : leavingEndpoints) - affectedRanges.addAll(addressRanges.get(endpoint)); - - // for each of those ranges, find what new nodes will be responsible for the range when - // all leaving nodes are gone. - for (Range range : affectedRanges) - { - Set currentEndpoints = ImmutableSet.copyOf(strategy.calculateNaturalEndpoints(range.right, tm.cloneOnlyTokenMap())); - Set newEndpoints = ImmutableSet.copyOf(strategy.calculateNaturalEndpoints(range.right, allLeftMetadata)); - pendingRanges.putAll(range, Sets.difference(newEndpoints, currentEndpoints)); - } - - // At this stage pendingRanges has been updated according to leave operations. We can - // now continue the calculation by checking bootstrapping nodes. - - // For each of the bootstrapping nodes, simply add and remove them one by one to - // allLeftMetadata and check in between what their ranges would be. - Multimap bootstrapAddresses = bootstrapTokens.inverse(); - for (InetAddress endpoint : bootstrapAddresses.keySet()) - { - Collection tokens = bootstrapAddresses.get(endpoint); - - allLeftMetadata.updateNormalTokens(tokens, endpoint); - for (Range range : strategy.getAddressRanges(allLeftMetadata).get(endpoint)) - pendingRanges.put(range, endpoint); - allLeftMetadata.removeEndpoint(endpoint); - } - - // At this stage pendingRanges has been updated according to leaving and bootstrapping nodes. - // We can now finish the calculation by checking moving and relocating nodes. - - // For each of the moving nodes, we do the same thing we did for bootstrapping: - // simply add and remove them one by one to allLeftMetadata and check in between what their ranges would be. - for (Pair moving : tm.getMovingEndpoints()) - { - InetAddress endpoint = moving.right; // address of the moving node - - // moving.left is a new token of the endpoint - allLeftMetadata.updateNormalToken(moving.left, endpoint); - - for (Range range : strategy.getAddressRanges(allLeftMetadata).get(endpoint)) - { - pendingRanges.put(range, endpoint); - } - - allLeftMetadata.removeEndpoint(endpoint); - } - - // Ranges being relocated. - for (Map.Entry relocating : tm.getRelocatingRanges().entrySet()) - { - InetAddress endpoint = relocating.getValue(); // address of the moving node - Token token = relocating.getKey(); - - allLeftMetadata.updateNormalToken(token, endpoint); - - for (Range range : strategy.getAddressRanges(allLeftMetadata).get(endpoint)) - pendingRanges.put(range, endpoint); - - allLeftMetadata.removeEndpoint(endpoint); - } - - tm.setPendingRanges(keyspaceName, pendingRanges); - - if (logger.isDebugEnabled()) - logger.debug("Pending ranges:\n{}", (pendingRanges.isEmpty() ? "" : tm.printPendingRanges())); + StorageService.instance.getTokenMetadata().calculatePendingRanges(strategy, keyspaceName); } } diff --git a/test/unit/org/apache/cassandra/service/MoveTest.java b/test/unit/org/apache/cassandra/service/MoveTest.java index c01f4af1b5be..1ee71dd29c88 100644 --- a/test/unit/org/apache/cassandra/service/MoveTest.java +++ b/test/unit/org/apache/cassandra/service/MoveTest.java @@ -29,6 +29,7 @@ import org.apache.cassandra.gms.Gossiper; import org.junit.AfterClass; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; @@ -73,6 +74,13 @@ public static void tearDown() StorageService.instance.setPartitionerUnsafe(oldPartitioner); } + @Before + public void clearTokenMetadata() + { + PendingRangeCalculatorService.instance.blockUntilFinished(); + StorageService.instance.getTokenMetadata().clearUnsafe(); + } + /* * Test whether write endpoints is correct when the node is moving. Uses * StorageService.onChange and does not manipulate token metadata directly. @@ -85,7 +93,6 @@ public void newTestWriteEndpointsDuringMove() throws Exception final int MOVING_NODE = 3; // index of the moving node TokenMetadata tmd = ss.getTokenMetadata(); - tmd.clearUnsafe(); VersionedValue.VersionedValueFactory valueFactory = new VersionedValue.VersionedValueFactory(partitioner); ArrayList endpointTokens = new ArrayList(); @@ -141,7 +148,7 @@ public void newTestWriteEndpointsDuringMove() throws Exception numMoved++; } } - assertEquals("mismatched number of moved token", numMoved, 1); + assertEquals("mismatched number of moved token", 1, numMoved); } // moving endpoint back to the normal state @@ -157,7 +164,6 @@ public void testSimultaneousMove() throws UnknownHostException StorageService ss = StorageService.instance; final int RING_SIZE = 10; TokenMetadata tmd = ss.getTokenMetadata(); - tmd.clearUnsafe(); IPartitioner partitioner = new RandomPartitioner(); VersionedValue.VersionedValueFactory valueFactory = new VersionedValue.VersionedValueFactory(partitioner); @@ -195,6 +201,8 @@ public void testSimultaneousMove() throws UnknownHostException ss.onChange(boot1, ApplicationState.STATUS, valueFactory.bootstrapping(Collections.singleton(keyTokens.get(5)))); + PendingRangeCalculatorService.instance.blockUntilFinished(); + InetAddress boot2 = InetAddress.getByName("127.0.1.2"); Gossiper.instance.initializeNodeUnsafe(boot2, UUID.randomUUID(), 1); Gossiper.instance.injectApplicationState(boot2, ApplicationState.TOKENS, valueFactory.tokens(Collections.singleton(keyTokens.get(7)))); @@ -498,7 +506,6 @@ public void testStateJumpToNormal() throws UnknownHostException { StorageService ss = StorageService.instance; TokenMetadata tmd = ss.getTokenMetadata(); - tmd.clearUnsafe(); IPartitioner partitioner = new RandomPartitioner(); VersionedValue.VersionedValueFactory valueFactory = new VersionedValue.VersionedValueFactory(partitioner); From ca431888efd91bb8a7900c0219bd821744153686 Mon Sep 17 00:00:00 2001 From: Benedict Elliott Smith Date: Tue, 15 Jul 2014 18:20:48 +0100 Subject: [PATCH 072/557] ninja fix comments in SharedExecutorPool --- .../concurrent/SharedExecutorPool.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/java/org/apache/cassandra/concurrent/SharedExecutorPool.java b/src/java/org/apache/cassandra/concurrent/SharedExecutorPool.java index e03ec5717475..161b326d9c4f 100644 --- a/src/java/org/apache/cassandra/concurrent/SharedExecutorPool.java +++ b/src/java/org/apache/cassandra/concurrent/SharedExecutorPool.java @@ -35,17 +35,22 @@ * To keep producers from incurring unnecessary delays, once an executor is "spun up" (i.e. is processing tasks at a steady * rate), adding tasks to the executor often involves only placing the task on the work queue and updating the * task permits (which imposes our max queue length constraints). Only when it cannot be guaranteed the task will be serviced - * promptly does the producer have to signal a thread itself to perform the work. + * promptly, and the maximum concurrency has not been reached, does the producer have to schedule a thread itself to perform + * the work ('promptly' in this context means we already have a worker spinning for work, as described next). * - * We do this by scheduling only if - * - * The worker threads schedule themselves as far as possible: when they are assigned a task, they will attempt to spawn + * Otherwise the worker threads schedule themselves: when they are assigned a task, they will attempt to spawn * a partner worker to service any other work outstanding on the queue (if any); once they have finished the task they * will either take another (if any remaining) and repeat this, or they will attempt to assign themselves to another executor * that does have tasks remaining. If both fail, it will enter a non-busy-spinning phase, where it will sleep for a short * random interval (based upon the number of threads in this mode, so that the total amount of non-sleeping time remains - * approximately fixed regardless of the number of spinning threads), and upon waking up will again try to assign themselves - * an executor with outstanding tasks to perform. + * approximately fixed regardless of the number of spinning threads), and upon waking will again try to assign itself to + * an executor with outstanding tasks to perform. As a result of always scheduling a partner before committing to performing + * any work, with a steady state of task arrival we should generally have either one spinning worker ready to promptly respond + * to incoming work, or all possible workers actively committed to tasks. + * + * In order to prevent this executor pool acting like a noisy neighbour to other processes on the system, workers also deschedule + * themselves when it is detected that there are too many for the current rate of operation arrival. This is decided as a function + * of the total time spent spinning by all workers in an interval; as more workers spin, workers are descheduled more rapidly. */ public class SharedExecutorPool { @@ -96,4 +101,4 @@ void maybeStartSpinningWorker() if (current == 0 && spinningCount.compareAndSet(0, 1)) schedule(Work.SPINNING); } -} \ No newline at end of file +} From ae25812e39cb29c6ad0d0625eec9268e55c2fb38 Mon Sep 17 00:00:00 2001 From: Tyler Hobbs Date: Tue, 15 Jul 2014 12:23:06 -0500 Subject: [PATCH 073/557] Add missing table name to DROP INDEX responses Patch and review by Tyler Hobbs and Aleksey Yeschenko for CASSANDRA-7539 --- CHANGES.txt | 1 + .../cassandra/cql3/statements/DropIndexStatement.java | 11 +++++++++++ src/java/org/apache/cassandra/transport/Event.java | 2 ++ 3 files changed, 14 insertions(+) diff --git a/CHANGES.txt b/CHANGES.txt index 27aa624f689f..8895bf4e00b8 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -28,6 +28,7 @@ 2.1.0-final * (Windows) fix startup when WMI memory query fails (CASSANDRA-7505) * Anti-compaction proceeds if any part of the repair failed (CASANDRA-7521) + * Add missing table name to DROP INDEX responses and notifications (CASSANDRA-7539) Merged from 2.0: * (Windows) force range-based repair to non-sequential mode (CASSANDRA-7541) * Fix range merging when DES scores are zero (CASSANDRA-7535) diff --git a/src/java/org/apache/cassandra/cql3/statements/DropIndexStatement.java b/src/java/org/apache/cassandra/cql3/statements/DropIndexStatement.java index b8a4c9a8c653..0562cc6e8b5e 100644 --- a/src/java/org/apache/cassandra/cql3/statements/DropIndexStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/DropIndexStatement.java @@ -33,6 +33,9 @@ public class DropIndexStatement extends SchemaAlteringStatement public final String indexName; public final boolean ifExists; + // initialized in announceMigration() + private String indexedCF; + public DropIndexStatement(IndexName indexName, boolean ifExists) { super(indexName.getCfName()); @@ -67,6 +70,7 @@ public void announceMigration(boolean isLocalOnly) throws InvalidRequestExceptio return; CFMetaData updatedCfm = updateCFMetadata(cfm); + indexedCF = updatedCfm.cfName; MigrationManager.announceColumnFamilyUpdate(updatedCfm, false, isLocalOnly); } @@ -106,4 +110,11 @@ private ColumnDefinition findIndexedColumn(CFMetaData cfm) } return null; } + + @Override + public String columnFamily() + { + assert indexedCF != null; + return indexedCF; + } } diff --git a/src/java/org/apache/cassandra/transport/Event.java b/src/java/org/apache/cassandra/transport/Event.java index 3fa2733f4e90..1b7e4874d62a 100644 --- a/src/java/org/apache/cassandra/transport/Event.java +++ b/src/java/org/apache/cassandra/transport/Event.java @@ -218,6 +218,8 @@ public SchemaChange(Change change, Target target, String keyspace, String tableO this.target = target; this.keyspace = keyspace; this.tableOrType = tableOrType; + if (target != Target.KEYSPACE) + assert this.tableOrType != null : "Table or type should be set for non-keyspace schema change events"; } public SchemaChange(Change change, String keyspace) From 6319dc804f073b65b011c5ff87f6c320df6b7e8b Mon Sep 17 00:00:00 2001 From: Tyler Hobbs Date: Tue, 15 Jul 2014 18:18:15 -0500 Subject: [PATCH 074/557] Bump CQL version to 3.2.0 and update CQL docs Patch by Tyler Hobbs; reviewed by Aleksey Yeschenko for CASSANDRA-7527 --- CHANGES.txt | 1 + bin/cqlsh | 2 +- doc/cql3/CQL.textile | 137 ++++++++++++++++-- .../apache/cassandra/cql3/QueryProcessor.java | 2 +- 4 files changed, 127 insertions(+), 15 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 79748cb27299..75bf34002944 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -31,6 +31,7 @@ * (Windows) fix startup when WMI memory query fails (CASSANDRA-7505) * Anti-compaction proceeds if any part of the repair failed (CASANDRA-7521) * Add missing table name to DROP INDEX responses and notifications (CASSANDRA-7539) + * Bump CQL version to 3.2.0 and update CQL documentation (CASSANDRA-7527) Merged from 2.0: * (Windows) force range-based repair to non-sequential mode (CASSANDRA-7541) * Fix range merging when DES scores are zero (CASSANDRA-7535) diff --git a/bin/cqlsh b/bin/cqlsh index 9a6d5361ff77..4665024367aa 100755 --- a/bin/cqlsh +++ b/bin/cqlsh @@ -139,7 +139,7 @@ if os.path.exists(OLD_HISTORY): DEFAULT_HOST = '127.0.0.1' DEFAULT_PORT = 9042 -DEFAULT_CQLVER = '3.1.7' +DEFAULT_CQLVER = '3.2.0' DEFAULT_TIME_FORMAT = '%Y-%m-%d %H:%M:%S%z' DEFAULT_FLOAT_PRECISION = 5 diff --git a/doc/cql3/CQL.textile b/doc/cql3/CQL.textile index 0c1d2b993df6..2d45cf1d03ff 100644 --- a/doc/cql3/CQL.textile +++ b/doc/cql3/CQL.textile @@ -1,6 +1,6 @@ -h1. Cassandra Query Language (CQL) v3.1.7 +h1. Cassandra Query Language (CQL) v3.2.0 @@ -216,7 +216,7 @@ __Syntax:__ bc(syntax).. ::= CREATE ( TABLE | COLUMNFAMILY ) ( IF NOT EXISTS )? - '(' ( ',' )* ')' + '(' ( ',' )* ')' ( WITH
    '] (as )*; - get [''][''][''] (as )*; - get ['']['']; - get [''][]; - get [function()][()][()]; - get where [ - and and ...] [limit ]; - get where () [ - and and ...] [limit ]; - - Gets columns or super columns for the specified column family and key. Or - returns all columns from rows which meet the specified criteria when using - the 'where' form. - - Note: The implementation of secondary indexes in Cassandra 0.7 has some - restrictions, see - http://www.datastax.com/dev/blog/whats-new-Cassandra-07-secondary-indexes - - Required Parameters: - - cf: Name of the column family to read from. - - Optional Parameters: - - col: Name of the column to read. Or in the 'where' form name of the column - to test the value of. - - - function: Name of a function to call to parse the supplied argument to the - specified type. Some functions will generate values without needing an - argument. - - Valid options are: - - ascii - - bytes: if used without arguments generates a zero length byte array - - int - - integer - - lexicaluuid: if used without arguments generates a new random uuid - - long - - timeuuid: if used without arguments generates a new time uuid - - utf8 - - - key: Key for the row to read columns from. This parameter is - required in all cases except when the 'where' clause is used. - - - limit: Number of rows to return. Default is 100. - - - operator: Operator to test the column value with. Supported operators are - =, >, >=, <, <= . - - In Cassandra 0.7 at least one = operator must be present. - - - super: Name of the super column to read from. If super is supplied without - col then all columns from the super column are returned. - - - type: Data type to interpret the the columns value as for display. - - Valid options are: - - AsciiType - - BooleanType - - BytesType - - CounterColumnType (distributed counter column) - - DateType - - DoubleType - - FloatType - - Int32Type - - IntegerType (a generic variable-length integer type) - - LexicalUUIDType - - LongType - - UTF8Type - - - value: The value to test the column for, if a function is provided the - value is parsed by the function. Otherwise the meta data for the target - column is used to determine the correct type. - - Examples: - get Standard1[ascii('testkey')]; - #tell cli to convert keys from ascii to bytes - assume Standard1 keys as ascii; - get Standard1[testkey][test_column] as IntegerType; - get Standard1[testkey][utf8(hello)]; - get Indexed1 where birthdate=19750403; - - name: NODE_THRIFT_SET - help: | - set [''][''] = ; - set [''][''][''] = ; - set [''][''] = (); - set [''][''][''] = (); - set [][()] = || ; - set [()][() || ] = - || with ttl = ; - - Sets the column value for the specified column family and key. - - Required Parameters: - - cf: Name of the column family to set columns in. - - - col: Name of the column to set. - - - key: Key for the row to set columns in. - - Optional Parameters: - - function: Name of a function to call to parse the supplied argument to the - specified type. Some functions will generate values without needing an - argument. - - Valid options are: - - ascii - - bytes: if used without arguments generates a zero length byte array - - int - - integer - - lexicaluuid: if used without arguments generates a new random uuid - - long - - timeuuid: if used without arguments generates a new time uuid - - utf8 - - - secs: Time To Live for the column in seconds. Defaults to no ttl. - - - super: Name of the super column to contain the column. - - - value: The value to set the column to. - - Examples: - set Super1[ascii('testkey')][ascii('my super')][ascii('test col')]='this is a test'; - set Standard1['testkey']['test col']='this is also a test'; - set Standard1[testkey][testcol] = utf8('this is utf8 string.'); - set Standard1[testkey][timeuuid()] = utf8('hello world'); - set Standard1[testkey][timeuuid()] = utf8('hello world') with ttl = 30; - set UseComposites[utf8('testkey')]['CompositeType(utf8(first),int(4))'] = utf8('inserts this string into a column with name first:4'); - - name: NODE_THRIFT_DEL - help: | - del ['']; - del ['']['']; - del ['']['']; - del ['']['']['']; - del [()][()][()]; - - Deletes a row, a column, or a subcolumn. - - Required Parameters: - - cf: Name of the column family to delete from. - - - key: Key for the row delete from. - - Optional Parameters: - - col: Name of the column to delete. - - - function: Name of a function to call to parse the supplied argument to the - specified type. Some functions will generate values without needing an - argument. - - Supported values are: - - ascii - - bytes: if used without arguments generates a zero length byte array - - int - - integer - - lexicaluuid: if used without arguments generates a new random uuid - - long - - double - - timeuuid: if used without arguments generates a new time uuid - - utf8 - - - super: Name of the super column to delete from. If col is not specified - the super column and all sub columns will be deleted. - - Examples: - del Super1[ascii('testkey')][ascii('my_super')][ascii('test_col')]; - del Standard1['testkey'][ascii('test col')]; - del Standard1['testkey']; - del Standard1[utf8('testkey')]; - - name: NODE_THRIFT_COUNT - help: | - count ['']; - count ['']['']; - - Count the number of columns in the row with the specified key, or - subcolumns in the specified super column. - - Required Parameters: - - cf: Name of the column family to read from.. - - - key: Key for the row to count. - - Optional Parameters: - - super: Name of the super column to count subcolumns in. - - Examples: - count Super1['testkey']['my super']; - count Standard1['testkey']; - - name: NODE_LIST - help: | - list ; - list [:]; - list [:]; - list [:] limit ; - list [:] ?(limit ) ?(columns ?(reversed)); - - List a range of rows, and all of their columns, in the specified column - family. - - The order of rows returned is dependant on the Partitioner in use. - - Required Parameters: - - cf: Name of the column family to list rows from. - - Optional Parameters: - - endKey: Key to end the range at. The end key will be included - in the result. Defaults to an empty byte array. - - - limit: Number of rows to return. Default is 100. - - - columns: Number of columns to return per row, Default to MAX_INTEGER. reversed - - columns in reverse order. - - - startKey: Key start the range from. The start key will be - included in the result. Defaults to an empty byte array. - - Examples: - list Standard1; - list Super1[j:]; - list Standard1[j:k] limit 40; - list Standard1 columns 2; - list Standard1 limit 40 columns 0; - list Standard1 columns 3 reversed; - - name: NODE_TRUNCATE - help: | - truncate ; - - Truncate specified column family. - - Note: All nodes in the cluster must be up to truncate command to execute. - - A snapshot of the data is created, which is deleted asyncronously during a - 'graveyard' compaction. - - Required Parameters: - - cf: Name of the column family to truncate. - - Examples: - truncate Standard1; - - name: NODE_ASSUME - help: | - assume comparator as ; - assume sub_comparator as ; - assume validator as ; - assume keys as ; - - Assume one of the attributes (comparator, sub_comparator, validator or keys) - of the given column family match specified type. The specified type will - be used when displaying data returned from the column family. - - This statement does not change the column family definition stored in - Cassandra. It only affects the cli and how it will transform values - to be sent to and interprets results from Cassandra. - - If results from Cassandra do not validate according to the assumptions an - error is displayed in the cli. - - Required Parameters: - - cf: Name of the column family to make the assumption about. - - - type: Validator type to use when processing values. - - Supported values are: - - ascii - - bytes - - counterColumn (distributed counter column) - - int - - integer (a generic variable-length integer type) - - lexicalUUID - - long - - utf8 - - It is also valid to specify the fully-qualified class name to a class that - extends org.apache.cassandra.db.marshal.AbstractType. - - Examples: - assume Standard1 comparator as lexicaluuid; - assume Standard1 keys as ascii; - - name: NODE_THRIFT_INCR - help: | - incr [''][''] [by ]; - incr [''][''][''] [by ]; - - Increment the specified counter column by the supplied value. - - Note: Counter columns must be defined using a 'create column family' or - 'update column family' statement in the column_metadata as using the - ColumnCounterType validator. - - Required Parameters: - - cf: Name of the column family to increment the column in. - - - col: Name of the counter column to increment. - - - key: Key for the row to increment the counter in. - - Optional Parameters: - - super: Name of the super column that contains the counter column. - - - value: Signed integer value to increment the column by. If not supplied - 1 is used. - - Examples: - incr Counter1[ascii('testkey')][ascii('test col')]; - incr SuperCounter1[ascii('testkey')][ascii('my super')][ascii('test col')] by 42; - incr Counter1[ascii('testkey')][ascii('test col')] by -4; - - name: NODE_THRIFT_DECR - help: | - decr [''][''] [by ]; - decr [''][''][''] [by ]; - - Decrement the specified column by the supplied value. - - Note: Counter columns must be defined using a 'create column family' or - 'update column family' statement in the column_metadata as using the - ColumnCounterType validator. - - Required Parameters: - - cf: Name of the column family to decrement the column in. - - - col: Name of the counter column to increment. - - - key: Key for the row to decrement the counter in. - - Optional Parameters: - - super: Name of the super column that contains the counter column. - - - value: Signed integer value to decrement the column by. If not supplied - 1 is used. - - Examples: - decr Counter1[ascii('testkey')][ascii('test col')]; - decr SuperCounter1[ascii('testkey')][ascii('my super')][ascii('test col')] by 42; - decr Counter1[ascii('testkey')][ascii('test col')] by 10; - - name: NODE_CONSISTENCY_LEVEL - help: | - consistencylevel as - - Sets the consistency level for the client to use. Defaults to One. - - Required Parameters: - - level: Consistency level the client should use. Value is case - insensitive. - - Supported values are: - - ONE - - TWO - - THREE - - QUORUM - - ALL - - LOCAL_QUORUM - - EACH_QUORUM - - ANY - - Note: Consistency level ANY can only be used for write operations. diff --git a/test/pig/org/apache/cassandra/pig/CqlRecordReaderTest.java b/test/pig/org/apache/cassandra/pig/CqlRecordReaderTest.java index 877d30beb5e9..a51950b90053 100644 --- a/test/pig/org/apache/cassandra/pig/CqlRecordReaderTest.java +++ b/test/pig/org/apache/cassandra/pig/CqlRecordReaderTest.java @@ -18,32 +18,20 @@ package org.apache.cassandra.pig; import java.io.IOException; -import java.nio.charset.CharacterCodingException; import java.util.Iterator; import org.junit.Assert; import org.junit.BeforeClass; -import org.junit.Ignore; import org.junit.Test; -import org.apache.cassandra.db.marshal.TimeUUIDType; -import org.apache.cassandra.db.marshal.UUIDType; import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.thrift.AuthenticationException; -import org.apache.cassandra.thrift.AuthorizationException; -import org.apache.cassandra.thrift.InvalidRequestException; -import org.apache.cassandra.thrift.NotFoundException; -import org.apache.cassandra.thrift.TimedOutException; -import org.apache.cassandra.thrift.UnavailableException; -import org.apache.cassandra.utils.Hex; -import org.apache.pig.data.DataByteArray; import org.apache.pig.data.Tuple; import org.apache.thrift.TException; -import org.apache.thrift.transport.TTransportException; public class CqlRecordReaderTest extends PigTestBase { private static String[] statements = { + "DROP KEYSPACE IF EXISTS cql3ks", "CREATE KEYSPACE cql3ks WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 1};", "USE cql3ks;", @@ -69,11 +57,11 @@ public class CqlRecordReaderTest extends PigTestBase }; @BeforeClass - public static void setup() throws TTransportException, IOException, InterruptedException, ConfigurationException, - AuthenticationException, AuthorizationException, InvalidRequestException, UnavailableException, TimedOutException, TException, NotFoundException, CharacterCodingException, ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException + public static void setup() throws IOException, InterruptedException, ConfigurationException, + TException, ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException { startCassandra(); - setupDataByCql(statements); + executeCQLStatements(statements); startHadoopCluster(); } diff --git a/test/pig/org/apache/cassandra/pig/CqlTableDataTypeTest.java b/test/pig/org/apache/cassandra/pig/CqlTableDataTypeTest.java index bbd5a873ef1c..98e170b225ea 100644 --- a/test/pig/org/apache/cassandra/pig/CqlTableDataTypeTest.java +++ b/test/pig/org/apache/cassandra/pig/CqlTableDataTypeTest.java @@ -19,24 +19,16 @@ package org.apache.cassandra.pig; import java.io.IOException; -import java.nio.charset.CharacterCodingException; import java.util.Iterator; import org.apache.cassandra.db.marshal.TimeUUIDType; import org.apache.cassandra.db.marshal.UUIDType; import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.thrift.AuthenticationException; -import org.apache.cassandra.thrift.AuthorizationException; -import org.apache.cassandra.thrift.InvalidRequestException; -import org.apache.cassandra.thrift.NotFoundException; -import org.apache.cassandra.thrift.SchemaDisagreementException; -import org.apache.cassandra.thrift.TimedOutException; -import org.apache.cassandra.thrift.UnavailableException; import org.apache.cassandra.utils.Hex; import org.apache.pig.data.DataByteArray; import org.apache.pig.data.Tuple; import org.apache.thrift.TException; -import org.apache.thrift.transport.TTransportException; + import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; @@ -64,6 +56,7 @@ public class CqlTableDataTypeTest extends PigTestBase //MAP //Create table to test the above data types private static String[] statements = { + "DROP KEYSPACE IF EXISTS cql3ks", "CREATE KEYSPACE cql3ks WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 1}", "USE cql3ks;", @@ -208,17 +201,16 @@ public class CqlTableDataTypeTest extends PigTestBase }; @BeforeClass - public static void setup() throws TTransportException, IOException, InterruptedException, ConfigurationException, - AuthenticationException, AuthorizationException, InvalidRequestException, UnavailableException, TimedOutException, TException, NotFoundException, CharacterCodingException, ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException + public static void setup() throws IOException, InterruptedException, ConfigurationException, TException, + ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException { startCassandra(); - setupDataByCql(statements); + executeCQLStatements(statements); startHadoopCluster(); } @Test - public void testCqlNativeStorageRegularType() - throws AuthenticationException, AuthorizationException, InvalidRequestException, UnavailableException, TimedOutException, TException, NotFoundException, SchemaDisagreementException, IOException + public void testCqlNativeStorageRegularType() throws TException, IOException { //input_cql=select * from cqltable where token(key) > ? and token(key) <= ? cqlTableTest("rows = LOAD 'cql://cql3ks/cqltable?" + defaultParameters + nativeParameters + "&input_cql=select%20*%20from%20cqltable%20where%20token(key)%20%3E%20%3F%20and%20token(key)%20%3C%3D%20%3F' USING CqlNativeStorage();"); @@ -288,8 +280,7 @@ private void counterTableTest(String initialQuery) throws IOException } @Test - public void testCqlNativeStorageSetType() - throws AuthenticationException, AuthorizationException, InvalidRequestException, UnavailableException, TimedOutException, TException, NotFoundException, SchemaDisagreementException, IOException + public void testCqlNativeStorageSetType() throws TException, IOException { //input_cql=select * from settable where token(key) > ? and token(key) <= ? settableTest("set_rows = LOAD 'cql://cql3ks/settable?" + defaultParameters + nativeParameters + "&input_cql=select%20*%20from%20settable%20where%20token(key)%20%3E%20%3F%20and%20token(key)%20%3C%3D%20%3F' USING CqlNativeStorage();"); @@ -355,8 +346,7 @@ private void settableTest(String initialQuery) throws IOException } @Test - public void testCqlNativeStorageListType() - throws AuthenticationException, AuthorizationException, InvalidRequestException, UnavailableException, TimedOutException, TException, NotFoundException, SchemaDisagreementException, IOException + public void testCqlNativeStorageListType() throws TException, IOException { //input_cql=select * from listtable where token(key) > ? and token(key) <= ? listtableTest("list_rows = LOAD 'cql://cql3ks/listtable?" + defaultParameters + nativeParameters + "&input_cql=select%20*%20from%20listtable%20where%20token(key)%20%3E%20%3F%20and%20token(key)%20%3C%3D%20%3F' USING CqlNativeStorage();"); @@ -422,8 +412,7 @@ private void listtableTest(String initialQuery) throws IOException } @Test - public void testCqlNativeStorageMapType() - throws AuthenticationException, AuthorizationException, InvalidRequestException, UnavailableException, TimedOutException, TException, NotFoundException, SchemaDisagreementException, IOException + public void testCqlNativeStorageMapType() throws TException, IOException { //input_cql=select * from maptable where token(key) > ? and token(key) <= ? maptableTest("map_rows = LOAD 'cql://cql3ks/maptable?" + defaultParameters + nativeParameters + "&input_cql=select%20*%20from%20maptable%20where%20token(key)%20%3E%20%3F%20and%20token(key)%20%3C%3D%20%3F' USING CqlNativeStorage();"); diff --git a/test/pig/org/apache/cassandra/pig/CqlTableTest.java b/test/pig/org/apache/cassandra/pig/CqlTableTest.java index 4ca043da4263..ecfeb63bf7c3 100644 --- a/test/pig/org/apache/cassandra/pig/CqlTableTest.java +++ b/test/pig/org/apache/cassandra/pig/CqlTableTest.java @@ -19,21 +19,12 @@ package org.apache.cassandra.pig; import java.io.IOException; -import java.nio.charset.CharacterCodingException; import java.util.Iterator; import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.thrift.AuthenticationException; -import org.apache.cassandra.thrift.AuthorizationException; -import org.apache.cassandra.thrift.InvalidRequestException; -import org.apache.cassandra.thrift.NotFoundException; -import org.apache.cassandra.thrift.SchemaDisagreementException; -import org.apache.cassandra.thrift.TimedOutException; -import org.apache.cassandra.thrift.UnavailableException; import org.apache.pig.data.DataBag; import org.apache.pig.data.Tuple; import org.apache.thrift.TException; -import org.apache.thrift.transport.TTransportException; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; @@ -41,6 +32,7 @@ public class CqlTableTest extends PigTestBase { private static String[] statements = { + "DROP KEYSPACE IF EXISTS cql3ks", "CREATE KEYSPACE cql3ks WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 1}", "USE cql3ks;", @@ -81,17 +73,16 @@ public class CqlTableTest extends PigTestBase }; @BeforeClass - public static void setup() throws TTransportException, IOException, InterruptedException, ConfigurationException, - AuthenticationException, AuthorizationException, InvalidRequestException, UnavailableException, TimedOutException, TException, NotFoundException, CharacterCodingException, ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException + public static void setup() throws IOException, InterruptedException, ConfigurationException, TException, ClassNotFoundException, + NoSuchFieldException, IllegalAccessException, InstantiationException { startCassandra(); - setupDataByCql(statements); + executeCQLStatements(statements); startHadoopCluster(); } @Test - public void testCqlNativeStorageSchema() - throws AuthenticationException, AuthorizationException, InvalidRequestException, UnavailableException, TimedOutException, TException, NotFoundException, SchemaDisagreementException, IOException + public void testCqlNativeStorageSchema() throws TException, IOException { //input_cql=select * from cqltable where token(key1) > ? and token(key1) <= ? cqlTableSchemaTest("rows = LOAD 'cql://cql3ks/cqltable?" + defaultParameters + nativeParameters + "&input_cql=select%20*%20from%20cqltable%20where%20token(key1)%20%3E%20%3F%20and%20token(key1)%20%3C%3D%20%3F' USING CqlNativeStorage();"); @@ -136,15 +127,13 @@ private void cqlTableSchemaTest(String initialQuery) throws IOException } @Test - public void testCqlNativeStorageSingleKeyTable() - throws AuthenticationException, AuthorizationException, InvalidRequestException, UnavailableException, TimedOutException, TException, NotFoundException, SchemaDisagreementException, IOException + public void testCqlNativeStorageSingleKeyTable() throws TException, IOException { //input_cql=select * from moredata where token(x) > ? and token(x) <= ? SingleKeyTableTest("moretestvalues= LOAD 'cql://cql3ks/moredata?" + defaultParameters + nativeParameters + "&input_cql=select%20*%20from%20moredata%20where%20token(x)%20%3E%20%3F%20and%20token(x)%20%3C%3D%20%3F' USING CqlNativeStorage();"); } - private void SingleKeyTableTest(String initialQuery) - throws AuthenticationException, AuthorizationException, InvalidRequestException, UnavailableException, TimedOutException, TException, NotFoundException, SchemaDisagreementException, IOException + private void SingleKeyTableTest(String initialQuery) throws TException, IOException { pig.setBatchOn(); pig.registerQuery(initialQuery); @@ -167,15 +156,13 @@ private void SingleKeyTableTest(String initialQuery) } @Test - public void testCqlNativeStorageCompositeKeyTable() - throws AuthenticationException, AuthorizationException, InvalidRequestException, UnavailableException, TimedOutException, TException, NotFoundException, SchemaDisagreementException, IOException + public void testCqlNativeStorageCompositeKeyTable() throws TException, IOException { //input_cql=select * from compmore where token(id) > ? and token(id) <= ? CompositeKeyTableTest("moredata= LOAD 'cql://cql3ks/compmore?" + defaultParameters + nativeParameters + "&input_cql=select%20*%20from%20compmore%20where%20token(id)%20%3E%20%3F%20and%20token(id)%20%3C%3D%20%3F' USING CqlNativeStorage();"); } - private void CompositeKeyTableTest(String initialQuery) - throws AuthenticationException, AuthorizationException, InvalidRequestException, UnavailableException, TimedOutException, TException, NotFoundException, SchemaDisagreementException, IOException + private void CompositeKeyTableTest(String initialQuery) throws TException, IOException { pig.setBatchOn(); pig.registerQuery(initialQuery); @@ -204,15 +191,13 @@ private void CompositeKeyTableTest(String initialQuery) } @Test - public void testCqlNativeStorageCollectionColumnTable() - throws AuthenticationException, AuthorizationException, InvalidRequestException, UnavailableException, TimedOutException, TException, NotFoundException, SchemaDisagreementException, IOException + public void testCqlNativeStorageCollectionColumnTable() throws TException, IOException { //input_cql=select * from collectiontable where token(m) > ? and token(m) <= ? CollectionColumnTableTest("collectiontable= LOAD 'cql://cql3ks/collectiontable?" + defaultParameters + nativeParameters + "&input_cql=select%20*%20from%20collectiontable%20where%20token(m)%20%3E%20%3F%20and%20token(m)%20%3C%3D%20%3F' USING CqlNativeStorage();"); } - private void CollectionColumnTableTest(String initialQuery) - throws AuthenticationException, AuthorizationException, InvalidRequestException, UnavailableException, TimedOutException, TException, NotFoundException, SchemaDisagreementException, IOException + private void CollectionColumnTableTest(String initialQuery) throws TException, IOException { pig.setBatchOn(); pig.registerQuery(initialQuery); @@ -245,7 +230,8 @@ private void CollectionColumnTableTest(String initialQuery) } @Test - public void testCassandraStorageSchema() throws IOException, ClassNotFoundException, TException, TimedOutException, NotFoundException, InvalidRequestException, NoSuchFieldException, UnavailableException, IllegalAccessException, InstantiationException + public void testCassandraStorageSchema() throws IOException, ClassNotFoundException, TException, NoSuchFieldException, + IllegalAccessException, InstantiationException { //results: (key1,{((111,),),((111,column1),100),((111,column2),10.1)}) pig.registerQuery("rows = LOAD 'cassandra://cql3ks/cqltable?" + defaultParameters + "' USING CassandraStorage();"); @@ -259,10 +245,10 @@ public void testCassandraStorageSchema() throws IOException, ClassNotFoundExcept DataBag columns = (DataBag) t.get(1); Iterator iter = columns.iterator(); int i = 0; - while(iter.hasNext()) + while (iter.hasNext()) { i++; - Tuple column = (Tuple) iter.next(); + Tuple column = iter.next(); if (i==1) { Assert.assertEquals(((Tuple) column.get(0)).get(0), 111); diff --git a/test/pig/org/apache/cassandra/pig/PigTestBase.java b/test/pig/org/apache/cassandra/pig/PigTestBase.java index 4b3e4227f1a6..8c27f6cfbe30 100644 --- a/test/pig/org/apache/cassandra/pig/PigTestBase.java +++ b/test/pig/org/apache/cassandra/pig/PigTestBase.java @@ -18,14 +18,9 @@ */ package org.apache.cassandra.pig; -import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.io.PrintStream; -import java.nio.charset.CharacterCodingException; import org.apache.cassandra.SchemaLoader; -import org.apache.cassandra.cli.CliMain; -import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.config.Schema; import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.db.marshal.TypeParser; @@ -35,11 +30,6 @@ import org.apache.cassandra.thrift.Cassandra; import org.apache.cassandra.thrift.Compression; import org.apache.cassandra.thrift.ConsistencyLevel; -import org.apache.cassandra.thrift.InvalidRequestException; -import org.apache.cassandra.thrift.NotFoundException; -import org.apache.cassandra.thrift.SchemaDisagreementException; -import org.apache.cassandra.thrift.TimedOutException; -import org.apache.cassandra.thrift.UnavailableException; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.hadoop.conf.Configuration; import org.apache.pig.ExecType; @@ -56,7 +46,6 @@ import org.apache.thrift.transport.TTransportException; import org.junit.After; import org.junit.AfterClass; -import org.junit.Assert; import org.junit.Before; public class PigTestBase extends SchemaLoader @@ -119,75 +108,20 @@ protected AbstractType parseType(String type) throws IOException { return TypeParser.parse(type); } - catch (ConfigurationException e) - { - throw new IOException(e); - } - catch (SyntaxException e) + catch (ConfigurationException | SyntaxException e) { throw new IOException(e); } } - protected static void setupDataByCli(String[] statements) throws CharacterCodingException, ClassNotFoundException, TException, TimedOutException, NotFoundException, InvalidRequestException, NoSuchFieldException, UnavailableException, IllegalAccessException, InstantiationException - { - // new error/output streams for CliSessionState - ByteArrayOutputStream errStream = new ByteArrayOutputStream(); - ByteArrayOutputStream outStream = new ByteArrayOutputStream(); - - // checking if we can connect to the running cassandra node on localhost - CliMain.connect("127.0.0.1", 9170); - - // setting new output stream - CliMain.sessionState.setOut(new PrintStream(outStream)); - CliMain.sessionState.setErr(new PrintStream(errStream)); - - // re-creating keyspace for tests - try - { - // dropping in case it exists e.g. could be left from previous run - CliMain.processStatement("drop keyspace thriftKs;"); - } - catch (Exception e) - { - } - - for (String statement : statements) - { - errStream.reset(); - System.out.println("Executing statement: " + statement); - CliMain.processStatement(statement); - String result = outStream.toString(); - System.out.println("result: " + result); - outStream.reset(); // reset stream so we have only output from next statement all the time - errStream.reset(); // no errors to the end user. - } - } - - protected static void setupDataByCql(String[] statements) throws InvalidRequestException, UnavailableException, TimedOutException, TException + protected static void executeCQLStatements(String[] statements) throws TException { Cassandra.Client client = getClient(); - // re-creating keyspace for tests - try - { - // dropping in case it exists e.g. could be left from previous run - client.execute_cql3_query(ByteBufferUtil.bytes("DROP KEYSPACE cql3ks"), Compression.NONE, ConsistencyLevel.ONE); - } - catch (Exception e) - { - } for (String statement : statements) { - try - { - System.out.println("Executing statement: " + statement); - client.execute_cql3_query(ByteBufferUtil.bytes(statement), Compression.NONE, ConsistencyLevel.ONE); - } - catch (SchemaDisagreementException e) - { - Assert.fail(); - } + System.out.println("Executing statement: " + statement); + client.execute_cql3_query(ByteBufferUtil.bytes(statement), Compression.NONE, ConsistencyLevel.ONE); } } } diff --git a/test/pig/org/apache/cassandra/pig/ThriftColumnFamilyDataTypeTest.java b/test/pig/org/apache/cassandra/pig/ThriftColumnFamilyDataTypeTest.java index cc5462057f0b..2ffd5242617c 100644 --- a/test/pig/org/apache/cassandra/pig/ThriftColumnFamilyDataTypeTest.java +++ b/test/pig/org/apache/cassandra/pig/ThriftColumnFamilyDataTypeTest.java @@ -19,181 +19,138 @@ package org.apache.cassandra.pig; import java.io.IOException; -import java.nio.charset.CharacterCodingException; -import java.util.Iterator; import org.apache.cassandra.db.marshal.TimeUUIDType; import org.apache.cassandra.db.marshal.UUIDType; import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.thrift.AuthenticationException; -import org.apache.cassandra.thrift.AuthorizationException; -import org.apache.cassandra.thrift.InvalidRequestException; -import org.apache.cassandra.thrift.NotFoundException; -import org.apache.cassandra.thrift.TimedOutException; -import org.apache.cassandra.thrift.UnavailableException; import org.apache.cassandra.utils.Hex; import org.apache.pig.data.DataBag; import org.apache.pig.data.DataByteArray; import org.apache.pig.data.Tuple; import org.apache.thrift.TException; -import org.apache.thrift.transport.TTransportException; -import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; +import static junit.framework.Assert.assertEquals; + public class ThriftColumnFamilyDataTypeTest extends PigTestBase { - //AsciiType - //LongType - //BytesType - //BooleanType - //CounterColumnType - //DecimalType - //DoubleType - //FloatType - //InetAddressType - //Int32Type - //UTF8Type - //DateType - //UUIDType - //IntegerType - //TimeUUIDType - //IntegerType - //LexicalUUIDType private static String[] statements = { - "create keyspace thriftKs with placement_strategy = 'org.apache.cassandra.locator.SimpleStrategy' and" + - " strategy_options={replication_factor:1};", - "use thriftKs;", - - "create column family SomeApp " + - " with comparator = UTF8Type " + - " and default_validation_class = UTF8Type " + - " and key_validation_class = UTF8Type " + - " and column_metadata = [" + - "{column_name: col_ascii, validation_class: AsciiType}, " + - "{column_name: col_long, validation_class: LongType}, " + - "{column_name: col_bytes, validation_class: BytesType}, " + - "{column_name: col_boolean, validation_class: BooleanType}, " + - "{column_name: col_decimal, validation_class: DecimalType}, " + - "{column_name: col_double, validation_class: DoubleType}, " + - "{column_name: col_float, validation_class: FloatType}," + - "{column_name: col_inetaddress, validation_class: InetAddressType}, " + - "{column_name: col_int32, validation_class: Int32Type}, " + - "{column_name: col_uft8, validation_class: UTF8Type}, " + - "{column_name: col_date, validation_class: DateType}, " + - "{column_name: col_uuid, validation_class: UUIDType}, " + - "{column_name: col_integer, validation_class: IntegerType}, " + - "{column_name: col_timeuuid, validation_class: TimeUUIDType}, " + - "{column_name: col_lexical_uuid, validation_class: LexicalUUIDType}, " + - "]; ", - - "set SomeApp['foo']['col_ascii'] = 'ascii';", - "set SomeApp['foo']['col_boolean'] = false;", - "set SomeApp['foo']['col_bytes'] = 'DEADBEEF';", - "set SomeApp['foo']['col_date'] = '2011-02-03T04:05:00+0000';", - "set SomeApp['foo']['col_decimal'] = '23.345';", - "set SomeApp['foo']['col_double'] = '2.7182818284590451';", - "set SomeApp['foo']['col_float'] = '23.45';", - "set SomeApp['foo']['col_inetaddress'] = '127.0.0.1';", - "set SomeApp['foo']['col_int32'] = 23;", - "set SomeApp['foo']['col_integer'] = 12345;", - "set SomeApp['foo']['col_long'] = 12345678;", - "set SomeApp['foo']['col_lexical_uuid'] = 'e23f450f-53a6-11e2-7f7f-7f7f7f7f7f77';", - "set SomeApp['foo']['col_timeuuid'] = 'e23f450f-53a6-11e2-7f7f-7f7f7f7f7f7f';", - "set SomeApp['foo']['col_uft8'] = 'hello';", - "set SomeApp['foo']['col_uuid'] = '550e8400-e29b-41d4-a716-446655440000';", - - "create column family CC with " + - "key_validation_class = UTF8Type and " + - "default_validation_class=CounterColumnType " + - "and comparator=UTF8Type;", - - "incr CC['chuck']['kick'];", - "incr CC['chuck']['kick'];", - "incr CC['chuck']['kick'];" + "DROP KEYSPACE IF EXISTS thrift_ks", + "CREATE KEYSPACE thrift_ks WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};", + "USE thrift_ks;", + + "CREATE TABLE some_app (" + + "key text PRIMARY KEY," + + "col_ascii ascii," + + "col_bigint bigint," + + "col_blob blob," + + "col_boolean boolean," + + "col_decimal decimal," + + "col_double double," + + "col_float float," + + "col_inet inet," + + "col_int int," + + "col_text text," + + "col_timestamp timestamp," + + "col_timeuuid timeuuid," + + "col_uuid uuid," + + "col_varint varint)" + + " WITH COMPACT STORAGE;", + + "INSERT INTO some_app (key, col_ascii, col_bigint, col_blob, col_boolean, col_decimal, col_double, col_float," + + "col_inet, col_int, col_text, col_timestamp, col_uuid, col_varint, col_timeuuid) " + + "VALUES ('foo', 'ascii', 12345678, 0xDEADBEEF, false, 23.345, 2.7182818284590451, 23.45, '127.0.0.1', 23, 'hello', " + + "'2011-02-03T04:05:00+0000', 550e8400-e29b-41d4-a716-446655440000, 12345, e23f450f-53a6-11e2-7f7f-7f7f7f7f7f7f);", + + "CREATE TABLE cc (key text, name text, value counter, PRIMARY KEY (key, name)) WITH COMPACT STORAGE", + + "UPDATE cc SET value = value + 3 WHERE key = 'chuck' AND name = 'kick'", }; @BeforeClass - public static void setup() throws TTransportException, IOException, InterruptedException, ConfigurationException, - AuthenticationException, AuthorizationException, InvalidRequestException, UnavailableException, TimedOutException, TException, NotFoundException, CharacterCodingException, ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException + public static void setup() throws IOException, InterruptedException, ConfigurationException, TException, + ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException { startCassandra(); - setupDataByCli(statements); + executeCQLStatements(statements); startHadoopCluster(); } @Test - public void testCassandraStorageDataType() throws IOException, ClassNotFoundException, TException, TimedOutException, NotFoundException, InvalidRequestException, NoSuchFieldException, UnavailableException, IllegalAccessException, InstantiationException + public void testCassandraStorageDataType() throws IOException, ClassNotFoundException, TException, + NoSuchFieldException, IllegalAccessException, InstantiationException { - pig.registerQuery("rows = LOAD 'cassandra://thriftKs/SomeApp?" + defaultParameters + "' USING CassandraStorage();"); - - //{key: chararray, col_ascii: (name: chararray,value: chararray), - //col_boolean: (name: chararray,value: bytearray), - //col_bytes: (name: chararray,value: bytearray), - //col_date: (name: chararray,value: long), - //col_decimal: (name: chararray,value: chararray), - //col_double: (name: chararray,value: double), - //col_float: (name: chararray,value: float), - //col_inetaddress: (name: chararray,value: chararray), - //col_int32: (name: chararray,value: int), - //col_integer: (name: chararray,value: int), - //col_lexical_uuid: (name: chararray,value: chararray), - //col_long: (name: chararray,value: long), - //col_timeuuid: (name: chararray,value: bytearray), - //col_uft8: (name: chararray,value: chararray), - //col_uuid: (name: chararray,value: chararray), - //columns: {(name: chararray,value: chararray)}} - Iterator it = pig.openIterator("rows"); - if (it.hasNext()) { - Tuple t = it.next(); - Assert.assertEquals(t.get(0), "foo"); - Tuple column = (Tuple) t.get(1); - Assert.assertEquals(column.get(1), "ascii"); - column = (Tuple) t.get(2); - Assert.assertEquals(column.get(1), false); - column = (Tuple) t.get(3); - Assert.assertEquals(column.get(1), new DataByteArray(Hex.hexToBytes("DEADBEEF"))); - column = (Tuple) t.get(4); - Assert.assertEquals(column.get(1), 1296705900000L); - column = (Tuple) t.get(5); - Assert.assertEquals(column.get(1), "23.345"); - column = (Tuple) t.get(6); - Assert.assertEquals(column.get(1), 2.7182818284590451d); - column = (Tuple) t.get(7); - Assert.assertEquals(column.get(1), 23.45f); - column = (Tuple) t.get(8); - Assert.assertEquals(column.get(1), "127.0.0.1"); - column = (Tuple) t.get(9); - Assert.assertEquals(column.get(1), 23); - column = (Tuple) t.get(10); - Assert.assertEquals(column.get(1), 12345); - column = (Tuple) t.get(11); - Assert.assertEquals(column.get(1), new DataByteArray((TimeUUIDType.instance.fromString("e23f450f-53a6-11e2-7f7f-7f7f7f7f7f77").array()))); - column = (Tuple) t.get(12); - Assert.assertEquals(column.get(1), 12345678L); - column = (Tuple) t.get(13); - Assert.assertEquals(column.get(1), new DataByteArray((TimeUUIDType.instance.fromString("e23f450f-53a6-11e2-7f7f-7f7f7f7f7f7f").array()))); - column = (Tuple) t.get(14); - Assert.assertEquals(column.get(1), "hello"); - column = (Tuple) t.get(15); - Assert.assertEquals(column.get(1), new DataByteArray((UUIDType.instance.fromString("550e8400-e29b-41d4-a716-446655440000").array()))); - } - - pig.registerQuery("cc_rows = LOAD 'cassandra://thriftKs/CC?" + defaultParameters + "' USING CassandraStorage();"); - - //(chuck,{(kick,3)}) - it = pig.openIterator("cc_rows"); - if (it.hasNext()) { - Tuple t = it.next(); - Assert.assertEquals(t.get(0), "chuck"); - DataBag columns = (DataBag) t.get(1); - Iterator iter = columns.iterator(); - if(iter.hasNext()) - { - Tuple column = iter.next(); - Assert.assertEquals(column.get(0), "kick"); - Assert.assertEquals(column.get(1), 3L); - } - } + pig.registerQuery("rows = LOAD 'cassandra://thrift_ks/some_app?" + defaultParameters + "' USING CassandraStorage();"); + Tuple t = pig.openIterator("rows").next(); + + // key + assertEquals("foo", t.get(0)); + + // col_ascii + Tuple column = (Tuple) t.get(1); + assertEquals("ascii", column.get(1)); + + // col_bigint + column = (Tuple) t.get(2); + assertEquals(12345678L, column.get(1)); + + // col_blob + column = (Tuple) t.get(3); + assertEquals(new DataByteArray(Hex.hexToBytes("DEADBEEF")), column.get(1)); + + // col_boolean + column = (Tuple) t.get(4); + assertEquals(false, column.get(1)); + + // col_decimal + column = (Tuple) t.get(5); + assertEquals("23.345", column.get(1)); + + // col_double + column = (Tuple) t.get(6); + assertEquals(2.7182818284590451d, column.get(1)); + + // col_float + column = (Tuple) t.get(7); + assertEquals(23.45f, column.get(1)); + + // col_inet + column = (Tuple) t.get(8); + assertEquals("127.0.0.1", column.get(1)); + + // col_int + column = (Tuple) t.get(9); + assertEquals(23, column.get(1)); + + // col_text + column = (Tuple) t.get(10); + assertEquals("hello", column.get(1)); + + // col_timestamp + column = (Tuple) t.get(11); + assertEquals(1296705900000L, column.get(1)); + + // col_timeuuid + column = (Tuple) t.get(12); + assertEquals(new DataByteArray((TimeUUIDType.instance.fromString("e23f450f-53a6-11e2-7f7f-7f7f7f7f7f7f").array())), column.get(1)); + + // col_uuid + column = (Tuple) t.get(13); + assertEquals(new DataByteArray((UUIDType.instance.fromString("550e8400-e29b-41d4-a716-446655440000").array())), column.get(1)); + + // col_varint + column = (Tuple) t.get(14); + assertEquals(12345, column.get(1)); + + pig.registerQuery("cc_rows = LOAD 'cassandra://thrift_ks/cc?" + defaultParameters + "' USING CassandraStorage();"); + t = pig.openIterator("cc_rows").next(); + + assertEquals("chuck", t.get(0)); + + DataBag columns = (DataBag) t.get(1); + column = columns.iterator().next(); + assertEquals("kick", column.get(0)); + assertEquals(3L, column.get(1)); } } diff --git a/test/pig/org/apache/cassandra/pig/ThriftColumnFamilyTest.java b/test/pig/org/apache/cassandra/pig/ThriftColumnFamilyTest.java index 89032971289f..167668ca76a2 100644 --- a/test/pig/org/apache/cassandra/pig/ThriftColumnFamilyTest.java +++ b/test/pig/org/apache/cassandra/pig/ThriftColumnFamilyTest.java @@ -20,27 +20,20 @@ import java.io.IOException; import java.nio.ByteBuffer; -import java.nio.charset.CharacterCodingException; import java.util.Iterator; -import org.apache.cassandra.cli.CliMain; import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.thrift.AuthenticationException; -import org.apache.cassandra.thrift.AuthorizationException; import org.apache.cassandra.thrift.Cassandra; import org.apache.cassandra.thrift.ColumnOrSuperColumn; import org.apache.cassandra.thrift.ColumnPath; import org.apache.cassandra.thrift.ConsistencyLevel; -import org.apache.cassandra.thrift.InvalidRequestException; import org.apache.cassandra.thrift.NotFoundException; -import org.apache.cassandra.thrift.TimedOutException; -import org.apache.cassandra.thrift.UnavailableException; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.pig.data.DataBag; import org.apache.pig.data.DataByteArray; import org.apache.pig.data.Tuple; import org.apache.thrift.TException; -import org.apache.thrift.transport.TTransportException; + import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; @@ -48,171 +41,159 @@ public class ThriftColumnFamilyTest extends PigTestBase { private static String[] statements = { - "create keyspace thriftKs with placement_strategy = 'org.apache.cassandra.locator.SimpleStrategy' and" + - " strategy_options={replication_factor:1};", - "use thriftKs;", - - "create column family SomeApp " + - " with comparator = UTF8Type " + - " and default_validation_class = UTF8Type " + - " and key_validation_class = UTF8Type " + - " and column_metadata = [{column_name: name, validation_class: UTF8Type, index_type: KEYS}, " + - "{column_name: vote_type, validation_class: UTF8Type}, " + - "{column_name: rating, validation_class: Int32Type}, " + - "{column_name: score, validation_class: LongType}, " + - "{column_name: percent, validation_class: FloatType}, " + - "{column_name: atomic_weight, validation_class: DoubleType}, " + - "{column_name: created, validation_class: DateType},]; ", - - "create column family CopyOfSomeApp " + - "with key_validation_class = UTF8Type " + - "and default_validation_class = UTF8Type " + - "and comparator = UTF8Type " + - "and column_metadata = " + - "[ " + - "{column_name: name, validation_class: UTF8Type, index_type: KEYS}, " + - "{column_name: vote_type, validation_class: UTF8Type}, " + - "{column_name: rating, validation_class: Int32Type}, " + - "{column_name: score, validation_class: LongType}, " + - "{column_name: percent, validation_class: FloatType}, " + - "{column_name: atomic_weight, validation_class: DoubleType}, " + - "{column_name: created, validation_class: DateType}, " + - "];", - - "set SomeApp['foo']['name'] = 'User Foo';", - "set SomeApp['foo']['vote_type'] = 'like';", - "set SomeApp['foo']['rating'] = 8;", - "set SomeApp['foo']['score'] = 125000;", - "set SomeApp['foo']['percent'] = '85.0';", - "set SomeApp['foo']['atomic_weight'] = '2.7182818284590451';", - "set SomeApp['foo']['created'] = 1335890877;", - - "set SomeApp['bar']['name'] = 'User Bar';", - "set SomeApp['bar']['vote_type'] = 'like';", - "set SomeApp['bar']['rating'] = 9;", - "set SomeApp['bar']['score'] = 15000;", - "set SomeApp['bar']['percent'] = '35.0';", - "set SomeApp['bar']['atomic_weight'] = '3.1415926535897931';", - "set SomeApp['bar']['created'] = 1335890877;", - - "set SomeApp['baz']['name'] = 'User Baz';", - "set SomeApp['baz']['vote_type'] = 'dislike';", - "set SomeApp['baz']['rating'] = 3;", - "set SomeApp['baz']['score'] = 512000;", - "set SomeApp['baz']['percent'] = '95.3';", - "set SomeApp['baz']['atomic_weight'] = '1.61803399';", - "set SomeApp['baz']['created'] = 1335890877;", - "set SomeApp['baz']['extra1'] = 'extra1';", - "set SomeApp['baz']['extra2'] = 'extra2';", - "set SomeApp['baz']['extra3'] = 'extra3';", - - "set SomeApp['qux']['name'] = 'User Qux';", - "set SomeApp['qux']['vote_type'] = 'dislike';", - "set SomeApp['qux']['rating'] = 2;", - "set SomeApp['qux']['score'] = 12000;", - "set SomeApp['qux']['percent'] = '64.7';", - "set SomeApp['qux']['atomic_weight'] = '0.660161815846869';", - "set SomeApp['qux']['created'] = 1335890877;", - "set SomeApp['qux']['extra1'] = 'extra1';", - "set SomeApp['qux']['extra2'] = 'extra2';", - "set SomeApp['qux']['extra3'] = 'extra3';", - "set SomeApp['qux']['extra4'] = 'extra4';", - "set SomeApp['qux']['extra5'] = 'extra5';", - "set SomeApp['qux']['extra6'] = 'extra6';", - "set SomeApp['qux']['extra7'] = 'extra7';", - - "create column family U8 with " + - "key_validation_class = UTF8Type and " + - "comparator = UTF8Type;", - - "create column family Bytes with " + - "key_validation_class = BytesType and " + - "comparator = UTF8Type;", - - "set U8['foo']['x'] = ascii('Z');", - "set Bytes[ascii('foo')]['x'] = ascii('Z');", - - "create column family CC with " + - "key_validation_class = UTF8Type and " + - "default_validation_class=CounterColumnType " + - "and comparator=UTF8Type;", - - "incr CC['chuck']['kick'];", - "incr CC['chuck']['kick'];", - "incr CC['chuck']['kick'];", - "incr CC['chuck']['fist'];", - - "create column family Compo " + - "with key_validation_class = UTF8Type " + - "and default_validation_class = UTF8Type " + - "and comparator = 'CompositeType(UTF8Type,UTF8Type)';", - - "set Compo['punch']['bruce:lee'] = 'ouch';", - "set Compo['punch']['bruce:bruce'] = 'hunh?';", - "set Compo['kick']['bruce:lee'] = 'oww';", - "set Compo['kick']['bruce:bruce'] = 'watch it, mate';", - - "create column family CompoInt " + - "with key_validation_class = UTF8Type " + - "and default_validation_class = UTF8Type " + - "and comparator = 'CompositeType(LongType,LongType)';", - - "set CompoInt['clock']['1:0'] = 'z';", - "set CompoInt['clock']['1:30'] = 'zzzz';", - "set CompoInt['clock']['2:30'] = 'daddy?';", - "set CompoInt['clock']['6:30'] = 'coffee...';", - - "create column family CompoIntCopy " + - "with key_validation_class = UTF8Type " + - "and default_validation_class = UTF8Type " + - "and comparator = 'CompositeType(LongType,LongType)';", - - "create column family CompoKey " + - "with key_validation_class = 'CompositeType(UTF8Type,LongType)' " + - "and default_validation_class = UTF8Type " + - "and comparator = LongType;", - - "set CompoKey['clock:10']['1'] = 'z';", - "set CompoKey['clock:20']['1'] = 'zzzz';", - "set CompoKey['clock:30']['2'] = 'daddy?';", - "set CompoKey['clock:40']['6'] = 'coffee...';", - - "create column family CompoKeyCopy " + - "with key_validation_class = 'CompositeType(UTF8Type,LongType)' " + - "and default_validation_class = UTF8Type " + - "and comparator = LongType;" + "DROP KEYSPACE IF EXISTS thrift_ks", + "CREATE KEYSPACE thrift_ks WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};", + "USE thrift_ks;", + + "CREATE TABLE some_app (" + + "key text PRIMARY KEY," + + "name text," + + "vote_type text," + + "rating int," + + "score bigint," + + "percent float," + + "atomic_weight double," + + "created timestamp)" + + " WITH COMPACT STORAGE;", + + "CREATE INDEX ON some_app(name);", + + "INSERT INTO some_app (key, name, vote_type, rating, score, percent, atomic_weight, created) " + + "VALUES ('foo', 'User Foo', 'like', 8, 125000, 85.0, 2.7182818284590451, 1335890877);", + + "INSERT INTO some_app (key, name, vote_type, rating, score, percent, atomic_weight, created) " + + "VALUES ('bar', 'User Bar', 'like', 9, 15000, 35.0, 3.1415926535897931, 1335890877);", + + "INSERT INTO some_app (key, name, vote_type, rating, score, percent, atomic_weight, created) " + + "VALUES ('baz', 'User Baz', 'dislike', 3, 512000, 95.3, 1.61803399, 1335890877);", + + "INSERT INTO some_app (key, name, vote_type, rating, score, percent, atomic_weight, created) " + + "VALUES ('qux', 'User Qux', 'dislike', 2, 12000, 64.7, 0.660161815846869, 1335890877);", + + "CREATE TABLE copy_of_some_app (" + + "key text PRIMARY KEY," + + "name text," + + "vote_type text," + + "rating int," + + "score bigint," + + "percent float," + + "atomic_weight double," + + "created timestamp)" + + " WITH COMPACT STORAGE;", + + "CREATE INDEX ON copy_of_some_app(name);", + + "CREATE TABLE u8 (" + + "key text," + + "column1 text," + + "value blob," + + "PRIMARY KEY (key, column1))" + + " WITH COMPACT STORAGE", + + "INSERT INTO u8 (key, column1, value) VALUES ('foo', 'x', asciiAsBlob('Z'))", + + "CREATE TABLE bytes (" + + "key blob," + + "column1 text," + + "value blob," + + "PRIMARY KEY (key, column1))" + + " WITH COMPACT STORAGE", + + "INSERT INTO bytes (key, column1, value) VALUES (asciiAsBlob('foo'), 'x', asciiAsBlob('Z'))", + + "CREATE TABLE cc (key text, name text, value counter, PRIMARY KEY (key, name)) WITH COMPACT STORAGE", + + "UPDATE cc SET value = value + 3 WHERE key = 'chuck' AND name = 'kick'", + "UPDATE cc SET value = value + 1 WHERE key = 'chuck' AND name = 'fist'", + + "CREATE TABLE compo (" + + "key text," + + "column1 text," + + "column2 text," + + "value text," + + "PRIMARY KEY (key, column1, column2))" + + " WITH COMPACT STORAGE", + + "INSERT INTO compo (key, column1, column2, value) VALUES ('punch', 'bruce', 'lee', 'ouch');", + "INSERT INTO compo (key, column1, column2, value) VALUES ('punch', 'bruce', 'bruce', 'hunh?');", + "INSERT INTO compo (key, column1, column2, value) VALUES ('kick', 'bruce', 'lee', 'oww');", + "INSERT INTO compo (key, column1, column2, value) VALUES ('kick', 'bruce', 'bruce', 'watch it, mate');", + + "CREATE TABLE compo_int (" + + "key text," + + "column1 bigint," + + "column2 bigint," + + "value text," + + "PRIMARY KEY (key, column1, column2))" + + " WITH COMPACT STORAGE", + + "INSERT INTO compo_int (key, column1, column2, value) VALUES ('clock', 1, 0, 'z');", + "INSERT INTO compo_int (key, column1, column2, value) VALUES ('clock', 1, 30, 'zzzz');", + "INSERT INTO compo_int (key, column1, column2, value) VALUES ('clock', 2, 30, 'daddy?');", + "INSERT INTO compo_int (key, column1, column2, value) VALUES ('clock', 6, 30, 'coffee...');", + + "CREATE TABLE compo_int_copy (" + + "key text," + + "column1 bigint," + + "column2 bigint," + + "value text," + + "PRIMARY KEY (key, column1, column2))" + + " WITH COMPACT STORAGE", + + "CREATE TABLE compo_key (" + + "key text," + + "column1 bigint," + + "column2 bigint," + + "value text," + + "PRIMARY KEY ((key, column1), column2))" + + " WITH COMPACT STORAGE", + + "INSERT INTO compo_key (key, column1, column2, value) VALUES ('clock', 10, 1, 'z');", + "INSERT INTO compo_key (key, column1, column2, value) VALUES ('clock', 20, 1, 'zzzz');", + "INSERT INTO compo_key (key, column1, column2, value) VALUES ('clock', 30, 2, 'daddy?');", + "INSERT INTO compo_key (key, column1, column2, value) VALUES ('clock', 40, 6, 'coffee...');", + + "CREATE TABLE compo_key_copy (" + + "key text," + + "column1 bigint," + + "column2 bigint," + + "value text," + + "PRIMARY KEY ((key, column1), column2))" + + " WITH COMPACT STORAGE", }; - private static String[] deleteCopyOfSomeAppTableData = { "use thriftKs;", - "DEL CopyOfSomeApp ['foo']", - "DEL CopyOfSomeApp ['bar']", - "DEL CopyOfSomeApp ['baz']", - "DEL CopyOfSomeApp ['qux']" + private static String[] deleteCopyOfSomeAppTableData = { + "use thrift_ks;", + "DELETE FROM copy_of_some_app WHERE key = 'foo';", + "DELETE FROM copy_of_some_app WHERE key = 'bar';", + "DELETE FROM copy_of_some_app WHERE key = 'baz';", + "DELETE FROM copy_of_some_app WHERE key = 'qux';", }; @BeforeClass - public static void setup() throws TTransportException, IOException, InterruptedException, ConfigurationException, - AuthenticationException, AuthorizationException, InvalidRequestException, UnavailableException, TimedOutException, TException, NotFoundException, CharacterCodingException, ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException + public static void setup() throws IOException, InterruptedException, ConfigurationException, TException, + ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException { startCassandra(); - setupDataByCli(statements); + executeCQLStatements(statements); startHadoopCluster(); } @Test - public void testCqlNativeStorage() throws IOException, ClassNotFoundException, TException, TimedOutException, NotFoundException, InvalidRequestException, NoSuchFieldException, UnavailableException, IllegalAccessException, InstantiationException, AuthenticationException, AuthorizationException + public void testCqlNativeStorage() throws IOException, ClassNotFoundException, TException, NoSuchFieldException, + IllegalAccessException, InstantiationException { //regular thrift column families - //input_cql=select * from "SomeApp" where token(key) > ? and token(key) <= ? - cqlStorageTest("data = load 'cql://thriftKs/SomeApp?" + defaultParameters + nativeParameters + "&input_cql=select%20*%20from%20%22SomeApp%22%20where%20token(key)%20%3E%20%3F%20and%20token(key)%20%3C%3D%20%3F' using CqlNativeStorage();"); + //input_cql=select * from "some_app" where token(key) > ? and token(key) <= ? + cqlStorageTest("data = load 'cql://thrift_ks/some_app?" + defaultParameters + nativeParameters + "&input_cql=select%20*%20from%20%22some_app%22%20where%20token(key)%20%3E%20%3F%20and%20token(key)%20%3C%3D%20%3F' using CqlNativeStorage();"); - //Test counter colun family - //input_cql=select * from "CC" where token(key) > ? and token(key) <= ? - cqlStorageCounterTableTest("cc_data = load 'cql://thriftKs/CC?" + defaultParameters + nativeParameters + "&input_cql=select%20*%20from%20%22CC%22%20where%20token(key)%20%3E%20%3F%20and%20token(key)%20%3C%3D%20%3F' using CqlNativeStorage();"); + //Test counter column family + //input_cql=select * from "cc" where token(key) > ? and token(key) <= ? + cqlStorageCounterTableTest("cc_data = load 'cql://thrift_ks/cc?" + defaultParameters + nativeParameters + "&input_cql=select%20*%20from%20%22cc%22%20where%20token(key)%20%3E%20%3F%20and%20token(key)%20%3C%3D%20%3F' using CqlNativeStorage();"); //Test composite column family - //input_cql=select * from "Compo" where token(key) > ? and token(key) <= ? - cqlStorageCompositeTableTest("compo_data = load 'cql://thriftKs/Compo?" + defaultParameters + nativeParameters + "&input_cql=select%20*%20from%20%22Compo%22%20where%20token(key)%20%3E%20%3F%20and%20token(key)%20%3C%3D%20%3F' using CqlNativeStorage();"); + //input_cql=select * from "compo" where token(key) > ? and token(key) <= ? + cqlStorageCompositeTableTest("compo_data = load 'cql://thrift_ks/compo?" + defaultParameters + nativeParameters + "&input_cql=select%20*%20from%20%22compo%22%20where%20token(key)%20%3E%20%3F%20and%20token(key)%20%3C%3D%20%3F' using CqlNativeStorage();"); } private void cqlStorageTest(String initialQuery) throws IOException @@ -321,14 +302,12 @@ else if ("punch".equals(t.get(0)) && "bruce".equals(t.get(1)) && "lee".equals(t. } @Test - public void testCassandraStorageSchema() throws IOException, ClassNotFoundException, TException, TimedOutException, NotFoundException, InvalidRequestException, NoSuchFieldException, UnavailableException, IllegalAccessException, InstantiationException + public void testCassandraStorageSchema() throws IOException, ClassNotFoundException, TException, NoSuchFieldException, + IllegalAccessException, InstantiationException { //results: (qux,(atomic_weight,0.660161815846869),(created,1335890877),(name,User Qux),(percent,64.7), - //(rating,2),(score,12000),(vote_type,dislike),{(extra1,extra1), - //(extra2,extra2),(extra3,extra3), - //(extra4,extra4),(extra5,extra5), - //(extra6,extra6),(extra7,extra7)}) - pig.registerQuery("rows = LOAD 'cassandra://thriftKs/SomeApp?" + defaultParameters + "' USING CassandraStorage();"); + //(rating,2),(score,12000),(vote_type,dislike)) + pig.registerQuery("rows = LOAD 'cassandra://thrift_ks/some_app?" + defaultParameters + "' USING CassandraStorage();"); //schema: {key: chararray,atomic_weight: (name: chararray,value: double),created: (name: chararray,value: long), //name: (name: chararray,value: chararray),percent: (name: chararray,value: float), @@ -358,48 +337,39 @@ public void testCassandraStorageSchema() throws IOException, ClassNotFoundExcept column = (Tuple) t.get(7); Assert.assertEquals(column.get(0), "vote_type"); Assert.assertEquals(column.get(1), "dislike"); - DataBag columns = (DataBag) t.get(8); - Iterator iter = columns.iterator(); - int i = 0; - while(iter.hasNext()) - { - i++; - column = iter.next(); - Assert.assertEquals(column.get(0), "extra"+i); - } - Assert.assertEquals(7, columns.size()); } - } } @Test - public void testCassandraStorageFullCopy() throws IOException, ClassNotFoundException, TException, TimedOutException, NotFoundException, InvalidRequestException, NoSuchFieldException, UnavailableException, IllegalAccessException, InstantiationException, AuthenticationException, AuthorizationException + public void testCassandraStorageFullCopy() throws IOException, ClassNotFoundException, TException, NoSuchFieldException, + IllegalAccessException, InstantiationException { pig.setBatchOn(); - pig.registerQuery("rows = LOAD 'cassandra://thriftKs/SomeApp?" + defaultParameters + "' USING CassandraStorage();"); + pig.registerQuery("rows = LOAD 'cassandra://thrift_ks/some_app?" + defaultParameters + "' USING CassandraStorage();"); //full copy - pig.registerQuery("STORE rows INTO 'cassandra://thriftKs/CopyOfSomeApp?" + defaultParameters + "' USING CassandraStorage();"); + pig.registerQuery("STORE rows INTO 'cassandra://thrift_ks/copy_of_some_app?" + defaultParameters + "' USING CassandraStorage();"); pig.executeBatch(); - Assert.assertEquals("User Qux", getColumnValue("thriftKs", "CopyOfSomeApp", "name", "qux", "UTF8Type")); - Assert.assertEquals("dislike", getColumnValue("thriftKs", "CopyOfSomeApp", "vote_type", "qux", "UTF8Type")); - Assert.assertEquals("64.7", getColumnValue("thriftKs", "CopyOfSomeApp", "percent", "qux", "FloatType")); + Assert.assertEquals("User Qux", getColumnValue("thrift_ks", "copy_of_some_app", "name", "qux", "UTF8Type")); + Assert.assertEquals("dislike", getColumnValue("thrift_ks", "copy_of_some_app", "vote_type", "qux", "UTF8Type")); + Assert.assertEquals("64.7", getColumnValue("thrift_ks", "copy_of_some_app", "percent", "qux", "FloatType")); } @Test - public void testCassandraStorageSigleTupleCopy() throws IOException, ClassNotFoundException, TException, TimedOutException, NotFoundException, InvalidRequestException, NoSuchFieldException, UnavailableException, IllegalAccessException, InstantiationException, AuthenticationException, AuthorizationException + public void testCassandraStorageSigleTupleCopy() throws IOException, ClassNotFoundException, TException, + NoSuchFieldException, IllegalAccessException, InstantiationException { - executeCliStatements(deleteCopyOfSomeAppTableData); + executeCQLStatements(deleteCopyOfSomeAppTableData); pig.setBatchOn(); - pig.registerQuery("rows = LOAD 'cassandra://thriftKs/SomeApp?" + defaultParameters + "' USING CassandraStorage();"); + pig.registerQuery("rows = LOAD 'cassandra://thrift_ks/some_app?" + defaultParameters + "' USING CassandraStorage();"); //sigle tuple pig.registerQuery("onecol = FOREACH rows GENERATE key, percent;"); - pig.registerQuery("STORE onecol INTO 'cassandra://thriftKs/CopyOfSomeApp?" + defaultParameters + "' USING CassandraStorage();"); + pig.registerQuery("STORE onecol INTO 'cassandra://thrift_ks/copy_of_some_app?" + defaultParameters + "' USING CassandraStorage();"); pig.executeBatch(); String value = null; try { - value = getColumnValue("thriftKs", "CopyOfSomeApp", "name", "qux", "UTF8Type"); + value = getColumnValue("thrift_ks", "copy_of_some_app", "name", "qux", "UTF8Type"); } catch (NotFoundException e) { @@ -409,7 +379,7 @@ public void testCassandraStorageSigleTupleCopy() throws IOException, ClassNotFou Assert.fail(); try { - value = getColumnValue("thriftKs", "CopyOfSomeApp", "vote_type", "qux", "UTF8Type"); + value = getColumnValue("thrift_ks", "copy_of_some_app", "vote_type", "qux", "UTF8Type"); } catch (NotFoundException e) { @@ -417,23 +387,24 @@ public void testCassandraStorageSigleTupleCopy() throws IOException, ClassNotFou } if (value != null) Assert.fail(); - Assert.assertEquals("64.7", getColumnValue("thriftKs", "CopyOfSomeApp", "percent", "qux", "FloatType")); + Assert.assertEquals("64.7", getColumnValue("thrift_ks", "copy_of_some_app", "percent", "qux", "FloatType")); } @Test - public void testCassandraStorageBagOnlyCopy() throws IOException, ClassNotFoundException, TException, TimedOutException, NotFoundException, InvalidRequestException, NoSuchFieldException, UnavailableException, IllegalAccessException, InstantiationException, AuthenticationException, AuthorizationException + public void testCassandraStorageBagOnlyCopy() throws IOException, ClassNotFoundException, TException, + NoSuchFieldException, IllegalAccessException, InstantiationException { - executeCliStatements(deleteCopyOfSomeAppTableData); + executeCQLStatements(deleteCopyOfSomeAppTableData); pig.setBatchOn(); - pig.registerQuery("rows = LOAD 'cassandra://thriftKs/SomeApp?" + defaultParameters + "' USING CassandraStorage();"); + pig.registerQuery("rows = LOAD 'cassandra://thrift_ks/some_app?" + defaultParameters + "' USING CassandraStorage();"); //bag only pig.registerQuery("other = FOREACH rows GENERATE key, columns;"); - pig.registerQuery("STORE other INTO 'cassandra://thriftKs/CopyOfSomeApp?" + defaultParameters + "' USING CassandraStorage();"); + pig.registerQuery("STORE other INTO 'cassandra://thrift_ks/copy_of_some_app?" + defaultParameters + "' USING CassandraStorage();"); pig.executeBatch(); String value = null; try { - value = getColumnValue("thriftKs", "CopyOfSomeApp", "name", "qux", "UTF8Type"); + value = getColumnValue("thrift_ks", "copy_of_some_app", "name", "qux", "UTF8Type"); } catch (NotFoundException e) { @@ -443,7 +414,7 @@ public void testCassandraStorageBagOnlyCopy() throws IOException, ClassNotFoundE Assert.fail(); try { - value = getColumnValue("thriftKs", "CopyOfSomeApp", "vote_type", "qux", "UTF8Type"); + value = getColumnValue("thrift_ks", "copy_of_some_app", "vote_type", "qux", "UTF8Type"); } catch (NotFoundException e) { @@ -453,7 +424,7 @@ public void testCassandraStorageBagOnlyCopy() throws IOException, ClassNotFoundE Assert.fail(); try { - value = getColumnValue("thriftKs", "CopyOfSomeApp", "percent", "qux", "FloatType"); + value = getColumnValue("thrift_ks", "copy_of_some_app", "percent", "qux", "FloatType"); } catch (NotFoundException e) { @@ -461,27 +432,27 @@ public void testCassandraStorageBagOnlyCopy() throws IOException, ClassNotFoundE } if (value != null) Assert.fail(); - Assert.assertEquals("extra1", getColumnValue("thriftKs", "CopyOfSomeApp", "extra1", "qux", "UTF8Type")); } @Test - public void testCassandraStorageFilter() throws IOException, ClassNotFoundException, TException, TimedOutException, NotFoundException, InvalidRequestException, NoSuchFieldException, UnavailableException, IllegalAccessException, InstantiationException, AuthenticationException, AuthorizationException + public void testCassandraStorageFilter() throws IOException, ClassNotFoundException, TException, NoSuchFieldException, + IllegalAccessException, InstantiationException { - executeCliStatements(deleteCopyOfSomeAppTableData); + executeCQLStatements(deleteCopyOfSomeAppTableData); pig.setBatchOn(); - pig.registerQuery("rows = LOAD 'cassandra://thriftKs/SomeApp?" + defaultParameters + "' USING CassandraStorage();"); + pig.registerQuery("rows = LOAD 'cassandra://thrift_ks/some_app?" + defaultParameters + "' USING CassandraStorage();"); //filter pig.registerQuery("likes = FILTER rows by vote_type.value eq 'like' and rating.value > 5;"); - pig.registerQuery("STORE likes INTO 'cassandra://thriftKs/CopyOfSomeApp?" + defaultParameters + "' USING CassandraStorage();"); + pig.registerQuery("STORE likes INTO 'cassandra://thrift_ks/copy_of_some_app?" + defaultParameters + "' USING CassandraStorage();"); pig.executeBatch(); - Assert.assertEquals("like", getColumnValue("thriftKs", "CopyOfSomeApp", "vote_type", "bar", "UTF8Type")); - Assert.assertEquals("like", getColumnValue("thriftKs", "CopyOfSomeApp", "vote_type", "foo", "UTF8Type")); + Assert.assertEquals("like", getColumnValue("thrift_ks", "copy_of_some_app", "vote_type", "bar", "UTF8Type")); + Assert.assertEquals("like", getColumnValue("thrift_ks", "copy_of_some_app", "vote_type", "foo", "UTF8Type")); String value = null; try { - value = getColumnValue("thriftKs", "CopyOfSomeApp", "vote_type", "qux", "UTF8Type"); + value = getColumnValue("thrift_ks", "copy_of_some_app", "vote_type", "qux", "UTF8Type"); } catch (NotFoundException e) { @@ -491,7 +462,7 @@ public void testCassandraStorageFilter() throws IOException, ClassNotFoundExcept Assert.fail(); try { - value = getColumnValue("thriftKs", "CopyOfSomeApp", "vote_type", "baz", "UTF8Type"); + value = getColumnValue("thrift_ks", "copy_of_some_app", "vote_type", "baz", "UTF8Type"); } catch (NotFoundException e) { @@ -500,19 +471,18 @@ public void testCassandraStorageFilter() throws IOException, ClassNotFoundExcept if (value != null) Assert.fail(); - executeCliStatements(deleteCopyOfSomeAppTableData); + executeCQLStatements(deleteCopyOfSomeAppTableData); pig.setBatchOn(); - pig.registerQuery("rows = LOAD 'cassandra://thriftKs/SomeApp?" + defaultParameters + "' USING CassandraStorage();"); - pig.registerQuery("dislikes_extras = FILTER rows by vote_type.value eq 'dislike' AND COUNT(columns) > 0;"); - pig.registerQuery("STORE dislikes_extras INTO 'cassandra://thriftKs/CopyOfSomeApp?" + defaultParameters + "' USING CassandraStorage();"); - pig.registerQuery("visible = FILTER rows BY COUNT(columns) == 0;"); + pig.registerQuery("rows = LOAD 'cassandra://thrift_ks/some_app?" + defaultParameters + "' USING CassandraStorage();"); + pig.registerQuery("dislikes_extras = FILTER rows by vote_type.value eq 'dislike';"); + pig.registerQuery("STORE dislikes_extras INTO 'cassandra://thrift_ks/copy_of_some_app?" + defaultParameters + "' USING CassandraStorage();"); pig.executeBatch(); - Assert.assertEquals("dislike", getColumnValue("thriftKs", "CopyOfSomeApp", "vote_type", "baz", "UTF8Type")); - Assert.assertEquals("dislike", getColumnValue("thriftKs", "CopyOfSomeApp", "vote_type", "qux", "UTF8Type")); + Assert.assertEquals("dislike", getColumnValue("thrift_ks", "copy_of_some_app", "vote_type", "baz", "UTF8Type")); + Assert.assertEquals("dislike", getColumnValue("thrift_ks", "copy_of_some_app", "vote_type", "qux", "UTF8Type")); value = null; try { - value = getColumnValue("thriftKs", "CopyOfSomeApp", "vote_type", "bar", "UTF8Type"); + value = getColumnValue("thrift_ks", "copy_of_some_app", "vote_type", "bar", "UTF8Type"); } catch (NotFoundException e) { @@ -522,7 +492,7 @@ public void testCassandraStorageFilter() throws IOException, ClassNotFoundExcept Assert.fail(); try { - value = getColumnValue("thriftKs", "CopyOfSomeApp", "vote_type", "foo", "UTF8Type"); + value = getColumnValue("thrift_ks", "copy_of_some_app", "vote_type", "foo", "UTF8Type"); } catch (NotFoundException e) { @@ -533,11 +503,11 @@ public void testCassandraStorageFilter() throws IOException, ClassNotFoundExcept } @Test - public void testCassandraStorageJoin() throws IOException, ClassNotFoundException, TException, TimedOutException, NotFoundException, InvalidRequestException, NoSuchFieldException, UnavailableException, IllegalAccessException, InstantiationException, AuthenticationException, AuthorizationException + public void testCassandraStorageJoin() throws IOException, ClassNotFoundException, TException, IllegalAccessException, InstantiationException { //test key types with a join - pig.registerQuery("U8 = load 'cassandra://thriftKs/U8?" + defaultParameters + "' using CassandraStorage();"); - pig.registerQuery("Bytes = load 'cassandra://thriftKs/Bytes?" + defaultParameters + "' using CassandraStorage();"); + pig.registerQuery("U8 = load 'cassandra://thrift_ks/u8?" + defaultParameters + "' using CassandraStorage();"); + pig.registerQuery("Bytes = load 'cassandra://thrift_ks/bytes?" + defaultParameters + "' using CassandraStorage();"); //cast key to chararray pig.registerQuery("b = foreach Bytes generate (chararray)key, columns;"); @@ -585,28 +555,24 @@ public void testCassandraStorageJoin() throws IOException, ClassNotFoundExceptio } @Test - public void testCassandraStorageCounterCF() throws IOException, ClassNotFoundException, TException, TimedOutException, NotFoundException, InvalidRequestException, NoSuchFieldException, UnavailableException, IllegalAccessException, InstantiationException, AuthenticationException, AuthorizationException + public void testCassandraStorageCounterCF() throws IOException, ClassNotFoundException, TException, NoSuchFieldException, + IllegalAccessException, InstantiationException { - pig.registerQuery("rows = LOAD 'cassandra://thriftKs/SomeApp?" + defaultParameters + "' USING CassandraStorage();"); - //Test counter column family support - pig.registerQuery("CC = load 'cassandra://thriftKs/CC?" + defaultParameters + "' using CassandraStorage();"); + pig.registerQuery("CC = load 'cassandra://thrift_ks/cc?" + defaultParameters + "' using CassandraStorage();"); pig.registerQuery("total_hits = foreach CC generate key, SUM(columns.value);"); //(chuck,4) - Iterator it = pig.openIterator("total_hits"); - if (it.hasNext()) { - Tuple t = it.next(); - Assert.assertEquals(t.get(0), "chuck"); - Assert.assertEquals(t.get(1), 4l); - } + Tuple t = pig.openIterator("total_hits").next(); + Assert.assertEquals(t.get(0), "chuck"); + Assert.assertEquals(t.get(1), 4l); } - /** This test case fails due to antlr lib conflicts, Cassandra2.1 uses 3.2, Hive1.2 uses 3.4 */ - //@Test - public void testCassandraStorageCompositeColumnCF() throws IOException, ClassNotFoundException, TException, TimedOutException, NotFoundException, InvalidRequestException, NoSuchFieldException, UnavailableException, IllegalAccessException, InstantiationException, AuthenticationException, AuthorizationException + @Test + public void testCassandraStorageCompositeColumnCF() throws IOException, ClassNotFoundException, TException, + NoSuchFieldException, IllegalAccessException, InstantiationException { //Test CompositeType - pig.registerQuery("compo = load 'cassandra://thriftKs/Compo?" + defaultParameters + "' using CassandraStorage();"); + pig.registerQuery("compo = load 'cassandra://thrift_ks/compo?" + defaultParameters + "' using CassandraStorage();"); pig.registerQuery("compo = foreach compo generate key as method, flatten(columns);"); pig.registerQuery("lee = filter compo by columns::name == ('bruce','lee');"); @@ -626,7 +592,7 @@ else if ("kick".equals(t.get(0))) Assert.assertEquals(t.get(2), "ouch"); } Assert.assertEquals(count, 2); - pig.registerQuery("night = load 'cassandra://thriftKs/CompoInt?" + defaultParameters + "' using CassandraStorage();"); + pig.registerQuery("night = load 'cassandra://thrift_ks/compo_int?" + defaultParameters + "' using CassandraStorage();"); pig.registerQuery("night = foreach night generate flatten(columns);"); pig.registerQuery("night = foreach night generate (int)columns::name.$0+(double)columns::name.$1/60 as hour, columns::value as noise;"); @@ -641,10 +607,10 @@ else if ("kick".equals(t.get(0))) Assert.assertEquals(t.get(1), "daddy?"); } pig.setBatchOn(); - pig.registerQuery("compo_int_rows = LOAD 'cassandra://thriftKs/CompoInt?" + defaultParameters + "' using CassandraStorage();"); - pig.registerQuery("STORE compo_int_rows INTO 'cassandra://thriftKs/CompoIntCopy?" + defaultParameters + "' using CassandraStorage();"); + pig.registerQuery("compo_int_rows = LOAD 'cassandra://thrift_ks/compo_int?" + defaultParameters + "' using CassandraStorage();"); + pig.registerQuery("STORE compo_int_rows INTO 'cassandra://thrift_ks/compo_int_copy?" + defaultParameters + "' using CassandraStorage();"); pig.executeBatch(); - pig.registerQuery("compocopy_int_rows = LOAD 'cassandra://thriftKs/CompoIntCopy?" + defaultParameters + "' using CassandraStorage();"); + pig.registerQuery("compocopy_int_rows = LOAD 'cassandra://thrift_ks/compo_int_copy?" + defaultParameters + "' using CassandraStorage();"); //(clock,{((1,0),z),((1,30),zzzz),((2,30),daddy?),((6,30),coffee...)}) it = pig.openIterator("compocopy_int_rows"); count = 0; @@ -652,11 +618,9 @@ else if ("kick".equals(t.get(0))) Tuple t = it.next(); Assert.assertEquals(t.get(0), "clock"); DataBag columns = (DataBag) t.get(1); - Iterator iter = columns.iterator(); - while (iter.hasNext()) + for (Tuple t1 : columns) { - count ++; - Tuple t1 = iter.next(); + count++; Tuple inner = (Tuple) t1.get(0); if ((Long) inner.get(0) == 1L && (Long) inner.get(1) == 0L) Assert.assertEquals(t1.get(1), "z"); @@ -672,10 +636,11 @@ else if ((Long) inner.get(0) == 6L && (Long) inner.get(1) == 30L) } @Test - public void testCassandraStorageCompositeKeyCF() throws IOException, ClassNotFoundException, TException, TimedOutException, NotFoundException, InvalidRequestException, NoSuchFieldException, UnavailableException, IllegalAccessException, InstantiationException, AuthenticationException, AuthorizationException + public void testCassandraStorageCompositeKeyCF() throws IOException, ClassNotFoundException, TException, + NoSuchFieldException, IllegalAccessException, InstantiationException { //Test CompositeKey - pig.registerQuery("compokeys = load 'cassandra://thriftKs/CompoKey?" + defaultParameters + "' using CassandraStorage();"); + pig.registerQuery("compokeys = load 'cassandra://thrift_ks/compo_key?" + defaultParameters + "' using CassandraStorage();"); pig.registerQuery("compokeys = filter compokeys by key.$1 == 40;"); //((clock,40),{(6,coffee...)}) Iterator it = pig.openIterator("compokeys"); @@ -694,10 +659,10 @@ public void testCassandraStorageCompositeKeyCF() throws IOException, ClassNotFou } } pig.setBatchOn(); - pig.registerQuery("compo_key_rows = LOAD 'cassandra://thriftKs/CompoKey?" + defaultParameters + "' using CassandraStorage();"); - pig.registerQuery("STORE compo_key_rows INTO 'cassandra://thriftKs/CompoKeyCopy?" + defaultParameters + "' using CassandraStorage();"); + pig.registerQuery("compo_key_rows = LOAD 'cassandra://thrift_ks/compo_key?" + defaultParameters + "' using CassandraStorage();"); + pig.registerQuery("STORE compo_key_rows INTO 'cassandra://thrift_ks/compo_key_copy?" + defaultParameters + "' using CassandraStorage();"); pig.executeBatch(); - pig.registerQuery("compo_key_copy_rows = LOAD 'cassandra://thriftKs/CompoKeyCopy?" + defaultParameters + "' using CassandraStorage();"); + pig.registerQuery("compo_key_copy_rows = LOAD 'cassandra://thrift_ks/compo_key_copy?" + defaultParameters + "' using CassandraStorage();"); //((clock,10),{(1,z)}) //((clock,20),{(1,zzzz)}) //((clock,30),{(2,daddy?)}) @@ -753,11 +718,10 @@ else if ("clock".equals(key.get(0)) && (Long) key.get(1) == 30L) } } } - Assert.assertEquals(count, 4); + Assert.assertEquals(4, count); } - private String getColumnValue(String ks, String cf, String colName, String key, String validator) - throws AuthenticationException, AuthorizationException, InvalidRequestException, UnavailableException, TimedOutException, TException, NotFoundException, IOException + private String getColumnValue(String ks, String cf, String colName, String key, String validator) throws TException, IOException { Cassandra.Client client = getClient(); client.set_keyspace(ks); @@ -770,17 +734,4 @@ private String getColumnValue(String ks, String cf, String colName, String key, ColumnOrSuperColumn got = client.get(key_user_id, cp, ConsistencyLevel.ONE); return parseType(validator).getString(got.getColumn().value); } - - private void executeCliStatements(String[] statements) throws CharacterCodingException, ClassNotFoundException, TException, TimedOutException, NotFoundException, InvalidRequestException, NoSuchFieldException, UnavailableException, IllegalAccessException, InstantiationException - { - CliMain.connect("127.0.0.1", 9170); - try - { - for (String stmt : statements) - CliMain.processStatement(stmt); - } - catch (Exception e) - { - } - } } diff --git a/test/unit/org/apache/cassandra/cli/CliTest.java b/test/unit/org/apache/cassandra/cli/CliTest.java deleted file mode 100644 index 568ebf3fc2d3..000000000000 --- a/test/unit/org/apache/cassandra/cli/CliTest.java +++ /dev/null @@ -1,341 +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.cli; - -import org.apache.cassandra.SchemaLoader; -import org.apache.cassandra.config.KSMetaData; -import org.apache.cassandra.config.DatabaseDescriptor; -import org.apache.cassandra.config.Schema; -import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.locator.SimpleStrategy; -import org.apache.cassandra.service.EmbeddedCassandraService; -import org.apache.cassandra.thrift.*; -import org.apache.thrift.TException; -import org.junit.BeforeClass; -import org.junit.Test; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.PrintStream; -import java.util.regex.Pattern; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -public class CliTest -{ - private static final String KEYSPACE1 = "CliTest"; - private static final String CF_STANDARD1 = "Standard1"; - - // please add new statements here so they could be auto-runned by this test. - private String[] statements = { - "use " + KEYSPACE1, - "create column family SecondaryIndicesWithoutIdxName" + - " with comparator = UTF8Type" + - " and default_validation_class = UTF8Type" + - " and column_metadata = [{column_name: profileId, validation_class: UTF8Type, index_type: KEYS}];", - "update column family SecondaryIndicesWithoutIdxName" + - " with column_metadata = " + - "[{column_name: profileId, validation_class: UTF8Type, index_type: KEYS}," + - "{column_name: postedDate, validation_class: LongType}];", - "create column family 123 with comparator=UTF8Type and column_metadata=[{ column_name:world, validation_class:IntegerType, index_type:0, index_name:IdxName }, " + - "{ column_name:world2, validation_class:LongType, index_type:KEYS, index_name:LongIdxName}, " + - "{ column_name:617070, validation_class:UTF8Type, index_type:KEYS }, " + - "{ column_name:'-617071', validation_class:UTF8Type, index_type:KEYS }," + - "{ column_name:time_spent_uuid, validation_class:TimeUUIDType}] and default_validation_class=UTF8Type;", - "assume 123 keys as utf8;", - "set 123[hello][world] = 123848374878933948398384;", - "set 123[hello][test_quote] = 'value\\'';", - "set 123['k\\'ey'][VALUE] = 'VAL';", - "set 123['k\\'ey'][VALUE] = 'VAL\\'';", - "set 123[hello][-31337] = 'some string value';", - "list 123;", - "list 123[:];", - "list 123[456:];", - "list 123 limit 5;", - "list 123[12:15] limit 20;", - "list 123[12:15] columns 2;", - "list 123 columns 2 reversed;", - "list 123 limit 10 columns 2 reversed;", - "get 123[hello][-31337];", - "get 123[hello][world];", - "get 123[hello][test_quote];", - "get 123['k\\'ey'][VALUE]", - "set 123[hello][-31337] = -23876;", - "set 123[hello][world2] = 15;", - "get 123 where world2 = long(15);", - "get 123 where world2 = long(15);", - "get 123 where world2 = long(15);", - "del 123[utf8('hello')][utf8('world')];", - "del 123[hello][world2];", - "set 123['hello'][time_spent_uuid] = timeuuid(a8098c1a-f86e-11da-bd1a-00112444be1e);", - "create column family CF2 with comparator=IntegerType and default_validation_class=AsciiType;", - "assume CF2 keys as utf8;", - "set CF2['key'][98349387493847748398334] = 'some text';", - "get CF2['key'][98349387493847748398334];", - "set CF2['key'][98349387493] = 'some text other';", - "get CF2['key'][98349387493];", - "create column family CF3 with comparator=UTF8Type and column_metadata=[{column_name:'big world', validation_class:LongType, index_type:KEYS, index_name:WorldIdx}];", - "assume CF3 keys as utf8;", - "set CF3['hello']['big world'] = 3748;", - "get CF3['hello']['big world'];", - "list CF3;", - "list CF3[:];", - "list CF3[h:];", - "list CF3 limit 10;", - "list CF3[h:] limit 10;", - "create column family CF4 with comparator=IntegerType and column_metadata=[{column_name:9999, validation_class:LongType}];", - "assume CF4 keys as utf8;", - "set CF4['hello'][9999] = 1234;", - "get CF4['hello'][9999];", - "get CF4['hello'][9999] as Long;", - "get CF4['hello'][9999] as Bytes;", - "set CF4['hello'][9999] = Long(1234);", - "get CF4['hello'][9999];", - "get CF4['hello'][9999] as Long;", - "del CF4['hello'][9999];", - "get CF4['hello'][9999];", - "create column family sCf1 with column_type=Super and comparator=IntegerType and subcomparator=LongType and column_metadata=[{column_name:9999, validation_class:LongType}];", - "assume sCf1 keys as utf8;", - "set sCf1['hello'][1][9999] = 1234;", - "get sCf1['hello'][1][9999];", - "get sCf1['hello'][1][9999] as Long;", - "get sCf1['hello'][1][9999] as Bytes;", - "set sCf1['hello'][1][9999] = Long(1234);", - "set sCf1['hello'][-1][-12] = Long(5678);", - "get sCf1['hello'][-1][-12];", - "set sCf1['hello'][-1][-12] = -340897;", - "set sCf1['hello'][-1][-12] = integer(-340897);", - "get sCf1['hello'][1][9999];", - "get sCf1['hello'][1][9999] as Long;", - "del sCf1['hello'][1][9999];", - "get sCf1['hello'][1][9999];", - "set sCf1['hello'][1][9999] = Long(1234);", - "del sCf1['hello'][9999];", - "get sCf1['hello'][1][9999];", - "create column family 'Counter1' with comparator=UTF8Type and default_validation_class=CounterColumnType;", - "assume Counter1 keys as utf8;", - "incr Counter1['hello']['cassandra'];", - "incr Counter1['hello']['cassandra'] by 3;", - "incr Counter1['hello']['cassandra'] by -2;", - "decr Counter1['hello']['cassandra'];", - "decr Counter1['hello']['cassandra'] by 3;", - "decr Counter1['hello']['cassandra'] by -2;", - "get Counter1['hello']['cassandra'];", - "get Counter1['hello'];", - "truncate 123;", - "drop index on '123'.world2;", - "drop index on '123'.617070;", - "drop index on '123'.'-617071';", - "drop index on CF3.'big world';", - "update keyspace " + KEYSPACE1 + " with durable_writes = false;", - "assume 123 comparator as utf8;", - "assume 123 sub_comparator as integer;", - "assume 123 validator as lexicaluuid;", - "assume 123 keys as timeuuid;", - "create column family CF7;", - "assume CF7 keys as utf8;", - "set CF7[1][timeuuid()] = utf8(test1);", - "set CF7[2][lexicaluuid()] = utf8('hello world!');", - "set CF7[3][lexicaluuid(550e8400-e29b-41d4-a716-446655440000)] = utf8(test2);", - "set CF7[key2][timeuuid()] = utf8(test3);", - "assume CF7 comparator as lexicaluuid;", - "assume CF7 keys as utf8;", - "list CF7;", - "get CF7[3];", - "get CF7[3][lexicaluuid(550e8400-e29b-41d4-a716-446655440000)];", - "get sCf1['hello'][1][9999];", - "set sCf1['hello'][1][9999] = 938;", - "set sCf1['hello'][1][9999] = 938 with ttl = 30;", - "set sCf1['hello'][1][9999] = 938 with ttl = 560;", - "count sCf1[hello];", - "count sCf1[utf8('hello')];", - "count sCf1[utf8('hello')][integer(1)];", - "count sCf1[hello][1];", - "list sCf1;", - "del sCf1['hello'][1][9999];", - "assume sCf1 comparator as utf8;", - "create column family CF8;", - "drop column family cF8;", - "create keyspace TESTIN;", - "drop keyspace tesTIN;", - "update column family 123 with comparator=UTF8Type and column_metadata=[];", - "drop column family 123;", - "create column family myCF with column_type='Super' and comparator='UTF8Type' AND subcomparator='UTF8Type' AND default_validation_class=AsciiType;", - "assume myCF keys as utf8;", - "create column family Countries with comparator=UTF8Type and column_metadata=[ {column_name: name, validation_class: UTF8Type} ];", - "set Countries[11][name] = USA;", - "get Countries[11][name];", - "update column family Countries with compaction_strategy = 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy';", - "create column family Cities with compaction_strategy = 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy' and compaction_strategy_options = {min_sstable_size:1024};", - "set myCF['key']['scName']['firstname'] = 'John';", - "get myCF['key']['scName']", - "assume CF3 keys as utf8;", - "use " + KEYSPACE1 + ";", - "update keyspace " + KEYSPACE1 + " with placement_strategy='org.apache.cassandra.locator.NetworkTopologyStrategy';", - "update keyspace " + KEYSPACE1 + " with strategy_options={DC1:3, DC2:4, DC5:1};", - "describe cluster;", - "help describe cluster;", - "show cluster name", - "show api version", - "help help", - "help connect", - "help use", - "help describe", - "HELP exit", - "help QUIT", - "help show cluster name", - "help show keyspaces", - "help show schema", - "help show api version", - "help create keyspace", - "HELP update KEYSPACE", - "HELP CREATE column FAMILY", - "HELP UPDATE COLUMN family", - "HELP drop keyspace", - "help drop column family", - "HELP GET", - "HELP set", - "HELP DEL", - "HELP count", - "HELP list", - "HELP TRUNCATE", - "help assume", - "HELP", - "?", - "show schema", - "show schema " + KEYSPACE1 - }; - - @BeforeClass - public static void defineSchema() throws ConfigurationException - { - SchemaLoader.prepareServer(); - SchemaLoader.startGossiper(); - SchemaLoader.createKeyspace(KEYSPACE1, true, false, - SimpleStrategy.class, - KSMetaData.optsWithRF(1), - SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1)); - } - - @Test - public void testCli() throws IOException, TException, TimedOutException, NotFoundException, SchemaDisagreementException, NoSuchFieldException, InvalidRequestException, UnavailableException, InstantiationException, IllegalAccessException - { - Schema.instance.clear(); // Schema are now written on disk and will be reloaded - new EmbeddedCassandraService().start(); - - // new error/output streams for CliSessionState - ByteArrayOutputStream errStream = new ByteArrayOutputStream(); - ByteArrayOutputStream outStream = new ByteArrayOutputStream(); - - // checking if we can connect to the running cassandra node on localhost - CliMain.connect("127.0.0.1", DatabaseDescriptor.getRpcPort()); - - // setting new output stream - CliMain.sessionState.setOut(new PrintStream(outStream)); - CliMain.sessionState.setErr(new PrintStream(errStream)); - - // re-creating keyspace for tests - try - { - // dropping in case it exists e.g. could be left from previous run - CliMain.processStatement(String.format("drop keyspace %s;", KEYSPACE1)); - } - catch (Exception e) - { - // TODO check before drop so we don't have this fragile ignored exception block - } - CliMain.processStatement(String.format("create keyspace %s;", KEYSPACE1)); - - for (String statement : statements) - { - errStream.reset(); - // System.out.println("Executing statement: " + statement); - CliMain.processStatement(statement); - String result = outStream.toString(); - // System.out.println("Result:\n" + result); - if (statement.startsWith("show schema")) - assertEquals(errStream.toString() + "processing" + statement, - "\nWARNING: CQL3 tables are intentionally omitted from 'show schema' output." + String.format("%n") - + "See https://issues.apache.org/jira/browse/CASSANDRA-4377 for details.\n" + String.format("%n"), - errStream.toString()); - else - assertEquals(errStream.toString() + " processing " + statement, "", errStream.toString()); - - if (statement.startsWith("drop ") || statement.startsWith("create ") || statement.startsWith("update ")) - { - assert Pattern.compile("(.{8})-(.{4})-(.{4})-(.{4})-(.{12}).*", Pattern.DOTALL).matcher(result).matches() - : String.format("\"%s\" failed: %s", statement, result); - } - else if (statement.startsWith("set ")) - { - assertTrue(result.contains("Value inserted.")); - assertTrue(result.contains("Elapsed time:")); - } - else if (statement.startsWith("incr ")) - { - assertTrue(result.contains("Value incremented.")); - } - else if (statement.startsWith("decr ")) - { - assertTrue(result.contains("Value decremented.")); - } - else if (statement.startsWith("get ")) - { - if (statement.contains("where")) - { - assertTrue(result.startsWith("-------------------" + System.getProperty("line.separator") + "RowKey:")); - } - else if (statement.contains("Counter")) - { - assertTrue(result.startsWith("=> (counter=") || result.startsWith("Value was not found")); - } - else - { - assertTrue(result.startsWith("=> (name=") || result.startsWith("Value was not found")); - } - assertTrue(result.contains("Elapsed time:")); - } - else if (statement.startsWith("truncate ")) - { - assertTrue(result.contains(" truncated.")); - } - else if (statement.startsWith("assume ")) - { - assertTrue(result.contains("successfully.")); - } - - outStream.reset(); // reset stream so we have only output from next statement all the time - errStream.reset(); // no errors to the end user. - } - } - - @Test - public void testEscape() - { - //escaped is the string read from the cli. - String escaped = "backspace \\b tab \\t linefeed \\n form feed \\f carriage return \\r duble quote \\\" " + - "single quote \\' backslash \\\\"; - String unescaped = "backspace \b tab \t linefeed \n form feed \f carriage return \r duble quote \" " + - "single quote ' backslash \\"; - // when read from the cli may have single quotes around it - assertEquals(unescaped, CliUtils.unescapeSQLString("'" + escaped + "'")); - assertEquals(escaped, CliUtils.escapeSQLString(unescaped)); - } -} From 04f0d412b271af0dbe7665976a4165dfd0dfcb66 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Fri, 26 Sep 2014 23:08:30 -0400 Subject: [PATCH 146/557] no need to fetch throughput if no compactions --- src/java/org/apache/cassandra/tools/NodeTool.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/cassandra/tools/NodeTool.java b/src/java/org/apache/cassandra/tools/NodeTool.java index e768d4780c7b..217e47f66003 100644 --- a/src/java/org/apache/cassandra/tools/NodeTool.java +++ b/src/java/org/apache/cassandra/tools/NodeTool.java @@ -1171,13 +1171,13 @@ public static class CompactionStats extends NodeToolCmd @Override public void execute(NodeProbe probe) { - int compactionThroughput = probe.getCompactionThroughput(); CompactionManagerMBean cm = probe.getCompactionManagerProxy(); System.out.println("pending tasks: " + probe.getCompactionMetric("PendingTasks")); long remainingBytes = 0; List> compactions = cm.getCompactions(); if (!compactions.isEmpty()) { + int compactionThroughput = probe.getCompactionThroughput(); List lines = new ArrayList<>(); int[] columnSizes = new int[] { 0, 0, 0, 0, 0, 0, 0 }; From ada8d8b60b61653112073538a6335bb30027838a Mon Sep 17 00:00:00 2001 From: Jonathan Ellis Date: Wed, 1 Oct 2014 12:08:29 -0500 Subject: [PATCH 147/557] Fail on very large batch sizes patch by Carl Yeksigian; reviewed by Sankalp Kohli for CASSANDRA-8011 --- CHANGES.txt | 1 + NEWS.txt | 2 ++ conf/cassandra.yaml | 3 +++ .../org/apache/cassandra/config/Config.java | 1 + .../cassandra/config/DatabaseDescriptor.java | 20 +++++++++++++++++++ .../cql3/statements/BatchStatement.java | 17 +++++++++++++--- .../cassandra/service/StorageService.java | 10 ++++++++++ .../service/StorageServiceMBean.java | 5 +++++ .../org/apache/cassandra/cql3/BatchTests.java | 12 +++++++++++ 9 files changed, 68 insertions(+), 3 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 6720cc874223..682f5d3a04fb 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -24,6 +24,7 @@ * Shorten SSTable path (CASSANDRA-6962) * Use unsafe mutations for most unit tests (CASSANDRA-6969) * Fix race condition during calculation of pending ranges (CASSANDRA-7390) + * Fail on very large batch sizes (CASSANDRA-8011) 2.1.1 diff --git a/NEWS.txt b/NEWS.txt index 96f2c05c6f7e..74ebb41f21af 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -30,6 +30,8 @@ Upgrading GossipingPropertyFileSnitch instead. - CQL2 has been removed entirely in this release (previously deprecated in 2.0.0). Please switch to CQL3 if you haven't already done so. + - Very large batches will now be rejected (defaults to 50kb). This + can be customized by modifying batch_size_fail_threshold_in_kb. 2.1 diff --git a/conf/cassandra.yaml b/conf/cassandra.yaml index 8711625b563e..137dc1405755 100644 --- a/conf/cassandra.yaml +++ b/conf/cassandra.yaml @@ -514,6 +514,9 @@ column_index_size_in_kb: 64 # Caution should be taken on increasing the size of this threshold as it can lead to node instability. batch_size_warn_threshold_in_kb: 5 +# Fail any batch exceeding this value. 50kb (10x warn threshold) by default. +batch_size_fail_threshold_in_kb: 50 + # Number of simultaneous compactions to allow, NOT including # validation "compactions" for anti-entropy repair. Simultaneous # compactions can help preserve read performance in a mixed read/write diff --git a/src/java/org/apache/cassandra/config/Config.java b/src/java/org/apache/cassandra/config/Config.java index bb0744927102..0f525cd5d360 100644 --- a/src/java/org/apache/cassandra/config/Config.java +++ b/src/java/org/apache/cassandra/config/Config.java @@ -132,6 +132,7 @@ public class Config /* if the size of columns or super-columns are more than this, indexing will kick in */ public Integer column_index_size_in_kb = 64; public Integer batch_size_warn_threshold_in_kb = 5; + public volatile Integer batch_size_fail_threshold_in_kb = 50; public Integer concurrent_compactors; public volatile Integer compaction_throughput_mb_per_sec = 16; diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java index 0310537a5813..64d7ec8ca25a 100644 --- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java +++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java @@ -619,6 +619,11 @@ else if (conf.num_tokens > MAX_NUM_TOKENS) } if (seedProvider.getSeeds().size() == 0) throw new ConfigurationException("The seed provider lists no seeds."); + + if (conf.batch_size_fail_threshold_in_kb == null) + { + conf.batch_size_fail_threshold_in_kb = conf.batch_size_warn_threshold_in_kb * 10; + } } private static IEndpointSnitch createEndpointSnitch(String snitchClassName) throws ConfigurationException @@ -791,6 +796,21 @@ public static int getBatchSizeWarnThreshold() return conf.batch_size_warn_threshold_in_kb * 1024; } + public static long getBatchSizeFailThreshold() + { + return conf.batch_size_fail_threshold_in_kb * 1024L; + } + + public static int getBatchSizeFailThresholdInKB() + { + return conf.batch_size_fail_threshold_in_kb; + } + + public static void setBatchSizeFailThresholdInKB(int threshold) + { + conf.batch_size_fail_threshold_in_kb = threshold; + } + public static Collection getInitialTokens() { return tokensFromString(System.getProperty("cassandra.initial_token", conf.initial_token)); diff --git a/src/java/org/apache/cassandra/cql3/statements/BatchStatement.java b/src/java/org/apache/cassandra/cql3/statements/BatchStatement.java index 17d177110059..8d380dcc0550 100644 --- a/src/java/org/apache/cassandra/cql3/statements/BatchStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/BatchStatement.java @@ -23,6 +23,7 @@ import com.google.common.base.Function; import com.google.common.collect.*; import org.apache.cassandra.config.DatabaseDescriptor; +import org.apache.cassandra.tracing.Tracing; import org.github.jamm.MemoryMeter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -237,10 +238,11 @@ private void addStatementMutations(ModificationStatement statement, * Checks batch size to ensure threshold is met. If not, a warning is logged. * @param cfs ColumnFamilies that will store the batch's mutations. */ - public static void verifyBatchSize(Iterable cfs) + public static void verifyBatchSize(Iterable cfs) throws InvalidRequestException { long size = 0; long warnThreshold = DatabaseDescriptor.getBatchSizeWarnThreshold(); + long failThreshold = DatabaseDescriptor.getBatchSizeFailThreshold(); for (ColumnFamily cf : cfs) size += cf.dataSize(); @@ -251,8 +253,17 @@ public static void verifyBatchSize(Iterable cfs) for (ColumnFamily cf : cfs) ksCfPairs.add(cf.metadata().ksName + "." + cf.metadata().cfName); - String format = "Batch of prepared statements for {} is of size {}, exceeding specified threshold of {} by {}."; - logger.warn(format, ksCfPairs, size, warnThreshold, size - warnThreshold); + String format = "Batch of prepared statements for {} is of size {}, exceeding specified threshold of {} by {}.{}"; + if (size > failThreshold) + { + Tracing.trace(format, new Object[] {ksCfPairs, size, failThreshold, size - failThreshold, " (see batch_size_fail_threshold_in_kb)"}); + logger.error(format, ksCfPairs, size, failThreshold, size - failThreshold, " (see batch_size_fail_threshold_in_kb)"); + throw new InvalidRequestException(String.format("Batch too large")); + } + else if (logger.isWarnEnabled()) + { + logger.warn(format, ksCfPairs, size, warnThreshold, size - warnThreshold, ""); + } } } diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index c114863c1c1e..af5e9755d515 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -4054,6 +4054,16 @@ public void setTombstoneFailureThreshold(int threshold) DatabaseDescriptor.setTombstoneFailureThreshold(threshold); } + public int getBatchSizeFailureThreshold() + { + return DatabaseDescriptor.getBatchSizeFailThresholdInKB(); + } + + public void setBatchSizeFailureThreshold(int threshold) + { + DatabaseDescriptor.setBatchSizeFailThresholdInKB(threshold); + } + public void setHintedHandoffThrottleInKB(int throttleInKB) { DatabaseDescriptor.setHintedHandoffThrottleInKB(throttleInKB); diff --git a/src/java/org/apache/cassandra/service/StorageServiceMBean.java b/src/java/org/apache/cassandra/service/StorageServiceMBean.java index 1331b50c4e97..cc54639fca2e 100644 --- a/src/java/org/apache/cassandra/service/StorageServiceMBean.java +++ b/src/java/org/apache/cassandra/service/StorageServiceMBean.java @@ -512,6 +512,11 @@ public interface StorageServiceMBean extends NotificationEmitter /** Sets the threshold for abandoning queries with many tombstones */ public void setTombstoneFailureThreshold(int tombstoneDebugThreshold); + /** Returns the threshold for rejecting queries due to a large batch size */ + public int getBatchSizeFailureThreshold(); + /** Sets the threshold for rejecting queries due to a large batch size */ + public void setBatchSizeFailureThreshold(int batchSizeDebugThreshold); + /** Sets the hinted handoff throttle in kb per second, per delivery thread. */ public void setHintedHandoffThrottleInKB(int throttleInKB); } diff --git a/test/unit/org/apache/cassandra/cql3/BatchTests.java b/test/unit/org/apache/cassandra/cql3/BatchTests.java index 27d407e2d36b..490523376298 100644 --- a/test/unit/org/apache/cassandra/cql3/BatchTests.java +++ b/test/unit/org/apache/cassandra/cql3/BatchTests.java @@ -122,6 +122,18 @@ public void testCounterInLoggedBatch() sendBatch(BatchStatement.Type.LOGGED, true, false); } + @Test(expected = InvalidQueryException.class) + public void testOversizedBatch() + { + int SIZE_FOR_FAILURE = 2500; + BatchStatement b = new BatchStatement(BatchStatement.Type.UNLOGGED); + for (int i = 0; i < SIZE_FOR_FAILURE; i++) + { + b.add(noncounter.bind(i, "foobar")); + } + session.execute(b); + } + public void sendBatch(BatchStatement.Type type, boolean addCounter, boolean addNonCounter) From b9125055624ae18a8f871a8af8c1b5b8717a62aa Mon Sep 17 00:00:00 2001 From: Sylvain Lebresne Date: Thu, 2 Oct 2014 11:34:34 +0200 Subject: [PATCH 148/557] Add protocol v4 spec document --- doc/native_protocol_v4.spec | 899 ++++++++++++++++++++++++++++++++++++ 1 file changed, 899 insertions(+) create mode 100644 doc/native_protocol_v4.spec diff --git a/doc/native_protocol_v4.spec b/doc/native_protocol_v4.spec new file mode 100644 index 000000000000..02aac3b834fb --- /dev/null +++ b/doc/native_protocol_v4.spec @@ -0,0 +1,899 @@ + + CQL BINARY PROTOCOL v4 + + +Table of Contents + + 1. Overview + 2. Frame header + 2.1. version + 2.2. flags + 2.3. stream + 2.4. opcode + 2.5. length + 3. Notations + 4. Messages + 4.1. Requests + 4.1.1. STARTUP + 4.1.2. AUTH_RESPONSE + 4.1.3. OPTIONS + 4.1.4. QUERY + 4.1.5. PREPARE + 4.1.6. EXECUTE + 4.1.7. BATCH + 4.1.8. REGISTER + 4.2. Responses + 4.2.1. ERROR + 4.2.2. READY + 4.2.3. AUTHENTICATE + 4.2.4. SUPPORTED + 4.2.5. RESULT + 4.2.5.1. Void + 4.2.5.2. Rows + 4.2.5.3. Set_keyspace + 4.2.5.4. Prepared + 4.2.5.5. Schema_change + 4.2.6. EVENT + 4.2.7. AUTH_CHALLENGE + 4.2.8. AUTH_SUCCESS + 5. Compression + 6. Collection types + 7. User Defined and tuple types + 8. Result paging + 9. Error codes + 10. Changes from v3 + + +1. Overview + + The CQL binary protocol is a frame based protocol. Frames are defined as: + + 0 8 16 24 32 40 + +---------+---------+---------+---------+---------+ + | version | flags | stream | opcode | + +---------+---------+---------+---------+---------+ + | length | + +---------+---------+---------+---------+ + | | + . ... body ... . + . . + . . + +---------------------------------------- + + The protocol is big-endian (network byte order). + + Each frame contains a fixed size header (9 bytes) followed by a variable size + body. The header is described in Section 2. The content of the body depends + on the header opcode value (the body can in particular be empty for some + opcode values). The list of allowed opcode is defined Section 2.3 and the + details of each corresponding message is described Section 4. + + The protocol distinguishes 2 types of frames: requests and responses. Requests + are those frame sent by the clients to the server, response are the ones sent + by the server. Note however that the protocol supports server pushes (events) + so responses does not necessarily come right after a client request. + + Note to client implementors: clients library should always assume that the + body of a given frame may contain more data than what is described in this + document. It will however always be safe to ignore the remaining of the frame + body in such cases. The reason is that this may allow to sometimes extend the + protocol with optional features without needing to change the protocol + version. + + + +2. Frame header + +2.1. version + + The version is a single byte that indicate both the direction of the message + (request or response) and the version of the protocol in use. The up-most bit + of version is used to define the direction of the message: 0 indicates a + request, 1 indicates a responses. This can be useful for protocol analyzers to + distinguish the nature of the packet from the direction which it is moving. + The rest of that byte is the protocol version (4 for the protocol defined in + this document). In other words, for this version of the protocol, version will + have one of: + 0x04 Request frame for this protocol version + 0x84 Response frame for this protocol version + + Please note that the while every message ship with the version, only one version + of messages is accepted on a given connection. In other words, the first message + exchanged (STARTUP) sets the version for the connection for the lifetime of this + connection. + + This document describe the version 3 of the protocol. For the changes made since + version 3, see Section 10. + + +2.2. flags + + Flags applying to this frame. The flags have the following meaning (described + by the mask that allow to select them): + 0x01: Compression flag. If set, the frame body is compressed. The actual + compression to use should have been set up beforehand through the + Startup message (which thus cannot be compressed; Section 4.1.1). + 0x02: Tracing flag. For a request frame, this indicate the client requires + tracing of the request. Note that not all requests support tracing. + Currently, only QUERY, PREPARE and EXECUTE queries support tracing. + Other requests will simply ignore the tracing flag if set. If a + request support tracing and the tracing flag was set, the response to + this request will have the tracing flag set and contain tracing + information. + If a response frame has the tracing flag set, its body contains + a tracing ID. The tracing ID is a [uuid] and is the first thing in + the frame body. The rest of the body will then be the usual body + corresponding to the response opcode. + + The rest of the flags is currently unused and ignored. + +2.3. stream + + A frame has a stream id (a [short] value). When sending request messages, this + stream id must be set by the client to a non-negative value (negative stream id + are reserved for streams initiated by the server; currently all EVENT messages + (section 4.2.6) have a streamId of -1). If a client sends a request message + with the stream id X, it is guaranteed that the stream id of the response to + that message will be X. + + This allow to deal with the asynchronous nature of the protocol. If a client + sends multiple messages simultaneously (without waiting for responses), there + is no guarantee on the order of the responses. For instance, if the client + writes REQ_1, REQ_2, REQ_3 on the wire (in that order), the server might + respond to REQ_3 (or REQ_2) first. Assigning different stream id to these 3 + requests allows the client to distinguish to which request an received answer + respond to. As there can only be 32768 different simultaneous streams, it is up + to the client to reuse stream id. + + Note that clients are free to use the protocol synchronously (i.e. wait for + the response to REQ_N before sending REQ_N+1). In that case, the stream id + can be safely set to 0. Clients should also feel free to use only a subset of + the 32768 maximum possible stream ids if it is simpler for those + implementation. + +2.4. opcode + + An integer byte that distinguish the actual message: + 0x00 ERROR + 0x01 STARTUP + 0x02 READY + 0x03 AUTHENTICATE + 0x05 OPTIONS + 0x06 SUPPORTED + 0x07 QUERY + 0x08 RESULT + 0x09 PREPARE + 0x0A EXECUTE + 0x0B REGISTER + 0x0C EVENT + 0x0D BATCH + 0x0E AUTH_CHALLENGE + 0x0F AUTH_RESPONSE + 0x10 AUTH_SUCCESS + + Messages are described in Section 4. + + (Note that there is no 0x04 message in this version of the protocol) + + +2.5. length + + A 4 byte integer representing the length of the body of the frame (note: + currently a frame is limited to 256MB in length). + + +3. Notations + + To describe the layout of the frame body for the messages in Section 4, we + define the following: + + [int] A 4 bytes integer + [long] A 8 bytes integer + [short] A 2 bytes unsigned integer + [string] A [short] n, followed by n bytes representing an UTF-8 + string. + [long string] An [int] n, followed by n bytes representing an UTF-8 string. + [uuid] A 16 bytes long uuid. + [string list] A [short] n, followed by n [string]. + [bytes] A [int] n, followed by n bytes if n >= 0. If n < 0, + no byte should follow and the value represented is `null`. + [short bytes] A [short] n, followed by n bytes if n >= 0. + + [option] A pair of where is a [short] representing + the option id and depends on that option (and can be + of size 0). The supported id (and the corresponding ) + will be described when this is used. + [option list] A [short] n, followed by n [option]. + [inet] An address (ip and port) to a node. It consists of one + [byte] n, that represents the address size, followed by n + [byte] representing the IP address (in practice n can only be + either 4 (IPv4) or 16 (IPv6)), following by one [int] + representing the port. + [consistency] A consistency level specification. This is a [short] + representing a consistency level with the following + correspondance: + 0x0000 ANY + 0x0001 ONE + 0x0002 TWO + 0x0003 THREE + 0x0004 QUORUM + 0x0005 ALL + 0x0006 LOCAL_QUORUM + 0x0007 EACH_QUORUM + 0x0008 SERIAL + 0x0009 LOCAL_SERIAL + 0x000A LOCAL_ONE + + [string map] A [short] n, followed by n pair where and + are [string]. + [string multimap] A [short] n, followed by n pair where is a + [string] and is a [string list]. + + +4. Messages + +4.1. Requests + + Note that outside of their normal responses (described below), all requests + can get an ERROR message (Section 4.2.1) as response. + +4.1.1. STARTUP + + Initialize the connection. The server will respond by either a READY message + (in which case the connection is ready for queries) or an AUTHENTICATE message + (in which case credentials will need to be provided using AUTH_RESPONSE). + + This must be the first message of the connection, except for OPTIONS that can + be sent before to find out the options supported by the server. Once the + connection has been initialized, a client should not send any more STARTUP + message. + + The body is a [string map] of options. Possible options are: + - "CQL_VERSION": the version of CQL to use. This option is mandatory and + currenty, the only version supported is "3.0.0". Note that this is + different from the protocol version. + - "COMPRESSION": the compression algorithm to use for frames (See section 5). + This is optional, if not specified no compression will be used. + + +4.1.2. AUTH_RESPONSE + + Answers a server authentication challenge. + + Authentication in the protocol is SASL based. The server sends authentication + challenges (a bytes token) to which the client answer with this message. Those + exchanges continue until the server accepts the authentication by sending a + AUTH_SUCCESS message after a client AUTH_RESPONSE. It is however that client that + initiate the exchange by sending an initial AUTH_RESPONSE in response to a + server AUTHENTICATE request. + + The body of this message is a single [bytes] token. The details of what this + token contains (and when it can be null/empty, if ever) depends on the actual + authenticator used. + + The response to a AUTH_RESPONSE is either a follow-up AUTH_CHALLENGE message, + an AUTH_SUCCESS message or an ERROR message. + + +4.1.3. OPTIONS + + Asks the server to return what STARTUP options are supported. The body of an + OPTIONS message should be empty and the server will respond with a SUPPORTED + message. + + +4.1.4. QUERY + + Performs a CQL query. The body of the message must be: + + where is a [long string] representing the query and + must be + [[name_1]...[name_n]][][][][] + where: + - is the [consistency] level for the operation. + - is a [byte] whose bits define the options for this query and + in particular influence what the remainder of the message contains. + A flag is set if the bit corresponding to its `mask` is set. Supported + flags are, given there mask: + 0x01: Values. In that case, a [short] followed by [bytes] + values are provided. Those value are used for bound variables in + the query. Optionally, if the 0x40 flag is present, each value + will be preceded by a [string] name, representing the name of + the marker the value must be binded to. This is optional, and + if not present, values will be binded by position. + 0x02: Skip_metadata. If present, the Result Set returned as a response + to that query (if any) will have the NO_METADATA flag (see + Section 4.2.5.2). + 0x04: Page_size. In that case, is an [int] + controlling the desired page size of the result (in CQL3 rows). + See the section on paging (Section 8) for more details. + 0x08: With_paging_state. If present, should be present. + is a [bytes] value that should have been returned + in a result set (Section 4.2.5.2). If provided, the query will be + executed but starting from a given paging state. This also to + continue paging on a different node from the one it has been + started (See Section 8 for more details). + 0x10: With serial consistency. If present, should be + present. is the [consistency] level for the + serial phase of conditional updates. That consitency can only be + either SERIAL or LOCAL_SERIAL and if not present, it defaults to + SERIAL. This option will be ignored for anything else that a + conditional update/insert. + 0x20: With default timestamp. If present, should be present. + is a [long] representing the default timestamp for the query + in microseconds (negative values are forbidden). If provided, this will + replace the server side assigned timestamp as default timestamp. + Note that a timestamp in the query itself will still override + this timestamp. This is entirely optional. + 0x40: With names for values. This only makes sense if the 0x01 flag is set and + is ignored otherwise. If present, the values from the 0x01 flag will + be preceded by a name (see above). Note that this is only useful for + QUERY requests where named bind markers are used; for EXECUTE statements, + since the names for the expected values was returned during preparation, + a client can always provide values in the right order without any names + and using this flag, while supported, is almost surely inefficient. + + Note that the consistency is ignored by some queries (USE, CREATE, ALTER, + TRUNCATE, ...). + + The server will respond to a QUERY message with a RESULT message, the content + of which depends on the query. + + +4.1.5. PREPARE + + Prepare a query for later execution (through EXECUTE). The body consists of + the CQL query to prepare as a [long string]. + + The server will respond with a RESULT message with a `prepared` kind (0x0004, + see Section 4.2.5). + + +4.1.6. EXECUTE + + Executes a prepared query. The body of the message must be: + + where is the prepared query ID. It's the [short bytes] returned as a + response to a PREPARE message. As for , it has the exact + same definition than in QUERY (see Section 4.1.4). + + The response from the server will be a RESULT message. + + +4.1.7. BATCH + + Allows executing a list of queries (prepared or not) as a batch (note that + only DML statements are accepted in a batch). The body of the message must + be: + ...[][] + where: + - is a [byte] indicating the type of batch to use: + - If == 0, the batch will be "logged". This is equivalent to a + normal CQL3 batch statement. + - If == 1, the batch will be "unlogged". + - If == 2, the batch will be a "counter" batch (and non-counter + statements will be rejected). + - is a [byte] whose bits define the options for this query and + in particular influence the remainder of the message contains. It is similar + to the from QUERY and EXECUTE methods, except that the 4 rightmost + bits must always be 0 as their corresponding option do not make sense for + Batch. A flag is set if the bit corresponding to its `mask` is set. Supported + flags are, given there mask: + 0x10: With serial consistency. If present, should be + present. is the [consistency] level for the + serial phase of conditional updates. That consitency can only be + either SERIAL or LOCAL_SERIAL and if not present, it defaults to + SERIAL. This option will be ignored for anything else that a + conditional update/insert. + 0x20: With default timestamp. If present, should be present. + is a [long] representing the default timestamp for the query + in microseconds. If provided, this will replace the server side assigned + timestamp as default timestamp. Note that a timestamp in the query itself + will still override this timestamp. This is entirely optional. + 0x40: With names for values. If set, then all values for all must be + preceded by a [string] that have the same meaning as in QUERY + requests. + - is a [short] indicating the number of following queries. + - ... are the queries to execute. A must be of the + form: + []...[] + where: + - is a [byte] indicating whether the following query is a prepared + one or not. value must be either 0 or 1. + - depends on the value of . If == 0, it should be + a [long string] query string (as in QUERY, the query string might contain + bind markers). Otherwise (that is, if == 1), it should be a + [short bytes] representing a prepared query ID. + - is a [short] indicating the number (possibly 0) of following values. + - is the optional name of the following . It must be present + if and only if the 0x40 flag is provided for the batch. + - is the [bytes] to use for bound variable i (of bound variable + if the 0x40 flag is used). + - is the [consistency] level for the operation. + - is only present if the 0x10 flag is set. In that case, + is the [consistency] level for the serial phase of + conditional updates. That consitency can only be either SERIAL or + LOCAL_SERIAL and if not present will defaults to SERIAL. This option will + be ignored for anything else that a conditional update/insert. + + The server will respond with a RESULT message. + + +4.1.8. REGISTER + + Register this connection to receive some type of events. The body of the + message is a [string list] representing the event types to register to. See + section 4.2.6 for the list of valid event types. + + The response to a REGISTER message will be a READY message. + + Please note that if a client driver maintains multiple connections to a + Cassandra node and/or connections to multiple nodes, it is advised to + dedicate a handful of connections to receive events, but to *not* register + for events on all connections, as this would only result in receiving + multiple times the same event messages, wasting bandwidth. + + +4.2. Responses + + This section describes the content of the frame body for the different + responses. Please note that to make room for future evolution, clients should + support extra informations (that they should simply discard) to the one + described in this document at the end of the frame body. + +4.2.1. ERROR + + Indicates an error processing a request. The body of the message will be an + error code ([int]) followed by a [string] error message. Then, depending on + the exception, more content may follow. The error codes are defined in + Section 9, along with their additional content if any. + + +4.2.2. READY + + Indicates that the server is ready to process queries. This message will be + sent by the server either after a STARTUP message if no authentication is + required, or after a successful CREDENTIALS message. + + The body of a READY message is empty. + + +4.2.3. AUTHENTICATE + + Indicates that the server require authentication, and which authentication + mechanism to use. + + The authentication is SASL based and thus consists on a number of server + challenges (AUTH_CHALLENGE, Section 4.2.7) followed by client responses + (AUTH_RESPONSE, Section 4.1.2). The Initial exchange is however boostrapped + by an initial client response. The details of that exchange (including how + much challenge-response pair are required) are specific to the authenticator + in use. The exchange ends when the server sends an AUTH_SUCCESS message or + an ERROR message. + + This message will be sent following a STARTUP message if authentication is + required and must be answered by a AUTH_RESPONSE message from the client. + + The body consists of a single [string] indicating the full class name of the + IAuthenticator in use. + + +4.2.4. SUPPORTED + + Indicates which startup options are supported by the server. This message + comes as a response to an OPTIONS message. + + The body of a SUPPORTED message is a [string multimap]. This multimap gives + for each of the supported STARTUP options, the list of supported values. + + +4.2.5. RESULT + + The result to a query (QUERY, PREPARE, EXECUTE or BATCH messages). + + The first element of the body of a RESULT message is an [int] representing the + `kind` of result. The rest of the body depends on the kind. The kind can be + one of: + 0x0001 Void: for results carrying no information. + 0x0002 Rows: for results to select queries, returning a set of rows. + 0x0003 Set_keyspace: the result to a `use` query. + 0x0004 Prepared: result to a PREPARE message. + 0x0005 Schema_change: the result to a schema altering query. + + The body for each kind (after the [int] kind) is defined below. + + +4.2.5.1. Void + + The rest of the body for a Void result is empty. It indicates that a query was + successful without providing more information. + + +4.2.5.2. Rows + + Indicates a set of rows. The rest of body of a Rows result is: + + where: + - is composed of: + [][?...] + where: + - is an [int]. The bits of provides information on the + formatting of the remaining informations. A flag is set if the bit + corresponding to its `mask` is set. Supported flags are, given there + mask: + 0x0001 Global_tables_spec: if set, only one table spec (keyspace + and table name) is provided as . If not + set, is not present. + 0x0002 Has_more_pages: indicates whether this is not the last + page of results and more should be retrieve. If set, the + will be present. The is a + [bytes] value that should be used in QUERY/EXECUTE to + continue paging and retrieve the remained of the result for + this query (See Section 8 for more details). + 0x0004 No_metadata: if set, the is only composed of + these , the and optionally the + (depending on the Has_more_pages flage) but + no other information (so no nor ). + This will only ever be the case if this was requested + during the query (see QUERY and RESULT messages). + - is an [int] representing the number of columns selected + by the query this result is of. It defines the number of + elements in and the number of element for each row in . + - is present if the Global_tables_spec is set in + . If present, it is composed of two [string] representing the + (unique) keyspace name and table name the columns return are of. + - specifies the columns returned in the query. There is + such column specifications that are composed of: + ()? + The initial and are two [string] are only present + if the Global_tables_spec flag is not set. The is a + [string] and is an [option] that correspond to the description + (what this description is depends a bit on the context: in results to + selects, this will be either the user chosen alias or the selection used + (often a colum name, but it can be a function call too). In results to + a PREPARE, this will be either the name of the bind variable corresponding + or the column name for the variable if it is "anonymous") and type of + the corresponding result. The option for is either a native + type (see below), in which case the option has no value, or a + 'custom' type, in which case the value is a [string] representing + the full qualified class name of the type represented. Valid option + ids are: + 0x0000 Custom: the value is a [string], see above. + 0x0001 Ascii + 0x0002 Bigint + 0x0003 Blob + 0x0004 Boolean + 0x0005 Counter + 0x0006 Decimal + 0x0007 Double + 0x0008 Float + 0x0009 Int + 0x000B Timestamp + 0x000C Uuid + 0x000D Varchar + 0x000E Varint + 0x000F Timeuuid + 0x0010 Inet + 0x0020 List: the value is an [option], representing the type + of the elements of the list. + 0x0021 Map: the value is two [option], representing the types of the + keys and values of the map + 0x0022 Set: the value is an [option], representing the type + of the elements of the set + 0x0030 UDT: the value is ... + where: + - is a [string] representing the keyspace name this + UDT is part of. + - is a [string] representing the UDT name. + - is a [short] reprensenting the number of fields of + the UDT, and thus the number of pair + following + - is a [string] representing the name of the + i_th field of the UDT. + - is an [option] representing the type of the + i_th field of the UDT. + 0x0031 Tuple: the value is ... where is a [short] + representing the number of value in the type, and + are [option] representing the type of the i_th component + of the tuple + + - is an [int] representing the number of rows present in this + result. Those rows are serialized in the part. + - is composed of ... where m is . + Each is composed of ... where n is + and where is a [bytes] representing the value + returned for the jth column of the ith row. In other words, + is composed of ( * ) [bytes]. + + +4.2.5.3. Set_keyspace + + The result to a `use` query. The body (after the kind [int]) is a single + [string] indicating the name of the keyspace that has been set. + + +4.2.5.4. Prepared + + The result to a PREPARE message. The rest of the body of a Prepared result is: + + where: + - is [short bytes] representing the prepared query ID. + - is defined exactly as for a Rows RESULT (See section 4.2.5.2; you + can however assume that the Has_more_pages flag is always off) and + is the specification for the variable bound in this prepare statement. + - is defined exactly as but correspond to the + metadata for the resultSet that execute this query will yield. Note that + may be empty (have the No_metadata flag and 0 columns, See + section 4.2.5.2) and will be for any query that is not a Select. There is + in fact never a guarantee that this will non-empty so client should protect + themselves accordingly. The presence of this information is an + optimization that allows to later execute the statement that has been + prepared without requesting the metadata (Skip_metadata flag in EXECUTE). + Clients can safely discard this metadata if they do not want to take + advantage of that optimization. + + Note that prepared query ID return is global to the node on which the query + has been prepared. It can be used on any connection to that node and this + until the node is restarted (after which the query must be reprepared). + +4.2.5.5. Schema_change + + The result to a schema altering query (creation/update/drop of a + keyspace/table/index). The body (after the kind [int]) is the same + as the body for a "SCHEMA_CHANGE" event, so 3 strings: + + Please refer to the section 4.2.6 below for the meaning of those fields. + + Note that queries to create and drop an index are considered as change + updating the table the index is on. + + +4.2.6. EVENT + + And event pushed by the server. A client will only receive events for the + type it has REGISTER to. The body of an EVENT message will start by a + [string] representing the event type. The rest of the message depends on the + event type. The valid event types are: + - "TOPOLOGY_CHANGE": events related to change in the cluster topology. + Currently, events are sent when new nodes are added to the cluster, and + when nodes are removed. The body of the message (after the event type) + consists of a [string] and an [inet], corresponding respectively to the + type of change ("NEW_NODE" or "REMOVED_NODE") followed by the address of + the new/removed node. + - "STATUS_CHANGE": events related to change of node status. Currently, + up/down events are sent. The body of the message (after the event type) + consists of a [string] and an [inet], corresponding respectively to the + type of status change ("UP" or "DOWN") followed by the address of the + concerned node. + - "SCHEMA_CHANGE": events related to schema change. After the event type, + the rest of the message will be where: + - is a [string] representing the type of changed involved. + It will be one of "CREATED", "UPDATED" or "DROPPED". + - is a [string] that can be one of "KEYSPACE", "TABLE" or "TYPE" + and describes what has been modified ("TYPE" stands for modifications + related to user types). + - depends on the preceding . If is + "KEYSPACE", then will be a single [string] representing the + keyspace changed. Otherwise, if is "TABLE" or "TYPE", then + will be 2 [string]: the first one will be the keyspace + containing the affected object, and the second one will be the name + of said affected object (so either the table name or the user type + name). + + All EVENT message have a streamId of -1 (Section 2.3). + + Please note that "NEW_NODE" and "UP" events are sent based on internal Gossip + communication and as such may be sent a short delay before the binary + protocol server on the newly up node is fully started. Clients are thus + advise to wait a short time before trying to connect to the node (1 seconds + should be enough), otherwise they may experience a connection refusal at + first. + +4.2.7. AUTH_CHALLENGE + + A server authentication challenge (see AUTH_RESPONSE (Section 4.1.2) for more + details). + + The body of this message is a single [bytes] token. The details of what this + token contains (and when it can be null/empty, if ever) depends on the actual + authenticator used. + + Clients are expected to answer the server challenge by an AUTH_RESPONSE + message. + +4.2.7. AUTH_SUCCESS + + Indicate the success of the authentication phase. See Section 4.2.3 for more + details. + + The body of this message is a single [bytes] token holding final information + from the server that the client may require to finish the authentication + process. What that token contains and whether it can be null depends on the + actual authenticator used. + + +5. Compression + + Frame compression is supported by the protocol, but then only the frame body + is compressed (the frame header should never be compressed). + + Before being used, client and server must agree on a compression algorithm to + use, which is done in the STARTUP message. As a consequence, a STARTUP message + must never be compressed. However, once the STARTUP frame has been received + by the server can be compressed (including the response to the STARTUP + request). Frame do not have to be compressed however, even if compression has + been agreed upon (a server may only compress frame above a certain size at its + discretion). A frame body should be compressed if and only if the compressed + flag (see Section 2.2) is set. + + As of this version 2 of the protocol, the following compressions are available: + - lz4 (https://code.google.com/p/lz4/). In that, note that the 4 first bytes + of the body will be the uncompressed length (followed by the compressed + bytes). + - snappy (https://code.google.com/p/snappy/). This compression might not be + available as it depends on a native lib (server-side) that might not be + avaivable on some installation. + + +6. Collection types + + This section describe the serialization format for the collection types: + list, map and set. This serialization format is both useful to decode values + returned in RESULT messages but also to encode values for EXECUTE ones. + + The serialization formats are: + List: a [int] n indicating the size of the list, followed by n elements. + Each element is [bytes] representing the serialized element + value. + Map: a [int] n indicating the size of the map, followed by n entries. + Each entry is composed of two [bytes] representing the key and + the value of the entry map. + Set: a [int] n indicating the size of the set, followed by n elements. + Each element is [bytes] representing the serialized element + value. + + +7. User defined and tuple types + + This section describes the serialization format for User defined types (UDT) and + tuple values. UDT (resp. tuple) values are the values of the User Defined Types + (resp. tuple type) as defined in section 4.2.5.2. + + A UDT value is composed of successive [bytes] values, one for each field of the UDT + value (in the order defined by the type). A UDT value will generally have one value + for each field of the type it represents, but it is allowed to have less values than + the type has fields. + + A tuple value has the exact same serialization format, i.e. a succession of + [bytes] values representing the components of the tuple. + + +8. Result paging + + The protocol allows for paging the result of queries. For that, the QUERY and + EXECUTE messages have a value that indicate the desired + page size in CQL3 rows. + + If a positive value is provided for , the result set of the + RESULT message returned for the query will contain at most the + first rows of the query result. If that first page of result + contains the full result set for the query, the RESULT message (of kind `Rows`) + will have the Has_more_pages flag *not* set. However, if some results are not + part of the first response, the Has_more_pages flag will be set and the result + will contain a value. In that case, the value + should be used in a QUERY or EXECUTE message (that has the *same* query than + the original one or the behavior is undefined) to retrieve the next page of + results. + + Only CQL3 queries that return a result set (RESULT message with a Rows `kind`) + support paging. For other type of queries, the value is + ignored. + + Note to client implementors: + - While can be as low as 1, it will likely be detrimental + to performance to pick a value too low. A value below 100 is probably too + low for most use cases. + - Clients should not rely on the actual size of the result set returned to + decide if there is more result to fetch or not. Instead, they should always + check the Has_more_pages flag (unless they did not enabled paging for the query + obviously). Clients should also not assert that no result will have more than + results. While the current implementation always respect + the exact value of , we reserve ourselves the right to return + slightly smaller or bigger pages in the future for performance reasons. + + +9. Error codes + + The supported error codes are described below: + 0x0000 Server error: something unexpected happened. This indicates a + server-side bug. + 0x000A Protocol error: some client message triggered a protocol + violation (for instance a QUERY message is sent before a STARTUP + one has been sent) + 0x0100 Bad credentials: CREDENTIALS request failed because Cassandra + did not accept the provided credentials. + + 0x1000 Unavailable exception. The rest of the ERROR message body will be + + where: + is the [consistency] level of the query having triggered + the exception. + is an [int] representing the number of node that + should be alive to respect + is an [int] representing the number of replica that + were known to be alive when the request has been + processed (since an unavailable exception has been + triggered, there will be < ) + 0x1001 Overloaded: the request cannot be processed because the + coordinator node is overloaded + 0x1002 Is_bootstrapping: the request was a read request but the + coordinator node is bootstrapping + 0x1003 Truncate_error: error during a truncation error. + 0x1100 Write_timeout: Timeout exception during a write request. The rest + of the ERROR message body will be + + where: + is the [consistency] level of the query having triggered + the exception. + is an [int] representing the number of nodes having + acknowledged the request. + is the number of replica whose acknowledgement is + required to achieve . + is a [string] that describe the type of the write + that timeouted. The value of that string can be one + of: + - "SIMPLE": the write was a non-batched + non-counter write. + - "BATCH": the write was a (logged) batch write. + If this type is received, it means the batch log + has been successfully written (otherwise a + "BATCH_LOG" type would have been send instead). + - "UNLOGGED_BATCH": the write was an unlogged + batch. Not batch log write has been attempted. + - "COUNTER": the write was a counter write + (batched or not). + - "BATCH_LOG": the timeout occured during the + write to the batch log when a (logged) batch + write was requested. + 0x1200 Read_timeout: Timeout exception during a read request. The rest + of the ERROR message body will be + + where: + is the [consistency] level of the query having triggered + the exception. + is an [int] representing the number of nodes having + answered the request. + is the number of replica whose response is + required to achieve . Please note that it is + possible to have >= if + is false. And also in the (unlikely) + case were is achieved but the coordinator node + timeout while waiting for read-repair + acknowledgement. + is a single byte. If its value is 0, it means + the replica that was asked for data has not + responded. Otherwise, the value is != 0. + + 0x2000 Syntax_error: The submitted query has a syntax error. + 0x2100 Unauthorized: The logged user doesn't have the right to perform + the query. + 0x2200 Invalid: The query is syntactically correct but invalid. + 0x2300 Config_error: The query is invalid because of some configuration issue + 0x2400 Already_exists: The query attempted to create a keyspace or a + table that was already existing. The rest of the ERROR message + body will be
    where: + is a [string] representing either the keyspace that + already exists, or the keyspace in which the table that + already exists is. +
    is a [string] representing the name of the table that + already exists. If the query was attempting to create a + keyspace,
    will be present but will be the empty + string. + 0x2500 Unprepared: Can be thrown while a prepared statement tries to be + executed if the provide prepared statement ID is not known by + this host. The rest of the ERROR message body will be [short + bytes] representing the unknown ID. + +10. Changes from v3 + + From dd8c129a90becd44365210cf4613e2715445a4e4 Mon Sep 17 00:00:00 2001 From: Sylvain Lebresne Date: Thu, 2 Oct 2014 13:25:52 +0200 Subject: [PATCH 149/557] Fix tests --- .../cassandra/db/marshal/DynamicCompositeTypeTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/unit/org/apache/cassandra/db/marshal/DynamicCompositeTypeTest.java b/test/unit/org/apache/cassandra/db/marshal/DynamicCompositeTypeTest.java index d36150ac27ae..05519af4a9de 100644 --- a/test/unit/org/apache/cassandra/db/marshal/DynamicCompositeTypeTest.java +++ b/test/unit/org/apache/cassandra/db/marshal/DynamicCompositeTypeTest.java @@ -236,11 +236,11 @@ public void testFullRoundReversed() throws Exception Iterator iter = cf.getSortedColumns().iterator(); - assert iter.next().name().equals(cname5); - assert iter.next().name().equals(cname4); - assert iter.next().name().equals(cname1); // null UUID < reversed value - assert iter.next().name().equals(cname3); - assert iter.next().name().equals(cname2); + assert iter.next().name().toByteBuffer().equals(cname5); + assert iter.next().name().toByteBuffer().equals(cname4); + assert iter.next().name().toByteBuffer().equals(cname1); // null UUID < reversed value + assert iter.next().name().toByteBuffer().equals(cname3); + assert iter.next().name().toByteBuffer().equals(cname2); } @Test From f1847a78c7420e3e6c4a8425b06448a7c7da95c2 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Thu, 2 Oct 2014 13:33:27 -0500 Subject: [PATCH 150/557] Add bash-completion to debian/control Build-Depends Patch by Michael Shuler, reviewed by brandonwilliams for CASSANDRA-8040 --- debian/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/control b/debian/control index f752769641de..a48441b85881 100644 --- a/debian/control +++ b/debian/control @@ -3,7 +3,7 @@ Section: misc Priority: extra Maintainer: Eric Evans Uploaders: Sylvain Lebresne -Build-Depends: debhelper (>= 5), openjdk-7-jdk | java7-jdk, ant (>= 1.7), ant-optional (>= 1.7), python-support, dpatch +Build-Depends: debhelper (>= 5), openjdk-7-jdk | java7-jdk, ant (>= 1.7), ant-optional (>= 1.7), python-support, dpatch, bash-completion Homepage: http://cassandra.apache.org Vcs-Git: http://git-wip-us.apache.org/repos/asf/cassandra.git Vcs-Browser: https://git-wip-us.apache.org/repos/asf?p=cassandra.git From e68f52b8d163ce0a9409ba23fd520f28e12b2a48 Mon Sep 17 00:00:00 2001 From: Jake Luciani Date: Thu, 2 Oct 2014 14:31:08 -0400 Subject: [PATCH 151/557] Fix for live CFMetadata on SecondaryIndexes Patch by tjake; reviewed by carl yeksigian for CASSANDRA-8027 --- .../apache/cassandra/config/CFMetaData.java | 18 +++++++- .../cassandra/io/sstable/SSTableReader.java | 4 +- .../cassandra/cql3/CrcCheckChanceTest.java | 42 +++++++++++++++++++ 3 files changed, 62 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/cassandra/config/CFMetaData.java b/src/java/org/apache/cassandra/config/CFMetaData.java index 899750764574..1e2a2e1c187c 100644 --- a/src/java/org/apache/cassandra/config/CFMetaData.java +++ b/src/java/org/apache/cassandra/config/CFMetaData.java @@ -499,7 +499,6 @@ public String toString() public CFMetaData droppedColumns(Map cols) {droppedColumns = cols; return this;} public CFMetaData triggers(Map prop) {triggers = prop; return this;} public CFMetaData isDense(Boolean prop) {isDense = prop; return this;} - /** * Create new ColumnFamily metadata with generated random ID. * When loading from existing schema, use CFMetaData @@ -704,6 +703,23 @@ public boolean isSuper() return cfType == ColumnFamilyType.Super; } + /** + * The '.' char is the only way to identify if the CFMetadata is for a secondary index + */ + public boolean isSecondaryIndex() + { + return cfName.contains("."); + } + + /** + * + * @return The name of the parent cf if this is a seconday index + */ + public String getParentColumnFamilyName() + { + return isSecondaryIndex() ? cfName.substring(0, cfName.indexOf('.')) : null; + } + public double getReadRepairChance() { return readRepairChance; diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableReader.java b/src/java/org/apache/cassandra/io/sstable/SSTableReader.java index 52054e63e9c4..15dcd08c5d52 100644 --- a/src/java/org/apache/cassandra/io/sstable/SSTableReader.java +++ b/src/java/org/apache/cassandra/io/sstable/SSTableReader.java @@ -1128,7 +1128,9 @@ public CompressionMetadata getCompressionMetadata() CompressionMetadata cmd = ((ICompressedFile) dfile).getMetadata(); - cmd.parameters.setLiveMetadata(Schema.instance.getCFMetaData(descriptor)); + //We need the parent cf metadata + String cfName = metadata.isSecondaryIndex() ? metadata.getParentColumnFamilyName() : metadata.cfName; + cmd.parameters.setLiveMetadata(Schema.instance.getCFMetaData(metadata.ksName, cfName)); return cmd; } diff --git a/test/unit/org/apache/cassandra/cql3/CrcCheckChanceTest.java b/test/unit/org/apache/cassandra/cql3/CrcCheckChanceTest.java index 0cd92029f953..b9d23cd1ed72 100644 --- a/test/unit/org/apache/cassandra/cql3/CrcCheckChanceTest.java +++ b/test/unit/org/apache/cassandra/cql3/CrcCheckChanceTest.java @@ -31,39 +31,81 @@ public void testChangingCrcCheckChance() throws Throwable //Start with crc_check_chance of 99% createTable("CREATE TABLE %s (p text, c text, v text, s text static, PRIMARY KEY (p, c)) WITH compression = {'sstable_compression': 'LZ4Compressor', 'crc_check_chance' : 0.99}"); + execute("CREATE INDEX foo ON %s(v)"); + execute("INSERT INTO %s(p, c, v, s) values (?, ?, ?, ?)", "p1", "k1", "v1", "sv1"); execute("INSERT INTO %s(p, c, v) values (?, ?, ?)", "p1", "k2", "v2"); execute("INSERT INTO %s(p, s) values (?, ?)", "p2", "sv2"); ColumnFamilyStore cfs = Keyspace.open(CQLTester.KEYSPACE).getColumnFamilyStore(currentTable()); + ColumnFamilyStore indexCfs = cfs.indexManager.getIndexesBackedByCfs().iterator().next(); cfs.forceBlockingFlush(); Assert.assertEquals(0.99, cfs.metadata.compressionParameters.getCrcCheckChance()); Assert.assertEquals(0.99, cfs.getSSTables().iterator().next().getCompressionMetadata().parameters.getCrcCheckChance()); + Assert.assertEquals(0.99, indexCfs.metadata.compressionParameters.getCrcCheckChance()); + Assert.assertEquals(0.99, indexCfs.getSSTables().iterator().next().getCompressionMetadata().parameters.getCrcCheckChance()); + assertRows(execute("SELECT * FROM %s WHERE p=?", "p1"), row("p1", "k1", "sv1", "v1"), row("p1", "k2", "sv1", "v2") ); + assertRows(execute("SELECT * FROM %s WHERE v=?", "v1"), + row("p1", "k1", "sv1", "v1") + ); + + + + //Write a few SSTables then Compact + + execute("INSERT INTO %s(p, c, v, s) values (?, ?, ?, ?)", "p1", "k1", "v1", "sv1"); + execute("INSERT INTO %s(p, c, v) values (?, ?, ?)", "p1", "k2", "v2"); + execute("INSERT INTO %s(p, s) values (?, ?)", "p2", "sv2"); + + cfs.forceBlockingFlush(); + + + execute("INSERT INTO %s(p, c, v, s) values (?, ?, ?, ?)", "p1", "k1", "v1", "sv1"); + execute("INSERT INTO %s(p, c, v) values (?, ?, ?)", "p1", "k2", "v2"); + execute("INSERT INTO %s(p, s) values (?, ?)", "p2", "sv2"); + + cfs.forceBlockingFlush(); + + execute("INSERT INTO %s(p, c, v, s) values (?, ?, ?, ?)", "p1", "k1", "v1", "sv1"); + execute("INSERT INTO %s(p, c, v) values (?, ?, ?)", "p1", "k2", "v2"); + execute("INSERT INTO %s(p, s) values (?, ?)", "p2", "sv2"); + + cfs.forceBlockingFlush(); + + cfs.forceMajorCompaction(); //Verify when we alter the value the live sstable readers hold the new one alterTable("ALTER TABLE %s WITH compression = {'sstable_compression': 'LZ4Compressor', 'crc_check_chance': 0.01}"); Assert.assertEquals( 0.01, cfs.metadata.compressionParameters.getCrcCheckChance()); Assert.assertEquals( 0.01, cfs.getSSTables().iterator().next().getCompressionMetadata().parameters.getCrcCheckChance()); + Assert.assertEquals( 0.01, indexCfs.metadata.compressionParameters.getCrcCheckChance()); + Assert.assertEquals( 0.01, indexCfs.getSSTables().iterator().next().getCompressionMetadata().parameters.getCrcCheckChance()); assertRows(execute("SELECT * FROM %s WHERE p=?", "p1"), row("p1", "k1", "sv1", "v1"), row("p1", "k2", "sv1", "v2") ); + assertRows(execute("SELECT * FROM %s WHERE v=?", "v1"), + row("p1", "k1", "sv1", "v1") + ); + //Verify the call used by JMX still works cfs.setCrcCheckChance(0.03); Assert.assertEquals( 0.03, cfs.metadata.compressionParameters.getCrcCheckChance()); Assert.assertEquals( 0.03, cfs.getSSTables().iterator().next().getCompressionMetadata().parameters.getCrcCheckChance()); + Assert.assertEquals( 0.03, indexCfs.metadata.compressionParameters.getCrcCheckChance()); + Assert.assertEquals( 0.03, indexCfs.getSSTables().iterator().next().getCompressionMetadata().parameters.getCrcCheckChance()); } } From 7785e12a656fbcb0166c1dfa8f3fd5a66b0553f5 Mon Sep 17 00:00:00 2001 From: Sankalp Kohli Date: Fri, 3 Oct 2014 10:22:30 +0200 Subject: [PATCH 152/557] Improve system query to read paxos table on propose patch by kohlisankalp; reviewed by slebresne for CASSANDRA-7929 --- CHANGES.txt | 1 + .../org/apache/cassandra/db/SystemKeyspace.java | 13 +++++++++++++ .../apache/cassandra/service/paxos/PaxosState.java | 6 +++--- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 95e6f67d3d60..dc9a32f970f9 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0 + * Improve query to read paxos table on propose (CASSANDRA-7929) * Remove cassandra-cli (CASSANDRA-7920) * Optimize java source-based UDF invocation (CASSANDRA-7924) * Accept dollar quoted strings in CQL (CASSANDRA-7769) diff --git a/src/java/org/apache/cassandra/db/SystemKeyspace.java b/src/java/org/apache/cassandra/db/SystemKeyspace.java index 8b6274010f8b..2cff38dc0a88 100644 --- a/src/java/org/apache/cassandra/db/SystemKeyspace.java +++ b/src/java/org/apache/cassandra/db/SystemKeyspace.java @@ -860,6 +860,19 @@ public static PaxosState loadPaxosState(ByteBuffer key, CFMetaData metadata) return new PaxosState(promised, accepted, mostRecent); } + public static Commit loadPaxosPromise(ByteBuffer key, CFMetaData metadata) + { + String req = "SELECT in_progress_ballot FROM system.%s WHERE row_key = ? AND cf_id = ?"; + UntypedResultSet results = executeInternal(String.format(req, PAXOS_CF), key, metadata.cfId); + if (results.isEmpty()) + return Commit.emptyCommit(key, metadata); + UntypedResultSet.Row row = results.one(); + Commit promised = row.has("in_progress_ballot") + ? new Commit(key, row.getUUID("in_progress_ballot"), ArrayBackedSortedColumns.factory.create(metadata)) + : Commit.emptyCommit(key, metadata); + return promised; + } + public static void savePaxosPromise(Commit promise) { String req = "UPDATE system.%s USING TIMESTAMP ? AND TTL ? SET in_progress_ballot = ? WHERE row_key = ? AND cf_id = ?"; diff --git a/src/java/org/apache/cassandra/service/paxos/PaxosState.java b/src/java/org/apache/cassandra/service/paxos/PaxosState.java index df7365d20385..37cea5c1b0d7 100644 --- a/src/java/org/apache/cassandra/service/paxos/PaxosState.java +++ b/src/java/org/apache/cassandra/service/paxos/PaxosState.java @@ -87,8 +87,8 @@ public static Boolean propose(Commit proposal) lock.lock(); try { - PaxosState state = SystemKeyspace.loadPaxosState(proposal.key, proposal.update.metadata()); - if (proposal.hasBallot(state.promised.ballot) || proposal.isAfter(state.promised)) + Commit promised = SystemKeyspace.loadPaxosPromise(proposal.key, proposal.update.metadata()); + if (proposal.hasBallot(promised.ballot) || proposal.isAfter(promised)) { Tracing.trace("Accepting proposal {}", proposal); SystemKeyspace.savePaxosProposal(proposal); @@ -96,7 +96,7 @@ public static Boolean propose(Commit proposal) } else { - Tracing.trace("Rejecting proposal for {} because inProgress is now {}", proposal, state.promised); + Tracing.trace("Rejecting proposal for {} because inProgress is now {}", proposal, promised); return false; } } From 0cad81aeb9ddaf5dad8b2ab9c6ff6955402c9310 Mon Sep 17 00:00:00 2001 From: Benjamin Lerer Date: Tue, 7 Oct 2014 12:18:52 +0200 Subject: [PATCH 153/557] Add support for aggregation functions patch by blerer; reviewed by slebresne for CASSANDRA-4914 --- CHANGES.txt | 1 + src/java/org/apache/cassandra/cql3/Cql.g | 16 +- .../org/apache/cassandra/cql3/ResultSet.java | 21 - .../cql3/functions/AggregateFcts.java | 661 ++++++++++++++++++ .../cql3/functions/AggregateFunction.java | 59 ++ .../cql3/functions/BytesConversionFcts.java | 8 +- .../cassandra/cql3/functions/Function.java | 23 +- .../cql3/functions/FunctionCall.java | 25 +- .../cassandra/cql3/functions/Functions.java | 17 + .../functions/NativeAggregateFunction.java | 36 + .../cql3/functions/NativeScalarFunction.java | 36 + .../cql3/functions/ScalarFunction.java | 38 + .../cql3/functions/TimeuuidFcts.java | 10 +- .../cassandra/cql3/functions/TokenFct.java | 2 +- .../cassandra/cql3/functions/UDFunction.java | 7 +- .../cassandra/cql3/functions/UuidFcts.java | 2 +- .../cql3/statements/SelectStatement.java | 72 +- .../cassandra/cql3/statements/Selection.java | 301 ++++++-- .../cassandra/cql3/AggregationTest.java | 88 +++ 19 files changed, 1282 insertions(+), 141 deletions(-) create mode 100644 src/java/org/apache/cassandra/cql3/functions/AggregateFcts.java create mode 100644 src/java/org/apache/cassandra/cql3/functions/AggregateFunction.java create mode 100644 src/java/org/apache/cassandra/cql3/functions/NativeAggregateFunction.java create mode 100644 src/java/org/apache/cassandra/cql3/functions/NativeScalarFunction.java create mode 100644 src/java/org/apache/cassandra/cql3/functions/ScalarFunction.java create mode 100644 test/unit/org/apache/cassandra/cql3/AggregationTest.java diff --git a/CHANGES.txt b/CHANGES.txt index d10747c9f0c9..132396ec68dd 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0 + * Support for aggregation functions (CASSANDRA-4914) * Improve query to read paxos table on propose (CASSANDRA-7929) * Remove cassandra-cli (CASSANDRA-7920) * Optimize java source-based UDF invocation (CASSANDRA-7924) diff --git a/src/java/org/apache/cassandra/cql3/Cql.g b/src/java/org/apache/cassandra/cql3/Cql.g index e4bfd32a99d6..2ec9746b7f82 100644 --- a/src/java/org/apache/cassandra/cql3/Cql.g +++ b/src/java/org/apache/cassandra/cql3/Cql.g @@ -262,14 +262,12 @@ useStatement returns [UseStatement stmt] selectStatement returns [SelectStatement.RawStatement expr] @init { boolean isDistinct = false; - boolean isCount = false; - ColumnIdentifier countAlias = null; Term.Raw limit = null; Map orderings = new LinkedHashMap(); boolean allowFiltering = false; } : K_SELECT ( ( K_DISTINCT { isDistinct = true; } )? sclause=selectClause - | (K_COUNT '(' sclause=selectCountClause ')' { isCount = true; } (K_AS c=cident { countAlias = c; })?) ) + | sclause=selectCountClause ) K_FROM cf=columnFamilyName ( K_WHERE wclause=whereClause )? ( K_ORDER K_BY orderByClause[orderings] ( ',' orderByClause[orderings] )* )? @@ -278,8 +276,6 @@ selectStatement returns [SelectStatement.RawStatement expr] { SelectStatement.Parameters params = new SelectStatement.Parameters(orderings, isDistinct, - isCount, - countAlias, allowFiltering); $expr = new SelectStatement.RawStatement(cf, params, sclause, wclause, limit); } @@ -312,8 +308,13 @@ selectionFunctionArgs returns [List a] ; selectCountClause returns [List expr] - : '\*' { $expr = Collections.emptyList();} - | i=INTEGER { if (!i.getText().equals("1")) addRecognitionError("Only COUNT(1) is supported, got COUNT(" + i.getText() + ")"); $expr = Collections.emptyList();} + @init{ ColumnIdentifier alias = new ColumnIdentifier("count", false); } + : K_COUNT '(' countArgument ')' (K_AS c=cident { alias = c; })? { $expr = new ArrayList(); $expr.add( new RawSelector(new Selectable.WithFunction(new FunctionName("countRows"), Collections.emptyList()), alias));} + ; + +countArgument + : '\*' + | i=INTEGER { if (!i.getText().equals("1")) addRecognitionError("Only COUNT(1) is supported, got COUNT(" + i.getText() + ")");} ; whereClause returns [List clause] @@ -984,6 +985,7 @@ allowedFunctionName returns [String s] : f=IDENT { $s = $f.text; } | u=unreserved_function_keyword { $s = u; } | K_TOKEN { $s = "token"; } + | K_COUNT { $s = "count"; } ; functionArgs returns [List a] diff --git a/src/java/org/apache/cassandra/cql3/ResultSet.java b/src/java/org/apache/cassandra/cql3/ResultSet.java index 30b5c4edf3b0..a8a50815c158 100644 --- a/src/java/org/apache/cassandra/cql3/ResultSet.java +++ b/src/java/org/apache/cassandra/cql3/ResultSet.java @@ -102,27 +102,6 @@ public ResultSet withPagingState(PagingState state) return new ResultSet(metadata.withPagingState(state), rows); } - public ResultSet makeCountResult(ColumnIdentifier alias) - { - assert metadata.names != null; - String ksName = metadata.names.get(0).ksName; - String cfName = metadata.names.get(0).cfName; - long count = rows.size(); - return makeCountResult(ksName, cfName, count, alias); - } - - public static ResultSet.Metadata makeCountMetadata(String ksName, String cfName, ColumnIdentifier alias) - { - ColumnSpecification spec = new ColumnSpecification(ksName, cfName, alias == null ? COUNT_COLUMN : alias, LongType.instance); - return new Metadata(Collections.singletonList(spec)); - } - - public static ResultSet makeCountResult(String ksName, String cfName, long count, ColumnIdentifier alias) - { - List> newRows = Collections.singletonList(Collections.singletonList(ByteBufferUtil.bytes(count))); - return new ResultSet(makeCountMetadata(ksName, cfName, alias), newRows); - } - public CqlResult toThriftResult() { assert metadata.names != null; diff --git a/src/java/org/apache/cassandra/cql3/functions/AggregateFcts.java b/src/java/org/apache/cassandra/cql3/functions/AggregateFcts.java new file mode 100644 index 000000000000..f72ed446e23c --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/functions/AggregateFcts.java @@ -0,0 +1,661 @@ +/* + * 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.cql3.functions; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.nio.ByteBuffer; +import java.util.List; + +import org.apache.cassandra.db.marshal.AbstractType; +import org.apache.cassandra.db.marshal.DecimalType; +import org.apache.cassandra.db.marshal.DoubleType; +import org.apache.cassandra.db.marshal.FloatType; +import org.apache.cassandra.db.marshal.Int32Type; +import org.apache.cassandra.db.marshal.IntegerType; +import org.apache.cassandra.db.marshal.LongType; + +/** + * Factory methods for aggregate functions. + */ +public abstract class AggregateFcts +{ + /** + * The function used to count the number of rows of a result set. This function is called when COUNT(*) or COUNT(1) + * is specified. + */ + public static final AggregateFunction countRowsFunction = + new NativeAggregateFunction("countRows", LongType.instance) + { + public Aggregate newAggregate() + { + return new Aggregate() + { + private long count; + + public void reset() + { + count = 0; + } + + public ByteBuffer compute() + { + return ((LongType) returnType()).decompose(Long.valueOf(count)); + } + + public void addInput(List values) + { + count++; + } + }; + } + }; + + /** + * The SUM function for decimal values. + */ + public static final AggregateFunction sumFunctionForDecimal = + new NativeAggregateFunction("sum", DecimalType.instance, DecimalType.instance) + { + @Override + public Aggregate newAggregate() + { + return new Aggregate() + { + private BigDecimal sum = BigDecimal.ZERO; + + public void reset() + { + sum = BigDecimal.ZERO; + } + + public ByteBuffer compute() + { + return ((DecimalType) returnType()).decompose(sum); + } + + public void addInput(List values) + { + ByteBuffer value = values.get(0); + + if (value == null) + return; + + BigDecimal number = ((BigDecimal) argTypes().get(0).compose(value)); + sum = sum.add(number); + } + }; + } + }; + + /** + * The AVG function for decimal values. + */ + public static final AggregateFunction avgFunctionForDecimal = + new NativeAggregateFunction("avg", DecimalType.instance, DecimalType.instance) + { + public Aggregate newAggregate() + { + return new Aggregate() + { + private BigDecimal sum = BigDecimal.ZERO; + + private int count; + + public void reset() + { + count = 0; + sum = BigDecimal.ZERO; + } + + public ByteBuffer compute() + { + if (count == 0) + return ((DecimalType) returnType()).decompose(BigDecimal.ZERO); + + return ((DecimalType) returnType()).decompose(sum.divide(BigDecimal.valueOf(count))); + } + + public void addInput(List values) + { + ByteBuffer value = values.get(0); + + if (value == null) + return; + + count++; + BigDecimal number = ((BigDecimal) argTypes().get(0).compose(value)); + sum = sum.add(number); + } + }; + } + }; + + /** + * The SUM function for varint values. + */ + public static final AggregateFunction sumFunctionForVarint = + new NativeAggregateFunction("sum", IntegerType.instance, IntegerType.instance) + { + public Aggregate newAggregate() + { + return new Aggregate() + { + private BigInteger sum = BigInteger.ZERO; + + public void reset() + { + sum = BigInteger.ZERO; + } + + public ByteBuffer compute() + { + return ((IntegerType) returnType()).decompose(sum); + } + + public void addInput(List values) + { + ByteBuffer value = values.get(0); + + if (value == null) + return; + + BigInteger number = ((BigInteger) argTypes().get(0).compose(value)); + sum = sum.add(number); + } + }; + } + }; + + /** + * The AVG function for varint values. + */ + public static final AggregateFunction avgFunctionForVarint = + new NativeAggregateFunction("avg", IntegerType.instance, IntegerType.instance) + { + public Aggregate newAggregate() + { + return new Aggregate() + { + private BigInteger sum = BigInteger.ZERO; + + private int count; + + public void reset() + { + count = 0; + sum = BigInteger.ZERO; + } + + public ByteBuffer compute() + { + if (count == 0) + return ((IntegerType) returnType()).decompose(BigInteger.ZERO); + + return ((IntegerType) returnType()).decompose(sum.divide(BigInteger.valueOf(count))); + } + + public void addInput(List values) + { + ByteBuffer value = values.get(0); + + if (value == null) + return; + + count++; + BigInteger number = ((BigInteger) argTypes().get(0).compose(value)); + sum = sum.add(number); + } + }; + } + }; + + /** + * The SUM function for int32 values. + */ + public static final AggregateFunction sumFunctionForInt32 = + new NativeAggregateFunction("sum", Int32Type.instance, Int32Type.instance) + { + public Aggregate newAggregate() + { + return new Aggregate() + { + private int sum; + + public void reset() + { + sum = 0; + } + + public ByteBuffer compute() + { + return ((Int32Type) returnType()).decompose(sum); + } + + public void addInput(List values) + { + ByteBuffer value = values.get(0); + + if (value == null) + return; + + Number number = ((Number) argTypes().get(0).compose(value)); + sum += number.intValue(); + } + }; + } + }; + + /** + * AVG function for int32 values. + */ + public static final AggregateFunction avgFunctionForInt32 = + new NativeAggregateFunction("avg", Int32Type.instance, Int32Type.instance) + { + public Aggregate newAggregate() + { + return new Aggregate() + { + private int sum; + + private int count; + + public void reset() + { + count = 0; + sum = 0; + } + + public ByteBuffer compute() + { + int avg = count == 0 ? 0 : sum / count; + + return ((Int32Type) returnType()).decompose(avg); + } + + public void addInput(List values) + { + ByteBuffer value = values.get(0); + + if (value == null) + return; + + count++; + Number number = ((Number) argTypes().get(0).compose(value)); + sum += number.intValue(); + } + }; + } + }; + + /** + * The SUM function for long values. + */ + public static final AggregateFunction sumFunctionForLong = + new NativeAggregateFunction("sum", LongType.instance, LongType.instance) + { + public Aggregate newAggregate() + { + return new Aggregate() + { + private long sum; + + public void reset() + { + sum = 0; + } + + public ByteBuffer compute() + { + return ((LongType) returnType()).decompose(sum); + } + + public void addInput(List values) + { + ByteBuffer value = values.get(0); + + if (value == null) + return; + + Number number = ((Number) argTypes().get(0).compose(value)); + sum += number.longValue(); + } + }; + } + }; + + /** + * AVG function for long values. + */ + public static final AggregateFunction avgFunctionForLong = + new NativeAggregateFunction("avg", LongType.instance, LongType.instance) + { + public Aggregate newAggregate() + { + return new Aggregate() + { + private long sum; + + private int count; + + public void reset() + { + count = 0; + sum = 0; + } + + public ByteBuffer compute() + { + long avg = count == 0 ? 0 : sum / count; + + return ((LongType) returnType()).decompose(avg); + } + + public void addInput(List values) + { + ByteBuffer value = values.get(0); + + if (value == null) + return; + + count++; + Number number = ((Number) argTypes().get(0).compose(value)); + sum += number.longValue(); + } + }; + } + }; + + /** + * The SUM function for float values. + */ + public static final AggregateFunction sumFunctionForFloat = + new NativeAggregateFunction("sum", FloatType.instance, FloatType.instance) + { + public Aggregate newAggregate() + { + return new Aggregate() + { + private float sum; + + public void reset() + { + sum = 0; + } + + public ByteBuffer compute() + { + return ((FloatType) returnType()).decompose(sum); + } + + public void addInput(List values) + { + ByteBuffer value = values.get(0); + + if (value == null) + return; + + Number number = ((Number) argTypes().get(0).compose(value)); + sum += number.floatValue(); + } + }; + } + }; + + /** + * AVG function for float values. + */ + public static final AggregateFunction avgFunctionForFloat = + new NativeAggregateFunction("avg", FloatType.instance, FloatType.instance) + { + public Aggregate newAggregate() + { + return new Aggregate() + { + private float sum; + + private int count; + + public void reset() + { + count = 0; + sum = 0; + } + + public ByteBuffer compute() + { + float avg = count == 0 ? 0 : sum / count; + + return ((FloatType) returnType()).decompose(avg); + } + + public void addInput(List values) + { + ByteBuffer value = values.get(0); + + if (value == null) + return; + + count++; + Number number = ((Number) argTypes().get(0).compose(value)); + sum += number.floatValue(); + } + }; + } + }; + + /** + * The SUM function for double values. + */ + public static final AggregateFunction sumFunctionForDouble = + new NativeAggregateFunction("sum", DoubleType.instance, DoubleType.instance) + { + public Aggregate newAggregate() + { + return new Aggregate() + { + private double sum; + + public void reset() + { + sum = 0; + } + + public ByteBuffer compute() + { + return ((DoubleType) returnType()).decompose(sum); + } + + public void addInput(List values) + { + ByteBuffer value = values.get(0); + + if (value == null) + return; + + Number number = ((Number) argTypes().get(0).compose(value)); + sum += number.doubleValue(); + } + }; + } + }; + + /** + * AVG function for double values. + */ + public static final AggregateFunction avgFunctionForDouble = + new NativeAggregateFunction("avg", DoubleType.instance, DoubleType.instance) + { + public Aggregate newAggregate() + { + return new Aggregate() + { + private double sum; + + private int count; + + public void reset() + { + count = 0; + sum = 0; + } + + public ByteBuffer compute() + { + double avg = count == 0 ? 0 : sum / count; + + return ((DoubleType) returnType()).decompose(avg); + } + + public void addInput(List values) + { + ByteBuffer value = values.get(0); + + if (value == null) + return; + + count++; + Number number = ((Number) argTypes().get(0).compose(value)); + sum += number.doubleValue(); + } + }; + } + }; + + /** + * Creates a MAX function for the specified type. + * + * @param inputType the function input and output type + * @return a MAX function for the specified type. + */ + public static AggregateFunction makeMaxFunction(final AbstractType inputType) + { + return new NativeAggregateFunction("max", inputType, inputType) + { + public Aggregate newAggregate() + { + return new Aggregate() + { + private ByteBuffer max; + + public void reset() + { + max = null; + } + + public ByteBuffer compute() + { + return max; + } + + public void addInput(List values) + { + ByteBuffer value = values.get(0); + + if (value == null) + return; + + if (max == null || returnType().compare(max, value) < 0) + max = value; + } + }; + } + }; + } + + /** + * Creates a MIN function for the specified type. + * + * @param inputType the function input and output type + * @return a MIN function for the specified type. + */ + public static AggregateFunction makeMinFunction(final AbstractType inputType) + { + return new NativeAggregateFunction("min", inputType, inputType) + { + public Aggregate newAggregate() + { + return new Aggregate() + { + private ByteBuffer min; + + public void reset() + { + min = null; + } + + public ByteBuffer compute() + { + return min; + } + + public void addInput(List values) + { + ByteBuffer value = values.get(0); + + if (value == null) + return; + + if (min == null || returnType().compare(min, value) > 0) + min = value; + } + }; + } + }; + } + + /** + * Creates a COUNT function for the specified type. + * + * @param inputType the function input type + * @return a COUNT function for the specified type. + */ + public static AggregateFunction makeCountFunction(AbstractType inputType) + { + return new NativeAggregateFunction("count", LongType.instance, inputType) + { + public Aggregate newAggregate() + { + return new Aggregate() + { + private long count; + + public void reset() + { + count = 0; + } + + public ByteBuffer compute() + { + return ((LongType) returnType()).decompose(count); + } + + public void addInput(List values) + { + ByteBuffer value = values.get(0); + + if (value == null) + return; + + count++; + } + }; + } + }; + } +} diff --git a/src/java/org/apache/cassandra/cql3/functions/AggregateFunction.java b/src/java/org/apache/cassandra/cql3/functions/AggregateFunction.java new file mode 100644 index 000000000000..47eee4bca07d --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/functions/AggregateFunction.java @@ -0,0 +1,59 @@ +/* + * 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.cql3.functions; + +import java.nio.ByteBuffer; +import java.util.List; + +/** + * Performs a calculation on a set of values and return a single value. + */ +public interface AggregateFunction extends Function +{ + /** + * Creates a new Aggregate instance. + * + * @return a new Aggregate instance. + */ + public Aggregate newAggregate(); + + /** + * An aggregation operation. + */ + interface Aggregate + { + /** + * Adds the specified input to this aggregate. + * + * @param values the values to add to the aggregate. + */ + public void addInput(List values); + + /** + * Computes and returns the aggregate current value. + * + * @return the aggregate current value. + */ + public ByteBuffer compute(); + + /** + * Reset this aggregate. + */ + public void reset(); + } +} diff --git a/src/java/org/apache/cassandra/cql3/functions/BytesConversionFcts.java b/src/java/org/apache/cassandra/cql3/functions/BytesConversionFcts.java index 6ea0a550af11..1cd1d69fe036 100644 --- a/src/java/org/apache/cassandra/cql3/functions/BytesConversionFcts.java +++ b/src/java/org/apache/cassandra/cql3/functions/BytesConversionFcts.java @@ -34,7 +34,7 @@ public abstract class BytesConversionFcts public static Function makeToBlobFunction(AbstractType fromType) { String name = fromType.asCQL3Type() + "asblob"; - return new NativeFunction(name, BytesType.instance, fromType) + return new NativeScalarFunction(name, BytesType.instance, fromType) { public ByteBuffer execute(List parameters) { @@ -46,7 +46,7 @@ public ByteBuffer execute(List parameters) public static Function makeFromBlobFunction(final AbstractType toType) { final String name = "blobas" + toType.asCQL3Type(); - return new NativeFunction(name, toType, BytesType.instance) + return new NativeScalarFunction(name, toType, BytesType.instance) { public ByteBuffer execute(List parameters) throws InvalidRequestException { @@ -66,7 +66,7 @@ public ByteBuffer execute(List parameters) throws InvalidRequestExce }; } - public static final Function VarcharAsBlobFct = new NativeFunction("varcharasblob", BytesType.instance, UTF8Type.instance) + public static final Function VarcharAsBlobFct = new NativeScalarFunction("varcharasblob", BytesType.instance, UTF8Type.instance) { public ByteBuffer execute(List parameters) { @@ -74,7 +74,7 @@ public ByteBuffer execute(List parameters) } }; - public static final Function BlobAsVarcharFact = new NativeFunction("blobasvarchar", UTF8Type.instance, BytesType.instance) + public static final Function BlobAsVarcharFact = new NativeScalarFunction("blobasvarchar", UTF8Type.instance, BytesType.instance) { public ByteBuffer execute(List parameters) { diff --git a/src/java/org/apache/cassandra/cql3/functions/Function.java b/src/java/org/apache/cassandra/cql3/functions/Function.java index dc2a0db16ab2..cba9fcfe55c4 100644 --- a/src/java/org/apache/cassandra/cql3/functions/Function.java +++ b/src/java/org/apache/cassandra/cql3/functions/Function.java @@ -17,11 +17,9 @@ */ package org.apache.cassandra.cql3.functions; -import java.nio.ByteBuffer; import java.util.List; import org.apache.cassandra.db.marshal.AbstractType; -import org.apache.cassandra.exceptions.InvalidRequestException; public interface Function { @@ -29,11 +27,24 @@ public interface Function public List> argTypes(); public AbstractType returnType(); - public ByteBuffer execute(List parameters) throws InvalidRequestException; - - // Whether the function is a pure function (as in doesn't depend on, nor produce side effects). + /** + * Checks whether the function is a pure function (as in doesn't depend on, nor produce side effects) or not. + * + * @return true if the function is a pure function, false otherwise. + */ public boolean isPure(); - // Whether the function is a native/harcoded one. + /** + * Checks whether the function is a native/hard coded one or not. + * + * @return true if the function is a native/hard coded one, false otherwise. + */ public boolean isNative(); + + /** + * Checks whether the function is an aggregate function or not. + * + * @return true if the function is an aggregate function, false otherwise. + */ + public boolean isAggregate(); } diff --git a/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java b/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java index 0a8fe5843471..3b80fc088646 100644 --- a/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java +++ b/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java @@ -22,7 +22,6 @@ import java.util.List; import org.apache.cassandra.cql3.*; -import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.db.marshal.CollectionType; import org.apache.cassandra.db.marshal.ListType; import org.apache.cassandra.db.marshal.MapType; @@ -33,10 +32,10 @@ public class FunctionCall extends Term.NonTerminal { - private final Function fun; + private final ScalarFunction fun; private final List terms; - private FunctionCall(Function fun, List terms) + private FunctionCall(ScalarFunction fun, List terms) { this.fun = fun; this.terms = terms; @@ -68,7 +67,7 @@ public ByteBuffer bindAndGet(QueryOptions options) throws InvalidRequestExceptio return executeInternal(fun, buffers); } - private static ByteBuffer executeInternal(Function fun, List params) throws InvalidRequestException + private static ByteBuffer executeInternal(ScalarFunction fun, List params) throws InvalidRequestException { ByteBuffer result = fun.execute(params); try @@ -125,12 +124,16 @@ public Term prepare(String keyspace, ColumnSpecification receiver) throws Invali Function fun = Functions.get(keyspace, name, terms, receiver.ksName, receiver.cfName); if (fun == null) throw new InvalidRequestException(String.format("Unknown function %s called", name)); + if (fun.isAggregate()) + throw new InvalidRequestException("Aggregation function are not supported in the where clause"); + + ScalarFunction scalarFun = (ScalarFunction) fun; // Functions.get() will complain if no function "name" type check with the provided arguments. // We still have to validate that the return type matches however - if (!receiver.type.isValueCompatibleWith(fun.returnType())) + if (!receiver.type.isValueCompatibleWith(scalarFun.returnType())) throw new InvalidRequestException(String.format("Type error: cannot assign result of function %s (type %s) to %s (type %s)", - fun.name(), fun.returnType().asCQL3Type(), + scalarFun.name(), scalarFun.returnType().asCQL3Type(), receiver.name, receiver.type.asCQL3Type())); if (fun.argTypes().size() != terms.size()) @@ -141,7 +144,7 @@ public Term prepare(String keyspace, ColumnSpecification receiver) throws Invali boolean allTerminal = true; for (int i = 0; i < terms.size(); i++) { - Term t = terms.get(i).prepare(keyspace, Functions.makeArgSpec(receiver.ksName, receiver.cfName, fun, i)); + Term t = terms.get(i).prepare(keyspace, Functions.makeArgSpec(receiver.ksName, receiver.cfName, scalarFun, i)); if (t instanceof NonTerminal) allTerminal = false; parameters.add(t); @@ -149,13 +152,13 @@ public Term prepare(String keyspace, ColumnSpecification receiver) throws Invali // If all parameters are terminal and the function is pure, we can // evaluate it now, otherwise we'd have to wait execution time - return allTerminal && fun.isPure() - ? makeTerminal(fun, execute(fun, parameters), QueryOptions.DEFAULT.getProtocolVersion()) - : new FunctionCall(fun, parameters); + return allTerminal && scalarFun.isPure() + ? makeTerminal(scalarFun, execute(scalarFun, parameters), QueryOptions.DEFAULT.getProtocolVersion()) + : new FunctionCall(scalarFun, parameters); } // All parameters must be terminal - private static ByteBuffer execute(Function fun, List parameters) throws InvalidRequestException + private static ByteBuffer execute(ScalarFunction fun, List parameters) throws InvalidRequestException { List buffers = new ArrayList(parameters.size()); for (Term t : parameters) diff --git a/src/java/org/apache/cassandra/cql3/functions/Functions.java b/src/java/org/apache/cassandra/cql3/functions/Functions.java index 18feb36d1555..e8d6181b3bab 100644 --- a/src/java/org/apache/cassandra/cql3/functions/Functions.java +++ b/src/java/org/apache/cassandra/cql3/functions/Functions.java @@ -48,6 +48,7 @@ private Functions() {} static { + declare(AggregateFcts.countRowsFunction); declare(TimeuuidFcts.nowFct); declare(TimeuuidFcts.minTimeuuidFct); declare(TimeuuidFcts.maxTimeuuidFct); @@ -64,9 +65,25 @@ private Functions() {} declare(BytesConversionFcts.makeToBlobFunction(type.getType())); declare(BytesConversionFcts.makeFromBlobFunction(type.getType())); + + declare(AggregateFcts.makeCountFunction(type.getType())); + declare(AggregateFcts.makeMaxFunction(type.getType())); + declare(AggregateFcts.makeMinFunction(type.getType())); } declare(BytesConversionFcts.VarcharAsBlobFct); declare(BytesConversionFcts.BlobAsVarcharFact); + declare(AggregateFcts.sumFunctionForInt32); + declare(AggregateFcts.sumFunctionForLong); + declare(AggregateFcts.sumFunctionForFloat); + declare(AggregateFcts.sumFunctionForDouble); + declare(AggregateFcts.sumFunctionForDecimal); + declare(AggregateFcts.sumFunctionForVarint); + declare(AggregateFcts.avgFunctionForInt32); + declare(AggregateFcts.avgFunctionForLong); + declare(AggregateFcts.avgFunctionForFloat); + declare(AggregateFcts.avgFunctionForDouble); + declare(AggregateFcts.avgFunctionForVarint); + declare(AggregateFcts.avgFunctionForDecimal); } private static void declare(Function fun) diff --git a/src/java/org/apache/cassandra/cql3/functions/NativeAggregateFunction.java b/src/java/org/apache/cassandra/cql3/functions/NativeAggregateFunction.java new file mode 100644 index 000000000000..88aab4be77f0 --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/functions/NativeAggregateFunction.java @@ -0,0 +1,36 @@ +/* + * 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.cql3.functions; + +import org.apache.cassandra.db.marshal.AbstractType; + +/** + * Base class for the AggregateFunction native classes. + */ +public abstract class NativeAggregateFunction extends NativeFunction implements AggregateFunction +{ + protected NativeAggregateFunction(String name, AbstractType returnType, AbstractType... argTypes) + { + super(name, returnType, argTypes); + } + + public final boolean isAggregate() + { + return true; + } +} diff --git a/src/java/org/apache/cassandra/cql3/functions/NativeScalarFunction.java b/src/java/org/apache/cassandra/cql3/functions/NativeScalarFunction.java new file mode 100644 index 000000000000..8f7f2212f801 --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/functions/NativeScalarFunction.java @@ -0,0 +1,36 @@ +/* + * 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.cql3.functions; + +import org.apache.cassandra.db.marshal.AbstractType; + +/** + * Base class for the ScalarFunction native classes. + */ +public abstract class NativeScalarFunction extends NativeFunction implements ScalarFunction +{ + protected NativeScalarFunction(String name, AbstractType returnType, AbstractType... argsType) + { + super(name, returnType, argsType); + } + + public final boolean isAggregate() + { + return false; + } +} diff --git a/src/java/org/apache/cassandra/cql3/functions/ScalarFunction.java b/src/java/org/apache/cassandra/cql3/functions/ScalarFunction.java new file mode 100644 index 000000000000..ba2a3741ca18 --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/functions/ScalarFunction.java @@ -0,0 +1,38 @@ +/* + * 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.cql3.functions; + +import java.nio.ByteBuffer; +import java.util.List; + +import org.apache.cassandra.exceptions.InvalidRequestException; + +/** + * Determines a single output value based on a single input value. + */ +public interface ScalarFunction extends Function +{ + /** + * Applies this function to the specified parameter. + * + * @param parameters the input parameters + * @return the result of applying this function to the parameter + * @throws InvalidRequestException if this function cannot not be applied to the parameter + */ + public ByteBuffer execute(List parameters) throws InvalidRequestException; +} diff --git a/src/java/org/apache/cassandra/cql3/functions/TimeuuidFcts.java b/src/java/org/apache/cassandra/cql3/functions/TimeuuidFcts.java index 9b7bbf06735a..e481cf5021be 100644 --- a/src/java/org/apache/cassandra/cql3/functions/TimeuuidFcts.java +++ b/src/java/org/apache/cassandra/cql3/functions/TimeuuidFcts.java @@ -29,7 +29,7 @@ public abstract class TimeuuidFcts { - public static final Function nowFct = new NativeFunction("now", TimeUUIDType.instance) + public static final Function nowFct = new NativeScalarFunction("now", TimeUUIDType.instance) { public ByteBuffer execute(List parameters) { @@ -43,7 +43,7 @@ public boolean isPure() } }; - public static final Function minTimeuuidFct = new NativeFunction("mintimeuuid", TimeUUIDType.instance, TimestampType.instance) + public static final Function minTimeuuidFct = new NativeScalarFunction("mintimeuuid", TimeUUIDType.instance, TimestampType.instance) { public ByteBuffer execute(List parameters) { @@ -55,7 +55,7 @@ public ByteBuffer execute(List parameters) } }; - public static final Function maxTimeuuidFct = new NativeFunction("maxtimeuuid", TimeUUIDType.instance, TimestampType.instance) + public static final Function maxTimeuuidFct = new NativeScalarFunction("maxtimeuuid", TimeUUIDType.instance, TimestampType.instance) { public ByteBuffer execute(List parameters) { @@ -67,7 +67,7 @@ public ByteBuffer execute(List parameters) } }; - public static final Function dateOfFct = new NativeFunction("dateof", TimestampType.instance, TimeUUIDType.instance) + public static final Function dateOfFct = new NativeScalarFunction("dateof", TimestampType.instance, TimeUUIDType.instance) { public ByteBuffer execute(List parameters) { @@ -79,7 +79,7 @@ public ByteBuffer execute(List parameters) } }; - public static final Function unixTimestampOfFct = new NativeFunction("unixtimestampof", LongType.instance, TimeUUIDType.instance) + public static final Function unixTimestampOfFct = new NativeScalarFunction("unixtimestampof", LongType.instance, TimeUUIDType.instance) { public ByteBuffer execute(List parameters) { diff --git a/src/java/org/apache/cassandra/cql3/functions/TokenFct.java b/src/java/org/apache/cassandra/cql3/functions/TokenFct.java index 2504a66752ed..ca4d473d8557 100644 --- a/src/java/org/apache/cassandra/cql3/functions/TokenFct.java +++ b/src/java/org/apache/cassandra/cql3/functions/TokenFct.java @@ -28,7 +28,7 @@ import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.service.StorageService; -public class TokenFct extends NativeFunction +public class TokenFct extends NativeScalarFunction { // The actual token function depends on the partitioner used private static final IPartitioner partitioner = StorageService.getPartitioner(); diff --git a/src/java/org/apache/cassandra/cql3/functions/UDFunction.java b/src/java/org/apache/cassandra/cql3/functions/UDFunction.java index 3ef5764629bd..264998ca2e95 100644 --- a/src/java/org/apache/cassandra/cql3/functions/UDFunction.java +++ b/src/java/org/apache/cassandra/cql3/functions/UDFunction.java @@ -40,7 +40,7 @@ /** * Base class for User Defined Functions. */ -public abstract class UDFunction extends AbstractFunction +public abstract class UDFunction extends AbstractFunction implements ScalarFunction { protected static final Logger logger = LoggerFactory.getLogger(UDFunction.class); @@ -65,6 +65,11 @@ protected UDFunction(FunctionName name, this.deterministic = deterministic; } + public boolean isAggregate() + { + return false; + } + public static UDFunction create(FunctionName name, List argNames, List> argTypes, diff --git a/src/java/org/apache/cassandra/cql3/functions/UuidFcts.java b/src/java/org/apache/cassandra/cql3/functions/UuidFcts.java index 1bf4c17176ec..b3cef8566723 100644 --- a/src/java/org/apache/cassandra/cql3/functions/UuidFcts.java +++ b/src/java/org/apache/cassandra/cql3/functions/UuidFcts.java @@ -26,7 +26,7 @@ public abstract class UuidFcts { - public static final Function uuidFct = new NativeFunction("uuid", UUIDType.instance) + public static final Function uuidFct = new NativeScalarFunction("uuid", UUIDType.instance) { public ByteBuffer execute(List parameters) { diff --git a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java index 6e0929c42f42..d7485c080f76 100644 --- a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java @@ -97,7 +97,7 @@ public class SelectStatement implements CQLStatement, MeasurableForPreparedCache private boolean selectsOnlyStaticColumns; // Used by forSelection below - private static final Parameters defaultParameters = new Parameters(Collections.emptyMap(), false, false, null, false); + private static final Parameters defaultParameters = new Parameters(Collections.emptyMap(), false, false); private static final Predicate isStaticFilter = new Predicate() { @@ -156,9 +156,7 @@ static SelectStatement forSelection(CFMetaData cfm, Selection selection) public ResultSet.Metadata getResultMetadata() { - return parameters.isCount - ? ResultSet.makeCountMetadata(keyspace(), columnFamily(), parameters.countAlias) - : selection.getResultMetadata(); + return selection.getResultMetadata(); } public long measureForPreparedCache(MemoryMeter meter) @@ -203,32 +201,31 @@ public ResultMessage.Rows execute(QueryState state, QueryOptions options) throws Pageable command = getPageableCommand(options, limit, now); int pageSize = options.getPageSize(); - // A count query will never be paged for the user, but we always page it internally to avoid OOM. + + // An aggregation query will never be paged for the user, but we always page it internally to avoid OOM. // If we user provided a pageSize we'll use that to page internally (because why not), otherwise we use our default // Note that if there are some nodes in the cluster with a version less than 2.0, we can't use paging (CASSANDRA-6707). - if (parameters.isCount && pageSize <= 0) + if (selection.isAggregate() && pageSize <= 0) pageSize = DEFAULT_COUNT_PAGE_SIZE; if (pageSize <= 0 || command == null || !QueryPagers.mayNeedPaging(command, pageSize)) { return execute(command, options, limit, now); } - else - { - QueryPager pager = QueryPagers.pager(command, cl, options.getPagingState()); - if (parameters.isCount) - return pageCountQuery(pager, options, pageSize, now, limit); - // We can't properly do post-query ordering if we page (see #6722) - if (needsPostQueryOrdering()) - throw new InvalidRequestException("Cannot page queries with both ORDER BY and a IN restriction on the partition key; you must either remove the " - + "ORDER BY or the IN and sort client side, or disable paging for this query"); + QueryPager pager = QueryPagers.pager(command, cl, options.getPagingState()); + if (selection.isAggregate()) + return pageAggregateQuery(pager, options, pageSize, now); - List page = pager.fetchPage(pageSize); - ResultMessage.Rows msg = processResults(page, options, limit, now); + // We can't properly do post-query ordering if we page (see #6722) + if (needsPostQueryOrdering()) + throw new InvalidRequestException("Cannot page queries with both ORDER BY and a IN restriction on the partition key; you must either remove the " + + "ORDER BY or the IN and sort client side, or disable paging for this query"); - return pager.isExhausted() ? msg : msg.withPagingState(pager.state()); - } + List page = pager.fetchPage(pageSize); + ResultMessage.Rows msg = processResults(page, options, limit, now); + + return pager.isExhausted() ? msg : msg.withPagingState(pager.state()); } private Pageable getPageableCommand(QueryOptions options, int limit, long now) throws RequestValidationException @@ -263,28 +260,27 @@ private ResultMessage.Rows execute(Pageable command, QueryOptions options, int l return processResults(rows, options, limit, now); } - private ResultMessage.Rows pageCountQuery(QueryPager pager, QueryOptions options, int pageSize, long now, int limit) throws RequestValidationException, RequestExecutionException + private ResultMessage.Rows pageAggregateQuery(QueryPager pager, QueryOptions options, int pageSize, long now) + throws RequestValidationException, RequestExecutionException { - int count = 0; + Selection.ResultSetBuilder result = selection.resultSetBuilder(now); while (!pager.isExhausted()) { - int maxLimit = pager.maxRemaining(); - logger.debug("New maxLimit for paged count query is {}", maxLimit); - ResultSet rset = process(pager.fetchPage(pageSize), options, maxLimit, now); - count += rset.rows.size(); - } + for (org.apache.cassandra.db.Row row : pager.fetchPage(pageSize)) + { + // Not columns match the query, skip + if (row.cf == null) + continue; - // We sometimes query one more result than the user limit asks to handle exclusive bounds with compact tables (see updateLimitForQuery). - // So do make sure the count is not greater than what the user asked for. - ResultSet result = ResultSet.makeCountResult(keyspace(), columnFamily(), Math.min(count, limit), parameters.countAlias); - return new ResultMessage.Rows(result); + processColumnFamily(row.key.getKey(), row.cf, options, now, result); + } + } + return new ResultMessage.Rows(result.build()); } public ResultMessage.Rows processResults(List rows, QueryOptions options, int limit, long now) throws RequestValidationException { - // Even for count, we need to process the result as it'll group some column together in sparse column families ResultSet rset = process(rows, options, limit, now); - rset = parameters.isCount ? rset.makeCountResult(parameters.countAlias) : rset; return new ResultMessage.Rows(rset); } @@ -313,7 +309,6 @@ public ResultMessage.Rows executeInternal(QueryState state, QueryOptions options public ResultSet process(List rows) throws InvalidRequestException { - assert !parameters.isCount; // not yet needed QueryOptions options = QueryOptions.DEFAULT; return process(rows, options, getLimit(options), System.currentTimeMillis()); } @@ -1333,10 +1328,6 @@ public ParsedStatement.Prepared prepare() throws InvalidRequestException CFMetaData cfm = ThriftValidation.validateColumnFamily(keyspace(), columnFamily()); VariableSpecifications boundNames = getBoundVariables(); - // Select clause - if (parameters.isCount && !selectClause.isEmpty()) - throw new InvalidRequestException("Only COUNT(*) and COUNT(1) operations are currently supported."); - Selection selection = selectClause.isEmpty() ? Selection.wildcard(cfm) : Selection.fromSelectors(cfm, selectClause); @@ -2070,7 +2061,6 @@ public String toString() .add("selectClause", selectClause) .add("whereClause", whereClause) .add("isDistinct", parameters.isDistinct) - .add("isCount", parameters.isCount) .toString(); } } @@ -2079,20 +2069,14 @@ public static class Parameters { private final Map orderings; private final boolean isDistinct; - private final boolean isCount; - private final ColumnIdentifier countAlias; private final boolean allowFiltering; public Parameters(Map orderings, boolean isDistinct, - boolean isCount, - ColumnIdentifier countAlias, boolean allowFiltering) { this.orderings = orderings; this.isDistinct = isDistinct; - this.isCount = isCount; - this.countAlias = countAlias; this.allowFiltering = allowFiltering; } } diff --git a/src/java/org/apache/cassandra/cql3/statements/Selection.java b/src/java/org/apache/cassandra/cql3/statements/Selection.java index 20211b281cff..88ba26511b64 100644 --- a/src/java/org/apache/cassandra/cql3/statements/Selection.java +++ b/src/java/org/apache/cassandra/cql3/statements/Selection.java @@ -22,13 +22,16 @@ import java.util.Collection; import java.util.List; -import com.google.common.collect.Iterators; - -import org.apache.cassandra.cql3.*; -import org.apache.cassandra.cql3.functions.Function; -import org.apache.cassandra.cql3.functions.Functions; import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.ColumnDefinition; +import org.apache.cassandra.cql3.AssignmentTestable; +import org.apache.cassandra.cql3.ColumnIdentifier; +import org.apache.cassandra.cql3.ColumnSpecification; +import org.apache.cassandra.cql3.ResultSet; +import org.apache.cassandra.cql3.functions.AggregateFunction; +import org.apache.cassandra.cql3.functions.Function; +import org.apache.cassandra.cql3.functions.Functions; +import org.apache.cassandra.cql3.functions.ScalarFunction; import org.apache.cassandra.db.Cell; import org.apache.cassandra.db.CounterCell; import org.apache.cassandra.db.ExpiringCell; @@ -36,11 +39,13 @@ import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.db.marshal.Int32Type; import org.apache.cassandra.db.marshal.LongType; -import org.apache.cassandra.db.marshal.UserType; import org.apache.cassandra.db.marshal.UTF8Type; +import org.apache.cassandra.db.marshal.UserType; import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.utils.ByteBufferUtil; +import com.google.common.collect.Iterators; + public abstract class Selection { private final Collection columns; @@ -166,7 +171,8 @@ else if (raw.selectable instanceof Selectable.WithFieldSelection) throw new InvalidRequestException(String.format("Unknown function '%s'", withFun.functionName)); if (metadata != null) metadata.add(makeFunctionSpec(cfm, withFun, fun.returnType(), raw.alias)); - return new FunctionSelector(fun, args); + return fun.isAggregate() ? new AggregateFunctionSelector(fun, args) + : new ScalarFunctionSelector(fun, args); } } @@ -245,7 +251,13 @@ public static Selection fromSelectors(CFMetaData cfm, List rawSelec } } - protected abstract List handleRow(ResultSetBuilder rs) throws InvalidRequestException; + protected abstract void addInputRow(ResultSetBuilder rs) throws InvalidRequestException; + + protected abstract boolean isAggregate(); + + protected abstract List getOutputRow() throws InvalidRequestException; + + protected abstract void reset(); /** * @return the list of CQL3 columns value this SelectionClause needs. @@ -267,6 +279,26 @@ private static ByteBuffer value(Cell c) : c.value(); } + /** + * Checks that selectors are either all aggregates or that none of them is. + * + * @param selectors the selectors to test. + * @param msgTemplate the error message template + * @param messageArgs the error message arguments + * @throws InvalidRequestException if some of the selectors are aggregate but not all of them + */ + private static void validateSelectors(List selectors, String messageTemplate, Object... messageArgs) + throws InvalidRequestException + { + int aggregates = 0; + for (Selector s : selectors) + if (s.isAggregate()) + ++aggregates; + + if (aggregates != 0 && aggregates != selectors.size()) + throw new InvalidRequestException(String.format(messageTemplate, messageArgs)); + } + public class ResultSetBuilder { private final ResultSet resultSet; @@ -321,7 +353,14 @@ private boolean isDead(Cell c) public void newRow() throws InvalidRequestException { if (current != null) - resultSet.addRow(handleRow(this)); + { + addInputRow(this); + if (!isAggregate()) + { + resultSet.addRow(getOutputRow()); + reset(); + } + } current = new ArrayList(columns.size()); } @@ -329,7 +368,9 @@ public ResultSet build() throws InvalidRequestException { if (current != null) { - resultSet.addRow(handleRow(this)); + addInputRow(this); + resultSet.addRow(getOutputRow()); + reset(); current = null; } return resultSet; @@ -341,6 +382,8 @@ private static class SimpleSelection extends Selection { private final boolean isWildcard; + private List current; + public SimpleSelection(Collection columns, boolean isWildcard) { this(columns, new ArrayList(columns), isWildcard); @@ -357,23 +400,48 @@ public SimpleSelection(Collection columns, List handleRow(ResultSetBuilder rs) - { - return rs.current; - } - @Override public boolean isWildcard() { return isWildcard; } + + protected void addInputRow(ResultSetBuilder rs) throws InvalidRequestException + { + current = rs.current; + } + + protected boolean isAggregate() + { + return false; + } + + protected List getOutputRow() throws InvalidRequestException + { + return current; + } + + protected void reset() + { + current = null; + } } private static abstract class Selector implements AssignmentTestable { - public abstract ByteBuffer compute(ResultSetBuilder rs) throws InvalidRequestException; + public abstract void addInput(ResultSetBuilder rs) throws InvalidRequestException; + + public abstract ByteBuffer getOutput() throws InvalidRequestException; + public abstract AbstractType getType(); + public boolean isAggregate() + { + return false; + } + + public abstract void reset(); + public AssignmentTestable.TestResult testAssignment(String keyspace, ColumnSpecification receiver) { if (receiver.type.equals(getType())) @@ -390,6 +458,7 @@ private static class SimpleSelector extends Selector private final String columnName; private final int idx; private final AbstractType type; + private ByteBuffer current; public SimpleSelector(String columnName, int idx, AbstractType type) { @@ -398,9 +467,19 @@ public SimpleSelector(String columnName, int idx, AbstractType type) this.type = type; } - public ByteBuffer compute(ResultSetBuilder rs) + public void addInput(ResultSetBuilder rs) throws InvalidRequestException { - return rs.current.get(idx); + current = rs.current.get(idx); + } + + public ByteBuffer getOutput() throws InvalidRequestException + { + return current; + } + + public void reset() + { + current = null; } public AbstractType getType() @@ -415,26 +494,17 @@ public String toString() } } - private static class FunctionSelector extends Selector + private static abstract class AbstractFunctionSelector extends Selector { - private final Function fun; - private final List argSelectors; + protected final T fun; + protected final List argSelectors; - public FunctionSelector(Function fun, List argSelectors) + public AbstractFunctionSelector(T fun, List argSelectors) { this.fun = fun; this.argSelectors = argSelectors; } - public ByteBuffer compute(ResultSetBuilder rs) throws InvalidRequestException - { - List args = new ArrayList(argSelectors.size()); - for (Selector s : argSelectors) - args.add(s.compute(rs)); - - return fun.execute(args); - } - public AbstractType getType() { return fun.returnType(); @@ -455,6 +525,102 @@ public String toString() } } + private static class ScalarFunctionSelector extends AbstractFunctionSelector + { + public ScalarFunctionSelector(Function fun, List argSelectors) throws InvalidRequestException + { + super((ScalarFunction) fun, argSelectors); + validateSelectors(argSelectors, + "the %s function arguments must be either all aggregates or all none aggregates", + fun.name().name); + } + + public boolean isAggregate() + { + // We cannot just return true as it is possible to have a scalar function wrapping an aggregation function + if (argSelectors.isEmpty()) + return false; + + return argSelectors.get(0).isAggregate(); + } + + public void addInput(ResultSetBuilder rs) throws InvalidRequestException + { + for (Selector s : argSelectors) + s.addInput(rs); + } + + public void reset() + { + } + + public ByteBuffer getOutput() throws InvalidRequestException + { + List args = new ArrayList(argSelectors.size()); + for (Selector s : argSelectors) + { + args.add(s.getOutput()); + s.reset(); + } + return fun.execute(args); + } + } + + private static class AggregateFunctionSelector extends AbstractFunctionSelector + { + private final AggregateFunction.Aggregate aggregate; + + public AggregateFunctionSelector(Function fun, List argSelectors) throws InvalidRequestException + { + super((AggregateFunction) fun, argSelectors); + + validateAgruments(argSelectors); + this.aggregate = this.fun.newAggregate(); + } + + public boolean isAggregate() + { + return true; + } + + public void addInput(ResultSetBuilder rs) throws InvalidRequestException + { + List args = new ArrayList(argSelectors.size()); + // Aggregation of aggregation is not supported + for (Selector s : argSelectors) + { + s.addInput(rs); + args.add(s.getOutput()); + s.reset(); + } + this.aggregate.addInput(args); + } + + public ByteBuffer getOutput() throws InvalidRequestException + { + return aggregate.compute(); + } + + public void reset() + { + aggregate.reset(); + } + + /** + * Checks that the arguments are not themselves aggregation functions. + * + * @param argSelectors the selector to check + * @throws InvalidRequestException if on of the arguments is an aggregation function + */ + private static void validateAgruments(List argSelectors) throws InvalidRequestException + { + for (Selector selector : argSelectors) + if (selector.isAggregate()) + throw new InvalidRequestException( + "aggregate functions cannot be used as arguments of aggregate functions"); + } + } + private static class FieldSelector extends Selector { private final UserType type; @@ -468,9 +634,19 @@ public FieldSelector(UserType type, int field, Selector selected) this.selected = selected; } - public ByteBuffer compute(ResultSetBuilder rs) throws InvalidRequestException + public boolean isAggregate() + { + return selected.isAggregate(); + } + + public void addInput(ResultSetBuilder rs) throws InvalidRequestException { - ByteBuffer value = selected.compute(rs); + selected.addInput(rs); + } + + public ByteBuffer getOutput() throws InvalidRequestException + { + ByteBuffer value = selected.getOutput(); if (value == null) return null; ByteBuffer[] buffers = type.split(value); @@ -482,6 +658,11 @@ public AbstractType getType() return type.fieldType(field); } + public void reset() + { + selected.reset(); + } + @Override public String toString() { @@ -494,6 +675,7 @@ private static class WritetimeOrTTLSelector extends Selector private final String columnName; private final int idx; private final boolean isWritetime; + private ByteBuffer current; public WritetimeOrTTLSelector(String columnName, int idx, boolean isWritetime) { @@ -502,16 +684,28 @@ public WritetimeOrTTLSelector(String columnName, int idx, boolean isWritetime) this.isWritetime = isWritetime; } - public ByteBuffer compute(ResultSetBuilder rs) + public void addInput(ResultSetBuilder rs) { if (isWritetime) { long ts = rs.timestamps[idx]; - return ts >= 0 ? ByteBufferUtil.bytes(ts) : null; + current = ts >= 0 ? ByteBufferUtil.bytes(ts) : null; + } + else + { + int ttl = rs.ttls[idx]; + current = ttl > 0 ? ByteBufferUtil.bytes(ttl) : null; } + } - int ttl = rs.ttls[idx]; - return ttl > 0 ? ByteBufferUtil.bytes(ttl) : null; + public ByteBuffer getOutput() + { + return current; + } + + public void reset() + { + current = null; } public AbstractType getType() @@ -530,20 +724,47 @@ private static class SelectionWithFunctions extends Selection { private final List selectors; - public SelectionWithFunctions(Collection columns, List metadata, List selectors, boolean collectTimestamps, boolean collectTTLs) + public SelectionWithFunctions(Collection columns, + List metadata, + List selectors, + boolean collectTimestamps, + boolean collectTTLs) throws InvalidRequestException { super(columns, metadata, collectTimestamps, collectTTLs); this.selectors = selectors; + + validateSelectors(selectors, "the select clause must either contains only aggregates or none"); } - protected List handleRow(ResultSetBuilder rs) throws InvalidRequestException + protected void addInputRow(ResultSetBuilder rs) throws InvalidRequestException + { + for (Selector selector : selectors) + { + selector.addInput(rs); + } + } + + protected List getOutputRow() throws InvalidRequestException { List result = new ArrayList(); for (Selector selector : selectors) { - result.add(selector.compute(rs)); + result.add(selector.getOutput()); } return result; } + + protected void reset() + { + for (Selector selector : selectors) + { + selector.reset(); + } + } + + public boolean isAggregate() + { + return selectors.get(0).isAggregate(); + } } } diff --git a/test/unit/org/apache/cassandra/cql3/AggregationTest.java b/test/unit/org/apache/cassandra/cql3/AggregationTest.java new file mode 100644 index 000000000000..87b7ca7e68a0 --- /dev/null +++ b/test/unit/org/apache/cassandra/cql3/AggregationTest.java @@ -0,0 +1,88 @@ +/* + * 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.cql3; + +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.TimeZone; + +import org.apache.commons.lang3.time.DateUtils; +import org.junit.Test; + +public class AggregationTest extends CQLTester +{ + @Test + public void testFunctions() throws Throwable + { + createTable("CREATE TABLE %s (a int, b int, c double, d decimal, primary key (a, b))"); + execute("INSERT INTO %s (a, b, c, d) VALUES (1, 1, 11.5, 11.5)"); + execute("INSERT INTO %s (a, b, c, d) VALUES (1, 2, 9.5, 1.5)"); + execute("INSERT INTO %s (a, b, c, d) VALUES (1, 3, 9.0, 2.0)"); + + assertRows(execute("SELECT max(b), min(b), sum(b), avg(b) , max(c), sum(c), avg(c), sum(d), avg(d) FROM %s"), + row(3, 1, 6, 2, 11.5, 30.0, 10.0, new BigDecimal("15.0"), new BigDecimal("5.0"))); + + execute("INSERT INTO %s (a, b, d) VALUES (1, 5, 1.0)"); + assertRows(execute("SELECT COUNT(*) FROM %s"), row(4L)); + assertRows(execute("SELECT COUNT(1) FROM %s"), row(4L)); + assertRows(execute("SELECT COUNT(b), count(c) FROM %s"), row(4L, 3L)); + } + + @Test + public void testInvalidCalls() throws Throwable + { + createTable("CREATE TABLE %s (a int, b int, c int, primary key (a, b))"); + execute("INSERT INTO %s (a, b, c) VALUES (1, 1, 10)"); + execute("INSERT INTO %s (a, b, c) VALUES (1, 2, 9)"); + execute("INSERT INTO %s (a, b, c) VALUES (1, 3, 8)"); + + assertInvalidSyntax("SELECT max(b), max(c) FROM %s WHERE max(a) = 1"); + assertInvalid("SELECT max(b), c FROM %s"); + assertInvalid("SELECT b, max(c) FROM %s"); + assertInvalid("SELECT max(sum(c)) FROM %s"); + assertInvalidSyntax("SELECT COUNT(2) FROM %s"); + } + + @Test + public void testNestedFunctions() throws Throwable + { + createTable("CREATE TABLE %s (a int primary key, b timeuuid, c double, d double)"); + + execute("INSERT INTO %s (a, b, c, d) VALUES (1, maxTimeuuid('2011-02-03 04:05:00+0000'), -1.2, 2.1)"); + execute("INSERT INTO %s (a, b, c, d) VALUES (2, maxTimeuuid('2011-02-03 04:06:00+0000'), 1.3, -3.4)"); + execute("INSERT INTO %s (a, b, c, d) VALUES (3, maxTimeuuid('2011-02-03 04:10:00+0000'), 1.4, 1.2)"); + + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); + format.setTimeZone(TimeZone.getTimeZone("GMT")); + Date date = format.parse("2011-02-03 04:10:00"); + date = DateUtils.truncate(date, Calendar.MILLISECOND); + + assertRows(execute("SELECT max(a), max(unixTimestampOf(b)) FROM %s"), row(3, date.getTime())); + assertRows(execute("SELECT max(a), unixTimestampOf(max(b)) FROM %s"), row(3, date.getTime())); + execute("CREATE OR REPLACE FUNCTION copySign(magnitude double, sign double) RETURNS double LANGUAGE JAVA\n" + + "AS 'return Double.valueOf(Math.copySign(magnitude.doubleValue(), sign.doubleValue()));';"); + + assertRows(execute("SELECT copySign(max(c), min(c)) FROM %s"), row(-1.4)); + assertRows(execute("SELECT copySign(c, d) FROM %s"), row(1.2), row(-1.3), row(1.4)); + assertRows(execute("SELECT max(copySign(c, d)) FROM %s"), row(1.4)); + assertInvalid("SELECT copySign(c, max(c)) FROM %s"); + assertInvalid("SELECT copySign(max(c), c) FROM %s"); + } +} From 816c905ae2a3d98f877babc72c1f8d8650aa5d24 Mon Sep 17 00:00:00 2001 From: Robert Stupp Date: Wed, 8 Oct 2014 15:06:55 -0500 Subject: [PATCH 154/557] Support scripting languages for UDFs Patch by Robert Stupp; reviewed by Tyler Hobbs for CASSANDRA-7526 --- CHANGES.txt | 1 + .../cql3/functions/ScriptBasedUDF.java | 150 ++++++++++++ .../cassandra/cql3/functions/UDFunction.java | 3 +- .../statements/CreateFunctionStatement.java | 5 + .../org/apache/cassandra/cql3/CQLTester.java | 8 + .../org/apache/cassandra/cql3/UFTest.java | 213 ++++++++++++++++++ 6 files changed, 379 insertions(+), 1 deletion(-) create mode 100644 src/java/org/apache/cassandra/cql3/functions/ScriptBasedUDF.java diff --git a/CHANGES.txt b/CHANGES.txt index d3f20467b4f9..9d522b793d73 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0 + * Support for scripting languages in user-defined functions (CASSANDRA-7526) * Support for aggregation functions (CASSANDRA-4914) * Improve query to read paxos table on propose (CASSANDRA-7929) * Remove cassandra-cli (CASSANDRA-7920) diff --git a/src/java/org/apache/cassandra/cql3/functions/ScriptBasedUDF.java b/src/java/org/apache/cassandra/cql3/functions/ScriptBasedUDF.java new file mode 100644 index 000000000000..73fc43b1f680 --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/functions/ScriptBasedUDF.java @@ -0,0 +1,150 @@ +/* + * 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.cql3.functions; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.script.Bindings; +import javax.script.Compilable; +import javax.script.CompiledScript; +import javax.script.ScriptEngine; +import javax.script.ScriptEngineFactory; +import javax.script.ScriptEngineManager; +import javax.script.ScriptException; +import javax.script.SimpleBindings; + +import org.apache.cassandra.cql3.ColumnIdentifier; +import org.apache.cassandra.db.marshal.AbstractType; +import org.apache.cassandra.exceptions.InvalidRequestException; + +public class ScriptBasedUDF extends UDFunction +{ + static final Map scriptEngines = new HashMap<>(); + + static { + ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); + for (ScriptEngineFactory scriptEngineFactory : scriptEngineManager.getEngineFactories()) + { + ScriptEngine scriptEngine = scriptEngineFactory.getScriptEngine(); + boolean compilable = scriptEngine instanceof Compilable; + if (compilable) + { + logger.info("Found scripting engine {} {} - {} {} - language names: {}", + scriptEngineFactory.getEngineName(), scriptEngineFactory.getEngineVersion(), + scriptEngineFactory.getLanguageName(), scriptEngineFactory.getLanguageVersion(), + scriptEngineFactory.getNames()); + for (String name : scriptEngineFactory.getNames()) + scriptEngines.put(name, (Compilable) scriptEngine); + } + } + } + + private final CompiledScript script; + + ScriptBasedUDF(FunctionName name, + List argNames, + List> argTypes, + AbstractType returnType, + String language, + String body, + boolean deterministic) + throws InvalidRequestException + { + super(name, argNames, argTypes, returnType, language, body, deterministic); + + Compilable scriptEngine = scriptEngines.get(language); + if (scriptEngine == null) + throw new InvalidRequestException(String.format("Invalid language '%s' for function '%s'", language, name)); + + try + { + this.script = scriptEngine.compile(body); + } + catch (RuntimeException | ScriptException e) + { + logger.info("Failed to compile function '{}' for language {}: ", name, language, e); + throw new InvalidRequestException( + String.format("Failed to compile function '%s' for language %s: %s", name, language, e)); + } + } + + public ByteBuffer execute(List parameters) throws InvalidRequestException + { + Object[] params = new Object[argTypes.size()]; + for (int i = 0; i < params.length; i++) + { + ByteBuffer bb = parameters.get(i); + if (bb != null) + params[i] = argTypes.get(i).compose(bb); + } + + try + { + Bindings bindings = new SimpleBindings(); + for (int i = 0; i < params.length; i++) + bindings.put(argNames.get(i).toString(), params[i]); + + Object result = script.eval(bindings); + if (result == null) + return null; + + Class javaReturnType = returnType.getSerializer().getType(); + Class resultType = result.getClass(); + if (!javaReturnType.isAssignableFrom(resultType)) + { + if (result instanceof Number) + { + Number rNumber = (Number) result; + if (javaReturnType == Integer.class) + result = rNumber.intValue(); + else if (javaReturnType == Long.class) + result = rNumber.longValue(); + else if (javaReturnType == Float.class) + result = rNumber.floatValue(); + else if (javaReturnType == Double.class) + result = rNumber.doubleValue(); + else if (javaReturnType == BigInteger.class) + { + if (rNumber instanceof BigDecimal) + result = ((BigDecimal)rNumber).toBigInteger(); + else if (rNumber instanceof Double || rNumber instanceof Float) + result = new BigDecimal(rNumber.toString()).toBigInteger(); + else + result = BigInteger.valueOf(rNumber.longValue()); + } + else if (javaReturnType == BigDecimal.class) + // String c'tor of BigDecimal is more accurate than valueOf(double) + result = new BigDecimal(rNumber.toString()); + } + } + + @SuppressWarnings("unchecked") ByteBuffer r = ((AbstractType) returnType).decompose(result); + return r; + } + catch (RuntimeException | ScriptException e) + { + logger.info("Execution of UDF '{}' failed", name, e); + throw new InvalidRequestException("Execution of user-defined function '" + name + "' failed: " + e); + } + } +} diff --git a/src/java/org/apache/cassandra/cql3/functions/UDFunction.java b/src/java/org/apache/cassandra/cql3/functions/UDFunction.java index 264998ca2e95..8c51b9e20f78 100644 --- a/src/java/org/apache/cassandra/cql3/functions/UDFunction.java +++ b/src/java/org/apache/cassandra/cql3/functions/UDFunction.java @@ -59,6 +59,7 @@ protected UDFunction(FunctionName name, boolean deterministic) { super(name, argTypes, returnType); + assert new HashSet<>(argNames).size() == argNames.size() : "duplicate argument names"; this.argNames = argNames; this.language = language; this.body = body; @@ -83,7 +84,7 @@ public static UDFunction create(FunctionName name, { case "class": return new ReflectionBasedUDF(name, argNames, argTypes, returnType, language, body, deterministic); case "java": return JavaSourceUDFFactory.buildUDF(name, argNames, argTypes, returnType, body, deterministic); - default: throw new InvalidRequestException(String.format("Invalid language %s for '%s'", language, name)); + default: return new ScriptBasedUDF(name, argNames, argTypes, returnType, language, body, deterministic); } } diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java index a54409e0a211..712a4744e158 100644 --- a/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java @@ -18,6 +18,7 @@ package org.apache.cassandra.cql3.statements; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import org.apache.cassandra.auth.Permission; @@ -89,6 +90,10 @@ public Event.SchemaChange changeEvent() public boolean announceMigration(boolean isLocalOnly) throws RequestValidationException { + if (new HashSet<>(argNames).size() != argNames.size()) + throw new InvalidRequestException(String.format("duplicate argument names for given function %s with argument names %s", + functionName, argNames)); + List> argTypes = new ArrayList<>(argRawTypes.size()); for (CQL3Type.Raw rawType : argRawTypes) // We have no proper keyspace to give, which means that this will break (NPE currently) diff --git a/test/unit/org/apache/cassandra/cql3/CQLTester.java b/test/unit/org/apache/cassandra/cql3/CQLTester.java index 31708aacc5a1..a456ea8e2ce3 100644 --- a/test/unit/org/apache/cassandra/cql3/CQLTester.java +++ b/test/unit/org/apache/cassandra/cql3/CQLTester.java @@ -18,6 +18,8 @@ package org.apache.cassandra.cql3; import java.io.File; +import java.math.BigDecimal; +import java.math.BigInteger; import java.nio.ByteBuffer; import java.util.*; import java.util.concurrent.CountDownLatch; @@ -613,6 +615,12 @@ private static AbstractType typeFor(Object value) if (value instanceof Double) return DoubleType.instance; + if (value instanceof BigInteger) + return IntegerType.instance; + + if (value instanceof BigDecimal) + return DecimalType.instance; + if (value instanceof String) return UTF8Type.instance; diff --git a/test/unit/org/apache/cassandra/cql3/UFTest.java b/test/unit/org/apache/cassandra/cql3/UFTest.java index 5dd77bfa4355..46db578a9a4f 100644 --- a/test/unit/org/apache/cassandra/cql3/UFTest.java +++ b/test/unit/org/apache/cassandra/cql3/UFTest.java @@ -17,6 +17,9 @@ */ package org.apache.cassandra.cql3; +import java.math.BigDecimal; +import java.math.BigInteger; + import org.junit.Assert; import org.junit.Test; @@ -447,4 +450,214 @@ public void testJavaDollarQuotedFunction() throws Throwable assertRows(execute("SELECT language, body FROM system.schema_functions WHERE namespace='foo' AND name='pgfun1'"), row("java", functionBody)); } + + @Test + public void testJavascriptFunction() throws Throwable + { + createTable("CREATE TABLE %s (key int primary key, val double)"); + + String functionBody = "\n" + + " Math.sin(val);\n"; + + String cql = "CREATE OR REPLACE FUNCTION jsft(val double) RETURNS double LANGUAGE javascript\n" + + "AS '" + functionBody + "';"; + + execute(cql); + + assertRows(execute("SELECT language, body FROM system.schema_functions WHERE namespace='' AND name='jsft'"), + row("javascript", functionBody)); + + execute("INSERT INTO %s (key, val) VALUES (?, ?)", 1, 1d); + execute("INSERT INTO %s (key, val) VALUES (?, ?)", 2, 2d); + execute("INSERT INTO %s (key, val) VALUES (?, ?)", 3, 3d); + assertRows(execute("SELECT key, val, jsft(val) FROM %s"), + row(1, 1d, Math.sin(1d)), + row(2, 2d, Math.sin(2d)), + row(3, 3d, Math.sin(3d)) + ); + } + + @Test + public void testJavascriptBadReturnType() throws Throwable + { + createTable("CREATE TABLE %s (key int primary key, val double)"); + + execute("CREATE OR REPLACE FUNCTION jsft(val double) RETURNS double LANGUAGE javascript\n" + + "AS '\"string\";';"); + + execute("INSERT INTO %s (key, val) VALUES (?, ?)", 1, 1d); + // throws IRE with ClassCastException + assertInvalid("SELECT key, val, jsft(val) FROM %s"); + } + + @Test + public void testJavascriptThrow() throws Throwable + { + createTable("CREATE TABLE %s (key int primary key, val double)"); + + execute("CREATE OR REPLACE FUNCTION jsft(val double) RETURNS double LANGUAGE javascript\n" + + "AS 'throw \"fool\";';"); + + execute("INSERT INTO %s (key, val) VALUES (?, ?)", 1, 1d); + // throws IRE with ScriptException + assertInvalid("SELECT key, val, jsft(val) FROM %s"); + } + + @Test + public void testDuplicateArgNames() throws Throwable + { + assertInvalid("CREATE OR REPLACE FUNCTION scrinv(val double, val text) RETURNS text LANGUAGE javascript\n" + + "AS '\"foo bar\";';"); + } + + @Test + public void testJavascriptCompileFailure() throws Throwable + { + assertInvalid("CREATE OR REPLACE FUNCTION scrinv(val double) RETURNS double LANGUAGE javascript\n" + + "AS 'foo bar';"); + } + + @Test + public void testScriptInvalidLanguage() throws Throwable + { + assertInvalid("CREATE OR REPLACE FUNCTION scrinv(val double) RETURNS double LANGUAGE artificial_intelligence\n" + + "AS 'question for 42?';"); + } + + @Test + public void testScriptReturnTypeCasting() throws Throwable + { + createTable("CREATE TABLE %s (key int primary key, val double)"); + execute("INSERT INTO %s (key, val) VALUES (?, ?)", 1, 1d); + + execute("CREATE OR REPLACE FUNCTION js(val double) RETURNS boolean LANGUAGE javascript\n" + + "AS 'true;';"); + assertRows(execute("SELECT key, val, js(val) FROM %s"), + row(1, 1d, true)); + execute("CREATE OR REPLACE FUNCTION js(val double) RETURNS boolean LANGUAGE javascript\n" + + "AS 'false;';"); + assertRows(execute("SELECT key, val, js(val) FROM %s"), + row(1, 1d, false)); + execute("DROP FUNCTION js(double)"); + + // declared rtype = int , return type = int + execute("CREATE OR REPLACE FUNCTION js(val double) RETURNS int LANGUAGE javascript\n" + + "AS '100;';"); + assertRows(execute("SELECT key, val, js(val) FROM %s"), + row(1, 1d, 100)); + execute("DROP FUNCTION js(double)"); + + // declared rtype = int , return type = double + execute("CREATE OR REPLACE FUNCTION js(val double) RETURNS int LANGUAGE javascript\n" + + "AS '100.;';"); + assertRows(execute("SELECT key, val, js(val) FROM %s"), + row(1, 1d, 100)); + execute("DROP FUNCTION js(double)"); + + // declared rtype = double , return type = int + execute("CREATE OR REPLACE FUNCTION js(val double) RETURNS double LANGUAGE javascript\n" + + "AS '100;';"); + assertRows(execute("SELECT key, val, js(val) FROM %s"), + row(1, 1d, 100d)); + execute("DROP FUNCTION js(double)"); + + // declared rtype = double , return type = double + execute("CREATE OR REPLACE FUNCTION js(val double) RETURNS double LANGUAGE javascript\n" + + "AS '100.;';"); + assertRows(execute("SELECT key, val, js(val) FROM %s"), + row(1, 1d, 100d)); + execute("DROP FUNCTION js(double)"); + + // declared rtype = bigint , return type = int + execute("CREATE OR REPLACE FUNCTION js(val double) RETURNS bigint LANGUAGE javascript\n" + + "AS '100;';"); + assertRows(execute("SELECT key, val, js(val) FROM %s"), + row(1, 1d, 100L)); + execute("DROP FUNCTION js(double)"); + + // declared rtype = bigint , return type = double + execute("CREATE OR REPLACE FUNCTION js(val double) RETURNS bigint LANGUAGE javascript\n" + + "AS '100.;';"); + assertRows(execute("SELECT key, val, js(val) FROM %s"), + row(1, 1d, 100L)); + execute("DROP FUNCTION js(double)"); + + // declared rtype = varint , return type = int + execute("CREATE OR REPLACE FUNCTION js(val double) RETURNS varint LANGUAGE javascript\n" + + "AS '100;';"); + assertRows(execute("SELECT key, val, js(val) FROM %s"), + row(1, 1d, BigInteger.valueOf(100L))); + execute("DROP FUNCTION js(double)"); + + // declared rtype = varint , return type = double + execute("CREATE OR REPLACE FUNCTION js(val double) RETURNS varint LANGUAGE javascript\n" + + "AS '100.;';"); + assertRows(execute("SELECT key, val, js(val) FROM %s"), + row(1, 1d, BigInteger.valueOf(100L))); + execute("DROP FUNCTION js(double)"); + + // declared rtype = decimal , return type = int + execute("CREATE OR REPLACE FUNCTION js(val double) RETURNS decimal LANGUAGE javascript\n" + + "AS '100;';"); + assertRows(execute("SELECT key, val, js(val) FROM %s"), + row(1, 1d, BigDecimal.valueOf(100d))); + execute("DROP FUNCTION js(double)"); + + // declared rtype = decimal , return type = double + execute("CREATE OR REPLACE FUNCTION js(val double) RETURNS decimal LANGUAGE javascript\n" + + "AS '100.;';"); + assertRows(execute("SELECT key, val, js(val) FROM %s"), + row(1, 1d, BigDecimal.valueOf(100d))); + execute("DROP FUNCTION js(double)"); + } + + @Test + public void testScriptParamReturnTypes() throws Throwable + { + createTable("CREATE TABLE %s (key int primary key, ival int, lval bigint, fval float, dval double, vval varint, ddval decimal)"); + execute("INSERT INTO %s (key, ival, lval, fval, dval, vval, ddval) VALUES (?, ?, ?, ?, ?, ?, ?)", 1, + 1, 1L, 1f, 1d, BigInteger.valueOf(1L), BigDecimal.valueOf(1d)); + + // type = int + execute("CREATE OR REPLACE FUNCTION jsint(val int) RETURNS int LANGUAGE javascript\n" + + "AS 'val+1;';"); + assertRows(execute("SELECT key, ival, jsint(ival) FROM %s"), + row(1, 1, 2)); + execute("DROP FUNCTION jsint(int)"); + + // bigint + execute("CREATE OR REPLACE FUNCTION jsbigint(val bigint) RETURNS bigint LANGUAGE javascript\n" + + "AS 'val+1;';"); + assertRows(execute("SELECT key, lval, jsbigint(lval) FROM %s"), + row(1, 1L, 2L)); + execute("DROP FUNCTION jsbigint(bigint)"); + + // float + execute("CREATE OR REPLACE FUNCTION jsfloat(val float) RETURNS float LANGUAGE javascript\n" + + "AS 'val+1;';"); + assertRows(execute("SELECT key, fval, jsfloat(fval) FROM %s"), + row(1, 1f, 2f)); + execute("DROP FUNCTION jsfloat(float)"); + + // double + execute("CREATE OR REPLACE FUNCTION jsdouble(val double) RETURNS double LANGUAGE javascript\n" + + "AS 'val+1;';"); + assertRows(execute("SELECT key, dval, jsdouble(dval) FROM %s"), + row(1, 1d, 2d)); + execute("DROP FUNCTION jsdouble(double)"); + + // varint + execute("CREATE OR REPLACE FUNCTION jsvarint(val varint) RETURNS varint LANGUAGE javascript\n" + + "AS 'val+1;';"); + assertRows(execute("SELECT key, vval, jsvarint(vval) FROM %s"), + row(1, BigInteger.valueOf(1L), BigInteger.valueOf(2L))); + execute("DROP FUNCTION jsvarint(varint)"); + + // decimal + execute("CREATE OR REPLACE FUNCTION jsdecimal(val decimal) RETURNS decimal LANGUAGE javascript\n" + + "AS 'val+1;';"); + assertRows(execute("SELECT key, ddval, jsdecimal(ddval) FROM %s"), + row(1, BigDecimal.valueOf(1d), BigDecimal.valueOf(2d))); + execute("DROP FUNCTION jsdecimal(decimal)"); + } } From 861c4cf2de9075c721945fb7ef84a23030a4f35a Mon Sep 17 00:00:00 2001 From: Joshua McKenzie Date: Wed, 8 Oct 2014 17:08:11 -0500 Subject: [PATCH 155/557] Integrate Sigar library and add basic OS performance checks on startup Patch by Amit Kumar and Josh McKenzie; reviewed by tjake for (CASSANDRA-7838) --- CHANGES.txt | 1 + NOTICE.txt | 3 + bin/cassandra.bat | 5 +- bin/cassandra.in.bat | 3 + bin/cassandra.in.sh | 3 + build.xml | 3 + conf/cassandra-env.ps1 | 3 + conf/cassandra-env.sh | 5 + debian/cassandra.install | 1 + lib/licenses/sigar-1.6.4.txt | 201 ++++++++++++++++++ lib/sigar-1.6.4.jar | Bin 0 -> 428580 bytes lib/sigar-bin/libsigar-amd64-freebsd-6.so | Bin 0 -> 210641 bytes lib/sigar-bin/libsigar-amd64-linux.so | Bin 0 -> 246605 bytes lib/sigar-bin/libsigar-amd64-solaris.so | Bin 0 -> 251360 bytes lib/sigar-bin/libsigar-ia64-hpux-11.sl | Bin 0 -> 577452 bytes lib/sigar-bin/libsigar-ia64-linux.so | Bin 0 -> 494929 bytes lib/sigar-bin/libsigar-pa-hpux-11.sl | Bin 0 -> 516096 bytes lib/sigar-bin/libsigar-ppc-aix-5.so | Bin 0 -> 400925 bytes lib/sigar-bin/libsigar-ppc-linux.so | Bin 0 -> 258547 bytes lib/sigar-bin/libsigar-ppc64-aix-5.so | Bin 0 -> 425077 bytes lib/sigar-bin/libsigar-ppc64-linux.so | Bin 0 -> 330767 bytes lib/sigar-bin/libsigar-s390x-linux.so | Bin 0 -> 269932 bytes lib/sigar-bin/libsigar-sparc-solaris.so | Bin 0 -> 285004 bytes lib/sigar-bin/libsigar-sparc64-solaris.so | Bin 0 -> 261896 bytes lib/sigar-bin/libsigar-universal-macosx.dylib | Bin 0 -> 377668 bytes .../libsigar-universal64-macosx.dylib | Bin 0 -> 397440 bytes lib/sigar-bin/libsigar-x86-freebsd-5.so | Bin 0 -> 179751 bytes lib/sigar-bin/libsigar-x86-freebsd-6.so | Bin 0 -> 179379 bytes lib/sigar-bin/libsigar-x86-linux.so | Bin 0 -> 233385 bytes lib/sigar-bin/libsigar-x86-solaris.so | Bin 0 -> 242880 bytes lib/sigar-bin/sigar-amd64-winnt.dll | Bin 0 -> 402432 bytes lib/sigar-bin/sigar-x86-winnt.dll | Bin 0 -> 266240 bytes lib/sigar-bin/sigar-x86-winnt.lib | Bin 0 -> 99584 bytes .../cassandra/service/CassandraDaemon.java | 20 +- .../apache/cassandra/utils/SigarLibrary.java | 181 ++++++++++++++++ 35 files changed, 422 insertions(+), 7 deletions(-) create mode 100644 lib/licenses/sigar-1.6.4.txt create mode 100644 lib/sigar-1.6.4.jar create mode 100644 lib/sigar-bin/libsigar-amd64-freebsd-6.so create mode 100644 lib/sigar-bin/libsigar-amd64-linux.so create mode 100644 lib/sigar-bin/libsigar-amd64-solaris.so create mode 100644 lib/sigar-bin/libsigar-ia64-hpux-11.sl create mode 100644 lib/sigar-bin/libsigar-ia64-linux.so create mode 100644 lib/sigar-bin/libsigar-pa-hpux-11.sl create mode 100644 lib/sigar-bin/libsigar-ppc-aix-5.so create mode 100644 lib/sigar-bin/libsigar-ppc-linux.so create mode 100644 lib/sigar-bin/libsigar-ppc64-aix-5.so create mode 100644 lib/sigar-bin/libsigar-ppc64-linux.so create mode 100644 lib/sigar-bin/libsigar-s390x-linux.so create mode 100644 lib/sigar-bin/libsigar-sparc-solaris.so create mode 100644 lib/sigar-bin/libsigar-sparc64-solaris.so create mode 100644 lib/sigar-bin/libsigar-universal-macosx.dylib create mode 100644 lib/sigar-bin/libsigar-universal64-macosx.dylib create mode 100644 lib/sigar-bin/libsigar-x86-freebsd-5.so create mode 100644 lib/sigar-bin/libsigar-x86-freebsd-6.so create mode 100644 lib/sigar-bin/libsigar-x86-linux.so create mode 100644 lib/sigar-bin/libsigar-x86-solaris.so create mode 100644 lib/sigar-bin/sigar-amd64-winnt.dll create mode 100644 lib/sigar-bin/sigar-x86-winnt.dll create mode 100644 lib/sigar-bin/sigar-x86-winnt.lib create mode 100644 src/java/org/apache/cassandra/utils/SigarLibrary.java diff --git a/CHANGES.txt b/CHANGES.txt index 5ec542c054bd..be80ee305e4b 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0 + * Add Sigar library and perform basic OS settings check on startup (CASSANDRA-7838) * Support for scripting languages in user-defined functions (CASSANDRA-7526) * Support for aggregation functions (CASSANDRA-4914) * Improve query to read paxos table on propose (CASSANDRA-7929) diff --git a/NOTICE.txt b/NOTICE.txt index bbe21d7c7aea..2fe15f5f61b6 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -63,3 +63,6 @@ HLL++ support provided by stream-lib Javassist (http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/) + +SIGAR +http://sigar.hyperic.com/ diff --git a/bin/cassandra.bat b/bin/cassandra.bat index 1606dcc01f81..cba69c67a48d 100644 --- a/bin/cassandra.bat +++ b/bin/cassandra.bat @@ -18,7 +18,6 @@ if "%OS%" == "Windows_NT" setlocal set ARG=%1 -if /i "%ARG%" == "LEGACY" goto runLegacy set INSTALL="INSTALL" set UNINSTALL="UNINSTALL" @@ -26,6 +25,7 @@ pushd %~dp0.. if NOT DEFINED CASSANDRA_HOME set CASSANDRA_HOME=%CD% popd +if /i "%ARG%" == "LEGACY" goto runLegacy REM ----------------------------------------------------------------------------- REM See if we have access to run unsigned powershell scripts for /F "delims=" %%i in ('powershell Get-ExecutionPolicy') do set PERMISSION=%%i @@ -67,7 +67,8 @@ set JAVA_OPTS=-ea^ -Dcom.sun.management.jmxremote.port=7199^ -Dcom.sun.management.jmxremote.ssl=false^ -Dcom.sun.management.jmxremote.authenticate=false^ - -Dlogback.configurationFile=logback.xml + -Dlogback.configurationFile=logback.xml^ + -Djava.library.path=%CASSANDRA_HOME%\lib\sigar-bin REM ***** CLASSPATH library setting ***** diff --git a/bin/cassandra.in.bat b/bin/cassandra.in.bat index e3304e781fad..a0eced5b6fdb 100644 --- a/bin/cassandra.in.bat +++ b/bin/cassandra.in.bat @@ -48,3 +48,6 @@ set CASSANDRA_CLASSPATH=%CLASSPATH%;"%CASSANDRA_HOME%\build\classes\main";%CASSA REM Add the default storage location. Can be overridden in conf\cassandra.yaml set CASSANDRA_PARAMS=%CASSANDRA_PARAMS% "-Dcassandra.storagedir=%CASSANDRA_HOME%\data" + +REM Add the sigar-bin path to the java.library.path CASSANDRA-7838 +set JAVA_OPTS=%JAVA_OPTS% -Djava.library.path=%CASSANDRA_HOME%\lib\sigar-bin" diff --git a/bin/cassandra.in.sh b/bin/cassandra.in.sh index 368c40e42e67..ed124bcdb7f5 100644 --- a/bin/cassandra.in.sh +++ b/bin/cassandra.in.sh @@ -50,3 +50,6 @@ if [ "$JVM_VENDOR" != "OpenJDK" -o "$JVM_VERSION" \> "1.6.0" ] \ then JAVA_AGENT="$JAVA_AGENT -javaagent:$CASSANDRA_HOME/lib/jamm-0.2.6.jar" fi + +# Added sigar-bin to the java.library.path CASSANDRA-7838 +JAVA_OPTS="$JAVA_OPTS:-Djava.library.path=$CASSANDRA_HOME/lib/sigar-bin" diff --git a/build.xml b/build.xml index eaa1b60dafb9..708b950916cb 100644 --- a/build.xml +++ b/build.xml @@ -369,6 +369,7 @@ + @@ -490,6 +491,8 @@ + + {*&{bQed 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

    =_(EX(H$)qdQI1EFznSeVBpR& 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 z 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⪚Wzx|*X=rWIvn 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%0A>#)+gs&NcOGyyFj6 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 z

    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

    x)yD4W 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 z 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�w+-mnJ({^q**U*lR20Sprdt8)5R=90(66oTNDbaR5vn#X7^K2YPSGm$GP0e zKqEAp#BF@RU`l9wI$GJ}+FNJNh5pI=4R3 zR@;P|;>}GLqiDvpw~jkHQe9tH+d+nUG29Q?MLAca<76MFu-|*J&&}p=%sdTZ`9b*( zOVr_;he7W$w4!^JP%N+hF;rkpuE_`HCez`3ZzQE!8gfDXV84^#59sakXk2?HTdJqju zslz`m`Z9-qO8A(=+x)~G{)TZT{e;6W5x&ad?-ahq;eRcBqr*QgeA3~c6u!&hKehJY z@V1<&rJHo4&N($)ZwGcjK0+2%Y=_Pd{X$h!*>gxaQKYy zRSw@Pe2v5R3E$}O{la%Ud`!xDvBM{X&p3RI@Jk&&DSWTPcMHGF;WNVbJN%%vABP_n ze!$@)lFoXEFA{#x;iJN59llKX$Z7fZbN`o(zZW=s%@m_6a`-U^8hx?D*U*FVSfUR9 zzW8;i!w*&(eVM~=5q-JC_kYLeV-EkR=;IC_6Me$rBS)J2S2=vm87BQ2haWBaMu#7a z8-3E@cN2Y=!*`3m+u`>R{bGlYi9X}-dy9Ul!$(Bl>+oL|{W6E|Ki%ZN&*ATu`d#ku z-Jvd%&&~T#^J5L+u=t=jXe)K zytUhc3RBNEKOc&}lsWw2QZH2wUnYFF!yhC3GKc?`@B|3BOqU z((+Zp_c{Cw;nzESt?)J;*mP_;G)kPXe1qt1ys`Yt2bglsI{HgQUnKF&>f41cclgVM zuW|TA!Y_9Cn}xUW(x!ih@C6cgEq}L7-{F5|(|35APM^a+Ao}$VZ|yB2?Snn`m&z;xN=g#Z!x$`=_J#YVw`Sx5h%A9wx*gtvCH4-~$lU4ldiZ2p7B)#U#L-?8y zesKuj7s9U(;Ui+VZhjgSe~Ze0CWK!e!ViY7)|tv5O>6T&YK;Ri$b06a`1DobJ;Q~Xa9A6NX(6rWK13dL6`en9axikDZ-cyFWP z_n|_PC8_u>#dj(GD#aH(VXhair}5u$u;~;j9lLr#$)MtoSLtLGe}dwN6(3Xl7R66cd}M`Z=MxoQpm_U^ zEA1{){OL+xtoXR%ql&Lke5vBkP<)xvu=ieIew3l*PH{6&gis(5-A*)F|`ueT(&%M{5CQrE5%0@f4|~O75{6+mnr@M#g{AoLB+=u z{~N`}75|Xp6N-OW@l}d{RPi;6e_Zj6ivPXhlZx+Ge3#;%RD8GMpHlo{#jjL+M)6N8 zeyQSDE529p&nSMG;-6J~pW>fW{Bp%VulRn&zo7UvivNS+2NeIJ;@2zwCB+XaUibgA zieIbr!;1f-;i?$e!b$075}Q@ql$lB@uiCYtK!QP|Aykr z75}EAJ;Rs2%Lzo+cTjv(@uL)9s`#B0 zU#9rciZ56E&WevIeiy~Z6jh>NyYD_(&{1(L@uK38)p8X%8_yWb- zZ-UbW6e)h3(ibcKNX17LU#9p{#gA8fnc|O9e7WM~6PR3{F~uLJ^l`DqcQW#7T82KBn~Dil3nP#fq0tU2-}Z#mlG8m|v>+Nh+OQ z#h<45Wr{yt@qLPqD}K4+zoYnm#huSFqxkuX zA5i>4#jjWVBE=6X{(8k{6~9>V!-`KSev9J2tN4h_|L=mU=}~-v;%`uVk>cgks$34m zioa3mql&*t@uiB-C_cVmQ$hC6MYyr}*3um!@dZy8tc+|u_VbhXiflb3^6kAM87x~5 zA>2sk9U9z<<&e#UDV3oC#_tiP8<#`cM{&6aFp?_gbN85F}{)T z9)u%|uOmE$@bKp#4!N2z3JKTGcrM{R2@f!CAxwd7sGo5I;k^m>F}{fKK7@N2pF?;o z;SA#`g!d)f&G!E<2@ikD^-s8r@F3&4gvS#eVBA9ZD8l`W z8wejwxR3EggpVQI%lI6^#}dvko z8HzDJl<*0J%NQR(_(Z}{#`_XJiEt6)JqVvnIKp^m!rvx5{0Z0piNGZ!Nb%f6(Jp3`&Kj8%7LB?|l zpGA0paSP$I3HLK@AUu_DALEM%Pb1vR_#DF131=8jA$$(uZpNn(K9_Kk@yUd%2-h$^ zj_`Se6O6|ZKA&)m@u7q-AY8`y0Kzi}M;Y%+_(H-(jQ1dX5#b2qoe5VH9{w-a{|Ue~ zga;XKCR|H+fbn~TFDBg2cmv^?g!>r3LAZ`^FXMHD>j`HVzeu=&a5v-Cgl7>>GJb+E zH9$i(j2|Z4L^#3te!`a!jxoNM@NB|mjPE4eOgPH;R>E@#7cst(a0}rGrVBA8ujc`BX2Ey%x`xswDxPx#n<8ugi63#H5LU=CWZpNn(o<}&z z_+-LegliZdNBAjVJ#+wPxCp^ITJ;K)#?q|G#@B+epjNc%>Kb%YlY&MewdCkQVlT*LTb!YRTD#`hEcF5wvCdkOatE@ONr;Ts4?8Q)4cO}L2hjf8I` z9ASJN;hP8#Z|3?ZoFP2OcrM|a2@f!CA^bhU{frw3f1hw47OO9KyE{&M=-r z_*TN*j87x{1HwthClg*uxQ6j@gl{99U_6fS?Sx~D4<-CV!exvPAbbbmDC2zz|A=rA z<2?x9NjSoIXTo<89{xAi|F?j92@f*fO!#iX1B~Az{A0rXj5iSe3E@7*ZxH?|;aBxQy|ggzqC9 zWqd2)UlA^1d?Vre2}c-TNBGx-hd<)_C)`JPknvo?4-g(;+(P(4!u^aJ2>*s~ALEM% zKSa2f@i~NlOE|-L3gL$dcQZbX@FRqij87)KoNx`};|M=WIKg-v;l~Ka7#~XbcZACr zA3*qV!coTi68=5mBF1|Veu8j>@y>)-5FY-J>%SbhpYR~#&4iyMJiz!p!cP(IXS{*% zO2U1N-yr-n;a|!s`fkGd_**p9v=!pG*j{hVhGpHxTY-yqfSo2`3ppK{!jehVjFM zhX^Ma-%t1*!ZF7865dF-jPad>HxZ69zLoI1go_y8NccU%5ysaMexLC0FxNlfVZwuq z=Mw&a@Brf$!v7-N&$xl`hlKkWUqtvL!o7^oA^dN`8OBoxZzkN$_%y=*A)I7lFm~f2op@csnT*mkS!k-e3GTxW)XM~Fw??L!;!V$(h6W&UA_&4hO#Jiz!p!aEY~XS{(h-F_MBWBdl;oe1{=Bi-E6ebN_kuE_Lw>K~nF z#TT5k63R%&m*YJrUE8;3B>Mo|absb8L4QF!HM$GT*0u4T(XIFq?I_n zk@^THJ|5F9TN7pR)arQ8sLIq^@zk4@J#{5T@tzqa1(iKjNld;JPuTjlNqgJr?e+gL zz2=g^)GL(3YveoE7RrXwvtW3R!-Er)T z_cWKF`kvyetpq5p?CB_p;&MxIxeK=J*m)n7Q~Fr?+f5sPX?`!E-*+`+;yn+?U^nqa zn>!ApGwU>+1W|^KlBh{z7!zZZztk#|=fZhNG@c&2>^jOiWp8VS{*GKl&+a9ZKSSNT z7!+zr&bBo}{SLyZ>nJBfbKwwP{fE@|R{s00rmj)Z@pR#VKjCv9i*s+y4DW~}dv>c# zZOF3%E~MK^M`5SfLS`!LC;J1OGQOz4`(4lnpD|uF!}!`@;`npUBNE#o&8D$)My1nd>MSu1Nj6GIb?q zuGCcK!IS~2%%|Z#RB9-@bm2jCvFWh~aPH{7YlXNM6)g7eZuWmUw;!cmk$R>gbs;R^ zU*;ml_iw#<5OrLUIu+MKX-`gFRkSq|-GwS?|B{9MWN2_vTq0R+@t9k{Tv-ww^Kd`e zn~DGpnF-V2GgE0+HQsZeNo{MUd~_s&Vne-E^h_%$sz4%eh&RXgPuQ9%r3&SM?@x)HB&%qr(|by%SHpfqZ8#gwe*+R~2PTaXpLrQ;W#nJHJHLz+r@4o}5F< z1?S5PGrT|b6e))G#8ggZ!nqU9K?s{Ly(0D5glW^cX0kuSBo_>6eE;M{e;>1u#)%cE z&!WkxBTBO0=7K~8O-Mb1s552}4J#{p9x9PA)Y&rr-Hp3!UA5q|gReO;KJ%}r(Z3X< zCFh_v|BGQY&heMx?ECnIW3PUiF83{f@oOtn zn{iOK7P*>~faJ}XdRN7}87i>@{ML3v{dLer`5`*i;Q!6|6il<5^r8Z1L zW*4KMxTwD~%B>ew4P2v+B73um>|Xu65l_AEsHiOv-Oy}IxY*2yecSvXJ|Rx!@`E^l zEXC8)N_Ii0-kOP%iKCKItFpVI*VcVy$u5xzsi!;lpOhMOPMAC0N_Mq(a6F8EYbJpt zMp8Te7H5C^Pdv3Qo_Z^L54uW0E>}(^5kob`SDNG3Q~Bbe{z%t@_=Z*%37K|x!KQM) zu7BIeOKyN5mK}wOI4<^89Vc)lreTwnsc81(O2C01+g;ZuN?ViB znQJ|%hhxfTfXWAj#N{(c`KHo7;MMbI9!Ol41p4UWXxtI*-=qt3YGar_5?&F955lZ8eK&4;?!$a zO%`%0g#o(xU(s`6DT;i|Lb|h0#a_wI`FXsjl3G8Qc@ZKyHGpta6f=1)?=0q>F|-MZ zf?!3|Q-q{Z>M77o3_44hr-%kC$~^`8UO{QZJVjZsBJL^5ML|YZMMhRbrr$_LmLwzV zs_c2Zq?@X4{?k;0u(wIn>caWn&$eNvW#cMiZ(qu?y`cq0Yfn*>8%R`^SR57niWpMJ z4*!!ZuJGmCxZR(ETgD(5;?O+l)jsJ& zlVp1Ahqz;%r#;)Rg_Gg*>9H@l+C%+Xcmr$ibG0ASJ=nbLPK=6nv8#R2uQi329$V*X zf9%(mNxCtmg>|!=PAnff01Ywu=Y(^p>HIgEPP7kbT>c1W>_tVu8MPZy#5xNV%1-$7 zn1%o14lXr4Fxw5;%ipG$HD=L!Tr)FD%Grw|9G|Qgy%*N8=l z<3;%r8#J(XR6-a^2BiGT19w6_&#%+MVm zgGVc>!yjB`1tpywe#^waB^>|KUAY#Q-PwzN(~wZQ@E4GowDN=B3>;?zno)K;%3SO# z_erO_QXBfd=#w7iN^Ru(7|$5xXJD)CJizlPPUiyO>ptn9T&azFkNc!QccnJ$-R6^C z?Mk^O5YgxQq*GmKOoHh&pS0AK#zlIRPx{&S@+)g%LZoAS(zUL%N~D|cOjmxn{>+uu zi1c}%^h#ISDAHf}q-VL(q)2b@Ne^|UT_SDqNk6$czXY!BhRKV1vQPa7SIwSoTGk_c z>bqPuySq`3QEFkhPH>) zm(jvra+F+COenC_ZYWunCnO|7w4mf|xfa%IUk@JQ_BC%W+F#SYKK6R9edSOc(7wi2 z(4pB3Dbt0Q;#o_C{$1L_+t(OmXFwLzzP^G-cfBx7%BZ8vwXYBQr2oeApE}WrwtcOW*)kia5)opx1oT5AkGd zUI}oep*|k=N!Pei+rHlHlm5t++V-`@Cv9`3Rg%{VpY(KBS|id!eA4}0scl~)KIsQ| zW;m||Z2Ni~9%9Zf*VV4HOET~PWZy^r`oB z)f_{N`pZ7`+jz2Cm&Ucda8-H%Oa}iKMmv`$W=?f8F*(60V#klH%Ot|7bfVlHxLvgb}c6s|yej=@Dzp zG%3OUx$v6s#=lyinsRUSn-kC|TealTTzJk?sD|8Y>+=+<9ruR5c?#8xdn4aGg=)oP z!TC@vbUauQ(9C1rv(Yvmm|pkhqu!#CRsPOg`*Haz(tez3!b`yXRD4AhwI2ymrVGd8 z-2ud_n&#Ymj(>hC4qYeS&B&kdvGY^oaj3QH=_GvvcMkKVxi;jXZb$o|UuzqYw5z?& zueGhngR`A<&-ZJi;)jbd2b`DRaei&7XlvYbcl2v*Lvp;UT}QX{^5@8GOESE`$-^)F z+L+|wpO-k=tNmJ2+3B%QDlHt>%#kIAPQeWux_`3XKflj6Q|P|>f=vj=xNqUj@54iB zw(MXsH=44>Y}t7n1#+W<8SBmHpoSyG4BWn>(ZR)ep(1#;EV1p;ftC~nMTD=t zfAC2sxl-%r_xhw?bfwnK7x<*_*|M|~Le|UAtM~HCRZDl4CdP)|ggXY#SDT(lUTaSt zcsFX?dSGwtkc($kA@Qtg1tp%% zkP_oxymLw8-O1Wu6EzkE!+gvGI4Wy5tznWhKr@PV`>0lN4Qr+K`Hj4C3^mOu5 z{oo3x1d<|s$tPXyO1nh*fKU2EN2OT-je@T1`6)-uN?;0Nm3Uf<<`d}YgI;VA7O6h?kt81Pafk0;e?o`v5fdM8 zeL~kmX2iIU@8?v81YkFgEgRbbgqokX5(~#(I^dt8ePSB8OA&a-wC-bR_ zy!PBPZJ(;xQ+d|yQz;*?!y_7!prL4{8~u1xjD{qb!|A{ffu7UM4M`GfX-Hx$bj#CX zp(cH*4bwuXL5V4u6{RSZ>>ASJ`4`;TLfAg^dNdw3>5(%$Bh87= zcEmX=-8o2I;;OBg{uN&mv2j0__GUCOIwKRUoj$D8VgzO+9v%7*TOU1=KT>?gbH(DBn3VX;DseNEmq?emKQ`{WzEXzWP zQKsU;9%u2XLQIiPY|I+x%9|LprbtGHj!Sb%85tQYt(h#XgDmYzu{4xd&e-053C8xk z9sfR+vo^j$X&3SyNiY|`B8rS;&nJDl@PrPwwy|t&pVM=I95uYB5|)?(OBe15CABov z&(%+5{Yl+n$cg`s7^}rOYdaDXC!YOqPSb@CyJ~A~2c7GwrRI$N6c0_ruO7dKyJY1zZF|lx!is9af)#NLrE0eHY8NW*PW~#zfjb546NT0`aW9;}3 zlh?3UuRrru8oBu-GX8ra=g(Xn@Mqf@$ZJ1n=ZZ%1=*4tIy0D3Q0_m|ErsjGN0Y1%1 zrVCH<^%`s&GCbY$yd}np(}jEZ|gEIN2Svc-H^?bN$&l|Z@ z8PuNt4)N8t=c9QPB=hXto__!{rw4JyVh^?F9D}H9xerV2Twic|ZpIkfYR?^2NPF(6 zLb{fYN`)mIR~?lKaW<$@-vGwMJ%T#w5j4}Je+SLdU5QRT?t<}PN%s#{V%W3s8R;Kf z@>njO(8;J;O#_`5O=y=HGaXO*bm5ojc367sth1y&4~Qk4T)OZB-1X5-zKtY@pRFxl z#7{foTpZasNPVlTwo&8_WXp>Rl6Ir3wlU=KAT`~r(%H^E#CW?>ioQdoL---fw5=$o5WR)#ohmS}5J2a8v>I zz8yW&T(`7x70m8M(~5ocNY3i$Bq3HuyH*tAzwFbbPZ!>U@BP8*F2fxLuA2a>qhp}F z0!m$d*6N;_qAf$jQyg*5>K?81)OVDy+SGN?(CysMG;h9m^}T+?`-dj9`R*USje@cD zT&m;RhV1U>jZ;u7lc3f|S4Wk6WL{7U9xszvjh9vM(3R|{0xFq0c#cXLjP5Tws*s@O zs8oQoK`r2nWuA%Jo+24vj6xrxUL8d}zA@M#QO_F>{Sk$@ajnF=%YU1*Jj#c$Jm(SZ zJNR-}lw*JP4AQ3y4~NOY@|K-JX2tJCaRaEwL!4Z?a0fO{N-=*tbdIv6C42%T`zN&A zc_ZWkPBuOE+mk)Z%c<{m)i&OJF-YCzs%^acC@3dqxaz3ndQ;agN zR5mm@7afh)Nr zg6qMHp?F6O?>3v^UTfdBAMv?_#%l|HzZ|9z8ME+8J}EjrG6`tj2j-W77m>txn;8q! zpoYe9F@6+y8eVz9LF`@gpGx2gv&}qHiT8*D59PPZ%(3(a74^1YQ43b%ZDxKUm|j2* zKF~X9-hqj29!Q=Xlw0~JYxW6DREJ+EKTI5SEG9N1*=t8Wmb^ab*c<5B(?&j)VnNWc zy>#rZBOgm+Njlak$etTY*5ha|-gu+QyaI=AFi#gpdghHmSC`GxB}9iI9+|ot1$vJ# z9Y}*V-+t40J_5VtS4{XcY#J~v3Ztse_9L=K^B~jpq)!*_Q^6su=5%a~-q(EILI*)Q z6whg#DE1ci*q)VD|IVk*HK51gWUl-Mzud;Lo`BRZ^vi7^YYdQ&^UG}{n-C!1>Xn9E z=|mgK4hWDB_~m61`TiSlssF~EC@E{3I{NB7a9SH6U+tI2ME>&tIo;=SQjd%LYMLG%2F{~mTF{nKxeh4TyQ=w@uFzzgwvE;n5lOw}QRK3>uf z(?SR(NSQR9GZm8-vcmRP>~xeD%ubC|r00!eBhLlE;A2$iq=OzAN2es`*w%6RCwqkc z9_@A==LJqa-;C`&jz)SWcwrzx2jQ+4J-$MB!Its%z7l#;h36 zFMRMQdN_}o=y2P85*sQN*XhZXJoe=(>g#V4$f?cT| z@;V>%gweNY*ekX^jjABe)~El{*m@=QkgcylNx|0H5Q1%;6eHXEBar~J4LZy<_XuUr zG55gZ9CMFQM`e4CbId)$AKA%wufX$p=FV;s8NHq7^ZEzoxShB2xU!sknd9gqFxzu| zwqHQ5gYXe4*v{jqpJ3eC9QTFoJdXMeeBAt}$@)}(Aooa6(Zeu5-)`gZ%a-LFo{Bxh z;c3^31pdo*kv?5GdICHAS@=^6VIvw&E?xL~EZE^MKnk7Z?WhJ2=87G7YIKBV^rndDa++v&xo@Wx!JLC526W|Cj{30H0RMKeKRpl zv1=JsKx!0CaMLdHC5?MYpDw)q9QNp)@W)xgJereB7hVXZb`9HvuRlrqk%-G2an7UP zJRv~6qpP+a{cw=_PcSTCx>OS4XS9DV5y=B>Si#5sox`O3yZPEx6OPQrYPV}!KSES>f^=Zqm9=cqzF&QWQH zQ-0~Fw8Mp~VxC)4D{Xz;Nh|KDys^Bmyb_)&5uR3+r>Y89)p)9!a8;wHY7AE;JykMX z)#a(W!c@+)1NooiaLQwZr<`dPH?M?mFgJ{CP|jpvuHkuDN|v9~5(?M$=4lCqYfT81 zhJgdBXwktUf3^LumAT&6_h^XZ?6mJAA9hzRR@1eH^uB19c`NzjJ2_UrjwwJi>6acW zQO7qGv&49Qy6^!gbzriw`a~S+^?CT*>B5DMI2Wt;4N{-us%@+uJ|-aTQdezzU(W`q zKRz=*+qvG?kAu`NxM~}#uL@G%>8fq4o))A|x@z0|IwD9t(N)K!jTs%J-p5tPMg7;K z14?iMdRMwCbDsryBuKs7RaZ&cHwCG`>#A!+-58{v;i}O!<^rkQdE z8*$ZLqTYB^K$)y{T50_t_ftU!-0dE)SlkZo^rN5ylI{T%cI*WN9YFV9bT#qkL*#&p zpab@B59syIaF9AcT64aIcrAsYp~LaDJNt~pNcW4k|ND8j{#?2icE=C6a@9izvln59M{QVyBSiC-bJG)YDF!1i(W-xFwd)yr*!`9_`^IR_Y_CJYL zH@_g)mr@_DT*yf(RgtIie9osT_EetJ`Bch(J+JerlmmNi=Tj*U_WaJLQZ8&Ak2;}F zNhlwV<$TzuQci3K19+M$k?S3L->YfIBuU;b^E`<0++A-G&ow6?yEJV}-dLV;XlCbL zTf(0EyVKZnFB>OKk<3RHYcug#5u41dXV}!S6w7-RS={u zaMjjlHz+5}<>WPcqruL%S(kk(NPVBHwjTS#AobO*+B$4!kUHV2%jGJk2C2X5s$-%) zLaD`5O*DuPolWxu;m@O+4ou!H2lIf!b8vqA&gM+W>fRkbW1x-iE*vgYunf( zzck=_=lS(E5Iz&6Ki#jlq44e?{eFIZOoHL%LHd8<#)fmfanVl;(m&$YCq#c_kp6nV zzDo4F2kFoC>uW^6;cH%bN^ms6ym9DFeuWr+e_^EYntGlcmxzZaf}UsJ_(Lze|CXIZ zKhJ(?+VuVG`)LvC^3ib1c|XnGSkW<+v?e}p#v5fjd2X%4bH1p+6NRU=yC<^2nI6J~ zmE&&!&_kG|^bjWAQtP0%)ULFj&Nuy`+^vpN&@SbkKYynu7by4&xqn1Y(B<`yXqS0E z?J?4)3x9|?e2i=seUmyrkOu?_P7dEcfHLSw;4^Wk7a~MF$r0xQ#OsFysP}c%HatA2 z)OVDa>*7zF==ak?>_`5dK<@oUxS(r4{C5SO$^H`Mi0%RYYC^|J^gIIoqyYYy0lnKe z{kvp4o%nkKKPoV0({UEvwUEC6K(93NUl!QQOodY&7Em1)Q5_aj9ilcns5Y;(e_lZS zeSrl(K>gYG3lGDo`0ooWqBEHje4hU&1~?DquMB*eqS_l zyWEaL6ZsDfY@ff)-xR0E5qw1kgQ8bLyJ%c2w>s}pE|{a}#nU^GJYt7IXe;dPF1daipMQ)pH$ploaz--B%LD zmL3l(ORhR9>P27j)M90(>)^g0-%g zIW2A0j!OBFHfu*^yphwgW=$^QsLDJSDN|z{N2SJu<>9KBmzEyKIcdc`RXjYcgr`b` ztJIjVDqL0LrKQJlPQDsFRbzNsNl%pwSE(^!SD0!W_lxs#H^Tj5v|D8VcC6{$f8C3Q zhR#lV|MeI1bMcAJW8#zVaaY=9zKV4@>C=T5;64{RA|LEWjaBgbJe(Z9{|RN#{MzF< z)Qe9d-pLW?;?u1`>UFp`q?67~il2^<V zASVa7YCEi45|sAvc;_n79C2K|Hz@6=Ty;#;R|lz=xN3~HIPKX%>IPSBhm&Unsmon; zm85;uVF6{btE;XN^&ipU@YUsC%A7K36!l#}>ib=FQq(sDsk>cum#Ak4sn2%Q`u^(_ zb-*1QZq1`l=382K{nxv9x!vz~&)<|aO|5Nl-7IQnJV8_3@}1Ppys?%)Fsw z30+Q3s2fBj#H&I}^K{fCnomCGB?w(_o{k#DU>&{o>z$XH#Q_j8K1{X2EijtQw7uaEOO)hsTlNad|2MU z{P>Doyr%P$X$FixXqUN@`5fufg;&Bu5wGWABO^vOYMLf6er!rVpP zfjf_R`L^-;YkLRe zs#SN&0;Wpi?=3W%+>Y`0N0;Z1zY(OiIsPV%>$&8Q0psr-Fg(s1e+M0#H~uc=tHO92 zTk?T&-riRd&lE4-|K!xCqzt2V=-HyLM?#kIeoixP$X_py)KS%m>;kkRV z{r_Z))MUVTij#x=L#ZpwcFL^mev&#xJR*+ zn(D$Ui}=!BhgX=tCuls0^x^}B=NU7g2KIxq$fZk4pBIa@?4kR=7@MkwhwK@LT%G5h(S*Y8;HB*C^TwwUQU`2n4c>G%YW#C2cql!<( zAJD}Y5{u&}prFPqcn;L~{vmvLEdqbzKb40PqGZ;i;AxhPIyZzV8A{|?NR0{69hsa- zvkrfsILfa(gEu}vucbUx;=ZqA#TaE#wK`(wB^E0#3l!74Qvun)m@6RVf?zQQRr%rx zXv8ABk@$@`t|`W6Fl`f+#;g3q%;(G|>6Ie4jA)*3!q(N3Qo~%#?XxPI28)nh>EE4e0mAq&sO z&iH~W;U67mQm3ML=oDhOdqLKpUDQT@oc&`wB!J=6fF0oAW*WVUPFI^f@>)vb>8|l> zy}k5@wfSn&$CBmK71AG_hrMjPEhHY}z5~Z&eqN0J_$vKT+C^(8q+XhwT0J@S!tz2~ zP{&b-&-}-CadPuj(#q7|@JF;K(MN-=zlvS9%tv>pE>Bd#| z;Wo)Ha>suPnEzCHWzWI*bJzc!hbzaQucp8DjcMq~=y1@aD$PU}p+wMAdK(AhUqF2N zGn^2Y2nXMVi-wAlnwgtXn*3LjaV=vOmh((VtSI-D0E$ZpEjlip(ry}@s}Ywf7F^Yc z$=<#BFyqi4qb{RtV&u?V2YGg8T>2$(X_!J33EY=+PGg_tPvG5B{8=vd84({eC z+cE2|lgv#qJmxBYi^9)S+V1M@uCm8f!k1vu>9JS1%34=hD$0xUmF7l3*-#ptP8v4Q z2avP-UxlJW@w*|>hLnJKurHDgiU;$r*74x{?T7~pk|rK}Wa2>r?tJY391lK#l~EHf z@!&;3Z7gB&fZp`scp!chPw)S_aZiK<{K@X!@%q=P=vUE%D7j~V)8Rv+qj0y+s&Y^K zIi5taA|)FkHT?DPTxubnPN_wejQl(#Z>35`ULGPVQ!?`L5LvmB(ZDrC7E`iVPDakV z9T8)T8!?W`j~El1w-GURm}4UbsxByE$e$s3l@dx9K6U^{j2m(9fxXh#;h#=_g=7g- z+G%ZPe{htF10nS0LVJFar2tF#g0 z5LbDdt2FIjdh94y+3G5#D?j!%v~_maj^Z>?C^od8jzYImCod=p;qQ}R4lABoH(~nZ z)T-RD>3RHBZF-tBTZkd79qPVG%_9DOc26w9z1Ydr0T2h?dUGl7U0Bjf{R1?fK24&) z6VY@|un2c6ZAyKiqGC_9JXC~_x7(EZLq+&}yA{!dP;j2gJkda?2rtUolsF^?7D3Dt z4ce4=gcMYkC_~PVEAR>ue}E)dkt;=fxIS2sE5b=7jlqgs`AsTG1}k!fH>sp6SfNU; zJM4NBs^k`jifqZHX-t}aoXrf+iNx^)0NrlMuCK$m2VL(nz8j8*c+p5vw6S-?carx^ z?Mu&SmAsvk^8S>2h@>cI?FkfbH#Mo$N7ShldlHmypd{)^P{4r_3}Nj=r~GvR--*gR z35qx{6%1ExDk$JUNz9X=cu9guA98y;dRuAlPwhHO!aiRx#eH*gY74|X=8?ew`8B`T zjfyaTk7}TS292b)k2l%BK7o-E^|uPk(7i&p>k^t9r2&PR37v-Cw>gXh8aD~5m^N|mQA^Wd&i8*xc$cJ)E}J&o{1cnQAHw4oAx>?3BH zZtjC*eYlFAW60UJW_mHob%&}n#_gOP?>Vs~{^UPLWyd3I#C!HBLH`yLQ;XJi?9U_W z@z2I*?sU^uO!w{dJnc?>5dYT8Z5t`^)XNpA_2bu?t}M<$-*NfY41Bb&0OSAc-57Gg zZYfs}v*o`<^8u*QX8Jpp12i9iQ6>MOg${YJFgJVh0eb7>*KT~#3=L?qK+P9ar2eF) zH22zyvo6?#>ef>RtFjki#=|SDUvOb1O=02jA^M_KW$HiK$D2%f@!c0(l9}w2LNjxH z`Qv*owCeG%#}}Mf66uJebb6+vr17{J$~oS1%$lv=li@v=&}+7E0!FQ!-`u(~^=kZt z-AmdYLuZPz^NkiNv$xPcp(3)eN6#z$nFg}h?H@#8e$kqYJaV{&ENajc&Vl$lhw;>l z@t#qr8#9%F2T=fda3)M;&u;ulz-c8IMBo9p$(UkGy*a*r!q%G+nQ)orV4AGtxt)dm zJgY;sh=&X@qcY}}{xJ{tQ~nSy_5B65=RvaPY&`WxGHKW~CbiJHTFR!nOFTv2H%K2l z6%he*Kh{{&g|BYL+0tXzVPgxECn_lSJW4&9Vo16$4MWfZGjBz+M^o9FxbKG9qi#MQ zCbhXi{FgbzOeO79GQNN7&4VOx=4QFtE8^+VKfow~iiX`LjnGUETSV6qrCB62$ZQHT zN{TVRUXGNI6k3YxOt`?J{t1{ZO1;*J`MMb;jpPYQ@q{k=13BGL)2G3x>8DSFQEQH7 zhzdw%ifKMar&Bh_&YYMWrpi#r~rI?SU22D>rpHjRWHBS?NNWZxRRR|+PCs~E2)MqAg z;qPfyq+UedIr|pO7!^3aA8($HS!gO4zO|NmCCJSYcvzKY1mgH*|A-RxJNV?Z15?&C zD~I`-0u){mY!I7rl>Qg-flO<#gWNqb{GL|QGaS>rx_kl zYUaFKGc=b;PK&0A|4d=XU!Y_IbB{}jPiHGJup8gM@o_tUVM>7t$^MB^F02YEEL28S zb`4h+Oc4gwajFU3xL}Io*@26xB2f+Bi1&=1b@!eyYFrR57a^3dh%BizTTw5T)OjeE z5M2UVECf=qr5O2Rocz)J(He6VWV6b6jCW)g&t~KK9bE(EA5}|s<4x+8XUBS3Uez(x zJcC(GfBUCz1{=+}2n$c3!xZ7b(nlqmTBSn;`_7lZRHOzUH9}M}LQWrl`0E|IfGAx+ zscjYzK+1V4opjm1U&47@A22_3;(u|rfcfHDs+zUd!`}CK2Dc&Th6XAP=8o!qD*ohKJH^vGp|{7T zz5go8QGAEjvZHyXlD-y8ne?W5z4@aUbzk`~o7@hs#TPuaPxd(kLi5enphLsvkZBqy zCZ{te$^G$>fa#}rzH)@AB@F5K5+uzLW|uIu(@JlGiHaug8cVYqsDb2<=>}dS%{rO# zK~&a-S2+s9Lw%MJCY~@%)Jkve$(JUEi&`1Cvs9_q;-fh8Xu(k3>9#I4z0XJJyz!Hg ziCoUNbB2rFFwC11Z^yS1skjhn=_c0jxdca;6F=~LDoV_W%OwO%a{Y)3*?g7ugY%$H z7he4@7+-qqJ=n0()5w!A(hg^Cp+g{?ZWZV@>Ay3y;NNsF-wb`M_A1N+=gl{nL~+*^ ziMZl~D@Id~9HhsN4@mi7SInaoh<6JRZ?@C@lI7gA*P9>sv(X7IFVCftjh_UF?{HIw zU2~r22Z&o;v1#DaV=wr~pN)yGI3_6{8z6oXL*BeR$3y`c!U;|67Qn z2;Kox{PKPkdVSPCnZJqNe?T`C?MNK=49C{elm$&pU=;IDaRuBsEP#rh&M2b0wDX^) zgXl@5{PDnqyz#(l)LT%KFa;ejuSw|SxNL4AqANu$Yf->m#CN%g8?%V+5~Eef!gA3n zoFPG-1`FGFBXMUOp<0Ev(Pu$>%l(~^ZzV24D0glhTwpqAd^eGA9W0`3dC}iYmir=O zLG}f-qb4%a0lxTBkc%(AC>BK&^G>3ozwa!i*@ltNLhV67{6!N(4Tm}jH3yB{kmY3u z!peLhwFUt~YPG0^QAv()$AMZHrSxL|cE;LGsL{Mwdtm_>{VznMmrL$TIm zBPiC=o)t0tmt92abYa8JJe@JmdaXa!a$@-Y_ojTmwzm~d$C0`4DcU`eXkHAkvG!{L z;*68p^I2Z#?w5Xno~#@fMm{Mp$2p(92Ykt5=y_x$1u@p@2R$~M;C@V;MM=8A2s zZSsjtkSibBL*GG|R)fM12y)ba9-#j7dhY+%(O?PVT?~lw#=A6ljbi{@T(RK4sPc7V zZdr+;?>>`LFJ^y%FlcWvoQ{yO@byab%F~#IV<_g(V-9xcBm*Wq{mNq*8Y=N1G4-lZ zRHi5HG=43d4V~--pX@YdA$=KO!6!vy79N8ikL?RHTC{e|qF0a`*yTQO7xW9#50!Ld z2gd!Csjb<&(4u1i_0*U}zlMtA6?Grb`A5%n3v@J|i&mhwPp@5(3)l}0K!JyRXq;*e z;M`k72x4;y6_{o6Z#&**ci9uqB3RvD!7e(@JE2 zb|Fj(E$Mp7Bjy+ev85K3oSo(z;HKC;ue(NrKop(VIk&4-fdiNAi&->?PZ$0Nz9^=i z*E@WFqb-^WTt6xQ;3#uxd z60kl5e4<(lYSp{02%-W$vH$mH?!Ef}*naza{ZZI^XU@!=IdkUBIcLtyHO8oaxc3D5 znb$Y|y?t-HuE_0l<7sJsA^yeYR14M|v6J{}u;O2LPi!_O^9d$JZWi}69JU1m_+L6j z|2~T`=*(^`_BZTjuUDZB+0Ntcg+ipgGk%6=uoJ~qh1b))6a&j*Xqr0Bn+$Tfk>QSoM9&6gD& z|Fd|rr!pXT0RO?~(EAF?;$xZp~yxGMs*eZ%)SsHGJmr;6!7_Xo&dfHfAmNaw0l;N{9ks^DvX}@ws zu7Z6FHvH>?65R*T{}g_v?h?_l$oB_GdV9L8aQ;6;bbNvGB|2DVsSeh9j;7kbuy;>3 zoP;bB4r{`T7%E1gK6%Zz{yU zqEQw03u4Z0yv@N@n;hd>(JS3KGig>Q5^(kRz!A-<*g&OZFj{Dbz zqtor4+r$lTK`zhx!*?1$$a2!eDXKycwFL;7Ob39#fgIEkm`eN9(NKU0 zOr(7v>;go?fm@kbfUpk?F{J=8#fK2*e@-e4})&4_cZh-fn=r(XoOw*vYQjb;{Mf1~A zpnpbrE(Og`_O>F2)^x!x+aEU2TF&1W_PqUJt4t@;!mfC z*s8wrC5Vd-|Bfu1{9t>Ea?x-fNMASnW&EJ%Zth>CnFLk?GYh_Qj$i40_vbZt4?Uto zzJ4a`3Jy{OgBe#zHO5iOuNQj{$k%5yn^H zk>Bf0Gu!cg@IjS=57;N(OkF1U;0~&@R`eBU?1hi)Lt|Uf3g=WJt3S_#vYkc_CnlSsd^nbtL3E2hCdng(1UyPCa50nMe3bz7QHJ#HfO*2s; zBDPN3ph)PfjGHif)Wj8-&CAh9ggVaatW{Xe7I!#p*KLwUas3)~hq=wZ=YgYPiuECL z$Y!fiiVU|G#ZUP6BQ>XW`~{uHB8rv9J(kxYCFwUHzScb(6^BDWR>)bGnBTrFet`_N z^vH@W8nrFvz>U;3Q-;^e{^7F<42N!@0A&A6J7lOUAJ z>^f-B*^h_6-Df75O3mQ*xL;H~!BlLrQ@qjg}g(5lrq*J~YU*k^aX(QplwyB{H!vX9&8gsr#9dRraP zM!&`UVE7e&2+oHYWm)kwCJ5tQH{^8+badU!xx5*UH46sX2(n^sSRCWAF8d!ffWkGd zjtRp6#$U1B{nMyC_bQI-0_ZQ^z4j@pu-YHe#A0z_wo(sL=@X;OF4K-<#DtkWI#vUP z>n0y(_E}}tmd2Tp?**C>9q@^PX0=|RSv^w>b4UnIYVcMWD9+l>m(%@-f|(-vY=uP3 z)fH%$!yk*f&AyMA$z6u=P6*BV7_`^>CNpWX4-}}cB?#KGocG_hWJo9#LLf7D``^Kf zoeEj27ait?=@~A78#<}Ik}xPlT>s@Jzus-b7=nSf!5SqXg%-T=-RduLX1*8n4>SOx z-o$eQS)YnlvvuybVLo%R57CsEJc((2a9yXn7CD3W=UmNjxnf2h@i%lNoi@ySXNDaj zN4jQtu+;6ha+%UFK5LFYVY9z9lUSlHScHPo`zSeHe_Zv4Np1RLRH;H&tbMz(8Uh;m zl)xQLq>x4s8GjL+BeiLNYz_qFQPhkV^5j2i--3Joe{R1|{b!MZJB`T3gpKK?XuiUz zpB=IoHX?=z{?d2_D8JqvyCC-U?-{hz;TNGS6&R9|EN&8o{~t~D>(F`m%Vo49(jP>em_ZW4@$Ve~ZCq6>e7^wZ{4~nK}D5jU9Y1)H`zS`%t*F_wmhecuj zni)vYUFv4nI6i!P!}p-c#kfx48n`scO}LX z$`?PsxbMa-mLAq)NRLVEpdZoc{kx-nWLn0Ht4x;({GxZ%XZMb;ZiD|0;lD@RLTDq*gQq(oKNGSJajd&#s^IWE5;R?vnfqmLm`jtpJH&kMX@2R$ zDY^1Z7fxkbR5LA{P9nCK*=2pXtshZAt14jf!L&W^-2R}{VC$we z)KRZJfb`gJmF9n{IKTgc>aVlDTNOo10ol7MRP=Z9e^HvREiSL2?0qUeP}#&$_;_%& zK#+Z-vfq5V1kJP`h!FJY2p{66QV88EP{8*Cqw$Vi zR0{K%JWQq!0JSr#6au>~Xy?y9#8*lo4$eb}cGr3B94(l_C=M=xxy*yfZ7S*WkUUJL z(QoPHQV7wf(4!i!mhMs*s|2RPgZXVK%wZ)kThW*4cY7(!uo9SuJ(xMAFxr9lIqy0E zM7@|G3jLPlTEKXLSIdafT8=7#(T54BXHY53(Rr9mjo;F?jkKiM;c?Zc3lIZ*h)seJ zM|u#$3lRVOFqe~DYfeub+%s`-$a#D929dMncPR=Kky zYTeZ}qAMM(b>5CH59Ru?nmpa?pdKSQ+jqsQ?3QO&shoR;G!NvUos-<{@Dd-D&6iK~ zB%_v#IUU|15Gu(Yp@a^1HRX>DH4xa)89&|5t+Q5~kK5qGr8!Opgcfc^9Ul>wCK0w< zdQ**S8nT<*YYRniuy{q_DYoMR*pbIrPf2eLQuqtHnHg{VqYsMF@W?nD^`Y;NIixE}M{F$F!FKx6>fr<|NLqw?8motgob}O_ zVk|rNcnlu2yWB{ZTkf!C-nD7O#`HP0PS^73q1-@hxu++!Y;|_Vh|w5ok6JTtvfYAt zA4{J<0EIc)+Y~za@_FB#!$U>O$k4sZdfU<6*GmuJWkCEmUp>x6coo%TW7w5zc%S`mLbmKqQnJ)v?wrwqC$rRLzrXehJOS69~U zGDL|v1KdA@FjYpKid)>B>XLN7b%{Tynd?9-=m46GPA6?Q13V!6XZO{*LS`xm$(&9% zH$5SCe#THvT3J4PP|a=;96RNp8BKrzr)|A)$aIYk?>Lvi};DwiUz-D zuGg~*E)RP4oShR(ZgJ1>fD>rzTilmX?iIK~Lv@`@NjD0PDHF>=5(!3s^z177{K#hUe)`b=wTLb6$#f&)EmF8~s_qKle~~-7a-3=bm<|+QGcDmJ{%zxeyLz zPwt4OzkVXp@2cv`^nB**F85^m7Hj#~^mVUY)*E$R^!8A1KR%aRd9~Vc_BJv~6X+I* zuUqo4-dw83zm@oGtXJ!U9K9S;0=nSW=fs+PJe9GQbv+drMb0xzPRPzMlHn~mx0+}` z{Fyp0+%y7Tc=Z}&K6S#Bi)-yN(Ae&N1Kw{;FDi?*Y|;2$ry|bUSZYFLY}9~x_lO~n zq667Km@c_rVo);QL(I80G*8y|TUicnRvW>3Id>#Usc?qv8{gpb>Fw-^Ip(`wz9gx# zRve+&yl~s5_ylXkCQR~*sI}r~mV}WV`88p|>F!0)VChxW6`Fg_x&;%VYK40?iKEuV zr^Rx;UZKQe#wMr==8+*w|KEORNGK@lFGhDRYhWZ7KFAFI0l6lX9i&v7NguT?aVHqu z6H8AllM#cJv(5}u_Bi(iQOR0yOq44NtQ8-5Yu$pg+-}mN6#QCK+phRUlDgK41d^~D zsJ;G*hzGj=ku<0B9wLP*8dE+__i6pRG{63N7*TWlc0_x8klbmNna$EenE}ng@)Es( zzV0Kx?bLa!KhN1+ZwyV38)$cJAC&wc=WMjjUX$FqXT+NJO^XMP*yyZJ+m&_;=Isa3 zhc1G;wlly^O{m#vTgN?#1RrFN;EJujl_tx&i{}rN)d>v##ULAT-@Vhiplhc!WJ0aU zch(2*^*&x5;4|Ak{=B&qT?A5tOmSzUUDg%Z5@a$he=IkRMmgZ zV~Rz$W)w`ssm>njznu#zoB^|($(7D|gNq1Y_|5F^A#k*4t!<4FN7!mQ$YIo1*+Q_L zifSb;H;K$`y>$359LOw0C$d3Oh)#^?`^c|eh>C8j-s*$R){E=E%+<>d|K)PM?D1a~rONDNS4Fxbw|DQ}-F=^1 zv-IUw{={9UugeYZUensjtZeMF)6ssm)wn){`~Gj`&iWBMTE7ypZ?@Bo19Az=$j?}A zU9|P;P$a&qwLX#<+|fg?a_f1HzehaKoQ_X!2+_?F_OF_29I@4I!7ul`yArvgz^xSc z$I4!01~i4n)L3oHcppQv!os9Q;_r?*(Yjs-Tw`VH>bBX*v7h>9nA_J*Yfg_0^8~MS zz1*LM&rA>hlHEcGVd~57EK_}aYHl537Ot|pw)Q_WIi@z0*c3}YTn#Z0vTwQ5*s?;C zX$>TWrfE|s`y&WYc5dQ2e)^3_q+-c+J%YxRkz@jLY)DpJeH6ee=CwH}fAYlBqpstCXCnOd=>f^-^@lQrQ@{i$Cf`U8Kj3hM7FCiu3$Cx34zN2;)_;?s~4i%WCAjT)z5%ika1rB6y+y1(n(N zZxgSCv)h3?bz+~D8f}6#-0p3wp3S5F$c4!3T>rJFt@;~0_G?c6)_}NI9fQ8mR(%nP zxlXH%ZB?`xvFANJB|na+@D!EcRnIf^z@Irhf73jp6b#pxT5X!E$&bSi4BZ= zo9Z?+Nk_n^Z{ktMo?r%-^~7ppgMfvn0jFR8m*)&24siqjX+tY$)2Px#Z8ke=?B0rM zFWFZ`a$ytxjGX6g!w5ULY$09_UJ5;4#IN?KTg~sC)yvKAz11DcM}y!8P1)=vZE+9( z9GE#>=6*xFeS_7uTT4tTinVyo&=~qY;T5&+$4r~d3*W+O0|!5;|sr6))rel=DfB!LhZscZbXiG z%&}{$>v^;wAty!Ks-NU7_mVYY(c9LD%lVzV z(Hb$k%NjBBf2|Qyer=7ge`1YjSbEh!v$>!6oQ9@P6)-fL`PI;D)jKyn^Mk%joja6} z=Dtq-IwZe2EtP;Jh~Z?XaeHohIJ?ZB zKU;l&wAs(h?|0eQc97`>28-p=oDqB6-AFwQ5wQegs#lfKqH7^X%)pe#7hs~U((r4W z_{gJ-GnSo@g;JMlv~9sz&x^DH%Xd>4W4qg3^I36C|Ah<%e$z2)G&j3gSL!-V1yj%`#~)WO23iLABZ6d#osC#_v#8)Ku1 z_*@i%gZl0$OVp)OroQyB$p#&^=?p^dnc$L2nmm{QE>E zgun?vv%f0P){~dWv&~|btuS(7ixbOLJ?S$$piOlc>2K~~sMH%mF{0M5dhO)uxoX#H z8^sSQ-^rYJ;>k`cK!$U>G;TW?<4hnP=n=shdHbR}9N{jB(?E@Ik=eYF1a3q$uxu{h zf=saPZ>v_2%&{R9*0G`4YUp*UKxtJm4!<<=Q`QqpJzOn3+?ymx{psgI4^ zA-J|fAV)FRSfDFR8Be~ez)qlB*sxAd?jhB#f>r~ScY#-m0! zJFYsYIdx%pQu_;ue(xZnSRfWw;xXmUX7pVJ0L}>eW^G4mVuk;x=}&&k4D^ux>z>8o zld9|%$s5u0$yOi?R!e#pJ*NT|njF=n7st{v^(hDL@RZM@ai`17Z?bxQEm zP{CN@@od0Q6pY+F<~QR1N{doit$6;UX0HDz*7F}PFFY2}?aMuv7O4H=Dhj zD@hm1q+9JjrabRL*1X^By$fUWeyjH`w9We+-n(!&?|;&}vt?GM{0Nlx3xr(0)%XwH zNhTp^I^Hf>^VLrqAfe-)=oJXiY4iMnM;U+sr?$Wba8LF!0_56S7%KPEUSfb@+XW8-AO8 z{3VfQ=aR@IYK#yYWVK`XGD0l9D6Je}Q4}vK!g$IW<#0S6amm5d_=p}NJk;o+rdXSh z^2R=m2?i?ps%XRgt!_-?A+*f0c#SZ2oAyJ{*zn#L1|NVdNMEFlSw_vKBim}t&bD{# z|JkntZD&Ar4M+!zO@-NiK~`K+lzsui4J4 z?()N_D$REt&|U2GLjv%$ilytcXu0*QdrC)?Py+1&01v|btg=kF9?23lrl32(FTwOi zZ}9aIFDqN+Ri?H~mPCM;)#qmkv-HSQA3!Bf=796F|CekM$d!g7{LQ{gVLkEn*LRHl zurh?7z&9NvLp=cHjSDZ_eN)E{gzsG^W( zvEFWX>Y;`z(rHVS_{{S|0(oSo?w_q%*+Z|ky{#CEn-bFaiIX-ZlY~J1jzS%)wbr<2 zGEHo!-IPRC$sWRM>OQ?@yS$DVV$*-)#^N}t@oI4tfPI=Bpk~4bggfq2wu?2oa$Kwz znVfetWqY+>#0pOI{x0|DVMF%s$5MY%BkYcQVPNIWqZ6U|-{9U#B5%WLnZ4>*%hUGg z>7n^&0u!cu>J+fp=}tgGFm!at_kqi1tFX()*IKLEs#|F}={6?!9I^0WG@D9tf z!?7J@)?|ni_7{i!`9=HCt7r3%`y3=F9eYFKefZ@)1N#fQYA456@@4K~2Gf!vdGQWY z2nC3BJpL8ApuZA|A62)BO#YV?M@vqP>2r@|PQmq~51&W;^p#9Kff;CVJwiPJ*LFB5CNjvpyFavQ`dN( znb8vbrR1Ig3#{IxQeeZ-1NsN=NV@-hPok50;&c|KMPFw9Aa5aeEhH3dS7WV8hVW}N zr_E2&{YG-nrxr$Gwd?LJVYQU0J$r*fdB)IX2V8z zmlcr9NE2CUBx`!??!U-<>G8ZN@s+APLz2nP{(7ahU`cwR1nMh6;hz^LC(>RMDw18Q zirzu5Ey2=i7r%R8S_v{Ugo)qA)y0)rZTOB^hsJ(K$Os~Xkjbsoszd7eC9v(x0KZoC zDpSU*+CM{OP0BN@p8?V*m6UB;OO}9#=Yc2t#Vw_X$eA&u98kagjF!Gq&JVt4;?| z&7D0gM8;>fF8;?J0L_y6n;(>gRz-Y>*Wkcta&bkuvu^Qm?b~3|5&w%1e*`Rd3=cRe zCplXSrr~ZpGOw^+M0=V-r)Q*<;+vZX$%6}YHGQQ2m#k-^+v-;Sbx#`%LI<30#p~HF zyX&?7_R=0xvwSRumKOLA*OO;hm5SGsby}rLvEF|@*=KwW{;jA}ZZ8gw zQgj0OUd(R`0)A7GHmO4pv#1*f=C|Yb$1Irdh4nM_U6jS9kUhGo(n_{NQtkpqWgFUH zb8vz^T-&J_#A?c7(>TZ&M|z;hcua@JLB=@JLxhwXJ=E|}tA|=1>h)01LxUcua=fhv zn};cSn8L$MJ*aQLu!a`YGT&wv7sl3G-wW%r*)Gv>ntF4ZZ8r{A zw+``(q=26w?(4u-Hapc=K}HwEv~g>LHTwu}IRUKt(9++E@b?ukw6El1o3;n0CO6x#ZF8zs80+$$ z>7mrPdS_fiYTOuST%(;D&gIoc6*I;YIB)_IAYy5970Z(E4~jG1r?MyRR^gLU_bp}T z#?@!<_w*6(bxigSAFe~9gPzB@6@z_+Nb<_ce(`JIUgkwVei*-TmCOleTsZR`xNfy( zxci0(>8z1e9L}PddTWn<)xRC$M=`G7uZdLhj-9HBALbb=&;_%~Am3rAKI#bUp;6~W z5?gXjbaD~Ldl%HW$6~dhnU&|7#@H?6n{$orq3o($6O+vVRJs)&z{|O&`s|Ay5~lsl zYA$cK7|RB$%dGyoIBDsd+L_1aD~`ozWV@d4?76p#-k+W)+Y2rDef(r64)mV%Emsi`IUV##r)oB z_V;C<%vS!=wZe{h8r*BKN`f>!Z2lk3m2GUW`dc)dnszr0VEwD&c|9Ru2;fsQU?tC9zIdlCv9Ppfwo2SksoM9kf)2QTjuw-au0(;n z_is~p&)|i}8ENSb7k8#duEG98Puuo;DO0byH;Rth#awH(y+QB1`M|F2N^lCTI)Q(* zAN-`S%B{EBZzF-DaTsAQ6xI~{J2;gu03J1jQ1AQlf)>sLlhB4Iy0 zfe-cNYg?J01N#y2`+ z|%{FD-=ef3qj-2EPb?S~^YbU!0Wrw)GD5|{1R6g3T7{5gSgAQ0RLSu`&No2dZr?Dy*incyn zt=kmYZQ+w1=Jo4(O`NV!EIs0US$UHBaxKk8iSlujU)=3?a(hJ*P_x=GkmW3Kf6Q1b zwB@8#+A?xmp_;72U-6ZJ#hqtLCrr2m4mTFQ zTHOM~qUA-Qp{ptwt$bHwWkbLCpvF{VWknOK!Z-QUN6WMJs1N2nXS{Mbcm2npx^%5Z zSPla&Wjo)5cdAjL63RMJVvJ7;WiF&620>6U{ig=kVYw0LEa8_albJO>aOCH{p8lB7?yo7xR?zj4IuhyU+Ydg|joo{N?-uMwj=2dVTMT~I2 zpT&0XL7k*M4qj{XYSjDjA9(re6%6|`dpE;HxGRFyD18r#qF%g%gst8bWu@QDnY5y{ zF&KvK)uO5UUtki{p|&zd1LvLZ*y`^un3%L3W|P5ajQN|kn7P!^jJvsyCbT_IOwR*q zjXy+*xobU~$BLN*KWTWq~q(ZLrt0K8i^u(%@2|xeoM8prokXvK^9y`v#G8w-8}#$>LfY#FETL3 zDg6}EO)wSLu^V>0ZL#^xSO9UAVX7`~0Ds$oXLYCoJeVJ>(B$4fkpD3tw{fkZ5k*q?T6+seL6BzxvG7 z39po5kn)xQ4}(KXFzAHD!k`_RG)go!wQq>uJvlY_6-7k}pPz$IlXjxs_OYTd_X>$a zO=X(3Q(vt#O()vXZ~ao&7xkjq0GnQnQ`i-khcj+=vOdJ*rd_Qe^`zj#rM%=rYItAj zdqY#_pl@w)Pt?rT!r5!JY3l_kEi@UQFYq==yMU+h5KEn0+Upw_#XQ}m?-%I)D0CGb z_d<8JLc;C4tag0~HI}-tGEd#*2cqtR{i%CmaXWXT<`vrcrr*vJ)Ggvd+rJdiwi#P5 zJ?v+<83Gqk_cP2cp%RQ~;)jMTIjE&GSrsM(G&!a(WVJu0rNpOsD;0TsGicY|+$1{H z_A+EOj40k~lM1SCo4Y*I!#?{ywpZH>jat!cnFvZWZe+aGzUd=rT+=j;+`s%ZRU32%7q|Qj>v~5v>0S*rOe4g) z{@SpT$Cx+JphDg#L&NTC2w3+VV9j}_eUMCj*++94n%MAn)loL;H+)QF5H`42=;sj9 zJ*=pyQwvRbf~I&Pw~8a zg&HDEjw;9XG=4c(JPwmUk8qIdf{}%t+#5bH5iE;^ETE9l%K?K3`H4a%8gj# z^ySt!w`@f}ai1^)IqWHz1r29-E|gine}Deq0X++l*PqPsEDr7(x*rVPYXb2(^&h}N z%79s*W(`PZ_UvEr6tCiE3Keex|9z-=ya%+k0Q4t-v>;&bDt8BTP7}+Nxas5jS|gxpi}$B$^@}C z`c+FijJ)3zDWGG4vs2l?|JtksMXVWyqE#Ul@`8Bu{h zqg0qXpQ>ff^u%=1*`4o@%=>4e++}gyJ6=06wL_Rn9hCSy{ct#qhkYDt`MY~EsF+68 z-u_(y#K*1&6td5_+ljJEg|bh1Ypm>D82Tx9y+^z8v$sAM z=pm&RhZJSseA~kkl@U_t0EDP<9_@M5(5?erFYUPBKDAV~?_y6jJ;Pp9vvh9*3*?fo zEZrNK911Na8h6;?Fa-vEBR@;`n!7Emrao!^NnKOHe#JuD?DTUwk(A7BjDdTJ8S!Bc zQ5U0>eY{AYFm`l$iC4z`3tj9xtZ>5P~=TYloEx);!|6L@zN^DhOoihawBVRc{q4x-?L^;0XRb2$xG;=hF90J-_U1UlUKHD;y3; zA+-7nai`0&AMJYopyc}pE$(mUdh0ecTB`=YuaiK<`2g-@DlU^e!7rN(4k$2wBTp#; z_(mzfoQ|II6MM$%laqd-x=l;pm!Py(9ctYQy+?ldbF-|ahaRa0KDTdq@#|L2FPF0* znqb%up7X9|j&;}o?xEXho!~aNyy|3Q7q1=Ibkdrx50BO%>vUuPP}iQYvu4Ee+;fxe z|J&a{uJj=vq2DJz=tslLX&9y4wwl)?|L%a>qkOUH;ccYV;`d3MBJ6Vzb0^f+%jJMD`*|L2c?Jg)0~gGJY#ek0aD zIEG=f?%LQ0jqmE^c;U_wYvQNITHXhXLrnLZ%eK2;2t@$m)|`6Qb&$H;(;TmEfHpz;?)Ze%{>|)Yf|13 zeDZ_x#M^dyBGEI8D<0H7Z}yPX(XYY6bjUwmsVV<9oIaKKWiJRCCs9s#1%r)?KiQbOjVGa*VbFI`7AIR&X z>p~&odDH!;lAg?kvl+%ScgVuS5Xy}r-k$uOK>&RTAOQ!zwf_5w`~04;&wBuOlAj*D z2lbrdr;qf1Pt~u++WgP?mycOvB%?9-aymXn-oJjDJ=D&jJv8u=(t>r;Lk^Kg(1k1O}^)u&$=u z;@%^W2d11In>_98DQBxGo>b3Z04oF-iPM`c?hmC#t)6`Lv~#1e<|YB2J2irk9wV3r z51~1NS#|F8$&+J~4KfPbJ*B*%ZQB(F;R)n}@Z__j=Ng2kcnI%ar`5!(;uux&;FNRE zo)nupUfHT*a5*5X0A8;`0$CYtZk{x~d0Ncxl?`P8Vs;xE+K-q_$medvMzWm~$_=1T zM{jLm15=|Ioe^`M^Di-$OL)=eV70yB_}R(5k>>PW%e6!k9)3OIs{K}8_)G#R%;HFV zLX1;NTsGidMNFlcfrNKy({1Tm)q>7aWOY$jt5??#sH;#*Vx1=*Ty7K$?1ELH zh}N&&?nzt-Whz~lI5I;hO~@TX+rB@#BaZWWpF3!_;A8&Xi3fCEw|;mGdP3U^!GWTi zbV4@lc|bS_b^`d00&OV++uc`b1_5NXUnW14%y^j>5%+OABKt>CJBqh>g$IJICN!_7heIySV7v^;{dC!tJFTy|PHjuKFhp$!f;PUXz z8XjnI$hT|x=S=OwuTQ?@MGLPN;(em4*Bxq~xyf?=U<^FjKc$d+fDC((G(0nBIX7q^ zi=iMnrp^S64@35yO?1$5+DwJ})kk0-cPe;8L47Y+&iD4M5BzojRpUX?m6^LN=Nq4Z z-&P=NJxKaG^PiS8=>YX%@Jy)ppz49zW;tU&p*~T)GgD2jXLV*yhRusq3}bKQ4a2DO zkrx0PdtFS=vBTMe{o@$1mbK04>UGRtX7%fC4FJq?M1=yC%iTL*d4$HT%n@&Eof%_} zamg@~iR!BesTqS=zINDLTQ*oXRQB4sISbw~~9Lbl}=lxjo7S8|iUn zqdtf_6Dk*;>~;5Ruc^D-#5uRJa12FV#R5|3Nq##gebpIdG3QC=V=e+fry8!a=Ln1~ zZWT3%61|wFvi@&=6Ma3kcrbcSbkv^tUygA(ZL$|0?aA_$-wBm;J$0zP`#pm2*-=En zJB6PoWP`sH&8f(|$789lxJwZ=h`5SL&KEdf&w5r|KC2tc(_AEEjo$B2<8JXriv zG}%=iO}<~b7{1uSmsYxa%1#VoElhcqs`SW(v_QqR{2)nMHrnlDo{d*T%PTr^T`K&h zObdbIpS%Cb2V^HWk1l;#M>Usz5Son|a{Q9xd5W-sQXW70?tVNskUDJXOM;PI9YRy) z*5!0#L;rWW$-a%~UIp*P-(E8K?lKZuu|1xc)A7JS5_#?9bv5lpr`2_?4ACN6jZ>}r zC&R%XTKB)dyEmlavzpkZSkwAMzqSpwWqZ$M4ZC_9{2V*^Xald2!fS-raN#w~Yh~fJ zg4c?|Yd>DO0L3&yRjRqndo6bnW1JJJj564Ro$-V98%E~nfQk)A)GC4f#qm|qlr|PQ z!(!dvSgqJ+?+^bv7)_qg48bF5M;q?HlNyJ`Q)~XLk=!O~#jqh;Qyl;^+Wx2N-Co!}$d=R20|>G`=HlOf z(cZVbi4(MU?!Rtt#{aE7^ZjrWci=~cJY%elrElH=518vua7sbf-R^7B>zpmo5j|X@ z<<>K;5ZTS?hfPO0er2`&2o_mcX3BBxZO;8ID6ovQK3pMMoIELAJuq%Xdn&3=j^>_- z<<^S7wGDagOQtS3%WAs@$ky*yo|HJU_4^0$J=pj^h%Gx7&nt(Nu}R}k@>ytZ(4u|< zaGrOg>LuY6VROZt8a?BmW>kJJsW8*JUt0rZP4(`*xW$uu1}-$VU5fcsI1HhPL!r^X zfJXZjMjhmAYk3npqHSxVs5oGCF5h~bwHX#7iSDUF;1-Yh5bJ2!j z&0JGhdo4swykfBr_3M@QAI^k8l^uvQm58KUdyK#@dZ?1E|qCevnrfhD=6}5Bs*KM4O8&j#%Rk{+w6gi~j3X?2jIAym`Z*4&5Db@j z9l!g($p7E6%sL>9f{}R=DtNGgd>i#F>Utngsh0N}_IbZ)pZA~c^M2hv?>82`7gw+I z{KeJ#@A>Ne_k8vKd%k-AJzqUtuukd%ed`x%KG&z~>dpHNoz~CS9Aw_>I!%gcLF^2VcF864I{MRU4NGY%f z@~yQ0(1HGI;?eb>^l-6$@LmdU=yfUZ(Ce2a_`VLGmn8c5=KZzoEtL9eb)Sm!909QI z!A2e2?sU6lQtLL2*u3cT(Opg41#+t0f)j|y;@50kqQBYd4-|vsaEXX?UG2VjL95>3 zPY~xCi{etZzQ{(&dVfBZ?ss^c@E#f-;kC|l?lOrp?^_ zEf?e8DB3`|@cF$t<9S5%Z>IIUrdHrLwgk-OFuF*oii3~DM!)OshNz1Fg=4O)bblsd zihrVVqr24s~KVaF17NW-WIRC`dImF~ZQq z-=#6k*e7D#A;#qdR6_Ye{C7Sc$J1jzL~$X$*FDip|3!&d%e(d{PE9_bAk`(~ae`jd zE*${RgZ%nE&w_G#vU!RchU4QZbJlfD!$uL#n#}zl z8vuGxNH;rAkUiMTmbTm7p-S#kzMxHh{Ai{1CH>P#UYR4jGI;p-!mp`adU1Cwg}yNI z`;>2X*zMWEHvA>|wb97;=rnVt2`TbXk*hZBb%T>I>9Gzind_nx#2h4upcy-n`g+Gl zXu!K}4V1PYDl-8}*+iUOTYyC=LrGD+s9ICD!}FNJX23EqHDud+uIuM;2c zhJa1he?ESw^s7p9GhWQ-N`RzC-fk$R+lCqyh7k0`gxse`e#uaR`=kVL3;-Dp02C_^ z^msq{RK&me`2QO3P_cIJ2dVGsF^bI75c25cS<a+y0U7 zT@$J+5<^on!nj|YiQ&=bRmMMu>lBBnojSvI9(5z856<|ZCU86PDp9P|ZL<246=W1H z1EzimR*&I+gLsZLfw3Th$9Be4Bd;-e%~ttP{Yq}vnBy~szai_Ox=wD+8XEGJ(Ry!w z70bu`d7Y|Jiot)p$yr-;Jy)@i21|DVGl5#S*v=)K)oH1^yUb4QA1~q8|CIQ^Ul)>Z z&ef+d%~_F;b@aOk^%_lXwi~cu2^KJ&)0)9w^;*H{`4d46ZuQ>`2AmQhaEj$2@p%n8 zUr{rIK1G8*Q-eO6q2}z3&yVKgPQQC!L$)@6FPw=irbl7E8E+4(>v0*ZAsw-0_~evL2-*G1HvrU&}GO(0qjVP{s-~GfjZw)G#ajYN-cu zy{*Vit)fP5Ji`~~UM$Jo+oVN+$mb^gz$V+>b4b@>f!NGVZ4mrz0p>ynd}kDGK4}e> zP2XUg7}Kij-ETa%H|IqQz+$y9qKcPc@kcrri9p?K5YCsyoKrK4bAJ~YBm-i51IM&bE zCJ9XrArZ7{wMD54%q~~W!08MLh35M4v|HRqJb0^Z2!H}WuuielGt2T2zX%|8fmYk60A3X*L5bKsSq9?f(lo4TDe&*Dc`##zlgK)X_&t?;L z(zL@nK7Km^>oI3C_uEWvz};MJu7CBWjdw-i27Q41v3N3 z_Wud8KMtdw_)&+sbJ%$*mO9PudIeQr%<=AD={=IGZ98@N7itg;(Y2M(hcPvw#KxEr z0VmMB;dgku{T(f@tgc^TDZael0~F+fW~PVD5>gd{|4xu>`a0evNL>XNw1S}3{#mp` z)luu-FX7D9LQ_GKNpeE_h6I9I-tJVLo!nbyU2``%!Th>lo}5VTp)`wfta)1aQUaHT zi`6)h)}854{pnLW?bH$%e{u-CNFVGkzSV(YL?vH{||#Cra0^ zeH=BfXOTs_H!9sJNT{?Qwr}LxJ_APmx(qq3&u_6u_Py!S6U=AyV zk)Bub`3J$-_f2_nQOIuN)@N(63vao zMy$j~$C!=iRSYFcM8$R5Fy>+SI@)4b;F=p)q7db0`Wzz|9exQV`jS@<=QwmWeo9Q1 zieaAfz&KzY`)#PU3M^wNKM?r~V4C@FVO^Guqx_7Qv1YXseG*EIA0Bg#V%K`%plI^r z{?;`*&qS?Nt)r@~wmX1G?&-hqBBaA-AX~B15+;kdhxIb@Oz8&O)7THlJ6gQc!@93E zH_&kgbwVv&9m>wrAu-HF_X1=+iS^hvgM=geT#o{XFE!UEG~Yu}Z%SQOV?HP4@!cV> z?crhy8|>W3qc|c@r5xy2N=liT(sl^EZLNrwd3Rwi_U^*I`;g#k72k=bCb0NjQI=fa zPhuzPOpLhSLgePw^IEU<-N-cr-J@30+`^cS=8$@c>Cm(anr0V5)5)MF8he6uR(^RP9%AzWCG6LKg z#G{3KBk1gdyW98Iy*XXoHK9H;4mHWgA#7xqbTQ3g=ZEpY)>;L){64za>H~AW%mbloN`x?TX0cvzal-K5kdFz^%;(1 z?Xw@e^vwrE4(|OyX&!8~y~P`TSx?_Z!-}C{HKGUeHJssnXk#po$6M`tfYL;^+N$6L z^U-rU+4gx}aAvT0nhS!tKNC2qaPd>P#vqo`cIapX2Kve1HK~ci>o#eI&V_4!0`^5S z)NemE8ldE!3af34&>~W<|H7+)zOoeBPJtEQX-=KR--d8%Xg?i7PMuQ5u;-@MI&1v? zJIu-W_oKPqSW9mV9nxC%X@(82!P2!NLXm^tt7>A{S~a!aT9vP;%UPd&ScU~gi+btq zg>kWCR*4pkIB1BcVIgBX+l&I6EJf6a|G=z-*`LUvz!geH{xDmyn=^|;);c7-Q(WM_@%MbcL;9SX0=U*SyN|4lJ8e6I3oEz%ZILt zY)s9nF$dIc;{~zFdT3pK85dR?`_gPb;|wqxy*L%zA0pMHApI9PtdOwSC=AKO zw~?kCG8(GW)qDbKy|wIe!)zwJ%xWtG8opD1O8AZrak0gUZqZSn2GPc?!qTQ=`#Jd$J_ zDPQvCg{;d)r@F&f1?r7xOyEY0c^B|;J=7uYCNQEd_mA+G`EV%v zy%%}klf@rqu9(0n!Y8^pkSVjRPi_+96w5nz!pM79YXY1ko{XEwKL47xb2w`Yo!I~7 zgCx0LLouRl!l{az&H3A-oPP7Uw`2mIGd|?KD>d|HceN3B@khssgW?>7F@-(oc~65M z-zta7GzHTo21L0@l8?-Jn*OEU%`kY<%-#8M-JLIMTAnmhQS@Qenq8@5w*(xIJOZOt zHGZElHJb+6`$(-Jl~8AWP<*><<+FaSAv07kL}F7&uEKymu%o&El#>U>2j<{0-0j|~ zh2QCE;<`g_KMD4uMOnT8zc)4X4)`7W_Mv zt86+YQ=Ih=PC|0Zb#k=b!g;2h=IGGh+_#wdNcB;h;{)AsFl?%F7T<0SL^R(J)7L-n z>6oo`^I0}km;O34IQZ7UVB?~bJ&K^Nl2rp4c^obi)_vTY`OBlG-1XiUfK=40+W!K> z7E_00lIj3dzr*!SO!r#9f)J^zxAKp>5(%S-`3?H~FUQY~80vPD4?z+{#^sn=Q!f)1 zN%h^m#1n4I`>0L9TD{55B=f&nMK_oaZ|E& z((?(A_Ht(CbH3;0VETJG)ABhpyqqyX&Xj!4STAQ$kTWTtbBxKkXSp!;D~#nc2Y8v+ z9xzkdV!l%z<-C6-|F%lhxpw*{v5aIPGEh-iOW)MI(VFK?&HU7be8?3u(GYH$Uz($u zU-B;GC$D=9(+VYE`DTL?Gt^*RG)<{RrR3W%r7C%Fx2^I@$q+EEX|rl;BL=nC9nH## z)SH3w2s7y#C^^{e5q-^NL@$mHH;-@$HLKw<;!b7$B5T+cmGPlnQB6|qii-W4c@Ogo z@2j8kHgmql`-~Z1o~yo-GO6pUZ{{aj#{ClQB9G!Eo2|RlMpfo2c-_5#PO_ouFUipv zh9x`=)C-@*Tv9=n-AeTz{)ty>8*$yYNu~QWh6B@gnm~W|j2=3OYUt9eqW?RDImH-) zvA6gobUOqCwafi{rw9Cy0m2Pt?yaut{78d#dEE=F

    (@deiLJG-X(RuR5Og+h4e1 z)Ptv}n4&HA(5;Q8EdKm4$K}g7@#CtYNGoto<8cuL(IS3p{G_sY^|V}f87G{z7#H&h zk<0Ri(z&qoZ0DAH)s0+_I|KtulV({f_04&yOKP+=LTi3o| zvR4{X+zc6Tg=iZyi@+5FZP zuxk6ZB(Hj8GnTi}R%)qXBj-sN$-0Yg>wy(tBZxWNl6EskP|;u6jGrEM&qdWh7L9<| znm^@j=39AWSCR5}FXb_QNQs!JH#!@kwH&`y`pt0fMUIOzoTK%kW7~|sdl%G0n+@zu zeJU6crcD+Y%$}>y{utrdAQti_tj4jjhNfh?{0g-}{CNy(v3jnJFl+gHaHI|jJes<4H;e_A<| zal-moT^BVsI|p0KBL++rP>~whucqWkfl!ReuKh_B9M3V23ID#N&WBLx2|HA>mXfwJ zpJOAJ{`-R8UKb=e;~QY$-)RB2G?|t)Bnke5#L~-2Bu?xQ3`*|WwZFV@Z z3vhpRBAXwz(>Cm~*LDt;YJU!6gOE7Oe2yr4jM@`u1s~1Bj!2IoJ}X*gJjd7&ZVT&S zbTpv}^ATUh?wI$abgSbZP%{T-*C-yuFqwG6{4f1rhxCIzx=@JtDrv{>xj&O;j3es! zsr8G7i@P~X%F!X&yMa*z!&Y^7>`R|c!RbKL{;-B0X`+(uuQHncD|egqJE@xj3_8-s zh~h9I9jFn)YpV(NK!}-O4~pAtGGI+W1*9%^uDJ?CD-pvW9cAdDnx)2`sL~=q(s0c; zH?hK7S2idgJG0XL%{}x|)dZT)8dDjCbp)l!hyRJ-A9#C*_XkUP_eE;>nON7hL5-uf zUEPe)d?=%_w7Y?oUMZ)K+tqf=_rRxL;`MQ<=41G_VEiAk)DbaaHs+tF&j}TSJA*sq zP2jV{SM_2qzwSQ9YALnmUj>>7?zh0XtHBcWWTX6p_u!N>?a@~DW{=*`6J^GHWX+4m zV1SAFaNgUOWV}mF%G1lN3hI%2?So>UpGwDvF4Q%gsU1&@`X8AdaRS@S@^@8WpgAVJ z+4;@QWE+CIAAnfh2Et;#TIiLt-UQIVM)iF7d#inXQt%9VZvB!w4-7_+yn%b;e?9he zjLDOk#{%fCxDP^9W`7xQl3^&rPdTDN)RvvP zX)bGdbLytq{Mf64Zy#~vK{<2T-u+ta;z!M)jjlJiy^nL2ljzM&i%gjxU#>EF$VnIT zrF)Z55ldHu`KB?H3R42MHI`Ih+VusD1i_g;uDtnkEvQ1uTp-cCsi7> zFVPu0^$T^Sy_35ue$&R2K2Nw`kdU3eM>n^vY*l{|$d|%>Jxxp4m1>SAKkDzaw~=A3 zNM1;9oOT&hT)y8kOvRNzDkUwkFYc1v3s%#3)yCeHc_eJnE9*iQqJmQ%4@p2l!o|qol z#NvTRlrQ3Hz2FWaoS_hHz3Hp*YA^R&JzD2LNLntgoB zuazJ4?8XtV=nl=?I`;|5vX*WxuheyOVpwR-b*()Jb}s9SI-MfzUQRPcbLT}Es)Ht_ zzQuK3|4dw8*V&OB=sv1liQOKgz0DVuLnB>OC&;%4;H(*5Jud_$?pzmph%E6Ixh4n6ww(ZLx#B=*HUCc!yamWU*{iJ5lJ(zOVxQ}-?f$|4Wes%!N9i5M3W zrEk(xa?jlOaf=U0?n%U_MpH}mEsO5to;itk@HC9gepO=t(L&jwUM))fTRs)fBhiC| z8Lx}>nxaVLP*95sn0WI)<>9kW=)OsF3yQgP(!X+2U(qn%EhUD7izembWhW}^CV%Hi zI$dyr@qO`Tjg`dAAO8Rks4e4NG7$__?sNkk80ODG_PY8iG8a#TJJ6gvV4tn^N* zFrVcx`jIlSCk7WgTJ4I6GCO=rk#=e=wsf6-{KEI~=!sle#Jd{9m1T)FG47`sJ%Nt| zY*p^XuD&@FOW)V3w_Ine{IalrfOG&{(wzRCK62&W3>O1bBcSvnVpjvy)2?fyLhcn_ zc9oyaIGIbh$TmyB*U09XWY96br;%Td=~*&5_4RONPrF(Pt<3SyuI{n~Tm2(jXZi^e z8JnqLS9d?FeKhUu>aMWb4>J#yR(l4*?&^+M?VaYK!D_#Whuz&&74ERwza6{~UI{<7 zpUyi{cKKm`dIOruYv8Q{VV>m|(sP7xHNpRoch10C?cXpDv{P>$s1AOy+6VDAM-{$A zgDTicCHL{%`g)lu&tq@9_*8!&sXs*S4KixAF&m7XH)z+MMY7rEbHA+lm|R;EEP&qe zL`;cDES(muC#BoXu%(B^A(mN^37okTZp*xe`T~aHs;@Ie8T3q86{kmTI{4bT{|Ef5@LHTkF70S04=SP(PA`KVvzf+taQa<<<<(zg78VCHcAOMf91i{AUa;J^Pi=rQ-Ys<^QQ9 z|GDD)i1M#4$?q)A4=I02N&fGP^S8nznJ<>)|EM^>Q~7)IMn9I_$OXmuw<-UblKcyb z^IMgFC;1-7b+NX)f4{>l@GxGHd($63bbZ|q$O2%b2MfSaMvN_55O_6qtj1xYEm$m; z@wNW1Z@G;3ES6rr>E-47mdyADZ*J(TB79H;u`t^%=lriWDtVcr7iCqlNT^-2mtw}l zJ=sInOP|HTx`O?QBUflSzw@griv`o5x{&mr!SbT`U z%>N)hTQ_@~z;f=M20;mHE#BN;|67WC{&u4FSdCtt8f^3Y7UgrL2r;V9I-4M^*z-Bz1C)v(KVsYqGR-fpspO#}bfL$S-^-@4S)Dz`v-ewnXH;)VCV zS4W<=-4Hy~1`qYYLqqUj2M<$%2gH?Ee0K0KH+Z-_cv$2;v{kq2fj??`x%X(Er7!3Y zy6ms?>+Ylvyc|sr=+o=kDgW_*vn@UPJ2h5vqY_b>Bbndvl$S@tJ6ZMo&h0f{L+N^@ zf2>>{A6D+$M3wYIt(5R#cJ+*35^|TTCGQ*9-j0#G;#Ovj#CdNLlgLC|x1aBX2v$8`Ls5p7D+^5SK)vlNv*rT7;d(djNzHV`a7= zUF1_?!v(X;GynKNq5Y6H;b5MSzXL8uoY-2laBuz%6|bCr*(H~Kcj09r>?!N)>#J`g z$9BA5BlKc<2;EU1$=sV4WM=X*gEU_~d&>8}dG?g=fAj4row!K{F1R}OHg>J@HwdLC zOT&`VG=xXt$4}m=q+UZFy;m#U-Ab=DK_-#v`F0MyO(R_5l=CA5Ft*&gefVL(L$yiH zo6Szv{n{^4ddn~3y6jP}X2Y#lmRH0_{eSFz4Oo;_+W&*hD3LN$y0N7-wNPj%XxJ+% z1v1Eh2q;*l7L3CnC|}JCimn+gXpF-s+qPS|?MA(}x%TD0+lRSU_-$q_m9?&Yv3(9w z1MOOowLSmeea`*B@Bp>@zVG$_U;pdkxp=sr^SkeJpL6c>eV+52v6`LmG76TU&soN`UDcmhk-VQ4ZtKf73HR#j41f+DuPIivQTJ5x=C5 z#IgI%%Q|c*J6zsFUNrp@YpYItmA^svrXvAYZBA3p9)H>4iPphBx)+i+axZ$!fHmay1<3^=L-Cz+}O8^w}_j%q-> zJTdh(Q3817X@=ET&I`22Xi+9W`xOYZQ{Oi%9cxhIJUoh#nnE)2=-EYVzC0VWZyD3r@?`n*c?;vH^c!QIj&^lp~FMfC= z=_6N8?-$Ntb+?8_U~_xTEEGtriulTn3Ub@^W6I8wW^hN>jFGI6Ltr>R%l198gE9m8 zaK8Ieg7(VYJsa(m`1*s^pkV;*RGO8F?;mR3%=BJ|_kUZdfy7Qblo2Cs@P2_l-0=Nr z7c}DA=Wne^uVK2ilYUXSFtYQ%=seJL!|V|EhS?)g5NAi>Q*)Fm92j{AHYG=5lO`-b z%5@{eZZ)b${I}ePQe=91kx~5mj0ZEP1O9hVxJ7V>4NIvz%nhGBM8h8cdNu=X-w0!=mhw(Lk3l`5QhA2i_bl!Iv z_mC>Av67=6w(^{$1s@Y4C*tHooW#LCV*fhqS$IDRM^xvZ{nyh27TRUS4Q?;HX;Fg4 zHCV#HqR1EiPcVK%BagMoWq5H&o7<>xiHWp0+~z&<5Q*|0hP0sVrUqXx8uWgqoy4(- zAlC1@<=zcyf;WDNQ4ZETObtJR)#O?$g3ZQHOSMr+LA6*wgC*J&Dcj^&z-Xw7@u|a4 z5GaJ>DPSwb5zSyRHG}2c49fE9zgVQD=49vZ31|+^A^!!)N%7IFsqp~{5ULXPM2aB9 zQ0*URmaV>eD$R$}O(^@%6_A+e>1reX<>B;U_sB5+Z|;Q@TFgG5pB&jpbu1MAtRC@m z9@q&Ig~wJA3cmO7d;r%`xcplY2AXvom`J&9q1Cf!lj4v1mB{C@sOV#lY@{EBd)blY?+#mR5uw+ZGY9&92DZMeEN6=WN2~1}&O(A+XJr}=kMIF5F);z3Q z$zRU?6~;G*H|8QZVR$R`Z3Aq5l(4`%h?Ve-xX{JEs>s$ zlprbj6PDcDPqHuR&5+F8o9-@kI4d1)q)K%C*&atE&qz^z2AvO}-e5uOjQ+$FxXL52hpDIkAu{6)}~T z9}rj3MD%SrrJuc_!4*~Jld1GUkhXJ|*Qe3e)_*sW_7RzBTu1c?yK+qtwzQ?>8TiLNu+KwGBkIVoU-|hK+K@W^Y zqS|7&48Dg*sxiBBF$80eYmU&^qzj74VE?_<>Sp?2Bs1x*=ys%c&41!!!tq#xia_Y} z7~=kUN&T&H3VzSShtF@(4i=GFsGCB8@mo;zQ@@ncml6296~5@Wv)RO*O-~kBjD9;0 zUf>`kj-Hm$QzCeaHC}P535TIg@-9l*)NXpFm4t9;HlSE`-zDZnVrdP$Ja76k7!5lq zqwApEo1O^!V5e1dxv9Z`ScsB~61az6UDx-7uUUjwOq=H-`|)1H@H4E;s_kUEKca*4 zzk(hN6__?{ApdL9F;bwnU1F$BWv1f`8q|{+@U0nyI^M@W@!QD=bUk&NX6in})ElBu zCN`Fm9^`Du0kH#~&M%;XLm5h?Z#DrlDD4a^>!7LB9wXSDkME%s#LkEJ&|+F=i#$jA zUh(V9op*};T+N-E_fRw5Sud7bah}#1@=a@t;^!Rq&~l{sC29n*o|50O1Ohxb7WKV% ze*)GGyj5Z72I)ZLnrrGmGS}eaU77`_977gT-i#BM;mumRIC1gBR5p&-=H^jGhU`xdU?%rLJViE)(Y&SUme~JzU zT_nW})->~$M!A+k%?MH;j$EX63f2Y^<-c3>tu=*K>;~%*X_A|PTZERoh*gYGiuy!KS&9pIqCu6qEVz@aik%KzX~mbc-uxIViZld zb~jt?XrV?~?KlzLgR!A~E;1w|5_B{u&LW>132Fu%3yQBD=or`x{07I|@t`w6k@}1j zQ0xxQz+f8R2YNE{KvB~&7K5VI&L{#+1T6(c>N2W9QA;ywK~t=rJL<>=_PG{3Hp)jU z9-HN3HXiShk9l}(k&gv<+<`}ao6(yd@m3}16^GtUO?I~&-=P?gE;;d)+kHpR;k6@- z`Y2aLob zyU+a8{{_W|64Wm~zSM#7sfCdLMU*Cv4>F?5Kb_+v429rYASB`=Y~)|b@gcU14+$VX zg55tpyp@|{$Q(z%3Im%qdZlM;Lzn(}O^c?LVA?}w- z@N;sFcvNayP0ut$(;ErV?q?_YYjD0qLv$+;v8;zi!PG#xYV|%RKuleuF@_EUG)(-xZxA40ch06T2nov{5C{E_Qpraf+z`X zp!CM`q@XB>f<75d%>lhT?gm9cpbVuMHnnj0SzP~&JE_^gc^QAC#fEUG^_=W{7zcum z#hy!;mPSsLo4X*+uYmDelrKyB*1T@D%U!U&AB@|-@f)}B80E0Lg|dmfdhj92VJg4{ zn%8D*#w7z|ZL$8WvSD7P{ZOWNG&Uc;SQAF;c1fo@PgBWA*i#EB^7>=;YTCE}k%EP) zshm&^WmW7=q$CBC6S6DiOh*}>g9|^>pIRVB{9K6sr@X%i2I4uMP9Nz_A;0Zq4 zQuH@;`gCOHx&EH5c+(2y6i0WoX{suQ4}U@iss6ZTk-81xrl*%ho9e$&Yr_3UAzwek z;6AMV@QlotW~dAEj$4R`r8KUO9)&}EQoP1|I5F3~{C4^4u2@GhHoQV#WTWFc;hHrV}GLm2m(ZYYX_@|$iq!5UjB>G!+XcP1C`k5H-cVz zyo)dNg@&aa0W2wSV(~}Sj zsQeP80Kc4+1{Y%ZVL)1^(ddCN@HpU&#-B=uSvV@BW2|r#!hwAM6#kI1hlqHMA4}K$ z($x-fd(55qzXnrENNtsP8xfDuBVEU&s~*H_JcR#;jjQoLo0MDjoQ^N0btacfw=G$xLt67+~h+7sLSh3b9U4 z_O4gQ;%B$)M?A?pp~qTw^!i1M7I}K^weIUMdyYHAAO2J{I?k?9$nuH~B^gWwQq93qc2B~g{dNqcblA49D-JyQ@(Kgtv)rLK@t7f7in zlDY#@A~t;uETz|LT=!C>GRwFg|MT5xzPyk>6;pw<@AtflmvWbG>|C(#YyK%F-8f_9Br2zGLT!?0@en$48BkD=^899McCfdE zJ~7AEp+%lA#3A|h-+c#j(BPg9wImr+!;NqvU0*nngeTEhh#?31M6a;~fqRpe;Xkm3 z&wyFHG5e0;Cx6xB-U)`PKToBf#_}bGSth=Mk4m@H0rzy@`_Y*EH4^;w0q^8P@MQ5!e+>k7q_;4ZS&7j&?G3MCHkMNgKeHr#bnAI9m}QU;2(KTl z@3Mr%{05%9#=G&~bI3CBvyGqK7TNIynmHLi|7wV;FW3K5ZLSGeJd>*+M`b%`-5y_! z?yCmsc?ApQ_4^F?rMB4O{(jn7ieu z@|v~&uc1>v^Sm_iAO04UIc!<-8eK=B&6ivbr5G=SoU}~r@fdFg=)b8By_2yMk5?IA z#(&@VD46m`s9gBd?0K+9+7n?OFcnq5B7}3yA(Ba+N8ZPDgfp;alxF!kmSE@w0A-nRA6zL=DpWb9gS zKpn=yhK{=d;guAM$9xozjt%gkHK8=VsY~7n&xmu^AsM@x(O%=9@a!=@hX3ey-z9?a zL6mn~K18kF

    * * + * + * + * + * + * * * * @@ -117,6 +123,7 @@ public static RepairOption parse(Map options, IPartitioner parti RepairParallelism parallelism = RepairParallelism.fromName(options.get(PARALLELISM_KEY)); boolean primaryRange = Boolean.parseBoolean(options.get(PRIMARY_RANGE_KEY)); boolean incremental = Boolean.parseBoolean(options.get(INCREMENTAL_KEY)); + boolean trace = Boolean.parseBoolean(options.get(TRACE_KEY)); int jobThreads = 1; if (options.containsKey(JOB_THREADS_KEY)) @@ -146,7 +153,7 @@ public static RepairOption parse(Map options, IPartitioner parti } } - RepairOption option = new RepairOption(parallelism, primaryRange, incremental, jobThreads, ranges); + RepairOption option = new RepairOption(parallelism, primaryRange, incremental, trace, jobThreads, ranges); // data centers String dataCentersStr = options.get(DATACENTERS_KEY); @@ -203,6 +210,7 @@ public static RepairOption parse(Map options, IPartitioner parti private final RepairParallelism parallelism; private final boolean primaryRange; private final boolean incremental; + private final boolean trace; private final int jobThreads; private final Collection columnFamilies = new HashSet<>(); @@ -210,11 +218,12 @@ public static RepairOption parse(Map options, IPartitioner parti private final Collection hosts = new HashSet<>(); private final Collection> ranges = new HashSet<>(); - public RepairOption(RepairParallelism parallelism, boolean primaryRange, boolean incremental, int jobThreads, Collection> ranges) + public RepairOption(RepairParallelism parallelism, boolean primaryRange, boolean incremental, boolean trace, int jobThreads, Collection> ranges) { this.parallelism = parallelism; this.primaryRange = primaryRange; this.incremental = incremental; + this.trace = trace; this.jobThreads = jobThreads; this.ranges.addAll(ranges); } @@ -234,6 +243,11 @@ public boolean isIncremental() return incremental; } + public boolean isTraced() + { + return trace; + } + public int getJobThreads() { return jobThreads; diff --git a/src/java/org/apache/cassandra/service/ActiveRepairService.java b/src/java/org/apache/cassandra/service/ActiveRepairService.java index 252bcd1b6e5d..e4b7fff614e8 100644 --- a/src/java/org/apache/cassandra/service/ActiveRepairService.java +++ b/src/java/org/apache/cassandra/service/ActiveRepairService.java @@ -79,7 +79,7 @@ public class ActiveRepairService public static enum Status { - STARTED, SESSION_SUCCESS, SESSION_FAILED, FINISHED + STARTED, SESSION_SUCCESS, SESSION_FAILED, FINISHED, RUNNING } /** diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index cf2152b4f2ff..4ec23a694209 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -55,6 +55,10 @@ import org.apache.cassandra.auth.Auth; import org.apache.cassandra.concurrent.*; import org.apache.cassandra.config.*; +import org.apache.cassandra.cql3.UntypedResultSet; +import org.apache.cassandra.cql3.QueryOptions; +import org.apache.cassandra.cql3.QueryProcessor; +import org.apache.cassandra.cql3.statements.SelectStatement; import org.apache.cassandra.db.*; import org.apache.cassandra.db.commitlog.CommitLog; import org.apache.cassandra.db.compaction.CompactionManager; @@ -87,6 +91,9 @@ import org.apache.cassandra.thrift.TokenRange; import org.apache.cassandra.thrift.cassandraConstants; import org.apache.cassandra.tracing.TraceKeyspace; +import org.apache.cassandra.tracing.TraceState; +import org.apache.cassandra.tracing.Tracing; +import org.apache.cassandra.transport.messages.ResultMessage; import org.apache.cassandra.utils.*; import static java.nio.charset.StandardCharsets.ISO_8859_1; @@ -2474,7 +2481,7 @@ public int forceRepairAsync(String keyspace, parallelismDegree = RepairParallelism.PARALLEL; } - RepairOption options = new RepairOption(parallelismDegree, primaryRange, !fullRepair, 1, Collections.>emptyList()); + RepairOption options = new RepairOption(parallelismDegree, primaryRange, !fullRepair, false, 1, Collections.>emptyList()); if (dataCenters != null) { options.getDataCenters().addAll(dataCenters); @@ -2536,7 +2543,7 @@ public int forceRepairRangeAsync(String beginToken, } Collection> repairingRange = createRepairRangeFrom(beginToken, endToken); - RepairOption options = new RepairOption(parallelismDegree, false, !fullRepair, 1, repairingRange); + RepairOption options = new RepairOption(parallelismDegree, false, !fullRepair, false, 1, repairingRange); options.getDataCenters().addAll(dataCenters); if (hosts != null) { @@ -2620,6 +2627,75 @@ public int forceRepairAsync(String keyspace, RepairOption options) return cmd; } + private Thread createQueryThread(final int cmd, final UUID sessionId) + { + return new Thread(new WrappedRunnable() + { + // Query events within a time interval that overlaps the last by one second. Ignore duplicates. Ignore local traces. + // Wake up upon local trace activity. Query when notified of trace activity with a timeout that doubles every two timeouts. + public void runMayThrow() throws Exception + { + TraceState state = Tracing.instance.get(sessionId); + if (state == null) + throw new Exception("no tracestate"); + + String format = "select event_id, source, activity from %s.%s where session_id = ? and event_id > ? and event_id < ?;"; + String query = String.format(format, TraceKeyspace.NAME, TraceKeyspace.EVENTS_TABLE); + SelectStatement statement = (SelectStatement) QueryProcessor.parseStatement(query).prepare().statement; + + ByteBuffer sessionIdBytes = ByteBufferUtil.bytes(sessionId); + InetAddress source = FBUtilities.getBroadcastAddress(); + + HashSet[] seen = new HashSet[] { new HashSet(), new HashSet() }; + int si = 0; + UUID uuid; + + long tlast = System.currentTimeMillis(), tcur; + + TraceState.Status status; + long minWaitMillis = 125; + long maxWaitMillis = 1000 * 1024L; + long timeout = minWaitMillis; + boolean shouldDouble = false; + + while ((status = state.waitActivity(timeout)) != TraceState.Status.STOPPED) + { + if (status == TraceState.Status.IDLE) + { + timeout = shouldDouble ? Math.min(timeout * 2, maxWaitMillis) : timeout; + shouldDouble = !shouldDouble; + } + else + { + timeout = minWaitMillis; + shouldDouble = false; + } + ByteBuffer tminBytes = ByteBufferUtil.bytes(UUIDGen.minTimeUUID(tlast - 1000)); + ByteBuffer tmaxBytes = ByteBufferUtil.bytes(UUIDGen.maxTimeUUID(tcur = System.currentTimeMillis())); + QueryOptions options = QueryOptions.forInternalCalls(ConsistencyLevel.ONE, Lists.newArrayList(sessionIdBytes, tminBytes, tmaxBytes)); + ResultMessage.Rows rows = statement.execute(QueryState.forInternalCalls(), options); + UntypedResultSet result = UntypedResultSet.create(rows.result); + + for (UntypedResultSet.Row r : result) + { + if (source.equals(r.getInetAddress("source"))) + continue; + if ((uuid = r.getUUID("event_id")).timestamp() > (tcur - 1000) * 10000) + seen[si].add(uuid); + if (seen[si == 0 ? 1 : 0].contains(uuid)) + continue; + String message = String.format("%s: %s", r.getInetAddress("source"), r.getString("activity")); + sendNotification("repair", message, new int[]{cmd, ActiveRepairService.Status.RUNNING.ordinal()}); + } + tlast = tcur; + + si = si == 0 ? 1 : 0; + seen[si].clear(); + } + } + }); + } + private FutureTask createRepairTask(final int cmd, final String keyspace, final RepairOption options) { if (!options.getDataCenters().isEmpty() && options.getDataCenters().contains(DatabaseDescriptor.getLocalDataCenter())) @@ -2631,10 +2707,34 @@ private FutureTask createRepairTask(final int cmd, final String keyspace { protected void runMayThrow() throws Exception { + final TraceState traceState; + + String[] columnFamilies = options.getColumnFamilies().toArray(new String[options.getColumnFamilies().size()]); + Iterable validColumnFamilies = getValidColumnFamilies(false, false, keyspace, columnFamilies); + final long startTime = System.currentTimeMillis(); String message = String.format("Starting repair command #%d, repairing keyspace %s with %s", cmd, keyspace, options); logger.info(message); sendNotification("repair", message, new int[]{cmd, ActiveRepairService.Status.STARTED.ordinal()}); + if (options.isTraced()) + { + StringBuilder cfsb = new StringBuilder(); + for (ColumnFamilyStore cfs : validColumnFamilies) + cfsb.append(", ").append(cfs.keyspace.getName()).append(".").append(cfs.name); + + UUID sessionId = Tracing.instance.newSession(Tracing.TraceType.REPAIR); + traceState = Tracing.instance.begin("repair", ImmutableMap.of("keyspace", keyspace, "columnFamilies", cfsb.substring(2))); + Tracing.traceRepair(message); + traceState.enableActivityNotification(); + traceState.setNotificationHandle(new int[]{ cmd, ActiveRepairService.Status.RUNNING.ordinal() }); + Thread queryThread = createQueryThread(cmd, sessionId); + queryThread.setName("RepairTracePolling"); + queryThread.start(); + } + else + { + traceState = null; + } final Set allNeighbors = new HashSet<>(); Map> rangeToNeighbors = new HashMap<>(); @@ -2656,10 +2756,9 @@ protected void runMayThrow() throws Exception // Validate columnfamilies List columnFamilyStores = new ArrayList<>(); - String[] columnFamilies = options.getColumnFamilies().toArray(new String[options.getColumnFamilies().size()]); try { - Iterables.addAll(columnFamilyStores, getValidColumnFamilies(false, false, keyspace, columnFamilies)); + Iterables.addAll(columnFamilyStores, validColumnFamilies); } catch (IllegalArgumentException e) { @@ -2760,12 +2859,23 @@ public void onFailure(Throwable t) private void repairComplete() { - String duration = DurationFormatUtils.formatDurationWords(System.currentTimeMillis() - startTime, - true, true); + String duration = DurationFormatUtils.formatDurationWords(System.currentTimeMillis() - startTime, true, true); String message = String.format("Repair command #%d finished in %s", cmd, duration); sendNotification("repair", message, new int[]{cmd, ActiveRepairService.Status.FINISHED.ordinal()}); logger.info(message); + if (options.isTraced()) + { + traceState.setNotificationHandle(null); + // Because DebuggableThreadPoolExecutor#afterExecute and this callback + // run in a nondeterministic order (within the same thread), the + // TraceState may have been nulled out at this point. The TraceState + // should be traceState, so just set it without bothering to check if it + // actually was nulled out. + Tracing.instance.set(traceState); + Tracing.traceRepair(message); + Tracing.instance.stopSession(); + } executor.shutdownNow(); } }); @@ -3774,6 +3884,12 @@ public List getKeyspaces() return Collections.unmodifiableList(keyspaceNamesList); } + public List getNonSystemKeyspaces() + { + List keyspaceNamesList = new ArrayList<>(Schema.instance.getNonSystemKeyspaces()); + return Collections.unmodifiableList(keyspaceNamesList); + } + public void updateSnitch(String epSnitchClassName, Boolean dynamic, Integer dynamicUpdateInterval, Integer dynamicResetInterval, Double dynamicBadnessThreshold) throws ClassNotFoundException { IEndpointSnitch oldSnitch = DatabaseDescriptor.getEndpointSnitch(); diff --git a/src/java/org/apache/cassandra/service/StorageServiceMBean.java b/src/java/org/apache/cassandra/service/StorageServiceMBean.java index 1865f7fd01ee..70b2b81c4ec3 100644 --- a/src/java/org/apache/cassandra/service/StorageServiceMBean.java +++ b/src/java/org/apache/cassandra/service/StorageServiceMBean.java @@ -386,6 +386,8 @@ public interface StorageServiceMBean extends NotificationEmitter public List getKeyspaces(); + public List getNonSystemKeyspaces(); + /** * Change endpointsnitch class and dynamic-ness (and dynamic attributes) at runtime * @param epSnitchClassName the canonical path name for a class implementing IEndpointSnitch diff --git a/src/java/org/apache/cassandra/tools/NodeProbe.java b/src/java/org/apache/cassandra/tools/NodeProbe.java index d7494814025c..ea2453020564 100644 --- a/src/java/org/apache/cassandra/tools/NodeProbe.java +++ b/src/java/org/apache/cassandra/tools/NodeProbe.java @@ -737,6 +737,11 @@ public List getKeyspaces() return ssProxy.getKeyspaces(); } + public List getNonSystemKeyspaces() + { + return ssProxy.getNonSystemKeyspaces(); + } + public String getClusterName() { return ssProxy.getClusterName(); diff --git a/src/java/org/apache/cassandra/tools/NodeTool.java b/src/java/org/apache/cassandra/tools/NodeTool.java index 612af8a93851..93142253698e 100644 --- a/src/java/org/apache/cassandra/tools/NodeTool.java +++ b/src/java/org/apache/cassandra/tools/NodeTool.java @@ -317,11 +317,16 @@ private NodeProbe connect() } protected List parseOptionalKeyspace(List cmdArgs, NodeProbe nodeProbe) + { + return parseOptionalKeyspace(cmdArgs, nodeProbe, false); + } + + protected List parseOptionalKeyspace(List cmdArgs, NodeProbe nodeProbe, boolean includeSystemKS) { List keyspaces = new ArrayList<>(); if (cmdArgs == null || cmdArgs.isEmpty()) - keyspaces.addAll(nodeProbe.getKeyspaces()); + keyspaces.addAll(includeSystemKS ? nodeProbe.getKeyspaces() : nodeProbe.getNonSystemKeyspaces()); else keyspaces.add(cmdArgs.get(0)); @@ -1757,6 +1762,9 @@ public static class Repair extends NodeToolCmd "WARNING: increasing this puts more load on repairing nodes, so be careful. (default: 1, max: 4)") private int numJobThreads = 1; + @Option(title = "trace_repair", name = {"-tr", "--trace"}, description = "Use -tr to trace the repair. Traces are logged to system_traces.events.") + private boolean trace = false; + @Override public void execute(NodeProbe probe) { @@ -1778,6 +1786,7 @@ else if (dcParallel) options.put(RepairOption.PRIMARY_RANGE_KEY, Boolean.toString(primaryRange)); options.put(RepairOption.INCREMENTAL_KEY, Boolean.toString(!fullRepair)); options.put(RepairOption.JOB_THREADS_KEY, Integer.toString(numJobThreads)); + options.put(RepairOption.TRACE_KEY, Boolean.toString(trace)); options.put(RepairOption.COLUMNFAMILIES_KEY, StringUtils.join(cfnames, ",")); if (!startToken.isEmpty() || !endToken.isEmpty()) { diff --git a/src/java/org/apache/cassandra/tracing/ExpiredTraceState.java b/src/java/org/apache/cassandra/tracing/ExpiredTraceState.java index 37a013bedb71..5cc3c21107cd 100644 --- a/src/java/org/apache/cassandra/tracing/ExpiredTraceState.java +++ b/src/java/org/apache/cassandra/tracing/ExpiredTraceState.java @@ -27,9 +27,9 @@ public class ExpiredTraceState extends TraceState { - public ExpiredTraceState(UUID sessionId) + public ExpiredTraceState(UUID sessionId, Tracing.TraceType traceType) { - super(FBUtilities.getBroadcastAddress(), sessionId); + super(FBUtilities.getBroadcastAddress(), sessionId, traceType); } public int elapsed() diff --git a/src/java/org/apache/cassandra/tracing/TraceKeyspace.java b/src/java/org/apache/cassandra/tracing/TraceKeyspace.java index 4d234bd9bc77..72a7c47f98fe 100644 --- a/src/java/org/apache/cassandra/tracing/TraceKeyspace.java +++ b/src/java/org/apache/cassandra/tracing/TraceKeyspace.java @@ -39,8 +39,8 @@ public final class TraceKeyspace { public static final String NAME = "system_traces"; - private static final String SESSIONS_TABLE = "sessions"; - private static final String EVENTS_TABLE = "events"; + public static final String SESSIONS_TABLE = "sessions"; + public static final String EVENTS_TABLE = "events"; private static final int DAY = (int) TimeUnit.DAYS.toSeconds(1); @@ -48,6 +48,7 @@ public final class TraceKeyspace compile(SESSIONS_TABLE, "tracing sessions", "CREATE TABLE %s (" + "session_id uuid," + + "command text," + "coordinator inet," + "duration int," + "parameters map," @@ -79,38 +80,42 @@ public static KSMetaData definition() return new KSMetaData(NAME, SimpleStrategy.class, ImmutableMap.of("replication_factor", "2"), true, tables); } - static Mutation toStopSessionMutation(ByteBuffer sessionId, int elapsed) + static Mutation toStopSessionMutation(ByteBuffer sessionId, int elapsed, int ttl) { Mutation mutation = new Mutation(NAME, sessionId); ColumnFamily cells = mutation.addOrGet(SessionsTable); - CFRowAdder adder = new CFRowAdder(cells, cells.metadata().comparator.builder().build(), FBUtilities.timestampMicros()); + ttl = ttl == DAY ? 0 : ttl; + CFRowAdder adder = new CFRowAdder(cells, cells.metadata().comparator.builder().build(), FBUtilities.timestampMicros(), ttl); adder.add("duration", elapsed); return mutation; } - static Mutation toStartSessionMutation(ByteBuffer sessionId, Map parameters, String request, long startedAt) + static Mutation toStartSessionMutation(ByteBuffer sessionId, Map parameters, String request, long startedAt, String command, int ttl) { Mutation mutation = new Mutation(NAME, sessionId); ColumnFamily cells = mutation.addOrGet(TraceKeyspace.SessionsTable); - CFRowAdder adder = new CFRowAdder(cells, cells.metadata().comparator.builder().build(), FBUtilities.timestampMicros()); + ttl = ttl == DAY ? 0 : ttl; + CFRowAdder adder = new CFRowAdder(cells, cells.metadata().comparator.builder().build(), FBUtilities.timestampMicros(), ttl); adder.add("coordinator", FBUtilities.getBroadcastAddress()); for (Map.Entry entry : parameters.entrySet()) adder.addMapEntry("parameters", entry.getKey(), entry.getValue()); adder.add("request", request); adder.add("started_at", new Date(startedAt)); + adder.add("command", command); return mutation; } - static Mutation toEventMutation(ByteBuffer sessionId, String message, int elapsed, String threadName) + static Mutation toEventMutation(ByteBuffer sessionId, String message, int elapsed, String threadName, int ttl) { Mutation mutation = new Mutation(NAME, sessionId); ColumnFamily cells = mutation.addOrGet(EventsTable); - CFRowAdder adder = new CFRowAdder(cells, cells.metadata().comparator.make(UUIDGen.getTimeUUID()), FBUtilities.timestampMicros()); + ttl = ttl == DAY ? 0 : ttl; + CFRowAdder adder = new CFRowAdder(cells, cells.metadata().comparator.make(UUIDGen.getTimeUUID()), FBUtilities.timestampMicros(), ttl); adder.add("activity", message); adder.add("source", FBUtilities.getBroadcastAddress()); if (elapsed >= 0) diff --git a/src/java/org/apache/cassandra/tracing/TraceState.java b/src/java/org/apache/cassandra/tracing/TraceState.java index 04abce37dcc7..f7d2741c5835 100644 --- a/src/java/org/apache/cassandra/tracing/TraceState.java +++ b/src/java/org/apache/cassandra/tracing/TraceState.java @@ -28,6 +28,7 @@ import org.apache.cassandra.concurrent.Stage; import org.apache.cassandra.concurrent.StageManager; +import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.WrappedRunnable; @@ -41,12 +42,31 @@ public class TraceState public final InetAddress coordinator; public final Stopwatch watch; public final ByteBuffer sessionIdBytes; + public final Tracing.TraceType traceType; + public final int ttl; + + private boolean notify; + private Object notificationHandle; + + public enum Status + { + IDLE, + ACTIVE, + STOPPED; + } + + private Status status; // Multiple requests can use the same TraceState at a time, so we need to reference count. // See CASSANDRA-7626 for more details. private final AtomicInteger references = new AtomicInteger(1); public TraceState(InetAddress coordinator, UUID sessionId) + { + this(coordinator, sessionId, Tracing.TraceType.QUERY); + } + + public TraceState(InetAddress coordinator, UUID sessionId, Tracing.TraceType traceType) { assert coordinator != null; assert sessionId != null; @@ -54,7 +74,22 @@ public TraceState(InetAddress coordinator, UUID sessionId) this.coordinator = coordinator; this.sessionId = sessionId; sessionIdBytes = ByteBufferUtil.bytes(sessionId); + this.traceType = traceType; + this.ttl = traceType.getTTL(); watch = Stopwatch.createStarted(); + this.status = Status.IDLE; + } + + public void enableActivityNotification() + { + assert traceType == Tracing.TraceType.REPAIR; + notify = true; + } + + public void setNotificationHandle(Object handle) + { + assert traceType == Tracing.TraceType.REPAIR; + notificationHandle = handle; } public int elapsed() @@ -63,6 +98,46 @@ public int elapsed() return elapsed < Integer.MAX_VALUE ? (int) elapsed : Integer.MAX_VALUE; } + public synchronized void stop() + { + status = Status.STOPPED; + notifyAll(); + } + + /* + * Returns immediately if there has been trace activity since the last + * call, otherwise waits until there is trace activity, or until the + * timeout expires. + * @param timeout timeout in milliseconds + * @return activity status + */ + public synchronized Status waitActivity(long timeout) + { + if (status == Status.IDLE) + { + try + { + wait(timeout); + } + catch (InterruptedException e) + { + throw new RuntimeException(); + } + } + if (status == Status.ACTIVE) + { + status = Status.IDLE; + return Status.ACTIVE; + } + return status; + } + + private synchronized void notifyActivity() + { + status = Status.ACTIVE; + notifyAll(); + } + public void trace(String format, Object arg) { trace(MessageFormatter.format(format, arg).getMessage()); @@ -80,18 +155,24 @@ public void trace(String format, Object[] args) public void trace(String message) { - TraceState.trace(sessionIdBytes, message, elapsed()); + if (notify) + notifyActivity(); + + TraceState.trace(sessionIdBytes, message, elapsed(), ttl, notificationHandle); } - public static void trace(final ByteBuffer sessionId, final String message, final int elapsed) + public static void trace(final ByteBuffer sessionId, final String message, final int elapsed, final int ttl, final Object notificationHandle) { final String threadName = Thread.currentThread().getName(); + if (notificationHandle != null) + StorageService.instance.sendNotification("repair", message, notificationHandle); + StageManager.getStage(Stage.TRACING).execute(new WrappedRunnable() { public void runMayThrow() { - Tracing.mutateWithCatch(TraceKeyspace.toEventMutation(sessionId, message, elapsed, threadName)); + Tracing.mutateWithCatch(TraceKeyspace.toEventMutation(sessionId, message, elapsed, threadName, ttl)); } }); } diff --git a/src/java/org/apache/cassandra/tracing/Tracing.java b/src/java/org/apache/cassandra/tracing/Tracing.java index 773ccd40a5e2..5e769572519f 100644 --- a/src/java/org/apache/cassandra/tracing/Tracing.java +++ b/src/java/org/apache/cassandra/tracing/Tracing.java @@ -32,6 +32,7 @@ import org.apache.cassandra.concurrent.Stage; import org.apache.cassandra.concurrent.StageManager; +import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.*; import org.apache.cassandra.db.marshal.TimeUUIDType; import org.apache.cassandra.exceptions.OverloadedException; @@ -43,6 +44,7 @@ import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.UUIDGen; + /** * A trace session context. Able to track and store trace sessions. A session is usually a user initiated query, and may * have multiple local and remote events before it is completed. All events and sessions are stored at keyspace. @@ -50,6 +52,38 @@ public class Tracing { public static final String TRACE_HEADER = "TraceSession"; + public static final String TRACE_TYPE = "TraceType"; + public static final String TRACE_TTL = "TraceTTL"; + + public enum TraceType + { + NONE, + QUERY, + REPAIR; + + private static final TraceType[] ALL_VALUES = values(); + + public static TraceType deserialize(byte b) + { + if (b < 0 || ALL_VALUES.length <= b) + return NONE; + return ALL_VALUES[b]; + } + + public static byte serialize(TraceType value) + { + return (byte) value.ordinal(); + } + + private static final int[] TTLS = { DatabaseDescriptor.getTracetypeQueryTTL(), + DatabaseDescriptor.getTracetypeQueryTTL(), + DatabaseDescriptor.getTracetypeRepairTTL() }; + + public int getTTL() + { + return TTLS[ordinal()]; + } + } private static final Logger logger = LoggerFactory.getLogger(Tracing.class); @@ -67,6 +101,18 @@ public UUID getSessionId() return state.get().sessionId; } + public TraceType getTraceType() + { + assert isTracing(); + return state.get().traceType; + } + + public int getTTL() + { + assert isTracing(); + return state.get().ttl; + } + /** * Indicates if the current thread's execution is being traced. */ @@ -77,14 +123,24 @@ public static boolean isTracing() public UUID newSession() { - return newSession(TimeUUIDType.instance.compose(ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes()))); + return newSession(TraceType.QUERY); + } + + public UUID newSession(TraceType traceType) + { + return newSession(TimeUUIDType.instance.compose(ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes())), traceType); } public UUID newSession(UUID sessionId) + { + return newSession(sessionId, TraceType.QUERY); + } + + public UUID newSession(UUID sessionId, TraceType traceType) { assert state.get() == null; - TraceState ts = new TraceState(localAddress, sessionId); + TraceState ts = new TraceState(localAddress, sessionId, traceType); state.set(ts); sessions.put(sessionId, ts); @@ -111,15 +167,17 @@ public void stopSession() { final int elapsed = state.elapsed(); final ByteBuffer sessionId = state.sessionIdBytes; + final int ttl = state.ttl; StageManager.getStage(Stage.TRACING).execute(new Runnable() { public void run() { - mutateWithCatch(TraceKeyspace.toStopSessionMutation(sessionId, elapsed)); + mutateWithCatch(TraceKeyspace.toStopSessionMutation(sessionId, elapsed, ttl)); } }); + state.stop(); sessions.remove(state.sessionId); this.state.set(null); } @@ -140,20 +198,25 @@ public void set(final TraceState tls) state.set(tls); } - public void begin(final String request, final Map parameters) + public TraceState begin(final String request, final Map parameters) { assert isTracing(); + final TraceState state = this.state.get(); final long startedAt = System.currentTimeMillis(); - final ByteBuffer sessionId = state.get().sessionIdBytes; + final ByteBuffer sessionId = state.sessionIdBytes; + final String command = state.traceType.toString(); + final int ttl = state.ttl; StageManager.getStage(Stage.TRACING).execute(new Runnable() { public void run() { - mutateWithCatch(TraceKeyspace.toStartSessionMutation(sessionId, parameters, request, startedAt)); + mutateWithCatch(TraceKeyspace.toStartSessionMutation(sessionId, parameters, request, startedAt, command, ttl)); } }); + + return state; } /** @@ -163,7 +226,7 @@ public void run() */ public TraceState initializeFromMessage(final MessageIn message) { - final byte[] sessionBytes = message.parameters.get(Tracing.TRACE_HEADER); + final byte[] sessionBytes = message.parameters.get(TRACE_HEADER); if (sessionBytes == null) return null; @@ -174,19 +237,36 @@ public TraceState initializeFromMessage(final MessageIn message) if (ts != null && ts.acquireReference()) return ts; + byte[] tmpBytes; + TraceType traceType = TraceType.QUERY; + if ((tmpBytes = message.parameters.get(TRACE_TYPE)) != null) + traceType = TraceType.deserialize(tmpBytes[0]); + if (message.verb == MessagingService.Verb.REQUEST_RESPONSE) { // received a message for a session we've already closed out. see CASSANDRA-5668 - return new ExpiredTraceState(sessionId); + return new ExpiredTraceState(sessionId, traceType); } else { - ts = new TraceState(message.from, sessionId); + ts = new TraceState(message.from, sessionId, traceType); sessions.put(sessionId, ts); return ts; } } + + // repair just gets a varargs method since it's so heavyweight anyway + public static void traceRepair(String format, Object... args) + { + final TraceState state = instance.get(); + if (state == null) // inline isTracing to avoid implicit two calls to state.get() + return; + + state.trace(format, args); + } + + // normal traces get zero-, one-, and two-argument overloads so common case doesn't need to create varargs array public static void trace(String message) { final TraceState state = instance.get(); From 58c88b7d54ca2290cee9cfb322d8b34e873a370c Mon Sep 17 00:00:00 2001 From: blerer Date: Fri, 5 Dec 2014 12:19:00 -0600 Subject: [PATCH 210/557] Uncomment CollectionsTest unit test cases Patch by Benjamin Lerer; reviewed by Tyler Hobbs for CASSANDRA-8426 --- .../cassandra/cql3/CollectionsTest.java | 234 +++++++++--------- 1 file changed, 117 insertions(+), 117 deletions(-) diff --git a/test/unit/org/apache/cassandra/cql3/CollectionsTest.java b/test/unit/org/apache/cassandra/cql3/CollectionsTest.java index 2380c38aae40..3d41ad6ce7c1 100644 --- a/test/unit/org/apache/cassandra/cql3/CollectionsTest.java +++ b/test/unit/org/apache/cassandra/cql3/CollectionsTest.java @@ -21,29 +21,29 @@ public class CollectionsTest extends CQLTester { - //@Test - //public void testMapBulkRemoval() throws Throwable - //{ - // createTable("CREATE TABLE %s (k int PRIMARY KEY, m map)"); + @Test + public void testMapBulkRemoval() throws Throwable + { + createTable("CREATE TABLE %s (k int PRIMARY KEY, m map)"); - // execute("INSERT INTO %s(k, m) VALUES (?, ?)", 0, map("k1", "v1", "k2", "v2", "k3", "v3")); + execute("INSERT INTO %s(k, m) VALUES (?, ?)", 0, map("k1", "v1", "k2", "v2", "k3", "v3")); - // assertRows(execute("SELECT * FROM %s"), - // row(0, map("k1", "v1", "k2", "v2", "k3", "v3")) - // ); + assertRows(execute("SELECT * FROM %s"), + row(0, map("k1", "v1", "k2", "v2", "k3", "v3")) + ); - // execute("UPDATE %s SET m = m - ? WHERE k = ?", set("k2"), 0); + execute("UPDATE %s SET m = m - ? WHERE k = ?", set("k2"), 0); - // assertRows(execute("SELECT * FROM %s"), - // row(0, map("k1", "v1", "k3", "v3")) - // ); + assertRows(execute("SELECT * FROM %s"), + row(0, map("k1", "v1", "k3", "v3")) + ); - // execute("UPDATE %s SET m = m + ?, m = m - ? WHERE k = ?", map("k4", "v4"), set("k3"), 0); + execute("UPDATE %s SET m = m + ?, m = m - ? WHERE k = ?", map("k4", "v4"), set("k3"), 0); - // assertRows(execute("SELECT * FROM %s"), - // row(0, map("k1", "v1", "k4", "v4")) - // ); - //} + assertRows(execute("SELECT * FROM %s"), + row(0, map("k1", "v1", "k4", "v4")) + ); + } @Test public void testInvalidCollectionsMix() throws Throwable @@ -71,146 +71,146 @@ public void testInvalidCollectionsMix() throws Throwable assertInvalid("UPDATE %s SET m = m - ? WHERE k = 0", map("a", "b", "c", "d")); } - //@Test - //public void testSets() throws Throwable - //{ - // createTable("CREATE TABLE %s (k int PRIMARY KEY, s set)"); + @Test + public void testSets() throws Throwable + { + createTable("CREATE TABLE %s (k int PRIMARY KEY, s set)"); - // execute("INSERT INTO %s(k, s) VALUES (0, ?)", set("v1", "v2", "v3", "v4")); + execute("INSERT INTO %s(k, s) VALUES (0, ?)", set("v1", "v2", "v3", "v4")); - // assertRows(execute("SELECT s FROM %s WHERE k = 0"), - // row(set("v1", "v2", "v3", "v4")) - // ); + assertRows(execute("SELECT s FROM %s WHERE k = 0"), + row(set("v1", "v2", "v3", "v4")) + ); - // execute("DELETE s[?] FROM %s WHERE k = 0", "v1"); + execute("DELETE s[?] FROM %s WHERE k = 0", "v1"); - // assertRows(execute("SELECT s FROM %s WHERE k = 0"), - // row(set("v2", "v3", "v4")) - // ); + assertRows(execute("SELECT s FROM %s WHERE k = 0"), + row(set("v2", "v3", "v4")) + ); - // // Full overwrite - // execute("UPDATE %s SET s = ? WHERE k = 0", set("v6", "v5")); + // Full overwrite + execute("UPDATE %s SET s = ? WHERE k = 0", set("v6", "v5")); - // assertRows(execute("SELECT s FROM %s WHERE k = 0"), - // row(set("v5", "v6")) - // ); + assertRows(execute("SELECT s FROM %s WHERE k = 0"), + row(set("v5", "v6")) + ); - // execute("UPDATE %s SET s = s + ? WHERE k = 0", set("v7")); + execute("UPDATE %s SET s = s + ? WHERE k = 0", set("v7")); - // assertRows(execute("SELECT s FROM %s WHERE k = 0"), - // row(set("v5", "v6", "v7")) - // ); + assertRows(execute("SELECT s FROM %s WHERE k = 0"), + row(set("v5", "v6", "v7")) + ); - // execute("UPDATE %s SET s = s - ? WHERE k = 0", set("v6", "v5")); + execute("UPDATE %s SET s = s - ? WHERE k = 0", set("v6", "v5")); - // assertRows(execute("SELECT s FROM %s WHERE k = 0"), - // row(set("v7")) - // ); + assertRows(execute("SELECT s FROM %s WHERE k = 0"), + row(set("v7")) + ); - // execute("DELETE s FROM %s WHERE k = 0"); + execute("DELETE s FROM %s WHERE k = 0"); - // assertRows(execute("SELECT s FROM %s WHERE k = 0"), - // row((Object)null) - // ); - //} + assertRows(execute("SELECT s FROM %s WHERE k = 0"), + row((Object)null) + ); + } - //@Test - //public void testMaps() throws Throwable - //{ - // createTable("CREATE TABLE %s (k int PRIMARY KEY, m map)"); + @Test + public void testMaps() throws Throwable + { + createTable("CREATE TABLE %s (k int PRIMARY KEY, m map)"); - // execute("INSERT INTO %s(k, m) VALUES (0, ?)", map("v1", 1, "v2", 2)); + execute("INSERT INTO %s(k, m) VALUES (0, ?)", map("v1", 1, "v2", 2)); - // assertRows(execute("SELECT m FROM %s WHERE k = 0"), - // row(map("v1", 1, "v2", 2)) - // ); + assertRows(execute("SELECT m FROM %s WHERE k = 0"), + row(map("v1", 1, "v2", 2)) + ); - // execute("UPDATE %s SET m[?] = ?, m[?] = ? WHERE k = 0", "v3", 3, "v4", 4); + execute("UPDATE %s SET m[?] = ?, m[?] = ? WHERE k = 0", "v3", 3, "v4", 4); - // assertRows(execute("SELECT m FROM %s WHERE k = 0"), - // row(map("v1", 1, "v2", 2, "v3", 3, "v4", 4)) - // ); + assertRows(execute("SELECT m FROM %s WHERE k = 0"), + row(map("v1", 1, "v2", 2, "v3", 3, "v4", 4)) + ); - // execute("DELETE m[?] FROM %s WHERE k = 0", "v1"); + execute("DELETE m[?] FROM %s WHERE k = 0", "v1"); - // assertRows(execute("SELECT m FROM %s WHERE k = 0"), - // row(map("v2", 2, "v3", 3, "v4", 4)) - // ); + assertRows(execute("SELECT m FROM %s WHERE k = 0"), + row(map("v2", 2, "v3", 3, "v4", 4)) + ); - // // Full overwrite - // execute("UPDATE %s SET m = ? WHERE k = 0", map("v6", 6, "v5", 5)); + // Full overwrite + execute("UPDATE %s SET m = ? WHERE k = 0", map("v6", 6, "v5", 5)); - // assertRows(execute("SELECT m FROM %s WHERE k = 0"), - // row(map("v5", 5, "v6", 6)) - // ); + assertRows(execute("SELECT m FROM %s WHERE k = 0"), + row(map("v5", 5, "v6", 6)) + ); - // execute("UPDATE %s SET m = m + ? WHERE k = 0", map("v7", 7)); + execute("UPDATE %s SET m = m + ? WHERE k = 0", map("v7", 7)); - // assertRows(execute("SELECT m FROM %s WHERE k = 0"), - // row(map("v5", 5, "v6", 6, "v7", 7)) - // ); + assertRows(execute("SELECT m FROM %s WHERE k = 0"), + row(map("v5", 5, "v6", 6, "v7", 7)) + ); - // // The empty map is parsed as an empty set (because we don't have enough info at parsing - // // time when we see a {}) and special cased later. This test checks this work properly - // execute("UPDATE %s SET m = {} WHERE k = 0"); + // The empty map is parsed as an empty set (because we don't have enough info at parsing + // time when we see a {}) and special cased later. This test checks this work properly + execute("UPDATE %s SET m = {} WHERE k = 0"); - // assertRows(execute("SELECT m FROM %s WHERE k = 0"), - // row((Object)null) - // ); - //} + assertRows(execute("SELECT m FROM %s WHERE k = 0"), + row((Object)null) + ); + } - //@Test - //public void testLists() throws Throwable - //{ - // createTable("CREATE TABLE %s (k int PRIMARY KEY, l list)"); + @Test + public void testLists() throws Throwable + { + createTable("CREATE TABLE %s (k int PRIMARY KEY, l list)"); - // execute("INSERT INTO %s(k, l) VALUES (0, ?)", list("v1", "v2", "v3")); + execute("INSERT INTO %s(k, l) VALUES (0, ?)", list("v1", "v2", "v3")); - // assertRows(execute("SELECT l FROM %s WHERE k = 0"), - // row(list("v1", "v2", "v3")) - // ); + assertRows(execute("SELECT l FROM %s WHERE k = 0"), + row(list("v1", "v2", "v3")) + ); - // execute("DELETE l[?] FROM %s WHERE k = 0", 1); + execute("DELETE l[?] FROM %s WHERE k = 0", 1); - // assertRows(execute("SELECT l FROM %s WHERE k = 0"), - // row(list("v1", "v3")) - // ); + assertRows(execute("SELECT l FROM %s WHERE k = 0"), + row(list("v1", "v3")) + ); - // execute("UPDATE %s SET l[?] = ? WHERE k = 0", 1, "v4"); + execute("UPDATE %s SET l[?] = ? WHERE k = 0", 1, "v4"); - // assertRows(execute("SELECT l FROM %s WHERE k = 0"), - // row(list("v1", "v4")) - // ); + assertRows(execute("SELECT l FROM %s WHERE k = 0"), + row(list("v1", "v4")) + ); - // // Full overwrite - // execute("UPDATE %s SET l = ? WHERE k = 0", list("v6", "v5")); + // Full overwrite + execute("UPDATE %s SET l = ? WHERE k = 0", list("v6", "v5")); - // assertRows(execute("SELECT l FROM %s WHERE k = 0"), - // row(list("v6", "v5")) - // ); + assertRows(execute("SELECT l FROM %s WHERE k = 0"), + row(list("v6", "v5")) + ); - // execute("UPDATE %s SET l = l + ? WHERE k = 0", list("v7", "v8")); + execute("UPDATE %s SET l = l + ? WHERE k = 0", list("v7", "v8")); - // assertRows(execute("SELECT l FROM %s WHERE k = 0"), - // row(list("v6", "v5", "v7", "v8")) - // ); + assertRows(execute("SELECT l FROM %s WHERE k = 0"), + row(list("v6", "v5", "v7", "v8")) + ); - // execute("UPDATE %s SET l = ? + l WHERE k = 0", list("v9")); + execute("UPDATE %s SET l = ? + l WHERE k = 0", list("v9")); - // assertRows(execute("SELECT l FROM %s WHERE k = 0"), - // row(list("v9", "v6", "v5", "v7", "v8")) - // ); + assertRows(execute("SELECT l FROM %s WHERE k = 0"), + row(list("v9", "v6", "v5", "v7", "v8")) + ); - // execute("UPDATE %s SET l = l - ? WHERE k = 0", list("v5", "v8")); + execute("UPDATE %s SET l = l - ? WHERE k = 0", list("v5", "v8")); - // assertRows(execute("SELECT l FROM %s WHERE k = 0"), - // row(list("v9", "v6", "v7")) - // ); + assertRows(execute("SELECT l FROM %s WHERE k = 0"), + row(list("v9", "v6", "v7")) + ); - // execute("DELETE l FROM %s WHERE k = 0"); + execute("DELETE l FROM %s WHERE k = 0"); - // assertRows(execute("SELECT l FROM %s WHERE k = 0"), - // row((Object)null) - // ); - //} + assertRows(execute("SELECT l FROM %s WHERE k = 0"), + row((Object)null) + ); + } } From 98cf63431af3d1cd6a411e311250ab71961df9e7 Mon Sep 17 00:00:00 2001 From: blerer Date: Fri, 5 Dec 2014 13:15:35 -0600 Subject: [PATCH 211/557] Fix NPE in SelectStatement with empty IN values Patch by Benjamin Lerer; reviewed by Tyler Hobbs for CASSANDRA-8419 --- CHANGES.txt | 1 + .../SingleColumnPrimaryKeyRestrictions.java | 9 +++++++-- .../cassandra/cql3/MultiColumnRelationTest.java | 4 ++++ .../cassandra/cql3/SingleColumnRelationTest.java | 16 ++++++++++++++++ 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index f5a5f6a7c6cf..588f58f2576f 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0 + * Fix NPE in SelectStatement with empty IN values (CASSANDRA-8419) * Refactor SelectStatement, return IN results in natural order instead of IN value list order (CASSANDRA-7981) * Support UDTs, tuples, and collections in user-defined diff --git a/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnPrimaryKeyRestrictions.java b/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnPrimaryKeyRestrictions.java index 3858cdc43324..5c8386e44461 100644 --- a/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnPrimaryKeyRestrictions.java +++ b/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnPrimaryKeyRestrictions.java @@ -186,7 +186,7 @@ public List valuesAsComposites(QueryOptions options) throws InvalidRe List values = r.values(options); if (values.isEmpty()) - return null; + return Collections.emptyList(); builder.addEachElementToAll(values); checkFalse(builder.containsNull(), "Invalid null value for column %s", def.name); @@ -236,7 +236,12 @@ public List boundsAsComposites(Bound bound, QueryOptions options) thr return compositeBuilder.buildWithEOC(eoc); } - compositeBuilder.addEachElementToAll(r.values(options)); + List values = r.values(options); + + if (values.isEmpty()) + return Collections.emptyList(); + + compositeBuilder.addEachElementToAll(values); checkFalse(compositeBuilder.containsNull(), "Invalid null clustering key part %s", def.name); keyPosition++; diff --git a/test/unit/org/apache/cassandra/cql3/MultiColumnRelationTest.java b/test/unit/org/apache/cassandra/cql3/MultiColumnRelationTest.java index 291afd8a2646..b178498d2b3a 100644 --- a/test/unit/org/apache/cassandra/cql3/MultiColumnRelationTest.java +++ b/test/unit/org/apache/cassandra/cql3/MultiColumnRelationTest.java @@ -441,11 +441,15 @@ public void testMultipleClustering() throws Throwable row(0, 0, 1, 1) ); + assertEmpty(execute("SELECT * FROM %s WHERE a = ? and (b) IN ()", 0)); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c) IN ((?, ?)) ORDER BY b DESC, c DESC, d DESC", 0, 0, 1), row(0, 0, 1, 1), row(0, 0, 1, 0) ); + assertEmpty(execute("SELECT * FROM %s WHERE a = ? AND (b, c) IN () ORDER BY b DESC, c DESC, d DESC", 0)); + // IN on both partition key and clustering key execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 0, 0, 0); execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 0, 1, 0); diff --git a/test/unit/org/apache/cassandra/cql3/SingleColumnRelationTest.java b/test/unit/org/apache/cassandra/cql3/SingleColumnRelationTest.java index 112da06e86e5..e6412a391548 100644 --- a/test/unit/org/apache/cassandra/cql3/SingleColumnRelationTest.java +++ b/test/unit/org/apache/cassandra/cql3/SingleColumnRelationTest.java @@ -363,4 +363,20 @@ public void testRangeQueryOnIndex() throws Throwable "SELECT * FROM %s WHERE setid = 0 AND row < 1;"); assertRows(execute("SELECT * FROM %s WHERE setid = 0 AND row < 1 ALLOW FILTERING;"), row(0, 0, 0)); } + + @Test + public void testEmptyIN() throws Throwable + { + for (String compactOption : new String[] { "", " WITH COMPACT STORAGE" }) + { + createTable("CREATE TABLE %s (k1 int, k2 int, v int, PRIMARY KEY (k1, k2))" + compactOption); + + for (int i = 0; i <= 2; i++) + for (int j = 0; j <= 2; j++) + execute("INSERT INTO %s (k1, k2, v) VALUES (?, ?, ?)", i, j, i + j); + + assertEmpty(execute("SELECT v FROM %s WHERE k1 IN ()")); + assertEmpty(execute("SELECT v FROM %s WHERE k1 = 0 AND k2 IN ()")); + } + } } From d4a8a81757f1db6c98bffdb56d145a4efd6b7cdf Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Fri, 5 Dec 2014 21:02:58 -0500 Subject: [PATCH 212/557] fix incompatibility between formal and actual format parms --- src/java/org/apache/cassandra/repair/LocalSyncTask.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/cassandra/repair/LocalSyncTask.java b/src/java/org/apache/cassandra/repair/LocalSyncTask.java index bbb6362fea2a..010c959a338c 100644 --- a/src/java/org/apache/cassandra/repair/LocalSyncTask.java +++ b/src/java/org/apache/cassandra/repair/LocalSyncTask.java @@ -103,7 +103,7 @@ public void handleStreamEvent(StreamEvent event) public void onSuccess(StreamState result) { - String message = String.format("Sync complete between %s and %s on %s", desc.sessionId, r1.endpoint, r2.endpoint, desc.columnFamily); + String message = String.format("Sync complete using session %s between %s and %s on %s", desc.sessionId, r1.endpoint, r2.endpoint, desc.columnFamily); logger.info("[repair #{}] {}", desc.sessionId, message); Tracing.traceRepair(message); set(stat); From e7b08831743c48e8718e4cd79093f20d6c2f31c5 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Fri, 5 Dec 2014 21:28:28 -0500 Subject: [PATCH 213/557] parseDouble for primitives --- .../apache/cassandra/cql3/statements/PropertyDefinitions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/cassandra/cql3/statements/PropertyDefinitions.java b/src/java/org/apache/cassandra/cql3/statements/PropertyDefinitions.java index 23cf8e11ea46..793285bbdb3a 100644 --- a/src/java/org/apache/cassandra/cql3/statements/PropertyDefinitions.java +++ b/src/java/org/apache/cassandra/cql3/statements/PropertyDefinitions.java @@ -106,7 +106,7 @@ public double getDouble(String key, double defaultValue) throws SyntaxException { try { - return Double.valueOf(value); + return Double.parseDouble(value); } catch (NumberFormatException e) { From 178d7b6f8837e8f5cdd5f9c4661f3a3c3a0c4c0a Mon Sep 17 00:00:00 2001 From: Sylvain Lebresne Date: Tue, 9 Dec 2014 20:08:38 +0100 Subject: [PATCH 214/557] Fix Accumulator.isEmpty method patch by slebresne; reviewed by benedict for CASSANDRA-7873 --- .../utils/concurrent/Accumulator.java | 2 +- .../utils/concurrent/AccumulatorTest.java | 106 ++++++++++++++++++ 2 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 test/unit/org/apache/cassandra/utils/concurrent/AccumulatorTest.java diff --git a/src/java/org/apache/cassandra/utils/concurrent/Accumulator.java b/src/java/org/apache/cassandra/utils/concurrent/Accumulator.java index 3b5e5c94ff44..baecb3473983 100644 --- a/src/java/org/apache/cassandra/utils/concurrent/Accumulator.java +++ b/src/java/org/apache/cassandra/utils/concurrent/Accumulator.java @@ -89,7 +89,7 @@ public void add(E item) public boolean isEmpty() { - return presentCount != 0; + return presentCount == 0; } /** diff --git a/test/unit/org/apache/cassandra/utils/concurrent/AccumulatorTest.java b/test/unit/org/apache/cassandra/utils/concurrent/AccumulatorTest.java new file mode 100644 index 000000000000..28423740ed5a --- /dev/null +++ b/test/unit/org/apache/cassandra/utils/concurrent/AccumulatorTest.java @@ -0,0 +1,106 @@ +/* +* 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.utils.concurrent; + +import java.util.Iterator; + +import org.junit.Test; + +import static org.junit.Assert.*; + +public class AccumulatorTest +{ + @Test + public void testAddMoreThanCapacity() + { + Accumulator accu = new Accumulator(4); + + accu.add(1); + accu.add(2); + accu.add(3); + accu.add(4); + + try + { + accu.add(5); + fail(); + } + catch (IllegalStateException e) + { + // Expected + } + } + + @Test + public void testIsEmptyAndSize() + { + Accumulator accu = new Accumulator(4); + + assertTrue(accu.isEmpty()); + assertEquals(0, accu.size()); + + accu.add(1); + accu.add(2); + + assertTrue(!accu.isEmpty()); + assertEquals(2, accu.size()); + + accu.add(3); + accu.add(4); + + assertTrue(!accu.isEmpty()); + assertEquals(4, accu.size()); + } + + @Test + public void testGetAndIterator() + { + Accumulator accu = new Accumulator(4); + + accu.add("3"); + accu.add("2"); + accu.add("4"); + + assertEquals("3", accu.get(0)); + assertEquals("2", accu.get(1)); + assertEquals("4", accu.get(2)); + + try + { + assertEquals(null, accu.get(3)); + fail(); + } + catch (IndexOutOfBoundsException e) + { + // Expected + } + + accu.add("0"); + + assertEquals("0", accu.get(3)); + + Iterator iter = accu.iterator(); + + assertEquals("3", iter.next()); + assertEquals("2", iter.next()); + assertEquals("4", iter.next()); + assertEquals("0", iter.next()); + assertFalse(iter.hasNext()); + } +} From e2f35c767e479da9761628578299b54872d7eea9 Mon Sep 17 00:00:00 2001 From: Robert Stupp Date: Thu, 11 Dec 2014 11:46:28 -0600 Subject: [PATCH 215/557] Support for user-defined aggregate functions Patch by Robert Stupp; reviewed by Tyler Hobbs for CASSANDRA-8053 --- CHANGES.txt | 1 + pylib/cqlshlib/cql3handling.py | 28 +- src/java/org/apache/cassandra/auth/Auth.java | 12 + .../apache/cassandra/config/KSMetaData.java | 1 + src/java/org/apache/cassandra/cql3/Cql.g | 61 ++ .../apache/cassandra/cql3/QueryProcessor.java | 15 + .../cql3/functions/AbstractFunction.java | 10 + .../cql3/functions/AggregateFcts.java | 64 +- .../cql3/functions/AggregateFunction.java | 10 +- .../cassandra/cql3/functions/Function.java | 4 + .../cql3/functions/FunctionCall.java | 2 +- .../cassandra/cql3/functions/Functions.java | 24 +- .../cql3/functions/JavaSourceUDFFactory.java | 6 +- .../cassandra/cql3/functions/UDAggregate.java | 280 ++++++++ .../cassandra/cql3/functions/UDFunction.java | 193 ++---- .../cassandra/cql3/functions/UDHelper.java | 123 ++++ .../selection/AbstractFunctionSelector.java | 4 +- .../selection/AggregateFunctionSelector.java | 6 +- .../cql3/selection/FieldSelector.java | 2 +- .../cassandra/cql3/selection/Selection.java | 8 +- .../cassandra/cql3/selection/Selector.java | 2 +- .../cql3/selection/SelectorFactories.java | 2 +- .../statements/CreateAggregateStatement.java | 194 ++++++ .../statements/CreateFunctionStatement.java | 11 +- .../statements/DropAggregateStatement.java | 136 ++++ .../statements/DropFunctionStatement.java | 17 +- .../org/apache/cassandra/db/DefsTables.java | 89 ++- .../apache/cassandra/db/SystemKeyspace.java | 21 +- .../cassandra/service/IMigrationListener.java | 3 + .../cassandra/service/MigrationManager.java | 45 +- .../apache/cassandra/transport/Server.java | 12 + .../cassandra/cql3/AggregationTest.java | 640 +++++++++++++++++- .../org/apache/cassandra/cql3/CQLTester.java | 14 + .../org/apache/cassandra/cql3/UFTest.java | 8 - 34 files changed, 1795 insertions(+), 253 deletions(-) create mode 100644 src/java/org/apache/cassandra/cql3/functions/UDAggregate.java create mode 100644 src/java/org/apache/cassandra/cql3/functions/UDHelper.java create mode 100644 src/java/org/apache/cassandra/cql3/statements/CreateAggregateStatement.java create mode 100644 src/java/org/apache/cassandra/cql3/statements/DropAggregateStatement.java diff --git a/CHANGES.txt b/CHANGES.txt index 34e740e8ca16..6ff61e7220a7 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0 + * Support for user-defined aggregation functions (CASSANDRA-8053) * Fix NPE in SelectStatement with empty IN values (CASSANDRA-8419) * Refactor SelectStatement, return IN results in natural order instead of IN value list order (CASSANDRA-7981) diff --git a/pylib/cqlshlib/cql3handling.py b/pylib/cqlshlib/cql3handling.py index f8a3069d9d21..84af79669402 100644 --- a/pylib/cqlshlib/cql3handling.py +++ b/pylib/cqlshlib/cql3handling.py @@ -41,7 +41,7 @@ class Cql3ParsingRuleSet(CqlParsingRuleSet): 'select', 'from', 'where', 'and', 'key', 'insert', 'update', 'with', 'limit', 'using', 'use', 'set', 'begin', 'apply', 'batch', 'truncate', 'delete', 'in', 'create', - 'function', 'keyspace', 'schema', 'columnfamily', 'table', 'index', 'on', 'drop', + 'function', 'aggregate', 'keyspace', 'schema', 'columnfamily', 'table', 'index', 'on', 'drop', 'primary', 'into', 'values', 'timestamp', 'ttl', 'alter', 'add', 'type', 'compact', 'storage', 'order', 'by', 'asc', 'desc', 'clustering', 'token', 'writetime', 'map', 'list', 'to', 'custom', 'if', 'not' @@ -209,7 +209,10 @@ def dequote_value(cqlword): ::= "{" ":" ( "," ":" )* "}" ; - ::= ( "." )? + ::= ( "." )? + ; + + ::= | "TOKEN" ; @@ -233,12 +236,14 @@ def dequote_value(cqlword): | | | + | | | | | | | + | | | | @@ -1010,7 +1015,7 @@ def create_cf_composite_primary_key_comma_completer(ctxt, cass): ::= "CREATE" ("OR" "REPLACE")? "FUNCTION" ("IF" "NOT" "EXISTS")? ("NON"? "DETERMINISTIC")? - + ( "(" ( newcol= ( "," [newcolname]= )* )? ")" )? @@ -1018,6 +1023,18 @@ def create_cf_composite_primary_key_comma_completer(ctxt, cass): "LANGUAGE" "AS" ; + ::= "CREATE" ("OR" "REPLACE")? "AGGREGATE" + ("IF" "NOT" "EXISTS")? + + ( "(" + ( ( "," )* )? + ")" )? + "SFUNC" + "STYPE" + ( "FINALFUNC" )? + ( "INITCOND" )? + ; + ''' explain_completion('createIndexStatement', 'indexname', '') @@ -1049,7 +1066,10 @@ def create_index_col_completer(ctxt, cass): ::= "DROP" "TYPE" ut= ; - ::= "DROP" "FUNCTION" ( "IF" "EXISTS" )? + ::= "DROP" "FUNCTION" ( "IF" "EXISTS" )? + ; + + ::= "DROP" "AGGREGATE" ( "IF" "EXISTS" )? ; ''' diff --git a/src/java/org/apache/cassandra/auth/Auth.java b/src/java/org/apache/cassandra/auth/Auth.java index 041ce2b846d8..cdcfa0e8317e 100644 --- a/src/java/org/apache/cassandra/auth/Auth.java +++ b/src/java/org/apache/cassandra/auth/Auth.java @@ -340,6 +340,10 @@ public void onDropFunction(String ksName, String functionName) { } + public void onDropAggregate(String ksName, String aggregateName) + { + } + public void onCreateKeyspace(String ksName) { } @@ -356,6 +360,10 @@ public void onCreateFunction(String ksName, String functionName) { } + public void onCreateAggregate(String ksName, String aggregateName) + { + } + public void onUpdateKeyspace(String ksName) { } @@ -371,5 +379,9 @@ public void onUpdateUserType(String ksName, String userType) public void onUpdateFunction(String ksName, String functionName) { } + + public void onUpdateAggregate(String ksName, String aggregateName) + { + } } } diff --git a/src/java/org/apache/cassandra/config/KSMetaData.java b/src/java/org/apache/cassandra/config/KSMetaData.java index 494f98b8fb67..e5576adbd0e2 100644 --- a/src/java/org/apache/cassandra/config/KSMetaData.java +++ b/src/java/org/apache/cassandra/config/KSMetaData.java @@ -186,6 +186,7 @@ public Mutation dropFromSchema(long timestamp) mutation.delete(SystemKeyspace.SCHEMA_TRIGGERS_TABLE, timestamp); mutation.delete(SystemKeyspace.SCHEMA_USER_TYPES_TABLE, timestamp); mutation.delete(SystemKeyspace.SCHEMA_FUNCTIONS_TABLE, timestamp); + mutation.delete(SystemKeyspace.SCHEMA_AGGREGATES_TABLE, timestamp); mutation.delete(SystemKeyspace.BUILT_INDEXES_TABLE, timestamp); return mutation; diff --git a/src/java/org/apache/cassandra/cql3/Cql.g b/src/java/org/apache/cassandra/cql3/Cql.g index 19975445f98b..ed133e712641 100644 --- a/src/java/org/apache/cassandra/cql3/Cql.g +++ b/src/java/org/apache/cassandra/cql3/Cql.g @@ -245,6 +245,8 @@ cqlStatement returns [ParsedStatement stmt] | st27=dropTypeStatement { $stmt = st27; } | st28=createFunctionStatement { $stmt = st28; } | st29=dropFunctionStatement { $stmt = st29; } + | st30=createAggregateStatement { $stmt = st30; } + | st31=dropAggregateStatement { $stmt = st31; } ; /* @@ -488,6 +490,55 @@ batchStatementObjective returns [ModificationStatement.Parsed statement] | d=deleteStatement { $statement = d; } ; +createAggregateStatement returns [CreateAggregateStatement expr] + @init { + boolean orReplace = false; + boolean ifNotExists = false; + + List argsTypes = new ArrayList<>(); + } + : K_CREATE (K_OR K_REPLACE { orReplace = true; })? + K_AGGREGATE + (K_IF K_NOT K_EXISTS { ifNotExists = true; })? + fn=functionName + '(' + ( + v=comparatorType { argsTypes.add(v); } + ( ',' v=comparatorType { argsTypes.add(v); } )* + )? + ')' + K_SFUNC sfunc = allowedFunctionName + K_STYPE stype = comparatorType + ( + K_FINALFUNC ffunc = allowedFunctionName + )? + ( + K_INITCOND ival = term + )? + { $expr = new CreateAggregateStatement(fn, argsTypes, sfunc, stype, ffunc, ival, orReplace, ifNotExists); } + ; + +dropAggregateStatement returns [DropAggregateStatement expr] + @init { + boolean ifExists = false; + List argsTypes = new ArrayList<>(); + boolean argsPresent = false; + } + : K_DROP K_AGGREGATE + (K_IF K_EXISTS { ifExists = true; } )? + fn=functionName + ( + '(' + ( + v=comparatorType { argsTypes.add(v); } + ( ',' v=comparatorType { argsTypes.add(v); } )* + )? + ')' + { argsPresent = true; } + )? + { $expr = new DropAggregateStatement(fn, argsTypes, argsPresent, ifExists); } + ; + createFunctionStatement returns [CreateFunctionStatement expr] @init { boolean orReplace = false; @@ -1271,6 +1322,11 @@ basic_unreserved_keyword returns [String str] | K_CONTAINS | K_STATIC | K_FUNCTION + | K_AGGREGATE + | K_SFUNC + | K_STYPE + | K_FINALFUNC + | K_INITCOND | K_RETURNS | K_LANGUAGE | K_NON @@ -1384,6 +1440,11 @@ K_STATIC: S T A T I C; K_FROZEN: F R O Z E N; K_FUNCTION: F U N C T I O N; +K_AGGREGATE: A G G R E G A T E; +K_SFUNC: S F U N C; +K_STYPE: S T Y P E; +K_FINALFUNC: F I N A L F U N C; +K_INITCOND: I N I T C O N D; K_RETURNS: R E T U R N S; K_LANGUAGE: L A N G U A G E; K_NON: N O N; diff --git a/src/java/org/apache/cassandra/cql3/QueryProcessor.java b/src/java/org/apache/cassandra/cql3/QueryProcessor.java index 82b354e60590..8bd5daa042d8 100644 --- a/src/java/org/apache/cassandra/cql3/QueryProcessor.java +++ b/src/java/org/apache/cassandra/cql3/QueryProcessor.java @@ -613,11 +613,21 @@ public void onCreateFunction(String ksName, String functionName) { removeInvalidPreparedStatementsForFunction(thriftPreparedStatements.values().iterator(), ksName, functionName); } } + public void onCreateAggregate(String ksName, String aggregateName) { + if (Functions.getOverloadCount(new FunctionName(ksName, aggregateName)) > 1) + { + // in case there are other overloads, we have to remove all overloads since argument type + // matching may change (due to type casting) + removeInvalidPreparedStatementsForFunction(preparedStatements.values().iterator(), ksName, aggregateName); + removeInvalidPreparedStatementsForFunction(thriftPreparedStatements.values().iterator(), ksName, aggregateName); + } + } public void onUpdateKeyspace(String ksName) { } public void onUpdateColumnFamily(String ksName, String cfName) { } public void onUpdateUserType(String ksName, String typeName) { } public void onUpdateFunction(String ksName, String functionName) { } + public void onUpdateAggregate(String ksName, String aggregateName) { } public void onDropKeyspace(String ksName) { @@ -634,6 +644,11 @@ public void onDropFunction(String ksName, String functionName) { removeInvalidPreparedStatementsForFunction(preparedStatements.values().iterator(), ksName, functionName); removeInvalidPreparedStatementsForFunction(thriftPreparedStatements.values().iterator(), ksName, functionName); } + public void onDropAggregate(String ksName, String aggregateName) + { + removeInvalidPreparedStatementsForFunction(preparedStatements.values().iterator(), ksName, aggregateName); + removeInvalidPreparedStatementsForFunction(thriftPreparedStatements.values().iterator(), ksName, aggregateName); + } private void removeInvalidPreparedStatementsForFunction(Iterator iterator, String ksName, String functionName) diff --git a/src/java/org/apache/cassandra/cql3/functions/AbstractFunction.java b/src/java/org/apache/cassandra/cql3/functions/AbstractFunction.java index d5a40a0905f9..e2d69b89f22f 100644 --- a/src/java/org/apache/cassandra/cql3/functions/AbstractFunction.java +++ b/src/java/org/apache/cassandra/cql3/functions/AbstractFunction.java @@ -66,6 +66,16 @@ public boolean equals(Object o) && Objects.equal(this.returnType, that.returnType); } + public boolean usesFunction(String ksName, String functionName) + { + return name.keyspace.equals(ksName) && name.name.equals(functionName); + } + + public boolean hasReferenceTo(Function function) + { + return false; + } + @Override public int hashCode() { diff --git a/src/java/org/apache/cassandra/cql3/functions/AggregateFcts.java b/src/java/org/apache/cassandra/cql3/functions/AggregateFcts.java index f72ed446e23c..865dfbf267c0 100644 --- a/src/java/org/apache/cassandra/cql3/functions/AggregateFcts.java +++ b/src/java/org/apache/cassandra/cql3/functions/AggregateFcts.java @@ -53,12 +53,12 @@ public void reset() count = 0; } - public ByteBuffer compute() + public ByteBuffer compute(int protocolVersion) { return ((LongType) returnType()).decompose(Long.valueOf(count)); } - public void addInput(List values) + public void addInput(int protocolVersion, List values) { count++; } @@ -84,12 +84,12 @@ public void reset() sum = BigDecimal.ZERO; } - public ByteBuffer compute() + public ByteBuffer compute(int protocolVersion) { return ((DecimalType) returnType()).decompose(sum); } - public void addInput(List values) + public void addInput(int protocolVersion, List values) { ByteBuffer value = values.get(0); @@ -123,7 +123,7 @@ public void reset() sum = BigDecimal.ZERO; } - public ByteBuffer compute() + public ByteBuffer compute(int protocolVersion) { if (count == 0) return ((DecimalType) returnType()).decompose(BigDecimal.ZERO); @@ -131,7 +131,7 @@ public ByteBuffer compute() return ((DecimalType) returnType()).decompose(sum.divide(BigDecimal.valueOf(count))); } - public void addInput(List values) + public void addInput(int protocolVersion, List values) { ByteBuffer value = values.get(0); @@ -163,12 +163,12 @@ public void reset() sum = BigInteger.ZERO; } - public ByteBuffer compute() + public ByteBuffer compute(int protocolVersion) { return ((IntegerType) returnType()).decompose(sum); } - public void addInput(List values) + public void addInput(int protocolVersion, List values) { ByteBuffer value = values.get(0); @@ -202,7 +202,7 @@ public void reset() sum = BigInteger.ZERO; } - public ByteBuffer compute() + public ByteBuffer compute(int protocolVersion) { if (count == 0) return ((IntegerType) returnType()).decompose(BigInteger.ZERO); @@ -210,7 +210,7 @@ public ByteBuffer compute() return ((IntegerType) returnType()).decompose(sum.divide(BigInteger.valueOf(count))); } - public void addInput(List values) + public void addInput(int protocolVersion, List values) { ByteBuffer value = values.get(0); @@ -242,12 +242,12 @@ public void reset() sum = 0; } - public ByteBuffer compute() + public ByteBuffer compute(int protocolVersion) { return ((Int32Type) returnType()).decompose(sum); } - public void addInput(List values) + public void addInput(int protocolVersion, List values) { ByteBuffer value = values.get(0); @@ -281,14 +281,14 @@ public void reset() sum = 0; } - public ByteBuffer compute() + public ByteBuffer compute(int protocolVersion) { int avg = count == 0 ? 0 : sum / count; return ((Int32Type) returnType()).decompose(avg); } - public void addInput(List values) + public void addInput(int protocolVersion, List values) { ByteBuffer value = values.get(0); @@ -320,12 +320,12 @@ public void reset() sum = 0; } - public ByteBuffer compute() + public ByteBuffer compute(int protocolVersion) { return ((LongType) returnType()).decompose(sum); } - public void addInput(List values) + public void addInput(int protocolVersion, List values) { ByteBuffer value = values.get(0); @@ -359,14 +359,14 @@ public void reset() sum = 0; } - public ByteBuffer compute() + public ByteBuffer compute(int protocolVersion) { long avg = count == 0 ? 0 : sum / count; return ((LongType) returnType()).decompose(avg); } - public void addInput(List values) + public void addInput(int protocolVersion, List values) { ByteBuffer value = values.get(0); @@ -398,12 +398,12 @@ public void reset() sum = 0; } - public ByteBuffer compute() + public ByteBuffer compute(int protocolVersion) { return ((FloatType) returnType()).decompose(sum); } - public void addInput(List values) + public void addInput(int protocolVersion, List values) { ByteBuffer value = values.get(0); @@ -437,14 +437,14 @@ public void reset() sum = 0; } - public ByteBuffer compute() + public ByteBuffer compute(int protocolVersion) { float avg = count == 0 ? 0 : sum / count; return ((FloatType) returnType()).decompose(avg); } - public void addInput(List values) + public void addInput(int protocolVersion, List values) { ByteBuffer value = values.get(0); @@ -476,12 +476,12 @@ public void reset() sum = 0; } - public ByteBuffer compute() + public ByteBuffer compute(int protocolVersion) { return ((DoubleType) returnType()).decompose(sum); } - public void addInput(List values) + public void addInput(int protocolVersion, List values) { ByteBuffer value = values.get(0); @@ -515,14 +515,14 @@ public void reset() sum = 0; } - public ByteBuffer compute() + public ByteBuffer compute(int protocolVersion) { double avg = count == 0 ? 0 : sum / count; return ((DoubleType) returnType()).decompose(avg); } - public void addInput(List values) + public void addInput(int protocolVersion, List values) { ByteBuffer value = values.get(0); @@ -558,12 +558,12 @@ public void reset() max = null; } - public ByteBuffer compute() + public ByteBuffer compute(int protocolVersion) { return max; } - public void addInput(List values) + public void addInput(int protocolVersion, List values) { ByteBuffer value = values.get(0); @@ -599,12 +599,12 @@ public void reset() min = null; } - public ByteBuffer compute() + public ByteBuffer compute(int protocolVersion) { return min; } - public void addInput(List values) + public void addInput(int protocolVersion, List values) { ByteBuffer value = values.get(0); @@ -640,12 +640,12 @@ public void reset() count = 0; } - public ByteBuffer compute() + public ByteBuffer compute(int protocolVersion) { return ((LongType) returnType()).decompose(count); } - public void addInput(List values) + public void addInput(int protocolVersion, List values) { ByteBuffer value = values.get(0); diff --git a/src/java/org/apache/cassandra/cql3/functions/AggregateFunction.java b/src/java/org/apache/cassandra/cql3/functions/AggregateFunction.java index 47eee4bca07d..ddbc9d1c3528 100644 --- a/src/java/org/apache/cassandra/cql3/functions/AggregateFunction.java +++ b/src/java/org/apache/cassandra/cql3/functions/AggregateFunction.java @@ -20,6 +20,8 @@ import java.nio.ByteBuffer; import java.util.List; +import org.apache.cassandra.exceptions.InvalidRequestException; + /** * Performs a calculation on a set of values and return a single value. */ @@ -30,7 +32,7 @@ public interface AggregateFunction extends Function * * @return a new Aggregate instance. */ - public Aggregate newAggregate(); + public Aggregate newAggregate() throws InvalidRequestException; /** * An aggregation operation. @@ -40,16 +42,18 @@ interface Aggregate /** * Adds the specified input to this aggregate. * + * @param protocolVersion native protocol version * @param values the values to add to the aggregate. */ - public void addInput(List values); + public void addInput(int protocolVersion, List values) throws InvalidRequestException; /** * Computes and returns the aggregate current value. * + * @param protocolVersion native protocol version * @return the aggregate current value. */ - public ByteBuffer compute(); + public ByteBuffer compute(int protocolVersion) throws InvalidRequestException; /** * Reset this aggregate. diff --git a/src/java/org/apache/cassandra/cql3/functions/Function.java b/src/java/org/apache/cassandra/cql3/functions/Function.java index 9e41fe4325bd..4d2b99351bc1 100644 --- a/src/java/org/apache/cassandra/cql3/functions/Function.java +++ b/src/java/org/apache/cassandra/cql3/functions/Function.java @@ -51,4 +51,8 @@ public interface Function * @return true if the function is an aggregate function, false otherwise. */ public boolean isAggregate(); + + boolean usesFunction(String ksName, String functionName); + + boolean hasReferenceTo(Function function); } diff --git a/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java b/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java index 01443d2d03b9..72ac63e35364 100644 --- a/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java +++ b/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java @@ -44,7 +44,7 @@ private FunctionCall(ScalarFunction fun, List terms) public boolean usesFunction(String ksName, String functionName) { - return fun.name().keyspace.equals(ksName) && fun.name().name.equals(functionName); + return fun.usesFunction(ksName, functionName); } public void collectMarkerSpecification(VariableSpecifications boundNames) diff --git a/src/java/org/apache/cassandra/cql3/functions/Functions.java b/src/java/org/apache/cassandra/cql3/functions/Functions.java index a8fdf0f837c9..7d94e47463a4 100644 --- a/src/java/org/apache/cassandra/cql3/functions/Functions.java +++ b/src/java/org/apache/cassandra/cql3/functions/Functions.java @@ -42,7 +42,8 @@ public abstract class Functions // to handle it as a special case. private static final FunctionName TOKEN_FUNCTION_NAME = FunctionName.nativeFunction("token"); - private static final String SELECT_UDFS = "SELECT * FROM " + SystemKeyspace.NAME + '.' + SystemKeyspace.SCHEMA_FUNCTIONS_TABLE; + private static final String SELECT_UD_FUNCTION = "SELECT * FROM " + SystemKeyspace.NAME + '.' + SystemKeyspace.SCHEMA_FUNCTIONS_TABLE; + private static final String SELECT_UD_AGGREGATE = "SELECT * FROM " + SystemKeyspace.NAME + '.' + SystemKeyspace.SCHEMA_AGGREGATES_TABLE; private Functions() {} @@ -101,8 +102,10 @@ private static void declare(Function fun) public static void loadUDFFromSchema() { logger.debug("Loading UDFs"); - for (UntypedResultSet.Row row : QueryProcessor.executeOnceInternal(SELECT_UDFS)) + for (UntypedResultSet.Row row : QueryProcessor.executeOnceInternal(SELECT_UD_FUNCTION)) addFunction(UDFunction.fromSchema(row)); + for (UntypedResultSet.Row row : QueryProcessor.executeOnceInternal(SELECT_UD_AGGREGATE)) + addFunction(UDAggregate.fromSchema(row)); } public static ColumnSpecification makeArgSpec(String receiverKs, String receiverCf, Function fun, int i) @@ -268,7 +271,7 @@ private static String toString(List funs) } // This is *not* thread safe but is only called in DefsTables that is synchronized. - public static void addFunction(UDFunction fun) + public static void addFunction(AbstractFunction fun) { // We shouldn't get there unless that function don't exist assert find(fun.name(), fun.argTypes()) == null; @@ -284,12 +287,21 @@ public static void removeFunction(FunctionName name, List> argsT } // Same remarks than for addFunction - public static void replaceFunction(UDFunction fun) + public static void replaceFunction(AbstractFunction fun) { removeFunction(fun.name(), fun.argTypes()); addFunction(fun); } + public static List getReferencesTo(Function old) + { + List references = new ArrayList<>(); + for (Function function : declared.values()) + if (function.hasReferenceTo(old)) + references.add(function); + return references; + } + public static Collection all() { return declared.values(); @@ -316,6 +328,7 @@ public void onCreateKeyspace(String ksName) { } public void onCreateColumnFamily(String ksName, String cfName) { } public void onCreateUserType(String ksName, String typeName) { } public void onCreateFunction(String ksName, String functionName) { } + public void onCreateAggregate(String ksName, String aggregateName) { } public void onUpdateKeyspace(String ksName) { } public void onUpdateColumnFamily(String ksName, String cfName) { } @@ -325,11 +338,12 @@ public void onUpdateUserType(String ksName, String typeName) { ((UDFunction)function).userTypeUpdated(ksName, typeName); } public void onUpdateFunction(String ksName, String functionName) { } + public void onUpdateAggregate(String ksName, String aggregateName) { } public void onDropKeyspace(String ksName) { } public void onDropColumnFamily(String ksName, String cfName) { } public void onDropUserType(String ksName, String typeName) { } public void onDropFunction(String ksName, String functionName) { } - + public void onDropAggregate(String ksName, String aggregateName) { } } } diff --git a/src/java/org/apache/cassandra/cql3/functions/JavaSourceUDFFactory.java b/src/java/org/apache/cassandra/cql3/functions/JavaSourceUDFFactory.java index 560f0779232b..5b1f5bd4dafb 100644 --- a/src/java/org/apache/cassandra/cql3/functions/JavaSourceUDFFactory.java +++ b/src/java/org/apache/cassandra/cql3/functions/JavaSourceUDFFactory.java @@ -57,11 +57,11 @@ static UDFunction buildUDF(FunctionName name, throws InvalidRequestException { // argDataTypes is just the C* internal argTypes converted to the Java Driver DataType - DataType[] argDataTypes = UDFunction.driverTypes(argTypes); + DataType[] argDataTypes = UDHelper.driverTypes(argTypes); // returnDataType is just the C* internal returnType converted to the Java Driver DataType - DataType returnDataType = UDFunction.driverType(returnType); + DataType returnDataType = UDHelper.driverType(returnType); // javaParamTypes is just the Java representation for argTypes resp. argDataTypes - Class[] javaParamTypes = UDFunction.javaTypes(argDataTypes); + Class[] javaParamTypes = UDHelper.javaTypes(argDataTypes); // javaReturnType is just the Java representation for returnType resp. returnDataType Class javaReturnType = returnDataType.asJavaClass(); diff --git a/src/java/org/apache/cassandra/cql3/functions/UDAggregate.java b/src/java/org/apache/cassandra/cql3/functions/UDAggregate.java new file mode 100644 index 000000000000..f2592650f6ef --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/functions/UDAggregate.java @@ -0,0 +1,280 @@ +/* + * 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.cql3.functions; + +import java.nio.ByteBuffer; +import java.util.*; + +import com.google.common.base.Objects; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.cassandra.cql3.*; +import org.apache.cassandra.db.*; +import org.apache.cassandra.db.composites.Composite; +import org.apache.cassandra.db.marshal.AbstractType; +import org.apache.cassandra.db.marshal.TypeParser; +import org.apache.cassandra.db.marshal.UTF8Type; +import org.apache.cassandra.exceptions.*; + +/** + * Base class for user-defined-aggregates. + */ +public class UDAggregate extends AbstractFunction implements AggregateFunction +{ + protected static final Logger logger = LoggerFactory.getLogger(UDAggregate.class); + + protected final AbstractType stateType; + protected final ByteBuffer initcond; + private final ScalarFunction stateFunction; + private final ScalarFunction finalFunction; + + public UDAggregate(FunctionName name, + List> argTypes, + AbstractType returnType, + ScalarFunction stateFunc, + ScalarFunction finalFunc, + ByteBuffer initcond) + { + super(name, argTypes, returnType); + this.stateFunction = stateFunc; + this.finalFunction = finalFunc; + this.stateType = stateFunc != null ? stateFunc.returnType() : null; + this.initcond = initcond; + } + + public boolean hasReferenceTo(Function function) + { + return stateFunction == function || finalFunction == function; + } + + public boolean usesFunction(String ksName, String functionName) + { + return super.usesFunction(ksName, functionName) + || stateFunction != null && stateFunction.name().keyspace.equals(ksName) && stateFunction.name().name.equals(functionName) + || finalFunction != null && finalFunction.name().keyspace.equals(ksName) && finalFunction.name().name.equals(functionName); + } + + public boolean isAggregate() + { + return true; + } + + public boolean isPure() + { + return false; + } + + public boolean isNative() + { + return false; + } + + public Aggregate newAggregate() throws InvalidRequestException + { + return new Aggregate() + { + private ByteBuffer state; + { + reset(); + } + + public void addInput(int protocolVersion, List values) throws InvalidRequestException + { + List copy = new ArrayList<>(values.size() + 1); + copy.add(state); + copy.addAll(values); + state = stateFunction.execute(protocolVersion, copy); + } + + public ByteBuffer compute(int protocolVersion) throws InvalidRequestException + { + if (finalFunction == null) + return state; + return finalFunction.execute(protocolVersion, Collections.singletonList(state)); + } + + public void reset() + { + state = initcond != null ? initcond.duplicate() : null; + } + }; + } + + private static ScalarFunction resolveScalar(FunctionName aName, FunctionName fName, List> argTypes) throws InvalidRequestException + { + Function func = Functions.find(fName, argTypes); + if (func == null) + throw new InvalidRequestException(String.format("Referenced state function '%s %s' for aggregate '%s' does not exist", + fName, Arrays.toString(UDHelper.driverTypes(argTypes)), aName)); + if (!(func instanceof ScalarFunction)) + throw new InvalidRequestException(String.format("Referenced state function '%s %s' for aggregate '%s' is not a scalar function", + fName, Arrays.toString(UDHelper.driverTypes(argTypes)), aName)); + return (ScalarFunction) func; + } + + private static Mutation makeSchemaMutation(FunctionName name) + { + UTF8Type kv = (UTF8Type)SystemKeyspace.SchemaAggregatesTable.getKeyValidator(); + return new Mutation(SystemKeyspace.NAME, kv.decompose(name.keyspace)); + } + + public Mutation toSchemaDrop(long timestamp) + { + Mutation mutation = makeSchemaMutation(name); + ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SCHEMA_AGGREGATES_TABLE); + + Composite prefix = SystemKeyspace.SchemaAggregatesTable.comparator.make(name.name, UDHelper.computeSignature(argTypes)); + int ldt = (int) (System.currentTimeMillis() / 1000); + cf.addAtom(new RangeTombstone(prefix, prefix.end(), timestamp, ldt)); + + return mutation; + } + + public static Map fromSchema(Row row) + { + UntypedResultSet results = QueryProcessor.resultify("SELECT * FROM system." + SystemKeyspace.SCHEMA_AGGREGATES_TABLE, row); + Map udfs = new HashMap<>(results.size()); + for (UntypedResultSet.Row result : results) + udfs.put(SystemKeyspace.SchemaAggregatesTable.comparator.make(result.getString("aggregate_name"), result.getBlob("signature")), + fromSchema(result)); + return udfs; + } + + public Mutation toSchemaUpdate(long timestamp) + { + Mutation mutation = makeSchemaMutation(name); + ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SCHEMA_AGGREGATES_TABLE); + + Composite prefix = SystemKeyspace.SchemaAggregatesTable.comparator.make(name.name, UDHelper.computeSignature(argTypes)); + CFRowAdder adder = new CFRowAdder(cf, prefix, timestamp); + + adder.resetCollection("argument_types"); + adder.add("return_type", returnType.toString()); + adder.add("state_func", stateFunction.name().name); + if (stateType != null) + adder.add("state_type", stateType.toString()); + if (finalFunction != null) + adder.add("final_func", finalFunction.name().name); + if (initcond != null) + adder.add("initcond", initcond); + + for (AbstractType argType : argTypes) + adder.addListEntry("argument_types", argType.toString()); + + return mutation; + } + + public static UDAggregate fromSchema(UntypedResultSet.Row row) + { + String ksName = row.getString("keyspace_name"); + String functionName = row.getString("aggregate_name"); + FunctionName name = new FunctionName(ksName, functionName); + + List types = row.getList("argument_types", UTF8Type.instance); + + List> argTypes; + if (types == null) + { + argTypes = Collections.emptyList(); + } + else + { + argTypes = new ArrayList<>(types.size()); + for (String type : types) + argTypes.add(parseType(type)); + } + + AbstractType returnType = parseType(row.getString("return_type")); + + FunctionName stateFunc = new FunctionName(ksName, row.getString("state_func")); + FunctionName finalFunc = row.has("final_func") ? new FunctionName(ksName, row.getString("final_func")) : null; + AbstractType stateType = row.has("state_type") ? parseType(row.getString("state_type")) : null; + ByteBuffer initcond = row.has("initcond") ? row.getBytes("initcond") : null; + + try + { + return create(name, argTypes, returnType, stateFunc, finalFunc, stateType, initcond); + } + catch (InvalidRequestException reason) + { + return createBroken(name, argTypes, returnType, initcond, reason); + } + } + + private static UDAggregate createBroken(FunctionName name, List> argTypes, AbstractType returnType, + ByteBuffer initcond, final InvalidRequestException reason) + { + return new UDAggregate(name, argTypes, returnType, null, null, initcond) { + public Aggregate newAggregate() throws InvalidRequestException + { + throw new InvalidRequestException(String.format("Aggregate '%s' exists but hasn't been loaded successfully for the following reason: %s. " + + "Please see the server log for more details", this, reason.getMessage())); + } + }; + } + + private static UDAggregate create(FunctionName name, List> argTypes, AbstractType returnType, + FunctionName stateFunc, FunctionName finalFunc, AbstractType stateType, ByteBuffer initcond) + throws InvalidRequestException + { + List> stateTypes = new ArrayList<>(argTypes.size() + 1); + stateTypes.add(stateType); + stateTypes.addAll(argTypes); + List> finalTypes = Collections.>singletonList(stateType); + return new UDAggregate(name, argTypes, returnType, + resolveScalar(name, stateFunc, stateTypes), + finalFunc != null ? resolveScalar(name, finalFunc, finalTypes) : null, + initcond); + } + + private static AbstractType parseType(String str) + { + // We only use this when reading the schema where we shouldn't get an error + try + { + return TypeParser.parse(str); + } + catch (SyntaxException | ConfigurationException e) + { + throw new RuntimeException(e); + } + } + + @Override + public boolean equals(Object o) + { + if (!(o instanceof UDAggregate)) + return false; + + UDAggregate that = (UDAggregate) o; + return Objects.equal(this.name, that.name) + && Functions.typeEquals(this.argTypes, that.argTypes) + && Functions.typeEquals(this.returnType, that.returnType) + && Objects.equal(this.stateFunction, that.stateFunction) + && Objects.equal(this.finalFunction, that.finalFunction) + && Objects.equal(this.stateType, that.stateType) + && Objects.equal(this.initcond, that.initcond); + } + + @Override + public int hashCode() + { + return Objects.hashCode(name, argTypes, returnType, stateFunction, finalFunction, stateType, initcond); + } +} diff --git a/src/java/org/apache/cassandra/cql3/functions/UDFunction.java b/src/java/org/apache/cassandra/cql3/functions/UDFunction.java index 973c70ad3f6c..8b42e51cf2d5 100644 --- a/src/java/org/apache/cassandra/cql3/functions/UDFunction.java +++ b/src/java/org/apache/cassandra/cql3/functions/UDFunction.java @@ -17,12 +17,7 @@ */ package org.apache.cassandra.cql3.functions; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.reflect.Method; import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; import java.util.*; import com.google.common.base.Objects; @@ -43,7 +38,6 @@ import org.apache.cassandra.exceptions.*; import org.apache.cassandra.service.MigrationManager; import org.apache.cassandra.utils.ByteBufferUtil; -import org.apache.cassandra.utils.FBUtilities; /** * Base class for User Defined Functions. @@ -52,80 +46,10 @@ public abstract class UDFunction extends AbstractFunction implements ScalarFunct { protected static final Logger logger = LoggerFactory.getLogger(UDFunction.class); - // TODO make these c'tors and methods public in Java-Driver - see https://datastax-oss.atlassian.net/browse/JAVA-502 - static final MethodHandle methodParseOne; - static - { - try - { - Class cls = Class.forName("com.datastax.driver.core.CassandraTypeParser"); - Method m = cls.getDeclaredMethod("parseOne", String.class); - m.setAccessible(true); - methodParseOne = MethodHandles.lookup().unreflect(m); - } - catch (Exception e) - { - throw new RuntimeException(e); - } - } - - /** - * Construct an array containing the Java classes for the given Java Driver {@link com.datastax.driver.core.DataType}s. - * - * @param dataTypes array with UDF argument types - * @return array of same size with UDF arguments - */ - public static Class[] javaTypes(DataType[] dataTypes) - { - Class paramTypes[] = new Class[dataTypes.length]; - for (int i = 0; i < paramTypes.length; i++) - paramTypes[i] = dataTypes[i].asJavaClass(); - return paramTypes; - } - - /** - * Construct an array containing the Java Driver {@link com.datastax.driver.core.DataType}s for the - * C* internal types. - * - * @param abstractTypes list with UDF argument types - * @return array with argument types as {@link com.datastax.driver.core.DataType} - */ - public static DataType[] driverTypes(List> abstractTypes) - { - DataType[] argDataTypes = new DataType[abstractTypes.size()]; - for (int i = 0; i < argDataTypes.length; i++) - argDataTypes[i] = driverType(abstractTypes.get(i)); - return argDataTypes; - } - - /** - * Returns the Java Driver {@link com.datastax.driver.core.DataType} for the C* internal type. - */ - public static DataType driverType(AbstractType abstractType) - { - CQL3Type cqlType = abstractType.asCQL3Type(); - try - { - return (DataType) methodParseOne.invoke(cqlType.getType().toString()); - } - catch (RuntimeException | Error e) - { - // immediately rethrow these... - throw e; - } - catch (Throwable e) - { - throw new RuntimeException("cannot parse driver type " + cqlType.getType().toString(), e); - } - } - - // instance vars - protected final List argNames; - protected final String language; protected final String body; - protected final boolean deterministic; + private final boolean deterministic; protected final DataType[] argDataTypes; protected final DataType returnDataType; @@ -138,8 +62,8 @@ protected UDFunction(FunctionName name, String body, boolean deterministic) { - this(name, argNames, argTypes, driverTypes(argTypes), returnType, - driverType(returnType), language, body, deterministic); + this(name, argNames, argTypes, UDHelper.driverTypes(argTypes), returnType, + UDHelper.driverType(returnType), language, body, deterministic); } protected UDFunction(FunctionName name, @@ -151,7 +75,7 @@ protected UDFunction(FunctionName name, String language, String body, boolean deterministic) - { + { super(name, argTypes, returnType); assert new HashSet<>(argNames).size() == argNames.size() : "duplicate argument names"; this.argNames = argNames; @@ -162,36 +86,6 @@ protected UDFunction(FunctionName name, this.returnDataType = returnDataType; } - /** - * Used by UDF implementations (both Java code generated by {@link org.apache.cassandra.cql3.functions.JavaSourceUDFFactory} - * and script executor {@link org.apache.cassandra.cql3.functions.ScriptBasedUDF}) to convert the C* - * serialized representation to the Java object representation. - * - * @param protocolVersion the native protocol version used for serialization - * @param argIndex index of the UDF input argument - */ - protected Object compose(int protocolVersion, int argIndex, ByteBuffer value) - { - return value == null ? null : argDataTypes[argIndex].deserialize(value, ProtocolVersion.fromInt(protocolVersion)); - } - - /** - * Used by UDF implementations (both Java code generated by {@link org.apache.cassandra.cql3.functions.JavaSourceUDFFactory} - * and script executor {@link org.apache.cassandra.cql3.functions.ScriptBasedUDF}) to convert the Java - * object representation for the return value to the C* serialized representation. - * - * @param protocolVersion the native protocol version used for serialization - */ - protected ByteBuffer decompose(int protocolVersion, Object value) - { - return value == null ? null : returnDataType.serialize(value, ProtocolVersion.fromInt(protocolVersion)); - } - - public boolean isAggregate() - { - return false; - } - public static UDFunction create(FunctionName name, List argNames, List> argTypes, @@ -218,12 +112,12 @@ public static UDFunction create(FunctionName name, * than saying that the function doesn't exist) */ private static UDFunction createBrokenFunction(FunctionName name, - List argNames, - List> argTypes, - AbstractType returnType, - String language, - String body, - final InvalidRequestException reason) + List argNames, + List> argTypes, + AbstractType returnType, + String language, + String body, + final InvalidRequestException reason) { return new UDFunction(name, argNames, argTypes, returnType, language, body, true) { @@ -235,18 +129,9 @@ public ByteBuffer execute(int protocolVersion, List parameters) thro }; } - // We allow method overloads, so a function is not uniquely identified by its name only, but - // also by its argument types. To distinguish overloads of given function name in the schema - // we use a "signature" which is just a SHA-1 of it's argument types (we could replace that by - // using a "signature" UDT that would be comprised of the function name and argument types, - // which we could then use as clustering column. But as we haven't yet used UDT in system tables, - // We'll left that decision to #6717). - private static ByteBuffer computeSignature(List> argTypes) + public boolean isAggregate() { - MessageDigest digest = FBUtilities.newMessageDigest("SHA-1"); - for (AbstractType type : argTypes) - digest.update(type.asCQL3Type().toString().getBytes(StandardCharsets.UTF_8)); - return ByteBuffer.wrap(digest.digest()); + return false; } public boolean isPure() @@ -259,6 +144,31 @@ public boolean isNative() return false; } + /** + * Used by UDF implementations (both Java code generated by {@link org.apache.cassandra.cql3.functions.JavaSourceUDFFactory} + * and script executor {@link org.apache.cassandra.cql3.functions.ScriptBasedUDF}) to convert the C* + * serialized representation to the Java object representation. + * + * @param protocolVersion the native protocol version used for serialization + * @param argIndex index of the UDF input argument + */ + protected Object compose(int protocolVersion, int argIndex, ByteBuffer value) + { + return value == null ? null : argDataTypes[argIndex].deserialize(value, ProtocolVersion.fromInt(protocolVersion)); + } + + /** + * Used by UDF implementations (both Java code generated by {@link org.apache.cassandra.cql3.functions.JavaSourceUDFFactory} + * and script executor {@link org.apache.cassandra.cql3.functions.ScriptBasedUDF}) to convert the Java + * object representation for the return value to the C* serialized representation. + * + * @param protocolVersion the native protocol version used for serialization + */ + protected ByteBuffer decompose(int protocolVersion, Object value) + { + return value == null ? null : returnDataType.serialize(value, ProtocolVersion.fromInt(protocolVersion)); + } + private static Mutation makeSchemaMutation(FunctionName name) { UTF8Type kv = (UTF8Type)SystemKeyspace.SchemaFunctionsTable.getKeyValidator(); @@ -270,19 +180,29 @@ public Mutation toSchemaDrop(long timestamp) Mutation mutation = makeSchemaMutation(name); ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SCHEMA_FUNCTIONS_TABLE); - Composite prefix = SystemKeyspace.SchemaFunctionsTable.comparator.make(name.name, computeSignature(argTypes)); + Composite prefix = SystemKeyspace.SchemaFunctionsTable.comparator.make(name.name, UDHelper.computeSignature(argTypes)); int ldt = (int) (System.currentTimeMillis() / 1000); cf.addAtom(new RangeTombstone(prefix, prefix.end(), timestamp, ldt)); return mutation; } + public static Map fromSchema(Row row) + { + UntypedResultSet results = QueryProcessor.resultify("SELECT * FROM system." + SystemKeyspace.SCHEMA_FUNCTIONS_TABLE, row); + Map udfs = new HashMap<>(results.size()); + for (UntypedResultSet.Row result : results) + udfs.put(SystemKeyspace.SchemaFunctionsTable.comparator.make(result.getString("function_name"), result.getBlob("signature")), + fromSchema(result)); + return udfs; + } + public Mutation toSchemaUpdate(long timestamp) { Mutation mutation = makeSchemaMutation(name); ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SCHEMA_FUNCTIONS_TABLE); - Composite prefix = SystemKeyspace.SchemaFunctionsTable.comparator.make(name.name, computeSignature(argTypes)); + Composite prefix = SystemKeyspace.SchemaFunctionsTable.comparator.make(name.name, UDHelper.computeSignature(argTypes)); CFRowAdder adder = new CFRowAdder(cf, prefix, timestamp); adder.resetCollection("argument_names"); @@ -360,15 +280,6 @@ private static AbstractType parseType(String str) } } - public static Map fromSchema(Row row) - { - UntypedResultSet results = QueryProcessor.resultify("SELECT * FROM system." + SystemKeyspace.SCHEMA_FUNCTIONS_TABLE, row); - Map udfs = new HashMap<>(results.size()); - for (UntypedResultSet.Row result : results) - udfs.put(SystemKeyspace.SchemaFunctionsTable.comparator.make(result.getString("function_name"), result.getBlob("signature")), fromSchema(result)); - return udfs; - } - @Override public boolean equals(Object o) { @@ -377,9 +288,9 @@ public boolean equals(Object o) UDFunction that = (UDFunction)o; return Objects.equal(this.name, that.name) - && Objects.equal(this.argNames, that.argNames) && Functions.typeEquals(this.argTypes, that.argTypes) && Functions.typeEquals(this.returnType, that.returnType) + && Objects.equal(this.argNames, that.argNames) && Objects.equal(this.language, that.language) && Objects.equal(this.body, that.body) && Objects.equal(this.deterministic, that.deterministic); @@ -388,7 +299,7 @@ public boolean equals(Object o) @Override public int hashCode() { - return Objects.hashCode(name, argNames, argTypes, returnType, language, body, deterministic); + return Objects.hashCode(name, argTypes, returnType, argNames, language, body, deterministic); } public void userTypeUpdated(String ksName, String typeName) @@ -408,7 +319,7 @@ public void userTypeUpdated(String ksName, String typeName) org.apache.cassandra.db.marshal.UserType ut = ksm.userTypes.getType(ByteBufferUtil.bytes(typeName)); - DataType newUserType = driverType(ut); + DataType newUserType = UDHelper.driverType(ut); argDataTypes[i] = newUserType; argTypes.set(i, ut); diff --git a/src/java/org/apache/cassandra/cql3/functions/UDHelper.java b/src/java/org/apache/cassandra/cql3/functions/UDHelper.java new file mode 100644 index 000000000000..2a17c75a63bb --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/functions/UDHelper.java @@ -0,0 +1,123 @@ +/* + * 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.cql3.functions; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.reflect.Method; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.util.*; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.datastax.driver.core.DataType; +import org.apache.cassandra.cql3.*; +import org.apache.cassandra.db.marshal.AbstractType; +import org.apache.cassandra.utils.FBUtilities; + +/** + * Helper class for User Defined Functions + Aggregates. + */ +final class UDHelper +{ + protected static final Logger logger = LoggerFactory.getLogger(UDHelper.class); + + // TODO make these c'tors and methods public in Java-Driver - see https://datastax-oss.atlassian.net/browse/JAVA-502 + static final MethodHandle methodParseOne; + static + { + try + { + Class cls = Class.forName("com.datastax.driver.core.CassandraTypeParser"); + Method m = cls.getDeclaredMethod("parseOne", String.class); + m.setAccessible(true); + methodParseOne = MethodHandles.lookup().unreflect(m); + } + catch (Exception e) + { + throw new RuntimeException(e); + } + } + + /** + * Construct an array containing the Java classes for the given Java Driver {@link com.datastax.driver.core.DataType}s. + * + * @param dataTypes array with UDF argument types + * @return array of same size with UDF arguments + */ + public static Class[] javaTypes(DataType[] dataTypes) + { + Class paramTypes[] = new Class[dataTypes.length]; + for (int i = 0; i < paramTypes.length; i++) + paramTypes[i] = dataTypes[i].asJavaClass(); + return paramTypes; + } + + /** + * Construct an array containing the Java Driver {@link com.datastax.driver.core.DataType}s for the + * C* internal types. + * + * @param abstractTypes list with UDF argument types + * @return array with argument types as {@link com.datastax.driver.core.DataType} + */ + public static DataType[] driverTypes(List> abstractTypes) + { + DataType[] argDataTypes = new DataType[abstractTypes.size()]; + for (int i = 0; i < argDataTypes.length; i++) + argDataTypes[i] = driverType(abstractTypes.get(i)); + return argDataTypes; + } + + /** + * Returns the Java Driver {@link com.datastax.driver.core.DataType} for the C* internal type. + */ + public static DataType driverType(AbstractType abstractType) + { + CQL3Type cqlType = abstractType.asCQL3Type(); + try + { + return (DataType) methodParseOne.invoke(cqlType.getType().toString()); + } + catch (RuntimeException | Error e) + { + // immediately rethrow these... + throw e; + } + catch (Throwable e) + { + throw new RuntimeException("cannot parse driver type " + cqlType.getType().toString(), e); + } + } + + // We allow method overloads, so a function is not uniquely identified by its name only, but + // also by its argument types. To distinguish overloads of given function name in the schema + // we use a "signature" which is just a SHA-1 of it's argument types (we could replace that by + // using a "signature" UDT that would be comprised of the function name and argument types, + // which we could then use as clustering column. But as we haven't yet used UDT in system tables, + // We'll left that decision to #6717). + protected static ByteBuffer computeSignature(List> argTypes) + { + MessageDigest digest = FBUtilities.newMessageDigest("SHA-1"); + for (AbstractType type : argTypes) + digest.update(type.asCQL3Type().toString().getBytes(StandardCharsets.UTF_8)); + return ByteBuffer.wrap(digest.digest()); + } +} diff --git a/src/java/org/apache/cassandra/cql3/selection/AbstractFunctionSelector.java b/src/java/org/apache/cassandra/cql3/selection/AbstractFunctionSelector.java index 3778d4194adc..2bf169d37918 100644 --- a/src/java/org/apache/cassandra/cql3/selection/AbstractFunctionSelector.java +++ b/src/java/org/apache/cassandra/cql3/selection/AbstractFunctionSelector.java @@ -69,10 +69,10 @@ protected AbstractType getReturnType() public boolean usesFunction(String ksName, String functionName) { - return fun.name().keyspace.equals(ksName) && fun.name().name.equals(functionName); + return fun.usesFunction(ksName, functionName); } - public Selector newInstance() + public Selector newInstance() throws InvalidRequestException { return fun.isAggregate() ? new AggregateFunctionSelector(fun, factories.newInstances()) : new ScalarFunctionSelector(fun, factories.newInstances()); diff --git a/src/java/org/apache/cassandra/cql3/selection/AggregateFunctionSelector.java b/src/java/org/apache/cassandra/cql3/selection/AggregateFunctionSelector.java index 7702796ee610..27a8294bfd6d 100644 --- a/src/java/org/apache/cassandra/cql3/selection/AggregateFunctionSelector.java +++ b/src/java/org/apache/cassandra/cql3/selection/AggregateFunctionSelector.java @@ -44,12 +44,12 @@ public void addInput(int protocolVersion, ResultSetBuilder rs) throws InvalidReq args.set(i, s.getOutput(protocolVersion)); s.reset(); } - this.aggregate.addInput(args); + this.aggregate.addInput(protocolVersion, args); } public ByteBuffer getOutput(int protocolVersion) throws InvalidRequestException { - return aggregate.compute(); + return aggregate.compute(protocolVersion); } public void reset() @@ -57,7 +57,7 @@ public void reset() aggregate.reset(); } - AggregateFunctionSelector(Function fun, List argSelectors) + AggregateFunctionSelector(Function fun, List argSelectors) throws InvalidRequestException { super((AggregateFunction) fun, argSelectors); diff --git a/src/java/org/apache/cassandra/cql3/selection/FieldSelector.java b/src/java/org/apache/cassandra/cql3/selection/FieldSelector.java index d69559870a18..76dbb22f58d8 100644 --- a/src/java/org/apache/cassandra/cql3/selection/FieldSelector.java +++ b/src/java/org/apache/cassandra/cql3/selection/FieldSelector.java @@ -47,7 +47,7 @@ protected AbstractType getReturnType() return type.fieldType(field); } - public Selector newInstance() + public Selector newInstance() throws InvalidRequestException { return new FieldSelector(type, field, factory.newInstance()); } diff --git a/src/java/org/apache/cassandra/cql3/selection/Selection.java b/src/java/org/apache/cassandra/cql3/selection/Selection.java index e44a39f1517d..58e994a82a62 100644 --- a/src/java/org/apache/cassandra/cql3/selection/Selection.java +++ b/src/java/org/apache/cassandra/cql3/selection/Selection.java @@ -213,7 +213,7 @@ private static List collectMetadata(CFMetaData cfm, return metadata; } - protected abstract Selectors newSelectors(); + protected abstract Selectors newSelectors() throws InvalidRequestException; /** * @return the list of CQL3 columns value this SelectionClause needs. @@ -223,7 +223,7 @@ public Collection getColumns() return columns; } - public ResultSetBuilder resultSetBuilder(long now) + public ResultSetBuilder resultSetBuilder(long now) throws InvalidRequestException { return new ResultSetBuilder(now); } @@ -273,7 +273,7 @@ public class ResultSetBuilder final int[] ttls; final long now; - private ResultSetBuilder(long now) + private ResultSetBuilder(long now) throws InvalidRequestException { this.resultSet = new ResultSet(getResultMetadata().copy(), new ArrayList>()); this.selectors = newSelectors(); @@ -468,7 +468,7 @@ public boolean isAggregate() return factories.containsOnlyAggregateFunctions(); } - protected Selectors newSelectors() + protected Selectors newSelectors() throws InvalidRequestException { return new Selectors() { diff --git a/src/java/org/apache/cassandra/cql3/selection/Selector.java b/src/java/org/apache/cassandra/cql3/selection/Selector.java index 0c1933f57d64..3ed773bd49e4 100644 --- a/src/java/org/apache/cassandra/cql3/selection/Selector.java +++ b/src/java/org/apache/cassandra/cql3/selection/Selector.java @@ -65,7 +65,7 @@ public final ColumnSpecification getColumnSpecification(CFMetaData cfm) * * @return a new Selector instance */ - public abstract Selector newInstance(); + public abstract Selector newInstance() throws InvalidRequestException; /** * Checks if this factory creates selectors instances that creates aggregates. diff --git a/src/java/org/apache/cassandra/cql3/selection/SelectorFactories.java b/src/java/org/apache/cassandra/cql3/selection/SelectorFactories.java index 9f6025c56f34..3afd1ec4b838 100644 --- a/src/java/org/apache/cassandra/cql3/selection/SelectorFactories.java +++ b/src/java/org/apache/cassandra/cql3/selection/SelectorFactories.java @@ -155,7 +155,7 @@ public boolean containsTTLSelectorFactory() * Creates a list of new Selector instances. * @return a list of new Selector instances. */ - public List newInstances() + public List newInstances() throws InvalidRequestException { List selectors = new ArrayList<>(factories.size()); for (Selector.Factory factory : factories) diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateAggregateStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateAggregateStatement.java new file mode 100644 index 000000000000..9816e5848ce5 --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/statements/CreateAggregateStatement.java @@ -0,0 +1,194 @@ +/* + * 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.cql3.statements; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.apache.cassandra.auth.Permission; +import org.apache.cassandra.config.Schema; +import org.apache.cassandra.cql3.CQL3Type; +import org.apache.cassandra.cql3.ColumnIdentifier; +import org.apache.cassandra.cql3.ColumnSpecification; +import org.apache.cassandra.cql3.QueryOptions; +import org.apache.cassandra.cql3.Term; +import org.apache.cassandra.cql3.functions.*; +import org.apache.cassandra.db.marshal.AbstractType; +import org.apache.cassandra.exceptions.InvalidRequestException; +import org.apache.cassandra.exceptions.RequestValidationException; +import org.apache.cassandra.exceptions.UnauthorizedException; +import org.apache.cassandra.service.ClientState; +import org.apache.cassandra.service.MigrationManager; +import org.apache.cassandra.thrift.ThriftValidation; +import org.apache.cassandra.transport.Event; + +/** + * A CREATE AGGREGATE statement parsed from a CQL query. + */ +public final class CreateAggregateStatement extends SchemaAlteringStatement +{ + private final boolean orReplace; + private final boolean ifNotExists; + private FunctionName functionName; + private String stateFunc; + private String finalFunc; + private final CQL3Type.Raw stateTypeRaw; + + private final List argRawTypes; + private final Term.Raw ival; + + public CreateAggregateStatement(FunctionName functionName, + List argRawTypes, + String stateFunc, + CQL3Type.Raw stateType, + String finalFunc, + Term.Raw ival, + boolean orReplace, + boolean ifNotExists) + { + this.functionName = functionName; + this.argRawTypes = argRawTypes; + this.stateFunc = stateFunc; + this.finalFunc = finalFunc; + this.stateTypeRaw = stateType; + this.ival = ival; + this.orReplace = orReplace; + this.ifNotExists = ifNotExists; + } + + public void prepareKeyspace(ClientState state) throws InvalidRequestException + { + if (!functionName.hasKeyspace() && state.getRawKeyspace() != null) + functionName = new FunctionName(state.getKeyspace(), functionName.name); + + if (!functionName.hasKeyspace()) + throw new InvalidRequestException("Functions must be fully qualified with a keyspace name if a keyspace is not set for the session"); + + ThriftValidation.validateKeyspaceNotSystem(functionName.keyspace); + } + + public void checkAccess(ClientState state) throws UnauthorizedException, InvalidRequestException + { + // TODO CASSANDRA-7557 (function DDL permission) + + state.hasKeyspaceAccess(functionName.keyspace, Permission.CREATE); + } + + public void validate(ClientState state) throws InvalidRequestException + { + if (ifNotExists && orReplace) + throw new InvalidRequestException("Cannot use both 'OR REPLACE' and 'IF NOT EXISTS' directives"); + + if (Schema.instance.getKSMetaData(functionName.keyspace) == null) + throw new InvalidRequestException(String.format("Cannot add aggregate '%s' to non existing keyspace '%s'.", functionName.name, functionName.keyspace)); + } + + public Event.SchemaChange changeEvent() + { + return null; + } + + public boolean announceMigration(boolean isLocalOnly) throws RequestValidationException + { + List> argTypes = new ArrayList<>(argRawTypes.size()); + for (CQL3Type.Raw rawType : argRawTypes) + argTypes.add(rawType.prepare(functionName.keyspace).getType()); + + FunctionName stateFuncName = new FunctionName(functionName.keyspace, stateFunc); + FunctionName finalFuncName; + + ScalarFunction fFinal = null; + AbstractType stateType = stateTypeRaw.prepare(functionName.keyspace).getType(); + Function f = Functions.find(stateFuncName, stateArguments(stateType, argTypes)); + if (!(f instanceof ScalarFunction)) + throw new InvalidRequestException("State function " + stateFuncSig(stateFuncName, stateTypeRaw, argRawTypes) + " does not exist or is not a scalar function"); + ScalarFunction fState = (ScalarFunction)f; + + AbstractType returnType; + if (finalFunc != null) + { + finalFuncName = new FunctionName(functionName.keyspace, finalFunc); + f = Functions.find(finalFuncName, Collections.>singletonList(stateType)); + if (!(f instanceof ScalarFunction)) + throw new InvalidRequestException("Final function " + finalFuncName + "(" + stateTypeRaw + ") does not exist"); + fFinal = (ScalarFunction) f; + returnType = fFinal.returnType(); + } + else + { + returnType = fState.returnType(); + if (!returnType.equals(stateType)) + throw new InvalidRequestException("State function " + stateFuncSig(stateFuncName, stateTypeRaw, argRawTypes) + " return type must be the same as the first argument type (if no final function is used)"); + } + + Function old = Functions.find(functionName, argTypes); + if (old != null) + { + if (ifNotExists) + return false; + if (!orReplace) + throw new InvalidRequestException(String.format("Function %s already exists", old)); + if (!(old instanceof AggregateFunction)) + throw new InvalidRequestException(String.format("Aggregate %s can only replace an aggregate", old)); + + // Means we're replacing the function. We still need to validate that 1) it's not a native function and 2) that the return type + // matches (or that could break existing code badly) + if (old.isNative()) + throw new InvalidRequestException(String.format("Cannot replace native aggregate %s", old)); + if (!old.returnType().isValueCompatibleWith(returnType)) + throw new InvalidRequestException(String.format("Cannot replace aggregate %s, the new return type %s is not compatible with the return type %s of existing function", + functionName, returnType.asCQL3Type(), old.returnType().asCQL3Type())); + } + + ByteBuffer initcond = null; + if (ival != null) + { + ColumnSpecification receiver = new ColumnSpecification(functionName.keyspace, "--dummy--", new ColumnIdentifier("(aggregate_initcond)", true), stateType); + initcond = ival.prepare(functionName.keyspace, receiver).bindAndGet(QueryOptions.DEFAULT); + } + + UDAggregate udAggregate = new UDAggregate(functionName, argTypes, returnType, + fState, + fFinal, + initcond); + + MigrationManager.announceNewAggregate(udAggregate, isLocalOnly); + + return true; + } + + private String stateFuncSig(FunctionName stateFuncName, CQL3Type.Raw stateTypeRaw, List argRawTypes) + { + StringBuilder sb = new StringBuilder(); + sb.append(stateFuncName.toString()).append('(').append(stateTypeRaw); + for (CQL3Type.Raw argRawType : argRawTypes) + sb.append(", ").append(argRawType); + sb.append(')'); + return sb.toString(); + } + + private List> stateArguments(AbstractType stateType, List> argTypes) + { + List> r = new ArrayList<>(argTypes.size() + 1); + r.add(stateType); + r.addAll(argTypes); + return r; + } +} diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java index 8d8c27adc06d..dbdecf91f22f 100644 --- a/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java @@ -50,7 +50,6 @@ public final class CreateFunctionStatement extends SchemaAlteringStatement private final List argNames; private final List argRawTypes; private final CQL3Type.Raw rawReturnType; - private String currentKeyspace; public CreateFunctionStatement(FunctionName functionName, String language, @@ -75,13 +74,11 @@ public CreateFunctionStatement(FunctionName functionName, public void prepareKeyspace(ClientState state) throws InvalidRequestException { - currentKeyspace = state.getRawKeyspace(); - - if (!functionName.hasKeyspace() && currentKeyspace != null) - functionName = new FunctionName(currentKeyspace, functionName.name); + if (!functionName.hasKeyspace() && state.getRawKeyspace() != null) + functionName = new FunctionName(state.getRawKeyspace(), functionName.name); if (!functionName.hasKeyspace()) - throw new InvalidRequestException("You need to be logged in a keyspace or use a fully qualified function name"); + throw new InvalidRequestException("Functions must be fully qualified with a keyspace name if a keyspace is not set for the session"); ThriftValidation.validateKeyspaceNotSystem(functionName.keyspace); } @@ -126,6 +123,8 @@ public boolean announceMigration(boolean isLocalOnly) throws RequestValidationEx return false; if (!orReplace) throw new InvalidRequestException(String.format("Function %s already exists", old)); + if (!(old instanceof ScalarFunction)) + throw new InvalidRequestException(String.format("Function %s can only replace a function", old)); if (!Functions.typeEquals(old.returnType(), returnType)) throw new InvalidRequestException(String.format("Cannot replace function %s, the new return type %s is not compatible with the return type %s of existing function", diff --git a/src/java/org/apache/cassandra/cql3/statements/DropAggregateStatement.java b/src/java/org/apache/cassandra/cql3/statements/DropAggregateStatement.java new file mode 100644 index 000000000000..118f89d3ee86 --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/statements/DropAggregateStatement.java @@ -0,0 +1,136 @@ +/* + * 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.cql3.statements; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.cassandra.auth.Permission; +import org.apache.cassandra.cql3.CQL3Type; +import org.apache.cassandra.cql3.functions.*; +import org.apache.cassandra.db.marshal.AbstractType; +import org.apache.cassandra.exceptions.InvalidRequestException; +import org.apache.cassandra.exceptions.RequestValidationException; +import org.apache.cassandra.exceptions.UnauthorizedException; +import org.apache.cassandra.service.ClientState; +import org.apache.cassandra.service.MigrationManager; +import org.apache.cassandra.thrift.ThriftValidation; +import org.apache.cassandra.transport.Event; + +/** + * A DROP AGGREGATE statement parsed from a CQL query. + */ +public final class DropAggregateStatement extends SchemaAlteringStatement +{ + private FunctionName functionName; + private final boolean ifExists; + private final List argRawTypes; + private final boolean argsPresent; + + public DropAggregateStatement(FunctionName functionName, + List argRawTypes, + boolean argsPresent, + boolean ifExists) + { + this.functionName = functionName; + this.argRawTypes = argRawTypes; + this.argsPresent = argsPresent; + this.ifExists = ifExists; + } + + public void prepareKeyspace(ClientState state) throws InvalidRequestException + { + if (!functionName.hasKeyspace() && state.getRawKeyspace() != null) + functionName = new FunctionName(state.getKeyspace(), functionName.name); + + if (!functionName.hasKeyspace()) + throw new InvalidRequestException("Functions must be fully qualified with a keyspace name if a keyspace is not set for the session"); + + ThriftValidation.validateKeyspaceNotSystem(functionName.keyspace); + } + + public void checkAccess(ClientState state) throws UnauthorizedException, InvalidRequestException + { + // TODO CASSANDRA-7557 (function DDL permission) + + state.hasKeyspaceAccess(functionName.keyspace, Permission.DROP); + } + + public void validate(ClientState state) throws RequestValidationException + { + } + + public Event.SchemaChange changeEvent() + { + return null; + } + + public boolean announceMigration(boolean isLocalOnly) throws RequestValidationException + { + List olds = Functions.find(functionName); + + if (!argsPresent && olds != null && olds.size() > 1) + throw new InvalidRequestException(String.format("'DROP AGGREGATE %s' matches multiple function definitions; " + + "specify the argument types by issuing a statement like " + + "'DROP AGGREGATE %s (type, type, ...)'. Hint: use cqlsh " + + "'DESCRIBE AGGREGATE %s' command to find all overloads", + functionName, functionName, functionName)); + + List> argTypes = new ArrayList<>(argRawTypes.size()); + for (CQL3Type.Raw rawType : argRawTypes) + argTypes.add(rawType.prepare(functionName.keyspace).getType()); + + Function old; + if (argsPresent) + { + old = Functions.find(functionName, argTypes); + if (old == null || !(old instanceof AggregateFunction)) + { + if (ifExists) + return false; + // just build a nicer error message + StringBuilder sb = new StringBuilder(); + for (CQL3Type.Raw rawType : argRawTypes) + { + if (sb.length() > 0) + sb.append(", "); + sb.append(rawType); + } + throw new InvalidRequestException(String.format("Cannot drop non existing aggregate '%s(%s)'", + functionName, sb)); + } + } + else + { + if (olds == null || olds.isEmpty() || !(olds.get(0) instanceof AggregateFunction)) + { + if (ifExists) + return false; + throw new InvalidRequestException(String.format("Cannot drop non existing aggregate '%s'", functionName)); + } + old = olds.get(0); + } + + if (old.isNative()) + throw new InvalidRequestException(String.format("Cannot drop aggregate '%s' because it is a " + + "native (built-in) function", functionName)); + + MigrationManager.announceAggregateDrop((UDAggregate)old, isLocalOnly); + return true; + } +} diff --git a/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java b/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java index 0ba3721cccf4..394aca0f3011 100644 --- a/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java @@ -60,7 +60,7 @@ public void prepareKeyspace(ClientState state) throws InvalidRequestException functionName = new FunctionName(state.getKeyspace(), functionName.name); if (!functionName.hasKeyspace()) - throw new InvalidRequestException("You need to be logged in a keyspace or use a fully qualified function name"); + throw new InvalidRequestException("Functions must be fully qualified with a keyspace name if a keyspace is not set for the session"); ThriftValidation.validateKeyspaceNotSystem(functionName.keyspace); } @@ -73,11 +73,6 @@ public void checkAccess(ClientState state) throws UnauthorizedException, Invalid state.hasKeyspaceAccess(functionName.keyspace, Permission.DROP); } - /** - * The CqlParser only goes as far as extracting the keyword arguments - * from these statements, so this method is responsible for processing and - * validating. - */ @Override public void validate(ClientState state) { @@ -109,7 +104,7 @@ public boolean announceMigration(boolean isLocalOnly) throws RequestValidationEx if (argsPresent) { old = Functions.find(functionName, argTypes); - if (old == null) + if (old == null || !(old instanceof ScalarFunction)) { if (ifExists) return false; @@ -127,7 +122,7 @@ public boolean announceMigration(boolean isLocalOnly) throws RequestValidationEx } else { - if (olds == null || olds.isEmpty()) + if (olds == null || olds.isEmpty() || !(olds.get(0) instanceof ScalarFunction)) { if (ifExists) return false; @@ -136,7 +131,11 @@ public boolean announceMigration(boolean isLocalOnly) throws RequestValidationEx old = olds.get(0); } - MigrationManager.announceFunctionDrop((UDFunction)old, isLocalOnly); + List references = Functions.getReferencesTo(old); + if (!references.isEmpty()) + throw new InvalidRequestException(String.format("Function '%s' still referenced by %s", functionName, references)); + + MigrationManager.announceFunctionDrop((UDFunction) old, isLocalOnly); return true; } diff --git a/src/java/org/apache/cassandra/db/DefsTables.java b/src/java/org/apache/cassandra/db/DefsTables.java index bcb0893cd5bb..82a5dd1ebe8a 100644 --- a/src/java/org/apache/cassandra/db/DefsTables.java +++ b/src/java/org/apache/cassandra/db/DefsTables.java @@ -34,6 +34,7 @@ import org.apache.cassandra.config.Schema; import org.apache.cassandra.config.UTMetaData; import org.apache.cassandra.cql3.functions.Functions; +import org.apache.cassandra.cql3.functions.UDAggregate; import org.apache.cassandra.cql3.functions.UDFunction; import org.apache.cassandra.db.commitlog.CommitLog; import org.apache.cassandra.db.compaction.CompactionManager; @@ -118,7 +119,8 @@ public static synchronized void mergeSchemaInternal(Collection mutatio Map oldKeyspaces = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_KEYSPACES_TABLE, keyspaces); Map oldColumnFamilies = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_COLUMNFAMILIES_TABLE, keyspaces); Map oldTypes = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_USER_TYPES_TABLE, keyspaces); - Map oldFunctions = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_FUNCTIONS_TABLE); + Map oldFunctions = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_FUNCTIONS_TABLE, keyspaces); + Map oldAggregates = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_AGGREGATES_TABLE, keyspaces); for (Mutation mutation : mutations) mutation.apply(); @@ -130,12 +132,14 @@ public static synchronized void mergeSchemaInternal(Collection mutatio Map newKeyspaces = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_KEYSPACES_TABLE, keyspaces); Map newColumnFamilies = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_COLUMNFAMILIES_TABLE, keyspaces); Map newTypes = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_USER_TYPES_TABLE, keyspaces); - Map newFunctions = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_FUNCTIONS_TABLE); + Map newFunctions = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_FUNCTIONS_TABLE, keyspaces); + Map newAggregates = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_AGGREGATES_TABLE, keyspaces); Set keyspacesToDrop = mergeKeyspaces(oldKeyspaces, newKeyspaces); mergeColumnFamilies(oldColumnFamilies, newColumnFamilies); mergeTypes(oldTypes, newTypes); mergeFunctions(oldFunctions, newFunctions); + mergeAggregates(oldAggregates, newAggregates); // it is safe to drop a keyspace only when all nested ColumnFamilies where deleted for (String keyspaceToDrop : keyspacesToDrop) @@ -348,6 +352,59 @@ else if (post.hasColumns()) dropFunction(udf); } + // see the comments for mergeKeyspaces() + private static void mergeAggregates(Map before, Map after) + { + List created = new ArrayList<>(); + List altered = new ArrayList<>(); + List dropped = new ArrayList<>(); + + MapDifference diff = Maps.difference(before, after); + + // New keyspace with functions + for (Map.Entry entry : diff.entriesOnlyOnRight().entrySet()) + if (entry.getValue().hasColumns()) + created.addAll(UDAggregate.fromSchema(new Row(entry.getKey(), entry.getValue())).values()); + + for (Map.Entry> entry : diff.entriesDiffering().entrySet()) + { + ColumnFamily pre = entry.getValue().leftValue(); + ColumnFamily post = entry.getValue().rightValue(); + + if (pre.hasColumns() && post.hasColumns()) + { + MapDifference delta = + Maps.difference(UDAggregate.fromSchema(new Row(entry.getKey(), pre)), + UDAggregate.fromSchema(new Row(entry.getKey(), post))); + + dropped.addAll(delta.entriesOnlyOnLeft().values()); + created.addAll(delta.entriesOnlyOnRight().values()); + Iterables.addAll(altered, Iterables.transform(delta.entriesDiffering().values(), new Function, UDAggregate>() + { + public UDAggregate apply(MapDifference.ValueDifference pair) + { + return pair.rightValue(); + } + })); + } + else if (pre.hasColumns()) + { + dropped.addAll(UDAggregate.fromSchema(new Row(entry.getKey(), pre)).values()); + } + else if (post.hasColumns()) + { + created.addAll(UDAggregate.fromSchema(new Row(entry.getKey(), post)).values()); + } + } + + for (UDAggregate udf : created) + addAggregate(udf); + for (UDAggregate udf : altered) + updateAggregate(udf); + for (UDAggregate udf : dropped) + dropAggregate(udf); + } + private static void addKeyspace(KSMetaData ksm) { assert Schema.instance.getKSMetaData(ksm.name) == null; @@ -397,6 +454,15 @@ private static void addFunction(UDFunction udf) MigrationManager.instance.notifyCreateFunction(udf); } + private static void addAggregate(UDAggregate udf) + { + logger.info("Loading {}", udf); + + Functions.addFunction(udf); + + MigrationManager.instance.notifyCreateAggregate(udf); + } + private static void updateKeyspace(String ksName) { KSMetaData oldKsm = Schema.instance.getKSMetaData(ksName); @@ -441,6 +507,15 @@ private static void updateFunction(UDFunction udf) MigrationManager.instance.notifyUpdateFunction(udf); } + private static void updateAggregate(UDAggregate udf) + { + logger.info("Updating {}", udf); + + Functions.replaceFunction(udf); + + MigrationManager.instance.notifyUpdateAggregate(udf); + } + private static void dropKeyspace(String ksName) { KSMetaData ksm = Schema.instance.getKSMetaData(ksName); @@ -520,6 +595,16 @@ private static void dropFunction(UDFunction udf) MigrationManager.instance.notifyDropFunction(udf); } + private static void dropAggregate(UDAggregate udf) + { + logger.info("Drop {}", udf); + + // TODO: this is kind of broken as this remove all overloads of the function name + Functions.removeFunction(udf.name(), udf.argTypes()); + + MigrationManager.instance.notifyDropAggregate(udf); + } + private static KSMetaData makeNewKeyspaceDefinition(KSMetaData ksm, CFMetaData toExclude) { // clone ksm but do not include the new def diff --git a/src/java/org/apache/cassandra/db/SystemKeyspace.java b/src/java/org/apache/cassandra/db/SystemKeyspace.java index ddf6fa05dc00..3e8b0a284d2d 100644 --- a/src/java/org/apache/cassandra/db/SystemKeyspace.java +++ b/src/java/org/apache/cassandra/db/SystemKeyspace.java @@ -76,6 +76,7 @@ public final class SystemKeyspace public static final String SCHEMA_TRIGGERS_TABLE = "schema_triggers"; public static final String SCHEMA_USER_TYPES_TABLE = "schema_usertypes"; public static final String SCHEMA_FUNCTIONS_TABLE = "schema_functions"; + public static final String SCHEMA_AGGREGATES_TABLE = "schema_aggregates"; public static final String BUILT_INDEXES_TABLE = "IndexInfo"; public static final String HINTS_TABLE = "hints"; @@ -95,7 +96,8 @@ public final class SystemKeyspace SCHEMA_COLUMNS_TABLE, SCHEMA_TRIGGERS_TABLE, SCHEMA_USER_TYPES_TABLE, - SCHEMA_FUNCTIONS_TABLE); + SCHEMA_FUNCTIONS_TABLE, + SCHEMA_AGGREGATES_TABLE); private static int WEEK = (int) TimeUnit.DAYS.toSeconds(7); @@ -177,7 +179,6 @@ public final class SystemKeyspace + "PRIMARY KEY ((keyspace_name), type_name))") .gcGraceSeconds(WEEK); - public static final CFMetaData SchemaFunctionsTable = compile(SCHEMA_FUNCTIONS_TABLE, "user defined function definitions", "CREATE TABLE %s (" @@ -193,6 +194,21 @@ public final class SystemKeyspace + "PRIMARY KEY ((keyspace_name), function_name, signature))") .gcGraceSeconds(WEEK); + public static final CFMetaData SchemaAggregatesTable = + compile(SCHEMA_AGGREGATES_TABLE, "user defined aggregate definitions", + "CREATE TABLE %s (" + + "keyspace_name text," + + "aggregate_name text," + + "signature blob," + + "argument_types list," + + "return_type text," + + "state_func text," + + "state_type text," + + "final_func text," + + "initcond blob," + + "PRIMARY KEY ((keyspace_name), aggregate_name, signature))") + .gcGraceSeconds(WEEK); + public static final CFMetaData BuiltIndexesTable = compile(BUILT_INDEXES_TABLE, "built column indexes", "CREATE TABLE \"%s\" (" @@ -331,6 +347,7 @@ public static KSMetaData definition() SchemaTriggersTable, SchemaUserTypesTable, SchemaFunctionsTable, + SchemaAggregatesTable, BuiltIndexesTable, HintsTable, BatchlogTable, diff --git a/src/java/org/apache/cassandra/service/IMigrationListener.java b/src/java/org/apache/cassandra/service/IMigrationListener.java index bc67e8aaab07..faaffb9ea9c6 100644 --- a/src/java/org/apache/cassandra/service/IMigrationListener.java +++ b/src/java/org/apache/cassandra/service/IMigrationListener.java @@ -23,15 +23,18 @@ public interface IMigrationListener public void onCreateColumnFamily(String ksName, String cfName); public void onCreateUserType(String ksName, String typeName); public void onCreateFunction(String ksName, String functionName); + public void onCreateAggregate(String ksName, String aggregateName); public void onUpdateKeyspace(String ksName); public void onUpdateColumnFamily(String ksName, String cfName); public void onUpdateUserType(String ksName, String typeName); public void onUpdateFunction(String ksName, String functionName); + public void onUpdateAggregate(String ksName, String aggregateName); public void onDropKeyspace(String ksName); public void onDropColumnFamily(String ksName, String cfName); public void onDropUserType(String ksName, String typeName); public void onDropFunction(String ksName, String functionName); + public void onDropAggregate(String ksName, String aggregateName); } diff --git a/src/java/org/apache/cassandra/service/MigrationManager.java b/src/java/org/apache/cassandra/service/MigrationManager.java index 73bab6687b8a..c3fe1fafc5ef 100644 --- a/src/java/org/apache/cassandra/service/MigrationManager.java +++ b/src/java/org/apache/cassandra/service/MigrationManager.java @@ -39,11 +39,9 @@ import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.config.UTMetaData; import org.apache.cassandra.config.Schema; -import org.apache.cassandra.cql3.functions.AggregateFunction; -import org.apache.cassandra.cql3.functions.ScalarFunction; +import org.apache.cassandra.cql3.functions.UDAggregate; import org.apache.cassandra.cql3.functions.UDFunction; import org.apache.cassandra.db.*; -import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.db.marshal.UserType; import org.apache.cassandra.exceptions.AlreadyExistsException; import org.apache.cassandra.exceptions.ConfigurationException; @@ -196,21 +194,22 @@ public void notifyDropFunction(UDFunction udf) listener.onDropFunction(udf.name().keyspace, udf.name().name); } - private List asString(List> abstractTypes) + public void notifyCreateAggregate(UDAggregate udf) { - List r = new ArrayList<>(abstractTypes.size()); - for (AbstractType abstractType : abstractTypes) - r.add(abstractType.asCQL3Type().toString()); - return r; + for (IMigrationListener listener : listeners) + listener.onCreateAggregate(udf.name().keyspace, udf.name().name); + } + + public void notifyUpdateAggregate(UDAggregate udf) + { + for (IMigrationListener listener : listeners) + listener.onUpdateAggregate(udf.name().keyspace, udf.name().name); } - private String udType(UDFunction udf) + public void notifyDropAggregate(UDAggregate udf) { - if (udf instanceof ScalarFunction) - return "scalar"; - if (udf instanceof AggregateFunction) - return "aggregate"; - return ""; + for (IMigrationListener listener : listeners) + listener.onDropAggregate(udf.name().keyspace, udf.name().name); } public void notifyUpdateKeyspace(KSMetaData ksm) @@ -395,14 +394,28 @@ public static void announceTypeDrop(UserType droppedType, boolean announceLocall public static void announceFunctionDrop(UDFunction udf, boolean announceLocally) { Mutation mutation = udf.toSchemaDrop(FBUtilities.timestampMicros()); - logger.info(String.format("Drop Function overload '%s' args '%s'", udf.name(), udf.argTypes())); + logger.info(String.format("Drop scalar function overload '%s' args '%s'", udf.name(), udf.argTypes())); + announce(mutation, announceLocally); + } + + public static void announceAggregateDrop(UDAggregate udf, boolean announceLocally) + { + Mutation mutation = udf.toSchemaDrop(FBUtilities.timestampMicros()); + logger.info(String.format("Drop aggregate function overload '%s' args '%s'", udf.name(), udf.argTypes())); announce(mutation, announceLocally); } public static void announceNewFunction(UDFunction udf, boolean announceLocally) { Mutation mutation = udf.toSchemaUpdate(FBUtilities.timestampMicros()); - logger.info(String.format("Create Function '%s'", udf.name())); + logger.info(String.format("Create scalar function '%s'", udf.name())); + announce(mutation, announceLocally); + } + + public static void announceNewAggregate(UDAggregate udf, boolean announceLocally) + { + Mutation mutation = udf.toSchemaUpdate(FBUtilities.timestampMicros()); + logger.info(String.format("Create aggregate function '%s'", udf.name())); announce(mutation, announceLocally); } diff --git a/src/java/org/apache/cassandra/transport/Server.java b/src/java/org/apache/cassandra/transport/Server.java index cc071b13fb19..5202a9451ae9 100644 --- a/src/java/org/apache/cassandra/transport/Server.java +++ b/src/java/org/apache/cassandra/transport/Server.java @@ -414,6 +414,10 @@ public void onCreateFunction(String ksName, String functionName) { } + public void onCreateAggregate(String ksName, String aggregateName) + { + } + public void onUpdateKeyspace(String ksName) { server.connectionTracker.send(new Event.SchemaChange(Event.SchemaChange.Change.UPDATED, ksName)); @@ -433,6 +437,10 @@ public void onUpdateFunction(String ksName, String functionName) { } + public void onUpdateAggregate(String ksName, String aggregateName) + { + } + public void onDropKeyspace(String ksName) { server.connectionTracker.send(new Event.SchemaChange(Event.SchemaChange.Change.DROPPED, ksName)); @@ -451,5 +459,9 @@ public void onDropUserType(String ksName, String typeName) public void onDropFunction(String ksName, String functionName) { } + + public void onDropAggregate(String ksName, String aggregateName) + { + } } } diff --git a/test/unit/org/apache/cassandra/cql3/AggregationTest.java b/test/unit/org/apache/cassandra/cql3/AggregationTest.java index 859fe6593c83..940e87f63a80 100644 --- a/test/unit/org/apache/cassandra/cql3/AggregationTest.java +++ b/test/unit/org/apache/cassandra/cql3/AggregationTest.java @@ -24,8 +24,12 @@ import java.util.TimeZone; import org.apache.commons.lang3.time.DateUtils; +import org.junit.Assert; import org.junit.Test; +import org.apache.cassandra.service.ClientState; +import org.apache.cassandra.transport.messages.ResultMessage; + public class AggregationTest extends CQLTester { @Test @@ -94,16 +98,20 @@ public void testNestedFunctions() throws Throwable { createTable("CREATE TABLE %s (a int primary key, b timeuuid, c double, d double)"); - execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".copySign(magnitude double, sign double) RETURNS double LANGUAGE JAVA\n" + - "AS 'return Double.valueOf(Math.copySign(magnitude.doubleValue(), sign.doubleValue()));';"); + String copySign = createFunction(KEYSPACE, + "double, double", + "CREATE OR REPLACE FUNCTION %s(magnitude double, sign double) " + + "RETURNS double " + + "LANGUAGE JAVA " + + "AS 'return Double.valueOf(Math.copySign(magnitude.doubleValue(), sign.doubleValue()));';"); assertColumnNames(execute("SELECT max(a), max(unixTimestampOf(b)) FROM %s"), "system.max(a)", "system.max(system.unixtimestampof(b))"); assertRows(execute("SELECT max(a), max(unixTimestampOf(b)) FROM %s"), row(null, null)); assertColumnNames(execute("SELECT max(a), unixTimestampOf(max(b)) FROM %s"), "system.max(a)", "system.unixtimestampof(system.max(b))"); assertRows(execute("SELECT max(a), unixTimestampOf(max(b)) FROM %s"), row(null, null)); - assertColumnNames(execute("SELECT max(copySign(c, d)) FROM %s"), "system.max("+KEYSPACE+".copysign(c, d))"); - assertRows(execute("SELECT max(copySign(c, d)) FROM %s"), row((Object) null)); + assertColumnNames(execute("SELECT max(" + copySign + "(c, d)) FROM %s"), "system.max(" + copySign + "(c, d))"); + assertRows(execute("SELECT max(" + copySign + "(c, d)) FROM %s"), row((Object) null)); execute("INSERT INTO %s (a, b, c, d) VALUES (1, maxTimeuuid('2011-02-03 04:05:00+0000'), -1.2, 2.1)"); execute("INSERT INTO %s (a, b, c, d) VALUES (2, maxTimeuuid('2011-02-03 04:06:00+0000'), 1.3, -3.4)"); @@ -117,10 +125,624 @@ public void testNestedFunctions() throws Throwable assertRows(execute("SELECT max(a), max(unixTimestampOf(b)) FROM %s"), row(3, date.getTime())); assertRows(execute("SELECT max(a), unixTimestampOf(max(b)) FROM %s"), row(3, date.getTime())); - assertRows(execute("SELECT copySign(max(c), min(c)) FROM %s"), row(-1.4)); - assertRows(execute("SELECT copySign(c, d) FROM %s"), row(1.2), row(-1.3), row(1.4)); - assertRows(execute("SELECT max(copySign(c, d)) FROM %s"), row(1.4)); - assertInvalid("SELECT copySign(c, max(c)) FROM %s"); - assertInvalid("SELECT copySign(max(c), c) FROM %s"); + assertRows(execute("SELECT " + copySign + "(max(c), min(c)) FROM %s"), row(-1.4)); + assertRows(execute("SELECT " + copySign + "(c, d) FROM %s"), row(1.2), row(-1.3), row(1.4)); + assertRows(execute("SELECT max(" + copySign + "(c, d)) FROM %s"), row(1.4)); + assertInvalid("SELECT " + copySign + "(c, max(c)) FROM %s"); + assertInvalid("SELECT " + copySign + "(max(c), c) FROM %s"); + } + + @Test + public void testDropStatements() throws Throwable + { + String f = createFunction(KEYSPACE, + "double, double", + "CREATE OR REPLACE FUNCTION %s(state double, val double) " + + "RETURNS double " + + "LANGUAGE javascript " + + "AS '\"string\";';"); + createFunctionOverload(f, + "double, double", + "CREATE OR REPLACE FUNCTION %s(state int, val int) " + + "RETURNS int " + + "LANGUAGE javascript " + + "AS '\"string\";';"); + + // DROP AGGREGATE must not succeed against a scalar + assertInvalid("DROP AGGREGATE " + f); + assertInvalid("DROP AGGREGATE " + f + "(double, double)"); + + String a = createAggregate(KEYSPACE, + "double", + "CREATE OR REPLACE AGGREGATE %s(double) " + + "SFUNC " + shortFunctionName(f) + " " + + "STYPE double"); + createAggregateOverload(a, + "int", + "CREATE OR REPLACE AGGREGATE %s(int) " + + "SFUNC " + shortFunctionName(f) + " " + + "STYPE int"); + + // DROP FUNCTION must not succeed against an aggregate + assertInvalid("DROP FUNCTION " + a); + assertInvalid("DROP FUNCTION " + a + "(double)"); + + // ambigious + assertInvalid("DROP AGGREGATE " + a); + assertInvalid("DROP AGGREGATE IF EXISTS " + a); + + execute("DROP AGGREGATE IF EXISTS " + KEYSPACE + ".non_existing"); + execute("DROP AGGREGATE IF EXISTS " + a + "(int, text)"); + + execute("DROP AGGREGATE " + a + "(double)"); + + execute("DROP AGGREGATE IF EXISTS " + a + "(double)"); + } + + @Test + public void testDropReferenced() throws Throwable + { + String f = createFunction(KEYSPACE, + "double, double", + "CREATE OR REPLACE FUNCTION %s(state double, val double) " + + "RETURNS double " + + "LANGUAGE javascript " + + "AS '\"string\";';"); + + String a = createAggregate(KEYSPACE, + "double", + "CREATE OR REPLACE AGGREGATE %s(double) " + + "SFUNC " + shortFunctionName(f) + " " + + "STYPE double"); + + // DROP FUNCTION must not succeed because the function is still referenced by the aggregate + assertInvalid("DROP FUNCTION " + f); + + execute("DROP AGGREGATE " + a + "(double)"); + } + + @Test + public void testJavaAggregateNoInit() throws Throwable + { + createTable("CREATE TABLE %s (a int primary key, b int)"); + execute("INSERT INTO %s (a, b) VALUES (1, 1)"); + execute("INSERT INTO %s (a, b) VALUES (2, 2)"); + execute("INSERT INTO %s (a, b) VALUES (3, 3)"); + + String fState = createFunction(KEYSPACE, + "int, int", + "CREATE FUNCTION %s(a int, b int) " + + "RETURNS int " + + "LANGUAGE java " + + "AS 'return Integer.valueOf((a!=null?a.intValue():0) + b.intValue());'"); + + String fFinal = createFunction(KEYSPACE, + "int", + "CREATE FUNCTION %s(a int) " + + "RETURNS text " + + "LANGUAGE java " + + "AS 'return a.toString();'"); + + String a = createAggregate(KEYSPACE, + "int", + "CREATE AGGREGATE %s(int) " + + "SFUNC " + shortFunctionName(fState) + " " + + "STYPE int " + + "FINALFUNC " + shortFunctionName(fFinal)); + + // 1 + 2 + 3 = 6 + assertRows(execute("SELECT " + a + "(b) FROM %s"), row("6")); + + execute("DROP AGGREGATE " + a + "(int)"); + + assertInvalid("SELECT " + a + "(b) FROM %s"); + } + + @Test + public void testJavaAggregateNullInitcond() throws Throwable + { + createTable("CREATE TABLE %s (a int primary key, b int)"); + execute("INSERT INTO %s (a, b) VALUES (1, 1)"); + execute("INSERT INTO %s (a, b) VALUES (2, 2)"); + execute("INSERT INTO %s (a, b) VALUES (3, 3)"); + + String fState = createFunction(KEYSPACE, + "int, int", + "CREATE FUNCTION %s(a int, b int) " + + "RETURNS int " + + "LANGUAGE java " + + "AS 'return Integer.valueOf((a!=null?a.intValue():0) + b.intValue());'"); + + String fFinal = createFunction(KEYSPACE, + "int", + "CREATE FUNCTION %s(a int) " + + "RETURNS text " + + "LANGUAGE java " + + "AS 'return a.toString();'"); + + String a = createAggregate(KEYSPACE, + "int", + "CREATE AGGREGATE %s(int) " + + "SFUNC " + shortFunctionName(fState) + " " + + "STYPE int " + + "FINALFUNC " + shortFunctionName(fFinal) + " " + + "INITCOND null"); + + // 1 + 2 + 3 = 6 + assertRows(execute("SELECT " + a + "(b) FROM %s"), row("6")); + + execute("DROP AGGREGATE " + a + "(int)"); + + assertInvalid("SELECT " + a + "(b) FROM %s"); + } + + @Test + public void testJavaAggregateInvalidInitcond() throws Throwable + { + String fState = createFunction(KEYSPACE, + "int, int", + "CREATE FUNCTION %s(a int, b int) " + + "RETURNS int " + + "LANGUAGE java " + + "AS 'return Integer.valueOf((a!=null?a.intValue():0) + b.intValue());'"); + + String fFinal = createFunction(KEYSPACE, + "int", + "CREATE FUNCTION %s(a int) " + + "RETURNS text " + + "LANGUAGE java " + + "AS 'return a.toString();'"); + + assertInvalid("CREATE AGGREGATE " + KEYSPACE + ".aggrInvalid(int)" + + "SFUNC " + shortFunctionName(fState) + " " + + "STYPE int " + + "FINALFUNC " + shortFunctionName(fFinal) + " " + + "INITCOND 'foobar'"); + } + + @Test + public void testJavaAggregateIncompatibleTypes() throws Throwable + { + String fState = createFunction(KEYSPACE, + "int, int", + "CREATE FUNCTION %s(a int, b int) " + + "RETURNS int " + + "LANGUAGE java " + + "AS 'return Integer.valueOf((a!=null?a.intValue():0) + b.intValue());'"); + + String fFinal = createFunction(KEYSPACE, + "int", + "CREATE FUNCTION %s(a int) " + + "RETURNS text " + + "LANGUAGE java " + + "AS 'return a.toString();'"); + + String fState2 = createFunction(KEYSPACE, + "int, int", + "CREATE FUNCTION %s(a double, b double) " + + "RETURNS double " + + "LANGUAGE java " + + "AS 'return Double.valueOf((a!=null?a.doubleValue():0d) + b.doubleValue());'"); + + String fFinal2 = createFunction(KEYSPACE, + "int", + "CREATE FUNCTION %s(a double) " + + "RETURNS text " + + "LANGUAGE java " + + "AS 'return a.toString();'"); + + assertInvalid("CREATE AGGREGATE " + KEYSPACE + ".aggrInvalid(double)" + + "SFUNC " + shortFunctionName(fState) + " " + + "STYPE double " + + "FINALFUNC " + shortFunctionName(fFinal)); + assertInvalid("CREATE AGGREGATE " + KEYSPACE + ".aggrInvalid(int)" + + "SFUNC " + shortFunctionName(fState) + " " + + "STYPE double " + + "FINALFUNC " + shortFunctionName(fFinal)); + assertInvalid("CREATE AGGREGATE " + KEYSPACE + ".aggrInvalid(double)" + + "SFUNC " + shortFunctionName(fState) + " " + + "STYPE int " + + "FINALFUNC " + shortFunctionName(fFinal)); + assertInvalid("CREATE AGGREGATE " + KEYSPACE + ".aggrInvalid(double)" + + "SFUNC " + shortFunctionName(fState) + " " + + "STYPE int"); + assertInvalid("CREATE AGGREGATE " + KEYSPACE + ".aggrInvalid(int)" + + "SFUNC " + shortFunctionName(fState) + " " + + "STYPE double"); + + assertInvalid("CREATE AGGREGATE " + KEYSPACE + ".aggrInvalid(double)" + + "SFUNC " + shortFunctionName(fState2) + " " + + "STYPE double " + + "FINALFUNC " + shortFunctionName(fFinal)); + + assertInvalid("CREATE AGGREGATE " + KEYSPACE + ".aggrInvalid(double)" + + "SFUNC " + shortFunctionName(fState) + " " + + "STYPE double " + + "FINALFUNC " + shortFunctionName(fFinal2)); + } + + @Test + public void testJavaAggregateNonExistingFuncs() throws Throwable + { + String fState = createFunction(KEYSPACE, + "int, int", + "CREATE FUNCTION %s(a int, b int) " + + "RETURNS int " + + "LANGUAGE java " + + "AS 'return Integer.valueOf((a!=null?a.intValue():0) + b.intValue());'"); + + String fFinal = createFunction(KEYSPACE, + "int", + "CREATE FUNCTION %s(a int) " + + "RETURNS text " + + "LANGUAGE java " + + "AS 'return a.toString();'"); + + assertInvalid("CREATE AGGREGATE " + KEYSPACE + ".aggrInvalid(int)" + + "SFUNC " + shortFunctionName(fState) + "_not_there " + + "STYPE int " + + "FINALFUNC " + shortFunctionName(fFinal)); + + assertInvalid("CREATE AGGREGATE " + KEYSPACE + ".aggrInvalid(int)" + + "SFUNC " + shortFunctionName(fState) + " " + + "STYPE int " + + "FINALFUNC " + shortFunctionName(fFinal) + "_not_there"); + + execute("CREATE AGGREGATE " + KEYSPACE + ".aggrInvalid(int)" + + "SFUNC " + shortFunctionName(fState) + " " + + "STYPE int " + + "FINALFUNC " + shortFunctionName(fFinal)); + execute("DROP AGGREGATE " + KEYSPACE + ".aggrInvalid(int)"); + } + + @Test + public void testJavaAggregateFailingFuncs() throws Throwable + { + createTable("CREATE TABLE %s (a int primary key, b int)"); + execute("INSERT INTO %s (a, b) VALUES (1, 1)"); + execute("INSERT INTO %s (a, b) VALUES (2, 2)"); + execute("INSERT INTO %s (a, b) VALUES (3, 3)"); + + String fState = createFunction(KEYSPACE, + "int, int", + "CREATE FUNCTION %s(a int, b int) " + + "RETURNS int " + + "LANGUAGE java " + + "AS 'throw new RuntimeException();'"); + + String fStateOK = createFunction(KEYSPACE, + "int, int", + "CREATE FUNCTION %s(a int, b int) " + + "RETURNS int " + + "LANGUAGE java " + + "AS 'return Integer.valueOf(42);'"); + + String fFinal = createFunction(KEYSPACE, + "int", + "CREATE FUNCTION %s(a int) " + + "RETURNS text " + + "LANGUAGE java " + + "AS 'throw new RuntimeException();'"); + + String fFinalOK = createFunction(KEYSPACE, + "int", + "CREATE FUNCTION %s(a int) " + + "RETURNS text " + + "LANGUAGE java " + + "AS 'return \"foobar\";'"); + + String a0 = createAggregate(KEYSPACE, + "int", + "CREATE AGGREGATE %s(int) " + + "SFUNC " + shortFunctionName(fState) + " " + + "STYPE int " + + "FINALFUNC " + shortFunctionName(fFinal) + " " + + "INITCOND null"); + String a1 = createAggregate(KEYSPACE, + "int", + "CREATE AGGREGATE %s(int) " + + "SFUNC " + shortFunctionName(fStateOK) + " " + + "STYPE int " + + "FINALFUNC " + shortFunctionName(fFinal) + " " + + "INITCOND null"); + String a2 = createAggregate(KEYSPACE, + "int", + "CREATE AGGREGATE %s(int) " + + "SFUNC " + shortFunctionName(fStateOK) + " " + + "STYPE int " + + "FINALFUNC " + shortFunctionName(fFinalOK) + " " + + "INITCOND null"); + + assertInvalid("SELECT " + a0 + "(b) FROM %s"); + assertInvalid("SELECT " + a1 + "(b) FROM %s"); + assertRows(execute("SELECT " + a2 + "(b) FROM %s"), row("foobar")); + } + + @Test + public void testJavaAggregateWithoutStateOrFinal() throws Throwable + { + assertInvalid("CREATE AGGREGATE " + KEYSPACE + ".jSumFooNE1(int) " + + "SFUNC jSumFooNEstate " + + "STYPE int"); + + String f = createFunction(KEYSPACE, + "int, int", + "CREATE FUNCTION %s(a int, b int) " + + "RETURNS int " + + "LANGUAGE java " + + "AS 'return Integer.valueOf((a!=null?a.intValue():0) + b.intValue());'"); + + assertInvalid("CREATE AGGREGATE " + KEYSPACE + ".jSumFooNE2(int) " + + "SFUNC " + shortFunctionName(f) + " " + + "STYPE int " + + "FINALFUNC jSumFooNEfinal"); + + execute("DROP FUNCTION " + f + "(int, int)"); + } + + @Test + public void testJavaAggregate() throws Throwable + { + createTable("CREATE TABLE %s (a int primary key, b int)"); + execute("INSERT INTO %s (a, b) VALUES (1, 1)"); + execute("INSERT INTO %s (a, b) VALUES (2, 2)"); + execute("INSERT INTO %s (a, b) VALUES (3, 3)"); + + String fState = createFunction(KEYSPACE, + "int, int", + "CREATE FUNCTION %s(a int, b int) " + + "RETURNS int " + + "LANGUAGE java " + + "AS 'return Integer.valueOf((a!=null?a.intValue():0) + b.intValue());'"); + + String fFinal = createFunction(KEYSPACE, + "int", + "CREATE FUNCTION %s(a int) " + + "RETURNS text " + + "LANGUAGE java " + + "AS 'return a.toString();'"); + + String a = createAggregate(KEYSPACE, + "int", + "CREATE AGGREGATE %s(int) " + + "SFUNC " + shortFunctionName(fState) + " " + + "STYPE int " + + "FINALFUNC " + shortFunctionName(fFinal) + " " + + "INITCOND 42"); + + // 42 + 1 + 2 + 3 = 48 + assertRows(execute("SELECT " + a + "(b) FROM %s"), row("48")); + + execute("DROP AGGREGATE " + a + "(int)"); + + execute("DROP FUNCTION " + fFinal + "(int)"); + execute("DROP FUNCTION " + fState + "(int, int)"); + + assertInvalid("SELECT " + a + "(b) FROM %s"); + } + + @Test + public void testJavaAggregateSimple() throws Throwable + { + createTable("CREATE TABLE %s (a int primary key, b int)"); + execute("INSERT INTO %s (a, b) VALUES (1, 1)"); + execute("INSERT INTO %s (a, b) VALUES (2, 2)"); + execute("INSERT INTO %s (a, b) VALUES (3, 3)"); + + String fState = createFunction(KEYSPACE, + "int, int", + "CREATE FUNCTION %s(a int, b int) " + + "RETURNS int " + + "LANGUAGE java " + + "AS 'return Integer.valueOf((a!=null?a.intValue():0) + b.intValue());'"); + + String a = createAggregate(KEYSPACE, + "int, int", + "CREATE AGGREGATE %s(int) " + + "SFUNC " + shortFunctionName(fState) + " " + + "STYPE int"); + + // 1 + 2 + 3 = 6 + assertRows(execute("SELECT " + a + "(b) FROM %s"), row(6)); + + execute("DROP AGGREGATE " + a + "(int)"); + + execute("DROP FUNCTION " + fState + "(int, int)"); + + assertInvalid("SELECT " + a + "(b) FROM %s"); + } + + @Test + public void testJavaAggregateComplex() throws Throwable + { + createTable("CREATE TABLE %s (a int primary key, b int)"); + execute("INSERT INTO %s (a, b) VALUES (1, 1)"); + execute("INSERT INTO %s (a, b) VALUES (2, 2)"); + execute("INSERT INTO %s (a, b) VALUES (3, 3)"); + + // build an average aggregation function using + // tuple as state + // double as finaltype + + String fState = createFunction(KEYSPACE, + "frozen>, int", + "CREATE FUNCTION %s(a frozen>, b int) " + + "RETURNS frozen> " + + "LANGUAGE java " + + "AS '" + + "a.setLong(0, a.getLong(0) + b.intValue());" + + "a.setInt(1, a.getInt(1) + 1);" + + "return a;" + + "'"); + + String fFinal = createFunction(KEYSPACE, + "frozen>", + "CREATE FUNCTION %s(a frozen>) " + + "RETURNS double " + + "LANGUAGE java " + + "AS '" + + "double r = a.getLong(0);" + + "r /= a.getInt(1);" + + "return Double.valueOf(r);" + + "'"); + + String a = createAggregate(KEYSPACE, + "int", + "CREATE AGGREGATE %s(int) " + + "SFUNC " + shortFunctionName(fState) + " " + + "STYPE frozen> "+ + "FINALFUNC " + shortFunctionName(fFinal) + " " + + "INITCOND (0, 0)"); + + // 1 + 2 + 3 = 6 / 3 = 2 + assertRows(execute("SELECT " + a + "(b) FROM %s"), row(2d)); + + } + + @Test + public void testJavascriptAggregate() throws Throwable + { + createTable("CREATE TABLE %s (a int primary key, b int)"); + execute("INSERT INTO %s (a, b) VALUES (1, 1)"); + execute("INSERT INTO %s (a, b) VALUES (2, 2)"); + execute("INSERT INTO %s (a, b) VALUES (3, 3)"); + + String fState = createFunction(KEYSPACE, + "int, int", + "CREATE FUNCTION %s(a int, b int) " + + "RETURNS int " + + "LANGUAGE javascript " + + "AS 'a + b;'"); + + String fFinal = createFunction(KEYSPACE, + "int", + "CREATE FUNCTION %s(a int) " + + "RETURNS text " + + "LANGUAGE javascript " + + "AS '\"\"+a'"); + + String a = createFunction(KEYSPACE, + "int", + "CREATE AGGREGATE %s(int) " + + "SFUNC " + shortFunctionName(fState) + " " + + "STYPE int " + + "FINALFUNC " + shortFunctionName(fFinal) + " " + + "INITCOND 42"); + + // 42 + 1 + 2 + 3 = 48 + assertRows(execute("SELECT " + a + "(b) FROM %s"), row("48")); + + execute("DROP AGGREGATE " + a + "(int)"); + + execute("DROP FUNCTION " + fFinal + "(int)"); + execute("DROP FUNCTION " + fState + "(int, int)"); + + assertInvalid("SELECT " + a + "(b) FROM %s"); + } + + @Test + public void testJavascriptAggregateSimple() throws Throwable + { + createTable("CREATE TABLE %s (a int primary key, b int)"); + execute("INSERT INTO %s (a, b) VALUES (1, 1)"); + execute("INSERT INTO %s (a, b) VALUES (2, 2)"); + execute("INSERT INTO %s (a, b) VALUES (3, 3)"); + + String fState = createFunction(KEYSPACE, + "int, int", + "CREATE FUNCTION %s(a int, b int) " + + "RETURNS int " + + "LANGUAGE javascript " + + "AS 'a + b;'"); + + String a = createAggregate(KEYSPACE, + "int, int", + "CREATE AGGREGATE %s(int) " + + "SFUNC " + shortFunctionName(fState) + " " + + "STYPE int "); + + // 1 + 2 + 3 = 6 + assertRows(execute("SELECT " + a + "(b) FROM %s"), row(6)); + + execute("DROP AGGREGATE " + a + "(int)"); + + execute("DROP FUNCTION " + fState + "(int, int)"); + + assertInvalid("SELECT " + a + "(b) FROM %s"); + } + + @Test + public void testFunctionDropPreparedStatement() throws Throwable + { + String otherKS = "cqltest_foo"; + + execute("CREATE KEYSPACE IF NOT EXISTS " + otherKS + " WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3};"); + try + { + execute("CREATE TABLE " + otherKS + ".jsdp (a int primary key, b int)"); + + String fState = createFunction(otherKS, + "int, int", + "CREATE FUNCTION %s(a int, b int) " + + "RETURNS int " + + "LANGUAGE javascript " + + "AS 'a + b;'"); + + String a = createAggregate(otherKS, + "int", + "CREATE AGGREGATE %s(int) " + + "SFUNC " + shortFunctionName(fState) + " " + + "STYPE int"); + + ResultMessage.Prepared prepared = QueryProcessor.prepare("SELECT " + a + "(b) FROM " + otherKS + ".jsdp", ClientState.forInternalCalls(), false); + Assert.assertNotNull(QueryProcessor.instance.getPrepared(prepared.statementId)); + + execute("DROP AGGREGATE " + a + "(int)"); + Assert.assertNull(QueryProcessor.instance.getPrepared(prepared.statementId)); + + // + + execute("CREATE AGGREGATE " + a + "(int) " + + "SFUNC " + shortFunctionName(fState) + " " + + "STYPE int"); + + prepared = QueryProcessor.prepare("SELECT " + a + "(b) FROM " + otherKS + ".jsdp", ClientState.forInternalCalls(), false); + Assert.assertNotNull(QueryProcessor.instance.getPrepared(prepared.statementId)); + + execute("DROP KEYSPACE " + otherKS + ";"); + + Assert.assertNull(QueryProcessor.instance.getPrepared(prepared.statementId)); + } + finally + { + execute("DROP KEYSPACE IF EXISTS " + otherKS + ";"); + } + } + + @Test + public void testAggregatesReferencedInAggregates() throws Throwable + { + + String fState = createFunction(KEYSPACE, + "int, int", + "CREATE FUNCTION %s(a int, b int) " + + "RETURNS int " + + "LANGUAGE javascript " + + "AS 'a + b;'"); + + String a = createAggregate(KEYSPACE, + "int, int", + "CREATE AGGREGATE %s(int) " + + "SFUNC " + shortFunctionName(fState) + " " + + "STYPE int "); + + assertInvalid("CREATE AGGREGATE " + KEYSPACE + ".aggInv(int) " + + "SFUNC " + shortFunctionName(a) + " " + + "STYPE int "); + + assertInvalid("CREATE AGGREGATE " + KEYSPACE + ".aggInv(int) " + + "SFUNC " + shortFunctionName(fState) + " " + + "STYPE int " + + "FINALFUNC " + shortFunctionName(a)); } } diff --git a/test/unit/org/apache/cassandra/cql3/CQLTester.java b/test/unit/org/apache/cassandra/cql3/CQLTester.java index 24042374bf71..883da3aff21c 100644 --- a/test/unit/org/apache/cassandra/cql3/CQLTester.java +++ b/test/unit/org/apache/cassandra/cql3/CQLTester.java @@ -46,6 +46,7 @@ import org.apache.cassandra.concurrent.ScheduledExecutors; import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.Schema; +import org.apache.cassandra.cql3.functions.FunctionName; import org.apache.cassandra.db.Directories; import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.db.SystemKeyspace; @@ -243,6 +244,19 @@ public boolean usePrepared() return USE_PREPARED_VALUES; } + public static FunctionName parseFunctionName(String qualifiedName) + { + int i = qualifiedName.indexOf('.'); + return i == -1 + ? FunctionName.nativeFunction(qualifiedName) + : new FunctionName(qualifiedName.substring(0, i).trim(), qualifiedName.substring(i+1).trim()); + } + + public static String shortFunctionName(String f) + { + return parseFunctionName(f).name; + } + private static void removeAllSSTables(String ks, String table) { // clean up data directory which are stored as data directory/keyspace/data files diff --git a/test/unit/org/apache/cassandra/cql3/UFTest.java b/test/unit/org/apache/cassandra/cql3/UFTest.java index 824719bb38d0..fa28126777b9 100644 --- a/test/unit/org/apache/cassandra/cql3/UFTest.java +++ b/test/unit/org/apache/cassandra/cql3/UFTest.java @@ -35,14 +35,6 @@ public class UFTest extends CQLTester { - public static FunctionName parseFunctionName(String qualifiedName) - { - int i = qualifiedName.indexOf('.'); - return i == -1 - ? FunctionName.nativeFunction(qualifiedName) - : new FunctionName(qualifiedName.substring(0, i).trim(), qualifiedName.substring(i+1).trim()); - } - @Test public void testFunctionDropOnKeyspaceDrop() throws Throwable { From 2fdd1d59c6e8934803f3c3d5629c41a8ca6a8a14 Mon Sep 17 00:00:00 2001 From: Benedict Elliott Smith Date: Fri, 12 Dec 2014 15:22:15 +0000 Subject: [PATCH 216/557] ninja fixup --- src/java/org/apache/cassandra/utils/memory/NativeAllocator.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/java/org/apache/cassandra/utils/memory/NativeAllocator.java b/src/java/org/apache/cassandra/utils/memory/NativeAllocator.java index 3c43a27d938a..df9ab1bad9ea 100644 --- a/src/java/org/apache/cassandra/utils/memory/NativeAllocator.java +++ b/src/java/org/apache/cassandra/utils/memory/NativeAllocator.java @@ -17,6 +17,8 @@ */ package org.apache.cassandra.utils.memory; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.Semaphore; import java.util.concurrent.atomic.AtomicInteger; From 574e2652ef1c5bc8813ae48ebfe785424795e7b5 Mon Sep 17 00:00:00 2001 From: Joshua McKenzie Date: Mon, 15 Dec 2014 11:33:18 -0600 Subject: [PATCH 217/557] merge fixes for CASSANDRA-8452 --- .../cassandra/config/DatabaseDescriptor.java | 18 +++++++++--------- .../cassandra/service/StorageService.java | 1 + .../apache/cassandra/utils/FBUtilities.java | 2 +- .../apache/cassandra/utils/SigarLibrary.java | 2 +- test/pig/org/apache/pig/test/MiniCluster.java | 2 +- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java index c34c6ea93fc8..958cf8cd818b 100644 --- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java +++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java @@ -177,7 +177,15 @@ else if (conf.commitlog_sync_batch_window_in_ms != null) if (conf.commitlog_total_space_in_mb == null) conf.commitlog_total_space_in_mb = hasLargeAddressSpace() ? 8192 : 32; - if (FBUtilities.isUnix()) + // Always force standard mode access on Windows - CASSANDRA-6993. Windows won't allow deletion of hard-links to files that + // are memory-mapped which causes trouble with snapshots. + if (FBUtilities.isWindows()) + { + conf.disk_access_mode = Config.DiskAccessMode.standard; + indexAccessMode = conf.disk_access_mode; + logger.info("Non-unix environment detected. DiskAccessMode set to {}, indexAccessMode {}", conf.disk_access_mode, indexAccessMode); + } + else { /* evaluate the DiskAccessMode Config directive, which also affects indexAccessMode selection */ if (conf.disk_access_mode == Config.DiskAccessMode.auto) @@ -198,14 +206,6 @@ else if (conf.disk_access_mode == Config.DiskAccessMode.mmap_index_only) logger.info("DiskAccessMode is {}, indexAccessMode is {}", conf.disk_access_mode, indexAccessMode); } } - // Always force standard mode access on Windows - CASSANDRA-6993. Windows won't allow deletion of hard-links to files that - // are memory-mapped which causes trouble with snapshots. - else - { - conf.disk_access_mode = Config.DiskAccessMode.standard; - indexAccessMode = conf.disk_access_mode; - logger.info("Non-unix environment detected. DiskAccessMode set to {}, indexAccessMode {}", conf.disk_access_mode, indexAccessMode); - } /* Authentication and authorization backend, implementing IAuthenticator and IAuthorizer */ if (conf.authenticator != null) diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index f646d87b5d15..999d6b6ddbf1 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -2536,6 +2536,7 @@ public int forceRepairRangeAsync(String beginToken, boolean fullRepair, String... columnFamilies) { + if (FBUtilities.isWindows() && parallelismDegree != RepairParallelism.PARALLEL) { logger.warn("Snapshot-based repair is not yet supported on Windows. Reverting to parallel repair."); parallelismDegree = RepairParallelism.PARALLEL; diff --git a/src/java/org/apache/cassandra/utils/FBUtilities.java b/src/java/org/apache/cassandra/utils/FBUtilities.java index c41a6c09c4f5..8077df8e5e19 100644 --- a/src/java/org/apache/cassandra/utils/FBUtilities.java +++ b/src/java/org/apache/cassandra/utils/FBUtilities.java @@ -70,8 +70,8 @@ public class FBUtilities public static final BigInteger TWO = new BigInteger("2"); private static final String DEFAULT_TRIGGER_DIR = "triggers"; + private static final String OPERATING_SYSTEM = System.getProperty("os.name").toLowerCase(); private static final boolean IS_WINDOWS = OPERATING_SYSTEM.contains("windows"); - private static final boolean HAS_PROCFS = !IS_WINDOWS && (new File(File.separator + "proc")).exists(); private static volatile InetAddress localInetAddress; diff --git a/src/java/org/apache/cassandra/utils/SigarLibrary.java b/src/java/org/apache/cassandra/utils/SigarLibrary.java index bcfa58e67693..fb3d3ae40222 100644 --- a/src/java/org/apache/cassandra/utils/SigarLibrary.java +++ b/src/java/org/apache/cassandra/utils/SigarLibrary.java @@ -110,7 +110,7 @@ private boolean hasAcceptableFileLimits() private boolean hasAcceptableAddressSpace() { // Check is invalid on Windows - if (!FBUtilities.isUnix()) + if (FBUtilities.isWindows()) return true; try diff --git a/test/pig/org/apache/pig/test/MiniCluster.java b/test/pig/org/apache/pig/test/MiniCluster.java index ad50f69e6e3f..aa03861af8c4 100644 --- a/test/pig/org/apache/pig/test/MiniCluster.java +++ b/test/pig/org/apache/pig/test/MiniCluster.java @@ -50,7 +50,7 @@ protected void setupMiniDfsAndMrClusters() { // Builds and starts the mini dfs and mapreduce clusters Configuration config = new Configuration(); - if (!FBUtilities.isUnix()) + if (FBUtilities.isWindows()) config.set("fs.file.impl", WindowsLocalFileSystem.class.getName()); m_dfs = new MiniDFSCluster(config, dataNodes, true, null); m_fileSys = m_dfs.getFileSystem(); From 3e9d345f0078922950157de4fd4c7992512b43b8 Mon Sep 17 00:00:00 2001 From: Aleksey Yeschenko Date: Wed, 17 Dec 2014 01:12:19 +0300 Subject: [PATCH 218/557] Isolate schema serializaton code patch by Aleksey Yeschenko; reviewed by Tyler Hobbs for CASSANDRA-8261 --- CHANGES.txt | 1 + .../apache/cassandra/config/CFMetaData.java | 331 +--- .../cassandra/config/ColumnDefinition.java | 134 +- .../cassandra/config/DatabaseDescriptor.java | 87 +- .../apache/cassandra/config/KSMetaData.java | 155 +- .../org/apache/cassandra/config/Schema.java | 248 ++- .../cassandra/config/TriggerDefinition.java | 63 - .../apache/cassandra/config/UTMetaData.java | 91 +- .../cassandra/cql3/functions/Functions.java | 22 +- .../cql3/functions/JavaSourceUDFFactory.java | 5 +- .../cassandra/cql3/functions/UDAggregate.java | 206 +-- .../cassandra/cql3/functions/UDFunction.java | 193 +-- .../cassandra/cql3/functions/UDHelper.java | 12 +- .../cql3/statements/CreateTableStatement.java | 24 +- .../cassandra/db/AtomicBTreeColumns.java | 3 +- .../apache/cassandra/db/BatchlogManager.java | 14 +- .../db/DefinitionsUpdateVerbHandler.java | 3 +- .../org/apache/cassandra/db/DefsTables.java | 622 ------- .../cassandra/db/HintedHandOffManager.java | 16 +- .../org/apache/cassandra/db/Keyspace.java | 2 +- .../org/apache/cassandra/db/Memtable.java | 2 +- .../db/MigrationRequestVerbHandler.java | 3 +- .../apache/cassandra/db/SystemKeyspace.java | 514 ++---- .../hadoop/ColumnFamilyRecordReader.java | 28 +- .../hadoop/cql3/CqlRecordReader.java | 28 +- .../hadoop/cql3/CqlRecordWriter.java | 23 +- .../hadoop/pig/AbstractCassandraStorage.java | 46 +- .../cassandra/hadoop/pig/CqlStorage.java | 26 +- .../io/sstable/CQLSSTableWriter.java | 10 +- .../cassandra/schema/LegacySchemaTables.java | 1480 +++++++++++++++++ .../cassandra/service/CassandraDaemon.java | 8 +- .../apache/cassandra/service/ClientState.java | 3 +- .../cassandra/service/MigrationManager.java | 127 +- .../cassandra/service/MigrationTask.java | 4 +- .../cassandra/service/StorageProxy.java | 2 +- .../cassandra/service/StorageService.java | 4 +- .../cassandra/thrift/ThriftConversion.java | 5 +- .../apache/cassandra/tools/BulkLoader.java | 6 +- .../apache/cassandra/tools/SSTableExport.java | 3 +- .../apache/cassandra/tools/SSTableImport.java | 2 +- .../cassandra/tools/SSTableLevelResetter.java | 3 +- .../cassandra/tools/StandaloneScrubber.java | 3 +- .../cassandra/tools/StandaloneSplitter.java | 4 +- .../cassandra/tools/StandaloneUpgrader.java | 2 +- .../cassandra/config/CFMetaDataTest.java | 15 +- .../config/DatabaseDescriptorTest.java | 7 +- .../cassandra/config/KSMetaDataTest.java | 6 +- .../org/apache/cassandra/cql3/CQLTester.java | 4 +- .../cassandra/db/BatchlogManagerTest.java | 4 +- .../cassandra/db/HintedHandOffTest.java | 8 +- .../LegacySchemaTablesTest.java} | 10 +- .../service/EmbeddedCassandraServiceTest.java | 2 +- .../service/StorageServiceServerTest.java | 3 +- 53 files changed, 2231 insertions(+), 2396 deletions(-) delete mode 100644 src/java/org/apache/cassandra/db/DefsTables.java create mode 100644 src/java/org/apache/cassandra/schema/LegacySchemaTables.java rename test/unit/org/apache/cassandra/{config/DefsTest.java => schema/LegacySchemaTablesTest.java} (98%) diff --git a/CHANGES.txt b/CHANGES.txt index 3571c1efde96..6f4cdec54f2c 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0 + * Modernize schema tables (CASSANDRA-8261) * Support for user-defined aggregation functions (CASSANDRA-8053) * Fix NPE in SelectStatement with empty IN values (CASSANDRA-8419) * Refactor SelectStatement, return IN results in natural order instead diff --git a/src/java/org/apache/cassandra/config/CFMetaData.java b/src/java/org/apache/cassandra/config/CFMetaData.java index eb78ec7bd267..0730ba745aaf 100644 --- a/src/java/org/apache/cassandra/config/CFMetaData.java +++ b/src/java/org/apache/cassandra/config/CFMetaData.java @@ -37,7 +37,6 @@ import org.apache.cassandra.cache.CachingOptions; import org.apache.cassandra.cql3.ColumnIdentifier; import org.apache.cassandra.cql3.QueryProcessor; -import org.apache.cassandra.cql3.UntypedResultSet; import org.apache.cassandra.cql3.statements.CFStatement; import org.apache.cassandra.cql3.statements.CreateTableStatement; import org.apache.cassandra.db.*; @@ -50,14 +49,12 @@ import org.apache.cassandra.io.compress.LZ4Compressor; import org.apache.cassandra.io.sstable.format.Version; import org.apache.cassandra.io.util.FileDataInput; +import org.apache.cassandra.schema.LegacySchemaTables; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.UUIDGen; import org.github.jamm.Unmetered; -import static org.apache.cassandra.utils.FBUtilities.fromJsonMap; -import static org.apache.cassandra.utils.FBUtilities.json; - /** * This class can be tricky to modify. Please read http://wiki.apache.org/cassandra/ConfigurationNotes for how to do so safely. */ @@ -221,7 +218,7 @@ public String toString() public volatile CompressionParameters compressionParameters = new CompressionParameters(null); // attribute setters that return the modified CFMetaData instance - public CFMetaData comment(String prop) { comment = Strings.nullToEmpty(prop); return this;} + public CFMetaData comment(String prop) {comment = Strings.nullToEmpty(prop); return this;} public CFMetaData readRepairChance(double prop) {readRepairChance = prop; return this;} public CFMetaData dcLocalReadRepairChance(double prop) {dcLocalReadRepairChance = prop; return this;} public CFMetaData gcGraceSeconds(int prop) {gcGraceSeconds = prop; return this;} @@ -344,8 +341,8 @@ public static CFMetaData newIndexMetadata(CFMetaData parent, ColumnDefinition in // Depends on parent's cache setting, turn on its index CF's cache. // Row caching is never enabled; see CASSANDRA-5732 CachingOptions indexCaching = parent.getCaching().keyCache.isEnabled() - ? CachingOptions.KEYS_ONLY - : CachingOptions.NONE; + ? CachingOptions.KEYS_ONLY + : CachingOptions.NONE; return new CFMetaData(parent.ksName, parent.indexColumnFamilyName(info), ColumnFamilyType.Standard, indexComparator, parent.cfId) .keyValidator(info.type) @@ -386,7 +383,8 @@ public CFMetaData copy(UUID newCfId) return copyOpts(new CFMetaData(ksName, cfName, cfType, comparator, newCfId), this); } - static CFMetaData copyOpts(CFMetaData newCFMD, CFMetaData oldCFMD) + @VisibleForTesting + public static CFMetaData copyOpts(CFMetaData newCFMD, CFMetaData oldCFMD) { List clonedColumns = new ArrayList<>(oldCFMD.allColumns().size()); for (ColumnDefinition cd : oldCFMD.allColumns()) @@ -449,6 +447,11 @@ public boolean isSecondaryIndex() return cfName.contains("."); } + public Map getColumnMetadata() + { + return columnMetadata; + } + /** * * @return The name of the parent cf if this is a seconday index @@ -723,14 +726,9 @@ public AbstractType getValueValidator(CellName cellName) public void reload() { - Row cfDefRow = SystemKeyspace.readSchemaRow(SystemKeyspace.SCHEMA_COLUMNFAMILIES_TABLE, ksName, cfName); - - if (cfDefRow.cf == null || !cfDefRow.cf.hasColumns()) - throw new RuntimeException(String.format("%s not found in the schema definitions keyspace.", ksName + ":" + cfName)); - try { - apply(fromSchema(cfDefRow)); + apply(LegacySchemaTables.createTableFromName(ksName, cfName)); } catch (ConfigurationException e) { @@ -739,13 +737,12 @@ public void reload() } /** - * Updates CFMetaData in-place to match cf_def - * - * *Note*: This method left package-private only for DefsTest, don't use directly! + * Updates CFMetaData in-place to match cfm * * @throws ConfigurationException if ks/cf names or cf ids didn't match */ - void apply(CFMetaData cfm) throws ConfigurationException + @VisibleForTesting + public void apply(CFMetaData cfm) throws ConfigurationException { logger.debug("applying {} to {}", cfm, this); @@ -1116,89 +1113,6 @@ private void validateIndexIntervalThresholds() throws ConfigurationException "interval (%d).", maxIndexInterval, minIndexInterval)); } - /** - * Create schema mutations to update this metadata to provided new state. - * - * @param newState The new metadata (for the same CF) - * @param modificationTimestamp Timestamp to use for mutation - * @param fromThrift whether the newState comes from thrift - * - * @return Difference between attributes in form of schema mutation - */ - public Mutation toSchemaUpdate(CFMetaData newState, long modificationTimestamp, boolean fromThrift) - { - Mutation mutation = new Mutation(SystemKeyspace.NAME, SystemKeyspace.getSchemaKSKey(ksName)); - - newState.toSchemaNoColumnsNoTriggers(mutation, modificationTimestamp); - - MapDifference columnDiff = Maps.difference(columnMetadata, newState.columnMetadata); - - // columns that are no longer needed - for (ColumnDefinition cd : columnDiff.entriesOnlyOnLeft().values()) - { - // Thrift only knows about the REGULAR ColumnDefinition type, so don't consider other type - // are being deleted just because they are not here. - if (fromThrift && cd.kind != ColumnDefinition.Kind.REGULAR) - continue; - - cd.deleteFromSchema(mutation, modificationTimestamp); - } - - // newly added columns - for (ColumnDefinition cd : columnDiff.entriesOnlyOnRight().values()) - cd.toSchema(mutation, modificationTimestamp); - - // old columns with updated attributes - for (ByteBuffer name : columnDiff.entriesDiffering().keySet()) - { - ColumnDefinition cd = newState.columnMetadata.get(name); - cd.toSchema(mutation, modificationTimestamp); - } - - MapDifference triggerDiff = Maps.difference(triggers, newState.triggers); - - // dropped triggers - for (TriggerDefinition td : triggerDiff.entriesOnlyOnLeft().values()) - td.deleteFromSchema(mutation, cfName, modificationTimestamp); - - // newly created triggers - for (TriggerDefinition td : triggerDiff.entriesOnlyOnRight().values()) - td.toSchema(mutation, cfName, modificationTimestamp); - - return mutation; - } - - /** - * Remove all CF attributes from schema - * - * @param timestamp Timestamp to use - * - * @return Mutation to use to completely remove cf from schema - */ - public Mutation dropFromSchema(long timestamp) - { - Mutation mutation = new Mutation(SystemKeyspace.NAME, SystemKeyspace.getSchemaKSKey(ksName)); - ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SchemaColumnFamiliesTable); - int ldt = (int) (System.currentTimeMillis() / 1000); - - Composite prefix = SystemKeyspace.SchemaColumnFamiliesTable.comparator.make(cfName); - cf.addAtom(new RangeTombstone(prefix, prefix.end(), timestamp, ldt)); - - for (ColumnDefinition cd : allColumns()) - cd.deleteFromSchema(mutation, timestamp); - - for (TriggerDefinition td : triggers.values()) - td.deleteFromSchema(mutation, cfName, timestamp); - - for (String indexName : Keyspace.open(this.ksName).getColumnFamilyStore(this.cfName).getBuiltIndexes()) - { - ColumnFamily indexCf = mutation.addOrGet(SystemKeyspace.BuiltIndexesTable); - indexCf.addTombstone(indexCf.getComparator().makeCellName(indexName), ldt, timestamp); - } - - return mutation; - } - public boolean isPurged() { return isPurged; @@ -1209,215 +1123,6 @@ void markPurged() isPurged = true; } - public void toSchema(Mutation mutation, long timestamp) - { - toSchemaNoColumnsNoTriggers(mutation, timestamp); - - for (TriggerDefinition td : triggers.values()) - td.toSchema(mutation, cfName, timestamp); - - for (ColumnDefinition cd : allColumns()) - cd.toSchema(mutation, timestamp); - } - - private void toSchemaNoColumnsNoTriggers(Mutation mutation, long timestamp) - { - // For property that can be null (and can be changed), we insert tombstones, to make sure - // we don't keep a property the user has removed - ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SchemaColumnFamiliesTable); - Composite prefix = SystemKeyspace.SchemaColumnFamiliesTable.comparator.make(cfName); - CFRowAdder adder = new CFRowAdder(cf, prefix, timestamp); - - adder.add("cf_id", cfId); - adder.add("type", cfType.toString()); - - if (isSuper()) - { - // We need to continue saving the comparator and subcomparator separatly, otherwise - // we won't know at deserialization if the subcomparator should be taken into account - // TODO: we should implement an on-start migration if we want to get rid of that. - adder.add("comparator", comparator.subtype(0).toString()); - adder.add("subcomparator", comparator.subtype(1).toString()); - } - else - { - adder.add("comparator", comparator.toString()); - } - - adder.add("comment", comment); - adder.add("read_repair_chance", readRepairChance); - adder.add("local_read_repair_chance", dcLocalReadRepairChance); - adder.add("gc_grace_seconds", gcGraceSeconds); - adder.add("default_validator", defaultValidator.toString()); - adder.add("key_validator", keyValidator.toString()); - adder.add("min_compaction_threshold", minCompactionThreshold); - adder.add("max_compaction_threshold", maxCompactionThreshold); - adder.add("bloom_filter_fp_chance", getBloomFilterFpChance()); - adder.add("memtable_flush_period_in_ms", memtableFlushPeriod); - adder.add("caching", caching.toString()); - adder.add("default_time_to_live", defaultTimeToLive); - adder.add("compaction_strategy_class", compactionStrategyClass.getName()); - adder.add("compression_parameters", json(compressionParameters.asThriftOptions())); - adder.add("compaction_strategy_options", json(compactionStrategyOptions)); - adder.add("min_index_interval", minIndexInterval); - adder.add("max_index_interval", maxIndexInterval); - adder.add("speculative_retry", speculativeRetry.toString()); - - for (Map.Entry entry : droppedColumns.entrySet()) - adder.addMapEntry("dropped_columns", entry.getKey().toString(), entry.getValue()); - - adder.add("is_dense", isDense); - } - - @VisibleForTesting - public static CFMetaData fromSchemaNoTriggers(UntypedResultSet.Row result, UntypedResultSet serializedColumnDefinitions) - { - try - { - String ksName = result.getString("keyspace_name"); - String cfName = result.getString("columnfamily_name"); - - AbstractType rawComparator = TypeParser.parse(result.getString("comparator")); - AbstractType subComparator = result.has("subcomparator") ? TypeParser.parse(result.getString("subcomparator")) : null; - ColumnFamilyType cfType = ColumnFamilyType.valueOf(result.getString("type")); - - AbstractType fullRawComparator = makeRawAbstractType(rawComparator, subComparator); - - List columnDefs = ColumnDefinition.fromSchema(serializedColumnDefinitions, - ksName, - cfName, - fullRawComparator, - cfType == ColumnFamilyType.Super); - - boolean isDense = result.has("is_dense") - ? result.getBoolean("is_dense") - : calculateIsDense(fullRawComparator, columnDefs); - - CellNameType comparator = CellNames.fromAbstractType(fullRawComparator, isDense); - - // if we are upgrading, we use id generated from names initially - UUID cfId = result.has("cf_id") - ? result.getUUID("cf_id") - : generateLegacyCfId(ksName, cfName); - - CFMetaData cfm = new CFMetaData(ksName, cfName, cfType, comparator, cfId); - cfm.isDense(isDense); - - cfm.readRepairChance(result.getDouble("read_repair_chance")); - cfm.dcLocalReadRepairChance(result.getDouble("local_read_repair_chance")); - cfm.gcGraceSeconds(result.getInt("gc_grace_seconds")); - cfm.defaultValidator(TypeParser.parse(result.getString("default_validator"))); - cfm.keyValidator(TypeParser.parse(result.getString("key_validator"))); - cfm.minCompactionThreshold(result.getInt("min_compaction_threshold")); - cfm.maxCompactionThreshold(result.getInt("max_compaction_threshold")); - if (result.has("comment")) - cfm.comment(result.getString("comment")); - if (result.has("memtable_flush_period_in_ms")) - cfm.memtableFlushPeriod(result.getInt("memtable_flush_period_in_ms")); - cfm.caching(CachingOptions.fromString(result.getString("caching"))); - if (result.has("default_time_to_live")) - cfm.defaultTimeToLive(result.getInt("default_time_to_live")); - if (result.has("speculative_retry")) - cfm.speculativeRetry(SpeculativeRetry.fromString(result.getString("speculative_retry"))); - cfm.compactionStrategyClass(createCompactionStrategy(result.getString("compaction_strategy_class"))); - cfm.compressionParameters(CompressionParameters.create(fromJsonMap(result.getString("compression_parameters")))); - cfm.compactionStrategyOptions(fromJsonMap(result.getString("compaction_strategy_options"))); - - if (result.has("min_index_interval")) - cfm.minIndexInterval(result.getInt("min_index_interval")); - - if (result.has("max_index_interval")) - cfm.maxIndexInterval(result.getInt("max_index_interval")); - - if (result.has("bloom_filter_fp_chance")) - cfm.bloomFilterFpChance(result.getDouble("bloom_filter_fp_chance")); - else - cfm.bloomFilterFpChance(cfm.getBloomFilterFpChance()); - - if (result.has("dropped_columns")) - cfm.droppedColumns(convertDroppedColumns(result.getMap("dropped_columns", UTF8Type.instance, LongType.instance))); - - for (ColumnDefinition cd : columnDefs) - cfm.addOrReplaceColumnDefinition(cd); - - return cfm.rebuild(); - } - catch (SyntaxException | ConfigurationException e) - { - throw new RuntimeException(e); - } - } - - public void addColumnMetadataFromAliases(List aliases, AbstractType comparator, ColumnDefinition.Kind kind) - { - if (comparator instanceof CompositeType) - { - CompositeType ct = (CompositeType)comparator; - for (int i = 0; i < aliases.size(); ++i) - { - if (aliases.get(i) != null) - { - addOrReplaceColumnDefinition(new ColumnDefinition(this, aliases.get(i), ct.types.get(i), i, kind)); - } - } - } - else - { - assert aliases.size() <= 1; - if (!aliases.isEmpty() && aliases.get(0) != null) - addOrReplaceColumnDefinition(new ColumnDefinition(this, aliases.get(0), comparator, null, kind)); - } - } - - /** - * Deserialize CF metadata from low-level representation - * - * @return Metadata deserialized from schema - */ - public static CFMetaData fromSchema(UntypedResultSet.Row result) - { - String ksName = result.getString("keyspace_name"); - String cfName = result.getString("columnfamily_name"); - - Row serializedColumns = SystemKeyspace.readSchemaRow(SystemKeyspace.SCHEMA_COLUMNS_TABLE, ksName, cfName); - CFMetaData cfm = fromSchemaNoTriggers(result, ColumnDefinition.resultify(serializedColumns)); - - Row serializedTriggers = SystemKeyspace.readSchemaRow(SystemKeyspace.SCHEMA_TRIGGERS_TABLE, ksName, cfName); - addTriggerDefinitionsFromSchema(cfm, serializedTriggers); - - return cfm; - } - - private static CFMetaData fromSchema(Row row) - { - UntypedResultSet.Row result = QueryProcessor.resultify("SELECT * FROM system.schema_columnfamilies", row).one(); - return fromSchema(result); - } - - private static Map convertDroppedColumns(Map raw) - { - Map converted = Maps.newHashMap(); - for (Map.Entry entry : raw.entrySet()) - converted.put(new ColumnIdentifier(entry.getKey(), true), entry.getValue()); - return converted; - } - - /** - * Convert current metadata into schema mutation - * - * @param timestamp Timestamp to use - * - * @return Low-level representation of the CF - * - * @throws ConfigurationException if any of the attributes didn't pass validation - */ - public Mutation toSchema(long timestamp) throws ConfigurationException - { - Mutation mutation = new Mutation(SystemKeyspace.NAME, SystemKeyspace.getSchemaKSKey(ksName)); - toSchema(mutation, timestamp); - return mutation; - } - // The comparator to validate the definition name. public AbstractType getColumnDefinitionComparator(ColumnDefinition def) @@ -1474,12 +1179,6 @@ public boolean removeColumnDefinition(ColumnDefinition def) return columnMetadata.remove(def.name.bytes) != null; } - private static void addTriggerDefinitionsFromSchema(CFMetaData cfDef, Row serializedTriggerDefinitions) - { - for (TriggerDefinition td : TriggerDefinition.fromSchema(serializedTriggerDefinitions)) - cfDef.triggers.put(td.name, td); - } - public void addTriggerDefinition(TriggerDefinition def) throws InvalidRequestException { if (containsTriggerDefinition(def)) diff --git a/src/java/org/apache/cassandra/config/ColumnDefinition.java b/src/java/org/apache/cassandra/config/ColumnDefinition.java index 354a6f170850..1cc7f1d0b041 100644 --- a/src/java/org/apache/cassandra/config/ColumnDefinition.java +++ b/src/java/org/apache/cassandra/config/ColumnDefinition.java @@ -26,25 +26,11 @@ import com.google.common.collect.Lists; import org.apache.cassandra.cql3.*; -import org.apache.cassandra.db.*; -import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.db.marshal.*; import org.apache.cassandra.exceptions.*; -import org.apache.cassandra.utils.FBUtilities; - -import static org.apache.cassandra.utils.FBUtilities.json; public class ColumnDefinition extends ColumnSpecification { - // system.schema_columns column names - private static final String COLUMN_NAME = "column_name"; - private static final String TYPE = "validator"; - private static final String INDEX_TYPE = "index_type"; - private static final String INDEX_OPTIONS = "index_options"; - private static final String INDEX_NAME = "index_name"; - private static final String COMPONENT_INDEX = "component_index"; - private static final String KIND = "type"; - /* * The type of CQL3 column this definition represents. * There is 3 main type of CQL3 columns: those parts of the partition key, @@ -62,20 +48,7 @@ public enum Kind CLUSTERING_COLUMN, REGULAR, STATIC, - COMPACT_VALUE; - - public String serialize() - { - // For backward compatibility we need to special case CLUSTERING_COLUMN - return this == CLUSTERING_COLUMN ? "clustering_key" : this.toString().toLowerCase(); - } - - public static Kind deserialize(String value) - { - if (value.equalsIgnoreCase("clustering_key")) - return CLUSTERING_COLUMN; - return Enum.valueOf(Kind.class, value.toUpperCase()); - } + COMPACT_VALUE } public final Kind kind; @@ -266,36 +239,6 @@ public boolean isPartOfCellName() return kind == Kind.REGULAR || kind == Kind.STATIC; } - /** - * Drop specified column from the schema using given mutation. - * - * @param mutation The schema mutation - * @param timestamp The timestamp to use for column modification - */ - public void deleteFromSchema(Mutation mutation, long timestamp) - { - ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SchemaColumnsTable); - int ldt = (int) (System.currentTimeMillis() / 1000); - - // Note: we do want to use name.toString(), not name.bytes directly for backward compatibility (For CQL3, this won't make a difference). - Composite prefix = SystemKeyspace.SchemaColumnsTable.comparator.make(cfName, name.toString()); - cf.addAtom(new RangeTombstone(prefix, prefix.end(), timestamp, ldt)); - } - - public void toSchema(Mutation mutation, long timestamp) - { - ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SchemaColumnsTable); - Composite prefix = SystemKeyspace.SchemaColumnsTable.comparator.make(cfName, name.toString()); - CFRowAdder adder = new CFRowAdder(cf, prefix, timestamp); - - adder.add(TYPE, type.toString()); - adder.add(INDEX_TYPE, indexType == null ? null : indexType.toString()); - adder.add(INDEX_OPTIONS, json(indexOptions)); - adder.add(INDEX_NAME, indexName); - adder.add(COMPONENT_INDEX, componentIndex); - adder.add(KIND, kind.serialize()); - } - public ColumnDefinition apply(ColumnDefinition def) throws ConfigurationException { assert kind == def.kind && Objects.equal(componentIndex, def.componentIndex); @@ -323,81 +266,6 @@ public ColumnDefinition apply(ColumnDefinition def) throws ConfigurationExcepti kind); } - public static UntypedResultSet resultify(Row serializedColumns) - { - String query = String.format("SELECT * FROM %s.%s", SystemKeyspace.NAME, SystemKeyspace.SCHEMA_COLUMNS_TABLE); - return QueryProcessor.resultify(query, serializedColumns); - } - - /** - * Deserialize columns from storage-level representation - * - * @param serializedColumns storage-level partition containing the column definitions - * @return the list of processed ColumnDefinitions - */ - public static List fromSchema(UntypedResultSet serializedColumns, String ksName, String cfName, AbstractType rawComparator, boolean isSuper) - { - List cds = new ArrayList<>(); - for (UntypedResultSet.Row row : serializedColumns) - { - Kind kind = row.has(KIND) - ? Kind.deserialize(row.getString(KIND)) - : Kind.REGULAR; - - Integer componentIndex = null; - if (row.has(COMPONENT_INDEX)) - componentIndex = row.getInt(COMPONENT_INDEX); - else if (kind == Kind.CLUSTERING_COLUMN && isSuper) - componentIndex = 1; // A ColumnDefinition for super columns applies to the column component - - // Note: we save the column name as string, but we should not assume that it is an UTF8 name, we - // we need to use the comparator fromString method - AbstractType comparator = getComponentComparator(rawComparator, componentIndex, kind); - ColumnIdentifier name = new ColumnIdentifier(comparator.fromString(row.getString(COLUMN_NAME)), comparator); - - AbstractType validator; - try - { - validator = TypeParser.parse(row.getString(TYPE)); - } - catch (RequestValidationException e) - { - throw new RuntimeException(e); - } - - IndexType indexType = null; - if (row.has(INDEX_TYPE)) - indexType = IndexType.valueOf(row.getString(INDEX_TYPE)); - - Map indexOptions = null; - if (row.has(INDEX_OPTIONS)) - indexOptions = FBUtilities.fromJsonMap(row.getString(INDEX_OPTIONS)); - - String indexName = null; - if (row.has(INDEX_NAME)) - indexName = row.getString(INDEX_NAME); - - cds.add(new ColumnDefinition(ksName, cfName, name, validator, indexType, indexOptions, indexName, componentIndex, kind)); - } - - return cds; - } - - public static AbstractType getComponentComparator(AbstractType rawComparator, Integer componentIndex, ColumnDefinition.Kind kind) - { - switch (kind) - { - case REGULAR: - if (componentIndex == null || (componentIndex == 0 && !(rawComparator instanceof CompositeType))) - return rawComparator; - - return ((CompositeType)rawComparator).types.get(componentIndex); - default: - // CQL3 column names are UTF8 - return UTF8Type.instance; - } - } - public String getIndexName() { return indexName; diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java index a0e84f9ae64f..f2897eec6987 100644 --- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java +++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java @@ -18,49 +18,29 @@ package org.apache.cassandra.config; import java.io.File; -import java.io.FileFilter; import java.io.IOException; -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.net.SocketException; -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.Enumeration; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; +import java.net.*; +import java.util.*; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableSet; import com.google.common.primitives.Longs; -import org.apache.cassandra.io.sstable.format.SSTableFormat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.cassandra.auth.AllowAllAuthenticator; -import org.apache.cassandra.auth.AllowAllAuthorizer; -import org.apache.cassandra.auth.AllowAllInternodeAuthenticator; -import org.apache.cassandra.auth.IAuthenticator; -import org.apache.cassandra.auth.IAuthorizer; -import org.apache.cassandra.auth.IInternodeAuthenticator; + +import org.apache.cassandra.auth.*; import org.apache.cassandra.config.Config.RequestSchedulerId; import org.apache.cassandra.config.EncryptionOptions.ClientEncryptionOptions; import org.apache.cassandra.config.EncryptionOptions.ServerEncryptionOptions; import org.apache.cassandra.db.ColumnFamilyStore; -import org.apache.cassandra.db.DefsTables; import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.FSWriteError; +import org.apache.cassandra.io.sstable.format.SSTableFormat; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.io.util.IAllocator; -import org.apache.cassandra.locator.DynamicEndpointSnitch; -import org.apache.cassandra.locator.EndpointSnitchInfo; -import org.apache.cassandra.locator.IEndpointSnitch; -import org.apache.cassandra.locator.SeedProvider; +import org.apache.cassandra.locator.*; import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.scheduler.IRequestScheduler; import org.apache.cassandra.scheduler.NoScheduler; @@ -69,10 +49,7 @@ import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.JVMStabilityInspector; -import org.apache.cassandra.utils.memory.HeapPool; -import org.apache.cassandra.utils.memory.NativePool; -import org.apache.cassandra.utils.memory.MemtablePool; -import org.apache.cassandra.utils.memory.SlabPool; +import org.apache.cassandra.utils.memory.*; public class DatabaseDescriptor { @@ -585,9 +562,6 @@ else if (conf.num_tokens > MAX_NUM_TOKENS) conf.server_encryption_options = conf.encryption_options; } - // hardcoded system keyspace - Schema.instance.load(SystemKeyspace.definition()); - // load the seeds for node contact points if (conf.seed_provider == null) { @@ -620,53 +594,6 @@ private static IEndpointSnitch createEndpointSnitch(String snitchClassName) thro return conf.dynamic_snitch ? new DynamicEndpointSnitch(snitch) : snitch; } - /** load keyspace (keyspace) definitions, but do not initialize the keyspace instances. */ - public static void loadSchemas() - { - ColumnFamilyStore schemaCFS = SystemKeyspace.schemaCFS(SystemKeyspace.SCHEMA_KEYSPACES_TABLE); - - // if keyspace with definitions is empty try loading the old way - if (schemaCFS.estimateKeys() == 0) - { - logger.info("Couldn't detect any schema definitions in local storage."); - // peek around the data directories to see if anything is there. - if (hasExistingNoSystemTables()) - logger.info("Found keyspace data in data directories. Consider using cqlsh to define your schema."); - else - logger.info("To create keyspaces and column families, see 'help create' in cqlsh."); - } - else - { - Schema.instance.load(DefsTables.loadFromKeyspace()); - } - - Schema.instance.updateVersion(); - } - - private static boolean hasExistingNoSystemTables() - { - for (String dataDir : getAllDataFileLocations()) - { - File dataPath = new File(dataDir); - if (dataPath.exists() && dataPath.isDirectory()) - { - // see if there are other directories present. - int dirCount = dataPath.listFiles(new FileFilter() - { - public boolean accept(File pathname) - { - return pathname.isDirectory() && !pathname.getName().equals(SystemKeyspace.NAME); - } - }).length; - - if (dirCount > 0) - return true; - } - } - - return false; - } - public static IAuthenticator getAuthenticator() { return authenticator; diff --git a/src/java/org/apache/cassandra/config/KSMetaData.java b/src/java/org/apache/cassandra/config/KSMetaData.java index e5576adbd0e2..1537aae80366 100644 --- a/src/java/org/apache/cassandra/config/KSMetaData.java +++ b/src/java/org/apache/cassandra/config/KSMetaData.java @@ -21,15 +21,10 @@ import com.google.common.base.Objects; -import org.apache.cassandra.cql3.QueryProcessor; -import org.apache.cassandra.cql3.UntypedResultSet; -import org.apache.cassandra.db.*; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.locator.*; import org.apache.cassandra.service.StorageService; -import static org.apache.cassandra.utils.FBUtilities.*; - public final class KSMetaData { public final String name; @@ -40,6 +35,14 @@ public final class KSMetaData public final UTMetaData userTypes; + public KSMetaData(String name, + Class strategyClass, + Map strategyOptions, + boolean durableWrites) + { + this(name, strategyClass, strategyOptions, durableWrites, Collections.emptyList(), new UTMetaData()); + } + public KSMetaData(String name, Class strategyClass, Map strategyOptions, @@ -49,12 +52,12 @@ public KSMetaData(String name, this(name, strategyClass, strategyOptions, durableWrites, cfDefs, new UTMetaData()); } - KSMetaData(String name, - Class strategyClass, - Map strategyOptions, - boolean durableWrites, - Iterable cfDefs, - UTMetaData userTypes) + private KSMetaData(String name, + Class strategyClass, + Map strategyOptions, + boolean durableWrites, + Iterable cfDefs, + UTMetaData userTypes) { this.name = name; this.strategyClass = strategyClass == null ? NetworkTopologyStrategy.class : strategyClass; @@ -82,9 +85,27 @@ public static KSMetaData newKeyspace(String name, Class cfDefs) + public KSMetaData cloneWithTableRemoved(CFMetaData table) + { + // clone ksm but do not include the new table + List newTables = new ArrayList<>(cfMetaData().values()); + newTables.remove(table); + assert newTables.size() == cfMetaData().size() - 1; + return cloneWith(newTables, userTypes); + } + + public KSMetaData cloneWithTableAdded(CFMetaData table) + { + // clone ksm but include the new table + List newTables = new ArrayList<>(cfMetaData().values()); + newTables.add(table); + assert newTables.size() == cfMetaData().size() + 1; + return cloneWith(newTables, userTypes); + } + + public KSMetaData cloneWith(Iterable tables, UTMetaData types) { - return new KSMetaData(ksm.name, ksm.strategyClass, ksm.strategyOptions, ksm.durableWrites, cfDefs, ksm.userTypes); + return new KSMetaData(name, strategyClass, strategyOptions, durableWrites, tables, types); } public static KSMetaData testMetadata(String name, Class strategyClass, Map strategyOptions, CFMetaData... cfDefs) @@ -145,11 +166,6 @@ public static Map optsWithRF(final Integer rf) return Collections.singletonMap("replication_factor", rf.toString()); } - public Mutation toSchemaUpdate(KSMetaData newState, long modificationTimestamp) - { - return newState.toSchema(modificationTimestamp); - } - public KSMetaData validate() throws ConfigurationException { if (!CFMetaData.isNameValid(name)) @@ -165,107 +181,4 @@ public KSMetaData validate() throws ConfigurationException return this; } - - public KSMetaData reloadAttributes() - { - Row ksDefRow = SystemKeyspace.readSchemaRow(SystemKeyspace.SCHEMA_KEYSPACES_TABLE, name); - - if (ksDefRow.cf == null) - throw new RuntimeException(String.format("%s not found in the schema definitions keyspaceName (%s).", name, SystemKeyspace.SCHEMA_KEYSPACES_TABLE)); - - return fromSchema(ksDefRow, Collections.emptyList(), userTypes); - } - - public Mutation dropFromSchema(long timestamp) - { - Mutation mutation = new Mutation(SystemKeyspace.NAME, SystemKeyspace.getSchemaKSKey(name)); - - mutation.delete(SystemKeyspace.SCHEMA_KEYSPACES_TABLE, timestamp); - mutation.delete(SystemKeyspace.SCHEMA_COLUMNFAMILIES_TABLE, timestamp); - mutation.delete(SystemKeyspace.SCHEMA_COLUMNS_TABLE, timestamp); - mutation.delete(SystemKeyspace.SCHEMA_TRIGGERS_TABLE, timestamp); - mutation.delete(SystemKeyspace.SCHEMA_USER_TYPES_TABLE, timestamp); - mutation.delete(SystemKeyspace.SCHEMA_FUNCTIONS_TABLE, timestamp); - mutation.delete(SystemKeyspace.SCHEMA_AGGREGATES_TABLE, timestamp); - mutation.delete(SystemKeyspace.BUILT_INDEXES_TABLE, timestamp); - - return mutation; - } - - public Mutation toSchema(long timestamp) - { - Mutation mutation = new Mutation(SystemKeyspace.NAME, SystemKeyspace.getSchemaKSKey(name)); - ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SchemaKeyspacesTable); - CFRowAdder adder = new CFRowAdder(cf, SystemKeyspace.SchemaKeyspacesTable.comparator.builder().build(), timestamp); - - adder.add("durable_writes", durableWrites); - adder.add("strategy_class", strategyClass.getName()); - adder.add("strategy_options", json(strategyOptions)); - - for (CFMetaData cfm : cfMetaData.values()) - cfm.toSchema(mutation, timestamp); - - userTypes.toSchema(mutation, timestamp); - return mutation; - } - - /** - * Deserialize only Keyspace attributes without nested ColumnFamilies - * - * @param row Keyspace attributes in serialized form - * - * @return deserialized keyspace without cf_defs - */ - public static KSMetaData fromSchema(Row row, Iterable cfms, UTMetaData userTypes) - { - UntypedResultSet.Row result = QueryProcessor.resultify("SELECT * FROM system.schema_keyspaces", row).one(); - try - { - return new KSMetaData(result.getString("keyspace_name"), - AbstractReplicationStrategy.getClass(result.getString("strategy_class")), - fromJsonMap(result.getString("strategy_options")), - result.getBoolean("durable_writes"), - cfms, - userTypes); - } - catch (ConfigurationException e) - { - throw new RuntimeException(e); - } - } - - /** - * Deserialize Keyspace with nested ColumnFamilies - * - * @param serializedKs Keyspace in serialized form - * @param serializedCFs Collection of the serialized ColumnFamilies - * - * @return deserialized keyspace with cf_defs - */ - public static KSMetaData fromSchema(Row serializedKs, Row serializedCFs, Row serializedUserTypes) - { - Map cfs = deserializeColumnFamilies(serializedCFs); - UTMetaData userTypes = new UTMetaData(UTMetaData.fromSchema(serializedUserTypes)); - return fromSchema(serializedKs, cfs.values(), userTypes); - } - - /** - * Deserialize ColumnFamilies from low-level schema representation, all of them belong to the same keyspace - * - * @return map containing name of the ColumnFamily and it's metadata for faster lookup - */ - public static Map deserializeColumnFamilies(Row row) - { - if (row.cf == null) - return Collections.emptyMap(); - - UntypedResultSet results = QueryProcessor.resultify("SELECT * FROM system.schema_columnfamilies", row); - Map cfms = new HashMap<>(results.size()); - for (UntypedResultSet.Row result : results) - { - CFMetaData cfm = CFMetaData.fromSchema(result); - cfms.put(cfm.cfName, cfm); - } - return cfms; - } } diff --git a/src/java/org/apache/cassandra/config/Schema.java b/src/java/org/apache/cassandra/config/Schema.java index 43cc6b51eb8a..21244ab4eb86 100644 --- a/src/java/org/apache/cassandra/config/Schema.java +++ b/src/java/org/apache/cassandra/config/Schema.java @@ -17,7 +17,6 @@ */ package org.apache.cassandra.config; -import java.nio.charset.CharacterCodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.*; @@ -27,13 +26,18 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.apache.cassandra.cql3.functions.Functions; +import org.apache.cassandra.cql3.functions.UDAggregate; +import org.apache.cassandra.cql3.functions.UDFunction; import org.apache.cassandra.db.*; import org.apache.cassandra.db.Keyspace; -import org.apache.cassandra.db.index.SecondaryIndexManager; +import org.apache.cassandra.db.commitlog.CommitLog; +import org.apache.cassandra.db.compaction.CompactionManager; +import org.apache.cassandra.db.marshal.UserType; import org.apache.cassandra.io.sstable.Descriptor; +import org.apache.cassandra.schema.LegacySchemaTables; import org.apache.cassandra.service.MigrationManager; import org.apache.cassandra.utils.ConcurrentBiMap; -import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.Pair; import org.cliffc.high_scale_lib.NonBlockingHashMap; @@ -78,10 +82,20 @@ public class Schema } /** - * Initialize empty schema object + * Initialize empty schema object and load the hardcoded system tables */ public Schema() - {} + { + load(SystemKeyspace.definition()); + } + + /** load keyspace (keyspace) definitions, but do not initialize the keyspace instances. */ + public Schema loadFromDisk() + { + load(LegacySchemaTables.readSchemaFromSystemTables()); + updateVersion(); + return this; + } /** * Load up non-system keyspaces @@ -350,28 +364,8 @@ public UUID getVersion() */ public void updateVersion() { - try - { - MessageDigest versionDigest = MessageDigest.getInstance("MD5"); - - for (Row row : SystemKeyspace.serializedSchema()) - { - if (invalidSchemaRow(row) || ignoredSchemaRow(row)) - continue; - - // we want to digest only live columns - ColumnFamilyStore.removeDeletedColumnsOnly(row.cf, Integer.MAX_VALUE, SecondaryIndexManager.nullUpdater); - row.cf.purgeTombstones(Integer.MAX_VALUE); - row.cf.updateDigest(versionDigest); - } - - version = UUID.nameUUIDFromBytes(versionDigest.digest()); - SystemKeyspace.updateSchemaVersion(version); - } - catch (Exception e) - { - throw new RuntimeException(e); - } + version = LegacySchemaTables.calculateSchemaDigest(); + SystemKeyspace.updateSchemaVersion(version); } /* @@ -399,20 +393,202 @@ public synchronized void clear() updateVersionAndAnnounce(); } - public static boolean invalidSchemaRow(Row row) + public void addKeyspace(KSMetaData ksm) { - return row.cf == null || (row.cf.isMarkedForDelete() && !row.cf.hasColumns()); + assert getKSMetaData(ksm.name) == null; + load(ksm); + + Keyspace.open(ksm.name); + MigrationManager.instance.notifyCreateKeyspace(ksm); } - public static boolean ignoredSchemaRow(Row row) + public void updateKeyspace(String ksName) { - try - { - return ByteBufferUtil.string(row.key.getKey()).equals(SystemKeyspace.NAME); - } - catch (CharacterCodingException e) + KSMetaData oldKsm = getKSMetaData(ksName); + assert oldKsm != null; + KSMetaData newKsm = LegacySchemaTables.createKeyspaceFromName(ksName).cloneWith(oldKsm.cfMetaData().values(), oldKsm.userTypes); + + setKeyspaceDefinition(newKsm); + + Keyspace.open(ksName).createReplicationStrategy(newKsm); + MigrationManager.instance.notifyUpdateKeyspace(newKsm); + } + + public void dropKeyspace(String ksName) + { + KSMetaData ksm = Schema.instance.getKSMetaData(ksName); + String snapshotName = Keyspace.getTimestampedSnapshotName(ksName); + + CompactionManager.instance.interruptCompactionFor(ksm.cfMetaData().values(), true); + + Keyspace keyspace = Keyspace.open(ksm.name); + + // remove all cfs from the keyspace instance. + List droppedCfs = new ArrayList<>(); + for (CFMetaData cfm : ksm.cfMetaData().values()) { - throw new RuntimeException(e); + ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfm.cfName); + + purge(cfm); + + if (DatabaseDescriptor.isAutoSnapshot()) + cfs.snapshot(snapshotName); + Keyspace.open(ksm.name).dropCf(cfm.cfId); + + droppedCfs.add(cfm.cfId); } + + // remove the keyspace from the static instances. + Keyspace.clear(ksm.name); + clearKeyspaceDefinition(ksm); + + keyspace.writeOrder.awaitNewBarrier(); + + // force a new segment in the CL + CommitLog.instance.forceRecycleAllSegments(droppedCfs); + + MigrationManager.instance.notifyDropKeyspace(ksm); + } + + public void addTable(CFMetaData cfm) + { + assert getCFMetaData(cfm.ksName, cfm.cfName) == null; + KSMetaData ksm = getKSMetaData(cfm.ksName).cloneWithTableAdded(cfm); + + logger.info("Loading {}", cfm); + + load(cfm); + + // make sure it's init-ed w/ the old definitions first, + // since we're going to call initCf on the new one manually + Keyspace.open(cfm.ksName); + + setKeyspaceDefinition(ksm); + Keyspace.open(ksm.name).initCf(cfm.cfId, cfm.cfName, true); + MigrationManager.instance.notifyCreateColumnFamily(cfm); + } + + public void updateTable(String ksName, String tableName) + { + CFMetaData cfm = getCFMetaData(ksName, tableName); + assert cfm != null; + cfm.reload(); + + Keyspace keyspace = Keyspace.open(cfm.ksName); + keyspace.getColumnFamilyStore(cfm.cfName).reload(); + MigrationManager.instance.notifyUpdateColumnFamily(cfm); + } + + public void dropTable(String ksName, String tableName) + { + KSMetaData ksm = getKSMetaData(ksName); + assert ksm != null; + ColumnFamilyStore cfs = Keyspace.open(ksName).getColumnFamilyStore(tableName); + assert cfs != null; + + // reinitialize the keyspace. + CFMetaData cfm = ksm.cfMetaData().get(tableName); + + purge(cfm); + setKeyspaceDefinition(ksm.cloneWithTableRemoved(cfm)); + + CompactionManager.instance.interruptCompactionFor(Arrays.asList(cfm), true); + + if (DatabaseDescriptor.isAutoSnapshot()) + cfs.snapshot(Keyspace.getTimestampedSnapshotName(cfs.name)); + Keyspace.open(ksm.name).dropCf(cfm.cfId); + MigrationManager.instance.notifyDropColumnFamily(cfm); + + CommitLog.instance.forceRecycleAllSegments(Collections.singleton(cfm.cfId)); + } + + public void addType(UserType ut) + { + KSMetaData ksm = getKSMetaData(ut.keyspace); + assert ksm != null; + + logger.info("Loading {}", ut); + + ksm.userTypes.addType(ut); + + MigrationManager.instance.notifyCreateUserType(ut); + } + + public void updateType(UserType ut) + { + KSMetaData ksm = getKSMetaData(ut.keyspace); + assert ksm != null; + + logger.info("Updating {}", ut); + + ksm.userTypes.addType(ut); + + MigrationManager.instance.notifyUpdateUserType(ut); + } + + public void dropType(UserType ut) + { + KSMetaData ksm = getKSMetaData(ut.keyspace); + assert ksm != null; + + ksm.userTypes.removeType(ut); + + MigrationManager.instance.notifyDropUserType(ut); + } + + public void addFunction(UDFunction udf) + { + logger.info("Loading {}", udf); + + Functions.addFunction(udf); + + MigrationManager.instance.notifyCreateFunction(udf); + } + + public void updateFunction(UDFunction udf) + { + logger.info("Updating {}", udf); + + Functions.replaceFunction(udf); + + MigrationManager.instance.notifyUpdateFunction(udf); + } + + public void dropFunction(UDFunction udf) + { + logger.info("Drop {}", udf); + + // TODO: this is kind of broken as this remove all overloads of the function name + Functions.removeFunction(udf.name(), udf.argTypes()); + + MigrationManager.instance.notifyDropFunction(udf); + } + + public void addAggregate(UDAggregate udf) + { + logger.info("Loading {}", udf); + + Functions.addFunction(udf); + + MigrationManager.instance.notifyCreateAggregate(udf); + } + + public void updateAggregate(UDAggregate udf) + { + logger.info("Updating {}", udf); + + Functions.replaceFunction(udf); + + MigrationManager.instance.notifyUpdateAggregate(udf); + } + + public void dropAggregate(UDAggregate udf) + { + logger.info("Drop {}", udf); + + // TODO: this is kind of broken as this remove all overloads of the function name + Functions.removeFunction(udf.name(), udf.argTypes()); + + MigrationManager.instance.notifyDropAggregate(udf); } } diff --git a/src/java/org/apache/cassandra/config/TriggerDefinition.java b/src/java/org/apache/cassandra/config/TriggerDefinition.java index a395549ef52f..6a84379d242f 100644 --- a/src/java/org/apache/cassandra/config/TriggerDefinition.java +++ b/src/java/org/apache/cassandra/config/TriggerDefinition.java @@ -18,20 +18,10 @@ */ package org.apache.cassandra.config; -import java.util.*; - import com.google.common.base.Objects; -import org.apache.cassandra.cql3.QueryProcessor; -import org.apache.cassandra.cql3.UntypedResultSet; -import org.apache.cassandra.db.*; -import org.apache.cassandra.db.composites.Composite; -import org.apache.cassandra.db.marshal.UTF8Type; - public class TriggerDefinition { - public static final String TRIGGER_NAME = "trigger_name"; - public static final String TRIGGER_OPTIONS = "trigger_options"; public static final String CLASS = "class"; public final String name; @@ -51,59 +41,6 @@ public static TriggerDefinition create(String name, String classOption) return new TriggerDefinition(name, classOption); } - /** - * Deserialize triggers from storage-level representation. - * - * @param serializedTriggers storage-level partition containing the trigger definitions - * @return the list of processed TriggerDefinitions - */ - public static List fromSchema(Row serializedTriggers) - { - List triggers = new ArrayList<>(); - String query = String.format("SELECT * FROM %s.%s", SystemKeyspace.NAME, SystemKeyspace.SCHEMA_TRIGGERS_TABLE); - for (UntypedResultSet.Row row : QueryProcessor.resultify(query, serializedTriggers)) - { - String name = row.getString(TRIGGER_NAME); - String classOption = row.getMap(TRIGGER_OPTIONS, UTF8Type.instance, UTF8Type.instance).get(CLASS); - triggers.add(new TriggerDefinition(name, classOption)); - } - return triggers; - } - - /** - * Add specified trigger to the schema using given mutation. - * - * @param mutation The schema mutation - * @param cfName The name of the parent ColumnFamily - * @param timestamp The timestamp to use for the columns - */ - public void toSchema(Mutation mutation, String cfName, long timestamp) - { - ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SCHEMA_TRIGGERS_TABLE); - - CFMetaData cfm = SystemKeyspace.SchemaTriggersTable; - Composite prefix = cfm.comparator.make(cfName, name); - CFRowAdder adder = new CFRowAdder(cf, prefix, timestamp); - - adder.addMapEntry(TRIGGER_OPTIONS, CLASS, classOption); - } - - /** - * Drop specified trigger from the schema using given mutation. - * - * @param mutation The schema mutation - * @param cfName The name of the parent ColumnFamily - * @param timestamp The timestamp to use for the tombstone - */ - public void deleteFromSchema(Mutation mutation, String cfName, long timestamp) - { - ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SCHEMA_TRIGGERS_TABLE); - int ldt = (int) (System.currentTimeMillis() / 1000); - - Composite prefix = SystemKeyspace.SchemaTriggersTable.comparator.make(cfName, name); - cf.addAtom(new RangeTombstone(prefix, prefix.end(), timestamp, ldt)); - } - @Override public boolean equals(Object o) { diff --git a/src/java/org/apache/cassandra/config/UTMetaData.java b/src/java/org/apache/cassandra/config/UTMetaData.java index 46a7a4f09df8..08cedee004f7 100644 --- a/src/java/org/apache/cassandra/config/UTMetaData.java +++ b/src/java/org/apache/cassandra/config/UTMetaData.java @@ -20,12 +20,7 @@ import java.nio.ByteBuffer; import java.util.*; -import org.apache.cassandra.db.*; -import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.db.marshal.*; -import org.apache.cassandra.exceptions.RequestValidationException; -import org.apache.cassandra.cql3.*; -import org.apache.cassandra.utils.ByteBufferUtil; /** * Defined (and loaded) user types. @@ -42,91 +37,11 @@ public UTMetaData() this(new HashMap()); } - UTMetaData(Map types) + public UTMetaData(Map types) { this.userTypes = types; } - private static UserType fromSchema(UntypedResultSet.Row row) - { - try - { - String keyspace = row.getString("keyspace_name"); - ByteBuffer name = ByteBufferUtil.bytes(row.getString("type_name")); - List rawColumns = row.getList("field_names", UTF8Type.instance); - List rawTypes = row.getList("field_types", UTF8Type.instance); - - List columns = new ArrayList<>(rawColumns.size()); - for (String rawColumn : rawColumns) - columns.add(ByteBufferUtil.bytes(rawColumn)); - - List> types = new ArrayList<>(rawTypes.size()); - for (String rawType : rawTypes) - types.add(TypeParser.parse(rawType)); - - return new UserType(keyspace, name, columns, types); - } - catch (RequestValidationException e) - { - // If it has been written in the schema, it should be valid - throw new AssertionError(); - } - } - - public static Map fromSchema(Row row) - { - UntypedResultSet results = QueryProcessor.resultify("SELECT * FROM system." + SystemKeyspace.SCHEMA_USER_TYPES_TABLE, row); - Map types = new HashMap<>(results.size()); - for (UntypedResultSet.Row result : results) - { - UserType type = fromSchema(result); - types.put(type.name, type); - } - return types; - } - - public static Mutation toSchema(UserType newType, long timestamp) - { - return toSchema(new Mutation(SystemKeyspace.NAME, SystemKeyspace.getSchemaKSKey(newType.keyspace)), newType, timestamp); - } - - public static Mutation toSchema(Mutation mutation, UserType newType, long timestamp) - { - ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SCHEMA_USER_TYPES_TABLE); - - Composite prefix = SystemKeyspace.SchemaUserTypesTable.comparator.make(newType.name); - CFRowAdder adder = new CFRowAdder(cf, prefix, timestamp); - - adder.resetCollection("field_names"); - adder.resetCollection("field_types"); - - for (int i = 0; i < newType.size(); i++) - { - adder.addListEntry("field_names", newType.fieldName(i)); - adder.addListEntry("field_types", newType.fieldType(i).toString()); - } - return mutation; - } - - public Mutation toSchema(Mutation mutation, long timestamp) - { - for (UserType ut : userTypes.values()) - toSchema(mutation, ut, timestamp); - return mutation; - } - - public static Mutation dropFromSchema(UserType droppedType, long timestamp) - { - Mutation mutation = new Mutation(SystemKeyspace.NAME, SystemKeyspace.getSchemaKSKey(droppedType.keyspace)); - ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SCHEMA_USER_TYPES_TABLE); - int ldt = (int) (System.currentTimeMillis() / 1000); - - Composite prefix = SystemKeyspace.SchemaUserTypesTable.comparator.make(droppedType.name); - cf.addAtom(new RangeTombstone(prefix, prefix.end(), timestamp, ldt)); - - return mutation; - } - public UserType getType(ByteBuffer typeName) { return userTypes.get(typeName); @@ -134,11 +49,11 @@ public UserType getType(ByteBuffer typeName) public Map getAllTypes() { - // Copy to avoid concurrent modification while iterating. Not intended to be called on a criticial path anyway + // Copy to avoid concurrent modification while iterating. Not intended to be called on a critical path anyway return new HashMap<>(userTypes); } - // This is *not* thread safe but is only called in DefsTables that is synchronized. + // This is *not* thread safe but is only called in Schema that is synchronized. public void addType(UserType type) { UserType old = userTypes.get(type.name); diff --git a/src/java/org/apache/cassandra/cql3/functions/Functions.java b/src/java/org/apache/cassandra/cql3/functions/Functions.java index 7d94e47463a4..b55ebc5e9236 100644 --- a/src/java/org/apache/cassandra/cql3/functions/Functions.java +++ b/src/java/org/apache/cassandra/cql3/functions/Functions.java @@ -22,12 +22,9 @@ import java.util.List; import com.google.common.collect.ArrayListMultimap; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.apache.cassandra.config.Schema; import org.apache.cassandra.cql3.*; -import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.service.IMigrationListener; @@ -35,16 +32,11 @@ public abstract class Functions { - private static final Logger logger = LoggerFactory.getLogger(Functions.class); - // We special case the token function because that's the only function whose argument types actually // depend on the table on which the function is called. Because it's the sole exception, it's easier // to handle it as a special case. private static final FunctionName TOKEN_FUNCTION_NAME = FunctionName.nativeFunction("token"); - private static final String SELECT_UD_FUNCTION = "SELECT * FROM " + SystemKeyspace.NAME + '.' + SystemKeyspace.SCHEMA_FUNCTIONS_TABLE; - private static final String SELECT_UD_AGGREGATE = "SELECT * FROM " + SystemKeyspace.NAME + '.' + SystemKeyspace.SCHEMA_AGGREGATES_TABLE; - private Functions() {} private static final ArrayListMultimap declared = ArrayListMultimap.create(); @@ -96,18 +88,6 @@ private static void declare(Function fun) declared.put(fun.name(), fun); } - /** - * Loading existing UDFs from the schema. - */ - public static void loadUDFFromSchema() - { - logger.debug("Loading UDFs"); - for (UntypedResultSet.Row row : QueryProcessor.executeOnceInternal(SELECT_UD_FUNCTION)) - addFunction(UDFunction.fromSchema(row)); - for (UntypedResultSet.Row row : QueryProcessor.executeOnceInternal(SELECT_UD_AGGREGATE)) - addFunction(UDAggregate.fromSchema(row)); - } - public static ColumnSpecification makeArgSpec(String receiverKs, String receiverCf, Function fun, int i) { return new ColumnSpecification(receiverKs, @@ -270,7 +250,7 @@ private static String toString(List funs) return sb.toString(); } - // This is *not* thread safe but is only called in DefsTables that is synchronized. + // This is *not* thread safe but is only called in SchemaTables that is synchronized. public static void addFunction(AbstractFunction fun) { // We shouldn't get there unless that function don't exist diff --git a/src/java/org/apache/cassandra/cql3/functions/JavaSourceUDFFactory.java b/src/java/org/apache/cassandra/cql3/functions/JavaSourceUDFFactory.java index 5b1f5bd4dafb..e4e6a559c238 100644 --- a/src/java/org/apache/cassandra/cql3/functions/JavaSourceUDFFactory.java +++ b/src/java/org/apache/cassandra/cql3/functions/JavaSourceUDFFactory.java @@ -76,9 +76,8 @@ static UDFunction buildUDF(FunctionName name, // It is separated to allow return type and argument type checks during compile time via javassist. String codeExecInt = generateExecuteInternalMethod(argNames, body, javaReturnType, javaParamTypes); - if (logger.isDebugEnabled()) - logger.debug("Generating java source UDF for {} with following c'tor and functions:\n{}\n{}\n{}", - name, codeCtor, codeExecInt, codeExec); + logger.debug("Generating java source UDF for {} with following c'tor and functions:\n{}\n{}\n{}", + name, codeCtor, codeExecInt, codeExec); try { diff --git a/src/java/org/apache/cassandra/cql3/functions/UDAggregate.java b/src/java/org/apache/cassandra/cql3/functions/UDAggregate.java index f2592650f6ef..e9c33ba57416 100644 --- a/src/java/org/apache/cassandra/cql3/functions/UDAggregate.java +++ b/src/java/org/apache/cassandra/cql3/functions/UDAggregate.java @@ -24,12 +24,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.cassandra.cql3.*; -import org.apache.cassandra.db.*; -import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.db.marshal.AbstractType; -import org.apache.cassandra.db.marshal.TypeParser; -import org.apache.cassandra.db.marshal.UTF8Type; import org.apache.cassandra.exceptions.*; /** @@ -58,6 +53,45 @@ public UDAggregate(FunctionName name, this.initcond = initcond; } + public static UDAggregate create(FunctionName name, + List> argTypes, + AbstractType returnType, + FunctionName stateFunc, + FunctionName finalFunc, + AbstractType stateType, + ByteBuffer initcond) + throws InvalidRequestException + { + List> stateTypes = new ArrayList<>(argTypes.size() + 1); + stateTypes.add(stateType); + stateTypes.addAll(argTypes); + List> finalTypes = Collections.>singletonList(stateType); + return new UDAggregate(name, + argTypes, + returnType, + resolveScalar(name, stateFunc, stateTypes), + finalFunc != null ? resolveScalar(name, finalFunc, finalTypes) : null, + initcond); + } + + public static UDAggregate createBroken(FunctionName name, + List> argTypes, + AbstractType returnType, + ByteBuffer initcond, + final InvalidRequestException reason) + { + return new UDAggregate(name, argTypes, returnType, null, null, initcond) + { + public Aggregate newAggregate() throws InvalidRequestException + { + throw new InvalidRequestException(String.format("Aggregate '%s' exists but hasn't been loaded successfully for the following reason: %s. " + + "Please see the server log for more details", + this, + reason.getMessage())); + } + }; + } + public boolean hasReferenceTo(Function function) { return stateFunction == function || finalFunction == function; @@ -85,6 +119,26 @@ public boolean isNative() return false; } + public ScalarFunction stateFunction() + { + return stateFunction; + } + + public ScalarFunction finalFunction() + { + return finalFunction; + } + + public ByteBuffer initialCondition() + { + return initcond; + } + + public AbstractType stateType() + { + return stateType; + } + public Aggregate newAggregate() throws InvalidRequestException { return new Aggregate() @@ -128,134 +182,6 @@ private static ScalarFunction resolveScalar(FunctionName aName, FunctionName fNa return (ScalarFunction) func; } - private static Mutation makeSchemaMutation(FunctionName name) - { - UTF8Type kv = (UTF8Type)SystemKeyspace.SchemaAggregatesTable.getKeyValidator(); - return new Mutation(SystemKeyspace.NAME, kv.decompose(name.keyspace)); - } - - public Mutation toSchemaDrop(long timestamp) - { - Mutation mutation = makeSchemaMutation(name); - ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SCHEMA_AGGREGATES_TABLE); - - Composite prefix = SystemKeyspace.SchemaAggregatesTable.comparator.make(name.name, UDHelper.computeSignature(argTypes)); - int ldt = (int) (System.currentTimeMillis() / 1000); - cf.addAtom(new RangeTombstone(prefix, prefix.end(), timestamp, ldt)); - - return mutation; - } - - public static Map fromSchema(Row row) - { - UntypedResultSet results = QueryProcessor.resultify("SELECT * FROM system." + SystemKeyspace.SCHEMA_AGGREGATES_TABLE, row); - Map udfs = new HashMap<>(results.size()); - for (UntypedResultSet.Row result : results) - udfs.put(SystemKeyspace.SchemaAggregatesTable.comparator.make(result.getString("aggregate_name"), result.getBlob("signature")), - fromSchema(result)); - return udfs; - } - - public Mutation toSchemaUpdate(long timestamp) - { - Mutation mutation = makeSchemaMutation(name); - ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SCHEMA_AGGREGATES_TABLE); - - Composite prefix = SystemKeyspace.SchemaAggregatesTable.comparator.make(name.name, UDHelper.computeSignature(argTypes)); - CFRowAdder adder = new CFRowAdder(cf, prefix, timestamp); - - adder.resetCollection("argument_types"); - adder.add("return_type", returnType.toString()); - adder.add("state_func", stateFunction.name().name); - if (stateType != null) - adder.add("state_type", stateType.toString()); - if (finalFunction != null) - adder.add("final_func", finalFunction.name().name); - if (initcond != null) - adder.add("initcond", initcond); - - for (AbstractType argType : argTypes) - adder.addListEntry("argument_types", argType.toString()); - - return mutation; - } - - public static UDAggregate fromSchema(UntypedResultSet.Row row) - { - String ksName = row.getString("keyspace_name"); - String functionName = row.getString("aggregate_name"); - FunctionName name = new FunctionName(ksName, functionName); - - List types = row.getList("argument_types", UTF8Type.instance); - - List> argTypes; - if (types == null) - { - argTypes = Collections.emptyList(); - } - else - { - argTypes = new ArrayList<>(types.size()); - for (String type : types) - argTypes.add(parseType(type)); - } - - AbstractType returnType = parseType(row.getString("return_type")); - - FunctionName stateFunc = new FunctionName(ksName, row.getString("state_func")); - FunctionName finalFunc = row.has("final_func") ? new FunctionName(ksName, row.getString("final_func")) : null; - AbstractType stateType = row.has("state_type") ? parseType(row.getString("state_type")) : null; - ByteBuffer initcond = row.has("initcond") ? row.getBytes("initcond") : null; - - try - { - return create(name, argTypes, returnType, stateFunc, finalFunc, stateType, initcond); - } - catch (InvalidRequestException reason) - { - return createBroken(name, argTypes, returnType, initcond, reason); - } - } - - private static UDAggregate createBroken(FunctionName name, List> argTypes, AbstractType returnType, - ByteBuffer initcond, final InvalidRequestException reason) - { - return new UDAggregate(name, argTypes, returnType, null, null, initcond) { - public Aggregate newAggregate() throws InvalidRequestException - { - throw new InvalidRequestException(String.format("Aggregate '%s' exists but hasn't been loaded successfully for the following reason: %s. " - + "Please see the server log for more details", this, reason.getMessage())); - } - }; - } - - private static UDAggregate create(FunctionName name, List> argTypes, AbstractType returnType, - FunctionName stateFunc, FunctionName finalFunc, AbstractType stateType, ByteBuffer initcond) - throws InvalidRequestException - { - List> stateTypes = new ArrayList<>(argTypes.size() + 1); - stateTypes.add(stateType); - stateTypes.addAll(argTypes); - List> finalTypes = Collections.>singletonList(stateType); - return new UDAggregate(name, argTypes, returnType, - resolveScalar(name, stateFunc, stateTypes), - finalFunc != null ? resolveScalar(name, finalFunc, finalTypes) : null, - initcond); - } - - private static AbstractType parseType(String str) - { - // We only use this when reading the schema where we shouldn't get an error - try - { - return TypeParser.parse(str); - } - catch (SyntaxException | ConfigurationException e) - { - throw new RuntimeException(e); - } - } - @Override public boolean equals(Object o) { @@ -263,13 +189,13 @@ public boolean equals(Object o) return false; UDAggregate that = (UDAggregate) o; - return Objects.equal(this.name, that.name) - && Functions.typeEquals(this.argTypes, that.argTypes) - && Functions.typeEquals(this.returnType, that.returnType) - && Objects.equal(this.stateFunction, that.stateFunction) - && Objects.equal(this.finalFunction, that.finalFunction) - && Objects.equal(this.stateType, that.stateType) - && Objects.equal(this.initcond, that.initcond); + return Objects.equal(name, that.name) + && Functions.typeEquals(argTypes, that.argTypes) + && Functions.typeEquals(returnType, that.returnType) + && Objects.equal(stateFunction, that.stateFunction) + && Objects.equal(finalFunction, that.finalFunction) + && Objects.equal(stateType, that.stateType) + && Objects.equal(initcond, that.initcond); } @Override diff --git a/src/java/org/apache/cassandra/cql3/functions/UDFunction.java b/src/java/org/apache/cassandra/cql3/functions/UDFunction.java index 8b42e51cf2d5..46724516e2d9 100644 --- a/src/java/org/apache/cassandra/cql3/functions/UDFunction.java +++ b/src/java/org/apache/cassandra/cql3/functions/UDFunction.java @@ -30,11 +30,7 @@ import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.config.Schema; import org.apache.cassandra.cql3.*; -import org.apache.cassandra.db.*; -import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.db.marshal.AbstractType; -import org.apache.cassandra.db.marshal.UTF8Type; -import org.apache.cassandra.db.marshal.TypeParser; import org.apache.cassandra.exceptions.*; import org.apache.cassandra.service.MigrationManager; import org.apache.cassandra.utils.ByteBufferUtil; @@ -47,9 +43,10 @@ public abstract class UDFunction extends AbstractFunction implements ScalarFunct protected static final Logger logger = LoggerFactory.getLogger(UDFunction.class); protected final List argNames; + protected final String language; protected final String body; - private final boolean deterministic; + protected final boolean isDeterministic; protected final DataType[] argDataTypes; protected final DataType returnDataType; @@ -60,10 +57,10 @@ protected UDFunction(FunctionName name, AbstractType returnType, String language, String body, - boolean deterministic) + boolean isDeterministic) { this(name, argNames, argTypes, UDHelper.driverTypes(argTypes), returnType, - UDHelper.driverType(returnType), language, body, deterministic); + UDHelper.driverType(returnType), language, body, isDeterministic); } protected UDFunction(FunctionName name, @@ -74,14 +71,14 @@ protected UDFunction(FunctionName name, DataType returnDataType, String language, String body, - boolean deterministic) + boolean isDeterministic) { super(name, argTypes, returnType); assert new HashSet<>(argNames).size() == argNames.size() : "duplicate argument names"; this.argNames = argNames; this.language = language; this.body = body; - this.deterministic = deterministic; + this.isDeterministic = isDeterministic; this.argDataTypes = argDataTypes; this.returnDataType = returnDataType; } @@ -92,13 +89,13 @@ public static UDFunction create(FunctionName name, AbstractType returnType, String language, String body, - boolean deterministic) + boolean isDeterministic) throws InvalidRequestException { switch (language) { - case "java": return JavaSourceUDFFactory.buildUDF(name, argNames, argTypes, returnType, body, deterministic); - default: return new ScriptBasedUDF(name, argNames, argTypes, returnType, language, body, deterministic); + case "java": return JavaSourceUDFFactory.buildUDF(name, argNames, argTypes, returnType, body, isDeterministic); + default: return new ScriptBasedUDF(name, argNames, argTypes, returnType, language, body, isDeterministic); } } @@ -111,24 +108,27 @@ public static UDFunction create(FunctionName name, * 2) we return a meaningful error message if the function is executed (something more precise * than saying that the function doesn't exist) */ - private static UDFunction createBrokenFunction(FunctionName name, - List argNames, - List> argTypes, - AbstractType returnType, - String language, - String body, - final InvalidRequestException reason) + public static UDFunction createBrokenFunction(FunctionName name, + List argNames, + List> argTypes, + AbstractType returnType, + String language, + String body, + final InvalidRequestException reason) { return new UDFunction(name, argNames, argTypes, returnType, language, body, true) { public ByteBuffer execute(int protocolVersion, List parameters) throws InvalidRequestException { - throw new InvalidRequestException(String.format("Function '%s' exists but hasn't been loaded successfully for the following reason: %s. " - + "Please see the server log for more details", this, reason.getMessage())); + throw new InvalidRequestException(String.format("Function '%s' exists but hasn't been loaded successfully " + + "for the following reason: %s. Please see the server log for details", + this, + reason.getMessage())); } }; } + public boolean isAggregate() { return false; @@ -136,7 +136,7 @@ public boolean isAggregate() public boolean isPure() { - return deterministic; + return isDeterministic; } public boolean isNative() @@ -144,13 +144,33 @@ public boolean isNative() return false; } + public List argNames() + { + return argNames; + } + + public boolean isDeterministic() + { + return isDeterministic; + } + + public String body() + { + return body; + } + + public String language() + { + return language; + } + /** * Used by UDF implementations (both Java code generated by {@link org.apache.cassandra.cql3.functions.JavaSourceUDFFactory} * and script executor {@link org.apache.cassandra.cql3.functions.ScriptBasedUDF}) to convert the C* * serialized representation to the Java object representation. * * @param protocolVersion the native protocol version used for serialization - * @param argIndex index of the UDF input argument + * @param argIndex index of the UDF input argument */ protected Object compose(int protocolVersion, int argIndex, ByteBuffer value) { @@ -169,117 +189,6 @@ protected ByteBuffer decompose(int protocolVersion, Object value) return value == null ? null : returnDataType.serialize(value, ProtocolVersion.fromInt(protocolVersion)); } - private static Mutation makeSchemaMutation(FunctionName name) - { - UTF8Type kv = (UTF8Type)SystemKeyspace.SchemaFunctionsTable.getKeyValidator(); - return new Mutation(SystemKeyspace.NAME, kv.decompose(name.keyspace)); - } - - public Mutation toSchemaDrop(long timestamp) - { - Mutation mutation = makeSchemaMutation(name); - ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SCHEMA_FUNCTIONS_TABLE); - - Composite prefix = SystemKeyspace.SchemaFunctionsTable.comparator.make(name.name, UDHelper.computeSignature(argTypes)); - int ldt = (int) (System.currentTimeMillis() / 1000); - cf.addAtom(new RangeTombstone(prefix, prefix.end(), timestamp, ldt)); - - return mutation; - } - - public static Map fromSchema(Row row) - { - UntypedResultSet results = QueryProcessor.resultify("SELECT * FROM system." + SystemKeyspace.SCHEMA_FUNCTIONS_TABLE, row); - Map udfs = new HashMap<>(results.size()); - for (UntypedResultSet.Row result : results) - udfs.put(SystemKeyspace.SchemaFunctionsTable.comparator.make(result.getString("function_name"), result.getBlob("signature")), - fromSchema(result)); - return udfs; - } - - public Mutation toSchemaUpdate(long timestamp) - { - Mutation mutation = makeSchemaMutation(name); - ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SCHEMA_FUNCTIONS_TABLE); - - Composite prefix = SystemKeyspace.SchemaFunctionsTable.comparator.make(name.name, UDHelper.computeSignature(argTypes)); - CFRowAdder adder = new CFRowAdder(cf, prefix, timestamp); - - adder.resetCollection("argument_names"); - adder.resetCollection("argument_types"); - adder.add("return_type", returnType.toString()); - adder.add("language", language); - adder.add("body", body); - adder.add("deterministic", deterministic); - - for (int i = 0; i < argNames.size(); i++) - { - adder.addListEntry("argument_names", argNames.get(i).bytes); - adder.addListEntry("argument_types", argTypes.get(i).toString()); - } - - return mutation; - } - - public static UDFunction fromSchema(UntypedResultSet.Row row) - { - String ksName = row.getString("keyspace_name"); - String functionName = row.getString("function_name"); - FunctionName name = new FunctionName(ksName, functionName); - - List names = row.getList("argument_names", UTF8Type.instance); - List types = row.getList("argument_types", UTF8Type.instance); - - List argNames; - if (names == null) - argNames = Collections.emptyList(); - else - { - argNames = new ArrayList<>(names.size()); - for (String arg : names) - argNames.add(new ColumnIdentifier(arg, true)); - } - - List> argTypes; - if (types == null) - argTypes = Collections.emptyList(); - else - { - argTypes = new ArrayList<>(types.size()); - for (String type : types) - argTypes.add(parseType(type)); - } - - AbstractType returnType = parseType(row.getString("return_type")); - - boolean deterministic = row.getBoolean("deterministic"); - String language = row.getString("language"); - String body = row.getString("body"); - - try - { - return create(name, argNames, argTypes, returnType, language, body, deterministic); - } - catch (InvalidRequestException e) - { - logger.error(String.format("Cannot load function '%s' from schema: this function won't be available (on this node)", name), e); - return createBrokenFunction(name, argNames, argTypes, returnType, language, body, e); - } - } - - private static AbstractType parseType(String str) - { - // We only use this when reading the schema where we shouldn't get an error - try - { - return TypeParser.parse(str); - } - catch (SyntaxException | ConfigurationException e) - { - throw new RuntimeException(e); - } - } - @Override public boolean equals(Object o) { @@ -287,19 +196,19 @@ public boolean equals(Object o) return false; UDFunction that = (UDFunction)o; - return Objects.equal(this.name, that.name) - && Functions.typeEquals(this.argTypes, that.argTypes) - && Functions.typeEquals(this.returnType, that.returnType) - && Objects.equal(this.argNames, that.argNames) - && Objects.equal(this.language, that.language) - && Objects.equal(this.body, that.body) - && Objects.equal(this.deterministic, that.deterministic); + return Objects.equal(name, that.name) + && Objects.equal(argNames, that.argNames) + && Functions.typeEquals(argTypes, that.argTypes) + && Functions.typeEquals(returnType, that.returnType) + && Objects.equal(language, that.language) + && Objects.equal(body, that.body) + && Objects.equal(isDeterministic, that.isDeterministic); } @Override public int hashCode() { - return Objects.hashCode(name, argTypes, returnType, argNames, language, body, deterministic); + return Objects.hashCode(name, argNames, argTypes, returnType, language, body, isDeterministic); } public void userTypeUpdated(String ksName, String typeName) diff --git a/src/java/org/apache/cassandra/cql3/functions/UDHelper.java b/src/java/org/apache/cassandra/cql3/functions/UDHelper.java index 2a17c75a63bb..0738cbe68d3b 100644 --- a/src/java/org/apache/cassandra/cql3/functions/UDHelper.java +++ b/src/java/org/apache/cassandra/cql3/functions/UDHelper.java @@ -31,12 +31,13 @@ import com.datastax.driver.core.DataType; import org.apache.cassandra.cql3.*; import org.apache.cassandra.db.marshal.AbstractType; +import org.apache.cassandra.db.marshal.UTF8Type; import org.apache.cassandra.utils.FBUtilities; /** * Helper class for User Defined Functions + Aggregates. */ -final class UDHelper +public final class UDHelper { protected static final Logger logger = LoggerFactory.getLogger(UDHelper.class); @@ -112,12 +113,13 @@ public static DataType driverType(AbstractType abstractType) // we use a "signature" which is just a SHA-1 of it's argument types (we could replace that by // using a "signature" UDT that would be comprised of the function name and argument types, // which we could then use as clustering column. But as we haven't yet used UDT in system tables, - // We'll left that decision to #6717). - protected static ByteBuffer computeSignature(List> argTypes) + // We'll leave that decision to #6717). + public static ByteBuffer calculateSignature(AbstractFunction fun) { MessageDigest digest = FBUtilities.newMessageDigest("SHA-1"); - for (AbstractType type : argTypes) - digest.update(type.asCQL3Type().toString().getBytes(StandardCharsets.UTF_8)); + digest.update(UTF8Type.instance.decompose(fun.name().name)); + for (AbstractType type : fun.argTypes()) + digest.update(UTF8Type.instance.decompose(type.asCQL3Type().toString())); return ByteBuffer.wrap(digest.digest()); } } diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateTableStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateTableStatement.java index 6aea3b14f42d..c8c24743e43d 100644 --- a/src/java/org/apache/cassandra/cql3/statements/CreateTableStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/CreateTableStatement.java @@ -151,14 +151,32 @@ public void applyPropertiesTo(CFMetaData cfmd) throws RequestValidationException .addAllColumnDefinitions(getColumns(cfmd)) .isDense(isDense); - cfmd.addColumnMetadataFromAliases(keyAliases, keyValidator, ColumnDefinition.Kind.PARTITION_KEY); - cfmd.addColumnMetadataFromAliases(columnAliases, comparator.asAbstractType(), ColumnDefinition.Kind.CLUSTERING_COLUMN); + addColumnMetadataFromAliases(cfmd, keyAliases, keyValidator, ColumnDefinition.Kind.PARTITION_KEY); + addColumnMetadataFromAliases(cfmd, columnAliases, comparator.asAbstractType(), ColumnDefinition.Kind.CLUSTERING_COLUMN); if (valueAlias != null) - cfmd.addColumnMetadataFromAliases(Collections.singletonList(valueAlias), defaultValidator, ColumnDefinition.Kind.COMPACT_VALUE); + addColumnMetadataFromAliases(cfmd, Collections.singletonList(valueAlias), defaultValidator, ColumnDefinition.Kind.COMPACT_VALUE); properties.applyToCFMetadata(cfmd); } + private void addColumnMetadataFromAliases(CFMetaData cfm, List aliases, AbstractType comparator, ColumnDefinition.Kind kind) + { + if (comparator instanceof CompositeType) + { + CompositeType ct = (CompositeType)comparator; + for (int i = 0; i < aliases.size(); ++i) + if (aliases.get(i) != null) + cfm.addOrReplaceColumnDefinition(new ColumnDefinition(cfm, aliases.get(i), ct.types.get(i), i, kind)); + } + else + { + assert aliases.size() <= 1; + if (!aliases.isEmpty() && aliases.get(0) != null) + cfm.addOrReplaceColumnDefinition(new ColumnDefinition(cfm, aliases.get(0), comparator, null, kind)); + } + } + + public static class RawStatement extends CFStatement { private final Map definitions = new HashMap<>(); diff --git a/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java b/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java index 1fcd63cd5811..e766f6549845 100644 --- a/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java +++ b/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java @@ -35,6 +35,7 @@ import org.apache.cassandra.db.composites.CellName; import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.db.filter.ColumnSlice; +import org.apache.cassandra.db.marshal.BytesType; import org.apache.cassandra.utils.*; import org.apache.cassandra.utils.SearchIterator; import org.apache.cassandra.utils.btree.BTree; @@ -59,7 +60,7 @@ */ public class AtomicBTreeColumns extends ColumnFamily { - static final long EMPTY_SIZE = ObjectSizes.measure(new AtomicBTreeColumns(SystemKeyspace.BuiltIndexesTable, null)) + static final long EMPTY_SIZE = ObjectSizes.measure(new AtomicBTreeColumns(CFMetaData.denseCFMetaData("keyspace", "table", BytesType.instance), null)) + ObjectSizes.measure(new Holder(null, null)); // Reserved values for wasteTracker field. These values must not be consecutive (see avoidReservedValues) diff --git a/src/java/org/apache/cassandra/db/BatchlogManager.java b/src/java/org/apache/cassandra/db/BatchlogManager.java index b33e457fd36d..e71a62c59968 100644 --- a/src/java/org/apache/cassandra/db/BatchlogManager.java +++ b/src/java/org/apache/cassandra/db/BatchlogManager.java @@ -102,7 +102,7 @@ public static void shutdown() throws InterruptedException public int countAllBatches() { - String query = String.format("SELECT count(*) FROM %s.%s", SystemKeyspace.NAME, SystemKeyspace.BATCHLOG_TABLE); + String query = String.format("SELECT count(*) FROM %s.%s", SystemKeyspace.NAME, SystemKeyspace.BATCHLOG); return (int) executeInternal(query).one().getLong("count"); } @@ -137,8 +137,8 @@ public static Mutation getBatchlogMutationFor(Collection mutations, UU @VisibleForTesting static Mutation getBatchlogMutationFor(Collection mutations, UUID uuid, int version, long now) { - ColumnFamily cf = ArrayBackedSortedColumns.factory.create(SystemKeyspace.BatchlogTable); - CFRowAdder adder = new CFRowAdder(cf, SystemKeyspace.BatchlogTable.comparator.builder().build(), now); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(SystemKeyspace.Batchlog); + CFRowAdder adder = new CFRowAdder(cf, SystemKeyspace.Batchlog.comparator.builder().build(), now); adder.add("data", serializeMutations(mutations, version)) .add("written_at", new Date(now / 1000)) .add("version", version); @@ -174,7 +174,7 @@ private void replayAllFailedBatches() throws ExecutionException, InterruptedExce UntypedResultSet page = executeInternal(String.format("SELECT id, data, written_at, version FROM %s.%s LIMIT %d", SystemKeyspace.NAME, - SystemKeyspace.BATCHLOG_TABLE, + SystemKeyspace.BATCHLOG, PAGE_SIZE)); while (!page.isEmpty()) @@ -186,7 +186,7 @@ private void replayAllFailedBatches() throws ExecutionException, InterruptedExce page = executeInternal(String.format("SELECT id, data, written_at, version FROM %s.%s WHERE token(id) > token(?) LIMIT %d", SystemKeyspace.NAME, - SystemKeyspace.BATCHLOG_TABLE, + SystemKeyspace.BATCHLOG, PAGE_SIZE), id); } @@ -199,7 +199,7 @@ private void replayAllFailedBatches() throws ExecutionException, InterruptedExce private void deleteBatch(UUID id) { Mutation mutation = new Mutation(SystemKeyspace.NAME, UUIDType.instance.decompose(id)); - mutation.delete(SystemKeyspace.BATCHLOG_TABLE, FBUtilities.timestampMicros()); + mutation.delete(SystemKeyspace.BATCHLOG, FBUtilities.timestampMicros()); mutation.apply(); } @@ -447,7 +447,7 @@ public void response(MessageIn m) // force flush + compaction to reclaim space from the replayed batches private void cleanup() throws ExecutionException, InterruptedException { - ColumnFamilyStore cfs = Keyspace.open(SystemKeyspace.NAME).getColumnFamilyStore(SystemKeyspace.BATCHLOG_TABLE); + ColumnFamilyStore cfs = Keyspace.open(SystemKeyspace.NAME).getColumnFamilyStore(SystemKeyspace.BATCHLOG); cfs.forceBlockingFlush(); Collection descriptors = new ArrayList<>(); for (SSTableReader sstr : cfs.getSSTables()) diff --git a/src/java/org/apache/cassandra/db/DefinitionsUpdateVerbHandler.java b/src/java/org/apache/cassandra/db/DefinitionsUpdateVerbHandler.java index 5cb62eda0330..d5ede03c052e 100644 --- a/src/java/org/apache/cassandra/db/DefinitionsUpdateVerbHandler.java +++ b/src/java/org/apache/cassandra/db/DefinitionsUpdateVerbHandler.java @@ -26,6 +26,7 @@ import org.apache.cassandra.concurrent.StageManager; import org.apache.cassandra.net.IVerbHandler; import org.apache.cassandra.net.MessageIn; +import org.apache.cassandra.schema.LegacySchemaTables; import org.apache.cassandra.utils.WrappedRunnable; /** @@ -46,7 +47,7 @@ public void doVerb(final MessageIn> message, int id) { public void runMayThrow() throws Exception { - DefsTables.mergeSchema(message.payload); + LegacySchemaTables.mergeSchema(message.payload); } }); } diff --git a/src/java/org/apache/cassandra/db/DefsTables.java b/src/java/org/apache/cassandra/db/DefsTables.java deleted file mode 100644 index 82a5dd1ebe8a..000000000000 --- a/src/java/org/apache/cassandra/db/DefsTables.java +++ /dev/null @@ -1,622 +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.db; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.*; - -import com.google.common.base.Function; -import com.google.common.collect.Iterables; -import com.google.common.collect.MapDifference; -import com.google.common.collect.Maps; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.config.DatabaseDescriptor; -import org.apache.cassandra.config.KSMetaData; -import org.apache.cassandra.config.Schema; -import org.apache.cassandra.config.UTMetaData; -import org.apache.cassandra.cql3.functions.Functions; -import org.apache.cassandra.cql3.functions.UDAggregate; -import org.apache.cassandra.cql3.functions.UDFunction; -import org.apache.cassandra.db.commitlog.CommitLog; -import org.apache.cassandra.db.compaction.CompactionManager; -import org.apache.cassandra.db.composites.Composite; -import org.apache.cassandra.db.filter.QueryFilter; -import org.apache.cassandra.db.marshal.AsciiType; -import org.apache.cassandra.db.marshal.UserType; -import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.service.MigrationManager; -import org.apache.cassandra.utils.ByteBufferUtil; - -/** - * SCHEMA_{KEYSPACES, COLUMNFAMILIES, COLUMNS}_CF are used to store Keyspace/ColumnFamily attributes to make schema - * load/distribution easy, it replaces old mechanism when local migrations where serialized, stored in system.Migrations - * and used for schema distribution. - */ -public class DefsTables -{ - private static final Logger logger = LoggerFactory.getLogger(DefsTables.class); - - /** - * Load keyspace definitions for the system keyspace (system.SCHEMA_KEYSPACES_TABLE) - * - * @return Collection of found keyspace definitions - */ - public static Collection loadFromKeyspace() - { - List serializedSchema = SystemKeyspace.serializedSchema(SystemKeyspace.SCHEMA_KEYSPACES_TABLE); - - List keyspaces = new ArrayList<>(serializedSchema.size()); - - for (Row row : serializedSchema) - { - if (Schema.invalidSchemaRow(row) || Schema.ignoredSchemaRow(row)) - continue; - - keyspaces.add(KSMetaData.fromSchema(row, serializedColumnFamilies(row.key), serializedUserTypes(row.key))); - } - - return keyspaces; - } - - private static Row serializedColumnFamilies(DecoratedKey ksNameKey) - { - ColumnFamilyStore cfsStore = SystemKeyspace.schemaCFS(SystemKeyspace.SCHEMA_COLUMNFAMILIES_TABLE); - return new Row(ksNameKey, cfsStore.getColumnFamily(QueryFilter.getIdentityFilter(ksNameKey, - SystemKeyspace.SCHEMA_COLUMNFAMILIES_TABLE, - System.currentTimeMillis()))); - } - - private static Row serializedUserTypes(DecoratedKey ksNameKey) - { - ColumnFamilyStore cfsStore = SystemKeyspace.schemaCFS(SystemKeyspace.SCHEMA_USER_TYPES_TABLE); - return new Row(ksNameKey, cfsStore.getColumnFamily(QueryFilter.getIdentityFilter(ksNameKey, - SystemKeyspace.SCHEMA_USER_TYPES_TABLE, - System.currentTimeMillis()))); - } - - /** - * Merge remote schema in form of mutations with local and mutate ks/cf metadata objects - * (which also involves fs operations on add/drop ks/cf) - * - * @param mutations the schema changes to apply - * - * @throws ConfigurationException If one of metadata attributes has invalid value - * @throws IOException If data was corrupted during transportation or failed to apply fs operations - */ - public static synchronized void mergeSchema(Collection mutations) throws ConfigurationException, IOException - { - mergeSchemaInternal(mutations, true); - Schema.instance.updateVersionAndAnnounce(); - } - - public static synchronized void mergeSchemaInternal(Collection mutations, boolean doFlush) throws IOException - { - // compare before/after schemas of the affected keyspaces only - Set keyspaces = new HashSet<>(mutations.size()); - for (Mutation mutation : mutations) - keyspaces.add(ByteBufferUtil.string(mutation.key())); - - // current state of the schema - Map oldKeyspaces = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_KEYSPACES_TABLE, keyspaces); - Map oldColumnFamilies = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_COLUMNFAMILIES_TABLE, keyspaces); - Map oldTypes = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_USER_TYPES_TABLE, keyspaces); - Map oldFunctions = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_FUNCTIONS_TABLE, keyspaces); - Map oldAggregates = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_AGGREGATES_TABLE, keyspaces); - - for (Mutation mutation : mutations) - mutation.apply(); - - if (doFlush) - flushSchemaCFs(); - - // with new data applied - Map newKeyspaces = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_KEYSPACES_TABLE, keyspaces); - Map newColumnFamilies = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_COLUMNFAMILIES_TABLE, keyspaces); - Map newTypes = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_USER_TYPES_TABLE, keyspaces); - Map newFunctions = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_FUNCTIONS_TABLE, keyspaces); - Map newAggregates = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_AGGREGATES_TABLE, keyspaces); - - Set keyspacesToDrop = mergeKeyspaces(oldKeyspaces, newKeyspaces); - mergeColumnFamilies(oldColumnFamilies, newColumnFamilies); - mergeTypes(oldTypes, newTypes); - mergeFunctions(oldFunctions, newFunctions); - mergeAggregates(oldAggregates, newAggregates); - - // it is safe to drop a keyspace only when all nested ColumnFamilies where deleted - for (String keyspaceToDrop : keyspacesToDrop) - dropKeyspace(keyspaceToDrop); - } - - private static Set mergeKeyspaces(Map before, Map after) - { - List created = new ArrayList<>(); - List altered = new ArrayList<>(); - Set dropped = new HashSet<>(); - - /* - * - we don't care about entriesOnlyOnLeft() or entriesInCommon(), because only the changes are of interest to us - * - of all entriesOnlyOnRight(), we only care about ones that have live columns; it's possible to have a ColumnFamily - * there that only has the top-level deletion, if: - * a) a pushed DROP KEYSPACE change for a keyspace hadn't ever made it to this node in the first place - * b) a pulled dropped keyspace that got dropped before it could find a way to this node - * - of entriesDiffering(), we don't care about the scenario where both pre and post-values have zero live columns: - * that means that a keyspace had been recreated and dropped, and the recreated keyspace had never found a way - * to this node - */ - MapDifference diff = Maps.difference(before, after); - - for (Map.Entry entry : diff.entriesOnlyOnRight().entrySet()) - if (entry.getValue().hasColumns()) - created.add(new Row(entry.getKey(), entry.getValue())); - - for (Map.Entry> entry : diff.entriesDiffering().entrySet()) - { - String keyspaceName = AsciiType.instance.compose(entry.getKey().getKey()); - - ColumnFamily pre = entry.getValue().leftValue(); - ColumnFamily post = entry.getValue().rightValue(); - - if (pre.hasColumns() && post.hasColumns()) - altered.add(keyspaceName); - else if (pre.hasColumns()) - dropped.add(keyspaceName); - else if (post.hasColumns()) // a (re)created keyspace - created.add(new Row(entry.getKey(), post)); - } - - for (Row row : created) - addKeyspace(KSMetaData.fromSchema(row, Collections.emptyList(), new UTMetaData())); - for (String name : altered) - updateKeyspace(name); - return dropped; - } - - // see the comments for mergeKeyspaces() - private static void mergeColumnFamilies(Map before, Map after) - { - List created = new ArrayList<>(); - List altered = new ArrayList<>(); - List dropped = new ArrayList<>(); - - MapDifference diff = Maps.difference(before, after); - - for (Map.Entry entry : diff.entriesOnlyOnRight().entrySet()) - if (entry.getValue().hasColumns()) - created.addAll(KSMetaData.deserializeColumnFamilies(new Row(entry.getKey(), entry.getValue())).values()); - - for (Map.Entry> entry : diff.entriesDiffering().entrySet()) - { - String keyspaceName = AsciiType.instance.compose(entry.getKey().getKey()); - - ColumnFamily pre = entry.getValue().leftValue(); - ColumnFamily post = entry.getValue().rightValue(); - - if (pre.hasColumns() && post.hasColumns()) - { - MapDifference delta = - Maps.difference(Schema.instance.getKSMetaData(keyspaceName).cfMetaData(), - KSMetaData.deserializeColumnFamilies(new Row(entry.getKey(), post))); - - dropped.addAll(delta.entriesOnlyOnLeft().values()); - created.addAll(delta.entriesOnlyOnRight().values()); - Iterables.addAll(altered, Iterables.transform(delta.entriesDiffering().values(), new Function, CFMetaData>() - { - public CFMetaData apply(MapDifference.ValueDifference pair) - { - return pair.rightValue(); - } - })); - } - else if (pre.hasColumns()) - { - dropped.addAll(Schema.instance.getKSMetaData(keyspaceName).cfMetaData().values()); - } - else if (post.hasColumns()) - { - created.addAll(KSMetaData.deserializeColumnFamilies(new Row(entry.getKey(), post)).values()); - } - } - - for (CFMetaData cfm : created) - addColumnFamily(cfm); - for (CFMetaData cfm : altered) - updateColumnFamily(cfm.ksName, cfm.cfName); - for (CFMetaData cfm : dropped) - dropColumnFamily(cfm.ksName, cfm.cfName); - } - - // see the comments for mergeKeyspaces() - private static void mergeTypes(Map before, Map after) - { - List created = new ArrayList<>(); - List altered = new ArrayList<>(); - List dropped = new ArrayList<>(); - - MapDifference diff = Maps.difference(before, after); - - // New keyspace with types - for (Map.Entry entry : diff.entriesOnlyOnRight().entrySet()) - if (entry.getValue().hasColumns()) - created.addAll(UTMetaData.fromSchema(new Row(entry.getKey(), entry.getValue())).values()); - - for (Map.Entry> entry : diff.entriesDiffering().entrySet()) - { - String keyspaceName = AsciiType.instance.compose(entry.getKey().getKey()); - - ColumnFamily pre = entry.getValue().leftValue(); - ColumnFamily post = entry.getValue().rightValue(); - - if (pre.hasColumns() && post.hasColumns()) - { - MapDifference delta = - Maps.difference(Schema.instance.getKSMetaData(keyspaceName).userTypes.getAllTypes(), - UTMetaData.fromSchema(new Row(entry.getKey(), post))); - - dropped.addAll(delta.entriesOnlyOnLeft().values()); - created.addAll(delta.entriesOnlyOnRight().values()); - Iterables.addAll(altered, Iterables.transform(delta.entriesDiffering().values(), new Function, UserType>() - { - public UserType apply(MapDifference.ValueDifference pair) - { - return pair.rightValue(); - } - })); - } - else if (pre.hasColumns()) - { - dropped.addAll(Schema.instance.getKSMetaData(keyspaceName).userTypes.getAllTypes().values()); - } - else if (post.hasColumns()) - { - created.addAll(UTMetaData.fromSchema(new Row(entry.getKey(), post)).values()); - } - } - - for (UserType type : created) - addType(type); - for (UserType type : altered) - updateType(type); - for (UserType type : dropped) - dropType(type); - } - - // see the comments for mergeKeyspaces() - private static void mergeFunctions(Map before, Map after) - { - List created = new ArrayList<>(); - List altered = new ArrayList<>(); - List dropped = new ArrayList<>(); - - MapDifference diff = Maps.difference(before, after); - - // New keyspace with functions - for (Map.Entry entry : diff.entriesOnlyOnRight().entrySet()) - if (entry.getValue().hasColumns()) - created.addAll(UDFunction.fromSchema(new Row(entry.getKey(), entry.getValue())).values()); - - for (Map.Entry> entry : diff.entriesDiffering().entrySet()) - { - ColumnFamily pre = entry.getValue().leftValue(); - ColumnFamily post = entry.getValue().rightValue(); - - if (pre.hasColumns() && post.hasColumns()) - { - MapDifference delta = - Maps.difference(UDFunction.fromSchema(new Row(entry.getKey(), pre)), - UDFunction.fromSchema(new Row(entry.getKey(), post))); - - dropped.addAll(delta.entriesOnlyOnLeft().values()); - created.addAll(delta.entriesOnlyOnRight().values()); - Iterables.addAll(altered, Iterables.transform(delta.entriesDiffering().values(), new Function, UDFunction>() - { - public UDFunction apply(MapDifference.ValueDifference pair) - { - return pair.rightValue(); - } - })); - } - else if (pre.hasColumns()) - { - dropped.addAll(UDFunction.fromSchema(new Row(entry.getKey(), pre)).values()); - } - else if (post.hasColumns()) - { - created.addAll(UDFunction.fromSchema(new Row(entry.getKey(), post)).values()); - } - } - - for (UDFunction udf : created) - addFunction(udf); - for (UDFunction udf : altered) - updateFunction(udf); - for (UDFunction udf : dropped) - dropFunction(udf); - } - - // see the comments for mergeKeyspaces() - private static void mergeAggregates(Map before, Map after) - { - List created = new ArrayList<>(); - List altered = new ArrayList<>(); - List dropped = new ArrayList<>(); - - MapDifference diff = Maps.difference(before, after); - - // New keyspace with functions - for (Map.Entry entry : diff.entriesOnlyOnRight().entrySet()) - if (entry.getValue().hasColumns()) - created.addAll(UDAggregate.fromSchema(new Row(entry.getKey(), entry.getValue())).values()); - - for (Map.Entry> entry : diff.entriesDiffering().entrySet()) - { - ColumnFamily pre = entry.getValue().leftValue(); - ColumnFamily post = entry.getValue().rightValue(); - - if (pre.hasColumns() && post.hasColumns()) - { - MapDifference delta = - Maps.difference(UDAggregate.fromSchema(new Row(entry.getKey(), pre)), - UDAggregate.fromSchema(new Row(entry.getKey(), post))); - - dropped.addAll(delta.entriesOnlyOnLeft().values()); - created.addAll(delta.entriesOnlyOnRight().values()); - Iterables.addAll(altered, Iterables.transform(delta.entriesDiffering().values(), new Function, UDAggregate>() - { - public UDAggregate apply(MapDifference.ValueDifference pair) - { - return pair.rightValue(); - } - })); - } - else if (pre.hasColumns()) - { - dropped.addAll(UDAggregate.fromSchema(new Row(entry.getKey(), pre)).values()); - } - else if (post.hasColumns()) - { - created.addAll(UDAggregate.fromSchema(new Row(entry.getKey(), post)).values()); - } - } - - for (UDAggregate udf : created) - addAggregate(udf); - for (UDAggregate udf : altered) - updateAggregate(udf); - for (UDAggregate udf : dropped) - dropAggregate(udf); - } - - private static void addKeyspace(KSMetaData ksm) - { - assert Schema.instance.getKSMetaData(ksm.name) == null; - Schema.instance.load(ksm); - - Keyspace.open(ksm.name); - MigrationManager.instance.notifyCreateKeyspace(ksm); - } - - private static void addColumnFamily(CFMetaData cfm) - { - assert Schema.instance.getCFMetaData(cfm.ksName, cfm.cfName) == null; - KSMetaData ksm = Schema.instance.getKSMetaData(cfm.ksName); - ksm = KSMetaData.cloneWith(ksm, Iterables.concat(ksm.cfMetaData().values(), Collections.singleton(cfm))); - - logger.info("Loading {}", cfm); - - Schema.instance.load(cfm); - - // make sure it's init-ed w/ the old definitions first, - // since we're going to call initCf on the new one manually - Keyspace.open(cfm.ksName); - - Schema.instance.setKeyspaceDefinition(ksm); - Keyspace.open(ksm.name).initCf(cfm.cfId, cfm.cfName, true); - MigrationManager.instance.notifyCreateColumnFamily(cfm); - } - - private static void addType(UserType ut) - { - KSMetaData ksm = Schema.instance.getKSMetaData(ut.keyspace); - assert ksm != null; - - logger.info("Loading {}", ut); - - ksm.userTypes.addType(ut); - - MigrationManager.instance.notifyCreateUserType(ut); - } - - private static void addFunction(UDFunction udf) - { - logger.info("Loading {}", udf); - - Functions.addFunction(udf); - - MigrationManager.instance.notifyCreateFunction(udf); - } - - private static void addAggregate(UDAggregate udf) - { - logger.info("Loading {}", udf); - - Functions.addFunction(udf); - - MigrationManager.instance.notifyCreateAggregate(udf); - } - - private static void updateKeyspace(String ksName) - { - KSMetaData oldKsm = Schema.instance.getKSMetaData(ksName); - assert oldKsm != null; - KSMetaData newKsm = KSMetaData.cloneWith(oldKsm.reloadAttributes(), oldKsm.cfMetaData().values()); - - Schema.instance.setKeyspaceDefinition(newKsm); - - Keyspace.open(ksName).createReplicationStrategy(newKsm); - MigrationManager.instance.notifyUpdateKeyspace(newKsm); - } - - private static void updateColumnFamily(String ksName, String cfName) - { - CFMetaData cfm = Schema.instance.getCFMetaData(ksName, cfName); - assert cfm != null; - cfm.reload(); - - Keyspace keyspace = Keyspace.open(cfm.ksName); - keyspace.getColumnFamilyStore(cfm.cfName).reload(); - MigrationManager.instance.notifyUpdateColumnFamily(cfm); - } - - private static void updateType(UserType ut) - { - KSMetaData ksm = Schema.instance.getKSMetaData(ut.keyspace); - assert ksm != null; - - logger.info("Updating {}", ut); - - ksm.userTypes.addType(ut); - - MigrationManager.instance.notifyUpdateUserType(ut); - } - - private static void updateFunction(UDFunction udf) - { - logger.info("Updating {}", udf); - - Functions.replaceFunction(udf); - - MigrationManager.instance.notifyUpdateFunction(udf); - } - - private static void updateAggregate(UDAggregate udf) - { - logger.info("Updating {}", udf); - - Functions.replaceFunction(udf); - - MigrationManager.instance.notifyUpdateAggregate(udf); - } - - private static void dropKeyspace(String ksName) - { - KSMetaData ksm = Schema.instance.getKSMetaData(ksName); - String snapshotName = Keyspace.getTimestampedSnapshotName(ksName); - - CompactionManager.instance.interruptCompactionFor(ksm.cfMetaData().values(), true); - - Keyspace keyspace = Keyspace.open(ksm.name); - - // remove all cfs from the keyspace instance. - List droppedCfs = new ArrayList<>(); - for (CFMetaData cfm : ksm.cfMetaData().values()) - { - ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfm.cfName); - - Schema.instance.purge(cfm); - - if (DatabaseDescriptor.isAutoSnapshot()) - cfs.snapshot(snapshotName); - Keyspace.open(ksm.name).dropCf(cfm.cfId); - - droppedCfs.add(cfm.cfId); - } - - // remove the keyspace from the static instances. - Keyspace.clear(ksm.name); - Schema.instance.clearKeyspaceDefinition(ksm); - - keyspace.writeOrder.awaitNewBarrier(); - - // force a new segment in the CL - CommitLog.instance.forceRecycleAllSegments(droppedCfs); - - MigrationManager.instance.notifyDropKeyspace(ksm); - } - - private static void dropColumnFamily(String ksName, String cfName) - { - KSMetaData ksm = Schema.instance.getKSMetaData(ksName); - assert ksm != null; - ColumnFamilyStore cfs = Keyspace.open(ksName).getColumnFamilyStore(cfName); - assert cfs != null; - - // reinitialize the keyspace. - CFMetaData cfm = ksm.cfMetaData().get(cfName); - - Schema.instance.purge(cfm); - Schema.instance.setKeyspaceDefinition(makeNewKeyspaceDefinition(ksm, cfm)); - - CompactionManager.instance.interruptCompactionFor(Arrays.asList(cfm), true); - - if (DatabaseDescriptor.isAutoSnapshot()) - cfs.snapshot(Keyspace.getTimestampedSnapshotName(cfs.name)); - Keyspace.open(ksm.name).dropCf(cfm.cfId); - MigrationManager.instance.notifyDropColumnFamily(cfm); - - CommitLog.instance.forceRecycleAllSegments(Collections.singleton(cfm.cfId)); - } - - private static void dropType(UserType ut) - { - KSMetaData ksm = Schema.instance.getKSMetaData(ut.keyspace); - assert ksm != null; - - ksm.userTypes.removeType(ut); - - MigrationManager.instance.notifyDropUserType(ut); - } - - private static void dropFunction(UDFunction udf) - { - logger.info("Drop {}", udf); - - // TODO: this is kind of broken as this remove all overloads of the function name - Functions.removeFunction(udf.name(), udf.argTypes()); - - MigrationManager.instance.notifyDropFunction(udf); - } - - private static void dropAggregate(UDAggregate udf) - { - logger.info("Drop {}", udf); - - // TODO: this is kind of broken as this remove all overloads of the function name - Functions.removeFunction(udf.name(), udf.argTypes()); - - MigrationManager.instance.notifyDropAggregate(udf); - } - - private static KSMetaData makeNewKeyspaceDefinition(KSMetaData ksm, CFMetaData toExclude) - { - // clone ksm but do not include the new def - List newCfs = new ArrayList<>(ksm.cfMetaData().values()); - newCfs.remove(toExclude); - assert newCfs.size() == ksm.cfMetaData().size() - 1; - return KSMetaData.cloneWith(ksm, newCfs); - } - - private static void flushSchemaCFs() - { - for (String cf : SystemKeyspace.ALL_SCHEMA_TABLES) - SystemKeyspace.forceBlockingFlush(cf); - } -} diff --git a/src/java/org/apache/cassandra/db/HintedHandOffManager.java b/src/java/org/apache/cassandra/db/HintedHandOffManager.java index 081e01b310a3..8c4477b9cd8e 100644 --- a/src/java/org/apache/cassandra/db/HintedHandOffManager.java +++ b/src/java/org/apache/cassandra/db/HintedHandOffManager.java @@ -115,7 +115,7 @@ public class HintedHandOffManager implements HintedHandOffManagerMBean new NamedThreadFactory("HintedHandoff", Thread.MIN_PRIORITY), "internal"); - private final ColumnFamilyStore hintStore = Keyspace.open(SystemKeyspace.NAME).getColumnFamilyStore(SystemKeyspace.HINTS_TABLE); + private final ColumnFamilyStore hintStore = Keyspace.open(SystemKeyspace.NAME).getColumnFamilyStore(SystemKeyspace.HINTS); /** * Returns a mutation representing a Hint to be sent to targetId @@ -134,9 +134,9 @@ public Mutation hintFor(Mutation mutation, long now, int ttl, UUID targetId) UUID hintId = UUIDGen.getTimeUUID(); // serialize the hint with id and version as a composite column name - CellName name = SystemKeyspace.HintsTable.comparator.makeCellName(hintId, MessagingService.current_version); + CellName name = SystemKeyspace.Hints.comparator.makeCellName(hintId, MessagingService.current_version); ByteBuffer value = ByteBuffer.wrap(FBUtilities.serialize(mutation, Mutation.serializer, MessagingService.current_version)); - ColumnFamily cf = ArrayBackedSortedColumns.factory.create(Schema.instance.getCFMetaData(SystemKeyspace.NAME, SystemKeyspace.HINTS_TABLE)); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(Schema.instance.getCFMetaData(SystemKeyspace.NAME, SystemKeyspace.HINTS)); cf.addColumn(name, value, now, ttl); return new Mutation(SystemKeyspace.NAME, UUIDType.instance.decompose(targetId), cf); } @@ -182,7 +182,7 @@ public void run() private static void deleteHint(ByteBuffer tokenBytes, CellName columnName, long timestamp) { Mutation mutation = new Mutation(SystemKeyspace.NAME, tokenBytes); - mutation.delete(SystemKeyspace.HINTS_TABLE, columnName, timestamp); + mutation.delete(SystemKeyspace.HINTS, columnName, timestamp); mutation.applyUnsafe(); // don't bother with commitlog since we're going to flush as soon as we're done with delivery } @@ -207,7 +207,7 @@ public void deleteHintsForEndpoint(final InetAddress endpoint) UUID hostId = StorageService.instance.getTokenMetadata().getHostId(endpoint); ByteBuffer hostIdBytes = ByteBuffer.wrap(UUIDGen.decompose(hostId)); final Mutation mutation = new Mutation(SystemKeyspace.NAME, hostIdBytes); - mutation.delete(SystemKeyspace.HINTS_TABLE, System.currentTimeMillis()); + mutation.delete(SystemKeyspace.HINTS, System.currentTimeMillis()); // execute asynchronously to avoid blocking caller (which may be processing gossip) Runnable runnable = new Runnable() @@ -241,7 +241,7 @@ public void run() try { logger.info("Truncating all stored hints."); - Keyspace.open(SystemKeyspace.NAME).getColumnFamilyStore(SystemKeyspace.HINTS_TABLE).truncateBlocking(); + Keyspace.open(SystemKeyspace.NAME).getColumnFamilyStore(SystemKeyspace.HINTS).truncateBlocking(); } catch (Exception e) { @@ -375,7 +375,7 @@ private void doDeliverHintsToEndpoint(InetAddress endpoint) { long now = System.currentTimeMillis(); QueryFilter filter = QueryFilter.getSliceFilter(epkey, - SystemKeyspace.HINTS_TABLE, + SystemKeyspace.HINTS, startColumn, Composites.EMPTY, false, @@ -601,7 +601,7 @@ private List getHintsSlice(int columnCount) try { RangeSliceCommand cmd = new RangeSliceCommand(SystemKeyspace.NAME, - SystemKeyspace.HINTS_TABLE, + SystemKeyspace.HINTS, System.currentTimeMillis(), predicate, range, diff --git a/src/java/org/apache/cassandra/db/Keyspace.java b/src/java/org/apache/cassandra/db/Keyspace.java index 09fc33876677..b34d58905c1f 100644 --- a/src/java/org/apache/cassandra/db/Keyspace.java +++ b/src/java/org/apache/cassandra/db/Keyspace.java @@ -32,7 +32,6 @@ import com.google.common.base.Function; import com.google.common.collect.Iterables; -import org.apache.cassandra.io.sstable.format.SSTableReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -45,6 +44,7 @@ import org.apache.cassandra.db.filter.QueryFilter; import org.apache.cassandra.db.index.SecondaryIndex; import org.apache.cassandra.db.index.SecondaryIndexManager; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.locator.AbstractReplicationStrategy; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.service.pager.QueryPagers; diff --git a/src/java/org/apache/cassandra/db/Memtable.java b/src/java/org/apache/cassandra/db/Memtable.java index 4cf441e5a6c9..2381f2656596 100644 --- a/src/java/org/apache/cassandra/db/Memtable.java +++ b/src/java/org/apache/cassandra/db/Memtable.java @@ -357,7 +357,7 @@ private SSTableReader writeSortedContents(ReplayPosition context, File sstableDi // and BL data is strictly local, so we don't need to preserve tombstones for repair. // If we have a data row + row level tombstone, then writing it is effectively an expensive no-op so we skip it. // See CASSANDRA-4667. - if (cfs.name.equals(SystemKeyspace.BATCHLOG_TABLE) && cfs.keyspace.getName().equals(SystemKeyspace.NAME)) + if (cfs.name.equals(SystemKeyspace.BATCHLOG) && cfs.keyspace.getName().equals(SystemKeyspace.NAME)) continue; } diff --git a/src/java/org/apache/cassandra/db/MigrationRequestVerbHandler.java b/src/java/org/apache/cassandra/db/MigrationRequestVerbHandler.java index d4503ba7058a..79753c1295e2 100644 --- a/src/java/org/apache/cassandra/db/MigrationRequestVerbHandler.java +++ b/src/java/org/apache/cassandra/db/MigrationRequestVerbHandler.java @@ -26,6 +26,7 @@ import org.apache.cassandra.net.MessageIn; import org.apache.cassandra.net.MessageOut; import org.apache.cassandra.net.MessagingService; +import org.apache.cassandra.schema.LegacySchemaTables; import org.apache.cassandra.service.MigrationManager; /** @@ -40,7 +41,7 @@ public void doVerb(MessageIn message, int id) { logger.debug("Received migration request from {}.", message.from); MessageOut> response = new MessageOut<>(MessagingService.Verb.INTERNAL_RESPONSE, - SystemKeyspace.serializeSchema(), + LegacySchemaTables.convertSchemaToMutations(), MigrationManager.MigrationsSerializer.instance); MessagingService.instance().sendReply(response, id, message.from); } diff --git a/src/java/org/apache/cassandra/db/SystemKeyspace.java b/src/java/org/apache/cassandra/db/SystemKeyspace.java index 3e8b0a284d2d..503dd7f0e4dc 100644 --- a/src/java/org/apache/cassandra/db/SystemKeyspace.java +++ b/src/java/org/apache/cassandra/db/SystemKeyspace.java @@ -26,27 +26,20 @@ import javax.management.openmbean.*; import com.google.common.base.Function; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Iterables; -import com.google.common.collect.SetMultimap; -import com.google.common.collect.Sets; +import com.google.common.collect.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.config.KSMetaData; -import org.apache.cassandra.config.Schema; import org.apache.cassandra.cql3.QueryProcessor; import org.apache.cassandra.cql3.UntypedResultSet; -import org.apache.cassandra.db.columniterator.IdentityQueryFilter; import org.apache.cassandra.db.compaction.CompactionHistoryTabularData; import org.apache.cassandra.db.commitlog.ReplayPosition; import org.apache.cassandra.db.compaction.LeveledCompactionStrategy; -import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.db.filter.QueryFilter; import org.apache.cassandra.db.marshal.*; -import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.sstable.format.SSTableReader; @@ -54,6 +47,7 @@ import org.apache.cassandra.locator.IEndpointSnitch; import org.apache.cassandra.locator.LocalStrategy; import org.apache.cassandra.metrics.RestorableMeter; +import org.apache.cassandra.schema.LegacySchemaTables; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.service.paxos.Commit; import org.apache.cassandra.service.paxos.PaxosState; @@ -70,155 +64,21 @@ public final class SystemKeyspace public static final String NAME = "system"; - public static final String SCHEMA_KEYSPACES_TABLE = "schema_keyspaces"; - public static final String SCHEMA_COLUMNFAMILIES_TABLE = "schema_columnfamilies"; - public static final String SCHEMA_COLUMNS_TABLE = "schema_columns"; - public static final String SCHEMA_TRIGGERS_TABLE = "schema_triggers"; - public static final String SCHEMA_USER_TYPES_TABLE = "schema_usertypes"; - public static final String SCHEMA_FUNCTIONS_TABLE = "schema_functions"; - public static final String SCHEMA_AGGREGATES_TABLE = "schema_aggregates"; - - public static final String BUILT_INDEXES_TABLE = "IndexInfo"; - public static final String HINTS_TABLE = "hints"; - public static final String BATCHLOG_TABLE = "batchlog"; - public static final String PAXOS_TABLE = "paxos"; - public static final String LOCAL_TABLE = "local"; - public static final String PEERS_TABLE = "peers"; - public static final String PEER_EVENTS_TABLE = "peer_events"; - public static final String RANGE_XFERS_TABLE = "range_xfers"; - public static final String COMPACTION_LOG_TABLE = "compactions_in_progress"; - public static final String COMPACTION_HISTORY_TABLE = "compaction_history"; - public static final String SSTABLE_ACTIVITY_TABLE = "sstable_activity"; - - public static final List ALL_SCHEMA_TABLES = - Arrays.asList(SCHEMA_KEYSPACES_TABLE, - SCHEMA_COLUMNFAMILIES_TABLE, - SCHEMA_COLUMNS_TABLE, - SCHEMA_TRIGGERS_TABLE, - SCHEMA_USER_TYPES_TABLE, - SCHEMA_FUNCTIONS_TABLE, - SCHEMA_AGGREGATES_TABLE); - - private static int WEEK = (int) TimeUnit.DAYS.toSeconds(7); - - public static final CFMetaData SchemaKeyspacesTable = - compile(SCHEMA_KEYSPACES_TABLE, "keyspace definitions", - "CREATE TABLE %s (" - + "keyspace_name text," - + "durable_writes boolean," - + "strategy_class text," - + "strategy_options text," - + "PRIMARY KEY ((keyspace_name))) " - + "WITH COMPACT STORAGE") - .gcGraceSeconds(WEEK); - - public static final CFMetaData SchemaColumnFamiliesTable = - compile(SCHEMA_COLUMNFAMILIES_TABLE, "table definitions", - "CREATE TABLE %s (" - + "keyspace_name text," - + "columnfamily_name text," - + "bloom_filter_fp_chance double," - + "caching text," - + "cf_id uuid," // post-2.1 UUID cfid - + "comment text," - + "compaction_strategy_class text," - + "compaction_strategy_options text," - + "comparator text," - + "compression_parameters text," - + "default_time_to_live int," - + "default_validator text," - + "dropped_columns map," - + "gc_grace_seconds int," - + "is_dense boolean," - + "key_validator text," - + "local_read_repair_chance double," - + "max_compaction_threshold int," - + "max_index_interval int," - + "memtable_flush_period_in_ms int," - + "min_compaction_threshold int," - + "min_index_interval int," - + "read_repair_chance double," - + "speculative_retry text," - + "subcomparator text," - + "type text," - + "PRIMARY KEY ((keyspace_name), columnfamily_name))") - .gcGraceSeconds(WEEK); - - public static final CFMetaData SchemaColumnsTable = - compile(SCHEMA_COLUMNS_TABLE, "column definitions", - "CREATE TABLE %s (" - + "keyspace_name text," - + "columnfamily_name text," - + "column_name text," - + "component_index int," - + "index_name text," - + "index_options text," - + "index_type text," - + "type text," - + "validator text," - + "PRIMARY KEY ((keyspace_name), columnfamily_name, column_name))") - .gcGraceSeconds(WEEK); - - public static final CFMetaData SchemaTriggersTable = - compile(SCHEMA_TRIGGERS_TABLE, "trigger definitions", - "CREATE TABLE %s (" - + "keyspace_name text," - + "columnfamily_name text," - + "trigger_name text," - + "trigger_options map," - + "PRIMARY KEY ((keyspace_name), columnfamily_name, trigger_name))") - .gcGraceSeconds(WEEK); - - public static final CFMetaData SchemaUserTypesTable = - compile(SCHEMA_USER_TYPES_TABLE, "user defined type definitions", - "CREATE TABLE %s (" - + "keyspace_name text," - + "type_name text," - + "field_names list," - + "field_types list," - + "PRIMARY KEY ((keyspace_name), type_name))") - .gcGraceSeconds(WEEK); - - public static final CFMetaData SchemaFunctionsTable = - compile(SCHEMA_FUNCTIONS_TABLE, "user defined function definitions", - "CREATE TABLE %s (" - + "keyspace_name text," - + "function_name text," - + "signature blob," - + "argument_names list," - + "argument_types list," - + "body text," - + "deterministic boolean," - + "language text," - + "return_type text," - + "PRIMARY KEY ((keyspace_name), function_name, signature))") - .gcGraceSeconds(WEEK); - - public static final CFMetaData SchemaAggregatesTable = - compile(SCHEMA_AGGREGATES_TABLE, "user defined aggregate definitions", - "CREATE TABLE %s (" - + "keyspace_name text," - + "aggregate_name text," - + "signature blob," - + "argument_types list," - + "return_type text," - + "state_func text," - + "state_type text," - + "final_func text," - + "initcond blob," - + "PRIMARY KEY ((keyspace_name), aggregate_name, signature))") - .gcGraceSeconds(WEEK); - - public static final CFMetaData BuiltIndexesTable = - compile(BUILT_INDEXES_TABLE, "built column indexes", - "CREATE TABLE \"%s\" (" - + "table_name text," - + "index_name text," - + "PRIMARY KEY ((table_name), index_name)) " - + "WITH COMPACT STORAGE"); - - public static final CFMetaData HintsTable = - compile(HINTS_TABLE, "hints awaiting delivery", + public static final String HINTS = "hints"; + public static final String BATCHLOG = "batchlog"; + public static final String PAXOS = "paxos"; + public static final String BUILT_INDEXES = "IndexInfo"; + public static final String LOCAL = "local"; + public static final String PEERS = "peers"; + public static final String PEER_EVENTS = "peer_events"; + public static final String RANGE_XFERS = "range_xfers"; + public static final String COMPACTIONS_IN_PROGRESS = "compactions_in_progress"; + public static final String COMPACTION_HISTORY = "compaction_history"; + public static final String SSTABLE_ACTIVITY = "sstable_activity"; + + public static final CFMetaData Hints = + compile(HINTS, + "hints awaiting delivery", "CREATE TABLE %s (" + "target_id uuid," + "hint_id timeuuid," @@ -229,8 +89,9 @@ public final class SystemKeyspace .compactionStrategyOptions(Collections.singletonMap("enabled", "false")) .gcGraceSeconds(0); - public static final CFMetaData BatchlogTable = - compile(BATCHLOG_TABLE, "batches awaiting replay", + public static final CFMetaData Batchlog = + compile(BATCHLOG, + "batches awaiting replay", "CREATE TABLE %s (" + "id uuid," + "data blob," @@ -240,8 +101,9 @@ public final class SystemKeyspace .compactionStrategyOptions(Collections.singletonMap("min_threshold", "2")) .gcGraceSeconds(0); - private static final CFMetaData PaxosTable = - compile(PAXOS_TABLE, "in-progress paxos proposals", + private static final CFMetaData Paxos = + compile(PAXOS, + "in-progress paxos proposals", "CREATE TABLE %s (" + "row_key blob," + "cf_id UUID," @@ -253,8 +115,19 @@ public final class SystemKeyspace + "PRIMARY KEY ((row_key), cf_id))") .compactionStrategyClass(LeveledCompactionStrategy.class); - private static final CFMetaData LocalTable = - compile(LOCAL_TABLE, "information about the local node", + // TODO: make private + public static final CFMetaData BuiltIndexes = + compile(BUILT_INDEXES, + "built column indexes", + "CREATE TABLE \"%s\" (" + + "table_name text," + + "index_name text," + + "PRIMARY KEY ((table_name), index_name)) " + + "WITH COMPACT STORAGE"); + + private static final CFMetaData Local = + compile(LOCAL, + "information about the local node", "CREATE TABLE %s (" + "key text," + "bootstrapped text," @@ -273,8 +146,9 @@ public final class SystemKeyspace + "truncated_at map," + "PRIMARY KEY ((key)))"); - private static final CFMetaData PeersTable = - compile(PEERS_TABLE, "information about known peers in the cluster", + private static final CFMetaData Peers = + compile(PEERS, + "information about known peers in the cluster", "CREATE TABLE %s (" + "peer inet," + "data_center text," @@ -287,22 +161,25 @@ public final class SystemKeyspace + "tokens set," + "PRIMARY KEY ((peer)))"); - private static final CFMetaData PeerEventsTable = - compile(PEER_EVENTS_TABLE, "events related to peers", + private static final CFMetaData PeerEvents = + compile(PEER_EVENTS, + "events related to peers", "CREATE TABLE %s (" + "peer inet," + "hints_dropped map," + "PRIMARY KEY ((peer)))"); - private static final CFMetaData RangeXfersTable = - compile(RANGE_XFERS_TABLE, "ranges requested for transfer", + private static final CFMetaData RangeXfers = + compile(RANGE_XFERS, + "ranges requested for transfer", "CREATE TABLE %s (" + "token_bytes blob," + "requested_at timestamp," + "PRIMARY KEY ((token_bytes)))"); - private static final CFMetaData CompactionLogTable = - compile(COMPACTION_LOG_TABLE, "unfinished compactions", + private static final CFMetaData CompactionsInProgress = + compile(COMPACTIONS_IN_PROGRESS, + "unfinished compactions", "CREATE TABLE %s (" + "id uuid," + "columnfamily_name text," @@ -310,8 +187,9 @@ public final class SystemKeyspace + "keyspace_name text," + "PRIMARY KEY ((id)))"); - private static final CFMetaData CompactionHistoryTable = - compile(COMPACTION_HISTORY_TABLE, "week-long compaction history", + private static final CFMetaData CompactionHistory = + compile(COMPACTION_HISTORY, + "week-long compaction history", "CREATE TABLE %s (" + "id uuid," + "bytes_in bigint," @@ -321,10 +199,11 @@ public final class SystemKeyspace + "keyspace_name text," + "rows_merged map," + "PRIMARY KEY ((id)))") - .defaultTimeToLive(WEEK); + .defaultTimeToLive((int) TimeUnit.DAYS.toSeconds(7)); - private static final CFMetaData SSTableActivityTable = - compile(SSTABLE_ACTIVITY_TABLE, "historic sstable read rates", + private static final CFMetaData SSTableActivity = + compile(SSTABLE_ACTIVITY, + "historic sstable read rates", "CREATE TABLE %s (" + "keyspace_name text," + "columnfamily_name text," @@ -333,37 +212,29 @@ public final class SystemKeyspace + "rate_15m double," + "PRIMARY KEY ((keyspace_name, columnfamily_name, generation)))"); - private static CFMetaData compile(String table, String comment, String cql) + private static CFMetaData compile(String name, String description, String schema) { - return CFMetaData.compile(String.format(cql, table), NAME).comment(comment); + return CFMetaData.compile(String.format(schema, name), NAME).comment(description); } public static KSMetaData definition() { - List tables = - Arrays.asList(SchemaKeyspacesTable, - SchemaColumnFamiliesTable, - SchemaColumnsTable, - SchemaTriggersTable, - SchemaUserTypesTable, - SchemaFunctionsTable, - SchemaAggregatesTable, - BuiltIndexesTable, - HintsTable, - BatchlogTable, - PaxosTable, - LocalTable, - PeersTable, - PeerEventsTable, - RangeXfersTable, - CompactionLogTable, - CompactionHistoryTable, - SSTableActivityTable); + Iterable tables = + Iterables.concat(LegacySchemaTables.All, + Arrays.asList(BuiltIndexes, + Hints, + Batchlog, + Paxos, + Local, + Peers, + PeerEvents, + RangeXfers, + CompactionsInProgress, + CompactionHistory, + SSTableActivity)); return new KSMetaData(NAME, LocalStrategy.class, Collections.emptyMap(), true, tables); } - private static final String LOCAL_KEY = "local"; - private static volatile Map> truncationRecords; public enum BootstrapState @@ -381,24 +252,15 @@ private static DecoratedKey decorate(ByteBuffer key) public static void finishStartup() { setupVersion(); - - // add entries to system schema columnfamilies for the hardcoded system definitions - KSMetaData ksmd = Schema.instance.getKSMetaData(NAME); - - // delete old, possibly obsolete entries in schema tables - for (String table : ALL_SCHEMA_TABLES) - executeOnceInternal(String.format("DELETE FROM system.%s WHERE keyspace_name = ?", table), ksmd.name); - - // (+1 to timestamp to make sure we don't get shadowed by the tombstones we just added) - ksmd.toSchema(FBUtilities.timestampMicros() + 1).apply(); + LegacySchemaTables.saveSystemKeyspaceSchema(); } private static void setupVersion() { String req = "INSERT INTO system.%s (key, release_version, cql_version, thrift_version, native_protocol_version, data_center, rack, partitioner) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; IEndpointSnitch snitch = DatabaseDescriptor.getEndpointSnitch(); - executeOnceInternal(String.format(req, LOCAL_TABLE), - LOCAL_KEY, + executeOnceInternal(String.format(req, LOCAL), + LOCAL, FBUtilities.getReleaseVersionString(), QueryProcessor.CQL_VERSION.toString(), cassandraConstants.VERSION, @@ -429,8 +291,8 @@ public Integer apply(SSTableReader sstable) } }); String req = "INSERT INTO system.%s (id, keyspace_name, columnfamily_name, inputs) VALUES (?, ?, ?, ?)"; - executeInternal(String.format(req, COMPACTION_LOG_TABLE), compactionId, cfs.keyspace.getName(), cfs.name, Sets.newHashSet(generations)); - forceBlockingFlush(COMPACTION_LOG_TABLE); + executeInternal(String.format(req, COMPACTIONS_IN_PROGRESS), compactionId, cfs.keyspace.getName(), cfs.name, Sets.newHashSet(generations)); + forceBlockingFlush(COMPACTIONS_IN_PROGRESS); return compactionId; } @@ -443,8 +305,8 @@ public static void finishCompaction(UUID taskId) { assert taskId != null; - executeInternal(String.format("DELETE FROM system.%s WHERE id = ?", COMPACTION_LOG_TABLE), taskId); - forceBlockingFlush(COMPACTION_LOG_TABLE); + executeInternal(String.format("DELETE FROM system.%s WHERE id = ?", COMPACTIONS_IN_PROGRESS), taskId); + forceBlockingFlush(COMPACTIONS_IN_PROGRESS); } /** @@ -454,7 +316,7 @@ public static void finishCompaction(UUID taskId) public static Map, Map> getUnfinishedCompactions() { String req = "SELECT * FROM system.%s"; - UntypedResultSet resultSet = executeInternal(String.format(req, COMPACTION_LOG_TABLE)); + UntypedResultSet resultSet = executeInternal(String.format(req, COMPACTIONS_IN_PROGRESS)); Map, Map> unfinishedCompactions = new HashMap<>(); for (UntypedResultSet.Row row : resultSet) @@ -479,7 +341,7 @@ public static Map, Map> getUnfinishedCompact public static void discardCompactionsInProgress() { - ColumnFamilyStore compactionLog = Keyspace.open(NAME).getColumnFamilyStore(COMPACTION_LOG_TABLE); + ColumnFamilyStore compactionLog = Keyspace.open(NAME).getColumnFamilyStore(COMPACTIONS_IN_PROGRESS); compactionLog.truncateBlocking(); } @@ -491,24 +353,24 @@ public static void updateCompactionHistory(String ksname, Map rowsMerged) { // don't write anything when the history table itself is compacted, since that would in turn cause new compactions - if (ksname.equals("system") && cfname.equals(COMPACTION_HISTORY_TABLE)) + if (ksname.equals("system") && cfname.equals(COMPACTION_HISTORY)) return; String req = "INSERT INTO system.%s (id, keyspace_name, columnfamily_name, compacted_at, bytes_in, bytes_out, rows_merged) VALUES (?, ?, ?, ?, ?, ?, ?)"; - executeInternal(String.format(req, COMPACTION_HISTORY_TABLE), UUIDGen.getTimeUUID(), ksname, cfname, ByteBufferUtil.bytes(compactedAt), bytesIn, bytesOut, rowsMerged); + executeInternal(String.format(req, COMPACTION_HISTORY), UUIDGen.getTimeUUID(), ksname, cfname, ByteBufferUtil.bytes(compactedAt), bytesIn, bytesOut, rowsMerged); } public static TabularData getCompactionHistory() throws OpenDataException { - UntypedResultSet queryResultSet = executeInternal(String.format("SELECT * from system.%s", COMPACTION_HISTORY_TABLE)); + UntypedResultSet queryResultSet = executeInternal(String.format("SELECT * from system.%s", COMPACTION_HISTORY)); return CompactionHistoryTabularData.from(queryResultSet); } public static synchronized void saveTruncationRecord(ColumnFamilyStore cfs, long truncatedAt, ReplayPosition position) { String req = "UPDATE system.%s SET truncated_at = truncated_at + ? WHERE key = '%s'"; - executeInternal(String.format(req, LOCAL_TABLE, LOCAL_KEY), truncationAsMapEntry(cfs, truncatedAt, position)); + executeInternal(String.format(req, LOCAL, LOCAL), truncationAsMapEntry(cfs, truncatedAt, position)); truncationRecords = null; - forceBlockingFlush(LOCAL_TABLE); + forceBlockingFlush(LOCAL); } /** @@ -517,9 +379,9 @@ public static synchronized void saveTruncationRecord(ColumnFamilyStore cfs, long public static synchronized void removeTruncationRecord(UUID cfId) { String req = "DELETE truncated_at[?] from system.%s WHERE key = '%s'"; - executeInternal(String.format(req, LOCAL_TABLE, LOCAL_KEY), cfId); + executeInternal(String.format(req, LOCAL, LOCAL), cfId); truncationRecords = null; - forceBlockingFlush(LOCAL_TABLE); + forceBlockingFlush(LOCAL); } private static Map truncationAsMapEntry(ColumnFamilyStore cfs, long truncatedAt, ReplayPosition position) @@ -558,7 +420,7 @@ private static synchronized Pair getTruncationRecord(UUID private static Map> readTruncationRecords() { - UntypedResultSet rows = executeInternal(String.format("SELECT truncated_at FROM system.%s WHERE key = '%s'", LOCAL_TABLE, LOCAL_KEY)); + UntypedResultSet rows = executeInternal(String.format("SELECT truncated_at FROM system.%s WHERE key = '%s'", LOCAL, LOCAL)); Map> records = new HashMap<>(); @@ -597,14 +459,14 @@ public static synchronized void updateTokens(InetAddress ep, Collection t } String req = "INSERT INTO system.%s (peer, tokens) VALUES (?, ?)"; - executeInternal(String.format(req, PEERS_TABLE), ep, tokensAsSet(tokens)); + executeInternal(String.format(req, PEERS), ep, tokensAsSet(tokens)); } public static synchronized void updatePreferredIP(InetAddress ep, InetAddress preferred_ip) { String req = "INSERT INTO system.%s (peer, preferred_ip) VALUES (?, ?)"; - executeInternal(String.format(req, PEERS_TABLE), ep, preferred_ip); - forceBlockingFlush(PEERS_TABLE); + executeInternal(String.format(req, PEERS), ep, preferred_ip); + forceBlockingFlush(PEERS); } public static synchronized void updatePeerInfo(InetAddress ep, String columnName, Object value) @@ -613,20 +475,20 @@ public static synchronized void updatePeerInfo(InetAddress ep, String columnName return; String req = "INSERT INTO system.%s (peer, %s) VALUES (?, ?)"; - executeInternal(String.format(req, PEERS_TABLE, columnName), ep, value); + executeInternal(String.format(req, PEERS, columnName), ep, value); } public static synchronized void updateHintsDropped(InetAddress ep, UUID timePeriod, int value) { // with 30 day TTL String req = "UPDATE system.%s USING TTL 2592000 SET hints_dropped[ ? ] = ? WHERE peer = ?"; - executeInternal(String.format(req, PEER_EVENTS_TABLE), timePeriod, value, ep); + executeInternal(String.format(req, PEER_EVENTS), timePeriod, value, ep); } public static synchronized void updateSchemaVersion(UUID version) { String req = "INSERT INTO system.%s (key, schema_version) VALUES ('%s', ?)"; - executeInternal(String.format(req, LOCAL_TABLE, LOCAL_KEY), version); + executeInternal(String.format(req, LOCAL, LOCAL), version); } private static Set tokensAsSet(Collection tokens) @@ -653,7 +515,7 @@ private static Collection deserializeTokens(Collection tokensStri public static synchronized void removeEndpoint(InetAddress ep) { String req = "DELETE FROM system.%s WHERE peer = ?"; - executeInternal(String.format(req, PEERS_TABLE), ep); + executeInternal(String.format(req, PEERS), ep); } /** @@ -663,8 +525,8 @@ public static synchronized void updateTokens(Collection tokens) { assert !tokens.isEmpty() : "removeEndpoint should be used instead"; String req = "INSERT INTO system.%s (key, tokens) VALUES ('%s', ?)"; - executeInternal(String.format(req, LOCAL_TABLE, LOCAL_KEY), tokensAsSet(tokens)); - forceBlockingFlush(LOCAL_TABLE); + executeInternal(String.format(req, LOCAL, LOCAL), tokensAsSet(tokens)); + forceBlockingFlush(LOCAL); } /** @@ -696,7 +558,7 @@ public static void forceBlockingFlush(String cfname) public static SetMultimap loadTokens() { SetMultimap tokenMap = HashMultimap.create(); - for (UntypedResultSet.Row row : executeInternal("SELECT peer, tokens FROM system." + PEERS_TABLE)) + for (UntypedResultSet.Row row : executeInternal("SELECT peer, tokens FROM system." + PEERS)) { InetAddress peer = row.getInetAddress("peer"); if (row.has("tokens")) @@ -713,7 +575,7 @@ public static SetMultimap loadTokens() public static Map loadHostIds() { Map hostIdMap = new HashMap<>(); - for (UntypedResultSet.Row row : executeInternal("SELECT peer, host_id FROM system." + PEERS_TABLE)) + for (UntypedResultSet.Row row : executeInternal("SELECT peer, host_id FROM system." + PEERS)) { InetAddress peer = row.getInetAddress("peer"); if (row.has("host_id")) @@ -733,7 +595,7 @@ public static Map loadHostIds() public static InetAddress getPreferredIP(InetAddress ep) { String req = "SELECT preferred_ip FROM system.%s WHERE peer=?"; - UntypedResultSet result = executeInternal(String.format(req, PEERS_TABLE), ep); + UntypedResultSet result = executeInternal(String.format(req, PEERS), ep); if (!result.isEmpty() && result.one().has("preferred_ip")) return result.one().getInetAddress("preferred_ip"); return ep; @@ -745,7 +607,7 @@ public static InetAddress getPreferredIP(InetAddress ep) public static Map> loadDcRackInfo() { Map> result = new HashMap<>(); - for (UntypedResultSet.Row row : executeInternal("SELECT peer, data_center, rack from system." + PEERS_TABLE)) + for (UntypedResultSet.Row row : executeInternal("SELECT peer, data_center, rack from system." + PEERS)) { InetAddress peer = row.getInetAddress("peer"); if (row.has("data_center") && row.has("rack")) @@ -780,10 +642,10 @@ public static void checkHealth() throws ConfigurationException ex.initCause(err); throw ex; } - ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(LOCAL_TABLE); + ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(LOCAL); String req = "SELECT cluster_name FROM system.%s WHERE key='%s'"; - UntypedResultSet result = executeInternal(String.format(req, LOCAL_TABLE, LOCAL_KEY)); + UntypedResultSet result = executeInternal(String.format(req, LOCAL, LOCAL)); if (result.isEmpty() || !result.one().has("cluster_name")) { @@ -793,7 +655,7 @@ public static void checkHealth() throws ConfigurationException // no system files. this is a new node. req = "INSERT INTO system.%s (key, cluster_name) VALUES ('%s', ?)"; - executeInternal(String.format(req, LOCAL_TABLE, LOCAL_KEY), DatabaseDescriptor.getClusterName()); + executeInternal(String.format(req, LOCAL, LOCAL), DatabaseDescriptor.getClusterName()); return; } @@ -805,7 +667,7 @@ public static void checkHealth() throws ConfigurationException public static Collection getSavedTokens() { String req = "SELECT tokens FROM system.%s WHERE key='%s'"; - UntypedResultSet result = executeInternal(String.format(req, LOCAL_TABLE, LOCAL_KEY)); + UntypedResultSet result = executeInternal(String.format(req, LOCAL, LOCAL)); return result.isEmpty() || !result.one().has("tokens") ? Collections.emptyList() : deserializeTokens(result.one().getSet("tokens", UTF8Type.instance)); @@ -814,7 +676,7 @@ public static Collection getSavedTokens() public static int incrementAndGetGeneration() { String req = "SELECT gossip_generation FROM system.%s WHERE key='%s'"; - UntypedResultSet result = executeInternal(String.format(req, LOCAL_TABLE, LOCAL_KEY)); + UntypedResultSet result = executeInternal(String.format(req, LOCAL, LOCAL)); int generation; if (result.isEmpty() || !result.one().has("gossip_generation")) @@ -842,8 +704,8 @@ public static int incrementAndGetGeneration() } req = "INSERT INTO system.%s (key, gossip_generation) VALUES ('%s', ?)"; - executeInternal(String.format(req, LOCAL_TABLE, LOCAL_KEY), generation); - forceBlockingFlush(LOCAL_TABLE); + executeInternal(String.format(req, LOCAL, LOCAL), generation); + forceBlockingFlush(LOCAL); return generation; } @@ -851,7 +713,7 @@ public static int incrementAndGetGeneration() public static BootstrapState getBootstrapState() { String req = "SELECT bootstrapped FROM system.%s WHERE key='%s'"; - UntypedResultSet result = executeInternal(String.format(req, LOCAL_TABLE, LOCAL_KEY)); + UntypedResultSet result = executeInternal(String.format(req, LOCAL, LOCAL)); if (result.isEmpty() || !result.one().has("bootstrapped")) return BootstrapState.NEEDS_BOOTSTRAP; @@ -872,15 +734,15 @@ public static boolean bootstrapInProgress() public static void setBootstrapState(BootstrapState state) { String req = "INSERT INTO system.%s (key, bootstrapped) VALUES ('%s', ?)"; - executeInternal(String.format(req, LOCAL_TABLE, LOCAL_KEY), state.name()); - forceBlockingFlush(LOCAL_TABLE); + executeInternal(String.format(req, LOCAL, LOCAL), state.name()); + forceBlockingFlush(LOCAL); } public static boolean isIndexBuilt(String keyspaceName, String indexName) { - ColumnFamilyStore cfs = Keyspace.open(NAME).getColumnFamilyStore(BUILT_INDEXES_TABLE); + ColumnFamilyStore cfs = Keyspace.open(NAME).getColumnFamilyStore(BUILT_INDEXES); QueryFilter filter = QueryFilter.getNamesFilter(decorate(ByteBufferUtil.bytes(keyspaceName)), - BUILT_INDEXES_TABLE, + BUILT_INDEXES, FBUtilities.singleton(cfs.getComparator().makeCellName(indexName), cfs.getComparator()), System.currentTimeMillis()); return ColumnFamilyStore.removeDeleted(cfs.getColumnFamily(filter), Integer.MAX_VALUE) != null; @@ -888,7 +750,7 @@ public static boolean isIndexBuilt(String keyspaceName, String indexName) public static void setIndexBuilt(String keyspaceName, String indexName) { - ColumnFamily cf = ArrayBackedSortedColumns.factory.create(NAME, BUILT_INDEXES_TABLE); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(NAME, BUILT_INDEXES); cf.addColumn(new BufferCell(cf.getComparator().makeCellName(indexName), ByteBufferUtil.EMPTY_BYTE_BUFFER, FBUtilities.timestampMicros())); new Mutation(NAME, ByteBufferUtil.bytes(keyspaceName), cf).apply(); } @@ -896,7 +758,7 @@ public static void setIndexBuilt(String keyspaceName, String indexName) public static void setIndexRemoved(String keyspaceName, String indexName) { Mutation mutation = new Mutation(NAME, ByteBufferUtil.bytes(keyspaceName)); - mutation.delete(BUILT_INDEXES_TABLE, BuiltIndexesTable.comparator.makeCellName(indexName), FBUtilities.timestampMicros()); + mutation.delete(BUILT_INDEXES, BuiltIndexes.comparator.makeCellName(indexName), FBUtilities.timestampMicros()); mutation.apply(); } @@ -907,7 +769,7 @@ public static void setIndexRemoved(String keyspaceName, String indexName) public static UUID getLocalHostId() { String req = "SELECT host_id FROM system.%s WHERE key='%s'"; - UntypedResultSet result = executeInternal(String.format(req, LOCAL_TABLE, LOCAL_KEY)); + UntypedResultSet result = executeInternal(String.format(req, LOCAL, LOCAL)); // Look up the Host UUID (return it if found) if (!result.isEmpty() && result.one().has("host_id")) @@ -925,144 +787,14 @@ public static UUID getLocalHostId() public static UUID setLocalHostId(UUID hostId) { String req = "INSERT INTO system.%s (key, host_id) VALUES ('%s', ?)"; - executeInternal(String.format(req, LOCAL_TABLE, LOCAL_KEY), hostId); + executeInternal(String.format(req, LOCAL, LOCAL), hostId); return hostId; } - /** - * @param cfName The name of the ColumnFamily responsible for part of the schema (keyspace, ColumnFamily, columns) - * @return CFS responsible to hold low-level serialized schema - */ - public static ColumnFamilyStore schemaCFS(String cfName) - { - return Keyspace.open(NAME).getColumnFamilyStore(cfName); - } - - public static List serializedSchema() - { - List schema = new ArrayList<>(); - - for (String cf : ALL_SCHEMA_TABLES) - schema.addAll(serializedSchema(cf)); - - return schema; - } - - /** - * @param schemaCfName The name of the ColumnFamily responsible for part of the schema (keyspace, ColumnFamily, columns) - * @return low-level schema representation (each row represents individual Keyspace or ColumnFamily) - */ - public static List serializedSchema(String schemaCfName) - { - Token minToken = StorageService.getPartitioner().getMinimumToken(); - - return schemaCFS(schemaCfName).getRangeSlice(new Range(minToken.minKeyBound(), minToken.maxKeyBound()), - null, - new IdentityQueryFilter(), - Integer.MAX_VALUE, - System.currentTimeMillis()); - } - - public static Collection serializeSchema() - { - Map mutationMap = new HashMap<>(); - - for (String cf : ALL_SCHEMA_TABLES) - serializeSchema(mutationMap, cf); - - return mutationMap.values(); - } - - private static void serializeSchema(Map mutationMap, String schemaCfName) - { - for (Row schemaRow : serializedSchema(schemaCfName)) - { - if (Schema.ignoredSchemaRow(schemaRow)) - continue; - - Mutation mutation = mutationMap.get(schemaRow.key); - if (mutation == null) - { - mutation = new Mutation(NAME, schemaRow.key.getKey()); - mutationMap.put(schemaRow.key, mutation); - } - - mutation.add(schemaRow.cf); - } - } - - public static Map getSchema(String cfName) - { - Map schema = new HashMap<>(); - - for (Row schemaEntity : SystemKeyspace.serializedSchema(cfName)) - schema.put(schemaEntity.key, schemaEntity.cf); - - return schema; - } - - public static Map getSchema(String schemaCfName, Set keyspaces) - { - Map schema = new HashMap<>(); - - for (String keyspace : keyspaces) - { - Row schemaEntity = readSchemaRow(schemaCfName, keyspace); - if (schemaEntity.cf != null) - schema.put(schemaEntity.key, schemaEntity.cf); - } - - return schema; - } - - public static ByteBuffer getSchemaKSKey(String ksName) - { - return AsciiType.instance.fromString(ksName); - } - - /** - * Fetches a subset of schema (table data, columns metadata or triggers) for the keyspace. - * - * @param schemaCfName the schema table to get the data from (schema_keyspaces, schema_columnfamilies, schema_columns or schema_triggers) - * @param ksName the keyspace of the tables we are interested in - * @return a Row containing the schema data of a particular type for the keyspace - */ - public static Row readSchemaRow(String schemaCfName, String ksName) - { - DecoratedKey key = StorageService.getPartitioner().decorateKey(getSchemaKSKey(ksName)); - - ColumnFamilyStore schemaCFS = SystemKeyspace.schemaCFS(schemaCfName); - ColumnFamily result = schemaCFS.getColumnFamily(QueryFilter.getIdentityFilter(key, schemaCfName, System.currentTimeMillis())); - - return new Row(key, result); - } - - /** - * Fetches a subset of schema (table data, columns metadata or triggers) for the keyspace+table pair. - * - * @param schemaCfName the schema table to get the data from (schema_columnfamilies, schema_columns or schema_triggers) - * @param ksName the keyspace of the table we are interested in - * @param cfName the table we are interested in - * @return a Row containing the schema data of a particular type for the table - */ - public static Row readSchemaRow(String schemaCfName, String ksName, String cfName) - { - DecoratedKey key = StorageService.getPartitioner().decorateKey(getSchemaKSKey(ksName)); - ColumnFamilyStore schemaCFS = SystemKeyspace.schemaCFS(schemaCfName); - Composite prefix = schemaCFS.getComparator().make(cfName); - ColumnFamily cf = schemaCFS.getColumnFamily(key, - prefix, - prefix.end(), - false, - Integer.MAX_VALUE, - System.currentTimeMillis()); - return new Row(key, cf); - } - public static PaxosState loadPaxosState(ByteBuffer key, CFMetaData metadata) { String req = "SELECT * FROM system.%s WHERE row_key = ? AND cf_id = ?"; - UntypedResultSet results = executeInternal(String.format(req, PAXOS_TABLE), key, metadata.cfId); + UntypedResultSet results = executeInternal(String.format(req, PAXOS), key, metadata.cfId); if (results.isEmpty()) return new PaxosState(key, metadata); UntypedResultSet.Row row = results.one(); @@ -1083,7 +815,7 @@ public static PaxosState loadPaxosState(ByteBuffer key, CFMetaData metadata) public static void savePaxosPromise(Commit promise) { String req = "UPDATE system.%s USING TIMESTAMP ? AND TTL ? SET in_progress_ballot = ? WHERE row_key = ? AND cf_id = ?"; - executeInternal(String.format(req, PAXOS_TABLE), + executeInternal(String.format(req, PAXOS), UUIDGen.microsTimestamp(promise.ballot), paxosTtl(promise.update.metadata), promise.ballot, @@ -1093,7 +825,7 @@ public static void savePaxosPromise(Commit promise) public static void savePaxosProposal(Commit proposal) { - executeInternal(String.format("UPDATE system.%s USING TIMESTAMP ? AND TTL ? SET proposal_ballot = ?, proposal = ? WHERE row_key = ? AND cf_id = ?", PAXOS_TABLE), + executeInternal(String.format("UPDATE system.%s USING TIMESTAMP ? AND TTL ? SET proposal_ballot = ?, proposal = ? WHERE row_key = ? AND cf_id = ?", PAXOS), UUIDGen.microsTimestamp(proposal.ballot), paxosTtl(proposal.update.metadata), proposal.ballot, @@ -1113,7 +845,7 @@ public static void savePaxosCommit(Commit commit) // We always erase the last proposal (with the commit timestamp to no erase more recent proposal in case the commit is old) // even though that's really just an optimization since SP.beginAndRepairPaxos will exclude accepted proposal older than the mrc. String cql = "UPDATE system.%s USING TIMESTAMP ? AND TTL ? SET proposal_ballot = null, proposal = null, most_recent_commit_at = ?, most_recent_commit = ? WHERE row_key = ? AND cf_id = ?"; - executeInternal(String.format(cql, PAXOS_TABLE), + executeInternal(String.format(cql, PAXOS), UUIDGen.microsTimestamp(commit.ballot), paxosTtl(commit.update.metadata), commit.ballot, @@ -1132,7 +864,7 @@ public static void savePaxosCommit(Commit commit) public static RestorableMeter getSSTableReadMeter(String keyspace, String table, int generation) { String cql = "SELECT * FROM system.%s WHERE keyspace_name=? and columnfamily_name=? and generation=?"; - UntypedResultSet results = executeInternal(String.format(cql, SSTABLE_ACTIVITY_TABLE), keyspace, table, generation); + UntypedResultSet results = executeInternal(String.format(cql, SSTABLE_ACTIVITY), keyspace, table, generation); if (results.isEmpty()) return new RestorableMeter(); @@ -1150,7 +882,7 @@ public static void persistSSTableReadMeter(String keyspace, String table, int ge { // Store values with a one-day TTL to handle corner cases where cleanup might not occur String cql = "INSERT INTO system.%s (keyspace_name, columnfamily_name, generation, rate_15m, rate_120m) VALUES (?, ?, ?, ?, ?) USING TTL 864000"; - executeInternal(String.format(cql, SSTABLE_ACTIVITY_TABLE), + executeInternal(String.format(cql, SSTABLE_ACTIVITY), keyspace, table, generation, @@ -1164,6 +896,6 @@ public static void persistSSTableReadMeter(String keyspace, String table, int ge public static void clearSSTableReadMeter(String keyspace, String table, int generation) { String cql = "DELETE FROM system.%s WHERE keyspace_name=? AND columnfamily_name=? and generation=?"; - executeInternal(String.format(cql, SSTABLE_ACTIVITY_TABLE), keyspace, table, generation); + executeInternal(String.format(cql, SSTABLE_ACTIVITY), keyspace, table, generation); } } diff --git a/src/java/org/apache/cassandra/hadoop/ColumnFamilyRecordReader.java b/src/java/org/apache/cassandra/hadoop/ColumnFamilyRecordReader.java index 0b52904161b0..8be9a184a655 100644 --- a/src/java/org/apache/cassandra/hadoop/ColumnFamilyRecordReader.java +++ b/src/java/org/apache/cassandra/hadoop/ColumnFamilyRecordReader.java @@ -24,17 +24,19 @@ import java.util.*; import com.google.common.collect.*; -import org.apache.cassandra.db.BufferCell; -import org.apache.cassandra.db.Cell; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.schema.LegacySchemaTables; +import org.apache.cassandra.db.SystemKeyspace; +import org.apache.cassandra.db.BufferCell; +import org.apache.cassandra.db.Cell; import org.apache.cassandra.db.composites.CellNames; import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.db.marshal.CompositeType; import org.apache.cassandra.db.marshal.TypeParser; import org.apache.cassandra.dht.IPartitioner; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.thrift.*; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; @@ -228,17 +230,15 @@ private RowIterator() { partitioner = FBUtilities.newPartitioner(client.describe_partitioner()); // get CF meta data - String query = "SELECT comparator," + - " subcomparator," + - " type " + - "FROM system.schema_columnfamilies " + - "WHERE keyspace_name = '%s' " + - " AND columnfamily_name = '%s' "; - - CqlResult result = client.execute_cql3_query( - ByteBufferUtil.bytes(String.format(query, keyspace, cfName)), - Compression.NONE, - ConsistencyLevel.ONE); + String query = String.format("SELECT comparator, subcomparator, type " + + "FROM %s.%s " + + "WHERE keyspace_name = '%s' AND columnfamily_name = '%s'", + SystemKeyspace.NAME, + LegacySchemaTables.COLUMNFAMILIES, + keyspace, + cfName); + + CqlResult result = client.execute_cql3_query(ByteBufferUtil.bytes(query), Compression.NONE, ConsistencyLevel.ONE); Iterator iteraRow = result.rows.iterator(); diff --git a/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordReader.java b/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordReader.java index 21e30e2b9026..ffaaea988f08 100644 --- a/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordReader.java +++ b/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordReader.java @@ -22,17 +22,7 @@ import java.math.BigInteger; import java.net.InetAddress; import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; +import java.util.*; import com.google.common.base.Function; import com.google.common.base.Joiner; @@ -40,10 +30,7 @@ import com.google.common.collect.AbstractIterator; import com.google.common.collect.Iterables; import com.google.common.collect.Maps; - import org.apache.commons.lang3.StringUtils; - -import org.apache.cassandra.hadoop.HadoopCompat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -55,6 +42,8 @@ import com.datastax.driver.core.Session; import com.datastax.driver.core.TupleValue; import com.datastax.driver.core.UDTValue; +import org.apache.cassandra.schema.LegacySchemaTables; +import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.hadoop.ColumnFamilySplit; @@ -601,8 +590,15 @@ public String apply(String column) private void fetchKeys() { - String query = "SELECT column_name, component_index, type FROM system.schema_columns WHERE keyspace_name='" + - keyspace + "' and columnfamily_name='" + cfName + "'"; + String query = String.format("SELECT column_name, component_index, type " + + "FROM %s.%s " + + "WHERE keyspace_name = '%s' AND columnfamily_name = '%s'", + SystemKeyspace.NAME, + LegacySchemaTables.COLUMNS, + keyspace, + cfName); + + // get CF meta data List rows = session.execute(query).all(); if (rows.isEmpty()) { diff --git a/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordWriter.java b/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordWriter.java index 311359a3f591..0956ba5e49fe 100644 --- a/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordWriter.java +++ b/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordWriter.java @@ -25,6 +25,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; + +import org.apache.cassandra.schema.LegacySchemaTables; +import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.db.marshal.CompositeType; import org.apache.cassandra.db.marshal.LongType; @@ -297,10 +300,6 @@ private int preparedStatement(Cassandra.Client client) { result = client.prepare_cql3_query(ByteBufferUtil.bytes(cql), Compression.NONE); } - catch (InvalidRequestException e) - { - throw new RuntimeException("failed to prepare cql query " + cql, e); - } catch (TException e) { throw new RuntimeException("failed to prepare cql query " + cql, e); @@ -331,18 +330,20 @@ private ByteBuffer getPartitionKey(Map keyColumns) return partitionKey; } + // FIXME /** retrieve the key validator from system.schema_columnfamilies table */ private void retrievePartitionKeyValidator(Cassandra.Client client) throws Exception { String keyspace = ConfigHelper.getOutputKeyspace(conf); String cfName = ConfigHelper.getOutputColumnFamily(conf); - String query = "SELECT key_validator," + - " key_aliases," + - " column_aliases " + - "FROM system.schema_columnfamilies " + - "WHERE keyspace_name='%s' and columnfamily_name='%s'"; - String formatted = String.format(query, keyspace, cfName); - CqlResult result = client.execute_cql3_query(ByteBufferUtil.bytes(formatted), Compression.NONE, ConsistencyLevel.ONE); + String query = String.format("SELECT key_validator, key_aliases, column_aliases " + + "FROM %s.%s " + + "WHERE keyspace_name = '%s' and columnfamily_name = '%s'", + SystemKeyspace.NAME, + LegacySchemaTables.COLUMNFAMILIES, + keyspace, + cfName); + CqlResult result = client.execute_cql3_query(ByteBufferUtil.bytes(query), Compression.NONE, ConsistencyLevel.ONE); Column rawKeyValidator = result.rows.get(0).columns.get(0); String validator = ByteBufferUtil.string(ByteBuffer.wrap(rawKeyValidator.getValue())); diff --git a/src/java/org/apache/cassandra/hadoop/pig/AbstractCassandraStorage.java b/src/java/org/apache/cassandra/hadoop/pig/AbstractCassandraStorage.java index dc3725257098..04d207f26010 100644 --- a/src/java/org/apache/cassandra/hadoop/pig/AbstractCassandraStorage.java +++ b/src/java/org/apache/cassandra/hadoop/pig/AbstractCassandraStorage.java @@ -26,6 +26,8 @@ import java.util.*; import org.apache.cassandra.db.Cell; +import org.apache.cassandra.schema.LegacySchemaTables; +import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.SyntaxException; import org.apache.cassandra.auth.IAuthenticator; @@ -585,20 +587,15 @@ protected CfInfo getCfInfo(Cassandra.Client client) IOException { // get CF meta data - String query = "SELECT type," + - " comparator," + - " subcomparator," + - " default_validator," + - " key_validator," + - " key_aliases " + - "FROM system.schema_columnfamilies " + - "WHERE keyspace_name = '%s' " + - " AND columnfamily_name = '%s' "; - - CqlResult result = client.execute_cql3_query( - ByteBufferUtil.bytes(String.format(query, keyspace, column_family)), - Compression.NONE, - ConsistencyLevel.ONE); + String query = String.format("SELECT type, comparator, subcomparator, default_validator, key_validator, key_aliases " + + "FROM %s.%s " + + "WHERE keyspace_name = '%s' AND columnfamily_name = '%s'", + SystemKeyspace.NAME, + LegacySchemaTables.COLUMNFAMILIES, + keyspace, + column_family); + + CqlResult result = client.execute_cql3_query(ByteBufferUtil.bytes(query), Compression.NONE, ConsistencyLevel.ONE); if (result == null || result.rows == null || result.rows.isEmpty()) return null; @@ -657,18 +654,15 @@ protected List getColumnMeta(Cassandra.Client client, boolean cassand ConfigurationException, NotFoundException { - String query = "SELECT column_name, " + - " validator, " + - " index_type, " + - " type " + - "FROM system.schema_columns " + - "WHERE keyspace_name = '%s' " + - " AND columnfamily_name = '%s'"; - - CqlResult result = client.execute_cql3_query( - ByteBufferUtil.bytes(String.format(query, keyspace, column_family)), - Compression.NONE, - ConsistencyLevel.ONE); + String query = String.format("SELECT column_name, validator, index_type, type " + + "FROM %s.%s " + + "WHERE keyspace_name = '%s' AND columnfamily_name = '%s'", + SystemKeyspace.NAME, + LegacySchemaTables.COLUMNS, + keyspace, + column_family); + + CqlResult result = client.execute_cql3_query(ByteBufferUtil.bytes(query), Compression.NONE, ConsistencyLevel.ONE); List rows = result.rows; List columnDefs = new ArrayList(); diff --git a/src/java/org/apache/cassandra/hadoop/pig/CqlStorage.java b/src/java/org/apache/cassandra/hadoop/pig/CqlStorage.java index 6cd5c667b3da..fca1d43dbc37 100644 --- a/src/java/org/apache/cassandra/hadoop/pig/CqlStorage.java +++ b/src/java/org/apache/cassandra/hadoop/pig/CqlStorage.java @@ -25,6 +25,8 @@ import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.ColumnDefinition; import org.apache.cassandra.db.BufferCell; +import org.apache.cassandra.schema.LegacySchemaTables; +import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.db.composites.CellNames; import org.apache.cassandra.db.Cell; import org.apache.cassandra.db.marshal.*; @@ -482,21 +484,15 @@ protected List getColumnMetadata(Cassandra.Client client) protected List getKeysMeta(Cassandra.Client client) throws Exception { - String query = "SELECT key_aliases, " + - " column_aliases, " + - " key_validator, " + - " comparator, " + - " keyspace_name, " + - " value_alias, " + - " default_validator " + - "FROM system.schema_columnfamilies " + - "WHERE keyspace_name = '%s'" + - " AND columnfamily_name = '%s' "; - - CqlResult result = client.execute_cql3_query( - ByteBufferUtil.bytes(String.format(query, keyspace, column_family)), - Compression.NONE, - ConsistencyLevel.ONE); + String query = String.format("SELECT key_aliases, column_aliases, key_validator, comparator, keyspace_name, value_alias, default_validator " + + "FROM %s.%s " + + "WHERE keyspace_name = '%s' AND columnfamily_name = '%s'", + SystemKeyspace.NAME, + LegacySchemaTables.COLUMNFAMILIES, + keyspace, + column_family); + + CqlResult result = client.execute_cql3_query(ByteBufferUtil.bytes(query), Compression.NONE, ConsistencyLevel.ONE); if (result == null || result.rows == null || result.rows.isEmpty()) return null; diff --git a/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java b/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java index 43cd2c0e7f28..ec590f31b288 100644 --- a/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java +++ b/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java @@ -349,16 +349,16 @@ public Builder forTable(String schema) if (ksm == null) { ksm = KSMetaData.newKeyspace(this.schema.ksName, - AbstractReplicationStrategy.getClass("org.apache.cassandra.locator.SimpleStrategy"), - ImmutableMap.of("replication_factor", "1"), - true, - Collections.singleton(this.schema)); + AbstractReplicationStrategy.getClass("org.apache.cassandra.locator.SimpleStrategy"), + ImmutableMap.of("replication_factor", "1"), + true, + Collections.singleton(this.schema)); Schema.instance.load(ksm); } else if (Schema.instance.getCFMetaData(this.schema.ksName, this.schema.cfName) == null) { Schema.instance.load(this.schema); - ksm = KSMetaData.cloneWith(ksm, Iterables.concat(ksm.cfMetaData().values(), Collections.singleton(this.schema))); + ksm = ksm.cloneWithTableAdded(this.schema); Schema.instance.setKeyspaceDefinition(ksm); Keyspace.open(ksm.name).initCf(this.schema.cfId, this.schema.cfName, false); } diff --git a/src/java/org/apache/cassandra/schema/LegacySchemaTables.java b/src/java/org/apache/cassandra/schema/LegacySchemaTables.java new file mode 100644 index 000000000000..047698c2b341 --- /dev/null +++ b/src/java/org/apache/cassandra/schema/LegacySchemaTables.java @@ -0,0 +1,1480 @@ +/* + * 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.schema; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.*; +import java.util.concurrent.TimeUnit; + +import com.google.common.base.Function; +import com.google.common.collect.Iterables; +import com.google.common.collect.MapDifference; +import com.google.common.collect.Maps; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.cassandra.cache.CachingOptions; +import org.apache.cassandra.config.*; +import org.apache.cassandra.cql3.*; +import org.apache.cassandra.cql3.functions.*; +import org.apache.cassandra.db.*; +import org.apache.cassandra.db.columniterator.IdentityQueryFilter; +import org.apache.cassandra.db.composites.CellNameType; +import org.apache.cassandra.db.composites.CellNames; +import org.apache.cassandra.db.composites.Composite; +import org.apache.cassandra.db.filter.QueryFilter; +import org.apache.cassandra.db.index.SecondaryIndexManager; +import org.apache.cassandra.db.marshal.*; +import org.apache.cassandra.dht.Range; +import org.apache.cassandra.dht.Token; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.exceptions.InvalidRequestException; +import org.apache.cassandra.exceptions.SyntaxException; +import org.apache.cassandra.io.compress.CompressionParameters; +import org.apache.cassandra.locator.AbstractReplicationStrategy; +import org.apache.cassandra.service.StorageService; +import org.apache.cassandra.utils.ByteBufferUtil; +import org.apache.cassandra.utils.FBUtilities; + +import static org.apache.cassandra.cql3.QueryProcessor.executeOnceInternal; +import static org.apache.cassandra.utils.FBUtilities.fromJsonMap; +import static org.apache.cassandra.utils.FBUtilities.json; + +/** system.schema_* tables used to store keyspace/table/type attributes prior to C* 3.0 */ +public class LegacySchemaTables +{ + private static final Logger logger = LoggerFactory.getLogger(LegacySchemaTables.class); + + public static final String KEYSPACES = "schema_keyspaces"; + public static final String COLUMNFAMILIES = "schema_columnfamilies"; + public static final String COLUMNS = "schema_columns"; + public static final String TRIGGERS = "schema_triggers"; + public static final String USERTYPES = "schema_usertypes"; + public static final String FUNCTIONS = "schema_functions"; + public static final String AGGREGATES = "schema_aggregates"; + + public static final List ALL = Arrays.asList(KEYSPACES, COLUMNFAMILIES, COLUMNS, TRIGGERS, USERTYPES, FUNCTIONS, AGGREGATES); + + private static final CFMetaData Keyspaces = + compile(KEYSPACES, + "keyspace definitions", + "CREATE TABLE %s (" + + "keyspace_name text," + + "durable_writes boolean," + + "strategy_class text," + + "strategy_options text," + + "PRIMARY KEY ((keyspace_name))) " + + "WITH COMPACT STORAGE"); + + private static final CFMetaData Columnfamilies = + compile(COLUMNFAMILIES, + "table definitions", + "CREATE TABLE %s (" + + "keyspace_name text," + + "columnfamily_name text," + + "bloom_filter_fp_chance double," + + "caching text," + + "cf_id uuid," // post-2.1 UUID cfid + + "comment text," + + "compaction_strategy_class text," + + "compaction_strategy_options text," + + "comparator text," + + "compression_parameters text," + + "default_time_to_live int," + + "default_validator text," + + "dropped_columns map," + + "gc_grace_seconds int," + + "is_dense boolean," + + "key_validator text," + + "local_read_repair_chance double," + + "max_compaction_threshold int," + + "max_index_interval int," + + "memtable_flush_period_in_ms int," + + "min_compaction_threshold int," + + "min_index_interval int," + + "read_repair_chance double," + + "speculative_retry text," + + "subcomparator text," + + "type text," + + "PRIMARY KEY ((keyspace_name), columnfamily_name))"); + + private static final CFMetaData Columns = + compile(COLUMNS, + "column definitions", + "CREATE TABLE %s (" + + "keyspace_name text," + + "columnfamily_name text," + + "column_name text," + + "component_index int," + + "index_name text," + + "index_options text," + + "index_type text," + + "type text," + + "validator text," + + "PRIMARY KEY ((keyspace_name), columnfamily_name, column_name))"); + + private static final CFMetaData Triggers = + compile(TRIGGERS, + "trigger definitions", + "CREATE TABLE %s (" + + "keyspace_name text," + + "columnfamily_name text," + + "trigger_name text," + + "trigger_options map," + + "PRIMARY KEY ((keyspace_name), columnfamily_name, trigger_name))"); + + private static final CFMetaData Usertypes = + compile(USERTYPES, + "user defined type definitions", + "CREATE TABLE %s (" + + "keyspace_name text," + + "type_name text," + + "field_names list," + + "field_types list," + + "PRIMARY KEY ((keyspace_name), type_name))"); + + private static final CFMetaData Functions = + compile(FUNCTIONS, + "user defined function definitions", + "CREATE TABLE %s (" + + "keyspace_name text," + + "function_name text," + + "signature blob," + + "argument_names list," + + "argument_types list," + + "body text," + + "is_deterministic boolean," + + "language text," + + "return_type text," + + "PRIMARY KEY ((keyspace_name), function_name, signature))"); + + private static final CFMetaData Aggregates = + compile(AGGREGATES, + "user defined aggregate definitions", + "CREATE TABLE %s (" + + "keyspace_name text," + + "aggregate_name text," + + "signature blob," + + "argument_types list," + + "final_func text," + + "initcond blob," + + "return_type text," + + "state_func text," + + "state_type text," + + "PRIMARY KEY ((keyspace_name), aggregate_name, signature))"); + + public static final List All = Arrays.asList(Keyspaces, Columnfamilies, Columns, Triggers, Usertypes, Functions, Aggregates); + + private static CFMetaData compile(String name, String description, String schema) + { + return CFMetaData.compile(String.format(schema, name), SystemKeyspace.NAME) + .comment(description) + .gcGraceSeconds((int) TimeUnit.DAYS.toSeconds(7)); + } + + /** add entries to system.schema_* for the hardcoded system definitions */ + public static void saveSystemKeyspaceSchema() + { + KSMetaData keyspace = Schema.instance.getKSMetaData(SystemKeyspace.NAME); + // delete old, possibly obsolete entries in schema tables + for (String table : ALL) + executeOnceInternal(String.format("DELETE FROM system.%s WHERE keyspace_name = ?", table), keyspace.name); + // (+1 to timestamp to make sure we don't get shadowed by the tombstones we just added) + makeCreateKeyspaceMutation(keyspace, FBUtilities.timestampMicros() + 1).apply(); + } + + public static Collection readSchemaFromSystemTables() + { + List serializedSchema = getSchemaPartitionsForTable(KEYSPACES); + + List keyspaces = new ArrayList<>(serializedSchema.size()); + + for (Row partition : serializedSchema) + { + if (isEmptySchemaPartition(partition) || isSystemKeyspaceSchemaPartition(partition)) + continue; + + keyspaces.add(createKeyspaceFromSchemaPartitions(partition, + readSchemaPartitionForKeyspace(COLUMNFAMILIES, partition.key), + readSchemaPartitionForKeyspace(USERTYPES, partition.key))); + + // Will be moved away in #6717 + for (UDFunction function : createFunctionsFromFunctionsPartition(readSchemaPartitionForKeyspace(FUNCTIONS, partition.key)).values()) + org.apache.cassandra.cql3.functions.Functions.addFunction(function); + + // Will be moved away in #6717 + for (UDAggregate aggregate : createAggregatesFromAggregatesPartition(readSchemaPartitionForKeyspace(AGGREGATES, partition.key)).values()) + org.apache.cassandra.cql3.functions.Functions.addFunction(aggregate); + } + + return keyspaces; + } + + public static void truncateSchemaTables() + { + for (String table : ALL) + getSchemaCFS(table).truncateBlocking(); + } + + private static void flushSchemaTables() + { + for (String table : ALL) + SystemKeyspace.forceBlockingFlush(table); + } + + /** + * Read schema from system keyspace and calculate MD5 digest of every row, resulting digest + * will be converted into UUID which would act as content-based version of the schema. + */ + public static UUID calculateSchemaDigest() + { + MessageDigest digest; + try + { + digest = MessageDigest.getInstance("MD5"); + } + catch (NoSuchAlgorithmException e) + { + throw new RuntimeException(e); + } + + for (String table : ALL) + { + for (Row partition : getSchemaPartitionsForTable(table)) + { + if (isEmptySchemaPartition(partition) || isSystemKeyspaceSchemaPartition(partition)) + continue; + + // we want to digest only live columns + ColumnFamilyStore.removeDeletedColumnsOnly(partition.cf, Integer.MAX_VALUE, SecondaryIndexManager.nullUpdater); + partition.cf.purgeTombstones(Integer.MAX_VALUE); + partition.cf.updateDigest(digest); + } + } + + return UUID.nameUUIDFromBytes(digest.digest()); + } + + /** + * @param schemaTableName The name of the table responsible for part of the schema + * @return CFS responsible to hold low-level serialized schema + */ + private static ColumnFamilyStore getSchemaCFS(String schemaTableName) + { + return Keyspace.open(SystemKeyspace.NAME).getColumnFamilyStore(schemaTableName); + } + + /** + * @param schemaTableName The name of the table responsible for part of the schema. + * @return low-level schema representation + */ + private static List getSchemaPartitionsForTable(String schemaTableName) + { + Token minToken = StorageService.getPartitioner().getMinimumToken(); + return getSchemaCFS(schemaTableName).getRangeSlice(new Range(minToken.minKeyBound(), minToken.maxKeyBound()), + null, + new IdentityQueryFilter(), + Integer.MAX_VALUE, + System.currentTimeMillis()); + } + + public static Collection convertSchemaToMutations() + { + Map mutationMap = new HashMap<>(); + + for (String table : ALL) + convertSchemaToMutations(mutationMap, table); + + return mutationMap.values(); + } + + private static void convertSchemaToMutations(Map mutationMap, String schemaTableName) + { + for (Row partition : getSchemaPartitionsForTable(schemaTableName)) + { + if (isSystemKeyspaceSchemaPartition(partition)) + continue; + + Mutation mutation = mutationMap.get(partition.key); + if (mutation == null) + { + mutation = new Mutation(SystemKeyspace.NAME, partition.key.getKey()); + mutationMap.put(partition.key, mutation); + } + + mutation.add(partition.cf); + } + } + + private static Map readSchemaForKeyspaces(String schemaTableName, Set keyspaceNames) + { + Map schema = new HashMap<>(); + + for (String keyspaceName : keyspaceNames) + { + Row schemaEntity = readSchemaPartitionForKeyspace(schemaTableName, keyspaceName); + if (schemaEntity.cf != null) + schema.put(schemaEntity.key, schemaEntity.cf); + } + + return schema; + } + + private static ByteBuffer getSchemaKSKey(String ksName) + { + return AsciiType.instance.fromString(ksName); + } + + private static Row readSchemaPartitionForKeyspace(String schemaTableName, String keyspaceName) + { + DecoratedKey keyspaceKey = StorageService.getPartitioner().decorateKey(getSchemaKSKey(keyspaceName)); + return readSchemaPartitionForKeyspace(schemaTableName, keyspaceKey); + } + + private static Row readSchemaPartitionForKeyspace(String schemaTableName, DecoratedKey keyspaceKey) + { + QueryFilter filter = QueryFilter.getIdentityFilter(keyspaceKey, schemaTableName, System.currentTimeMillis()); + return new Row(keyspaceKey, getSchemaCFS(schemaTableName).getColumnFamily(filter)); + } + + private static Row readSchemaPartitionForTable(String schemaTableName, String keyspaceName, String tableName) + { + DecoratedKey key = StorageService.getPartitioner().decorateKey(getSchemaKSKey(keyspaceName)); + ColumnFamilyStore store = getSchemaCFS(schemaTableName); + Composite prefix = store.getComparator().make(tableName); + ColumnFamily cells = store.getColumnFamily(key, prefix, prefix.end(), false, Integer.MAX_VALUE, System.currentTimeMillis()); + return new Row(key, cells); + } + + private static boolean isEmptySchemaPartition(Row partition) + { + return partition.cf == null || (partition.cf.isMarkedForDelete() && !partition.cf.hasColumns()); + } + + private static boolean isSystemKeyspaceSchemaPartition(Row partition) + { + return getSchemaKSKey(SystemKeyspace.NAME).equals(partition.key.getKey()); + } + + /** + * Merge remote schema in form of mutations with local and mutate ks/cf metadata objects + * (which also involves fs operations on add/drop ks/cf) + * + * @param mutations the schema changes to apply + * + * @throws ConfigurationException If one of metadata attributes has invalid value + * @throws IOException If data was corrupted during transportation or failed to apply fs operations + */ + public static synchronized void mergeSchema(Collection mutations) throws ConfigurationException, IOException + { + mergeSchema(mutations, true); + Schema.instance.updateVersionAndAnnounce(); + } + + public static synchronized void mergeSchema(Collection mutations, boolean doFlush) throws IOException + { + // compare before/after schemas of the affected keyspaces only + Set keyspaces = new HashSet<>(mutations.size()); + for (Mutation mutation : mutations) + keyspaces.add(ByteBufferUtil.string(mutation.key())); + + // current state of the schema + Map oldKeyspaces = readSchemaForKeyspaces(KEYSPACES, keyspaces); + Map oldColumnFamilies = readSchemaForKeyspaces(COLUMNFAMILIES, keyspaces); + Map oldTypes = readSchemaForKeyspaces(USERTYPES, keyspaces); + Map oldFunctions = readSchemaForKeyspaces(FUNCTIONS, keyspaces); + Map oldAggregates = readSchemaForKeyspaces(AGGREGATES, keyspaces); + + for (Mutation mutation : mutations) + mutation.apply(); + + if (doFlush) + flushSchemaTables(); + + // with new data applied + Map newKeyspaces = readSchemaForKeyspaces(KEYSPACES, keyspaces); + Map newColumnFamilies = readSchemaForKeyspaces(COLUMNFAMILIES, keyspaces); + Map newTypes = readSchemaForKeyspaces(USERTYPES, keyspaces); + Map newFunctions = readSchemaForKeyspaces(FUNCTIONS, keyspaces); + Map newAggregates = readSchemaForKeyspaces(AGGREGATES, keyspaces); + + Set keyspacesToDrop = mergeKeyspaces(oldKeyspaces, newKeyspaces); + mergeTables(oldColumnFamilies, newColumnFamilies); + mergeTypes(oldTypes, newTypes); + mergeFunctions(oldFunctions, newFunctions); + mergeAggregates(oldAggregates, newAggregates); + + // it is safe to drop a keyspace only when all nested ColumnFamilies where deleted + for (String keyspaceToDrop : keyspacesToDrop) + Schema.instance.dropKeyspace(keyspaceToDrop); + } + + private static Set mergeKeyspaces(Map before, Map after) + { + List created = new ArrayList<>(); + List altered = new ArrayList<>(); + Set dropped = new HashSet<>(); + + /* + * - we don't care about entriesOnlyOnLeft() or entriesInCommon(), because only the changes are of interest to us + * - of all entriesOnlyOnRight(), we only care about ones that have live columns; it's possible to have a ColumnFamily + * there that only has the top-level deletion, if: + * a) a pushed DROP KEYSPACE change for a keyspace hadn't ever made it to this node in the first place + * b) a pulled dropped keyspace that got dropped before it could find a way to this node + * - of entriesDiffering(), we don't care about the scenario where both pre and post-values have zero live columns: + * that means that a keyspace had been recreated and dropped, and the recreated keyspace had never found a way + * to this node + */ + MapDifference diff = Maps.difference(before, after); + + for (Map.Entry entry : diff.entriesOnlyOnRight().entrySet()) + if (entry.getValue().hasColumns()) + created.add(new Row(entry.getKey(), entry.getValue())); + + for (Map.Entry> entry : diff.entriesDiffering().entrySet()) + { + String keyspaceName = AsciiType.instance.compose(entry.getKey().getKey()); + + ColumnFamily pre = entry.getValue().leftValue(); + ColumnFamily post = entry.getValue().rightValue(); + + if (pre.hasColumns() && post.hasColumns()) + altered.add(keyspaceName); + else if (pre.hasColumns()) + dropped.add(keyspaceName); + else if (post.hasColumns()) // a (re)created keyspace + created.add(new Row(entry.getKey(), post)); + } + + for (Row row : created) + Schema.instance.addKeyspace(createKeyspaceFromSchemaPartition(row)); + for (String name : altered) + Schema.instance.updateKeyspace(name); + return dropped; + } + + // see the comments for mergeKeyspaces() + private static void mergeTables(Map before, Map after) + { + List created = new ArrayList<>(); + List altered = new ArrayList<>(); + List dropped = new ArrayList<>(); + + MapDifference diff = Maps.difference(before, after); + + for (Map.Entry entry : diff.entriesOnlyOnRight().entrySet()) + if (entry.getValue().hasColumns()) + created.addAll(createTablesFromTablesPartition(new Row(entry.getKey(), entry.getValue())).values()); + + for (Map.Entry> entry : diff.entriesDiffering().entrySet()) + { + String keyspaceName = AsciiType.instance.compose(entry.getKey().getKey()); + + ColumnFamily pre = entry.getValue().leftValue(); + ColumnFamily post = entry.getValue().rightValue(); + + if (pre.hasColumns() && post.hasColumns()) + { + MapDifference delta = + Maps.difference(Schema.instance.getKSMetaData(keyspaceName).cfMetaData(), + createTablesFromTablesPartition(new Row(entry.getKey(), post))); + + dropped.addAll(delta.entriesOnlyOnLeft().values()); + created.addAll(delta.entriesOnlyOnRight().values()); + Iterables.addAll(altered, Iterables.transform(delta.entriesDiffering().values(), new Function, CFMetaData>() + { + public CFMetaData apply(MapDifference.ValueDifference pair) + { + return pair.rightValue(); + } + })); + } + else if (pre.hasColumns()) + { + dropped.addAll(Schema.instance.getKSMetaData(keyspaceName).cfMetaData().values()); + } + else if (post.hasColumns()) + { + created.addAll(createTablesFromTablesPartition(new Row(entry.getKey(), post)).values()); + } + } + + for (CFMetaData cfm : created) + Schema.instance.addTable(cfm); + for (CFMetaData cfm : altered) + Schema.instance.updateTable(cfm.ksName, cfm.cfName); + for (CFMetaData cfm : dropped) + Schema.instance.dropTable(cfm.ksName, cfm.cfName); + } + + // see the comments for mergeKeyspaces() + private static void mergeTypes(Map before, Map after) + { + List created = new ArrayList<>(); + List altered = new ArrayList<>(); + List dropped = new ArrayList<>(); + + MapDifference diff = Maps.difference(before, after); + + // New keyspace with types + for (Map.Entry entry : diff.entriesOnlyOnRight().entrySet()) + if (entry.getValue().hasColumns()) + created.addAll(createTypesFromPartition(new Row(entry.getKey(), entry.getValue())).values()); + + for (Map.Entry> entry : diff.entriesDiffering().entrySet()) + { + String keyspaceName = AsciiType.instance.compose(entry.getKey().getKey()); + + ColumnFamily pre = entry.getValue().leftValue(); + ColumnFamily post = entry.getValue().rightValue(); + + if (pre.hasColumns() && post.hasColumns()) + { + MapDifference delta = + Maps.difference(Schema.instance.getKSMetaData(keyspaceName).userTypes.getAllTypes(), + createTypesFromPartition(new Row(entry.getKey(), post))); + + dropped.addAll(delta.entriesOnlyOnLeft().values()); + created.addAll(delta.entriesOnlyOnRight().values()); + Iterables.addAll(altered, Iterables.transform(delta.entriesDiffering().values(), new Function, UserType>() + { + public UserType apply(MapDifference.ValueDifference pair) + { + return pair.rightValue(); + } + })); + } + else if (pre.hasColumns()) + { + dropped.addAll(Schema.instance.getKSMetaData(keyspaceName).userTypes.getAllTypes().values()); + } + else if (post.hasColumns()) + { + created.addAll(createTypesFromPartition(new Row(entry.getKey(), post)).values()); + } + } + + for (UserType type : created) + Schema.instance.addType(type); + for (UserType type : altered) + Schema.instance.updateType(type); + for (UserType type : dropped) + Schema.instance.dropType(type); + } + + // see the comments for mergeKeyspaces() + private static void mergeFunctions(Map before, Map after) + { + List created = new ArrayList<>(); + List altered = new ArrayList<>(); + List dropped = new ArrayList<>(); + + MapDifference diff = Maps.difference(before, after); + + // New keyspace with functions + for (Map.Entry entry : diff.entriesOnlyOnRight().entrySet()) + if (entry.getValue().hasColumns()) + created.addAll(createFunctionsFromFunctionsPartition(new Row(entry.getKey(), entry.getValue())).values()); + + for (Map.Entry> entry : diff.entriesDiffering().entrySet()) + { + ColumnFamily pre = entry.getValue().leftValue(); + ColumnFamily post = entry.getValue().rightValue(); + + if (pre.hasColumns() && post.hasColumns()) + { + MapDifference delta = + Maps.difference(createFunctionsFromFunctionsPartition(new Row(entry.getKey(), pre)), + createFunctionsFromFunctionsPartition(new Row(entry.getKey(), post))); + + dropped.addAll(delta.entriesOnlyOnLeft().values()); + created.addAll(delta.entriesOnlyOnRight().values()); + Iterables.addAll(altered, Iterables.transform(delta.entriesDiffering().values(), new Function, UDFunction>() + { + public UDFunction apply(MapDifference.ValueDifference pair) + { + return pair.rightValue(); + } + })); + } + else if (pre.hasColumns()) + { + dropped.addAll(createFunctionsFromFunctionsPartition(new Row(entry.getKey(), pre)).values()); + } + else if (post.hasColumns()) + { + created.addAll(createFunctionsFromFunctionsPartition(new Row(entry.getKey(), post)).values()); + } + } + + for (UDFunction udf : created) + Schema.instance.addFunction(udf); + for (UDFunction udf : altered) + Schema.instance.updateFunction(udf); + for (UDFunction udf : dropped) + Schema.instance.dropFunction(udf); + } + + // see the comments for mergeKeyspaces() + private static void mergeAggregates(Map before, Map after) + { + List created = new ArrayList<>(); + List altered = new ArrayList<>(); + List dropped = new ArrayList<>(); + + MapDifference diff = Maps.difference(before, after); + + // New keyspace with functions + for (Map.Entry entry : diff.entriesOnlyOnRight().entrySet()) + if (entry.getValue().hasColumns()) + created.addAll(createAggregatesFromAggregatesPartition(new Row(entry.getKey(), entry.getValue())).values()); + + for (Map.Entry> entry : diff.entriesDiffering().entrySet()) + { + ColumnFamily pre = entry.getValue().leftValue(); + ColumnFamily post = entry.getValue().rightValue(); + + if (pre.hasColumns() && post.hasColumns()) + { + MapDifference delta = + Maps.difference(createAggregatesFromAggregatesPartition(new Row(entry.getKey(), pre)), + createAggregatesFromAggregatesPartition(new Row(entry.getKey(), post))); + + dropped.addAll(delta.entriesOnlyOnLeft().values()); + created.addAll(delta.entriesOnlyOnRight().values()); + Iterables.addAll(altered, Iterables.transform(delta.entriesDiffering().values(), new Function, UDAggregate>() + { + public UDAggregate apply(MapDifference.ValueDifference pair) + { + return pair.rightValue(); + } + })); + } + else if (pre.hasColumns()) + { + dropped.addAll(createAggregatesFromAggregatesPartition(new Row(entry.getKey(), pre)).values()); + } + else if (post.hasColumns()) + { + created.addAll(createAggregatesFromAggregatesPartition(new Row(entry.getKey(), post)).values()); + } + } + + for (UDAggregate udf : created) + Schema.instance.addAggregate(udf); + for (UDAggregate udf : altered) + Schema.instance.updateAggregate(udf); + for (UDAggregate udf : dropped) + Schema.instance.dropAggregate(udf); + } + + /* + * Keyspace metadata serialization/deserialization. + */ + + public static Mutation makeCreateKeyspaceMutation(KSMetaData keyspace, long timestamp) + { + return makeCreateKeyspaceMutation(keyspace, timestamp, true); + } + + private static Mutation makeCreateKeyspaceMutation(KSMetaData keyspace, long timestamp, boolean withTablesAndTypesAndFunctions) + { + Mutation mutation = new Mutation(SystemKeyspace.NAME, getSchemaKSKey(keyspace.name)); + ColumnFamily cells = mutation.addOrGet(Keyspaces); + CFRowAdder adder = new CFRowAdder(cells, Keyspaces.comparator.builder().build(), timestamp); + + adder.add("durable_writes", keyspace.durableWrites); + adder.add("strategy_class", keyspace.strategyClass.getName()); + adder.add("strategy_options", json(keyspace.strategyOptions)); + + if (withTablesAndTypesAndFunctions) + { + for (UserType type : keyspace.userTypes.getAllTypes().values()) + addTypeToSchemaMutation(type, timestamp, mutation); + + for (CFMetaData table : keyspace.cfMetaData().values()) + addTableToSchemaMutation(table, timestamp, true, mutation); + } + + return mutation; + } + + public static Mutation makeDropKeyspaceMutation(KSMetaData keyspace, long timestamp) + { + Mutation mutation = new Mutation(SystemKeyspace.NAME, getSchemaKSKey(keyspace.name)); + for (String schemaTable : ALL) + mutation.delete(schemaTable, timestamp); + mutation.delete(SystemKeyspace.BUILT_INDEXES, timestamp); + return mutation; + } + + private static KSMetaData createKeyspaceFromSchemaPartitions(Row serializedKeyspace, Row serializedTables, Row serializedTypes) + { + Collection tables = createTablesFromTablesPartition(serializedTables).values(); + UTMetaData types = new UTMetaData(createTypesFromPartition(serializedTypes)); + return createKeyspaceFromSchemaPartition(serializedKeyspace).cloneWith(tables, types); + } + + public static KSMetaData createKeyspaceFromName(String keyspace) + { + Row partition = readSchemaPartitionForKeyspace(KEYSPACES, keyspace); + + if (isEmptySchemaPartition(partition)) + throw new RuntimeException(String.format("%s not found in the schema definitions keyspaceName (%s).", keyspace, KEYSPACES)); + + return createKeyspaceFromSchemaPartition(partition); + } + + /** + * Deserialize only Keyspace attributes without nested tables or types + * + * @param partition Keyspace attributes in serialized form + */ + private static KSMetaData createKeyspaceFromSchemaPartition(Row partition) + { + String query = String.format("SELECT * FROM %s.%s", SystemKeyspace.NAME, KEYSPACES); + UntypedResultSet.Row row = QueryProcessor.resultify(query, partition).one(); + try + { + return new KSMetaData(row.getString("keyspace_name"), + AbstractReplicationStrategy.getClass(row.getString("strategy_class")), + fromJsonMap(row.getString("strategy_options")), + row.getBoolean("durable_writes")); + } + catch (ConfigurationException e) + { + throw new RuntimeException(e); + } + } + + /* + * User type metadata serialization/deserialization. + */ + + public static Mutation makeCreateTypeMutation(KSMetaData keyspace, UserType type, long timestamp) + { + // Include the serialized keyspace in case the target node missed a CREATE KEYSPACE migration (see CASSANDRA-5631). + Mutation mutation = makeCreateKeyspaceMutation(keyspace, timestamp, false); + addTypeToSchemaMutation(type, timestamp, mutation); + return mutation; + } + + private static void addTypeToSchemaMutation(UserType type, long timestamp, Mutation mutation) + { + ColumnFamily cells = mutation.addOrGet(Usertypes); + + Composite prefix = Usertypes.comparator.make(type.name); + CFRowAdder adder = new CFRowAdder(cells, prefix, timestamp); + + adder.resetCollection("field_names"); + adder.resetCollection("field_types"); + + for (int i = 0; i < type.size(); i++) + { + adder.addListEntry("field_names", type.fieldName(i)); + adder.addListEntry("field_types", type.fieldType(i).toString()); + } + } + + public static Mutation dropTypeFromSchemaMutation(KSMetaData keyspace, UserType type, long timestamp) + { + // Include the serialized keyspace in case the target node missed a CREATE KEYSPACE migration (see CASSANDRA-5631). + Mutation mutation = makeCreateKeyspaceMutation(keyspace, timestamp, false); + + ColumnFamily cells = mutation.addOrGet(Usertypes); + int ldt = (int) (System.currentTimeMillis() / 1000); + + Composite prefix = Usertypes.comparator.make(type.name); + cells.addAtom(new RangeTombstone(prefix, prefix.end(), timestamp, ldt)); + + return mutation; + } + + private static Map createTypesFromPartition(Row partition) + { + String query = String.format("SELECT * FROM %s.%s", SystemKeyspace.NAME, USERTYPES); + Map types = new HashMap<>(); + for (UntypedResultSet.Row row : QueryProcessor.resultify(query, partition)) + { + UserType type = createTypeFromRow(row); + types.put(type.name, type); + } + return types; + } + + private static UserType createTypeFromRow(UntypedResultSet.Row row) + { + String keyspace = row.getString("keyspace_name"); + ByteBuffer name = ByteBufferUtil.bytes(row.getString("type_name")); + List rawColumns = row.getList("field_names", UTF8Type.instance); + List rawTypes = row.getList("field_types", UTF8Type.instance); + + List columns = new ArrayList<>(rawColumns.size()); + for (String rawColumn : rawColumns) + columns.add(ByteBufferUtil.bytes(rawColumn)); + + List> types = new ArrayList<>(rawTypes.size()); + for (String rawType : rawTypes) + types.add(parseType(rawType)); + + return new UserType(keyspace, name, columns, types); + } + + /* + * Table metadata serialization/deserialization. + */ + + public static Mutation makeCreateTableMutation(KSMetaData keyspace, CFMetaData table, long timestamp) + { + // Include the serialized keyspace in case the target node missed a CREATE KEYSPACE migration (see CASSANDRA-5631). + Mutation mutation = makeCreateKeyspaceMutation(keyspace, timestamp, false); + addTableToSchemaMutation(table, timestamp, true, mutation); + return mutation; + } + + private static void addTableToSchemaMutation(CFMetaData table, long timestamp, boolean withColumnsAndTriggers, Mutation mutation) + { + // For property that can be null (and can be changed), we insert tombstones, to make sure + // we don't keep a property the user has removed + ColumnFamily cells = mutation.addOrGet(Columnfamilies); + Composite prefix = Columnfamilies.comparator.make(table.cfName); + CFRowAdder adder = new CFRowAdder(cells, prefix, timestamp); + + adder.add("cf_id", table.cfId); + adder.add("type", table.cfType.toString()); + + if (table.isSuper()) + { + // We need to continue saving the comparator and subcomparator separatly, otherwise + // we won't know at deserialization if the subcomparator should be taken into account + // TODO: we should implement an on-start migration if we want to get rid of that. + adder.add("comparator", table.comparator.subtype(0).toString()); + adder.add("subcomparator", table.comparator.subtype(1).toString()); + } + else + { + adder.add("comparator", table.comparator.toString()); + } + + adder.add("bloom_filter_fp_chance", table.getBloomFilterFpChance()); + adder.add("caching", table.getCaching().toString()); + adder.add("comment", table.getComment()); + adder.add("compaction_strategy_class", table.compactionStrategyClass.getName()); + adder.add("compaction_strategy_options", json(table.compactionStrategyOptions)); + adder.add("compression_parameters", json(table.compressionParameters.asThriftOptions())); + adder.add("default_time_to_live", table.getDefaultTimeToLive()); + adder.add("default_validator", table.getDefaultValidator().toString()); + adder.add("gc_grace_seconds", table.getGcGraceSeconds()); + adder.add("key_validator", table.getKeyValidator().toString()); + adder.add("local_read_repair_chance", table.getDcLocalReadRepairChance()); + adder.add("max_compaction_threshold", table.getMaxCompactionThreshold()); + adder.add("max_index_interval", table.getMaxIndexInterval()); + adder.add("memtable_flush_period_in_ms", table.getMemtableFlushPeriod()); + adder.add("min_compaction_threshold", table.getMinCompactionThreshold()); + adder.add("min_index_interval", table.getMinIndexInterval()); + adder.add("read_repair_chance", table.getReadRepairChance()); + adder.add("speculative_retry", table.getSpeculativeRetry().toString()); + + for (Map.Entry entry : table.getDroppedColumns().entrySet()) + adder.addMapEntry("dropped_columns", entry.getKey().toString(), entry.getValue()); + + adder.add("is_dense", table.getIsDense()); + + if (withColumnsAndTriggers) + { + for (ColumnDefinition column : table.allColumns()) + addColumnToSchemaMutation(table, column, timestamp, mutation); + + for (TriggerDefinition trigger : table.getTriggers().values()) + addTriggerToSchemaMutation(table, trigger, timestamp, mutation); + } + } + + public static Mutation makeUpdateTableMutation(KSMetaData keyspace, + CFMetaData oldTable, + CFMetaData newTable, + long timestamp, + boolean fromThrift) + { + Mutation mutation = makeCreateKeyspaceMutation(keyspace, timestamp, false); + + addTableToSchemaMutation(newTable, timestamp, false, mutation); + + MapDifference columnDiff = Maps.difference(oldTable.getColumnMetadata(), + newTable.getColumnMetadata()); + + // columns that are no longer needed + for (ColumnDefinition column : columnDiff.entriesOnlyOnLeft().values()) + { + // Thrift only knows about the REGULAR ColumnDefinition type, so don't consider other type + // are being deleted just because they are not here. + if (fromThrift && column.kind != ColumnDefinition.Kind.REGULAR) + continue; + + dropColumnFromSchemaMutation(oldTable, column, timestamp, mutation); + } + + // newly added columns + for (ColumnDefinition column : columnDiff.entriesOnlyOnRight().values()) + addColumnToSchemaMutation(newTable, column, timestamp, mutation); + + // old columns with updated attributes + for (ByteBuffer name : columnDiff.entriesDiffering().keySet()) + addColumnToSchemaMutation(newTable, newTable.getColumnDefinition(name), timestamp, mutation); + + MapDifference triggerDiff = Maps.difference(oldTable.getTriggers(), newTable.getTriggers()); + + // dropped triggers + for (TriggerDefinition trigger : triggerDiff.entriesOnlyOnLeft().values()) + dropTriggerFromSchemaMutation(oldTable, trigger, timestamp, mutation); + + // newly created triggers + for (TriggerDefinition trigger : triggerDiff.entriesOnlyOnRight().values()) + addTriggerToSchemaMutation(newTable, trigger, timestamp, mutation); + + return mutation; + } + + public static Mutation makeDropTableMutation(KSMetaData keyspace, CFMetaData table, long timestamp) + { + // Include the serialized keyspace in case the target node missed a CREATE KEYSPACE migration (see CASSANDRA-5631). + Mutation mutation = makeCreateKeyspaceMutation(keyspace, timestamp, false); + + ColumnFamily cells = mutation.addOrGet(Columnfamilies); + int ldt = (int) (System.currentTimeMillis() / 1000); + + Composite prefix = Columnfamilies.comparator.make(table.cfName); + cells.addAtom(new RangeTombstone(prefix, prefix.end(), timestamp, ldt)); + + for (ColumnDefinition column : table.allColumns()) + dropColumnFromSchemaMutation(table, column, timestamp, mutation); + + for (TriggerDefinition trigger : table.getTriggers().values()) + dropTriggerFromSchemaMutation(table, trigger, timestamp, mutation); + + // TODO: get rid of in #6717 + ColumnFamily indexCells = mutation.addOrGet(SystemKeyspace.BuiltIndexes); + for (String indexName : Keyspace.open(keyspace.name).getColumnFamilyStore(table.cfName).getBuiltIndexes()) + indexCells.addTombstone(indexCells.getComparator().makeCellName(indexName), ldt, timestamp); + + return mutation; + } + + public static CFMetaData createTableFromName(String keyspace, String table) + { + Row partition = readSchemaPartitionForTable(COLUMNFAMILIES, keyspace, table); + + if (isEmptySchemaPartition(partition)) + throw new RuntimeException(String.format("%s:%s not found in the schema definitions keyspace.", keyspace, table)); + + return createTableFromTablePartition(partition); + } + + /** + * Deserialize tables from low-level schema representation, all of them belong to the same keyspace + * + * @return map containing name of the table and its metadata for faster lookup + */ + private static Map createTablesFromTablesPartition(Row partition) + { + if (partition.cf == null) + return Collections.emptyMap(); + + String query = String.format("SELECT * FROM %s.%s", SystemKeyspace.NAME, COLUMNFAMILIES); + Map tables = new HashMap<>(); + for (UntypedResultSet.Row row : QueryProcessor.resultify(query, partition)) + { + CFMetaData cfm = createTableFromTableRow(row); + tables.put(cfm.cfName, cfm); + } + return tables; + } + + public static CFMetaData createTableFromTablePartitionAndColumnsPartition(Row serializedTable, Row serializedColumns) + { + String query = String.format("SELECT * FROM %s.%s", SystemKeyspace.NAME, COLUMNFAMILIES); + return createTableFromTableRowAndColumnsPartition(QueryProcessor.resultify(query, serializedTable).one(), serializedColumns); + } + + private static CFMetaData createTableFromTableRowAndColumnsPartition(UntypedResultSet.Row tableRow, Row serializedColumns) + { + String query = String.format("SELECT * FROM %s.%s", SystemKeyspace.NAME, COLUMNS); + return createTableFromTableRowAndColumnRows(tableRow, QueryProcessor.resultify(query, serializedColumns)); + } + + private static CFMetaData createTableFromTablePartition(Row row) + { + String query = String.format("SELECT * FROM %s.%s", SystemKeyspace.NAME, COLUMNFAMILIES); + return createTableFromTableRow(QueryProcessor.resultify(query, row).one()); + } + + /** + * Deserialize table metadata from low-level representation + * + * @return Metadata deserialized from schema + */ + private static CFMetaData createTableFromTableRow(UntypedResultSet.Row result) + { + String ksName = result.getString("keyspace_name"); + String cfName = result.getString("columnfamily_name"); + + Row serializedColumns = readSchemaPartitionForTable(COLUMNS, ksName, cfName); + CFMetaData cfm = createTableFromTableRowAndColumnsPartition(result, serializedColumns); + + Row serializedTriggers = readSchemaPartitionForTable(TRIGGERS, ksName, cfName); + try + { + for (TriggerDefinition trigger : createTriggersFromTriggersPartition(serializedTriggers)) + cfm.addTriggerDefinition(trigger); + } + catch (InvalidRequestException e) + { + throw new RuntimeException(e); + } + + return cfm; + } + + public static CFMetaData createTableFromTableRowAndColumnRows(UntypedResultSet.Row result, + UntypedResultSet serializedColumnDefinitions) + { + try + { + String ksName = result.getString("keyspace_name"); + String cfName = result.getString("columnfamily_name"); + + AbstractType rawComparator = TypeParser.parse(result.getString("comparator")); + AbstractType subComparator = result.has("subcomparator") ? TypeParser.parse(result.getString("subcomparator")) : null; + ColumnFamilyType cfType = ColumnFamilyType.valueOf(result.getString("type")); + + AbstractType fullRawComparator = CFMetaData.makeRawAbstractType(rawComparator, subComparator); + + List columnDefs = createColumnsFromColumnRows(serializedColumnDefinitions, + ksName, + cfName, + fullRawComparator, + cfType == ColumnFamilyType.Super); + + boolean isDense = result.has("is_dense") + ? result.getBoolean("is_dense") + : CFMetaData.calculateIsDense(fullRawComparator, columnDefs); + + CellNameType comparator = CellNames.fromAbstractType(fullRawComparator, isDense); + + // if we are upgrading, we use id generated from names initially + UUID cfId = result.has("cf_id") + ? result.getUUID("cf_id") + : CFMetaData.generateLegacyCfId(ksName, cfName); + + CFMetaData cfm = new CFMetaData(ksName, cfName, cfType, comparator, cfId); + cfm.isDense(isDense); + + cfm.readRepairChance(result.getDouble("read_repair_chance")); + cfm.dcLocalReadRepairChance(result.getDouble("local_read_repair_chance")); + cfm.gcGraceSeconds(result.getInt("gc_grace_seconds")); + cfm.defaultValidator(TypeParser.parse(result.getString("default_validator"))); + cfm.keyValidator(TypeParser.parse(result.getString("key_validator"))); + cfm.minCompactionThreshold(result.getInt("min_compaction_threshold")); + cfm.maxCompactionThreshold(result.getInt("max_compaction_threshold")); + if (result.has("comment")) + cfm.comment(result.getString("comment")); + if (result.has("memtable_flush_period_in_ms")) + cfm.memtableFlushPeriod(result.getInt("memtable_flush_period_in_ms")); + cfm.caching(CachingOptions.fromString(result.getString("caching"))); + if (result.has("default_time_to_live")) + cfm.defaultTimeToLive(result.getInt("default_time_to_live")); + if (result.has("speculative_retry")) + cfm.speculativeRetry(CFMetaData.SpeculativeRetry.fromString(result.getString("speculative_retry"))); + cfm.compactionStrategyClass(CFMetaData.createCompactionStrategy(result.getString("compaction_strategy_class"))); + cfm.compressionParameters(CompressionParameters.create(fromJsonMap(result.getString("compression_parameters")))); + cfm.compactionStrategyOptions(fromJsonMap(result.getString("compaction_strategy_options"))); + + if (result.has("min_index_interval")) + cfm.minIndexInterval(result.getInt("min_index_interval")); + + if (result.has("max_index_interval")) + cfm.maxIndexInterval(result.getInt("max_index_interval")); + + if (result.has("bloom_filter_fp_chance")) + cfm.bloomFilterFpChance(result.getDouble("bloom_filter_fp_chance")); + else + cfm.bloomFilterFpChance(cfm.getBloomFilterFpChance()); + + if (result.has("dropped_columns")) + cfm.droppedColumns(convertDroppedColumns(result.getMap("dropped_columns", UTF8Type.instance, LongType.instance))); + + for (ColumnDefinition cd : columnDefs) + cfm.addOrReplaceColumnDefinition(cd); + + return cfm.rebuild(); + } + catch (SyntaxException | ConfigurationException e) + { + throw new RuntimeException(e); + } + } + + private static Map convertDroppedColumns(Map raw) + { + Map converted = Maps.newHashMap(); + for (Map.Entry entry : raw.entrySet()) + converted.put(new ColumnIdentifier(entry.getKey(), true), entry.getValue()); + return converted; + } + + /* + * Column metadata serialization/deserialization. + */ + + private static void addColumnToSchemaMutation(CFMetaData table, ColumnDefinition column, long timestamp, Mutation mutation) + { + ColumnFamily cells = mutation.addOrGet(Columns); + Composite prefix = Columns.comparator.make(table.cfName, column.name.toString()); + CFRowAdder adder = new CFRowAdder(cells, prefix, timestamp); + + adder.add("validator", column.type.toString()); + adder.add("type", serializeKind(column.kind)); + adder.add("component_index", column.isOnAllComponents() ? null : column.position()); + adder.add("index_name", column.getIndexName()); + adder.add("index_type", column.getIndexType() == null ? null : column.getIndexType().toString()); + adder.add("index_options", json(column.getIndexOptions())); + } + + private static String serializeKind(ColumnDefinition.Kind kind) + { + // For backward compatibility we need to special case CLUSTERING_COLUMN + return kind == ColumnDefinition.Kind.CLUSTERING_COLUMN ? "clustering_key" : kind.toString().toLowerCase(); + } + + private static ColumnDefinition.Kind deserializeKind(String kind) + { + if (kind.equalsIgnoreCase("clustering_key")) + return ColumnDefinition.Kind.CLUSTERING_COLUMN; + return Enum.valueOf(ColumnDefinition.Kind.class, kind.toUpperCase()); + } + + private static void dropColumnFromSchemaMutation(CFMetaData table, ColumnDefinition column, long timestamp, Mutation mutation) + { + ColumnFamily cells = mutation.addOrGet(Columns); + int ldt = (int) (System.currentTimeMillis() / 1000); + + // Note: we do want to use name.toString(), not name.bytes directly for backward compatibility (For CQL3, this won't make a difference). + Composite prefix = Columns.comparator.make(table.cfName, column.name.toString()); + cells.addAtom(new RangeTombstone(prefix, prefix.end(), timestamp, ldt)); + } + + private static List createColumnsFromColumnRows(UntypedResultSet rows, + String keyspace, + String table, + AbstractType rawComparator, + boolean isSuper) + { + List columns = new ArrayList<>(); + for (UntypedResultSet.Row row : rows) + columns.add(createColumnFromColumnRow(row, keyspace, table, rawComparator, isSuper)); + return columns; + } + + private static ColumnDefinition createColumnFromColumnRow(UntypedResultSet.Row row, + String keyspace, + String table, + AbstractType rawComparator, + boolean isSuper) + { + ColumnDefinition.Kind kind = deserializeKind(row.getString("type")); + + Integer componentIndex = null; + if (row.has("component_index")) + componentIndex = row.getInt("component_index"); + else if (kind == ColumnDefinition.Kind.CLUSTERING_COLUMN && isSuper) + componentIndex = 1; // A ColumnDefinition for super columns applies to the column component + + // Note: we save the column name as string, but we should not assume that it is an UTF8 name, we + // we need to use the comparator fromString method + AbstractType comparator = kind == ColumnDefinition.Kind.REGULAR + ? getComponentComparator(rawComparator, componentIndex) + : UTF8Type.instance; + ColumnIdentifier name = new ColumnIdentifier(comparator.fromString(row.getString("column_name")), comparator); + + AbstractType validator = parseType(row.getString("validator")); + + IndexType indexType = null; + if (row.has("index_type")) + indexType = IndexType.valueOf(row.getString("index_type")); + + Map indexOptions = null; + if (row.has("index_options")) + indexOptions = fromJsonMap(row.getString("index_options")); + + String indexName = null; + if (row.has("index_name")) + indexName = row.getString("index_name"); + + return new ColumnDefinition(keyspace, table, name, validator, indexType, indexOptions, indexName, componentIndex, kind); + } + + private static AbstractType getComponentComparator(AbstractType rawComparator, Integer componentIndex) + { + return (componentIndex == null || (componentIndex == 0 && !(rawComparator instanceof CompositeType))) + ? rawComparator + : ((CompositeType)rawComparator).types.get(componentIndex); + } + + /* + * Trigger metadata serialization/deserialization. + */ + + private static void addTriggerToSchemaMutation(CFMetaData table, TriggerDefinition trigger, long timestamp, Mutation mutation) + { + ColumnFamily cells = mutation.addOrGet(Triggers); + Composite prefix = Triggers.comparator.make(table.cfName, trigger.name); + CFRowAdder adder = new CFRowAdder(cells, prefix, timestamp); + adder.addMapEntry("trigger_options", "class", trigger.classOption); + } + + private static void dropTriggerFromSchemaMutation(CFMetaData table, TriggerDefinition trigger, long timestamp, Mutation mutation) + { + ColumnFamily cells = mutation.addOrGet(Triggers); + int ldt = (int) (System.currentTimeMillis() / 1000); + + Composite prefix = Triggers.comparator.make(table.cfName, trigger.name); + cells.addAtom(new RangeTombstone(prefix, prefix.end(), timestamp, ldt)); + } + + /** + * Deserialize triggers from storage-level representation. + * + * @param partition storage-level partition containing the trigger definitions + * @return the list of processed TriggerDefinitions + */ + private static List createTriggersFromTriggersPartition(Row partition) + { + List triggers = new ArrayList<>(); + String query = String.format("SELECT * FROM %s.%s", SystemKeyspace.NAME, TRIGGERS); + for (UntypedResultSet.Row row : QueryProcessor.resultify(query, partition)) + { + String name = row.getString("trigger_name"); + String classOption = row.getMap("trigger_options", UTF8Type.instance, UTF8Type.instance).get("class"); + triggers.add(new TriggerDefinition(name, classOption)); + } + return triggers; + } + + /* + * UDF metadata serialization/deserialization. + */ + + public static Mutation makeCreateFunctionMutation(KSMetaData keyspace, UDFunction function, long timestamp) + { + // Include the serialized keyspace in case the target node missed a CREATE KEYSPACE migration (see CASSANDRA-5631). + Mutation mutation = makeCreateKeyspaceMutation(keyspace, timestamp, false); + addFunctionToSchemaMutation(function, timestamp, mutation); + return mutation; + } + + private static void addFunctionToSchemaMutation(UDFunction function, long timestamp, Mutation mutation) + { + ColumnFamily cells = mutation.addOrGet(Functions); + Composite prefix = Functions.comparator.make(function.name().name, UDHelper.calculateSignature(function)); + CFRowAdder adder = new CFRowAdder(cells, prefix, timestamp); + + adder.resetCollection("argument_names"); + adder.resetCollection("argument_types"); + + for (int i = 0; i < function.argNames().size(); i++) + { + adder.addListEntry("argument_names", function.argNames().get(i).bytes); + adder.addListEntry("argument_types", function.argTypes().get(i).toString()); + } + + adder.add("body", function.body()); + adder.add("is_deterministic", function.isDeterministic()); + adder.add("language", function.language()); + adder.add("return_type", function.returnType().toString()); + } + + public static Mutation makeDropFunctionMutation(KSMetaData keyspace, UDFunction function, long timestamp) + { + // Include the serialized keyspace in case the target node missed a CREATE KEYSPACE migration (see CASSANDRA-5631). + Mutation mutation = makeCreateKeyspaceMutation(keyspace, timestamp, false); + + ColumnFamily cells = mutation.addOrGet(Functions); + int ldt = (int) (System.currentTimeMillis() / 1000); + + Composite prefix = Functions.comparator.make(function.name().name, UDHelper.calculateSignature(function)); + cells.addAtom(new RangeTombstone(prefix, prefix.end(), timestamp, ldt)); + + return mutation; + } + + private static Map createFunctionsFromFunctionsPartition(Row partition) + { + Map functions = new HashMap<>(); + String query = String.format("SELECT * FROM %s.%s", SystemKeyspace.NAME, FUNCTIONS); + for (UntypedResultSet.Row row : QueryProcessor.resultify(query, partition)) + { + UDFunction function = createFunctionFromFunctionRow(row); + functions.put(UDHelper.calculateSignature(function), function); + } + return functions; + } + + private static UDFunction createFunctionFromFunctionRow(UntypedResultSet.Row row) + { + String ksName = row.getString("keyspace_name"); + String functionName = row.getString("function_name"); + FunctionName name = new FunctionName(ksName, functionName); + + List argNames = new ArrayList<>(); + if (row.has("argument_names")) + for (String arg : row.getList("argument_names", UTF8Type.instance)) + argNames.add(new ColumnIdentifier(arg, true)); + + List> argTypes = new ArrayList<>(); + if (row.has("argument_types")) + for (String type : row.getList("argument_types", UTF8Type.instance)) + argTypes.add(parseType(type)); + + AbstractType returnType = parseType(row.getString("return_type")); + + boolean isDeterministic = row.getBoolean("is_deterministic"); + String language = row.getString("language"); + String body = row.getString("body"); + + try + { + return UDFunction.create(name, argNames, argTypes, returnType, language, body, isDeterministic); + } + catch (InvalidRequestException e) + { + logger.error(String.format("Cannot load function '%s' from schema: this function won't be available (on this node)", name), e); + return UDFunction.createBrokenFunction(name, argNames, argTypes, returnType, language, body, e); + } + } + + /* + * Aggregate UDF metadata serialization/deserialization. + */ + + public static Mutation makeCreateAggregateMutation(KSMetaData keyspace, UDAggregate aggregate, long timestamp) + { + // Include the serialized keyspace in case the target node missed a CREATE KEYSPACE migration (see CASSANDRA-5631). + Mutation mutation = makeCreateKeyspaceMutation(keyspace, timestamp, false); + addAggregateToSchemaMutation(aggregate, timestamp, mutation); + return mutation; + } + + private static void addAggregateToSchemaMutation(UDAggregate aggregate, long timestamp, Mutation mutation) + { + ColumnFamily cells = mutation.addOrGet(Aggregates); + Composite prefix = Aggregates.comparator.make(aggregate.name().name, UDHelper.calculateSignature(aggregate)); + CFRowAdder adder = new CFRowAdder(cells, prefix, timestamp); + + adder.resetCollection("argument_types"); + adder.add("return_type", aggregate.returnType().toString()); + adder.add("state_func", aggregate.stateFunction().name().name); + if (aggregate.stateType() != null) + adder.add("state_type", aggregate.stateType().toString()); + if (aggregate.finalFunction() != null) + adder.add("final_func", aggregate.finalFunction().name().name); + if (aggregate.initialCondition() != null) + adder.add("initcond", aggregate.initialCondition()); + + for (AbstractType argType : aggregate.argTypes()) + adder.addListEntry("argument_types", argType.toString()); + } + + private static Map createAggregatesFromAggregatesPartition(Row partition) + { + Map aggregates = new HashMap<>(); + String query = String.format("SELECT * FROM %s.%s", SystemKeyspace.NAME, AGGREGATES); + for (UntypedResultSet.Row row : QueryProcessor.resultify(query, partition)) + { + UDAggregate aggregate = createAggregateFromAggregateRow(row); + aggregates.put(UDHelper.calculateSignature(aggregate), aggregate); + } + return aggregates; + } + + private static UDAggregate createAggregateFromAggregateRow(UntypedResultSet.Row row) + { + String ksName = row.getString("keyspace_name"); + String functionName = row.getString("aggregate_name"); + FunctionName name = new FunctionName(ksName, functionName); + + List types = row.getList("argument_types", UTF8Type.instance); + + List> argTypes; + if (types == null) + { + argTypes = Collections.emptyList(); + } + else + { + argTypes = new ArrayList<>(types.size()); + for (String type : types) + argTypes.add(parseType(type)); + } + + AbstractType returnType = parseType(row.getString("return_type")); + + FunctionName stateFunc = new FunctionName(ksName, row.getString("state_func")); + FunctionName finalFunc = row.has("final_func") ? new FunctionName(ksName, row.getString("final_func")) : null; + AbstractType stateType = row.has("state_type") ? parseType(row.getString("state_type")) : null; + ByteBuffer initcond = row.has("initcond") ? row.getBytes("initcond") : null; + + try + { + return UDAggregate.create(name, argTypes, returnType, stateFunc, finalFunc, stateType, initcond); + } + catch (InvalidRequestException reason) + { + return UDAggregate.createBroken(name, argTypes, returnType, initcond, reason); + } + } + + public static Mutation makeDropAggregateMutation(KSMetaData keyspace, UDAggregate aggregate, long timestamp) + { + // Include the serialized keyspace in case the target node missed a CREATE KEYSPACE migration (see CASSANDRA-5631). + Mutation mutation = makeCreateKeyspaceMutation(keyspace, timestamp, false); + + ColumnFamily cells = mutation.addOrGet(Aggregates); + int ldt = (int) (System.currentTimeMillis() / 1000); + + Composite prefix = Aggregates.comparator.make(aggregate.name().name, UDHelper.calculateSignature(aggregate)); + cells.addAtom(new RangeTombstone(prefix, prefix.end(), timestamp, ldt)); + + return mutation; + } + + private static AbstractType parseType(String str) + { + try + { + return TypeParser.parse(str); + } + catch (SyntaxException | ConfigurationException e) + { + // We only use this when reading the schema where we shouldn't get an error + throw new RuntimeException(e); + } + } +} diff --git a/src/java/org/apache/cassandra/service/CassandraDaemon.java b/src/java/org/apache/cassandra/service/CassandraDaemon.java index 99a2d8723602..edc91ab52761 100644 --- a/src/java/org/apache/cassandra/service/CassandraDaemon.java +++ b/src/java/org/apache/cassandra/service/CassandraDaemon.java @@ -34,7 +34,6 @@ import com.google.common.collect.Iterables; import com.google.common.util.concurrent.Uninterruptibles; -import org.hyperic.sigar.SigarException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,7 +45,6 @@ import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.config.Schema; -import org.apache.cassandra.cql3.functions.Functions; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.Directories; import org.apache.cassandra.db.Keyspace; @@ -253,10 +251,8 @@ public void uncaughtException(Thread t, Throwable e) exitOrFail(100, "Fatal exception during initialization", e); } - - // load keyspace && function descriptions. - DatabaseDescriptor.loadSchemas(); - Functions.loadUDFFromSchema(); + // load schema from disk + Schema.instance.loadFromDisk(); // clean up compaction leftovers Map, Map> unfinishedCompactions = SystemKeyspace.getUnfinishedCompactions(); diff --git a/src/java/org/apache/cassandra/service/ClientState.java b/src/java/org/apache/cassandra/service/ClientState.java index 9c8d7d86e435..dcdf8386a206 100644 --- a/src/java/org/apache/cassandra/service/ClientState.java +++ b/src/java/org/apache/cassandra/service/ClientState.java @@ -32,6 +32,7 @@ import org.apache.cassandra.config.Schema; import org.apache.cassandra.cql3.QueryHandler; import org.apache.cassandra.cql3.QueryProcessor; +import org.apache.cassandra.schema.LegacySchemaTables; import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.exceptions.AuthenticationException; import org.apache.cassandra.exceptions.InvalidRequestException; @@ -58,7 +59,7 @@ public class ClientState { // We want these system cfs to be always readable to authenticated users since many tools rely on them // (nodetool, cqlsh, bulkloader, etc.) - for (String cf : Iterables.concat(Arrays.asList(SystemKeyspace.LOCAL_TABLE, SystemKeyspace.PEERS_TABLE), SystemKeyspace.ALL_SCHEMA_TABLES)) + for (String cf : Iterables.concat(Arrays.asList(SystemKeyspace.LOCAL, SystemKeyspace.PEERS), LegacySchemaTables.ALL)) READABLE_SYSTEM_RESOURCES.add(DataResource.columnFamily(SystemKeyspace.NAME, cf)); PROTECTED_AUTH_RESOURCES.addAll(DatabaseDescriptor.getAuthenticator().protectedResources()); diff --git a/src/java/org/apache/cassandra/service/MigrationManager.java b/src/java/org/apache/cassandra/service/MigrationManager.java index c3fe1fafc5ef..fe325599a5d8 100644 --- a/src/java/org/apache/cassandra/service/MigrationManager.java +++ b/src/java/org/apache/cassandra/service/MigrationManager.java @@ -37,7 +37,6 @@ import org.apache.cassandra.concurrent.StageManager; import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.KSMetaData; -import org.apache.cassandra.config.UTMetaData; import org.apache.cassandra.config.Schema; import org.apache.cassandra.cql3.functions.UDAggregate; import org.apache.cassandra.cql3.functions.UDFunction; @@ -50,6 +49,7 @@ import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.net.MessageOut; import org.apache.cassandra.net.MessagingService; +import org.apache.cassandra.schema.LegacySchemaTables; import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.WrappedRunnable; @@ -63,7 +63,7 @@ public class MigrationManager public static final int MIGRATION_DELAY_IN_MS = 60000; - private final List listeners = new CopyOnWriteArrayList(); + private final List listeners = new CopyOnWriteArrayList<>(); private MigrationManager() {} @@ -182,52 +182,40 @@ public void notifyCreateFunction(UDFunction udf) listener.onCreateFunction(udf.name().keyspace, udf.name().name); } - public void notifyUpdateFunction(UDFunction udf) - { - for (IMigrationListener listener : listeners) - listener.onUpdateFunction(udf.name().keyspace, udf.name().name); - } - - public void notifyDropFunction(UDFunction udf) - { - for (IMigrationListener listener : listeners) - listener.onDropFunction(udf.name().keyspace, udf.name().name); - } - public void notifyCreateAggregate(UDAggregate udf) { for (IMigrationListener listener : listeners) listener.onCreateAggregate(udf.name().keyspace, udf.name().name); } - public void notifyUpdateAggregate(UDAggregate udf) + public void notifyUpdateKeyspace(KSMetaData ksm) { for (IMigrationListener listener : listeners) - listener.onUpdateAggregate(udf.name().keyspace, udf.name().name); + listener.onUpdateKeyspace(ksm.name); } - public void notifyDropAggregate(UDAggregate udf) + public void notifyUpdateColumnFamily(CFMetaData cfm) { for (IMigrationListener listener : listeners) - listener.onDropAggregate(udf.name().keyspace, udf.name().name); + listener.onUpdateColumnFamily(cfm.ksName, cfm.cfName); } - public void notifyUpdateKeyspace(KSMetaData ksm) + public void notifyUpdateUserType(UserType ut) { for (IMigrationListener listener : listeners) - listener.onUpdateKeyspace(ksm.name); + listener.onUpdateUserType(ut.keyspace, ut.getNameAsString()); } - public void notifyUpdateColumnFamily(CFMetaData cfm) + public void notifyUpdateFunction(UDFunction udf) { for (IMigrationListener listener : listeners) - listener.onUpdateColumnFamily(cfm.ksName, cfm.cfName); + listener.onUpdateFunction(udf.name().keyspace, udf.name().name); } - public void notifyUpdateUserType(UserType ut) + public void notifyUpdateAggregate(UDAggregate udf) { for (IMigrationListener listener : listeners) - listener.onUpdateUserType(ut.keyspace, ut.getNameAsString()); + listener.onUpdateAggregate(udf.name().keyspace, udf.name().name); } public void notifyDropKeyspace(KSMetaData ksm) @@ -248,6 +236,18 @@ public void notifyDropUserType(UserType ut) listener.onDropUserType(ut.keyspace, ut.getNameAsString()); } + public void notifyDropFunction(UDFunction udf) + { + for (IMigrationListener listener : listeners) + listener.onDropFunction(udf.name().keyspace, udf.name().name); + } + + public void notifyDropAggregate(UDAggregate udf) + { + for (IMigrationListener listener : listeners) + listener.onDropAggregate(udf.name().keyspace, udf.name().name); + } + public static void announceNewKeyspace(KSMetaData ksm) throws ConfigurationException { announceNewKeyspace(ksm, false); @@ -266,7 +266,7 @@ public static void announceNewKeyspace(KSMetaData ksm, long timestamp, boolean a throw new AlreadyExistsException(ksm.name); logger.info(String.format("Create new Keyspace: %s", ksm)); - announce(ksm.toSchema(timestamp), announceLocally); + announce(LegacySchemaTables.makeCreateKeyspaceMutation(ksm, timestamp), announceLocally); } public static void announceNewColumnFamily(CFMetaData cfm) throws ConfigurationException @@ -285,17 +285,27 @@ else if (ksm.cfMetaData().containsKey(cfm.cfName)) throw new AlreadyExistsException(cfm.ksName, cfm.cfName); logger.info(String.format("Create new table: %s", cfm)); - announce(addSerializedKeyspace(cfm.toSchema(FBUtilities.timestampMicros()), cfm.ksName), announceLocally); + announce(LegacySchemaTables.makeCreateTableMutation(ksm, cfm, FBUtilities.timestampMicros()), announceLocally); } - public static void announceNewType(UserType newType) + public static void announceNewType(UserType newType, boolean announceLocally) { - announceNewType(newType, false); + KSMetaData ksm = Schema.instance.getKSMetaData(newType.keyspace); + announce(LegacySchemaTables.makeCreateTypeMutation(ksm, newType, FBUtilities.timestampMicros()), announceLocally); } - public static void announceNewType(UserType newType, boolean announceLocally) + public static void announceNewFunction(UDFunction udf, boolean announceLocally) { - announce(addSerializedKeyspace(UTMetaData.toSchema(newType, FBUtilities.timestampMicros()), newType.keyspace), announceLocally); + logger.info(String.format("Create scalar function '%s'", udf.name())); + KSMetaData ksm = Schema.instance.getKSMetaData(udf.name().keyspace); + announce(LegacySchemaTables.makeCreateFunctionMutation(ksm, udf, FBUtilities.timestampMicros()), announceLocally); + } + + public static void announceNewAggregate(UDAggregate udf, boolean announceLocally) + { + logger.info(String.format("Create aggregate function '%s'", udf.name())); + KSMetaData ksm = Schema.instance.getKSMetaData(udf.name().keyspace); + announce(LegacySchemaTables.makeCreateAggregateMutation(ksm, udf, FBUtilities.timestampMicros()), announceLocally); } public static void announceKeyspaceUpdate(KSMetaData ksm) throws ConfigurationException @@ -312,7 +322,7 @@ public static void announceKeyspaceUpdate(KSMetaData ksm, boolean announceLocall throw new ConfigurationException(String.format("Cannot update non existing keyspace '%s'.", ksm.name)); logger.info(String.format("Update Keyspace '%s' From %s To %s", ksm.name, oldKsm, ksm)); - announce(oldKsm.toSchemaUpdate(ksm, FBUtilities.timestampMicros()), announceLocally); + announce(LegacySchemaTables.makeCreateKeyspaceMutation(ksm, FBUtilities.timestampMicros()), announceLocally); } public static void announceColumnFamilyUpdate(CFMetaData cfm, boolean fromThrift) throws ConfigurationException @@ -327,16 +337,12 @@ public static void announceColumnFamilyUpdate(CFMetaData cfm, boolean fromThrift CFMetaData oldCfm = Schema.instance.getCFMetaData(cfm.ksName, cfm.cfName); if (oldCfm == null) throw new ConfigurationException(String.format("Cannot update non existing table '%s' in keyspace '%s'.", cfm.cfName, cfm.ksName)); + KSMetaData ksm = Schema.instance.getKSMetaData(cfm.ksName); oldCfm.validateCompatility(cfm); logger.info(String.format("Update table '%s/%s' From %s To %s", cfm.ksName, cfm.cfName, oldCfm, cfm)); - announce(addSerializedKeyspace(oldCfm.toSchemaUpdate(cfm, FBUtilities.timestampMicros(), fromThrift), cfm.ksName), announceLocally); - } - - public static void announceTypeUpdate(UserType updatedType) - { - announceTypeUpdate(updatedType, false); + announce(LegacySchemaTables.makeUpdateTableMutation(ksm, oldCfm, cfm, FBUtilities.timestampMicros(), fromThrift), announceLocally); } public static void announceTypeUpdate(UserType updatedType, boolean announceLocally) @@ -356,7 +362,7 @@ public static void announceKeyspaceDrop(String ksName, boolean announceLocally) throw new ConfigurationException(String.format("Cannot drop non existing keyspace '%s'.", ksName)); logger.info(String.format("Drop Keyspace '%s'", oldKsm.name)); - announce(oldKsm.dropFromSchema(FBUtilities.timestampMicros()), announceLocally); + announce(LegacySchemaTables.makeDropKeyspaceMutation(oldKsm, FBUtilities.timestampMicros()), announceLocally); } public static void announceColumnFamilyDrop(String ksName, String cfName) throws ConfigurationException @@ -369,16 +375,10 @@ public static void announceColumnFamilyDrop(String ksName, String cfName, boolea CFMetaData oldCfm = Schema.instance.getCFMetaData(ksName, cfName); if (oldCfm == null) throw new ConfigurationException(String.format("Cannot drop non existing table '%s' in keyspace '%s'.", cfName, ksName)); + KSMetaData ksm = Schema.instance.getKSMetaData(ksName); logger.info(String.format("Drop table '%s/%s'", oldCfm.ksName, oldCfm.cfName)); - announce(addSerializedKeyspace(oldCfm.dropFromSchema(FBUtilities.timestampMicros()), ksName), announceLocally); - } - - // Include the serialized keyspace for when a target node missed the CREATE KEYSPACE migration (see #5631). - private static Mutation addSerializedKeyspace(Mutation migration, String ksName) - { - migration.add(SystemKeyspace.readSchemaRow(SystemKeyspace.SCHEMA_KEYSPACES_TABLE, ksName).cf); - return migration; + announce(LegacySchemaTables.makeDropTableMutation(ksm, oldCfm, FBUtilities.timestampMicros()), announceLocally); } public static void announceTypeDrop(UserType droppedType) @@ -388,35 +388,22 @@ public static void announceTypeDrop(UserType droppedType) public static void announceTypeDrop(UserType droppedType, boolean announceLocally) { - announce(addSerializedKeyspace(UTMetaData.dropFromSchema(droppedType, FBUtilities.timestampMicros()), droppedType.keyspace), announceLocally); + KSMetaData ksm = Schema.instance.getKSMetaData(droppedType.keyspace); + announce(LegacySchemaTables.dropTypeFromSchemaMutation(ksm, droppedType, FBUtilities.timestampMicros()), announceLocally); } public static void announceFunctionDrop(UDFunction udf, boolean announceLocally) { - Mutation mutation = udf.toSchemaDrop(FBUtilities.timestampMicros()); logger.info(String.format("Drop scalar function overload '%s' args '%s'", udf.name(), udf.argTypes())); - announce(mutation, announceLocally); + KSMetaData ksm = Schema.instance.getKSMetaData(udf.name().keyspace); + announce(LegacySchemaTables.makeDropFunctionMutation(ksm, udf, FBUtilities.timestampMicros()), announceLocally); } public static void announceAggregateDrop(UDAggregate udf, boolean announceLocally) { - Mutation mutation = udf.toSchemaDrop(FBUtilities.timestampMicros()); logger.info(String.format("Drop aggregate function overload '%s' args '%s'", udf.name(), udf.argTypes())); - announce(mutation, announceLocally); - } - - public static void announceNewFunction(UDFunction udf, boolean announceLocally) - { - Mutation mutation = udf.toSchemaUpdate(FBUtilities.timestampMicros()); - logger.info(String.format("Create scalar function '%s'", udf.name())); - announce(mutation, announceLocally); - } - - public static void announceNewAggregate(UDAggregate udf, boolean announceLocally) - { - Mutation mutation = udf.toSchemaUpdate(FBUtilities.timestampMicros()); - logger.info(String.format("Create aggregate function '%s'", udf.name())); - announce(mutation, announceLocally); + KSMetaData ksm = Schema.instance.getKSMetaData(udf.name().keyspace); + announce(LegacySchemaTables.makeDropAggregateMutation(ksm, udf, FBUtilities.timestampMicros()), announceLocally); } /** @@ -429,7 +416,7 @@ private static void announce(Mutation schema, boolean announceLocally) { try { - DefsTables.mergeSchemaInternal(Collections.singletonList(schema), false); + LegacySchemaTables.mergeSchema(Collections.singletonList(schema), false); } catch (IOException e) { @@ -457,7 +444,7 @@ private static Future announce(final Collection schema) { protected void runMayThrow() throws IOException, ConfigurationException { - DefsTables.mergeSchema(schema); + LegacySchemaTables.mergeSchema(schema); } }); @@ -497,9 +484,7 @@ public static void resetLocalSchema() throws IOException logger.debug("Truncating schema tables..."); - // truncate schema tables - for (String cf : SystemKeyspace.ALL_SCHEMA_TABLES) - SystemKeyspace.schemaCFS(cf).truncateBlocking(); + LegacySchemaTables.truncateSchemaTables(); logger.debug("Clearing local schema keyspace definitions..."); @@ -536,7 +521,7 @@ public void serialize(Collection schema, DataOutputPlus out, int versi public Collection deserialize(DataInput in, int version) throws IOException { int count = in.readInt(); - Collection schema = new ArrayList(count); + Collection schema = new ArrayList<>(count); for (int i = 0; i < count; i++) schema.add(Mutation.serializer.deserialize(in, version)); diff --git a/src/java/org/apache/cassandra/service/MigrationTask.java b/src/java/org/apache/cassandra/service/MigrationTask.java index 9fdbff404794..2a67e6d354fe 100644 --- a/src/java/org/apache/cassandra/service/MigrationTask.java +++ b/src/java/org/apache/cassandra/service/MigrationTask.java @@ -26,7 +26,7 @@ import org.apache.cassandra.db.Mutation; import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.db.DefsTables; +import org.apache.cassandra.schema.LegacySchemaTables; import org.apache.cassandra.gms.FailureDetector; import org.apache.cassandra.net.IAsyncCallback; import org.apache.cassandra.net.MessageIn; @@ -63,7 +63,7 @@ public void response(MessageIn> message) { try { - DefsTables.mergeSchema(message.payload); + LegacySchemaTables.mergeSchema(message.payload); } catch (IOException e) { diff --git a/src/java/org/apache/cassandra/service/StorageProxy.java b/src/java/org/apache/cassandra/service/StorageProxy.java index 9c579463f5ce..d6eb317f98f5 100644 --- a/src/java/org/apache/cassandra/service/StorageProxy.java +++ b/src/java/org/apache/cassandra/service/StorageProxy.java @@ -713,7 +713,7 @@ private static void asyncRemoveFromBatchlog(Collection endpoints, U null, WriteType.SIMPLE); Mutation mutation = new Mutation(SystemKeyspace.NAME, UUIDType.instance.decompose(uuid)); - mutation.delete(SystemKeyspace.BATCHLOG_TABLE, FBUtilities.timestampMicros()); + mutation.delete(SystemKeyspace.BATCHLOG, FBUtilities.timestampMicros()); MessageOut message = mutation.createMessage(); for (InetAddress target : endpoints) { diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index 999d6b6ddbf1..a349e6410aaf 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -3259,7 +3259,7 @@ private void unbootstrap(Runnable onFinish) private Future streamHints() { // StreamPlan will not fail if there are zero files to transfer, so flush anyway (need to get any in-memory hints, as well) - ColumnFamilyStore hintsCF = Keyspace.open(SystemKeyspace.NAME).getColumnFamilyStore(SystemKeyspace.HINTS_TABLE); + ColumnFamilyStore hintsCF = Keyspace.open(SystemKeyspace.NAME).getColumnFamilyStore(SystemKeyspace.HINTS); FBUtilities.waitOnFuture(hintsCF.forceFlush()); // gather all live nodes in the cluster that aren't also leaving @@ -3292,7 +3292,7 @@ private Future streamHints() preferred, SystemKeyspace.NAME, ranges, - SystemKeyspace.HINTS_TABLE) + SystemKeyspace.HINTS) .execute(); } } diff --git a/src/java/org/apache/cassandra/thrift/ThriftConversion.java b/src/java/org/apache/cassandra/thrift/ThriftConversion.java index b04a091d6f10..d408767a6d9b 100644 --- a/src/java/org/apache/cassandra/thrift/ThriftConversion.java +++ b/src/java/org/apache/cassandra/thrift/ThriftConversion.java @@ -30,6 +30,7 @@ import org.apache.cassandra.cql3.Operator; import org.apache.cassandra.cql3.UntypedResultSet; import org.apache.cassandra.db.ColumnFamilyType; +import org.apache.cassandra.schema.LegacySchemaTables; import org.apache.cassandra.db.WriteType; import org.apache.cassandra.db.composites.CellNameType; import org.apache.cassandra.db.composites.CellNames; @@ -330,9 +331,9 @@ public static CFMetaData fromThriftCqlRow(CqlRow cf, CqlResult columnsRes) List> cols = new ArrayList<>(columnsRes.rows.size()); for (CqlRow row : columnsRes.rows) cols.add(convertThriftCqlRow(row)); - UntypedResultSet colsRow = UntypedResultSet.create(cols); + UntypedResultSet colsRows = UntypedResultSet.create(cols); - return CFMetaData.fromSchemaNoTriggers(cfRow, colsRow); + return LegacySchemaTables.createTableFromTableRowAndColumnRows(cfRow, colsRows); } private static Map convertThriftCqlRow(CqlRow row) diff --git a/src/java/org/apache/cassandra/tools/BulkLoader.java b/src/java/org/apache/cassandra/tools/BulkLoader.java index 8e7e0e9c2b39..a720e1226491 100644 --- a/src/java/org/apache/cassandra/tools/BulkLoader.java +++ b/src/java/org/apache/cassandra/tools/BulkLoader.java @@ -26,12 +26,14 @@ import com.google.common.collect.Multimap; import org.apache.commons.cli.*; + import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TTransport; import org.apache.cassandra.auth.IAuthenticator; import org.apache.cassandra.config.*; +import org.apache.cassandra.schema.LegacySchemaTables; import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.db.marshal.UTF8Type; import org.apache.cassandra.dht.Range; @@ -309,7 +311,7 @@ public void init(String keyspace) String cfQuery = String.format("SELECT * FROM %s.%s WHERE keyspace_name = '%s'", SystemKeyspace.NAME, - SystemKeyspace.SCHEMA_COLUMNFAMILIES_TABLE, + LegacySchemaTables.COLUMNFAMILIES, keyspace); CqlResult cfRes = client.execute_cql3_query(ByteBufferUtil.bytes(cfQuery), Compression.NONE, ConsistencyLevel.ONE); @@ -319,7 +321,7 @@ public void init(String keyspace) String columnFamily = UTF8Type.instance.getString(row.columns.get(1).bufferForName()); String columnsQuery = String.format("SELECT * FROM %s.%s WHERE keyspace_name = '%s' AND columnfamily_name = '%s'", SystemKeyspace.NAME, - SystemKeyspace.SCHEMA_COLUMNS_TABLE, + LegacySchemaTables.COLUMNS, keyspace, columnFamily); CqlResult columnsRes = client.execute_cql3_query(ByteBufferUtil.bytes(columnsQuery), Compression.NONE, ConsistencyLevel.ONE); diff --git a/src/java/org/apache/cassandra/tools/SSTableExport.java b/src/java/org/apache/cassandra/tools/SSTableExport.java index fa6b9732635f..64dc2d84c7da 100644 --- a/src/java/org/apache/cassandra/tools/SSTableExport.java +++ b/src/java/org/apache/cassandra/tools/SSTableExport.java @@ -26,7 +26,6 @@ import org.apache.commons.cli.*; import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.config.Schema; import org.apache.cassandra.db.*; import org.apache.cassandra.db.composites.CellNameType; @@ -420,7 +419,7 @@ public static void main(String[] args) throws ConfigurationException String[] excludes = cmd.getOptionValues(EXCLUDEKEY_OPTION); String ssTableFileName = new File(cmd.getArgs()[0]).getAbsolutePath(); - DatabaseDescriptor.loadSchemas(); + Schema.instance.loadFromDisk(); Descriptor descriptor = Descriptor.fromFilename(ssTableFileName); // Start by validating keyspace name diff --git a/src/java/org/apache/cassandra/tools/SSTableImport.java b/src/java/org/apache/cassandra/tools/SSTableImport.java index 6f5dc9df47b1..f51610bc8c49 100644 --- a/src/java/org/apache/cassandra/tools/SSTableImport.java +++ b/src/java/org/apache/cassandra/tools/SSTableImport.java @@ -502,7 +502,7 @@ public static void main(String[] args) throws ParseException, ConfigurationExcep isSorted = true; } - DatabaseDescriptor.loadSchemas(); + Schema.instance.loadFromDisk(); if (Schema.instance.getNonSystemKeyspaces().size() < 1) { String msg = "no non-system keyspaces are defined"; diff --git a/src/java/org/apache/cassandra/tools/SSTableLevelResetter.java b/src/java/org/apache/cassandra/tools/SSTableLevelResetter.java index 3954b9131831..815620e83fa4 100644 --- a/src/java/org/apache/cassandra/tools/SSTableLevelResetter.java +++ b/src/java/org/apache/cassandra/tools/SSTableLevelResetter.java @@ -21,7 +21,6 @@ import java.util.Map; import java.util.Set; -import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.config.Schema; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.Keyspace; @@ -62,7 +61,7 @@ public static void main(String[] args) try { // load keyspace descriptions. - DatabaseDescriptor.loadSchemas(); + Schema.instance.loadFromDisk(); String keyspaceName = args[1]; String columnfamily = args[2]; diff --git a/src/java/org/apache/cassandra/tools/StandaloneScrubber.java b/src/java/org/apache/cassandra/tools/StandaloneScrubber.java index 94bf6e2eb0d8..b6e2bf8625ba 100644 --- a/src/java/org/apache/cassandra/tools/StandaloneScrubber.java +++ b/src/java/org/apache/cassandra/tools/StandaloneScrubber.java @@ -24,7 +24,6 @@ import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.commons.cli.*; -import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.config.Schema; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.Directories; @@ -53,7 +52,7 @@ public static void main(String args[]) try { // load keyspace descriptions. - DatabaseDescriptor.loadSchemas(); + Schema.instance.loadFromDisk(); if (Schema.instance.getCFMetaData(options.keyspaceName, options.cfName) == null) throw new IllegalArgumentException(String.format("Unknown keyspace/table %s.%s", diff --git a/src/java/org/apache/cassandra/tools/StandaloneSplitter.java b/src/java/org/apache/cassandra/tools/StandaloneSplitter.java index 66cb361adf59..90ab48ea1591 100644 --- a/src/java/org/apache/cassandra/tools/StandaloneSplitter.java +++ b/src/java/org/apache/cassandra/tools/StandaloneSplitter.java @@ -21,10 +21,10 @@ import java.io.File; import java.util.*; +import org.apache.cassandra.config.Schema; import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.commons.cli.*; -import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.Directories; import org.apache.cassandra.db.Keyspace; @@ -52,7 +52,7 @@ public static void main(String args[]) try { // load keyspace descriptions. - DatabaseDescriptor.loadSchemas(); + Schema.instance.loadFromDisk(); String ksName = null; String cfName = null; diff --git a/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java b/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java index 90eca5d26543..6617b9638a82 100644 --- a/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java +++ b/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java @@ -46,7 +46,7 @@ public static void main(String args[]) try { // load keyspace descriptions. - DatabaseDescriptor.loadSchemas(); + Schema.instance.loadFromDisk(); if (Schema.instance.getCFMetaData(options.keyspace, options.cf) == null) throw new IllegalArgumentException(String.format("Unknown keyspace/table %s.%s", diff --git a/test/unit/org/apache/cassandra/config/CFMetaDataTest.java b/test/unit/org/apache/cassandra/config/CFMetaDataTest.java index 79373ea02b1f..5fed5be0fca5 100644 --- a/test/unit/org/apache/cassandra/config/CFMetaDataTest.java +++ b/test/unit/org/apache/cassandra/config/CFMetaDataTest.java @@ -24,20 +24,21 @@ import java.util.HashSet; import org.apache.cassandra.SchemaLoader; -import org.apache.cassandra.cql3.QueryProcessor; -import org.apache.cassandra.cql3.UntypedResultSet; import org.apache.cassandra.db.*; import org.apache.cassandra.db.marshal.AsciiType; import org.apache.cassandra.db.marshal.UTF8Type; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.compress.*; import org.apache.cassandra.locator.SimpleStrategy; +import org.apache.cassandra.schema.LegacySchemaTables; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.thrift.CfDef; import org.apache.cassandra.thrift.ColumnDef; import org.apache.cassandra.thrift.IndexType; import org.apache.cassandra.thrift.ThriftConversion; import org.apache.cassandra.utils.ByteBufferUtil; +import org.apache.cassandra.utils.FBUtilities; + import org.junit.BeforeClass; import org.junit.Test; @@ -132,6 +133,7 @@ public void testConversionsInverses() throws Exception private void checkInverses(CFMetaData cfm) throws Exception { DecoratedKey k = StorageService.getPartitioner().decorateKey(ByteBufferUtil.bytes(cfm.ksName)); + KSMetaData keyspace = Schema.instance.getKSMetaData(cfm.ksName); // Test thrift conversion CFMetaData before = cfm; @@ -139,11 +141,10 @@ private void checkInverses(CFMetaData cfm) throws Exception assert before.equals(after) : String.format("%n%s%n!=%n%s", before, after); // Test schema conversion - Mutation rm = cfm.toSchema(System.currentTimeMillis()); - ColumnFamily serializedCf = rm.getColumnFamily(Schema.instance.getId(SystemKeyspace.NAME, SystemKeyspace.SCHEMA_COLUMNFAMILIES_TABLE)); - ColumnFamily serializedCD = rm.getColumnFamily(Schema.instance.getId(SystemKeyspace.NAME, SystemKeyspace.SCHEMA_COLUMNS_TABLE)); - UntypedResultSet.Row result = QueryProcessor.resultify("SELECT * FROM system.schema_columnfamilies", new Row(k, serializedCf)).one(); - CFMetaData newCfm = CFMetaData.fromSchemaNoTriggers(result, ColumnDefinition.resultify(new Row(k, serializedCD))); + Mutation rm = LegacySchemaTables.makeCreateTableMutation(keyspace, cfm, FBUtilities.timestampMicros()); + ColumnFamily serializedCf = rm.getColumnFamily(Schema.instance.getId(SystemKeyspace.NAME, LegacySchemaTables.COLUMNFAMILIES)); + ColumnFamily serializedCD = rm.getColumnFamily(Schema.instance.getId(SystemKeyspace.NAME, LegacySchemaTables.COLUMNS)); + CFMetaData newCfm = LegacySchemaTables.createTableFromTablePartitionAndColumnsPartition(new Row(k, serializedCf), new Row(k, serializedCD)); assert cfm.equals(newCfm) : String.format("%n%s%n!=%n%s", cfm, newCfm); } } diff --git a/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java b/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java index edfd7b6af06b..8ca7a793655b 100644 --- a/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java +++ b/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java @@ -56,9 +56,10 @@ public void testCFMetaDataSerialization() throws ConfigurationException, Invalid @Test public void testKSMetaDataSerialization() throws ConfigurationException { - for (KSMetaData ksm : Schema.instance.getKeyspaceDefinitions()) + for (String ks : Schema.instance.getNonSystemKeyspaces()) { // Not testing round-trip on the KsDef via serDe() because maps + KSMetaData ksm = Schema.instance.getKSMetaData(ks); KSMetaData ksmDupe = ThriftConversion.fromThrift(ThriftConversion.toThrift(ksm)); assertNotNull(ksmDupe); assertEquals(ksm, ksmDupe); @@ -70,7 +71,7 @@ public void testKSMetaDataSerialization() throws ConfigurationException public void testTransKsMigration() throws ConfigurationException { SchemaLoader.cleanupAndLeaveDirs(); - DatabaseDescriptor.loadSchemas(); + Schema.instance.loadFromDisk(); assertEquals(0, Schema.instance.getNonSystemKeyspaces().size()); Gossiper.instance.start((int)(System.currentTimeMillis() / 1000)); @@ -91,7 +92,7 @@ public void testTransKsMigration() throws ConfigurationException assertNull(Schema.instance.getKSMetaData("ks0")); assertNull(Schema.instance.getKSMetaData("ks1")); - DatabaseDescriptor.loadSchemas(); + Schema.instance.loadFromDisk(); assertNotNull(Schema.instance.getKSMetaData("ks0")); assertNotNull(Schema.instance.getKSMetaData("ks1")); diff --git a/test/unit/org/apache/cassandra/config/KSMetaDataTest.java b/test/unit/org/apache/cassandra/config/KSMetaDataTest.java index 90930866e767..3d90bef4fb0e 100644 --- a/test/unit/org/apache/cassandra/config/KSMetaDataTest.java +++ b/test/unit/org/apache/cassandra/config/KSMetaDataTest.java @@ -39,11 +39,7 @@ public void testToStringHasStrategyOptions() throws Exception options.put("key2", "value2"); options.put("key3", "value3"); - KSMetaData ksMeta = new KSMetaData("test", - SimpleStrategy.class, - options, - true, - Collections.emptyList()); + KSMetaData ksMeta = new KSMetaData("test", SimpleStrategy.class, options, true); assertTrue(ksMeta.toString().contains(options.toString())); } diff --git a/test/unit/org/apache/cassandra/cql3/CQLTester.java b/test/unit/org/apache/cassandra/cql3/CQLTester.java index 883da3aff21c..4e536fe44364 100644 --- a/test/unit/org/apache/cassandra/cql3/CQLTester.java +++ b/test/unit/org/apache/cassandra/cql3/CQLTester.java @@ -159,10 +159,10 @@ public void run() schemaChange(String.format("DROP TABLE IF EXISTS %s.%s", KEYSPACE, tableToDrop)); for (String aggregateName : aggregatesToDrop) - schemaChange(String.format("DROP AGGREGATE IF EXISTS %s", aggregateName)); + schemaChange(String.format("DROP AGGREGATE IF EXISTS %s.%s", KEYSPACE, aggregateName)); for (String functionName : functionsToDrop) - schemaChange(String.format("DROP FUNCTION IF EXISTS %s", functionName)); + schemaChange(String.format("DROP FUNCTION IF EXISTS %s.%s", KEYSPACE, functionName)); for (String typeName : typesToDrop) schemaChange(String.format("DROP TYPE IF EXISTS %s.%s", KEYSPACE, typeName)); diff --git a/test/unit/org/apache/cassandra/db/BatchlogManagerTest.java b/test/unit/org/apache/cassandra/db/BatchlogManagerTest.java index 608aee8fe32c..70d1d0ce75c0 100644 --- a/test/unit/org/apache/cassandra/db/BatchlogManagerTest.java +++ b/test/unit/org/apache/cassandra/db/BatchlogManagerTest.java @@ -101,7 +101,7 @@ public void testReplay() throws Exception } // Flush the batchlog to disk (see CASSANDRA-6822). - Keyspace.open(SystemKeyspace.NAME).getColumnFamilyStore(SystemKeyspace.BATCHLOG_TABLE).forceBlockingFlush(); + Keyspace.open(SystemKeyspace.NAME).getColumnFamilyStore(SystemKeyspace.BATCHLOG).forceBlockingFlush(); assertEquals(1000, BatchlogManager.instance.countAllBatches() - initialAllBatches); assertEquals(0, BatchlogManager.instance.getTotalBatchesReplayed() - initialReplayedBatches); @@ -171,7 +171,7 @@ public void testTruncatedReplay() throws InterruptedException, ExecutionExceptio } // Flush the batchlog to disk (see CASSANDRA-6822). - Keyspace.open(SystemKeyspace.NAME).getColumnFamilyStore(SystemKeyspace.BATCHLOG_TABLE).forceFlush(); + Keyspace.open(SystemKeyspace.NAME).getColumnFamilyStore(SystemKeyspace.BATCHLOG).forceFlush(); // Force batchlog replay and wait for it to complete. BatchlogManager.instance.startBatchlogReplay().get(); diff --git a/test/unit/org/apache/cassandra/db/HintedHandOffTest.java b/test/unit/org/apache/cassandra/db/HintedHandOffTest.java index 8b6834ca39f7..ce14c3789f1f 100644 --- a/test/unit/org/apache/cassandra/db/HintedHandOffTest.java +++ b/test/unit/org/apache/cassandra/db/HintedHandOffTest.java @@ -66,7 +66,7 @@ public void testCompactionOfHintsCF() throws Exception { // prepare hints column family Keyspace systemKeyspace = Keyspace.open("system"); - ColumnFamilyStore hintStore = systemKeyspace.getColumnFamilyStore(SystemKeyspace.HINTS_TABLE); + ColumnFamilyStore hintStore = systemKeyspace.getColumnFamilyStore(SystemKeyspace.HINTS); hintStore.clearUnsafe(); hintStore.metadata.gcGraceSeconds(36000); // 10 hours hintStore.setCompactionStrategyClass(SizeTieredCompactionStrategy.class.getCanonicalName()); @@ -101,7 +101,7 @@ public void testHintsMetrics() throws Exception HintedHandOffManager.instance.metrics.incrPastWindow(InetAddress.getLocalHost()); HintedHandOffManager.instance.metrics.log(); - UntypedResultSet rows = executeInternal("SELECT hints_dropped FROM system." + SystemKeyspace.PEER_EVENTS_TABLE); + UntypedResultSet rows = executeInternal("SELECT hints_dropped FROM system." + SystemKeyspace.PEER_EVENTS); Map returned = rows.one().getMap("hints_dropped", UUIDType.instance, Int32Type.instance); assertEquals(Iterators.getLast(returned.values().iterator()).intValue(), 99); } @@ -110,7 +110,7 @@ public void testHintsMetrics() throws Exception public void testTruncateHints() throws Exception { Keyspace systemKeyspace = Keyspace.open("system"); - ColumnFamilyStore hintStore = systemKeyspace.getColumnFamilyStore(SystemKeyspace.HINTS_TABLE); + ColumnFamilyStore hintStore = systemKeyspace.getColumnFamilyStore(SystemKeyspace.HINTS); hintStore.clearUnsafe(); // insert 1 hint @@ -138,7 +138,7 @@ public void testTruncateHints() throws Exception private int getNoOfHints() { String req = "SELECT * FROM system.%s"; - UntypedResultSet resultSet = executeInternal(String.format(req, SystemKeyspace.HINTS_TABLE)); + UntypedResultSet resultSet = executeInternal(String.format(req, SystemKeyspace.HINTS)); return resultSet.size(); } } diff --git a/test/unit/org/apache/cassandra/config/DefsTest.java b/test/unit/org/apache/cassandra/schema/LegacySchemaTablesTest.java similarity index 98% rename from test/unit/org/apache/cassandra/config/DefsTest.java rename to test/unit/org/apache/cassandra/schema/LegacySchemaTablesTest.java index 6df67bc44c05..8190617b6fe4 100644 --- a/test/unit/org/apache/cassandra/config/DefsTest.java +++ b/test/unit/org/apache/cassandra/schema/LegacySchemaTablesTest.java @@ -16,7 +16,7 @@ * limitations under the License. */ -package org.apache.cassandra.config; +package org.apache.cassandra.schema; import java.io.File; import java.nio.ByteBuffer; @@ -24,6 +24,7 @@ import org.apache.cassandra.OrderedJUnit4ClassRunner; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; +import org.apache.cassandra.config.*; import org.apache.cassandra.db.*; import org.apache.cassandra.db.composites.*; import org.apache.cassandra.db.marshal.BytesType; @@ -35,8 +36,11 @@ import org.apache.cassandra.io.sstable.SSTableDeletingTask; import org.apache.cassandra.locator.OldNetworkTopologyStrategy; import org.apache.cassandra.locator.SimpleStrategy; +import org.apache.cassandra.schema.LegacySchemaTables; import org.apache.cassandra.service.MigrationManager; import org.apache.cassandra.utils.ByteBufferUtil; +import org.apache.cassandra.utils.FBUtilities; + import static org.apache.cassandra.Util.cellname; import org.junit.Assert; @@ -46,7 +50,7 @@ import org.junit.runner.RunWith; @RunWith(OrderedJUnit4ClassRunner.class) -public class DefsTest +public class LegacySchemaTablesTest { private static final String KEYSPACE1 = "Keyspace1"; private static final String KEYSPACE3 = "Keyspace3"; @@ -528,7 +532,7 @@ public void testUpdateColumnFamilyNoIndexes() throws ConfigurationException public void testDropIndex() throws ConfigurationException { // persist keyspace definition in the system keyspace - Schema.instance.getKSMetaData(KEYSPACE6).toSchema(System.currentTimeMillis()).applyUnsafe(); + LegacySchemaTables.makeCreateKeyspaceMutation(Schema.instance.getKSMetaData(KEYSPACE6), FBUtilities.timestampMicros()).applyUnsafe(); ColumnFamilyStore cfs = Keyspace.open(KEYSPACE6).getColumnFamilyStore("Indexed1"); // insert some data. save the sstable descriptor so we can make sure it's marked for delete after the drop diff --git a/test/unit/org/apache/cassandra/service/EmbeddedCassandraServiceTest.java b/test/unit/org/apache/cassandra/service/EmbeddedCassandraServiceTest.java index 143788684bbc..ed0efeec010e 100644 --- a/test/unit/org/apache/cassandra/service/EmbeddedCassandraServiceTest.java +++ b/test/unit/org/apache/cassandra/service/EmbeddedCassandraServiceTest.java @@ -59,11 +59,11 @@ public class EmbeddedCassandraServiceTest public static void defineSchema() throws Exception { SchemaLoader.prepareServer(); + setup(); SchemaLoader.createKeyspace(KEYSPACE1, SimpleStrategy.class, KSMetaData.optsWithRF(1), SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD)); - setup(); } /** diff --git a/test/unit/org/apache/cassandra/service/StorageServiceServerTest.java b/test/unit/org/apache/cassandra/service/StorageServiceServerTest.java index f98751a0ad80..d1a4d85e6855 100644 --- a/test/unit/org/apache/cassandra/service/StorageServiceServerTest.java +++ b/test/unit/org/apache/cassandra/service/StorageServiceServerTest.java @@ -37,6 +37,7 @@ import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.config.Schema; import org.apache.cassandra.db.Keyspace; +import org.apache.cassandra.schema.LegacySchemaTables; import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; @@ -98,7 +99,7 @@ public void testSnapshot() throws IOException public void testColumnFamilySnapshot() throws IOException { // no need to insert extra data, even an "empty" database will have a little information in the system keyspace - StorageService.instance.takeColumnFamilySnapshot(SystemKeyspace.NAME, SystemKeyspace.SCHEMA_KEYSPACES_TABLE, "cf_snapshot"); + StorageService.instance.takeColumnFamilySnapshot(SystemKeyspace.NAME, LegacySchemaTables.KEYSPACES, "cf_snapshot"); } @Test From a7c1729c17a9f1eaa26b23338357b364ba986c77 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Wed, 17 Dec 2014 21:16:19 -0500 Subject: [PATCH 219/557] parseLong for primitives --- src/java/org/apache/cassandra/dht/Murmur3Partitioner.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/cassandra/dht/Murmur3Partitioner.java b/src/java/org/apache/cassandra/dht/Murmur3Partitioner.java index 0ff5eeb7a5ee..11d3abcd55db 100644 --- a/src/java/org/apache/cassandra/dht/Murmur3Partitioner.java +++ b/src/java/org/apache/cassandra/dht/Murmur3Partitioner.java @@ -247,7 +247,7 @@ public Token fromString(String string) { try { - return new LongToken(Long.valueOf(string)); + return new LongToken(Long.parseLong(string)); } catch (NumberFormatException e) { From 3f55c35b8c6bc8240e34573f2fe45709c64e566f Mon Sep 17 00:00:00 2001 From: Samuel Klock Date: Thu, 18 Dec 2014 17:30:26 -0600 Subject: [PATCH 220/557] Support indexing key/value entries in map collections Patch by Samuel Klock; reviewed by Tyler Hobbs for CASSANDRA-8473 --- CHANGES.txt | 1 + pylib/cqlshlib/cql3handling.py | 2 +- src/java/org/apache/cassandra/cql3/Cql.g | 9 +- .../cassandra/cql3/SingleColumnRelation.java | 87 ++++- .../restrictions/SingleColumnRestriction.java | 65 +++- .../SingleColumnRestrictions.java | 8 +- .../cql3/statements/CreateIndexStatement.java | 64 ++-- .../cql3/statements/IndexTarget.java | 73 +++- .../cassandra/db/filter/ExtendedFilter.java | 28 +- .../cassandra/db/index/SecondaryIndex.java | 5 + .../db/index/composites/CompositesIndex.java | 19 +- ...CompositesIndexIncludingCollectionKey.java | 89 +++++ .../CompositesIndexOnCollectionKey.java | 61 +--- ...ompositesIndexOnCollectionKeyAndValue.java | 87 +++++ .../cql3/SecondaryIndexOnMapEntriesTest.java | 338 ++++++++++++++++++ 15 files changed, 792 insertions(+), 144 deletions(-) create mode 100644 src/java/org/apache/cassandra/db/index/composites/CompositesIndexIncludingCollectionKey.java create mode 100644 src/java/org/apache/cassandra/db/index/composites/CompositesIndexOnCollectionKeyAndValue.java create mode 100644 test/unit/org/apache/cassandra/cql3/SecondaryIndexOnMapEntriesTest.java diff --git a/CHANGES.txt b/CHANGES.txt index 2848d53684b7..c3b62f027ac9 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0 + * Support index key/value entries on map collections (CASSANDRA-8473) * Modernize schema tables (CASSANDRA-8261) * Support for user-defined aggregation functions (CASSANDRA-8053) * Fix NPE in SelectStatement with empty IN values (CASSANDRA-8419) diff --git a/pylib/cqlshlib/cql3handling.py b/pylib/cqlshlib/cql3handling.py index 84af79669402..4ee2099e30f7 100644 --- a/pylib/cqlshlib/cql3handling.py +++ b/pylib/cqlshlib/cql3handling.py @@ -616,7 +616,7 @@ def working_on_keyspace(ctxt): ; ::= ( "AND" )* ; - ::= [rel_lhs]= ( "=" | "<" | ">" | "<=" | ">=" | "CONTAINS" ( "KEY" )? ) + ::= [rel_lhs]= ( "[" "]" )? ( "=" | "<" | ">" | "<=" | ">=" | "CONTAINS" ( "KEY" )? ) | token="TOKEN" "(" [rel_tokname]= ( "," [rel_tokname]= )* ")" ("=" | "<" | ">" | "<=" | ">=") diff --git a/src/java/org/apache/cassandra/cql3/Cql.g b/src/java/org/apache/cassandra/cql3/Cql.g index ed133e712641..2a6e6d02c32d 100644 --- a/src/java/org/apache/cassandra/cql3/Cql.g +++ b/src/java/org/apache/cassandra/cql3/Cql.g @@ -676,9 +676,10 @@ createIndexStatement returns [CreateIndexStatement expr] ; indexIdent returns [IndexTarget.Raw id] - : c=cident { $id = IndexTarget.Raw.valuesOf(c); } - | K_KEYS '(' c=cident ')' { $id = IndexTarget.Raw.keysOf(c); } - | K_FULL '(' c=cident ')' { $id = IndexTarget.Raw.fullCollection(c); } + : c=cident { $id = IndexTarget.Raw.valuesOf(c); } + | K_KEYS '(' c=cident ')' { $id = IndexTarget.Raw.keysOf(c); } + | K_ENTRIES '(' c=cident ')' { $id = IndexTarget.Raw.keysAndValuesOf(c); } + | K_FULL '(' c=cident ')' { $id = IndexTarget.Raw.fullCollection(c); } ; @@ -1150,6 +1151,7 @@ relation[List clauses] { $clauses.add(SingleColumnRelation.createInRelation($name.id, inValues)); } | name=cident K_CONTAINS { Operator rt = Operator.CONTAINS; } (K_KEY { rt = Operator.CONTAINS_KEY; })? t=term { $clauses.add(new SingleColumnRelation(name, rt, t)); } + | name=cident '[' key=term ']' type=relationType t=term { $clauses.add(new SingleColumnRelation(name, key, type, t)); } | ids=tupleOfIdentifiers ( K_IN ( '(' ')' @@ -1342,6 +1344,7 @@ K_WHERE: W H E R E; K_AND: A N D; K_KEY: K E Y; K_KEYS: K E Y S; +K_ENTRIES: E N T R I E S; K_FULL: F U L L; K_INSERT: I N S E R T; K_UPDATE: U P D A T E; diff --git a/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java b/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java index 7817d434ef0d..3db1195c2b37 100644 --- a/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java +++ b/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java @@ -18,6 +18,7 @@ package org.apache.cassandra.cql3; import java.util.Collections; +import java.util.ArrayList; import java.util.List; import org.apache.cassandra.config.CFMetaData; @@ -27,10 +28,12 @@ import org.apache.cassandra.cql3.restrictions.SingleColumnRestriction; import org.apache.cassandra.cql3.statements.Bound; import org.apache.cassandra.db.marshal.CollectionType; +import org.apache.cassandra.db.marshal.ListType; import org.apache.cassandra.db.marshal.MapType; import org.apache.cassandra.exceptions.InvalidRequestException; import static org.apache.cassandra.cql3.statements.RequestValidations.checkFalse; +import static org.apache.cassandra.cql3.statements.RequestValidations.checkTrue; /** * Relations encapsulate the relationship between an entity of some kind, and @@ -40,17 +43,32 @@ public final class SingleColumnRelation extends Relation { private final ColumnIdentifier.Raw entity; + private final Term.Raw mapKey; private final Term.Raw value; private final List inValues; - private SingleColumnRelation(ColumnIdentifier.Raw entity, Operator type, Term.Raw value, List inValues) + private SingleColumnRelation(ColumnIdentifier.Raw entity, Term.Raw mapKey, Operator type, Term.Raw value, List inValues) { this.entity = entity; + this.mapKey = mapKey; this.relationType = type; this.value = value; this.inValues = inValues; } + /** + * Creates a new relation. + * + * @param entity the kind of relation this is; what the term is being compared to. + * @param mapKey the key into the entity identifying the value the term is being compared to. + * @param type the type that describes how this entity relates to the value. + * @param value the value being compared. + */ + public SingleColumnRelation(ColumnIdentifier.Raw entity, Term.Raw mapKey, Operator type, Term.Raw value) + { + this(entity, mapKey, type, value, null); + } + /** * Creates a new relation. * @@ -60,12 +78,12 @@ private SingleColumnRelation(ColumnIdentifier.Raw entity, Operator type, Term.Ra */ public SingleColumnRelation(ColumnIdentifier.Raw entity, Operator type, Term.Raw value) { - this(entity, type, value, null); + this(entity, null, type, value); } public static SingleColumnRelation createInRelation(ColumnIdentifier.Raw entity, List inValues) { - return new SingleColumnRelation(entity, Operator.IN, null, inValues); + return new SingleColumnRelation(entity, null, Operator.IN, null, inValues); } public ColumnIdentifier.Raw getEntity() @@ -73,6 +91,11 @@ public ColumnIdentifier.Raw getEntity() return entity; } + public Term.Raw getMapKey() + { + return mapKey; + } + @Override protected Term toTerm(List receivers, Raw raw, @@ -92,7 +115,7 @@ public SingleColumnRelation withNonStrictOperator() switch (relationType) { case GT: return new SingleColumnRelation(entity, Operator.GTE, value); - case LT: return new SingleColumnRelation(entity, Operator.LTE, value); + case LT: return new SingleColumnRelation(entity, Operator.LTE, value); default: return this; } } @@ -100,10 +123,14 @@ public SingleColumnRelation withNonStrictOperator() @Override public String toString() { + String entityAsString = entity.toString(); + if (mapKey != null) + entityAsString = String.format("%s[%s]", entityAsString, mapKey); + if (isIN()) - return String.format("%s IN %s", entity, inValues); + return String.format("%s IN %s", entityAsString, inValues); - return String.format("%s %s %s", entity, relationType, value); + return String.format("%s %s %s", entityAsString, relationType, value); } @Override @@ -111,8 +138,15 @@ protected Restriction newEQRestriction(CFMetaData cfm, VariableSpecifications boundNames) throws InvalidRequestException { ColumnDefinition columnDef = toColumnDefinition(cfm, entity); - Term term = toTerm(toReceivers(cfm, columnDef), value, cfm.ksName, boundNames); - return new SingleColumnRestriction.EQ(columnDef, term); + if (mapKey == null) + { + Term term = toTerm(toReceivers(cfm, columnDef), value, cfm.ksName, boundNames); + return new SingleColumnRestriction.EQ(columnDef, term); + } + List receivers = toReceivers(cfm, columnDef); + Term entryKey = toTerm(Collections.singletonList(receivers.get(0)), mapKey, cfm.ksName, boundNames); + Term entryValue = toTerm(Collections.singletonList(receivers.get(1)), value, cfm.ksName, boundNames); + return new SingleColumnRestriction.Contains(columnDef, entryKey, entryValue); } @Override @@ -195,21 +229,54 @@ else if (isSlice()) checkFalse(isContainsKey() && !(receiver.type instanceof MapType), "Cannot use CONTAINS KEY on non-map column %s", receiver.name); + if (mapKey != null) + { + checkFalse(receiver.type instanceof ListType, "Indexes on list entries (%s[index] = value) are not currently supported.", receiver.name); + checkTrue(receiver.type instanceof MapType, "Column %s cannot be used as a map", receiver.name); + checkTrue(receiver.type.isMultiCell(), "Map-entry equality predicates on frozen map column %s are not supported", receiver.name); + checkTrue(isEQ(), "Only EQ relations are supported on map entries"); + } + if (receiver.type.isCollection()) { // We don't support relations against entire collections (unless they're frozen), like "numbers = {1, 2, 3}" - checkFalse(receiver.type.isMultiCell() && !(isContainsKey() || isContains()), + checkFalse(receiver.type.isMultiCell() && !isLegalRelationForNonFrozenCollection(), "Collection column '%s' (%s) cannot be restricted by a '%s' relation", receiver.name, receiver.type.asCQL3Type(), operator()); if (isContainsKey() || isContains()) - receiver = ((CollectionType) receiver.type).makeCollectionReceiver(receiver, isContainsKey()); + { + receiver = makeCollectionReceiver(receiver, isContainsKey()); + } + else if (receiver.type.isMultiCell() && mapKey != null && isEQ()) + { + List receivers = new ArrayList<>(2); + receivers.add(makeCollectionReceiver(receiver, true)); + receivers.add(makeCollectionReceiver(receiver, false)); + return receivers; + } } + return Collections.singletonList(receiver); } + private ColumnSpecification makeCollectionReceiver(ColumnSpecification receiver, boolean forKey) + { + return ((CollectionType) receiver.type).makeCollectionReceiver(receiver, forKey); + } + + private boolean isLegalRelationForNonFrozenCollection() + { + return isContainsKey() || isContains() || isMapEntryEquality(); + } + + private boolean isMapEntryEquality() + { + return mapKey != null && isEQ(); + } + /** * Checks if the specified column is the last column of the partition key. * diff --git a/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestriction.java b/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestriction.java index 0f0f9c8b8370..44a9e6847534 100644 --- a/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestriction.java +++ b/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestriction.java @@ -21,6 +21,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.Deque; +import java.util.LinkedList; import java.util.List; import org.apache.cassandra.config.ColumnDefinition; @@ -32,6 +34,7 @@ import org.apache.cassandra.db.IndexExpression; import org.apache.cassandra.db.index.SecondaryIndex; import org.apache.cassandra.db.index.SecondaryIndexManager; +import org.apache.cassandra.db.marshal.CompositeType; import org.apache.cassandra.exceptions.InvalidRequestException; import static org.apache.cassandra.cql3.statements.RequestValidations.checkFalse; @@ -324,11 +327,13 @@ private Slice(ColumnDefinition columnDef, TermSlice slice) } } - // This holds both CONTAINS and CONTAINS_KEY restriction because we might want to have both of them. + // This holds CONTAINS, CONTAINS_KEY, and map[key] = value restrictions because we might want to have any combination of them. public static final class Contains extends SingleColumnRestriction { private List values = new ArrayList<>(); // for CONTAINS - private List keys = new ArrayList<>(); // for CONTAINS_KEY + private List keys = new ArrayList<>(); // for CONTAINS_KEY + private List entryKeys = new ArrayList<>(); // for map[key] = value + private List entryValues = new ArrayList<>(); // for map[key] = value public Contains(ColumnDefinition columnDef, Term t, boolean isKey) { @@ -339,6 +344,13 @@ public Contains(ColumnDefinition columnDef, Term t, boolean isKey) values.add(t); } + public Contains(ColumnDefinition columnDef, Term mapKey, Term mapValue) + { + super(columnDef); + entryKeys.add(mapKey); + entryValues.add(mapValue); + } + @Override public List values(QueryOptions options) throws InvalidRequestException { @@ -355,7 +367,7 @@ public boolean isContains() public Restriction mergeWith(Restriction otherRestriction) throws InvalidRequestException { checkTrue(otherRestriction.isContains(), - "Collection column %s can only be restricted by CONTAINS or CONTAINS KEY", + "Collection column %s can only be restricted by CONTAINS, CONTAINS KEY, or map-entry equality", getColumnDef().name); SingleColumnRestriction.Contains newContains = new Contains(getColumnDef()); @@ -371,15 +383,18 @@ public void addIndexExpressionTo(List expressions, QueryOptions options) throws InvalidRequestException { - for (ByteBuffer value : values(options)) + addExpressionsFor(expressions, values(options), Operator.CONTAINS); + addExpressionsFor(expressions, keys(options), Operator.CONTAINS_KEY); + addExpressionsFor(expressions, entries(options), Operator.EQ); + } + + private void addExpressionsFor(List target, List values, + Operator op) throws InvalidRequestException + { + for (ByteBuffer value : values) { validateIndexedValue(columnDef, value); - expressions.add(new IndexExpression(columnDef.name.bytes, Operator.CONTAINS, value)); - } - for (ByteBuffer key : keys(options)) - { - validateIndexedValue(columnDef, key); - expressions.add(new IndexExpression(columnDef.name.bytes, Operator.CONTAINS_KEY, key)); + target.add(new IndexExpression(columnDef.name.bytes, op, value)); } } @@ -394,6 +409,9 @@ protected boolean isSupportedBy(SecondaryIndex index) if (numberOfKeys() > 0) supported |= index.supportsOperator(Operator.CONTAINS_KEY); + if (numberOfEntries() > 0) + supported |= index.supportsOperator(Operator.EQ); + return supported; } @@ -407,16 +425,22 @@ public int numberOfKeys() return keys.size(); } + public int numberOfEntries() + { + return entryKeys.size(); + } + @Override public boolean usesFunction(String ksName, String functionName) { - return usesFunction(values, ksName, functionName) || usesFunction(keys, ksName, functionName); + return usesFunction(values, ksName, functionName) || usesFunction(keys, ksName, functionName) || + usesFunction(entryKeys, ksName, functionName) || usesFunction(entryValues, ksName, functionName); } @Override public String toString() { - return String.format("CONTAINS(values=%s, keys=%s)", values, keys); + return String.format("CONTAINS(values=%s, keys=%s, entryKeys=%s, entryValues=%s)", values, keys, entryKeys, entryValues); } @Override @@ -436,11 +460,26 @@ public boolean isInclusive(Bound b) { throw new UnsupportedOperationException(); } + private List keys(QueryOptions options) throws InvalidRequestException { return bindAndGet(keys, options); } + private List entries(QueryOptions options) throws InvalidRequestException + { + List entryBuffers = new ArrayList<>(entryKeys.size()); + List keyBuffers = bindAndGet(entryKeys, options); + List valueBuffers = bindAndGet(entryValues, options); + for (int i = 0; i < entryKeys.size(); i++) + { + if (valueBuffers.get(i) == null) + throw new InvalidRequestException("Unsupported null value for map-entry equality"); + entryBuffers.add(CompositeType.build(keyBuffers.get(i), valueBuffers.get(i))); + } + return entryBuffers; + } + /** * Binds the query options to the specified terms and returns the resulting values. * @@ -467,6 +506,8 @@ private static void copyKeysAndValues(Contains from, Contains to) { to.values.addAll(from.values); to.keys.addAll(from.keys); + to.entryKeys.addAll(from.entryKeys); + to.entryValues.addAll(from.entryValues); } private Contains(ColumnDefinition columnDef) diff --git a/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestrictions.java b/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestrictions.java index ec74cc9884c8..b9ffc68fd4ef 100644 --- a/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestrictions.java +++ b/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestrictions.java @@ -188,10 +188,10 @@ private static Restriction mergeRestrictions(Restriction restriction, } /** - * Checks if the restrictions contains multiple contains or contains key. + * Checks if the restrictions contains multiple contains, contains key, or map[key] = value. * - * @return true if the restrictions contains multiple contains or contains key., - * false otherwise + * @return true if the restrictions contains multiple contains, contains key, or , + * map[key] = value; false otherwise */ public final boolean hasMultipleContains() { @@ -201,7 +201,7 @@ public final boolean hasMultipleContains() if (restriction.isContains()) { Contains contains = (Contains) restriction; - numberOfContains += (contains.numberOfValues() + contains.numberOfKeys()); + numberOfContains += (contains.numberOfValues() + contains.numberOfKeys() + contains.numberOfEntries()); } } return numberOfContains > 1; diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateIndexStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateIndexStatement.java index ac19f5cfb08f..ee08acaf1722 100644 --- a/src/java/org/apache/cassandra/cql3/statements/CreateIndexStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/CreateIndexStatement.java @@ -80,34 +80,28 @@ public void validate(ClientState state) throws RequestValidationException boolean isMap = cd.type instanceof MapType; boolean isFrozenCollection = cd.type.isCollection() && !cd.type.isMultiCell(); - if (target.isCollectionKeys) - { - if (!isMap) - throw new InvalidRequestException("Cannot create index on keys of column " + target + " with non-map type"); - if (!cd.type.isMultiCell()) - throw new InvalidRequestException("Cannot create index on keys of frozen column " + target); - } - else if (target.isFullCollection) + + if (isFrozenCollection) { - if (!isFrozenCollection) - throw new InvalidRequestException("full() indexes can only be created on frozen collections"); + validateForFrozenCollection(target); } - else if (isFrozenCollection) + else { - throw new InvalidRequestException("Frozen collections currently only support full-collection indexes. " + - "For example, 'CREATE INDEX ON
    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

    fOerT@S=kO8X`yDFP-zxRH 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 literal 0 HcmV?d00001 diff --git a/lib/sigar-bin/libsigar-amd64-solaris.so b/lib/sigar-bin/libsigar-amd64-solaris.so new file mode 100644 index 0000000000000000000000000000000000000000..6396482a43189413883fcc6035a9a8693e773aad GIT binary patch literal 251360 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

    nDY8GqdGg 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 E9}C;`*Z=?k literal 0 HcmV?d00001 diff --git a/lib/sigar-bin/libsigar-ia64-hpux-11.sl b/lib/sigar-bin/libsigar-ia64-hpux-11.sl new file mode 100644 index 0000000000000000000000000000000000000000..d92ea4a96a0ce5dacf76e06836fada149e80524d GIT binary patch literal 577452 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

    = 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 literal 0 HcmV?d00001 diff --git a/lib/sigar-bin/libsigar-ia64-linux.so b/lib/sigar-bin/libsigar-ia64-linux.so new file mode 100644 index 0000000000000000000000000000000000000000..2bd2fc8e323f9b54552092a8529c260ad12c1af5 GIT binary patch literal 494929 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 z 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�~ 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 literal 0 HcmV?d00001 diff --git a/lib/sigar-bin/libsigar-ppc-aix-5.so b/lib/sigar-bin/libsigar-ppc-aix-5.so new file mode 100644 index 0000000000000000000000000000000000000000..7d4b5199210e2975902b81c5d768f77e434bc902 GIT binary patch literal 400925 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⪙VAy5t{)H_elOOIbpYa~P&a+C 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Ǻ@a_v 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 C9;8kH literal 0 HcmV?d00001 diff --git a/lib/sigar-bin/libsigar-ppc-linux.so b/lib/sigar-bin/libsigar-ppc-linux.so new file mode 100644 index 0000000000000000000000000000000000000000..4394b1b00f95e561ee30e38ea3bfbb5c92039105 GIT binary patch literal 258547 zcmdSC4_sVVng4(8ok=rkX+vAukc1|aX3~&kl8}^EYH=l&)~Tfx8|>nW0%b_RPJqIY zOxkHO1nT07N*i?1(n=L8tys~bQj3-DqM}8`6%{S+(iL~(n%yOpDz&uvex7rlGjj)K za*5yX>-T#7ZhLdz=bY!BKhJs2bIv_;hdF+8!7YYqi0I)EX<$TrwiwrJ;ka)|rezDa zSRpdSMvkJJj!scDBgBKbNMFh6rf_((gp*GphLJ|+1vs7l z;O`1?e_8YtvP>%1$?5OGHPIpO7s6bH(;Y8hd=Aa}ILGDT`V;1Lh;PREGKcl$Lx{VR z1G{j&4&g81`T-SZUWhB&MTc>Xx?2A=-ewIcHikLwNxojjSGwF|;U|#iIKtoHxL+ci zjq{y2-;R^-GY+V9;~1`AWUj|`JI*UrnEo{{$36M6u=ohV1F^7City7oLpc8(@z3E( zy8aaIT?789k~I$Finbd6i}N(npgZvj82UDD2LChSQo&U?+i*fx)ECBwaZN{hEBF&Q z=Wuo-{0}&P1^xxj6F84U?jl@C_8)Qm4$cOgL7Ze+e}j_`Mqe5);H*ZV3s>rc-;$&{jMccl zfwP1oEEi)R0?@m$fb)OAl!rc`TS0C94bB>z@5A{+orvpyy z)${KWcNNYJ;Qv7UW}LTyDUW9mPl~w~=iedxJ)FHbGjQI8IP1}kxSvCQZ7kCG33I>_ zHw(Tm7S?3I2Iw%*HZh9xDGJ3O#x&9&!HIUt<3^N6Hu0tknhsoluh{s8x+eP9T#q~+ zLdr{=3OlC5_%qJEip8Y5npdi;LAH~N@?ZnThge2mIuW-EX&5iYQI32J*Gmz;8z<#O zww9^VjIAtVxfrJ`0iaQUf6y=D7?{f4sM5`g5&kt!^oKlPPjr}6)_WBj-&I%P;qbdT z{4vO^0q@53aZW?u7`JkIGhcBrzJ-5i%zPGS6;2u_+i-`qmpV@kO6f!?RL=Vny zf?@0OxD))ZpwDyoEeOAc`d^0dILARx##x-`1H-H0j5|0jpTm^rCY=9)un*UAoX@cg zF2*bP=N-6`-k$}d&f+)V6rBHn6KUdUoO~F+MBE=$!1x2MpG2L~bSlT!LWbJIhf%4( z_!(a}ApJTp`3W2bY*Sv3;NSnnxdmqg@gK$cHJn8_Cvdjo{4~-kaQ+S_4g=%Mc#mRp z1+E{&345l)_!D3M3D^6XM-jgc{3BdjRh)nw&|$zP#6g^-_XiQa9@j;OQK%ve>X*=> z!~{WOEh0}LFS1cS46cj0QpZ@Xq`Uvd`C}DlQa`+IN&o*dy8jOW{eWnlcX_!m?KRb9FCoOL?QjRB0{ePSAPGq-eY>TEvMPwozTogyaw{qM` zT+47i&f)j-l`fyLuoc7Bz%to?4mmw{SVd?~7_>$#Vwzj%=uj6yzKM<()J6XLJoD#p z{Q}PYIKR$u`toi7`#l{c$gliYG_(|^IjR!Z!%LHw#H25YiAAiBVU!LoWxNfxyEaGPug{{FB4ty8aHk9YanTiuZ zafbfEQKT;Pud##q-*KH|))$?o!*qQB=c^nsi|ZK9-y)wCII(7lJN|^Y?TEP@SDI_| zL382aW3k^Jz&#}~A;V)~UY8j6BJMkoyF8Yr$+!sdf1^XVmNU;=;s`%&3DbHAhjE{} zM*sab=q|+HfNL+u{%tf>K{nE_RA{8(`X!vV;hf;O2a!(mB^{`@VdC7ag5tw`J%H;& z%yjv+g{}BD6)+w{9*=_e;Cc(kZDGMb^VNERj6wZ(R7D#1;QF#fU<&DE?;o|q{Sa{< z!I@}mv|HpfHUMsh{7IZX@M}2V1Ky|wz+Y8t?B^?$3;$+(1!tnMzQA%?=YK)?`;a|@ z^C_HJDqXynuUOX^pX7VK2!0ahO$h%0SF+axhw&29!bo@o*DojmqYPY(^Zgv|0_(9& zQ5z8M#}(@j<60#ne#+NHm(R*NVqm*eg4~M{2(OZ1^OZWfB77l-+c|uZ4Ab5T4y31W znCeR5i)C2u$;dGI8|73uAK* zqzhGe%U6W?rHq(-+NXv2$s)+Ns`P6; z-UUbS$Pc@6w5fDQ6&_!38X*;4iLw6YPNWy9us2VbXPn3{SA{Qls}O$(;@N=H*N22z z(vSOxRr-}@P(Nxf)ff7^^jE^H>Or_gg;#zG+XjAg0@v@-d|~=gKf(83^d`1;+}MhX zDEVFgg7T-3o~FXpb}ehbx=K_A^L-wJu^Z;uM^x*K7#muwYw*Me~vR347B z|HQVE7hz7{`b%LB)FGiu$*=i?6cb`n$?qsZ`2&c{Q|T){k1a5&U#kkQdMoTBD;9P- z@R)fT`Llk#8MuEQ={~;yn{bKd^Jc0HHknUCCbs2c18$p=MTQh-2&{GH(sPqdvgz-(( zSNK&pvsswm%tUxWg|E04+ec*x_o?vCSCD@f!bK{4@t?2_Re~_zzv4P!dQhJfwzsPu z6=o^vt5?bI=z%`Q5YANL)OTZxDjVTp72fhbVfIq`yb9AE-j^)(O@+OFF9q#o{cpWj zn9meKp6mi*$ZhQpWYSf=&N*;?F+IPlrsW^){A!QA=7o5ny zOr@`W1CR7ANapr?JJ5bN!fus*WsWd^Na+z3zVP?hhD=4cP=(jt2&RMX$FcfpVf=m$ z_Rj6!UIu-T{tA@*PB-$W_V`qI8^*&d#)r0t3x6$)$B@5qN~K@q$M#G<(pmp$Ul+zP z*q1JUeJ;kg7h#W*zh+99{WA#nsBi}A`yAzn#N!t|s6bbY*#Ka+#7OUYk?@+&;B z*DMZSj&0onq;vV}pzqJ2zZ_h@74Q#}bqG%>c_;k$9bw4lsBk*`_Ixq?{uPkAHrO}lsrtEWe9VBMAvUExF5%b7pZMKliQm%Eu*ndtI|_w{-wkWlHY;a^q$Cg~T)_5kuL18{qHjX>XI zzwGbLJJ8i=zZg>Y@45u(WFOpLt~Z3az8hgGANgNaf^GaD^vn5OR3OZ(S?GuFPrno& z`;0<X&n#4ytS+MU3Rll_@SkIIpo!h$;_n(2iX#3dVLVg_xvwmIZ-z!E? zpE7m-Hnj#6CiN$d&89FPr~aQ;>Dy;Ohwm^#&e zf$R4@VRV(DyfziS4C}pME5bu6oB{teFa!A_72eV!%qOXS#VYK@d^vF7dkevXgfBeMmBdzAcUjK3Zi^3PP^Z5Us(X-H>#r_UIkBK@?pJm&Myhhpj5J&?~w zI9;V*1%LfKg}J?JP!~E357Ke0{-H3c$bJWuya)5$7y1wmtMDp}hdTxl=JvYZAAypTSFIMtCREiV{h@y|of!WqNN4+_XFT;hhji4_ z-Gekb1`)=Qegmq8{?pGlJK9kG2okbXehxghe{}}+iAFf;9D$K791Gs+c;GerEk^40_ohoG@md}Lf!}{`HhG1DgfC7=f9&9@}rPvd)W9Etgi|YPF3=|ilEOygt`26 z9|z+wCXkNff~^?p)W2N+jo6Ej2k8&TwpQd%{ZXLu+wcJyEnK}Sef=(clr)9*7OM1J zu#YoTpG+0b_&Mx-9^qmYzU(MI8mmIMO@%M6$47%yzZt&27x#}N%`q}nQVSZ;0;VC7*3jSbCKic2U<<~)e z80lFmd@06H4T8G^K@&y1ce^Uhg*@>`E-R~F?W*~xaoeE$0 z3>b&uLKw%|&GHiUPu>Ew&xJU)Z*MWeDG0N^ulSrW$v+$UD!+}tE|O8-K=OzTf>-6*jqkyE0Hd=|i{YMm!oq6)Rd*evSgX z$}x;|E^kdc)^mdhvp$^P#{BC+cu2`-!v3FibNf-Bo$o^a7_ZvjZO8bYEkc;eNBYJ6 zc>SRpluW#Jzx4X?7Ic^D^&8%4-2!(jr0~3-j4A&8$_7( zdC6yl=_7rQs`L#{f^j$~9mkqsc~SlZxb|**blV1)Q1WZFeWb#^a9nY@FsIPoRYIj- zh4t-_6A5gOtF!RDOzmU)zY_knr3_)Wl3$kvri06u?*+*SWq%GQ^gD_O?*D6GuTN9^ zY5YN7S7Lqp;Q@q8RG8iy`cfCdY|rZ)U^+Pe)F*}U-5!MfO5W|2slqjhFpf1JM0sRC zd7S=tGCDf{Z2Simb~u&17xsRJ+Q9w4>p%7WW2$`q_k3TNUvwiqtn%C5j{XQB%>B7> zE$o$=%JoV4B-W2Ugu9fy3*+mC1@sT=Ya7a&g}(K8Nk0b0Va%xdxM44!DL}YK-GA}> zjG`s?oi|~j_-$uHjqYPmj>!$F0 zQ3%La={u%TziEWiRCxVu!YuDY_%x@(-_K4WoT0)O+>O_R&|fCyhyJ`A^T~Z^pI$Fr zis!|eV#sHz^o?bBMW+Peb`{>)4N=`u3{yO}`iBqnQZ%RCw(LU>wdA zgmG;An!G4|0C!^jafaH+`p(=h%x|QlKHR@M&>yqINGE$jeJ^~#kE*3Z-H4uI*P{-Wa}cz&n$wW|C)ufu-25FSwB?LL%G`lkA$ ze0)}6{M#(93!I*UbZS4>e}@<0ZiHQ&K8A1v;Y%V z%>A>$3&s&$Z({zNbt58I-GA|Kgn2#e)4}p?^_hh72M}{pTj=nr`nWSxP>xTaS%>Gn zPQbLvZ{2=QuTt_GX!8b#qeO*wq@jG0=l;JK`zia;zeYgapMm-2>r^JmqdzYD0oI2_ z2zRJ(`XgXEsQoy0?t*?OJzu4--z1||{)A*ZI83ivsJN-GDeO}BZ%BdvBAH@!|K%9p zZ9S-Oj|!(Bmg2(fR`ToQ;sRe0@oyr$_!I{TwFn2-Lx z4Cy-j3ifZZ5$68#()uwCVb1R&H}+qllNBi{zwMK-hZdxJRQQ6g;iK#l%-1<8?AnBn zo;zaCQ|o_+`I_?M`do9NFu$CF`f&fH!+&=4B0Zq)-}o$;jtIgyc1_36Co6u3{U_>w z>R+@MW7OG*@u2sc^=HDm|91URIG;$TbTuFC#Qbxn4#7-y|Aqjip*}R8aO|i;`vw8I zD*ft@3X`5MjeZr*cmn%3r;*O}Px}?!g@g1(2d~e}F%`bRz-v?(gN`C~zngSN$Batf z-i7k0KCHjAugFv=P^~XKHQ0Y5`(b<9Q3!czZ@$WJ-4T{=Q~9lgJvj5>?gmu43E8J< zd~$u=X#Zg+!t*M9^_5tKlk$%N6UKbDJ{t*@4F^~LD zA)KPZ+d~NZ5$5(gZ^8PX%Fj{h8{A+zJP6~s4EA*-574R7(_1MP2iXsfomkJGDF)=J z^c|;>{|v&Z9PUSW9AU~2^>eHS(?RJtR=f+3VukP{Q!MX>d>0b9zL#Ua!JIH^SVXD>H@hee|EnVb{gN49p_EPL;P|4onBt7su6@{~z<9eDc3&|J7*U zqjgAN`-;9RKdI!M@b_brs6W@&oWS#SH{^AFu>L-S{@424J`8pzFB@d1QS zsqltMFddXmmrTen0J#6xft~amvFj|4rBH-#&H!wk$k9hmaIf^4>7& zla4Uk@0M-&ybS%R$J@#u3-djcKiB_?MqxCiAWZp@K3>FBGmY>(m!D^O{=5?P%|`x6 z*7mjS8VcZ;RQ1`gRR!hq3UGTm+Ls5&Q2DKUJ6^%0_D-pA2KLuz3NTpz8?avd@esn@ zD*eK5;nf%~1ZGrtR}RYWM>tP~*Zv!r4r)IR*Q3J7n1DU>sC3s&!t_x%ONE^u#Ooco zu=7q8zT%89$7uZdRrrF(@Cr#P3*>Y8d%x<7wk z={xrAr*z<6&7~Ega*`+yRNq%AO5b(3^v=qI)eXVQ`kMmf4GonI;_#u0+L~Z}ZJ_i> zeR*A7WqoORU3KZf%3zX|hN{M(zxGItI8a|%Dg1$oKy5>%XbAc%>+6%;f(ix&a;&U5 zEDn_i0<{(5Q01Wp6yXol)>YP^Nw~SDwiGGl!Rp!?#5Wv0Bo5ToSJwm&hyzFJtAmx| zU3c7C`tF*7+HybRdusv|XsA9|UJrfLBa_;C@gWsPd8LwcL;%e$l~rL08By*>Zsmu| zOKa;7mR21_`>QL|eWm+lz6WaS50wY^lloM~DgrWyIp>|I!5wJM;mW%z>l>(5>i)wj zBvrh;``^)69q{LulM2pN(`b47D-PXRdAM4ZdCohe@>Q)Qo>RC+w&f<(-BLBG>(6-; z>Qq>*yQr?(Z{O;BssjPmR9$^-MX3zim4U9hqw$cogzAGejfZ4Os%SQeGEdZi9?Ten%k;v1o}^Nb^+2lKfUu?Ea&0xQ7zdSE{!` zrrKAVDsg)y?AmIXvJP;j=TcTtRefc-e@Q0=Wpt@cUs0(`En60AXWDmE25+swOmm>T zqVlHNngi7bEYlwuZ=63JC5^E*(RC=-fJek1gMYt7;tp>~vh?i-h=+eXtd z!%i>`wPBxg9Kw$zuoH45wq{*avB;`}6p>sj*6vx_!||PC*VSYtH`Q0dy)QA&3K^Ze z8g%O|iEcb_&dEZTct`nSXDw}0mRcjz&Rz79VWDofbztmo6F4yKZ_nw#sQRSzMGj0B zPRd67x$Av%DABEz6r21;Op{nCK_KRp3a~0ts}!E=tUgJukSISjk1k2_S7I)$J&M&| zJ^oKNH{MxzQ)wN|xGI2aPS>r=0L6&RReV&b6N678}i?1RISa=UW2hsyA*uAaTE1+p4ai++q{#0V!&`{*CrMa>uM)Q&~Yz zWQ!_~$(j=qwP10oeKX|zLw=9-OEsrpXf zfTai;AC)!HXM<(-Cb|CV3Norg+8$)RIJ(qs+KE#vHLeJcol82-qQoH5&t+;$G9-1L zGe^?xIkSvv?{BNDp7cl+9@3#SOP55WYUsOJpXSU7u380TuUH9Ppv zL)8uRxZ4n?MoX@6rdoub|CXCMJc#aPOMY-4=hR=UdU8QjP+fD6b{#t6aRY}E9;MzVhg9DO6!oay4Mn& zM2$(Z!qSrF;|95wk}@hUjz7Q5v}%{+rW4LDJM8rNx!p@ENQtFnK+sAuubHIHbZg=a zY3HxHCRuik!RkQiJ1c{M>Kb%i14j5!L8GXqc3F48H`1M4a>7t)W$l4wGg@Q<%SFd?f+t% zLC{taZ8y~8R#Y!o+Za&O0X{+ya>JLTRKc-~4%XLd161Yvv7ggeqh~Fu&R*nZy)Qu= zsuF#;Kt1FK1(uRjnk*?;4i;FFA)_GsgVo~26b%k?%f zRiHF(^GymgHdJa=(ox9zL!JrDX8mt_?aW^eVwTwv&tmrdDw3$mItyx$$Y{-aX+b3~_ z#wS@yq=cn)jK*3d$y%jkd}^5U-8lB0cGb0 zU{Z2ikXw+(j0k`2q4Me)9jccfA_>?w+I2uQ)K=Vs@mO735!BNH)ikCulEQ{PoWr4V zte?qdamL&ZCWvU5+J~^REa|&yXwo}S*N9pjI1p%Ts3PGyOhxi~q!Awk%KH!2AC%a@ zPDo`TM;m`uNcSBIDc%uMaFW0Kz)sM z!##rh9t@~5cnF`HV0uL%il83M-yEy7NN)S^0Z6Os_1TyPq%W5g(8v=$B4slgD&^XR zygMe<*gB@6(O-)f33wi_lQvkVtnc0idOl6E3_E=2NI7QEyKbk;yYK!Gwv*64ybo}0 z`J2=RQ(-ygYj|^1GWn<9TtxgW+TEYK7*#D=Ov1k}tCYAq{)$5I5haEeZJya^Ag-Y5 z25ueJCg;ymT8IxkDs1JK+q0$1 z?a$Kl=tVsCF2C>eq+{PC=u17LVApFu?dC1(mOCpC)duOqSl+$0?;>)u>XnFP72vDH zTS<3gv@T1!sJ1rHP*C0w+=or(!^>Er*v7hI1g#$U09EgJt~%)JH27Hj7kJ+lYV9s9qHJ*qq*14ca=6Y;?W3u zO}2u{S(BUb@2@GZYpAMSM(*mS{K^C6c#dBFZS~les1Fv^p3fbJY7bZ9V=jHmG6ou! z5?b26`P7%m_da53hup2p&}KvV;mZBcPG!yV6p5!pd;-FL#J;vl953xuEOSDFC#C{! zwYbh;1q_HjA`q1!EFXduXqpVF)eb^(lMzBks{MH8jgQ7|4PIKTs4A~HhiXNmgqYP`r8sJ^>mS3~Wt>qRLk1+O5M?!n3_%GX)gD)Sage2#^0i1FSm z3-7V;UJGAqVN1DtE#>aDl)Kkb?p{l|doAT&Ybp0yF883NU6MI}$(+Ar&R;U;FPZZv z*6osP$$u}mOU84%By+nYTguh#lJS;ub-QG|rCi-Eil=tL#RPSKMH%@=8SRQP@{cmw z6=meFnc5X)Oa9cZXgt~#Wwa~GmU5|G(RfR_)UIf}rCe&4j@Rv?Hj*7uykyQ_GUqRu z^Owx|OXmEEb-N^UyCieFBy+nYTgoLn)OFD9k}{TZb-QG|rCi-Eir4K@{Z$%@wRq2U zaiQzuLT`x+<-~< z)`j%2Ct98iMaz?+Xn8UeEl-A`<;hUAJPO6yE<LveN48&{WD+ofb& zU1DvQX>oOlwVl#b+bjL$!E!u|-i_CB@oOLlHwHO>s#RX{}%U`^{$wt>LE(I0DpUhzMD_q1rn>OH#Xq165r>f?^2~AT#qYc zb~`D2adkC)-EjrNBv0YXaYfqhbsWamflzm`8{b8f=_Ch>*o`l^;ZT1=^-AGbkp`wR znCZJxk~8pkRb7^Nx}Rh`h^Oy=X?8Q?_j5MU_mC)_IEy(KoWo4_<}nw5>3c~eUji;< zt^yY`hrngbE#N8(*D<#vK4jqtb0^|kE!@uBjrdLrcQf}QzSqM2%>9TTWF7(!Gmn5r zna9D?lAR|C!KV~^XTkJctt*AoI|rUsjK62=+%&JaaTrYBSG!V}f9?~`tEqp%^G>i! z$$00%^c^~qnFgmaqdr%sNfwX0!09S}-VM%RhCcBfM3rY7nCyY_r+YJ*QJ<^nJ8+19 zjqc52_JXsS%fLCzbzpqQP09zsdCZi5K65wN#|+(GUBKK2E@bWp7cq~5izPcQruvj{ z{5ZIbc@pero&r}f&wvBWbZ;Fq=`E-je`e5mb%>dC6=qHaN0>9fEzBNpE3+5e#+(Cg zXU+$AFc*S5nM=T3%zkh;a{%1K90K<;w}AVY+ra(I9pC|G(&r#^A9#qF`f-?f3_QY2 z`WaDh0JN-B4+4+b1^gY zzqy1t6I{le1@<%NfUB5ECjsVsa2<02ILKTC4l$R2!_4T5%@Jnmixy_;i&o|qa2qq} zyq%eJ-oe}h?qnvNcQFruyP1c;JbPfEZEIF52nIU z)|)PHCNu2N<7IY(vzWc$Y{`yPwAYiv@wwn!=6rA-a{)M?8T$12n9INg%yr;GX6VyX z#M}lhW^M*b4F_V6R%%{O2X3|4g@mVK0!khwbVJ4ll zGLuf)m|<6*cIGT_2XhX%lbLkV#asyPW-bBuFjs+lnMo&o%pq_;GwFPQnRGJ9Ogb52 zCY=m34}wRSN5G@Zq?0k`3Gg^G>1Tp@20Y13x|(7pT}?}N;9sX_hS>=|#Y}oT&72CJ zWzGQ4F_YfrnZ4iz<^ti|0)$OEL=o7@3|(z;F+*2dQka9_ROT=^jX45NXYK}PFb{#< z%+Sde5A!HElNmbM;$@x&XED!$vlSa?`<5K$bZ{=S2b{;81I}lrcKMhK!3C0y!hCR{ z;yck_TZ&nx4P3&EKHXBr+z<9MlYA93wJX3(?W$uQ0|%L@T_NTvaF}@k98qk#z%9(w zu2yDhR~vISxScr<+`(K1?qse5cQLnsyO}${JTA2YSLpLrNOp!m{u@F2%i ze+@BHTZR>{o(GR8hJiY_j7m0+kjxmzXM!h~i@}qM*Aq`kcAh8#PqPfQWrjHnJ|)>` z8Umk|?A)CLo@JRH@SKuqp|;O+JjpLGqyE%z-i1G z;B;mWID^>>b~9&#J&GN$hifvKC%|6jDR36c=Yq4D^T9dH1>jufB5)pa2{@nG5B4z! zzy-`fa3OOTT%_1B11@Gh4K87s7I2y371Ln9;tQbXYpN8lq&x#GGYPI^8OlG%O!Wcy93Gkrem0s`=$4`NWIX)je!khvgReZr5cucZ$cOiJ3Wvajv98Wx{;$3y% zDVCx7Pjh@8ct&wbF8CD3ldeuPQ$DlI-QYRqVemZjD0qRnUpTh{$QVepXv@}2$qpCnYO7bpkNCh@ zDt=WOI9sxL7WLnn!|@()E^`hzPqK4&2RNVOsXjjDB5(mSbi1{X*$*yaj)035UxWfp% z6X4T|U3uVH#g|b3&M{Nl=a~z@3(Szu1d{zI* zU>|cgxPZ9>T*%xCE@DPMW)?G3ol6w2P6d}qmSZr}&+*juD#a_&cbNgjsp!+pI*WXe z<4GpOO!WyfQ~e{%)W#O(esC)@Y#_6Znd;WA7+b2&%ns%ha3^y*xQp2X?q>Fadzf>; zz07&wKIQ^&KXWm7fEl)wImjFY4>6P8h85$_VL3BLm`OjQEYkuWVB zPjY-Oc#3%tJgr#fKf_G}Ht|*rV8mHg3!0c<6AOmpKB?Vr~UzGq;0t zn7hEa%yr;A#aFt)`5fN^_HleVxIpm*6W~IYfxT@jVx9vRGxvi_6kksFmMLCIb?`HH zf~yo?=>i87U!DuDV}>nl3n~^F;E-hV&0=tvWlF#i=4o&Xa{%1R90s>BlYZKnhru1p zW8h9^YGW5O>9Cvm6u5_Z9^9*V74>zW;fz|+j9!83}l5a3hHY2ed}FK7YJa(otej+x4u zXD$FQFc%5ub|BgR6;)s-a}exeMxNVKB%AL;J-4TFJZxZl8gnl=UCF#3y4s$>@q=JD z^C;NEjK1EUDcPA-2KI71`el2TWb=b{;B1zG9=7KwnJcN>TxQBAkD2826|bQ@eH>5s z7AQ^+g9{}~e~!OTF5AAQ74gL^LtMh#0WM?i0{fY%Emh3J-~jUwxQ-e9wLK`=3{QeX zijSp(!%Ai?`el2BS%6!ZbHJ_41K>91HgG#L>7j$!2kun7W(3?N**rvg=w=zxPmg5h zo_26A#}|Y9n5ixOir1xq2blA~gDf)-9+K?b69Nx2yTBvNRPHD<)oo0&V=eW?ILEue z6DodPA9zx-*+li3Qt_^F@HER%yJncDz^9n0tkcXb;92H5@SNiHRMxy?^EJ}L0>^uV za|aOiZ@vcI?r<`9gI&zM;1p)mb4Mz3KR8XYV|_L_ojC`bA=%l8dhT#@d>+`N;tvaO zCdWfRJG?5s5$)ZP#XJqpR(w5lvLi?F=Of@;mKg=-aXf5qN4{hStvPr2SO$M1cSiy9 zE8s%rGvFe{pU(#ubNnfAiQ?;B>*aL3i_!)33$HNYHv@xfH+nF=K9g6RAfjbp9PJ+7>pXdR1bNmFjhj|{{ z%e(;YQ+zlR+^_h0KX`y;PJ;)Td%;7J%@;et!z%u;8$2S}vAzpDs^UMF4<6(AQSdl3 zwS7Xe^hG-+RXjbj?3j}5Je&faR{Vtl@Cq!rDD!y?JJg@jJ zl3!r?RD9M8B>%r2w&!&!-iS7OT}q~L7M!BuGf*FIs$yE_c+(WS^T6qfY45_D!SOz@ zo4F9|vB+d{d@oP;^>?2FtNNR-vRZsJkez2;K`3m&8Q-b1S%rxd&Xvj5h8HFr$sTLd?+Tt`^0AN(Hww zL!Z04nDfEC%q8FfX0&nFFf)}q#@q#-U>*WbGEai1nW@|v#eYr%&oWcF3(V-p-7aR7 zyE}~;?cMEWhHiJ~D4s`O>}H+J)4h2dUkJ`;E(Wu%=F7kZ98X**+2KTA>{dE-I8TF% zIerdY!n^=3Q@p|n_A|pyc2_B0*$q}YcdQ%$*Ks^_vOCB;3RZpLaAktS96te$Frz-$ zlak}wg*IlX`a4``qx}2o81F8$F^lW(LL0MG{mnPqz+8V9+L*=lcU6JQRGzCzp6kDw zWVp_&q30~F^Xf2|>$w^_&*FNn?gY1RK7HU;=0R{f^EkMJc?#Uc41H#GGee(Qy^2%Q zzrpg9OVuR_gQ$v!c#H6E=7nNIiKr17A_LT-8w#C;T8*bS$M$0 zGeW#o-@6dw>(eakjdA0UFf))weR?>E-}ShH8ST14a|?d2O>-N5YeX~JdzI!c{AQu% z9{dc2X6Rvy<^dtD(L99T+|)dRpNY^shWDE_PvCcBG*96-A2g$lJ2juiyULp9gxITj zL5S;^k2vu&6Pi=dcFk$fx#kS~bckk;5bx0J72+n%*+Sf`Iai2xYR(tpHq8b2i6PBJ zLfo#oM2L55_6u>R=711Inu9{TPjeVQxuLm5h!1FP6XJuKJA}AfbC(bmntOz()Z8b; zLCpg~RB0Z0ra4WBtCdB`0?hxV?&0RwLQFD(FuWIhYPnu{R5aM;sLqfcv zc?3RL^Oz84HBSh`&^#p!Q#0l!r{>ebSfP1N7#C@#Ig9x|Cw{w2bBZu7)0`%ZD>P@| z_wF@>105<~Z$d@5>g(dL5rD4DEaG%NK_Bz4sLe!>whCgt19;i7+;6_6tM%=lcS} z*s9}$!pPJd7KZl2_qE_>&~$toen&}jhcI?&?h?js%{{`%(%dJEJ(>rEu~+kuFtRm| z2;(}SpC=6qq?sks0@!K=AQ81L0wB8=(xS zH3x)IqB$rG?c47U3!_ZOw_twP+$M}l%^kw1(%dDC4{7efZ*6Ms6UM!o2ZT|tc?iGv zqj^La+E?E{hTnbH@e}yXOwCjHy)Df%!q7e(zjFtkq&JB6WrayUg8 zA7`0xnlL`0IYSujnmxjJNV8WM4{OdAhW6p%Tw!Qm9nQyZ@oAX?{3NO7BK(Y{<`S%3 zHT#9pr8$7#N!A<`#$%ep_xK9{Q==cHr zrl95_VLYXI1iyW#c}y5jYn~8>o;$)*_^CV{KO>B>jNk0j^TGoQ z!d%7i$M9QR7ivxs=Ea)v8=#kH&JgCMnmxk2T(ei0dX6}T-#pWE#IaobKDn03$8R}n zE)eE=%|*i8D7j*rxr2)QQ<3J1RO5%o98*V|-;AW7zG*qDg!6$a#}n-v zg`l#V-i{R_WOjd)?ms(2`Q_j{lAXwt>P2;GMw!;OQTwTGvL2A3I&)jx!f8Yj)!SO< z$gxOj1g{RW9@0_gv_v}5`p|jXlpEE#RbO%CqOR0F%8&9U-DrKI&XM*e==O1u+Wvw_ zYkyg!KV*oEhc*fKL;Hj$@590~xk+SB?h{#)REt( zaz4CIq(59PG9GRc?uTC%UhFVro!lg{Pwo>rC(A|dN$BC^<0Ai|CX5Hi&wo$t$#R@M zd#rnHD%CZDdb4d7?EVzB(da__u+Q;}-{eG~uWm8iejGn$c;9-o_1BLd`{!puh&P(Q zLw5Vi7f2WF4@iBK;GP>I6;cmHO(^dK>PCHe0`+?!(&RpYI-WrNPoO;~P}gSEwHbA7 zMqQgx*JjkU8FhvJe6Z;P^nD@q)rmJ@k87g#*m7+CxzH|*_7le zP$UEQt@-B=>moJpVd!^5B%>Yi;q}A2jvsxA)6RCwF-W>YI*rYy9irnn>;vP|wfmDY zzlhHCzq_7ikY{b3B1EMfidBp*teZO-*lu?)>XR#~=J{2y!{cKmUgi$xs@`iU<9jivE^< z8GW9P^4)T5I^KZYNFVmsl<)k%FMpvEI-0hON7epv>DxWwM>dBrrqaSs?vP_L{Ouhf zjK_@dakLd|?F7gY< zfBQQ1mmqy=9UbraLns`^xW8YxU^Aa2xo{=QXkmTg9xW^NiTaUFrT;|zNT(P_8CtI> z+k}mFP(CQjrOSd%=(rS1TqN>{=%(?3I_By+B0c+j%H*<~I$voQRQ|t4(#STNwwZad zjn79?Ne4Rb__mt)OVV&J#UbA!eGlc=e!u8Ody0hPFB9isLt(28FSeh^^O5wXZAOUf z7xm82dD{oe;T^9??bN-DF#j33u4x z2%-NIt_5y8`-Yrrkk1tPgWJw7Y$N+bcuY86lXDK)dfYhIcK+NB>o`|Bf_;(glMYBv zf6FnC`3r6LP`jZ^Pqf__qso>= zi?osFBblTh*os%nfV0C#$=)G@@e4g=S?xvI66RPQ+jYmcycjz99Q*?NO!DD6uaoZ= z7`u*k*t%1vQyO%b9j*}Lm{Ze=DptRVc{RNm^_Tttb%(F@z$auvCt2iY_4uIvBwt12 zkoxOb<-B2d^ zC#sw7W7uIg)d_VeyiwU%QF!FqkhHVU?~wBd>gPw@ihYjpAL;rjoyF>ivi$Iag=lY) zY&+ypM%m&vQ@+$rYO~MrquVLJNHf;)i`qS zwJ&V*!Z;4!zdnR@K@asWwUfrH>~FN2<}9CM>{Y5e))TbW>w#XsP5M0k1&q&%mqNFl zef{N}2WbBJ$)hwM$@Nni?0tnprng^(iS99xDeGc0|412>OLLO!7nUd8k`3H;cD_xI zPpn_l!=FK2VZW%mn`{&7+B6z}=(9}J-HY~Q-*)yd&!UY-(MIwCJv3LIe1z6RKlvo) zFDH#TUgM4F`3&{#J%0S9(2d<G>&4oZF*nh=(up$ejT{##xK`^t@*-!4NpFaIFXeMQ|7RiS75?@wpFY0%Me@_x zG(Kr;vJNs}tI@Fu-FWr*q_QawYuWJIzC`i5ZK!i5WJXz!i~Qwl9}8DQSJc-^U$j1S zo&3Gj*9XEMLcdnOSx3((59IGxbIKwg8nt=qL-=9zPfGap8`XN~H`j*HZ!WSmJ+5v$ z``X&${+B}3M>MX`M;Rwyr}D<$E8{EG+?IDjc%^;d{$|RPo&k}M9(UGt%o01|d$hc= zr9b6qTMGAJeWvYbXh(?bCg*YZug&mtuqTYE9}Z)-I$=U^Pk zaY6Gg^he_Zc0_f~rv8?Fh%#ioktg}txW2@i2j%o?8(Qvt@QHGchEDU?C+1VV!p)mQ z)Gk_Eqdi5av(M-F;iu2x6N^ws`Ftho2zls9K3@sPnO?1{xOovaO1h$PXqg+sq)WM8 zg564ep}o8YmO3Qe$+au#4Enn5?4Pg5X@U;J>yM)Uiy~pz$O75G=%u7ntZC)?1~yRE zJS0+Jo37oD%5`VB={R(aJkTyDjisi0jN!S+>5$8sm_r9GRc!H;+?Y2STkat&mnot z|G89GlBKq^SIae+M>uA^tosP-K4f|JZ;8`8_AsR0HwnMgd$|aNKMfz*BbvgL=GL(!+Wb@67sz|q7~TCDT8kPpXkVJ@JJTK4cb*ri?*?_>MPA1Kmm$)qZt!Pm zQQ2FeJ1zSZ))nYy$fiR!!$#J{vTn$#wOR6fQ&=_=vTBW%TsD@7NI!V<&oHiMfAiPY zgT}beF>*9I#+?7G$5>i|G3F+_g8Z$rj*wk6#`1WK#p{vsggwFTLhTHj8EJARDxi&1TsUWWzSHIV>B2Y>SO-F3Yw;w#`O1 zk7e5-+hHS{&$6A6?Xr>ev1~VFdu(J2Shg3keIyH?KGBSEj(KE=*WtsMOGYr4jAAYs z!(1{>&(buGX)d_!?0@}yx%Vi)|9n%_@6(!2t*tVoU)rYjhk0#PNIt;lc>X=o??ZNx z-0 zBQ~fS!6qHWV0=@T{f~g z7TIna*<6ckkBw}eMYh*QHs2!KXCv#g$o6Yl8gIM~D4_iq;rOlIlX3GpV3OAXqgV&b zELsPQ@j76f*8vl}4wy>54mkB1uLDlUuLGWcfY$*FsFPc*1Du}d+-|=Ph&_MUuLF|F zCRzt1lTEY^NG7Y-0oJ)anXFz1Sl0~6WD~6elF24o2PBhCv<^rnn`j-7Og7OvAen5U zbwD!NMC*WLvWeCK$z&6)1Cq%mS_dSPO|%Y3CYxv-kW4nwIv|x(g7UyNgYF@g2PB-R&GSYJ%XuP^?+5$lU(-J{kQ z-;nRk$i0f#`a;c9@#~9X@-05c*UuzbUkogIu2gM|pM!jN8as*B28uvexy*q>Zd~eKBPtYh7PV+sIni z7c(}p*7e0H8(Hi6;%-P6V*BA3Pvexy*f{mN8Gx_5Out-8kFmnauMcz)kt_s?yI)& zzG@rqs|K*I8r#!|?yFAkq|Z6_oiKBEWnf?Rb?mF+v)X+Rn||qE@T|1Febuj>QTwW< zPwlIk{^sX|hxb*xz_=>dTnI&`X{zlN}jJ? z|HRfx$z}EWCl7T{&sfQ2_4>yL*#evTE?xg5&sVR13X!keU%@=rfqmTo_I2xcUpL76 zx*^P$VeIQhFjuxSCQ-x0Ob_g%yr^ftba#`(DV}3HZtoEr^-`CR2 zpI`BFLBh|lq_2|uj=%T-{M54UQGV&ERZ+hbdoEDxz<9spA^Y$-p8S>cOOTDFT{X)hF?5eIfmw8Vk94Ea15yk*w7(<=Mzu{ZhV-tkp01Y-Fu|slZ0o>X!;_WUYRw z$VS%Umm*O;P+zeBp!XN?Zs+(s`;Rx&Qb@ zCGSb)#`}*aZs0ws0@TUNpG^g$KEd99c%!oR{v(-eBL9(0Hj)2GCY#8AB$G|#Ka$BN z@*l}$6Zwy1vP=92##S=frE9X}vU*Kc2LJ45|C}seFYj$sK{j9`o5iwqkky|}CCfLP zWkZk++vJHM0--nWS8to!7q}2vz`Au1>((Kx zTZiNKc*Y-E?mfzv_q;8EFIUg$@xI(gW7X&Axj3;ek1XEfQEg1>%Olo3oH{UtVI9uho~2+sInhn2`w^S<4zT zV%>{LR9`i>%Q-k=-Cs#0t87Qf&f3%=D>k=Brfg)bdpwgiverGGQ#P{6_IMJtEzeTl z1)VRA3!Yc=@t$U`aQr~Ne~otz%XnVxwCtJm#LcUQi140Ci=0=>MO(O2zKhn*@1k|^ zo=F$)nS`;vZzcaE-vhyWxm2gy&iJ%twDQ)q>MZo{5JJA88od~+v!a~FJbcj7&Tt{3=S zv2NWr$@diAY@z;*y({)Z`VQ`2RS)IwACupolzR%akEPxjP~$M(-=|Z*`y7v5CF=;; zMQiu6xIG2kFO()PPA03zq;;GnlhtF=I)0PME?GCj&iz>X z_%OB#cfguEVO7@Y8%^kD(rheIR0sx?Yp1t zTYit4z7q}mE{e17O?YpgzDJGk9!vYiyYX_*AKyQIAmb+5Un(FwKZ)-p$GyK8-RmFS z2VY3E>^Ve75)4dvj#(G=7uKL2niLarUld z6U{-%WtZA}a@i&J4tp%p-_MpdZ1Wv$>FZ%Px1AmN!TH{+Y`XJM)TU|9CI5b($d~Ju zc$-coo%$S|a{W*9^CJJ=8t312n<>x4{yj(AQ&VDDt4-(H$XaaLvVVd4vYn>DP8Wn@ zSnq$vy<5xQ_m6+K))4)?&XUh5u*V_(Y-*U-StGp8lJDB$o&P@A^dQX@a-9{m*Y7^0 ze6!gWzs@oTq;FXEI_ooyYMo_v@@G>67>7P(NAa8 zk*p4SFT^@uC6m>AA=Y^?ku0q@Gih(ZvffN4=Vdv$-o!d7nVj4ML4NW(Dew~$SeN#} z&)_>w_`cUBF~I9m`R*y!r3v3VUHVzqKfbKirEk<}TTZ?%eWNITT{^t>udRpjTPMH1 z#BYU#FM;36rg7qPoP1E$af#nrG8ZcyCih#``8AQO)o)qn?L@K`ztz+h^>Ml%b8;f$UesSh&3Wd~mk(*U4q|JdgufX$$Zxe)zUL__cgqL&;|X z__gHE19A=Z+=J(PukuBo*cSCgG@q(9R6zn?lumu+bA0?Y>5Cw{Xbq+Reu4UYOShTw zOuUBbhn=2F*6ND}Y-FvzXwXL1;)|MwY-FvzD7t^z3_b9;qG#j+;rK?^xt<{sjH~$P z2zp+i??dBxg2z`rk1zQ=K{gaWww`;9pCkHdY#pzBDI}jGK8$yT@Eu8?;}ehav&1m! zTBydCh+k*vF_Y*Wptp*`^B7;rWS5LD*ymsQd@%Ur`QEE+yKU+I&wZjWfo-Rdo_vnB zWcxqypWSNxB)4trnqTQBUe;pUacllUwksF@P6Pe6QEfdoO|HdoRy^mG@qX6Bql z$B#XoD(vY5u%}ZOzo+x{7nXaEvhRPMgBBkK7Vvhluq$vRT$ zj`B?GyYr)dQ|lvM)?(jHBQ~;D-);TeDN!A)zI)6jU#ssPw~@83Bcq=sk2$+c6tv7ny8O`+ZoHJ!@Gn0L&*eCP8^`1=aCs`vDc%{&*%dE6)?JG|}ew;OHlbL#u3+?-G0@1Nnm^C;I9cYhQ9 z-og3ZpQ7*QdIwd#hrVr7@6<*2weo!r+T546=)Nw#?{=H}(ih#=&-Yznb6DeHjjY@YK)#cZog&$YfpOAg z%$$I&lTSPWdza7e7%$BjE6uR|W{j2QCQ~#&ZaSM^FkQ_rn<+V)%vAmP64|!4WwLFb zMPo3v|dZ>i>Ga5t-d(bM%LMJUwqm|*6NFAZDeI%O51(DY0gI0`b<9`oe#8~$LrVnOut|w>ydp-TnexykH_ z&JoeSne&yGc|8}P_1uk{)Za&-aqe?G_z*Ki=mz8RvWdBA;)b@BLAquj+3G64oF7PtJAZE6JDKgSn2{&)-F0 ze>T#LzG&WO;_o40KeF8HgYUw7OXdK47v5Vk@!pcT=)I*c{R%#3+4m{`a=eM^D*X%n zeG0YKlXKl7|3aVNmH8aU-y{1Lvhn`qgfq^+{2%7tKR&AKI`rM=%wP*FH{(=sWm|-q zi%5l$L4K8cM@S^2M!9cnXeu|N;FR1*wfq7Nc~9xXy>c?L&S-E7G5%Z$5kJ`oEZI20 z4$i|VZgB!wYH*4h+~USbaqToxOcF?(Ugy?+#W67VyY}8^=8QDbfSr3k?+-p=&RP4{ z+UxgPdmq_nk@M1LQTftWmgB49umSnfS6%`(AYc0OvZ#2!0r}EbQP8j9E6Lwc7ygx~ z;j1@K7@KTfjq#D@aSzqJ`U0D*W1hW(YF<=uFgQBT+{-#SuU6;nV)H75$8vm?yLV*Y zR+|UeH=VC~t}%S&9)hnr4PUvZHSUY^RcBGY0{_$b%9(BpHIZ}wWDy(8w4cIP?xnV$ z!dIb7Z9j#t!k5}UXHyxzoO7w|bGDUff7zwB&)Ha}{pFY1K5uKmtMPQ%rM8deY&G3} zZt?c;>omC}`~SGowwaMj^SCo`UPY#PUZs&s^SCo`UNi&EXU6B%WT5$YY+hZV|M`_> z51zT$c1A9J?u_7SN?k#x$jd2msRp^!nGAjIX@M6xS}2#M*gZn$tW)3LR$MMs24q4p z*q~ghDghgmOVJXr0lAdU+epRdtM|{?Cwe`Z|jE7w>%CRG@hy7R}@hS>%!t+#Qh135pXcw8zN6I!2x zg{F$!^Ayan&IDU5E;SRZAD0Tok7j}`7MGd{){jdC<7mZTB_FHfQshq)A{U6E%><`& z$G|0x{J7NE)gyBL@1o*eMsEDM_J5|xjrB$3hTP+}J{kIRZU0P{8`EM}W_^Y6D5d)~ zHhMf~qx-lhgbm1zg4(5G{RZSlI#r_IfZXWI$A^p0At*NzCHf7@jTT`2oMN&02IWT5 zhZX$VIG5bxMorW%?pVsiaevDr4Tir%Q|@oM zYlY$Oklf$0(eQUTe;&Cwe+PMXV+sBa%7U3-i}CkNu*LX$CfH*9Jris({+P8S1*RxE(s}Y>(NKLLCv%Ck1DFiopi-Nx|8kVz2>yQgB|U7;HeFct-;|q8MyI zpA?+!DFz$RCk1DFiopi-iFcyJ90GP|!Fiox{RZq%?_`O7tMj_O;9O0yerp1-#7%Se zD{OrLmRRVlu<-yavCvszn*y-JLT80d1Yq;AP+xBp(t1k( zHXjQu4x7xwa_PkEb66FC4VQpz4ZsqQGHVk)wswoXzvW96)^72v-O`=U&rP`_fIEMVdBGGns118%6{AYllW6z$p#Bp-qNRYI z3Soo#Z&eA{p#Ezu0UOkRZ6#oX`fqIs*r5JfR{}Pu|Jr?6!EeBy;$H0jR57{q>$|(; zOJ}SMdZjR4vT?qRm%PTDx~(k9-0ybbj_iZcz z8?c}Ix_nsKH!GJUj?0;%drw)p)N1Xey#agaKtY_xQT^6l+M(k-9ctK~DH^e7iuTx= z)qSR(No_;E4T)YTJX18V!pJK3=#(=>uW5Qh#$4Rl?ar;XhUtW@VG&v(VcB8N7XM!yz<7R@LCgb3znP6+I?HY_3%>-L(VS_QFnPBTIY%pdt6KuVO?FJ7z zW`uk_fZe!_di{PalVfU!J&QDioF1lTe*_u52N}H=8NCk~z2C24D*T>G$6;H)6!&>x zma|A&4&=|s-+SLXorjV8pUl_)=k3N+5xE~1{z``av#I}|W;gb2nj-fN9t&;3pxp2F z!KA@sNzAQJm)cU$; zeL&#;&El{@`LfTaJQC!p(+WZxuLEjmK*#$LRoX_jx}$u|kPPhhS1edb$8 zYdb_Y2%QQn-^Y_P9Ghh?485u?IeVwLZBz!$__T7--<@2Uy+`uD7Y&~btu2=S-CTq& z!ZLs0FDm~luy#-6d&QM1lvZX>-nM%ZHhbcP`L=1ez7gIm*ppbe!pM$rrIsBX;VNV2 zhV9;j?cRiE*qbkW!rzb~HU>2+g8>%R29Ppcb}_KzD|*T{!(eFofQz=M$w;mQm+$fU#64uz{T<6&xt z!qg6hb?wl~Z01T2JYGthWay9b=by#bGqI{IMfSdo{oDe)IsXjo6qyh=GQrj!TO8?{ zA?j5)o6t@Dt+6?7*7dmu0yQmL-D#g{Q~Qs3{#YwF6Hk)jynL zcqk-yuJ+rQK;ijvKbDz~3FPU$N%a@-kq`TLj*s&6J~OP(M|pam8P?~c9KGWc%`^v} zkMg`cGpx@?arns4-^{RnOd#mz&ol==CXl4xRhq76?zdP>V5WYH#RO)8Efy1)3AR{F zU?$jNF@c$2r^N(j*|)fjA9&zwa|xU^S=cSWZYu#>td3-+`L@`8hv;`$`b9P#&0Nx* ztDm2Lv2BbT{b=6)&+GdBB62h-yqXMs)Y$*ibp5ot46{b*v#1;`sLLn@8<3*~bs5EA zgK{(&S1tw{kfQ}P9K~RRa`aeE=K8!;xVAuip`b3KSigbzLV8_^egpA^f*Ouu{RZL- z1vMPSV5{{WZxFky;Lg=zur&eL*GkMc5MS_KF992fFBH^<6q`eRU=Als^cxSro-P5~ z6o7rB1Z*Mzd(MXyzOZ`L-nqJ|*6P)$)vG71tvZHYEv(OssiQU)a!mU(X>~&TGkiPC z-dXpG#6q@nzp{>v@O>?j3xzTJyCl|5OvLFIdv*CF=P!T!O>^gjzPoPaeb#2(llg|) zVQtovIUSn!Gxz!S>Xvc&1_?GRu>m=EE9)-scb2Oiv-mstb1okTuGiT3$fX_HZ@*sO z$$1d}r8{-`g)aYlGVbk8=0PbGiMu%k6~guJ2dSU#&n`W56MvSS#28wTj;;_jTzgx?`XlgrO%== zJq=%4U(d&9A#6aV_vPhjaoB)N?>i2!Rn0PofJ{#(O27tWdf$l>umPE#ei2xcUnxG{ zfK2ZbSUuki__eY@YPb7Us4HS*!#~(qX`PLg)F3Bk7)Xza@Jv} z2){_YV+i;!X?~ez15G<4rExS%yd%#qf{zWsc*kcre?R>U&-QU8_xf&HK1Muyp;F%a zv#-P7m0E{zkBQtXBRrehrN5`M(c9f;^v9@bL5Hm3-qhB?m}(>UyOwxnyQY^tKkw%5 z3N7PTX8-RM;NdQ4KsEP;;(h1QC!?HG=BnYl_k2~~QGvX8!swH5t;PfX7iX&{%pN=4 zA_HU&nqS%f{tn{Q;-f8g^ccXNGIGVr3IkI;1?F@SnEEL&uN8r*nF8~A5t!OSn6$o& z!{=F96LYSUdz;XC`{Ur+OPhNyq%VJ6DSP)vdU2@Vf4(dOy@R{NZs#2GJJOg?YKh11 zUCt|wQTib#(ChtOMY?IBTDDb%ns>VqABP5iYNOwmJl8a-b#LJqiQR7Q`*YKHOWJV< zh&Rgjh!%4un)V_Cg8jyaBWjj*)ibw?&DO4F=63&Kwsy5Mw~Nl$PS)hNW3BbU^?9!> zwC$V&0>}Hh;QQV$=kA}-c^LUdTEY9GI9IRhJ^i?H8XFdt^?D}~&ATqt$z2!18_Cdz z?&uADs~eb2eehc!yefLX55B_&XeFo9hW=lhfltx@?dbo`%#^!^wp7JbLsLxM)Slh` z2Y(a!Jz~z)TjnZ<-w)c~75sMjeV_bJ>{i2xhtH3}=WoPQ5tR)6-Zesl%}37fTXw&W zSr5xyF`CBonl6sMxQAnp(DA!k%Ul(zRZ8Og?LG~z%x>(FetBl@HegQ7{jA6^AOER8 z=Pn%P49qINTY&B4ei_+SmHO)?cOk!`l2bu`)reiHbB7=QnB48$B=$10u_bkq?>kEV z%-r={8&~Q|fBLSzhbI|Y@#Ypsl@Yt@_HAD| zH!eAU@SW)O$lruQvd=B-ZI$HftbJF_{?3}OlYL<9z5dv&(cW2=cQh}@f zEH!}mB(wLE_nj=9?g!gI%exr!y2Uxr(|Ah-W0rZ(IeA-aX83~^zT7+G=sN_`bDi?w zTxJ;~!Wj8;`!kQ>(V{5=7s;q{q*+L&B9xO<1Pd84KSk1)V{ace?Gw}^;U)Wl3xfiY;_(eWFPw~&RPmuGu1lPUbuQ11;^`MR` z9?7T@umS%pBWFI0&sDtNfPa=L1J?LP#bE>fS*E;1zXAU&6Da{3@Xs<81+d1JuB47~ zM1}sO`2C-kEDtl47bg!trN4h;<>4E}R#n>yRZ&CA%E7X5l;?4R8B?q%#vy8d1JPa+SE zj5TrWLK$nn3wqOdaT%MAi!Bn6Z>Dy6Mj0E(&B}gGm&XAat7BEZ+$;tgkg@5O5_1U1 z*mSZ4Y(U1QSCxPb$k=pi30Q6O7+sTYD*+qKYe>v4j|U^W`7Y?M-cX@+6FXuTCd3CY zwyaZWa@0;)zvEQPy=;S%PE~5pl5UBG7@OZIm;0J^OeF0@21lKW)DM0K-TfyWCLbLh z(Q-}XlE^hHr?9Jb_;#Gs0|oh5M>wrN;mM>F8p--~u&J4?X&d$AtajU{0Hz32jVQwdmqFS>zEm4Nm4 z!UJ}530QwGwg9`W1gyUo{lM-h0UHIkL!u9W9S*|cSMTTDNZio&o;WdzWN2v&8?@5q zj7(lm_(gI?lK-U6$Zt!1f0$Z0e7qfoX!aW zccKKG&Iti`vILyY2>~}z0#4_HfID3RPS;=n_qxD&$TjX+Ez5Ku$Mjh;Cz3&iWyYP# z46-gBbE4vt7++%9T;G@IPl?Y84T5jk*8(596JJC24L#^Tw?2mGze@Jm=)Z!PHsMFB zEA<%k!FMs@#N2dW$n2)v`zFQ~T_<~eGqUp2D%Jm|Mz)GR(Cf$UkT?c?G+ja;VZD~= zeIzcSkDMNzGLM!^=%ajwc_c5PkDT6}GLKc4&_~4#^Ju+S5U%{Qe6PzgKnMByqOq$gTY8b=|AyMwT~}DJL~IzBF~kg|7a2Dm(za zH{7Dieotjj`SXzcT6{#}TA|k7pXPZI`<6VwS*a=3bOrytC2JA>Vf;ILGq39Sq90E* za$trt0Iaw7l+>NCiOE`sDIQayk8$6r&L7!4qcV9$a4dK&5(BK0y%2oa+)nOUtaH`_&H)BaPtJF=O}!TbNkzBTBJ9<#OIr=np=M2+d0zQ|Mk|%DHt4Kgf9notHE33*LPS zIekc#p)a;bT-+N*-_wV{tortieHx$iF_oWKOLgjYY8#kS+wJeUkYPT=)W~@gYqPQH ze4P5$uwBQ9jZ?3+butOo(>aYsn^jWAXN{{^TWim?oWU67TSsyxW0G$;=$Lh;n%IBN z&(-mCbPns#_7=5HHfH7-Kb`&dj$~>Ko`7Lbyno5m3Jv)95FGirzLnWOny+d9^PJz1 zya8|xQOT83|4(0oZws%hF76O7E5H@+wEO`+m@gE5Pqo84qtF)kmA*I=(!}~J8e+(t z_h;$`V#qs3%fl$^tYhuO1ZxI_=QMB8XYbZmmmCn+?v zGTZi%)LjOj@ev~fWbSf4MDOccdLDZO|AME?)2hsuDcH>QvJcF2BuF>Xo_RDiM3uw7 z)TcfTegv=VGtVn!&)MJlftcCrfeuy0^C-U~{2x8^fhU4{%>K4%xhea@cpmbaG57lW z#u!Z&*PXKW@Sx5=mfHKN{m2?5hHUn~^?6x`?7s^AejE7ayM8%*o4gWna^~Hpbwy0o z%f05}i%Y)9_~7K1I+&a2kWta;fB2HrtLZTq%i=jH-$=@QL*nC$-lu7RHG-q4;7eeT z!PVd^&R#|tkKEV?ZqoRn4@>(McKvOvU&r({tuZ#VS2V6K_(TU)OrwAJ(yadva_hJB zKL!oxS{t!b8lh>{Bzd(Ku~}ATZ$0ntnO#@P>w!PcD{`~3AH+Qs5*;WwX3qM1=2q(9SCm^(CfL-qG;tbDImrP^$){FLT}Ip3PyhWIbjahb2t2u0zU zK<+T48r#7mxYYSz@C;pCWIaZx5*j*V{H5FS1QFZMtlmO}Y*A zh0Lkccn{>5$q)N+uGwg&M*8ym3Fb<5t-{6Cu>^9Z*mow5UoN~R`TAt2>QRa5!yE51 zS9;5U^dYuwAF`lt^3rmyv_luXzu5f;IxgtTIvdBR#m8(*hUU+3|3SL2R!r!)*YJ7q zTGk9P>D;-+Vz9Zm1o4csf%tVX*j)SpTQeBPF9w^7GXNWm;}?U?#S;p?ZBl$~xwrxS z67!#RZJIW196wj*u6b`d&T?@8`VHm>ip@7FG;jLN1oH#MV5cR1FWiqtj2SL9)XjgJZ7W+jnE7p=cJk$S69e9com>pmv2q1Pl%NDSqK_EDSFNqmu4ns+;4o;$MVE3+*hF=wdM z9?5lSU-Vk;?%1u4`}?kWX0f}^r;kGV32EJ?V+Zh#!0@f#J;G1)7jE7iO7J(r-z2`) z)gq@;b3)yTBlx!>%Q>$lJ{~!@NSw1v(AxvZ_3mZ&=s3!H8CzmSE3?fjp#3+nr;cGy z9oIe`>%!lC5r6+=hIQfVPT=pI%8aYi_ycN=k0WCwLzU0r?~N?`Vm6!Dec>E; zES%HpWE{~e@Ix;5llg{;BibCGzNbRtf*hcR{j_tSu|u`{c|dR6e4~Q%@sVI2(1*?4 zcQ9_xCeI9K&S;NI4Ic7xW;p+BnD#d$j;`@IA~BS!)3Pr7?%zP)AD4Mg+drNKV{+mj zf|Fs5k59dUpMgEuc6)#uWLIC{%(RMBVvb1 zd_w9!h|eTxL#!`xo7h&er(#cue?pwE9yzb?=#h9+GW4FUvae!W3C&1+N%Np>vof0$ zK5T>EbZklUA>+Vv1$CnwsBZlx6IMoz#OT!V}3WwGxDi=e!R0WpnR;9xUwGus%DMpq8oK@Y zS($6b~Z;BF)>XNlzsolCq*^XCfuT4+deyqXulBfe22#|yj{UNEsz!nnNm z-z7u8(IK|^jCJnJBN#jO1qMXxeB}O|#hTy5>j2+4j<3un%G*_+r{-o~@s}{XcU*iHqn* z*9ryU^n40!dcXcvYU*uV&1s?bTz{WQ^OJ5bq(A-J(x&j#NY4LMa zRE2(Ln}zkPtnapY*LK=$4&+@^ zPWYBS1>V2EAnn*1^VwmwtqQD>XT`^tdk6e`gz|R|%?#_`Bb2{$Xl7Wmu1St%JNC|@ znPJU+29qj(=g`cs{yjqZJBMb5oqmtd%&`7FLaoeK+xO7(X7bzZ_&lB3?y~o;cei>;_D%+15AAwxnkzn63_uA&x^icZB2fDSJN={VZ^R$SZlr}%+_qJ%>Hk0 z!Yh7F*c%yg;Em1rHs^^gN^Tt=JsApp!q~OS#2)T>b@q7m|G(cB3doeC{EMvN?QE`r!LF*5Nj*+2j6 zv-U4_Ek>HTj{Wxv@sqr}GsDS{^Q6c`oeLjfPnZYw75bbwIyQGUTI5|aG)Lceq4lz* zS*?d@trnwGYHh{u%?o}Cv}D+E3-HJSYX930cW%Ns)laQPYk9x>&v&4zGoV!a- z$i?rZf2m)iZ@w3g&+MYRiKpqB%Nw4MIg5XYt(&7y$Sm&&*gn^PgAB2u$*yTly~CKFrR|jwu{+g6+>wlg&M6g6L(|72||vrC)Bwv@OFF<7nB8rc)*CXpde zByktRtJwx!=Rxeq#ERTUi7)EiSiUrX}Wwye=ve zROq)~Gi!R=*6xOlY>tJi$z`@keN|pQV?zsHH;0kK;ab@{a-ntlT-0c|UTWb6C&Nvt zL-+*X2K!pqtx0ZBVlBeo@s2RDLFMQ>59A)0N2$SMJ;EP?7wB;BvYq^v{YQ5D^aS7T zhb}7%=!HI|Z=S~m-hW4awS_y2S%28BKg{~Wte?Ay$HQ^%EJh}V@y%7#8#UjhXMe!m z#kUh$hK6(XaPZ_ROB?x^8~mm7u_8CH@u3G~#gZq4UszXt(*4y-LeDaH=nQ^GkHh=2 z@9Y<{0AGqdhW^m0wL=2yKQ}U>u&&XLUl5m+n53o27V(*wLz~1Vna3i150B+jem|+{ zQR<^CJqGNA&Ro0_c>L5yg@^rmIq2?YO_S`WPm`?e34b5syHsuSusvTT`wT6!&thLh z1NKE*z`iIE=d5`Yd>>tz{q0@+_3Qid>n6utbloxR3Sy{c{nszjHOaa4U;kv@hH#={ zLkK>=g|^>hy<$%YKVXABs_lwJ}T_^bfqY2IQVWUm;rwf8Ie*eH9#S%K5$tN^kl>0WqV zpB2FOOuBF1Z0(JUu6fjB368<#%IpVzAv%IFE~$Ndr>b36I%n@qcVfcLgrQZw1ixYitXj^fjrmucOACp zFNEH9Q6B>>=gwXTjM#0wE09t1mC`o7GBSld+b?^rb6vnTKgc&(X)F6)FrJ(RK_>8g zMEdmKWxA~_6rXMQq>>sz_@ErQGcY)$R1WtdPl$I5A2H_U-u9RM+!Nm(KyQKrtsiCm zmVVKt)BIF3H&Z(${3`aKl@0Hpp8{K;ONHLQqnLeOJ4e^)S8JZYUXuOOF-`bJ3N)H+@CHzCvW;#E~T-l#Dq;HXFL4LZJepRSS_Mius>H z-{|yLR%Yja!tYz`lcN3Far}A9e3R~*PcO?b9&=*9Ds&&fNqd=7(tZ7x@{Ds%;ydJ? z!;2HeXiD%bIAt$FT7QEVZR6;9ddP_X&UjkZmNjPiQY3T~pPzk(vyi{lyh{zI@Alf; zRAhP261B8v@yB(Zp8bw`yS*C0XVU#|pVfMzU0uO^yXxm>pRo4})^1tAeS^{LSM2X9 ze!Kkk-Mtg_$ zt+fAZX-}SQOLL#Q-~Y{?`t&k&J^t@pf3%Z%=zaq2o}99deN)##yY@gkp+})lzn%2& z$~}{bK7D89eCmZp*asa)OS-RZwfitPvHSdH-fiYxrJ<$QK4ag_=e|tt%Jp;(fi|n{ z^DBAY#`CC!UtynL$MYuUE@1f76?NguMW1aID3%Tm8GS7c@-i}qC z*!}ideD<@vYqjqt?YnDvha7(U72dVkchA~)RlFPH-I%3;uj_dnIo~BT08JR$IdZ<8 z-}dg&^FqTeZMO0ExA?o6zYF-A;%}J0oA`Sfe>bjZKYm7k!@9l$v|( z(yqBGirji_*}crW=a0pvss;XzHIJ1wrD>Cz`*91SD(>r5jt|E=UJ*Gh_?MVhFjl8mn9w~7V+5G);M!ax@R_cJ86TxDX}g1_LsiRmAdxK*MJwE zqR$EOn<9Q+&AYQ_HU2;R-EOIs$S@D>E7&#pdlJ;0D)hdy?8$yvm$h;9`P>!i_;J?N z)=_r+c{yv+(2RZ-A4lpqh`srDWeM%G?u5j?SZ|BO-`T%a)Y4WBIp%C~YEI(nwgvFQ zhv0>WgcoXBdwC5Sb4r9bGEHy%=#d85Sd*eh?Y zQlnC5Q>E0CDb9bpKl>hQj_Np`#MTeH6#~ce!@cKU`Wo-rbR3;EWMtlwlVQH#q6PXa zsJry;_7t|$pCLoStJ?L>8)k$4gN{npkdb%pTS>czs7 zn&0>)WcFz08TK9i(!Rhhm4HXO?!e$y#^Em6P#J{4yn`PWo&*aj; z*o$OrXl9F@3waVp7Ke-?h%0wj^*Zr z?9(|D#uxbr%ze5}m+|@kXJtI-&t+fayhIgzT43MjYg8G1#$ixUpUEw{WCU z@Ho0~&*0?3eM$G#@5y()1-Ax|KfRKe++E;mVkh*3{uExgO5~Z&!w8?<{-cWCL$c1F zG-!SwS=gh`q`Rk^#g`X;>pk?V3i2sVb2@v}y!+82;eTkcNqA7=WFBkCF#inm({#YP zGR!l>95c)>Grn+dhB?M#3-=38vZt!IhuF$>lV8K18#8?U6XfH<1DdZdp|7O-qdPtJ zNN|tNa+{B2H<_5)rOk=GUZmrQ;81YXd-zxQy+4knnQVG3dh(%(TURgPUL!w_nznXL;81J(w&H{Im2B*x1*zOUb{3^wRUOm7xlX)x$nn^ zMMs?!d}^94VK2xY_uT%+-Kj6YpKqhvvA2k)CbnJ%Zof_b^eg=RsdD6QsAXkJwQ(0w z&&`$G4^?T$&c0~R^OOrevDQ`@SMZZ5F}B6Y7-yIwjf%TXV&H`D6~m7$=}zLrn^pPh z_3a;6yynXp2kr3%j4W< z^2v{NzdWhpt3UVkBj7mNQ`6cC&PCqTB+}TF+|`?I;2z+gT;fWeO~*u6-j56=DX}fS-;3zem|SO zipTdI!s_kg#SbFtTreF{ztPZf_X ze}^@GhxMIoz-|C<$Q+$#R-y8ojI;JqE(YqIQtQ)Uwb9$dxu&DsMbx5FqPu#w)J1we zwK$TlR^6+U%(rv@dnITgyuy~${IyB=(f$O zoVI1O#lO!UrCs&0#aeEk5dQ`Ca{5DVf_4$;+mUwqIkYa%fkX_Bw2Kev56pMRbP#znU;I;fEVUm+6?P$W*Oce)v6WQ*pQa>3`*WDK(tglkcWP zrN8?c>5u#TOq#{ z@>}k}RMD+4Df_Zf#(Q9)Qrkk=tX=yXJdZGTx%BH{-!b+NF1Ft-28VwrXZHBNOP`DR z|Lfo)M4aZd3eA0kJ)IV#7TL+3R#Puk=F3xU=T54s#tF_>Fag=dbxWz8ULFU2%)}k!93TRf>FNjIyANmA)j#?Ax-)=QMcJ z@m@RTQsnr0?Dbkb?uZH{-5==v=lLd{*9D#*w)?bB+RFUxUKx2RJ}c`LJ45dg{1fz( z7QCuDWsXzlBy(mj&h%!X+lR7Q^yC4L^)ly>%!~PaMAIX&#RXY4k3G}2)NDSomD@H~ zGqH#^1-Tj(Dr?yhJMZP~9=BWDJss{w>ex0nwqrj`y1K?*@0a7Y%lA!Wui$ZaFy?lq zo~Fj9*`7o>FpN9D*#h;NJ1oK?g5Ob5MuPo8^6FN84h+ROuTX>T;x$|S%R{|#) zaFCI83;(h147j3BuZudpP1NXhQ=^xnM$Z#Ils5RU(C|Nvv)(JUZTxVyoVi83M~Lr$ zA8)J7{gvC`pVz0XEfJq|TbXZydA20om+ydgqsZENk9kNfgUm(GgZY%2iwa$~wkU7H zgZ%%w2U-~Bn6q{b>inWdQ&o6oO!JdnZ5jmJjx+izR3$EN(*Zgo+VyuFbn2ZNr z`VFoB5Za4w*8aj|bepVcFdg*<$D>>No#>AKadh6KsvK}s)c|W4XjavUFR1F1F;#Q2 zS=F8FKu_b-pBz=mlbriKIjPpZM6JK}k);M^m^Cj@<;XEFj^7v`S6wnc@pGU}^ksBM zhVe2o2cZwf%`lI6EZQ&lf(AkjQG}PHy5dfB=z*B}Y(q@rU=#Df&j0>fnxC`CXYsGT z@M?GO8S<7HQ#V(te-#REnstvQ#xRNu@L)ZO!H8Xp?I&Z(zKfg&r}M${TwRB#;F%5h z7JaN+;;X$$eA<(TS%=gp`DZ_Cb9+r+BK!2(8AsxFLD`pdUwYD;4}Wc7uRRq8ccI>` zFMUm9Vb2Fvb`Pv@>hU+~=-;{6KH=|G#-IBB6VeV^puRk`aYyXGCGv7Da!}-2kEcG+ z??jFc#v*(89-5$5ddA9cc1UzfK7Ez4h zn0cRkv-g>wcP}5;GA<-`$lcF!50d+R9mj4Sc8|k<(KZ$Sz%s90wV?MW%IN zyQR@Hf7f1-dhE6e@AD4)_|iT2&=K)%Bn~0tL7Pb%6FM4iciNNg_ihFMwr136@Bf_a z`%CW=I@Uh@h=WXe>8525D7EvD!hUj6^3DTyY1Z2(IDx+Vz)6pnj`o3v)qMLPGxW}BSTH2D19{M4P-ab7pO#q9NW@6dbAnYj1}dwrMe^*=2ZUeR}};Q#Vm^;gQC z|5NjW2UWItdv+D$uGjalT#kRt_<^xMB5PvoeZW-%*QwzOVPY0$OMdSzoDzD%Uaq0d z+UaZhM_mg@j%--Rcjzzae)pHawo5&dj4y4>`u}m<;OBgoZ{wuCtZU3P5BDOQk=645 za*5H%Ucdv>^5R0nMz$)s3!%U^LXN(Uo{RLOr~9@1H9ib+$*?>ZI#zBrEO2=_gB^>U zL8s}ua-&OC7@fUQ^5MwCveX8(bjGnVa^6q+y|AxXzip33mP_9f8~1g!^v(Wvr5;T# zHMlwP`_jLRCG(UuN}m=_6G98v9in%MrM-A_8vU~Ze(U)3?uDo6S z{&yvJpPH-g?^%4IE2Vz7i~sA~Q!1p-|5VdI{hI!nGcvaXE(9;c#x)*jm&fCUdfH9| z@Th%Z-*3=40qhhluSZQ?RMLIneG&shH`TCSoVA%mF6OyF2--=fOMdy%WFSx1I~XfjjX7 ze(U-0o7~2U=lQMY#P2SCALh577r!_1`w7$k@u!N-O}TH6L33jPnyVAu-9B#4L8tyo z-|bV8;to$ucMi2iL&O}!PU_HiWz@VpNnLr2`l@Dq&aRfdt!EuQVo!Mg#nE;4f+uW% z?%vCgqjN4W&li4Npr6tGVk3|bh;m0k^e`$3zu_*V1zH^=Rwe&IXzDZ;QbW6=+WrlfWm{*3mLX$Q4qqWdv9W+xf@hEst z$Du@T$bF-t_c9OB?iumb{_c#?tJ%GRL%BZ&-NJbP@T7OOq8@xga%y9eH$=zn>-Bz) zzEOveMPZ>~i65Q3TJz;Qo)`Tv-tou8h8O!}@Dc9je*}N@5p1+a;6vmx|KxcE|0?-c z#lI;3s`co&8aX$ICluFL*h( zpsZT(!dyZZZu_n=PqA%hj^YmOq&q?lzes2<675=(}Fx)JgZbTg5LGpDjM-Y8`@Js+t zPP|p*4SJXO&4*TMU&^*`n5})%J=W3RBRb~UtX`6|oKbL9R(Y?Lw9cyypz)eW?8CntF!{)PEh#=mm@Mfg|2 zze@g9@h{51YW~&muU63;iWBX5cCe$$DIY-)%qg|Do14tkjHT%q&vYx*0Tp&5l8 z#XDVh!aK>`vqxoX?u{(hb~Ux|^6d%Mt?K|KjtqYGF7t>hNbJ&Je|&EC5cQl_Hy_Rp5#KH^R?jIkK))}dXAWirPeNnhgMB>8 zJ|08Y9EaXc2p<8rPsV31o5B4EV^=bERUqeGNzS{9ck&%vtqTM1qP!CsSkAjL+LZ_1 zmGO@H<_oX$F2cKtz`F?VsOP=#BJbooinW1vHN4{-(S-nS+4`XXKNRwo(CxS1$69_3 zyd`}di{*I>S}DO>z6^j4g|~DpNBGHu-h_Xx&za=6)@|&cd^@I^`$)>xJQi6lap%;A zwa~?LbG-$~dGkGyQy%Y`%bR+wJh%3xk&83%WNt3_3c?>^tLwX8hRwX}*+MIOkC|^p z;J=yN%F#2TLv;*^XV?zLhDQfMN7G_RzRY6Ya-N`Cf|G8D~T4J=kzaFC^@A;r)0q-uD;_ew2Dv{q2yXJHE@>x|KY$wNv9;nb&3d`H^g=w9&r! zk?bm&FYQ|;heGY-7i>*uEx)C{*8kpo6~CpnQh#rr^_KHn*H$JT&K{r-SJo_YfiZQC zhIyE{*^%rip4A(jKkjJz?MT*>Hoza}U8Q+9_G6ySF>|~y#=CXA(|MqzJErSz5=XL0 zo*%Pw-Tn^dTE-Y5GuI34^sn>o^snn*n~!AUJgc$u(fKZ7Krb?;)c;o5=PN88Wvx;B zY_VC_g}u^0@FRAP56L<#ABf(12R`Rf!HdWOson5p!Ze>#x&PXY4m}}b**tcQwlkZx zZBj3BNMu8_5qi~r6!wp=L%r}qCA9?5L+4_MneLjlB_te$_fL=^iolHVs@{=hMi5N5AlhjcrA- z-Cbbr@~$O5ZSF$|!B@WTye>`7f>>0G&c{j|_fx@`*w~HWYWWZ`NATXVWv+6Vi=p8o z*=~Nj{5CXvB)k6J$Dm>8UiJtY*p*tZa~QdEE)7xS68t`kjprrZXYPCVGRui#vo3n$9HrQba+R5HF<`Wn0Me;qEy)0c>g%VwvG5H`i( zJAVzh*b?6?eLa&7;Nr6XxpXmh=OyAo-zPIOk4XLHp$+dA7sd~gzK+}(z(vJH;=9CA zoEKh`|EI+->*WmcC-HY}EMkB-!oY`BIqxfY#yuGq#+Vavje{?6KM=pk)w(~4V?PAr zuyGToGIxQ=-2v=Xy~KB{{m>-#u*t1BE%X-^n-W~E6`M%>Y4DkZ_dkLyoQyjvO1^_w z7qP)f9owyBZz~3366ZW5{zMBnssqRM77uao&;&kpd^G7kJ-?s0GjsLzb3g6d?Yuf= zUeM1bFGT!*lKUx{o6HB=SugP)<~0Q0DXH7+S+tT^$5Vb?ktgwN$(@<~e@gE^>v3t* zQuywhPePkg1Eb{Jg4_?veSKwoQ=(kXFAQ*gVPGA&t^(I{Sz{IS$(&eMJL@vFD$Iv< zZDd_tLX*VyB8>Z96C?j-gRM>JD%H-{%SHKz{buc&Z!%xids0n*v-*+nmg0WhFmzbf z>m_9$+n|@qII#fvO}tRczUk3d#S_YU6Xw-G^u@`o)v1TJnLEE zEM?z3U=o4$3Fyza>re1b^9B9JfyD}ZbuTqh#2bBk)=g@9qy~qYq&6LA>~Nce&V(M# z_a9xkn?32%rO+X@QG9pIji-Lqi2ds(Mzd&AfE&eEe%wI2( zcusSl6KQ0h8rd_cUy6H<2X8pyXC>Xg6hGX-Kifx*uC0~HzOvUruXyTmc>M%AM90sC zPpDUx*ye%xOUSD}!#-RgF%INKS~c|^zD4fBvVQPiZRMHdaH2aup%!rVO=$j3o~?_I zIErT<;#q=c9Xmhae2CmaXK-$EpJo4ir-k~Xgqi2pZ(?za;9k?d5Qgo-=3N)>p-5Mhn~DszDH{6Z?cC(Hkg?8Up^&$1G7)L zKZO2&7|?-Hs{^BT)UCDXvw*Q^wJ&qHQ}B!W?l{`({pg6+4mL+?sD0y}%xDuj=4SRq z;tcG|Q}+>{lRWvU#%9hf=`$!%C3kMIe^(*1&&!!BV#~9g<6KCrVvK$}jo$eB zV%`4X>^>QX^Plqy`uLE4?u@gb^QoKWEU0PslFilv7Lw9t%Y-caa{pe82xgnl%?DHqD zvCl__Qtl0nlhKII(dit-*MDJkN?Y2AMjGJx-g^^5e{nAzt)vFOMdXp3FI;`g<%fE& zNF;iq9~0a~kbzu4>tg4i8V?A zInjN;l=l1>sv^@IE;RWb^;~Sb9136EMh(Xd1Z2t?<=i@>kT^rZ(KRRQlvw z=O>V3Qs0CO*#E3vYoDXP?;iJ}N^B+hCPC7D;%52lKjU}9@(I>i_)O>J*)L?>{>k3? z-x7bu$UE{PTUP{RRhgAl#-Ct4kG){+Mp zh|9PYvga2&SN8T$1MsU?T^{dgzx^&^;@#eSr%mgsBU!$~>YS83oQx@BU|&b|*n*S! z&U$EKxrW`HO~^V^Dak2+`B_Z|yR)_6R&qGd(N`bf?+N98UupmYvQ8OUm)3WV-i3YM zhAvr^;taOdJI&_1%v#Qksuu2A*(h`3a`7pUBZs(|4VC3CC-;b5zw-xGlU%>evk2Ht7K#*L=RL*1z>E_6{#{FBvRoYN_|UG2@O z=~?wLYP22w8~Ie;@x_ReXF}VnzsTNUXAJZ@2L~Q<4q;z&X5U#a>z4T<8@m`k6;~?6 z+_%Mh@&6Y%t>7!cZ|?YV`uW$!zqRaB2YC5|z+7YbxjueAu(qhSi5ECW>0?a8g9C6e zUvOe@@%Zx=UUIkMj|m?-hF-`C+k4_^e{A5B&T+#Nk8Wjtt;V)<*w4pbVBTtIf%6AK z*YwktfhIB?v)`{^`&t1lUL$Qpwn#f`4&lUrLHgMSe18D`w*&A-?jO0(Is%R@ZY5XP zE&D8cj2yc!9aH~dv_pNs;FA3{w9xisud|lETUl>}Hk;tlKMh_{OC38n%-5wXw0akHI)UV2>}eGP6ee{=mx}z4$<<@PSTi{7c)I^SY6h4(Feo zP5LYg{Hf=EBzv5FYbG9%5+2v_FKW9DP3<{@OnQTHkiE_+-8cQ>TX83~)C-$_W$wtC z390RlPog_FW7mwi5-X@~n8SVR&=mj2*89rM>~FQ#0Za`3vvC0BzHpRp_a^c<20+=;z^a5Q{iARYGfS&<23i}+z*!oYODZ22zKx^#h3 ziS6#WvIA*d_Qtm=6>whVclN7Z?77`y`{6E#&)g0E7mkdmZz?p z&}UK^$Lsy(g!oh1Z`4?gv>+c!0%|%-SfV}dF;6-)h+7?kM#aF-}#`xi59j_47Q_ETPZi?-k@<0&sUU zZ&$Ae;Cd|HUJ=>P`sIw&W*=T?LioVUZ{!7OXZT_Fox%@^zH@JY&uX!uptqqwzl)G_ zdz0=%=Os5N{dw>VeDWy$d-g1eBhPK$cX~Yx?u3t~;m!|?{H)J5!P9;4bRROI z55De09zYkIa|-XtAPX|^H+RYJ=PvmJ+$DdIyW|gXm;9K>KN&;zhHr%r$Qqf~u*^lT zaWstV-ZfWf3!8aw^Y#n<%=u>OFZFx)=}qQ4BHuuez0+;jKQrft#*yjmyx%K#b?bL_ zf9?BG&e06%^GuI^wOeolJ>Su@{P7CfY!mpM_^#4#(j9)@&P{(`;O;#9O%{I76!={R z{=$jINw+TUnR-{|epu){@$iN6EsiU(ZAETKXuPKR$azg4tjUQh?u1;px3%{h*H$cl zjPt&Sv6-*st{7q^dTcGT9)6m69_&5*c!j^Vox9}QG3O5zuIb?cJI8%`j*I;@?R?A5 zu@)S^naAlvqx8Eah*P06gR|YAq5lI@`oGckzeD#wH`o6IrvLNk)9*!F05Hc`!;|2) z+dLatAv#Uh$BYsOp>M5s$En??Z_#r?dqzjTy&v6^(06H#hFi=%+~GF4GnIXiyUXiD z&&S8YDn1#mL!WUM6@SOWN$BDRnHO+!w+`}s_zCUvk<)@#+Ms!CEc%of4DirBK4w_^ zm>%C&kok$;mop~#zsEiPvj3AkO+TyHc?LW(zNwF%y)Whd-6?eSSRTJ&6C0fjH!;^1 z6PFI_b?EpBc@}hSy{t*_EOm&iEy`M>27eD7wsHsB*!dD`Y0>s0bJlAq_DzU%II8cQ zVUP5B#NTB-_WVqOy|j1wjNI0<;zznRct~iaUCR~ni{@Js7FWdj^52_~xE;JB-$S%>2Y&?F6z2B2q-bt}1K%4= z5KC5DPGjRD*I1vv$JMNDxZ`5hwrsQ1zh5}Pm^a9rhURcT%OXARqszYFWErd6A8X68 z+&DTHY{uEC?+1{vX2T(U3ofdZ`|Mtyt}Wjg-2`t6O~)rVs})8ru=nRj)cb|@W$&BR z-z;rcAGsXbh`cmPtezSS_NY9yK;7SaUe1F4sv@Pnz&AJ5t=uW4?+0MdPjLrYHF&8J z*>C52v*_9;wPnkS==G1ct1VkQ7C-*go?dl-Dz&_#=hMI9-_ow0`D>9!oHLy#eg7VP zFYQV_u3CE*CGSst^+H$A;;Xx==BTEgCCS$L^35NWXzjV|!`-RJYHnrU>KU`vjQ1e& zoOQM1KQedWQA=Y5x)Jy~J^q{z+j%}XdQt8E#fyU1DEk){o!>Ne>(84ejvpuP|7G&d zW$oX-XF>Z7Xj|Dz%j3rf#=w# z_djZ%k16+WPJ;K>^R@u~o9K~!_UyOSA+iSSPMPZt>ewCf7Hjz}Yw71Nb7T#jD!gTn z3U6Jh=JaH47k;ka@*VC``?+$rUZFx;m-sP>p?i!TpRQxrWAwy#oCs&uDk` zwCCW3Hr%V7J+5)ouJ6~xkN`#PO?@Q$QAxI*+fa9d=}GM3n1!n4R`$*ahEhFG6V z9J&J7Fg&W~AT%KB)OaNS#Xh*K+3UT$P9=s^8~Z1*I_-0&Lh-N3y>arcC&`_s_tvP@ z$;490bBY`RcV+yQn2OUpL|;nIUeTO0YN^eCSV3OnfY>U*v5}La|H9HIV~g(P{$u^^ z$9Cn8!;?CGQ(z0Q_NdUHZwIipR*~I2Pw@Xv{(Agv6TG6clY&>FJE1?lUUH5?d-i>N z>U-KW$-8O$aktmP{7&0;iK*?BJ4XG~^!Y9!=UFh{U3^pJZf|p2dy#wZ@AkYI#!l(6 z@Aic5Czzwe=uYyN`xQ*?i@(SCy`H~ft90`BAb;EWyPv=7_`8?CYxz6E-!}dZ@t2ri zwx7SN_`5~9&y0w?3h+&#kAlvJrmAvrd1R-yo!b|R{jc>Da`yC^$1lII?2Fpw)VeR} zZojcft!`~sQI%S7jn3x+b4cRV3F6cZ&<(#oXMeA?zjZvD_i^+4vj5M%ue84pnBVHG z{rzY5_euM^&i+1Ve$V+=`+La#-e-Sz+ut?zx0qg~?+MtAfB1;RhPU4b?j&xy-}nvN zdoHs5J`4Z*wD)MQ&rs9f3VusX#vc3r27Zh0Fk*jmcYHR=Z+oVG`<47w{2nsz2hQX3 zPw;z({rwAmkMX`6j|4aKF{oz?^7o z=5W+_G_rg$Hl-Hkzs?bV7dqbq{J6+o)OX2R7`d~YI-!G%GbZ~W=jh|(vDUkP>c^J` zBo8Qhafjq`<<6C)yX~_)L&r+qFV-r)f9kRj{(;;NFz~F#ldU5KW}Te*PrChg^34^g znO$Y_AN@B89@yi4!Li`e_(I?oyk@|u#_dJm6}%m!pOeb{X1A4fBi3Gw>R3iv`#_yy z|E8fOhg`Fn4UP*Hc9o?m1(Il=Ip1mPk$a= zB=gy+%Ck}K_O#>cxPyj2yUX^WYq(4wXP=`FeMZ#wLF_~KQISm)?L+FoI71oQ6zKOJ z`p{=rZ6B4kkE(2Y(LUa1``8xfqnSRUtfkuaA?J@|E!A1CSReoXg6(5ZzK?%DPapbB ztL>x4_EDQ1DcXn5N3)hgfj*w54}AvM_CcIM&!b-MMxBn+f4|wzILlXKCO(3&*~k zyE1V-I-nD~PGz8Pd<-4yIH%&*<7-r5J4CUAs?Vvl*MA54{top09q9XQ&Ya|g%TbE@w8bE^IN^G~Si^JS{~rEf5YpYr!w*1ni~>3*dm=eO~Dxr(0u zG=Cpd@$m{? znSbt{3H9bv>|b%d;_iv*H1MX*KQ!+;x9=kQzKy<%^ILPVzTY?_v_aoHO85PS(0_40 z>?qo|rhocQT}0ob^j(}k(?$E%@i_YKyokO(Lf^&tcC=XE|7Ok$>^irqbl?AWhQ5pQ z^LWv|@3Q!=zlgr?qwnH;K3TMH?azRds;PYo{RtiBY4G1}JQtIDOWrZH5* ze{lCU;Bi&g-S0Ug$(BJh<8+`h$YBNqk+CqM74689VJ67QfJG}>xrktHq}n7lnAEhU z5y^~oMk7)=IB)e~8auX(6ilyaNFLK`T2qX%8q?Qq;MTN2O)$aYD|Ubc8q?TddEVcD zpL3+qhi#dp?|q;9Joa-mXYaH3+H0@1_F8MNz4l}9p5n2~;4|09*pH2c-77k`0*|$? zjl8mNM9;aX%&cAUi}2rFWX_>Rn*#McgBQ7XBt|YWzK)*ei%NRZ7lnKJFT&UP^(w8U z+Vk$rv+IdpLznn^Z*uW(+!ce@tHR=&-?&R>3&^*Al-P!P)=sl$%KDF8_l=0V*Jm%O zZf0Ku-)__in>Z5Mc?kJvWS?}E&gP5cyOn-|jr^DHK0oo#(ghNM)p5;>>Y!&CUwR_Y zG2hLfX6>qWkUz)@@W`3fuNRoSse|~WH#v$eFO{#lb7mk$c^+}i4g7E9e^VlG?|_lL zo2)gN4~!)g z3)DH_Hv>L1;M(XM;4}kHGvG8ca1s8!i^`*siz+lv`UW^wqsz#bqF4rI88M7Y)N)9abD($Ng?!Cw9UTVW3}KQ?fSF>%2jM^8OHID=E>yi1P=7q`sgxiS~ML~e2AsBm^$mzkywy( z$nuMzyF<&+a97SdblCU2@;l<2@`(4fZeY*bJ$HpquM>Sse&U`d+ScMt-OeGElQ=c9bjhA;- zqhq3Lcim!z#0#Atk@uNCyDrd~uFUS^^{JwMWQS84P1CL_n zgpYRmuW;?H%;joVeF?|lz0vQ7ey4&5!J_e(=f)P2;G<0On#pHk!Q^+Vg5agR^9lC5mb~23 z`LgzKoGa5a?1pqTexnY)zlD7Lv&q+AbKBJmW4B$c9QyEdM~ZV0;4q)|3~xKoYa4W! zfeu|;B37A!9y8Eu2Aa%3lbL}Sdw((Z{$lmwhlcweyt<*O?>z3?Y-#ugPxf3CZ_3{4 z_JwCtcF-+bcvjzen%mT;i61iat2!r2z(WW0FP|>*wEZ~~GxDA6%DIE#pt~20JS|Yn zZ+fBlmpusOLx}Rb*Vu30$?EQ|8h4J;t4*DqS@uxd-z7e?V3b{V4e@p6UYwD;s`TAx zxtC70e*XNBWX{5~7w&90Sbv$uw(zWa<=Kig+{e2n_g%v`cn**E_@0IzQr72{{R>ad z|D`@_##w&TcNgxw$#KhW`dgmtXJ}soJoPpF5IpsHIQ$o$!`}@Zx#_zPUVW3}mfiHX zJV(A;>c$GU&1}7%oblJ;H@~%>I}xr6YX2nu)^V|AcqOruE$kCcJao4HI zADRfX-aUcbLSBY*``$XqB z{ssqzzYQJ?-5+86=H4UGOd^nc)X>Fu;CbD}M{Fr$Hu|m^A2G`A_?#=pk1zGK-f4`I zzy3HiM)cw>Z_uZ8d>vs!=V{Jo z_FLunE}}iQRgCWgncJEY4JiMK=m1#FI^o;A@{=U2pByvu+dE~W|GwJR`$Li8@e;eE z{EV`t!Pj$sJN_C*8?GMHJ7t^S2JZ%kuveWKR_VO3x$C2Fx#d{c*bR)OXb*aT?(X1s zBerLm?(R4qSz3C${ODKddlqm9f!Xi__%(1tBl$V)8~rraJ7sy!yE}=q6z{rpI0Ccs ziJLZZV3r<uuH2};e-=_KkX5-HS=Ase!-h9dJv!G+--CG3{!~E69 z#>4#PdiVSMkzAJ6n@|4=FrOpef_M%%OFGVX^-1K=?vcL(Z)7echWi?;#>t{t9*Fu(Ra@B1Yq-@o?KuK;tzqxA~l ztn}%dSj|$#5>@|bwo*KS3B zZqZ#`J@6#ssNs&?<)`<@4E7JDjX&mqU-u^R&6@a|G5$k$y&AlWv5evc<)KXk{zB{6 z7=9QuK9G3tu?D|w)9yt1Y^}i=E*!_Ae%+J7k+2TFJ64XnFx=fc9)^Qy%@Z)R`|X|_ zhJ*KeFf5%!-DPh6-4Dn40i|D$_IVwg=e4_g675cR+dbBJ`ns>a>DK*d5-_~_xC_J3 z=1H{sO}E{l;kh_D&R%VH+dbYfiFU7Y+ntP`@YQK<>;|76EB-GXIo;mJ&{h}aug&e-ri4(*wcgJ`4Rp_?tm)ezc2eH}Y=j4o-Y;?x{xa-GUF)*iuGbOfk zT5_<=2*kMe@5R(C`^DA`CfCa%oiR_(vkIw}NX-g_st;$k%LnG4XRqe$!h-CPWop|$ z&rAC^gVQ|M*J?FkJ1hdeON{JQ+{oXNvo^&VjxUw={X7!oGiMW*IFoo5Vp}vftp~3U zby1JD%={z*D;1a1o(QZM(D(ek&yAh`v%P{7+fF{)4*VjuqPH|S!aq`C<`6vTyg&y0 z;v*@;M}i#{<9t6plL34t;1C~4Og@rC;7^;?hQ60SLf@+$^F8fMrj5)H`Xc_=PT)c;_2Uf0^0e7;tcAoz@{b8b&h{L?E1(1!{h@9S625MTOOSv$Ck&Ig4WG` zE_2=l+;$YYHMy$$T>L`QUY_ePd9I<&0WZJ7U>Kio*!X-Cf#rAQ&~N4bYgjv}>(M^` z;gPylpqHG?9|O*G*tNxg7g(2617{-eq*D!d-~&?tBo(}O2;dp-Cp_3oZkx6MZ(b5 zG@EZ+V8Cwc=-dI~ANnIOsKb87XX!Yy} z_akPr>1%zz=O3DT6S)t3zvjDoBRJ}{mYeUM%)ZBWkB|LMWvBwIpUnV}zV%mSfnPE5S+^cd_#5d))5bwM~_{VRWuX$x}1X&zbj3)P5-T6(IpYp>_ zbGR58%{+X`_@mAKqTUf7N;~-)C*`x$k2{~smuYP?=x)=BBW^&uTU6 zBmG6cMyyO=`Ap6EhU=`x>f_vfNgL3WEnGmuMQU5`R<|;5%XA0)u&?{j`mb60{c_;- z^Z$%|gWMbAA3szb2X6RT=h}?z!}$63%BnE3=63Xo=5Vq0BeVwrZ1=c+#^raJ`kox{ z-VL#*RH6FRyU}}hoi8g?-+j0273#TuO!hyhd&vZK9;c4Mb0;x0)UhY1b3gCK*douH z{cr58oLH3S9~y0Mg@c~&Y$fYt$n~9tgYa$3Xy2LjX9?^1chxVjB!nA{4S4D_mPBCL zx#Ro)chCP9ST|ztJ%7os(EpwEUGMeFIicH+xj4N2{qgv}BV};>HDi;XrEdf?>)CCz z5q0O~_Q$>NAD!U)dGarsdmEdWdoO;CZ)1$PHetPRN&03tFF@4FJCth2=d&1}5B;Rd zt@Co{Csk*^IP;FYLtVGv&zX%*R;_dGUwTvU(4JX8yfGEIxct&y=W)9}Vg1|9ln1>s z_GoXP=D}-wwBwC`+56t_!`^eyd%om7pYxu3z2|`U^v1vJQSbM|-m`x^K5oCO6+KPS1Bv=a5mN;}^B z5&1#a_~HDjYP$*fnsg3Z#geV$x-5}w#jjT^Ucs+df-DO9c?Gp+l1i{2`f2t<@rAL+ zQidF!()9(&p{2HH$?Vm7vJ1Vn+~CcdAA@&f{X}yFeW6RJcoa+kLfLBL*bvoB$awve;MBt0BNKaNhbU?+kwpaIS+)L)`?m?ZkV~sNR zvC@z7d+p$x^<(ywsQ;x)$em^6ti~-o7+-ndOXtw$8p;Y?d@g?XB<&_?H$J}IFFwn+ z`FiiS>&mMyJ|_K}vLes6uFZJ-W9D=Mp3@m%?KQc&)t@M?MRx-1=6xs6Ltfm6dnOVZ z)ww9?S~?3@{UmoN5{I-P`^$cJPZPU#2zk#Ore|7p&}SjES%m#qpYF99pvzzmU522` zVra5t&rI%_y-@nCHR>!O@q;BJF-@IYC!A|&#LRWv)ms!hVt7jXb~-1ld1l~r2Bu= z7Gqe~b*r_J_m7N@3A(kP`5Sd_q!sud@6}k@p=9~lElt*|v1G*l^02Mh+nvhus1$?ordCwri$h_k2V**AKYXW!{rgKy@M?2(>#vd5X%H#DD4fypt*nI=0? z1HFRJb&y=4__uYCyink?n*9}UYjRp70$;dI^Be_#9-a4^7NM!|3md*&J=A()I(#9iNK#6UNtcAed)HVUK;#9upM*G=PZEi7i5ca z80ZY0^Hu1h6yF6tuhtzu4YfXjO^~tzx|h54g6;mjgoT_r;%-y;tr`9~+sbeIVRnDp z+t~w#-_On-%*@Wdky(&El({4OPUgPsdztTMk7RzBJ(_ttdpy;AON)FkP98Bc;EeN_ z+nn2UPVLs2Ui`=w;JewtN6eD*kL<@u{(0~@-*)d}h87&YSx-BPmC1un1M!{N6@tmo z-p7P%G<_|KjHjRYR#y+L&5pxO6I1U|p48vGi0L0cwf4qS=vQ}Y6$xC4*>*y-D_EJ%Faq9IpS z4}W{P>U-Z7`2FxrBj0RpP1(%^1F|Z&(rzIE*I)e5dlK z(AK%CCwoVAy>;C9b>xd0?R&YeX+nAG=_n?i1vv=*3JmVxQPH=LJB@`gY>`b^?Z{V( zj74vgoJ|C7`2e})#h5hBfVOp(^ z__dY@-^+&+VSK6CGuS81yGMO<{_YXR78LI$0!`D$*n7d%*NnH_T-$O{Ds|2Ip(wdm zH;^v_I?os18TtkW@tWBi*~B>$~ki^)E8vYjz572{WY{%ilux1!Ls()>{Wlt*?QbsTDFHp;&_C(|8m)Y|9qG=Jk)s)ebHa*adHcm0xCG zBJju4%-ruJ?~wGAChp5RNnh082E7s&-S~?4jn14Z?reJ^uyDY8r}L$<4R&~SANAg| zugv*V&cN{=dDiI0o$Sn_C!5%=-QN4OSD*X(vMZ>+hqiBX-<>$hJKeqY4DW9A-o3%Q zgcZ1#JQg42$cB7ZHVo!3A|J{Ut!X{Y`E`;D%93dpD~_m8@zGA2SUlvYSr?xSgnD`}_Rckae#VC0 zPjIn-WD0jorL=~9zF)QJpdLw#Q5=|*C-PXHTHuPSUb!F=xPbaU7 zZFC;(Z?R4Q<3k#|WHswU7#&)4J`^ZX^Qe9ngt-TW^Z z@Il@gc#-@%1Nrb`KD?N3{Naf}!=S!#<+GQ=hwo1HjTLAwT^o7#;IJ+`@X12S=c<_W z^G}xcM5Z4Z-dF7ZWWH>9qqpV-YVnmFkbcxN_(>CcRu$&_-@qqLZjqM{nOv*9+-ZpdvN+YJ@$0=D5oFoX`X((C;drle}R?Ye|^^_Rr8TpO^p0b3iewE8$Xc2z9Jo_uxZ_DJLO51moLI|DK)TyE^F#$e56Rr*E?BTCZn6Yt{_qv5peM z!hU8p3$5on|6mt7|3Mrz{tDu;ic(V!1(Rr`Iy)5mXUsU4l3rxZ*v63oyPwj>n$wx z%Yfmrp{Hp3YUik6+q>GbvYVQ$hhQv2ooT=u^d$6&`%#nKJN2 zfvsi&*k-t}P0fiN+c|$?*q-#_pQcviz&7LfH3qih@;e_#C%|V=AN`75=%`)eRp# zcy)^Wu?>5yOBcopu5LI!oV704 z^#z@Ey747wg*E1*CHrlwWo{h#8nKqnMK*TDt>wI1!S5#iUc$4H=OUic-HZZ z@~q(*<5|nIf@dYqGM26O0dZNm>mr_d<*s2UDVxq9IOYfjR-#n2)$qsZ{Q@@oSFxV$@R zPhZz*qf<0b-^kz6liulSM$hY?{s`}byx+|GEzyDLTcd;1w^iBGw^v1`@2HAT-$lI; zb&53}*N=0f#&zPv54w$=K6(IP{hL2EJYPW31nd`j*o0`=cBxr8nDjr)nw z+3CEYdo|aUP!HNj{?Fer_k~xd^Vhj}{DYKqFzwGr`||N))Lr8GbC0g5?w{VNHha?3 zJAwHz@to<0^^SSq-3`|XN6c@hD@*>M%k_Z_%RSY(M0$^Z?t}V;lHtNP-w3DXZfePM zAHVpNk1&sxoA2TG7p_{o0pIN}4<-T&t`t7_`+4N$cFk$phL#TUOi$lj#W(5r^evii z(SlD0oljw}zG^8Jx~%I$^dsa4dm}aQc}3S3tV-60{nXtiUnk#fmA@1E*-m+s@|qs# zsgw3Pp{bm2HnSFTcMq`wn|^s*W7N192kXtz1C&*|Wk(PAWec*$>YQ}Ze$9{5UvxmZ zF&b9GV;%5OAAD90AN9F1e_^J8GilbGh7Rk}hKHwI%{(4TF1@w|Tg%)@z`T38qOX4v z`Si|BvyWOg#XS3O*3nhM?@hJ2_TS&X;GQi$y8ZO~S%3eq8#8!x$t2oMx$XXP67idV zf1_LXzm7}-hD%%+ep!2Z7#=(3wY$%ynYsw$XD{P}M_P|^*T$e##@`2++jUZ}`kXxnNGf4yz>*e1waSQMqI;j_f#ohLDq=n93T(*=;;kwcF|PNMe~wPW zy5y`%W82k5T>CQr9p>SW<_^lfOx)(|Oy`?BWysqg`qe&%D}z3FOuAko@VRN}D$ANV z%MP>V70%t|=I3g4t`CW)t4l1WtHv(uT4Wcsp8JEA?gO@)Ls&jp_EYHNI>}EruB1YK z#WF8m=1$g!rPw!h=y!`b*IO9xwRJ}BEOe$_SNyf?jr=uN^yq1CbePl$PIV3NRSE6+33BY*)s~y(zWpjZYmv2QutV z#hMJub^e~fNBPbb4KsKz;jIRVr?gO^R7ho)F$m+w_%6X%G&e@M zJiC}Xcz73x>CUw{xmQwm4S3FR;W@q!z9N?R_#Vp2D4R;V@0+qsRu0X^-!$^Y%>`8fT|YJ% zcv}wwA2JELmtNx9KXwKDKYw0l(uQ}A*VAvg!HL1seAn;1^SGgNmtW#;ocBoIRg>*I znyxUpwMO^-x%I<)qe;84bEA#l?IVrfoQtC_wEwvqT-yI=t2bZ6@WU_Z8Y}oGP1X(n zp3Ea>=VImO{M{A&T@URrrlB3sg4R!Jh8^f^FRc1>3s^3wHF_1-p781-pCF1^asX3!d*8 zEI0st-08-h1~#gHe1c_(Ky0<>8@omqx1dI7pWc|gH?RPgCr#h$PFXJT(Jv>K~gttR$vmsUSOZr`V@me#31 zXsNObwp3kXC91vvuCX1k1A>Y}U~i+CeUBoSzvo{`ztfQKE7H|&yFScS?Ct10H?X^Y znN7%LWJn@#?T`cRqTsj<+_ZrkGhg5*1Aa2#Cj;Ix;5GxEGTzKJ?Q3?x!@a`7_U`ua=M1 zS22BI57$0=MtyzdWA#-|U+8N?TU~0Io7w7g}m<~UYUPJU1cR+S%FvP`IF3d zrEb~Phk*ruka<_m+CZM4nkQA?*r9H0ENjcv1JsM^z3Qrr_G`R09`f3+@W(`1rB}Av zD~sin)p})jdS!kLt6=tGSg*d(E341>uEG26DzB_Dr)-f|Hp7pn>8i1ob}h1&19ubc zE^+mUYnD}<$DM_i9c;*(s(8kRHfXVJkhleW?-^*6y=QWd5IYIo5f2a}POp~zeR7YC z+-(Prrs-S5Cw%Y9HS!ru^7~wS#>9NFhanp#^E!Tz0eow%_{{H<{$wpm&t^Y<@hvTi zKapO9JZsTA>2$o4?vW^2hWut9iTl*a8x=r~Tz!}1uCZH?eDwIhuAW6Z=rY;ui9q!w=FVLDRXxF={>S${?*r;{FX-)! z?l@n?jtOu6%mY>dJd7VIyp4PBt)7AK7OkboYnbd+czh zCl~s3wzNAQZjsH`oen$5j}GL+8e$^W5M#I*Ghi4y7|?|T;Jc+ zgZLJWypW%073Y;0PpUc+Zkn48hvp81%k^He!z*j{_`FH>0Q)yh+9R#*<3D%>M`7a0 zN~&KsG4DqI^z5K8`zr5ve{25ARF`L1`juex%dW7@`@-0_vxod|X|s4tJ+=3q%3F_n z_gZmogf{2WW~u7xUXwBHs!Z*^;k7$=f_ACHJqXg_iGyN34NoTm^PYpwn;I79Uo9Co zDY!m730$0~`!&K?V=b7~GI#Fyso&(NJHFZ{Fr+X}?LbD|U-z7RS~v_9}UIf(M! zsD{p~w~5B*%{!wtxAn}|T=^D>>$5oflE<7CGH2XVn(erPyhPXlfzA-~`vvZ%>djk@ z?R;EzLFakIa#)tFaq~BNNX`AZaHdWJN31RHkrACJuTT1rbR2Y|Kzv7bH*nx%57*_) z(Mj=1-!pRiX8-!s`qpV+n@HaRo@u~C-n?)Vy!o)v?ZCsN^t+GOUm^YBUm51flaAlx zgI_B@!^6L}_Hy{xtlNpe+-Zhxn!~Zl@bIq{7FV9Q`h&5lt5R&86(LV*qiN#Eh;P)n zyOH>>4?EnmyuWAehjLgS+K}~aS`*BEc-U!UJ!nJbvreyJjqPNOUdtN2E`!`>jqYQO z-pm@kg)u)8jfA(#cEFbu79WYn;4i~V;xX}B?8)OB4gdeW_`mA^GyWIvW3Pu(*DD{_ z@g<2s^vv}Cub#OqO2w2P>7&i`HUErwI{9(?I$?Bmd`2FE;9HL>L(_suX~a>-`Bj3IIf&n6sy?83Zh4O`dYs6 z>7rxFXC!^)&kqvA%v~XWei$90&04`T#&hdw^|4LqI<3RR(EIlZ$+u*3c6;w1TZ+&9 zO7>7VCmO8C;~Ab2Oobb(I2*YIcsr@zps`RtOgs0w`%Kw2yl>2Tf9EOMX`&tZj~03L zW3)5RYp0g?O*!u`IYm3gv=g)fO^x6$#}?%LyJ9Vyts3yxpm-E>XIPrE4fw`o`=Jll z`Y}C;KxLPBIDK_`iQ+4T^C25%d43$ zqr-C77q;zE(Jpm>wX)gu8Qa@*=E(R`jI69U%-j`7f00Z_kE;OZ__VKlRCUaI>Z=U< zlDM6U$Mp_fZU=pNF=M}dFEUSSOF6MuwZetD7YumZ@#j|(rxne;8_a3W4_5c*qaSNe zbk2zV2QE7)qaWFS#$Ttpvb(UU%o!QVeEZL{Y4c^r6=@zQ^X)(LjlQKUwbC1Xs;zrB;d)g9#D=rZonX?q|I}$C+g?)I1v2UQE=Yhean+lW90bU@-E;gg!l1&Uu@D6eA*rx*)aqbrR z7A%u*!3r#DnedDN_B3{0rQ#){yTXcJFV*-oF8DVHO|Q@$Wz<35ofwpS0rs%NH>~CK zCy)utR zO_@idm%IKS#orj(Hf0`-UhevTh{4M#^Jw()h}UK!r>xE!pX>i=C7x@f%?7uuT=GV- zMvXaTi@dUDy|Sj9vL#;Gqh8t4oU-L!+5KMGikz~QUfDff8FV4uHRDTqWw&}|PEJ|7 zR~C1m4d68AahSU`t}JtD1-);WPOQMqZ%h<>4ZjWF`2&q}w@-SdX=4DIh-lp%it;V- zzvJV!C-}By^tZ>4^DTGMPjFu5^t_N9;f0T0ICEZ@b&l{RoC#MhFU%&eK&;DyV~x33%bM8@#d!c;T`uy|M{- z;j(kRvI%%$)-kVa0$!N)idQxPFU%V7$|m52S?>DRYE8fkv)uKsmHn0xdiQu?)}3CP z6Y#<;cl~Q+-*MzSj~8ZL<$c$YQ?|zClUXyovd)~cwQgD2kXN=Yr);BFHt3c0<&*EPQWmWMfYJ#bP&ZKfRbe zt;OW%(fQTIb<#J@I;5DZ{>2Txp4l_FcoFN0W$r=6x7ia}T-!CUxH$RJ@3eFcE-qR8 zB&VV6#o_MA;?nN;;hF=hr9v-ipPB8$!5C$cYC6-HJ#M=jR> zb;LU^O$5rGbN43g<87OqrE~kOrn$()xlPs;b0ZhyYz*|xwezg1LA$eR;97H@*2FvZ zFUEfU^fwiY!WpQo^p~%^E!f`Jm$TknJpu?%TVvrw_-;))yJ)~R`HvhIabFsE0Fr#4?~Zp z0!P=)41Bm@S>P!3p7wHqm!#hK8Zpd^E%_^2|KdaRrc3)>o6|bTSpB=Go(F%&{INz; z*4bmm%ii@Rcdg3LxMKmP)DQj~crJbR+h6<4Q3nK>`y0OYnPbs*H4N zH{(q0{&R1frFZ6x^AW~bJ3LMkr*P>j?!N1#FF4JM^F`0%Y2`u^PcyC$H1C|RlAYY= z)qPm+_}!TZTzpmfV)M6`7wOV(qMM-un!5=OqNf&0PsP?Ms&3MmMAzm;PYr6%0v*-Z z#P?;4pHucnEqxA3PsU$Z_*cE$v-$veVJ;lb3-cc31L`w*;q`_#u-T%jryN1h=5A=U z6g{*sL!UztkE{o{&D(fihHaeXv7%@S>+ zGeeW5_olA#?}DCYpQ?+VwWOgD`h)%_uHZF0lT;-ZkHi@ z$vtzE{MhqP14_3xgh#V1TK1ELvpH1kEg9aMfD%rko4&HH1(-_ z&xYgECe^kTxS?)R`pwQXbe%`8&SATR`;~79PB;gQ+023RhXL#G9Nsr;=&IM&3JSo9Q*4BUihupZcRBc zE9>N^Nts-x;mzzbw<~7X;5Q!baQ!o3?mbO!!?&@vD;-Yu*kOl#=r!yoL9-WBi4Q2> z&fk}3cBXeI#@Cq%KY#aalWPQ?-BM8^AMRlA%4>;9I169yWuSfg+bwg>VjW{$);cTy zO;mmlbb;2xpAW^m@nbG)3e+}>*kJE z`9x;^0Ddf)>FE=@IiqLx%cJm8wC_UVH!n!L{z?3@c6hV&{xoCEFh)b0;KSq)1s55{ z%pOc9ew(%UZPsCnZ;VF5eUcs3>!(=sXU(^gzi5_Dv@5!CZPt8KcE!B6#hd1;0GoGIE9{j+X_^B@DdQ85Q z1)USp5qx8K2-(Uwbx*y?8+B7MI9D=Ea}BOnM=j*9eEirBo$O2Wq?F6!{JV_q2E62i zfv!JQ<$TI9>ug5t&V(l?SO!0}CcZ6d zbq-qbo!R};tHAAU56*qv$RrQe5)aNw!PoW!;#Tkx3g#Z$3M$@EF&ie9Ua;abR4gGm z7DDoOG9Jb2mnE$G9!s})@ZS-h)B5&BA#V)In^I`xmOGB5VDZLrC>@1fS8t7(m>2$5 zTq0vDP6UbvHBa(=^ehIZ40Djj?>y!dzh)cow*iNtVc_)roXpipeVjS?*yZ6P`Nw+; zYf|^z(o%h$WzRjxIgnd}b6xpb+$?{-;ASm{9!h4l?Po5&wN<)B12N84b(NLx=1ai0 z4-K_`mb`4eZcc@S^^J#y=QIE49Owt1&apYEdBi35nmODz_m}8}v`38MHV53ns}J=Y zr5^1>`xtj4ZGv+X!)<+Ip`nddaGSj-gicc=*m7`r1pRZ5PlwX+t79%LO4kq_rZ48a zA-He-c7ihr@CQ60+2-r~j4SDsFfR53#J9-{^IBp%tuTExaOT(3UoNl(f9q35|BS-_ zhWC@iF|&7ZfVkBn?F(y9c;uV&pY^|icJ~o?T3G#g#ts~ez0>)c#(w_88Y|C!!)L(H zT%OWa@W$E%O>Xpk>XLiVb_+C$9Jd_kv>jY@z>{kjb0=e7%Xrs;5A50*-xM8+m*6k- zN7Cl=UO0ljj2wf;kd>ALeYIo1AR{egq=k&MkdYQLlH5@d%g9K+C8rX53H^o!iyN$e zTqS>CYMyl-cc(W9l1~r5mbG%Q9bMJ^s@1a4I=V{uN&Q}4i}2N*<+>zfzQI)vKCHm}cP7%4xCgxu z{15wZW5n|?2fACvYG?}11t*2cW!4;n&xorNy87#U@)(`ME;D(Hu*J3zPsbjGY~?D) zx?FNUbHd5zTv%bluHtC)AaQt2_#rGSPqeD|xAX$eEZl*No>d%8T_29>{%>@qx@1B0 z`|Ap6r_i!>=ly4_?DNroCU?`a+a#kTFH{G3Pnwr)eTR|1JFGzMevfWP-DNMB zgp=gk)vjL)m}z?&xq}Qpr9b85r^|pd0i1=S;amvLl%E`Ui!j~hB!3bJ2~OcJ`FeGW z@Cl6?-CB4gChStp%N3a>=_Z^9wW7268`)cPMJB9wdAuvVA`{c!0sbyt+7u*zq_t16 z+Y4t+-HE&|kY7vfs!d>3-6>60A36g3v@`q0>`b59EcVLmCd)BptV3J9cT=0JUH-d` z{@SEY6rrM)uN9`IuJpPYQ&JG_rrp%v3?%d9`hd#zXgIwTzE+bSxrz=YQC=5GY7 zRNWu7@H^)Iw*B8>_qP@E%7fnTu=ksDqxznFeD3%8-tT&!a4kk*6a72$C-Te zg%c~NTax+``FdLTy?`7 zL&&J|u14Z6{$}rsJuT$h0cXh${@%`BI=GbFDS0UGQ0F?Uw&W*yhg$D_Eu`G4J?k*h zzI49iP?-K>tqcAw#F~^qW(1Li0qz|vEyqaKaU9)CPsE3xLvkK_h4{irybm#{153=K@$Tj`DEfH zBEikdDbo`VZZWnPL>@0zUJJ-p!NsD!04UN z=3a$Jus$6RHgNxBG<|_p<1_~={QI1`$Q#_XL3hl2bSLY=ROCeoIg>(K2U4@GIk`EL z&>M`uI(>_kf2DYg9P4~<@qK2G?K!<>pH+nC>s=2f;n z^O<2TGt6U#In4A2w`HJ%409Nb1b2y^6M=K?*SAK`;9FOR4fajuTgFtum@0F|U%~h} zmwlpwvSP|ga>|M+E1@hzSs7*JIb~&(mBU*{DGO6pno}00j66(32b5oia)Za5@*w5p zbQ#)V{OQxunBN@6tN#>$1q3Qh4TWc(zn@iaaS+ zJO#4Q?7@hBGqi&|2}(~urkH!7iQS9+3jIlrOr}43q`!|$ObLB@_Uz5bv4%aS_`6XyR6l%UysG&-yX>) zMxOrB?f+$&`_0rc|C?ZIM}@u_-H-R3>1X^m#ojj~;~3k|c-Vp-Y$xqUV@YN%YY8I< zl1(!V4#jWg{k@m9R21NwX_}>b?v2i3-Y+Q&CKu1(zqN1F``e74hBFvr+Ts0#^=U`4 zAh&)t9W?W%c9Tukr45U-Cj?LK`#<>cd!IR3nfv~i6J*GMk5pKnKTI9CL`@{*gGcm3TUOH7h zudjoW+44ik@1XlojVxD;sN}JCW=gU<5h$E)^c-Y4e;1^#DZWvB6=z?~xq!N<>qAE0 zVb9E?(@J2yKZgcOGoD;G>uUe_y@cF0=p&Nj7dvR+k`G>Rk;hx>h~W*v41CxS;*A>U zewjI6ej96?f%UBElIf%1puWG}fV;5fUSsFm%SV4ZwRbY#N?r*Ung`PsdZv+KC*fiC zO3QO-?a@>54|q6ss&doM1hO@WTs376x$?8&!A}_3W8VEY%2toAR&@5G*PXl5iE4rUJ;{E;PJ{z#=_YYc) zFWFX;Y!dX@fNZOEPFZ{4J+C;8zY!sibhiM%;kbl?E zI(x*1h8E*zHuODZkQmfL{DtVO1((oHDZkCyAzdVwW@+1{nVfl+4pn8jzJl};&ZONZ zJ)QXAd}u3!E`&@@-FA!i4GJ}u^epsTH|Jt&eUOj{|)C$E)39@ zsSj@uJ6~DDd}5pVb`9svv1=F~@i5q8j1j(BDSgk_H5xm9GiWu>zpo+6Jb|~n!K=x2 zMZO5mY_ebQH`o#Ehf7CO91Hq?3|-ON=b57X|K9n(z<}Wy_Owi0^f&l0N}Fky|LlIv z8Ev+U=E3C(c*>7WlHQjDpN{w@5eP_bwx=&P_9V7z-rtySsE?jFs;(9I9qBs-t{q4BwU{k&hqd+$85btmtqir#r&t9@j0$UZTg>-9pDL)OpzT0(h%@(o^j5x-3i zS;c11P9g9VOP+v>QtbKD`dd{`=RTYr=-T*dfh%O_)su668=_-hzg0W{IyHBFTzM2c z8eP}5jlKA3d=ucYau|VsP0HuYg;v7vQyI^)+nlPs?ug#us9I zcBPg5mVU=J*;^QAW9GQoyD6qjxH{mLSqCUPlCV$Q&t8wt?ODKH?CBqs8QNwHVUHJy zVICbT&A81x^8G7(YimBRo9msV+ZXgTq;~Z?5wMMY%x{xx0~}VWFZE&Cryp=NQ6FIw zFJPazhdu)CoRcqCxR-4T?ll)Ken0$xTuIno**@XGA1AiDp@DM7$2q-F!p_drShbI$ zwHRM{q58m<^3Iy&^$Kp`ERDQteE@r(v$3qZ+Q(D;L=c~X+0%>fJfS?l#ezjK6&@US z8ax7v8K0}qac7=8MvqoT#hn9hfH~V}=5XhUdVU)k#b&M58Y23HZ_RoK7Pd`_hJ;(= zL$SifrviS>K8NNQ+VN=NMUQU87q)N&P1LZjTSAxl;#JL+`k%~vCG4RAAGgA%_K1h^ zyNmq|JG)G{72km0e1l)`HjLx*C&F>o0mr2-ZjVhDJd=S19PN_4O0nk+pOjZOo4uY& z#cs$>ho{V)AFM}FCv}%gtWUV)iVxr*;>*AfLrk6uQ9+h z>RT%?Td@IKbJlD3oEo|wV{8By6~I|r?Xd322kYu8b;EiJxK4AoM|wUwS--&x`&3T3 zaDxu1H9rjA#UBqewuv|WH;-RUGMzB z%I}zB*13(C!;@`2B=I8*Gu6#Oj7vrnU z0N1J3POt4=)7Q>ydv4qC!b*O-I?8vl%c1+cPWDQ)2ht>cg=fM(db4;;^QQGxvKCp5 zV;SDrCAvBO61-9feC`@{uUW&w$TEKolV9BUu7nq8vd*ky$YpmNzj$~u<8U4v)`2R# z?6IE z<-Jwi1Y8>=6RkC(@dW?U*D&_gW~>$113~gU9iP2g_rSsb;1ruSfP4$_w{l!qk~8Qt zox+*dmhL(#RLpJb!Pi3UBSdL4XxiMFRc_Bh|2y^!*77^##{fXX?TU>^*dOlIylJlZ zZ(_xH_ZYZ#<-uue_DmL^{9!k)fHs#}flupvkCVga#wO942aeji(^h?QrOOkti&)=G zj{oksMUE1yZf?x7x(BSrOa_fep)F9r9@!E+M1 z6jA<0{;zq^PSosCu5@#-u1aq3=;-}s#+ygIE$p*d?Ahg0{~Yb(X&sC@;`_CiS%VC_jyx7i zc-F@@<(Con64YAXq&11ZC;E;(m}fGNTlwIouICuzm4C$k#iO2{OiY$j$XG1C&j&vy z7D)6R-)U`}1AQomEquN{)@>iSqT9&OptH`hX19xG^Xuc?_I~K5UG1is*EZ%<^0bY4 zHTV27_ifBw8}r-7{IOrz#6IVe4D*;_9+6MRHe~G>W$OWNLUFw=KmWX6@Cq*0pXG{e zn#()@2X}*q;jh3FVs;9-A3Pd88(b7Kch};ZdhohAJ^#p_^gmja{LklqA^(f`ALM^A z|HJ$*<$oFf%hOjo^}=bI^`-NCd=+z9Q|4OSyK8J4-*zkMppUC!*}w8+bP>M;p3Ztu zw8LDU#rI*(YbcJQQM|9af!#T_YEsu=6W`Nw1Kak7N6)vudaQ#0o?ksZW$fzJZ!=&XClrvY+^nq0~YvhSqn`zU3xkvV(k zPT-bZSex_iX5MY*T}{rr`Mle#vm46U#=76BHN&Mj>wwmlo)6*o)m9#{L6yjoq7LK& z<)y%LfcFKgUG3}>cPtE#-zRq91McW3AUB z_Cq_HnePJXHJKca!~iSjyyO)+U&QE*-#NY&8Yoh~$QaQvzPkYM9J!OTNVeqi=yOP% z<3LtO-{Fjs&DvlAN+2p-i1(r&=J;52F^MFAldwzHl?utMhUgUb{>|Lm+k|J2)_tDx zd2ID~Ib-XN#3|rsT@Kxrs{e%jvvWmHtVtEIO@Tu7>9yUMgUjS-T%OnseY*ZGk(X_3%+yt{<(}F`bner zx4ODu3AETO8PDyq0z(r^sAh=J}s;q(=Y4!yU$M0uj@;(|MN!Sfq8AuX=BCc zHimZ5#_E%|@$+-lM(4M+PoL#XkF(sPWs}R3>k5as_jV=p_subKXM*`NvTZ81`F`sE zk1_TA`OlG4oH0k|rv4WCU1D;9KW-I{;O7whe@y(pbPP<(cz-Zq|NPhp9UQNxPgm#1 zpJZfcI6HxCgr8{sQR7#4XYrzm%9yn(cxD)YZu1G%ewSu;cfIFu9q*AeBfPi8j)>pDZ{W8!y|Thrvg?U#Id`(ao1 zvG##O`dKSHl1F=oaA)v_kKf2lPw#i(&(_k94L{U7_(bGaP1rwuOujW_*&1Lfln=;x zk|!}y$%g`*%Xf$QB6#Ec7IS=!{7k@(EWuas{v9#dK#}#co@8dR2o9Qo7 z7e7yWo{L+2N!;c3nUM1~czBq0!LhTK^%;MeVxRebt^d858|K8!4R9v6B<3XVi{hWk zcAlcn_o?%J>MS>7lCJCbJu47$UPrFw_M2ywd;OM(4vcPG=F!1@_~iuOgI1YahnSzS zb!OKYI@xpWaGmGJ)wwTW>U4~>vlTp>bx^(z;(_{vPxUQa8o22<*{(S_@rV_eam2N0 zf8J^QROw(-&p>c#wZqzB2Um(`We0Z;1QXoX($c!IF(!T`ey%S053nd? z)N2mb=p1WzIvDHj57zcXf(<>*!9_j&!6n4ZE$@;4WuvvdZI!cfZaNsQ4l`Hh17F|2 zgurFVU18SQHY=$!s;%S_gooGhz8L+2oPOphJ)_Q<$r=ERtmm;P=k%a;+0MJMe{JzR z>(-L$LHtF1+-Hi8#kynGL*D0mJojD(y;ydf8~bnPr@zYYVszvxWXrln`A3%u4)GBE zluD**T~F9=HG486=$vOqRo;o6Nc`B!Hpbt^*p2PO_}jo6v1oO~qSX^i){p^D#Gx%B z4y}nev?au$EhP?ZIdNz!#KXW3&ys6qXLb?e8uG@~zKob)@sDDC1xKnh(6Z|554I%R z6ZOgV6Du0pt=~l_4JYhFmwP;1BDgeG^hdLXy0E|bkjlaF64_D0fzeerWetC;?S%c4 zD(5R2=T9FN-9YbU;9K$Fq6vIr*+=*ro$IaVI;q$5I`-7-=E?f|`nzfq+Nw+ct{tsD z2wt#x7`S|7wt}o#5e1|f%i7X%GYqkRCHL`~8%2`8=4>{%fQ)*d1&3Rn$ zBYx3B{3WI0Czl_wW#zwz7x6o|dkgsQfu{z)3-O1?&ygQqIMA6lvv+74zkdm9PS~tB zwCA2fbN2#R4=Px9#_a((`1!;~PCk9FH-4_VbSZQ8l)De1b8^Y25_6!d0ny$Snct6~ zgD*1QRiR5$H+f-Vj_h@{p`5F&>^Z}KJ2a2r`mxyGac9MP^lI>gKdX_y#gozxH@ZHT zw;t2pKl57yev8yLe{cJJi#7!xJf+{%?^Au{wU*5R4U?zde3$Rd**@VHJe8Y#6)s*w zI-iKosTiD=cri1^kBhIbjJd4@r|9h;K5lTzJ`*^tVO}e>7l%K@oQ3k%@M42g+5w*v z?lX!mgwKS1uwSqXC(?tEo6FO}>kjZ*`a^S0ExAK@earZpJiM+kd4y?$HQdlY-?gh9 z@f)${h2lB2gYT9YVb;B~Z=9n(a`0|)=tIZz*e{Yl!R)!6={T5&GH)I>C+yem7F^7M zf!meIuVMe6I50d%F*8SGPz?>w#i)I0a3)+!FHB!-nY{vhr^SZe!6iDPiK{SkC%a>l zV`+a)>nk$OmOuWAnU>B@)Ds)IG<^+tZAVTp$HF;nMg6!8r&<2dHz(zHW}e<>f21tA zj5Dv`S-j+~>DfNYUZ89x<9@>m{3iQpW`FCTH!e4B0s3HErHa|e8CTMb3qP}9lB`yn ztc8||>DcMyr)SwF&Ivo2Gcv9|Y05nvm-0@@PrrLa2DcR8UvBmGhZtd)yt6FM?9n{j2F zX!A_^q^)LXZf$Nm=o33=-{ib7a&VQy`u)oL{9Wv?G2Ot8PIpf?V@Uor@=oi(e)bR} z?z)2fE31yN&auaguMaC&RVcc9GPraOrBlW=NxO&)+jOjMnG>pHnRd?|c(=I$n<{O-DWWG7S#5|fi zc?Flw7`yzRGdJHhaG5%0|5|Ms8Ie-W0!q+hWl;zL3X6*9rT;U5q#1j1ykc zI7Kh4)rKC`pHGj&?ZCTUjF{mKwWoH)8?+apy{Jz=rY+F~az(Ul;1|y#J53+7rS^fx z=qlpPF>vY*C*XW}FYOke5uBsO`{C1GJ89Y}`4!qpdF@ouPQ@9uBcAtSW)04OPiu^i zJ9L1EWQL&`)&YJ`cl-L$v-B0xd()pskHVq!R%qGQx&b|z{dj1=oP#j(#hb@mx#G`> zKOcU5&4)V|NBz0j$6UDiaUv$4MWyr@#dGyEd*}4fVesQDGi!%@Fv^MG@oMh+p>ZYb z9~Cf;O2I9i(~Je1epv2<8+|W1XZR{-{V~2}(G9wb#>-fv9X4_lxKPdaLHosCT=Rr` z){Lvd-IM?2n~dL$1L9kKXYj;$a&;=dz7;ro8#K8uXT5Oqgregyhn139$T)NMRk$(h zu8$jVM|{W)l24jZFB;PPh}OXCT8H1*SwU=J^vDB) z?Y*2IZ#VL4g)eKFqm8+J>ux)D?yR-u-j^|bk9^18m8Wm0UyT=?e4WaHJLZ?MwzRvt z`GIE5mvmvx^~vT7S}ynJY*srUXT*gKg5~J}w^(~qeT?$89%LSJY zi_3%maUFOwc|r~DfXAO3&8^NK8M>v7+;0ut(w1brN4ItESV!=u_Qk)*xVyzOhChK> zd}(MCn0_b-zCXb?n!C#VTM#ldL-OZC@9>2Kj z0P-ICV*lb7cN-ZadS~4HzRj!wTEAQwzS-~;Wy5>~pCs((ZQ!dBuiZ3d%GHWrG_dBb z10!v0QF-n8%5@$10i2N_3!6b~3y(N}lJ+2UDMM=$+v&?_0^1-0vh$7G&SY zf9}n{=nL3H2jI!*JPWe_d8do_f1ky;mdJ+7#l85(TcZP#XTV!3`w$pTYERK;-193O zICbCezwh?_Z{MSD=hxHsdrwcYZ;$@}P4vI!*VOlQlk59E-Qfu>J@*)WFaP!Q{d4ZP zFut7A;QT#L|9ejQ-;Q5X-<*jW)3-0fN734Qwma^9PtteCDf>3-Dn2>s4$x%odaX7@ zg9-bE0@0!P%h;auW%z-XkrN~ zjVyQV?oje^^mJsJFUMJPJlXy3<3?701zGLt)5d?1D`!o)^cw78=|kgWIdU*z|G!s( zr!B^QMeh`@bYG0oi{_zIqD!fLqZf^l<7(gR9~ylXeLrWN(7o~c?b-dpV^lI5TenDZ z-q2sf)dh3qHMD7Dx~~W78~>fY@xS-=$lPyTS^xH)VOsY2@09fP&RvtEr)SRrPbNq7 ze;++PS9Rv}^wXEd(9aX(u-^an) zWq6ymWwRT3K%3%qpZ6DJe=_8)5&MUETJ{t&&9?!K4#%1XEXH?5{7t_HkL3SWV-F(J zL|-R`MS2|V0*5P?yfre{P6JlKW_-H_R z|Fgy)lkH~wH(z(x^VToDZ0xUb^zZ7Iu0M!=jlZ0CTI+p#PyGrG^=)(jeB6GS_}5>L zC%c|6$iAW6qMgHYJApkW-v{+xa_98v`!%MM(wwhviZ^IW{AghDc-7Z|$MLUMSLF+` zudkg1JlA>f$p5+dzZo8X|IrQEKE&Iqb6Z*N4Gm=N@JJ-+cpXu&l4Q4$JyFQ`8W}^?Cb{}A1h%p2uYw=^3 z8l2|(e`I$|ZXZCpVTELguhV<$>*Reuk@0o}^Ml{#)g2yf4C{uY{9|MGK-}>kG~<^H zHoh^>4<`M=mwWC$$S#dPF}&9NA2;?N?>h6bziRw{lNh`Fe|7)oj{TM0XEOE$*&p9I zIhub;{*QW%`&ZoiGWPJt+xt48yo;0H`?B9VsQp;sV^quuGFQ5DQh6I#Z>75^RziDU ziknH;Pn!JaTKkE!DobDOsW)$C|5!0lzFsd_+0QEMd60dcG_g$VA8JiV*#9(CeUN(^ z)L*X^yl;?r?+3D3`sPf{lLJm3@n(+lsR9FSXgvNtj2S~t-#$?IIMf>673-aTBh%PN|EKs(hYM?TR>V8M=MeX%SU=kzL&DzS;=|Kd1e1>o z;3=ID9)IrS1N7!BVeh4>RilI-?Z#^wN8#3SMHb?L#Yot zv{d16-W;94PXAv{SrudJJd5#J*5c%}yuVqoNHHo6aRUuE_n7z6Mm42~_A2RfPS%wg#60Yi6n`X1O!K0}oO&nVk< zWbStks!d{pwwd-Am){OCNjs1O%*Rvr>q&V9JXh0^Z%xnabZS=DTAy5==uegwVuD3hZ~4hx6-%jjLWfCs=^ia%kX5WX z>Y}b_rc3o5egF8glN|>!gjXq!(6Zk?GSR%!?$j}J8}soCE{i9cud(llZ8=2yYbRjkl6R0B*yG0#rG0ZRawBqeSv-tKRT|J2#_pxT#-cWu1{t z(7tGhILsh@D^6=1{Rn6DJ$(Nsct5AciJ3DmP3`JazHQDY6>sG|?WUlEhCbQ@zIyk&C$H4s3442-vPG1g#qUP1>|Fg#*(Ho= zT))sjJ#f|2HfM;k>n!`H(TQ+7FLvYG!fo^Q_g)B(m^)asMuE>I&IzYU^O*h;HtKzx z!JG{bmYrB3pM7##{a+`oIV+NdR(**@th<${=bN&IvxzsKO8vJJb3A?t3+HBC7#J^W zGAEq>#oqhC$5mX1{&Uv?W{;fcy_6BpE4|Wnsx+3S_n3U0I7) zyUXrMmdOgOv6GnMyc%#*CpBOaLrnNnry;G=n#5^L;spAh+qygl+|;B_Y65+=Q`#7? zy}$37nXA2$B|=~Oe!utmeRS=sJ7>@ss-b zl8R0FbMRjE5cMwDpU;bJ$o{~BW6Wy~v9mmjIECMSt9)MHua&)i*+*c{{ox>UGS7|c zxcqVXjb+hW$e7>Nee0~A>mK!O-T3KT7tfR==~u?JXMW$%3|)>fD$fe5g?yt(`nh2N zet`E(40JTM*7EyObh8QF%pZ8HOn+OW_7R^v<1f!|iw`fW_|oM&kt1{WnQusb_L6aZ z^2~MZj-sRZ=}eC2EM;!t9Tul)U(YvYuJJuDJP8jQKAmfn-}mVEDBv&Uy}?=ap=4G$ z+xq>DtpoQTq%Ggp4R>i@>dRi@D;1vQ9s2!E>gJjazODVAy8RX5yZ=+Sy)y87Vwb)x zIi6Lf%~<~gU+IHO=+_&RFV5$MkAYmZs+_=gUpj6sd64lYzJ~r5bJhHAh421b+xiw9 z%%5XS6lec^Vc)$+zS-yYhu_t=3lII%kF_r3w8yW71A62R^HQR?2Tl<@Yjb;2kZW z+`@c5&oh?tTMwRh|8;}tTJrGUC$)WGe-AIv-%cnNpK>4eC--06wbn-LO!i-iiDZlp zx%Z-N2>ofhxL>t04)#i%$n}U<$N1hF>?te!VxRgM26@(p^iSw-Ox8<+7aNr|VOIUJ zG&@%TkdsvMduBn*RNJ#K@h#eJ58YI+b?h{S`a| zByH7GPm%DU`J;XoO8C!WllGl?TDJqgey=Yl`r^IvIk8)KfIcR_RogHf`<%#c ze{+o^+UbIqjE(kRyR?ron}y!I-{Wj+_F~>^klUlOW#js4_noarCyNSl`nScdoOIvd zdjK1S=MLdj_%vhntoY!m^34;TLE<-_XKQR7?1{bo&cI`0d&Z8y<+MFXU$8yov3VeO z(0q?%-`O4L!(;DnzcBFFL0y(|S?RCHPVBtDV^!=wW!$02CSzK`1xuxrx1f8bL!V~ zM-KjZuNZpd_fM8T;Ys`m<88apicL$Oc_;NTDW`3GhUl4Z{yo5ZekdzEOZnU;6aP#3 z?52;GN+0F@UM9vly}y43bM&Wkn`ED*f5r-VCyP4a$*=YKB0UlF|uAK6db z_FRAX_CESGRo?B1?gsA-Nx$5^O8Vx{68ERsl4pv zN*&cZnU{ygoZF;4wy)puJe((d*Onn`Q+b#2k#X*_+%Dw5Q)Fe=qC?g@v{S>k0rwPQXMdyKW7y!Y+3NV)^&a}` z{$_W7ithkc^1Z++9Xr?htNAA2BEAt=Fa8%lVAIL zJRY5VC;v9-34HJ1E%xJ1h)!z0b1o@;{Li$3kA7xp{-6JuIP@^-J-J77&ojR6M8ERA zD4BoceHnY@xA|smy8G0Ig^WG)A^SEDl16XOO8@D5n6V}6mwgMdW2uk2^lv!i-38dn z&%y0C>1W@WvslLE8zplXpZzl~(f53^6C3B#ZgSurVvN^SmRbeqnc!G>~(p@mbxYx z8+`h&g=gW#^ygVwukX|Lulw}uoYDHher0x8-Jcy+caM?9?z0=wBRZ%y@1NQItwB5g z%DE2dU!(KvA!)$K3~Tj-#PQVDSP$|dSEZ-Y!W$tR?CZL%j_7PFPp%A;MKg7f%#PC0GS&^Ug8^Mey!c0RuRV>s6K`c z%8j3%-^BX$5w(rFUzWNbL^#>;H$T^Z*QaDIKS-W``R||3HgBx_LwS_tliT@Mbi0{SLV&ol=xkX@Pv0rq= z8trxQ+cFngxpgwhn-|>;wn3e`4dQFv25rhc7HNZblAZWq zbiZuWZP8z8OX`N41)dikqkp0ot0Ns-1d-i$az;0w5T9V~^E~{9)=!f5y!ts{^z&xzF#Q}c z`q}j(kA9AM^i#Z%cC_qhd(__$zpswY+$M5+_^i>5)=@z>vRC`Et{)xg`suHvDn8DU7kmKV&}+udXqhb{LF%$zV@x5div$-=xNgVdOCMnIfoa$pPpo%lC_(= zo?v|*(Q}f#*8saPGX83W_pQr(U&;RDCb13O{uAuG3}1T<+U75thv{(-@F92HF%CPV ztc(wL+-TVhmOm@8t=A4(fe&x^wDk}8KHg8H$kXwm@S43}@xF#9zl5wB-@oqngqJX5 zPf2~UcLKcW!MogXk>4%-lYYurp}xuPS|3^IZ~ID|-sn8>g4}|RDlS(6`s#-teQ&ahH3RqD^nRiEYw;7rY{v!f;=F!bIe+tk{NHfjM}N8` z&Yq1wsd*58MgRJ5_*CiUsD7SB&wDcO%6_KM$a)+)zwE2h-;YY{0G@ZB8hq`8`4d9J zbTQe~aqg6kFIeNcH2pXHvJ|@Gw6#s}?63W!bFs%z%8{A&a`&zO)Ud7hF z@*{YO|;vZpezmiIi|@Vn?k_-|Euk7wfR&q?efeHMGq z0*hW;p4~C$_G@tNx>wIlADCV_|Kl+I^~8tvdl$9(_w-c{2aS)BdoH@4k87LkV&5~i zF{<|hX3G5ah7^z)2z{`-j$b^Ew|?!)6#W!{ti z@+@0W{Hny78_(so)joRB+wdXp`IGoy(}wBz9%2LW9lXz5){eXni-3RUc%Ej4K|v{L$J+F5ChB zsEe1iJ9zp20rz88(YCXfd&}%$wK7(mEyR19`e)q8v!AQjFJ%2pKJf!K$4gOVuZenP zEXbZ+_0#BQ^KIfo#QzWSz_?nqHm5F~;uk;Zl&-yBeP~J(Wv*^2%}!iOY<0mI=JAr+ zM=y9Ax?&IAz)-pii>oK+|Cf1p*M(DO>`=d8FGs$i`Sz{3^WPUJu|drX=OkXOBo>h| zA@`i{Z5Qk%ugU|<+*|E|MTRFmaG$;>!8=aTMU#p9ABpfB-2IKtmzFKfAALgfQ=o&8h3!x$bmHovX2&_%>({at zeVi}vvquG=EgIKXy^EL&eMox)_dCzgrX#jO%(-`I{x!MBDQm7Uayvk}mh_gT`D4?- z@8}QR-q&Al_QQGKATeqF9QnF!*}JRWX>`r=mfie5;T>>Y?C;b6vmJ~-?DXs^_SA3Y z%6*8}zo6fzbFbVFeawNMtzzeTZ-TYB@N4GS%XbRDlqp-9|K)9kGLOo-YOoBk-65Ih zUH-7K{qSE0|FX`nXAQRqdiL*`bM9q)KLxLhTFgfG4@*hxde64(vD~Yl-54eLS;4zr@$bZx2krUauuS z;9mS|B7U!Y; z`HSw(dHTZh6{5Re5YxR!JwK`C+k4+(>`$$I;cP4PZ;kZcP3qj<=xqNsYq|9`kDo24 z?xWhjNx$!;PdU^72b;vtIw$B?Y{Me)OYibdX7P`{0|WQBD*5J#zQ?i{`pa^g_>Mrn zfBLFcxrZXYP<-Ni{9$(dJI~2J@ca((nWyFcM!C?-J5a@^ZuoR=d%qw5Ibqdvvd?Vq zxrqPYmV3mEr|hnGnIqmU!?z#HeHR`-OZ>I(-AO`Yb=)O#+4!``^QWiyHVD^u#Qz?1 z?XY&=J4b=LWKPrX!u!rUywlY=n!S9S-sh>_B(nUq%zwr{B}Su8>Jj_zl6(CXpBI1m zp70ivdgY#f%_Hv}N7kFNKVPVAyZZC=d1Cc*{Wtw?>HRzpAay{$c{^!*jjw;={O62q zz0-)E@d>AXLK`(EeUd$>cdBIXjNimZNtg4C`@bzjC-i?2x;uiN`(;i6cgMnGO60PY zEAJzJw}UJ1D}R@I^LbO|U-4V-7SX9on`<-`Xex%)ZH&HjXqvaCozw2F1Bll() ztCP)Ks1Ay*#4q<>jgHXee@2fY2hpXhWqG$rqv_9)XR+V?qCoU7iBL} z;A_OLP2Sl`vBfFj{JAMJ=xg-0QW>AwoxZ*~HQ4plPD#K2_Vu-2`So@)W`Dg!`25mh zsqcT@X2$C)`nQD0vvDTRdJqGh%>EucL@(|0Utr!DO6)PUzeXL(M$0R+xuQzsJT<$e zyt04BxW4`LKa|JKH`^*%c>#%DZiJi~Pnz%sLbjo@0pj|T_ z^1f&9Y_51KZB)7KN}C%#ohy?1e)M&v&NymrKG&s|^UYi4wd@(CE`z3ck*cdacr||4 zQDsLQey`4&L(0&H$?#hS%_QMf^0>}DGpVaQpDT9j*(CLdtssV+D)+L@-SNa%*(W2Tt2*gsgHV! zX?s#k<-HHeKKEuYDzZ0rpq(&MVnyb!&S^?y~H-+xZ4#YYo17ayB%#RAK~q zXFRsXzJ4p$aR;+^m9@4%Kt1E?zNqUcwsnjrUr~pmj-0MzYF5oHozHVp136s>&yTd$ zWEJ21QvY(UU)8j>?}VQ3Xe~U3Pi2o?-izn%6N&wJPB554!r>_toaR_=iBP0;B6Vse{+Y(pw#A1TFCt~ z!S!E2AKs+S;`fjRa%8+^cS>C~wk~AhsY~vu4zEk68*g~stwHFGTa87y#*VXLBFX(+W>X^Z`i=fT<$Whd+b2R zdtw9F^Kkw9i`j>XqC5Pj=&%1OWQ{I~kIS>;I!dz2;Z%qEKj|-#@r;c08cOQc_3p&( zp1Ay+TetrSz2`Jpzl+iCO;;=S752~jqANSTr*TkhOWMo+V|%5@u0J&6i(*@1S7K8l zSK-6h)AU#R2k_?)yfMt4I;=g-EnWDg*nk}m*cEoB_nZ2Q=a%+Qa_z~=^&)hW6Wx&C z;f_yJmmZ)0G^m@>fsLlFYVrhk>oMprU)Yy@tBf_rxf0Q%RbUcU?CMg1MOsSEL`vj3o;C#c20;8$g@0$)>(pE+**Ojq{%j79dwh#L>JKZ&2& zg-kA*_r+VE7C$rRm3}qlmHwvc)|EBzG=VYkdo|MUvi?t9T{`f4<;K5|hkx1C-`LuE z>(i8;$YAfYrzWc!C{?V0(I-0%c^vJe3VX5pLm-Kh~OS1X-CE|xP z@2r)w?=6(?p|rbvGxs;zaeXlRRkv>EQ1<7H>t~9Pw~Xm4t-O)73XUZ2$sT!^SRE8g zUP0zpB6Cw7JK5qNhwZ;nX2#r$WoFDhQpT7&H~Gps_N)ZA|8QmY#No>R8;GZO9)P``I8pT z7oYoXY5#@p7@>Z6l~^ykpSteH=i*DUld!KXwyrHa$3lERu*KG8@+V1NKe+zSb+q2< zr;NI?uV0maOnh^H$8_y;`_<}#&z*6i;BzPFd+jCJ3s#l%UtU|1oyc>_*c|Wa-qjCX z_C&CxfAP}3>>GzF2X;=b%)U3dvVYOIzJe~#W~;@|?8MJlUE*h|vrm*&icCe8qEC_E zz*ETf7%~<=BYO78a1{AX?k{FsFy}B|l~|b;OWt{MLuOg#sluGCWj1VF={!BIvcJ&J zVbzxmRc8H@~_xzxCC%`R%Vhkl*?0)A`-6zLekd>YMq! zuT9MFe{Dwo;A>0shhAHoKl0iG`D3p=oj>u~OZk(py_r8Pan*w_<@Y}LW`5s8&^|OH zf8e2|`GXIw&A&Ni*WBB?peEk@{UZSm+;Oiy$dI`Q> zg0Gk0>m~Sl$?~-UzBa(uebC+qUwp*);C=9QAAH>hU-!Y+eeksrzBa!Z)c*n=rC#CFTd#8de5PK@6n@7y;%~8tdwGU2 ze`etu`7_*KaPPHG*>rjSOhqoQp9?3J)%W6w=k&ctcTM8nKO%lF6&lHRV{Nx>!7V-e z>=eNZ&MkY(vbsb(lS;$_T;q{YrZt!fcBktjX)@OW!pqYYj{(=i%JO3-y^Y_0e?5FnNBNhImhRBo)j=MyRi$ zFT$O)^UK^6$utMknTAvMBt3*j!6o9IQ65trIe$qs7HJ7~57nElQ`FXzi6-K0nc;fX_?vn#(x!N4 zVyKKYt}zl!WmY4)5pYeSl!9$(`cdpa<65H>7)IZkN`!ktw)J7S6_M^l##I6Ar$^vn z1iR90t>}r@rdOsT!|YMxRwgsi^W@YROb;4|mk%={hw|;!te18qdz4P}Mrva*w|08r zEmI$fMMksB6%ht_raj>n9o~O~FJQg(wvA#h?0+L9#T&xkzAfa%n`5exn)^f zPdXWihuaejgSErTv?mg=v{*uIC=>0~V}5x{`-N}4n7>fqemU3EJNY1B;MOQCg+_JK{dBXWP+USY*q$9!A zu?VF*gPCBAIwIC-tqZ2&QfJhTgK%VZkBqfMYE4Dg`eY;(4OOJ0Yl5kYHu>Ao7m8p; z30-CsnwCVSsXG~qbVuTuNZ3^r1{X>h-Pc=F!6aQ5xXI1)ccF&WOh^7uERoiZ`L1AZumTSgtEf$- zg6o@c*=mt!_If^aGyN7742M;Dv!;p#<7+CGuf7Wxy>R;PQfH4HjG2Vd$EV2a#Ffcl zPxq`2M^kB)Uf&&y#@FicAL>elBfV+0I<{6{(}~d9NG7eqnBmHFaEo8>q;#Efm8@>YdTPBP zG-*SaOeI2*bUKo@bqvC`o&+OFl<(pPVT2mNy$Lb%*9H@Ez@aqDRe>W$MG`SpLg3Uqg>l;dVN~ObxFo`IHt?23refNsk>D= z(V1zIYbFtkFp^UV0xS+Ki%>AsMG5JT7@p3vvb%A8M%$;(v%uXwksfJ)riIyd;Rrr- z+|o((CiNyU&nDWD>++tA*b?sD@Xip5itdC~+X88^=@qtpN#80uf(JL>03G))+zYz3Z{g~ZiJp%66}dFrn-Z74W@->o2^nk@pv@8Mx|qs zNKz6U$PiZ%R`(>jS4XKR(`6*rwGO*L8{tSgl!_XcDLG<@*&_^cJ)y!mz0(zO$B#JfHTOuj(uh1IU)NRsr7^i^= z^ch<+M2R@ixJfV3S{EB|1unXE)6g(AE@$MYX&*1{0<^`TjdUk7ORxy(zCujF)p`m} zt58oW)gUnW(Rf=#1eEB>=tK$`1>ZYc4Q@pmU8eesaiscMabV&x(SM%~*>xMK zzWS8WpyV$n@IcF8QhiJ4UPNVV`HZK0##27yDWCC_&-B$LVzH=5QMUseOr@fFfD%FI z0TPh`Fa4B3&#@+z5O*cMK^tlev#`TN#*Fq;b%IYC`b=iMLf;972NprT@wa+05?U7? zVGfrO*0!FNMYqu7x3nVhGx{oi$Y>VZS)Xoq!Gt#7v|3Ox(wyAVnf6qB{*+sn?6E<1 zH_AOLIz!@f7!Qm)9WttQQN|kU zU#2(hccYzgJ(rv>JL+TgBMUnjjj=>17;8=FSXHNMtwVtqnV&KdgEZ*^GR@d_{bDK- ziZJF}P-Q~NHZd(R(%T7kfScm0B@}DdkqIy^+miuZFcup^1AHFM`F**yOBPzp$XHKD8?dLy+x{rtv>{XCg&%y$d@L+|tE`V;XO zqqVK+Ce_w(lVq#5_T{bSx^zi%yHcy_xNXI;YDt@fimLX;736YlUa?HBb*w7%wXwNg zu1lMmo8{WN++Len8#KIP`4YL_ys}Btx38$x?X)+TdfMCC4cy+;B6RKT%XPae+g8jG znCo1*-qLPbzO|{Pj=d$7Key@S{JGC^{cH{CK68F{kG-DEpZi>;Nq_EG0q@d%?o9sN z=Xpbhz#C7K-kCqQc{1l_&RyhhUs6khw9~L+#qt$gZ>?RS`D z%`Z=~UBk6D(-jkL>U#u2H`kVDx~I<)R!Ez6O`d;VJ_;_yz#H)%s$aII5K}U zo|(S7r;`ZHfBj;AdAUS?iO%vX4CNKmXU&=JpW%12h1!3$e;!#nU%Qlm6qXF0o#{$+ zM=HXJo;BSS5_?1JdMP!FbeQoIVkzi1IkH;4YFhd#Rl&ql zF)eMb(A^$og6P%D;%GWRa&aal!KItu9ZU``gdrcy*YUDnX2|ks>FNGX;s-quxaEdp z-26`H0!(yFhXJPQj4io&#qM(2j(ayTAQaIpV+im9R{;jO4m|I;j zw{lLUf6kl*^RDr?E>l&juf4AGn(Ne@+1JjlnmuQZ*jF+cnuYv&WdG8LrI4d#Ict!5 zroXLjnLov1K%xo1t!<`X^q29E(4e1{>Y)4wtDT(||JxI1L9;Hd;t8WWJ&%xY<_!E@ zIF;xYp4RCp(&`n56liX0YY((7uUp#Cj9O4XG# z`Q7PoLg{!L zb0U#kO^k@&$#g|hph2nHWvwgxEe-7zE0$|NaC_(7;ke66H0kB$DnC<;U+|Q3>EebD zjNfq28davi)$4_!*DtI*GmyG?5R;Lt!$3mUj$I3#1BY*D6efe`wZ26C$Pclb8 z$(;RU*T`j`Y|fv1x-oz5spDMB%vI9v`E}a-da?jZ{@35)+%+^$)9)?heZ8iT*0|Gp z<%X}9xZWR6Wc)0q@Fi>m`q#^dU1|KAe|eiZjym4(E-qYY30=L#mlqYmjpuK6Co2A%X)>sMV+_VIEZMU@qRy5R^7?gBd zgNZ8}*h0OLh8i2{)$J|I{Y#o_Z)&^Kua>QBZf~liVZX$p%^D=BTJeodZFQ0)uCHCu zN@~T*mKON6c|>YW%?&Hs{KTkDErh%BSL2$OFK@k(eh8rBIubXoSYBIi+c9wk4jArM z+|pFn&=y!iRccy#T3E*p;_L0^lgu;ub4S`aU*CRRP?tkJ+Awk^hV!UlT; zzBE4VX3Sz9G8-(*g7I)FxK>CEO}EV$tVQlim`cpN)!Qvl#b6Dr6C&|8bC=Q9(Z}wJ z&X^UAvuTrIcUJ0O!60d5nzr*}xGR_$Y$cXnZSqMBW>Tg;vN{^Xu5}r14gdt)rVT$b zK`XV|?m?P7*?p7zv>O+$SY8)EiPS^9Rk50=gL&5Iwz0M?(9+sYz;DVX*&O6Ppxrky zdF(3N8x(8?>xJn8cq1*FO_EeM_H=e4Q=P7pEzIx&TVHo3#hfqEGmi_K{mfZro^K<@ zaVwLwTbXIIx7+kgsR_ySI^q*G!3IU_uiLuaU3{1K7@K*)UfCElb)+M)&I(C33QNF_ohZcC=kH5G|6`b@g_9&^>U z(rxzY=!O3So*vs^Wb>a9Ze*v|MuRprxCZbO7R@9w()??hg6)h%WaNtWtS#M6@=kx8 zzl*1ZiS!xEpxCO;=xr)h+e0A8QZiJ#Ok6RsV7=-Lc1LCXuI-rck^SYgq*+5$P?4Ol z&0jV>@0P2y73dE31tfzwm?cikFVi%!aI(k0jI~op?3KllY=*gw8(t+wWmAythiP-J zD5? zgRk|%GK&p^hu~#q^WuSr;L~vl+}lIR1%Bv+C7G)V?WdBVinune^YXA>p`QnR1By$r zA)1c(n`LR`XO^};&wm~c`Z|=mybV7Tii(;$qajlcl&WW*UD0%7pb5>p=@kvl4Yf=K zE?l>~zM-XdS%c6s2iC8wYY*JQEZ4*~#L|WpEe*|sp!U&v`C&wBec$pnCSYBunblmM zNd7GiE%nP+ut{d>pCRp1AYE%05jatSt9&$&wA>OO(wylzfLF|1gWp-Gx9lM|3 zPMF?e@7uL{_VumnR;}1M_mA}czDxz;+8gXWga&&Lp$>O$x7D%z!hNnbd!K8W=RVgm z&wZ{|&wZ|&?0twf&waW!?kT2w!U@EZ5lgI(riqi+YcaHPe^dItGM?^9%2J&;1ACQw zu+h~xFC#f@oAUHu?iMJ$|LX4z#(E;MlE2DN;4R)K=;uMK)%rGxqK@-&hqb}b&m=;L zm~H}kd~6REk@jB|x%(<{WjxZQ%Uuee$_HNr5b1`@7#0iN`wv9-uB$;-2S+A zTs8ZuA$`Zk%Zelgo!&Paq+2|c&aKY~KsFDirDr2sZ@3qItGG~pP=kMj)7}x~HL-y;F-2dk}p5^Abo3_U0rW;i&>!x@j5|SGb7z7bL_h(`O z*&2$j5oP*s(DUSktFOM=tQr@{VlLXv9x``t<(ZFl(J;3pu*SJ_Ca?x;X=o#4pc?k# zn^!JtF_5=B3rY5_c!sgu-H?>^WjD7<5+P|UID_>e+l!apKKD~nkGHJZZ)7_~HdxE2 zFJLP;iK^HPM&*7Ut4ejo66+@5Cl4IrJf6>ge@{ODz5S%0=j0dO-+$S_FXn)e<@Zl; zBF`5aZF&*;n@A@O-4C1d`5z+d9|#@46q34ru#*$~i_|Ibi~Mpyu4Cu_9WoHzj_Jb4 z;QLkfI@4aK{=X}mk=p+*e(k%AtM6{L*Uk1Sd83{5V^rKoW!{hey!OS<)Yv$2vAxzF zlU!mJ3pdIDPnpnOrOL`IlttzLm3tQ#tpn;D-~n&ZU!dd^ee_GJM6`goMqi z@k9Rh$DBufkBr-4gS)BVtEs~ezFO6PsIu`fr}dF>+l%jb)VHJPk1qJ~gtj7eZj0%H;wlfak+{?ig5NS}T$wGhibR>}3ZlD*L|@$6m~@`P)r;jqLvs8((*j z>v+ydiG2PXPxYVXDlxso^(4Eod%3;sr} zHR-YA|GyG&_Z)`z@c)ba;^9oZ51a$Hlan!V-m#M$ZO9(XCeo7cjyD%2c0W?SjDeBz z#b=F_zuo3@8FGj(+sQe+-62H7fRYjDr9UI(i_AvKpEOE7*`pnmBFkZND}nEk@<*#f z=U0w^6+TDG7v4w8FB>J_KT3Z2DEVZMcId7S>#y8{9w~pcI&}U>{Qp<=*X@@u_CXK- z2!z7VNckfFk@7|UBjuA_IP4s8DLJi$+_BV{1jZyVCV?>tj7eZj0%H;wlfak+#w0K% zfiVe;NnlI@V-gsXz?cNaBrqm{F$s)GU`zsI5*U-fm;}ZoFeZU935-c#OalL>Brx_o z*Z(QWj@3IRfiVe;NnlI@V-gsXz?cNaBrqm{F$s)GU`zsI5*U-fm;}ZoFeZU935-c# zOafyP7?Z%51jZyVCV?>tj7eZj0%H<5Uji*THANN89Qsayo9gNo_{(oz`X$d2MA?WtG3&{Z@g_pEZxyaerXq>M>&Zw2cwztTAcm5B-cuV}xP#e~E3#=$_3- zDC8?Sv-zBvxpuj!EOYylCg}M%{%P* zn~`t#%kCYEWYPNhzBTa+ma#skX6p-2}3kQkJT+I)k z!3i0h&ZG}Q2TotPtmZ@Kv-KbOb>SHssRVA z54p;DJ#@U^PSTyH&8gqTCGXvly7Y@@xXL#pB@LatBTvp5ZyA`s1}E?Lxz(njlXvRL zso%9HZC&D_3zC-ldH7hFb-AQ0M z-NP;OO)_k|Q;w-|oN7X=OJs2Zew!1WNk51O#_5<~zlQn4A@xbW{*u$yHFhf zbnCl=Jn0Yo@$N|7?xd+B(EZHPQQv*7hVDw~n|rwR{Sz6&pE-1WMeaM=CC|mln3pkV zj&bW>BH`7WOD9(uTjm%yuuZ8sLU$Qem2j1IDODq%(RB~EJ{R_0#cxSr zOQYYdDX?um|2AF=RBxdN9OSlhI~AGPp)xdMM|7<}_qz>^0762PAr24f?lQzKuLDe^UaBvGXDr?^bk{>l)Fysid5&Q%JE zysCkH|~UVi_l@}1KBT7Lc+`|`B!SQ~WZ;UEv~dx~fe{W!>D z=4pCU16&HcNU6uAOslESxmntl!^qRQQx)m?y3Eo?mD<$@I&0|%fT?c~epsm|z&rab z{t2bNMjL9oh5ror2=FEg|5&Nr9l*OSd{jij5w`HZDyOv`_<(_ZKIN>~3%u3BA5qRa z$~a{fzDhZL!p|xT&qJRgA9)EM`t;Q+XTv_|_gVa%%Grc(ajGmV^Rhln|9#nE@cqa` z?Agl0w+;QA1U^aq=-T&~8h23!xD=T2?faH;9zRC?MYewWYYtogtJK#;&P*d;pSA^| zu=tbUw*l_4_;aeLQsgn&z~d$==evN8mB+YCmGhT1WE?Z?jjL47fkxnF3pXg|a1pT8 z&$waw9@ha*AEy0raoX!3W0P$!t9*Af19#Z^zMy=!yiNN_3qP)Wx0iyiw(y@Q=j>!$ zpY8v+zf`^t(Z>s1`oC7b#o*O(OaHp^T@Qc7E`R@`d`pYLA2s-*aln-K+5Q%lDqjoj zlWpF;I!*aj9)zEA3olTwwHnHExZhVMW3fFEb*W|O#h1_%J=Cc8GehG zv_33;gBtfS$(xFN(09@A0dEIxwD2DQ9|M;0C-|Mn^SGr)PDM{DU*r(*c3c0qm9Mi4 z{`Ok zLirN9K2!dJ8-V>D{Bqh8xSamL{{^>$KMZW;d%<1Gm#hYk+4AdwcX{B=%6E5(hyD+N zGr)IPdgO7p$iprFE#*rs0=E9)f&;)Jzg?F8Z7BsfsK4F3?Uzphg&`c+zLF| zw!Z;5=D`!=CpLNTj{)!W;GYBD>%qT3dwqhp?fqE!x^uuYZT+tTKjVRa348?D`nwC? zMgNlu@I@1VYdrABfki)-{vzg&Ia`7IOnVpMU#~glffoZy|F&BE5@4|>84sm|Ozopp70o>ee8kd!26#JgrG+;F=YVbhFZu#-mk0hbu<+yJ znSbY2d*Ek*{T}#FfrVd}{`<;zPam+guZ#Xh`PKot{^O!Im9MW6e^hDYO;O)K4*U@d ze@yxA-9v$wEsTHaDF_x z51asg*#oavMb`?yLXSO-{~Y*39{leE@AlyTNcmpc4s82B{wv@Qd+48`zB@eh=>OUd z5By!|k9g=00w49je+zuf1OGknaSwbP_=E?3oBG2_UB1)up9lX|0YBkF;FG`-f0i+C zmH?mfz?T63$^%~k{I4E(2JqX!R-O}xcY98I;G2NYc;FSR69EV5JAjKkFypVc*aK&Q zCwbt{tD;+6dh{^?`S+H1@W}tqX97QC>|w$lV3B9m!h4nPFIE9>vG9Iik(Y}{-e1iD zFG3!~ZxaqH-@YzjYwr{O0a*G|W6Pg_ejnl!|0DFLl<$Qa@JWk*4}3kat#9H*;Gc)S z!{8?}KYkavyYtb+i&fEm=u7!ceG@MO-sFK9&-=xm_S*6l^dC96@|?H;Sn9L-n20~@ zo$P^cMt;cGwTFoT@KZf_{Na7OES~;M>{h<-ZDrm)WZUb7zT88fQ@$SxzxyqIi}D>5 z{M#0OSowbB2i{|0^z$R(-|A=L6VxYomtV%mSL%@u|3sb>_o|{Nke3Qu_y@qvz!3|h zpTFsVex|LT`S@?)*RlGV_`j6z@8HL=^Y=vNpH~h6TmLd?yz(6p`SqFdlP(6PygFgw zPb%L}vcPscPpVSBR~v!fvUuXV*Q!1AD@g0Z_?t=PbO3_18(M!|{p#n)HJ5y?F$2S6loKmG7Un05@Bh`1lv}5BZq- zeoB3tD89(T|D>GHV(;qo@96mVw?2$N?}L7_g|Al5mB?dUtA$&Y?`g3=m!A3K589#M zZ1LE~A8!M{+rr;g&hKvqK4f9|`y=7M(ZcU3=a2US+xkC5wmwQs;zOTQ&ewK(@C%ev zRgV1@nerb>DCZxsFLltu1Iqa_{da78ANrzF|NJuiZ?X6nFx@WjeHQ+iQor6V^Ob>r zyIA>76;aP zE>XU(2)@JMOKO$#2W9YIY~fp}e=2yZ-xA`3lUsqyEFO6t>Y%-y7XEM0i@v8?82dc6 z54g(0q8koJ+T$pBK{*36fnEF?%J+N{#12FM;g4xD;xR-2;d0u4p1c~1XFOgk{B5>y zBlc10frHBV(OcAS<@@1#D1RD!qorp*<#l9spX zK8Sgo`c4}7cUaGC5&c;C|IW3_`Q9S%MHb&i|6|~1S{Qx~9{{%P{Z5Z^zHkD#+2TK| zoIitK6}B+r`OnIM&sg|xm6PiLe#XLi>fZs}Zs3pn7F!K>0Ne5(xmx+A!p|gYZy&iq z`2r%Z-Ikv5dGcl8atq&~oPVkU-f!X0DBo_upSJLmNaoQl8_Z_^UVG#@=oJKe_~Yi2Rx@ z{R--r{xn*+13crywTF+!l=CR{J0~oj@%!iX;H~^W`iIK77yBA)|1TNeGl8dCdi?F4 z-z?6$szW}QFZ|NqrVH>^8c=!H1bq?OnsMJuE|V! zl9$X;&d0Ea3wK$3hr#RlLGbV+hf`wezvOeuY3TyC`ncqeu}8|QN?ZOfG`SfMBro|Z zOskzlsl^{*|3~C0{35?ger4!=B43V=vmQU$LBjU;a#6 z<&@Zm)z`<{mG9D>zaz0-IZ1sETg|vSdc(TD?TB@Aqgx=cArB_kkQDDperSp{UTib!Nmi~8@ z`VRUpe%`{Hl=JsHz-KJ{MdoW6eg#U-yX_rQPIM>Z(b7*Q zK6p~(W80g2Eolx%^u;lGIrY)L+uzA|>TKh01)qZdeI)GooP4ixzAgOO{!jjravCbJ z@56?_$=@ZO=>Tv0JDK?S6!zlU$7JH;liPr;d?ynhfAj$SbeQs=AgqImUZ3Xd+rGHU5>sx_^9{pbSj`CeZ`#vk5%O^=K9E(hSmlJ=CKLfnW&|l8}+^%Bk zFSqb&_$vi(?fvpN_961wYVr3f-&gxQc+e#&)zCXTExs3fkov8B{hMfC%3FT@$m==e>Gse6 zXV8a%t8DofN$aCT|MlZv{<^H-U;V#k|6k4Ys zE7?DPN#rZ`N&l{_g}=$b(w@M}NONfUalP`>%J(PxNm%}_`~ytm2zV>MD~a#)k+kjY zRnE=G%dz9-%AYFdGjBn0+SEU_OgT^W0f#Nj{U7nKK5Ji7Z&bc-Y^Hp*#jjJ&YbT&T zXyFHRYY6beIx+PT_&-e2_HXJ_><2>c#4P;}mGipTgIoV=&>w`}+QU@F$G^1#mst9< z$a62SZGW1L|D40%Ii_94P#67L{-@2+*+zbXZ=`2IsW z_t2j3Q*Pmn*!yYVRTd^5e4z_?i-nQzO5yLgg^yGI5U}n4v|rKwW)FN$`F2zTcNqFl zRzjZxF0=6U*h3?*<>!+UzlyzD`Fyg2{ie5pk6L=}uU)){{%^JLgV65>UuogTl!FT! zbwIwDiI+$Mowg zY|Br#G z%J*%*?LYin{bA~7yt@AGYS!N;g$HS0@H3Qi%TD5Hk+;A+4|hoz`?3D<>b1)GCa^mm zug+oLo8Yh2(m$^fMM2yecsRVa7`3J4%1YD~k^i3Kct*Smwf`BKuGns!sFZNSo@Ut$|*@N@XtV<0%uE@~OnuR_q$+P;OHJ|$h`-P@N zum5K?DBsuofLUALdh`(kw)&jKe#uW|s9AnyZ6|(g1m0okpHaT~XV8z8*DS`vN#yO0 zmsxInb=>mvOXd4Au$Af=L zsXrE-AF%jCq~+)U=9v9D>x)(r^%l>1`{Xg;QUh0@ui!JlZ&`RUc+vS}3zsY3W$4Q% z^;ks>s@TVVgz&rD;{Q?k9w`TI zG;k$*@^TbS0_Lckr7uPv0<*t#O7w5#UCI5$KP`hFtKZ6g+S?Ca>gFV?XIUQ*`L#g=!>KBpIN_4|2CWY=1jtVkdGTL&sjkG zB5&cJ_UA02{*$zS#=`iElhS|7|C})JPT*pTPXgzF%Pq|Od9oVV@;_&@vd`avpFsWp z4V)aufjQ>vWc=2UaO;0ba?xMd;*s~MEE!h6bJ)+gA%lO~YucO3{=qKMm*s!%Oy-Yc zz*awVSCi&&+!j=*&@dl)BaqsH92NlnDw_lM1LG}S+DKh zPU4uY@9%ZCQe75*%E069Fz`I$?UO=p^*;}P*oJT7cvvIpj zeO1T6)&&r)2z5o+XLY0E!A{C*Tz^bLR4NPPM>1g#b(KK(;K_)-i12>;#z-i3e7{!JCI)z`K7 zt5c=Gw!UlGk694LekYmo*VbSUo4`-CFuIWW{K9GrGv9r98~t^)Y)_c3b$87o2q~*u~b6huJ=zMY=@k6EPU-V0VubTy)@gVV@>^EOmCu!=J z@x*am8;?wtNy^Me*Wn*dB>~HA`A)%k=-1J|y<{x1c=o$wed+A6@b}rj5&c{KuS53w z5P5N2XZ7oQ*}&E0otTV$wwv2JNQ??Fqy#kTiVIjP1Zy zU-PGOKjAd}cj+6EpWtnM^KXHlDqt(m`PP5w_>b)Q+#lK7Zsm)<=5OKt#mm5U{LJ5> zd{^uR7JUo;&y=$&l7q;{rT;9n z98QO6f8m#@Px^1$Tlge!2e6gL!smf^0$Y79Wd8jj`t!N)-?3gf2|j7tdxNwb!Y{|d zGs^eqRN52&i+&bW5lPEMw2P$h@oG!o?Agj;NSAQi2dPT?S#hivxxnGQ|RB7 z=OXr}PKv%~+WHw^M@2p-EKFVc5In~s;=7Y)NLc${#Qyx(P6LZP;BWCHp_0R||1LHc zvtLNgV)pyK+ef0$(zn7-8L+kA#dmPO41K!eZ87$Gv(#_-U%ZRwfu)USZ27-dzMaQ_ zPaF99V$b^XWBmN6l=?xt_I15q0FEQjb6kIoz6{=Pxt@6WWDR+fZGAT@=P~K;Q42?u zZwjDe<$wJ>%K7j6fOlH_@l-^()o!WQmO&NoV+FS2lk`3Knb4>vr-erY9eqs9LP^8x(2 z>z5n;mj1p4Z0+lYe?Xt&?@BHGuSn~|um9FK%IR$+Y2{s0N&WkQZT&Uw{=1QHC>V6S)Dncwe)d%C;V8!~T(Wuu{`zQBbGELl;ztRdh+ z!jhXVaG-w&I5GzXRBv}E5znL&vB0`iFqw>`=zk$En2dTLegK$?M$)P$p6*E|6Dc|! z=OCv zR4S3OIcp-BKr#`HXCmI5yM|_^Jw$iK0fOOhDw0kIG6@u%ipJNdyW-J6B;FgKK6LK| zdxNo_h`P%#mCW273#1|e&6B+bsNTi93QxHi)EA4!BZ2b}A_h;-s6HNyAs*9CPbMmW z5XBaei1X{wv=V7C1~P$l!Pr`4JP3=5-ONlV83^^H zQh^AhtLbYG&+>NO9gYX0N#Vt^(V0kf2Q$*GXuPK{;I?j{-bg$wKTYk6!~-TBNCs2s zh)PAmU9>+WFP2_CG($S9B@{uOp|lZ(<~tP$h7BmJ+g@l{39PY3*<2dn5Q$=MB)+J8p_AoUdy#`X!w^7nUrZK6byAm5JG1v5(yaNGKkJ-EE0`(CcrV& zx&s)sNr>9%lH`TDkckrgpeN|HraDuJZfzU*o8)?;UISB}!iZuh%+HdC;9~_mLv0X8+S`I zfylZc4W);Isi9Sc3LJ;J3LKL5awwpOLjgS;YOqkPfF2GtSipu?#|GIW?QKOsPb&g? zTG8N;dc3U&)+2|W=(SaY%?RLaN5h_mH0)`~z=ftX?CFt#ExtRLRITkdHwW6I-4TV!^|^m3v&5oxK8UBbE)@oXk8y*W|U6i$&8J z?ZR~Zg)F=bll^)m;!* z8qRb{BAy6DLR|?-CWGnpy0D}|rrhcXQC=h-Tphy($zB_c#a8!pN-~nrmvFi#oeW9F zVB+qcXh!GYo>MxJU^-owiekJ%7YU}YF>%=fM&pBQM^eFbBp`B7mWcUqU7$0z#)Y*A zEY8ZPJDAdaPV{6jM26PGtpkR$EZ3Jh-VT(Tk&AP&uZna9-QMSb&ITJ?)(kH zUdh^u*TKBMMp`17CIUy73S&-Z)+AGbIn|@J-rgmm@#xw}C6NxK*QarRQrX}FU~oAj zrsc{HsRn|XOiBmdHnTg@?I|XbwImV*N7HFW7!BxQ?x7QjK@bYCs1EhSL~nyVm^UZD zVmlVk=(UPg>WI2zbWm?55r%jC4{I_n*(fR~7_v2&f)%lV(6hV6u zXZtMb*KKyDU8{)p&_@vp5a@HpzImK9~-Cc7Gi8$A*I#{Te{qPBQ2 zneIxUFXp?hRH3O#!%e5yhuaApcqm{DZBWBH55a`>lG39utV<7hMj8vxp?#fm&1e=^ z7(y%4!8O0hqU)onA!K$Pj{uCf8?6=XfAp}G@x@-j&D!s2Uu3oG*$VL3v#3!#2dh4J zmtj!%BC5I9pg27OXoz&tvQa zFXDh1%X*QjcP&Qav(PPsMxP|=8O3xX57G_{w-l~2SE?PR%GO#15Ti7Ff-%yv050}EUg=r3z zVPRk0?zIQlU-$M&@285iO$8DnNt_cPd{t-%#yh=T8inOHZ9-IomD#xg&)6*98=k@>0l3pAH72~=uYO&QORMt zWhAyV1(wH~F=#6}&j^-fy0&q;lw8-tc9AE(nZp{k;KQyd_|tin*wFh*D}gg9(9gMU z=(u6574#TC-{=a+p?(Tz?IrGFtd-_uKShS=+-lEl8Lu%(`S)cT0y|N) zvI{miX6DM6F;+JusMiF##p_0^x8Px^yJ^&ATwx%ww{8ZKX|IQAC4gEAT`#O5B+tXb zZ_XVmFn(6VmrO1$5Q7}BXmHheOxStPP@V1tQRA@b^#M1EQkdW6YdA-kvqe(Y8x;$DL=Bu8M2HXZcuBuzpR)rhb>=6X$V_Dcka>z8ML!K zW+SjsiWGQ*d_|-?k#QGZNX&aP5&ys#7#e>`EZE!0ZC%-I(Q%e6yFAcumIzgFgJQ7A zT-h85$KE&g#pTxNV6YIo7XBy#KI}ak>N_?se?Q>Hlf$>YCcP zVyJ&oaWd)j(Ll)1aY>3vI(^!4u}wY2A7Q( zIV*~t30&C4frCrYYRByUmuI4~EcATU~mVYguV83|c zC|^ZMH0np)?SOu2rmrMM5*WMzD4=Lc35AjcL3`!BcSVx^8A%5$dM6afLqK+wg6Z0o7oNCk5EOCmWvj}-Km7j;}3YQewHgyPC5gC+3Zl!`pkMBHUSglU(klC z2sx%R67s()@94G*Fel|bSE_UdD!PROBFb>8-ro;r-*|?H?Vd4j+CE?osaK13sd)7Q zd4OEbD6Jgx3b{>j#PR?*XgqnUT##aeUTj;Kl1%N9!Q?sESMz=XL$>8%vD?hoTl!_Z zV1-WxQbhYa*TtWTs0=7B3s{N`hnB$N@exkAdC~{@A^4|qQV}pn&dusEH0$7(lVQvj z!vkb-iFa;hmy_mvGW*z=w{bHE>lY|*=~1yAEOI5Pt2pfnV68ZR*4l41I}JIKd9cb^ z?(JYSQsQv@7sN?4gDU{-ga16X5fu*WwN~{-T^@EF#+AZ%^rjq1S>(5M+Lzp1e{Z_M zreDt)(&%LPrr%raPz=k=08IDB7F-ucKMZywN%OK^#j6lV@5T+o;M?+vgm39y^ao%c41f}RyI$e&D+{SgDZ)Pb6VDgr<`84yj65Bxd!M){IT2GniDiY=Z z7f3V3g+A3&a&BC1jbqnk&9?kz2kNi6v zDxw(UwH7LS3QqF{e{rL`m$7M05)plx2I}1AeD#ZT3vFl5G4@|va*QdnVVWogkV@-t z-BJiH*F+!9S*2t(X8w}MA=Cjqd*5N(MivRA^q12`c2OlmoAV8FPlG=QLUJ43NX3qY z^6qxK$99U%p9$tbn1s9IV&JUDvuraQEM6bzNSV52;gkzJQjr(au=FIYBq37*NGk$G z78EA|eTZ#aty7ibBL34|Bp)gLZ{1|@w>Oeg4*gTwQE@mb06*Mxo6*yJ-4GpmS|?X4$?@H6OPxs@?{zB(pvap??Q%t(P+ z_DCV#RLe0cta>iLcXRBHA5)LRgNOFt4v_D8`?mP7`E9qIv|qt(gwkljEA5J5J9t+Q z$1&J+BL`7L{pT_EnjCh%A8~rT7UE|AGb*^E(q6`w87HLMKLe=5uoq(AG$`bD<%S3! zjNoyLi+#tMlUPQbD16;=NcN_Ff+GdqYIQWG@N;|W>la6w_3+f+!NAmV7}poDRQ*Bw zEP}s9S4`P(#Jq`cq$;!2xC&`e1g*pVCa+8A^CC_VTrUM)Ka*`ttkFr*5p4kVMk9M1 z$jA;7vRT=!7W2XtFrR+G;_Mm_wrD=juyx3o0kIYfn9(s_HKRls@G2Whb@hZA;_j33 z`e>L}7w2gn2kNORqkMtFN?%x@Y6NW4{`c4-?N#84_j)d)inXqz2F=)1h9==x1s7O6 z>wCn*)5GyVtn#dxMT&+xO=qkXGT{w^+JGO90~b z+vWycsZn)ARcr1b=Io;jB2hFzT4*NzreXqSxj(`npY73cG`jIQ%ENwckpwDt_G2+r zbyG7d>+Hh_=xnikIYGqC>iZzI@({UV?@OxuIOFb> ztgYleUF^;HIrEvLAWNoZ=&mg4dh_UGaUn>k87ODK71g$N(R=)oMat6P3 literal 0 HcmV?d00001 diff --git a/lib/sigar-bin/libsigar-ppc64-aix-5.so b/lib/sigar-bin/libsigar-ppc64-aix-5.so new file mode 100644 index 0000000000000000000000000000000000000000..35fd828808b60c44b6c6862d606504b0bed1584e GIT binary patch literal 425077 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 L6}k_#2H*b!Ee1Cu literal 0 HcmV?d00001 diff --git a/lib/sigar-bin/libsigar-ppc64-linux.so b/lib/sigar-bin/libsigar-ppc64-linux.so new file mode 100644 index 0000000000000000000000000000000000000000..a1ba2529c9073b08a0e2c04a6fb79d65371ed596 GIT binary patch literal 330767 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 za

    Vb(LO<7zyly(4~;XIam( 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 S>3>Ldo3>x+o%_>0|9=C$g{po4 literal 0 HcmV?d00001 diff --git a/lib/sigar-bin/libsigar-universal-macosx.dylib b/lib/sigar-bin/libsigar-universal-macosx.dylib new file mode 100644 index 0000000000000000000000000000000000000000..27ab10711136455c298d47d2ced8d8ef26e82b19 GIT binary patch literal 377668 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≪ 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/xKcwzkgZ@K)P{lfg_bFJH4NbY*&VCIT<({?+M}Qe<-^ zl*wVPjFT#tjPgWWo*fRxbJ5UXq>zyL-sLUTrc>!p=HxtRL+$E(WDxVuBbV5p%x`K- zaRpp=NuiL-PnV-8uENxkdaILZoGUHbThomfaQ@@iw4n$`4khz4uI1O+$jSPO4T(Nw!e?}d+~IMP=2 zR>az=TpQ<%RIZ(VWA)mqom}>(tKZt-a+z-9>ea#wnRJUu--x+F|V{axtFIh`RPuqOg4^H;Z~V#!3x84 zL*UkYJJXi+SSXz)r}gGex{V9<)mY1({_0`wp3SHy{Q!&6R}IH=TSHOYuFK6-izc_Q zs;=z3G_wJ$)4$ZB#D+C~sis^KYf;DHLNXP)j7vcnv-M7~9c8%-!+J~0>eS^d%DO_- zPS(kM#N1!Eql>v&E`po?_H@kygLYJ*xV-itp@qekWExA?a+%}RVY=R|25&QFa!9c# z5*@~>hTQLRDFVkp??$UJDfmvFozzFDH}mF!PBaot#6#8Y=#A9Q=8ZuCcHv3waHCy~ z(7}P~m>owmc+|oN7*4FLzSN#6MP(}O$r+fG+e=eA044eQ;1&2cf@={Lp>po=ZUq}CQB9Ktyw_xUwjPps6gMG`7#Z_H($EKdxZ=V2Bf zTWI9X4R|xRn@V_-9rrh+yM=pgy@%Ors5b!WMsK{jQ@jr!%Hmop6>p(tP7O_&R8wCb z)p=F$%u*iEd7`k3`F&~t>wB{3r*?=;Wb%cLTV=`C6UpT_(-WX0h?9zsDdjf7(bWaP zYMw^FI@~r!dxrv>y&V?owek41u`on&>9SrKgHAY&g$GCW!AmgQ0z&_jcdQsxc z3cL4!)gnDE@I*G836hq@=~2Mitd=!|r6kk0auLkiYH{$1MQJ#OYV(*oe#3C2w#e^I zNksD1KI4t|JQ&y9CDDBtT|byM({RqXW-3mV-7>uAontNwKy_z=lkT1~o_d3g5 z2%Or$=em?7Z8vLK^$u=G$6>-^|5oqemSSsq17_8&se5ZmO|BvJxiq_)G|_0;nuaS( zy|H-KZGxD@)738JWQ~&#$D&2OJ&8>^geSFirfxUL>yx5XgMyR2DxBDX2 z$t#N+2YEVMcj<+iiPuA1t2yFvJ=3X>r$OeS5bl<}jg-gcUX^Mw^(TC-c;~3r5}M}X zJ(fn*nXzdcE*lM%K>4wTBW~33G^jy4E(?)02N=D9Sp6K*MmFd<(;U@9r1yGiBK3Ax zkEe-fauU?yn|aDTQZ?-cPZ?E7NB?lEEZ2mFIDJOi5bvG{rbzd+sYW)sQEzbTeTyo& zebL;l-cWa6OGn9D5t`t7q?Y2nVesT6(WZ;zp4px;o@Cx+ddjJLMN8vxRWysP7_ns4 z)#J8YHp)d^YJzKPxEhE5)5CSnHt$Jz=T;_SXgF0!;tepoX0}O|F=#FCRMf{{xZONZ zZ48Qw;!!C?)ug(J%q+;>irY#$GlgojXReVSj%Cc$#XFJDo5hscA#FBTc;iCD-czCe zMKfD(iS_uF?;<#-yXi}5yaqUgcQ2AvFW^~oZPqr-C6!wB7=z}S6?pXvX4<(>{orMy z+*u)pZ&`5l)@@6o=^bJ<+Ucg%cu(_capu--`HKFed2&*TQUV8Ty%bO5 zw=OpeN6S|PbGS<63Q2iG!%;z*LA+>`E*JwzUZY#fNeQboh{cK?g63M)I3-$Vwvf z1-u=KcRoTm4N{pc@~lDM5FM1M(vUob*1n~&8pB)vNFkHNixa6dF7s$-E{%5^giHtI z+L`ch3~xSG*<5qYr5Crlc!x2iSJGH2zZLW6_=vpDG{8&qz(8tPCdC7&4SXn5d?{o= zO$O{ld;o7INixd7-JQHeiMIygg;-`Nl1yv$fw(T2XniTl><;Dz<;4~x>K&R)(mhx; zmDDQme#Gcy;UK+7L>_Ye)>vkm-2x+x*TS=V>D4k|674QIwG!KuQd6nPjw9=GICpZ||~jOp}>t0jm>s-E7nH6?m|S?o-I* z*r9x(O{=cF0`ITHbF!3Oi#4xarKCuCcMNZ5X%)=7u!hZ5D;CG=xsoCLZDI@PS$YF( zBlyY_4MiI%@gegvlE@*{Q)CuSfHWhc9$oq0^pGq&LssMMLB}ySNA!lgS%l9;l5*N= z7m)vrEq1ibTzm+x#~|JK4HDN9?UQgk#>lkIHlK-ZGDBN6A|H*Ug7m`L|n5Ab>w$Jz9lL@p! literal 0 HcmV?d00001 diff --git a/lib/sigar-bin/libsigar-x86-freebsd-5.so b/lib/sigar-bin/libsigar-x86-freebsd-5.so new file mode 100644 index 0000000000000000000000000000000000000000..8c50c6117ae1009f2ffda6fae522e92743a7a629 GIT binary patch literal 179751 zcmd44e|#KO)jvL4Vu=u&pb?@*Su|?IiYZ1ZSTQZx5+ud#kF)^_Nodk0C2f{uw=Ga0 zB?)xdu7=WTfvQ0x*2n4-p_L*w=>RX0+7B2=tc+3)*(?!7xRJG-eF)p@IJQL}zYzE&_VYpi3Hku&Ol)hg@%MQ}QvW}O;#eF9q_a5v~jKraJ*0CX1UN>KhT z$5xN+Cj|JthOHM{8+bm)1Nd#geh0Q&v9$wV32J^fV}CC|9cYC<{%O!!Y*CHL+oboG zg5HkpJZy7u{7P)=vA={&_-(^JfBm2Xpv$ps#dbOHXR)47O#O z@8h70uw9JpB7F?W)@JPAi7lp&m4iOQ1pT`O_-)wEz*dQ^6x(lg+B>k%-#wt$fo=l* z73lYPQ2zp&ZbjN#vHv4%|ErHZ3)-V)RDpJ4`#X-^t&e?Q^NoV8!xq5tZ-f2;TQBzi z4LTFsL)iZR_DBLAx#`=_&8>|lDAWB=oh{n^<6v;%YZZE2YBGHi9&)?-_N&HQ?>(`Yazp0Zki0--qoMjh*DZ0AIp(tK;A{>~~@NrsG(q z-Ou3QHI9Tmj(z9u#{h272Nr3%3N(i8Ic#Bl>~YZV=>2qZZTbNRUX1-9w!`{ZjU$b_ z`?1}I?J)xUwkwkQKa9OAQV4w<_UB-`8`}YFU&HnRY-8B?`zf}!V>?KI-=DGlRrW0F zADTLe4?f~9eITi63+P|;{s?HB-Z$hc*!dp~7HV1sx*OZyu-%L832e^aK7b?Grm)?E ztrgqPu<^GETLZRZ1o+KY#5$zu8&Ssp!u~F7@5a9Q6<|LCa1Q84vE7ILFJn8Q8K&Xb zM(mGkO!7r+6%K56*J9@mY-_M3u$5r@AoA}7*j~o=Ahvnf`1>)oH-p#w zF46m+#DV|DcBaNxflkNvVQlX)%%GP7zZcu5uwMjPjg7wxG*w9bp9Fac+e)N0V*4bv zRhsX191mez0Q?Qmwfgv*KwkvjjP33ESO@m&vA;xPK;Ib4xM{swW$^T}-=HD6CTdV?fHalkcEc(bdqx>u1f-xZmpU-MMf=k*6 z&v; z_KUI4^u4IEyr07-p=pRWp~IQNz?nKle6}Au__2+7H8b7@8^d6WI>Yn?nk@ed7!T|6 zz6ctIVVxBIe5(shxNQ()5}p1H@b^Bf#w*Ofl;s`viSHurME&eU`B?MBSD;D{w)woYn-e=9#>CgLdQ2&_zE&SU6gSrL#l-B{3IE+E-&HDQP zj_Wf&@;~V}NY!62>aP;zE5~8x|7#lm$~69i=ezSipT=LER{s0ojAp`cf28Yo3F@!@ zF`xAreLbzvhrF|W(iiaj#i-BS5BnrWBK`(V0_{%|A&w{$kV5c!!nn>O^L^HDwfu7A zFF@m#fs%h2>i76wj3sn^d=YuZTa^!E`U}w4iZ}Yi9}sVXQq=VN5b>(~|AmG-fxzfd zjo0IPTM=ydHLipH=D*b^F%k2>0p;6_fTu>M?}4D*xIXsNOs}V4{bTtLrPb#PY4y1Z zCOnA2y^;4QT+GlepTx10xBZ>yhnsv7a}hrYlOBR|L>0*S7+3VJR=%II$WMII z4>J8a)JMgOYF>f31pGU%_gNp)?f+z&zFZCdW^^8m`N;os;F8Pi>-VGncAn*vKA7oe z!QRRdaCPeQe}qP@f2`jFrO*Y`pYb2{I2eSzyccQAe>JXu0E3J7YyId&eFtAraWm6v zVIL(3df$e6C%zMONgO()%fAwM+kT&gVoLgA==+`$pTy1NFND1PJK$e*`nOSkN1@MA z!=KjP8{xldF}V1SzWxQcKJ(-C6#ETQP5Gg;^ocZmx)|p>;;6rK((3!)sGnn~pGzQ? z<^4BQgoDQ?VW-4@0Nwlz#C`gDcjJ5$xE{ugOz%W}Z-zbW)ch~v`sW~^<@ko_{{{On zKbHSR)W{g+Ot}Xttf9Tu6N^r&$e^im=zX$%l8A1BR8vhjMGe4H+qZb&Y+OIm@AD|wGXZd8#h~wj~a{Mo3ls+m5SN1?nAz&`6gVdsAcL!7+7sIf59KZNT&iHW5E@)2)G`yGcqaok7z zH|XmT46x1h>_+`od<`+A*1t#6%KPOvLcgI859#Y!jCyKp$K0I8JD~3q(|r-;DM&Kgyqjddj~S z?T&im_1@x#{rtga|7Obnp0xV?0`#j9{>boO1^w9fjAfw< z7Wosfhl1yQR*`NWT$)vJvx>cV{uGG_?`9g3;D^XUacSGLDi0wbWi{obe z{btNIznFHthhV?O=lNtVjrj{9KeW~!FT6cXKYs~*8v25*Z(nA4VdM}a=l>Dfd&7I| z{^_N(^SwQ-elLbTkNjE1Ry_Yg)GvS6U}O9I+>d|y$M(1j_>XSKP;*T0( zpnhzZAb%0Y+rPm+(@&uNccOo;)OZK{`q)GE_~azY>)+zDrt9-Rj`Hk;ei;4vJ?yy= zLECLQ|L;*>gRuXHHEvmRS@1jZj_XpdRg=lRdR0R732d@^TAybAWQYbW$q>)Wl! zRG)+nYyOARuD^`_U;ik7Zrb@CO0)0ZKyPPm^;v(=*Yg+PIa@K8tk3tq$UhE!I|5lO z&z+E8jq#3ObkX1QQQm(Ej3S;Czfgs!hhT6w?i2c!N`{?%#e7rY7f^jFJzlOCVcLmy9k(I@lVJl`%{ z-zX;1FGF7961300B<5LAkHr4~?RLa}d1?Of>=~#>#2agL{$r3=gZLC(gyi1_f7AR+ z^!LzX%KJU+r4i$|xjOwJOq~CQ;aI#NSJ6-w5hq9QAX#PQMD{mvUfZ z4;b26OIE9SQRaUODrF!1eU0Y-E%0v(oJ2XV9}@ly@7_DF64kh{iL0GDk}M3uM}c^1Vl= zUx51Gf}2+tX?zjt)BGs^W?aAd5f7!6w*&f9I@c%jm6SgN^6DYaT>qnJznx1FFC#D0 zPk`=6I+{rE9clV?Bu%~_{APaZ&6wZ%4D|D$LqE?;g?zRS@6wQK%A z-)$*h5Ef3$H-p^{Wx4< z&ljBqzA{wqhjn@pPC z#e=xFsq6PbKRMNXM%wdRQNHGH+40dI{7h9pUf%`C=SSmRj(y78hxRzw<&%4{#P^~; zy5VmlI{hlt*S=yqp4{wGk6Md+`aHU6X44?wa11-Phg1TS~!^rkfb_!Qb@W+)2f|D1`z z%o5H2Nt}QG^O*nE?N#VUg8s2SZioJCd(!sb52C$mt1*A8<^2)YZ+_&z6ZJdl?Ell! z8OI;%vB%2~r`c-&a!+35ll!==k8bGCQP|VXkWKv2G=KLZ>T?4Av{9$805v~9cJ5D; ze;fzPFupVP`bm^`_kO#6Uq$^D6xj1`zoHQRO@*Y8Zz@>`( z=h1HY-MB{u%KV+spCcI0UIbp^LbO-tBR=b$n*W_>&oYNU_-R^w-tI?6{C*?ti+d;q zh@a7a-iBk8_c8d3<*09}8S$J8$gO@X-+WxZ`4Q_|4|0e&5BhpC&nN3ynBQuszV@2A z3$D7tYPhoY)AQ!mHhg;i{KbJK4NKgK7x2e7DwidwVmd=({ zZC&A(&W4qpO>0^j+Sab@!10VnKeeu5k>Zb7No^SDrHH%u-waGbimarq#vesJD)ZX5)!dla^rVAxf*C+`&v#ymZyQ00L%hbyX z*DPP1$?3=JzZNA{`|c`G|I3E|P~8BzaNq4#lTM72wwlq;jBx=&Hl zwqj?nL!;O^?GSz>gPzcloKmfqtVq-9Fb`y}6=(B!TiD$=r)p|y$rYU~aPJ=FTp@?E z7lT>nXUe!TXJ=u~cn!xES57IGP3Wu~P`8tialJ%sSUS#A{JUsYWZ-gtDoTBmdH-_Q+`rJaNJW z9nF#UmM)iuONrO01i6q?wK$`YxfoqxyrC9p9?@zbn$7Q1EbTs8K0$fjYmtW5<4rzwp-zikDz zX^l|?DUd$gaH{^sRio6MB?v)1E#|1bFw%4Bm`5P%F{eaUYEF@<=3mz8bfN28J>D~Q z=oHP%zD5ndGF-59DJsB_i-ik7Pm$}Io#Nm)*R*vp^zCw0qeCjZsA188-{}g6>oBeC zkO#k!v;OSj$w;WSZSBp*XJGf#u~e%5>F$Eiew|yKR>~Sq<*}d`siAk8>Dmr~Mj(}u z$y-R`DO%PpE9Pw0cXT#uHw(>%OE(4AX}PLBC20P_>T7hqmA5pnb(Ag?zNHK4c0EVY?M6b7{Hk5#1!kCLU2|KEg} z8umyt3I8{7n1E~6*X=DJ6C0>UsFiG;Y?fxD?%N{a3*x?X%z+veMJW}8-`=%oJ@&UnB%#$-c>FHT%Aqp(=JROJe}*pyi;n( zZ%Uz#Wy!smVMT4nDwYsrRq7hraqLtE>&o1+uEk9LF>gC@uIrY}^b)#j=3HZzLb@l~ zuDWLaRo7g#)Y0T*+;mfW)?ug0LHDm`fX#@$p}`r-MB2g~ zO}cHmZf*-<`~-!@yuylBv^+G1M9pzCHQaGCW^Eg;h;(*hzHCusZA)zjVgk;vH*^BA z({%E$iL{5?phr5Rl7#x9cb2n2A=N?YP{j5)nrUd@w7a{vkuHF2n3aPFi}S>oiLf}E zMA}f@va$*1bCe1f5blVyTQWUN9>=*Gbryza z90;^y1i3oGVSTuBEkhSaa_eol@zJqH@u5Q2VnmCc%cCZrBy}<)+a|6SWNrMh7blIELd~Il#3=6!uTq@ z(puNGR_`^pb86gbZkO8t%}__&r)h3?>a04*D`6~!L^b;lNzE-A9M`;}10A%pIayC~ zu(PARJync0)SQHYCTr7*RyC%QYD{V93OT;E#V8DluXEVGfqJPb-982>W(;X3i5p_e zS}XO1t2CLvUE8s~VGZs(v~^h!$U_|~o12WKbaXXH-KY#e>hcv-g*3f2a^oh4E|GJF zu^}QY*wC;+?WANmnRGrVTBjXLD9%*~7ena>#e&4FTw@ZH&`z-{NREkVWaLg6lsci) z2)w88q@sMLnP8l$xFvO&-h)mNj@coqj6GN5DycikaYiP1%a}Uq;H23(0&kc2w6wHb zX~Sku&b0Kj+>V&eTTq@jogsVv^-b+2qENc$7@HZd!W&&Jw?vxS&BTp(81x|xaDq)Y zX+28?aIT9<9hD-i6wSwdKHPd;sc-s0rNmC?nMA8`pt)mBQ`=gtHs6`S&U;+d2ViN{>azO$jBRrjbXLlKl@<;wO* zS1U7x(1!_KAAu3#z^cwwv__Y~i*@N6k<7Cmg*FDOXB{132W&|^p^hEX8SQ}*oQ`62 zpG@62R36FreO!g{$j%09ZNgQ6a|LHXx>huyz8V@LaJsBZRSAsV*R4dOf`YV@sw`bC z(*3X-LQiLRMO~5R4&0X4y=q8WGo<|&`|5VpR;J!i86${W$qxwQRsjf$$0l5vXb#h=VhZKi9W4vokf*=W-YWzUGegD_Wb@uEM|o zs>ql(ye33_>TFrlv987HY-+^c3#&}ia!qGyTA^vBrn5DjqiL0<)tc65TB~VL((|%2N zXgZ+jE=`9t-KXiWrlXpUX*#aygr*5ir!+mGsr61(ANiUVXR+0X``mi znzm}%u4zcqu%;U{4ZcgAcZsI;nl9J0QPXBkTQ%+0v{%#3nr_jwU(;=x?$C6nrURM| zYdWIosHO)s9nj_YE5f2t<|(q(`HRuHEq{4q-j{w4VrG$v|H0&O*d=0 zMbmyww`saV)18_QXga9rE=_l9I;80yP4{WKU(;btM>HMP^q{6kG(D#2aZU65s$B{+ zE!DJ4(@IU}Xj-f35>1;m?bdWy({W9wG|k6?O8OnYrn5B-YTBylfTsI29n&rpj5tm!dL^KhL^uO__|`7{k{x<%6< z*5psW5^Enx@5CBv(n0W(?!uaM(jQ_iF6m)BGfes#p1mP0@mV3#+pvzAwA*J@;2i^J zVr^q3Db|$ECdFFAIizp5tSVBh6|E-48p|3|td*@L^<#}U>3dNg()Xb}r0++0NXtBq4aoOBM>K$FhJ+EmhcSa(l)1=fF(V)5!e(i-Rm z=~Yk78z~lxkCN76?J_AAt&Wj?8f&FVmtYMxX&v;EbQ#vrlGbCbE$Ov*CW7=j ztkor5jy33{H(;$Y>5X`Xg|q={IY~LdSP8lk>pMwTVNEJ&E7sDIuEttrQY_*vCT+)> zdD1mlA4<9w{(-au_COlK8hg?%tW_orV@)?{1np0{4((665$#Wk#m`lw(6ee%*j)|j zCbU24-CW}j+Jp8dy$9`2dN10abTitYG>Y~ojidcZ`_cZS_oMwux1#+?x1s$>x1;?@ zVV~WkpGW(X?m+vKK8W@weF*JOx)beB`bD%q=>XcF6!tqn`c7!_W(yyWYNxzQv zC;bN6pL93cpY)q(f6{NE{Yn25?N2&{_9y)|+Mo1sv_I({v_I)yv_I*0(Eg-Pp#4do zMEjHONBfh0AMH;%jP@se2JKHeg7zo<5!#>hS+xHu&;w|H(&y0rq(4UclO9C-ll}zl zPx@1|Kk4&mf6_6uKk0v?{Yej@{Yig@_9s1z_9y)X+Mo0Vv_C1}RMEjHe8|_b;MEjFk@YAF|pEXQ6&1a2}Vtw@}DV_^BNQ&ow#z?X5|1c>Yo*gH} z!y`vX&&Km@q*(WUloZc{BuMd`+%eL(_^c^XJQs4D^jx2Hf)vjso+N#{4;2QA=SuQO zOYyuUDHfdw5ny7yXAJbw}-#X9ySq{er8ATZxMVR}+VbEx{Dsx`BA=bsYFgEpa#TgkYYkbu;mp;3dTU#KVGl>ed~^ zLxPtR4-gLsZY17C+%LG9c!;=LFpJi@k2oZ_op_kIQ80_zI!YWA93~zkt`f|mw~iB6 z2;N9MLF^aYO`ISu65LBXMQjP)OnicP>fgNnEyVDqxPHO?#QDTyg0~UF8{+x}?;yq~ z71u9#C$XP+K=1%@IdQ+>L1K6*T)*I5#CR$U*DrWCaTRf+;347~;-KI?#6jXJ!TX5o zi7N!}CvGJ63mztJB`y*?LL4Ht1hZ;eVa2%qlf3?e#NEUbf?3tAn~BE+A13Z69u~~1 zZ{0yWB=`vN0P%p}3F2ME{eq7Y4-t0@X4ACpBMu2ZMm$X1D40#vI!YWAe4KcUxJoda zu63NaLhwoA31Yus3%jie;v&K55Yhg`mf(Ei6U0;h;`O8BL;Ftyo)BC_oKHL^7!UZN z{fUPKmk^f_4+%zxhxR8P5bP%|C+-(qMqEMMEx4R`HgQPsOyVlyM!^-tHN-)|=)lna z#8rZ46Y~+n$qK>fxX}K@e!*45@XWY=!PUeeVoPuh@do0l*TnvbyNM?R2Z=Wmj|pBv z+)q3#xSn_i@sQxVoUI5;uFME{}lTtw$1>a5Zq6kPdp}g8*vfw zu;3lUCB#F5cM|)F2LulgmlO939we?H?iRd@cs6lJ@NVKN;zq$k#C&zhWKi%P;vjLA z;C;mP#1(?~6E_n31rHOq5*G;`Ar28+f=7ur5Ko;D`zP)uo)A1nyqS1R@L}S9;$gw# z#5;(G1Ro(DARZ7rLA;B&U+_`lA>wYq3F3XkA;HIphlv{nPZ5t22L&G|9wV+2e1dqK zxI*wr;t68EU<*y#njkI`oJTxGYzfXMK0!S753zq@D-U==a1n7n@tELZV!mQ#a#(N) zaS8E|U`#5b{fP$z`-#hm`vqfC1np1UEx4R`HgQPsOyVlyM!^-tHN-)|mBc~fD#5df z>xnA_&mnFk_6x2eZY3@fTumGzwglG@Zy=s}RqUU*n|MNSka#okm|(n!9qms%EV!O{ z2l0^L<-`NT1A-fgcMIxKVJ3c$7FOI7~c7TqSq|@i=jX z;Elu+#D2lu#0lae!M(&&#FpUA#3zWS{x0@UY`p<^LU2EEKJl2~ZNx>y!-97ZmkpV*oXJR!Ja;&S4C!DYl1#NC3+iDwgs1kWU{B5o91L0m%|6kJIhB(4%Xo4B61Lhu~oMq1P6&X6ORdALflV0EV!O{2l0?#zU`rPfOtS~ zBk?Zce!E4iS$M2L=)ck zoFFa|+)F$~Yzf{>e1drDZ({$%m`}m=3+^Y*Cms{Ljkt(-Snv+w65=7jJBj_o1A+&L z%Zd914-!`pcMIM{JexQqcsFqsaiicN;u_+h;621a;wr)Wi0g?f1n(zqB=!p)CT=Az z5`!Q;d`h=&9pAs!$e5IjM=i@0C# zQQ{%uZovuSeZ(Qb$B2iC8wF1hj}iw3A159ot`dBLc$~OG@JZqcV!vPuuDvxuTqHP; zc#7B(oKJj$c4guFi|FF2{SY84_jCK8{XZ9sAo%Galuvn3Xo~J6f6F#TsSV8jflix`u z6LFYu&qz_M$9f`}j9God;q#)e_6W*Lj@gGJFZDcCC7Iuh%<&#h9Rw3ebb!eHY!6T1 zi`{VYxo6VOKO5)oc`7J5-_~<1Ki<=b{h$$W4I*d==y{5floftg&r`L+`c^p!4+ayz zM3f1h_&Q5Y(BI#WbD-1mSn} zOH-xo?>R9o@nSi5>mEQ$qdDKs#JZ{2naRg^WLYv;X|5b8 z@g81Y?7W~ZL%e6d!toxf4|OJI-&%zpv1gWcuGeM_Wn8V2EX!mlwS)KQ=vDS(fZ)kAybs9WLBHESFIDoncslDj&2s zRzan?JQ*oin*2P6qhJo=IP@|Z%EK{EVP%wc;zlJ(+D-Hz7?12)nvA5(^8NqvS;-JzlKni3sZEx{Zu3`PlR8SA0cXo%or_YSHdKZa*Xw$<`JdJNKZ7$= z{1tBYG@bgK=Ko5HpO=^}U#_LZVc`vutpKgnI*8gxZ2PO&tAN#3FnS;{52NGgoU-W4 zFvmm`x);APKblvT_^xuAeZ$dvslHTQ<%#;EsCu+MVf3|z=VboJ*i(VgnLqv$^-+gL z&QDChK}HYE8tzLL_TC3kQ2kh4ehjBMFPQi}P7_;}ho*yp1f~l6?q;KXegOab4nwC#}T2!re4NuQ}hS34&i#A3m3-b=A#JFS;53@P@@NF{!j&5?@D8J#jybO zEViH^T6Zi~S7PK1QeGettveb$5&d!EA;?8zJR3d_WsA;EMvf*UiA1sL82g6Z?Zd{2 zzI7SHM7qK3S;(=FStwrz>=46-PWXY|J+0gdzT?a8{!UcEV@ro5a5P6eo zY)E4t7G gS8YbO7=6X1EbAgUt3i?vJYITbNuWdcn2Odt{bxJuUond&faBEMu*Bo zKFoTNDcys}38x$l9F5iS3KDT#6We1rdLTRxo(soVD`&<7iQu9{@|aGIRK(U7^t~FM zE9nI>Trr$YA~ruSSpoSdTXHMsjimIrIQCHm!RTu|#g8#-;yS)MKe6;BwC$Az*P?*Y zXX|6r&;-qWJ|ADRqjWIuuov8B*@e{|Yp z12oE9dowlROq9)B`WIjIu{XrE58&FPClXtgcH`0mI}3Ypd&`Pdzy&t%Bd&U+F_B~hF z_cn@Ourqc`ao?+jz3%~{@t&8A>`q2@nQB~?+`5k`BgIVFlZ*^8%iQ8vRURx8*WzZ_ zpN#BtFywm}Mv{?X2LqZZO~S!sWYoccR!w6#oQ#Y)7>Yd%N0O0o2SbU60WCG*U?{a2 zTso1A45HG}Dm&rEObV(9x^m$p>iF4MU}rQ`%Bw zjrT+|rW+AOWVt^hi->?8#CsmhmJTV=c_n0dB%P&hCu&CQq9{7ARBj}t#>|_JjiA2L z&Eu|Dw0ZPZ!-|xJaDGiWhdz$~3wtl%Kmy$cMmV$MeKj}+C-LK>nyawyY^2A8Hx??T zqMs`nsOWoZ!JXX8JQ>w}?-EH5GCj_-#pae~*89E7g|ptn=`n!4&BEE};q+L--mq|n zJe(er*xN3gtsYK~ZS37BoEtoxUL)yEM!MZs?XVN=4z?sCo83GZoTi!Uwq&H=%~R&# z*$Kbp<|+5^48m&MJTpB!yXm-GEybR|?VCRj{)gGQB^k^=g8V}D=IyDzht<7V+m+Av!+o{ZOY|o&xHc7BW<=d`- z?P!j9rRWLi-uBV}#ly)N;N)&8g_8@?$-N8wE+_X5W%)Xf@^h+S3rn4@?y($vw!?ce z2bb|#;`V-&gVA<=|DA)&h!Yq1>l}=>Bb>~^WyFa){96u25r@z=-t*5KTt=LqjMMIs zjwE9pi?}j!ot=Zrh$|=KTXHapxS8a7M-DC{u7Zs3&A}+*D#`WX99%}+Y%{bC%IyFT+6@2=`UsU}0~>)z{6&G4ype{yEjxHAr7a-dM=bzHYVM*UiDv z z?2+m06`h=(zRuOtIyp-{GM)XWlhfPp^-BNgE!YDd;6vTbnpCd?r<2Fq z?;V!@)5%lok#j`)PbW{%!*f*nPbbe3o5ysLrvD@x`p+Jio=HmepEG{V{!=*S`LAUt ziT;yDt@=+%K>z7S|5?xe^EXG*`p-V?P*fh>e@ej?`n4mIP$8CsPyCn!3=ibsGHy}& z&xdm`iZ}@#zMO;0h?D;F>p2)joCFe&<=`^nr2l*(2cw9S{`2V^Tt=MqpCdUKMV$1X zKhD8r#7X~oC z^q4^hd3VWY7^D>)dUS`WF=4EzpUS@OR7r%j>2e##$m)XX7 z8LUFayv&x^EoJP&v8LF}%ZQuT(_5*a2I@@D4*t1i&JLUR24aE1S%+eU(c&^p>urh6 zQw*w~zF$x4kRcY>h1(!DM}c@g!@&~_VOGd-4o|ln*@wv?2Sc&#J9Vr$oQ&*uFnBuQ z$Y?S$;$SHCNEk~-4mudTUG79Oa>T(<=8-U-j2w0_I67P7#rqKhB_rEV7jW-`h-^%P zij6LQ0d0tRpDoc)nVR?MSMxqwIPX&imp+p&{cN&1=Y8I#lrjQtJ@2z6wy+G^O}(9l zdoBIwGtR?Y;)P&D-{j%bvp)|iOHNBS<|Jz1IAc+a2yxwidq~YvWhjL> z?T_XZA@2I)8Cj$h;;29SrA((Vr4Scgm0g55=lSXB(BIB7J@GoPeDc6aGy?C<%6$`$ zjlcVM#>UawoO?YNt*u7ef&RkY1!8u3S}CvtST~nmo33-qa!l+nv&qP(StJgnqu(U zs0_C3Q+RFkh|ImFBsgr;7?K(%!Q1qs&gcEkwlEo6VQ%%OKZ7kGbzZrie28ol8(YxN zX@_#y7;p0=z6LgzjU}{7fm_>He{5m7Rw)@U)oP7#bBI#PP$`%(-6*A4S6xOH+q$mH zm~KRfbv0yU5fNftD>9}V5n^38XJoOh%S&>$!#{Zq?*y9l3Y(7Y$q0&la0IGqdHmWXkUp$>X)FEfVKBdAz2z zP2xN!kJq|(N}T89aTu8HXT{OPojhfpesH(Mc}^ZjSE%LekvPxEGt(nyzr=Y?o(d0- zI2~7cDm^?0CC+ooneE{@EODNbXO4&Gh{SnLo+=N|QHk@MJk>UjaZ)DEBOBb*!wAt# zQYy}S-}6w)?ZPo{rit@tEGo{E1URgja9A~TSg-yx&0(21Pvy~Zo)m21OsCs2ab6}q z+j*HdFB6w>9^%3}mGh9B8^%?t_E|X7c4Q_R%q33TnThira85?i_gLpl6G>H1eh7E#9eqh}hQ8#9 z7tBzrTXiJgFhi+mA1Blbd+~s&-0AMyKu?dG-P?Km6mivN#8rElA#we4Fs(pu&d{ot zp%or{wqkM0j@?qh4hc^#o3WcX=}cWwM7d_kHMb&jC#1%AO0wqhbUzX0zMXOkY}cdR zu5w{c9^K_|DTC%wuF%O-tmHVCJ19SujP$Cygcticq7vi980TQDb<>YganHu26{4XE z71DHz1CthDR8s*5Rze5%Q8GKDnrZW!x3b#$vQv z{MG~6xF9J0IM-rC=ShU~#T<;H-Qu?f)4Ak=ak)mdizk1NVUmd-mZZ-S{12WXLPcTi z#vY~Azd-fs_+hB97q1Mkhem;Y7#F?oC-%6AY8V)bg{r87Kd^OhKReWnIw;-ff}z;l zsw@g9eW=ag)jrW0n<0zp*$j@Mj?o&WQy9AsL7ndTxvfrS?EdCaSQb*}RhhB-9yN9! z;@G_knp8|pdg(x#CYb>%xb@h5D7LW5sYXM(x!fGK4(-jD?oy!dW@Hf&qBlQCPp=z_ zbyk^CbJ1iy7IUW7T2-g(!y$a(Qt88p(uZeJKUyD#3wyuLCg&OjEYukdVmZ#D#NVGu zDFj})0fiWjg{r9#13<7(hK`(TB= z&5UudNK2NUNY};Vxx21D36;=$ap_6oO&l2Zv6s!&fyK$dJ`Bsc(TDLQv0G}WE^kT& zRgqKp50z_fO%{z2WpnX(l}7bFa&|4pp*OBR%*o^MC7MSK!<{_353{F4oFSsCRG#3; z6)ZYsmZtZwt`N}4=?SDm8KaZ%#QgJv@6Pkl z<4*?lS!A~=ioBp zBtH2|4n`@R#3v_ma2atDpG@DZ?viAxV~8{38i`WgnuFH}l_=%>9E?&%iBdkCflIUk zI$=7!ipj71E5{hidW>|_L9bo@^?Q1ZRGVpxRBJ}t z2f*esM>D1F8UfYnhL@rCWvWFZZVqX28E0RSG2N(+^qE&>WDyZEMykt}4k^)jVsK6A zEF4DFnr^pv@?3Pg_Po4j9ChDwMyK>R>Q2<5J&wBD)+r97&=p`L^{)}l5(&vDDu`v_ zcb@(TDwsu^QX?qE;Ls-1)Owx>BcKzBbqJ4K#}Qvmds>f=f~Ku87{NN>1u{MgqOA*X zJ&9lKPiyOpqo1I&tuu~)f_7VH9Q*{0UFT2!2CZOX8_&A*>3E-l41BPRTt+>w;o5W? z3>5aB%}~@#`(oMoqQq?nbb4VQ-u(r$9*BkNY1Term7(lzPCDio$_~Wl)@Nx5@dyi2 z4337-y{q(`HiOr!56Yd5lmxF?kI21|6obR8or4@J(1JH%lqh4Kj^}E!C zf#|$?Ggcl{x-h`8ay@jRl)CUd*j#pRS`yrPtUM4~hzD8hHRI-{gqy>m3)&*x=`Onu zXJoPM{*H|4MugaXUq%)YAzkd2^z^!cSZBS_$dbvQBic58VbifZ4y)51m+1JB8ISWV zNJ=vsM~!Co72sfD@4aR`o=+Z5CGmK!@pwF50*+ubo(HlJqjKg_{hxklxC z$pA&~E8%IS2(g;w7^e5W9|ve8mn8R6?y}_PQctl-iDL7XQ`;+Kg!j1tWhe2zR*vg0 z3C6aw5YVJ8%KHUlab8Aju4K{=UZ`9nCGoy;rd<-ub`m@@$K}iVEcrN#m)|8{8IYD= z9GCeaXQ^KOFR67DQ%a>SC8Vq>buEE@XO?G77T1ZCouy6$f8)6Jev`#@7G-(%S@t=z z++eb}&Z5Eqa~8(cV_Zw%;_(Ckk#VjTaPfGD{u5ks;NmG)Lw1HS#xbBLN{XVW>O!l2 z3LTb7HRJVPK;bmQyyd#P*h@thFCpikqgW0{A&U$irGj$2z72-OdE!6mbvY`J95luBz(*>-*J=jR(LTOX4bQ=-PC5F+c)Xrmn3A|G8n4Cf!eHXQ@1^?ZGr)&?vSg`g zq@$XlGSX3z+vP)qZC<0tQNe}WLkVt|6BqWm!tQZV_jp~-c8B=jIaSESfyZ`q67> zHXSQF%d4BedfMpbQ9Ns`bn_spQ_qo2;9z0zd8#j@ZYId3bn^&yp_?-vOX((_1ch!g zPpqbyx;f46M9J;aO<|kYoJltmct|WwBjUn7SJ*wenfQl?f4f6`x^DI*PI&lT^3&9_ zFM-AXY2|UrcW5Yv4Dr4M?y05myX3oiO?3YW_>eSymwZ>3N%MUGh~wD*VPGC1w_(u*VNRoxvWz^PecR;+WTL?2$^R?2+xo{;?VMSk8g; zJ>YlQqv;=29&L}(%nO^H_Bd0UMkYSn9xHQjx$N=M9E`R-nqD;1NsTz^ALpJ*oD8;W zb8s1P(myWF!6>DZp0O!67bHgKNzd4RDn>l}SvL6r=wGVO>pA9$Kks=mE&jX>0kR!` z&eT1YJn|{==XbxJ@*(HZhXfFRwle-yy`sdQ5+i1eKX=R0JH&pir;0xngE#(6MURR> z*}rpb-a!+8Dh6fnPKLu=-oo%wF(?anGN{Rj6oZaG9e0I~%2UlL24%ypC*ak*6ywt$ zKWQ778GkO_4f|qz+G^%1obhQZ%*s!*`Y_l|9iO&pC6f;BcBK>%SNz#(o07S==T0|j zDxI3Sz2|1J&F8L+r!XSKaPG^<0ug4CRSai)HZI6APd2BsFpzCE6I`W}Ti`AAeZtJo zdVTFXrq8Tov?ntxJJ2G!&#b_~EYEt~y*H)j&S$;asp|hv&w90I)_ms^()w91#py8t z*R#^Rg4kTe>9GaZZ5=14$0%I4b)1|Y>u}wyadK)iaoki2qio5&A(qf}McQ5*oEwEx zR;0K%y^&(C<5@3t)vAYc+V2*}vtEkF5h?09rfrUAy%f((JDSuyI~~t@DV_=s&!FR3 zFU3>o;n^)~0G)L;+rzWR@vN7UGsnZT-|?)M;;HiRj5wb4Qasfjo`bRm&{>`u56@x8 zvtCM0t%v7`<5@4o6ZG&Lbv)~(c$U~aW<;XrcGZ(yCla6EW4p{$jPUNSL5=jYUhQTL zAdOm$Nq99JleEKm%ClZCKbqz|%^E<{tiOYy9=PW^vXT91*+)Q$rC55@fRglpv+RMZ!;ws5y79M8eGNqeMMzi)X z6QhWmL#`apdZk*nii|m)^->pGO)j%iFw;p*>1xQB<5@2yu9jRmp7kOZB%bvyQ;OVL( z;*M>G0^9fLK1O`8&EV;nBjSi{hGLHd@xnHPryJ%AuGBktR3S@k2`>MedIwJlqB)a- zaV+L%9>qI#^gDP$YT@F5cwO}lo{$-@-bJq&85q@g)~?dw(YfFd5^p zLGz5%hAf)BTLLvaU8ESin!Seu7CxV(7`&RjpQ9CNIHc}G2nyqXj#o*O!Wg965 zhh}T*I%1xYQib#mCzWlaB$Q>b4gCz&>!@>M877vy?~9Bp@C?-k6U%KA+fdI?Z7@?L zE5PQmjc@AE2He^<@C?-kr)@l$k;Ar)XEUa23CcEpmXSq7h;95fW4aL`wlSHJMMQ{g zOl3?rBE&XMWMmN$GQ7yUPd%aNt_q|>ik|E^JDr7(S#2=pRW^Ax0zvc6k8OyZ)93ZS zgwH0RSvE%dLJUVF4(vA;6zyxr!NT5kydkii`_aqzKEbMd+{-)^l^ccGUIi!1=(#$+ z710ywk%LjhiG#X22bU2i zZfbE3MiD2@>V_O#Mx4Y#D|0Z4IEjTqIk=2CiG^;@!6@Qpay-8|Hy0#E=SeKIH3Oq4 z4%EiD)k^uqP--21Wx7-S)K|=y<*@Romm}uZbH`(az4#<#Y90P~P*#uq`}3(m%cD#U zjKzk!u|wa7FH+L?sh1>-<0T0x=V#uIppuRtsctNGH}g6Co||bRok=-92NT|bTA0qH zJfAQblT-5#JR|0EUx#})3C0%h`yBg|v8a^CEH^r=h5%!jk@z;t2}6|C`8R;sWr*f2 z1IVC90b{ZInM1d|SfP2(fQL!iT}*I?YR*U|7HM>`zb~Y7p&lRO*-VQUOx}k3Nsjvk zWuAA));*H;4%w>)O`{(O&&L{6ys=eYAgh<5UbtN+M?MmJf{(17;ytp?)f{SGNWDk) z?k{`meggHXW;kq;wOw603>SxZ)^p49d7-Hnc=p!Lx9_bKH=);$|lLC zZX-swA4E2+RLYP~-ItB^ks~P?U3wjiz6^CQL^YYi$_@|km53B6~&2vs37VSw@ zKtwIWQY-H{MUV_X%yM6kAh3ulm9d9eDw^V|8;U(9jmy_jLko*1|Kx~C_ORL0)>xjs z)A)`hP;2EoP9jWHnyBCVaE9wWgz_-cqQs-N<9LZ7gnDRds2?YxM!u4YBAhpXY`t{c zcxlF&lY7-G{(>yUCJM={psqVVY0Mr?bv^x)#_Um9S4fk_?A6^~`!x`DX&vgTReX#6 zCJ39&8*gm0Uj|{bc|(q!_WK}gHgD81C{a+_C6sy0Z?^8uuV~@m3X>2n+(!_D7 z_X^l$tMIUi??`8>^spV2yF+Owo$X;eY`-MJKIt3}+Y$Rc5jLCmw$)LIj?zwAZA&wr zN3C5UANr>bgh3`D)jz$qg}sb$+)Z6J%U5V);+dod=$x1e=Trld7(p)Az|7n&QrVP$ zQgwGf^J%9d&dJ;`%ED^9D09y!3!}?XWq);qoZog==Kj(tgo@KLH;=OLicpD}%>AP* zjHaX#Hf4W}gk4gJoXowZQwWvd$=q?u!Yd_}_{rS-$--z#Dj}4)vy+8agh~`;?(Ae? zG(shiGB>lb@QTn%hGyp8SQbVjbT)a-ovJLnBGh$vDLW(Np7JFVkBQUQ9apt{sMIm; z9f7{5_g$afZu+ij_8Kzot=f_5yQ*-ouovGLxA1MA%P{_37?0P`XybG6f1!+iXW`RB zdQ63nqoWgJrq~c?@7Rgq!{^q@!tVt}3!fOqXu*yKxAKdpdbvNPIaeyGcVBOk89@81 z39|Yv7C4BG;Xw)d)H{RkPO-UyL+GElHYtuRsz5m-dDkBp%uB*;2HjDSfo%yMENM>@ zQfv#kmK@6Mr7^ksC=rBp?`b@xwjkpH)iW{XedCJ}8kv-oZ~P4wn(OzC%f%bt$Tn2I zk*A?=WYxeo`au%AkV^(`Phu1%1GlGS;FjTy*!N47>Jhsc;$v{n^?(@MtMh1QDpzDO zNJOAM-4N}YjY1&P4|1MG*-QL!zRxeJ26vO&)au?`r;#C^e*0Lq@+i^z8M|lI&@&sa zn4rJ0XOHEMe-o&5Vrw59zHvFZY^J$@hGtw#%De*5q% z#vX@I9cnC@7Ke_5CAxhK|5Y5y*3p(I5!YvS&<5Rc=rFjGdzr@-Pm+_PMHy|x`h?3F zhrWpAzR~UbkB}djc^xmx*botE)-lKg7kuQ1=rKvcSS1+2pT~ZK-GA-IS zisL2@9q*+T@Q5o89l-%xRh1wehe~N3ap;R^x#V8SfN)e!na=5nLpL4cJO#gq1Hy0h z72wNf{It!lA?!e4H;)E66Tz>;?b4ro`U|ccEyHh%MGxT37BaBsn-cNqrg&sLS~nQY zk4CzeE=oLZd(#5Gnmmvne@Y_kqGj=(*Ki8R-epg8;LA_vL<9SfHZ7*o7V01@l1~i{ z?2nxr?>P%;%a{>g$l3tE77ZNa;kTq6mJGv8IX^8W8W_=U+&mXmtKYb3q)E2X*mQni z2SpoSn(XJtYoiFRT^}x+bqJp>>-#3oAB&9ly?P+9hjoQ-VByFCd0vV*`l@=j&KZG; zo_*HYmUTunfCnhmJ6%~{vASI`AHPi1jt@@Z^L?&!@C^L2b!<9%7Q8wZ!*~?O%(vin z13p%_U|aHjnPLeHfawkVP-N_5(qyUU&G6#YWvpb~C4F#3LTBVp8Jsjrd-t_=8G(uNIF}VF~5*1U3p+2{=oa8J5s5Of{Bm9xRpoh z{Ulgo3wGlpU{}TJc9WT3Ez8l4y|a;H)*<`!j2YA%;^m)V%1cLO8W5u5JyS57l-2FV zDRGXM9t)4i^*5?5;wwgU3(qwHp*xEjJVXZ#fJScuw%dm zgF}^~!&YB=JP4nHpy?shfpIAqT=f=epHczF&hsok;rUkq3xX5SkGOf^u&jZ1y zjK*pz*)QNLpO*SC7J|ibeC}XFlLd@ zbU{ml?YN`m%1@h&%9-dA0)ya%aR-+{w`>iMEf|f>t&}bZUqTBEsZIpkV3oPhoJh9D~kFOSPrJ-Ew;K>IDYo436fUIhY#VN4J z%~fOsI^-3&S&9vdyJW>~t`fr~pB`gWj`pDaavJ1J?595e82Mx}a5xq?yeTkP0vVSE zV7VKW0g3}2NzA}HT-?iWn-0_hYI6ouNsiAtBsQ%U2F34ShS6wXI6ALVtqfvQ%2W3~ z>PuB6x)OA}^1O9}aPN=D*fF8+jV{>7V22M-@MZyWs$LY;zOa%PZNAhsV*veagmbZO z9vOULMp3=f8LtOJCsU1rW@3aq3=`u$YLE%Wnk&ln*T}VFE?p5Wq;*Sx@=j~2y#ebyIsoqyx@iRDbAh4fSEb&EdJN_QHp)#WE z`(a>VUtY4(Ck9rojn^0rzT*fhR7?e6gu{o43m5G*6I(IZiX3cWt!9?fmR1V35(k^Z zQk^F)1DoH$CZ_6@HWO^+4mL4YFIy$pDjaNLuU@t}V4Lk=E6seR)nKb~u=#B^f4T!m z_ok6K%Km!-`)kDbuQbL#Og;G>mfvSF{^^JSy~f{vE4y)6c{Eh+vi(s+koMc7+sNiz ze2_r*&pCLPEoXdtw3|a&J3WSu-!e;3v7mWTLk1BN0-Co+yVG69ZQdU3X0c7%ygk~T zZbZo3n0b4&n?*#(l$g1T;7J$X;Gev~_6?hkv3oG?;dzW}F*M;IBvKr^qa^VRVmJf| zeaF$Jg}u8uHpRy^ix$PIXgM4+os+EKS45Lrw?Pg+bQvcvBt-GKz#>=}za=b_CQh~i z2iu^F4WH$;rQus}DQUZ1Z1||K&4$mxrP%hk*ovHN_##}2ZNH1H*vU5RU>k9^+HG$-T@QyHd?vAo?993&u_+Ra`d?D-yc z&ManNFBbM94?B1>v6l*aiHE%?Gkck^`#tQOeaujpnZjP~Vdp$#2KGu}ukf&QN-_ic z9ATgBVMm~3vzt(cbC_6T@Ubpb`*xZcrpoZ?d9>OrurG`rNG{!o0Enkqx+Hq0YUTJ- zd?RfvRDyA48HOW?e{=%E`{C=s7psK@oWv+tWM}@|1~j&A*o7tZ$J6My(exFV65$*&%l1cI2SHq-OafRgVDfPbiu*IBOR%6@Q~sn3lx+JPgN&f$*$Da4bEqg2n(qfR1-adt3fI2ZE-oJ$;I+&`80@|||f zfT_esPz9`?z`^Jxcuy|Ee!kd+0lE577UAc&WxD#;a2dCw zqMSofGcPW>)pM*Qb~$b?=?M~e^B@Z|9k%S4%>!#PgugtnZKfu`>AT8PxP2HOn7^^` zJHzrVb5qaFrk)qwrtA6Zj(R?TFch;^xKzZTTv&#wwXMAnkI4%(b-bqt6EBkb6xH8O z-OamaQ;BIROcO;8>|~JPS1*5A0)e z>bD`UET@j4vUr~5^_VS1^ow$xb-QTWFKrtv z;M~;w)I4@IKBD#UKvC@S@L97^Z^y5{5w#{wS&&?pmv{|B136pdcWeuMzZ>HSnOTj_ zFJK&Gz4T*Sb}iHQaZou(unzVwi{w@g>hHge_eby^ZYyIE2GBbb?4er@z+7#PlbF^hNTr5EkGpM!Qab>FdG+$-9DHB3?6e+Vx{;o^0p z)XYm3VW>5d_{3_{xYcaj>8sCxosF}~)8^MjPtT<*ges4$K4Y~7HS4d38;ri@EGTDc zankJ=F`{sPNY!1+_I|Mr1>@Z2_i1}+bDQ78HR-xSCF1LGC<)7zHn%x|xy`p2BPi^9 zTpAQ}n@cz=@_nMyoE7Pioa24N2LgIlq!vdG1a?xFPC2)Em7GcDHg}?CIJX(A8{u4= za@9biv3X1M^hj*MkeR@vjyh>-#so7JfnEBN zMv8le%k?F_rg}x^C1Ls`wqTdKqlENuV<&Tu~42L-#J(xBft*)+|bIXHzKKe|Akf)xTt;5{xPWBm>)?sdT z|G%Nl91sj}dgf3IyTpuhv#TQRJ`rkxLG<5NF@u_$UE-Rb8IG#C*(GXjb|y}kct*HA zbF+L!oM&!!2?u{>ZuXb3!whq?OJtG*bF=!UzRb(x+-Zh zaWk2PLzhX-%kq72876O)7`a>jE8*}=DW^&!(>HwiTvjoqoQe9&DN2Lo8+fui3zJll ztYZ47aCl1t4qR6h@2+dZDrqy;S-k035xRl+UM?tyVig;&{p2ljpNRcT4@SFebSSQL zwx+vE$-pzHCfnV}CO);6LzFb1x?1($YFq-JT0yU+I)Tg3KVbzy5$_r;7=%;3^Jd*0 z6!yJETqF95FdlU4JzrcMN52@{p5lg)eDZU_c;9m=r@9+`@`1nr)Kt7Vx-w``=KDqe z0ao7O6yF%jo5n{*_>>16X;?ebq&(k&TaI*~82T0V4C7A3ZtZgJMbCpS#F542MV0JW z^|TU7R$u!xvc-vdg_q)HnihVcS2#Rs%Ae7f;k`t3XKE@~iX2MaDx!+pEXsW=mej4H zRQakhl#f%-s(h-3aPigCs?)0|MAs>7JYSmQ$~>pM;BZf1phj*5Uyq<&oYo+n)&k5p zWpP@MVO%3h>AImbXN7WF^THUk-N@(Kq^%t{l#sw1N`5FqVuo$oWAoIOmgzywQ`_4t7_?Ya?A`R0q zrE#@33@$Go*@1^{<$QZN-<5c*m4@plKff8O?@6f$A5%ZUjj{EZ87b;}HQL7+tis+; zgGKI7(}d$Dgjp z2~WnPoKMccMMa-3#}O<~ymT=@G3QBj)%8i$UD+l+kB)j& z%-5`!n6XCNsKmjuh7U;fLy$Gu3`TPR1-B*_tDG2kY-oTITv>$YL2xpG5XH5RVyvjqwNMuKJ8c@dvnWYY}FX?q_TCjFfUZ2Re`SYgX)Xm~!GCTwL~b zDeko_Z-smmGjVawJgIo^kF9!a@;S6q`q<>BYP^ven+&mh-gu8|S$=k%(eXas|B|&V za~SW@E>1Vz3zFA$7yLswa=L3-E|fEI9>ckoWlvi0Fh>tlFu&nl%QEbb)(v4U&3>Yf z(UfG7VTxz{3uBb3OzU4%9)x|V^)JqqE!8M0R<=~J#P%5+(ch^D2KHi;8c31*&A&2Z z157QAB);8*2F)DMd=9?cJ2vn`V@yCZCu2Y}M~w}{y}XPD$HY$hVw1#|GK>x8=_Ne9sA5(Q`W6%Q&?V!1>0LQR!920hWb$q}7c;-;wv)f$JubA9@1pa# z?pj!1#x-A6uwP7L#V)5~Hzxd;&iZLQz=}>LL*B*WgHjnb=?vFgi#ogEq{Bai=^r?M zYGf}3E8PRuNUC|uPf5R9gdss-OJOfww`j#SPtg{fhDJ3|fBx5Va^(Yi4C%g$Mkaf`_i3+!T;km69?x8dNahmw)qj&l^LbEpy& zlVKksMF#_KwxxZ-Yptc}n}uD$J_HhW7r0z+P1Us8+DiM-r#{tIR8V{Y zlSs2*Q3IvCSWvXI-gVP9zLX%f?C*PK?%mx0_SfJ4&quTO&YU@O=FFKhXU?3Ni#1#T zP<|A^KCwXR?l!A+J1dR?*d)??S^GD-x1~B$GAaY**Xb?4iks>R8{xL~$Q3M4M;A9{K>po;9r>J zR`zMB?34DTMo_=lDo%*|&oB*HR4|LPH6{B}7vsr=nl1KwSLbH%r2_PyZA)Fv-W}Ug zozY8_KlcCUzEmB`_~>0Z@mT+f*{pEN%JIQv!l!QWqQ%Or_!DBtwD`kzXM@wASWUgQ zKnTas+R|4+{P0TbIJHsHuU6rbDLPWmeEmoGb%-v$?;E&p?9+3E$nKT9z8gcqg6?m> z+3kLl{&P&%iUk<6Iv;orOG0l;(Zy;)x1idp^lnZouOC{zjP-B)5bi zBGMuojb(gFAqHcd0DQgOhtGfoPcC?$nzMJ5p!5OT4wAsr1x{4>19gNLmKa{Qr{>)R za|ny7#(TME<>73q+K;?>Qq?8$6RvNt|8gbN4Vot>6fpO5QeMSczX2m;vql|{JClx4 zbXTc;D{4i&mBA0aHro->*=pErkJua4uq$cyG_#cwv13%Iww##{@9$P}rlN2iJHD;2 z9Dkq;v5t5C328&cE9W+6)r~S^Yq?VQHpoP*?y=X`Gq6OGI~%N|Trv^1-&ICKuyws) zqViZcnT<{mYUAtl4yJ4?gM&G5tz70H+su<0!LDjxobe47L8dpJTVO&#wsAnVGgXxk znV!8ULtR<9{eKtG}#zR7nzIvY)a8bQf3QcFZ>H_7oF5( z?@cD`g=awEM7&#Zx*IGKJ)wBb*w2lVh1bF9 z_)Hl{{^aJ^*=Br#JbMB!R*ekXFU?k!<0I+lBrrgYessJB%1*SuEM|Jxe&`rrt_%j1 zt^NV4XAyk2gNIP9K0Lxo+DO^g>1j@#8VU8qE;C#D7=Xj=pNEz7*Qk;BlFT7Gz(b_* zzRf@5eWa|>>nAIAREqM4KE@jTT{z4hSMwldTOVUj4mi0(CFc_eqRXt%2Q0QJnez+W zcx@q_J$5&p%*YcuW5aVe*bR?Jshm0Q=H%u>IDSn0|GH){{u(_y{(rz<;j;EupfsOa zAiYR?iC0za75+cfN@Dh@h5W@FU5>!B6CkS*VDe!pw_+1zqgPptAF!HfkPU0Sl<5<@ zS6+2+fo&4~AWN4iA=?P;kDf{w!Cq>#|22bt3E46M5MZX6Rc?m%yIc{SAeDxzREp}g zb`|c?C-|KuQRWrtn+Q&zoUp#uBxjKjsA!|;Db+~hK4}k>s`Xhs!3)uET4!@hG9p96 zC6y*8XtEI(F3@n!Lj3YDsy~3u?l_2`tJz~8W-f3NbpKuDvi3^q58FSzoK2?dH@~FE zlAHHAl~;p&-gh>OELBwoojW!(@HWEgP-)4dRDQm9Q7q8X9UUdLqUA53V&WHSb6q2{5vH)7ZpB{! zjVHnzW1`VL=giskbie%t`nIx@rEZMnz3Q)ZSRBe~U#!>rxxSr8#r4b^)_nu?i~S1C zxvsL4Zq|IO>~!F%K`a+(3CCG4rId*Lidjl8RBo$^jxc&%J!#Kleldeif;-Q-WxbT; zJA@c#Ry=SIfHD8GIJZ3?3)@p4{7=jm5BZCk+yWbl;&yfX;3@NGn~C@;K)t)N`#6!x z)3ZY;VWd8$Fh>i2*d4gHb8`2yWh6$=vEpSwJTZhJp3i;uRPt!k2m?02HbmOPU zPhYIEXOVpjwm!?zTTi-Ffz%%x1WM N_vv1G*~$EattAbCw?Uw>>QN@&xMDUe%^ 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 DFF+PW literal 0 HcmV?d00001 diff --git a/lib/sigar-bin/libsigar-x86-freebsd-6.so b/lib/sigar-bin/libsigar-x86-freebsd-6.so new file mode 100644 index 0000000000000000000000000000000000000000..f0800274a6aee8c6a88e3dd633683e325baef17d GIT binary patch literal 179379 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 LFD)UR+C2XsymM=Z literal 0 HcmV?d00001 diff --git a/lib/sigar-bin/libsigar-x86-linux.so b/lib/sigar-bin/libsigar-x86-linux.so new file mode 100644 index 0000000000000000000000000000000000000000..a0b64eddb0d2a94054802aba9690f54945f9db5b GIT binary patch literal 233385 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 y%FJ3c`~Bt9 z>6vHlxo7U&d(OG{p1F7S4*%NKKA+FB|4y(@u!wfySc)U~wG$+1sa1%SV(UEXTuGOU z`rpor7g#(_6zr39bIs%(tFWxWF3UPu(-(kdUA6#+Ngq-v7U#1ErfmTX3{0z6o@Tp0|T`;0WTl8Ak}mEjVt)u@%RMaPV(C zjyrJNNr1n*aP;8l!?6QL1V4p7DzpV5C=vQ!jRq@wAzmDUZIEHZ?#KFIB z86y9W;QvQ(Jc{FxT(PY0f&Ku;V>rh2+LNG%aXgJj-{}uFadj2BlOE~_H;~#o$ z4)mXTejM~aI9^d~I~uyD6L9eFM9`CQWaBthubl>ZI*v1NEYxd;8@3MoIvja8@-^)Z zpl`%cfa6U#3URy@hy7RNI_I^w1HS{uJ8`^A)7}kQg5yHP|n{Jl6|hT}5VwdFX! zT=5m4@551wV+D?tIQ%$P<0!{*C623bti@sft#h4Ujq?DG4LGXwdNpW`o-dK~s&BhIf^+zh%I$Bj5{!qJ9f3l96Q!*w3Sd8gu#(px}p#jzE~Z8$!RV;hc4 zf4Ad$H;y|sy+>&;=-oK(!LdWHeMG4(C#tv~^kXS$11Z?fGat=%C7y=!92e$kt_!~o z=Xp3@@4A++=jVXF(RDrb^gO*#1o}1{Z%<`-4S0!*=VCoy26~C>dg^JZ>%uD6xqVu0 zpMbt!&)2!G1@yd9X_e9%&{{peM(GEXdXY_<(5&e_n@59OcHURy&>wLb`L096#uJh01{0oY| z2>K;gn)`G}!8hC&_59neYu|C5e^<}H4?60){|NC9I!ganL=anv;D*GBu z`+(99f?lWR4N9436V97l_y(M};AnMSvt_rtuHCHXT}s2QG@JiJu4~)%{0`T(yIkje zu5;#(xbRLr|ETNQy{>cnex$s-6BXYCdX{yX%n^8^z8l#7WB$E33V!Lc{(yooonuJ*kLi!t0F-z% z1=HpW(6Q6sGyil-I>&bQ-&r_u+cV{H{B|6JpUXj+pSDwn0U+&}n7Z0>$Y(9o=UE9n z2j}r&#T+lpb(lF4`9BA|4}+H;%|8Nc|M7m`Pr*;SFw6Hd7bgF+z@=Zp_(<#Dw*c++ z4xhCLX}sSe;5HbQ-F_DU+kecz9C)vGZfByEYEsf0fVch4XO-#mYz1BlrEW!D%8vj~ zzKD9#^hZ@yW<%|FJx*$2JTmSKyrd7pA0N4xIg7pN##P zUX_ym0pQ?*1u`dPdRI#NZNP`}ebx_AZ%qFf@X>cV?faP&{%@qZ?90fcrB2ap1+6;OtZU7vRuBpLLP)pL3#R75=_8;5taTlh(P5{S{{}P zE2di~q5P*TkXXi97^$8FY@Oh==bM28la{q#%UcHAy&ZiiDD$_2E<0&~#lDZY7q}Su zTdDUS1fGRIyHxQHfG5zIpN)DU|6hRZKbCI}c={%v)rfPZpM{DD!k({Ed>$)C|Hywn zaMid^=9%PQo|3)_c*hfFp2qYR;1bxUU7qd0-Eb}^YxzG9+<^Pz5#|0r0k;2mzh{Bl z5Iwp``DcK4VZ!|#)xXm)_%Az*xs2iqf$cx$zXZ5sk5Bq7mS+|4-Y1>8o zAk*(k$v*%*;j*{=z(vr<>mi%`kB}esW$W9Ifp=oyvjFYR^nVdw4CTb%nbtxp_Y^sm z|5(1WfqT&jtk&{h4t#8b&pKam1@HkF)0e?ZdDj6?6*~GF0-i;A&d~H7#F)50sCXDS z3+-k14^IGBVX$Gh$8*5B@A6r{RsLhZ_8-glZ{V@_`D9+f`{$yg8%M`(%X=GeJ_b@x zftTr*03Z5_W3Sb~-FP0(37FmjT!ewrb&78TE}6spTkZE#z%M~LzNG2T0O!EJ-m3WD z!1f=@cPdQE{-Zs<-i4W70Gx})Js;=1|M|dy`yGE%3Owj)-#XyQn@oI?{LR3#|K*c- z9r0G+Bd7aho=E&Ka1+{Nv&w%0c(lwX@dc*;26)cJpPd7L@F}0ff0$kboZIh{IVtgF zz}qm;gi1+ytAM9bzgMgLzeBGk+D*KQ{4GcyMgMKL=N-Tk(1$lG|0jTlF^IPP^I@i= zf3f+03vB6%9rIn13U1_lZ91Zk&@p3Vh^wpVgrFJW%_O{DVjzz<6K<&dL8j zz%9_%h~g6$qP`#UA}}k!RG?!cbeER<*fkT3H`ClR|h->eTA7w z`Px$QcLFcQ^YV|+duvL1H}Ej}-*;;MZ=|Fj0#eIA{6a2ONVvEms@@9{vKxLyC6*hkgm2RlFbA{-eCF03YA$ zOZ2Z}zyq%K`b`S|?}5vI?z1NC@}{IOWFzPw<)00_BWPmvEbk@21t_0g{)!a-8sNb* zd=g_Pe>ZS8{QWM-BHjahbfr(m;ly7CE`1dCg(e~XG4Ss&o?$n57DhEc1-AcKo@Z0= zG;r)mpTxwO|Ifhrm@h=ZOPuvOJ2&*0`Qh*EKjPDozVz)riT#uREh+rPz;j3NJgV=P z0SCVBjGvl;OGh9`%fA!&K&{WZ5tk_Mv*hnXBL2>_@~tld+kd?O*MN6nJZ$^VCsNXX z3|v;=v(8n2^K0OVB|dpKL-~IN&c@*F!;nS1C=cVgiyi+_41D~!Pu`U<-48tcoKN20 z5N`yYg@1Tf^LGI6LT7Qc;tvDce=Khwa1lDsYfm!w`+7?H2=I;;r#{Dl$JhES#wK~c zY2d||IpcqK;FR)De7$`)(_W_o?>NWtS8q;9F9JT6?UQ#Tlz&}HdUFci0^Eejm0e$- zPD%d)aO^qQn?B!+_Bjd=GH2 z#3%1)$Ug{N{zjjLE>iM;6FB#IpS&kx`eEQ=%r^=({aIl9kMf@f9*Fzooe=qt10P@E zllO?k3;Ce>NB;dO`h7Oir!n67gg)N|Dg5sNE^PH#uh;rnm6Co{3f_={Hv*UMz`G{R ze>?EV4-p&F_Sp{{fc>pN*;w8&;3F5Hzt!?g0o#8p|8IczqkrHqhWt7C7%%Dj>NDA+ z0MEf+FV*zRi80xDui`4;UIYv8Q+z$}&;y90s(t?e*X=*vZvg3sI?TIX-fsjrAM-I= z-V|}2&-x&Enf^!M>77phal#v*&wqsP(dT(5@ZkZUyoV$I`+x^e!F)~AJAv&#-v2J( zot=0mgmdzLF(v&G;G8Rb5@TojIPf&=t4aBf124mT>}`tQbPi7RkMb7-FaIsdulHXA zJpO6iS8+!Qe+W3>nvdQ`{%t;am&^Nq9=PmJCU#Cd1>6>Mp5OOI-1JneF#tIevz#-4 zxh8>s#II+%{;_=L0++)6hHy@Ki-DJ;Jy$3$173z8=9g8!J_x)M@e8~E?gGw%eyvpg zoxt`V<=+q7g7JJ8&MAK^CH+UhxftJEs_D-G7a@pd<2dk3L5#CBy|@7Sgz*pDtjN0z zc+xc|qcao~~Nmi4mozqJtdJ?O+=t^&6I zc>mf$_}lv({tp3<-0PEf`K$Nb+fggv4CnsHA4UjvW+-DkZ= z_2+S1xBti=ry=Pd@yms1zw4dx?OAVu{%!Wj+84?@4|plYPYvKDUIuLcG5_T$*q?&e z0w4GS{DPLJ6Zi=1;b)3Jk;4B_3jPvsF8q&eFW*f`A9LYClxGU~5cn}9kn;Y~mCo}1 z6?hEe$rU)~^W>g~_JzK@Rq-<5ZurAn6|V)h|CrzEYQ3Scv%bAKRNvYjYVO?JxT(3m zt+gvu-_+a{>g>49YU>I$hAv*Jj9_mMZ>hhbIb_w>2Rpi2xAHuAYkT9C`cCVriYx1{ zZeQEc*koPRcuQk_N9PUoEw=@mJ6ku^n;Vt2c5Z;Y`WqTUEzO-Ow4`1uD9cTJg!-n&P-A^tN5@U!pj)&&>0FzPTg01)5NAxVELEDcsiF<*uH_&KtTCy1=Gx?CJ`( zbT;xffy%2_`OB&+{q<|Fta$&5HU9dl6)V^J>shSMw$?4JA(gZ#7>0V`2Bxy1JVqNf zHEwEYuHW3+?x`<{YOH7ut?FoRZ{8F_jj$%IEzMh?44#i^*FQ2|X=}FRGq(TkJ7?saolN2gr@RBkXxB}1}G?7FEnh`YA4C0#ZaZf$~%g|-B7bKYdr7F&^7zou%b z$Ie4ICcU|>5$zc2uuaVHK!_S%;@-)g0JX5W^@e(w*p|l5+obr8^v0&9&gQPJ`j*D7 z7O!Rqhg#d}*EEOtH1#cLHe}KQieZPl8gDR7kS@3R=5S-1t&D9Qs93vAlcafgnhiGd zs$iH3FKz#7yc?Q3Z)x4s9B54{WT;iu#3`doJ?LD_BX~%^wY7c8MfLOpYS78HC-oq$ zr`kY8@DP<$ovmGPbhoMHr#rTrTHD&J){ae~Hm$hM;3lJ>H=5^=d$zVGtdyz>tGES* zamx~EYmZU{=n=Q#nT-?o;Huc%#p-PCtbwo;cMo$h4#81+w;5&93RjIw!8gIR!x4Ji z+}-+YdG))v-3^^LBwAPQX?hE|KGTTq$`NI~t&6Tp>#z-dTjMP^7)$8d)Y!h+s|2j1 z)lJDyE=_HWeVz^{QFe-00spJ_c9j-g>Xz0nb`EGV=`^K8o7&)Jx{%n}ZWlPTDL7wK zu4_hTK5sL!5HKN|E7TDV;szG`zWOb#*IzW>^RMb`ZmJL;>u!Ikg&>@u6bwz$)Ul

    bJqH1i1_##(#j|;6^f^FzS+Fo53&=pj6ghS0#2&;b0+N)QtSX+Pf>eUzODI| z<~G=zr@bdsfn%x_uqAj)l^PCaa7&$hJku4ZeV8)JNQLzde~odLOQESBo5G!)^%(9o zUZ1XMj)6+Ev7TKGg;epyn>x@4%@{w*!bS{!*n}q9z`+`w zs#hxnLpQh8OU+O>@kHyx&FGw7qeEbx0DE8>i#)w?BxZOe<3)@ts08{L=yjbZkV;_T z!e)SJc-)@Tbn<2-T-{E8p@Ncpo`>5?^6xO7&PKaC7vtAahH;OZ8rwG2V;E!0M_=3# z?v&v>Mqcw7eac;^f95&t=0uOx)N$*kmd5rQ65^%Sp~PZtP8KTnmX;6IZ|>~a!trCX z-P|p)X-`uAiHxuUlpbn8_bl!l%Iv6ZYSL%C~Yd^JL9mr zl4cCIw%EhcDgw&sR->lYPBfi8^znF9*upAj z6bhNNjN}IvgW3{q3$?=hFubE>)o&H!QSD`o%gt%E^F71{d%R@2%9Y{Pwx+UqdRUY$ zF|I~2IZV`!gw6&J=w-f%8wJ!sXy0rKjJY6&A+J{BxcO=s(V|wa+$^W62p)Cm;WM^0 zhBmb%E59O?!#yQ{OOVRbTBQfNS-cJ>FBl(-A9Auvo69f-1#~O_<|cFn;lzCHre+L; zY>#ecLrw;2v&gWg;^yY<>2r0-6Y6Z=1gB~Im^gebEL8yab(p%EIdw3MF!I*+dYx6; zJy+0bY7+?_wYfobMFyDW9tk5#E~;bLy!mGQ*JWWY--LM$XZ#qXc-+7YnQLX>%o@gM zb5j`o6FPY*Bc~o-c}?MPFQZo*Hf^bFzNOVQk?y*+(Ts^)^+S^}<`Jy#XqUN{N6`}E zIZ5!~aXYDiGgM3RRVbizop9Tz8xKL1fmLS6&b~fbPubJn+S(Md)t74F>i#970ngj+ z^kh(J(aXea)1F<@LDD02TJ@Wa^YAE+d3Kj>IS(OSRegI{1_$$HUyE@MiVku^A^^m) zvjs5Q)ls2o8l&pQ*?Uz{6$iM+?J|)871hlgF*H6 za74|CIXM_nz_!ixK}fZ_IyT*u$SKv=%$bjOlVRGkO6L2{w8x`55DTj|eSmv(jD`yb zoybIeGviiP(Cv&8jzNb!Xg^oLtQDQGiI%zaJJIGIWl3oD>h)z6T2F32>~0S`Oeihp zRI5~uMvz>!Z7wId&v2^@j?v(^Z0%G`n!X$6)Z1oO~BpcS16|1kTxU%XRG*eSo2cmiH@St8A z#}3J$!3VgD6qRr63{^UlD}>*3~c4X9;msVOED)k}nVVpJkdD#BZ6 zIgVRHPi@M>3P`lM$Acs!RX~`DZ+2Crgs)8uOh(;kT?Dbk`Z+@mHz7U%Q{y`a(+Frd zJKSv?sdrykB}VE}_~xxnv=K#j;?s^xHh1X?H+4u*M`n+&_GE0Ub>`iLP9|PU4*FUP zBkb$z)#YJq8fxB3GnerYdZv1mVQaX(t7&tSJ(du4m*UzAWJ*liL|_a}i+Opt&8aZk zTo^@nB3H?#ETgriHo9alg-DvTWB9Vl4!KyHH@Afmfj7lSxU=~iO;hKsrgnK(wMt$o z8Q~nyr_BGUfv#bvT_@1;<{Q|Tbs{prnWwm|>)Ef`ri3<2xbOMOVGkG?E3>vXAvoRP zJ@WRjyhO3euBlkD?#flKsgn7+!WAC3+YtlIuG{QxsHwH4Wf#Y8tS7<8Tlg%(|C?wI$*MU}kqnz#1tlG+7@WKL2$Ha9hT#?Lp% z%v&GK89W5#4aXvJ8XZn&v>!f%nr`edm_g#45*X2yOj7SrU zX>Yc}uM%r-@3C|qrec~uEr0xS)1~-S$ z(b{7Hr!Qo!GHi}&K!+-!r3<<`F1XOzP+d`5UvdH0L-Gql8?gRF)|~)9P<%O;O<9e) zCS?!yO`WvSXAP3R-)HS3jbd&3dqFF)?sggIE7)sBigknIq!r-bc7m)&-=}oH(gR9| zlnyH$QF=(}sM0Z|hn0>iolrWh^r+I9(ql?zmA<5OPHE0|Q@&iKc}nw@7AP%LTBNjC z>0+fNN|!2KuC!EXnbNgNtCZF$-KexdX_L|xrEN-sN<&JwD&3~ETj`+EeM9EofrH7P`DjidLSn0UZ38j-tr<5L1I<54mQtNh8&sj>dmF6hTRhp+XUul8TLZwAY zi44H*O7|$;t8`H5KBc2d$CMscI<9m=>7>#r zrAL%bD?O?-ru3N7S*0&2ol|;TsnxCRrZih=j?!GEc}feF7Aq}Lx=d-Q(sHE%rFBXh zl(r}hD&4BITj>s^14{QO9aOqs>5$S9rK3s@E1gg}rF2?pOzEuBIi-bnn)+C#G@!Ia z>7ddPr4veHO0Bz0{!*oNN(YsWD4kFmQ)=~?eECWnlx|fzs&q=}tkUdWy`R!Lr9q`T zlnyE#Q97YCrnC_Il(_F|403&YuXB|>Hsq~oAEb<|}jOF?P@+l1|-Klh+ z(nCrol^#>t#B%%w`(%~w#kk;Pj1%^gVtjCb6yt><(n_B-OuEx&jgX#z@{ywAMoDkx zdRb8HSvgF47xw;>-hq8vq*$0cNs9H=Q=|)g))7+d@t7tJ`mCd*cVpiMDHhrvBMo66 z5a|@wXOk|*z7o`~1p{VCdk zw8ydvN%y0DNjG7QI_ZO0-%k1gtQ#lAUXrDx(1T^9Xt(90Xtz>Qwg>5*SXWMpc3De` z`VEj`Eq@g$Hq_OTV$8OYbd6;-ke-3H>ZEVMz6jC+tR*MC(PsrozluEzq@_M4(woq*$;&O!^Ggo0DR}^dZuE>`f!R18e9>v6lTXX(`5!q}X^fK{|qVC&gOnDbj0T zU!?2N?xfgfe3Y~i?N0hNv^%K}?M^z2b|=L`>p8iOb|;OX-7!u*8Ef#fNU`@Yn-pu% zb4b64@i6JT(B7oj`&&S|3hhn$d9*ia7xvhbE=PNla!ojC3)-9X7TkvPztP^LPoTX? zuS9#3VuMFH>9c5W(nH)=1-cjC2O#Z1dz1bcc1n7d&uSpO9eX`Ue}(oY4O>6vI}(l_|59i%Uzok`C?JCpv7`zk?yi}oh1MSGL}3++vcJrMgy zzk>Drq(4M^lVao25NS8;ob>N#Z_-}0H|h6a=cIpwos(XR_9op1`zC!i_STYOkLDC9 z_Cg#XeHYr9bQSEI^jm0W(vSG8W28SvJCnWx?M#}3b|yU)?M!+L6yXw3>~+W@eI4wZ z6nh17NdJm(Iob+<+$s@hNXT3!FO|(Dh%h*pz zdOOESvOfv_EM+{5$DsXn)dQaGxOPyV3rn?}5FOuJBn!q)(y!N$*Ab zlVZ zUWoQ5#oosz(yznbNw>q^Nq>pQH`<@{t?=`tpG5nUei`jgI)wHoZHAvG zEkOH|V#DHL(lzMcN%LXyLv=i-5I)L^ky$C@z)i1NJ0+6G~{sAI`@A{EI)Fi~r%M@wtuZIQ||+A*~iB&rAp| zBqr0$sNf=El-QaX5?oANNIWQbF)=UB3HFTJT2V z9mErY8;A#pM+G+#?;#!%%v-e#5)TS)Bi>IuAegsq86xf$93mbe4hm*bT1JT*1aBig zOdJs0O*}zdD!7+;inv5Di`p_xTqt-aaf~=uFpJ(YOKb_=MLb75`yW349%2g`GBYiB zFEKO-&o6k87#Ikdzmd3`cv^4+@ebk%!RUn0{=}n#TZs1%4+(A~9wZ(V93VoUH|;yL2k zfAaYUiLDcWrv>jL&L*A^yq`FicvSEK;(X#E!9&D_#Dju|iHnH`1dkAx5O)hcM2t}> zo?q}NaVc?w;4$KI;(*}8#QenGOsU{;;yU6I!4t#{#D#(+1Q1CM1V&Vb8{OV;(330dJGU8># zLBZw3rNj+_*AkZ#2LuO*1H`3*tBC7}O9a;uHxL&J-bma+oGZA2I7n;>ZX(`FJo_@A zzlFG)cv^59@ebk%!9n5y;!(jN;yuJeg0~V65)TUAM!cVRKyWwl5OKHQUg8nrpx_xJ2+C;%VYS!F!2g#JPe8iD!u|!TX5kh-d%K=ig6k zod`TF_yBP>@r2+Z;#}fU!NbJ)#6yBdhzp4a1s@_VCLRzxN?bzREqIK08F5hXVd7Ha z2EpUR<-`HO6T|`HQo)nNb;Kotr-&Pf3k4q`ZXwPUJWU)Vwgev~-by_C5}!Xt+)X?! z_!#jH;t9dC!~?{mf?p!uLp&sSj(CuGQ1Ef${lo);Etp!%5OKHQEaDO3px|ucQQ`){ zImCyF1A=pjCx}Z0=Mhg4mk7=$o+d67TtFNn&J|opJWFf|E+U>Io_&$eUrcPB1UxNx zF>yBWgy0h5T;fr|ONsM|hXgMpE+iflyqvh0ctCI|aS3s^;4g83ENmOA1R!F9w9#D#)461NcN3T_|{5?g|sh_@2Y{!Q$kxSM!da2xRs z;t9b);sN4O!6D*3#6yC&5)Tp&3dW07v_J8H;BMj};%>pc#3RH(!8?dYi5mp(BtA?W z5IjIUL0l?$7x5HviQqlN)5L{>_Y%j5a|I6)&k|dL_Yuz#&;C{HpV&euVrE+K0pe`p z3Bg0exx}M_hl%rvhXjuh7ZMK&K15thJRo?KxP-V{@EGwj;-KKe#HGXyg2#!=i35Ts zhy%o>f+vaVh)V=d5jPMQ3O+*2Prc6M3Z5no5?g|g5^p7*ofZ2h?k1iVe2jPp@r2-6 z;sN4O!7mZ-As!MuM?6S8DEK(>e&PYa7F=!15OKHQEaDO3px|ucQQ`){ImCyF1A=pj zCx}Z0=Mhg4mk7=$o+d67TtFNn&J|opJWFf|E+U>Ip8bp1KQZ6k%uEYjOq@+TA-IG% zmv~h0QsR8#A;HUt3yB8>FDEW09uQngTteI}xQuuiaZqqMaVc?w;I+i%!~wwp;s9}} z;40!e;u67i#0|uSf;SQ~fH9LRxPdrGYzb~6-by_CXR&|cZsKXdZNxi>Cjx1acKlAgKK z7xw-ZHH4EpYI^1tgf5S+v=5l|J)X157Z;^@8P+))06C`ri`${p)=ou@Zpfdxt>*M#8;lef78H{pQ zL4M>eN~iklbRKLHGG@+$=CduOj`Glk(d{|WlWJ@1sv5_rEFRd_fB%U;Lp7gK*?<4Z zIH^R7-n$j^8QyqNptdG{A7`KT^Gh4!DbVzgXp6cNqH1CTxFHGxtvoL}fV#K(o{1g~ zpF-`3{s8*19Qkck{XOTic8tji@M9=n6bfP5c2)1Hc@>^>`5fvT$t|ijq;*+;u7{QO|+? z@cx>3IM06MN1ud3gma_Yvty_HF&>9WoLo~IAK+b*>NDXRK7tI?f){4c@F>{oxUov|9 z5xh3CqOZL8WjrsGAv-nzmFr)f9my(+t)q0RZRBn$Z8+P0*!3_4u4g`JUo^G^ z8TRe&!R^R&6md7UaPE>(n13yuQgwE8O?Kq$KXR)re2w8qo+{6k3`(lW!s;_WUeNb#R43b z=Y#P)9apxiApB9Cvz9yMTml6-BG_;FcrR$D-Bw(5Q$%7O6h!s<;Y>t&M#J zb<27gjn0bCj4X?X!4-?m{XrAxKaA@gh(KOAC$imcpqYOo*yC!KT;oXnFTyHw*(j)F z_SwIE9Bp*pKBzI8J31RXU}Sf1f6%@FHlGm;l|k{w;(s)MVLxe_k;n(It~BmSeYPa=S4YGf|7 zn*Pbp-YRl(zdshJjGbv$%fh~o;^CrK=b$a#L2YBdByJ@ZU6Bn&vTXUYu;>gj8oll z_7J#xbbVH20o>lqZBU^~>9%6c2tmCNb+t%E@xAfzo|umX z_wPeKkrsL#a!3-hXmdvW`}#%~_En&9qZN65PcQ7nJ7|k_cy>H|AdZe)E3h_x-w2A* zGnU7c;dpo`x;igfngv6{!z8C3iibz+R2oon>R3EHYNw)IQc}m`;lp+++At+`G9I3= zQ}fbNkHo`Mc4~fFD%xt=PAza!ZG}J^8J)QFDBC+P;@?FDj)w=)Iv8B+iY!3xh<^Zj zQHVN4Wb7x2VJE0owMm3PlC`Jvczc5+}-H4vu-xES=JiHTa-C{wcLUztsgyE1Wz0JK?uPc&1qEg+X1_h;e|0chI(o=O>L|hA*h)L@yKROap$oyR9&hGT>X7x0@p?Q%3wNmG=$h^ z5WGuR!58U#;JX9ak!AgTP)4^~Nf zfa$9XGVAiejlxss;z`r!gH6K2x4E{QG`&6;5}u%oCr!H#vg?T-Y;p0V>G;8I!n4)I zldkE#@o=|Y5|^f{?e2_+ci5?gjvZ*~u6TIBPAy7H-3z~BrxvHB?t@a>sf*K6573)v zJ(r}V4vR-It*|sL^^kZJlZsw3#Vd@7M=`0((^AL9qnOmvwA4xQC?>TmE%k_a6q8z> zmU>h?ib-ATq$WIy@h5-$U;2}RNFQJ4i%U63Ef=q{o7d=Akh~nH@GSxQmT&zpbZIxQ zxZO+NGF*U%`3ej$5LYScWMF!ZlNqLk9u)3WHpkUG>dj>P3voD4dGk4L=cnFGwlHx% z|Le`?xS$ujnQUR=h+g#O6JZ7PR{!>9vV|3rFYD*?*I5ynPWNWAg%y+U_1=6^vc+V2 zlQ)wstb}~;@a7X?OUZPhH@)~}{Jear0#9Y-q)*|+?+)3?wzjfrLMTWI3(gEa5x>Ozmc#nnG4 zPkP_t?xT#H9LLibpPkf48J_gM#ob34p1d?U?*7N{r1dRH{g~k?NRzWop563Oh9|wB z>6Jdpq!y)02=A0W%A}_EGrOdZGO3Hx^6r&B%A}_EGy9~EGO6kP%mL}6Olo>RGc0|S zNlou(4oM$nQq%jHG3ldBYFS#D$EA-lsp&h$~V7Sl)Z8v7_DFUBeQs5%+{B2RQTuO#(R#khbz>K<4#`Y0ns z`=~;79x@Q_7jqZxR5tM)G92FR&15?w>7zd7%_qWSXuQvx$rdJk)R(>aM3@YdhrO9> zVbVuE;>{<*q>uW(H_~(Yc0x*~aKcX99^r&N@F_dtj$_aN43_TSl@d-sQc^f!7sCl}Mc_7CQN%8D zErSLooFI-lHJkvw7LQ!y?jsqsj{5gK7+o02D+)wcn?%z&-pepV)W08nAJQumsX5}@ zBvq#}Lx^D5d2=1tr>P@|V%Vv9X{n>}@F6=jtrH9%j)%wW)Pl6U6Y=o4otob9O~=DW z?9`&Pyi@V;q@C*O_!90~V-z3%DgAX(#NTUT6aywk(MvattKIO?i|M1=!56LWPIA!f zo#CM02JJ)BBBy%iB4{v`b3uQPyaYKLOc!Qi(on_4qP`+6NsMhU;+QY>U=nK)uY83E zhb=~2a+wE{h!KDMeh&^?j5y=<9!w%eJaLT&hb>0j@J0_N5hFhM`ivYEMPk>*5H=Ho zB_l?%3nSSTM`79LBw{2z$I@bi7kt$o#3Cpq(UCiU=NiFco0JnBfx%YBRzH&%zD6-- zjaC%X7V}=k7EzIi+K4$8yUo!R_&Xp2B$I0FF+D73QjI;jQ_TR$q^8^Bm<*6iYPvm+ z%K*uwrrV<#Aeq#3dpsfoB$Mj0$5fkIIYFB$MugAU)GlLF1GFhz-3gm2qD`FxzG(GM zw@vwXz*bt&<}fH^Q-fkVQzc}$vxOQF-jU283L^uZn=>WbN+*_dOC}BxAZGO8Ov$zY zv7zov93nsrs5euxEkLYiXC@92Ag05(XUY>+6pO-h+&9xBVL>x@yZSk3{5G&VbGKns zZE9ck-Y?r~-^Xc?(foU!cWHiO(%h|%o~<%=&3`A9zeeJMi>dtYbLMUv!52SB?#y#H z_gralW87zu=1L|t-8A;f zT*;)mOhda!;|fe_QCe4ZKwN=Ib#+ymcUb01CUtRI-a|51GN~nLsm2wU)TL>uaw)dNtr8|)a7ZZN5mDF)Y7!nqcT@Asbx-T!cmxb-Z|s+6N@8#0Vt4}D^WYmT#47{ zFp#_!r|=o&^clbZ5$8(0;&vM*ke!$-87b;K7OUyG=1S$rjww|#o8v;vTqz@yZN}nA z?xz_`R6MgVaVKU%HLoynDrT;fk7>n^DkGni zO!{dvy~)UAm#mmWbu)9x$S1-UlgUh5GBVl1O2}s>Xc_rLn9P;TR4*fwEllQ0X5y8R zPlUPVN?uHm7g;HDB{L1mz*n(Y9C;aMB;RHT&iL_ro`oO(HAXUyAD1N;DX%y?K9@Wv z>5e^i#O1`X``6+t&OV74>08deZP0d@jupyJebFgNW^#i5)a5~A9Z$o+{Jn`O$|An; zGz`hJlwQtK@JnVG8I`bez=m3TmLl#nb(SI{BjZX-GIt0%ZZfH9U4guijjlGSIgV>l zXKCD$NmcjHch#C|T$)MEGkM)_vhDYlcRfYFR1)b6q2|mGrrS6rUZ7J#S`epjN?axv zTaOIU-Mo_Il-h6s!Uldan)+8R$IT_Imd2ra;E57JE9!w$z zYXbSU9q(29T1=UqNGlT}EIr(F326k$zi#6JY(K`jj9$?@KM2%5vI2cR~2RGV|a7p*?v=**%B)*K|>dn21s znA*~W!Yu0V`32i1%(V$F2GtfMAIX&Ls0uiq%fw;yB#Pu%dh*q!((t(uGqaryzaC5C zVn6*kTHS&^**>f1SXt^?l<#2=No6#gho+DC$Lg*{({l+;4ipAjgjE>+(S^PExPisR zM0h8i-S0nK8>p#_oq@U$j)i^rh6BPBqtWs*s=$M)0%m23w5Do-tRS)VfQuUu0pJ*B z-Dq@0Swb6pPk%3FbG!7TFBf({BfEm}Ue4On%8d+I}r7+jZGAU>!7D{nB z3?3v{1`Wui2IPa2D`M7V_kUAXK4AIiEb6}ot&0q%`Ek$nWon)aWbsT*VvYn|x0lV> zY)~hgiBly?%EXjSo#69Bm@c$%@l}sTuPT#9&!M$P(dg?TX%v!T&rYJ=Cufq ze>ySeknx?&wqFOGk!EEG?d_aUufy7x?7pWXGK9mT92xDQZqQv-rmV}6B;*eC_i@UB z9*g5ZGXjhK=`mEL%x+RTE#XP(w1kWO)_)|rR!+5gh`oe~uDLx6e73Don9-wxu;8XV zp-aiBqKlfE-fx+{$K<8%Bd#oHlv2-*QTo^wP@kq)lFu7FHOZg4DYt zO|lG6+C(O4vSxUSQstP%PWmjxCe_sk?~|yA$-6i$byy}lCbh&#O}4M+zfY?vzeX3i zaAZOaGhH-a7qW{kH_HTIX-jEoUqzm%StQ_EW+Y1m5*}BjXfIu!aJm?2idQ|j9I~Nx z=4LjVx?V7eXU@#zIAHMoiyk&JpSoc%$?~SmOtvuTs;#N{g-J-_RBt9*n9LjUy!oVL zGH*E7o5>a?^M-eO^NFw`XH>F`72Dsl968eJ*On>Mht(oe*fX|+Odo2zm@3M}rE&Z< zvyg*r+>Dbz3}H^1fK%Je$cjCNY2p~hpNEB}=*W`>Gcyk^up-s$)zPUPkWQ^8cFF(P zo(&LEnd!DLhtvgvpS3lucohw(@wTQfYE%%DbxlG?xfHM?o#X1Y&QN$c%7?m;G12#b3^jUIF4%e`V`0^!(Ih?k>;u%JG3wDZ^&AvO z{D)$H{YgTPLfb`$FeJjmkD>3WjJ*R@DE;TczFg6w09NWYss@QBWE>Jp=d&i@p+QCq zOsY$R(%SjP@35T%*F^jyb$pORrkzLF&H)VU(azkH6k7?tX!USXI}f3qHLi@6c~^E#}iHnzRb zwD}<099Q?E%?sG(72u0j?@em+J&B$bD_HF|$7TV?woNFWFGgJqPMhB^hL@78`LTu< zruoTC9FA@8%am*j5ZgYGi9-aS{`-5rnVx)gooHP?wT|D#5xaj1@e=vUkF9fe9?PPd zq{MH&h96kRFvVV?-pB9k#Nt0x)r$1x059y_#+(e}WCOAb+Rf`rUdD9k(okMX5QlqF za{K%9!4X(r6F;Ar@DSfn47B1FqKQoCP~ zF>!YEz43#TR~!F$Vr!6;D7tbZmAVAlgS0{VqxWKLZo&pqklNTe<`qI9+RtZ*u8Ym4%mg1xCP7-w@Bwtl2237B4NW>zr?v9-_%ZRtk3w^fT>u0 zj36z@^&EbV4p^JDv1*$?=_a%(*G;fLz`4U)?Hulk3Yu|wqNX@B&^x?nyiZCs6}ayp zk+TWD5l<>b+88}N#W&wcJVheMJ(HQ{yYnQTVu#0Z{Kf}#4x@GCK_X~zPH8dXrs{IU zjVY~>bMr>{0(n=y68xCe_J8wHSP$d0KLN#*R`VF=Z!)dlm~aQ+`{_J<>J`AnSLv@J z%`EW$)vJk<0R8Xh;c{FB?)&F?7}aBd>tFM5+2UlZo%Kua$ACB!5Wr3VR$$INytYso zbDuR2qm)sC^^0DOi!WSfe8**61D`?{5+7%1CoMfp{aR6qCBM~$Du zgdChQLavRSZHM&m!UtCu_P#~^%S3;F9WK!2UAjIH>0b*F+w#pshkF+9AbFzY4RlQS z>ZEkfa7^S)avKyKUD=T0n8a(`&7@>6(=Y5RggwnG-HiuM;ot2NpX!zTcc(BX2~ToK z`ThRk6y_w!E?1N=Mq`V=A3~XgH-d*$TVy5MwkQR>xdFB)F~)C!Kgkx~q-}5Vs4YsS z^$n^@5|>^)51(U;@0o|oR!oUcm(If|;=~r;|7u(kg7l$X1_tN?Snk@`RS5meU~jTL zcf0dg5xx_ds*_9bc^vk=vMsJQ(svXaYGOSIz{#*K(l-sfu=i}}8b^N6$rvsqbn*zf z`Q1Vt1U|#ik>rV%Hlg?IopCx#@+RpdMMqaQWzxwQHs_>hLcg%D5cV{kjNwZ}Dg3)# z;!}09FE*FPpCms;E&F0vB{!dZmu8Ah#r~DXpCmu2lSEG+!`96C4hBM*)wV(B)XB;RzM!k@52`#sUMUqRVKdSqqOHQe@yevxWr+oCkg z%}ubyVvdo|2Y-?++Wn%*qqZoS);GCru};k*6Q5&?4fAj%*<$lNjE*hZy=SJI+TtVv zwdK{sNeF7|JY2Ro=@;*qhfzu=J!1d-T#y)9DLvwz`57ZCi(t_+D@|Wl37^9HuZ_L@ zUHFt!9iPIrWGU~op2r3`&fW1&OXra9`M&yxDCUr6jhK55`JDp^_pyOp+SM)W%wBTl zkTToLIEOsI+2xv+dFPNOHGK|g=7A=a=B_h6od=F{5r|5raVMuv@&$^f(v*`^%^cE5 z);Xjd>BZdjD5KVzmu8B*?zgR`KU?%A*ugJ$IJj-Q<$VZr-sM$ zWp190craa`rgEs_$@g-vQ8RK(pXHX*CUQ8jwaa7rDK}3@c!Dk-(>J+!wh7Nx7f<^1 ztyk8lnUa{^$0b4c^O#iEl#RxW7gW1sjhabaocg4?bi$;Tq^0hY7c(YxXd62vqZ3F z^VqV?9N2q5j}a!rZtwj(31QOHd++Bl!la}3-p`W|CjGqkejX!Cx_R&YJPBda%X{zV zF~Vfp>%E^RAxvH}dGF^j!sI2B_kNy)uo6z)z4!ANVN1#6y`Lu`Y#I5y_wyKG%gN-u zpC=)#lziU%d5o|!GI{UkNeC+^pZ9(qBWx|1y!Z2vNjkd#`Mme@v`Lqjyr1X&2sb6| z=gF|{|Ki(|0UiW<~ZI>`w8P!O=?0d+zk+LHgBT#&3h* zYU0}o8j`ZkCWAWkyV zw?UY!13uV5rf-7;odI9cw?VG_IxOHpjQH$#j%oW|F8;7R*t7S&M84tD|9}QBv4rJ1GMRlj>4iH5a4uCN+J)c2rj9nADW@(iowVX-_IG6+5h=f zSj%-u^P_#3Vy4CmPuQB&Wypfx*oLpUtmYyb2H(@k#K2x|&A9@^Wm;~{Bp4Omk#P!u zSc5aKi2Zsm6hu}WCtlW>Mc2ZU{Kk$`4Zg8^C*RmrY@=m<)v?T8P9QXjkYt&z1>Vus z+dS-Zr)+{TspVfgB?J%j1&`7 ztl6ffCXxL$G!$7in8xO~jP>43w%JNt|5|T8$9*(;Gugt#iFA1LIj-bZZzfxqi6eUR zIc_E5&14Ic`Ne(Sd?HNd7kj;#Y+*9L_<}c|2wTiC@bJ7$kQZ55LcZ^L@l|XS=eLyM z&F2wyUmuqho>=R44q|CDVfsURys$KN-S$aciFMluZ%)?fy6q}E_!IF@EbRRuz2-VB z+Qu@ae*YAlYh~>1&`ljTJPel<^-n~Hy201?GS=9VA4`t0tZoY0{~))VJ0BI)?dV5X zlv81TOs<}Y-o@MrU&WQo$|!QCGcnR_r7|AP#7Ga8U`)2l+jp}co`}fp>$!#-;e8+8 ztlP`D^|@e^vXZ+3{HZIsxv!fmxsk`%;kt?Fz4AC_pqE(8&Ar{^V_DKTVdM5X?J>0V zJbYXTWwSn=#)`W9hTOac-%tv>GZ)~Df zBL3;5?@T@)G~bzof*i3GWXXQJf1C?l1+_qNKyA@hLXz$9nPqt9)yc zE1i?u=K1?k*Y_~1ya0v1;B%8l^mCKn=5@3Rx<)HDLe9h&C%MAjS&{_jZP&IGgVrJ+ zouub9u~gQ|pAgKMVcgDs-%ZI{ExV8MZ5C>#Z<;6Wk8nQGk@6AFz9V3Xy$*FO=D{}v z_|Z2=!pB@Oh^Xw}%~xZUc>e$ri0qys``oTXec>1EP+vQc1@+Z|Y*yUuFs@HWO+-P7{07@RG_8$<5+}`cd-=B#7dU3AAL@9UXAEK)@=KG-jeQ2jE z6YbP<%zORrJKHm?-@Og(oM@RBScl2$ceg{8Bz<8Y*F{A?#;<*FB7! zHNbXeVKXi1)r7>V-YRh0t9oUZ*&^83q;Wq7P{ggQtq0`M)$Qq5KJns%tACGpu+s10 z#Rs>;q%8jxVRnxyuW6`PnV6(IMbq^6nAN38tBBoYG7Ejp8q*{uX=dq2W!u~9MCEk< z(`TV^KadNyZy06+r>yyV^d>Wpu-6?_K}Tb!A!=l_4bdko1GZP2F4L_om9aP7o6xr( za_{{|2OyjJ77}jG!QDGQGLH9MuQu*x_Jr;wPYaw`NYr6V8~eNWhd6B1!(?f$cN`8I zwK0h;+{;;t!$56JX4uJzh{KRRC)mZgh{I5jCSfn9BMw9Q%wQj9Bo0GSnuG(Kb~p^_ z^Mhf|S{#POX%fV)9R@n(@8gh{KTn3g#$h zDh@-LBO&1#?6}?Lo$w99itRT6sIn}2piY}93ol{HA{@y(_ZK7Q|7qv`$EmVv=JRjf z7f!MDEDni1_wTzUnz)DO7Jf&h1VB7@@h6FtNsQ-4en+J1JxMw03)3)DfyP%RiIk~~ z=XQQaqy$Mkcl0NTlnIUJrhZ4H%xOIL^(TpxX^rRBen+ItY&>`OCyA8Fjpqh`N2I(z z@!aE|BvM|Xcy9A|M7rLhcr_1{4VoEQDKAnyH~Wjvmd>M$X2HpR1^iJ@85N z9iKT)Z1){UweK)nMdTZ|SWo0^q3&wNsAYGVv9!c0w&lRF@9uT=CiqEuIQs0!6&O;o z_!v@_QpqB_my!2pA4&8pKVkgpqr0?U;eL|M3%}<-yztwj(X#`t2ois{k)uuYI1~}t zU4;MP#S*K*@1_i=bBXqmAwIxCWYj;-nU{QD%waQ~i+*AZ`Y0YOAtcB6ANh6}lHj`% zN!pJviJk$eldjY}Cu1Gcj9*J+PU=D=^AT6(0w;6A>zVOT=RNd!6r-O$l?BkOdE@hz z;*37eaFhUH5L^iM*fQjd?&cMV)cg)Z9aJse_nFbH5usKu#Y~Kl%+hJFa*Y@qL?+gx z=+9!@1nhsBU-C-)-j4YuS){Mnj_DOOsCtz+v%g0#kv?2(}#h2V=+k67BM`;nImI_S~P3doV`N%w`? z`VU7J@YgDkFohoz;csj*28S)GzDSPqQ$I_d!H@m)JpezsWb`us)KmUpR^Gy%5UxDs zXX{y**GH@OoKQX8^BwCn%Q_)ay?0@6Cw+GHe!6=+r2M=~8)y1+(FOQ|B)Ti}OF~Bc zGBTT=jJXhR1lKz;1q9@4S#l@%5XG-*9LqkDziF4O%GmGcX5Gus##sJ|)+vyEQNU#; z2;(O+%AHTNxYqkZ{ODC;?+`Xix*7QcT>ME7$V6l!_2%O)Ry^mry>JO%XMJGUU5g5~ zyBbD2z{&wXuHswRqGxG!9)3q0OZ)x9cl!5aLkOyV;ayydhiAuR1M3iDy*>0lL(<1Y zAJgB5`P-dO@_`>=)arQuqqR_u7eBwSuhZo0@A&|=1y5n>FBX6d<70ZS21|7N0sK4= zei!V(%qo)ut%5D&$b_Hx;!lxbpECGg_%(lr3qh^?`>~(wnVGFH=|l{;AX;4@fxg_R zKk>UquWZCG!{O(JrlaA)k<(GQ&=M4bcIp2MYBE=}lRugQvD4UBhHaonVvpU$(iL`Z z{|f?i;nSi|Ci+vfZLI|Bkk$Q5ICdO5pKENdu${o2xH%YOcR}7Y*P`U|(^R%FJ5QC( zUI}*O$4{Q|x$WQ98t3kloSN8!cw|%o9R+M?Vedi|8jaGwZYo-RnB%33u=T`07FjnM zJ5S1wuan>n8<+XRis+F`$@DuOvYu#R zKb#LKVv--WO>z{@BDSKNCOP4lq#5^pXge<-j;vfNzvQP4Ruws!PjuT-^qR8ubpzNU zYqI(ul`$J)Or7HgzDjnT<7d~Pwm0DYbV)CpTw1?{D)|=jCsgU zOrei}oz7+wz~8uM^p`et2y>25c2;~Tx)Bye>=VCrmsr2+Fy(;J#f2ZB%gB}owp>RT zeg`ijTLIYeU2Hj-*^0nc=wi#w%(fV8#V)qI%xp`+R^npI&&;+QY|C711)15(z*g#F zD|FZjWy><7Txd(_c+(m(Tx3kV$A73?>|47*3>j$OcW%pQ-=DY*muKPLBf;Wp7{>~; zp}C_K&3AJ#?7IkB5bFXPM#cJtCQNb|ZRThZ+>U*7%OuT3B2|nwr*nukNrZ|ss`PZ* zAmzn6x5lTls7<2~{7h|nx-CK`WBg8SI*ZygMDRnk>FKrznSAj}wdpJ(LLyF#n0urb zLeNYIZh$U=okb_i=WWivJ%FQw8;@C$Hu_reNKH-p%aey3R zN^XuJ7soI;#ERS;_$*yQ2349Lxa50WJ~#>gSI=SJnkge{emD_C4I zo0Ky*owFsGvrRb>?@5&zOy&$JCqh4|oE-eR?hY3rPlPZ~3a1~dsS=IRD^>0AMEpC@ zPW^pzP{Dxypc+5*AF19MI|sLjiuOj!(MjfV2>BuHFAz&Rjx6zm%;<`>+3yUIo`vN2 zL5t-Q4UewKXOAKiezc>DGeT#OImw)P!kL@KiPlNsED+B8G)}Zm3TKgU7N&7( zG|p8{#(PY3DEWyrFz4cANG*PlfwN>z4br(dmkZ~zG|ob&oc4^teuwc;7sT!sr?E00 zKW8+HCaA+#F8E+I_%;VdB{fyieqN6Fv;l+pc6ZQ(-2M0SO(#Po@9mfFfIcoKvilga zBxHPC-h7&-Tb~b~35SU80XgJlrYM`UFl+2xbyuYp}|kk1_QiS*ZygC9r$dmO{bxEH%Lb@Zxyi4{t> z^r7Rfu_>Cs?tKF(TroR}x#A+u6(=I=#$&7DVa!at?<Ic&&1Y)^2vu})sry%OGpGW7q-h=@qW~0${W6`X8 zqlbU+&vPSLzlf~;Mb^s8e%?950jI_zrZ^j&#JvI%m?^w$`*bJ=>9w(AaD@GR=m z&64Ow|@-|u8yj5~E9Uykx& z;*Xk`G4;SW2iDBw^LMfH62FU`7vQ9T-;%;CGcg}`{ZuxeDrFX`zq_6OTiH#v;(Z)b z9W1nxdPcBjsK4h8QqP!{qmlSi@~J-&&IxcYZiOHytfs$bDfqz*=YkXY#d4FnPrpz1 zpb2W2_{U)A2D7|{53;|u1_P#eAebo<5xyeo--qc|f6wu6{s)7sDSXflZI18S@uOrz zi26msBa!Wgp7M{QFjnjqXtFdfB2Lj?gim#9SgH-B4s1k+DL;ujSQGmgX5OgrU%GUU zzY-l?ofr^qyJ`WZ?77h^LZ>bnwLQ5sWKR5+tk@#^e&OeM1B~JMZ6mfzWOWYX5!MSo zbo9C^d9Yas*{t>Id`v%w@JYW|*PR?m9*Bk+F2j#*W7T3eWFWE@?c~=<%)GLoHnJV@ z6Z2!ihh)`mxB$1s$8OOcqp){;b?%^DU3gs7m{wR#v>J6a2AP;;jWNsXu~o*f z!*9e*5EG4yME4bs~-6lA4Y3y*wQP-l40T#4OwgXjf8|-Z8O6UVC(4XDEeJXNNEe0@Sv8Ou{EaBp44FhIR&hNsD2Zv zyP{G`_kR1v;WBCZ8&5zJOtHc;%+$k+=rmD#V>g~~qlKx%KpleyKX*zi?`7kN<%kDx z%9gOvzpX(HGInt@P0hqE5Ver_Vr}dar?jZug}pyQL0IHOe375FG4aKR+SNuD_T7U? zjl>tLI5_+)3;!A;7dL@7IdXwYgHG`i*}O5Ib=*5{v6#2QTVDTOgbZQHW3`d$1F<#} zR}RQTyo#eu%(9~X0~%kn`Flq5G|T?jC23hW?~3~O+wn#GU^`+XoRDFLk7KzbJUyOa z*vi3H=3+~WXBf5s*w(t((&8D04ZmEUUFBj+#4`}j;l@4I0KO8|Gg>SU6}!QBN~}IU z99=1u!1-Bp-M;v}gRlS-3pJt}AbO)qbXsu3u(g1#$;IXhZn$eF2(~sCTag_DVL=D& zg68*(hETRa4D1u#55rBSq{XcJL2WO7>dh55VXt&DG(RmiT8-G~UUnCkRpWI9x0XSH zGW^G4gu*GakjZ#Yk+0-|F%dQ@|?P_bR2q8ixL!FMBXa z6%~aZBwr=e)K(bRQiUd z65Tf(YQm95a98m1Ma_rp7d0U|(o>n~HNL2sgiR+q(y!x+zHQd==KSw!?gKwZ2z>XF z6V1XHIC=&*FTj0-#D}8W(@hHpY+sWVJp=VURs-day^Kx=kKxK8uV~f{8;4^=N6T{a zDOi5TFCki9(WJ^QNXQPN$M-a*c&2{ffy#2rQY$D}V6*XlDQ|Q#%myUdyKb__f1v!bb?{i%Kv^A+)pJ8e zk9A;^daO{Uw>crWszSP|KCsE#9P@Iezvm@rY1+G*kUgF6?=f$E;057=UI8!Ng8Rh} zS@ng^X}``SiqA|IS;@QzEEwWt7J}dLki|P#IX!~A=@NnDyV=s@>oZ(ugjeyIrO5|Q zi!v5TpU!-G<^nGk%)OzuGxuXMt*?GYF&l>SxRcI9=8_zUU^uVSr2{m}Im{<}MzOX# zl2ug8*(-*y_Z6DiYfn5YbZ$>PH+&YDp0dCW)9i1ayAH3(M-~CS@V5a;fyG%b98JWL zj{-)+1<~z=(I=z7fS35k#6O;~N4}R{A(Q&k9$UD(ZwcZ=v5$t;ZJ5t?gs#Svo~s?? zCwRNROCGHBDh7$1y0Di+@P7Hhcs^wQ`iQJaoKC_5kcsETXxZ;}NTi0mR!P^iR; zEeawUDj=vy$_CV;n+O~KYx`PD)7nzp1?}mdv`Yk+xPfr_TD>Z&YYP!bLPyMGiPK`PlMo_!;wF+ zf!R8+h&_wAciMb-l874Fe;1EA*XNsJ%`UCfK`ytD3lUvET%IFPx012`>7LNQA_Ju90sY>;1r2x|1@z5FgVuGkFA8a!mOjn(SJXC{ot@b~ z=cu1%Ge@)8UEk82nz{#oy!lwxT;32FK8-1vMfO~5wwSA$W$`ypOe9_Koh*Z6XGovk zisg%StY~e`teBrwvkYq3_c*?3KOQx9QEmjd?k112yk&Lj+Ep&II>j{Xm3`m2dU(p7 z&p%nr+wG>v9kB_*IF*6qAXznrA}amO{8TY)34pjL^-?)J8qSrIBJq%c0K}1EvHZ{!e8Kf(%WC<)u~z^Qs4TQd9r)q zzX4pYCs)$Jeb$pHV-m>vt2`Y37*tovcoTn>>7oWLk!t)e*OM0l+glC# z3SZj7>loU-)|2%6(Kf;dN?GA`kcf(NM8rl>SEg%CNHdA+6t+%uA)Hm3OOF7T)rn-b8c0LuD0d4%03yC@82s41QPAkT;lDAyyTg#j$ z$+}tK(mT!XXqn@!mTnWd)7O(^;#Kk)Pm<|c7P(7vZ>M>>CxQk7rgxf+_pjMn5DC|7 zxia0I;`L6m+~?aD!c{rY{U3z4z93y>jO#-pKFJSjF>^#w8j%(+PlEtM54+%o&WiwpiW;mA& z_BDsMJ)gB>_lem!0Z3bO#SXID(B&35zV2i#yEn0lTkj=4--yW$y59 zs#P7=NTy;jm~sdSQUDV@K}KOFm^e!>MsBxf>5IF+4^CMa9N#-=3Svg=lhT>T+p}+% zqevBFvNJZRnijdc+tvARw<}G$%+;P+E!JP$>-Bmg3qa#|0J7$%;3u#WQixYVNCRa3 zQUF-TDmxEA1ay`_jRCXyvv~lrW!D>EE6bTY0NJVQ4bToB=K+-V0qBsRkL!kppRv#5aqhL04tmskGJrwY+W63SveM`|O#z?x{;oU2J?(OzPc{g~! z%>tsSN%nAVkE(i1MX56os@^;$k=~ofzenH|%=TC;_a(y}>N%_cuA;(hc`#P$ zggfmh2Vm$%SSnPbDz0?LIGDnn_j=5tPYWDFdFzm5nP=or`n{~|nB*1La~8#kU#V<; z9bvC%R~5zv(QDtU+_XkiOyvAXcOGS_JJ)P{oo9T} zm|6Smd+n4_re#lG&&T|IFUIF~RSOZl_5k(1*FaXxxqYw8yowi4arVC)>%V1cP~*G` z#Al%lRvR~TapRSJ5W7pXr4brL>-0E`i`quA2uAm~xHwejn}miSrSbTZpT$@8n{$$F7v^h{K25UkqAueyg-idK!{CsGzR z@ip@K2qTrY{P#13r?dSJs|4)%*?p)3XW|Kc(4G>XE{ITu2V@rbv3TCXvp8ekRq__x z5k#k)&I8Swxnqk=CX&hoS}F_@n=0FhI2weq;la&zA__sVOBB>%l@H)~gm(>KVx9`F z&GSuVTrmGZ0;c0Yve0XoInaj+kN9z{?pHp`v{eQ~b8D;Q=nG!&n9hpTy&@E4g7n7L zBnFlw2neSxLV`mdlVNP_WV=@lqgC8Jju7`?@CJRlD${72!RUmYv{s2a^{*$y*3-o055K+pHx(9+OZDqA740CraW4MU^Y`aHT8PtZ#Q zm(#jsCf0$(BZP66_ydlPzYtNoqnf^@8wG**o=-*`jHa2ld3ki`~<0xYy4Ru6$pw=h4GsBbbCD>Pk%x zZ9wxZ1aI$hvwe`)0Y3$gP;oz)u0vI%4dit%uj0Tu+pLXf|823bv=!e_R&d7Gy--`D z-iEuSdBQs*6q=f=-*hK*)v90U*HGf%;!_g`<3U`av!al8K+lrC3#d=cqAvY54d=`p zPyYtg1$;|?kR2Oy@@RgOtt0_aVqfEokxTPwrZGIZC^ssJnT6rNW->09!@*07bEnlf zmu3vRkkFi*{j4g_C!BBU?K!&n*pFTD0+{$s{DEJ0C?4roV zZ(Icmu+?l@c<=SJurm5I<2%dyw~V8CSFb<{sB>uqk+PL;V>Aa>H3!!=84d%b!WWBp4|yk4OIR44g*h+zPBzAk!Bna zgsJYDBk!o1(MWdb2BeEI+LzZp(i4KqYoB*SCl*2? zz4Xl~ew72rpYNN8^ zv%|&q6t5$`0~Cv;WVp+*nuWB<%$lLhQ`U$o`iA+mOXg-QH%y^I;*mZ9jm@!R1tUfx#4G%0NzNM2eQ}D31-YH+%V1kk57~{ddE=@Pn7{8uCH+dRE+WaBd&v?tdii zx59xU=9=K9LMQT^)iZq2Y#RD)*u>vd^n9jcJrPv|TnXpI101!xXLIn*=5yQE_a`BC zs!n${{JnRwHgh+f+aBw;p2}ygy4G%CU&1@H_wf$=+ zlYFcs->;E78+<}~j?VRxm|~|P;}z~d0$_juFbJ~%fg=C{0&rFyK=Ba(OgO$&C=Vdi z8-N<1Zu^3b|75M^l3CIRM3^<$xC0Pp!-zhq(%9Hs1cCIQvtd+kkoB_Vqc5NKnsM|I z0GyfhrRoHM+oNN813;zV2pvriZOg;iYYM2t=3J+jV2 zAnQj0ka|MWrK*g@|L6?>oyTb$t8zHL+XqB;ZaB1@1NlL3ko7~Qm-@1ZvY5A36Nl8C#wjzJ*?g!>qiTY=Vejib7h|_yF}jc zK~`QrJGszTSE#03?9GT;#v0L{5BEa@SNiYZstjD<2slxgbg9>_n6j^>ZmE+}Y~yFEg0vF0sJM@ct-GP-AmiIZ_gASddK)7 z<5bzAikKX?#$V&SGahYI!^I1}&YaO!c;@^CKf0l<(*GZ4+8?tF-C1k3_K&JP7wY=3 z1zaRfRV7jNB45bc>YvEUJK)h>UAF+I0T=)y;hYXJoII&>hSI;0`A@4dAOVA(wQ-$x zdEibCE(%NBrNKuarwJOtGsusWwW)}y-E?|YeP znPB7H0qWN^iu6GhU8F%8;nrP>NbqV1*c;KSoD?PaQS8WYNJAWy-Hqxu+?cle3 z1y;oGOK+hDQFR&F^5~Dv>`ni=Q*!h__a*3OA+_40|5g&YzH|>KKiU%C=0_8rxZHi> zzC@nX9iU|A1Lue}`u!vQPK5~aOL}m{xpYjcM&oOW%&P~ffg~iHFGA=V~q*%2{gJ5*hB@ljCU^E>O^>GzFsdGtZJ|Nv@@ZL)%TLY26rtdHo5fUBV zcxfECO58L|y6p(UM02Y@;7dB!^L*S>;AUkb>K9#g5WY51%RgxNh_+&{9=w{(h+cm}z# zj<{G^h%-ZDBW*w-ti~hiE+KbrG2uwo7RqwnGUZO|iuKEc1L;4JA3U)+RCaFh%*tea zXL4?rrZKp7Kt#>a*}JmYXL#A;gO^_5i#5#5guBv=$1acr8}WgrFfasC@>tfK!j52U z=c4n^F1D+S?FwDxDUxoGx$vU}U!>n2)T0{>@(f~vmw zt&jFzH--K*T6j~FQ$8Ry$*cQi4V|4x1De|FzDXyFZ8Kmk_7?>oXttl3&Jd!z5}CHd zbTcvI^D~8~VB;pFD+MgQ;LKp-&v>qNtY>8ayV7SCKvA_(Pj8`Qyx1TReOZQBLi}Px zR^h+{pgN}8Wzpb@FA3fRo2QvmeO*4^dA{pKZ8*#Tf|L1Lqyx#9?Wh*#!9eCoAyIvY za_spcMH2^;i5Z}@TjM{nHPLd~Jz+R+-qixUbvnr#1t>X_EYL8K=figQ`dYy3*8Pvo z^8qI+z#2(W!v*^)d2C&#Ws$AhK#!^TP+Mnb+i3(<+Y+PP@8GdF%1hBkR(u)jIf=wl znA}*xr`UxV4d0-lCAx~qzu+Z`#sdowp=k_d+G}(}Rq1AHjt!Kdl9)_7<71-Wl?>87 zwd%%$9*HYXfy5*Gr#9GFpg-q#5dDKj^Mvl77b+<(+dpH4&cUX3so9iduM*N5Hp|47 zTvf`mv*Aq|(Eixy=ibuu^!DJUou z&qQ3~v2CezF8}#VFRzi}BC1R%TqOWrA3MV5(#QCS=w?Pda?39txvwbKyMxHc&PD1B zsYl`#{-%8TQL+o~mGH*kIGD@wdWA-u>S3WoBQp+&D@_$B40WgkX9<^c{s3U=hd?#C znESEdu-9nJ9J-l9ie|Pcxh((B#XUuGH8q*`b6YcBEa7r)ISkSp`9t&71=W>gVAY&l zE*%90sjrgc>P#ZxBG=oqvR=t0#~1p>Mdpp1^#gnUVter|!Qa0)DERx&F+vo*7CX)H zFXcako&6$O#y(Ya)oEU8^I|h#b??-)?ITZ|VKUMk0OT+DpXl;g;RdDTg!= z{?5v!JTN~}S+oNFntK4Ghf4)yjil^0^V9HeaWg#^z5yBlb<(y8A*b@6EBVI;-U=!ttxjIWDHm1umx8sa9*q?vHZtwjN|s z4)eH__U3ui@;gRLAT!6e7=${d;e2f0`!f0tg!Dc1t$8#TAgnBef)7(SgJS8e1vSCM z_w`fZX~D!dd9qrIlA7+7{ZrTs;U`DRTv?DpSrI;=X0vFF*rC+NnsHp*8fxj((%3&z zuj=pKoIfgW(#Q;x68hv zZ+a%KqIZ!VUHc!2o#Yx#2FQo_KE4#Yw5CK@S@oTnSgAd?t5?R4v5pN!VQ~C+zRH#d zOS9~Pi!A`BB4+aR&!uc zY+zC(V_+Gdmv>n8#ihVdGY{s5WcUphnE+;D3rG&F6RSd8PNa!_RyNzrYL0VwP=Lsk z!*H?l-6AkkgHP6^X2r#h=w0QYuc?#&YBM2O#B|v+Wj8sL3znq@OKn&fQH&|VEZ1b& zSgSs#Ez+wzo-L`%E}6bD)U?IMY2=nI^29;$4)84=3u}dF=BRp-Bwgjj#QZ8Q%e4AK zqP#}cddbt~jZyUrnR}+lW=^i0GrhLl7cyO&fRM6-8Xb%hLuGtMjB-`>irgw0T z=pS-&^8iO&yCRV&in97+nQ;PDThD<^4X7&|mxZolP0>hi&mti$y)xTo*}bDD2{|S^ zwT@NZg~?ykVtm-XW9k8+Hwiy+#l$Z4O}=SASk|6wA%tQTk!W3Ejk?0XYKPpcy+Ou7 zM9RjU-mxx*7S_0eC!j8*1C6O*hd`YU)RkAjtGfWa8o>1H@_87aue}no&XszQ^kYeS z*6VXNle^f_;U9LY4~Iw{IsslTz*2}P0j4#sp+D^^hEi;p$jOBv`&QiH;sZzquVFc`7@FrJ53U1mBXGC?o*#7%xN!>MF`8L~ zzeR0vdaLGlI)jOT1=O@zf-zE@*b(;&F7Q<2ni0wDNOwVt0AU5;stb1HBE@dG>u-YemWHn z(XNh?NBAFW0UhOKtRiDX-7HY-kZI*5_jl6LmiPM?VXbRj|L57?3LQ!z?US;l*lD-6 zbdPT7>CccE*KTjV>RvYRz+Wq(&a{Rzzqqx$*!P?^u^AiNA#7}ytT#;rT%zu2Cwn`joV_Q0WojKktVaVnSTZRAMoc@_Ga0x6#8lj zH;~<7`gAZ{#aNvisQ-p3qN$0My+&of7`vci<q#XC{xTcDg1%1jP6akCt zTb^b6NTNTkJU0EJ*n~X}xt-#ihB=x+z*h`91)(Y7@<&2Mso^V?<)Rt;@I@ zz_6k9iG%o_2)h`GqM}9c+g|6Jzk+sB3DFB-I0_*t7JSc^isnayHR0JA#d$ zN;A*yz}aYA1^VR9k=0{3nMo7@aX%swNPQ?-QJUoA%u=F#4<@O0O#HaR>xF&nc!w-s zJe5Mw5DMqQQOVhRs*O6r6q1~~OPypYP6z$j%~{`J$3vVYst?(W6vD1=(q*_ zaJs)~NLzRp$kEUC$d5gH&*0g+;zM>@zlY<=u=l#L>6PQcyGG94qnBt1pTv&E;|Tb% z_ZpShu{W&VzH#f~VZ8A8)+b1=y_b&_XQ|9C>j_Y#|LXp}r2DeCZld}jy=2$#!>p1F zci7!7jo~e_{0^n?V3alIyrod1-a8vm(PgAjCH1bn^+iLc=HYm;Ooc;)cy#8rDltlA z+N#8UmC5OHO9vQT?wxGo+@L#BILaQ*X^qXv<6Vbu_Z=)|FyOp*xk zPUKmu=lDf!+)^eDZuZozs<8!Dbi6P9gjE&dsl=Cl#HtGLRP0ONZ&j7@G{%>{)2bT5 z(C)Iv_uNqMKfjmyUdOHty=dM$A6< zavvQKQE$*|B(*Nj@aoeLwWI|kZBsUlS2qoxjO_^qBq)C{StSo0NwDp$)gga>*udv7c zh13aCm^x{!2rj*$mFr7a*7*^ijz1xA*a@(AicglIim6HR4 zsgKJs&?N|8{i+N$&_kdmlZvI^F!Y z%SW9}n@uEBew&?7MzsU+L0el@{^D#)x)@@dPNmWb(>=+mmQoodBInu!4?J7 zgB090(=?duql;L}XE4B!FPTYCRH-}lAbW5K8k{zUv6^j1yGX2Qdfw%Pb_AB}o z?n3SFwMIlGhgUFHMH7h$ z%vf~=gF@4y}Pn+(pbQvUw{bKu zBs*odo`(Gp1PRO{9pH5J;{=4aHQR3^ELK=Flhn&WRaaz;S&$-j^M>dd2(@9}j$FZ}@U zqw&&brT+)|Wz>0nFjD9rf!I+iLGcCjT(L5!LhZ=kr!b*RAi^_%((98+}PEUID%RVP|`#rKi9*ji?9l;+wwgOmA-aTM_cA zXmQ}M_FvuqaHf}%%J`~Le}jiacO71;AhfiLrfm=x45 zpr)9VqA z)wSv-7DUo1zsu>T>4L*}6n$>k=`rARd`kA{5u7{;1bSS~t%5kaQg?kf5g4k|`nkY_peftzKdgref-V z*lAN|j);FCQhw&BOx27C2Lx4=;&fldi!xQy?U~av{^jBc2aG>cRjy&q&ceK%shT1S z5mSCcCr7JfVJx-+arw4C=hWYRDw;hCdo2`+<0D2Fsr2CiUZq*DFegMQdu+Cnt)*Dn260R{dY~1YfKAF)_2Fl@>cN>~5D&x4H{r zgRJgAte@V~mhR!eYdP!t24072b{2Kt1P8T98er1 zKSXrwV)s%u)>NUesWxtdtB-ulUl&~m=6ToSv8-M`;a|zelBG^byEJ;qUj(`)Z&f)8 z6zT~x^YvOGxn<|e$F6@Keco!I@P8p6JwftEvNv=-1e3AXBJJx~)8$812m^AgF@zHU z0{}OW#JBkkHtwZ4YU>K-#mK`>JKxl)zydidsN)T@?axPF?2Q|&jZg42fUrP}+o98{ z{Wtx@nRKVTR0Nz!A3Kw}oXUb^L8PwKAd0GyT8tF8R*m*KiQCCsR~m7uN+YV!OSpgp zi6Es-6r`0$)cZ_dt;;Wf9-p09N7}s*lhmfyG3=p8F{jP$pMk|-y+MESLlV{W0aUZ_{-j|>rOz|>g2#El3UY? zzSHu2hKzcz`OgNKSR3&kE*MS$W$xIk*d>o*a$FoV1b4<|tB~|*P_#?1ivb5)v7^@vzSFe`B zqw1{@Zi_MP{nBb>zoox@S10{_a7G~;D91E4Rq;u`#Q*7S^Vy%vMqevFDLxos={k<_ zipSg2{MGMQ%X|Ffnz{+me)1eqw=q?c)Vee&NmNlU@L(KMDK%5GrWjvE}!5_|GrvC zm1;!P9^o}1^(w)ViooDmePxu#bDKUYV6e|YEweVrU(rxv3!S+tiDk9hwO?a5itj1v zvin=z1A_l~yO7>JF!m#>dr*vU!5w&_gL_F^Sji7(-DS&gwn`R<+Ga>#M!?$$-PB=M z726ka@@Wq*#nuIxJOCUy;`imM)&!&DEiG0Pu*we;E{)6ygmXqytJxj2e6qri&`$qU zvv^1595s$4zN7r&(B08S^fAaueTTo`Q|HNBEP!{^LdhreRQmPDVB;*(bOQN6n_`16 z*H)ZKJnYo3TQ6P%*d?90>-Il(196Ag`CLAa=C7GI`g>!Vy#~FpOAiqVKJ^%)L({W( ztQ~$axqJ@5*vDVKA-Vi=9@~~j_$%fVPf9d3wP_$ekt#6qPYy&HdC}1MEZ_3PkB`EL z=hFBYJq(p-OzUqV$NtCUTwZ~k*YHTdGZV?g;bb7I>q45LLTWuS0V5YWNNah}R~I6F zF)1}z<^fjsnN-a4yv;l2d!@~pHG-uz{5ta)13_0V&c-THQ9{WEX^ggpZ}V3u$A?Sj zJ0Y7-{i1gs_M?}{WYf0nK{tGte5=^OLSYxcHfUiU=m z${p*wB4+H(R&yw#mNA_|LTkmPNPuD{EClJASr8so-zAA}(Rn}l-eRx065l1sr|xGw znif03cINX*Hsn`IkG3sqc8m8KU}UZVzLU+y$%b8J+t8c^I5xoEYPYw1GFlYKrY(F* zuGq?7EsCU<)a_a#nvDT~*v+zb@j}|J0Eid(@eok$$Tjgr@ zB$Ji;91j1~@gBK$cW{N= zhl=d8mrvvY3D{)+Y&=hRQ*x!+KF*zd1>*ZHWeg=XNTfy`4=qW(Gi)4U^mh>>9E`5^ zN2=$Qd@s;ks~*r}3E31}A@bAq3Ype^%iw8q_r>}XD<*x1)Uj6mS!yO;7b;olH^&#S zF0p7V%c$Feq|Gi)R)_@*DLJiP+4KFk^!8c91}O76`nA@zWPDy2u-ZzK{yWH3$w#Y| zix^aL=q)?aFR06oqYtJWAIF72O`W^Xbz77*RtJ~4s2LQg&IATE=oiL*i0;zR$=(GX z9Xa*ornFXH+7dotcmBDzl(mJM>w{27RD80NAR2b-?2R|zaZo!b(AH`9WM<`01t zy<{ff_8NhLa+v>Me2hJ}nHvQ~>oJF6hdFBkq#xFz58=4~Vb>pApMI77MQX;Ls3S#W zCan;(4^k&R7Go!5bkQc2V66+<%an>F|EmV zyv!-G_Xx30lWdjM=xwt|Kk3)3PWr2q?o<_&@tF1JAs_lp$x-r|J#%lgUGL_82X6HC zJ2mgzjarbm0Gk4wd+-65(`2IYQ{cm)S<-cC44HLv1rslzq1YQGRic>PCt3?C;3`=k zO8l7Qs#{1>U#G%4Lo%_H_h91$$>zwjT|i?EmoAx*IZO3;yckS80YOCiq0R8|(MJdV zM>ubl&ZLk0Fm&~D#}1VpOza3YzDhe9M3bISPk5N(mDxPDqY2#>?_Xt?Jdyqrz-&Mn z^K{Akx^sjT!`X6J#iEj=Up*|Ycdkpd>xc#i8~RadDDEt;IP`w+d-|s+^r39&fJx)M zeynauhJ5RcKt`r3w7p#6mm_L&yunz3Z*r;sEty^XIDv|#ii3KM@TQG@qb;$R7Nr%? znCHv4E+?^qFUiDw{^EzWMtZ~K&-^%mkF2e8WF{?B>*%p$A|~m&v)%q3iZ*0#l+U8o zY=9B%RT}7A>F>$%?lx*LfmPT`#f0Z}%9i|28439saXjpz0q_etWsT4b1LP|IKSLo- zm+tn<%U{qhnn2Sp_mW4KDE;DoPv36(MZcmcn|`@Kuya;4zh6rJ#(vR%Fy_U-T-r9< z_O_#6+im{}y+%qr2oxPjhFX_h{}ZN1VoB)-CA^PtIQ>7|qbQhYHf>`z#}n(okB{LG z_)$ANc4ABcv{EO^sWFE)akEeG3r}LqT91@6-jNhm^iga73Dja-%Pa{oEV!yTP8(9+ z3_;9XSO#vp8zNh0oSpHxg#OhOhS*^!<_P^ESzIpoKFlG5#VmSKJvt#Zm#@N~>%b?W zj%2R1H4EXO>2)7zZZRKf316DpE!lvT_BdMwvZXXWNrKjyi*=o%c_U4_3i0qKZ;}Wm z5&%oUC)2ALE|V@+w~#E79$jiip*yq=KtSq2bQ+78WP<0h0O3E99hc zK>g3S2$z{vQexy4H4>lGhhrFQttwsN4p$!5!xr@(Y~XeV_ml)6wl6rY$q#ktm4sxitDoc%h3_6{CL2DKI_)VwQ%DsLU+O)mxSF>Q1b z)MaRj#&fJ;@}usikIM`%VGB5uu4ftvD2I_C&N{33b*xcHCiTC8^fzjwT6P-l?MtcBw5M&(j*^I>E8NA}uBM?%zrUh*ErqDd`#e z4o!pq8Cx&pMDaP+3*91bgXg% zpp(koc3LJA1uWuNv)$}gR30SzC@*_VvWwx&cn2}gYtUz|(HZ>JssxS@E}PGokTpSE z(e-sYwMaVpz+kGx0-xL0x0FuPtJ2`|Kf#jNI?%dhK*(N!E|2gN1E3?Ude6(-Ozz0p5fJKZDk8z&audh>28ak z1-~F4W(P3r-MrZTacsd?p8*Y}b|FxbB`Ye#)!DxiKl9m~uu*YyCmKAd#iEL;W;0%x z3|^0In+YRWtrMp$UcBJ#^xCYAC*LRc^|w*up4L44f*FQZw`>rdi3~nTFFHgXXnFmf zY3Eus-2h5YWPNvK+>XKbQ>0j}da+RQ$f!M}GZoaTMT79P+UEKNH*{VuYE|MX2CsWK z)yzBG(UsLOrweK5H@H#8OWHK7aI-p37hj5wd%C?!FeG;9b0V>!Z1JDXJs^u3eR*+sdfRJXc?)|jZky^Kh%?R8v8gsk7-C<>+p~nrgw!LTMYV06F;PT1 zV>-J&7A7qD0A`J<7ILR|s}oIOdyOvL(8&>eYP%(`wp-Eqw6MF9t(HeL&(K5pSVk5)^HF9*1mx(+5STkFa+1 zB-Pt{F%WSUJFs|mLr*!U`j(v5&{Im*TL*F?TS`hlgnJ|GEMeYiQ~XYD7zxUV8X{SjkAqTVgLZ<^b#=laga_+8lM}kUZ2R^|wnNfI*>#Jy zxo06Z13^Zb3;W(KXZ0_s-Fhj24J(|G_dk5Y!w=y?e9Go>?sSPCClh_)8LgFiV0&C) z)$jBzI;Nq%eLJdaaQU<3w(ED=@pgSQb8b6l*&E)?kY;gZL%cm%zjI+xMS4%e=K{az zpE`SgtG+$3a2Q2dT>}S)cg8Pi=#k_lRrr9}?VQbpsKsZs^bE9m2HrZz3bz+nb9eg6 zb_6#SFm@$$X1ilO1obop;}b!Zx&m?HG-c43(`^ksc;@(S4R{&J1|V5}?`8RjQ7gWC zf`IQ&N;khx`|9@MykYTP-|qU4v0Z-rR56Fmx^~~#_2xC5yKns1j(0w@w3-%awR`S8 zl=0er-kY)y<(gRRt+BCe$vJmD4caCBox9faTT|^=&v?Zzpm^p?hMV2`+;o}{RQzYZ z_?!gt;fVoyYITicy&yRlCPm?W#BU)NS#(c$exwo5z6_9D*r(~Q#!lzd7t4uxu1jxP zIbi1W|5y<|wD4OuNX$}kvDnw6k)v(S&3?tOLoUM>8BB7UkPn6$~*X8lu=wdwu3}IS4_FWzq)L1=* zvD2-dqIe1SsU(@%xVl1*-4t>m^Na+(0+)Q!M_cM9R09{OJ5l|SQ7giikhJj*wVG*$ z*lKcjV5C}nu%8sc*q&}}YT|B%`F^CmuD3R3aDfG<{dx-9!UsU_<2+eB8b0Mwj{D%EQ0_DorGe^l8V2xdZC;u-b50(9ZpO~8c5Hb+O*$<`W z!`rmGL0WD;Jn4Qobtw<#ljVI987rUSS4);t#UQ3%zh+)x8U2bMtdTg3BIz61fo!JQ zTJjDuT3Px{^ZifW_m9!uVU_e#=KEi~?{B!@9rOJy@B3!+JsTT_GXCnNJ>sT`=c!x% zhhExBH;v)prS*7eKXlV%yWGt;pwp$h#!dU5T-s1C?Ho64X)bMqmv*9?c3Cd%6ff;_ zcHgLT>MOaluX<_kx@n*31+L*2k4et>i})bSJDF+TDw7Oq&Sw(6z%@P%r<-)6Uo2@g z>bD{rjAw#+Tg*nu#Qkq&x0;)(Yv=h&#Wg`bdip9_Gn+(zr04a?xcp;zA^Nn}c{$l< zex`AU>@~B;^Eewm~ zTO+tv9F79&D;Wl>94ggS3??q3?_s$G}DdUaZEqlXT z^Dr4aTX(naYTfn1uFZSG?Yp+@dVW{Sp3I)l_w?+3W$$qCUpHd+_FV_}hTC_)xT}@_ z5AlBspAPN*6aT;Tmi)HterfM@0Rawy{<>05zY$nT9;fWRuH4!(-dpK6H9_>=Yua~j zOVw%-*0g)uF6-Mg1z$MGmC1j9T;5HpxzEjg7K2qj+$l%Ab9la2`UZJ-^Ey1s+Ew;N zykT>HyI#?#^A0ddWF_IvZ`n1^Pk^Y?;dWE|KhHRmHqz3*}37(l$6v<=WQTW74R7#rEdbs4x3+p`apy;v6R8obqh4gbt@*bRJN97J9Hk@|UkBUV`sjf;te)h`Zx zB1WXJPOq>R81$Hq)Iuo?!rScvXL^%8*_8MtX)6k(*x8*@rW(98_H`T&beYn=5q%L` zWx=%S03IWY&Y~IWLP~uEwyxv=vEQ(LTjfti18r5}5$GP|5;2+$FHx;RFsC8XB~M6t zPXu}|l1gcWU%91sr#aJ`t0$zen~Vjr)3q+aGF~0ud8xoRHQaU6x%7Kyw%MrYhPYn*O(t-M$|P5f z;qRe`B{jKg~hK|Dw8@Xy~^^*r-URFZB9C}o-rlb&UBuG zkH4zR)EOOqmK1$uq3z5dYtk8`5pR^r+b`N{ zq<%%O1RvMeH#(DsBokd^Nv=Uov2&#Vu97c#WiGaLfv4%JCTHDZ>rzf|$=8*b9kLVB z5Xp-9$?BL16lSmbhI}!h)Ekz<%yuFoRIHk#zl%phvS9^(b81OblloL7X4V!5n`pjd z?Q`LuL=y=t?6)o;xEdRFVk6c1w8z(Sbx58WYXlh>!!n}dA=j+Xgd1cNmg%Av`|js= zF-M$2YUA@e<%!|Wc75!$m5nEi`updZ75yu!tWOGWeboZos^1s5_4(HRvJ_zhMxS46 zYVCgpT6=C>9Z~+zUzGAYkeRML)n(uPCsXV`yYWw^*beQBImm9bCs8c%h$^g40=K?K z45MsGx(tb-5n?dNc%lWwxBhDsfy34SZnLB!c{#4(9m!PI-0+EyRVeo`I5W!oZF`>N2gx8l0I`qE%c9^qhN0kJ z$};tZrlxgrfRfi{Ue}s7fer~dQFid)3k9(Oo8+8US*CH@%>(S#rP~Ybu7fS*c*yX~ zOm(oORGzJ^Blbu7DuCYmx=>VW;pr60njfqLiuBt{NlBl_9%ok{z9rte%*x7*E(2J6e*g;0mH- z^@wD}C_6gJu9{9%fVPTK>g#K(7%M;aRwgF#s;ZiioPFS4nK-Jxp~H_bu@R1v10unP zHWy+c0thiy6z&?v_ui2ukBB=-h9YL`mX0E!t71~JnlQpRAa=T#io$9by!&r)fFM}` z$>n;M-IvYXF^pOLf0uhkvU(Qtr5G*Dyxh?Fb879ZnMbQ;54S(sW<>Q*4!NQ_E-n+Y zgQ#S?Lk77yhS;Qr%Y^4ke`xqb+=7mR?+O>+xqb1CJ_27G5-W#K`-*IZ+vs~aNRbQ9 z;|-h7Tk&7LnJHlgmUiJwC$WpC=xHX%q>e(V3f=h)&ysQygN+B^_{h8hz=`2Holoj< zsfT_f5G?`Co;_30oEaO`%7Jc2kXOk(xJL4;We2?}tWnGoOBWwIA=oJP2(Ic8P^jdW-W7##prU$=FSU

    _0Saoqx#fV|mqlzj@hgFX$su(-0dVEpE#9`HwXg5(m z{ccyy{Kx0{Yvp+#YWC8xoFnLnay+MJJrWY1S)!e}B6%6h0K4A1r?C%Qfd_Y`2Y2L} zVcr%QKmj$72F+VDcuadC$vWsA`Y`8~pQ4$wLCCh9i;K;v@RA!m?`i4j+|3FEb0>{< zDa?U9(+7k#FCb$7aF*& zZt}K1$uh^pD%|AleUbx`{AD-!mEOr^(nPCTtd@bqL~?`c>N&!$=Za5eZc+ZrTFYJ^ zy!l!aQpniqz7R%VQj~?UXOF1G{xIzmT-)UuEj>Ff3M}wX`*;y+EG;@kcK!>voBl1_ zg1{p1E%;x;E$jss=F**FQ!!6xV))57U6CWcVcB0Rkv)w*Vc_mM%C|d@^6h8&-}bT# z6fW7l?Tysi9ZUCxmmV(fO~aAt2g-ZXlb=~3}4 z%i_tu@5&ey2Pg4vLi6%kZy=?W?HIS!S)5snQ+z;rHa0d=%g~P&wQxQx zTdwKX_MGvOagc-i0I!AgYqW=&2fJWlQMGS07>z)9tr19GY^ZJaE7D zk_YZL%~_s2aKHUBf1JDD?mx;m-HTq{KIa}~M)7*+yBj(8*d!lb>ktdJ-uLSpN5}D( zw{%Ekn0^AAe=z(jAW+XRcFckOBGEW=`Q82^xMD6Y%zf&ga7XvOH0@X_=vBWMWM{A>A!h;J>}a&?CPvlbomB`V6)ZJZxOy+J7t14 zLAL0_F>|P2XAas~O8M<6Z^CHmcKSw-7nnD9$i2b7^l?RF{{1MO>&Ge@Um@IM@*6zK`zXUp2 z=65lAUGaW&xUU$vUH=a5bJRibH6Hdz=Tb%c0=()E7(90f+Jq)}K zyY)3$Ac(zg@g-C1S1hUF?6n`c6p`bjN6`;3*0dVPSjEk)Ol!5IWk@JQmh`{olj%4=|UCd1SI`uSgD~dGtsfe z13<+?>O>rJQ@7Ao(w{Dm=Ei$1S|s;PyEVg};1zJ86hO@DVB!uila7#}7@mFhf?`(z zo(&LHI9}aLbDJTbS66k{JIEx-fs6GZ35F}Q%`aBtq>v>WVE-FrOmRdYp#edap-&CD6s~#s1n%&PVdRnvq zYjKG`c=zUu=mYEBF1$gk&82XEK_~=!x7`NK z7ugm5*!MUJ12AFtXoXttn?dK%OdT8S2@GV18Yy!Dc}%UL6jI8=Jt%&J?jkOF1h#t^KCQpteH?)YO?iI>gu#Z;AAsq!+c{yeFMBbj$pHiT_~5 z2pFX}K9P+tiN;VBAWlPUh~8r}(SU{jYOC4se*{#_Q5gQKiqjqD+ns#VH1SQR#oN-_ z&d5AC)@zP$tkzyYY*;zgtZ&HXB_VN?LAqZ)gD?>d=V4rX(hS4x=8}9~ZTlgvIRP+?ichjMc6__nG*o8wgA!o(W7xK}txSo8Sd+w1S`?{ItwyU09 zUL``@t;`@Sk-9u3b@4ix_SLt&&pe3m2tOrVmA@|`vyfe$J-zRPCfP`PL5N}m$P}5K zT7D%$S*E^)Fm_vIiRkC<1f;HKIGbS*b*Bs(enGM7=6j!EAXCPfGXC?X3@)S&;Csgj zkL;8&;-AK+ANbyma~5j`avo>8E+AmAB3E_GnJu z(^efBLo5kHb?15g?E521iYg;Ysb;%i<0zWiM1*Ur6sw-E)#oc`Pk^WhsyGMscas7~ z0GvF#Zh|wvAga=yj0-kyHvp2lz)#}Ja^hrTpXBq(b`zI^)tniVR@#j7ZYzs)xWW|AxEnfn8vK}xM=nJRNXHY?2kcnO3YOY1e1T1k{R z?*s%VsvK(rz~Vy5{n4h4Q@`8KU?vpRMWImoE@(gx2ZsAQdOBs-%J=~f&|ld zc!*D?OKv3D%oLRDs#4z|0S@G$2tR9GC z1clW0k8`{vy(G$3=BZC5huZR&Y^_6#jfw<$n77cIaw72VH78Do6=)8jr`J;0! z#YZxW+|ikORLtkPJeh^1y!w6Id(fn=$QC4*yLhud9|VSbs_aQm=vq+dvS5P7W<7ZVWyO@4N$2^ zwglYA#Nk`i+0>a*ny$tDy$WfS+ObhujkGrkr5IkUPdiw*P8 znAK2f8VRU>sh0)C>`oa?^&Lgs$$F))(`CkB6g$)T(3!ee!@#RQhO}Km+Gl9ZVrwMU z-k<+22*k6*E=VoY-;rA~&%u_so{QICWyrHfX`S$LEwWI$-v4j2g?SGgl?-ob^N*25 zrW=t!RlF?ITp(F^T{66miOni&l`4Ys1wfd*S1wD&ogIm_w$eMyhr#ETULHH-DG|0HJMtOB;f^O)* zrQ13%hkDgbtg+{=6Dj-?^h!zDs7qR>uH@cpn!$va@Zt=5cD?Lw@O_VBY`U$JPGt>0 z8RB}|;-o)VxkW-4N|TWi&p(b>HPlagUwM5}1EOi6Tp;+M^-Jj!xu8dT^U%g@!OAEP z7Z=SZ{vHN7_Ax^yP<$|v2HH-P10Z}CY z^{yp&(c+Mwvk;v`$2iS25i)nI8(UsSo)_&%Q!{Z|D7b7sNOCI&qa8}zgc`B*RQb)? z=>gh>l^jMxW6Pu|iYjrLlIs;NrIhr~n+!d6r7VR}Gb8HxKZ$S=@=~*e(5O)D-7ynv zl+~`>x5a)jPuhkOP|wlsx<0{#q}%n|Q}nmFM-%OuGdi??aU0DbT;3%=xp{r}Z;c;V zwL7KL&T+*&&LmFb1Y&1MZWKwBM{_qA0x85{I9X>r@{!Bc1iqf7wFT^=R#;6G_b|pu z$R0p54$3u@3=_R%-0qPa--m=Sp~Qtp3e#Nn!w9AXDPRp?*YO=E!Z%)oA6wIF^!O(x z`7h+1{%7M`Zk%I+MuF|z|5&nQj2dF(pt({_bawa_PRuR4_B{f(Jt3>q7;yyy(TKX3 zl7xqE0xfNs$HrNmKP2;0-rDT}kU*rX5h+I|2^r#ccYHh(7m5apx6p#?DL^lE14{H- z0pXr1vsCFUh!4!!8N;27X4xKbtVw3T2Go9;^|lzZZ~8A3&&nv~CB9E$`W@jp6FESd zY#HK9lMx?{0*J$(?SF#paaPgEf~sj}+nX1>;@V8k(?*1TK&9V*PM%XW(3jJzkF4+G z51Wl^x#C@y086-WB=rWV791gUhX@W+eF38dCgfURK8+-blpLPKm@Gk&nLvc@7h!xl zF#UK_RM!XTs9m6*%yP;F!if{7&G+AQGAtqIVX0hoz%F?vS@MLijBn<&sdmeP=h8ow zIU=HJUjd~=8X(|hdV7;s-`QR1*XT4|<8M)8qwjKq0*a?6j-G!A)2UX}K;?>!=0bz_5!A3bdGWF>P`4DXUPo62=)=}+}`eX98`$?)B;8?$qo{Jj0&Ke1S z7ggWV{lx`HQPt*k9oLWvKQEqI=bINHYvySwETWD#)604CEq080nx?Udog?H?WK^w{ zscV(I>UDr?r!l0A(?pc*m=*l#HB_2ILS)g{)unCJ%BxSROqjrHlM#7s^7wzzCjA}j zH-`N}y{d7a?j~IgpHR_dOc@8Y|Jma4RKzD0ksI71W^|q>A7TU4N816PqUk><70O=W zb~GBs2@N#lqer7*c#ei!1XEuc=2IO_!}dSxQF5MqfQB1$G%Pp@4bq>?9aY&Kg@=Bl z*VZc@FrCeLLtQk3KmKhD0Er!KRpLdOiS^gFNq#N6xfGE3IwudM4_p^u^g+B~+NuJe z6uwID)@jfuJ-aZg##sDh{AXoVL?0ZI$$La|#{EB^Bi9Aj@o~w!JaLSa=LHo8b`tz~DMvKqZ z=Y_$rCoe-A-MlX*~OawYa!6{<3|W zjAu?xV^0h&8!Q-^jFP-0{vpjMN@R2kj6c90E_J}eXf5B}Y~`2}cFB2H%yo54ntMp{ zQTZeh4Z}O-McqpqyOm#j1>JhGeUC1Y6*eYGB+o0`Oi%xo6w}k+%|c(sw{$!Gg3CPV)OUme!w{(g4H#0NZ8fd%7cKFGcl&Wh zz^%WOC|fqEagtNd_qFO`FzeP1CQA5h*J6VVwN(bhkkeM_*9v^0L}6^JEM6)<-pyYy z0n1v$43&QLujD;q?8gM;hbNNvl=70iO}I*5hpCxe*j%M_Yjfx4S1?8=bvxO$#Yw}r z&7tHyGAs<@)LSf7q^C}$UNR;>)8attb#k^|kMeDugsV(l#so^ejC`ZnMYi0U9ecBW z#n{UPlj7%9J#Q(0>k6F>=YywKJq&)`3fNGBD6hL*O)FmxCml*l6c)D}Co;{58m;;ve+#!MVxZ&Yvgs;+j zq`K!YaR@UHG15=2Ut9*LkwNPz>lx`6vDSywAQ$#sLqcy@M_{FZbfdt&#j;)SuFb*T zo5lN0fknpn^qp6DytVw8<_iDd+$LklrpVRWJ4Ry z-A_b*XZ0Mu5|C5L{JGNlwoq`_-TYl)5#7+Y()x~mCYYq}@Jj24{FqRqJ^LR<60EQ) zHPDavTeHIYIzP50xli4jCQ{~*Imo%K{px&4{juS{9wh0&5@ID-zvHQ()q0d4?r)%M z6AD#$GJAL6bN6wU+_p8{+hYB+MV$pYS!yC0H)J26Gh}g?Bj^XMfgs?TmA3sL@jVH58Noys*jVzK+(>P6&Zc7%YiRKk^ zKaG#Gtw|6?+XjuT1JDO?mt3o^c8ANEXk@P^X9?mK-3~)Bn|~txIy$R0`Yzv z@vVzM^Ol`IG6WI;X# zBy2zqXpr45$XOZ$TOgg^cO3lW=d?t9pfK3@eWnYvEJXW%zKnLy9&sD9hAbC@E0TO@ zv&Mo~{$;s%O2O}HW0P!ahVCji7|%z?F{)+#1lof5GoIGt&XX5VO1h&do9A3BGcwrt zCGcCBAzXT|A40*#!TKQ(Y)m6ct;~{Ooxv8#yrw0O-M)Abwv?_K9pl{~#Y_=TTRoo#6Mum7XtpMmhBZ?U@}?Z2 z^=I;Q721gU0Qyo_L77ZYzve=NE3bfCgx;vy^c-ztl|Zj9Dt=64-h-osB~$F#i((bk z=FzmG(>9C;Om_8>mOP~K>N+Hy+N3-6 zjN!mMA~0u)O|rX^eGRE@cjb~{R(D0PG0K}-&Ehh(6ez3v>%qqBgvRa}ag`dt6LY4z zNw8cmSZ*dhODZam)G3qlX#nB=O1=d*>G=%=Rw+fxKlL%#U2aWXO{%?GPlyL&ZyF#Gz^v8S z8i@UeIs;&I1g4@(?Yo2@xB%M{&U7)vzglBB<8yb={2tcw1~XACQ_{MpYh{xC8DTDN zY9>9s)v+QB!1SXi4cwJ%iQW=XC$Xn~#kKM-Itp=+%pQ9xCOtJ3T3C4O0i~XwwQS~q zog#dO-5~Wt{vvDPXY4PCPdUCK2J`&6Vgta{W)z?ID_DBTt@d5Qw)iLhz`jcc=CpS1 z5uRv>T{%0jqPQ@EcR<8QGijU}x2i4hE>$s;)wCA7{g&g1xzl)})N)1RiC^RAqG_+z z|J_A3H?X3lAR^lu)#AHg|9|%0JwB@HYWzOAAW@?eEh<%7rwA1bLIku()FvSlh;kWn z#cRxEAi><23j|9rVG>|Cjz*NKt!;g%ed^QNYE>+XTA(&T>tiue3oTemsXZ}NDf$Rn zW!~@F`<$5p!S?xm-rxKFlfasD);{~X_S$Q&z4lGg8rVj?GtOaSq}OWGiyU<3Z1u&K zzfL#w=~{&E0h#FEG@16{bnb^=r&AVAJdOOBsu`M3N&Kk4Pwf~@>+HIdjGOn01d67g zr%QfQ&YR0F(3wl?jb>&!dB1jbN>R?6ZU30mm-G8J+e0)nTbGSgSErwrpY!`=|LFEc z)4z^kSWC;NME=?b6roupmFtJP5_OJr9tJuInxkat@?knRQ*=(E>DfK$Loub3_W8Ec z3DS;ilDK)ZD*vlJ@6n^_rnb=VI-L|3*&1s+@2ysT)C39qL`f=Q+s%WTsq`{6 z*os(f^D5(mIIq4=%JQX;zRtQ2 zWL0$7HMEmq!hh0eXgiXb{G8X9{XLp~O|jRZvsej}3#p^+iY@<+j#@Tw9#hY+-7Vu3 z)u zh0=3hUVaf|qWeGZ1EEl6OtINQM?6M#BwA)9%cYA{9Ja2!Ty3yF&3c374AJm5q=TH^ z`Nb2)n3Ei%mUT*`I+=UrE|g8DXFW6FxxY{KUkSPsRHU`~ z&+xYSluDU1NM((jxoNlLgPgAwOyz@7Al0q&867r7?&RLW{*h>U#_LDMZojfD%N4x^ z&+HH8*GS_Kwk=~l+ll|KTpS)e{E_SNEjhie&Syp79*KmdyqJh$n1~`_NsjaFh?ljO zHrH?Cq*T{42RT?m<&8!inROs|O8A{r+2_q%24_h)xwh{Ew@5Kp=;g7<+KjKr+W|DZ zJ6bu|qN{KDFcvmQn_QS-{aDXi&5@P52Xj`K-LNr(2QUsTf&# zK!kf;oh#I5t84Re=C>`0(`}U}#c8G30aZIbGPaE=pXKA`gfR%y=czo*u}13vIEMZ% z)hb{9&ANm&(#QK!-^?I_XHlzPc9Plf`b!>0{cTl#};V3(p zmQv#eZg=N24MAwNT#s=0^`bQ8yL{{xu1n%f6y46OZBIF}Ptz%lE6c)FW$z+dUg^fqWXb|Dps#YOld~{o3`@XtLQII zy-IHAH)&V;O^T=Aga`H8WZTU;%1Vahq`9Bm7EjjuPg1C(lQ!Gwed16>=Wgs4$(G7c zf1xOrA`d5RW-kEuBEmvgKVW4u8-7UZfpCm&x3}ID-gji|)?a3jiLpm=UNc``_C;o6 zqnR1->Y9|*=`Mm?Yi5fQbx z)`Q8D6U(nx%k)n0v`B}HI7KIpcGN9K{eD-=|BeGA5M;_X%SrCXH*AV|i9}MYuw2jB-AQm5JXR4?d9hCYxjiCc9f>S2V7#Q`FxB^n%4dHw zxl_H-FYHJxbuSf&?$HLPNzlnBO98pKzS}R~cQilAehTlz%Y6Qx`<*g>*@srbOlHl-&r5c5kXWG^Gyb zMxsxUC2Q={b}?89GRL-X$K(t-B~A)}@%L0xMg44R4a9YF&3>E7j53^)K;7 z)Y-_^?+`iM!^9c~4iZ}Tyd>18nZ=a)V;8@;MWS*fvh^sQrBvLowi!Iw1Wh?;K#m=r zM1+s=wCAE@8w9a>?EssDlctAbV>BlVPcK(j#chySv{(H}INB=KxgU5s&StmjXw0bi zXOjOcsTmd6^5{3L8|6Ux(gK!{>S8Q#3+^%vq;Pa_pt}4i1lX{gq_|a9T2LI=((}Mr#|0~^%qeI5$ zB+5Hwe5G2+@*1=E!Dkg?eq?I?rPfC0XukZC`LyC-dh z%8KvJbA;3(W?9X!1j-3ZdkBuseNK`wUqL%NKH5_yP7!3 zzG}oyQmaUc1`SQn39KhEt?BkWN43y{*53cLUAV*hV&;mDGG5E5u!``AI@VJ#MI8an zT3zhCEOS=p?Guz9N?MQAWl;}^rhT}TTlXeK_6OmsP=?nU{}{4*6Le-@Wx^=^-U_7p z%b{_-;Rk4p^4Al7THYAvaWmRCdcv3UaQB3-;9=XfyIx*C#k^PiGri6)=8YaE7r-Ql zjeP^BR5w3qMt($jW{0QfBN7fJ@e)>f>fk-xpQD3nf8Y{0MFOW91Ey6<;Y?LQ5mj0J zA($(P?y}d@q4R~5r`+O_7TwDAXrQ%CNhHZD`;GpJ-lm8jx+R{QNoM#Vm9OBry`Bsq zgEPJqfk#@$xym)3jEcLvWn?U+_F5mZ0-IZH6Bv6y;GN!)I&dk5%^iiztIV*w%#~=+$M8&qYn@V9eOAg3-f@JzW0SPLV__$Kn<` zpAoQVJuEfT7KcLetH+RvkCZm8?P|YEqHVlA_Au#c-Ybcq6JWvfa4zrxNv~H?PTpLd zGN)?(wu~L8)i|rqBir=ijEym3lywpv~U>C#Q|{N1sER@;HO8Wub1|Ms__! zX4v-SNid<;vLK4Cz|`*9T^}ybvA^nC=V&keHS`yFkyp>H#PJnM zD;)SEj9p$~VaX7Kk8Wnp?=ZYue`IKpBo~}~WwD|Z(Pj3I?Qz7{t!;8{+QD40B@q%! zX56ZD4YjQ;pPKh`KJMupemSEfqwQR=t6nHMo4&g9%M!3K=i_Audi1*^%H$l*MBRM2 z%&D6b(_y+Q4Jv2o#B|UV^%cigQ0S0U5tgh4w-3Ei>0$9U`^FXSjm8DUJ%)6?93}o^p&mGEsa3InlHcQnXA5*R`iyvjrWWIQU zZI0iHwy@Pa)W+#)+(>yKV+Q&rLl@!Va>pooMN*Cx?<8pT$~TkZyr7s%Tr^kPlJpZ< z>aA?#c8SS0dHU>L_7%j#eD^5Yw>>>AJo;IGH)wyE|H|J)?eBv}j*So1f!T}Xv+_>W z9{-r|sMC$Fud!~|%UGYKZ&X=3?)x_T`-4f}Mdc*qo2eQ~fROqDTfZZG`#4zVvqTx`k zXyIh`7eDMo^lO$sC;F?71KWns-Uu)INWVaS>cpaItzaz|7rM$s)H?Nxux6o@95Wf~ z%~wVQmQ6`8PD8_&m`Xo}KbS`v&xP6a1zzhY#8VPWu5?>P9uWxn#nyDXYYr_V5FaBQ z%Dyam*<@@+Uh8G2#2isY5Hr3V-@|7%hwI~3RGuO$N=2y1Dp`rGx1C9H^|$bJ%MaOK zmu;vhPHvr=d5?VWe*H*(*XBDu(qSUq;zkq;)2weuP3eg9M_GSP&ZR6(jC9PyE2o9= zs{<3PxBW3t`RmP<8AGGD{U*nu{nq$fZTzh+{?^KyqGme-fBWq|`^{^uB{M4buCD(f zTDuaSYrsPn72uY%g45`&E6S}xt^d$^C)y?LkjS}y$JKc+{@B5O{o!~v9^p;?dfVAoY`<-czdav++ZKP@Yrl2$?&s~3XEXVow3!Wi zik`hIJ^+`(Ix^kdf_5@Qa*2BREi@MGkrJEg7G1q-0ZD$XFohWw5`{Orz1FwkcYO5^ zz-!j0Fg3f}e+-|qlK~bWK$+sA$LVknZ5ny=}Tzi&&k(^Fi&fM&Yq%gc+^3ahw->M%dB%gMP1-_t&&%eQmdtzoRWP?;)iRdoqR`!HaYj z?6W<>Hzm8qptI?F%2>272itLYQWm9k2=+!uHZbqSg~xt*y#JFrp_sLg0zuga&AT1| zb^UPb8+*flb_dhV?Zl!kn~luPl%+ENrKy?g>f{6_(GkrjT6jS=E@lZB`$Y~|Gm&(?2@t zL(Ghv$=NbI(mH}Y17mySAo$-$^0Fdxhe21Bg`m#DMa6a&-f)!hR`$eXgr8GQSYOx~ z4Oe{x&x#hkP+k~1#(u7N=zF?SMVJH|@la0Gu_x50u#PV`SSHmQZjylI)=!;O&`Z5; zbH*q+kh^TJ@)FQq*2KMBV0uS!wXT`#_Gc{_!UV(OQ!nxC{bJdEDFZtLJ$pINkU0#F zG>qhpk&SK4Ow1i8C)$_oC(1~ko1;qAxep#9O>`$*Nxd*-h?I~ly`welei<*CTjwrJ z9U|1{!|T%Za*{JGc(pk72c(7GNH=1iL!o)7<3MS;T4g27L67qv0Xq0}>n}Q5bz_*T z^Be>}(n{J``mbeiDgD>C6l04ON-RE+?B!pGu9LGfxCw>x&biTfcv0vG#n2WZbcXI@ zqWqHdCF+hZF0JWVj@eh{AvX8s3Hx#~>oD~o--3`stX1cm%D7~1>+Y6aVy@0Ld=B@J zj@aOJI@TKUB}}+h*jnZ_PH% z!N;2WB8xI2OEcAx*lTrPO0zgZ-lCh9QvDSRV-a-(NOaROK@;pW+37@K_0In!0Fn0Q zxp|>_EYuBuHq0^nSK+>x=o94Px@`j%^SMN3I(!M@& z0w3eceb(Gju?=!u$-)>t)TrJWP4e@TXl;0auPKi-EjRFA&-IIS*L$T z@zZO<(;T;ZMB5~}s6Fz6vhXSsB~mG6sJTu#6b?J9B3=7>FruBbAN8IxJ?pHBVf`12 zVjHj0U)+b;XI*?O#C;O+4&i-7k-o=}st!LZ9muKXeF9jvMS6cv(+69-@_+$;=?*#qW3LSkvvMu{o4oXclbPNw@MBZ(TdFGS4JC-LDX$$wlXPICB^AZkPxnp&bL;p(k?Q zqKziT2b4QrRto9J`1hJcXAMpfp0SJhYt3%CL1y8RUfIPhK6&G(@VO8#&+r&Mixs&daDmGcVVi zTM*tdBPVn)GCem^QQ-fXoJ}GY#I0)WuG1IRk#F4>(*B*S_ch6A^i>w<>1#TR*%)lS zsdaC-K-T&@#g)@EJNGleAe_gZ!h_nE>3K=-somWoZ#L6- za%K;Y5+lU-TD9}Z;`FqjF^tNI$I_AS((vcA5zcJg6*7+^1M0gd1~HFNnCp3 zTJ6E#q&`mA+|9Kg9JrG4$HGxuyTY{}o0c(R(f5kH45i-M%6%atM(w%z39FL=5Ep52 z%r6WSNg<8oNdF4WRit~l#brCuNi;9-p7n&pvxQi!yrd|E?;@NkoHsl^xZ< zpMEcq4fu6bgbqBx1}PR(m!LnY#aDl>7Q$ZZJjpeuDxpc7 z#-yxl2tF<6+VsF^cHVOIolc8{BB$siZq39jN4f+T%7iikE_C*;a62jOxll3m>)hTGCCMgB3@tVx{r9J>1|e@TIYp-DeW&7ym`{g zyTYAhWmkALzaoD-&HFq=)wxQ1$jI|@8F?nD;);QHzQWZ;aL=9*+ql6Xb@?`K6xx|A zX?Jbr%qO&H6%7hzi_XEoUDhf0La3~P9k$KMOW!twhRr}qh>21;vtD-~dvp-lkkopL zEGskLlx|4f1Q_ps6pinCn!Gx}&mcG!pAuGBz0{K;g}FVVMs%)DY>>Kl ze+nO585Shr$jXhl$^`tg;uw2IC2@oLB17owE2H6GCVk0OUpCue{yXW*SJju7>@d5N zzGSK|+w3rZP5N@^+meIrc9{2)zU)+AUbVw~lJw<8^<{@0X6Qc?xqd`_*=dJ4C+W)? zzL+mcNrfaNxtrIZ&%8^D2ob&JwLv zD;eVti+Vng?L0QSd})EOi||40TT&9NXOUEjBYYE@XmSVRkrcI)IygFfuF#@8dNbrHiPWo6#3a6HS= z|K-+n)eDQV{H;gule|~n%tt%T+OqdFI;i|?dFExB#KbEXl5u9TN5xN?k9>yP`)#U6s^-2)Z6$-*JJwsfKY=Tb8xVNx*zY zv2yZRmwLz&Eu4o%u#>L1XZjr+y~0k}PN8$*l*p>p^0LyPIwPy@`O4y4cY zn@y*V1CL!KZJvWm#2o0b@LehvxrL~!cDFt;!qu6nl;KRJ4F5v;_C_hdk@&5Som@61 zlIzN>NY_mS3!ctVeKL}GK-`s+$h9ox8oZUhOU2&Z-9FU_PM3j#JE~l`k2^l@I>Nav z=jN2B2hK(Did@w#2R5E!u9Ix3xph_0`|nicGS40OLxQt}vBD3CXslaKA)_zU5vIa2 z@he^8WAdfK+KtFm?H|tOyS`6?wQ7Q>a23{420SuHnC#|LZb(F3hR`J!boA`5YCrL1OV*kE~JU>@Ot? z)^rf`yguETd9CS$(iLRi=0`^Quhm~!Wqc$od6gKQ%l@Wk%D(B$g)VEEDTaa(GFPKm zD55S&>wm+xXDc~*ANC&l6|SVuh<2_1BN>3%MN9hXtw`ZW*D{p zSq0wlg2b|ym|d%);HJt-KSvd_x2qLD z1T>a0k0J!QGAd#1WnJ=WeP@M=K=GT3aSgfZe^>gHsD$R89ex>Q*R{d*I_GxU4?9e& zH`Vuaj*%i8Vnu&J3g|3+{RfdBeiPBDl48%FD!$h|V%@SDMxm=X3kKoP)WBte&{!rlG+YQ)N`%BNi=dXSr$sPC{cC>e<|+kq}+VEa^3Mof4D;x z-CDg0Z-z70vcrZYtfHBORb(4r+L)-N4y?(9)ttuX{tC!tfb(mQ&Tq`Vu+P zJ&)$Qg=yXjef&(9oT9_R*_#M%ohupAoTu=`3fJO>@2=G|;GNhrFOf{0k%4gQvT#Oh z)k^4%$Yn|?Ja&q3r1~h>U+^DYSBIa-x_SJHKJ|j+H}>=k5`nz}QIedlZax#f@P2N{7mm%s985qqA>zs_aW&BYK~zbw!CLIy`#R zHZ96*@?4LjRnVn)s74rJ3h&`5siAjt_0Pdg`bRy-pOvIFF1}H#cB@bh?8N{MKZsq; zVT3t&TX=dj{G4gH_9uGLQN4crMr$xitjt#s`bqYGY=&Drsg}~F21B;tpa-wfju*WIIDvMfk zj%!kjZs4RmANlE7DaU%Nv4)IU47L74)5D>J2frN$gf`Le8J0+%as{_HuQd=2yFXr|7 zc?%f=WjdV73EYPZLyxF^JdUw>u6-LCZF~evUftzuZcNO`M3;TxYp8Rz%nOY^nXxDCO=h5&V z>^ds9`kk6^Z1kB6IRoeK$#qEk*3v=do2(;BE<5$9m?5@7zQn#IgKE|EL&+>LBpN=H z9G&)UJ#kDtiZ4zWkKzuRk!-Wk7s{blNHJpHlHvV42ay4{NY|-+iH2K$NXePhQ>S`G z)hS|Z8hc@{lwdJhgO*TTXW+U08xvfevakdHG>DDTTkAc273CcVvZOi~_H}(gP)KN8 zsovTyi>^C@OJvW5di33$ner!I3fLgFqcUqKxYR%l;(F;Sqhem06H|EA_;r zC zX{8TlbagJGSOcr$`u0Y~?ha#JT!EaRZZbbPMo!eR$W!_e9+ENZRMqXN6Umx%4=8Hq zO?-B({;7~$)*jR`pN0GvS4;XUP2JUEO2IG~ZcR@!Uw8mNuDidjf~b{7-(>le^2lJc zi+KaMvz7?FQS%7w!bGh2ibQ8hq|@~FA6h4V^YP2E_)&?mw`(5XC8w_FkNAyt9lkM7;mF z3+v28N1) z3{G;oLEoLro>=MZI7R7tYQ#LG&V6SS)bEL=w_QA4 z&F@rQibCgk$<=uQgoSPu)^eEMIgNKS`~j&74o&L0$wnTM;FxR_tHUe@)B zGmYon9>TizbRp~a%(+W5n`)nWh@Qvw)?iI z>eRhfXZ$ONa`2TL$|-Uyg*;wse*7z_^K}Pb*`DsTX7H70WvhDcN+FH>$;z5v>K?xT zBHD@O{|al9cH)u-{xQT!Rf;W6cIstr49&gH9e4_WOW zUlja7`^O_)o!NwjdvpW~N6LOYN##B0s8V6>5@JWaDfWT{Qw$J2VuQ#{QIWYi#li!< zPnMQWJ)+bAI|u2(;c@?JZG-EXREaD-^p5t;b<~A=A6z2W!Smx`5~Yoohoa0ot4h5%#JlVlN?K?bf$JD#O;n zM%+#$ie;oNwyUsc`r7tyq0(fxR6J*#7@uwq2zrT=@< z`$^9tJZ3$#OyU4Z4+?ev*p}a~v z)`9)o6=fs=t9X%`c#UVk&vG%8+)A=Ty!M?%YLlUP$lK8)wScY4EkTDm(%ZGVle}R_ z*@iRiRfr%$`pe`!dha@zC$erhZkk2S4HDY?m~LZ4SjCj4KG^Orh)-B|zjLPFgNpei z3?YW<5JMr_!l^M8lXYQS^3$8`?9U+U+~Kjh>q1FpgOsveU1M$p_a^RZJgN_s(ovLK zzggnc%UK;g!bWzG(0|JzPH2`>hz7{ z#BEQvSm4YfvI=1nO(3#L_yL1PWYuI|BCAA`-~dYXJ52qKP`{b#H=SSCi>efn`^8EY zxqpiK)h6{Z>V3HSb*tYj^_#(O@2UcR<*#>@*hu7$iBD;scFz_K{|8y6CGxexYFjML zVw@Cp_g<%v5dl@4$cV53Wh~k>V`!ovVvZS63Nf77t!nc{z9DEK0Ly8 z@pAQaW`tYhS=^TAmL(tMlOu)MX5JKY?p0jzAQx*aa;No}OGhzpH7hf+XiQ}3IOYl> zdE7#OmASH=*v)TAyNKlFM&=eMxueVq2_3a9p52ScZiRIPIfazD!BTV8Jc!IKS1j<# zf==zrOVWbp>b(ZRz2)=fZ`4xx5K%DI!7 z)s)pQEXQPV4n&`u-kX<8TC9*PkcX>tId!E5$9vGxqFpm-;HZ4u>xjVoned!g`6B8F zeUsZZw5F>Ti3vAaF8n`8zmm+p-w|3IbS7=sV1XZ2Xu?{iiburP*$R^{V4ZCB@;RFWIpA(G&Nd!%6(dv|Sl>mPR9eXiAF zanf;X6EsZALVFcRgvbT=h)gK<>V(x|E6G&f&O@%%GSDRxDq|||W6T-jbOFb9i)6ZB zwFnv=)ZFscq0_g%wPn}VpnK2G_ssS7=FPw#j4@Ll>}BCse90ZvALNFzcD>?Y zpX3G`HKt-9_|8oSAa0OjEwgsN%o4G@8GEjuK_dJ9w0F-R^d;B9Y(Bnaf5Ij#gzV@Q z>VNXASm|iq@Bh$THv{MX`_(v6*2)aLxo6kFGwSW&&hTCm>7R&?J%8-Kl85cG3pQn? zoBF)#<$k7;oG(|)7gh27=?T~05Iqu^2)O%XM*7(9cGAB<^|SroS5ndLcdF~9$;)LE zT9%{aO17<65CxhQbUW?oPzuDJduB?7-6K7dbW}82H{GZ9Njr*kNCS=Bqxzc;)lJ=_ zdYukoiO4;w@9B^ljoc$O8tG6S*FCBq>JVm#+@pG<4&lFu;=hPu;D}=2-i`v?<*&Cx zT9N!Ak4U*cEUJ%mwe!e7bCSWA?UvmdGP@dZQ+<=}m~J$cue7c@+$Z(1G7)hW`?=)Z z+DuREH0j~G;=I{Ca>|GIdLEIl zfv-kGk3wKIrmuxkTzdZqOXsX+Cx5Qh4aCF0mE(e$kmPq$j% zSYFo-8KR!YP=LC_R=YRixznnXw92}BR;Y$WA;WDC(}x_!r*q}(L4<)Bx>K%v{Wi{~ z=V9h!o9zV_;s4<){n(w>mn9}oH{%{Wi7z4}%U?A^-K>_4sFfDIE7QrL)OYVn=?Uab zO(k|$sLY9Zwgp2;x3#@N=PUmX6uGQ{=bYqZ89T{!TaSx}P$G3HUdl3z+s=pmBw?4pCa^^i+AepzW$lKCD)^Cg&YE^HA0ze zw*m_(o6+CPyQ61K5pEX3GS$8bxn^&Ove)rjKW9Y7k+Uoor>#ZH4n#xN5Me12j+E_) zgm!W$Rd+1(s#?P@cL-Q_J7YLjhvU)oSRGTOazeY*nhv?Z>42FFkL(@j4Ieotw3Q3! zy85Ewxs)t)21`?UlDe#kfg9BV^}A`?Or#!Q|9jfuoTKLNBca^^_Kum;Yr{v}uFene z%i=eV_f;?H9PcZk?bW}o@VkO-QOr98=1toYoxB2VSC}`|9Lfbm=JY9Ow&wI1a#i2- zd1ggvq_Du8J|6DWB(Em=&F#!3iHhuXUTy zS>0>YwYg_ySbX#riumP`D;SqGFCWLnb7$g=*5)|(7TzSB+gm6`Vji{nAz~a%`a2$? zCDF7FQ2x-~6s{EF+R&@Aa@uygR>*e4ex#9>$mfU_XRlE1r!^_pSZFVI>S!)1w)#~6 z=nF zy;!zzvZ1Rq#hvEKob)m~!en2VXSeG`BkKJwS6|4PyfcoHM|~!*Iuaif&G*Ti8QN{W z!hrTHS&_^d{IdO#ym^tiHwm8~AZ3zShSEAh*XHq~}Ocu$T5t%!4 zV9RqE+VA5@ejiKnE2{_xzN606C&phS`5G<0WYxa;%IVu&U8*lsIm11Yf?lpx?l^_m zoD}lhk$p%$MWwjf6*6*9X*ClIOa}+y-_2vbwN< ztp5?uYQ@KMVq(Q%UvlVYjtzZlWNvN$dfc4Q2NIq`7psC_C4)Ova*R<(M5z-gxf;;* z&zG>L>V)1;3VY(B_c|r|B*|-X(Pc>3f40PFS8ckmiRKAcXFKUQiJhAGU}to)nU}3I z`Z{7RDWlnprutvN&8efalfs@Xqb^;hFD1OXx|T}3iF)!z=9c#RaO-xcH!k7Z&Qzuh znHBY}IyO@ojOqHvNTzJ+O-c%TvP@;_OkI`m>gw8$ewdUg*)q|;9XF@FGUpRlyxy3~ zI>(LkkVjr?ukJ;1gR|)f7RK1AZGBe>1({<%s5C^*En*W@h1I3KvbY{S$Y?!_Yvx*G zi-U|ct+!G2l2^rZM%~a_sw`_j?r$RxA}t7nq|0TvDvt~iW4*bV`jMp{vP>1ne|PO} zZ?3G?BC^T)F+~TzNSAFzPVcX=4#=a zD=K#E<^G?-lyMoD2~Fi}7&#B}fFlJLUkP!UH}hD%$AoomRfB zqS`nw{gY=$P!QQVW~oC<56I!B()+SAMti+9IsFDv(8{vX-b||7!;DAhXmbulJoiP) zx?N#8-IF@_&~qP(+vMPo@W-D9zW_#esixvS{?yeO!B5ol0D2qiyzC7zcan|5bo3Ni z-O8PdtgQ4rz;4D~&vwyzBc3O?T77Kc@EPov3U58dEOd|Mn$V9?Y#&k`o#$zJh`e95 zQKApuDFxS}o?C@v#z>4;p*zu8>F8s{YR}Z>(3#<$DLJ8T*9w{HNhr7k5w;)r4KK2^ zePAmuBH9L?t7;O@7W=O zrvEnmF2kb!O5ULxpX6X%wfkJPrSO4UlgMt9`jJT4!-2quo<~xl6EtSi+UZ~^!3udT zre>pUk1E1K)l;CIy&+DN1eQN|9*ue)MQLQvB03XF*h~7c83b&vn@2K{P7C)8%LzT~ zkH%LkIPH8K-q^mzy+r%a(DtLUh4;GIn2ED&W}B*%xg8F(zI+9zd!eDJ^AM;j`d8VE zi6Xa~`#sTO(DOtNu;g9zIMIWGb33LCmFH+?$~FfXgA~T+hec(;Ub+A?q*53xblcYS zAzVl7*^A%TDB?l3#>*(>2^g8k)qV&3oDupjb#QHPeUcwJpFVlKH-g~``KL@y{!f+s zw^l*Y-6 zy_CDHY;mPr1p-yDWGUvBr(s)PA2LjOqiV_OzGVbsTJ1x)E7tvc*+h zUw!OeB)+Jd8V_2g+@)7Qb(K3ZQSpTGq*9HrjK8e!*aJ23uaFd*E(c-bCc;SwEH5PL-Bh3`AGsKm3A3 z#8r6Ng2+6die`h%nJi4zQL9LusE&{1h{zBp5*hnMRr*XsNj_zXj0&+^7g3V!k@`@D znJn<^TDCszMn-Y9zQL-K;G);)i6lg`nv(5TJg;Sr~+3!^L zYL0BE-!2jOFBSrYwpCbn<44(+!fmh0%_`AhdQqmm@0&D~&byrr&lT4CQWaqi=gq}9 zJ=(K9$FtMFd*CV7Epf$RH2e!;JXE_ijx{l~lL({_xPP-lwV>N^dLAd!^Qz*w;N#MA zv(;4;@GvI29TnDj2y9FR90frH(uLubF_*f0w1P_3?U;6eaTUp>Y_daSQH<9i-4sly z3s13bM|p%|tKFt@RLo1m^^(NyU2X5~+QPk0?>?QmGjasK^U*zbH6Hj=+umJ` z?^5;NNgtNmQy?soZT-fcn-A{s9DM7YJ^eb)^LODf;hkN$2QN^Y$p*fCth+3s8hCqW z$0sB*@T{HRY^KZf(lMlUbk;#G|McvIF!9cJ79HxV5$=J+G}N{uRF~7c_$t||b~yB^ zI`I%yBzOT6(I_K!e=YW)vc2@dk*vs!bktq5?1S)2*>-u&(5u`MamGgKk*(~+qD)ac zxM@;iB%ZPzybS!nEZcEq+3v-|BB8ygJ$l$jCl)FDVBj&=3vA{;82<3W&@94TS+-+I zhB@oiD`)NWpG`0#8S8oV0ZeYrb|kgtD^Z4d2eg zK3e+@^T?8X9>FOPMW)r>6?rvFWwG~yS0cQ~eK(zpJx&1&ad^bbzp}nr#me`s z6mKg%P$~$|6Z}bieBNKPf5C*hr7b>xea(bG{emk0gcAAnwAT1qg7wW!pBGlXoh1D1 z=3r4{OM|b`*A(>Ceokzk4c`)6)G%RIRm1#df1|H=$0(XzQkpk=8ug?8P7>Vf^EcK90uZpk*HoWOfg(eZxx!!70@XF* zuB!^Tt9`yEcTGccz*lQ5tXf<(Ar!1{n2_i9S1p}c9|#&_E-5#zs&A?fUSo`zsXR1P zH7%Ghr+T5UCYW={4MtUMtx;fvsJ2F*ajg+-4puc7^C3jQ2!yI@>-{{JHa65Z-4-xv z>io67#Q~$b;WqUQG}qkb3kHnZ`oL{vfvN>QqoyS^E##NStg2QOO-cRjK5>#LRUeZE`DmOf>q8_`~`wlHMfa_dJ&hJX1|I}o`N^}8k_w~#fyGZvHP2Ae1U*3AkHlg zB43(Yd`(iv>PsAvFN^E_!BADhtaxW1dcF;t~UmApe6an<>qL44-gKB=sN2#zH$<-S3{XQRMS>P*bQja;IpwzWL zsJy_=_3$EoRHZ34D^^Jf!&L}*HSdX|PAC2$fg%e?T0WE?+p20=sa1NF7?5~!>4 zQ&W)4Usx4tfUz5^7RKKto3^t*)YMepw7>{7_9E+6s-;FL-v8ujFy|(!48>{?F3z}%iK6s|qMi%@0 zB58~&e@z_)t*NVTlDY`i)XnrQ_B9xbeNDB^e)~~wd)AIBUi~@^_EM<7s*z?Oji^j& zR=*ZX{Yp(cw3f6x8k80FaFj7zpgib>m0~I zwTfdQMWGJuaKU)Epc5__4;M^?3${*cZfK|%lF|fQr&am=_0phPd{DzD&Cw_Aae==X zc|mhktk*#0DpsE+Y>${|X~9o0xD>fn-wcDxi;`y4M9q@g6Lg%?G)k5Rpcp*v*Ol*E ztezqW)C;Y;)Ol}K{6;IEA26m)u=}IqAD``?X3q~KrS#eF(^^7BBA6QChX$ju?sh|o z29fx>Pnm|qhA`5-l-S*d2=M^ipz#xwjYvhnRl}Kf@1{C0-IkKNyBSr1x>;2%iBg=P zt4nH&PUrVoC!+-c^x4AA_63XKC!evvZfAbq{2BxXoK4H2T`sAott>%Q29cNZn}mNp z_wR&BOlxjxqEnVO+0a~5)!=RR2lZQ?EgYo72>O(}esw+sXscSz`F%A$8j?nCEMj+E zONnq6q_1fyYN{61rd0Lu;E3BKhpL8#V?2N#>*2GxuBdBPGRIIo$m}_lv-3)e$~~3S zJ*D2fl9H3s0BKxR-QcTrFR2gKxkvr`0qq!*>(`d7NtJ24pxhwNmCjS&Ji#-k@N*Qx z<8pd}_%Hcv0>YbUtMJ8q6qg1A2|_bnQsr+#KG7Cxebu1_Cse!2g<~d7bT>COES027 zil!TR`NgG1-pt}zMt)g|F>TK5Qe)bTnFYo)z%#4VDD--a8D(Bn$x@?e=1ik#4$nEp zb@J|=BR@s>@D|T0C>{Y2GqpUSY`%#_nC8#>V{N(^w%e0{9`&W5556 zXT~43d(?i49|wMh+mziJzneHMt5V)HOHyCe${E7Bo(f&Tz4> zvN}}XP&=V6R2yh+ny{qVe_NoXs>WxJJ_3Gw98xLj@A#VJxK8vw21#GP0IA}xZwg*g z9h#3;dY7q~YUc+zPQR#1P=^Vz44qW1%PoIb^bmE&2R*7^+`d8BT1nuurlVdnOtYK`+ z7n;oTA!z1#=FB#{C_nX~Mt4zBQPR8fI;QxNIMY2X1z2+-wfFf_Q zqiAFaN0p8f7oA*421tc@G!?^BTs)`PsK_gxP1`J-V-$Gu%ce_XW4NbM937CUtmMD! z$rC0{nJ_W?vTS$uGsYtCRbna_4${7-MDQ072_w5zii@Uqjky^mj;>}s{HkV zMA4HR#|N5q881z8RLLkZTpEvQoV#S&EVrLQfT$;KJEd`MX;VS>2{PkmWEm%RQsk1N z{An^H8Y*WNm6TSN%$atbr!+3^+bgp_`ZV^=k^enRC0qe8`y}D#;T~#Y@U*1KXlkZ` zsg4pcFa4q+Driluzq!!}EI}I(4W|mISu8*G{M5DZQy*x)@`@|6jmAK2GrBZmV+NXy z)qGjpDnH0_<91%mqo2l>0T0?wd3WG9yzfiG#r@RSr?Kmga})QmxI5vRlitPcLGU@( z88^-kRLVF)2?*8xRSQ<6KH<-e3Xw4mCnN7oung4NVvAEZIfM~=#;U^Bl) zH5Q*rrQ}yJ?q{G}c^Q(^aFENBk;@dOlBujhN-N7wpwidstFd1fE2EV1p)5eRNzNtZ z`X+a%1uGybj&iG1Zk5{2t@LX}J96~7e`oyP@P_MRX>FB^Xw=sHR?bOlP6KlmyXvO5?z-b ztjPIvxidTksP(feOFRq)rE?JzTs zt~+nqb%ylep4sYC(d_9)QNc`)kw2$wc7ahg`?}e4DrOtqV~)l~0po!yfNOw4U^Y+= z+ycx8nt;W?a$qGO;bxW1EG?QwT5d)+GZp5RValwcl4)*Z_ME(8uiGdtn?0Mf1xIlz zn&~Mn!P6YZI&;*o+n70LjyIp&y0w1gHu8(-l{5GxMgG-0Zg1li40L z6Hjq@(KJs%4CL8x`p4jAcXQIW)*Zz%*@!otNd84 ze15lWP_0J)xXnStsx21Y>gI;}8q_E3z}i3_ug63ZGIuV2srn%knevybehtHIKV`CA z{!ZfE@GoiA9*+C%CcbUBNi!J($O0D8K_wnZ@?XvGP-G=drn+mYnpFFd26`(RwpL6Y zntC)g6gUr92HXjV+fRT^fNv2dOJhM0d%4ko5yNNrmY|f$c)UhbiYE$=#?}Gyd=>bU z4KqDQV`Bh$E&}efArPuLXFjEL--YQmr+8(&imKk zp3itx&6MVPT*?dugUvO~4O&_S(7hLhV55NhV&9^R-HbQfc+E{8^t{Jw;j0RcM=1B~3)BL_#MQtWY6k-(C8hL)Ku(Rypkf&*}p^Q_uq5T-5 zFlG_~?1v&X#w?lTLNqUudWd5ekH0wae)Yx21{ck+)*)xSx}-%K<&2Q3Fegcs2Ye0l zq4s~7!#U}}km_yng-ImQkr{L}nhTVJcVx>1b!?y9DxZn02M zt-cfKw8;_a@G2ZFsgW6mdJJ8O;F^3BTJ&Vpgpiv1n;^Y7GgbVl2}yL2>WQjE$*2~I zDqk|}PEIxPj^bvAF0Gv7EuA%emg=ddy8SgMDsD_J@(}y>)uS(Jb*pI+d2?b&gy*d> zuwabLEMDRSZ>(yyW6%$k$CCx2rat?Z@Z8jlZh;|6je5vaH8WrI`oSs&*Yn}R&xRG3 zMEKH5Wj>I8c&c5laqiNYMN*n^?y}iM^HjMK0eF)F`F$-7ODPfAOMJt6%{L`%m^M)# zm5Hg!Z|f5XD)lFnw+Vbq0nnIyRgG>2g;JwV5t4kjgaUP>siIDDwq11O{3d;xRg^!` zt>;JGRShyPwp8TbNh;osp{dzdgJ~HliG_VZL!}H>>la9>?r%sxcG}mz_BE}6O%-*j zz7gvcb7?XczNEeulQIHg;$^3y+06Eoh-y1+&djn|v(>94adX|#*aBb~@Bj;8SMl5e zykg^b;% z2#dvk3?jL{2{~-bPB#lY{PP={mz-u?aO1>ljY|y#HgiNq)mYw+Hw&LIeg>e}`WR`C zam@cRE^TCXuDRx95or5tS&65zY+8P$x5QA>4Z43u9G+&-W&0dC=v@Ho^lqum7 z5x~v!=c`GOc&QREH{x5_m2P&=^7%<%fm@6V62{%oyr5o8k+!bFM7`=;?Q}$#8@6#k zIuqM4qP=KihMfh~N6jvqIn&Kl(FwjANts|gPlw95A%L;Nja@rFCcM2s=ej*dp1Q7O zITg9DmK~c($Wd)74@MlF2_?r)>YF zVJJ|xhcUM`%{GkN3+g9Lxk9FXG~b>0H;Hwf_9Irnf3Nw7T3(6mPw3D*|AYzL$gnf$ zvs-9=i(35PX$tz6mS`%w$7u6l;1cG*IvV>Da4jIX!0MNd#>j#3^WLMe{lMRW4}lnv zvF&K=EZ}_LB48YFIgkg;0%RKMglh*Cm)i>ng_V`XNM2Ytr`OdTvx3lBEts@U&|a8n zFD`V}5n>&$XWHNMIt64-^CPSIyH8tN_*m>wzbMtw0~J4>$y*-bx(6NMIt6 z4-^B{fFD=^tOeEsPXb$kK0yBV-AWulY87z+BY}xPK2Qu)1AbryuohSkJPB+C`hb1F zAt1Gy@PPb{;nz~sfhQpfsw#OARj0OssTT+0$2;I2c87B0)4|S@NUbA0FcO#u~mMpbyvw90F472@i|}CIb0DF;EToffc}7U_J08uodV7_5p{0)P;lxMgkLoe1Pkd zjcULTtN_*m>wzbMtw0~J4@iM;N=6!n><8U>YN{dolK;vxo#%bP5MahvwOxH7{!RfO zgD2U5EOvXAKQxd3Ps5;>XnuNzI<%MDPWk zcr!jB9trnlK>parrWRqO@qXtO^80`GCvnQ3q@ms^nB;pnAbFI6X7iW=s8qmnc_)i% zEL9C-X4qK1hK<3Jg+UkOG4g7^J`;1qLZFNP$5L3{qf_0)rG7q`)8r1}QK|fk6rk zQecn*gA^E~z#s(%DKJQZK?)2~V2}cX6d0ty|8)xdtNH!^>lqkKV2}cX6d0tyAO!{~ zFi3$x3Jg+UkOG4g7^J`;1qLZFNP$5L3{qf_0)rG7q`)8r1}QK|fk6rkQecn*gA^E~ zz#s(%DKJO@wRd062#|9DoVk4GDQ6AKU&`&pM#{2`lPh|HhF9Qd5a0~pJYWoPIWQHN0n7nD@9%*?it#+K7sv>v z7}>x)pdGjmcocXZ*beLmjsU|$DaI6_6lekN1Wxw%DBlhOQx+2^@Dh-*gnPDu9YAht ziZKJ|1|9)605q7 zcE71Dk)FgMf2V&n)o^#D8Cg6Z<~fXK?us%!dQ_@$YdFpL3ixK8yGQfAGtKxa zxVtOOxJ3LfPcz2zoX7JDo-I75@?6dHcZ7eK=QqGN@^t<_cueQTdwHr+2HXtzfQ7&! z;CA2+U=#=f25ycj&_B|D(U}As?K-G#J{UPmdjc3J%Hcj^BUx`HCHn z_?I#}67V(KUD8W-@3Y;7ZprSyx80@9CA))u?w`m@`D+Ir1{?{PTyAl9%DvC_--(;J zJNf;a?Y{ar_W|3z`#AT5w)>sOxqoE4%h^H?1I}Lx@>%}mJg0{NCtY4Y_s?lJ;z?-s zzx_*2C*AmmI_pUCAb)9gF61mJjq5zhSyLL<)RZ%&G_I*AXGdv#hoc)5F5IEd#?rW*@zZp^ z)0Cu7oK=-(xRihATt9kYg>Sac`AbtLVHw6abUYoOoQP!@ljFFYjAa;C#c{21cE<5@ z)c1$u__+#qw>$C4iCc#1|K*vcPP{UVTj|#|{zdh4e$tHdomcftJMPq}G^N!hyr4xS z5Z=<_CwFP*G~>eKzPpdZzhX?*BvI}u@WWN$<9@93mtuU8e~CZgA9n(!P5mP_?l}DG z;0`@gIAP2K?$9%Zlg3KG9eSp4TgZHHhn^|MIdYke;m|Y1IG6K_HNAw7B|l-F4u42b z{UCTP^c1-&-`De;cN;(a$@ib>SM@9TeU7)?e4k=}-_CPbLjvCqJ~IiI2Ga?C5gCy9 z&f@uKqdtF3aB)8Z&XJ7j`xW4&O`PXu<1@eyayEaCjaP!Neg}QQ#+$%D888fvgjC`0 z0Dtu`_Zryv_rW_)Nl`LG(t8nn)X)?zQrG@p0q@RCF@9&`e*s?xJ)~NN9v^@|0)J}y zz@IdgVP~cortLpVHytpMk^hKYcpQEy`2Jxj#%SCBIPlDK68J>$$w~NB@SDIzgh+mK z!KFPM1W(}vy6eCng=lx!-{*lpFgnF}$i^GNd(e&KjJg!sb1V3(UrjMK+utMLXESz^ zmM7ou1AjiLeBTFm{-ivQgYV_L@Tu_AuaEowC-Cg-6vNGT$*%?OO~T&=&tx1W<4Fns zPw+=4rx;H$4mF_zo-BJhX4 zk)p<|65mSj?YSw&*X;P$fzQZKF}`j4e;j--^6Lrk6sYt9_yJEM{@;S%Iy1%KNJ5qV zAHmaS(XMU$J#gnw=yL>I#)~4^q-yL{o}!rueF-s}kEoeya>tFfa0N%xS$?p;H55OIM zJ#&a*1RGO~3OoN7fj4k!;!VUO{E(foeZaxJ;9@I~o=?74 zf{We2!JELvhT!0B;9^g3@H@e`C#ClQxY!h={w2O2fs1{?!Jh#aTZ4oD8eHrS1-Abk z;9`St@V|hIJ;L#S2wZFvowolJ27O|u5S2yJ%K{ghg^UFSzmONPUpV2%%Lm5kV|WO^ zP6Zd+hC{z1aIteZ_&jj2c{un2aIt?l_+oIeg*bQ@xY$J;{66q8r03NC!{8Z9Q;ey0 z{x*UafL~+duYq@hKW*cG1D}F@MEZ3p&mnNJmrS$qp&5qpH2BpvelGY2;Euc-1K$44 z6ywMCcj-^YElczt(w~$j;nJThOTwjnJ_7z#JNz}oCw7)z8?OKtdrZ0Ao*KZH(TO_! z`*QH7!7bar3I0$!_9GkruK4dr)YoI+Vn4dy{=OAl>`T9}@jmb!;EufiE4bL1oc{a> z__e^KSk8=Vz{O6~ZR69y#a=YS#>?b8_@g#{ z3%J;iobL<3#g62}w@AWcPugkwUj{CArEDATlxM+89y#Ro#P#Q|rar@O2A-3>}lKW19G zdwROMnL&wXs_W5RGu2f^J?23$X_XifQ88jbMVTm9iK3#QK}8uAl$bH1AqFG4j*)oL zi*bBKZ$!Dj-`abhvujt^=y&h;-S7TU=bM^dul-nSuf6x$`<$~6aC33I?RW4|2j2<& zF!V=pu=iQs6~J$`@D<>@|HSa0>s5hsFYOJGXZ`+&=`S+;GrVho-)5zMEAZPb{3hVH zTJnEQc?iWF_csqh5ga0M)`ykJc7%=^NfjQ#e9Qf_P$2Ir@c#t9;XM)WuV66N_bCXZuDC1W{Y2+?Ch!N|8}UA+@fQIf|8zKC zUI_d!@8oDcSpRp>++8SzwT2JSvS%izXd*r z`k4AX4O<3#-XGfUIl$8v{$k)O7Ty7T4gPBS%P{b~#UBG+vhW$o1Lt=!+5VRSZ@&#e zw#Ju;|4mqa4)~+6-|f2o72q2!{vQM1WZ`cH-eKYI1b+RU5%2GG`rCkC0)84e%l{Oo(&7-frQXuS>wq ze9iUMO~BiAdakeTw(#$w{D*;DYnwWmE3U~w`|3Tn;Fn>-1XMFp&z>fgGLgV)V?{15F-_-g21Mo52?=kv+3%I%He=go(nD|Tn z_n05rpBML=jsxdCTZKQ{`wj5506)_^6$@K?zv+3vZ^c>rylCGoz|F<{w*tRzI3oS& zS>UHFKEZwXZ{z6^@3Rr&M3{!ixkA5ofbFe<00h#Gv?C{UGaPEG#TR5{G1pY)!jmJzs z1AO=6xDTiEs{voR2lJ2C=k>sUh0Ulx()iuPi=NDU`1N+Z6I{d!| ze)UfgFKB%}1-y4z?XNKZuK<7OXP);<&40p4--eEV&4!5gYt)tUy}&o^QvHqib`A{s zqCRuL^CJ;&6fpT^hyTaGPacTKHo*(hJZ^-ly0)KRK z*uKXc`JXxXe>r#r9rwY(F#U6YZ^Y(CC%P2#9|FGn@`%@~^_d2~;ZnqBy8H_8oBlB3 zy-)N10{F30vA?46PXa&smukJu{Qe&J;Vaa9PW(~e*KSh#O~n5L_`@H;^8>m)Heeyq z@h|W>jdugDJ~QIQb^fmc-v0H7_by$ZBJk^89s19kfggiBmc63S=YV%V56>WI{5QbO z#rE5vZUG31u5bqM$B=#qFzfeXi%|0eJ~C?6_H`M(8jF4pf?EZ{eM#PdF_{ci;L_yf3K zuJI&rb1{7mc=t`1-*x&5@SDFB+V?%cPksuX^U?f|JL!)Af6(f04+Gx_e_TS|wAT+P zkN#!+?Ki-$`wz@D2x!Q^05@37w^h!-{i;iVn~U|^2K*Xqj!)|PuL6HOf&F2P|1t2} z(V0F3S?2d<;19Ql{(39$3{R;0r@xdz|qC%p(^@ zyzlAs=Kwbs>vtjW`(7ULE(Of|E&+bD5azcC{Q1vS`!(d}fZv1l(tIv(lrKJ2N;KyL! z9h$!%_=5${yG7%F2K)%-?_rI{Mn3unVCakXJQ?^y zun&d|DgW6H|7_sXm*BZA&F=z!5ysP5jn4otT>~H0?OAiuUk&`|gW-5}J@DgKM!c8m z^tS@P?TN6y4+Fmj{!-EWp8_`*>-)ce?}q*vz_jPHp!lYe=XGj)EAac?i!oY{e-#== zUrhf;z}KFl_J5fEgTNp8w}`g~JmM(|>5JgK;9vhUFPOiN17Cr^{yBJ*-}oZf`@M`* z6&?qE@ZN~`TaAwbzu^exf8D=#0Dt%`5$``Ve--%AuSL93J*x4ez;B<5c#GPfegNED)aNG_&N@Ee>L#Oo`lb9{B6MR`T*h~jeh`m^;_^+jei-qxtQNk;7{Bf z3Fg=D0l(gAuirTGPdOLk1r}2enfd}Z7xU|M@P6ReLf;&CtnY5%=b(P3{@;(9)T%vK z!9V;A-0#%#Hv&HyV72oR{+23 zySV?TYDn9Q-)&OJ<;-PX8qEld)cTi!Sf%^WjgJe;AfZ zdjT(f5$n{b!WV!aoQ!xqZ3?ddKmOFHhb>=`{}$E{8%_=F`5N%=x*_5n((-QrZZ5Xh zn;iVBD5umN@%|k=mj8C}x1SyHFhvS}8}QTrP3;eo|5@Ohu-<6b{0E)<{u%i7Pe#0d z(fpqPe_}Ku`#DTMi1N(E`rHfuH5c&>n5d5--g&3i?`%%o`Xc{a;O#lw-_iEzcK8Dh zeu;xm0pETt#tof*AMm@sf^qmHtv~QN^uJM*#rl2>_#>T|Z*_g{f10U{^3VIhzYX&P zhY`yE47hnd>cSpQGge>`A2Y&3jaQ^rq@W+0Lu}AB3IwrOUuE#U< zTK;_Chfl$JP4h43#HTNop96j!=G!H}%>R0ae;D{_FN?_g2;|=h{22OITFZYA_#oC} z>?Y)IxB!5@nE$hZU-UiHUzgtr{OEh|{Y#Bs=E%Pa_?)#KJw*Ad@w`9sV*YOeK92Ru z2Q_{#@cd(;{*M9o@cbXljn;aG_Y2_HVLy=<@h8aF7wdP@h3L=de|G?8{?7(}5!!Q9 z;}-%S#A5J6+P}tuUx)n*Gk?Dl_-XL3ty;bU++586D&Q-K=S@8NA&38Q;HM+LG4sO% zz&G}W`1gVTyyOM(^)ox*Pl$g^{C_U+hpc$u<-pC=4&YV5FWM6E-lOeZ0NxG%Hu~LY z$+NzPfgi?rI|Z2b_$F}kyyO{(=)MDd@U(D0=Cm!4hkveW`LltWi}}46_{l%Q{Pq-; zUqA413`WL(a=`aM-wDXFygvng(;I>7`o0_ZhPR@RX#3v}{Lv4q`(u=U1o-2xjCh~Z z>5l`y=#7|nb$KsfL+Ps>e+Mm`_1o&;uK@n&MUh}VybQbpjrR-4vb^hnUxe}beHy>p zN&f}lw-scV5cz*}_}_ByW5ADMe0-YD?-veVHhRG0#ri(A3;u8+?%ZhmJRA7oFJnJb zk1yu~?>;YFU-kjt?%_QeJ%8+B`Uf$;Yy4W^=3@TWJNO^Kjt^Mtt;67Nd=u8^y8OR& zuxyP3cO%3xOYbTPQyZ{O-5nNl~3X4ZMWL zep2iEEVQ?|P6zNd@J~nkWdO6iJ_h{AFCrdZClP#uGyXpJJd;|L{}ssJwiL#<-v_=S ztDf&*e*X!)7xB{`o&Q$Y$6TiaI4x!{mEV~Tem3yiKY)7b`iug91pVQkG@f(huXON3 zz)#2cGl62nA07VNEW8~u9{_$2w5(FeTXMVb$;Igz7hWN5{*AKj`c3a z!vh*W8@Rcc-pl8f!#7D$&myS-F#wUp0PGwIG4Qm2dl za=y5f%=_tTv0U+!wS!)9X>TS~?TmZba&k4}r)#ULhrGSX{Yj}Us-Qj-UtK8|5BQmb zsZ6PwD;Dagg<>^_V(Mt6>XmtaHJQ&A%c~jlt$CeExm+x3;pI#fAD_<^su`QIx1Ln7 zg!UGIB-80~rc&{%MZZ!l=L*Z--a^jL6!!BQ_Q`zSM#Zq+-lap;%xJlsJS2&7%gM5D z<>c*ET1u_U8Q)UJCi$p|5k*P)Tp{Bd3zrQeB;BDzW{Uas`bW)JNlVBw{@kujz!z`=Cf}cgJk;SU80aC?60se!ndWtga5%BAVruq!32f%!A+M#leD9Z-b~{JL69DjQ|W`*W#G#V;kx zm5k0Ml}xQssKmnX%bAsAWyO@3%V*fa5ND%Ryi%sTDsHI3)CzJ|RPrP3kQWXxU*rE^pV%}U=;bzG>9fL~^u{7u z7F|K)4560m@AWfR1_FW?!UTdZSL^x94nObk^YwfyaZkLyFyM8C0k12JxSbjBy26Op z^Mk_DOL@C2qE=Bvt&#){Ga_o0BWN8rCdavmdeROYDEo1sd5HmK_h(`^I#)2 zjZvmtJfs-XGwWn>g&bzBg67je=*g*-I+-RE^vGeCr28>t_594iP-RAfRiagx)ZCj} z*g5Sl4Y+CYGk6YUs2~^ zGY!F%l5xT|_G+@EYOkxS##S+~rf`a~aRvlQV0J`R~4XAtCR#t2T&!GETaoD)M1`WnLO%QNG|2kq`)i5{h1X+1cX)3rP|pea6SWa zua{54s>%eNeY(2PUg}Mrg0u-pW!!;CIJ3XAU-9TBMk5-|QqIrjmklnNXHI3YRm>To9=cP7KUmn_5A1$N?d(A}zr&paeX?`C>Ai z+`lZ*p$gRBjAKeESzW=B zO$SP(SPKQvwJdZ(k27*=oMA<<^hlN};esJ<@@5ruR%$hpt)w&ir8tCkGH)WzCrM&T zFIV)Hb(pKpL=n=t%09nVK@6v!TtUsLp-pp-)w_IxD)lPXT3h_%iCEy@KJs zUTCS7Wd~5oO8C{J%5#vyJkIhj<913|>0$|kVUtt|*$hCMNsJ;1S))y3Oqoqqa~MQ^ zS0W{LnOZpO0+kkKK%x2=voqCIG#e&G#ZBcow)%dqxYV?aLzO96wc9PASMoZ@(glin zWCSn~1d8LtTw39r?D=!^JH{r)7w0FilQetj=(Y)eVRY;CgwJZJMXt_?+YGX%4?+~x z0BUi_4$!o=#*DL>>R8afXh{#tTyC8FPE%&8Q^vC;ohrJ9SXVlr_*FWuET?$v@m6P+ zN?Ru2f}H(WE5~Up}TZ8pTtNW?rbR;WTMymsMmVQROEwM zGlv-BkW@bu0m?J z#y7b&DLG+02LV1EUfTY5$?BMV4%4VrN$f+KnZ(r5au04UD0Y+F59A71h;tm!9lCz> z6FW%jX>XvDG|8&YoVf}HxHx6tP#pQ~rs)^;wB~0GpplYKMj>iQb`oaDlY1$@* z&T#$mfKso3O7+hw%Ju(>u0~PWwA1CleD3W}@OKS~}D$C+cKbOjQaBsPNIW6UL&d+8tE_ z9E?*%Z1;278_Wa2uDI;>H!*%tb%s!*=t~G;wKvpogQQ^;DpNf*^6UPgsvv<$3AM-Y zjNM$zq3idr8$C@NU4{oH7du-G1+EOe!OaL!MwKZmb}ZS%{S-;&v1)N&^C$^TB;g>( z&}OY5n;v2rwg)uYS<7H9`aK5(rjgATb{5fIRuYUJ*z&sWdJjuu)SNY{sUT8O>7-`3 zR1>+1b{7jABy>h~16`9wt{cPAW6DW0WjBtAsboHdl}vD}3-fKUR+bPQw-8R$)16Wn zDJeZn8)8;U7Y|^^ps*ZdPuE>txe7}_z0q!_j=&k>=rO@vC-f_|O<~#19;_AF^89e< zYGRv7^lMJm)NBC@hlE}*i$}6{bmcmS$NC)Bm*`E6PnEh6gEwWQN)qAgmaGr&f*VIC zsMDxgQK-Qkb>n`hr8Ioe_IuuP2}e?OBfV1#~nP32YM=26-F$8 zZuGk>4%19Zyb7yKWd+oZ(4@9ah6uF_tV%{!5>W^BumgS!24XzLl-#bAK}N03)v%)* z94bg}P+k>uE7e2N82NceP_4$~{+t=W)mjJD(D~4tB@eT*P=#|c3B&fVkZQS*!WgMC zmhoLzmV;GRd!GnZGF%ww_23F-T3@dj%|uo5(s{|Di8T}AE7m4p(244+8g^`ImBoM9 z)`4?i{mJz_Vv;5WsDOBvgvGQlg3DA5d&-#8rH))!G)t>0hq9DkB~q*Nnf*D2M%u2G z14;V^sC_To{?vja8_i%#;|gVVfoy&CiXgfSgmi zuD(f#WNN!yH8b79n(ftS#^w&@FyoiOTGFf?IY4qmDtmrb4IWLZqja}?%hW|rQYT6_ zjmQjD#-HV2TZeU~<-;3Bp)N9xBmZWmSzsKihFb(7g&bT~ZI>sj#hlfHn1#x9AGUo_ zgNoVW@qG+HnP8<2K~ylGmHk9KdXU-|q!br18W59-e!&w0Ouj!`!G>XzI?d}4W||K{m^Mav*y1zo%4Z31 zO9G(=?tQ8{LO?wSVMU|#FL#+J9iyatnB61TB0**;Y+B)ump#$o*JLW;Fg2&=0o=!7 zWwHNOJOF2JqGw?HS#%3TN}0l_+AnFAV60TbXp%A}@%<LK|Hm~c( zv?kIC<(=|CQ6hJhF@C)(Nk~&y2ic0PUxD#4KNW!)!!;?A&Z{@)M}wP|P5{@;N+;;* zurmEpRTHk+EDNPEj0j-1hP#mVFohXc8JPz7U9BDDG>gpClL3`kXOmfNT}kwe*2PYq zbR#Zo<@OUg7jHGHMnJ=vP3a(rY+}O&>6VtOXAa^9cUbjs7*IKdd(4#@?lW=KD$Bwq z*$0}jt!C8I5qeSZ`=sF5=^;{H^7UAT7_-V7&N{BaOoN9HaX-6INoUh0HV}80>KX@9 z`mk4GKMPHZm31v28q9Q;`VFW0PArp4I)9?@v~JmraAZtBDT`Sro390rzy$+XT}PlL z>l#gSPiUrs+))~n8$U`%#^rn()Y_b(2U_8yu?f5!x0x|Fm9gaK3Q`8FCC-z&{l$*7 z0!P{t)x!jUeDKpdh{qcD7n?`WO?qBXt?|oeM`xzSniW`QWZnjlrzVv0rX3M5Rt}ko z$GIWgL=W`5`W5+ty93eCKq?Mb18g{Eow(V?ad*0IG*uOcfn~+u=%e@jRDW+~kT5z8 zCLv4{ndXh_=MR*mu{|!A!dnFN6ZRVG(by9-{G#5IRMTD)tJXD^RucDd0dY7pdr3gm z9b&JX%;DZ*GR2)f?S%9{*-_Px+p18Gu^p1FR?Ll|b%SY0SVQ88#wpHqQ{kP_X+AK~ zL?@193ALuwQ~sd}L!@y0=NJ);|JHn@A56n@!a=oBLuq(EH+6#Y_{5rtFis%GY8f%) z%#~#^o5r)pP0}P}xoih6(&bBX7vw~}9=#>lA+ifq-b_boh|PnhAlDj>!ZspGD zaj>VQvQ!%=c<@NKr|gFp@cO_i9uUf5>mjeV#^4?+O=oPWHa8eg=(Gvx(x}(26?Nkf z{f`l&nRIj&%wQvSQuok3{}ucFc|EF*;ZdM)ELBfh!_5&HVfIdE4qBdBH}0E(ut}SR zo|>s*LN#-KIOoxz+~9^8w#_cKkG1R9L6Vi>_DS4*&a{tnoW?q++&<9GISRgCCV+?O z+Xp(k+owi*;#=@gQgXFD-rXJRipB8{@9J%O$>v0@up`ml*E!U_EmM$3J7TeTyr*|d zcTf8)LhjWiWQ9a=Z`;_|aQi0IU~_vYyh4P=pw;A?{fU*IRLzr%(lo+XXFTFdB2(OmGgB;zUxeQ z5`RtFMZjzL@%j_|)(GHw2Yzb=a6N$E8UbD?U`+teyV!!?Y{B2LV15F}$PZa?%7U-6 z;P+eb=Pmf(Eck4^GaTe;!IxVwj`j{@Zn5A`0)CyY|5q&dA(45iaCm0onsklpZRU)tGA4Ya-3iQrKb_V{Uz=v@%1kNz9=%?eIYa{bH3;wYM zUx4?Pjm&E;_#+m~d`;bc0s4A%eiq&zUXPAv>(`}kZ$eKtp&x2Ozp)AZqfO{Xo6v0? zziY|-!h%o2JH%^pV!r3SP~d-JGOtHqzS*xXW2-69*R#px7JaXz#bF4zt`(R)NL?nM zTP*pHTJTW|{*eVUwMlEkr=ZiC`fLQeCSRARFKgP8*&{M9R039>YnIGAMdrC8bBDlz zcudzX<#afd>Vi6?lih zI|R-OJSXsL1YQ*Q27zBK@a+Qo0)I*1g24Y>;G)346qs+Z<4h8a>T7a>B+g0@_>YA? zBk=15-Yf8*34E=<*9!c8f&X0K`viWo!2HkH`QL=DbpN%$FBh5T;!u}0Z&BbbfiDwy zO5iI5-Xkzid%@W-0xKP_6Iki^UV)P$^Lc@n1b$fHl)yg{_>jPDgDm$dfzK9L`9_bx zuMzr`z{(DL1m>)SItaWb@C^dLR^X2be2c(e7WlBh-x2t)1^zFAl~tZI#5#OT=vxH- zxWL;5zEj|gz;_A!I)OhU@Vf*S(7Q+A&kOR;0v{Fl#{z#<;FEEf%9{5rfnO}}zX*Jh zz~2^lUf@RrUKRL<0)JKD-wNC{!hCSp2d-BL%u_e;tuBGv1wJG&4p72%gTOdk2-ocb zcL{u-z^n|5V^HflonTu;$?)NL()#SdEjz0^`6aTnT}<3A|U}?E=3};8}rh z6nI|Xj|hyzQE+`xU>v-N>t6)kBk<1!=IKEABJ#zo!-~M01jfNkxF!WAkR@E^1QzoCH);jzg=KO|DM2yh2FN6GU^%^7zfbd%31W=1pbK7 zk6QHSj4|yegx)8x%IBcKpB4Ih1in|`y9B;pj#mkIo9ffohFA#Awz3H%#@|3u*53jB6~aqv8@4-1S#-f`V8aF4*>7Pwd7p9)L~ z&$|G_<(iyef>=mkb)eA|fM2IXy!{sZW|2{hqZa%u1fWKq-1q9V=Yzhc;e7)ConWuG z_euZnWS#0I%uQ!w&==Wiq);-ClxlVNJfQR!{dqH+8OAFr`dd8-9x=bJ&9K zvS3^O8%^l8Of&enm3G54>yMxt*Es?!e~1gbQ|MCy&kOu&ffE8(1y=Lvp9{Q8=(h;` zN`dbZ_*DXbMc}N!-xYXS;9m*6SKw!2Ew|?VnZTO_7SP)xFb>VZ^)A51w#3)7=N*vQ z=zXA#Yry*fANJngb~1%=jf1Wr!XIjTo<_#K+uP0$;Lo)wt5D|SoX+JM_deQ&DMZ5` zZ^JOH;g7aq2-EP#+u-6F{zTj50eokhvI_J3MB5b>Jrls6Xj4|9%%|E^bV>NrZC3>{ zpKUV{(71O`+YO*U2punhj;8_sw!pWwoeKE-0{>0hNjmKj{5AR>1AGU5$04&(!#@F> zCJlBIV|%wm&PG_sybPVa*uWT;TI*}rptZh+5%gvHV{3hFEE0}Ut@Sk~A6%{Vb!&ay zT3@U2p|!qlt*=|_>(=_3qk)N?TI*{yHn!H+|39y<&urs5@e5cp9`>Fs>+7Q$K3z2* z)~#n+YweSwX9o1=Ma?>tGG_(!lcFyT;4`8Z1n{$>TLSpm(e3~~Gm2X;a*cb>i(>0v z!)HaqHTxe#vE{1iUD0rzenAx5TLE1~rd(^sqEJKA<59KSL3&R#T)%(Ag3oGO3FKeU zRtVtpqXz@{rBSuJ&wMsVuM6lGMBg63o1-@c@CDI#1@NCn4+rpDqPGR`_0bOn@LQuF z3E-Qe_XO}eqDKPwebFxm@cX0x9Kaur{vd!q8vS_y-x2*~0Dm<4Ujcka^fv+gF|$zs zy*?E^Q*9am{!H|R0enwX?aEX4&qQ(bxLo7-(kVW3q~Xs+@ktX6e?FQB;CrKs0sQ$W zJ_DjS zk^VaEgHe2LNyA@{-Wb3SMsE(_uSahQ;4epS2mDPq(Iw~?+`mI(|^Y)bTD2Q^(H%Hah;Dz)Hu5EciPjuXKD&==D0X4nGt6 zO=2IQqL=AM$AEtUzc%cJUE(P_JVV2_9gP1|{x0ngzY9JK`E1nkF94hdEZ;-zltXqp z(}xOts$Kr#;pxuA;_R;Ay@<|oCf~VSta<|Q1w#RFlvXnD(8|Tmb;wGngdmIMZHMib?!}}dP{hOyAu`Wd6Aub zgqDACc*H7CtO6mqgd+GHtibqx#R!EwP!yX$-GS!2lkFqzJMg>g;-1bJ{?1>FXH(mE z70de)E5%ZKf4h3|xjoiChDVCx?Q=XGwLR87)EASdRprUn?jAnb+O@nauo zV_R^>U23JPRw;K?%Be2Ae8OLo4M6u=XwE{`|zmEa^m8yY?+p zxdO_aLQMo1Uzpgv;E(T^8J(KF_@!5zD;~20=f3YqOiyjS;@p=)c3tJ6Tea9#E*9|~ zATkzXAjfX+cha)syGF~fLQV#nhA*hHdh zYN!k6-EEP_gu8HfJl@G8q02+Q_(w2I%9HW%bh$jWobJRshpaS1D0ig4udk;M z;>z4X1ID^3I4F4o9@!F$52}_7vJ7S67=dhzna2B&WfteQXvfj+0A4S+Ub?b zv@d`)NS0X3=Ie$BKNhC|-7=p!7#Jaj#;pwUUG8D=&5rJlp7;okQ(M+}Pn?7>p;aw3 z?|hFc*JNuKjW(L^9f5(ZVjJp*Mwss#iHlx74tUMsG?4;MXqVS~l!~zV1*ltmv*&Lu z7W1luX!~wK_Urb+s(K~3bHyuH44&Fk_4nt&rCM7~J7r3wq zg`gjWz*Ay)3z$}qcR(}zkE&A&)jL=t3+Dr;GsC(zdMN6`d9t~5CY47;!l6RdO@?dv z4@|xsp-w|e;rPDF@WQ5E*0>TI?8Un}cH7`E-nyodV`X8nvZnU;vcVJ;1y!n=KGaV- zk88o3RXIb2Uk2o*klHV9kk0K#<#qblkaz;#TCN<_qgBLLTGM}^6^q#ns#4LDfJB}(cj6Nw2W1gn=vh9*(*hPGve@-}?S!|!VB8_jkbLQq6dhoP9oXgJ*Xw^^aI_J?dmEI z`wuc0>{g0_YI1;E>H4E?F;%yYL3A(-kxU(A+PAr55X}WLUeB>J9a8N=s>u`z454M9 z0I5M1Aji64bI_4BSvXt~nrCqSg|=`EzQwl35k*-X0lnfcA?Dg=nDLkxppv7eH0EQif56|NcF^|E%Ey6{(#ggWoMI1L0&!DtcO@)Vr&NvvK2ya$K>>m(FHBs*O5p}Xt=*)X2z5;U@{5WgH}!< zbx3CyP|%lD0aLTOka!H$U+_Z-)KIEWPwnX#oz^;_OHWVDuv-4u^e7T0hU0x5BVG<) z@R5T+#o8DFEAc_Tns3@l8l`|XF$6VnfKV`fU5`xgMLVGym*}B(YCSHIY-bTu9bh$i zXo=tPz$jxJN{vn<-q_;IB7@M&Cj8NPv}zTd93wUUAK0vv(36aE8;stWsohX*>*Cb( z0zM}+IzB!}4|0i#1pKLvI6ie5B;yT4NcPkdQ6ot9HV`4%S5HhVZiQrj0}+w~^~AB6 zxrv>S9c&;^FMtfUwY7ru^aRLoV3)p);xR`z$Zr#QM?KJIrC2z(o6)Qk9COrU3RSeD zDjBM5M_pk^;f*Tqm}l$68kJt0)vQLvXPFnehFjl>ovJ7#;tJUKwP6o3=zpb|j7~3R; zt2!By!c`p%cnR}zbYC0;OK}|Kg`+CwXs?kYppksEZul$b7NOcw6aoKhb$o;OWJ1(2vPP(Hk3l;i0 z>PkM2x>6fSu%5n>!qInTG;!(7j>~oq_dEK6IFq=Pb#gSGQ=F~C1C1)razr0!RC;z{ z=kS1|Gj$u^IXXPBj?Uvd7l#KNokcfEu%6PA!ckiE8gLYrVuuGDZB^#O1CFj^)AI{c z!w4(u+IDVq?9xPH*Vf@dM^nWZ-!(kw=t{<-q;Qm-gAI_6qbjM$#L<(~@!>&7Nm6$X z4?0?snn1>mnnFg-j+!JdLVTz}QPOt}54n0GSb(&vB&d*eH3W5hc*xZd)Sbgau7;qp z8m@{YBWG7fkfqkHl0t`kgO;=72tyiloE@J9*;R4JJczD_yM^j%IC|N(tq^uq1bG+8 zu8s&YCU#QZ)lwKt;p!<2R^3$;jBN|d%GFdD$jS}6=7fQ)+^A~~d!h48;A)J~R_LzI zGjN$*%*fT6V>vT&)dqbLRmIw_zAte+r@X5)=pygxjEHvoA``eelL5LLZq0!{O}g8_ ziP3SmD-LLIDwNp1I7zyzaYAL|>I*W=fQ3rES|INP+0`~NKgzsaWkF^puC9rBsky5u z$dGp9t2vNSq#Iq$vEEalH|U9qlfI6gJ4tU)6jdj^K~vP7^hQ-xxsAH2a@SE-%5}9} zoShrHbUT~Mji}}ni*D#fRGNj6G3LfpiZv}6y1Gk-(~_a9zG6v+js@s2nD%0BST#R3 zCuGL}AR{t}Vf&)aW9Ab(=Vd+A>li>7OyR~-CV?AGkuLI1iz{ofN^VT0bQ6xF_UNpv zdfc!IWX5JOH>}z*FH}ckjG97rG@h85VHS?M)8jL{#}XKP-H0l&U>HtMPE1bBj!hte zqwl0Dz>TTqFfMc2h+$Kpt_9{M<5O^@ey4foCP#5vORV4Z?@5e+AUnFwP0DBuhNG=8 zwy~Oy!iupl9CPETxk-$fAUo=UJcS9%4W~d}oCeu-=}Gt-$PK!JJhc!5r$Jre#KCFM z7_O+&G$<`jiX;t6V=e}{L1mE9#0`PfRD2RPZ3wG4v~w0}2&>RyBsb_hD^1oAR!z=n zhO0BmWj?OLiCv>}<5)1o8p12ZnFPntnEPF?oS5GMj-xcU*%ZeOv*1W`P}_~NKu(bC zxHUI_NOqJ4S)`qYhUrAw(HLZrb~Hw_h_utbAd9r4t9ZJ|JF0?#9hq@#eK^4u856>A zoEi-5$S{SYEg33>qc0fT4`LEWWpZ@!j@H6axjBlHqbuO(E*zDnQGM?Gum+9#t6d@R z+z^cUNp@}s1_t&gn4-}H*q$Jx(FE8xA!8j2=)BgmfXZwg3+UV$Ex_F&meXhfwLL^$ zqYbb>1cn=s>5Uk2TqnR5jndQ&%9ut~&JD}R!A1;obB#cbs)1_+aJUh}M2;0?lSZ=~ zGYCsp&#{AIsj?h12uoGa4cHV*Qn^8!uyhsOzzvfEea?;B7*hBRF~!dm=bGirFjn*VwA>C!xeHIZ6y>V-BFi| zehlScI0}=oC=5qs*$_}k9HoV$(m0AUGg`GFP~&EkFdWsfK_O&EbLO+1m2%@WGB}*a z-R&=_lS<-fE*zD{Q61ZK<2&P$o1?qtV9&SD(H)$*@i>CuxEr=94t6TzZrr9h$j#ji z1IJ|N#%`J=`8lo6{IFRHE4Tq1INTH^$FYKNxGPFtqa70C+!l?yu^dy8gMG}n8_sDS zwQ{_G9Bi|qBsZV~M`Z|>;|T$aWx1gpnAioT)!pb$acB!Sz+;9ckz)*a-7I#s@U%&N z{3~?H%kc+cNb!z4;CoSX<1ysqm_X>bW8lvI(=sr);T@zEeVuL~*}L%_yMapKc7Jv> zmBi6mx`9gLYOOXvxqldU!#pU?Jy4j}4fD(PH!+fi;C&kgZp}0700m$IlC0cu?IQhisQHeIXe}{@dI)ax**3E!jh7D z++dI_EX0^&Ps8?`@N_!IFXj-A>Qt^Vz|m=3OMoL<^)&3qfg@V=G;GL$W2)zxf-GH< zYYVUftz2UWPo;C?!Z}Q`VhT4dBx6=_Ttn=bS9I45n1L0;wE}l46{o=;uvw`%u0Kdz zs#CdU5S~uw+Cg|)CD#t%VdGNDbHhWmMXB<114O-jsnWT|kR43La_u3Tn2P0EMD1fL zo@*0^RJtOrQNUW%^>=N;&`PIrO#+rljd)%mTjw!}Lcg?^ZNmYhx1#YGa#|<92 zi>Zv@hL70x996lw0VFv(H`fB(SXJdT7yx^#iqoJ!wpSI$bq3aY=ak~P-auV7YaKI; zYt}k;&>6b1q^PS>x%+;iuV%U4z%65w<9f!>$=0)mX02xq&2sIbB6mF!_qi5P++E7b zZh#r=+ln>aAX9U9>i*zHn!(PlBzB`s&D90F0jK7goLw8KB}Y)OW2dp{$?3(!_Te5k z?wnCulRa+CIc?~UaWJePlR-T66h4*7uUe>wGV$bTM!qbaNbH#Rr||4Ko))qQy&%La z!W^D}pIV&3gF>N@rh$M*g+lVB{dho*%^nq?yUN8RX;l3=W`H8o~A$sx#tM^A$gxOXf2vod8c*W)`Ls{`l1B z^u*YLkMmZcoK3;=`N#*41Ix#3R55rSGcz{h_rxKKzlj+ux{LzI4wn?AIQPXnyS zOD`S7C%o3<=jys5aaGGx~;34;`@EEBg!c#!(-R$ubon=FXCxF_62kq3G z7+vzTczqdoW)B44UoO;A)`Q--^{5LP+Kks|%=6zMvnb&PxuT}IA~LaG`sm74ie19+ z0l7>l+m*%lXKMKFZ53bHqAluDQve^V=7Zkr@^p=)=3(uyL&i$u4=Ra=!R5hn^{2kF zK3<}cw3FCD<1^$vDq#;39<2Dj(48t#OZid?QsV2%+W6RE3tB{{TVQ_32yZj^DZFj6 zNo3Tc{61P!2vS3|V{9`XspV6(K0lnXFzsYmDtu}lg+lM~7)8)6W^mj%TshxlN)azDJ5q-cXWF+;@OUOgi|@fG8=+@v=v1pC|;BFD^*qIzB|V#`Er`l7I(Q5@Q*>RskX$ zhc?8$Z(61sPt1~v&%$e}vMkI6s9(VOgm&+D?57a>F9llUQ^{re(rDDnk+G1{*$`Yur=+;oGvWT`{L$NeWU`E9a z%Z<}GV$Hg~h36%daaf`HZU>e!51yLF>k@cHQ;+gs1l_EP&j{CXlwtaiTQDm?-f{?e ztxB~_AK$M*rHn%2X?^l;jnX3+0+5B$9T}(O%Qae7oB=vOJN<@G+GgvPN8iVwXbO!5 z4qnO@0wPtCV!YC_ElhfRx<0-br>hxL4J-bFw@CxCQVL}G z3Qi60<%CH@HBKwuQY{M`=PjnRrp!6;+@i@Y&Zbm#UCQsXl!z;hQP*t6;e={uD;SLJ zM4{#=!*~*$f{LRQR!mBq%Ory)?a}5y0A~grA^QSg=>R;7Lx*qm_qU9 zWbcSy61*46R|b8~7z z0?_f5Pty*4YS?3g$}%CKYg1s@DMFiOdr96s#h@FlQx4vU&819D@YoncbWd~3Q}HkSyB`gRp5|1CY}{XB|L#Xy zHtLK)Nw@=O(=a9+7}52Y0pSEiV;Ro82hjL--o*p>7#3VnRFGcJu_LG(YsI&+47+YD z3B{yEeaTDf&?Dmz#;6glAvjhAc`9L^!yq-HB=&?TgPoN+H_#q7pxqMA5;_rw1?58n z9Gnn_1qG00xzGR{)K)oQD}%s6Lv!|o=B%@Wq&bl{h`{gT3?f*kys}TIyDE!eH=4_g zh3LY8e&qw=OEU2duzz3{bC`HLE{QKGvJY8Pf-7_)g;XK_Ix01krTVi}7w?xs9WGBA zq*RSkc-2$sg_xnA4c{nvpo~wrl`ToWp-aioM!I&!LGWus>NQB8M|4 z<0v&*h8dG*#?(QMo~$fl(ZF<~Y?${T`;(P-z;0GRAP|(Iy&E}&rO*egLg?XEA%@$m z48sqK&_nbfy{K47abpa64Z`&+SfT{Fk%ceKt8r!!u2#Xzl_cZc+p2f8)w4ykz^Mv;#)Y8{3+ z)yZxZzRYP>(tRC6v|&gNr^X>Qr=#_lOW-_1YEB2aR?ufUz~nY zHK*$}kET(@aLJ>Hctb*{Tub?3wy|z1sPpx$jPaI)Fqkvn^ESCC9l2bV^_?Lr9ocwS z*5C%>C3r~!?KP-&B)F=o^9#JM&Q+}mE}6`<5#E(R*-)A}c#@%vX?Rt_(9vHTw%aNh zZalBI5l8!i&OfZp!Y160lj*FwA6rSBg<)V5|ANNgQHZ^m*!0XLsjtF;HYz!+QyHvY zg^zI-5R_C7U=L7swe+|EPP!srBh^%s%X-^D_&6BaKd70Sm2&!f^kP1#uQC)HBvsp-)m17e+liH){_3hSkZvkWZJq%no-t=ijMz-_wbc(E4uMb)CPq*V5C2s3-a7}2v>Pln`RpocIPrmzoWrGv%?DTyOa7%B}>1#8Ze z!A%AfjH3)sb#f_+jV8I&dnpdXDy(~-VSNT{Qs6CshQ16J1ZUlw7FB$+cL{0CAf#_` zfT+cBpoX{>ZpU+8z#kdsuB;VJ4-*$CXIAS50PGD|De3k|Ngp3HDb3)jQ(FBAy9%aI z8I(8SApsT|>o;j-rG_A1rv+*{M4j%q!G_y4u0`1Q1CG%DwM#WF>Z;fKmzqzw5ckTz-*hC3~MV}%=z%aIF*H^ucQO z;cTrF-&!ZWS?9F1PJ9a%l&urrf?P-n@098`@jvd- zB6ECq4`gTJAsMgo;J#8_6hw0C#5Xx1&UvW~?f@!4(zbV0;6`S07MwbT%?ZxPX`T2+ z$8k^ZXr1_GmI3nSe(S_HCrIT9W33b4_<0^!f~Uc?PJC;f_|`h{t##sC_}wm^N7p*> z4Lgbm&?k1PbDiANfYr%utrOoYufaX})`@SjnTi)YhI?8kzM1pcoV)0)6W=b~9vr;p z+D4trrjMFyo%q%|@vU{@TUYDEw^Y8C&hSXK)`@R?XRUSO8{YeCo%q%|@y$Bot99a= zd0~*J*|ko5GlxF%bzylw66XoDPJF{LXmZ?z90z9|8`V1Tt##s?9G_qgX?(`Tx+PJC;f__leZdxS?JwoZKGp;4Y31lKz8 z4W@u!v`%~r4*qYQ_-0OvYn}Lp)2v3UL;YGOz8z|v__pp*aIF*HoYVY*bKUBWY-^qP z#&h(%)`@Sw=ZSAMoQ9vy^{C_Cc-*Zz?hVlX0ICHiyoG1Isnh8o#v`HSyu=H5HXI3< z+;~bHHk;Gk0^$I@G>)AI5l|tZ6+&8El>qjY-60qYz$KG4>{d+3@o{AskHa%Va+RyU5HsH*Ia;M|> zO#DbY7r*W2tKVKC`l2ka=i&F;C!Z`bzq_`pUprtsKcL=u_??2^R{S1<9Djp=nT}<# z+>`O^#Lvi`HsyKzoesq)_gwsp9P=@9=gfK@f5$+h9P4D{E(dJno`4L06r$YoExBb| zZVqzz9Y%#H_cTjxA7JW!5`H%$bN=Se0HQBrzY=gG_xN7Vliz!c)l~hMWWOc%@F`J` zKQv2lnG{!Ba{mq){%9|A8M)ViK$!LRo`(PNyRL(Xy4v;M&G<_>w$pX}ZTLmKgRH#1 z2=ezA_)%BNZ5V08FY4W)ar_DF{5HTQzax-40=fJplu%c@{`(I6HF6zSw|N~`*Xv=b zaM+UTgXoW39`*WcrR1C#KLe~)_ivcdIb zcn<+LFj+S|9`&s1Nx2wqqz~G1cSG*jxlExh){k=E$Iq_cP0wuePPP&nkT#{9xelKW Z-!e=P4frHrTW-&@+PtT~+oTHR{x`Jj(cJ(5 literal 0 HcmV?d00001 diff --git a/lib/sigar-bin/sigar-amd64-winnt.dll b/lib/sigar-bin/sigar-amd64-winnt.dll new file mode 100644 index 0000000000000000000000000000000000000000..1ec8a0353e61238a0a1483e9112e8753eeffa51b GIT binary patch literal 402432 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

    gM0wODGB1@+%RxO(} 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 X5QBbrd}x6WE%2cQKD5BU%L4xgt?^r6 literal 0 HcmV?d00001 diff --git a/lib/sigar-bin/sigar-x86-winnt.dll b/lib/sigar-bin/sigar-x86-winnt.dll new file mode 100644 index 0000000000000000000000000000000000000000..6afdc0166c193aef098f1676ae8605ffc4791d38 GIT binary patch literal 266240 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

    M`)XQ_FjYdNK(a$YLjP+3(* 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≠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 literal 0 HcmV?d00001 diff --git a/src/java/org/apache/cassandra/service/CassandraDaemon.java b/src/java/org/apache/cassandra/service/CassandraDaemon.java index 2baf3fed47e8..cc81c4fb5fa6 100644 --- a/src/java/org/apache/cassandra/service/CassandraDaemon.java +++ b/src/java/org/apache/cassandra/service/CassandraDaemon.java @@ -33,6 +33,7 @@ import com.google.common.collect.Iterables; import com.google.common.util.concurrent.Uninterruptibles; +import org.hyperic.sigar.SigarException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -85,7 +86,7 @@ public class CassandraDaemon */ protected void setup() { - try + try { logger.info("Hostname: {}", InetAddress.getLocalHost().getHostName()); } @@ -178,6 +179,13 @@ public void uncaughtException(Thread t, Throwable e) Iterable dirs = Iterables.concat(Arrays.asList(DatabaseDescriptor.getAllDataFileLocations()), Arrays.asList(DatabaseDescriptor.getCommitLogLocation(), DatabaseDescriptor.getSavedCachesLocation())); + + SigarLibrary sigarLibrary = new SigarLibrary(); + if (sigarLibrary.initialized()) + sigarLibrary.warnIfRunningInDegradedMode(); + else + logger.info("Sigar could not be initialized"); + for (String dataDir : dirs) { logger.debug("Checking directory {}", dataDir); @@ -200,6 +208,8 @@ public void uncaughtException(Thread t, Throwable e) // if permissions aren't sufficient, stop cassandra. System.exit(3); } + + } if (CacheService.instance == null) // should never happen @@ -441,7 +451,7 @@ public void activate() logger.error("error registering MBean {}", MBEAN_NAME, e); //Allow the server to start even if the bean can't be registered } - + setup(); if (pidFile != null) @@ -533,15 +543,15 @@ public static void main(String[] args) { instance.activate(); } - + static class NativeAccess implements NativeAccessMBean { public boolean isAvailable() { return CLibrary.jnaAvailable(); } - - public boolean isMemoryLockable() + + public boolean isMemoryLockable() { return CLibrary.jnaMemoryLockable(); } diff --git a/src/java/org/apache/cassandra/utils/SigarLibrary.java b/src/java/org/apache/cassandra/utils/SigarLibrary.java new file mode 100644 index 000000000000..bcfa58e67693 --- /dev/null +++ b/src/java/org/apache/cassandra/utils/SigarLibrary.java @@ -0,0 +1,181 @@ +/* + * 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.utils; + +import org.hyperic.sigar.*; +import org.slf4j.LoggerFactory; +import org.slf4j.Logger; + +public class SigarLibrary +{ + private Logger logger = LoggerFactory.getLogger(SigarLibrary.class); + + private Sigar sigar; + private FileSystemMap mounts = null; + private boolean initialized = false; + private long INFINITY = -1; + private long EXPECTED_MIN_NOFILE = 10000l; // number of files that can be opened + private long EXPECTED_NPROC = 32768l; // number of processes + private long EXPECTED_AS = INFINITY; // address space + + // TODO: Determine memlock limits if possible + // TODO: Determine if file system is remote or local + // TODO: Determine if disk latency is within acceptable limits + + public SigarLibrary() + { + logger.info("Initializing SIGAR library"); + try + { + sigar = new Sigar(); + mounts = sigar.getFileSystemMap(); + initialized = true; + } + catch (SigarException e) + { + logger.info("Could not initialize SIGAR library {} ", e.getMessage()); + } + catch (UnsatisfiedLinkError linkError) + { + logger.info("Could not initialize SIGAR library {} ", linkError.getMessage()); + } + } + + /** + * + * @return true or false indicating if sigar was successfully initialized + */ + public boolean initialized() + { + return initialized; + } + + private boolean hasAcceptableProcNumber() + { + try + { + long fileMax = sigar.getResourceLimit().getProcessesMax(); + if (fileMax >= EXPECTED_NPROC || fileMax == INFINITY) + { + return true; + } + else + { + return false; + } + } + catch (SigarException sigarException) + { + logger.warn("Could not determine if max processes was acceptable. Error message: " + sigarException); + return false; + } + } + + private boolean hasAcceptableFileLimits() + { + try + { + long fileMax = sigar.getResourceLimit().getOpenFilesMax(); + if (fileMax >= EXPECTED_MIN_NOFILE || fileMax == INFINITY) + { + return true; + } + else + { + return false; + } + } + catch (SigarException sigarException) + { + logger.warn("Could not determine if max open file handle limit is correctly configured. Error message: " + sigarException); + return false; + } + } + + private boolean hasAcceptableAddressSpace() + { + // Check is invalid on Windows + if (!FBUtilities.isUnix()) + return true; + + try + { + long fileMax = sigar.getResourceLimit().getVirtualMemoryMax(); + if (fileMax == EXPECTED_AS) + { + return true; + } + else + { + return false; + } + } + catch (SigarException sigarException) + { + logger.warn("Could not determine if VirtualMemoryMax was acceptable. Error message: " + sigarException); + return false; + } + } + + private boolean isSwapEnabled() + { + try + { + Swap swap = sigar.getSwap(); + long swapSize = swap.getTotal(); + if (swapSize > 0) + { + return false; + } + else + { + return true; + } + } + catch (SigarException sigarException) + { + logger.warn("Could not determine if swap configuration is acceptable. Error message: " + sigarException); + return false; + } + } + + public void warnIfRunningInDegradedMode() + { + if (initialized) + { + boolean swapEnabled = isSwapEnabled(); + boolean goodAddressSpace = hasAcceptableAddressSpace(); + boolean goodFileLimits = hasAcceptableFileLimits(); + boolean goodProcNumber = hasAcceptableProcNumber(); + if (swapEnabled || !goodAddressSpace || !goodFileLimits || !goodProcNumber) + { + logger.warn("Cassandra server running in degraded mode. Is swap disabled? : {}, Address space adequate? : {}, " + + " nofile limit adequate? : {}, nproc limit adequate? : {} ", swapEnabled, goodAddressSpace, + goodFileLimits, goodProcNumber ); + } + else + { + logger.info("Checked OS settings and found them configured for optimal performance."); + } + } + else + { + logger.info("Sigar could not be initialized, test for checking degraded mode omitted."); + } + } +} From 810c2d5fe64333c0bcfe0b2ed3ea2c8f6aaf89b7 Mon Sep 17 00:00:00 2001 From: Yuki Morishita Date: Thu, 9 Oct 2014 18:12:36 -0500 Subject: [PATCH 156/557] improve concurrency of repair process patch by yukim; reviewed by krummas for CASSANDRA-6455 --- CHANGES.txt | 1 + .../apache/cassandra/repair/Differencer.java | 136 -------- .../cassandra/repair/LocalSyncTask.java | 81 +++++ .../cassandra/repair/RemoteSyncTask.java | 67 ++++ .../apache/cassandra/repair/RepairJob.java | 235 ++++++------- .../repair/RepairMessageVerbHandler.java | 7 +- .../{RepairFuture.java => RepairResult.java} | 13 +- .../cassandra/repair/RepairSession.java | 263 ++++++-------- .../cassandra/repair/RequestCoordinator.java | 128 ------- .../apache/cassandra/repair/SnapshotTask.java | 1 + .../cassandra/repair/StreamingRepairTask.java | 59 ++-- ...airJobEventListener.java => SyncStat.java} | 18 +- .../org/apache/cassandra/repair/SyncTask.java | 83 +++++ .../cassandra/repair/ValidationTask.java | 71 ++++ .../repair/messages/RepairOption.java | 290 ++++++++++++++++ .../service/ActiveRepairService.java | 129 ++++--- .../cassandra/service/StorageService.java | 320 +++++++++++------- .../service/StorageServiceMBean.java | 23 +- .../streaming/StreamReceiveTask.java | 11 +- .../org/apache/cassandra/tools/NodeProbe.java | 122 +------ .../org/apache/cassandra/tools/NodeTool.java | 39 ++- .../apache/cassandra/tools/RepairRunner.java | 101 ++++++ ...rencerTest.java => LocalSyncTaskTest.java} | 51 +-- .../cassandra/repair/RepairSessionTest.java | 71 ++++ .../repair/messages/RepairOptionTest.java | 88 +++++ ...ract.java => ActiveRepairServiceTest.java} | 136 ++------ .../AntiEntropyServiceCounterTest.java | 47 --- .../AntiEntropyServiceStandardTest.java | 47 --- 28 files changed, 1442 insertions(+), 1196 deletions(-) delete mode 100644 src/java/org/apache/cassandra/repair/Differencer.java create mode 100644 src/java/org/apache/cassandra/repair/LocalSyncTask.java create mode 100644 src/java/org/apache/cassandra/repair/RemoteSyncTask.java rename src/java/org/apache/cassandra/repair/{RepairFuture.java => RepairResult.java} (77%) delete mode 100644 src/java/org/apache/cassandra/repair/RequestCoordinator.java rename src/java/org/apache/cassandra/repair/{IRepairJobEventListener.java => SyncStat.java} (73%) create mode 100644 src/java/org/apache/cassandra/repair/SyncTask.java create mode 100644 src/java/org/apache/cassandra/repair/ValidationTask.java create mode 100644 src/java/org/apache/cassandra/repair/messages/RepairOption.java create mode 100644 src/java/org/apache/cassandra/tools/RepairRunner.java rename test/unit/org/apache/cassandra/repair/{DifferencerTest.java => LocalSyncTaskTest.java} (73%) create mode 100644 test/unit/org/apache/cassandra/repair/RepairSessionTest.java create mode 100644 test/unit/org/apache/cassandra/repair/messages/RepairOptionTest.java rename test/unit/org/apache/cassandra/service/{AntiEntropyServiceTestAbstract.java => ActiveRepairServiceTest.java} (62%) delete mode 100644 test/unit/org/apache/cassandra/service/AntiEntropyServiceCounterTest.java delete mode 100644 test/unit/org/apache/cassandra/service/AntiEntropyServiceStandardTest.java diff --git a/CHANGES.txt b/CHANGES.txt index 432299aeb972..6d67e2eac976 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -29,6 +29,7 @@ * Use unsafe mutations for most unit tests (CASSANDRA-6969) * Fix race condition during calculation of pending ranges (CASSANDRA-7390) * Fail on very large batch sizes (CASSANDRA-8011) + * improve concurrency of repair (CASSANDRA-6455) 2.1.1 diff --git a/src/java/org/apache/cassandra/repair/Differencer.java b/src/java/org/apache/cassandra/repair/Differencer.java deleted file mode 100644 index 214d2c9a1d49..000000000000 --- a/src/java/org/apache/cassandra/repair/Differencer.java +++ /dev/null @@ -1,136 +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.repair; - -import java.net.InetAddress; -import java.util.ArrayList; -import java.util.List; - -import com.google.common.base.Objects; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.apache.cassandra.dht.Range; -import org.apache.cassandra.dht.Token; -import org.apache.cassandra.net.MessagingService; -import org.apache.cassandra.repair.messages.SyncComplete; -import org.apache.cassandra.repair.messages.SyncRequest; -import org.apache.cassandra.utils.FBUtilities; -import org.apache.cassandra.utils.MerkleTree; - -/** - * Runs on the node that initiated a request to compare two trees, and launch repairs for disagreeing ranges. - */ -public class Differencer implements Runnable -{ - private static Logger logger = LoggerFactory.getLogger(Differencer.class); - - private final RepairJobDesc desc; - public final TreeResponse r1; - public final TreeResponse r2; - public final List> differences = new ArrayList<>(); - - public Differencer(RepairJobDesc desc, TreeResponse r1, TreeResponse r2) - { - this.desc = desc; - this.r1 = r1; - this.r2 = r2; - } - - /** - * Compares our trees, and triggers repairs for any ranges that mismatch. - */ - public void run() - { - // compare trees, and collect differences - differences.addAll(MerkleTree.difference(r1.tree, r2.tree)); - - // choose a repair method based on the significance of the difference - String format = String.format("[repair #%s] Endpoints %s and %s %%s for %s", desc.sessionId, r1.endpoint, r2.endpoint, desc.columnFamily); - if (differences.isEmpty()) - { - logger.info(String.format(format, "are consistent")); - // send back sync complete message - MessagingService.instance().sendOneWay(new SyncComplete(desc, r1.endpoint, r2.endpoint, true).createMessage(), FBUtilities.getLocalAddress()); - return; - } - - // non-0 difference: perform streaming repair - logger.info(String.format(format, "have " + differences.size() + " range(s) out of sync")); - performStreamingRepair(); - } - - /** - * Starts sending/receiving our list of differences to/from the remote endpoint: creates a callback - * that will be called out of band once the streams complete. - */ - void performStreamingRepair() - { - InetAddress local = FBUtilities.getBroadcastAddress(); - // We can take anyone of the node as source or destination, however if one is localhost, we put at source to avoid a forwarding - InetAddress src = r2.endpoint.equals(local) ? r2.endpoint : r1.endpoint; - InetAddress dst = r2.endpoint.equals(local) ? r1.endpoint : r2.endpoint; - - SyncRequest request = new SyncRequest(desc, local, src, dst, differences); - StreamingRepairTask task = new StreamingRepairTask(desc, request); - task.run(); - } - - - /** - * In order to remove completed Differencer, equality is computed only from {@code desc} and - * endpoint part of two TreeResponses. - */ - @Override - public boolean equals(Object o) - { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - Differencer that = (Differencer) o; - if (!desc.equals(that.desc)) return false; - return minEndpoint().equals(that.minEndpoint()) && maxEndpoint().equals(that.maxEndpoint()); - } - - @Override - public int hashCode() - { - return Objects.hashCode(desc, minEndpoint(), maxEndpoint()); - } - - // For equals and hashcode, we don't want to take the endpoint order into account. - // So we just order endpoint deterministically to simplify this - private InetAddress minEndpoint() - { - return FBUtilities.compareUnsigned(r1.endpoint.getAddress(), r2.endpoint.getAddress()) < 0 - ? r1.endpoint - : r2.endpoint; - } - - private InetAddress maxEndpoint() - { - return FBUtilities.compareUnsigned(r1.endpoint.getAddress(), r2.endpoint.getAddress()) < 0 - ? r2.endpoint - : r1.endpoint; - } - - public String toString() - { - return "#" + r2.endpoint + ":" + desc.columnFamily + "@" + desc.range + ">"; - } -} diff --git a/src/java/org/apache/cassandra/repair/LocalSyncTask.java b/src/java/org/apache/cassandra/repair/LocalSyncTask.java new file mode 100644 index 000000000000..38f63ce9721e --- /dev/null +++ b/src/java/org/apache/cassandra/repair/LocalSyncTask.java @@ -0,0 +1,81 @@ +/* + * 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.repair; + +import java.net.InetAddress; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.cassandra.dht.Range; +import org.apache.cassandra.dht.Token; +import org.apache.cassandra.streaming.StreamEvent; +import org.apache.cassandra.streaming.StreamEventHandler; +import org.apache.cassandra.streaming.StreamPlan; +import org.apache.cassandra.streaming.StreamState; +import org.apache.cassandra.utils.FBUtilities; + +/** + * LocalSyncTask performs streaming between local(coordinator) node and remote replica. + */ +public class LocalSyncTask extends SyncTask implements StreamEventHandler +{ + private static final Logger logger = LoggerFactory.getLogger(LocalSyncTask.class); + + private final long repairedAt; + + public LocalSyncTask(RepairJobDesc desc, TreeResponse r1, TreeResponse r2, long repairedAt) + { + super(desc, r1, r2); + this.repairedAt = repairedAt; + } + + /** + * Starts sending/receiving our list of differences to/from the remote endpoint: creates a callback + * that will be called out of band once the streams complete. + */ + protected void startSync(List> differences) + { + InetAddress local = FBUtilities.getBroadcastAddress(); + // We can take anyone of the node as source or destination, however if one is localhost, we put at source to avoid a forwarding + InetAddress dst = r2.endpoint.equals(local) ? r1.endpoint : r2.endpoint; + + logger.info(String.format("[repair #%s] Performing streaming repair of %d ranges with %s", desc.sessionId, differences.size(), dst)); + new StreamPlan("Repair", repairedAt, 1).listeners(this) + .flushBeforeTransfer(true) + // request ranges from the remote node + .requestRanges(dst, desc.keyspace, differences, desc.columnFamily) + // send ranges to the remote node + .transferRanges(dst, desc.keyspace, differences, desc.columnFamily) + .execute(); + } + + public void handleStreamEvent(StreamEvent event) { /* noop */ } + + public void onSuccess(StreamState result) + { + logger.info(String.format("[repair #%s] Sync complete between %s and %s on %s", desc.sessionId, r1.endpoint, r2.endpoint, desc.columnFamily)); + set(stat); + } + + public void onFailure(Throwable t) + { + setException(t); + } +} diff --git a/src/java/org/apache/cassandra/repair/RemoteSyncTask.java b/src/java/org/apache/cassandra/repair/RemoteSyncTask.java new file mode 100644 index 000000000000..ca5c99862d90 --- /dev/null +++ b/src/java/org/apache/cassandra/repair/RemoteSyncTask.java @@ -0,0 +1,67 @@ +/* + * 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.repair; + +import java.net.InetAddress; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.cassandra.dht.Range; +import org.apache.cassandra.dht.Token; +import org.apache.cassandra.exceptions.RepairException; +import org.apache.cassandra.net.MessagingService; +import org.apache.cassandra.repair.messages.SyncRequest; +import org.apache.cassandra.utils.FBUtilities; + +/** + * RemoteSyncTask sends {@link SyncRequest} to remote(non-coordinator) node + * to repair(stream) data with other replica. + * + * When RemoteSyncTask receives SyncComplete from remote node, task completes. + */ +public class RemoteSyncTask extends SyncTask +{ + private static final Logger logger = LoggerFactory.getLogger(RemoteSyncTask.class); + + public RemoteSyncTask(RepairJobDesc desc, TreeResponse r1, TreeResponse r2) + { + super(desc, r1, r2); + } + + protected void startSync(List> differences) + { + InetAddress local = FBUtilities.getBroadcastAddress(); + SyncRequest request = new SyncRequest(desc, local, r1.endpoint, r2.endpoint, differences); + logger.info(String.format("[repair #%s] Forwarding streaming repair of %d ranges to %s (to be streamed with %s)", desc.sessionId, request.ranges.size(), request.src, request.dst)); + MessagingService.instance().sendOneWay(request.createMessage(), request.src); + } + + public void syncComplete(boolean success) + { + if (success) + { + set(stat); + } + else + { + setException(new RepairException(desc, String.format("Sync failed between %s and %s", r1.endpoint, r2.endpoint))); + } + } +} diff --git a/src/java/org/apache/cassandra/repair/RepairJob.java b/src/java/org/apache/cassandra/repair/RepairJob.java index 8057ed53f559..b0d17ab2281c 100644 --- a/src/java/org/apache/cassandra/repair/RepairJob.java +++ b/src/java/org/apache/cassandra/repair/RepairJob.java @@ -18,93 +18,68 @@ package org.apache.cassandra.repair; import java.net.InetAddress; -import java.util.*; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.locks.Condition; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import com.google.common.util.concurrent.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.cassandra.db.Keyspace; -import org.apache.cassandra.dht.Range; -import org.apache.cassandra.dht.Token; -import org.apache.cassandra.net.MessagingService; -import org.apache.cassandra.repair.messages.ValidationRequest; +import org.apache.cassandra.gms.FailureDetector; import org.apache.cassandra.utils.FBUtilities; -import org.apache.cassandra.utils.MerkleTree; -import org.apache.cassandra.utils.concurrent.SimpleCondition; +import org.apache.cassandra.utils.Pair; /** * RepairJob runs repair on given ColumnFamily. */ -public class RepairJob +public class RepairJob extends AbstractFuture implements Runnable { private static Logger logger = LoggerFactory.getLogger(RepairJob.class); - public final RepairJobDesc desc; + private final RepairSession session; + private final RepairJobDesc desc; private final boolean isSequential; - // first we send tree requests. this tracks the endpoints remaining to hear from - private final RequestCoordinator treeRequests; - // tree responses are then tracked here - private final List trees = new ArrayList<>(); - // once all responses are received, each tree is compared with each other, and differencer tasks - // are submitted. the job is done when all differencers are complete. + private final long repairedAt; private final ListeningExecutorService taskExecutor; - private final Condition requestsSent = new SimpleCondition(); - private int gcBefore = -1; - - private volatile boolean failed = false; - /* Count down as sync completes */ - private AtomicInteger waitForSync; - - private final IRepairJobEventListener listener; /** * Create repair job to run on specific columnfamily + * + * @param session RepairSession that this RepairJob belongs + * @param columnFamily name of the ColumnFamily to repair + * @param isSequential when true, validation runs sequentially among replica + * @param taskExecutor Executor to run various repair tasks */ - public RepairJob(IRepairJobEventListener listener, - UUID parentSessionId, - UUID sessionId, - String keyspace, + public RepairJob(RepairSession session, String columnFamily, - Range range, boolean isSequential, + long repairedAt, ListeningExecutorService taskExecutor) { - this.listener = listener; - this.desc = new RepairJobDesc(parentSessionId, sessionId, keyspace, columnFamily, range); + this.session = session; + this.desc = new RepairJobDesc(session.parentRepairSession, session.getId(), session.keyspace, columnFamily, session.getRange()); this.isSequential = isSequential; + this.repairedAt = repairedAt; this.taskExecutor = taskExecutor; - this.treeRequests = new RequestCoordinator(isSequential) - { - public void send(InetAddress endpoint) - { - ValidationRequest request = new ValidationRequest(desc, gcBefore); - MessagingService.instance().sendOneWay(request.createMessage(), endpoint); - } - }; } /** - * @return true if this job failed - */ - public boolean isFailed() - { - return failed; - } - - /** - * Send merkle tree request to every involved neighbor. + * Runs repair job. + * + * This sets up necessary task and runs them on given {@code taskExecutor}. + * After submitting all tasks, waits until validation with replica completes. */ - public void sendTreeRequests(Collection endpoints) + public void run() { - // send requests to all nodes - List allEndpoints = new ArrayList<>(endpoints); + List allEndpoints = new ArrayList<>(session.endpoints); allEndpoints.add(FBUtilities.getBroadcastAddress()); + ListenableFuture> validations; if (isSequential) { + // Request snapshot to all replica List> snapshotTasks = new ArrayList<>(allEndpoints.size()); for (InetAddress endpoint : allEndpoints) { @@ -112,102 +87,110 @@ public void sendTreeRequests(Collection endpoints) snapshotTasks.add(snapshotTask); taskExecutor.execute(snapshotTask); } + // When all snapshot complete, send validation requests ListenableFuture> allSnapshotTasks = Futures.allAsList(snapshotTasks); - // Execute send tree request after all snapshot complete - Futures.addCallback(allSnapshotTasks, new FutureCallback>() + validations = Futures.transform(allSnapshotTasks, new AsyncFunction, List>() { - public void onSuccess(List endpoints) + public ListenableFuture> apply(List endpoints) throws Exception { - sendTreeRequestsInternal(endpoints); - } - - public void onFailure(Throwable throwable) - { - // TODO need to propagate error to RepairSession - logger.error("Error occurred during snapshot phase", throwable); - listener.failedSnapshot(); - failed = true; + return sendValidationRequest(endpoints); } }, taskExecutor); } else { - sendTreeRequestsInternal(allEndpoints); + // If not sequential, just send validation request to all replica + validations = sendValidationRequest(allEndpoints); } - } - private void sendTreeRequestsInternal(Collection endpoints) - { - this.gcBefore = Keyspace.open(desc.keyspace).getColumnFamilyStore(desc.columnFamily).gcBefore(System.currentTimeMillis()); - for (InetAddress endpoint : endpoints) - treeRequests.add(endpoint); + // When all validations complete, submit sync tasks + ListenableFuture> syncResults = Futures.transform(validations, new AsyncFunction, List>() + { + public ListenableFuture> apply(List trees) throws Exception + { + // Unregister from FailureDetector once we've completed synchronizing Merkle trees. + // After this point, we rely on tcp_keepalive for individual sockets to notify us when a connection is down. + // See CASSANDRA-3569 + FailureDetector.instance.unregisterFailureDetectionEventListener(session); - logger.info(String.format("[repair #%s] requesting merkle trees for %s (to %s)", desc.sessionId, desc.columnFamily, endpoints)); - treeRequests.start(); - requestsSent.signalAll(); - } + InetAddress local = FBUtilities.getLocalAddress(); - /** - * Add a new received tree and return the number of remaining tree to - * be received for the job to be complete. - * - * Callers may assume exactly one addTree call will result in zero remaining endpoints. - * - * @param endpoint address of the endpoint that sent response - * @param tree sent Merkle tree or null if validation failed on endpoint - * @return the number of responses waiting to receive - */ - public synchronized int addTree(InetAddress endpoint, MerkleTree tree) - { - // Wait for all request to have been performed (see #3400) - try - { - requestsSent.await(); - } - catch (InterruptedException e) + List syncTasks = new ArrayList<>(); + // We need to difference all trees one against another + for (int i = 0; i < trees.size() - 1; ++i) + { + TreeResponse r1 = trees.get(i); + for (int j = i + 1; j < trees.size(); ++j) + { + TreeResponse r2 = trees.get(j); + SyncTask task; + if (r1.endpoint.equals(local) || r2.endpoint.equals(local)) + { + task = new LocalSyncTask(desc, r1, r2, repairedAt); + } + else + { + task = new RemoteSyncTask(desc, r1, r2); + // RemoteSyncTask expects SyncComplete message sent back. + // Register task to RepairSession to receive response. + session.waitForSync(Pair.create(desc, new NodePair(r1.endpoint, r2.endpoint)), (RemoteSyncTask) task); + } + syncTasks.add(task); + taskExecutor.submit(task); + } + } + return Futures.allAsList(syncTasks); + } + }, taskExecutor); + + // When all sync complete, set the final result + Futures.addCallback(syncResults, new FutureCallback>() { - throw new AssertionError("Interrupted while waiting for requests to be sent"); - } + public void onSuccess(List stats) + { + logger.info(String.format("[repair #%s] %s is fully synced", session.getId(), desc.columnFamily)); + set(new RepairResult(desc, stats)); + } - if (tree == null) - failed = true; - else - trees.add(new TreeResponse(endpoint, tree)); - return treeRequests.completed(endpoint); + /** + * Snapshot, validation and sync failures are all handled here + */ + public void onFailure(Throwable t) + { + logger.warn(String.format("[repair #%s] %s sync failed", session.getId(), desc.columnFamily)); + setException(t); + } + }, taskExecutor); + + // Wait for validation to complete + Futures.getUnchecked(validations); } /** - * Submit differencers for running. - * All tree *must* have been received before this is called. + * Creates {@link ValidationTask} and submit them to task executor. + * If isSequential flag is true, wait previous ValidationTask to complete before submitting the next. + * + * @param endpoints Endpoint addresses to send validation request + * @return Future that can get all {@link TreeResponse} from replica, if all validation succeed. */ - public void submitDifferencers() + private ListenableFuture> sendValidationRequest(Collection endpoints) { - assert !failed; - List differencers = new ArrayList<>(); - // We need to difference all trees one against another - for (int i = 0; i < trees.size() - 1; ++i) + logger.info(String.format("[repair #%s] requesting merkle trees for %s (to %s)", desc.sessionId, desc.columnFamily, endpoints)); + int gcBefore = Keyspace.open(desc.keyspace).getColumnFamilyStore(desc.columnFamily).gcBefore(System.currentTimeMillis()); + List> tasks = new ArrayList<>(endpoints.size()); + for (InetAddress endpoint : endpoints) { - TreeResponse r1 = trees.get(i); - for (int j = i + 1; j < trees.size(); ++j) + ValidationTask task = new ValidationTask(desc, endpoint, gcBefore); + tasks.add(task); + session.waitForValidation(Pair.create(desc, endpoint), task); + taskExecutor.execute(task); + if (isSequential) { - TreeResponse r2 = trees.get(j); - Differencer differencer = new Differencer(desc, r1, r2); - differencers.add(differencer); - logger.debug("Queueing comparison {}", differencer); + // tasks are sequentially sent so wait until current validation is done. + // NOTE: Wait happens on taskExecutor thread + Futures.getUnchecked(task); } } - waitForSync = new AtomicInteger(differencers.size()); - for (Differencer differencer : differencers) - taskExecutor.submit(differencer); - - trees.clear(); // allows gc to do its thing - } - - /** - * @return true if the given node pair was the last remaining - */ - boolean completedSynchronization() - { - return waitForSync.decrementAndGet() == 0; + return Futures.allAsList(tasks); } } diff --git a/src/java/org/apache/cassandra/repair/RepairMessageVerbHandler.java b/src/java/org/apache/cassandra/repair/RepairMessageVerbHandler.java index 54117a3d9299..04a27af0a82a 100644 --- a/src/java/org/apache/cassandra/repair/RepairMessageVerbHandler.java +++ b/src/java/org/apache/cassandra/repair/RepairMessageVerbHandler.java @@ -103,7 +103,12 @@ public boolean apply(SSTableReader sstable) case SYNC_REQUEST: // forwarded sync request SyncRequest request = (SyncRequest) message.payload; - StreamingRepairTask task = new StreamingRepairTask(desc, request); + + long repairedAt = ActiveRepairService.UNREPAIRED_SSTABLE; + if (desc.parentSessionId != null && ActiveRepairService.instance.getParentRepairSession(desc.parentSessionId) != null) + repairedAt = ActiveRepairService.instance.getParentRepairSession(desc.parentSessionId).repairedAt; + + StreamingRepairTask task = new StreamingRepairTask(desc, request, repairedAt); task.run(); break; diff --git a/src/java/org/apache/cassandra/repair/RepairFuture.java b/src/java/org/apache/cassandra/repair/RepairResult.java similarity index 77% rename from src/java/org/apache/cassandra/repair/RepairFuture.java rename to src/java/org/apache/cassandra/repair/RepairResult.java index 127d8733b328..259d5f39118b 100644 --- a/src/java/org/apache/cassandra/repair/RepairFuture.java +++ b/src/java/org/apache/cassandra/repair/RepairResult.java @@ -17,15 +17,16 @@ */ package org.apache.cassandra.repair; -import java.util.concurrent.FutureTask; +import java.util.List; -public class RepairFuture extends FutureTask +public class RepairResult { - public final RepairSession session; + public final RepairJobDesc desc; + public final List stats; - public RepairFuture(RepairSession session) + public RepairResult(RepairJobDesc desc, List stats) { - super(session, null); - this.session = session; + this.desc = desc; + this.stats = stats; } } diff --git a/src/java/org/apache/cassandra/repair/RepairSession.java b/src/java/org/apache/cassandra/repair/RepairSession.java index 9274342a2f15..240a21cf8986 100644 --- a/src/java/org/apache/cassandra/repair/RepairSession.java +++ b/src/java/org/apache/cassandra/repair/RepairSession.java @@ -21,13 +21,12 @@ import java.net.InetAddress; import java.util.*; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.ConcurrentMap; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.locks.Condition; -import com.google.common.util.concurrent.ListeningExecutorService; -import com.google.common.util.concurrent.MoreExecutors; +import com.google.common.collect.Lists; +import com.google.common.util.concurrent.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,28 +34,30 @@ import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; -import org.apache.cassandra.exceptions.RepairException; import org.apache.cassandra.gms.*; -import org.apache.cassandra.service.ActiveRepairService; -import org.apache.cassandra.utils.*; -import org.apache.cassandra.utils.concurrent.SimpleCondition; +import org.apache.cassandra.utils.FBUtilities; +import org.apache.cassandra.utils.MerkleTree; +import org.apache.cassandra.utils.Pair; /** * Coordinates the (active) repair of a token range. * * A given RepairSession repairs a set of replicas for a given range on a list * of column families. For each of the column family to repair, RepairSession - * creates a RepairJob that handles the repair of that CF. + * creates a {@link RepairJob} that handles the repair of that CF. * * A given RepairJob has the 2 main phases: - * 1. Validation phase: the job requests merkle trees from each of the replica involves - * (RepairJob.sendTreeRequests()) and waits until all trees are received (in + *

      + *
    1. Validation phase: the job requests merkle trees from each of the replica involves + * ({@link org.apache.cassandra.repair.ValidationTask}) and waits until all trees are received (in * validationComplete()). - * 2. Synchonization phase: once all trees are received, the job compares each tree with - * all the other using a so-called Differencer (started by submitDifferencers()). If - * differences there is between 2 trees, the concerned Differencer will start a streaming - * of the difference between the 2 endpoint concerned (Differencer.performStreamingRepair). - * The job is done once all its Differencer are done (i.e. have either computed no differences + *
    2. + *
    3. Synchronization phase: once all trees are received, the job compares each tree with + * all the other using a so-called {@link SyncTask}. If there is difference between 2 trees, the + * concerned SyncTask will start a streaming of the difference between the 2 endpoint concerned. + *
    4. + *
    + * The job is done once all its SyncTasks are done (i.e. have either computed no differences * or the streaming they started is done (syncComplete())). * * A given session will execute the first phase (validation phase) of each of it's job @@ -71,15 +72,15 @@ * we still first send a message to each node to flush and snapshot data so each merkle tree * creation is still done on similar data, even if the actual creation is not * done simulatneously). If not sequential, all merkle tree are requested in parallel. - * Similarly, if a job is sequential, it will handle one Differencer at a time, but will handle + * Similarly, if a job is sequential, it will handle one SyncTask at a time, but will handle * all of them in parallel otherwise. */ -public class RepairSession extends WrappedRunnable implements IEndpointStateChangeSubscriber, - IFailureDetectionEventListener, - IRepairJobEventListener +public class RepairSession extends AbstractFuture> implements IEndpointStateChangeSubscriber, + IFailureDetectionEventListener { private static Logger logger = LoggerFactory.getLogger(RepairSession.class); + public final UUID parentRepairSession; /** Repair session ID */ private final UUID id; public final String keyspace; @@ -88,25 +89,18 @@ public class RepairSession extends WrappedRunnable implements IEndpointStateChan /** Range to repair */ public final Range range; public final Set endpoints; + private final long repairedAt; - private volatile Exception exception; private final AtomicBoolean isFailed = new AtomicBoolean(false); - private final AtomicBoolean fdUnregistered = new AtomicBoolean(false); - - // First, all RepairJobs are added to this queue, - final Queue jobs = new ConcurrentLinkedQueue<>(); - // and after receiving all validation, the job is moved to - // this map, keyed by CF name. - final Map syncingJobs = new ConcurrentHashMap<>(); + // Each validation task waits response from replica in validating ConcurrentMap (keyed by CF name and endpoint address) + private final ConcurrentMap, ValidationTask> validating = new ConcurrentHashMap<>(); + // Remote syncing jobs wait response in syncingTasks map + private final ConcurrentMap, RemoteSyncTask> syncingTasks = new ConcurrentHashMap<>(); // Tasks(snapshot, validate request, differencing, ...) are run on taskExecutor private final ListeningExecutorService taskExecutor = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool(new NamedThreadFactory("RepairJobTask"))); - private final SimpleCondition completed = new SimpleCondition(); - public final Condition differencingDone = new SimpleCondition(); - public final UUID parentRepairSession; - private volatile boolean terminated = false; /** @@ -118,21 +112,25 @@ public class RepairSession extends WrappedRunnable implements IEndpointStateChan * @param endpoints the data centers that should be part of the repair; null for all DCs * @param cfnames names of columnfamilies */ - public RepairSession(UUID parentRepairSession, Range range, String keyspace, boolean isSequential, Set endpoints, String... cfnames) + public RepairSession(UUID parentRepairSession, + UUID id, + Range range, + String keyspace, + boolean isSequential, + Set endpoints, + long repairedAt, + String... cfnames) { - this(parentRepairSession, UUIDGen.getTimeUUID(), range, keyspace, isSequential, endpoints, cfnames); - } + assert cfnames.length > 0 : "Repairing no column families seems pointless, doesn't it"; - public RepairSession(UUID parentRepairSession, UUID id, Range range, String keyspace, boolean isSequential, Set endpoints, String[] cfnames) - { this.parentRepairSession = parentRepairSession; this.id = id; this.isSequential = isSequential; this.keyspace = keyspace; this.cfnames = cfnames; - assert cfnames.length > 0 : "Repairing no column families seems pointless, doesn't it"; this.range = range; this.endpoints = endpoints; + this.repairedAt = repairedAt; } public UUID getId() @@ -145,6 +143,16 @@ public Range getRange() return range; } + public void waitForValidation(Pair key, ValidationTask task) + { + validating.put(key, task); + } + + public void waitForSync(Pair key, RemoteSyncTask task) + { + syncingTasks.put(key, task); + } + /** * Receive merkle tree response or failed response from {@code endpoint} for current repair job. * @@ -154,52 +162,15 @@ public Range getRange() */ public void validationComplete(RepairJobDesc desc, InetAddress endpoint, MerkleTree tree) { - RepairJob job = jobs.peek(); - if (job == null) + ValidationTask task = validating.remove(Pair.create(desc, endpoint)); + if (task == null) { assert terminated; return; } - if (tree == null) - { - exception = new RepairException(desc, "Validation failed in " + endpoint); - forceShutdown(); - return; - } - logger.info(String.format("[repair #%s] Received merkle tree for %s from %s", getId(), desc.columnFamily, endpoint)); - - assert job.desc.equals(desc); - if (job.addTree(endpoint, tree) == 0) - { - logger.debug("All responses received for {}/{}", getId(), desc.columnFamily); - if (!job.isFailed()) - { - syncingJobs.put(job.desc.columnFamily, job); - job.submitDifferencers(); - } - - // This job is complete, switching to next in line (note that only one thread will ever do this) - jobs.poll(); - RepairJob nextJob = jobs.peek(); - if (nextJob == null) - { - // Unregister from FailureDetector once we've completed synchronizing Merkle trees. - // After this point, we rely on tcp_keepalive for individual sockets to notify us when a connection is down. - // See CASSANDRA-3569 - if (fdUnregistered.compareAndSet(false, true)) - FailureDetector.instance.unregisterFailureDetectionEventListener(this); - - // We are done with this repair session as far as differencing - // is considered. Just inform the session - differencingDone.signalAll(); - } - else - { - nextJob.sendTreeRequests(endpoints); - } - } + task.treeReceived(tree); } /** @@ -211,38 +182,15 @@ public void validationComplete(RepairJobDesc desc, InetAddress endpoint, MerkleT */ public void syncComplete(RepairJobDesc desc, NodePair nodes, boolean success) { - RepairJob job = syncingJobs.get(desc.columnFamily); - if (job == null) + RemoteSyncTask task = syncingTasks.get(Pair.create(desc, nodes)); + if (task == null) { assert terminated; return; } - if (!success) - { - exception = new RepairException(desc, String.format("Sync failed between %s and %s", nodes.endpoint1, nodes.endpoint2)); - forceShutdown(); - return; - } - logger.debug(String.format("[repair #%s] Repair completed between %s and %s on %s", getId(), nodes.endpoint1, nodes.endpoint2, desc.columnFamily)); - - if (job.completedSynchronization()) - { - RepairJob completedJob = syncingJobs.remove(job.desc.columnFamily); - String remaining = syncingJobs.size() == 0 ? "" : String.format(" (%d remaining table to sync for this session)", syncingJobs.size()); - if (completedJob != null && completedJob.isFailed()) - logger.warn(String.format("[repair #%s] %s sync failed%s", getId(), desc.columnFamily, remaining)); - else - logger.info(String.format("[repair #%s] %s is fully synced%s", getId(), desc.columnFamily, remaining)); - - if (jobs.isEmpty() && syncingJobs.isEmpty()) - { - taskExecutor.shutdown(); - // this repair session is completed - completed.signalAll(); - } - } + task.syncComplete(success); } private String repairedNodes() @@ -254,15 +202,25 @@ private String repairedNodes() return sb.toString(); } - // we don't care about the return value but care about it throwing exception - public void runMayThrow() throws Exception + /** + * Start RepairJob on given ColumnFamilies. + * + * This first validates if all replica are available, and if they are, + * creates RepairJobs and submit to run on given executor. + * + * @param executor Executor to run validation + */ + public void start(ListeningExecutorService executor) { + if (terminated) + return; + logger.info(String.format("[repair #%s] new session: will sync %s on range %s for %s.%s", getId(), repairedNodes(), range, keyspace, Arrays.toString(cfnames))); if (endpoints.isEmpty()) { - differencingDone.signalAll(); logger.info(String.format("[repair #%s] No neighbors to repair with on range %s: session completed", getId(), range)); + set(Lists.newArrayList()); return; } @@ -272,85 +230,59 @@ public void runMayThrow() throws Exception if (!FailureDetector.instance.isAlive(endpoint)) { String message = String.format("Cannot proceed on repair because a neighbor (%s) is dead: session failed", endpoint); - differencingDone.signalAll(); logger.error("[repair #{}] {}", getId(), message); - throw new IOException(message); + setException(new IOException(message)); + return; } } - ActiveRepairService.instance.addToActiveSessions(this); - try + // Create and submit RepairJob for each ColumnFamily + List> jobs = new ArrayList<>(cfnames.length); + for (String cfname : cfnames) { - // Create and queue a RepairJob for each column family - for (String cfname : cfnames) - { - RepairJob job = new RepairJob(this, parentRepairSession, id, keyspace, cfname, range, isSequential, taskExecutor); - jobs.offer(job); - } - logger.debug("Sending tree requests to endpoints {}", endpoints); - jobs.peek().sendTreeRequests(endpoints); - - // block whatever thread started this session until all requests have been returned: - // if this thread dies, the session will still complete in the background - completed.await(); + RepairJob job = new RepairJob(this, cfname, isSequential, repairedAt, taskExecutor); + executor.execute(job); + jobs.add(job); + } - if (exception == null) + // When all RepairJobs are done without error, cleanup and set the final result + Futures.addCallback(Futures.allAsList(jobs), new FutureCallback>() + { + public void onSuccess(List results) { + // this repair session is completed logger.info(String.format("[repair #%s] session completed successfully", getId())); + set(results); + taskExecutor.shutdown(); + // mark this session as terminated + terminate(); } - else + + public void onFailure(Throwable t) { - logger.error(String.format("[repair #%s] session completed with the following error", getId()), exception); - throw exception; + logger.error("Repair job failed", t); + setException(t); } - } - catch (InterruptedException e) - { - throw new RuntimeException("Interrupted while waiting for repair."); - } - finally - { - // mark this session as terminated - terminate(); - - ActiveRepairService.instance.removeFromActiveSessions(this); - - // If we've reached here in an exception state without completing Merkle Tree sync, we'll still be registered - // with the FailureDetector. - if (fdUnregistered.compareAndSet(false, true)) - FailureDetector.instance.unregisterFailureDetectionEventListener(this); - } + }); } public void terminate() { terminated = true; - jobs.clear(); - syncingJobs.clear(); + validating.clear(); + syncingTasks.clear(); } /** * clear all RepairJobs and terminate this session. + * + * @param reason Cause of error for shutdown */ - public void forceShutdown() + public void forceShutdown(Throwable reason) { + setException(reason); taskExecutor.shutdownNow(); - differencingDone.signalAll(); - completed.signalAll(); - } - - public void failedSnapshot() - { - exception = new IOException("Failed during snapshot creation."); - forceShutdown(); - } - - void failedNode(InetAddress remote) - { - String errorMsg = String.format("Endpoint %s died", remote); - exception = new IOException(errorMsg); - // If a node failed during Merkle creation, we stop everything (though there could still be some activity in the background) - forceShutdown(); + terminate(); } public void onJoin(InetAddress endpoint, EndpointState epState) {} @@ -383,6 +315,9 @@ public void convict(InetAddress endpoint, double phi) if (!isFailed.compareAndSet(false, true)) return; - failedNode(endpoint); + Exception exception = new IOException(String.format("Endpoint %s died", endpoint)); + logger.error(String.format("[repair #%s] session completed with the following error", getId()), exception); + // If a node failed, we stop everything (though there could still be some activity in the background) + forceShutdown(exception); } } diff --git a/src/java/org/apache/cassandra/repair/RequestCoordinator.java b/src/java/org/apache/cassandra/repair/RequestCoordinator.java deleted file mode 100644 index ed089efce3aa..000000000000 --- a/src/java/org/apache/cassandra/repair/RequestCoordinator.java +++ /dev/null @@ -1,128 +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.repair; - -import java.util.HashSet; -import java.util.LinkedList; -import java.util.Queue; -import java.util.Set; - -/** -*/ -public abstract class RequestCoordinator -{ - private final Order orderer; - - public RequestCoordinator(boolean isSequential) - { - this.orderer = isSequential ? new SequentialOrder(this) : new ParallelOrder(this); - } - - public abstract void send(R request); - - public void add(R request) - { - orderer.add(request); - } - - public void start() - { - orderer.start(); - } - - // Returns how many request remains - public int completed(R request) - { - return orderer.completed(request); - } - - private static abstract class Order - { - protected final RequestCoordinator coordinator; - - Order(RequestCoordinator coordinator) - { - this.coordinator = coordinator; - } - - public abstract void add(R request); - public abstract void start(); - public abstract int completed(R request); - } - - private static class SequentialOrder extends Order - { - private final Queue requests = new LinkedList<>(); - - SequentialOrder(RequestCoordinator coordinator) - { - super(coordinator); - } - - public void add(R request) - { - requests.add(request); - } - - public void start() - { - if (requests.isEmpty()) - return; - - coordinator.send(requests.peek()); - } - - public int completed(R request) - { - assert request.equals(requests.peek()); - requests.poll(); - int remaining = requests.size(); - if (remaining != 0) - coordinator.send(requests.peek()); - return remaining; - } - } - - private static class ParallelOrder extends Order - { - private final Set requests = new HashSet<>(); - - ParallelOrder(RequestCoordinator coordinator) - { - super(coordinator); - } - - public void add(R request) - { - requests.add(request); - } - - public void start() - { - for (R request : requests) - coordinator.send(request); - } - - public int completed(R request) - { - requests.remove(request); - return requests.size(); - } - } - -} diff --git a/src/java/org/apache/cassandra/repair/SnapshotTask.java b/src/java/org/apache/cassandra/repair/SnapshotTask.java index 6c3afb138e70..a87643c50ba9 100644 --- a/src/java/org/apache/cassandra/repair/SnapshotTask.java +++ b/src/java/org/apache/cassandra/repair/SnapshotTask.java @@ -74,6 +74,7 @@ public void response(MessageIn msg) public void onFailure(InetAddress from) { + //listener.failedSnapshot(); task.setException(new RuntimeException("Could not create snapshot at " + from)); } } diff --git a/src/java/org/apache/cassandra/repair/StreamingRepairTask.java b/src/java/org/apache/cassandra/repair/StreamingRepairTask.java index 9af949da024f..f30eb6fca666 100644 --- a/src/java/org/apache/cassandra/repair/StreamingRepairTask.java +++ b/src/java/org/apache/cassandra/repair/StreamingRepairTask.java @@ -23,59 +23,40 @@ import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.repair.messages.SyncComplete; import org.apache.cassandra.repair.messages.SyncRequest; -import org.apache.cassandra.service.ActiveRepairService; -import org.apache.cassandra.streaming.*; -import org.apache.cassandra.utils.FBUtilities; +import org.apache.cassandra.streaming.StreamEvent; +import org.apache.cassandra.streaming.StreamEventHandler; +import org.apache.cassandra.streaming.StreamPlan; +import org.apache.cassandra.streaming.StreamState; /** - * Task that make two nodes exchange (stream) some ranges (for a given table/cf). - * This handle the case where the local node is neither of the two nodes that - * must stream their range, and allow to register a callback to be called on - * completion. + * StreamingRepairTask performs data streaming between two remote replica which neither is not repair coordinator. + * Task will send {@link SyncComplete} message back to coordinator upon streaming completion. */ public class StreamingRepairTask implements Runnable, StreamEventHandler { private static final Logger logger = LoggerFactory.getLogger(StreamingRepairTask.class); - /** Repair session ID that this streaming task belongs */ - public final RepairJobDesc desc; - public final SyncRequest request; + private final RepairJobDesc desc; + private final SyncRequest request; + private final long repairedAt; - public StreamingRepairTask(RepairJobDesc desc, SyncRequest request) + public StreamingRepairTask(RepairJobDesc desc, SyncRequest request, long repairedAt) { this.desc = desc; this.request = request; + this.repairedAt = repairedAt; } public void run() { - if (request.src.equals(FBUtilities.getBroadcastAddress())) - initiateStreaming(); - else - forwardToSource(); - } - - private void initiateStreaming() - { - long repairedAt = ActiveRepairService.UNREPAIRED_SSTABLE; - if (desc.parentSessionId != null && ActiveRepairService.instance.getParentRepairSession(desc.parentSessionId) != null) - repairedAt = ActiveRepairService.instance.getParentRepairSession(desc.parentSessionId).repairedAt; - logger.info(String.format("[streaming task #%s] Performing streaming repair of %d ranges with %s", desc.sessionId, request.ranges.size(), request.dst)); - StreamResultFuture op = new StreamPlan("Repair", repairedAt, 1) - .flushBeforeTransfer(true) - // request ranges from the remote node - .requestRanges(request.dst, desc.keyspace, request.ranges, desc.columnFamily) - // send ranges to the remote node - .transferRanges(request.dst, desc.keyspace, request.ranges, desc.columnFamily) - .execute(); - op.addEventListener(this); - } - - private void forwardToSource() - { - logger.info(String.format("[repair #%s] Forwarding streaming repair of %d ranges to %s (to be streamed with %s)", desc.sessionId, request.ranges.size(), request.src, request.dst)); - MessagingService.instance().sendOneWay(request.createMessage(), request.src); + new StreamPlan("Repair", repairedAt, 1).listeners(this) + .flushBeforeTransfer(true) + // request ranges from the remote node + .requestRanges(request.dst, desc.keyspace, request.ranges, desc.columnFamily) + // send ranges to the remote node + .transferRanges(request.dst, desc.keyspace, request.ranges, desc.columnFamily) + .execute(); } public void handleStreamEvent(StreamEvent event) @@ -85,7 +66,7 @@ public void handleStreamEvent(StreamEvent event) } /** - * If we succeeded on both stream in and out, reply back to the initiator. + * If we succeeded on both stream in and out, reply back to coordinator */ public void onSuccess(StreamState state) { @@ -94,7 +75,7 @@ public void onSuccess(StreamState state) } /** - * If we failed on either stream in or out, reply fail to the initiator. + * If we failed on either stream in or out, reply fail to coordinator */ public void onFailure(Throwable t) { diff --git a/src/java/org/apache/cassandra/repair/IRepairJobEventListener.java b/src/java/org/apache/cassandra/repair/SyncStat.java similarity index 73% rename from src/java/org/apache/cassandra/repair/IRepairJobEventListener.java rename to src/java/org/apache/cassandra/repair/SyncStat.java index 778c09d6b462..5721a2083bf7 100644 --- a/src/java/org/apache/cassandra/repair/IRepairJobEventListener.java +++ b/src/java/org/apache/cassandra/repair/SyncStat.java @@ -18,14 +18,16 @@ package org.apache.cassandra.repair; /** - * Implemented by the RepairSession to accept callbacks from sequential snapshot creation failure. + * Statistics about synchronizing two replica */ - -public interface IRepairJobEventListener +public class SyncStat { - /** - * Signal that there was a failure during the snapshot creation process. - * - */ - public void failedSnapshot(); + public final NodePair nodes; + public final long numberOfDifferences; + + public SyncStat(NodePair nodes, long numberOfDifferences) + { + this.nodes = nodes; + this.numberOfDifferences = numberOfDifferences; + } } diff --git a/src/java/org/apache/cassandra/repair/SyncTask.java b/src/java/org/apache/cassandra/repair/SyncTask.java new file mode 100644 index 000000000000..3ce553211fd9 --- /dev/null +++ b/src/java/org/apache/cassandra/repair/SyncTask.java @@ -0,0 +1,83 @@ +/* + * 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.repair; + +import java.util.ArrayList; +import java.util.List; + +import com.google.common.util.concurrent.AbstractFuture; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.cassandra.dht.Range; +import org.apache.cassandra.dht.Token; +import org.apache.cassandra.utils.MerkleTree; + +/** + * SyncTask will calculate the difference of MerkleTree between two nodes + * and perform necessary operation to repair replica. + */ +public abstract class SyncTask extends AbstractFuture implements Runnable +{ + private static Logger logger = LoggerFactory.getLogger(SyncTask.class); + + protected final RepairJobDesc desc; + protected final TreeResponse r1; + protected final TreeResponse r2; + + protected volatile SyncStat stat; + + public SyncTask(RepairJobDesc desc, TreeResponse r1, TreeResponse r2) + { + this.desc = desc; + this.r1 = r1; + this.r2 = r2; + } + + /** + * Compares trees, and triggers repairs for any ranges that mismatch. + */ + public void run() + { + // compare trees, and collect differences + List> differences = new ArrayList<>(); + differences.addAll(MerkleTree.difference(r1.tree, r2.tree)); + + stat = new SyncStat(new NodePair(r1.endpoint, r2.endpoint), differences.size()); + + // choose a repair method based on the significance of the difference + String format = String.format("[repair #%s] Endpoints %s and %s %%s for %s", desc.sessionId, r1.endpoint, r2.endpoint, desc.columnFamily); + if (differences.isEmpty()) + { + logger.info(String.format(format, "are consistent")); + set(stat); + return; + } + + // non-0 difference: perform streaming repair + logger.info(String.format(format, "have " + differences.size() + " range(s) out of sync")); + startSync(differences); + } + + public SyncStat getCurrentStat() + { + return stat; + } + + protected abstract void startSync(List> differences); +} diff --git a/src/java/org/apache/cassandra/repair/ValidationTask.java b/src/java/org/apache/cassandra/repair/ValidationTask.java new file mode 100644 index 000000000000..a52ec4f97021 --- /dev/null +++ b/src/java/org/apache/cassandra/repair/ValidationTask.java @@ -0,0 +1,71 @@ +/* + * 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.repair; + +import java.net.InetAddress; + +import com.google.common.util.concurrent.AbstractFuture; + +import org.apache.cassandra.exceptions.RepairException; +import org.apache.cassandra.net.MessagingService; +import org.apache.cassandra.repair.messages.ValidationRequest; +import org.apache.cassandra.utils.MerkleTree; + +/** + * ValidationTask sends {@link ValidationRequest} to a replica. + * When a replica sends back message, task completes. + */ +public class ValidationTask extends AbstractFuture implements Runnable +{ + private final RepairJobDesc desc; + private final InetAddress endpoint; + private final int gcBefore; + + public ValidationTask(RepairJobDesc desc, InetAddress endpoint, int gcBefore) + { + this.desc = desc; + this.endpoint = endpoint; + this.gcBefore = gcBefore; + } + + /** + * Send ValidationRequest to replica + */ + public void run() + { + ValidationRequest request = new ValidationRequest(desc, gcBefore); + MessagingService.instance().sendOneWay(request.createMessage(), endpoint); + } + + /** + * Receive MerkleTree from replica node. + * + * @param tree MerkleTree that is sent from replica. Null if validation failed on replica node. + */ + public void treeReceived(MerkleTree tree) + { + if (tree == null) + { + setException(new RepairException(desc, "Validation failed in " + endpoint)); + } + else + { + set(new TreeResponse(endpoint, tree)); + } + } +} diff --git a/src/java/org/apache/cassandra/repair/messages/RepairOption.java b/src/java/org/apache/cassandra/repair/messages/RepairOption.java new file mode 100644 index 000000000000..ca023658946e --- /dev/null +++ b/src/java/org/apache/cassandra/repair/messages/RepairOption.java @@ -0,0 +1,290 @@ +/* + * 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.repair.messages; + +import java.util.*; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.cassandra.dht.IPartitioner; +import org.apache.cassandra.dht.Range; +import org.apache.cassandra.dht.Token; +import org.apache.cassandra.utils.FBUtilities; + +/** + * Repair options. + */ +public class RepairOption +{ + public static final String SEQUENTIAL_KEY = "sequential"; + public static final String PRIMARY_RANGE_KEY = "primaryRange"; + public static final String INCREMENTAL_KEY = "incremental"; + public static final String JOB_THREADS_KEY = "jobThreads"; + public static final String RANGES_KEY = "ranges"; + public static final String COLUMNFAMILIES_KEY = "columnFamilies"; + public static final String DATACENTERS_KEY = "dataCenters"; + public static final String HOSTS_KEY = "hosts"; + + // we don't want to push nodes too much for repair + public static final int MAX_JOB_THREADS = 4; + + private static final Logger logger = LoggerFactory.getLogger(RepairOption.class); + + /** + * Construct RepairOptions object from given map of Strings. + *

    + * Available options are: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    keyvaluedefault (when key not given)
    sequential"true" if perform sequential repair.true
    primaryRange"true" if perform repair only on primary range.false
    incremental"true" if perform incremental repair.false
    jobThreadsNumber of threads to use to run repair job.1
    rangesRanges to repair. A range is expressed as <start token>:<end token> + * and multiple ranges can be given as comma separated ranges(e.g. aaa:bbb,ccc:ddd).
    columnFamiliesSpecify names of ColumnFamilies to repair. + * Multiple ColumnFamilies can be given as comma separated values(e.g. cf1,cf2,cf3).
    dataCentersSpecify names of data centers who participate in this repair. + * Multiple data centers can be given as comma separated values(e.g. dc1,dc2,dc3).
    hostsSpecify names of hosts who participate in this repair. + * Multiple hosts can be given as comma separated values(e.g. cass1,cass2).
    + * + * @param options options to parse + * @param partitioner partitioner is used to construct token ranges + * @return RepairOptions object + */ + public static RepairOption parse(Map options, IPartitioner partitioner) + { + boolean sequential = !options.containsKey(SEQUENTIAL_KEY) || Boolean.parseBoolean(options.get(SEQUENTIAL_KEY)); + boolean primaryRange = Boolean.parseBoolean(options.get(PRIMARY_RANGE_KEY)); + boolean incremental = Boolean.parseBoolean(options.get(INCREMENTAL_KEY)); + + int jobThreads = 1; + if (options.containsKey(JOB_THREADS_KEY)) + { + try + { + jobThreads = Integer.parseInt(options.get(JOB_THREADS_KEY)); + } + catch (NumberFormatException ignore) {} + } + // ranges + String rangesStr = options.get(RANGES_KEY); + Set> ranges = new HashSet<>(); + if (rangesStr != null) + { + StringTokenizer tokenizer = new StringTokenizer(rangesStr, ","); + while (tokenizer.hasMoreTokens()) + { + String[] rangeStr = tokenizer.nextToken().split(":", 2); + if (rangeStr.length < 2) + { + continue; + } + Token parsedBeginToken = partitioner.getTokenFactory().fromString(rangeStr[0].trim()); + Token parsedEndToken = partitioner.getTokenFactory().fromString(rangeStr[1].trim()); + ranges.add(new Range<>(parsedBeginToken, parsedEndToken)); + } + } + + RepairOption option = new RepairOption(sequential, primaryRange, incremental, jobThreads, ranges); + + // data centers + String dataCentersStr = options.get(DATACENTERS_KEY); + Collection dataCenters = new HashSet<>(); + if (dataCentersStr != null) + { + StringTokenizer tokenizer = new StringTokenizer(dataCentersStr, ","); + while (tokenizer.hasMoreTokens()) + { + dataCenters.add(tokenizer.nextToken().trim()); + } + } + option.getDataCenters().addAll(dataCenters); + + // hosts + String hostsStr = options.get(HOSTS_KEY); + Collection hosts = new HashSet<>(); + if (hostsStr != null) + { + StringTokenizer tokenizer = new StringTokenizer(hostsStr, ","); + while (tokenizer.hasMoreTokens()) + { + hosts.add(tokenizer.nextToken().trim()); + } + } + option.getHosts().addAll(hosts); + + // columnfamilies + String cfStr = options.get(COLUMNFAMILIES_KEY); + Collection columnFamilies = new HashSet<>(); + if (cfStr != null) + { + StringTokenizer tokenizer = new StringTokenizer(cfStr, ","); + while (tokenizer.hasMoreTokens()) + { + columnFamilies.add(tokenizer.nextToken().trim()); + } + } + option.getColumnFamilies().addAll(columnFamilies); + + // validate options + if (jobThreads > MAX_JOB_THREADS) + { + throw new IllegalArgumentException("Too many job threads. Max is " + MAX_JOB_THREADS); + } + if (primaryRange && (!dataCenters.isEmpty() || !hosts.isEmpty())) + { + throw new IllegalArgumentException("You need to run primary range repair on all nodes in the cluster."); + } + + return option; + } + + private final boolean sequential; + private final boolean primaryRange; + private final boolean incremental; + private final int jobThreads; + + private final Collection columnFamilies = new HashSet<>(); + private final Collection dataCenters = new HashSet<>(); + private final Collection hosts = new HashSet<>(); + private final Collection> ranges = new HashSet<>(); + + public RepairOption(boolean sequential, boolean primaryRange, boolean incremental, int jobThreads, Collection> ranges) + { + if (sequential && incremental) + { + String message = "It is not possible to mix sequential repair and incremental repairs."; + logger.error(message); + throw new IllegalArgumentException(message); + } + + if (!FBUtilities.isUnix() && sequential) + { + logger.warn("Snapshot-based repair is not yet supported on Windows. Reverting to parallel repair."); + this.sequential = false; + } + else + { + this.sequential = sequential; + } + this.primaryRange = primaryRange; + this.incremental = incremental; + this.jobThreads = jobThreads; + this.ranges.addAll(ranges); + } + + public boolean isSequential() + { + return sequential; + } + + public boolean isPrimaryRange() + { + return primaryRange; + } + + public boolean isIncremental() + { + return incremental; + } + + public int getJobThreads() + { + return jobThreads; + } + + public Collection getColumnFamilies() + { + return columnFamilies; + } + + public Collection> getRanges() + { + return ranges; + } + + public Collection getDataCenters() + { + return dataCenters; + } + + public Collection getHosts() + { + return hosts; + } + + @Override + public String toString() + { + return "repair options (" + + "sequential: " + sequential + + ", primary range: " + primaryRange + + ", incremental: " + incremental + + ", job threads: " + jobThreads + + ", ColumnFamilies: " + columnFamilies + + ", dataCenters: " + dataCenters + + ", hosts: " + hosts + + ", # of ranges: " + ranges.size() + + ')'; + } +} diff --git a/src/java/org/apache/cassandra/service/ActiveRepairService.java b/src/java/org/apache/cassandra/service/ActiveRepairService.java index f1b9ccee7622..670aa0b3e6f1 100644 --- a/src/java/org/apache/cassandra/service/ActiveRepairService.java +++ b/src/java/org/apache/cassandra/service/ActiveRepairService.java @@ -18,6 +18,7 @@ package org.apache.cassandra.service; import java.io.File; +import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.*; @@ -26,12 +27,11 @@ import com.google.common.collect.Multimap; import com.google.common.collect.Sets; - +import com.google.common.util.concurrent.ListeningExecutorService; +import com.google.common.util.concurrent.MoreExecutors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.cassandra.concurrent.JMXConfigurableThreadPoolExecutor; -import org.apache.cassandra.concurrent.NamedThreadFactory; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.compaction.CompactionManager; import org.apache.cassandra.dht.Bounds; @@ -39,6 +39,7 @@ import org.apache.cassandra.dht.Token; import org.apache.cassandra.gms.FailureDetector; import org.apache.cassandra.gms.Gossiper; +import org.apache.cassandra.gms.IFailureDetector; import org.apache.cassandra.io.sstable.Component; import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.locator.TokenMetadata; @@ -46,12 +47,9 @@ import org.apache.cassandra.net.MessageIn; import org.apache.cassandra.net.MessageOut; import org.apache.cassandra.net.MessagingService; -import org.apache.cassandra.repair.*; -import org.apache.cassandra.repair.messages.AnticompactionRequest; -import org.apache.cassandra.repair.messages.PrepareMessage; -import org.apache.cassandra.repair.messages.RepairMessage; -import org.apache.cassandra.repair.messages.SyncComplete; -import org.apache.cassandra.repair.messages.ValidationComplete; +import org.apache.cassandra.repair.RepairJobDesc; +import org.apache.cassandra.repair.RepairSession; +import org.apache.cassandra.repair.messages.*; import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.UUIDGen; @@ -73,21 +71,10 @@ public class ActiveRepairService { private static final Logger logger = LoggerFactory.getLogger(ActiveRepairService.class); // singleton enforcement - public static final ActiveRepairService instance = new ActiveRepairService(); + public static final ActiveRepairService instance = new ActiveRepairService(FailureDetector.instance, Gossiper.instance); public static final long UNREPAIRED_SSTABLE = 0; - private static final ThreadPoolExecutor executor; - static - { - executor = new JMXConfigurableThreadPoolExecutor(4, - 60, - TimeUnit.SECONDS, - new LinkedBlockingQueue(), - new NamedThreadFactory("AntiEntropySessions"), - "internal"); - } - public static enum Status { STARTED, SESSION_SUCCESS, SESSION_FAILED, FINISHED @@ -96,17 +83,17 @@ public static enum Status /** * A map of active coordinator session. */ - private final ConcurrentMap sessions; + private final ConcurrentMap sessions = new ConcurrentHashMap<>(); - private final ConcurrentMap parentRepairSessions; + private final ConcurrentMap parentRepairSessions = new ConcurrentHashMap<>(); - /** - * Protected constructor. Use ActiveRepairService.instance. - */ - protected ActiveRepairService() + private final IFailureDetector failureDetector; + private final Gossiper gossiper; + + public ActiveRepairService(IFailureDetector failureDetector, Gossiper gossiper) { - sessions = new ConcurrentHashMap<>(); - parentRepairSessions = new ConcurrentHashMap<>(); + this.failureDetector = failureDetector; + this.gossiper = gossiper; } /** @@ -114,51 +101,52 @@ protected ActiveRepairService() * * @return Future for asynchronous call or null if there is no need to repair */ - public RepairFuture submitRepairSession(UUID parentRepairSession, Range range, String keyspace, boolean isSequential, Set endpoints, String... cfnames) + public RepairSession submitRepairSession(UUID parentRepairSession, + Range range, + String keyspace, + boolean isSequential, + Set endpoints, + long repairedAt, + ListeningExecutorService executor, + String... cfnames) { - RepairSession session = new RepairSession(parentRepairSession, range, keyspace, isSequential, endpoints, cfnames); - if (session.endpoints.isEmpty()) + if (endpoints.isEmpty()) return null; - RepairFuture futureTask = new RepairFuture(session); - executor.execute(futureTask); - return futureTask; - } - public void addToActiveSessions(RepairSession session) - { + final RepairSession session = new RepairSession(parentRepairSession, UUIDGen.getTimeUUID(), range, keyspace, isSequential, endpoints, repairedAt, cfnames); + sessions.put(session.getId(), session); - Gossiper.instance.register(session); - FailureDetector.instance.registerFailureDetectionEventListener(session); - } + // register listeners + gossiper.register(session); + failureDetector.registerFailureDetectionEventListener(session); - public void removeFromActiveSessions(RepairSession session) - { - Gossiper.instance.unregister(session); - sessions.remove(session.getId()); + // unregister listeners at completion + session.addListener(new Runnable() + { + /** + * When repair finished, do clean up + */ + public void run() + { + failureDetector.unregisterFailureDetectionEventListener(session); + gossiper.unregister(session); + sessions.remove(session.getId()); + } + }, MoreExecutors.sameThreadExecutor()); + session.start(executor); + return session; } public void terminateSessions() { + Throwable cause = new IOException("Terminate session is called"); for (RepairSession session : sessions.values()) { - session.forceShutdown(); + session.forceShutdown(cause); } parentRepairSessions.clear(); } - // for testing only. Create a session corresponding to a fake request and - // add it to the sessions (avoid NPE in tests) - RepairFuture submitArtificialRepairSession(RepairJobDesc desc) - { - Set neighbours = new HashSet<>(); - neighbours.addAll(ActiveRepairService.getNeighbors(desc.keyspace, desc.range, null, null)); - RepairSession session = new RepairSession(desc.parentSessionId, desc.sessionId, desc.range, desc.keyspace, false, neighbours, new String[]{desc.columnFamily}); - sessions.put(session.getId(), session); - RepairFuture futureTask = new RepairFuture(session); - executor.execute(futureTask); - return futureTask; - } - /** * Return all of the neighbors with whom we share the provided range. * @@ -191,7 +179,7 @@ else if (range.intersects(toRepair)) Set neighbors = new HashSet<>(replicaSets.get(rangeSuperSet)); neighbors.remove(FBUtilities.getBroadcastAddress()); - if (dataCenters != null) + if (dataCenters != null && !dataCenters.isEmpty()) { TokenMetadata.Topology topology = ss.getTokenMetadata().cloneOnlyTokenMap().getTopology(); Set dcEndpoints = Sets.newHashSet(); @@ -204,7 +192,7 @@ else if (range.intersects(toRepair)) } return Sets.intersection(neighbors, dcEndpoints); } - else if (hosts != null) + else if (hosts != null && !hosts.isEmpty()) { Set specifiedHost = new HashSet<>(); for (final String host : hosts) @@ -314,21 +302,18 @@ public void registerParentRepairSession(UUID parentRepairSession, List neighbors, boolean doAntiCompaction) + public void finishParentSession(UUID parentSession, Set neighbors) { try { - if (doAntiCompaction) + for (InetAddress neighbor : neighbors) { - for (InetAddress neighbor : neighbors) - { - AnticompactionRequest acr = new AnticompactionRequest(parentSession); - MessageOut req = acr.createMessage(); - MessagingService.instance().sendOneWay(req, neighbor); - } - List> futures = doAntiCompaction(parentSession); - FBUtilities.waitOnFutures(futures); + AnticompactionRequest acr = new AnticompactionRequest(parentSession); + MessageOut req = acr.createMessage(); + MessagingService.instance().sendOneWay(req, neighbor); } + List> futures = doAntiCompaction(parentSession); + FBUtilities.waitOnFutures(futures); } finally { @@ -407,7 +392,7 @@ public ParentRepairSession(List columnFamilyStores, Collectio this.repairedAt = repairedAt; } - public Collection getAndReferenceSSTables(UUID cfId) + public synchronized Collection getAndReferenceSSTables(UUID cfId) { Set sstables = sstableMap.get(cfId); Iterator sstableIterator = sstables.iterator(); diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index 5b5fa20d3119..eb4c3e26a6b2 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -30,6 +30,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; +import javax.annotation.Nullable; import javax.management.JMX; import javax.management.MBeanServer; import javax.management.Notification; @@ -46,17 +47,13 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Predicate; import com.google.common.collect.*; -import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.Uninterruptibles; - +import com.google.common.util.concurrent.*; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.DurationFormatUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.cassandra.auth.Auth; -import org.apache.cassandra.concurrent.DebuggableScheduledThreadPoolExecutor; -import org.apache.cassandra.concurrent.Stage; -import org.apache.cassandra.concurrent.StageManager; +import org.apache.cassandra.concurrent.*; import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.config.KSMetaData; @@ -80,8 +77,10 @@ import org.apache.cassandra.net.MessageOut; import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.net.ResponseVerbHandler; -import org.apache.cassandra.repair.RepairFuture; import org.apache.cassandra.repair.RepairMessageVerbHandler; +import org.apache.cassandra.repair.messages.RepairOption; +import org.apache.cassandra.repair.RepairResult; +import org.apache.cassandra.repair.RepairSession; import org.apache.cassandra.service.paxos.CommitVerbHandler; import org.apache.cassandra.service.paxos.PrepareVerbHandler; import org.apache.cassandra.service.paxos.ProposeVerbHandler; @@ -2497,87 +2496,128 @@ public void sendNotification(String type, String message, Object userObject) sendNotification(jmxNotification); } - public int forceRepairAsync(String keyspace, boolean isSequential, Collection dataCenters, Collection hosts, boolean primaryRange, boolean fullRepair, String... columnFamilies) throws IOException + public int repairAsync(String keyspace, Map repairSpec) { - Collection> ranges; - if (primaryRange) + RepairOption option = RepairOption.parse(repairSpec, getPartitioner()); + // if ranges are not specified + if (option.getRanges().isEmpty()) { - // when repairing only primary range, neither dataCenters nor hosts can be set - if (dataCenters == null && hosts == null) - ranges = getPrimaryRanges(keyspace); - // except dataCenters only contain local DC (i.e. -local) - else if (dataCenters != null && dataCenters.size() == 1 && dataCenters.contains(DatabaseDescriptor.getLocalDataCenter())) - ranges = getPrimaryRangesWithinDC(keyspace); + if (option.isPrimaryRange()) + { + // when repairing only primary range, neither dataCenters nor hosts can be set + if (option.getDataCenters().isEmpty() && option.getHosts().isEmpty()) + option.getRanges().addAll(getPrimaryRanges(keyspace)); + // except dataCenters only contain local DC (i.e. -local) + else if (option.getDataCenters().size() == 1 && option.getDataCenters().contains(DatabaseDescriptor.getLocalDataCenter())) + option.getRanges().addAll(getPrimaryRangesWithinDC(keyspace)); + else + throw new IllegalArgumentException("You need to run primary range repair on all nodes in the cluster."); + } else - throw new IllegalArgumentException("You need to run primary range repair on all nodes in the cluster."); - } - else - { - ranges = getLocalRanges(keyspace); + { + option.getRanges().addAll(getLocalRanges(keyspace)); + } } - - return forceRepairAsync(keyspace, isSequential, dataCenters, hosts, ranges, fullRepair, columnFamilies); + return forceRepairAsync(keyspace, option); } - public int forceRepairAsync(String keyspace, boolean isSequential, Collection dataCenters, Collection hosts, Collection> ranges, boolean fullRepair, String... columnFamilies) + public int forceRepairAsync(String keyspace, + boolean isSequential, + Collection dataCenters, + Collection hosts, + boolean primaryRange, + boolean fullRepair, + String... columnFamilies) { - if (ranges.isEmpty() || Keyspace.open(keyspace).getReplicationStrategy().getReplicationFactor() < 2) - return 0; - - int cmd = nextRepairCommand.incrementAndGet(); - if (ranges.size() > 0) + if (!FBUtilities.isUnix() && isSequential) { - if (!FBUtilities.isUnix() && isSequential) - { - logger.warn("Snapshot-based repair is not yet supported on Windows. Reverting to parallel repair."); - isSequential = false; - } - new Thread(createRepairTask(cmd, keyspace, ranges, isSequential, dataCenters, hosts, fullRepair, columnFamilies)).start(); + logger.warn("Snapshot-based repair is not yet supported on Windows. Reverting to parallel repair."); + isSequential = false; } - return cmd; - } - public int forceRepairAsync(String keyspace, boolean isSequential, boolean isLocal, boolean primaryRange, boolean fullRepair, String... columnFamilies) - { - Collection> ranges; - if (primaryRange) + RepairOption options = new RepairOption(isSequential, primaryRange, !fullRepair, 1, Collections.>emptyList()); + if (dataCenters != null) { - ranges = isLocal ? getPrimaryRangesWithinDC(keyspace) : getPrimaryRanges(keyspace); + options.getDataCenters().addAll(dataCenters); } - else + if (hosts != null) { - ranges = getLocalRanges(keyspace); + options.getHosts().addAll(hosts); } - - return forceRepairAsync(keyspace, isSequential, isLocal, ranges, fullRepair, columnFamilies); + if (columnFamilies != null) + { + for (String columnFamily : columnFamilies) + { + options.getColumnFamilies().add(columnFamily); + } + } + return forceRepairAsync(keyspace, options); } - public int forceRepairAsync(final String keyspace, final boolean isSequential, final boolean isLocal, final Collection> ranges, final boolean fullRepair, final String... columnFamilies) + public int forceRepairAsync(String keyspace, + boolean isSequential, + boolean isLocal, + boolean primaryRange, + boolean fullRepair, + String... columnFamilies) { - if (ranges.isEmpty() || Keyspace.open(keyspace).getReplicationStrategy().getReplicationFactor() < 2) - return 0; - - int cmd = nextRepairCommand.incrementAndGet(); - new Thread(createRepairTask(cmd, keyspace, ranges, isSequential, isLocal, fullRepair, columnFamilies)).start(); - return cmd; + Set dataCenters = null; + if (isLocal) + { + dataCenters = Sets.newHashSet(DatabaseDescriptor.getLocalDataCenter()); + } + return forceRepairAsync(keyspace, isSequential, dataCenters, null, primaryRange, fullRepair, columnFamilies); } - public int forceRepairRangeAsync(String beginToken, String endToken, String keyspaceName, boolean isSequential, Collection dataCenters, Collection hosts, boolean fullRepair, String... columnFamilies) throws IOException + public int forceRepairRangeAsync(String beginToken, + String endToken, + String keyspaceName, + boolean isSequential, + Collection dataCenters, + Collection hosts, + boolean fullRepair, + String... columnFamilies) { + if (!FBUtilities.isUnix() && isSequential) + { + logger.warn("Snapshot-based repair is not yet supported on Windows. Reverting to parallel repair."); + isSequential = false; + } Collection> repairingRange = createRepairRangeFrom(beginToken, endToken); + RepairOption options = new RepairOption(isSequential, false, !fullRepair, 1, repairingRange); + options.getDataCenters().addAll(dataCenters); + if (hosts != null) + { + options.getHosts().addAll(hosts); + } + if (columnFamilies != null) + { + for (String columnFamily : columnFamilies) + { + options.getColumnFamilies().add(columnFamily); + } + } + logger.info("starting user-requested repair of range {} for keyspace {} and column families {}", repairingRange, keyspaceName, columnFamilies); - return forceRepairAsync(keyspaceName, isSequential, dataCenters, hosts, repairingRange, fullRepair, columnFamilies); + return forceRepairAsync(keyspaceName, options); } - public int forceRepairRangeAsync(String beginToken, String endToken, String keyspaceName, boolean isSequential, boolean isLocal, boolean fullRepair, String... columnFamilies) + public int forceRepairRangeAsync(String beginToken, + String endToken, + String keyspaceName, + boolean isSequential, + boolean isLocal, + boolean fullRepair, + String... columnFamilies) { - Collection> repairingRange = createRepairRangeFrom(beginToken, endToken); - - logger.info("starting user-requested repair of range {} for keyspace {} and column families {}", - repairingRange, keyspaceName, columnFamilies); - return forceRepairAsync(keyspaceName, isSequential, isLocal, repairingRange, fullRepair, columnFamilies); + Set dataCenters = null; + if (isLocal) + { + dataCenters = Sets.newHashSet(DatabaseDescriptor.getLocalDataCenter()); + } + return forceRepairRangeAsync(beginToken, endToken, keyspaceName, isSequential, dataCenters, null, fullRepair, columnFamilies); } /** @@ -2619,32 +2659,19 @@ Collection> createRepairRangeFrom(String beginToken, String endToke return repairingRange; } - private FutureTask createRepairTask(int cmd, - String keyspace, - Collection> ranges, - boolean isSequential, - boolean isLocal, - boolean fullRepair, - String... columnFamilies) + public int forceRepairAsync(String keyspace, RepairOption options) { - Set dataCenters = null; - if (isLocal) - { - dataCenters = Sets.newHashSet(DatabaseDescriptor.getLocalDataCenter()); - } - return createRepairTask(cmd, keyspace, ranges, isSequential, dataCenters, null, fullRepair, columnFamilies); + if (options.getRanges().isEmpty() || Keyspace.open(keyspace).getReplicationStrategy().getReplicationFactor() < 2) + return 0; + + int cmd = nextRepairCommand.incrementAndGet(); + new Thread(createRepairTask(cmd, keyspace, options)).start(); + return cmd; } - private FutureTask createRepairTask(final int cmd, - final String keyspace, - final Collection> ranges, - final boolean isSequential, - final Collection dataCenters, - final Collection hosts, - final boolean fullRepair, - final String... columnFamilies) + private FutureTask createRepairTask(final int cmd, final String keyspace, final RepairOption options) { - if (dataCenters != null && !dataCenters.contains(DatabaseDescriptor.getLocalDataCenter())) + if (!options.getDataCenters().isEmpty() && options.getDataCenters().contains(DatabaseDescriptor.getLocalDataCenter())) { throw new IllegalArgumentException("the local data center must be part of the repair"); } @@ -2653,11 +2680,12 @@ private FutureTask createRepairTask(final int cmd, { protected void runMayThrow() throws Exception { - String message = String.format("Starting repair command #%d, repairing %d ranges for keyspace %s (seq=%b, full=%b)", cmd, ranges.size(), keyspace, isSequential, fullRepair); + final long startTime = System.currentTimeMillis(); + String message = String.format("Starting repair command #%d, repairing keyspace %s with %s", cmd, keyspace, options); logger.info(message); sendNotification("repair", message, new int[]{cmd, ActiveRepairService.Status.STARTED.ordinal()}); - if (isSequential && !fullRepair) + if (options.isSequential() && options.isIncremental()) { message = "It is not possible to mix sequential repair and incremental repairs."; logger.error(message); @@ -2665,13 +2693,13 @@ protected void runMayThrow() throws Exception return; } - Set allNeighbors = new HashSet<>(); + final Set allNeighbors = new HashSet<>(); Map> rangeToNeighbors = new HashMap<>(); - for (Range range : ranges) + for (Range range : options.getRanges()) { try { - Set neighbors = ActiveRepairService.getNeighbors(keyspace, range, dataCenters, hosts); + Set neighbors = ActiveRepairService.getNeighbors(keyspace, range, options.getDataCenters(), options.getHosts()); rangeToNeighbors.put(range, neighbors); allNeighbors.addAll(neighbors); } @@ -2685,6 +2713,7 @@ protected void runMayThrow() throws Exception // Validate columnfamilies List columnFamilyStores = new ArrayList<>(); + String[] columnFamilies = options.getColumnFamilies().toArray(new String[options.getColumnFamilies().size()]); try { Iterables.addAll(columnFamilyStores, getValidColumnFamilies(false, false, keyspace, columnFamilies)); @@ -2695,12 +2724,14 @@ protected void runMayThrow() throws Exception return; } - UUID parentSession = null; - if (!fullRepair) + final UUID parentSession; + long repairedAt = ActiveRepairService.UNREPAIRED_SSTABLE; + if (options.isIncremental()) { try { - parentSession = ActiveRepairService.instance.prepareForRepair(allNeighbors, ranges, columnFamilyStores); + parentSession = ActiveRepairService.instance.prepareForRepair(allNeighbors, options.getRanges(), columnFamilyStores); + repairedAt = ActiveRepairService.instance.getParentRepairSession(parentSession).repairedAt; } catch (Throwable t) { @@ -2708,60 +2739,93 @@ protected void runMayThrow() throws Exception return; } } + else + { + parentSession = null; + } - List futures = new ArrayList<>(ranges.size()); + // Set up RepairJob executor for this repair command. + final ListeningExecutorService executor = MoreExecutors.listeningDecorator(new JMXConfigurableThreadPoolExecutor(options.getJobThreads(), + Integer.MAX_VALUE, + TimeUnit.SECONDS, + new LinkedBlockingQueue(), + new NamedThreadFactory("Repair#" + cmd), + "internal")); + + List> futures = new ArrayList<>(options.getRanges().size()); String[] cfnames = new String[columnFamilyStores.size()]; for (int i = 0; i < columnFamilyStores.size(); i++) { cfnames[i] = columnFamilyStores.get(i).name; } - for (Range range : ranges) + for (Range range : options.getRanges()) { - RepairFuture future = ActiveRepairService.instance.submitRepairSession(parentSession, range, keyspace, isSequential, rangeToNeighbors.get(range), cfnames); - if (future == null) + final RepairSession session = ActiveRepairService.instance.submitRepairSession(parentSession, + range, + keyspace, + options.isSequential(), + rangeToNeighbors.get(range), + repairedAt, + executor, + cfnames); + if (session == null) continue; - futures.add(future); - // wait for a session to be done with its differencing before starting the next one - try + // After repair session completes, notify client its result + Futures.addCallback(session, new FutureCallback>() { - future.session.differencingDone.await(); - } - catch (InterruptedException e) - { - message = "Interrupted while waiting for the differencing of repair session " + future.session + " to be done. Repair may be imprecise."; - logger.error(message, e); - sendNotification("repair", message, new int[]{cmd, ActiveRepairService.Status.SESSION_FAILED.ordinal()}); - } + public void onSuccess(List results) + { + String message = String.format("Repair session %s for range %s finished", session.getId(), session.getRange().toString()); + logger.info(message); + sendNotification("repair", message, new int[]{cmd, ActiveRepairService.Status.SESSION_SUCCESS.ordinal()}); + } + + public void onFailure(Throwable t) + { + String message = String.format("Repair session %s for range %s failed with error %s", session.getId(), session.getRange().toString(), t.getMessage()); + logger.error(message, t); + sendNotification("repair", message, new int[]{cmd, ActiveRepairService.Status.SESSION_FAILED.ordinal()}); + } + }); + futures.add(session); } - boolean successful = true; - for (RepairFuture future : futures) + // After all repair sessions completes(successful or not), + // run anticompaction if necessary and send finish notice back to client + ListenableFuture allSessions = Futures.allAsList(futures); + Futures.addCallback(allSessions, new FutureCallback() { - try + public void onSuccess(@Nullable Object result) { - future.get(); - message = String.format("Repair session %s for range %s finished", future.session.getId(), future.session.getRange().toString()); - logger.info(message); - sendNotification("repair", message, new int[]{cmd, ActiveRepairService.Status.SESSION_SUCCESS.ordinal()}); + if (options.isIncremental()) + { + try + { + ActiveRepairService.instance.finishParentSession(parentSession, allNeighbors); + } + catch (Exception e) + { + logger.error("Error in incremental repair", e); + } + } + repairComplete(); } - catch (ExecutionException e) + + public void onFailure(Throwable t) { - successful = false; - message = String.format("Repair session %s for range %s failed with error %s", future.session.getId(), future.session.getRange().toString(), e.getCause().getMessage()); - logger.error(message, e); - sendNotification("repair", message, new int[]{cmd, ActiveRepairService.Status.SESSION_FAILED.ordinal()}); + repairComplete(); } - catch (Exception e) + + private void repairComplete() { - successful = false; - message = String.format("Repair session %s for range %s failed with error %s", future.session.getId(), future.session.getRange().toString(), e.getMessage()); - logger.error(message, e); - sendNotification("repair", message, new int[]{cmd, ActiveRepairService.Status.SESSION_FAILED.ordinal()}); + String duration = DurationFormatUtils.formatDurationWords(System.currentTimeMillis() - startTime, true, true); + String message = String.format("Repair command #%d finished in %s", cmd, duration); + sendNotification("repair", message, + new int[]{cmd, ActiveRepairService.Status.FINISHED.ordinal()}); + logger.info(message); + executor.shutdownNow(); } - } - if (!fullRepair) - ActiveRepairService.instance.finishParentSession(parentSession, allNeighbors, successful); - sendNotification("repair", String.format("Repair command #%d finished", cmd), new int[]{cmd, ActiveRepairService.Status.FINISHED.ordinal()}); + }, MoreExecutors.sameThreadExecutor()); } }, null); } diff --git a/src/java/org/apache/cassandra/service/StorageServiceMBean.java b/src/java/org/apache/cassandra/service/StorageServiceMBean.java index cc54639fca2e..203d5dc6aff2 100644 --- a/src/java/org/apache/cassandra/service/StorageServiceMBean.java +++ b/src/java/org/apache/cassandra/service/StorageServiceMBean.java @@ -270,29 +270,22 @@ public interface StorageServiceMBean extends NotificationEmitter * type: "repair" * userObject: int array of length 2, [0]=command number, [1]=ordinal of AntiEntropyService.Status * + * @param keyspace Keyspace name to repair. Should not be null. + * @param options repair option. * @return Repair command number, or 0 if nothing to repair */ + public int repairAsync(String keyspace, Map options); + + @Deprecated public int forceRepairAsync(String keyspace, boolean isSequential, Collection dataCenters, Collection hosts, boolean primaryRange, boolean repairedAt, String... columnFamilies) throws IOException; - /** - * Same as forceRepairAsync, but handles a specified range - */ + @Deprecated public int forceRepairRangeAsync(String beginToken, String endToken, String keyspaceName, boolean isSequential, Collection dataCenters, Collection hosts, boolean repairedAt, String... columnFamilies) throws IOException; - /** - * Invoke repair asynchronously. - * You can track repair progress by subscribing JMX notification sent from this StorageServiceMBean. - * Notification format is: - * type: "repair" - * userObject: int array of length 2, [0]=command number, [1]=ordinal of AntiEntropyService.Status - * - * @return Repair command number, or 0 if nothing to repair - */ + @Deprecated public int forceRepairAsync(String keyspace, boolean isSequential, boolean isLocal, boolean primaryRange, boolean fullRepair, String... columnFamilies); - /** - * Same as forceRepairAsync, but handles a specified range - */ + @Deprecated public int forceRepairRangeAsync(String beginToken, String endToken, String keyspaceName, boolean isSequential, boolean isLocal, boolean repairedAt, String... columnFamilies); public void forceTerminateAllRepairSessions(); diff --git a/src/java/org/apache/cassandra/streaming/StreamReceiveTask.java b/src/java/org/apache/cassandra/streaming/StreamReceiveTask.java index 33da3d182f79..f26e43980ddc 100644 --- a/src/java/org/apache/cassandra/streaming/StreamReceiveTask.java +++ b/src/java/org/apache/cassandra/streaming/StreamReceiveTask.java @@ -21,16 +21,15 @@ import java.util.Collection; import java.util.List; import java.util.UUID; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; -import org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor; +import org.apache.cassandra.concurrent.NamedThreadFactory; import org.apache.cassandra.config.Schema; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.io.sstable.SSTableWriter; -import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.Pair; /** @@ -38,9 +37,7 @@ */ public class StreamReceiveTask extends StreamTask { - private static final ThreadPoolExecutor executor = DebuggableThreadPoolExecutor.createWithMaximumPoolSize("StreamReceiveTask", - FBUtilities.getAvailableProcessors(), - 60, TimeUnit.SECONDS); + private static final ExecutorService executor = Executors.newCachedThreadPool(new NamedThreadFactory("StreamReceiveTask")); // number of files to receive private final int totalFiles; diff --git a/src/java/org/apache/cassandra/tools/NodeProbe.java b/src/java/org/apache/cassandra/tools/NodeProbe.java index 70788fdf271f..8793e923a76e 100644 --- a/src/java/org/apache/cassandra/tools/NodeProbe.java +++ b/src/java/org/apache/cassandra/tools/NodeProbe.java @@ -43,6 +43,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Sets; +import com.google.common.util.concurrent.AbstractFuture; import com.yammer.metrics.reporting.JmxReporter; import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutorMBean; import org.apache.cassandra.db.ColumnFamilyStoreMBean; @@ -249,43 +250,15 @@ public void forceKeyspaceFlush(String keyspaceName, String... columnFamilies) th ssProxy.forceKeyspaceFlush(keyspaceName, columnFamilies); } - public void forceRepairAsync(final PrintStream out, final String keyspaceName, boolean isSequential, Collection dataCenters, Collection hosts, boolean primaryRange, boolean fullRepair, String... columnFamilies) throws IOException + public void repairAsync(final PrintStream out, final String keyspace, Map options) throws IOException { - RepairRunner runner = new RepairRunner(out, keyspaceName, columnFamilies); + RepairRunner runner = new RepairRunner(out, ssProxy, keyspace, options); try { jmxc.addConnectionNotificationListener(runner, null, null); ssProxy.addNotificationListener(runner, null, null); - if (!runner.repairAndWait(ssProxy, isSequential, dataCenters, hosts, primaryRange, fullRepair)) - failed = true; - } - catch (Exception e) - { - throw new IOException(e) ; - } - finally - { - try - { - ssProxy.removeNotificationListener(runner); - jmxc.removeConnectionNotificationListener(runner); - } - catch (Throwable t) - { - JVMStabilityInspector.inspectThrowable(t); - out.println("Exception occurred during clean-up. " + t); - } - } - } - - public void forceRepairRangeAsync(final PrintStream out, final String keyspaceName, boolean isSequential, Collection dataCenters, Collection hosts, final String startToken, final String endToken, boolean fullRepair, String... columnFamilies) throws IOException - { - RepairRunner runner = new RepairRunner(out, keyspaceName, columnFamilies); - try - { - jmxc.addConnectionNotificationListener(runner, null, null); - ssProxy.addNotificationListener(runner, null, null); - if (!runner.repairRangeAndWait(ssProxy, isSequential, dataCenters, hosts, startToken, endToken, fullRepair)) + runner.run(); + if (!runner.get()) failed = true; } catch (Exception e) @@ -1273,88 +1246,3 @@ public void remove() throw new UnsupportedOperationException(); } } - -class RepairRunner implements NotificationListener -{ - private final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS"); - private final Condition condition = new SimpleCondition(); - private final PrintStream out; - private final String keyspace; - private final String[] columnFamilies; - private int cmd; - private volatile boolean success = true; - private volatile Exception error = null; - - RepairRunner(PrintStream out, String keyspace, String... columnFamilies) - { - this.out = out; - this.keyspace = keyspace; - this.columnFamilies = columnFamilies; - } - - public boolean repairAndWait(StorageServiceMBean ssProxy, boolean isSequential, Collection dataCenters, Collection hosts, boolean primaryRangeOnly, boolean fullRepair) throws Exception - { - cmd = ssProxy.forceRepairAsync(keyspace, isSequential, dataCenters, hosts, primaryRangeOnly, fullRepair, columnFamilies); - waitForRepair(); - return success; - } - - public boolean repairRangeAndWait(StorageServiceMBean ssProxy, boolean isSequential, Collection dataCenters, Collection hosts, String startToken, String endToken, boolean fullRepair) throws Exception - { - cmd = ssProxy.forceRepairRangeAsync(startToken, endToken, keyspace, isSequential, dataCenters, hosts, fullRepair, columnFamilies); - waitForRepair(); - return success; - } - - private void waitForRepair() throws Exception - { - if (cmd > 0) - { - condition.await(); - } - else - { - String message = String.format("[%s] Nothing to repair for keyspace '%s'", format.format(System.currentTimeMillis()), keyspace); - out.println(message); - } - if (error != null) - { - throw error; - } - } - - public void handleNotification(Notification notification, Object handback) - { - if ("repair".equals(notification.getType())) - { - int[] status = (int[]) notification.getUserData(); - assert status.length == 2; - if (cmd == status[0]) - { - String message = String.format("[%s] %s", format.format(notification.getTimeStamp()), notification.getMessage()); - out.println(message); - // repair status is int array with [0] = cmd number, [1] = status - if (status[1] == ActiveRepairService.Status.SESSION_FAILED.ordinal()) - success = false; - else if (status[1] == ActiveRepairService.Status.FINISHED.ordinal()) - condition.signalAll(); - } - } - else if (JMXConnectionNotification.NOTIFS_LOST.equals(notification.getType())) - { - String message = String.format("[%s] Lost notification. You should check server log for repair status of keyspace %s", - format.format(notification.getTimeStamp()), - keyspace); - out.println(message); - } - else if (JMXConnectionNotification.FAILED.equals(notification.getType()) - || JMXConnectionNotification.CLOSED.equals(notification.getType())) - { - String message = String.format("JMX connection closed. You should check server log for repair status of keyspace %s" - + "(Subsequent keyspaces are not going to be repaired).", - keyspace); - error = new IOException(message); - condition.signalAll(); - } - } -} diff --git a/src/java/org/apache/cassandra/tools/NodeTool.java b/src/java/org/apache/cassandra/tools/NodeTool.java index 80b0b8f98941..18536bfe513b 100644 --- a/src/java/org/apache/cassandra/tools/NodeTool.java +++ b/src/java/org/apache/cassandra/tools/NodeTool.java @@ -37,6 +37,7 @@ import com.yammer.metrics.reporting.JmxReporter; import io.airlift.command.*; +import org.apache.commons.lang3.StringUtils; import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutorMBean; import org.apache.cassandra.config.Schema; @@ -48,6 +49,7 @@ import org.apache.cassandra.locator.EndpointSnitchInfoMBean; import org.apache.cassandra.locator.LocalStrategy; import org.apache.cassandra.net.MessagingServiceMBean; +import org.apache.cassandra.repair.messages.RepairOption; import org.apache.cassandra.service.CacheServiceMBean; import org.apache.cassandra.streaming.ProgressInfo; import org.apache.cassandra.streaming.SessionInfo; @@ -1677,6 +1679,11 @@ public static class Repair extends NodeToolCmd @Option(title = "full", name = {"-full", "--full"}, description = "Use -full to issue a full repair.") private boolean fullRepair = false; + @Option(title = "job_threads", name = {"-j", "--job-threads"}, description = "Number of threads to run repair jobs. " + + "Usually this means number of CFs to repair concurrently. " + + "WARNING: increasing this puts more load on repairing nodes, so be careful. (default: 1, max: 4)") + private int numJobThreads = 1; + @Override public void execute(NodeProbe probe) { @@ -1688,20 +1695,28 @@ public void execute(NodeProbe probe) for (String keyspace : keyspaces) { + Map options = new HashMap<>(); + options.put(RepairOption.SEQUENTIAL_KEY, Boolean.toString(sequential)); + options.put(RepairOption.PRIMARY_RANGE_KEY, Boolean.toString(primaryRange)); + options.put(RepairOption.INCREMENTAL_KEY, Boolean.toString(!fullRepair)); + options.put(RepairOption.JOB_THREADS_KEY, Integer.toString(numJobThreads)); + options.put(RepairOption.COLUMNFAMILIES_KEY, StringUtils.join(cfnames, ",")); + if (!startToken.isEmpty() || !endToken.isEmpty()) + { + options.put(RepairOption.RANGES_KEY, startToken + ":" + endToken); + } + if (localDC) + { + options.put(RepairOption.DATACENTERS_KEY, StringUtils.join(newArrayList(probe.getDataCenter()), ",")); + } + else + { + options.put(RepairOption.DATACENTERS_KEY, StringUtils.join(specificDataCenters, ",")); + } + options.put(RepairOption.HOSTS_KEY, StringUtils.join(specificHosts, ",")); try { - Collection dataCenters = null; - Collection hosts = null; - if (!specificDataCenters.isEmpty()) - dataCenters = newArrayList(specificDataCenters); - else if (localDC) - dataCenters = newArrayList(probe.getDataCenter()); - else if(!specificHosts.isEmpty()) - hosts = newArrayList(specificHosts); - if (!startToken.isEmpty() || !endToken.isEmpty()) - probe.forceRepairRangeAsync(System.out, keyspace, sequential, dataCenters,hosts, startToken, endToken, fullRepair); - else - probe.forceRepairAsync(System.out, keyspace, sequential, dataCenters, hosts, primaryRange, fullRepair, cfnames); + probe.repairAsync(System.out, keyspace, options); } catch (Exception e) { throw new RuntimeException("Error occurred during repair", e); diff --git a/src/java/org/apache/cassandra/tools/RepairRunner.java b/src/java/org/apache/cassandra/tools/RepairRunner.java new file mode 100644 index 000000000000..1898bb47e547 --- /dev/null +++ b/src/java/org/apache/cassandra/tools/RepairRunner.java @@ -0,0 +1,101 @@ +/* + * 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.tools; + +import java.io.IOException; +import java.io.PrintStream; +import java.text.SimpleDateFormat; +import java.util.Map; +import javax.management.Notification; +import javax.management.NotificationListener; +import javax.management.remote.JMXConnectionNotification; + +import com.google.common.util.concurrent.AbstractFuture; + +import org.apache.cassandra.service.ActiveRepairService; +import org.apache.cassandra.service.StorageServiceMBean; + +public class RepairRunner extends AbstractFuture implements Runnable, NotificationListener +{ + private final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS"); + + private final PrintStream out; + private final StorageServiceMBean ssProxy; + private final String keyspace; + private final Map options; + + private volatile int cmd; + private volatile boolean success; + + public RepairRunner(PrintStream out, StorageServiceMBean ssProxy, String keyspace, Map options) + { + this.out = out; + this.ssProxy = ssProxy; + this.keyspace = keyspace; + this.options = options; + } + + public void run() + { + cmd = ssProxy.repairAsync(keyspace, options); + if (cmd <= 0) + { + String message = String.format("[%s] Nothing to repair for keyspace '%s'", format.format(System.currentTimeMillis()), keyspace); + out.println(message); + set(true); + } + } + + public void handleNotification(Notification notification, Object handback) + { + if ("repair".equals(notification.getType())) + { + int[] status = (int[]) notification.getUserData(); + assert status.length == 2; + if (cmd == status[0]) + { + String message = String.format("[%s] %s", format.format(notification.getTimeStamp()), notification.getMessage()); + out.println(message); + // repair status is int array with [0] = cmd number, [1] = status + if (status[1] == ActiveRepairService.Status.SESSION_FAILED.ordinal()) + { + success = false; + } + else if (status[1] == ActiveRepairService.Status.FINISHED.ordinal()) + { + set(success); + } + } + } + else if (JMXConnectionNotification.NOTIFS_LOST.equals(notification.getType())) + { + String message = String.format("[%s] Lost notification. You should check server log for repair status of keyspace %s", + format.format(notification.getTimeStamp()), + keyspace); + out.println(message); + } + else if (JMXConnectionNotification.FAILED.equals(notification.getType()) + || JMXConnectionNotification.CLOSED.equals(notification.getType())) + { + String message = String.format("JMX connection closed. You should check server log for repair status of keyspace %s" + + "(Subsequent keyspaces are not going to be repaired).", + keyspace); + setException(new IOException(message)); + } + } +} diff --git a/test/unit/org/apache/cassandra/repair/DifferencerTest.java b/test/unit/org/apache/cassandra/repair/LocalSyncTaskTest.java similarity index 73% rename from test/unit/org/apache/cassandra/repair/DifferencerTest.java rename to test/unit/org/apache/cassandra/repair/LocalSyncTaskTest.java index e1ff26e77c82..b3d333a32e0a 100644 --- a/test/unit/org/apache/cassandra/repair/DifferencerTest.java +++ b/test/unit/org/apache/cassandra/repair/LocalSyncTaskTest.java @@ -23,7 +23,6 @@ import java.util.Set; import java.util.UUID; -import org.junit.After; import org.junit.BeforeClass; import org.junit.Test; @@ -36,20 +35,12 @@ import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; import org.apache.cassandra.locator.SimpleStrategy; -import org.apache.cassandra.net.MessageIn; -import org.apache.cassandra.net.MessageOut; -import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.service.ActiveRepairService; -import org.apache.cassandra.sink.IMessageSink; -import org.apache.cassandra.sink.SinkManager; -import org.apache.cassandra.repair.messages.RepairMessage; -import org.apache.cassandra.repair.messages.SyncComplete; import org.apache.cassandra.utils.MerkleTree; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -public class DifferencerTest +public class LocalSyncTaskTest extends SchemaLoader { private static final IPartitioner partirioner = new Murmur3Partitioner(); public static final String KEYSPACE1 = "DifferencerTest"; @@ -65,14 +56,8 @@ public static void defineSchema() throws Exception SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD)); } - @After - public void tearDown() - { - SinkManager.clear(); - } - /** - * When there is no difference between two, Differencer should respond SYNC_COMPLETE + * When there is no difference between two, LocalSyncTask should return stats with 0 difference. */ @Test public void testNoDifference() throws Throwable @@ -80,26 +65,6 @@ public void testNoDifference() throws Throwable final InetAddress ep1 = InetAddress.getByName("127.0.0.1"); final InetAddress ep2 = InetAddress.getByName("127.0.0.1"); - SinkManager.add(new IMessageSink() - { - @SuppressWarnings("unchecked") - public MessageOut handleMessage(MessageOut message, int id, InetAddress to) - { - if (message.verb == MessagingService.Verb.REPAIR_MESSAGE) - { - RepairMessage m = (RepairMessage) message.payload; - assertEquals(RepairMessage.Type.SYNC_COMPLETE, m.messageType); - // we should see SYNC_COMPLETE - assertEquals(new NodePair(ep1, ep2), ((SyncComplete)m).nodes); - } - return null; - } - - public MessageIn handleMessage(MessageIn message, int id, InetAddress to) - { - return null; - } - }); Range range = new Range<>(partirioner.getMinimumToken(), partirioner.getRandomToken()); RepairJobDesc desc = new RepairJobDesc(UUID.randomUUID(), UUID.randomUUID(), KEYSPACE1, "Standard1", range); @@ -110,10 +75,10 @@ public MessageIn handleMessage(MessageIn message, int id, InetAddress to) // note: we reuse the same endpoint which is bogus in theory but fine here TreeResponse r1 = new TreeResponse(ep1, tree1); TreeResponse r2 = new TreeResponse(ep2, tree2); - Differencer diff = new Differencer(desc, r1, r2); - diff.run(); + LocalSyncTask task = new LocalSyncTask(desc, r1, r2, ActiveRepairService.UNREPAIRED_SSTABLE); + task.run(); - assertTrue(diff.differences.isEmpty()); + assertEquals(0, task.get().numberOfDifferences); } @Test @@ -144,11 +109,11 @@ public void testDifference() throws Throwable // note: we reuse the same endpoint which is bogus in theory but fine here TreeResponse r1 = new TreeResponse(InetAddress.getByName("127.0.0.1"), tree1); TreeResponse r2 = new TreeResponse(InetAddress.getByName("127.0.0.2"), tree2); - Differencer diff = new Differencer(desc, r1, r2); - diff.run(); + LocalSyncTask task = new LocalSyncTask(desc, r1, r2, ActiveRepairService.UNREPAIRED_SSTABLE); + task.run(); // ensure that the changed range was recorded - assertEquals("Wrong differing ranges", interesting, new HashSet<>(diff.differences)); + assertEquals("Wrong differing ranges", interesting.size(), task.getCurrentStat().numberOfDifferences); } private MerkleTree createInitialTree(RepairJobDesc desc) diff --git a/test/unit/org/apache/cassandra/repair/RepairSessionTest.java b/test/unit/org/apache/cassandra/repair/RepairSessionTest.java new file mode 100644 index 000000000000..9811fcc70d23 --- /dev/null +++ b/test/unit/org/apache/cassandra/repair/RepairSessionTest.java @@ -0,0 +1,71 @@ +/* + * 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.repair; + +import java.io.IOException; +import java.net.InetAddress; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.ExecutionException; + +import com.google.common.collect.Sets; +import org.junit.Test; + +import org.apache.cassandra.dht.IPartitioner; +import org.apache.cassandra.dht.Murmur3Partitioner; +import org.apache.cassandra.dht.Range; +import org.apache.cassandra.dht.Token; +import org.apache.cassandra.gms.Gossiper; +import org.apache.cassandra.service.ActiveRepairService; +import org.apache.cassandra.utils.ByteBufferUtil; +import org.apache.cassandra.utils.UUIDGen; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +public class RepairSessionTest +{ + @Test + public void testConviction() throws Exception + { + InetAddress remote = InetAddress.getByName("127.0.0.2"); + Gossiper.instance.initializeNodeUnsafe(remote, UUID.randomUUID(), 1); + + // Set up RepairSession + UUID parentSessionId = UUIDGen.getTimeUUID(); + UUID sessionId = UUID.randomUUID(); + IPartitioner p = new Murmur3Partitioner(); + Range repairRange = new Range<>(p.getToken(ByteBufferUtil.bytes(0)), p.getToken(ByteBufferUtil.bytes(100)), p); + Set endpoints = Sets.newHashSet(remote); + RepairSession session = new RepairSession(parentSessionId, sessionId, repairRange, "Keyspace1", true, endpoints, ActiveRepairService.UNREPAIRED_SSTABLE, "Standard1"); + + // perform convict + session.convict(remote, Double.MAX_VALUE); + + // RepairSession should throw ExecutorException with the cause of IOException when getting its value + try + { + session.get(); + fail(); + } + catch (ExecutionException ex) + { + assertEquals(IOException.class, ex.getCause().getClass()); + } + } +} diff --git a/test/unit/org/apache/cassandra/repair/messages/RepairOptionTest.java b/test/unit/org/apache/cassandra/repair/messages/RepairOptionTest.java new file mode 100644 index 000000000000..59ad8a3a1bc1 --- /dev/null +++ b/test/unit/org/apache/cassandra/repair/messages/RepairOptionTest.java @@ -0,0 +1,88 @@ +/* + * 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.repair.messages; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import com.google.common.collect.Iterables; +import org.junit.Test; + +import org.apache.cassandra.dht.IPartitioner; +import org.apache.cassandra.dht.Murmur3Partitioner; +import org.apache.cassandra.dht.Range; +import org.apache.cassandra.dht.Token; + +import static org.junit.Assert.*; + +public class RepairOptionTest +{ + @Test + public void testParseOptions() + { + IPartitioner partitioner = new Murmur3Partitioner(); + Token.TokenFactory tokenFactory = partitioner.getTokenFactory(); + + // parse with empty options + RepairOption option = RepairOption.parse(new HashMap(), partitioner); + assertTrue(option.isSequential()); + assertFalse(option.isPrimaryRange()); + assertFalse(option.isIncremental()); + + // parse everything + Map options = new HashMap<>(); + options.put(RepairOption.SEQUENTIAL_KEY, "false"); + options.put(RepairOption.PRIMARY_RANGE_KEY, "false"); + options.put(RepairOption.INCREMENTAL_KEY, "true"); + options.put(RepairOption.RANGES_KEY, "0:10,11:20,21:30"); + options.put(RepairOption.COLUMNFAMILIES_KEY, "cf1,cf2,cf3"); + options.put(RepairOption.DATACENTERS_KEY, "dc1,dc2,dc3"); + options.put(RepairOption.HOSTS_KEY, "127.0.0.1,127.0.0.2,127.0.0.3"); + + option = RepairOption.parse(options, partitioner); + assertFalse(option.isSequential()); + assertFalse(option.isPrimaryRange()); + assertTrue(option.isIncremental()); + + Set> expectedRanges = new HashSet<>(3); + expectedRanges.add(new Range<>(tokenFactory.fromString("0"), tokenFactory.fromString("10"))); + expectedRanges.add(new Range<>(tokenFactory.fromString("11"), tokenFactory.fromString("20"))); + expectedRanges.add(new Range<>(tokenFactory.fromString("21"), tokenFactory.fromString("30"))); + assertEquals(expectedRanges, option.getRanges()); + + Set expectedCFs = new HashSet<>(3); + expectedCFs.add("cf1"); + expectedCFs.add("cf2"); + expectedCFs.add("cf3"); + assertEquals(expectedCFs, option.getColumnFamilies()); + + Set expectedDCs = new HashSet<>(3); + expectedDCs.add("dc1"); + expectedDCs.add("dc2"); + expectedDCs.add("dc3"); + assertEquals(expectedDCs, option.getDataCenters()); + + Set expectedHosts = new HashSet<>(3); + expectedHosts.add("127.0.0.1"); + expectedHosts.add("127.0.0.2"); + expectedHosts.add("127.0.0.3"); + assertEquals(expectedHosts, option.getHosts()); + } +} diff --git a/test/unit/org/apache/cassandra/service/AntiEntropyServiceTestAbstract.java b/test/unit/org/apache/cassandra/service/ActiveRepairServiceTest.java similarity index 62% rename from test/unit/org/apache/cassandra/service/AntiEntropyServiceTestAbstract.java rename to test/unit/org/apache/cassandra/service/ActiveRepairServiceTest.java index efa47c10d4ef..dab45f91cf4c 100644 --- a/test/unit/org/apache/cassandra/service/AntiEntropyServiceTestAbstract.java +++ b/test/unit/org/apache/cassandra/service/ActiveRepairServiceTest.java @@ -20,60 +20,39 @@ import java.net.InetAddress; import java.util.*; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.TimeUnit; import com.google.common.collect.Sets; -import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; -import org.apache.cassandra.config.KSMetaData; -import org.apache.cassandra.concurrent.Stage; -import org.apache.cassandra.concurrent.StageManager; import org.apache.cassandra.config.DatabaseDescriptor; +import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.ColumnFamilyStore; -import org.apache.cassandra.db.IMutation; import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.gms.Gossiper; import org.apache.cassandra.locator.AbstractReplicationStrategy; -import org.apache.cassandra.locator.TokenMetadata; import org.apache.cassandra.locator.SimpleStrategy; -import org.apache.cassandra.net.MessagingService; -import org.apache.cassandra.repair.RepairJobDesc; +import org.apache.cassandra.locator.TokenMetadata; import org.apache.cassandra.utils.FBUtilities; import static org.junit.Assert.assertEquals; -public abstract class AntiEntropyServiceTestAbstract +public class ActiveRepairServiceTest { - // keyspace and column family to test against - public ActiveRepairService aes; + public static final String KEYSPACE5 = "Keyspace5"; + public static final String CF_STANDRAD1 = "Standard1"; + public static final String CF_COUNTER = "Counter1"; - public String keyspaceName; public String cfname; - public RepairJobDesc desc; public ColumnFamilyStore store; public InetAddress LOCAL, REMOTE; - public Range local_range; - private boolean initialized; - public abstract void init(); - - public abstract List getWriteData(); - - public static final String KEYSPACE5 = "Keyspace5"; - public static final String CF_STANDRAD1 = "Standard1"; - public static final String CF_COUNTER = "Counter1"; - @BeforeClass public static void defineSchema() throws ConfigurationException { @@ -93,57 +72,29 @@ public void prepare() throws Exception SchemaLoader.startGossiper(); initialized = true; - init(); - LOCAL = FBUtilities.getBroadcastAddress(); // generate a fake endpoint for which we can spoof receiving/sending trees REMOTE = InetAddress.getByName("127.0.0.2"); - store = null; - for (ColumnFamilyStore cfs : Keyspace.open(keyspaceName).getColumnFamilyStores()) - { - if (cfs.name.equals(cfname)) - { - store = cfs; - break; - } - } - assert store != null : "CF not found: " + cfname; } - aes = ActiveRepairService.instance; TokenMetadata tmd = StorageService.instance.getTokenMetadata(); tmd.clearUnsafe(); StorageService.instance.setTokens(Collections.singleton(StorageService.getPartitioner().getRandomToken())); tmd.updateNormalToken(StorageService.getPartitioner().getMinimumToken(), REMOTE); assert tmd.isMember(REMOTE); - - MessagingService.instance().setVersion(REMOTE, MessagingService.current_version); - Gossiper.instance.initializeNodeUnsafe(REMOTE, UUID.randomUUID(), 1); - - local_range = StorageService.instance.getPrimaryRangesForEndpoint(keyspaceName, LOCAL).iterator().next(); - - desc = new RepairJobDesc(UUID.randomUUID(), UUID.randomUUID(), keyspaceName, cfname, local_range); - // Set a fake session corresponding to this fake request - ActiveRepairService.instance.submitArtificialRepairSession(desc); - } - - @After - public void teardown() throws Exception - { - flushAES(); } @Test public void testGetNeighborsPlusOne() throws Throwable { // generate rf+1 nodes, and ensure that all nodes are returned - Set expected = addTokens(1 + Keyspace.open(keyspaceName).getReplicationStrategy().getReplicationFactor()); + Set expected = addTokens(1 + Keyspace.open(KEYSPACE5).getReplicationStrategy().getReplicationFactor()); expected.remove(FBUtilities.getBroadcastAddress()); - Collection> ranges = StorageService.instance.getLocalRanges(keyspaceName); - Set neighbors = new HashSet(); + Collection> ranges = StorageService.instance.getLocalRanges(KEYSPACE5); + Set neighbors = new HashSet<>(); for (Range range : ranges) { - neighbors.addAll(ActiveRepairService.getNeighbors(keyspaceName, range, null, null)); + neighbors.addAll(ActiveRepairService.getNeighbors(KEYSPACE5, range, null, null)); } assertEquals(expected, neighbors); } @@ -154,19 +105,19 @@ public void testGetNeighborsTimesTwo() throws Throwable TokenMetadata tmd = StorageService.instance.getTokenMetadata(); // generate rf*2 nodes, and ensure that only neighbors specified by the ARS are returned - addTokens(2 * Keyspace.open(keyspaceName).getReplicationStrategy().getReplicationFactor()); - AbstractReplicationStrategy ars = Keyspace.open(keyspaceName).getReplicationStrategy(); - Set expected = new HashSet(); + addTokens(2 * Keyspace.open(KEYSPACE5).getReplicationStrategy().getReplicationFactor()); + AbstractReplicationStrategy ars = Keyspace.open(KEYSPACE5).getReplicationStrategy(); + Set expected = new HashSet<>(); for (Range replicaRange : ars.getAddressRanges().get(FBUtilities.getBroadcastAddress())) { expected.addAll(ars.getRangeAddresses(tmd.cloneOnlyTokenMap()).get(replicaRange)); } expected.remove(FBUtilities.getBroadcastAddress()); - Collection> ranges = StorageService.instance.getLocalRanges(keyspaceName); - Set neighbors = new HashSet(); + Collection> ranges = StorageService.instance.getLocalRanges(KEYSPACE5); + Set neighbors = new HashSet<>(); for (Range range : ranges) { - neighbors.addAll(ActiveRepairService.getNeighbors(keyspaceName, range, null, null)); + neighbors.addAll(ActiveRepairService.getNeighbors(KEYSPACE5, range, null, null)); } assertEquals(expected, neighbors); } @@ -175,20 +126,20 @@ public void testGetNeighborsTimesTwo() throws Throwable public void testGetNeighborsPlusOneInLocalDC() throws Throwable { TokenMetadata tmd = StorageService.instance.getTokenMetadata(); - + // generate rf+1 nodes, and ensure that all nodes are returned - Set expected = addTokens(1 + Keyspace.open(keyspaceName).getReplicationStrategy().getReplicationFactor()); + Set expected = addTokens(1 + Keyspace.open(KEYSPACE5).getReplicationStrategy().getReplicationFactor()); expected.remove(FBUtilities.getBroadcastAddress()); // remove remote endpoints TokenMetadata.Topology topology = tmd.cloneOnlyTokenMap().getTopology(); HashSet localEndpoints = Sets.newHashSet(topology.getDatacenterEndpoints().get(DatabaseDescriptor.getLocalDataCenter())); expected = Sets.intersection(expected, localEndpoints); - Collection> ranges = StorageService.instance.getLocalRanges(keyspaceName); - Set neighbors = new HashSet(); + Collection> ranges = StorageService.instance.getLocalRanges(KEYSPACE5); + Set neighbors = new HashSet<>(); for (Range range : ranges) { - neighbors.addAll(ActiveRepairService.getNeighbors(keyspaceName, range, Arrays.asList(DatabaseDescriptor.getLocalDataCenter()), null)); + neighbors.addAll(ActiveRepairService.getNeighbors(KEYSPACE5, range, Arrays.asList(DatabaseDescriptor.getLocalDataCenter()), null)); } assertEquals(expected, neighbors); } @@ -199,9 +150,9 @@ public void testGetNeighborsTimesTwoInLocalDC() throws Throwable TokenMetadata tmd = StorageService.instance.getTokenMetadata(); // generate rf*2 nodes, and ensure that only neighbors specified by the ARS are returned - addTokens(2 * Keyspace.open(keyspaceName).getReplicationStrategy().getReplicationFactor()); - AbstractReplicationStrategy ars = Keyspace.open(keyspaceName).getReplicationStrategy(); - Set expected = new HashSet(); + addTokens(2 * Keyspace.open(KEYSPACE5).getReplicationStrategy().getReplicationFactor()); + AbstractReplicationStrategy ars = Keyspace.open(KEYSPACE5).getReplicationStrategy(); + Set expected = new HashSet<>(); for (Range replicaRange : ars.getAddressRanges().get(FBUtilities.getBroadcastAddress())) { expected.addAll(ars.getRangeAddresses(tmd.cloneOnlyTokenMap()).get(replicaRange)); @@ -211,12 +162,12 @@ public void testGetNeighborsTimesTwoInLocalDC() throws Throwable TokenMetadata.Topology topology = tmd.cloneOnlyTokenMap().getTopology(); HashSet localEndpoints = Sets.newHashSet(topology.getDatacenterEndpoints().get(DatabaseDescriptor.getLocalDataCenter())); expected = Sets.intersection(expected, localEndpoints); - - Collection> ranges = StorageService.instance.getLocalRanges(keyspaceName); - Set neighbors = new HashSet(); + + Collection> ranges = StorageService.instance.getLocalRanges(KEYSPACE5); + Set neighbors = new HashSet<>(); for (Range range : ranges) { - neighbors.addAll(ActiveRepairService.getNeighbors(keyspaceName, range, Arrays.asList(DatabaseDescriptor.getLocalDataCenter()), null)); + neighbors.addAll(ActiveRepairService.getNeighbors(KEYSPACE5, range, Arrays.asList(DatabaseDescriptor.getLocalDataCenter()), null)); } assertEquals(expected, neighbors); } @@ -227,8 +178,8 @@ public void testGetNeighborsTimesTwoInSpecifiedHosts() throws Throwable TokenMetadata tmd = StorageService.instance.getTokenMetadata(); // generate rf*2 nodes, and ensure that only neighbors specified by the hosts are returned - addTokens(2 * Keyspace.open(keyspaceName).getReplicationStrategy().getReplicationFactor()); - AbstractReplicationStrategy ars = Keyspace.open(keyspaceName).getReplicationStrategy(); + addTokens(2 * Keyspace.open(KEYSPACE5).getReplicationStrategy().getReplicationFactor()); + AbstractReplicationStrategy ars = Keyspace.open(KEYSPACE5).getReplicationStrategy(); List expected = new ArrayList<>(); for (Range replicaRange : ars.getAddressRanges().get(FBUtilities.getBroadcastAddress())) { @@ -238,22 +189,24 @@ public void testGetNeighborsTimesTwoInSpecifiedHosts() throws Throwable expected.remove(FBUtilities.getBroadcastAddress()); Collection hosts = Arrays.asList(FBUtilities.getBroadcastAddress().getCanonicalHostName(),expected.get(0).getCanonicalHostName()); - assertEquals(expected.get(0), ActiveRepairService.getNeighbors(keyspaceName, StorageService.instance.getLocalRanges(keyspaceName).iterator().next(), null, hosts).iterator().next()); + assertEquals(expected.get(0), ActiveRepairService.getNeighbors(KEYSPACE5, + StorageService.instance.getLocalRanges(KEYSPACE5).iterator().next(), + null, hosts).iterator().next()); } @Test(expected = IllegalArgumentException.class) public void testGetNeighborsSpecifiedHostsWithNoLocalHost() throws Throwable { - addTokens(2 * Keyspace.open(keyspaceName).getReplicationStrategy().getReplicationFactor()); + addTokens(2 * Keyspace.open(KEYSPACE5).getReplicationStrategy().getReplicationFactor()); //Dont give local endpoint Collection hosts = Arrays.asList("127.0.0.3"); - ActiveRepairService.getNeighbors(keyspaceName, StorageService.instance.getLocalRanges(keyspaceName).iterator().next(), null, hosts); + ActiveRepairService.getNeighbors(KEYSPACE5, StorageService.instance.getLocalRanges(KEYSPACE5).iterator().next(), null, hosts); } Set addTokens(int max) throws Throwable { TokenMetadata tmd = StorageService.instance.getTokenMetadata(); - Set endpoints = new HashSet(); + Set endpoints = new HashSet<>(); for (int i = 1; i <= max; i++) { InetAddress endpoint = InetAddress.getByName("127.0.0." + i); @@ -262,21 +215,4 @@ Set addTokens(int max) throws Throwable } return endpoints; } - - void flushAES() throws Exception - { - final ExecutorService stage = StageManager.getStage(Stage.ANTI_ENTROPY); - final Callable noop = new Callable() - { - public Boolean call() - { - return true; - } - }; - - // send two tasks through the stage: one to follow existing tasks and a second to follow tasks created by - // those existing tasks: tasks won't recursively create more tasks - stage.submit(noop).get(5000, TimeUnit.MILLISECONDS); - stage.submit(noop).get(5000, TimeUnit.MILLISECONDS); - } } diff --git a/test/unit/org/apache/cassandra/service/AntiEntropyServiceCounterTest.java b/test/unit/org/apache/cassandra/service/AntiEntropyServiceCounterTest.java deleted file mode 100644 index 3f1c3aac9b2b..000000000000 --- a/test/unit/org/apache/cassandra/service/AntiEntropyServiceCounterTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.apache.cassandra.service; -/* - * - * 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. - * - */ - -import java.util.List; -import java.util.LinkedList; - -import org.apache.cassandra.db.*; -import org.apache.cassandra.db.composites.CellNames; -import org.apache.cassandra.utils.ByteBufferUtil; -import org.apache.cassandra.db.ConsistencyLevel; - -public class AntiEntropyServiceCounterTest extends AntiEntropyServiceTestAbstract -{ - public void init() - { - keyspaceName = AntiEntropyServiceTestAbstract.KEYSPACE5; - cfname = AntiEntropyServiceTestAbstract.CF_COUNTER;; - } - - public List getWriteData() - { - List rms = new LinkedList(); - Mutation rm = new Mutation(keyspaceName, ByteBufferUtil.bytes("key1")); - rm.addCounter(cfname, CellNames.simpleDense(ByteBufferUtil.bytes("Column1")), 42); - rms.add(new CounterMutation(rm, ConsistencyLevel.ONE)); - return rms; - } -} diff --git a/test/unit/org/apache/cassandra/service/AntiEntropyServiceStandardTest.java b/test/unit/org/apache/cassandra/service/AntiEntropyServiceStandardTest.java deleted file mode 100644 index c83a7301f991..000000000000 --- a/test/unit/org/apache/cassandra/service/AntiEntropyServiceStandardTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.apache.cassandra.service; -/* - * - * 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. - * - */ - -import java.util.List; -import java.util.LinkedList; - -import org.apache.cassandra.Util; -import org.apache.cassandra.db.*; -import org.apache.cassandra.utils.ByteBufferUtil; - -public class AntiEntropyServiceStandardTest extends AntiEntropyServiceTestAbstract -{ - public void init() - { - keyspaceName = AntiEntropyServiceStandardTest.KEYSPACE5; - cfname = AntiEntropyServiceStandardTest.CF_STANDRAD1; - } - - public List getWriteData() - { - List rms = new LinkedList(); - Mutation rm; - rm = new Mutation(keyspaceName, ByteBufferUtil.bytes("key1")); - rm.add(cfname, Util.cellname("Column1"), ByteBufferUtil.bytes("asdfasdf"), 0); - rms.add(rm); - return rms; - } -} From 0de0b8c0372e825e834b1ffd9685d3db87d21378 Mon Sep 17 00:00:00 2001 From: Marcus Eriksson Date: Tue, 7 Oct 2014 07:35:53 +0200 Subject: [PATCH 157/557] Keep sstable level when bootstrapping Patch by marcuse; reviewed by iamaleksey for CASSANDRA-7460 --- CHANGES.txt | 1 + .../cassandra/db/compaction/LeveledManifest.java | 14 ++++++++++++++ .../org/apache/cassandra/dht/RangeStreamer.java | 8 ++------ .../cassandra/io/sstable/SSTableLoader.java | 2 +- .../cassandra/io/sstable/SSTableWriter.java | 10 ++++++++-- .../net/IncomingStreamingConnection.java | 2 +- .../apache/cassandra/repair/LocalSyncTask.java | 2 +- .../cassandra/repair/StreamingRepairTask.java | 2 +- .../cassandra/streaming/ConnectionHandler.java | 3 ++- .../cassandra/streaming/StreamCoordinator.java | 8 +++++--- .../apache/cassandra/streaming/StreamPlan.java | 11 ++++++++--- .../apache/cassandra/streaming/StreamReader.java | 7 ++++--- .../cassandra/streaming/StreamResultFuture.java | 9 +++++---- .../cassandra/streaming/StreamSession.java | 9 ++++++++- .../cassandra/streaming/StreamTransferTask.java | 2 +- .../streaming/messages/FileMessageHeader.java | 11 +++++++++-- .../streaming/messages/OutgoingFileMessage.java | 5 +++-- .../streaming/messages/StreamInitMessage.java | 9 +++++++-- .../streaming/messages/StreamMessage.java | 2 +- .../apache/cassandra/tools/SSTableImport.java | 4 ++-- .../cassandra/io/sstable/SSTableUtils.java | 2 +- .../streaming/StreamTransferTaskTest.java | 2 +- .../cassandra/tools/SSTableExportTest.java | 16 ++++++++-------- 23 files changed, 94 insertions(+), 47 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index f602c0ed3348..b6a3766331f0 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0 + * Keep sstable levels when bootstrapping (CASSANDRA-7460) * Add Sigar library and perform basic OS settings check on startup (CASSANDRA-7838) * Support for scripting languages in user-defined functions (CASSANDRA-7526) * Support for aggregation functions (CASSANDRA-4914) diff --git a/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java b/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java index a0836a87d623..6d3bf6975ef9 100644 --- a/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java +++ b/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java @@ -38,6 +38,7 @@ import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; import org.apache.cassandra.io.sstable.*; +import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.Pair; public class LeveledManifest @@ -330,6 +331,19 @@ public synchronized CompactionCandidate getCompactionCandidates() return new CompactionCandidate(unrepairedMostInterresting, 0, Long.MAX_VALUE); } } + + // during bootstrap we only do size tiering in L0 to make sure + // the streamed files can be placed in their original levels + if (StorageService.instance.isBootstrapMode()) + { + List mostInteresting = getSSTablesForSTCS(getLevel(0)); + if (!mostInteresting.isEmpty()) + { + logger.info("Bootstrapping - doing STCS in L0"); + return new CompactionCandidate(mostInteresting, 0, Long.MAX_VALUE); + } + return null; + } // LevelDB gives each level a score of how much data it contains vs its ideal amount, and // compacts the level with the highest score. But this falls apart spectacularly once you // get behind. Consider this set of levels: diff --git a/src/java/org/apache/cassandra/dht/RangeStreamer.java b/src/java/org/apache/cassandra/dht/RangeStreamer.java index be58d77f7cba..388834f4f54d 100644 --- a/src/java/org/apache/cassandra/dht/RangeStreamer.java +++ b/src/java/org/apache/cassandra/dht/RangeStreamer.java @@ -109,16 +109,12 @@ public RangeStreamer(TokenMetadata metadata, Collection tokens, InetAddre this.tokens = tokens; this.address = address; this.description = description; - this.streamPlan = new StreamPlan(description); + this.streamPlan = new StreamPlan(description, true); } public RangeStreamer(TokenMetadata metadata, InetAddress address, String description) { - this.metadata = metadata; - this.tokens = null; - this.address = address; - this.description = description; - this.streamPlan = new StreamPlan(description); + this(metadata, null, address, description); } public void addSourceFilter(ISourceFilter filter) diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableLoader.java b/src/java/org/apache/cassandra/io/sstable/SSTableLoader.java index fbd583cc6402..991fa1de5e7e 100644 --- a/src/java/org/apache/cassandra/io/sstable/SSTableLoader.java +++ b/src/java/org/apache/cassandra/io/sstable/SSTableLoader.java @@ -157,7 +157,7 @@ public StreamResultFuture stream(Set toIgnore, StreamEventHandler.. client.init(keyspace); outputHandler.output("Established connection to initial hosts"); - StreamPlan plan = new StreamPlan("Bulk Load", 0, connectionsPerHost).connectionFactory(client.getConnectionFactory()); + StreamPlan plan = new StreamPlan("Bulk Load", 0, connectionsPerHost, false).connectionFactory(client.getConnectionFactory()); Map>> endpointToRanges = client.getEndpointToRangesMap(); openSSTables(endpointToRanges); diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java b/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java index b5e7d02fb8de..ef8cd5117c3b 100644 --- a/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java +++ b/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java @@ -62,6 +62,7 @@ import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.io.util.SegmentedFile; import org.apache.cassandra.io.util.SequentialWriter; +import org.apache.cassandra.service.ActiveRepairService; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FilterFactory; @@ -84,14 +85,19 @@ public class SSTableWriter extends SSTable private final MetadataCollector sstableMetadataCollector; private final long repairedAt; - public SSTableWriter(String filename, long keyCount, long repairedAt) + public SSTableWriter(String filename, long keyCount, long repairedAt, int sstableLevel) { this(filename, keyCount, repairedAt, Schema.instance.getCFMetaData(Descriptor.fromFilename(filename)), StorageService.getPartitioner(), - new MetadataCollector(Schema.instance.getCFMetaData(Descriptor.fromFilename(filename)).comparator)); + new MetadataCollector(Schema.instance.getCFMetaData(Descriptor.fromFilename(filename)).comparator).sstableLevel(sstableLevel)); + } + + public SSTableWriter(String filename, long keyCount) + { + this(filename, keyCount, ActiveRepairService.UNREPAIRED_SSTABLE, 0); } private static Set components(CFMetaData metadata) diff --git a/src/java/org/apache/cassandra/net/IncomingStreamingConnection.java b/src/java/org/apache/cassandra/net/IncomingStreamingConnection.java index 003bbf9c6fa1..de18d50c3a99 100644 --- a/src/java/org/apache/cassandra/net/IncomingStreamingConnection.java +++ b/src/java/org/apache/cassandra/net/IncomingStreamingConnection.java @@ -62,7 +62,7 @@ public void run() // The receiving side distinguish two connections by looking at StreamInitMessage#isForOutgoing. // Note: we cannot use the same socket for incoming and outgoing streams because we want to // parallelize said streams and the socket is blocking, so we might deadlock. - StreamResultFuture.initReceivingSide(init.sessionIndex, init.planId, init.description, init.from, socket, init.isForOutgoing, version); + StreamResultFuture.initReceivingSide(init.sessionIndex, init.planId, init.description, init.from, socket, init.isForOutgoing, version, init.keepSSTableLevel); } catch (IOException e) { diff --git a/src/java/org/apache/cassandra/repair/LocalSyncTask.java b/src/java/org/apache/cassandra/repair/LocalSyncTask.java index 38f63ce9721e..b34c5084b82f 100644 --- a/src/java/org/apache/cassandra/repair/LocalSyncTask.java +++ b/src/java/org/apache/cassandra/repair/LocalSyncTask.java @@ -57,7 +57,7 @@ protected void startSync(List> differences) InetAddress dst = r2.endpoint.equals(local) ? r1.endpoint : r2.endpoint; logger.info(String.format("[repair #%s] Performing streaming repair of %d ranges with %s", desc.sessionId, differences.size(), dst)); - new StreamPlan("Repair", repairedAt, 1).listeners(this) + new StreamPlan("Repair", repairedAt, 1, false).listeners(this) .flushBeforeTransfer(true) // request ranges from the remote node .requestRanges(dst, desc.keyspace, differences, desc.columnFamily) diff --git a/src/java/org/apache/cassandra/repair/StreamingRepairTask.java b/src/java/org/apache/cassandra/repair/StreamingRepairTask.java index f30eb6fca666..147272028123 100644 --- a/src/java/org/apache/cassandra/repair/StreamingRepairTask.java +++ b/src/java/org/apache/cassandra/repair/StreamingRepairTask.java @@ -50,7 +50,7 @@ public StreamingRepairTask(RepairJobDesc desc, SyncRequest request, long repaire public void run() { logger.info(String.format("[streaming task #%s] Performing streaming repair of %d ranges with %s", desc.sessionId, request.ranges.size(), request.dst)); - new StreamPlan("Repair", repairedAt, 1).listeners(this) + new StreamPlan("Repair", repairedAt, 1, false).listeners(this) .flushBeforeTransfer(true) // request ranges from the remote node .requestRanges(request.dst, desc.keyspace, request.ranges, desc.columnFamily) diff --git a/src/java/org/apache/cassandra/streaming/ConnectionHandler.java b/src/java/org/apache/cassandra/streaming/ConnectionHandler.java index 6092046c149d..7a7ccbf8be93 100644 --- a/src/java/org/apache/cassandra/streaming/ConnectionHandler.java +++ b/src/java/org/apache/cassandra/streaming/ConnectionHandler.java @@ -179,7 +179,8 @@ public void sendInitMessage(Socket socket, boolean isForOutgoing) throws IOExcep session.sessionIndex(), session.planId(), session.description(), - isForOutgoing); + isForOutgoing, + session.keepSSTableLevel()); ByteBuffer messageBuf = message.createMessage(false, protocolVersion); getWriteChannel(socket).write(messageBuf); } diff --git a/src/java/org/apache/cassandra/streaming/StreamCoordinator.java b/src/java/org/apache/cassandra/streaming/StreamCoordinator.java index 71a853cc4d4c..130bd454e80d 100644 --- a/src/java/org/apache/cassandra/streaming/StreamCoordinator.java +++ b/src/java/org/apache/cassandra/streaming/StreamCoordinator.java @@ -45,11 +45,13 @@ public class StreamCoordinator private Map peerSessions = new HashMap<>(); private final int connectionsPerHost; private StreamConnectionFactory factory; + private final boolean keepSSTableLevel; - public StreamCoordinator(int connectionsPerHost, StreamConnectionFactory factory) + public StreamCoordinator(int connectionsPerHost, boolean keepSSTableLevel, StreamConnectionFactory factory) { this.connectionsPerHost = connectionsPerHost; this.factory = factory; + this.keepSSTableLevel = keepSSTableLevel; } public void setConnectionFactory(StreamConnectionFactory factory) @@ -233,7 +235,7 @@ public StreamSession getOrCreateNextSession(InetAddress peer) // create if (streamSessions.size() < connectionsPerHost) { - StreamSession session = new StreamSession(peer, factory, streamSessions.size()); + StreamSession session = new StreamSession(peer, factory, streamSessions.size(), keepSSTableLevel); streamSessions.put(++lastReturned, session); return session; } @@ -265,7 +267,7 @@ public StreamSession getOrCreateSessionById(InetAddress peer, int id) StreamSession session = streamSessions.get(id); if (session == null) { - session = new StreamSession(peer, factory, id); + session = new StreamSession(peer, factory, id, keepSSTableLevel); streamSessions.put(id, session); } return session; diff --git a/src/java/org/apache/cassandra/streaming/StreamPlan.java b/src/java/org/apache/cassandra/streaming/StreamPlan.java index ca448a354179..5aa1bc630e6f 100644 --- a/src/java/org/apache/cassandra/streaming/StreamPlan.java +++ b/src/java/org/apache/cassandra/streaming/StreamPlan.java @@ -47,14 +47,19 @@ public class StreamPlan */ public StreamPlan(String description) { - this(description, ActiveRepairService.UNREPAIRED_SSTABLE, 1); + this(description, ActiveRepairService.UNREPAIRED_SSTABLE, 1, false); } - public StreamPlan(String description, long repairedAt, int connectionsPerHost) + public StreamPlan(String description, boolean keepSSTableLevels) + { + this(description, ActiveRepairService.UNREPAIRED_SSTABLE, 1, keepSSTableLevels); + } + + public StreamPlan(String description, long repairedAt, int connectionsPerHost, boolean keepSSTableLevels) { this.description = description; this.repairedAt = repairedAt; - this.coordinator = new StreamCoordinator(connectionsPerHost, new DefaultConnectionFactory()); + this.coordinator = new StreamCoordinator(connectionsPerHost, keepSSTableLevels, new DefaultConnectionFactory()); } /** diff --git a/src/java/org/apache/cassandra/streaming/StreamReader.java b/src/java/org/apache/cassandra/streaming/StreamReader.java index b6e1aafeb5cf..34cbf02e9a61 100644 --- a/src/java/org/apache/cassandra/streaming/StreamReader.java +++ b/src/java/org/apache/cassandra/streaming/StreamReader.java @@ -58,6 +58,7 @@ public class StreamReader protected final StreamSession session; protected final Descriptor.Version inputVersion; protected final long repairedAt; + protected final int sstableLevel; protected Descriptor desc; @@ -69,6 +70,7 @@ public StreamReader(FileMessageHeader header, StreamSession session) this.sections = header.sections; this.inputVersion = new Descriptor.Version(header.version); this.repairedAt = header.repairedAt; + this.sstableLevel = header.sstableLevel; } /** @@ -78,7 +80,7 @@ public StreamReader(FileMessageHeader header, StreamSession session) */ public SSTableWriter read(ReadableByteChannel channel) throws IOException { - logger.debug("reading file from {}, repairedAt = {}", session.peer, repairedAt); + logger.debug("reading file from {}, repairedAt = {}, level = {}", session.peer, repairedAt, sstableLevel); long totalSize = totalSize(); Pair kscf = Schema.instance.getCF(cfId); @@ -119,8 +121,7 @@ protected SSTableWriter createWriter(ColumnFamilyStore cfs, long totalSize, long if (localDir == null) throw new IOException("Insufficient disk space to store " + totalSize + " bytes"); desc = Descriptor.fromFilename(cfs.getTempSSTablePath(cfs.directories.getLocationForDisk(localDir))); - - return new SSTableWriter(desc.filenameFor(Component.DATA), estimatedKeys, repairedAt); + return new SSTableWriter(desc.filenameFor(Component.DATA), estimatedKeys, repairedAt, sstableLevel); } protected void drain(InputStream dis, long bytesRead) throws IOException diff --git a/src/java/org/apache/cassandra/streaming/StreamResultFuture.java b/src/java/org/apache/cassandra/streaming/StreamResultFuture.java index f28a9379f5d1..b8a5234c5566 100644 --- a/src/java/org/apache/cassandra/streaming/StreamResultFuture.java +++ b/src/java/org/apache/cassandra/streaming/StreamResultFuture.java @@ -69,9 +69,9 @@ private StreamResultFuture(UUID planId, String description, StreamCoordinator co set(getCurrentState()); } - private StreamResultFuture(UUID planId, String description) + private StreamResultFuture(UUID planId, String description, boolean keepSSTableLevels) { - this(planId, description, new StreamCoordinator(0, new DefaultConnectionFactory())); + this(planId, description, new StreamCoordinator(0, keepSSTableLevels, new DefaultConnectionFactory())); } static StreamResultFuture init(UUID planId, String description, Collection listeners, StreamCoordinator coordinator) @@ -101,7 +101,8 @@ public static synchronized StreamResultFuture initReceivingSide(int sessionIndex InetAddress from, Socket socket, boolean isForOutgoing, - int version) throws IOException + int version, + boolean keepSSTableLevel) throws IOException { StreamResultFuture future = StreamManager.instance.getReceivingStream(planId); if (future == null) @@ -109,7 +110,7 @@ public static synchronized StreamResultFuture initReceivingSide(int sessionIndex logger.info("[Stream #{} ID#{}] Creating new streaming plan for {}", planId, sessionIndex, description); // The main reason we create a StreamResultFuture on the receiving side is for JMX exposure. - future = new StreamResultFuture(planId, description); + future = new StreamResultFuture(planId, description, keepSSTableLevel); StreamManager.instance.registerReceiving(future); } future.attachSocket(from, sessionIndex, socket, isForOutgoing, version); diff --git a/src/java/org/apache/cassandra/streaming/StreamSession.java b/src/java/org/apache/cassandra/streaming/StreamSession.java index 2efa00d31535..560a9fa82eb0 100644 --- a/src/java/org/apache/cassandra/streaming/StreamSession.java +++ b/src/java/org/apache/cassandra/streaming/StreamSession.java @@ -133,6 +133,7 @@ public class StreamSession implements IEndpointStateChangeSubscriber private int retries; private AtomicBoolean isAborted = new AtomicBoolean(false); + private final boolean keepSSTableLevel; public static enum State { @@ -153,13 +154,14 @@ public static enum State * @param peer Address of streaming peer * @param factory is used for establishing connection */ - public StreamSession(InetAddress peer, StreamConnectionFactory factory, int index) + public StreamSession(InetAddress peer, StreamConnectionFactory factory, int index, boolean keepSSTableLevel) { this.peer = peer; this.index = index; this.factory = factory; this.handler = new ConnectionHandler(this); this.metrics = StreamingMetrics.get(peer); + this.keepSSTableLevel = keepSSTableLevel; } public UUID planId() @@ -177,6 +179,11 @@ public String description() return streamResult == null ? null : streamResult.description; } + public boolean keepSSTableLevel() + { + return keepSSTableLevel; + } + /** * Bind this session to report to specific {@link StreamResultFuture} and * perform pre-streaming initialization. diff --git a/src/java/org/apache/cassandra/streaming/StreamTransferTask.java b/src/java/org/apache/cassandra/streaming/StreamTransferTask.java index b840ee57e96e..18058c1bb68e 100644 --- a/src/java/org/apache/cassandra/streaming/StreamTransferTask.java +++ b/src/java/org/apache/cassandra/streaming/StreamTransferTask.java @@ -50,7 +50,7 @@ public StreamTransferTask(StreamSession session, UUID cfId) public synchronized void addTransferFile(SSTableReader sstable, long estimatedKeys, List> sections, long repairedAt) { assert sstable != null && cfId.equals(sstable.metadata.cfId); - OutgoingFileMessage message = new OutgoingFileMessage(sstable, sequenceNumber.getAndIncrement(), estimatedKeys, sections, repairedAt); + OutgoingFileMessage message = new OutgoingFileMessage(sstable, sequenceNumber.getAndIncrement(), estimatedKeys, sections, repairedAt, session.keepSSTableLevel()); files.put(message.header.sequenceNumber, message); totalSize += message.header.size(); } diff --git a/src/java/org/apache/cassandra/streaming/messages/FileMessageHeader.java b/src/java/org/apache/cassandra/streaming/messages/FileMessageHeader.java index 284820e39ccb..5e378bc31cec 100644 --- a/src/java/org/apache/cassandra/streaming/messages/FileMessageHeader.java +++ b/src/java/org/apache/cassandra/streaming/messages/FileMessageHeader.java @@ -47,6 +47,7 @@ public class FileMessageHeader public final List> sections; public final CompressionInfo compressionInfo; public final long repairedAt; + public final int sstableLevel; public FileMessageHeader(UUID cfId, int sequenceNumber, @@ -54,7 +55,8 @@ public FileMessageHeader(UUID cfId, long estimatedKeys, List> sections, CompressionInfo compressionInfo, - long repairedAt) + long repairedAt, + int sstableLevel) { this.cfId = cfId; this.sequenceNumber = sequenceNumber; @@ -63,6 +65,7 @@ public FileMessageHeader(UUID cfId, this.sections = sections; this.compressionInfo = compressionInfo; this.repairedAt = repairedAt; + this.sstableLevel = sstableLevel; } /** @@ -96,6 +99,7 @@ public String toString() sb.append(", transfer size: ").append(size()); sb.append(", compressed?: ").append(compressionInfo != null); sb.append(", repairedAt: ").append(repairedAt); + sb.append(", level: ").append(sstableLevel); sb.append(')'); return sb.toString(); } @@ -134,6 +138,7 @@ public void serialize(FileMessageHeader header, DataOutputPlus out, int version) } CompressionInfo.serializer.serialize(header.compressionInfo, out, version); out.writeLong(header.repairedAt); + out.writeInt(header.sstableLevel); } public FileMessageHeader deserialize(DataInput in, int version) throws IOException @@ -148,7 +153,8 @@ public FileMessageHeader deserialize(DataInput in, int version) throws IOExcepti sections.add(Pair.create(in.readLong(), in.readLong())); CompressionInfo compressionInfo = CompressionInfo.serializer.deserialize(in, MessagingService.current_version); long repairedAt = in.readLong(); - return new FileMessageHeader(cfId, sequenceNumber, sstableVersion, estimatedKeys, sections, compressionInfo, repairedAt); + int sstableLevel = in.readInt(); + return new FileMessageHeader(cfId, sequenceNumber, sstableVersion, estimatedKeys, sections, compressionInfo, repairedAt, sstableLevel); } public long serializedSize(FileMessageHeader header, int version) @@ -165,6 +171,7 @@ public long serializedSize(FileMessageHeader header, int version) size += TypeSizes.NATIVE.sizeof(section.right); } size += CompressionInfo.serializer.serializedSize(header.compressionInfo, version); + size += TypeSizes.NATIVE.sizeof(header.sstableLevel); return size; } } diff --git a/src/java/org/apache/cassandra/streaming/messages/OutgoingFileMessage.java b/src/java/org/apache/cassandra/streaming/messages/OutgoingFileMessage.java index 466e2cb8119c..13af987da22a 100644 --- a/src/java/org/apache/cassandra/streaming/messages/OutgoingFileMessage.java +++ b/src/java/org/apache/cassandra/streaming/messages/OutgoingFileMessage.java @@ -60,7 +60,7 @@ public void serialize(OutgoingFileMessage message, DataOutputStreamAndChannel ou public FileMessageHeader header; public SSTableReader sstable; - public OutgoingFileMessage(SSTableReader sstable, int sequenceNumber, long estimatedKeys, List> sections, long repairedAt) + public OutgoingFileMessage(SSTableReader sstable, int sequenceNumber, long estimatedKeys, List> sections, long repairedAt, boolean keepSSTableLevel) { super(Type.FILE); this.sstable = sstable; @@ -77,7 +77,8 @@ public OutgoingFileMessage(SSTableReader sstable, int sequenceNumber, long estim estimatedKeys, sections, compressionInfo, - repairedAt); + repairedAt, + keepSSTableLevel ? sstable.getSSTableLevel() : 0); } @Override diff --git a/src/java/org/apache/cassandra/streaming/messages/StreamInitMessage.java b/src/java/org/apache/cassandra/streaming/messages/StreamInitMessage.java index a9ec4ae015bd..0937f7197cd7 100644 --- a/src/java/org/apache/cassandra/streaming/messages/StreamInitMessage.java +++ b/src/java/org/apache/cassandra/streaming/messages/StreamInitMessage.java @@ -46,14 +46,16 @@ public class StreamInitMessage // true if this init message is to connect for outgoing message on receiving side public final boolean isForOutgoing; + public final boolean keepSSTableLevel; - public StreamInitMessage(InetAddress from, int sessionIndex, UUID planId, String description, boolean isForOutgoing) + public StreamInitMessage(InetAddress from, int sessionIndex, UUID planId, String description, boolean isForOutgoing, boolean keepSSTableLevel) { this.from = from; this.sessionIndex = sessionIndex; this.planId = planId; this.description = description; this.isForOutgoing = isForOutgoing; + this.keepSSTableLevel = keepSSTableLevel; } /** @@ -105,6 +107,7 @@ public void serialize(StreamInitMessage message, DataOutputPlus out, int version UUIDSerializer.serializer.serialize(message.planId, out, MessagingService.current_version); out.writeUTF(message.description); out.writeBoolean(message.isForOutgoing); + out.writeBoolean(message.keepSSTableLevel); } public StreamInitMessage deserialize(DataInput in, int version) throws IOException @@ -114,7 +117,8 @@ public StreamInitMessage deserialize(DataInput in, int version) throws IOExcepti UUID planId = UUIDSerializer.serializer.deserialize(in, MessagingService.current_version); String description = in.readUTF(); boolean sentByInitiator = in.readBoolean(); - return new StreamInitMessage(from, sessionIndex, planId, description, sentByInitiator); + boolean keepSSTableLevel = in.readBoolean(); + return new StreamInitMessage(from, sessionIndex, planId, description, sentByInitiator, keepSSTableLevel); } public long serializedSize(StreamInitMessage message, int version) @@ -124,6 +128,7 @@ public long serializedSize(StreamInitMessage message, int version) size += UUIDSerializer.serializer.serializedSize(message.planId, MessagingService.current_version); size += TypeSizes.NATIVE.sizeof(message.description); size += TypeSizes.NATIVE.sizeof(message.isForOutgoing); + size += TypeSizes.NATIVE.sizeof(message.keepSSTableLevel); return size; } } diff --git a/src/java/org/apache/cassandra/streaming/messages/StreamMessage.java b/src/java/org/apache/cassandra/streaming/messages/StreamMessage.java index e527db1444a6..372fdd35709c 100644 --- a/src/java/org/apache/cassandra/streaming/messages/StreamMessage.java +++ b/src/java/org/apache/cassandra/streaming/messages/StreamMessage.java @@ -32,7 +32,7 @@ public abstract class StreamMessage { /** Streaming protocol version */ - public static final int CURRENT_VERSION = 2; + public static final int CURRENT_VERSION = 3; public static void serialize(StreamMessage message, DataOutputStreamAndChannel out, int version, StreamSession session) throws IOException { diff --git a/src/java/org/apache/cassandra/tools/SSTableImport.java b/src/java/org/apache/cassandra/tools/SSTableImport.java index e678aaaaffa0..05b9dcb18db6 100644 --- a/src/java/org/apache/cassandra/tools/SSTableImport.java +++ b/src/java/org/apache/cassandra/tools/SSTableImport.java @@ -302,7 +302,7 @@ private int importUnsorted(String jsonFile, ColumnFamily columnFamily, String ss Object[] data = parser.readValueAs(new TypeReference(){}); keyCountToImport = (keyCountToImport == null) ? data.length : keyCountToImport; - SSTableWriter writer = new SSTableWriter(ssTablePath, keyCountToImport, ActiveRepairService.UNREPAIRED_SSTABLE); + SSTableWriter writer = new SSTableWriter(ssTablePath, keyCountToImport); System.out.printf("Importing %s keys...%n", keyCountToImport); @@ -375,7 +375,7 @@ private int importSorted(String jsonFile, ColumnFamily columnFamily, String ssTa System.out.printf("Importing %s keys...%n", keyCountToImport); parser = getParser(jsonFile); // renewing parser - SSTableWriter writer = new SSTableWriter(ssTablePath, keyCountToImport, ActiveRepairService.UNREPAIRED_SSTABLE); + SSTableWriter writer = new SSTableWriter(ssTablePath, keyCountToImport); int lineNumber = 1; DecoratedKey prevStoredKey = null; diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java b/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java index 157f89b75abd..57c94772fed8 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java @@ -211,7 +211,7 @@ public SSTableReader write(Map entries) throws IOException public SSTableReader write(int expectedSize, Appender appender) throws IOException { File datafile = (dest == null) ? tempSSTableFile(ksname, cfname, generation) : new File(dest.filenameFor(Component.DATA)); - SSTableWriter writer = new SSTableWriter(datafile.getAbsolutePath(), expectedSize, ActiveRepairService.UNREPAIRED_SSTABLE); + SSTableWriter writer = new SSTableWriter(datafile.getAbsolutePath(), expectedSize); while (appender.append(writer)) { /* pass */ } SSTableReader reader = writer.closeAndOpenReader(); // mark all components for removal diff --git a/test/unit/org/apache/cassandra/streaming/StreamTransferTaskTest.java b/test/unit/org/apache/cassandra/streaming/StreamTransferTaskTest.java index 16fa77bbb437..d84f9b7ced71 100644 --- a/test/unit/org/apache/cassandra/streaming/StreamTransferTaskTest.java +++ b/test/unit/org/apache/cassandra/streaming/StreamTransferTaskTest.java @@ -63,7 +63,7 @@ public void testScheduleTimeout() throws Exception String ks = KEYSPACE1; String cf = "Standard1"; - StreamSession session = new StreamSession(FBUtilities.getBroadcastAddress(), null, 0); + StreamSession session = new StreamSession(FBUtilities.getBroadcastAddress(), null, 0, true); ColumnFamilyStore cfs = Keyspace.open(ks).getColumnFamilyStore(cf); // create two sstables diff --git a/test/unit/org/apache/cassandra/tools/SSTableExportTest.java b/test/unit/org/apache/cassandra/tools/SSTableExportTest.java index 2009c0c940fd..f93e1682e9ff 100644 --- a/test/unit/org/apache/cassandra/tools/SSTableExportTest.java +++ b/test/unit/org/apache/cassandra/tools/SSTableExportTest.java @@ -97,7 +97,7 @@ public void testEnumeratekeys() throws IOException { File tempSS = tempSSTableFile(KEYSPACE1, "Standard1"); ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); - SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE); + SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2); // Add rowA cfamily.addColumn(Util.cellname("colA"), ByteBufferUtil.bytes("valA"), System.currentTimeMillis()); @@ -134,7 +134,7 @@ public void testExportSimpleCf() throws IOException, ParseException { File tempSS = tempSSTableFile(KEYSPACE1, "Standard1"); ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); - SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE); + SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2); int nowInSec = (int)(System.currentTimeMillis() / 1000) + 42; //live for 42 seconds // Add rowA @@ -191,7 +191,7 @@ public void testRoundTripStandardCf() throws IOException ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore("Standard1"); File tempSS = tempSSTableFile(KEYSPACE1, "Standard1"); ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); - SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE); + SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2); // Add rowA cfamily.addColumn(Util.cellname("name"), ByteBufferUtil.bytes("val"), System.currentTimeMillis()); @@ -231,7 +231,7 @@ public void testExportCounterCf() throws IOException, ParseException { File tempSS = tempSSTableFile(KEYSPACE1, "Counter1"); ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Counter1"); - SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE); + SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2); // Add rowA cfamily.addColumn(BufferCounterCell.createLocal(Util.cellname("colA"), 42, System.currentTimeMillis(), Long.MIN_VALUE)); @@ -263,7 +263,7 @@ public void testEscapingDoubleQuotes() throws IOException, ParseException { File tempSS = tempSSTableFile(KEYSPACE1, "ValuesWithQuotes"); ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "ValuesWithQuotes"); - SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE); + SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2); // Add rowA cfamily.addColumn(new BufferCell(Util.cellname("data"), UTF8Type.instance.fromString("{\"foo\":\"bar\"}"))); @@ -295,7 +295,7 @@ public void testExportColumnsWithMetadata() throws IOException, ParseException { File tempSS = tempSSTableFile(KEYSPACE1, "Standard1"); ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); - SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE); + SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2); // Add rowA cfamily.addColumn(Util.cellname("colName"), ByteBufferUtil.bytes("val"), System.currentTimeMillis()); @@ -357,7 +357,7 @@ public void testColumnNameEqualToDefaultKeyAlias() throws IOException, ParseExce { File tempSS = tempSSTableFile(KEYSPACE1, "UUIDKeys"); ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "UUIDKeys"); - SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE); + SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2); // Add a row cfamily.addColumn(column(CFMetaData.DEFAULT_KEY_ALIAS, "not a uuid", 1L)); @@ -387,7 +387,7 @@ public void testAsciiKeyValidator() throws IOException, ParseException { File tempSS = tempSSTableFile(KEYSPACE1, "AsciiKeys"); ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "AsciiKeys"); - SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE); + SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE, 0); // Add a row cfamily.addColumn(column("column", "value", 1L)); From 9333f86cf0acfdce75ebcd1ff38263e3d199efc7 Mon Sep 17 00:00:00 2001 From: Sylvain Lebresne Date: Mon, 13 Oct 2014 15:57:01 +0200 Subject: [PATCH 158/557] Remove UDF-as-class functionality patch by snazy; reviewed by slebresne for CASSANDRA-8063 --- CHANGES.txt | 9 +- pylib/cqlshlib/cql3handling.py | 9 +- src/java/org/apache/cassandra/cql3/Cql.g | 19 +-- .../cql3/functions/ReflectionBasedUDF.java | 127 ------------------ .../cassandra/cql3/functions/UDFunction.java | 1 - .../org/apache/cassandra/cql3/UFTest.java | 98 +++----------- 6 files changed, 23 insertions(+), 240 deletions(-) delete mode 100644 src/java/org/apache/cassandra/cql3/functions/ReflectionBasedUDF.java diff --git a/CHANGES.txt b/CHANGES.txt index b6a3766331f0..cd3950fbb633 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,21 +1,16 @@ 3.0 * Keep sstable levels when bootstrapping (CASSANDRA-7460) * Add Sigar library and perform basic OS settings check on startup (CASSANDRA-7838) - * Support for scripting languages in user-defined functions (CASSANDRA-7526) * Support for aggregation functions (CASSANDRA-4914) - * Improve query to read paxos table on propose (CASSANDRA-7929) * Remove cassandra-cli (CASSANDRA-7920) - * Optimize java source-based UDF invocation (CASSANDRA-7924) * Accept dollar quoted strings in CQL (CASSANDRA-7769) * Make assassinate a first class command (CASSANDRA-7935) * Support IN clause on any clustering column (CASSANDRA-4762) * Improve compaction logging (CASSANDRA-7818) * Remove YamlFileNetworkTopologySnitch (CASSANDRA-7917) - * Support Java source code for user-defined functions (CASSANDRA-7562) - * Require arg types to disambiguate UDF drops (CASSANDRA-7812) * Do anticompaction in groups (CASSANDRA-6851) - * Verify that UDF class methods are static (CASSANDRA-7781) - * Support pure user-defined functions (CASSANDRA-7395, 7740) + * Support pure user-defined functions (CASSANDRA-7395, 7526, 7562, 7740, 7781, 7929, + 7924, 7812, 8063) * Permit configurable timestamps with cassandra-stress (CASSANDRA-7416) * Move sstable RandomAccessReader to nio2, which allows using the FILE_SHARE_DELETE flag on Windows (CASSANDRA-4050) diff --git a/pylib/cqlshlib/cql3handling.py b/pylib/cqlshlib/cql3handling.py index 69fc27761d47..69802160a010 100644 --- a/pylib/cqlshlib/cql3handling.py +++ b/pylib/cqlshlib/cql3handling.py @@ -1004,14 +1004,7 @@ def create_cf_composite_primary_key_comma_completer(ctxt, cass): ( "," [newcolname]= )* )? ")" )? "RETURNS" - ( - ("LANGUAGE" "AS" - ( - - ) - ) - | ("USING" ) - ) + "LANGUAGE" "AS" ; ''' diff --git a/src/java/org/apache/cassandra/cql3/Cql.g b/src/java/org/apache/cassandra/cql3/Cql.g index 2ec9746b7f82..81f7d258b918 100644 --- a/src/java/org/apache/cassandra/cql3/Cql.g +++ b/src/java/org/apache/cassandra/cql3/Cql.g @@ -493,8 +493,6 @@ createFunctionStatement returns [CreateFunctionStatement expr] boolean ifNotExists = false; boolean deterministic = true; - String language = "class"; - String bodyOrClassName = null; List argsNames = new ArrayList<>(); List argsTypes = new ArrayList<>(); } @@ -509,19 +507,10 @@ createFunctionStatement returns [CreateFunctionStatement expr] ( ',' k=cident v=comparatorType { argsNames.add(k); argsTypes.add(v); } )* )? ')' - K_RETURNS - rt=comparatorType - ( - ( K_USING cls = STRING_LITERAL { bodyOrClassName = $cls.text; } ) - | ( K_LANGUAGE l = IDENT { language=$l.text; } K_AS - ( - ( body = STRING_LITERAL - { bodyOrClassName = $body.text; } - ) - ) - ) - ) - { $expr = new CreateFunctionStatement(fn, language.toLowerCase(), bodyOrClassName, deterministic, argsNames, argsTypes, rt, orReplace, ifNotExists); } + K_RETURNS rt = comparatorType + K_LANGUAGE language = IDENT + K_AS body = STRING_LITERAL + { $expr = new CreateFunctionStatement(fn, $language.text.toLowerCase(), $body.text, deterministic, argsNames, argsTypes, rt, orReplace, ifNotExists); } ; dropFunctionStatement returns [DropFunctionStatement expr] diff --git a/src/java/org/apache/cassandra/cql3/functions/ReflectionBasedUDF.java b/src/java/org/apache/cassandra/cql3/functions/ReflectionBasedUDF.java deleted file mode 100644 index 911537f403b0..000000000000 --- a/src/java/org/apache/cassandra/cql3/functions/ReflectionBasedUDF.java +++ /dev/null @@ -1,127 +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.cql3.functions; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; -import java.nio.ByteBuffer; -import java.util.Arrays; -import java.util.List; - -import org.apache.cassandra.cql3.*; -import org.apache.cassandra.db.marshal.AbstractType; -import org.apache.cassandra.exceptions.InvalidRequestException; - -/** - * User-defined function using a method in a class loaded on the classpath by - * reflection. - * - * This is used when the LANGUAGE of the UDF definition is "class". - */ -final class ReflectionBasedUDF extends UDFunction -{ - private final MethodHandle method; - - ReflectionBasedUDF(FunctionName name, - List argNames, - List> argTypes, - AbstractType returnType, - String language, - String body, - boolean deterministic) - throws InvalidRequestException - { - super(name, argNames, argTypes, returnType, language, body, deterministic); - assert language.equals("class"); - this.method = resolveMethod(); - } - - private MethodHandle resolveMethod() throws InvalidRequestException - { - Class jReturnType = javaType(returnType); - Class[] paramTypes = javaParamTypes(argTypes); - - String className; - String methodName; - int i = body.indexOf('#'); - if (i != -1) - { - methodName = body.substring(i + 1); - className = body.substring(0, i); - } - else - { - methodName = name.name; - className = body; - } - try - { - Class cls = Class.forName(className, false, Thread.currentThread().getContextClassLoader()); - - MethodHandles.Lookup handles = MethodHandles.lookup(); - MethodType methodType = MethodType.methodType(jReturnType, paramTypes); - MethodHandle handle = handles.findStatic(cls, methodName, methodType); - - return handle; - } - catch (ClassNotFoundException e) - { - throw new InvalidRequestException("Class " + className + " does not exist"); - } - catch (NoSuchMethodException e) - { - throw new InvalidRequestException("Method 'public static " + jReturnType.getName() + ' ' + - className + '.' + methodName + '(' + Arrays.toString(paramTypes) + - ")' does not exist - check for static, argument types and return type"); - } - catch (IllegalAccessException e) - { - throw new InvalidRequestException("Method " + className + '.' + methodName + '(' + Arrays.toString(paramTypes) + ") is not accessible"); - } - } - - public ByteBuffer execute(List parameters) throws InvalidRequestException - { - Object[] parms = new Object[argTypes.size()]; - for (int i = 0; i < parms.length; i++) - { - ByteBuffer bb = parameters.get(i); - if (bb != null) - parms[i] = argTypes.get(i).compose(bb); - } - - Object result; - try - { - result = method.invokeWithArguments(parms); - @SuppressWarnings("unchecked") ByteBuffer r = result != null ? ((AbstractType) returnType).decompose(result) : null; - return r; - } - catch (VirtualMachineError e) - { - // handle OutOfMemoryError and other fatals not here! - throw e; - } - catch (Throwable e) - { - logger.error("Invocation of function '{}' failed", this, e); - throw new InvalidRequestException("Invocation of function '" + this + "' failed: " + e); - } - } -} diff --git a/src/java/org/apache/cassandra/cql3/functions/UDFunction.java b/src/java/org/apache/cassandra/cql3/functions/UDFunction.java index 8c51b9e20f78..374100852c87 100644 --- a/src/java/org/apache/cassandra/cql3/functions/UDFunction.java +++ b/src/java/org/apache/cassandra/cql3/functions/UDFunction.java @@ -82,7 +82,6 @@ public static UDFunction create(FunctionName name, { switch (language) { - case "class": return new ReflectionBasedUDF(name, argNames, argTypes, returnType, language, body, deterministic); case "java": return JavaSourceUDFFactory.buildUDF(name, argNames, argTypes, returnType, body, deterministic); default: return new ScriptBasedUDF(name, argNames, argTypes, returnType, language, body, deterministic); } diff --git a/test/unit/org/apache/cassandra/cql3/UFTest.java b/test/unit/org/apache/cassandra/cql3/UFTest.java index 46db578a9a4f..95bede4ccfea 100644 --- a/test/unit/org/apache/cassandra/cql3/UFTest.java +++ b/test/unit/org/apache/cassandra/cql3/UFTest.java @@ -27,59 +27,6 @@ public class UFTest extends CQLTester { - public static Double sin(Double val) - { - return val != null ? Math.sin(val) : null; - } - - public static Float sin(Float val) - { - return val != null ? (float)Math.sin(val) : null; - } - - public static Double badSin(Double val) - { - return 42.0; - } - - public static String badSinBadReturn(Double val) - { - return "foo"; - } - - public Float nonStaticMethod(Float val) - { - return new Float(1.0); - } - - private static Float privateMethod(Float val) - { - return new Float(1.0); - } - - public static String repeat(String v, Integer n) - { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < n; i++) - sb.append(v); - return sb.toString(); - } - - public static String overloaded(String v) - { - return "f1"; - } - - public static String overloaded(Integer v) - { - return "f2"; - } - - public static String overloaded(String v1, String v2) - { - return "f3"; - } - @Test public void testFunctionCreationAndDrop() throws Throwable { @@ -89,26 +36,12 @@ public void testFunctionCreationAndDrop() throws Throwable execute("INSERT INTO %s(key, d) VALUES (?, ?)", 2, 2d); execute("INSERT INTO %s(key, d) VALUES (?, ?)", 3, 3d); - // creation with a bad class - assertInvalid("CREATE FUNCTION foo::sin1 ( input double ) RETURNS double USING 'org.apache.cassandra.cql3.DoesNotExist#doesnotexist'"); - // and a good class but inexisting method - assertInvalid("CREATE FUNCTION foo::sin2 ( input double ) RETURNS double USING 'org.apache.cassandra.cql3.UFTest#doesnotexist'"); - // with a non static method - assertInvalid("CREATE FUNCTION foo::sin3 ( input float ) RETURNS float USING 'org.apache.cassandra.cql3.UFTest#nonStaticMethod'"); - // with a non public method - assertInvalid("CREATE FUNCTION foo::sin4 ( input float ) RETURNS float USING 'org.apache.cassandra.cql3.UFTest#privateMethod'"); - - // creation with bad argument types - assertInvalid("CREATE FUNCTION foo::sin5 ( input text ) RETURNS double USING 'org.apache.cassandra.cql3.UFTest#sin'"); - // with bad return types - assertInvalid("CREATE FUNCTION foo::sin6 ( input double ) RETURNS text USING 'org.apache.cassandra.cql3.UFTest#sin'"); - // simple creation - execute("CREATE FUNCTION foo::sin ( input double ) RETURNS double USING 'org.apache.cassandra.cql3.UFTest#sin'"); + execute("CREATE FUNCTION foo::sin ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(Math.sin(input.doubleValue()));'"); // check we can't recreate the same function - assertInvalid("CREATE FUNCTION foo::sin ( input double ) RETURNS double USING 'org.apache.cassandra.cql3.UFTest#sin'"); + assertInvalid("CREATE FUNCTION foo::sin ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(Math.sin(input.doubleValue()));'"); // but that it doesn't complay with "IF NOT EXISTS" - execute("CREATE FUNCTION IF NOT EXISTS foo::sin ( input double ) RETURNS double USING 'org.apache.cassandra.cql3.UFTest#sin'"); + execute("CREATE FUNCTION IF NOT EXISTS foo::sin ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(Math.sin(input.doubleValue()));'"); // Validate that it works as expected assertRows(execute("SELECT key, foo::sin(d) FROM %s"), @@ -117,10 +50,8 @@ public void testFunctionCreationAndDrop() throws Throwable row(3, Math.sin(3d)) ); - // Replace the method with incompatible return type - assertInvalid("CREATE OR REPLACE FUNCTION foo::sin ( input double ) RETURNS text USING 'org.apache.cassandra.cql3.UFTest#badSinBadReturn'"); // proper replacement - execute("CREATE OR REPLACE FUNCTION foo::sin ( input double ) RETURNS double USING 'org.apache.cassandra.cql3.UFTest#badSin'"); + execute("CREATE OR REPLACE FUNCTION foo::sin ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(42d);'"); // Validate the method as been replaced assertRows(execute("SELECT key, foo::sin(d) FROM %s"), @@ -130,7 +61,7 @@ public void testFunctionCreationAndDrop() throws Throwable ); // same function but without namespace - execute("CREATE FUNCTION sin ( input double ) RETURNS double USING 'org.apache.cassandra.cql3.UFTest#sin'"); + execute("CREATE FUNCTION sin ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(Math.sin(input.doubleValue()));'"); assertRows(execute("SELECT key, sin(d) FROM %s"), row(1, Math.sin(1d)), row(2, Math.sin(2d)), @@ -161,7 +92,10 @@ public void testFunctionExecution() throws Throwable execute("INSERT INTO %s(v) VALUES (?)", "aaa"); - execute("CREATE FUNCTION repeat (v text, n int) RETURNS text USING 'org.apache.cassandra.cql3.UFTest#repeat'"); + execute("CREATE FUNCTION repeat (v text, n int) RETURNS text LANGUAGE java AS 'StringBuilder sb = new StringBuilder();\n" + + " for (int i = 0; i < n.intValue(); i++)\n" + + " sb.append(v);\n" + + " return sb.toString();'"); assertRows(execute("SELECT v FROM %s WHERE v=repeat(?, ?)", "a", 3), row("aaa")); assertEmpty(execute("SELECT v FROM %s WHERE v=repeat(?, ?)", "a", 2)); @@ -174,13 +108,13 @@ public void testFunctionOverloading() throws Throwable execute("INSERT INTO %s(k, v) VALUES (?, ?)", "f2", 1); - execute("CREATE FUNCTION overloaded(v varchar) RETURNS text USING 'org.apache.cassandra.cql3.UFTest'"); - execute("CREATE OR REPLACE FUNCTION overloaded(i int) RETURNS text USING 'org.apache.cassandra.cql3.UFTest'"); - execute("CREATE OR REPLACE FUNCTION overloaded(v1 text, v2 text) RETURNS text USING 'org.apache.cassandra.cql3.UFTest'"); - execute("CREATE OR REPLACE FUNCTION overloaded(v ascii) RETURNS text USING 'org.apache.cassandra.cql3.UFTest'"); + execute("CREATE FUNCTION overloaded(v varchar) RETURNS text LANGUAGE java AS 'return \"f1\";'"); + execute("CREATE OR REPLACE FUNCTION overloaded(i int) RETURNS text LANGUAGE java AS 'return \"f2\";'"); + execute("CREATE OR REPLACE FUNCTION overloaded(v1 text, v2 text) RETURNS text LANGUAGE java AS 'return \"f3\";'"); + execute("CREATE OR REPLACE FUNCTION overloaded(v ascii) RETURNS text LANGUAGE java AS 'return \"f1\";'"); // text == varchar, so this should be considered as a duplicate - assertInvalid("CREATE FUNCTION overloaded(v varchar) RETURNS text USING 'org.apache.cassandra.cql3.UFTest'"); + assertInvalid("CREATE FUNCTION overloaded(v varchar) RETURNS text LANGUAGE java AS 'return \"f1\";'"); assertRows(execute("SELECT overloaded(k), overloaded(v), overloaded(k, k) FROM %s"), row("f1", "f2", "f3") @@ -445,7 +379,7 @@ public void testJavaDollarQuotedFunction() throws Throwable execute("create function foo::pgfun1 ( input double ) returns text language java\n" + "AS $$" + functionBody + "$$;"); - execute("CREATE FUNCTION foo::pgsin ( input double ) RETURNS double USING $$org.apache.cassandra.cql3.UFTest#sin$$"); + execute("CREATE FUNCTION foo::pgsin ( input double ) RETURNS double LANGUAGE java AS $$return Double.valueOf(Math.sin(input.doubleValue()));$$"); assertRows(execute("SELECT language, body FROM system.schema_functions WHERE namespace='foo' AND name='pgfun1'"), row("java", functionBody)); @@ -600,7 +534,7 @@ public void testScriptReturnTypeCasting() throws Throwable execute("CREATE OR REPLACE FUNCTION js(val double) RETURNS decimal LANGUAGE javascript\n" + "AS '100;';"); assertRows(execute("SELECT key, val, js(val) FROM %s"), - row(1, 1d, BigDecimal.valueOf(100d))); + row(1, 1d, BigDecimal.valueOf(100L))); execute("DROP FUNCTION js(double)"); // declared rtype = decimal , return type = double From b94c87a1816b5fc370d14dbc001eaca5b7c720e8 Mon Sep 17 00:00:00 2001 From: Robert Stupp Date: Tue, 14 Oct 2014 08:52:15 +0200 Subject: [PATCH 159/557] Update java driver to 2.1.2 patch by snazy; reviewed by slebresne for CASSANDRA-7692 --- build.xml | 2 +- lib/cassandra-driver-core-2.1.2.jar | Bin 0 -> 638544 bytes .../hadoop/cql3/CqlRecordReader.java | 27 ++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 lib/cassandra-driver-core-2.1.2.jar diff --git a/build.xml b/build.xml index 708b950916cb..b758e0aa07ac 100644 --- a/build.xml +++ b/build.xml @@ -365,7 +365,7 @@ - + diff --git a/lib/cassandra-driver-core-2.1.2.jar b/lib/cassandra-driver-core-2.1.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..2095c05832406cb02fb70656893f916a0c56fb8c GIT binary patch literal 638544 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

    ecOrLttb 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�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�f%V+x!`nrq^&GMXL;u$N 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

    1dPuXsPPjZ^T}rdLIkfrN8eX#* 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 z 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≪hU$-Bf2 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

    >=q0W+v?H7l1psj%Y1l9$fYS883H#unBR*I6Kuo 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

    krS|qe9s)YNn4u%W218^kv^y5 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%0D?-4nimI2-tqjvHGN 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

    - * -Xmx1G - * -Dcassandra.config=/Users/gary/cassandra/conf/cassandra.yaml (optional, will first look for cassandra.yaml on classpath) - *

    - * Pass "write" or "read" into the program to exercise the various methods. - *

    - * Caveats: - *

    - * 1. Much of cassandra is not reentrant. That is, you can't spin a client up, down, then back up in the same jvm. - * 2. Because of the above, you still need to force-quit the process. StorageService.stopClient() doesn't (can't) - * spin everything down. - */ - public static void main(String args[]) throws Exception - { - startClient(); - setupKeyspace(); - testWriting(); - logger.info("Writing is done. Sleeping, then will try to read."); - Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS); - - testReading(); - - // no need to do this: - // StorageService.instance().decommission(); - // do this instead: - StorageService.instance.stopClient(); - System.exit(0); // the only way to really stop the process. - } - - private static void setupKeyspace() throws RequestExecutionException, RequestValidationException, InterruptedException - { - QueryProcessor.process("CREATE KEYSPACE IF NOT EXISTS " + KEYSPACE + " WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}", - ConsistencyLevel.ANY); - QueryProcessor.process("CREATE TABLE IF NOT EXISTS " + KEYSPACE + "." + COLUMN_FAMILY + " (id ascii PRIMARY KEY, name ascii, value ascii )", - ConsistencyLevel.ANY); - TimeUnit.MILLISECONDS.sleep(1000); - } -} diff --git a/src/java/org/apache/cassandra/config/Config.java b/src/java/org/apache/cassandra/config/Config.java index 0f525cd5d360..bb992e65d735 100644 --- a/src/java/org/apache/cassandra/config/Config.java +++ b/src/java/org/apache/cassandra/config/Config.java @@ -197,8 +197,6 @@ public class Config public String memory_allocator = NativeAllocator.class.getSimpleName(); - private static boolean isClientMode = false; - public Integer file_cache_size_in_mb; public boolean inter_dc_tcp_nodelay = true; @@ -226,16 +224,6 @@ public static void setOutboundBindAny(boolean value) outboundBindAny = value; } - public static boolean isClientMode() - { - return isClientMode; - } - - public static void setClientMode(boolean clientMode) - { - isClientMode = clientMode; - } - public void configHintedHandoff() throws ConfigurationException { if (hinted_handoff_enabled != null && !hinted_handoff_enabled.isEmpty()) diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java index 64d7ec8ca25a..319801d078e2 100644 --- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java +++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java @@ -115,21 +115,9 @@ public class DatabaseDescriptor static { - // In client mode, we use a default configuration. Note that the fields of this class will be - // left unconfigured however (the partitioner or localDC will be null for instance) so this - // should be used with care. try { - if (Config.isClientMode()) - { - conf = new Config(); - // at least we have to set memoryAllocator to open SSTable in client mode - memoryAllocator = FBUtilities.newOffHeapAllocator(conf.memory_allocator); - } - else - { - applyConfig(loadConfig()); - } + applyConfig(loadConfig()); } catch (ConfigurationException e) { diff --git a/src/java/org/apache/cassandra/db/DefsTables.java b/src/java/org/apache/cassandra/db/DefsTables.java index 169391495570..748d3f4b37e0 100644 --- a/src/java/org/apache/cassandra/db/DefsTables.java +++ b/src/java/org/apache/cassandra/db/DefsTables.java @@ -123,7 +123,7 @@ public static synchronized void mergeSchemaInternal(Collection mutatio for (Mutation mutation : mutations) mutation.apply(); - if (doFlush && !StorageService.instance.isClientMode()) + if (doFlush) flushSchemaCFs(); // with new data applied @@ -353,11 +353,8 @@ private static void addKeyspace(KSMetaData ksm) assert Schema.instance.getKSMetaData(ksm.name) == null; Schema.instance.load(ksm); - if (!StorageService.instance.isClientMode()) - { - Keyspace.open(ksm.name); - MigrationManager.instance.notifyCreateKeyspace(ksm); - } + Keyspace.open(ksm.name); + MigrationManager.instance.notifyCreateKeyspace(ksm); } private static void addColumnFamily(CFMetaData cfm) @@ -375,12 +372,8 @@ private static void addColumnFamily(CFMetaData cfm) Keyspace.open(cfm.ksName); Schema.instance.setKeyspaceDefinition(ksm); - - if (!StorageService.instance.isClientMode()) - { - Keyspace.open(ksm.name).initCf(cfm.cfId, cfm.cfName, true); - MigrationManager.instance.notifyCreateColumnFamily(cfm); - } + Keyspace.open(ksm.name).initCf(cfm.cfId, cfm.cfName, true); + MigrationManager.instance.notifyCreateColumnFamily(cfm); } private static void addType(UserType ut) @@ -392,8 +385,7 @@ private static void addType(UserType ut) ksm.userTypes.addType(ut); - if (!StorageService.instance.isClientMode()) - MigrationManager.instance.notifyCreateUserType(ut); + MigrationManager.instance.notifyCreateUserType(ut); } private static void addFunction(UDFunction udf) @@ -402,8 +394,7 @@ private static void addFunction(UDFunction udf) Functions.addFunction(udf); - if (!StorageService.instance.isClientMode()) - MigrationManager.instance.notifyCreateFunction(udf); + MigrationManager.instance.notifyCreateFunction(udf); } private static void updateKeyspace(String ksName) @@ -414,11 +405,8 @@ private static void updateKeyspace(String ksName) Schema.instance.setKeyspaceDefinition(newKsm); - if (!StorageService.instance.isClientMode()) - { - Keyspace.open(ksName).createReplicationStrategy(newKsm); - MigrationManager.instance.notifyUpdateKeyspace(newKsm); - } + Keyspace.open(ksName).createReplicationStrategy(newKsm); + MigrationManager.instance.notifyUpdateKeyspace(newKsm); } private static void updateColumnFamily(String ksName, String cfName) @@ -427,12 +415,9 @@ private static void updateColumnFamily(String ksName, String cfName) assert cfm != null; cfm.reload(); - if (!StorageService.instance.isClientMode()) - { - Keyspace keyspace = Keyspace.open(cfm.ksName); - keyspace.getColumnFamilyStore(cfm.cfName).reload(); - MigrationManager.instance.notifyUpdateColumnFamily(cfm); - } + Keyspace keyspace = Keyspace.open(cfm.ksName); + keyspace.getColumnFamilyStore(cfm.cfName).reload(); + MigrationManager.instance.notifyUpdateColumnFamily(cfm); } private static void updateType(UserType ut) @@ -444,8 +429,7 @@ private static void updateType(UserType ut) ksm.userTypes.addType(ut); - if (!StorageService.instance.isClientMode()) - MigrationManager.instance.notifyUpdateUserType(ut); + MigrationManager.instance.notifyUpdateUserType(ut); } private static void updateFunction(UDFunction udf) @@ -454,8 +438,7 @@ private static void updateFunction(UDFunction udf) Functions.replaceFunction(udf); - if (!StorageService.instance.isClientMode()) - MigrationManager.instance.notifyUpdateFunction(udf); + MigrationManager.instance.notifyUpdateFunction(udf); } private static void dropKeyspace(String ksName) @@ -475,12 +458,9 @@ private static void dropKeyspace(String ksName) Schema.instance.purge(cfm); - if (!StorageService.instance.isClientMode()) - { - if (DatabaseDescriptor.isAutoSnapshot()) - cfs.snapshot(snapshotName); - Keyspace.open(ksm.name).dropCf(cfm.cfId); - } + if (DatabaseDescriptor.isAutoSnapshot()) + cfs.snapshot(snapshotName); + Keyspace.open(ksm.name).dropCf(cfm.cfId); droppedCfs.add(cfm.cfId); } @@ -494,10 +474,7 @@ private static void dropKeyspace(String ksName) // force a new segment in the CL CommitLog.instance.forceRecycleAllSegments(droppedCfs); - if (!StorageService.instance.isClientMode()) - { - MigrationManager.instance.notifyDropKeyspace(ksm); - } + MigrationManager.instance.notifyDropKeyspace(ksm); } private static void dropColumnFamily(String ksName, String cfName) @@ -515,15 +492,12 @@ private static void dropColumnFamily(String ksName, String cfName) CompactionManager.instance.interruptCompactionFor(Arrays.asList(cfm), true); - if (!StorageService.instance.isClientMode()) - { - if (DatabaseDescriptor.isAutoSnapshot()) - cfs.snapshot(Keyspace.getTimestampedSnapshotName(cfs.name)); - Keyspace.open(ksm.name).dropCf(cfm.cfId); - MigrationManager.instance.notifyDropColumnFamily(cfm); + if (DatabaseDescriptor.isAutoSnapshot()) + cfs.snapshot(Keyspace.getTimestampedSnapshotName(cfs.name)); + Keyspace.open(ksm.name).dropCf(cfm.cfId); + MigrationManager.instance.notifyDropColumnFamily(cfm); - CommitLog.instance.forceRecycleAllSegments(Collections.singleton(cfm.cfId)); - } + CommitLog.instance.forceRecycleAllSegments(Collections.singleton(cfm.cfId)); } private static void dropType(UserType ut) @@ -533,8 +507,7 @@ private static void dropType(UserType ut) ksm.userTypes.removeType(ut); - if (!StorageService.instance.isClientMode()) - MigrationManager.instance.notifyDropUserType(ut); + MigrationManager.instance.notifyDropUserType(ut); } private static void dropFunction(UDFunction udf) @@ -544,8 +517,7 @@ private static void dropFunction(UDFunction udf) // TODO: this is kind of broken as this remove all overloads of the function name Functions.removeFunction(udf.name(), udf.argTypes()); - if (!StorageService.instance.isClientMode()) - MigrationManager.instance.notifyDropFunction(udf); + MigrationManager.instance.notifyDropFunction(udf); } private static KSMetaData makeNewKeyspaceDefinition(KSMetaData ksm, CFMetaData toExclude) diff --git a/src/java/org/apache/cassandra/db/Directories.java b/src/java/org/apache/cassandra/db/Directories.java index d62ebeb37503..bd3281a9066c 100644 --- a/src/java/org/apache/cassandra/db/Directories.java +++ b/src/java/org/apache/cassandra/db/Directories.java @@ -182,11 +182,6 @@ public static boolean hasPrivilege(File file, FileAction action) public Directories(CFMetaData metadata) { this.metadata = metadata; - if (StorageService.instance.isClientMode()) - { - dataPaths = null; - return; - } String cfId = ByteBufferUtil.bytesToHex(ByteBufferUtil.bytes(metadata.cfId)); int idx = metadata.cfName.indexOf(SECONDARY_INDEX_NAME_SEPARATOR); diff --git a/src/java/org/apache/cassandra/db/Keyspace.java b/src/java/org/apache/cassandra/db/Keyspace.java index 86f148762b74..ca43df68e46b 100644 --- a/src/java/org/apache/cassandra/db/Keyspace.java +++ b/src/java/org/apache/cassandra/db/Keyspace.java @@ -68,8 +68,7 @@ public class Keyspace // proper directories here as well as in CassandraDaemon. static { - if (!StorageService.instance.isClientMode()) - DatabaseDescriptor.createAllDirectories(); + DatabaseDescriptor.createAllDirectories(); } public final KSMetaData metadata; diff --git a/src/java/org/apache/cassandra/gms/Gossiper.java b/src/java/org/apache/cassandra/gms/Gossiper.java index 9e29e40567f9..c488b09ca518 100644 --- a/src/java/org/apache/cassandra/gms/Gossiper.java +++ b/src/java/org/apache/cassandra/gms/Gossiper.java @@ -628,7 +628,7 @@ private void doGossipToSeed(MessageOut prod) } } - public boolean isFatClient(InetAddress endpoint) + public boolean isGossipOnlyMember(InetAddress endpoint) { EndpointState epState = endpointStateMap.get(endpoint); if (epState == null) @@ -672,7 +672,7 @@ private void doStatusCheck() { // check if this is a fat client. fat clients are removed automatically from // gossip after FatClientTimeout. Do not remove dead states here. - if (isFatClient(endpoint) + if (isGossipOnlyMember(endpoint) && !justRemovedEndpoints.containsKey(endpoint) && TimeUnit.NANOSECONDS.toMillis(nowNano - epState.getUpdateTimestamp()) > FatClientTimeout) { diff --git a/src/java/org/apache/cassandra/hadoop/AbstractBulkRecordWriter.java b/src/java/org/apache/cassandra/hadoop/AbstractBulkRecordWriter.java index 22255a6683ee..9ec37f408781 100644 --- a/src/java/org/apache/cassandra/hadoop/AbstractBulkRecordWriter.java +++ b/src/java/org/apache/cassandra/hadoop/AbstractBulkRecordWriter.java @@ -85,7 +85,6 @@ protected AbstractBulkRecordWriter(Configuration conf, Progressable progress) protected AbstractBulkRecordWriter(Configuration conf) { - Config.setClientMode(true); Config.setOutboundBindAny(true); this.conf = conf; DatabaseDescriptor.setStreamThroughputOutboundMegabitsPerSec(Integer.parseInt(conf.get(STREAM_THROTTLE_MBITS, "0"))); diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableLoader.java b/src/java/org/apache/cassandra/io/sstable/SSTableLoader.java index 991fa1de5e7e..68bc6ab57d4c 100644 --- a/src/java/org/apache/cassandra/io/sstable/SSTableLoader.java +++ b/src/java/org/apache/cassandra/io/sstable/SSTableLoader.java @@ -57,7 +57,6 @@ public class SSTableLoader implements StreamEventHandler static { - Config.setClientMode(true); } public SSTableLoader(File directory, Client client, OutputHandler outputHandler) diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableReader.java b/src/java/org/apache/cassandra/io/sstable/SSTableReader.java index b897496af699..1bc7a241a227 100644 --- a/src/java/org/apache/cassandra/io/sstable/SSTableReader.java +++ b/src/java/org/apache/cassandra/io/sstable/SSTableReader.java @@ -506,10 +506,9 @@ private SSTableReader(final Descriptor desc, deletingTask = new SSTableDeletingTask(this); - // Don't track read rates for tables in the system keyspace and don't bother trying to load or persist - // the read meter when in client mode. Also don't track reads for special operations (like early open) + // Don't track read rates for tables in the system keyspace. Also don't track reads for special operations (like early open) // this is to avoid overflowing the executor queue (see CASSANDRA-8066) - if (Keyspace.SYSTEM_KS.equals(desc.ksname) || Config.isClientMode() || openReason != OpenReason.NORMAL) + if (Keyspace.SYSTEM_KS.equals(desc.ksname) || openReason != OpenReason.NORMAL) { readMeter = null; readMeterSyncFuture = null; diff --git a/src/java/org/apache/cassandra/service/AbstractReadExecutor.java b/src/java/org/apache/cassandra/service/AbstractReadExecutor.java index d08c63e6bcbc..061a01b964c6 100644 --- a/src/java/org/apache/cassandra/service/AbstractReadExecutor.java +++ b/src/java/org/apache/cassandra/service/AbstractReadExecutor.java @@ -157,11 +157,6 @@ public static AbstractReadExecutor getReadExecutor(ReadCommand command, Consiste // Throw UAE early if we don't have enough replicas. consistencyLevel.assureSufficientLiveNodes(keyspace, targetReplicas); - // Fat client. Speculating read executors need access to cfs metrics and sampled latency, and fat clients - // can't provide that. So, for now, fat clients will always use NeverSpeculatingReadExecutor. - if (StorageService.instance.isClientMode()) - return new NeverSpeculatingReadExecutor(command, consistencyLevel, targetReplicas); - if (repairDecision != ReadRepairDecision.NONE) ReadRepairMetrics.attempted.mark(); diff --git a/src/java/org/apache/cassandra/service/MigrationManager.java b/src/java/org/apache/cassandra/service/MigrationManager.java index 4f0348343538..449560c38925 100644 --- a/src/java/org/apache/cassandra/service/MigrationManager.java +++ b/src/java/org/apache/cassandra/service/MigrationManager.java @@ -148,7 +148,7 @@ private static boolean shouldPullSchemaFrom(InetAddress endpoint) */ return MessagingService.instance().knowsVersion(endpoint) && MessagingService.instance().getRawVersion(endpoint) == MessagingService.current_version - && !Gossiper.instance.isFatClient(endpoint); + && !Gossiper.instance.isGossipOnlyMember(endpoint); } public static boolean isReadyForBootstrap() diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index eb4c3e26a6b2..0982047f8881 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -178,15 +178,13 @@ public Collection> getPrimaryRangesWithinDC(String keyspace) /* we bootstrap but do NOT join the ring unless told to do so */ private boolean isSurveyMode= Boolean.parseBoolean(System.getProperty("cassandra.write_survey", "false")); - /* when intialized as a client, we shouldn't write to the system keyspace. */ - private boolean isClientMode; private boolean initialized; private volatile boolean joined = false; /* the probability for tracing any particular request, 0 disables tracing and 1 enables for all */ private double traceProbability = 0.0; - private static enum Mode { STARTING, NORMAL, CLIENT, JOINING, LEAVING, DECOMMISSIONED, MOVING, DRAINING, DRAINED } + private static enum Mode { STARTING, NORMAL, JOINING, LEAVING, DECOMMISSIONED, MOVING, DRAINING, DRAINED } private Mode operationMode = Mode.STARTING; /* Used for tracking drain progress */ @@ -455,7 +453,7 @@ public synchronized void checkForEndpointCollision() throws ConfigurationExcepti MessagingService.instance().listen(FBUtilities.getLocalAddress()); Gossiper.instance.doShadowRound(); EndpointState epState = Gossiper.instance.getEndpointStateForEndpoint(FBUtilities.getBroadcastAddress()); - if (epState != null && !Gossiper.instance.isDeadState(epState) && !Gossiper.instance.isFatClient(FBUtilities.getBroadcastAddress())) + if (epState != null && !Gossiper.instance.isDeadState(epState) && !Gossiper.instance.isGossipOnlyMember(FBUtilities.getBroadcastAddress())) { throw new RuntimeException(String.format("A node with address %s already exists, cancelling join. " + "Use cassandra.replace_address if you want to replace this node.", @@ -478,49 +476,15 @@ public synchronized void checkForEndpointCollision() throws ConfigurationExcepti Gossiper.instance.resetEndpointStateMap(); } - public synchronized void initClient() throws ConfigurationException + // for testing only + public void unsafeInitialize() throws ConfigurationException { - // We don't wait, because we're going to actually try to work on - initClient(0); - - // sleep a while to allow gossip to warm up (the other nodes need to know about this one before they can reply). - outer: - while (true) - { - Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS); - for (InetAddress address : Gossiper.instance.getLiveMembers()) - { - if (!Gossiper.instance.isFatClient(address)) - break outer; - } - } - - // sleep until any schema migrations have finished - while (!MigrationManager.isReadyForBootstrap()) - { - Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS); - } - } - - public synchronized void initClient(int ringDelay) throws ConfigurationException - { - if (initialized) - { - if (!isClientMode) - throw new UnsupportedOperationException("StorageService does not support switching modes."); - return; - } initialized = true; - isClientMode = true; - logger.info("Starting up client gossip"); - setMode(Mode.CLIENT, false); Gossiper.instance.register(this); Gossiper.instance.start((int) (System.currentTimeMillis() / 1000)); // needed for node-ring gathering. Gossiper.instance.addLocalApplicationState(ApplicationState.NET_VERSION, valueFactory.networkVersion()); - if (!MessagingService.instance().isListening()) MessagingService.instance().listen(FBUtilities.getLocalAddress()); - Uninterruptibles.sleepUninterruptibly(ringDelay, TimeUnit.MILLISECONDS); } public synchronized void initServer() throws ConfigurationException @@ -534,14 +498,7 @@ public synchronized void initServer(int delay) throws ConfigurationException logger.info("Thrift API version: {}", cassandraConstants.VERSION); logger.info("CQL supported versions: {} (default: {})", StringUtils.join(ClientState.getCQLSupportedVersion(), ","), ClientState.DEFAULT_CQL_VERSION); - if (initialized) - { - if (isClientMode) - throw new UnsupportedOperationException("StorageService does not support switching modes."); - return; - } initialized = true; - isClientMode = false; try { @@ -1608,21 +1565,18 @@ else if (Gossiper.instance.compareEndpointStartup(endpoint, existing) > 0) { logger.debug("New node {} at token {}", endpoint, token); tokensToUpdateInMetadata.add(token); - if (!isClientMode) - tokensToUpdateInSystemKeyspace.add(token); + tokensToUpdateInSystemKeyspace.add(token); } else if (endpoint.equals(currentOwner)) { // set state back to normal, since the node may have tried to leave, but failed and is now back up tokensToUpdateInMetadata.add(token); - if (!isClientMode) - tokensToUpdateInSystemKeyspace.add(token); + tokensToUpdateInSystemKeyspace.add(token); } else if (Gossiper.instance.compareEndpointStartup(endpoint, currentOwner) > 0) { tokensToUpdateInMetadata.add(token); - if (!isClientMode) - tokensToUpdateInSystemKeyspace.add(token); + tokensToUpdateInSystemKeyspace.add(token); // currentOwner is no longer current, endpoint is. Keep track of these moves, because when // a host no longer has any tokens, we'll want to remove it. @@ -1658,12 +1612,8 @@ else if (Gossiper.instance.compareEndpointStartup(endpoint, currentOwner) > 0) if (tokenMetadata.isMoving(endpoint)) // if endpoint was moving to a new token { tokenMetadata.removeFromMoving(endpoint); - - if (!isClientMode) - { - for (IEndpointLifecycleSubscriber subscriber : lifecycleSubscribers) - subscriber.onMove(endpoint); - } + for (IEndpointLifecycleSubscriber subscriber : lifecycleSubscribers) + subscriber.onMove(endpoint); } PendingRangeCalculatorService.instance.update(); @@ -1803,11 +1753,8 @@ private void excise(Collection tokens, InetAddress endpoint) tokenMetadata.removeEndpoint(endpoint); tokenMetadata.removeBootstrapTokens(tokens); - if (!isClientMode) - { - for (IEndpointLifecycleSubscriber subscriber : lifecycleSubscribers) - subscriber.onLeaveCluster(endpoint); - } + for (IEndpointLifecycleSubscriber subscriber : lifecycleSubscribers) + subscriber.onLeaveCluster(endpoint); PendingRangeCalculatorService.instance.update(); } @@ -1821,8 +1768,7 @@ private void excise(Collection tokens, InetAddress endpoint, long expireT private void removeEndpoint(InetAddress endpoint) { Gossiper.instance.removeEndpoint(endpoint); - if (!isClientMode) - SystemKeyspace.removeEndpoint(endpoint); + SystemKeyspace.removeEndpoint(endpoint); } protected void addExpireTimeIfFound(InetAddress endpoint, long expireTime) @@ -2019,9 +1965,6 @@ public void onAlive(InetAddress endpoint, EndpointState state) { MigrationManager.instance.scheduleSchemaPull(endpoint, state); - if (isClientMode) - return; - if (tokenMetadata.isMember(endpoint)) { HintedHandOffManager.instance.scheduleHintDelivery(endpoint); @@ -2044,11 +1987,8 @@ public void onRemove(InetAddress endpoint) public void onDead(InetAddress endpoint, EndpointState state) { MessagingService.instance().convict(endpoint); - if (!isClientMode) - { - for (IEndpointLifecycleSubscriber subscriber : lifecycleSubscribers) - subscriber.onDown(endpoint); - } + for (IEndpointLifecycleSubscriber subscriber : lifecycleSubscribers) + subscriber.onDown(endpoint); } public void onRestart(InetAddress endpoint, EndpointState state) @@ -3579,11 +3519,6 @@ public void confirmReplication(InetAddress node) } } - public boolean isClientMode() - { - return isClientMode; - } - public synchronized void requestGC() { if (hasUnreclaimedSpace()) diff --git a/test/unit/org/apache/cassandra/locator/DynamicEndpointSnitchTest.java b/test/unit/org/apache/cassandra/locator/DynamicEndpointSnitchTest.java index e23bcfa31255..c7c1f174cf7c 100644 --- a/test/unit/org/apache/cassandra/locator/DynamicEndpointSnitchTest.java +++ b/test/unit/org/apache/cassandra/locator/DynamicEndpointSnitchTest.java @@ -49,7 +49,7 @@ private static void setScores(DynamicEndpointSnitch dsnitch, int rounds, List Date: Tue, 14 Oct 2014 10:40:29 -0500 Subject: [PATCH 161/557] remove empty static constructor --- src/java/org/apache/cassandra/io/sstable/SSTableLoader.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableLoader.java b/src/java/org/apache/cassandra/io/sstable/SSTableLoader.java index 68bc6ab57d4c..6cb7f033a49a 100644 --- a/src/java/org/apache/cassandra/io/sstable/SSTableLoader.java +++ b/src/java/org/apache/cassandra/io/sstable/SSTableLoader.java @@ -55,10 +55,6 @@ public class SSTableLoader implements StreamEventHandler private final List sstables = new ArrayList<>(); private final Multimap streamingDetails = HashMultimap.create(); - static - { - } - public SSTableLoader(File directory, Client client, OutputHandler outputHandler) { this(directory, client, outputHandler, 1); From 3ef892001425f0ec67aa9f232bec5ecd29520e12 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Tue, 14 Oct 2014 15:19:37 -0500 Subject: [PATCH 162/557] bump base version to 3.0 --- build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.xml b/build.xml index b758e0aa07ac..07d0578767b6 100644 --- a/build.xml +++ b/build.xml @@ -25,7 +25,7 @@ - + From 027006dcb0931e5b93f5378494831aadc3baa809 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Wed, 15 Oct 2014 15:15:24 -0500 Subject: [PATCH 163/557] Allow CassandraDaemon to be run as a managed service Patch by Heiko Braun, reviewed by brandonwilliams for CASSANDRA-7997 --- .../cassandra/config/DatabaseDescriptor.java | 25 ++-------- .../cassandra/service/CassandraDaemon.java | 48 ++++++++++++++----- .../cassandra/service/StorageService.java | 2 - 3 files changed, 42 insertions(+), 33 deletions(-) diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java index 319801d078e2..8659c94d35ba 100644 --- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java +++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java @@ -119,17 +119,9 @@ public class DatabaseDescriptor { applyConfig(loadConfig()); } - catch (ConfigurationException e) - { - logger.error("Fatal configuration error", e); - System.err.println(e.getMessage() + "\nFatal configuration error; unable to start. See log for stacktrace."); - System.exit(1); - } catch (Exception e) { - logger.error("Fatal error during configuration loading", e); - System.err.println(e.getMessage() + "\nFatal error during configuration loading; unable to start. See log for stacktrace."); - System.exit(1); + throw new ExceptionInInitializerError(e.getMessage() + "\nFatal configuration error; unable to start. See log for stacktrace."); } } @@ -601,9 +593,7 @@ else if (conf.num_tokens > MAX_NUM_TOKENS) // there are about 5 checked exceptions that could be thrown here. catch (Exception e) { - logger.error("Fatal configuration error", e); - System.err.println(e.getMessage() + "\nFatal configuration error; unable to start server. See log for stacktrace."); - System.exit(1); + throw new ConfigurationException(e.getMessage() + "\nFatal configuration error; unable to start server. See log for stacktrace."); } if (seedProvider.getSeeds().size() == 0) throw new ConfigurationException("The seed provider lists no seeds."); @@ -722,15 +712,11 @@ public static void createAllDirectories() } catch (ConfigurationException e) { - logger.error("Fatal error: {}", e.getMessage()); - System.err.println("Bad configuration; unable to start server"); - System.exit(1); + throw new IllegalArgumentException("Bad configuration; unable to start server: "+e.getMessage()); } catch (FSWriteError e) { - logger.error("Fatal error: {}", e.getMessage()); - System.err.println(e.getCause().getMessage() + "; unable to start server"); - System.exit(1); + throw new IllegalStateException(e.getCause().getMessage() + "; unable to start server"); } } @@ -1571,8 +1557,7 @@ public static MemtablePool getMemtableAllocatorPool() case offheap_buffers: if (!FileUtils.isCleanerAvailable()) { - logger.error("Could not free direct byte buffer: offheap_buffers is not a safe memtable_allocation_type without this ability, please adjust your config. This feature is only guaranteed to work on an Oracle JVM. Refusing to start."); - System.exit(-1); + throw new IllegalStateException("Could not free direct byte buffer: offheap_buffers is not a safe memtable_allocation_type without this ability, please adjust your config. This feature is only guaranteed to work on an Oracle JVM. Refusing to start."); } return new SlabPool(heapLimit, offHeapLimit, conf.memtable_cleanup_threshold, new ColumnFamilyStore.FlushLargestColumnFamily()); case offheap_objects: diff --git a/src/java/org/apache/cassandra/service/CassandraDaemon.java b/src/java/org/apache/cassandra/service/CassandraDaemon.java index cc81c4fb5fa6..be94cf6f289c 100644 --- a/src/java/org/apache/cassandra/service/CassandraDaemon.java +++ b/src/java/org/apache/cassandra/service/CassandraDaemon.java @@ -77,6 +77,16 @@ public class CassandraDaemon public Server thriftServer; public Server nativeServer; + private final boolean runManaged; + + public CassandraDaemon() { + this(false); + } + + public CassandraDaemon(boolean runManaged) { + this.runManaged = runManaged; + } + /** * This is a hook for concrete daemons to initialize themselves suitably. * @@ -140,8 +150,7 @@ else if (!javaVmName.contains("HotSpot")) if (jnaRequired) { - logger.error("JNA failing to initialize properly. Use -Dcassandra.boot_without_jna=true to bootstrap even so."); - System.exit(3); + exitOrFail(3, "JNA failing to initialize properly. Use -Dcassandra.boot_without_jna=true to bootstrap even so."); } } @@ -198,15 +207,14 @@ public void uncaughtException(Thread t, Throwable e) // if they don't, failing their creation, stop cassandra. if (!dir.mkdirs()) { - logger.error("Has no permission to create {} directory", dataDir); - System.exit(3); + exitOrFail(3, "Has no permission to create directory "+ dataDir); } } // if directories exist verify their permissions if (!Directories.verifyFullPermissions(dir, dataDir)) { // if permissions aren't sufficient, stop cassandra. - System.exit(3); + exitOrFail(3, "Insufficient permissions on directory " + dataDir); } @@ -226,10 +234,10 @@ public void uncaughtException(Thread t, Throwable e) } catch (ConfigurationException e) { - logger.error("Fatal exception during initialization", e); - System.exit(100); + exitOrFail(100, "Fatal exception during initialization", e); } + // load keyspace && function descriptions. DatabaseDescriptor.loadSchemas(); Functions.loadUDFFromSchema(); @@ -337,9 +345,8 @@ public void run() } catch (ConfigurationException e) { - logger.error("Fatal configuration error", e); System.err.println(e.getMessage() + "\nFatal configuration error; unable to start server. See log for stacktrace."); - System.exit(1); + exitOrFail(1, "Fatal configuration error", e); } Mx4jTool.maybeLoad(); @@ -474,8 +481,7 @@ public void activate() // try to warn user on stdout too, if we haven't already detached e.printStackTrace(); System.out.println("Exception encountered during startup: " + e.getMessage()); - - System.exit(3); + exitOrFail(3, "Exception encountered during startup", e); } } @@ -486,6 +492,10 @@ public void deactivate() { stop(); destroy(); + // completely shut down cassandra + if(!runManaged) { + System.exit(0); + } } private void waitForGossipToSettle() @@ -543,6 +553,22 @@ public static void main(String[] args) { instance.activate(); } + + private void exitOrFail(int code, String message) { + exitOrFail(code, message, null); + } + + private void exitOrFail(int code, String message, Throwable cause) { + if(runManaged) { + RuntimeException t = cause!=null ? new RuntimeException(message, cause) : new RuntimeException(message); + throw t; + } + else { + logger.error(message, cause); + System.exit(code); + } + + } static class NativeAccess implements NativeAccessMBean { diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index 0982047f8881..b341276cf35f 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -412,8 +412,6 @@ public void stopDaemon() if (daemon == null) throw new IllegalStateException("No configured daemon"); daemon.deactivate(); - // completely shut down cassandra - System.exit(0); } public synchronized Collection prepareReplacementInfo() throws ConfigurationException From c235603475358e458c6ce9fed983b68e604d5e25 Mon Sep 17 00:00:00 2001 From: T Jake Luciani Date: Tue, 21 Oct 2014 09:57:12 -0400 Subject: [PATCH 164/557] Integrate JMH into build system patch by tjake; reviewed by Jason Brown for CASSANDRA-8151 --- CHANGES.txt | 1 + build.xml | 26 ++++ .../cassandra/test/microbench/Sample.java | 130 ++++++++++++++++++ 3 files changed, 157 insertions(+) create mode 100644 test/microbench/org/apache/cassandra/test/microbench/Sample.java diff --git a/CHANGES.txt b/CHANGES.txt index c1d262d06d37..85cb24bf92f4 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0 + * Integrate JMH for microbenchmarks (CASSANDRA-8151) * Keep sstable levels when bootstrapping (CASSANDRA-7460) * Add Sigar library and perform basic OS settings check on startup (CASSANDRA-7838) * Support for aggregation functions (CASSANDRA-4914) diff --git a/build.xml b/build.xml index 07d0578767b6..9cd80c21c935 100644 --- a/build.xml +++ b/build.xml @@ -56,10 +56,12 @@ + + @@ -356,6 +358,9 @@ + + + @@ -415,6 +420,8 @@ + + + @@ -1510,6 +1518,24 @@ ]]> + + + + + + + + + + + + + + + + diff --git a/test/microbench/org/apache/cassandra/test/microbench/Sample.java b/test/microbench/org/apache/cassandra/test/microbench/Sample.java new file mode 100644 index 000000000000..1f149c0ecf4e --- /dev/null +++ b/test/microbench/org/apache/cassandra/test/microbench/Sample.java @@ -0,0 +1,130 @@ +/** + * 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.test.microbench; + +import net.jpountz.lz4.LZ4Compressor; +import net.jpountz.lz4.LZ4Factory; +import net.jpountz.lz4.LZ4FastDecompressor; +import org.openjdk.jmh.annotations.*; +import org.xerial.snappy.Snappy; + +import java.io.IOException; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; + +@BenchmarkMode(Mode.Throughput) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +@Measurement(iterations = 5, time = 2, timeUnit = TimeUnit.SECONDS) +@Fork(value = 1,jvmArgsAppend = "-Xmx512M") +@Threads(1) +@State(Scope.Benchmark) +public class Sample +{ + @Param({"65536"}) + private int pageSize; + + @Param({"1024"}) + private int uniquePages; + + @Param({"0.1"}) + private double randomRatio; + + @Param({"4..16"}) + private String randomRunLength; + + @Param({"4..128"}) + private String duplicateLookback; + + private byte[][] lz4Bytes; + private byte[][] snappyBytes; + private byte[][] rawBytes; + + private LZ4FastDecompressor lz4Decompressor = LZ4Factory.fastestInstance().fastDecompressor(); + + private LZ4Compressor lz4Compressor = LZ4Factory.fastestInstance().fastCompressor(); + + @State(Scope.Thread) + public static class ThreadState + { + byte[] bytes; + } + + @Setup + public void setup() throws IOException + { + ThreadLocalRandom random = ThreadLocalRandom.current(); + int[] randomRunLength = range(this.randomRunLength); + int[] duplicateLookback = range(this.duplicateLookback); + rawBytes = new byte[uniquePages][pageSize]; + lz4Bytes = new byte[uniquePages][]; + snappyBytes = new byte[uniquePages][]; + byte[][] runs = new byte[duplicateLookback[1] - duplicateLookback[0]][]; + for (int i = 0 ; i < rawBytes.length ; i++) + { + byte[] trg = rawBytes[0]; + int runCount = 0; + int byteCount = 0; + while (byteCount < trg.length) + { + byte[] nextRun; + if (runCount == 0 || random.nextDouble() < this.randomRatio) + { + nextRun = new byte[random.nextInt(randomRunLength[0], randomRunLength[1])]; + random.nextBytes(nextRun ); + runs[runCount % runs.length] = nextRun; + runCount++; + } + else + { + int index = runCount < duplicateLookback[1] + ? random.nextInt(runCount) + : (runCount - random.nextInt(duplicateLookback[0], duplicateLookback[1])); + nextRun = runs[index % runs.length]; + } + System.arraycopy(nextRun, 0, trg, byteCount, Math.min(nextRun.length, trg.length - byteCount)); + byteCount += nextRun.length; + } + lz4Bytes[i] = lz4Compressor.compress(trg); + snappyBytes[i] = Snappy.compress(trg); + } + } + + static int[] range(String spec) + { + String[] split = spec.split("\\.\\."); + return new int[] { Integer.parseInt(split[0]), Integer.parseInt(split[1]) }; + } + + @Benchmark + public void lz4(ThreadState state) + { + if (state.bytes == null) + state.bytes = new byte[this.pageSize]; + byte[] in = lz4Bytes[ThreadLocalRandom.current().nextInt(lz4Bytes.length)]; + lz4Decompressor.decompress(in, state.bytes); + } + + @Benchmark + public void snappy(ThreadState state) throws IOException + { + byte[] in = snappyBytes[ThreadLocalRandom.current().nextInt(snappyBytes.length)]; + state.bytes = Snappy.uncompress(in); + } +} From f2673082ce379d2be72871d017b9f47be4dcfa87 Mon Sep 17 00:00:00 2001 From: Rajanarayanan Thottuvaikkatumana Date: Tue, 21 Oct 2014 15:06:03 -0500 Subject: [PATCH 165/557] Avoid boxing in ColumnStats min/max trackers Patch by Rajanarayanan Thottuvaikkatumana; reviewed by Tyler Hobbs for CASSANDRA-8109 --- CHANGES.txt | 1 + .../org/apache/cassandra/db/ColumnFamily.java | 6 +- .../db/compaction/LazilyCompactedRow.java | 6 +- .../cassandra/io/sstable/ColumnStats.java | 63 ++++++++++++++----- .../cassandra/io/sstable/SSTableWriter.java | 6 +- 5 files changed, 59 insertions(+), 23 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index cdae72a018ee..bc0269f7ef87 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0 + * Avoid boxing in ColumnStats min/max trackers (CASSANDRA-8109) * Integrate JMH for microbenchmarks (CASSANDRA-8151) * Keep sstable levels when bootstrapping (CASSANDRA-7460) * Add Sigar library and perform basic OS settings check on startup (CASSANDRA-7838) diff --git a/src/java/org/apache/cassandra/db/ColumnFamily.java b/src/java/org/apache/cassandra/db/ColumnFamily.java index 06139bb0b7dc..25904aed4c77 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamily.java +++ b/src/java/org/apache/cassandra/db/ColumnFamily.java @@ -401,10 +401,10 @@ public ColumnStats getColumnStats() // note that we default to MIN_VALUE/MAX_VALUE here to be able to override them later in this method // we are checking row/range tombstones and actual cells - there should always be data that overrides // these with actual values - ColumnStats.MinTracker minTimestampTracker = new ColumnStats.MinTracker<>(Long.MIN_VALUE); - ColumnStats.MaxTracker maxTimestampTracker = new ColumnStats.MaxTracker<>(Long.MAX_VALUE); + ColumnStats.MinLongTracker minTimestampTracker = new ColumnStats.MinLongTracker(Long.MIN_VALUE); + ColumnStats.MaxLongTracker maxTimestampTracker = new ColumnStats.MaxLongTracker(Long.MAX_VALUE); StreamingHistogram tombstones = new StreamingHistogram(SSTable.TOMBSTONE_HISTOGRAM_BIN_SIZE); - ColumnStats.MaxTracker maxDeletionTimeTracker = new ColumnStats.MaxTracker<>(Integer.MAX_VALUE); + ColumnStats.MaxIntTracker maxDeletionTimeTracker = new ColumnStats.MaxIntTracker(Integer.MAX_VALUE); List minColumnNamesSeen = Collections.emptyList(); List maxColumnNamesSeen = Collections.emptyList(); boolean hasLegacyCounterShards = false; diff --git a/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java b/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java index fa59dba49060..cfdbd1755ddc 100644 --- a/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java +++ b/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java @@ -198,11 +198,11 @@ private class Reducer extends MergeIterator.Reducer // if the row tombstone is 'live' we need to set timestamp to MAX_VALUE to be able to overwrite it later // markedForDeleteAt is MIN_VALUE for 'live' row tombstones (which we use to default maxTimestampSeen) - ColumnStats.MinTracker minTimestampTracker = new ColumnStats.MinTracker<>(Long.MIN_VALUE); - ColumnStats.MaxTracker maxTimestampTracker = new ColumnStats.MaxTracker<>(Long.MAX_VALUE); + ColumnStats.MinLongTracker minTimestampTracker = new ColumnStats.MinLongTracker(Long.MIN_VALUE); + ColumnStats.MaxLongTracker maxTimestampTracker = new ColumnStats.MaxLongTracker(Long.MAX_VALUE); // we need to set MIN_VALUE if we are 'live' since we want to overwrite it later // we are bound to have either a RangeTombstone or standard cells will set this properly: - ColumnStats.MaxTracker maxDeletionTimeTracker = new ColumnStats.MaxTracker<>(Integer.MAX_VALUE); + ColumnStats.MaxIntTracker maxDeletionTimeTracker = new ColumnStats.MaxIntTracker(Integer.MAX_VALUE); StreamingHistogram tombstones = new StreamingHistogram(SSTable.TOMBSTONE_HISTOGRAM_BIN_SIZE); List minColumnNameSeen = Collections.emptyList(); diff --git a/src/java/org/apache/cassandra/io/sstable/ColumnStats.java b/src/java/org/apache/cassandra/io/sstable/ColumnStats.java index 873aa091bbbf..323d3348455d 100644 --- a/src/java/org/apache/cassandra/io/sstable/ColumnStats.java +++ b/src/java/org/apache/cassandra/io/sstable/ColumnStats.java @@ -63,18 +63,19 @@ public ColumnStats(int columnCount, this.hasLegacyCounterShards = hasLegacyCounterShards; } - public static class MinTracker> + // We use explicit classes for ints and longs instead of generics to avoid boxing and unboxing (See CASSANDRA-8109) + public static class MinLongTracker { - private final T defaultValue; + private final long defaultValue; private boolean isSet = false; - private T value; + private long value; - public MinTracker(T defaultValue) + public MinLongTracker(long defaultValue) { this.defaultValue = defaultValue; } - public void update(T value) + public void update(long value) { if (!isSet) { @@ -83,12 +84,12 @@ public void update(T value) } else { - if (value.compareTo(this.value) < 0) + if (value < this.value) this.value = value; } } - public T get() + public long get() { if (isSet) return value; @@ -96,18 +97,18 @@ public T get() } } - public static class MaxTracker> + public static class MaxLongTracker { - private final T defaultValue; + private final long defaultValue; private boolean isSet = false; - private T value; + private long value; - public MaxTracker(T defaultValue) + public MaxLongTracker(long defaultValue) { this.defaultValue = defaultValue; } - public void update(T value) + public void update(long value) { if (!isSet) { @@ -116,16 +117,50 @@ public void update(T value) } else { - if (value.compareTo(this.value) > 0) + if (value >this.value) this.value = value; } } - public T get() + public long get() { if (isSet) return value; return defaultValue; } } + + public static class MaxIntTracker + { + private final int defaultValue; + private boolean isSet = false; + private int value; + + public MaxIntTracker(int defaultValue) + { + this.defaultValue = defaultValue; + } + + public void update(int value) + { + if (!isSet) + { + this.value = value; + isSet = true; + } + else + { + if (value > this.value) + this.value = value; + } + } + + public int get() + { + if (isSet) + return value; + return defaultValue; + } + } + } diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java b/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java index b0b6db8c4044..4da967e172b6 100644 --- a/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java +++ b/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java @@ -250,9 +250,9 @@ public long appendFromStream(DecoratedKey key, CFMetaData metadata, DataInput in { long currentPosition = beforeAppend(key); - ColumnStats.MaxTracker maxTimestampTracker = new ColumnStats.MaxTracker<>(Long.MAX_VALUE); - ColumnStats.MinTracker minTimestampTracker = new ColumnStats.MinTracker<>(Long.MIN_VALUE); - ColumnStats.MaxTracker maxDeletionTimeTracker = new ColumnStats.MaxTracker<>(Integer.MAX_VALUE); + ColumnStats.MaxLongTracker maxTimestampTracker = new ColumnStats.MaxLongTracker(Long.MAX_VALUE); + ColumnStats.MinLongTracker minTimestampTracker = new ColumnStats.MinLongTracker(Long.MIN_VALUE); + ColumnStats.MaxIntTracker maxDeletionTimeTracker = new ColumnStats.MaxIntTracker(Integer.MAX_VALUE); List minColumnNames = Collections.emptyList(); List maxColumnNames = Collections.emptyList(); StreamingHistogram tombstones = new StreamingHistogram(TOMBSTONE_HISTOGRAM_BIN_SIZE); From 7e53db0b927ad2f7bd25dbebc6c01a942afd79da Mon Sep 17 00:00:00 2001 From: blerer Date: Tue, 14 Oct 2014 13:17:57 +0200 Subject: [PATCH 166/557] Fix NPE when preparing statements patch by blere; reviewed by slebresne for CASSANDRA-8090 --- .../cassandra/cql3/ColumnIdentifier.java | 18 +- .../cassandra/cql3/ColumnSpecification.java | 11 + src/java/org/apache/cassandra/cql3/Cql.g | 1 + .../selection/AbstractFunctionSelector.java | 111 +++ .../selection/AggregateFunctionSelector.java | 66 ++ .../cql3/selection/FieldSelector.java | 104 +++ .../RawSelector.java | 24 +- .../selection/ScalarFunctionSelector.java | 67 ++ .../cassandra/cql3/selection/Selectable.java | 166 ++++ .../cassandra/cql3/selection/Selection.java | 390 +++++++++ .../cassandra/cql3/selection/Selector.java | 140 ++++ .../cql3/selection/SelectorFactories.java | 151 ++++ .../cql3/selection/SimpleSelector.java | 87 ++ .../selection/WritetimeOrTTLSelector.java | 110 +++ .../statements/ModificationStatement.java | 1 + .../cql3/statements/SelectStatement.java | 2 + .../cassandra/cql3/statements/Selectable.java | 89 -- .../cassandra/cql3/statements/Selection.java | 770 ------------------ 18 files changed, 1446 insertions(+), 862 deletions(-) create mode 100644 src/java/org/apache/cassandra/cql3/selection/AbstractFunctionSelector.java create mode 100644 src/java/org/apache/cassandra/cql3/selection/AggregateFunctionSelector.java create mode 100644 src/java/org/apache/cassandra/cql3/selection/FieldSelector.java rename src/java/org/apache/cassandra/cql3/{statements => selection}/RawSelector.java (61%) create mode 100644 src/java/org/apache/cassandra/cql3/selection/ScalarFunctionSelector.java create mode 100644 src/java/org/apache/cassandra/cql3/selection/Selectable.java create mode 100644 src/java/org/apache/cassandra/cql3/selection/Selection.java create mode 100644 src/java/org/apache/cassandra/cql3/selection/Selector.java create mode 100644 src/java/org/apache/cassandra/cql3/selection/SelectorFactories.java create mode 100644 src/java/org/apache/cassandra/cql3/selection/SimpleSelector.java create mode 100644 src/java/org/apache/cassandra/cql3/selection/WritetimeOrTTLSelector.java delete mode 100644 src/java/org/apache/cassandra/cql3/statements/Selectable.java delete mode 100644 src/java/org/apache/cassandra/cql3/statements/Selection.java diff --git a/src/java/org/apache/cassandra/cql3/ColumnIdentifier.java b/src/java/org/apache/cassandra/cql3/ColumnIdentifier.java index fa151d29a6fa..9b4f29f8b1a2 100644 --- a/src/java/org/apache/cassandra/cql3/ColumnIdentifier.java +++ b/src/java/org/apache/cassandra/cql3/ColumnIdentifier.java @@ -17,12 +17,18 @@ */ package org.apache.cassandra.cql3; +import java.util.List; import java.util.Locale; import java.nio.ByteBuffer; import org.apache.cassandra.cache.IMeasurableMemory; -import org.apache.cassandra.cql3.statements.Selectable; +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.ColumnDefinition; +import org.apache.cassandra.cql3.selection.Selectable; +import org.apache.cassandra.cql3.selection.Selector; +import org.apache.cassandra.cql3.selection.SimpleSelector; import org.apache.cassandra.db.marshal.AbstractType; +import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.ObjectSizes; import org.apache.cassandra.utils.memory.AbstractAllocator; @@ -31,7 +37,7 @@ * Represents an identifer for a CQL column definition. * TODO : should support light-weight mode without text representation for when not interned */ -public class ColumnIdentifier implements Selectable, IMeasurableMemory +public class ColumnIdentifier extends Selectable implements IMeasurableMemory { public final ByteBuffer bytes; private final String text; @@ -101,4 +107,12 @@ public ColumnIdentifier clone(AbstractAllocator allocator) return new ColumnIdentifier(allocator.clone(bytes), text); } + public Selector.Factory newSelectorFactory(CFMetaData cfm, List defs) throws InvalidRequestException + { + ColumnDefinition def = cfm.getColumnDefinition(this); + if (def == null) + throw new InvalidRequestException(String.format("Undefined name %s in selection clause", this)); + + return SimpleSelector.newFactory(def.name.toString(), addAndGetIndex(def, defs), def.type); + } } diff --git a/src/java/org/apache/cassandra/cql3/ColumnSpecification.java b/src/java/org/apache/cassandra/cql3/ColumnSpecification.java index d2e08f9bcee1..2584f857f5a4 100644 --- a/src/java/org/apache/cassandra/cql3/ColumnSpecification.java +++ b/src/java/org/apache/cassandra/cql3/ColumnSpecification.java @@ -33,4 +33,15 @@ public ColumnSpecification(String ksName, String cfName, ColumnIdentifier name, this.name = name; this.type = type; } + + /** + * Returns a new ColumnSpecification for the same column but with the specified alias. + * + * @param alias the column alias + * @return a new ColumnSpecification for the same column but with the specified alias. + */ + public ColumnSpecification withAlias(ColumnIdentifier alias) + { + return new ColumnSpecification(ksName, cfName, alias, type); + } } diff --git a/src/java/org/apache/cassandra/cql3/Cql.g b/src/java/org/apache/cassandra/cql3/Cql.g index 81f7d258b918..7634a4824db1 100644 --- a/src/java/org/apache/cassandra/cql3/Cql.g +++ b/src/java/org/apache/cassandra/cql3/Cql.g @@ -42,6 +42,7 @@ options { import org.apache.cassandra.auth.IResource; import org.apache.cassandra.cql3.*; import org.apache.cassandra.cql3.statements.*; + import org.apache.cassandra.cql3.selection.*; import org.apache.cassandra.cql3.functions.*; import org.apache.cassandra.db.marshal.CollectionType; import org.apache.cassandra.exceptions.ConfigurationException; diff --git a/src/java/org/apache/cassandra/cql3/selection/AbstractFunctionSelector.java b/src/java/org/apache/cassandra/cql3/selection/AbstractFunctionSelector.java new file mode 100644 index 000000000000..b04f3468c3ea --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/selection/AbstractFunctionSelector.java @@ -0,0 +1,111 @@ +/* + * 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.cql3.selection; + +import java.nio.ByteBuffer; +import java.util.Arrays; +import java.util.List; + +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.cql3.ColumnIdentifier; +import org.apache.cassandra.cql3.ColumnSpecification; +import org.apache.cassandra.cql3.functions.Function; +import org.apache.cassandra.db.marshal.AbstractType; +import org.apache.cassandra.exceptions.InvalidRequestException; +import org.apache.commons.lang3.text.StrBuilder; + +abstract class AbstractFunctionSelector extends Selector +{ + protected final T fun; + + /** + * The list used to pass the function arguments is recycled to avoid the cost of instantiating a new list + * with each function call. + */ + protected final List args; + protected final List argSelectors; + + public static Factory newFactory(final Function fun, final SelectorFactories factories) throws InvalidRequestException + { + if (fun.isAggregate()) + { + if (factories.doesAggregation()) + throw new InvalidRequestException("aggregate functions cannot be used as arguments of aggregate functions"); + } + else + { + if (factories.doesAggregation() && !factories.containsOnlyAggregateFunctions()) + throw new InvalidRequestException(String.format("the %s function arguments must be either all aggregates or all none aggregates", + fun.name().name)); + } + + return new Factory() + { + public ColumnSpecification getColumnSpecification(CFMetaData cfm) + { + return new ColumnSpecification(cfm.ksName, + cfm.cfName, + new ColumnIdentifier(fun.toString(), true), + fun.returnType()); + } + + public Selector newInstance() + { + return fun.isAggregate() ? new AggregateFunctionSelector(fun, factories.newInstances()) + : new ScalarFunctionSelector(fun, factories.newInstances()); + } + + public boolean isWritetimeSelectorFactory() + { + return factories.containsWritetimeSelectorFactory(); + } + + public boolean isTTLSelectorFactory() + { + return factories.containsTTLSelectorFactory(); + } + + public boolean isAggregateSelectorFactory() + { + return fun.isAggregate() || factories.containsOnlyAggregateFunctions(); + } + }; + } + + protected AbstractFunctionSelector(T fun, List argSelectors) + { + this.fun = fun; + this.argSelectors = argSelectors; + this.args = Arrays.asList(new ByteBuffer[argSelectors.size()]); + } + + public AbstractType getType() + { + return fun.returnType(); + } + + @Override + public String toString() + { + return new StrBuilder().append(fun.name()) + .append("(") + .appendWithSeparators(argSelectors, ", ") + .append(")") + .toString(); + } +} diff --git a/src/java/org/apache/cassandra/cql3/selection/AggregateFunctionSelector.java b/src/java/org/apache/cassandra/cql3/selection/AggregateFunctionSelector.java new file mode 100644 index 000000000000..6ea9716cfc7f --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/selection/AggregateFunctionSelector.java @@ -0,0 +1,66 @@ +/* + * 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.cql3.selection; + +import java.nio.ByteBuffer; +import java.util.List; + +import org.apache.cassandra.cql3.functions.AggregateFunction; +import org.apache.cassandra.cql3.functions.Function; +import org.apache.cassandra.cql3.selection.Selection.ResultSetBuilder; +import org.apache.cassandra.exceptions.InvalidRequestException; + +final class AggregateFunctionSelector extends AbstractFunctionSelector +{ + private final AggregateFunction.Aggregate aggregate; + + public boolean isAggregate() + { + return true; + } + + public void addInput(ResultSetBuilder rs) throws InvalidRequestException + { + // Aggregation of aggregation is not supported + for (int i = 0, m = argSelectors.size(); i < m; i++) + { + Selector s = argSelectors.get(i); + s.addInput(rs); + args.set(i, s.getOutput()); + s.reset(); + } + this.aggregate.addInput(args); + } + + public ByteBuffer getOutput() throws InvalidRequestException + { + return aggregate.compute(); + } + + public void reset() + { + aggregate.reset(); + } + + AggregateFunctionSelector(Function fun, List argSelectors) + { + super((AggregateFunction) fun, argSelectors); + + this.aggregate = this.fun.newAggregate(); + } +} diff --git a/src/java/org/apache/cassandra/cql3/selection/FieldSelector.java b/src/java/org/apache/cassandra/cql3/selection/FieldSelector.java new file mode 100644 index 000000000000..0bba56c5a46c --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/selection/FieldSelector.java @@ -0,0 +1,104 @@ +/* + * 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.cql3.selection; + +import java.nio.ByteBuffer; + +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.cql3.ColumnIdentifier; +import org.apache.cassandra.cql3.ColumnSpecification; +import org.apache.cassandra.cql3.selection.Selection.ResultSetBuilder; +import org.apache.cassandra.db.marshal.AbstractType; +import org.apache.cassandra.db.marshal.UTF8Type; +import org.apache.cassandra.db.marshal.UserType; +import org.apache.cassandra.exceptions.InvalidRequestException; + +final class FieldSelector extends Selector +{ + private final UserType type; + private final int field; + private final Selector selected; + + public static Factory newFactory(final UserType type, final int field, final Selector.Factory factory) + { + return new Factory() + { + public ColumnSpecification getColumnSpecification(CFMetaData cfm) + { + ColumnIdentifier identifier = + new ColumnIdentifier(String.format("%s.%s", + factory.getColumnSpecification(cfm).name, + UTF8Type.instance.getString(type.fieldName(field))), true); + + return new ColumnSpecification(cfm.ksName, cfm.cfName, identifier, type.fieldType(field)); + } + + public Selector newInstance() + { + return new FieldSelector(type, field, factory.newInstance()); + } + + public boolean isAggregateSelectorFactory() + { + return factory.isAggregateSelectorFactory(); + } + }; + } + + public boolean isAggregate() + { + return false; + } + + public void addInput(ResultSetBuilder rs) throws InvalidRequestException + { + selected.addInput(rs); + } + + public ByteBuffer getOutput() throws InvalidRequestException + { + ByteBuffer value = selected.getOutput(); + if (value == null) + return null; + ByteBuffer[] buffers = type.split(value); + return field < buffers.length ? buffers[field] : null; + } + + public AbstractType getType() + { + return type.fieldType(field); + } + + public void reset() + { + selected.reset(); + } + + @Override + public String toString() + { + return String.format("%s.%s", selected, UTF8Type.instance.getString(type.fieldName(field))); + } + + private FieldSelector(UserType type, int field, Selector selected) + { + this.type = type; + this.field = field; + this.selected = selected; + } +} \ No newline at end of file diff --git a/src/java/org/apache/cassandra/cql3/statements/RawSelector.java b/src/java/org/apache/cassandra/cql3/selection/RawSelector.java similarity index 61% rename from src/java/org/apache/cassandra/cql3/statements/RawSelector.java rename to src/java/org/apache/cassandra/cql3/selection/RawSelector.java index 01fe9e4b9245..372c4b35d7d5 100644 --- a/src/java/org/apache/cassandra/cql3/statements/RawSelector.java +++ b/src/java/org/apache/cassandra/cql3/selection/RawSelector.java @@ -16,10 +16,15 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.cassandra.cql3.statements; +package org.apache.cassandra.cql3.selection; + +import java.util.List; import org.apache.cassandra.cql3.ColumnIdentifier; +import com.google.common.base.Function; +import com.google.common.collect.Lists; + public class RawSelector { public final Selectable selectable; @@ -30,4 +35,21 @@ public RawSelector(Selectable selectable, ColumnIdentifier alias) this.selectable = selectable; this.alias = alias; } + + /** + * Converts the specified list of RawSelectors into a list of Selectables. + * + * @param raws the RawSelectors to converts. + * @return a list of Selectables + */ + public static List toSelectables(List raws) + { + return Lists.transform(raws, new Function() + { + public Selectable apply(RawSelector raw) + { + return raw.selectable; + } + }); + } } diff --git a/src/java/org/apache/cassandra/cql3/selection/ScalarFunctionSelector.java b/src/java/org/apache/cassandra/cql3/selection/ScalarFunctionSelector.java new file mode 100644 index 000000000000..4ceadb9103cb --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/selection/ScalarFunctionSelector.java @@ -0,0 +1,67 @@ +/* + * 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.cql3.selection; + +import java.nio.ByteBuffer; +import java.util.List; + +import org.apache.cassandra.cql3.functions.Function; +import org.apache.cassandra.cql3.functions.ScalarFunction; +import org.apache.cassandra.cql3.selection.Selection.ResultSetBuilder; +import org.apache.cassandra.exceptions.InvalidRequestException; + +final class ScalarFunctionSelector extends AbstractFunctionSelector +{ + public boolean isAggregate() + { + // We cannot just return true as it is possible to have a scalar function wrapping an aggregation function + if (argSelectors.isEmpty()) + return false; + + return argSelectors.get(0).isAggregate(); + } + + public void addInput(ResultSetBuilder rs) throws InvalidRequestException + { + for (int i = 0, m = argSelectors.size(); i < m; i++) + { + Selector s = argSelectors.get(i); + s.addInput(rs); + } + } + + public void reset() + { + } + + public ByteBuffer getOutput() throws InvalidRequestException + { + for (int i = 0, m = argSelectors.size(); i < m; i++) + { + Selector s = argSelectors.get(i); + args.set(i, s.getOutput()); + s.reset(); + } + return fun.execute(args); + } + + ScalarFunctionSelector(Function fun, List argSelectors) + { + super((ScalarFunction) fun, argSelectors); + } +} \ No newline at end of file diff --git a/src/java/org/apache/cassandra/cql3/selection/Selectable.java b/src/java/org/apache/cassandra/cql3/selection/Selectable.java new file mode 100644 index 000000000000..9324647920f7 --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/selection/Selectable.java @@ -0,0 +1,166 @@ +/* + * 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.cql3.selection; + +import java.util.List; + +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.ColumnDefinition; +import org.apache.cassandra.cql3.ColumnIdentifier; +import org.apache.cassandra.cql3.functions.Function; +import org.apache.cassandra.cql3.functions.FunctionName; +import org.apache.cassandra.cql3.functions.Functions; +import org.apache.cassandra.db.marshal.AbstractType; +import org.apache.cassandra.db.marshal.UserType; +import org.apache.cassandra.exceptions.InvalidRequestException; +import org.apache.commons.lang3.text.StrBuilder; + +public abstract class Selectable +{ + public abstract Selector.Factory newSelectorFactory(CFMetaData cfm, List defs) + throws InvalidRequestException; + + protected static int addAndGetIndex(ColumnDefinition def, List l) + { + int idx = l.indexOf(def); + if (idx < 0) + { + idx = l.size(); + l.add(def); + } + return idx; + } + + public static class WritetimeOrTTL extends Selectable + { + public final ColumnIdentifier id; + public final boolean isWritetime; + + public WritetimeOrTTL(ColumnIdentifier id, boolean isWritetime) + { + this.id = id; + this.isWritetime = isWritetime; + } + + @Override + public String toString() + { + return (isWritetime ? "writetime" : "ttl") + "(" + id + ")"; + } + + public Selector.Factory newSelectorFactory(CFMetaData cfm, + List defs) throws InvalidRequestException + { + ColumnDefinition def = cfm.getColumnDefinition(id); + if (def == null) + throw new InvalidRequestException(String.format("Undefined name %s in selection clause", id)); + if (def.isPrimaryKeyColumn()) + throw new InvalidRequestException( + String.format("Cannot use selection function %s on PRIMARY KEY part %s", + isWritetime ? "writeTime" : "ttl", + def.name)); + if (def.type.isCollection()) + throw new InvalidRequestException(String.format("Cannot use selection function %s on collections", + isWritetime ? "writeTime" : "ttl")); + + return WritetimeOrTTLSelector.newFactory(def.name.toString(), addAndGetIndex(def, defs), isWritetime); + } + } + + public static class WithFunction extends Selectable + { + public final FunctionName functionName; + public final List args; + + public WithFunction(FunctionName functionName, List args) + { + this.functionName = functionName; + this.args = args; + } + + @Override + public String toString() + { + return new StrBuilder().append(functionName) + .append("(") + .appendWithSeparators(args, ", ") + .append(")") + .toString(); + } + + public Selector.Factory newSelectorFactory(CFMetaData cfm, + List defs) throws InvalidRequestException + { + SelectorFactories factories = + SelectorFactories.createFactoriesAndCollectColumnDefinitions(args, cfm, defs); + + // resolve built-in functions before user defined functions + Function fun = Functions.get(cfm.ksName, functionName, factories.newInstances(), cfm.ksName, cfm.cfName); + if (fun == null) + throw new InvalidRequestException(String.format("Unknown function '%s'", functionName)); + if (fun.returnType() == null) + throw new InvalidRequestException(String.format("Unknown function %s called in selection clause", + functionName)); + + return AbstractFunctionSelector.newFactory(fun, factories); + } + } + + public static class WithFieldSelection extends Selectable + { + public final Selectable selected; + public final ColumnIdentifier field; + + public WithFieldSelection(Selectable selected, ColumnIdentifier field) + { + this.selected = selected; + this.field = field; + } + + @Override + public String toString() + { + return String.format("%s.%s", selected, field); + } + + public Selector.Factory newSelectorFactory(CFMetaData cfm, + List defs) throws InvalidRequestException + { + Selector.Factory factory = selected.newSelectorFactory(cfm, defs); + AbstractType type = factory.newInstance().getType(); + if (!(type instanceof UserType)) + throw new InvalidRequestException( + String.format("Invalid field selection: %s of type %s is not a user type", + selected, + type.asCQL3Type())); + + UserType ut = (UserType) type; + for (int i = 0; i < ut.size(); i++) + { + if (!ut.fieldName(i).equals(field.bytes)) + continue; + return FieldSelector.newFactory(ut, i, factory); + } + throw new InvalidRequestException(String.format("%s of type %s has no field %s", + selected, + type.asCQL3Type(), + field)); + } + } +} diff --git a/src/java/org/apache/cassandra/cql3/selection/Selection.java b/src/java/org/apache/cassandra/cql3/selection/Selection.java new file mode 100644 index 000000000000..67cce72b92c9 --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/selection/Selection.java @@ -0,0 +1,390 @@ +/* + * 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.cql3.selection; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.ColumnDefinition; +import org.apache.cassandra.cql3.ColumnIdentifier; +import org.apache.cassandra.cql3.ColumnSpecification; +import org.apache.cassandra.cql3.ResultSet; +import org.apache.cassandra.db.Cell; +import org.apache.cassandra.db.CounterCell; +import org.apache.cassandra.db.ExpiringCell; +import org.apache.cassandra.db.context.CounterContext; +import org.apache.cassandra.exceptions.InvalidRequestException; +import org.apache.cassandra.utils.ByteBufferUtil; + +import com.google.common.collect.Iterators; + +public abstract class Selection +{ + private final Collection columns; + private final ResultSet.Metadata metadata; + private final boolean collectTimestamps; + private final boolean collectTTLs; + + protected Selection(Collection columns, List metadata, boolean collectTimestamps, boolean collectTTLs) + { + this.columns = columns; + this.metadata = new ResultSet.Metadata(metadata); + this.collectTimestamps = collectTimestamps; + this.collectTTLs = collectTTLs; + } + + // Overriden by SimpleSelection when appropriate. + public boolean isWildcard() + { + return false; + } + + public ResultSet.Metadata getResultMetadata() + { + return metadata; + } + + public static Selection wildcard(CFMetaData cfm) + { + List all = new ArrayList(cfm.allColumns().size()); + Iterators.addAll(all, cfm.allColumnsInSelectOrder()); + return new SimpleSelection(all, true); + } + + public static Selection forColumns(Collection columns) + { + return new SimpleSelection(columns, false); + } + + public int addColumnForOrdering(ColumnDefinition c) + { + columns.add(c); + metadata.addNonSerializedColumn(c); + return columns.size() - 1; + } + + private static boolean isUsingFunction(List rawSelectors) + { + for (RawSelector rawSelector : rawSelectors) + { + if (!(rawSelector.selectable instanceof ColumnIdentifier)) + return true; + } + return false; + } + + public static Selection fromSelectors(CFMetaData cfm, List rawSelectors) throws InvalidRequestException + { + List defs = new ArrayList(); + + SelectorFactories factories = + SelectorFactories.createFactoriesAndCollectColumnDefinitions(RawSelector.toSelectables(rawSelectors), cfm, defs); + List metadata = collectMetadata(cfm, rawSelectors, factories); + + return isUsingFunction(rawSelectors) ? new SelectionWithFunctions(defs, metadata, factories) + : new SimpleSelection(defs, metadata, false); + } + + private static List collectMetadata(CFMetaData cfm, + List rawSelectors, + SelectorFactories factories) + { + List metadata = new ArrayList(rawSelectors.size()); + Iterator iter = rawSelectors.iterator(); + for (Selector.Factory factory : factories) + { + ColumnSpecification colSpec = factory.getColumnSpecification(cfm); + ColumnIdentifier alias = iter.next().alias; + metadata.add(alias == null ? colSpec : colSpec.withAlias(alias)); + } + return metadata; + } + + protected abstract Selectors newSelectors(); + + /** + * @return the list of CQL3 columns value this SelectionClause needs. + */ + public Collection getColumns() + { + return columns; + } + + public ResultSetBuilder resultSetBuilder(long now) + { + return new ResultSetBuilder(now); + } + + public abstract boolean isAggregate(); + + /** + * Checks that selectors are either all aggregates or that none of them is. + * + * @param selectors the selectors to test. + * @param msgTemplate the error message template + * @param messageArgs the error message arguments + * @throws InvalidRequestException if some of the selectors are aggregate but not all of them + */ + static void validateSelectors(List selectors, String messageTemplate, Object... messageArgs) + throws InvalidRequestException + { + int aggregates = 0; + for (Selector s : selectors) + if (s.isAggregate()) + ++aggregates; + + if (aggregates != 0 && aggregates != selectors.size()) + throw new InvalidRequestException(String.format(messageTemplate, messageArgs)); + } + + public class ResultSetBuilder + { + private final ResultSet resultSet; + + /** + * As multiple thread can access a Selection instance each ResultSetBuilder will use + * its own Selectors instance. + */ + private final Selectors selectors; + + /* + * We'll build CQL3 row one by one. + * The currentRow is the values for the (CQL3) columns we've fetched. + * We also collect timestamps and ttls for the case where the writetime and + * ttl functions are used. Note that we might collect timestamp and/or ttls + * we don't care about, but since the array below are allocated just once, + * it doesn't matter performance wise. + */ + List current; + final long[] timestamps; + final int[] ttls; + final long now; + + private ResultSetBuilder(long now) + { + this.resultSet = new ResultSet(getResultMetadata().copy(), new ArrayList>()); + this.selectors = newSelectors(); + this.timestamps = collectTimestamps ? new long[columns.size()] : null; + this.ttls = collectTTLs ? new int[columns.size()] : null; + this.now = now; + } + + public void add(ByteBuffer v) + { + current.add(v); + } + + public void add(Cell c) + { + current.add(isDead(c) ? null : value(c)); + if (timestamps != null) + { + timestamps[current.size() - 1] = isDead(c) ? -1 : c.timestamp(); + } + if (ttls != null) + { + int ttl = -1; + if (!isDead(c) && c instanceof ExpiringCell) + ttl = c.getLocalDeletionTime() - (int) (now / 1000); + ttls[current.size() - 1] = ttl; + } + } + + private boolean isDead(Cell c) + { + return c == null || !c.isLive(now); + } + + public void newRow() throws InvalidRequestException + { + if (current != null) + { + selectors.addInputRow(this); + if (!selectors.isAggregate()) + { + resultSet.addRow(selectors.getOutputRow()); + selectors.reset(); + } + } + current = new ArrayList(columns.size()); + } + + public ResultSet build() throws InvalidRequestException + { + if (current != null) + { + selectors.addInputRow(this); + resultSet.addRow(selectors.getOutputRow()); + selectors.reset(); + current = null; + } + return resultSet; + } + + private ByteBuffer value(Cell c) + { + return (c instanceof CounterCell) + ? ByteBufferUtil.bytes(CounterContext.instance().total(c.value())) + : c.value(); + } + } + + private static interface Selectors + { + public boolean isAggregate(); + + /** + * Adds the current row of the specified ResultSetBuilder. + * + * @param rs the ResultSetBuilder + * @throws InvalidRequestException + */ + public void addInputRow(ResultSetBuilder rs) throws InvalidRequestException; + + public List getOutputRow() throws InvalidRequestException; + + public void reset(); + } + + // Special cased selection for when no function is used (this save some allocations). + private static class SimpleSelection extends Selection + { + private final boolean isWildcard; + + public SimpleSelection(Collection columns, boolean isWildcard) + { + this(columns, new ArrayList(columns), isWildcard); + } + + public SimpleSelection(Collection columns, List metadata, boolean isWildcard) + { + /* + * In theory, even a simple selection could have multiple time the same column, so we + * could filter those duplicate out of columns. But since we're very unlikely to + * get much duplicate in practice, it's more efficient not to bother. + */ + super(columns, metadata, false, false); + this.isWildcard = isWildcard; + } + + @Override + public boolean isWildcard() + { + return isWildcard; + } + + public boolean isAggregate() + { + return false; + } + + protected Selectors newSelectors() + { + return new Selectors() + { + private List current; + + public void reset() + { + current = null; + } + + public List getOutputRow() + { + return current; + } + + public void addInputRow(ResultSetBuilder rs) throws InvalidRequestException + { + current = rs.current; + } + + public boolean isAggregate() + { + return false; + } + }; + } + } + + private static class SelectionWithFunctions extends Selection + { + private final SelectorFactories factories; + + public SelectionWithFunctions(Collection columns, + List metadata, + SelectorFactories factories) throws InvalidRequestException + { + super(columns, metadata, factories.containsWritetimeSelectorFactory(), factories.containsTTLSelectorFactory()); + this.factories = factories; + + if (factories.doesAggregation() && !factories.containsOnlyAggregateFunctions()) + throw new InvalidRequestException("the select clause must either contains only aggregates or none"); + } + + public boolean isAggregate() + { + return factories.containsOnlyAggregateFunctions(); + } + + protected Selectors newSelectors() + { + return new Selectors() + { + private final List selectors = factories.newInstances(); + + public void reset() + { + for (int i = 0, m = selectors.size(); i < m; i++) + { + selectors.get(i).reset(); + } + } + + public boolean isAggregate() + { + return factories.containsOnlyAggregateFunctions(); + } + + public List getOutputRow() throws InvalidRequestException + { + List outputRow = new ArrayList<>(selectors.size()); + + for (int i = 0, m = selectors.size(); i < m; i++) + { + outputRow.add(selectors.get(i).getOutput()); + } + return outputRow; + } + + public void addInputRow(ResultSetBuilder rs) throws InvalidRequestException + { + for (int i = 0, m = selectors.size(); i < m; i++) + { + selectors.get(i).addInput(rs); + } + } + }; + } + + } +} diff --git a/src/java/org/apache/cassandra/cql3/selection/Selector.java b/src/java/org/apache/cassandra/cql3/selection/Selector.java new file mode 100644 index 000000000000..310e17540503 --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/selection/Selector.java @@ -0,0 +1,140 @@ +/* + * 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.cql3.selection; + +import java.nio.ByteBuffer; + +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.cql3.AssignmentTestable; +import org.apache.cassandra.cql3.ColumnSpecification; +import org.apache.cassandra.cql3.selection.Selection.ResultSetBuilder; +import org.apache.cassandra.db.marshal.AbstractType; +import org.apache.cassandra.exceptions.InvalidRequestException; + +/** + * A Selector is used to convert the data returned by the storage engine into the data requested by the + * user. They correspond to the <selector> elements from the select clause. + *

    Since the introduction of aggregation, Selectors cannot be called anymore by multiple threads + * as they have an internal state.

    + */ +public abstract class Selector implements AssignmentTestable +{ + /** + * A factory for Selector instances. + */ + public static abstract class Factory + { + /** + * Returns the column specification corresponding to the output value of the selector instances created by + * this factory. + * + * @param cfm the column family meta data + * @return a column specification + */ + public abstract ColumnSpecification getColumnSpecification(CFMetaData cfm); + + /** + * Creates a new Selector instance. + * + * @return a new Selector instance + */ + public abstract Selector newInstance(); + + /** + * Checks if this factory creates selectors instances that creates aggregates. + * + * @return true if this factory creates selectors instances that creates aggregates, + * false otherwise + */ + public boolean isAggregateSelectorFactory() + { + return false; + } + + /** + * Checks if this factory creates writetime selectors instances. + * + * @return true if this factory creates writetime selectors instances, + * false otherwise + */ + public boolean isWritetimeSelectorFactory() + { + return false; + } + + /** + * Checks if this factory creates TTL selectors instances. + * + * @return true if this factory creates TTL selectors instances, + * false otherwise + */ + public boolean isTTLSelectorFactory() + { + return false; + } + } + + /** + * Add the current value from the specified ResultSetBuilder. + * + * @param rs the ResultSetBuilder + * @throws InvalidRequestException if a problem occurs while add the input value + */ + public abstract void addInput(ResultSetBuilder rs) throws InvalidRequestException; + + /** + * Returns the selector output. + * + * @return the selector output + * @throws InvalidRequestException if a problem occurs while computing the output value + */ + public abstract ByteBuffer getOutput() throws InvalidRequestException; + + /** + * Returns the Selector output type. + * + * @return the Selector output type. + */ + public abstract AbstractType getType(); + + /** + * Checks if this Selector is creating aggregates. + * + * @return true if this Selector is creating aggregates false + * otherwise. + */ + public boolean isAggregate() + { + return false; + } + + /** + * Reset the internal state of this Selector. + */ + public abstract void reset(); + + public AssignmentTestable.TestResult testAssignment(String keyspace, ColumnSpecification receiver) + { + if (receiver.type.equals(getType())) + return AssignmentTestable.TestResult.EXACT_MATCH; + else if (receiver.type.isValueCompatibleWith(getType())) + return AssignmentTestable.TestResult.WEAKLY_ASSIGNABLE; + else + return AssignmentTestable.TestResult.NOT_ASSIGNABLE; + } +} \ No newline at end of file diff --git a/src/java/org/apache/cassandra/cql3/selection/SelectorFactories.java b/src/java/org/apache/cassandra/cql3/selection/SelectorFactories.java new file mode 100644 index 000000000000..e0335562ed5a --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/selection/SelectorFactories.java @@ -0,0 +1,151 @@ +/* + * 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.cql3.selection; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.ColumnDefinition; +import org.apache.cassandra.cql3.selection.Selector.Factory; +import org.apache.cassandra.exceptions.InvalidRequestException; + +/** + * A set of Selector factories. + */ +final class SelectorFactories implements Iterable +{ + /** + * The Selector factories. + */ + private final List factories; + + /** + * true if one of the factory creates writetime selectors. + */ + private boolean containsWritetimeFactory; + + /** + * true if one of the factory creates TTL selectors. + */ + private boolean containsTTLFactory; + + /** + * The number of factories creating aggregates. + */ + private int numberOfAggregateFactories; + + /** + * Creates a new SelectorFactories instance and collect the column definitions. + * + * @param selectables the Selectables for which the factories must be created + * @param cfm the Column Family Definition + * @param defs the collector parameter for the column definitions + * @return a new SelectorFactories instance + * @throws InvalidRequestException if a problem occurs while creating the factories + */ + public static SelectorFactories createFactoriesAndCollectColumnDefinitions(List selectables, + CFMetaData cfm, + List defs) + throws InvalidRequestException + { + return new SelectorFactories(selectables, cfm, defs); + } + + private SelectorFactories(List selectables, + CFMetaData cfm, + List defs) + throws InvalidRequestException + { + factories = new ArrayList<>(selectables.size()); + + for (Selectable selectable : selectables) + { + Factory factory = selectable.newSelectorFactory(cfm, defs); + containsWritetimeFactory |= factory.isWritetimeSelectorFactory(); + containsTTLFactory |= factory.isTTLSelectorFactory(); + if (factory.isAggregateSelectorFactory()) + ++numberOfAggregateFactories; + factories.add(factory); + } + } + + /** + * Checks if this SelectorFactories contains only factories for aggregates. + * + * @return true if this SelectorFactories contains only factories for aggregates, + * false otherwise. + */ + public boolean containsOnlyAggregateFunctions() + { + int size = factories.size(); + return size != 0 && numberOfAggregateFactories == size; + } + + /** + * Whether the selector built by this factory does aggregation or not (either directly or in a sub-selector). + * + * @return true if the selector built by this factor does aggregation, false otherwise. + */ + public boolean doesAggregation() + { + return numberOfAggregateFactories > 0; + } + + /** + * Checks if this SelectorFactories contains at least one factory for writetime selectors. + * + * @return true if this SelectorFactories contains at least one factory for writetime + * selectors, false otherwise. + */ + public boolean containsWritetimeSelectorFactory() + { + return containsWritetimeFactory; + } + + /** + * Checks if this SelectorFactories contains at least one factory for TTL selectors. + * + * @return true if this SelectorFactories contains at least one factory for TTL + * selectors, false otherwise. + */ + public boolean containsTTLSelectorFactory() + { + return containsTTLFactory; + } + + /** + * Creates a list of new Selector instances. + * @return a list of new Selector instances. + */ + public List newInstances() + { + List selectors = new ArrayList<>(factories.size()); + for (Selector.Factory factory : factories) + { + selectors.add(factory.newInstance()); + } + return selectors; + } + + public Iterator iterator() + { + return factories.iterator(); + } +} diff --git a/src/java/org/apache/cassandra/cql3/selection/SimpleSelector.java b/src/java/org/apache/cassandra/cql3/selection/SimpleSelector.java new file mode 100644 index 000000000000..37459d2925d5 --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/selection/SimpleSelector.java @@ -0,0 +1,87 @@ +/* + * 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.cql3.selection; + +import java.nio.ByteBuffer; + +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.cql3.ColumnIdentifier; +import org.apache.cassandra.cql3.ColumnSpecification; +import org.apache.cassandra.cql3.selection.Selection.ResultSetBuilder; +import org.apache.cassandra.db.marshal.AbstractType; +import org.apache.cassandra.exceptions.InvalidRequestException; + +public final class SimpleSelector extends Selector +{ + private final String columnName; + private final int idx; + private final AbstractType type; + private ByteBuffer current; + + public static Factory newFactory(final String columnName, final int idx, final AbstractType type) + { + return new Factory() + { + public ColumnSpecification getColumnSpecification(CFMetaData cfm) + { + return new ColumnSpecification(cfm.ksName, + cfm.cfName, + new ColumnIdentifier(columnName, true), + type); + } + + public Selector newInstance() + { + return new SimpleSelector(columnName, idx, type); + } + }; + } + + public void addInput(ResultSetBuilder rs) throws InvalidRequestException + { + current = rs.current.get(idx); + } + + public ByteBuffer getOutput() throws InvalidRequestException + { + return current; + } + + public void reset() + { + current = null; + } + + public AbstractType getType() + { + return type; + } + + @Override + public String toString() + { + return columnName; + } + + private SimpleSelector(String columnName, int idx, AbstractType type) + { + this.columnName = columnName; + this.idx = idx; + this.type = type; + } +} \ No newline at end of file diff --git a/src/java/org/apache/cassandra/cql3/selection/WritetimeOrTTLSelector.java b/src/java/org/apache/cassandra/cql3/selection/WritetimeOrTTLSelector.java new file mode 100644 index 000000000000..6d6edd378695 --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/selection/WritetimeOrTTLSelector.java @@ -0,0 +1,110 @@ +/* + * 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.cql3.selection; + +import java.nio.ByteBuffer; + +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.cql3.ColumnIdentifier; +import org.apache.cassandra.cql3.ColumnSpecification; +import org.apache.cassandra.cql3.selection.Selection.ResultSetBuilder; +import org.apache.cassandra.db.marshal.AbstractType; +import org.apache.cassandra.db.marshal.Int32Type; +import org.apache.cassandra.db.marshal.LongType; +import org.apache.cassandra.utils.ByteBufferUtil; + +final class WritetimeOrTTLSelector extends Selector +{ + private final String columnName; + private final int idx; + private final boolean isWritetime; + private ByteBuffer current; + + public static Factory newFactory(final String columnName, final int idx, final boolean isWritetime) + { + return new Factory() + { + public ColumnSpecification getColumnSpecification(CFMetaData cfm) + { + String text = String.format("%s(%s)", isWritetime ? "writetime" : "ttl", columnName); + return new ColumnSpecification(cfm.ksName, + cfm.cfName, + new ColumnIdentifier(text, true), + isWritetime ? LongType.instance : Int32Type.instance); + } + + public Selector newInstance() + { + return new WritetimeOrTTLSelector(columnName, idx, isWritetime); + } + + public boolean isWritetimeSelectorFactory() + { + return isWritetime; + } + + public boolean isTTLSelectorFactory() + { + return !isWritetime; + } + }; + } + + public void addInput(ResultSetBuilder rs) + { + if (isWritetime) + { + long ts = rs.timestamps[idx]; + current = ts >= 0 ? ByteBufferUtil.bytes(ts) : null; + } + else + { + int ttl = rs.ttls[idx]; + current = ttl > 0 ? ByteBufferUtil.bytes(ttl) : null; + } + } + + public ByteBuffer getOutput() + { + return current; + } + + public void reset() + { + current = null; + } + + public AbstractType getType() + { + return isWritetime ? LongType.instance : Int32Type.instance; + } + + @Override + public String toString() + { + return columnName; + } + + private WritetimeOrTTLSelector(String columnName, int idx, boolean isWritetime) + { + this.columnName = columnName; + this.idx = idx; + this.isWritetime = isWritetime; + } + +} \ No newline at end of file diff --git a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java index b55604495dac..32dd1c732a5b 100644 --- a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java @@ -28,6 +28,7 @@ import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.ColumnDefinition; import org.apache.cassandra.cql3.*; +import org.apache.cassandra.cql3.selection.Selection; import org.apache.cassandra.db.*; import org.apache.cassandra.db.composites.CBuilder; import org.apache.cassandra.db.composites.Composite; diff --git a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java index 30c539062d8b..44bd23c5f2ad 100644 --- a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java @@ -32,6 +32,8 @@ import org.apache.cassandra.auth.Permission; import org.apache.cassandra.cql3.*; import org.apache.cassandra.cql3.statements.SingleColumnRestriction.Contains; +import org.apache.cassandra.cql3.selection.RawSelector; +import org.apache.cassandra.cql3.selection.Selection; import org.apache.cassandra.db.composites.*; import org.apache.cassandra.db.composites.Composite.EOC; import org.apache.cassandra.transport.messages.ResultMessage; diff --git a/src/java/org/apache/cassandra/cql3/statements/Selectable.java b/src/java/org/apache/cassandra/cql3/statements/Selectable.java deleted file mode 100644 index be47d17f84f4..000000000000 --- a/src/java/org/apache/cassandra/cql3/statements/Selectable.java +++ /dev/null @@ -1,89 +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.cql3.statements; - -import java.util.List; - -import org.apache.cassandra.cql3.ColumnIdentifier; -import org.apache.cassandra.cql3.functions.FunctionName; - -public interface Selectable -{ - public static class WritetimeOrTTL implements Selectable - { - public final ColumnIdentifier id; - public final boolean isWritetime; - - public WritetimeOrTTL(ColumnIdentifier id, boolean isWritetime) - { - this.id = id; - this.isWritetime = isWritetime; - } - - @Override - public String toString() - { - return (isWritetime ? "writetime" : "ttl") + "(" + id + ")"; - } - } - - public static class WithFunction implements Selectable - { - public final FunctionName functionName; - public final List args; - - public WithFunction(FunctionName functionName, List args) - { - this.functionName = functionName; - this.args = args; - } - - @Override - public String toString() - { - StringBuilder sb = new StringBuilder(); - sb.append(functionName).append("("); - for (int i = 0; i < args.size(); i++) - { - if (i > 0) - sb.append(", "); - sb.append(args.get(i)); - } - return sb.append(")").toString(); - } - } - - public static class WithFieldSelection implements Selectable - { - public final Selectable selected; - public final ColumnIdentifier field; - - public WithFieldSelection(Selectable selected, ColumnIdentifier field) - { - this.selected = selected; - this.field = field; - } - - @Override - public String toString() - { - return String.format("%s.%s", selected, field); - } - } -} diff --git a/src/java/org/apache/cassandra/cql3/statements/Selection.java b/src/java/org/apache/cassandra/cql3/statements/Selection.java deleted file mode 100644 index ba6ad1d839ad..000000000000 --- a/src/java/org/apache/cassandra/cql3/statements/Selection.java +++ /dev/null @@ -1,770 +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.cql3.statements; - -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.config.ColumnDefinition; -import org.apache.cassandra.cql3.AssignmentTestable; -import org.apache.cassandra.cql3.ColumnIdentifier; -import org.apache.cassandra.cql3.ColumnSpecification; -import org.apache.cassandra.cql3.ResultSet; -import org.apache.cassandra.cql3.functions.AggregateFunction; -import org.apache.cassandra.cql3.functions.Function; -import org.apache.cassandra.cql3.functions.Functions; -import org.apache.cassandra.cql3.functions.ScalarFunction; -import org.apache.cassandra.db.Cell; -import org.apache.cassandra.db.CounterCell; -import org.apache.cassandra.db.ExpiringCell; -import org.apache.cassandra.db.context.CounterContext; -import org.apache.cassandra.db.marshal.AbstractType; -import org.apache.cassandra.db.marshal.Int32Type; -import org.apache.cassandra.db.marshal.LongType; -import org.apache.cassandra.db.marshal.UTF8Type; -import org.apache.cassandra.db.marshal.UserType; -import org.apache.cassandra.exceptions.InvalidRequestException; -import org.apache.cassandra.utils.ByteBufferUtil; - -import com.google.common.collect.Iterators; - -public abstract class Selection -{ - private final Collection columns; - private final ResultSet.Metadata metadata; - private final boolean collectTimestamps; - private final boolean collectTTLs; - - protected Selection(Collection columns, List metadata, boolean collectTimestamps, boolean collectTTLs) - { - this.columns = columns; - this.metadata = new ResultSet.Metadata(metadata); - this.collectTimestamps = collectTimestamps; - this.collectTTLs = collectTTLs; - } - - // Overriden by SimpleSelection when appropriate. - public boolean isWildcard() - { - return false; - } - - public ResultSet.Metadata getResultMetadata() - { - return metadata; - } - - public static Selection wildcard(CFMetaData cfm) - { - List all = new ArrayList(cfm.allColumns().size()); - Iterators.addAll(all, cfm.allColumnsInSelectOrder()); - return new SimpleSelection(all, true); - } - - public static Selection forColumns(Collection columns) - { - return new SimpleSelection(columns, false); - } - - public int addColumnForOrdering(ColumnDefinition c) - { - columns.add(c); - metadata.addNonSerializedColumn(c); - return columns.size() - 1; - } - - private static boolean isUsingFunction(List rawSelectors) - { - for (RawSelector rawSelector : rawSelectors) - { - if (!(rawSelector.selectable instanceof ColumnIdentifier)) - return true; - } - return false; - } - - private static int addAndGetIndex(ColumnDefinition def, List l) - { - int idx = l.indexOf(def); - if (idx < 0) - { - idx = l.size(); - l.add(def); - } - return idx; - } - - private static Selector makeSelector(CFMetaData cfm, RawSelector raw, List defs, List metadata) throws InvalidRequestException - { - if (raw.selectable instanceof ColumnIdentifier) - { - ColumnDefinition def = cfm.getColumnDefinition((ColumnIdentifier)raw.selectable); - if (def == null) - throw new InvalidRequestException(String.format("Undefined name %s in selection clause", raw.selectable)); - if (metadata != null) - metadata.add(raw.alias == null ? def : makeAliasSpec(cfm, def.type, raw.alias)); - return new SimpleSelector(def.name.toString(), addAndGetIndex(def, defs), def.type); - } - else if (raw.selectable instanceof Selectable.WritetimeOrTTL) - { - Selectable.WritetimeOrTTL tot = (Selectable.WritetimeOrTTL)raw.selectable; - ColumnDefinition def = cfm.getColumnDefinition(tot.id); - if (def == null) - throw new InvalidRequestException(String.format("Undefined name %s in selection clause", tot.id)); - if (def.isPrimaryKeyColumn()) - throw new InvalidRequestException(String.format("Cannot use selection function %s on PRIMARY KEY part %s", tot.isWritetime ? "writeTime" : "ttl", def.name)); - if (def.type.isCollection()) - throw new InvalidRequestException(String.format("Cannot use selection function %s on collections", tot.isWritetime ? "writeTime" : "ttl")); - - if (metadata != null) - metadata.add(makeWritetimeOrTTLSpec(cfm, tot, raw.alias)); - return new WritetimeOrTTLSelector(def.name.toString(), addAndGetIndex(def, defs), tot.isWritetime); - } - else if (raw.selectable instanceof Selectable.WithFieldSelection) - { - Selectable.WithFieldSelection withField = (Selectable.WithFieldSelection)raw.selectable; - Selector selected = makeSelector(cfm, new RawSelector(withField.selected, null), defs, null); - AbstractType type = selected.getType(); - if (!(type instanceof UserType)) - throw new InvalidRequestException(String.format("Invalid field selection: %s of type %s is not a user type", withField.selected, type.asCQL3Type())); - - UserType ut = (UserType)type; - for (int i = 0; i < ut.size(); i++) - { - if (!ut.fieldName(i).equals(withField.field.bytes)) - continue; - - if (metadata != null) - metadata.add(makeFieldSelectSpec(cfm, withField, ut.fieldType(i), raw.alias)); - return new FieldSelector(ut, i, selected); - } - throw new InvalidRequestException(String.format("%s of type %s has no field %s", withField.selected, type.asCQL3Type(), withField.field)); - } - else - { - Selectable.WithFunction withFun = (Selectable.WithFunction)raw.selectable; - List args = new ArrayList<>(withFun.args.size()); - for (Selectable rawArg : withFun.args) - args.add(makeSelector(cfm, new RawSelector(rawArg, null), defs, null)); - - // resolve built-in functions before user defined functions - Function fun = Functions.get(cfm.ksName, withFun.functionName, args, cfm.ksName, cfm.cfName); - if (fun == null) - throw new InvalidRequestException(String.format("Unknown function '%s'", withFun.functionName)); - if (metadata != null) - metadata.add(makeFunctionSpec(cfm, withFun, fun.returnType(), raw.alias)); - return fun.isAggregate() ? new AggregateFunctionSelector(fun, args) - : new ScalarFunctionSelector(fun, args); - } - } - - private static ColumnSpecification makeWritetimeOrTTLSpec(CFMetaData cfm, Selectable.WritetimeOrTTL tot, ColumnIdentifier alias) - { - return new ColumnSpecification(cfm.ksName, - cfm.cfName, - alias == null ? new ColumnIdentifier(tot.toString(), true) : alias, - tot.isWritetime ? LongType.instance : Int32Type.instance); - } - - private static ColumnSpecification makeFieldSelectSpec(CFMetaData cfm, Selectable.WithFieldSelection s, AbstractType type, ColumnIdentifier alias) - { - return new ColumnSpecification(cfm.ksName, - cfm.cfName, - alias == null ? new ColumnIdentifier(s.toString(), true) : alias, - type); - } - - private static ColumnSpecification makeFunctionSpec(CFMetaData cfm, - Selectable.WithFunction fun, - AbstractType returnType, - ColumnIdentifier alias) throws InvalidRequestException - { - if (returnType == null) - throw new InvalidRequestException(String.format("Unknown function %s called in selection clause", fun.functionName)); - - return new ColumnSpecification(cfm.ksName, - cfm.cfName, - alias == null ? new ColumnIdentifier(fun.toString(), true) : alias, - returnType); - } - - private static ColumnSpecification makeAliasSpec(CFMetaData cfm, AbstractType type, ColumnIdentifier alias) - { - return new ColumnSpecification(cfm.ksName, cfm.cfName, alias, type); - } - - public static Selection fromSelectors(CFMetaData cfm, List rawSelectors) throws InvalidRequestException - { - boolean usesFunction = isUsingFunction(rawSelectors); - - if (usesFunction) - { - List defs = new ArrayList(); - List metadata = new ArrayList(rawSelectors.size()); - List selectors = new ArrayList(rawSelectors.size()); - boolean collectTimestamps = false; - boolean collectTTLs = false; - for (RawSelector rawSelector : rawSelectors) - { - Selector selector = makeSelector(cfm, rawSelector, defs, metadata); - selectors.add(selector); - if (selector instanceof WritetimeOrTTLSelector) - { - collectTimestamps |= ((WritetimeOrTTLSelector)selector).isWritetime; - collectTTLs |= !((WritetimeOrTTLSelector)selector).isWritetime; - } - } - return new SelectionWithFunctions(defs, metadata, selectors, collectTimestamps, collectTTLs); - } - else - { - List defs = new ArrayList(rawSelectors.size()); - List metadata = new ArrayList(rawSelectors.size()); - for (RawSelector rawSelector : rawSelectors) - { - assert rawSelector.selectable instanceof ColumnIdentifier; - ColumnDefinition def = cfm.getColumnDefinition((ColumnIdentifier)rawSelector.selectable); - if (def == null) - throw new InvalidRequestException(String.format("Undefined name %s in selection clause", rawSelector.selectable)); - defs.add(def); - metadata.add(rawSelector.alias == null ? def : makeAliasSpec(cfm, def.type, rawSelector.alias)); - } - return new SimpleSelection(defs, metadata, false); - } - } - - protected abstract void addInputRow(ResultSetBuilder rs) throws InvalidRequestException; - - protected abstract boolean isAggregate(); - - protected abstract List getOutputRow() throws InvalidRequestException; - - protected abstract void reset(); - - /** - * @return the list of CQL3 columns value this SelectionClause needs. - */ - public Collection getColumns() - { - return columns; - } - - public ResultSetBuilder resultSetBuilder(long now) - { - return new ResultSetBuilder(now); - } - - private static ByteBuffer value(Cell c) - { - return (c instanceof CounterCell) - ? ByteBufferUtil.bytes(CounterContext.instance().total(c.value())) - : c.value(); - } - - /** - * Checks that selectors are either all aggregates or that none of them is. - * - * @param selectors the selectors to test. - * @param msgTemplate the error message template - * @param messageArgs the error message arguments - * @throws InvalidRequestException if some of the selectors are aggregate but not all of them - */ - private static void validateSelectors(List selectors, String messageTemplate, Object... messageArgs) - throws InvalidRequestException - { - int aggregates = 0; - for (Selector s : selectors) - if (s.isAggregate()) - ++aggregates; - - if (aggregates != 0 && aggregates != selectors.size()) - throw new InvalidRequestException(String.format(messageTemplate, messageArgs)); - } - - public class ResultSetBuilder - { - private final ResultSet resultSet; - - /* - * We'll build CQL3 row one by one. - * The currentRow is the values for the (CQL3) columns we've fetched. - * We also collect timestamps and ttls for the case where the writetime and - * ttl functions are used. Note that we might collect timestamp and/or ttls - * we don't care about, but since the array below are allocated just once, - * it doesn't matter performance wise. - */ - List current; - final long[] timestamps; - final int[] ttls; - final long now; - - private ResultSetBuilder(long now) - { - this.resultSet = new ResultSet(getResultMetadata().copy(), new ArrayList>()); - this.timestamps = collectTimestamps ? new long[columns.size()] : null; - this.ttls = collectTTLs ? new int[columns.size()] : null; - this.now = now; - } - - public void add(ByteBuffer v) - { - current.add(v); - } - - public void add(Cell c) - { - current.add(isDead(c) ? null : value(c)); - if (timestamps != null) - { - timestamps[current.size() - 1] = isDead(c) ? -1 : c.timestamp(); - } - if (ttls != null) - { - int ttl = -1; - if (!isDead(c) && c instanceof ExpiringCell) - ttl = c.getLocalDeletionTime() - (int) (now / 1000); - ttls[current.size() - 1] = ttl; - } - } - - private boolean isDead(Cell c) - { - return c == null || !c.isLive(now); - } - - public void newRow() throws InvalidRequestException - { - if (current != null) - { - addInputRow(this); - if (!isAggregate()) - { - resultSet.addRow(getOutputRow()); - reset(); - } - } - current = new ArrayList(columns.size()); - } - - public ResultSet build() throws InvalidRequestException - { - if (current != null) - { - addInputRow(this); - resultSet.addRow(getOutputRow()); - reset(); - current = null; - } - return resultSet; - } - } - - // Special cased selection for when no function is used (this save some allocations). - private static class SimpleSelection extends Selection - { - private final boolean isWildcard; - - private List current; - - public SimpleSelection(Collection columns, boolean isWildcard) - { - this(columns, new ArrayList(columns), isWildcard); - } - - public SimpleSelection(Collection columns, List metadata, boolean isWildcard) - { - /* - * In theory, even a simple selection could have multiple time the same column, so we - * could filter those duplicate out of columns. But since we're very unlikely to - * get much duplicate in practice, it's more efficient not to bother. - */ - super(columns, metadata, false, false); - this.isWildcard = isWildcard; - } - - @Override - public boolean isWildcard() - { - return isWildcard; - } - - protected void addInputRow(ResultSetBuilder rs) throws InvalidRequestException - { - current = rs.current; - } - - protected boolean isAggregate() - { - return false; - } - - protected List getOutputRow() throws InvalidRequestException - { - return current; - } - - protected void reset() - { - current = null; - } - } - - private static abstract class Selector implements AssignmentTestable - { - public abstract void addInput(ResultSetBuilder rs) throws InvalidRequestException; - - public abstract ByteBuffer getOutput() throws InvalidRequestException; - - public abstract AbstractType getType(); - - public boolean isAggregate() - { - return false; - } - - public abstract void reset(); - - public AssignmentTestable.TestResult testAssignment(String keyspace, ColumnSpecification receiver) - { - if (receiver.type.equals(getType())) - return AssignmentTestable.TestResult.EXACT_MATCH; - else if (receiver.type.isValueCompatibleWith(getType())) - return AssignmentTestable.TestResult.WEAKLY_ASSIGNABLE; - else - return AssignmentTestable.TestResult.NOT_ASSIGNABLE; - } - } - - private static class SimpleSelector extends Selector - { - private final String columnName; - private final int idx; - private final AbstractType type; - private ByteBuffer current; - - public SimpleSelector(String columnName, int idx, AbstractType type) - { - this.columnName = columnName; - this.idx = idx; - this.type = type; - } - - public void addInput(ResultSetBuilder rs) throws InvalidRequestException - { - current = rs.current.get(idx); - } - - public ByteBuffer getOutput() throws InvalidRequestException - { - return current; - } - - public void reset() - { - current = null; - } - - public AbstractType getType() - { - return type; - } - - @Override - public String toString() - { - return columnName; - } - } - - private static abstract class AbstractFunctionSelector extends Selector - { - protected final T fun; - protected final List argSelectors; - - public AbstractFunctionSelector(T fun, List argSelectors) - { - this.fun = fun; - this.argSelectors = argSelectors; - } - - public AbstractType getType() - { - return fun.returnType(); - } - - @Override - public String toString() - { - StringBuilder sb = new StringBuilder(); - sb.append(fun.name()).append("("); - for (int i = 0; i < argSelectors.size(); i++) - { - if (i > 0) - sb.append(", "); - sb.append(argSelectors.get(i)); - } - return sb.append(")").toString(); - } - } - - private static class ScalarFunctionSelector extends AbstractFunctionSelector - { - public ScalarFunctionSelector(Function fun, List argSelectors) throws InvalidRequestException - { - super((ScalarFunction) fun, argSelectors); - validateSelectors(argSelectors, - "the %s function arguments must be either all aggregates or all none aggregates", - fun.name().name); - } - - public boolean isAggregate() - { - // We cannot just return true as it is possible to have a scalar function wrapping an aggregation function - if (argSelectors.isEmpty()) - return false; - - return argSelectors.get(0).isAggregate(); - } - - public void addInput(ResultSetBuilder rs) throws InvalidRequestException - { - for (Selector s : argSelectors) - s.addInput(rs); - } - - public void reset() - { - } - - public ByteBuffer getOutput() throws InvalidRequestException - { - List args = new ArrayList(argSelectors.size()); - for (Selector s : argSelectors) - { - args.add(s.getOutput()); - s.reset(); - } - return fun.execute(args); - } - } - - private static class AggregateFunctionSelector extends AbstractFunctionSelector - { - private final AggregateFunction.Aggregate aggregate; - - public AggregateFunctionSelector(Function fun, List argSelectors) throws InvalidRequestException - { - super((AggregateFunction) fun, argSelectors); - - validateAgruments(argSelectors); - this.aggregate = this.fun.newAggregate(); - } - - public boolean isAggregate() - { - return true; - } - - public void addInput(ResultSetBuilder rs) throws InvalidRequestException - { - List args = new ArrayList(argSelectors.size()); - // Aggregation of aggregation is not supported - for (Selector s : argSelectors) - { - s.addInput(rs); - args.add(s.getOutput()); - s.reset(); - } - this.aggregate.addInput(args); - } - - public ByteBuffer getOutput() throws InvalidRequestException - { - return aggregate.compute(); - } - - public void reset() - { - aggregate.reset(); - } - - /** - * Checks that the arguments are not themselves aggregation functions. - * - * @param argSelectors the selector to check - * @throws InvalidRequestException if on of the arguments is an aggregation function - */ - private static void validateAgruments(List argSelectors) throws InvalidRequestException - { - for (Selector selector : argSelectors) - if (selector.isAggregate()) - throw new InvalidRequestException( - "aggregate functions cannot be used as arguments of aggregate functions"); - } - } - - private static class FieldSelector extends Selector - { - private final UserType type; - private final int field; - private final Selector selected; - - public FieldSelector(UserType type, int field, Selector selected) - { - this.type = type; - this.field = field; - this.selected = selected; - } - - public boolean isAggregate() - { - return selected.isAggregate(); - } - - public void addInput(ResultSetBuilder rs) throws InvalidRequestException - { - selected.addInput(rs); - } - - public ByteBuffer getOutput() throws InvalidRequestException - { - ByteBuffer value = selected.getOutput(); - if (value == null) - return null; - ByteBuffer[] buffers = type.split(value); - return field < buffers.length ? buffers[field] : null; - } - - public AbstractType getType() - { - return type.fieldType(field); - } - - public void reset() - { - selected.reset(); - } - - @Override - public String toString() - { - return String.format("%s.%s", selected, UTF8Type.instance.getString(type.fieldName(field))); - } - } - - private static class WritetimeOrTTLSelector extends Selector - { - private final String columnName; - private final int idx; - private final boolean isWritetime; - private ByteBuffer current; - - public WritetimeOrTTLSelector(String columnName, int idx, boolean isWritetime) - { - this.columnName = columnName; - this.idx = idx; - this.isWritetime = isWritetime; - } - - public void addInput(ResultSetBuilder rs) - { - if (isWritetime) - { - long ts = rs.timestamps[idx]; - current = ts >= 0 ? ByteBufferUtil.bytes(ts) : null; - } - else - { - int ttl = rs.ttls[idx]; - current = ttl > 0 ? ByteBufferUtil.bytes(ttl) : null; - } - } - - public ByteBuffer getOutput() - { - return current; - } - - public void reset() - { - current = null; - } - - public AbstractType getType() - { - return isWritetime ? LongType.instance : Int32Type.instance; - } - - @Override - public String toString() - { - return columnName; - } - } - - private static class SelectionWithFunctions extends Selection - { - private final List selectors; - - public SelectionWithFunctions(Collection columns, - List metadata, - List selectors, - boolean collectTimestamps, - boolean collectTTLs) throws InvalidRequestException - { - super(columns, metadata, collectTimestamps, collectTTLs); - this.selectors = selectors; - - validateSelectors(selectors, "the select clause must either contains only aggregates or none"); - } - - protected void addInputRow(ResultSetBuilder rs) throws InvalidRequestException - { - for (Selector selector : selectors) - { - selector.addInput(rs); - } - } - - protected List getOutputRow() throws InvalidRequestException - { - List result = new ArrayList(); - for (Selector selector : selectors) - { - result.add(selector.getOutput()); - } - return result; - } - - protected void reset() - { - for (Selector selector : selectors) - { - selector.reset(); - } - } - - public boolean isAggregate() - { - return selectors.get(0).isAggregate(); - } - } -} From 0368e97ee4a807cb832a90c590ae5c65a98730c1 Mon Sep 17 00:00:00 2001 From: Jake Luciani Date: Tue, 2 Sep 2014 12:49:01 -0400 Subject: [PATCH 167/557] Extend Descriptor to include a format value and refactor reader/writer apis patch by tjake; reviewed by Marcus Eriksson for CASSANDRA-7443 --- CHANGES.txt | 1 + build.xml | 12 +- .../apache/cassandra/config/CFMetaData.java | 10 +- .../cassandra/config/DatabaseDescriptor.java | 9 + .../org/apache/cassandra/db/AbstractCell.java | 3 +- .../apache/cassandra/db/AtomDeserializer.java | 5 +- .../apache/cassandra/db/BatchlogManager.java | 2 +- .../cassandra/db/CollationController.java | 2 +- .../cassandra/db/ColumnFamilySerializer.java | 3 +- .../cassandra/db/ColumnFamilyStore.java | 31 +- .../org/apache/cassandra/db/DataTracker.java | 2 +- .../org/apache/cassandra/db/DeletionInfo.java | 2 +- .../org/apache/cassandra/db/Keyspace.java | 4 +- .../org/apache/cassandra/db/Memtable.java | 13 +- .../org/apache/cassandra/db/OnDiskAtom.java | 5 +- .../apache/cassandra/db/RangeTombstone.java | 7 +- .../apache/cassandra/db/RowIndexEntry.java | 60 ++- .../cassandra/db/RowIteratorFactory.java | 2 +- .../apache/cassandra/db/SystemKeyspace.java | 2 +- .../db/commitlog/CommitLogDescriptor.java | 7 +- .../db/commitlog/ReplayPosition.java | 2 +- .../db/compaction/AbstractCompactedRow.java | 3 +- .../AbstractCompactionStrategy.java | 4 +- .../db/compaction/AbstractCompactionTask.java | 2 +- .../db/compaction/CompactionController.java | 4 +- .../db/compaction/CompactionIterable.java | 8 +- .../db/compaction/CompactionManager.java | 29 +- .../db/compaction/CompactionTask.java | 37 +- .../DateTieredCompactionStrategy.java | 2 +- .../db/compaction/LazilyCompactedRow.java | 45 +- .../compaction/LeveledCompactionStrategy.java | 9 +- .../db/compaction/LeveledCompactionTask.java | 4 +- .../db/compaction/LeveledManifest.java | 9 +- .../db/compaction/SSTableSplitter.java | 3 +- .../cassandra/db/compaction/Scrubber.java | 13 +- .../SizeTieredCompactionStrategy.java | 5 +- .../cassandra/db/compaction/Upgrader.java | 7 +- .../db/composites/AbstractCType.java | 14 - .../apache/cassandra/db/composites/CType.java | 2 - .../cassandra/db/filter/IDiskAtomFilter.java | 2 +- .../cassandra/db/filter/NamesQueryFilter.java | 7 +- .../cassandra/db/filter/QueryFilter.java | 2 +- .../cassandra/db/filter/SliceQueryFilter.java | 7 +- .../cassandra/db/index/SecondaryIndex.java | 2 +- .../db/index/SecondaryIndexManager.java | 2 +- .../org/apache/cassandra/dht/BytesToken.java | 1 - .../cassandra/io/ISSTableSerializer.java | 3 +- .../io/compress/CompressionMetadata.java | 11 +- .../sstable/AbstractSSTableSimpleWriter.java | 22 +- .../io/sstable/CQLSSTableWriter.java | 9 +- .../cassandra/io/sstable/Descriptor.java | 172 +++--- .../cassandra/io/sstable/IndexHelper.java | 26 - .../io/sstable/IndexSummaryManager.java | 1 + .../io/sstable/ReducingKeyIterator.java | 1 + .../apache/cassandra/io/sstable/SSTable.java | 2 +- .../io/sstable/SSTableDeletingTask.java | 1 + .../io/sstable/SSTableIdentityIterator.java | 23 +- .../cassandra/io/sstable/SSTableLoader.java | 1 + .../cassandra/io/sstable/SSTableRewriter.java | 2 + .../sstable/SSTableSimpleUnsortedWriter.java | 7 +- .../io/sstable/SSTableSimpleWriter.java | 1 + .../io/sstable/format/SSTableFormat.java | 90 ++++ .../sstable/{ => format}/SSTableReader.java | 508 ++++++------------ .../io/sstable/format/SSTableWriter.java | 202 +++++++ .../cassandra/io/sstable/format/Version.java | 104 ++++ .../io/sstable/format/big/BigFormat.java | 224 ++++++++ .../io/sstable/format/big/BigTableReader.java | 256 +++++++++ .../big/BigTableScanner.java} | 23 +- .../big/BigTableWriter.java} | 166 ++---- .../format/big}/IndexedSliceReader.java | 7 +- .../format/big}/SSTableNamesIterator.java | 7 +- .../format/big}/SSTableSliceIterator.java | 7 +- .../format/big}/SimpleSliceReader.java | 7 +- .../sstable/metadata/CompactionMetadata.java | 3 +- .../IMetadataComponentSerializer.java | 3 +- .../sstable/metadata/MetadataCollector.java | 2 +- .../io/sstable/metadata/StatsMetadata.java | 7 +- .../sstable/metadata/ValidationMetadata.java | 3 +- .../cassandra/io/util/AbstractDataInput.java | 6 +- .../io/util/DataIntegrityMetadata.java | 2 +- .../cassandra/io/util/FileDataInput.java | 1 + .../apache/cassandra/io/util/FileUtils.java | 29 +- .../io/util/MappedFileDataInput.java | 4 +- .../cassandra/io/util/MemoryInputStream.java | 6 +- .../metrics/ColumnFamilyMetrics.java | 2 +- .../cassandra/net/MessagingService.java | 3 +- .../SSTableAddedNotification.java | 2 +- .../SSTableDeletingNotification.java | 2 +- .../SSTableListChangedNotification.java | 3 +- .../SSTableRepairStatusChanged.java | 2 +- .../repair/RepairMessageVerbHandler.java | 2 +- .../service/ActiveRepairService.java | 3 +- .../cassandra/service/CacheService.java | 7 +- .../cassandra/streaming/StreamLockfile.java | 2 +- .../cassandra/streaming/StreamReader.java | 33 +- .../streaming/StreamReceiveTask.java | 6 +- .../cassandra/streaming/StreamSession.java | 2 +- .../streaming/StreamTransferTask.java | 2 +- .../cassandra/streaming/StreamWriter.java | 2 +- .../compress/CompressedStreamReader.java | 16 +- .../compress/CompressedStreamWriter.java | 2 +- .../streaming/messages/FileMessageHeader.java | 27 +- .../messages/IncomingFileMessage.java | 2 +- .../messages/OutgoingFileMessage.java | 3 +- .../streaming/messages/StreamMessage.java | 4 +- .../apache/cassandra/tools/SSTableExport.java | 8 +- .../apache/cassandra/tools/SSTableImport.java | 7 +- .../tools/SSTableRepairedAtSetter.java | 2 +- .../cassandra/tools/StandaloneScrubber.java | 3 +- .../cassandra/tools/StandaloneSplitter.java | 3 +- .../cassandra/tools/StandaloneUpgrader.java | 5 +- .../utils/vint/EncodedDataInputStream.java | 6 +- .../db/compaction/LongCompactionsTest.java | 4 +- .../LongLeveledCompactionStrategyTest.java | 2 +- test/unit/org/apache/cassandra/Util.java | 2 +- .../cassandra/cache/AutoSavingCacheTest.java | 2 +- .../org/apache/cassandra/db/CleanupTest.java | 2 +- .../cassandra/db/ColumnFamilyStoreTest.java | 33 +- .../org/apache/cassandra/db/KeyCacheTest.java | 5 +- .../org/apache/cassandra/db/KeyspaceTest.java | 2 +- .../cassandra/db/RangeTombstoneTest.java | 3 +- .../cassandra/db/RowIndexEntryTest.java | 7 +- .../org/apache/cassandra/db/ScrubTest.java | 5 +- .../db/compaction/AntiCompactionTest.java | 15 +- .../BlacklistingCompactionsTest.java | 2 +- .../db/compaction/CompactionsPurgeTest.java | 2 +- .../db/compaction/CompactionsTest.java | 26 +- .../DateTieredCompactionStrategyTest.java | 3 +- .../LeveledCompactionStrategyTest.java | 2 +- .../SizeTieredCompactionStrategyTest.java | 2 +- .../db/compaction/TTLExpiryTest.java | 5 +- .../cassandra/io/sstable/DescriptorTest.java | 52 +- .../io/sstable/IndexSummaryManagerTest.java | 1 + .../io/sstable/LegacySSTableTest.java | 15 +- .../io/sstable/SSTableMetadataTest.java | 1 + .../io/sstable/SSTableReaderTest.java | 1 + .../io/sstable/SSTableScannerTest.java | 11 +- .../cassandra/io/sstable/SSTableUtils.java | 9 +- .../metadata/MetadataSerializerTest.java | 2 +- .../cassandra/repair/ValidatorTest.java | 3 +- .../streaming/StreamTransferTaskTest.java | 2 +- .../streaming/StreamingTransferTest.java | 2 +- .../cassandra/tools/SSTableExportTest.java | 20 +- .../cassandra/tools/SSTableImportTest.java | 2 +- tools/cqlstress-example.yaml | 9 +- tools/cqlstress-insanity-example.yaml | 2 - 146 files changed, 1751 insertions(+), 1022 deletions(-) create mode 100644 src/java/org/apache/cassandra/io/sstable/format/SSTableFormat.java rename src/java/org/apache/cassandra/io/sstable/{ => format}/SSTableReader.java (78%) create mode 100644 src/java/org/apache/cassandra/io/sstable/format/SSTableWriter.java create mode 100644 src/java/org/apache/cassandra/io/sstable/format/Version.java create mode 100644 src/java/org/apache/cassandra/io/sstable/format/big/BigFormat.java create mode 100644 src/java/org/apache/cassandra/io/sstable/format/big/BigTableReader.java rename src/java/org/apache/cassandra/io/sstable/{SSTableScanner.java => format/big/BigTableScanner.java} (89%) rename src/java/org/apache/cassandra/io/sstable/{SSTableWriter.java => format/big/BigTableWriter.java} (76%) rename src/java/org/apache/cassandra/{db/columniterator => io/sstable/format/big}/IndexedSliceReader.java (98%) rename src/java/org/apache/cassandra/{db/columniterator => io/sstable/format/big}/SSTableNamesIterator.java (96%) rename src/java/org/apache/cassandra/{db/columniterator => io/sstable/format/big}/SSTableSliceIterator.java (93%) rename src/java/org/apache/cassandra/{db/columniterator => io/sstable/format/big}/SimpleSliceReader.java (92%) diff --git a/CHANGES.txt b/CHANGES.txt index 0dae098aac9b..524e77680087 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0 + * Extend Descriptor to include a format value and refactor reader/writer apis (CASSANDRA-7443) * Integrate JMH for microbenchmarks (CASSANDRA-8151) * Keep sstable levels when bootstrapping (CASSANDRA-7460) * Add Sigar library and perform basic OS settings check on startup (CASSANDRA-7838) diff --git a/build.xml b/build.xml index 9cd80c21c935..7a6476c8c38e 100644 --- a/build.xml +++ b/build.xml @@ -334,7 +334,7 @@ - + @@ -418,10 +418,11 @@ - + + - + - @@ -492,6 +492,7 @@ + @@ -1110,7 +1111,8 @@ - + + diff --git a/src/java/org/apache/cassandra/config/CFMetaData.java b/src/java/org/apache/cassandra/config/CFMetaData.java index 1e2a2e1c187c..cf4d7617aef4 100644 --- a/src/java/org/apache/cassandra/config/CFMetaData.java +++ b/src/java/org/apache/cassandra/config/CFMetaData.java @@ -44,6 +44,8 @@ import com.google.common.collect.Iterables; import com.google.common.collect.MapDifference; import com.google.common.collect.Maps; +import org.apache.cassandra.io.sstable.format.Version; +import org.apache.cassandra.io.util.FileDataInput; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.commons.lang3.builder.ToStringBuilder; @@ -1460,17 +1462,17 @@ public static String getDefaultIndexName(String cfName, ColumnIdentifier columnN return (cfName + "_" + columnName + "_idx").replaceAll("\\W", ""); } - public Iterator getOnDiskIterator(DataInput in, Descriptor.Version version) + public Iterator getOnDiskIterator(FileDataInput in, Version version) { return getOnDiskIterator(in, ColumnSerializer.Flag.LOCAL, Integer.MIN_VALUE, version); } - public Iterator getOnDiskIterator(DataInput in, ColumnSerializer.Flag flag, int expireBefore, Descriptor.Version version) + public Iterator getOnDiskIterator(FileDataInput in, ColumnSerializer.Flag flag, int expireBefore, Version version) { - return AbstractCell.onDiskIterator(in, flag, expireBefore, version, comparator); + return version.getSSTableFormat().getOnDiskIterator(in, flag, expireBefore, this, version); } - public AtomDeserializer getOnDiskDeserializer(DataInput in, Descriptor.Version version) + public AtomDeserializer getOnDiskDeserializer(DataInput in, Version version) { return new AtomDeserializer(comparator, in, ColumnSerializer.Flag.LOCAL, Integer.MIN_VALUE, version); } diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java index 8659c94d35ba..00e875b1bbaa 100644 --- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java +++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java @@ -38,6 +38,7 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableSet; import com.google.common.primitives.Longs; +import org.apache.cassandra.io.sstable.format.SSTableFormat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.cassandra.auth.AllowAllAuthenticator; @@ -98,6 +99,8 @@ public class DatabaseDescriptor private static Config conf; + private static SSTableFormat.Type sstable_format = SSTableFormat.Type.BIG; + private static IAuthenticator authenticator = new AllowAllAuthenticator(); private static IAuthorizer authorizer = new AllowAllAuthorizer(); @@ -1544,6 +1547,12 @@ public static boolean getInterDCTcpNoDelay() return conf.inter_dc_tcp_nodelay; } + + public static SSTableFormat.Type getSSTableFormat() + { + return sstable_format; + } + public static MemtablePool getMemtableAllocatorPool() { long heapLimit = ((long) conf.memtable_heap_space_in_mb) << 20; diff --git a/src/java/org/apache/cassandra/db/AbstractCell.java b/src/java/org/apache/cassandra/db/AbstractCell.java index f27871f93abd..de861263a756 100644 --- a/src/java/org/apache/cassandra/db/AbstractCell.java +++ b/src/java/org/apache/cassandra/db/AbstractCell.java @@ -31,6 +31,7 @@ import org.apache.cassandra.db.context.CounterContext; import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.io.sstable.Descriptor; +import org.apache.cassandra.io.sstable.format.Version; import org.apache.cassandra.serializers.MarshalException; import org.apache.cassandra.utils.FBUtilities; @@ -39,7 +40,7 @@ public abstract class AbstractCell implements Cell public static Iterator onDiskIterator(final DataInput in, final ColumnSerializer.Flag flag, final int expireBefore, - final Descriptor.Version version, + final Version version, final CellNameType type) { return new AbstractIterator() diff --git a/src/java/org/apache/cassandra/db/AtomDeserializer.java b/src/java/org/apache/cassandra/db/AtomDeserializer.java index 799ed0e07f40..0c4342270ba3 100644 --- a/src/java/org/apache/cassandra/db/AtomDeserializer.java +++ b/src/java/org/apache/cassandra/db/AtomDeserializer.java @@ -24,6 +24,7 @@ import org.apache.cassandra.db.composites.CellNameType; import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.io.sstable.Descriptor; +import org.apache.cassandra.io.sstable.format.Version; /** * Helper class to deserialize OnDiskAtom efficiently. @@ -40,9 +41,9 @@ public class AtomDeserializer private final DataInput in; private final ColumnSerializer.Flag flag; private final int expireBefore; - private final Descriptor.Version version; + private final Version version; - public AtomDeserializer(CellNameType type, DataInput in, ColumnSerializer.Flag flag, int expireBefore, Descriptor.Version version) + public AtomDeserializer(CellNameType type, DataInput in, ColumnSerializer.Flag flag, int expireBefore, Version version) { this.type = type; this.nameDeserializer = type.newDeserializer(in); diff --git a/src/java/org/apache/cassandra/db/BatchlogManager.java b/src/java/org/apache/cassandra/db/BatchlogManager.java index 18d9a17eabbd..7f04cba2905e 100644 --- a/src/java/org/apache/cassandra/db/BatchlogManager.java +++ b/src/java/org/apache/cassandra/db/BatchlogManager.java @@ -31,6 +31,7 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.*; import com.google.common.util.concurrent.RateLimiter; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -44,7 +45,6 @@ import org.apache.cassandra.exceptions.WriteTimeoutException; import org.apache.cassandra.gms.FailureDetector; import org.apache.cassandra.io.sstable.Descriptor; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.io.util.DataOutputBuffer; import org.apache.cassandra.net.MessageIn; import org.apache.cassandra.net.MessageOut; diff --git a/src/java/org/apache/cassandra/db/CollationController.java b/src/java/org/apache/cassandra/db/CollationController.java index ff5fe8806c7c..922cbfee2b1c 100644 --- a/src/java/org/apache/cassandra/db/CollationController.java +++ b/src/java/org/apache/cassandra/db/CollationController.java @@ -35,7 +35,7 @@ import org.apache.cassandra.db.filter.NamesQueryFilter; import org.apache.cassandra.db.filter.QueryFilter; import org.apache.cassandra.db.marshal.CounterColumnType; -import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.tracing.Tracing; import org.apache.cassandra.utils.SearchIterator; diff --git a/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java b/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java index e2aeb6c5df12..29866d612438 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java @@ -25,6 +25,7 @@ import org.apache.cassandra.io.ISSTableSerializer; import org.apache.cassandra.io.IVersionedSerializer; import org.apache.cassandra.io.sstable.Descriptor; +import org.apache.cassandra.io.sstable.format.Version; import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.utils.UUIDSerializer; @@ -146,7 +147,7 @@ public void serializeForSSTable(ColumnFamily cf, DataOutputPlus out) throw new UnsupportedOperationException(); } - public ColumnFamily deserializeFromSSTable(DataInput in, Descriptor.Version version) + public ColumnFamily deserializeFromSSTable(DataInput in, Version version) { throw new UnsupportedOperationException(); } diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java index aa266bebc276..a23b2ad26e6d 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java @@ -34,6 +34,10 @@ import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Uninterruptibles; import org.apache.cassandra.io.FSWriteError; +import org.apache.cassandra.io.sstable.format.SSTableFormat; +import org.apache.cassandra.io.sstable.format.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableWriter; +import org.apache.cassandra.io.sstable.format.Version; import org.json.simple.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -441,7 +445,7 @@ private static synchronized ColumnFamilyStore createColumnFamilyStore(Keyspace k generations.add(desc.generation); if (!desc.isCompatible()) throw new RuntimeException(String.format("Incompatible SSTable found. Current version %s is unable to read file: %s. Please run upgradesstables.", - Descriptor.Version.CURRENT, desc)); + desc.getFormat().getLatestVersion(), desc)); } Collections.sort(generations); int value = (generations.size() > 0) ? (generations.get(generations.size() - 1)) : 0; @@ -672,7 +676,7 @@ public synchronized void loadNewSSTables() Set currentDescriptors = new HashSet(); for (SSTableReader sstable : data.getView().sstables) currentDescriptors.add(sstable.descriptor); - Set newSSTables = new HashSet(); + Set newSSTables = new HashSet<>(); Directories.SSTableLister lister = directories.sstableLister().skipTemporary(true); for (Map.Entry> entry : lister.list().entrySet()) @@ -686,8 +690,8 @@ public synchronized void loadNewSSTables() if (!descriptor.isCompatible()) throw new RuntimeException(String.format("Can't open incompatible SSTable! Current version %s, found file: %s", - Descriptor.Version.CURRENT, - descriptor)); + descriptor.getFormat().getLatestVersion(), + descriptor)); // force foreign sstables to level 0 try @@ -711,7 +715,8 @@ public synchronized void loadNewSSTables() descriptor.ksname, descriptor.cfname, fileIndexGenerator.incrementAndGet(), - Descriptor.Type.FINAL); + Descriptor.Type.FINAL, + descriptor.formatType); } while (new File(newDescriptor.filenameFor(Component.DATA)).exists()); @@ -780,17 +785,23 @@ public String getColumnFamilyName() public String getTempSSTablePath(File directory) { - return getTempSSTablePath(directory, Descriptor.Version.CURRENT); + return getTempSSTablePath(directory, DatabaseDescriptor.getSSTableFormat().info.getLatestVersion(), DatabaseDescriptor.getSSTableFormat()); } - private String getTempSSTablePath(File directory, Descriptor.Version version) + public String getTempSSTablePath(File directory, SSTableFormat.Type format) + { + return getTempSSTablePath(directory, format.info.getLatestVersion(), format); + } + + private String getTempSSTablePath(File directory, Version version, SSTableFormat.Type format) { Descriptor desc = new Descriptor(version, directory, keyspace.getName(), name, fileIndexGenerator.incrementAndGet(), - Descriptor.Type.TEMP); + Descriptor.Type.TEMP, + format); return desc.filenameFor(Component.DATA); } @@ -2193,7 +2204,7 @@ private void writeSnapshotManifest(final JSONArray filesJSONArr, final String sn public List getSnapshotSSTableReader(String tag) throws IOException { Map> snapshots = directories.sstableLister().snapshots(tag).list(); - List readers = new ArrayList(snapshots.size()); + List readers = new ArrayList<>(snapshots.size()); for (Map.Entry> entries : snapshots.entrySet()) readers.add(SSTableReader.open(entries.getKey(), entries.getValue(), metadata, partitioner)); return readers; @@ -2779,7 +2790,7 @@ public ReplayPosition discardSSTables(long truncatedAt) { assert data.getCompacting().isEmpty() : data.getCompacting(); - List truncatedSSTables = new ArrayList(); + List truncatedSSTables = new ArrayList<>(); for (SSTableReader sstable : getSSTables()) { diff --git a/src/java/org/apache/cassandra/db/DataTracker.java b/src/java/org/apache/cassandra/db/DataTracker.java index 7393323dce51..d10619076a21 100644 --- a/src/java/org/apache/cassandra/db/DataTracker.java +++ b/src/java/org/apache/cassandra/db/DataTracker.java @@ -24,13 +24,13 @@ import com.google.common.base.Predicate; import com.google.common.collect.*; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.compaction.OperationType; import org.apache.cassandra.dht.AbstractBounds; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.metrics.StorageMetrics; import org.apache.cassandra.notifications.*; diff --git a/src/java/org/apache/cassandra/db/DeletionInfo.java b/src/java/org/apache/cassandra/db/DeletionInfo.java index 3e5e845a806a..048324a1f096 100644 --- a/src/java/org/apache/cassandra/db/DeletionInfo.java +++ b/src/java/org/apache/cassandra/db/DeletionInfo.java @@ -147,7 +147,7 @@ public boolean isDeleted(Cell cell) /** * Returns a new {@link InOrderTester} in forward order. */ - InOrderTester inOrderTester() + public InOrderTester inOrderTester() { return inOrderTester(false); } diff --git a/src/java/org/apache/cassandra/db/Keyspace.java b/src/java/org/apache/cassandra/db/Keyspace.java index ca43df68e46b..8986154d52b7 100644 --- a/src/java/org/apache/cassandra/db/Keyspace.java +++ b/src/java/org/apache/cassandra/db/Keyspace.java @@ -32,6 +32,7 @@ import com.google.common.base.Function; import com.google.common.collect.Iterables; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -44,7 +45,6 @@ import org.apache.cassandra.db.filter.QueryFilter; import org.apache.cassandra.db.index.SecondaryIndex; import org.apache.cassandra.db.index.SecondaryIndexManager; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.locator.AbstractReplicationStrategy; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.service.pager.QueryPagers; @@ -260,7 +260,7 @@ public static void clearSnapshot(String snapshotName, String keyspace) */ public List getAllSSTables() { - List list = new ArrayList(columnFamilyStores.size()); + List list = new ArrayList<>(columnFamilyStores.size()); for (ColumnFamilyStore cfStore : columnFamilyStores.values()) list.addAll(cfStore.getSSTables()); return list; diff --git a/src/java/org/apache/cassandra/db/Memtable.java b/src/java/org/apache/cassandra/db/Memtable.java index a7118336eab5..80376f74c425 100644 --- a/src/java/org/apache/cassandra/db/Memtable.java +++ b/src/java/org/apache/cassandra/db/Memtable.java @@ -28,6 +28,9 @@ import java.util.concurrent.atomic.AtomicReference; import com.google.common.base.Throwables; +import org.apache.cassandra.io.sstable.Descriptor; +import org.apache.cassandra.io.sstable.format.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableWriter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,8 +40,6 @@ import org.apache.cassandra.db.composites.CellNameType; import org.apache.cassandra.db.index.SecondaryIndexManager; import org.apache.cassandra.dht.LongToken; -import org.apache.cassandra.io.sstable.SSTableReader; -import org.apache.cassandra.io.sstable.SSTableWriter; import org.apache.cassandra.io.sstable.metadata.MetadataCollector; import org.apache.cassandra.io.util.DiskAwareRunnable; import org.apache.cassandra.service.ActiveRepairService; @@ -384,12 +385,8 @@ private SSTableReader writeSortedContents(ReplayPosition context, File sstableDi public SSTableWriter createFlushWriter(String filename) { MetadataCollector sstableMetadataCollector = new MetadataCollector(cfs.metadata.comparator).replayPosition(context); - return new SSTableWriter(filename, - rows.size(), - ActiveRepairService.UNREPAIRED_SSTABLE, - cfs.metadata, - cfs.partitioner, - sstableMetadataCollector); + + return SSTableWriter.create(Descriptor.fromFilename(filename), (long) rows.size(), ActiveRepairService.UNREPAIRED_SSTABLE, cfs.metadata, cfs.partitioner, sstableMetadataCollector); } } diff --git a/src/java/org/apache/cassandra/db/OnDiskAtom.java b/src/java/org/apache/cassandra/db/OnDiskAtom.java index b53e43b3d6bb..f97ca425b630 100644 --- a/src/java/org/apache/cassandra/db/OnDiskAtom.java +++ b/src/java/org/apache/cassandra/db/OnDiskAtom.java @@ -26,6 +26,7 @@ import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.io.ISSTableSerializer; import org.apache.cassandra.io.sstable.Descriptor; +import org.apache.cassandra.io.sstable.format.Version; import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.serializers.MarshalException; @@ -65,12 +66,12 @@ public void serializeForSSTable(OnDiskAtom atom, DataOutputPlus out) throws IOEx } } - public OnDiskAtom deserializeFromSSTable(DataInput in, Descriptor.Version version) throws IOException + public OnDiskAtom deserializeFromSSTable(DataInput in, Version version) throws IOException { return deserializeFromSSTable(in, ColumnSerializer.Flag.LOCAL, Integer.MIN_VALUE, version); } - public OnDiskAtom deserializeFromSSTable(DataInput in, ColumnSerializer.Flag flag, int expireBefore, Descriptor.Version version) throws IOException + public OnDiskAtom deserializeFromSSTable(DataInput in, ColumnSerializer.Flag flag, int expireBefore, Version version) throws IOException { Composite name = type.serializer().deserialize(in); if (name.isEmpty()) diff --git a/src/java/org/apache/cassandra/db/RangeTombstone.java b/src/java/org/apache/cassandra/db/RangeTombstone.java index 6a246f927c25..4a0037b2224c 100644 --- a/src/java/org/apache/cassandra/db/RangeTombstone.java +++ b/src/java/org/apache/cassandra/db/RangeTombstone.java @@ -27,6 +27,7 @@ import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.io.ISSTableSerializer; import org.apache.cassandra.io.sstable.Descriptor; +import org.apache.cassandra.io.sstable.format.Version; import org.apache.cassandra.io.util.DataOutputBuffer; import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.serializers.MarshalException; @@ -259,7 +260,7 @@ public void serializeForSSTable(RangeTombstone t, DataOutputPlus out) throws IOE DeletionTime.serializer.serialize(t.data, out); } - public RangeTombstone deserializeFromSSTable(DataInput in, Descriptor.Version version) throws IOException + public RangeTombstone deserializeFromSSTable(DataInput in, Version version) throws IOException { Composite min = type.serializer().deserialize(in); @@ -268,14 +269,14 @@ public RangeTombstone deserializeFromSSTable(DataInput in, Descriptor.Version ve return deserializeBody(in, min, version); } - public RangeTombstone deserializeBody(DataInput in, Composite min, Descriptor.Version version) throws IOException + public RangeTombstone deserializeBody(DataInput in, Composite min, Version version) throws IOException { Composite max = type.serializer().deserialize(in); DeletionTime dt = DeletionTime.serializer.deserialize(in); return new RangeTombstone(min, max, dt); } - public void skipBody(DataInput in, Descriptor.Version version) throws IOException + public void skipBody(DataInput in, Version version) throws IOException { type.serializer().skip(in); DeletionTime.serializer.skip(in); diff --git a/src/java/org/apache/cassandra/db/RowIndexEntry.java b/src/java/org/apache/cassandra/db/RowIndexEntry.java index 01035c470c13..4ff61cee7ef5 100644 --- a/src/java/org/apache/cassandra/db/RowIndexEntry.java +++ b/src/java/org/apache/cassandra/db/RowIndexEntry.java @@ -27,15 +27,14 @@ import com.google.common.primitives.Ints; import org.apache.cassandra.cache.IMeasurableMemory; -import org.apache.cassandra.db.composites.CType; import org.apache.cassandra.io.ISerializer; -import org.apache.cassandra.io.sstable.Descriptor; import org.apache.cassandra.io.sstable.IndexHelper; +import org.apache.cassandra.io.sstable.format.Version; import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.utils.ObjectSizes; -public class RowIndexEntry implements IMeasurableMemory +public class RowIndexEntry implements IMeasurableMemory { private static final long EMPTY_SIZE = ObjectSizes.measure(new RowIndexEntry(0)); @@ -46,12 +45,12 @@ public RowIndexEntry(long position) this.position = position; } - protected int promotedSize(CType type) + public int promotedSize(ISerializer idxSerializer) { return 0; } - public static RowIndexEntry create(long position, DeletionTime deletionTime, ColumnIndex index) + public static RowIndexEntry create(long position, DeletionTime deletionTime, ColumnIndex index) { assert index != null; assert deletionTime != null; @@ -62,7 +61,7 @@ public static RowIndexEntry create(long position, DeletionTime deletionTime, Col if (index.columnsIndex.size() > 1) return new IndexedEntry(position, deletionTime, index.columnsIndex); else - return new RowIndexEntry(position); + return new RowIndexEntry<>(position); } /** @@ -79,7 +78,16 @@ public DeletionTime deletionTime() throw new UnsupportedOperationException(); } - public List columnsIndex() + /** + * @return the offset to the start of the header information for this row. + * For some formats this may not be the start of the row. + */ + public long headerOffset() + { + return 0; + } + + public List columnsIndex() { return Collections.emptyList(); } @@ -89,31 +97,37 @@ public long unsharedHeapSize() return EMPTY_SIZE; } - public static class Serializer + public static interface IndexSerializer { - private final CType type; + void serialize(RowIndexEntry rie, DataOutputPlus out) throws IOException; + RowIndexEntry deserialize(DataInput in, Version version) throws IOException; + public int serializedSize(RowIndexEntry rie); + } - public Serializer(CType type) + public static class Serializer implements IndexSerializer + { + private final ISerializer idxSerializer; + + public Serializer(ISerializer idxSerializer) { - this.type = type; + this.idxSerializer = idxSerializer; } - public void serialize(RowIndexEntry rie, DataOutputPlus out) throws IOException + public void serialize(RowIndexEntry rie, DataOutputPlus out) throws IOException { out.writeLong(rie.position); - out.writeInt(rie.promotedSize(type)); + out.writeInt(rie.promotedSize(idxSerializer)); if (rie.isIndexed()) { DeletionTime.serializer.serialize(rie.deletionTime(), out); out.writeInt(rie.columnsIndex().size()); - ISerializer idxSerializer = type.indexSerializer(); for (IndexHelper.IndexInfo info : rie.columnsIndex()) idxSerializer.serialize(info, out); } } - public RowIndexEntry deserialize(DataInput in, Descriptor.Version version) throws IOException + public RowIndexEntry deserialize(DataInput in, Version version) throws IOException { long position = in.readLong(); @@ -123,8 +137,7 @@ public RowIndexEntry deserialize(DataInput in, Descriptor.Version version) throw DeletionTime deletionTime = DeletionTime.serializer.deserialize(in); int entries = in.readInt(); - ISerializer idxSerializer = type.indexSerializer(); - List columnsIndex = new ArrayList(entries); + List columnsIndex = new ArrayList<>(entries); for (int i = 0; i < entries; i++) columnsIndex.add(idxSerializer.deserialize(in)); @@ -132,7 +145,7 @@ public RowIndexEntry deserialize(DataInput in, Descriptor.Version version) throw } else { - return new RowIndexEntry(position); + return new RowIndexEntry<>(position); } } @@ -151,9 +164,9 @@ public static void skipPromotedIndex(DataInput in) throws IOException FileUtils.skipBytesFully(in, size); } - public int serializedSize(RowIndexEntry rie) + public int serializedSize(RowIndexEntry rie) { - int size = TypeSizes.NATIVE.sizeof(rie.position) + TypeSizes.NATIVE.sizeof(rie.promotedSize(type)); + int size = TypeSizes.NATIVE.sizeof(rie.position) + TypeSizes.NATIVE.sizeof(rie.promotedSize(idxSerializer)); if (rie.isIndexed()) { @@ -162,11 +175,11 @@ public int serializedSize(RowIndexEntry rie) size += DeletionTime.serializer.serializedSize(rie.deletionTime(), TypeSizes.NATIVE); size += TypeSizes.NATIVE.sizeof(index.size()); - ISerializer idxSerializer = type.indexSerializer(); for (IndexHelper.IndexInfo info : index) size += idxSerializer.serializedSize(info, TypeSizes.NATIVE); } + return size; } } @@ -174,7 +187,7 @@ public int serializedSize(RowIndexEntry rie) /** * An entry in the row index for a row whose columns are indexed. */ - private static class IndexedEntry extends RowIndexEntry + private static class IndexedEntry extends RowIndexEntry { private final DeletionTime deletionTime; private final List columnsIndex; @@ -204,12 +217,11 @@ public List columnsIndex() } @Override - public int promotedSize(CType type) + public int promotedSize(ISerializer idxSerializer) { TypeSizes typeSizes = TypeSizes.NATIVE; long size = DeletionTime.serializer.serializedSize(deletionTime, typeSizes); size += typeSizes.sizeof(columnsIndex.size()); // number of entries - ISerializer idxSerializer = type.indexSerializer(); for (IndexHelper.IndexInfo info : columnsIndex) size += idxSerializer.serializedSize(info, typeSizes); diff --git a/src/java/org/apache/cassandra/db/RowIteratorFactory.java b/src/java/org/apache/cassandra/db/RowIteratorFactory.java index 5bd2d9b3c034..6ac74ae4c871 100644 --- a/src/java/org/apache/cassandra/db/RowIteratorFactory.java +++ b/src/java/org/apache/cassandra/db/RowIteratorFactory.java @@ -26,7 +26,7 @@ import org.apache.cassandra.db.columniterator.OnDiskAtomIterator; import org.apache.cassandra.db.filter.QueryFilter; import org.apache.cassandra.db.filter.IDiskAtomFilter; -import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.utils.CloseableIterator; import org.apache.cassandra.utils.MergeIterator; diff --git a/src/java/org/apache/cassandra/db/SystemKeyspace.java b/src/java/org/apache/cassandra/db/SystemKeyspace.java index bfd92e93f5a0..5c0d9357d943 100644 --- a/src/java/org/apache/cassandra/db/SystemKeyspace.java +++ b/src/java/org/apache/cassandra/db/SystemKeyspace.java @@ -29,6 +29,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.SetMultimap; import com.google.common.collect.Sets; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -48,7 +49,6 @@ import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.io.util.DataOutputBuffer; import org.apache.cassandra.locator.IEndpointSnitch; import org.apache.cassandra.metrics.RestorableMeter; diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogDescriptor.java b/src/java/org/apache/cassandra/db/commitlog/CommitLogDescriptor.java index e50a5853b497..f914c2c884a3 100644 --- a/src/java/org/apache/cassandra/db/commitlog/CommitLogDescriptor.java +++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogDescriptor.java @@ -28,6 +28,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import com.google.common.annotations.VisibleForTesting; import org.apache.cassandra.io.FSReadError; import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.utils.PureJavaCrc32; @@ -43,11 +44,13 @@ public class CommitLogDescriptor public static final int VERSION_12 = 2; public static final int VERSION_20 = 3; public static final int VERSION_21 = 4; + public static final int VERSION_30 = 5; /** * Increment this number if there is a changes in the commit log disc layout or MessagingVersion changes. * Note: make sure to handle {@link #getMessagingVersion()} */ - public static final int current_version = VERSION_21; + @VisibleForTesting + public static final int current_version = VERSION_30; // [version, id, checksum] static final int HEADER_SIZE = 4 + 8 + 4; @@ -126,6 +129,8 @@ public int getMessagingVersion() return MessagingService.VERSION_20; case VERSION_21: return MessagingService.VERSION_21; + case VERSION_30: + return MessagingService.VERSION_30; default: throw new IllegalStateException("Unknown commitlog version " + version); } diff --git a/src/java/org/apache/cassandra/db/commitlog/ReplayPosition.java b/src/java/org/apache/cassandra/db/commitlog/ReplayPosition.java index 31fc28e87023..ca1969feb59e 100644 --- a/src/java/org/apache/cassandra/db/commitlog/ReplayPosition.java +++ b/src/java/org/apache/cassandra/db/commitlog/ReplayPosition.java @@ -27,7 +27,7 @@ import org.apache.cassandra.db.TypeSizes; import org.apache.cassandra.io.ISerializer; -import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.io.util.DataOutputPlus; public class ReplayPosition implements Comparable diff --git a/src/java/org/apache/cassandra/db/compaction/AbstractCompactedRow.java b/src/java/org/apache/cassandra/db/compaction/AbstractCompactedRow.java index 1d2bf48d4c89..f88fe92adf9f 100644 --- a/src/java/org/apache/cassandra/db/compaction/AbstractCompactedRow.java +++ b/src/java/org/apache/cassandra/db/compaction/AbstractCompactedRow.java @@ -25,6 +25,7 @@ import org.apache.cassandra.db.RowIndexEntry; import org.apache.cassandra.io.sstable.ColumnStats; import org.apache.cassandra.io.util.DataOutputPlus; +import org.apache.cassandra.io.util.SequentialWriter; /** * a CompactedRow is an object that takes a bunch of rows (keys + columnfamilies) @@ -47,7 +48,7 @@ public AbstractCompactedRow(DecoratedKey key) * * @return index information for the written row, or null if the compaction resulted in only expired tombstones. */ - public abstract RowIndexEntry write(long currentPosition, DataOutputPlus out) throws IOException; + public abstract RowIndexEntry write(long currentPosition, SequentialWriter out) throws IOException; /** * update @param digest with the data bytes of the row (not including row key or row size). diff --git a/src/java/org/apache/cassandra/db/compaction/AbstractCompactionStrategy.java b/src/java/org/apache/cassandra/db/compaction/AbstractCompactionStrategy.java index 6a0e0df86e29..d228cbae1a70 100644 --- a/src/java/org/apache/cassandra/db/compaction/AbstractCompactionStrategy.java +++ b/src/java/org/apache/cassandra/db/compaction/AbstractCompactionStrategy.java @@ -24,6 +24,7 @@ import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.util.concurrent.RateLimiter; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,7 +34,6 @@ import org.apache.cassandra.dht.Token; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.sstable.Component; -import org.apache.cassandra.io.sstable.SSTableReader; /** * Pluggable compaction strategy determines how SSTables get merged. @@ -369,7 +369,7 @@ else if (CompactionController.getFullyExpiredSSTables(cfs, Collections.singleton long keys = sstable.estimatedKeys(); Set> ranges = new HashSet>(overlaps.size()); for (SSTableReader overlap : overlaps) - ranges.add(new Range(overlap.first.getToken(), overlap.last.getToken(), overlap.partitioner)); + ranges.add(new Range<>(overlap.first.getToken(), overlap.last.getToken(), overlap.partitioner)); long remainingKeys = keys - sstable.estimatedKeysForRanges(ranges); // next, calculate what percentage of columns we have within those keys long columns = sstable.getEstimatedColumnCount().mean() * remainingKeys; diff --git a/src/java/org/apache/cassandra/db/compaction/AbstractCompactionTask.java b/src/java/org/apache/cassandra/db/compaction/AbstractCompactionTask.java index 59338f4861e4..7631baa0385f 100644 --- a/src/java/org/apache/cassandra/db/compaction/AbstractCompactionTask.java +++ b/src/java/org/apache/cassandra/db/compaction/AbstractCompactionTask.java @@ -22,7 +22,7 @@ import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.Directories; import org.apache.cassandra.db.compaction.CompactionManager.CompactionExecutorStatsCollector; -import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.io.util.DiskAwareRunnable; public abstract class AbstractCompactionTask extends DiskAwareRunnable diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionController.java b/src/java/org/apache/cassandra/db/compaction/CompactionController.java index ef2780559423..e57d01d0789f 100644 --- a/src/java/org/apache/cassandra/db/compaction/CompactionController.java +++ b/src/java/org/apache/cassandra/db/compaction/CompactionController.java @@ -24,13 +24,13 @@ import java.util.List; import java.util.Set; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.DataTracker; import org.apache.cassandra.db.DecoratedKey; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.utils.AlwaysPresentFilter; /** @@ -112,7 +112,7 @@ public static Set getFullyExpiredSSTables(ColumnFamilyStore cfSto if (compacting == null) return Collections.emptySet(); - List candidates = new ArrayList(); + List candidates = new ArrayList<>(); long minTimestamp = Long.MAX_VALUE; diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionIterable.java b/src/java/org/apache/cassandra/db/compaction/CompactionIterable.java index 0c9b52aa0018..86918bcb52e5 100644 --- a/src/java/org/apache/cassandra/db/compaction/CompactionIterable.java +++ b/src/java/org/apache/cassandra/db/compaction/CompactionIterable.java @@ -24,11 +24,14 @@ import com.google.common.collect.ImmutableList; import org.apache.cassandra.db.columniterator.OnDiskAtomIterator; +import org.apache.cassandra.io.sstable.format.SSTableFormat; import org.apache.cassandra.utils.CloseableIterator; import org.apache.cassandra.utils.MergeIterator; public class CompactionIterable extends AbstractCompactionIterable { + final SSTableFormat format; + private static final Comparator comparator = new Comparator() { public int compare(OnDiskAtomIterator i1, OnDiskAtomIterator i2) @@ -37,9 +40,10 @@ public int compare(OnDiskAtomIterator i1, OnDiskAtomIterator i2) } }; - public CompactionIterable(OperationType type, List scanners, CompactionController controller) + public CompactionIterable(OperationType type, List scanners, CompactionController controller, SSTableFormat.Type formatType) { super(controller, type, scanners); + this.format = formatType.info; } public CloseableIterator iterator() @@ -71,7 +75,7 @@ protected AbstractCompactedRow getReduced() // create a new container for rows, since we're going to clear ours for the next one, // and the AbstractCompactionRow code should be able to assume that the collection it receives // won't be pulled out from under it. - return new LazilyCompactedRow(controller, ImmutableList.copyOf(rows)); + return format.getCompactedRowWriter(controller, ImmutableList.copyOf(rows)); } finally { diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java index b08668e22510..18ad7ae29735 100644 --- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java +++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java @@ -52,7 +52,9 @@ import com.google.common.collect.Multiset; import com.google.common.collect.Sets; import com.google.common.util.concurrent.RateLimiter; - +import org.apache.cassandra.io.sstable.format.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableWriter; +import org.apache.cassandra.io.sstable.metadata.MetadataCollector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -76,10 +78,7 @@ import org.apache.cassandra.dht.Token; import org.apache.cassandra.io.sstable.Descriptor; import org.apache.cassandra.io.sstable.SSTableIdentityIterator; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.io.sstable.SSTableRewriter; -import org.apache.cassandra.io.sstable.SSTableWriter; -import org.apache.cassandra.io.sstable.metadata.MetadataCollector; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.metrics.CompactionMetrics; import org.apache.cassandra.repair.Validator; @@ -327,7 +326,7 @@ public Iterable filterSSTables(Iterable input) @Override public boolean apply(SSTableReader sstable) { - return !(excludeCurrentVersion && sstable.descriptor.version.equals(Descriptor.Version.CURRENT)); + return !(excludeCurrentVersion && sstable.descriptor.version.equals(sstable.descriptor.getFormat().getLatestVersion())); } }); } @@ -502,7 +501,7 @@ protected void runMayThrow() throws IOException { // look up the sstables now that we're on the compaction executor, so we don't try to re-compact // something that was already being compacted earlier. - Collection sstables = new ArrayList(dataFiles.size()); + Collection sstables = new ArrayList<>(dataFiles.size()); for (Descriptor desc : dataFiles) { // inefficient but not in a performance sensitive path @@ -845,12 +844,8 @@ public static SSTableWriter createWriter(ColumnFamilyStore cfs, SSTableReader sstable) { FileUtils.createDirectory(compactionFileLocation); - return new SSTableWriter(cfs.getTempSSTablePath(compactionFileLocation), - expectedBloomFilterSize, - repairedAt, - cfs.metadata, - cfs.partitioner, - new MetadataCollector(Collections.singleton(sstable), cfs.metadata.comparator, sstable.getSSTableLevel())); + + return SSTableWriter.create(Descriptor.fromFilename(cfs.getTempSSTablePath(compactionFileLocation)), expectedBloomFilterSize, repairedAt, sstable.getSSTableLevel()); } public static SSTableWriter createWriterForAntiCompaction(ColumnFamilyStore cfs, @@ -875,8 +870,8 @@ public static SSTableWriter createWriterForAntiCompaction(ColumnFamilyStore cfs, break; } } - return new SSTableWriter(cfs.getTempSSTablePath(compactionFileLocation), - expectedBloomFilterSize, + return SSTableWriter.create(Descriptor.fromFilename(cfs.getTempSSTablePath(compactionFileLocation)), + (long)expectedBloomFilterSize, repairedAt, cfs.metadata, cfs.partitioner, @@ -1007,6 +1002,7 @@ private void doValidationCompaction(ColumnFamilyStore cfs, Validator validator) private void doAntiCompaction(ColumnFamilyStore cfs, Collection> ranges, Collection repairedSSTables, long repairedAt) { + // TODO(5351): we can do better here: logger.info("Performing anticompaction on {} sstables", repairedSSTables.size()); @@ -1044,6 +1040,7 @@ private int antiCompactGroup(ColumnFamilyStore cfs, Collection> ran groupMaxDataAge = sstable.maxDataAge; } + if (anticompactionGroup.size() == 0) { logger.info("No valid anticompactions for this group, All sstables were compacted and are no longer available"); @@ -1068,7 +1065,7 @@ private int antiCompactGroup(ColumnFamilyStore cfs, Collection> ran repairedSSTableWriter.switchWriter(CompactionManager.createWriterForAntiCompaction(cfs, destination, expectedBloomFilterSize, repairedAt, sstableAsSet)); unRepairedSSTableWriter.switchWriter(CompactionManager.createWriterForAntiCompaction(cfs, destination, expectedBloomFilterSize, ActiveRepairService.UNREPAIRED_SSTABLE, sstableAsSet)); - CompactionIterable ci = new CompactionIterable(OperationType.ANTICOMPACTION, scanners.scanners, controller); + CompactionIterable ci = new CompactionIterable(OperationType.ANTICOMPACTION, scanners.scanners, controller, DatabaseDescriptor.getSSTableFormat()); Iterator iter = ci.iterator(); while(iter.hasNext()) { @@ -1175,7 +1172,7 @@ private static class ValidationCompactionIterable extends CompactionIterable { public ValidationCompactionIterable(ColumnFamilyStore cfs, List scanners, int gcBefore) { - super(OperationType.VALIDATION, scanners, new ValidationCompactionController(cfs, gcBefore)); + super(OperationType.VALIDATION, scanners, new ValidationCompactionController(cfs, gcBefore), DatabaseDescriptor.getSSTableFormat()); } } diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionTask.java b/src/java/org/apache/cassandra/db/compaction/CompactionTask.java index bfb86c9a8219..584ff382b093 100644 --- a/src/java/org/apache/cassandra/db/compaction/CompactionTask.java +++ b/src/java/org/apache/cassandra/db/compaction/CompactionTask.java @@ -31,6 +31,10 @@ import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.collect.Sets; +import org.apache.cassandra.io.sstable.Descriptor; +import org.apache.cassandra.io.sstable.format.SSTableFormat; +import org.apache.cassandra.io.sstable.format.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableWriter; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,9 +43,7 @@ import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.db.compaction.CompactionManager.CompactionExecutorStatsCollector; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.io.sstable.SSTableRewriter; -import org.apache.cassandra.io.sstable.SSTableWriter; import org.apache.cassandra.io.sstable.metadata.MetadataCollector; import org.apache.cassandra.service.ActiveRepairService; import org.apache.cassandra.utils.UUIDGen; @@ -150,11 +152,13 @@ public boolean apply(SSTableReader sstable) long estimatedTotalKeys = Math.max(cfs.metadata.getMinIndexInterval(), SSTableReader.getApproximateKeyCount(actuallyCompact)); long estimatedSSTables = Math.max(1, SSTableReader.getTotalBytes(actuallyCompact) / strategy.getMaxSSTableBytes()); long keysPerSSTable = (long) Math.ceil((double) estimatedTotalKeys / estimatedSSTables); + SSTableFormat.Type sstableFormat = getFormatType(sstables); + logger.debug("Expected bloom filter size : {}", keysPerSSTable); try (AbstractCompactionStrategy.ScannerList scanners = strategy.getScanners(actuallyCompact)) { - AbstractCompactionIterable ci = new CompactionIterable(compactionType, scanners.scanners, controller); + AbstractCompactionIterable ci = new CompactionIterable(compactionType, scanners.scanners, controller, sstableFormat); Iterator iter = ci.iterator(); // we can't preheat until the tracker has been set. This doesn't happen until we tell the cfs to @@ -177,7 +181,7 @@ public boolean apply(SSTableReader sstable) return; } - writer.switchWriter(createCompactionWriter(sstableDirectory, keysPerSSTable, minRepairedAt)); + writer.switchWriter(createCompactionWriter(sstableDirectory, keysPerSSTable, minRepairedAt, sstableFormat)); while (iter.hasNext()) { if (ci.isStopRequested()) @@ -189,7 +193,7 @@ public boolean apply(SSTableReader sstable) totalKeysWritten++; if (newSSTableSegmentThresholdReached(writer.currentWriter())) { - writer.switchWriter(createCompactionWriter(sstableDirectory, keysPerSSTable, minRepairedAt)); + writer.switchWriter(createCompactionWriter(sstableDirectory, keysPerSSTable, minRepairedAt, sstableFormat)); } } @@ -271,14 +275,14 @@ private long getMinRepairedAt(Set actuallyCompact) return minRepairedAt; } - private SSTableWriter createCompactionWriter(File sstableDirectory, long keysPerSSTable, long repairedAt) + private SSTableWriter createCompactionWriter(File sstableDirectory, long keysPerSSTable, long repairedAt, SSTableFormat.Type type) { - return new SSTableWriter(cfs.getTempSSTablePath(sstableDirectory), - keysPerSSTable, - repairedAt, - cfs.metadata, - cfs.partitioner, - new MetadataCollector(sstables, cfs.metadata.comparator, getLevel())); + return SSTableWriter.create(Descriptor.fromFilename(cfs.getTempSSTablePath(sstableDirectory), type), + keysPerSSTable, + repairedAt, + cfs.metadata, + cfs.partitioner, + new MetadataCollector(sstables, cfs.metadata.comparator, getLevel())); } protected int getLevel() @@ -312,4 +316,13 @@ public static long getMaxDataAge(Collection sstables) } return max; } + + public static SSTableFormat.Type getFormatType(Collection sstables) + { + if (sstables.isEmpty() || !SSTableFormat.enableSSTableDevelopmentTestMode) + return DatabaseDescriptor.getSSTableFormat(); + + //Allows us to test compaction of non-default formats + return sstables.iterator().next().descriptor.formatType; + } } diff --git a/src/java/org/apache/cassandra/db/compaction/DateTieredCompactionStrategy.java b/src/java/org/apache/cassandra/db/compaction/DateTieredCompactionStrategy.java index 8c997edbec31..3f2aed662b83 100644 --- a/src/java/org/apache/cassandra/db/compaction/DateTieredCompactionStrategy.java +++ b/src/java/org/apache/cassandra/db/compaction/DateTieredCompactionStrategy.java @@ -22,13 +22,13 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Predicate; import com.google.common.collect.*; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.cassandra.cql3.statements.CFPropDefs; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.utils.Pair; public class DateTieredCompactionStrategy extends AbstractCompactionStrategy diff --git a/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java b/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java index cfdbd1755ddc..1b281798cb74 100644 --- a/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java +++ b/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java @@ -30,12 +30,13 @@ import org.apache.cassandra.db.*; import org.apache.cassandra.db.columniterator.OnDiskAtomIterator; import org.apache.cassandra.db.index.SecondaryIndexManager; +import org.apache.cassandra.io.sstable.format.big.BigTableWriter; import org.apache.cassandra.io.sstable.ColumnNameHelper; import org.apache.cassandra.io.sstable.ColumnStats; import org.apache.cassandra.io.sstable.SSTable; -import org.apache.cassandra.io.sstable.SSTableWriter; import org.apache.cassandra.io.util.DataOutputBuffer; import org.apache.cassandra.io.util.DataOutputPlus; +import org.apache.cassandra.io.util.SequentialWriter; import org.apache.cassandra.utils.MergeIterator; import org.apache.cassandra.utils.StreamingHistogram; @@ -48,17 +49,17 @@ */ public class LazilyCompactedRow extends AbstractCompactedRow { - private final List rows; - private final CompactionController controller; - private final long maxPurgeableTimestamp; - private final ColumnFamily emptyColumnFamily; - private ColumnStats columnStats; - private boolean closed; - private ColumnIndex.Builder indexBuilder; - private final SecondaryIndexManager.Updater indexer; - private final Reducer reducer; - private final Iterator merger; - private DeletionTime maxRowTombstone; + protected final List rows; + protected final CompactionController controller; + protected final long maxPurgeableTimestamp; + protected final ColumnFamily emptyColumnFamily; + protected ColumnStats columnStats; + protected boolean closed; + protected ColumnIndex.Builder indexBuilder; + protected final SecondaryIndexManager.Updater indexer; + protected final Reducer reducer; + protected final Iterator merger; + protected DeletionTime maxRowTombstone; public LazilyCompactedRow(CompactionController controller, List rows) { @@ -99,10 +100,12 @@ private static void removeDeleted(ColumnFamily cf, boolean shouldPurge, Decorate ColumnFamilyStore.removeDeletedColumnsOnly(cf, overriddenGCBefore, controller.cfs.indexManager.gcUpdaterFor(key)); } - public RowIndexEntry write(long currentPosition, DataOutputPlus out) throws IOException + public RowIndexEntry write(long currentPosition, SequentialWriter dataFile) throws IOException { assert !closed; + DataOutputPlus out = dataFile.stream; + ColumnIndex columnsIndex; try { @@ -130,7 +133,7 @@ public RowIndexEntry write(long currentPosition, DataOutputPlus out) throws IOEx // in case no columns were ever written, we may still need to write an empty header with a top-level tombstone indexBuilder.maybeWriteEmptyRowHeader(); - out.writeShort(SSTableWriter.END_OF_ROW); + out.writeShort(BigTableWriter.END_OF_ROW); close(); @@ -183,7 +186,7 @@ public void close() closed = true; } - private class Reducer extends MergeIterator.Reducer + protected class Reducer extends MergeIterator.Reducer { // all columns reduced together will have the same name, so there will only be one column // in the container; we just want to leverage the conflict resolution code from CF. @@ -192,9 +195,9 @@ private class Reducer extends MergeIterator.Reducer // tombstone reference; will be reconciled w/ column during getReduced. Note that the top-level (row) tombstone // is held by LCR.deletionInfo. - RangeTombstone tombstone; + public RangeTombstone tombstone; - int columns = 0; + public int columns = 0; // if the row tombstone is 'live' we need to set timestamp to MAX_VALUE to be able to overwrite it later // markedForDeleteAt is MIN_VALUE for 'live' row tombstones (which we use to default maxTimestampSeen) @@ -204,10 +207,10 @@ private class Reducer extends MergeIterator.Reducer // we are bound to have either a RangeTombstone or standard cells will set this properly: ColumnStats.MaxIntTracker maxDeletionTimeTracker = new ColumnStats.MaxIntTracker(Integer.MAX_VALUE); - StreamingHistogram tombstones = new StreamingHistogram(SSTable.TOMBSTONE_HISTOGRAM_BIN_SIZE); - List minColumnNameSeen = Collections.emptyList(); - List maxColumnNameSeen = Collections.emptyList(); - boolean hasLegacyCounterShards = false; + public StreamingHistogram tombstones = new StreamingHistogram(SSTable.TOMBSTONE_HISTOGRAM_BIN_SIZE); + public List minColumnNameSeen = Collections.emptyList(); + public List maxColumnNameSeen = Collections.emptyList(); + public boolean hasLegacyCounterShards = false; public Reducer() { diff --git a/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java b/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java index 994e52d6a1b2..7a1f883d91e9 100644 --- a/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java +++ b/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java @@ -35,6 +35,7 @@ import com.google.common.base.Joiner; import com.google.common.collect.*; import com.google.common.primitives.Doubles; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,7 +44,6 @@ import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.notifications.INotification; import org.apache.cassandra.notifications.INotificationConsumer; import org.apache.cassandra.notifications.SSTableAddedNotification; @@ -160,6 +160,7 @@ public Collection getMaximalTask(int gcBefore) } } + @Override public AbstractCompactionTask getUserDefinedTask(Collection sstables, int gcBefore) { throw new UnsupportedOperationException("LevelDB compaction strategy does not allow user-specified compactions"); @@ -319,7 +320,7 @@ public LeveledScanner(Collection sstables, Range range) this.range = range; // add only sstables that intersect our range, and estimate how much data that involves - this.sstables = new ArrayList(sstables.size()); + this.sstables = new ArrayList<>(sstables.size()); long length = 0; for (SSTableReader sstable : sstables) { @@ -342,10 +343,10 @@ public LeveledScanner(Collection sstables, Range range) public static List intersecting(Collection sstables, Range range) { - ArrayList filtered = new ArrayList(); + ArrayList filtered = new ArrayList<>(); for (SSTableReader sstable : sstables) { - Range sstableRange = new Range(sstable.first.getToken(), sstable.last.getToken(), sstable.partitioner); + Range sstableRange = new Range<>(sstable.first.getToken(), sstable.last.getToken(), sstable.partitioner); if (range == null || sstableRange.intersects(range)) filtered.add(sstable); } diff --git a/src/java/org/apache/cassandra/db/compaction/LeveledCompactionTask.java b/src/java/org/apache/cassandra/db/compaction/LeveledCompactionTask.java index 2731b6d3fe34..9a33b49de28a 100644 --- a/src/java/org/apache/cassandra/db/compaction/LeveledCompactionTask.java +++ b/src/java/org/apache/cassandra/db/compaction/LeveledCompactionTask.java @@ -20,8 +20,8 @@ import java.util.Collection; import org.apache.cassandra.db.ColumnFamilyStore; -import org.apache.cassandra.io.sstable.SSTableReader; -import org.apache.cassandra.io.sstable.SSTableWriter; +import org.apache.cassandra.io.sstable.format.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableWriter; public class LeveledCompactionTask extends CompactionTask { diff --git a/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java b/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java index 6d3bf6975ef9..74be1435c0af 100644 --- a/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java +++ b/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java @@ -28,6 +28,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Sets; import com.google.common.primitives.Ints; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -574,7 +575,7 @@ static Set overlapping(SSTableReader sstable, Iterable overlapping(Token start, Token end, Iterable sstables) { assert start.compareTo(end) <= 0; - Set overlapped = new HashSet(); + Set overlapped = new HashSet<>(); Bounds promotedBounds = new Bounds(start, end); for (SSTableReader candidate : sstables) { @@ -622,8 +623,8 @@ private Collection getCandidatesFor(int level) // Note that we ignore suspect-ness of L1 sstables here, since if an L1 sstable is suspect we're // basically screwed, since we expect all or most L0 sstables to overlap with each L1 sstable. // So if an L1 sstable is suspect we can't do much besides try anyway and hope for the best. - Set candidates = new HashSet(); - Set remaining = new HashSet(); + Set candidates = new HashSet<>(); + Set remaining = new HashSet<>(); Iterables.addAll(remaining, Iterables.filter(getLevel(0), Predicates.not(suspectP))); for (SSTableReader sstable : ageSortedSSTables(remaining)) { @@ -699,7 +700,7 @@ private Collection getCandidatesFor(int level) private List ageSortedSSTables(Collection candidates) { - List ageSortedCandidates = new ArrayList(candidates); + List ageSortedCandidates = new ArrayList<>(candidates); Collections.sort(ageSortedCandidates, SSTableReader.maxTimestampComparator); return ageSortedCandidates; } diff --git a/src/java/org/apache/cassandra/db/compaction/SSTableSplitter.java b/src/java/org/apache/cassandra/db/compaction/SSTableSplitter.java index 6b9f161aa909..87c82e0c6ebd 100644 --- a/src/java/org/apache/cassandra/db/compaction/SSTableSplitter.java +++ b/src/java/org/apache/cassandra/db/compaction/SSTableSplitter.java @@ -20,7 +20,8 @@ import java.util.*; import org.apache.cassandra.db.*; -import org.apache.cassandra.io.sstable.*; +import org.apache.cassandra.io.sstable.format.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableWriter; public class SSTableSplitter { diff --git a/src/java/org/apache/cassandra/db/compaction/Scrubber.java b/src/java/org/apache/cassandra/db/compaction/Scrubber.java index b3d098ddaa2f..1bea188b3d6c 100644 --- a/src/java/org/apache/cassandra/db/compaction/Scrubber.java +++ b/src/java/org/apache/cassandra/db/compaction/Scrubber.java @@ -25,6 +25,8 @@ import org.apache.cassandra.db.*; import org.apache.cassandra.io.sstable.*; +import org.apache.cassandra.io.sstable.format.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableWriter; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.io.util.RandomAccessReader; import org.apache.cassandra.service.ActiveRepairService; @@ -46,6 +48,7 @@ public class Scrubber implements Closeable private final RandomAccessReader dataFile; private final RandomAccessReader indexFile; private final ScrubInfo scrubInfo; + private final RowIndexEntry.IndexSerializer rowIndexEntrySerializer; private final boolean isOffline; @@ -80,6 +83,8 @@ public Scrubber(ColumnFamilyStore cfs, SSTableReader sstable, boolean skipCorrup this.skipCorrupted = skipCorrupted; this.isOffline = isOffline; + this.rowIndexEntrySerializer = sstable.descriptor.version.getSSTableFormat().getIndexSerializer(sstable.metadata); + // Calculate the expected compacted filesize this.destination = cfs.directories.getDirectoryForNewSSTables(); if (destination == null) @@ -113,7 +118,7 @@ public void scrub() ByteBuffer nextIndexKey = ByteBufferUtil.readWithShortLength(indexFile); { // throw away variable so we don't have a side effect in the assert - long firstRowPositionFromIndex = sstable.metadata.comparator.rowIndexEntrySerializer().deserialize(indexFile, sstable.descriptor.version).position; + long firstRowPositionFromIndex = rowIndexEntrySerializer.deserialize(indexFile, sstable.descriptor.version).position; assert firstRowPositionFromIndex == 0 : firstRowPositionFromIndex; } @@ -147,7 +152,7 @@ public void scrub() nextIndexKey = indexFile.isEOF() ? null : ByteBufferUtil.readWithShortLength(indexFile); nextRowPositionFromIndex = indexFile.isEOF() ? dataFile.length() - : sstable.metadata.comparator.rowIndexEntrySerializer().deserialize(indexFile, sstable.descriptor.version).position; + : rowIndexEntrySerializer.deserialize(indexFile, sstable.descriptor.version).position; } catch (Throwable th) { @@ -177,7 +182,7 @@ public void scrub() if (dataSize > dataFile.length()) throw new IOError(new IOException("Impossible row size " + dataSize)); - SSTableIdentityIterator atoms = new SSTableIdentityIterator(sstable, dataFile, key, dataSize, true); + SSTableIdentityIterator atoms = new SSTableIdentityIterator(sstable, dataFile, key, true); if (prevKey != null && prevKey.compareTo(key) > 0) { saveOutOfOrderRow(prevKey, key, atoms); @@ -206,7 +211,7 @@ public void scrub() key = sstable.partitioner.decorateKey(currentIndexKey); try { - SSTableIdentityIterator atoms = new SSTableIdentityIterator(sstable, dataFile, key, dataSize, true); + SSTableIdentityIterator atoms = new SSTableIdentityIterator(sstable, dataFile, key, true); if (prevKey != null && prevKey.compareTo(key) > 0) { saveOutOfOrderRow(prevKey, key, atoms); diff --git a/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategy.java b/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategy.java index 2fa188ca219c..0abb68d5b880 100644 --- a/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategy.java +++ b/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategy.java @@ -24,13 +24,14 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Sets; +import org.apache.cassandra.io.sstable.format.SSTableReader; +import org.apache.cassandra.io.sstable.format.big.BigTableReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.cassandra.cql3.statements.CFPropDefs; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.utils.Pair; public class SizeTieredCompactionStrategy extends AbstractCompactionStrategy @@ -311,7 +312,7 @@ public int getEstimatedRemainingTasks() public static List> createSSTableAndLengthPairs(Iterable sstables) { - List> sstableLengthPairs = new ArrayList>(Iterables.size(sstables)); + List> sstableLengthPairs = new ArrayList<>(Iterables.size(sstables)); for(SSTableReader sstable : sstables) sstableLengthPairs.add(Pair.create(sstable, sstable.onDiskLength())); return sstableLengthPairs; diff --git a/src/java/org/apache/cassandra/db/compaction/Upgrader.java b/src/java/org/apache/cassandra/db/compaction/Upgrader.java index 2e33ac9f9e76..c9e703432e08 100644 --- a/src/java/org/apache/cassandra/db/compaction/Upgrader.java +++ b/src/java/org/apache/cassandra/db/compaction/Upgrader.java @@ -22,9 +22,12 @@ import com.google.common.base.Throwables; +import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.DecoratedKey; import org.apache.cassandra.io.sstable.*; +import org.apache.cassandra.io.sstable.format.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableWriter; import org.apache.cassandra.io.sstable.metadata.MetadataCollector; import org.apache.cassandra.utils.CloseableIterator; import org.apache.cassandra.utils.OutputHandler; @@ -78,7 +81,7 @@ private SSTableWriter createCompactionWriter(long repairedAt) sstableMetadataCollector.sstableLevel(sstable.getSSTableLevel()); } - return new SSTableWriter(cfs.getTempSSTablePath(directory), estimatedRows, repairedAt, cfs.metadata, cfs.partitioner, sstableMetadataCollector); + return SSTableWriter.create(Descriptor.fromFilename(cfs.getTempSSTablePath(directory)), estimatedRows, repairedAt, cfs.metadata, cfs.partitioner, sstableMetadataCollector); } public void upgrade() @@ -88,7 +91,7 @@ public void upgrade() SSTableRewriter writer = new SSTableRewriter(cfs, toUpgrade, CompactionTask.getMaxDataAge(this.toUpgrade), OperationType.UPGRADE_SSTABLES, true); try (AbstractCompactionStrategy.ScannerList scanners = strategy.getScanners(this.toUpgrade)) { - Iterator iter = new CompactionIterable(compactionType, scanners.scanners, controller).iterator(); + Iterator iter = new CompactionIterable(compactionType, scanners.scanners, controller, DatabaseDescriptor.getSSTableFormat()).iterator(); writer.switchWriter(createCompactionWriter(sstable.getSSTableMetadata().repairedAt)); while (iter.hasNext()) { diff --git a/src/java/org/apache/cassandra/db/composites/AbstractCType.java b/src/java/org/apache/cassandra/db/composites/AbstractCType.java index 5af74580bb2b..1df73feef49d 100644 --- a/src/java/org/apache/cassandra/db/composites/AbstractCType.java +++ b/src/java/org/apache/cassandra/db/composites/AbstractCType.java @@ -80,12 +80,10 @@ public int compare(Object o1, Object o2) private final Serializer serializer; - private final ISerializer indexSerializer; private final IVersionedSerializer sliceSerializer; private final IVersionedSerializer sliceQueryFilterSerializer; private final DeletionInfo.Serializer deletionInfoSerializer; private final RangeTombstone.Serializer rangeTombstoneSerializer; - private final RowIndexEntry.Serializer rowIndexEntrySerializer; protected final boolean isByteOrderComparable; @@ -115,12 +113,10 @@ public int compare(IndexInfo o1, IndexInfo o2) serializer = new Serializer(this); - indexSerializer = new IndexInfo.Serializer(this); sliceSerializer = new ColumnSlice.Serializer(this); sliceQueryFilterSerializer = new SliceQueryFilter.Serializer(this); deletionInfoSerializer = new DeletionInfo.Serializer(this); rangeTombstoneSerializer = new RangeTombstone.Serializer(this); - rowIndexEntrySerializer = new RowIndexEntry.Serializer(this); this.isByteOrderComparable = isByteOrderComparable; } @@ -295,11 +291,6 @@ public Comparator indexReverseComparator() return indexReverseComparator; } - public ISerializer indexSerializer() - { - return indexSerializer; - } - public IVersionedSerializer sliceSerializer() { return sliceSerializer; @@ -320,11 +311,6 @@ public RangeTombstone.Serializer rangeTombstoneSerializer() return rangeTombstoneSerializer; } - public RowIndexEntry.Serializer rowIndexEntrySerializer() - { - return rowIndexEntrySerializer; - } - @Override public boolean equals(Object o) { diff --git a/src/java/org/apache/cassandra/db/composites/CType.java b/src/java/org/apache/cassandra/db/composites/CType.java index d24277eee2dd..3844342f242a 100644 --- a/src/java/org/apache/cassandra/db/composites/CType.java +++ b/src/java/org/apache/cassandra/db/composites/CType.java @@ -130,12 +130,10 @@ public interface CType extends Comparator public Serializer serializer(); - public ISerializer indexSerializer(); public IVersionedSerializer sliceSerializer(); public IVersionedSerializer sliceQueryFilterSerializer(); public DeletionInfo.Serializer deletionInfoSerializer(); public RangeTombstone.Serializer rangeTombstoneSerializer(); - public RowIndexEntry.Serializer rowIndexEntrySerializer(); public interface Serializer extends ISerializer { diff --git a/src/java/org/apache/cassandra/db/filter/IDiskAtomFilter.java b/src/java/org/apache/cassandra/db/filter/IDiskAtomFilter.java index 3750c756af4e..16be34c93a28 100644 --- a/src/java/org/apache/cassandra/db/filter/IDiskAtomFilter.java +++ b/src/java/org/apache/cassandra/db/filter/IDiskAtomFilter.java @@ -28,7 +28,7 @@ import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.db.composites.CType; import org.apache.cassandra.io.IVersionedSerializer; -import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.io.util.FileDataInput; diff --git a/src/java/org/apache/cassandra/db/filter/NamesQueryFilter.java b/src/java/org/apache/cassandra/db/filter/NamesQueryFilter.java index 0a34dfd88785..b5515bc88f78 100644 --- a/src/java/org/apache/cassandra/db/filter/NamesQueryFilter.java +++ b/src/java/org/apache/cassandra/db/filter/NamesQueryFilter.java @@ -24,20 +24,19 @@ import java.util.SortedSet; import java.util.TreeSet; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.commons.lang3.StringUtils; import com.google.common.collect.AbstractIterator; import com.google.common.collect.Iterators; import org.apache.cassandra.db.*; import org.apache.cassandra.db.columniterator.OnDiskAtomIterator; -import org.apache.cassandra.db.columniterator.SSTableNamesIterator; import org.apache.cassandra.db.composites.CellName; import org.apache.cassandra.db.composites.CellNameType; import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.db.composites.CType; import org.apache.cassandra.io.ISerializer; import org.apache.cassandra.io.IVersionedSerializer; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.io.util.FileDataInput; import org.apache.cassandra.utils.SearchIterator; @@ -87,12 +86,12 @@ public OnDiskAtomIterator getColumnIterator(DecoratedKey key, ColumnFamily cf) public OnDiskAtomIterator getSSTableColumnIterator(SSTableReader sstable, DecoratedKey key) { - return new SSTableNamesIterator(sstable, key, columns); + return sstable.iterator(key, columns); } public OnDiskAtomIterator getSSTableColumnIterator(SSTableReader sstable, FileDataInput file, DecoratedKey key, RowIndexEntry indexEntry) { - return new SSTableNamesIterator(sstable, file, key, columns, indexEntry); + return sstable.iterator(file, key, columns, indexEntry); } public void collectReducedColumns(ColumnFamily container, Iterator reducedColumns, int gcBefore, long now) diff --git a/src/java/org/apache/cassandra/db/filter/QueryFilter.java b/src/java/org/apache/cassandra/db/filter/QueryFilter.java index f58fa9f9d1a1..19149704fcfc 100644 --- a/src/java/org/apache/cassandra/db/filter/QueryFilter.java +++ b/src/java/org/apache/cassandra/db/filter/QueryFilter.java @@ -33,7 +33,7 @@ import org.apache.cassandra.db.columniterator.OnDiskAtomIterator; import org.apache.cassandra.db.composites.CellName; import org.apache.cassandra.db.composites.Composite; -import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.utils.MergeIterator; public class QueryFilter diff --git a/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java b/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java index 71d90952624c..0887cbe376b4 100644 --- a/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java +++ b/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java @@ -24,19 +24,18 @@ import com.google.common.collect.AbstractIterator; import com.google.common.collect.Iterators; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.*; import org.apache.cassandra.db.columniterator.OnDiskAtomIterator; -import org.apache.cassandra.db.columniterator.SSTableSliceIterator; import org.apache.cassandra.db.composites.CType; import org.apache.cassandra.db.composites.CellName; import org.apache.cassandra.db.composites.CellNameType; import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.io.IVersionedSerializer; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.io.util.FileDataInput; import org.apache.cassandra.tracing.Tracing; @@ -176,12 +175,12 @@ public void remove() public OnDiskAtomIterator getSSTableColumnIterator(SSTableReader sstable, DecoratedKey key) { - return new SSTableSliceIterator(sstable, key, slices, reversed); + return sstable.iterator(key, slices, reversed); } public OnDiskAtomIterator getSSTableColumnIterator(SSTableReader sstable, FileDataInput file, DecoratedKey key, RowIndexEntry indexEntry) { - return new SSTableSliceIterator(sstable, file, key, slices, reversed, indexEntry); + return sstable.iterator(file, key, slices, reversed, indexEntry); } public Comparator getColumnComparator(CellNameType comparator) diff --git a/src/java/org/apache/cassandra/db/index/SecondaryIndex.java b/src/java/org/apache/cassandra/db/index/SecondaryIndex.java index 529e82c0af4d..c50019aca8b4 100644 --- a/src/java/org/apache/cassandra/db/index/SecondaryIndex.java +++ b/src/java/org/apache/cassandra/db/index/SecondaryIndex.java @@ -26,6 +26,7 @@ import java.util.concurrent.Future; import java.util.concurrent.FutureTask; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -49,7 +50,6 @@ import org.apache.cassandra.dht.LocalToken; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.sstable.ReducingKeyIterator; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.FBUtilities; diff --git a/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java b/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java index c2d481b6d54c..5640d2353bee 100644 --- a/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java +++ b/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java @@ -33,6 +33,7 @@ import java.util.concurrent.ConcurrentSkipListMap; import java.util.concurrent.Future; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -52,7 +53,6 @@ import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.io.sstable.ReducingKeyIterator; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.concurrent.OpOrder; diff --git a/src/java/org/apache/cassandra/dht/BytesToken.java b/src/java/org/apache/cassandra/dht/BytesToken.java index f2f9eab46f66..da965d220812 100644 --- a/src/java/org/apache/cassandra/dht/BytesToken.java +++ b/src/java/org/apache/cassandra/dht/BytesToken.java @@ -49,7 +49,6 @@ public int compareTo(Token o) return FBUtilities.compareUnsigned(token, o.token, 0, 0, token.length, o.token.length); } - @Override public int hashCode() { diff --git a/src/java/org/apache/cassandra/io/ISSTableSerializer.java b/src/java/org/apache/cassandra/io/ISSTableSerializer.java index 20ee352cb23d..28346627f77a 100644 --- a/src/java/org/apache/cassandra/io/ISSTableSerializer.java +++ b/src/java/org/apache/cassandra/io/ISSTableSerializer.java @@ -21,6 +21,7 @@ import java.io.IOException; import org.apache.cassandra.io.sstable.Descriptor; +import org.apache.cassandra.io.sstable.format.Version; import org.apache.cassandra.io.util.DataOutputPlus; public interface ISSTableSerializer @@ -43,5 +44,5 @@ public interface ISSTableSerializer * @throws IOException * @return the type that was deserialized */ - public T deserializeFromSSTable(DataInput in, Descriptor.Version version) throws IOException; + public T deserializeFromSSTable(DataInput in, Version version) throws IOException; } diff --git a/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java b/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java index 3d6cb71703dc..75fdf1b58d26 100644 --- a/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java +++ b/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java @@ -39,6 +39,7 @@ import com.google.common.primitives.Longs; import org.apache.cassandra.cache.RefCountedMemory; +import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.TypeSizes; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.FSReadError; @@ -47,10 +48,12 @@ import org.apache.cassandra.io.sstable.Component; import org.apache.cassandra.io.sstable.CorruptSSTableException; import org.apache.cassandra.io.sstable.Descriptor; +import org.apache.cassandra.io.sstable.format.Version; import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.io.util.Memory; import org.apache.cassandra.utils.Pair; +import org.hsqldb.Database; /** * Holds metadata about compressed file @@ -79,7 +82,7 @@ public class CompressionMetadata public static CompressionMetadata create(String dataFilePath) { Descriptor desc = Descriptor.fromFilename(dataFilePath); - return new CompressionMetadata(desc.filenameFor(Component.COMPRESSION_INFO), new File(dataFilePath).length(), desc.version.hasPostCompressionAdlerChecksums); + return new CompressionMetadata(desc.filenameFor(Component.COMPRESSION_INFO), new File(dataFilePath).length(), desc.version.hasPostCompressionAdlerChecksums()); } @VisibleForTesting @@ -262,6 +265,8 @@ public static class Writer private int maxCount = 100; private RefCountedMemory offsets = new RefCountedMemory(maxCount * 8); private int count = 0; + private Version latestVersion = DatabaseDescriptor.getSSTableFormat().info.getLatestVersion(); + private Writer(CompressionParameters parameters, String path) { @@ -311,14 +316,14 @@ private void writeHeader(DataOutput out, long dataLength, int chunks) public CompressionMetadata openEarly(long dataLength, long compressedLength) { - return new CompressionMetadata(filePath, parameters, offsets, count * 8L, dataLength, compressedLength, Descriptor.Version.CURRENT.hasPostCompressionAdlerChecksums); + return new CompressionMetadata(filePath, parameters, offsets, count * 8L, dataLength, compressedLength, latestVersion.hasPostCompressionAdlerChecksums()); } public CompressionMetadata openAfterClose(long dataLength, long compressedLength) { RefCountedMemory newOffsets = offsets.copy(count * 8L); offsets.unreference(); - return new CompressionMetadata(filePath, parameters, newOffsets, count * 8L, dataLength, compressedLength, Descriptor.Version.CURRENT.hasPostCompressionAdlerChecksums); + return new CompressionMetadata(filePath, parameters, newOffsets, count * 8L, dataLength, compressedLength, latestVersion.hasPostCompressionAdlerChecksums()); } /** diff --git a/src/java/org/apache/cassandra/io/sstable/AbstractSSTableSimpleWriter.java b/src/java/org/apache/cassandra/io/sstable/AbstractSSTableSimpleWriter.java index ad8fb3e21ca2..11d6d5ea5909 100644 --- a/src/java/org/apache/cassandra/io/sstable/AbstractSSTableSimpleWriter.java +++ b/src/java/org/apache/cassandra/io/sstable/AbstractSSTableSimpleWriter.java @@ -30,7 +30,8 @@ import org.apache.cassandra.db.*; import org.apache.cassandra.db.context.CounterContext; import org.apache.cassandra.dht.IPartitioner; -import org.apache.cassandra.io.sstable.metadata.MetadataCollector; +import org.apache.cassandra.io.sstable.format.SSTableFormat; +import org.apache.cassandra.io.sstable.format.SSTableWriter; import org.apache.cassandra.service.ActiveRepairService; import org.apache.cassandra.utils.CounterId; import org.apache.cassandra.utils.Pair; @@ -43,6 +44,8 @@ public abstract class AbstractSSTableSimpleWriter implements Closeable protected ColumnFamily columnFamily; protected ByteBuffer currentSuperColumn; protected final CounterId counterid = CounterId.generate(); + private SSTableFormat.Type formatType = DatabaseDescriptor.getSSTableFormat(); + public AbstractSSTableSimpleWriter(File directory, CFMetaData metadata, IPartitioner partitioner) { @@ -51,19 +54,18 @@ public AbstractSSTableSimpleWriter(File directory, CFMetaData metadata, IPartiti DatabaseDescriptor.setPartitioner(partitioner); } + protected void setSSTableFormatType(SSTableFormat.Type type) + { + this.formatType = type; + } + protected SSTableWriter getWriter() { - return new SSTableWriter( - makeFilename(directory, metadata.ksName, metadata.cfName), - 0, // We don't care about the bloom filter - ActiveRepairService.UNREPAIRED_SSTABLE, - metadata, - DatabaseDescriptor.getPartitioner(), - new MetadataCollector(metadata.comparator)); + return SSTableWriter.create(Descriptor.fromFilename(makeFilename(directory, metadata.ksName, metadata.cfName, formatType)), 0, ActiveRepairService.UNREPAIRED_SSTABLE); } // find available generation and pick up filename from that - protected static String makeFilename(File directory, final String keyspace, final String columnFamily) + protected static String makeFilename(File directory, final String keyspace, final String columnFamily, final SSTableFormat.Type fmt) { final Set existing = new HashSet(); directory.list(new FilenameFilter() @@ -84,7 +86,7 @@ public boolean accept(File dir, String name) int maxGen = 0; for (Descriptor desc : existing) maxGen = Math.max(maxGen, desc.generation); - return new Descriptor(directory, keyspace, columnFamily, maxGen + 1, Descriptor.Type.TEMP).filenameFor(Component.DATA); + return new Descriptor(directory, keyspace, columnFamily, maxGen + 1, Descriptor.Type.TEMP, fmt).filenameFor(Component.DATA); } /** diff --git a/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java b/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java index bf4da2496f9a..f7d467e2ce2c 100644 --- a/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java +++ b/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java @@ -39,6 +39,7 @@ import org.apache.cassandra.dht.Murmur3Partitioner; import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.exceptions.RequestValidationException; +import org.apache.cassandra.io.sstable.format.SSTableFormat; import org.apache.cassandra.locator.AbstractReplicationStrategy; import org.apache.cassandra.service.ClientState; import org.apache.cassandra.utils.Pair; @@ -272,6 +273,8 @@ public static class Builder private File directory; private IPartitioner partitioner = new Murmur3Partitioner(); + protected SSTableFormat.Type formatType = null; + private CFMetaData schema; private UpdateStatement insert; private List boundNames; @@ -279,7 +282,7 @@ public static class Builder private boolean sorted = false; private long bufferSizeInMB = 128; - private Builder() {} + protected Builder() {} /** * The directory where to write the sstables. @@ -484,6 +487,10 @@ public CQLSSTableWriter build() AbstractSSTableSimpleWriter writer = sorted ? new SSTableSimpleWriter(directory, schema, partitioner) : new BufferedWriter(directory, schema, partitioner, bufferSizeInMB); + + if (formatType != null) + writer.setSSTableFormatType(formatType); + return new CQLSSTableWriter(writer, insert, boundNames); } } diff --git a/src/java/org/apache/cassandra/io/sstable/Descriptor.java b/src/java/org/apache/cassandra/io/sstable/Descriptor.java index 6911b48d1457..03522c32abf0 100644 --- a/src/java/org/apache/cassandra/io/sstable/Descriptor.java +++ b/src/java/org/apache/cassandra/io/sstable/Descriptor.java @@ -22,13 +22,18 @@ import java.util.Deque; import java.util.StringTokenizer; +import com.google.common.base.CharMatcher; import com.google.common.base.Objects; +import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.Directories; +import org.apache.cassandra.io.sstable.format.SSTableFormat; +import org.apache.cassandra.io.sstable.format.Version; import org.apache.cassandra.io.sstable.metadata.IMetadataSerializer; import org.apache.cassandra.io.sstable.metadata.LegacyMetadataSerializer; import org.apache.cassandra.io.sstable.metadata.MetadataSerializer; import org.apache.cassandra.utils.Pair; +import org.apache.commons.lang.StringUtils; import static org.apache.cassandra.io.sstable.Component.separator; @@ -41,92 +46,6 @@ */ public class Descriptor { - // versions are denoted as [major][minor]. Minor versions must be forward-compatible: - // new fields are allowed in e.g. the metadata component, but fields can't be removed - // or have their size changed. - // - // Minor versions were introduced with version "hb" for Cassandra 1.0.3; prior to that, - // we always incremented the major version. - public static class Version - { - // This needs to be at the begining for initialization sake - public static final String current_version = "la"; - - // ja (2.0.0): super columns are serialized as composites (note that there is no real format change, - // this is mostly a marker to know if we should expect super columns or not. We do need - // a major version bump however, because we should not allow streaming of super columns - // into this new format) - // tracks max local deletiontime in sstable metadata - // records bloom_filter_fp_chance in metadata component - // remove data size and column count from data file (CASSANDRA-4180) - // tracks max/min column values (according to comparator) - // jb (2.0.1): switch from crc32 to adler32 for compression checksums - // checksum the compressed data - // ka (2.1.0): new Statistics.db file format - // index summaries can be downsampled and the sampling level is persisted - // switch uncompressed checksums to adler32 - // tracks presense of legacy (local and remote) counter shards - // la (3.0.0): new file name format - - public static final Version CURRENT = new Version(current_version); - - private final String version; - - public final boolean isLatestVersion; - public final boolean hasPostCompressionAdlerChecksums; - public final boolean hasSamplingLevel; - public final boolean newStatsFile; - public final boolean hasAllAdlerChecksums; - public final boolean hasRepairedAt; - public final boolean tracksLegacyCounterShards; - public final boolean newFileName; - - public Version(String version) - { - this.version = version; - isLatestVersion = version.compareTo(current_version) == 0; - hasPostCompressionAdlerChecksums = version.compareTo("jb") >= 0; - hasSamplingLevel = version.compareTo("ka") >= 0; - newStatsFile = version.compareTo("ka") >= 0; - hasAllAdlerChecksums = version.compareTo("ka") >= 0; - hasRepairedAt = version.compareTo("ka") >= 0; - tracksLegacyCounterShards = version.compareTo("ka") >= 0; - newFileName = version.compareTo("la") >= 0; - } - - /** - * @param ver SSTable version - * @return True if the given version string matches the format. - * @see #version - */ - static boolean validate(String ver) - { - return ver != null && ver.matches("[a-z]+"); - } - - public boolean isCompatible() - { - return version.compareTo("ja") >= 0 && version.charAt(0) <= CURRENT.version.charAt(0); - } - - @Override - public String toString() - { - return version; - } - - @Override - public boolean equals(Object o) - { - return o == this || o instanceof Version && version.equals(((Version) o).version); - } - - @Override - public int hashCode() - { - return version.hashCode(); - } - } public static enum Type { @@ -140,6 +59,7 @@ public static enum Type } } + public final File directory; /** version has the following format: [a-z]+ */ public final Version version; @@ -147,6 +67,7 @@ public static enum Type public final String cfname; public final int generation; public final Type type; + public final SSTableFormat.Type formatType; private final int hashCode; /** @@ -154,29 +75,41 @@ public static enum Type */ public Descriptor(File directory, String ksname, String cfname, int generation, Type temp) { - this(Version.CURRENT, directory, ksname, cfname, generation, temp); + this(DatabaseDescriptor.getSSTableFormat().info.getLatestVersion(), directory, ksname, cfname, generation, temp, DatabaseDescriptor.getSSTableFormat()); } - public Descriptor(String version, File directory, String ksname, String cfname, int generation, Type temp) + public Descriptor(File directory, String ksname, String cfname, int generation, Type temp, SSTableFormat.Type formatType) { - this(new Version(version), directory, ksname, cfname, generation, temp); + this(formatType.info.getLatestVersion(), directory, ksname, cfname, generation, temp, formatType); } - public Descriptor(Version version, File directory, String ksname, String cfname, int generation, Type temp) + public Descriptor(String version, File directory, String ksname, String cfname, int generation, Type temp, SSTableFormat.Type formatType) { - assert version != null && directory != null && ksname != null && cfname != null; + this(formatType.info.getVersion(version), directory, ksname, cfname, generation, temp, formatType); + } + + public Descriptor(Version version, File directory, String ksname, String cfname, int generation, Type temp, SSTableFormat.Type formatType) + { + assert version != null && directory != null && ksname != null && cfname != null && formatType.info.getLatestVersion().getClass().equals(version.getClass()); this.version = version; this.directory = directory; this.ksname = ksname; this.cfname = cfname; this.generation = generation; - type = temp; - hashCode = Objects.hashCode(directory, generation, ksname, cfname, temp); + this.type = temp; + this.formatType = formatType; + + hashCode = Objects.hashCode(version, directory, generation, ksname, cfname, temp, formatType); } public Descriptor withGeneration(int newGeneration) { - return new Descriptor(version, directory, ksname, cfname, newGeneration, type); + return new Descriptor(version, directory, ksname, cfname, newGeneration, type, formatType); + } + + public Descriptor withFormatType(SSTableFormat.Type newType) + { + return new Descriptor(newType.info.getLatestVersion(), directory, ksname, cfname, generation, type, newType); } public String filenameFor(Component component) @@ -194,7 +127,7 @@ public String baseFilename() private void appendFileName(StringBuilder buff) { - if (!version.newFileName) + if (!version.hasNewFileName()) { buff.append(ksname).append(separator); buff.append(cfname).append(separator); @@ -203,6 +136,8 @@ private void appendFileName(StringBuilder buff) buff.append(type.marker).append(separator); buff.append(version).append(separator); buff.append(generation); + if (formatType != SSTableFormat.Type.LEGACY) + buff.append(separator).append(formatType.name); } public String relativeFilenameFor(Component component) @@ -213,6 +148,11 @@ public String relativeFilenameFor(Component component) return buff.toString(); } + public SSTableFormat getFormat() + { + return formatType.info; + } + /** * @param suffix A component suffix, such as 'Data.db'/'Index.db'/etc * @return A filename for this descriptor with the given suffix. @@ -233,6 +173,11 @@ public static Descriptor fromFilename(String filename) return fromFilename(file.getParentFile(), file.getName(), false).left; } + public static Descriptor fromFilename(String filename, SSTableFormat.Type formatType) + { + return fromFilename(filename).withFormatType(formatType); + } + public static Descriptor fromFilename(String filename, boolean skipComponent) { File file = new File(filename); @@ -249,7 +194,7 @@ public static Pair fromFilename(File directory, String name) * *
      *
    • <ksname>-<cfname>-(tmp-)?<version>-<gen>-<component> for cassandra 2.0 and before
    • - *
    • (<tmp marker>-)?<version>-<gen>-<component> for cassandra 2.1 and later
    • + *
    • (<tmp marker>-)?<version>-<gen>-<component> for cassandra 3.0 and later
    • *
    * * If this is for SSTable of secondary index, directory should ends with index name for 2.1+. @@ -278,32 +223,42 @@ public static Pair fromFilename(File directory, String name, // component suffix String component = skipComponent ? null : tokenStack.pop(); + nexttok = tokenStack.pop(); + // generation OR Type + SSTableFormat.Type fmt = SSTableFormat.Type.LEGACY; + if (!CharMatcher.DIGIT.matchesAllOf(nexttok)) + { + fmt = SSTableFormat.Type.validate(nexttok); + nexttok = tokenStack.pop(); + } + // generation - int generation = Integer.parseInt(tokenStack.pop()); + int generation = Integer.parseInt(nexttok); // version nexttok = tokenStack.pop(); - if (!Version.validate(nexttok)) + Version version = fmt.info.getVersion(nexttok); + + if (!version.validate(nexttok)) throw new UnsupportedOperationException("SSTable " + name + " is too old to open. Upgrade to 2.0 first, and run upgradesstables"); - Version version = new Version(nexttok); // optional temporary marker - Type type = Type.FINAL; + Type type = Descriptor.Type.FINAL; nexttok = tokenStack.peek(); - if (Type.TEMP.marker.equals(nexttok)) + if (Descriptor.Type.TEMP.marker.equals(nexttok)) { - type = Type.TEMP; + type = Descriptor.Type.TEMP; tokenStack.pop(); } - else if (Type.TEMPLINK.marker.equals(nexttok)) + else if (Descriptor.Type.TEMPLINK.marker.equals(nexttok)) { - type = Type.TEMPLINK; + type = Descriptor.Type.TEMPLINK; tokenStack.pop(); } // ks/cf names String ksname, cfname; - if (version.newFileName) + if (version.hasNewFileName()) { // for 2.1+ read ks and cf names from directory File cfDirectory = parentDirectory; @@ -332,7 +287,7 @@ else if (cfDirectory.getParentFile().getName().equals(Directories.SNAPSHOT_SUBDI } assert tokenStack.isEmpty() : "Invalid file name " + name + " in " + directory; - return Pair.create(new Descriptor(version, parentDirectory, ksname, cfname, generation, type), component); + return Pair.create(new Descriptor(version, parentDirectory, ksname, cfname, generation, type, fmt), component); } /** @@ -341,12 +296,12 @@ else if (cfDirectory.getParentFile().getName().equals(Directories.SNAPSHOT_SUBDI */ public Descriptor asType(Type type) { - return new Descriptor(version, directory, ksname, cfname, generation, type); + return new Descriptor(version, directory, ksname, cfname, generation, type, formatType); } public IMetadataSerializer getMetadataSerializer() { - if (version.newStatsFile) + if (version.hasNewStatsFile()) return new MetadataSerializer(); else return new LegacyMetadataSerializer(); @@ -378,6 +333,7 @@ public boolean equals(Object o) && that.generation == this.generation && that.ksname.equals(this.ksname) && that.cfname.equals(this.cfname) + && that.formatType == this.formatType && that.type == this.type; } diff --git a/src/java/org/apache/cassandra/io/sstable/IndexHelper.java b/src/java/org/apache/cassandra/io/sstable/IndexHelper.java index b0bbfc48c7e1..4518e2391e5d 100644 --- a/src/java/org/apache/cassandra/io/sstable/IndexHelper.java +++ b/src/java/org/apache/cassandra/io/sstable/IndexHelper.java @@ -66,32 +66,6 @@ public static void skipIndex(DataInput in) throws IOException } } - /** - * Deserialize the index into a structure and return it - * - * @param in input source - * @param type the comparator type for the column family - * - * @return ArrayList - list of de-serialized indexes - * @throws IOException if an I/O error occurs. - */ - public static List deserializeIndex(FileDataInput in, CType type) throws IOException - { - int columnIndexSize = in.readInt(); - if (columnIndexSize == 0) - return Collections.emptyList(); - ArrayList indexList = new ArrayList(); - FileMark mark = in.mark(); - ISerializer serializer = type.indexSerializer(); - while (in.bytesPastMark(mark) < columnIndexSize) - { - indexList.add(serializer.deserialize(in)); - } - assert in.bytesPastMark(mark) == columnIndexSize; - - return indexList; - } - /** * The index of the IndexInfo in which a scan starting with @name should begin. * diff --git a/src/java/org/apache/cassandra/io/sstable/IndexSummaryManager.java b/src/java/org/apache/cassandra/io/sstable/IndexSummaryManager.java index e39d75d3b7b7..468b54cc354e 100644 --- a/src/java/org/apache/cassandra/io/sstable/IndexSummaryManager.java +++ b/src/java/org/apache/cassandra/io/sstable/IndexSummaryManager.java @@ -37,6 +37,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/java/org/apache/cassandra/io/sstable/ReducingKeyIterator.java b/src/java/org/apache/cassandra/io/sstable/ReducingKeyIterator.java index 6cb8653bda9d..a1fda57facbb 100644 --- a/src/java/org/apache/cassandra/io/sstable/ReducingKeyIterator.java +++ b/src/java/org/apache/cassandra/io/sstable/ReducingKeyIterator.java @@ -23,6 +23,7 @@ import java.util.Iterator; import org.apache.cassandra.db.DecoratedKey; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.utils.CloseableIterator; import org.apache.cassandra.utils.IMergeIterator; import org.apache.cassandra.utils.MergeIterator; diff --git a/src/java/org/apache/cassandra/io/sstable/SSTable.java b/src/java/org/apache/cassandra/io/sstable/SSTable.java index dee024abc84c..50b9545040c7 100644 --- a/src/java/org/apache/cassandra/io/sstable/SSTable.java +++ b/src/java/org/apache/cassandra/io/sstable/SSTable.java @@ -208,7 +208,7 @@ private static Set discoverComponentsFor(Descriptor desc) } /** @return An estimate of the number of keys contained in the given index file. */ - long estimateRowsFromIndex(RandomAccessReader ifile) throws IOException + protected long estimateRowsFromIndex(RandomAccessReader ifile) throws IOException { // collect sizes for the first 10000 keys, or first 10 megabytes of data final int SAMPLES_CAP = 10000, BYTES_CAP = (int)Math.min(10000000, ifile.length()); diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableDeletingTask.java b/src/java/org/apache/cassandra/io/sstable/SSTableDeletingTask.java index 785e23b01395..bb84e4c630a4 100644 --- a/src/java/org/apache/cassandra/io/sstable/SSTableDeletingTask.java +++ b/src/java/org/apache/cassandra/io/sstable/SSTableDeletingTask.java @@ -24,6 +24,7 @@ import java.util.concurrent.TimeUnit; import com.google.common.collect.Sets; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableIdentityIterator.java b/src/java/org/apache/cassandra/io/sstable/SSTableIdentityIterator.java index b784a7e691d5..6300749ec330 100644 --- a/src/java/org/apache/cassandra/io/sstable/SSTableIdentityIterator.java +++ b/src/java/org/apache/cassandra/io/sstable/SSTableIdentityIterator.java @@ -21,16 +21,19 @@ import java.util.Iterator; import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.*; import org.apache.cassandra.db.columniterator.OnDiskAtomIterator; +import org.apache.cassandra.io.sstable.format.SSTableReader; +import org.apache.cassandra.io.sstable.format.Version; +import org.apache.cassandra.io.util.FileDataInput; import org.apache.cassandra.io.util.RandomAccessReader; import org.apache.cassandra.serializers.MarshalException; -public class SSTableIdentityIterator implements Comparable, OnDiskAtomIterator + public class SSTableIdentityIterator implements Comparable, OnDiskAtomIterator { private final DecoratedKey key; private final DataInput in; - public final long dataSize; // we [still] require this so compaction can tell if it's safe to read the row into memory public final ColumnSerializer.Flag flag; private final ColumnFamily columnFamily; @@ -43,11 +46,10 @@ public class SSTableIdentityIterator implements Comparable getOnDiskIterator(FileDataInput in, ColumnSerializer.Flag flag, int expireBefore, CFMetaData cfm, Version version); + + AbstractCompactedRow getCompactedRowWriter(CompactionController controller, ImmutableList onDiskAtomIterators); + + RowIndexEntry.IndexSerializer getIndexSerializer(CFMetaData cfm); + + public static enum Type + { + //Used internally to refer to files with no + //format flag in the filename + LEGACY("big", BigFormat.instance), + + //The original sstable format + BIG("big", BigFormat.instance); + + public final SSTableFormat info; + public final String name; + private Type(String name, SSTableFormat info) + { + //Since format comes right after generation + //we disallow formats with numeric names + assert !CharMatcher.DIGIT.matchesAllOf(name); + + this.name = name; + this.info = info; + } + + public static Type validate(String name) + { + for (Type valid : Type.values()) + { + //This is used internally for old sstables + if (valid == LEGACY) + continue; + + if (valid.name.equalsIgnoreCase(name)) + return valid; + } + + throw new IllegalArgumentException("No Type constant " + name); + } + } +} diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableReader.java b/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java similarity index 78% rename from src/java/org/apache/cassandra/io/sstable/SSTableReader.java rename to src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java index 1bc7a241a227..c3062f7f8309 100644 --- a/src/java/org/apache/cassandra/io/sstable/SSTableReader.java +++ b/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java @@ -1,3 +1,5 @@ +package org.apache.cassandra.io.sstable.format; + /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -15,111 +17,60 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.cassandra.io.sstable; - -import java.io.BufferedInputStream; -import java.io.DataInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.EnumSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicLong; +import com.clearspring.analytics.stream.cardinality.CardinalityMergeException; +import com.clearspring.analytics.stream.cardinality.ICardinality; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Predicate; import com.google.common.collect.Iterators; import com.google.common.collect.Ordering; import com.google.common.primitives.Longs; import com.google.common.util.concurrent.RateLimiter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.clearspring.analytics.stream.cardinality.CardinalityMergeException; -import com.clearspring.analytics.stream.cardinality.ICardinality; import org.apache.cassandra.cache.CachingOptions; import org.apache.cassandra.cache.InstrumentingCache; import org.apache.cassandra.cache.KeyCacheKey; import org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor; -import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.config.ColumnDefinition; -import org.apache.cassandra.config.Config; -import org.apache.cassandra.config.DatabaseDescriptor; -import org.apache.cassandra.config.Schema; -import org.apache.cassandra.db.ColumnFamilyStore; -import org.apache.cassandra.db.DataRange; -import org.apache.cassandra.db.DataTracker; -import org.apache.cassandra.db.DecoratedKey; -import org.apache.cassandra.db.Keyspace; -import org.apache.cassandra.db.RowIndexEntry; -import org.apache.cassandra.db.RowPosition; -import org.apache.cassandra.db.SystemKeyspace; +import org.apache.cassandra.config.*; +import org.apache.cassandra.db.*; import org.apache.cassandra.db.columniterator.OnDiskAtomIterator; import org.apache.cassandra.db.commitlog.ReplayPosition; import org.apache.cassandra.db.compaction.ICompactionScanner; +import org.apache.cassandra.db.composites.CellName; +import org.apache.cassandra.db.filter.ColumnSlice; import org.apache.cassandra.db.index.SecondaryIndex; -import org.apache.cassandra.dht.AbstractBounds; -import org.apache.cassandra.dht.IPartitioner; -import org.apache.cassandra.dht.LocalPartitioner; -import org.apache.cassandra.dht.Range; -import org.apache.cassandra.dht.Token; +import org.apache.cassandra.dht.*; import org.apache.cassandra.io.compress.CompressedRandomAccessReader; import org.apache.cassandra.io.compress.CompressedThrottledReader; import org.apache.cassandra.io.compress.CompressionMetadata; -import org.apache.cassandra.io.sstable.metadata.CompactionMetadata; -import org.apache.cassandra.io.sstable.metadata.MetadataComponent; -import org.apache.cassandra.io.sstable.metadata.MetadataType; -import org.apache.cassandra.io.sstable.metadata.StatsMetadata; -import org.apache.cassandra.io.sstable.metadata.ValidationMetadata; -import org.apache.cassandra.io.util.BufferedSegmentedFile; -import org.apache.cassandra.io.util.CompressedSegmentedFile; -import org.apache.cassandra.io.util.DataOutputStreamAndChannel; -import org.apache.cassandra.io.util.FileDataInput; -import org.apache.cassandra.io.util.FileUtils; -import org.apache.cassandra.io.util.ICompressedFile; -import org.apache.cassandra.io.util.RandomAccessReader; -import org.apache.cassandra.io.util.SegmentedFile; -import org.apache.cassandra.io.util.ThrottledReader; +import org.apache.cassandra.io.sstable.*; +import org.apache.cassandra.io.sstable.metadata.*; +import org.apache.cassandra.io.util.*; import org.apache.cassandra.metrics.RestorableMeter; import org.apache.cassandra.metrics.StorageMetrics; import org.apache.cassandra.service.ActiveRepairService; import org.apache.cassandra.service.CacheService; import org.apache.cassandra.service.StorageService; -import org.apache.cassandra.tracing.Tracing; -import org.apache.cassandra.utils.ByteBufferUtil; -import org.apache.cassandra.utils.CLibrary; -import org.apache.cassandra.utils.EstimatedHistogram; -import org.apache.cassandra.utils.FBUtilities; -import org.apache.cassandra.utils.FilterFactory; -import org.apache.cassandra.utils.IFilter; -import org.apache.cassandra.utils.Pair; +import org.apache.cassandra.utils.*; import org.apache.cassandra.utils.concurrent.OpOrder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.*; +import java.nio.ByteBuffer; +import java.util.*; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; import static org.apache.cassandra.db.Directories.SECONDARY_INDEX_NAME_SEPARATOR; + /** * SSTableReaders are open()ed by Keyspace.onStart; after that they are created by SSTableWriter.renameAndOpen. * Do not re-call open() on existing SSTable files; use the references kept by ColumnFamilyStore post-start instead. */ -public class SSTableReader extends SSTable +public abstract class SSTableReader extends SSTable { private static final Logger logger = LoggerFactory.getLogger(SSTableReader.class); @@ -170,27 +121,29 @@ public enum OpenReason public final OpenReason openReason; // indexfile and datafile: might be null before a call to load() - private SegmentedFile ifile; - private SegmentedFile dfile; + protected SegmentedFile ifile; + protected SegmentedFile dfile; + + protected IndexSummary indexSummary; + protected IFilter bf; - private IndexSummary indexSummary; - private IFilter bf; + protected final RowIndexEntry.IndexSerializer rowIndexEntrySerializer; - private InstrumentingCache keyCache; + protected InstrumentingCache keyCache; - private final BloomFilterTracker bloomFilterTracker = new BloomFilterTracker(); + protected final BloomFilterTracker bloomFilterTracker = new BloomFilterTracker(); - private final AtomicInteger references = new AtomicInteger(1); + protected final AtomicInteger references = new AtomicInteger(1); // technically isCompacted is not necessary since it should never be unreferenced unless it is also compacted, // but it seems like a good extra layer of protection against reference counting bugs to not delete data based on that alone - private final AtomicBoolean isCompacted = new AtomicBoolean(false); - private final AtomicBoolean isSuspect = new AtomicBoolean(false); + protected final AtomicBoolean isCompacted = new AtomicBoolean(false); + protected final AtomicBoolean isSuspect = new AtomicBoolean(false); // not final since we need to be able to change level on a file. - private volatile StatsMetadata sstableMetadata; + protected volatile StatsMetadata sstableMetadata; - private final AtomicLong keyCacheHit = new AtomicLong(0); - private final AtomicLong keyCacheRequest = new AtomicLong(0); + protected final AtomicLong keyCacheHit = new AtomicLong(0); + protected final AtomicLong keyCacheRequest = new AtomicLong(0); /** * To support replacing this sstablereader with another object that represents that same underlying sstable, but with different associated resources, @@ -198,15 +151,15 @@ public enum OpenReason * On close we check if any of the closeable resources differ between any chains either side of us; any that are in neither of the adjacent links (if any) are closed. * Once we've made this decision we remove ourselves from the linked list, so that anybody behind/ahead will compare against only other still opened resources. */ - private Object replaceLock = new Object(); - private SSTableReader replacedBy; + protected Object replaceLock = new Object(); + protected SSTableReader replacedBy; private SSTableReader replaces; private SSTableDeletingTask deletingTask; private Runnable runOnClose; @VisibleForTesting public RestorableMeter readMeter; - private ScheduledFuture readMeterSyncFuture; + protected ScheduledFuture readMeterSyncFuture; /** * Calculate approximate key count. @@ -226,7 +179,7 @@ public static long getApproximateKeyCount(Collection sstables) { public boolean apply(SSTableReader sstable) { - return sstable.descriptor.version.newStatsFile; + return sstable.descriptor.version.hasNewStatsFile(); } }); @@ -292,8 +245,8 @@ public static SSTableReader open(Descriptor descriptor) throws IOException public static SSTableReader open(Descriptor desc, CFMetaData metadata) throws IOException { IPartitioner p = desc.cfname.contains(SECONDARY_INDEX_NAME_SEPARATOR) - ? new LocalPartitioner(metadata.getKeyValidator()) - : StorageService.getPartitioner(); + ? new LocalPartitioner(metadata.getKeyValidator()) + : StorageService.getPartitioner(); return open(desc, componentsFor(desc), metadata, p); } @@ -324,7 +277,7 @@ public static SSTableReader openForBatch(Descriptor descriptor, Set c assert components.contains(Component.PRIMARY_INDEX) : "Primary index component is missing for sstable " + descriptor; Map sstableMetadata = descriptor.getMetadataSerializer().deserialize(descriptor, - EnumSet.of(MetadataType.VALIDATION, MetadataType.STATS)); + EnumSet.of(MetadataType.VALIDATION, MetadataType.STATS)); ValidationMetadata validationMetadata = (ValidationMetadata) sstableMetadata.get(MetadataType.VALIDATION); StatsMetadata statsMetadata = (StatsMetadata) sstableMetadata.get(MetadataType.STATS); @@ -335,24 +288,19 @@ public static SSTableReader openForBatch(Descriptor descriptor, Set c if (validationMetadata != null && !partitionerName.equals(validationMetadata.partitioner)) { logger.error(String.format("Cannot open %s; partitioner %s does not match system partitioner %s. Note that the default partitioner starting with Cassandra 1.2 is Murmur3Partitioner, so you will need to edit that to match your old partitioner if upgrading.", - descriptor, validationMetadata.partitioner, partitionerName)); + descriptor, validationMetadata.partitioner, partitionerName)); System.exit(1); } logger.info("Opening {} ({} bytes)", descriptor, new File(descriptor.filenameFor(Component.DATA)).length()); - SSTableReader sstable = new SSTableReader(descriptor, - components, - metadata, - partitioner, - System.currentTimeMillis(), - statsMetadata, - OpenReason.NORMAL); + SSTableReader sstable = internalOpen(descriptor, components, metadata, partitioner, System.currentTimeMillis(), + statsMetadata, OpenReason.NORMAL); // special implementation of load to use non-pooled SegmentedFile builders SegmentedFile.Builder ibuilder = new BufferedSegmentedFile.Builder(); SegmentedFile.Builder dbuilder = sstable.compression - ? new CompressedSegmentedFile.Builder(null) - : new BufferedSegmentedFile.Builder(); + ? new CompressedSegmentedFile.Builder(null) + : new BufferedSegmentedFile.Builder(); if (!sstable.loadSummary(ibuilder, dbuilder)) sstable.buildSummary(false, ibuilder, dbuilder, false, Downsampling.BASE_SAMPLING_LEVEL); sstable.ifile = ibuilder.complete(sstable.descriptor.filenameFor(Component.PRIMARY_INDEX)); @@ -373,7 +321,7 @@ private static SSTableReader open(Descriptor descriptor, assert components.contains(Component.PRIMARY_INDEX) : "Primary index component is missing for sstable " + descriptor; Map sstableMetadata = descriptor.getMetadataSerializer().deserialize(descriptor, - EnumSet.of(MetadataType.VALIDATION, MetadataType.STATS)); + EnumSet.of(MetadataType.VALIDATION, MetadataType.STATS)); ValidationMetadata validationMetadata = (ValidationMetadata) sstableMetadata.get(MetadataType.VALIDATION); StatsMetadata statsMetadata = (StatsMetadata) sstableMetadata.get(MetadataType.STATS); @@ -384,18 +332,13 @@ private static SSTableReader open(Descriptor descriptor, if (validationMetadata != null && !partitionerName.equals(validationMetadata.partitioner)) { logger.error(String.format("Cannot open %s; partitioner %s does not match system partitioner %s. Note that the default partitioner starting with Cassandra 1.2 is Murmur3Partitioner, so you will need to edit that to match your old partitioner if upgrading.", - descriptor, validationMetadata.partitioner, partitionerName)); + descriptor, validationMetadata.partitioner, partitionerName)); System.exit(1); } logger.info("Opening {} ({} bytes)", descriptor, new File(descriptor.filenameFor(Component.DATA)).length()); - SSTableReader sstable = new SSTableReader(descriptor, - components, - metadata, - partitioner, - System.currentTimeMillis(), - statsMetadata, - OpenReason.NORMAL); + SSTableReader sstable = internalOpen(descriptor, components, metadata, partitioner, System.currentTimeMillis(), + statsMetadata, OpenReason.NORMAL); // load index and filter long start = System.nanoTime(); @@ -420,8 +363,8 @@ public static void logOpenException(Descriptor descriptor, IOException e) } public static Collection openAll(Set>> entries, - final CFMetaData metadata, - final IPartitioner partitioner) + final CFMetaData metadata, + final IPartitioner partitioner) { final Collection sstables = new LinkedBlockingQueue<>(); @@ -465,7 +408,7 @@ public void run() /** * Open a RowIndexedReader which already has its state initialized (by SSTableWriter). */ - static SSTableReader internalOpen(Descriptor desc, + public static SSTableReader internalOpen(Descriptor desc, Set components, CFMetaData metadata, IPartitioner partitioner, @@ -478,32 +421,46 @@ static SSTableReader internalOpen(Descriptor desc, OpenReason openReason) { assert desc != null && partitioner != null && ifile != null && dfile != null && isummary != null && bf != null && sstableMetadata != null; - return new SSTableReader(desc, - components, - metadata, - partitioner, - ifile, dfile, - isummary, - bf, - maxDataAge, - sstableMetadata, - openReason); - } - - - private SSTableReader(final Descriptor desc, - Set components, - CFMetaData metadata, - IPartitioner partitioner, - long maxDataAge, - StatsMetadata sstableMetadata, - OpenReason openReason) + + SSTableReader reader = internalOpen(desc, components, metadata, partitioner, maxDataAge, sstableMetadata, openReason); + + reader.bf = bf; + reader.ifile = ifile; + reader.dfile = dfile; + reader.indexSummary = isummary; + + return reader; + } + + + private static SSTableReader internalOpen(final Descriptor descriptor, + Set components, + CFMetaData metadata, + IPartitioner partitioner, + Long maxDataAge, + StatsMetadata sstableMetadata, + OpenReason openReason) + { + Factory readerFactory = descriptor.getFormat().getReaderFactory(); + + return readerFactory.open(descriptor, components, metadata, partitioner, maxDataAge, sstableMetadata, openReason); + } + + protected SSTableReader(final Descriptor desc, + Set components, + CFMetaData metadata, + IPartitioner partitioner, + long maxDataAge, + StatsMetadata sstableMetadata, + OpenReason openReason) { super(desc, components, metadata, partitioner); this.sstableMetadata = sstableMetadata; this.maxDataAge = maxDataAge; this.openReason = openReason; + this.rowIndexEntrySerializer = descriptor.version.getSSTableFormat().getIndexSerializer(metadata); + deletingTask = new SSTableDeletingTask(this); // Don't track read rates for tables in the system keyspace. Also don't track reads for special operations (like early open) @@ -530,26 +487,6 @@ public void run() }, 1, 5, TimeUnit.MINUTES); } - private SSTableReader(Descriptor desc, - Set components, - CFMetaData metadata, - IPartitioner partitioner, - SegmentedFile ifile, - SegmentedFile dfile, - IndexSummary indexSummary, - IFilter bloomFilter, - long maxDataAge, - StatsMetadata sstableMetadata, - OpenReason openReason) - { - this(desc, components, metadata, partitioner, maxDataAge, sstableMetadata, openReason); - - this.ifile = ifile; - this.dfile = dfile; - this.indexSummary = indexSummary; - this.bf = bloomFilter; - } - public static long getTotalBytes(Iterable sstables) { long sum = 0; @@ -754,8 +691,8 @@ private void load(boolean recreateBloomFilter, boolean saveSummaryIfCreated) thr { SegmentedFile.Builder ibuilder = SegmentedFile.getBuilder(DatabaseDescriptor.getIndexAccessMode()); SegmentedFile.Builder dbuilder = compression - ? SegmentedFile.getCompressedBuilder() - : SegmentedFile.getBuilder(DatabaseDescriptor.getDiskAccessMode()); + ? SegmentedFile.getCompressedBuilder() + : SegmentedFile.getBuilder(DatabaseDescriptor.getDiskAccessMode()); boolean summaryLoaded = loadSummary(ibuilder, dbuilder); if (recreateBloomFilter || !summaryLoaded) @@ -786,8 +723,8 @@ private void buildSummary(boolean recreateBloomFilter, SegmentedFile.Builder ibu long indexSize = primaryIndex.length(); long histogramCount = sstableMetadata.estimatedRowSize.count(); long estimatedKeys = histogramCount > 0 && !sstableMetadata.estimatedRowSize.isOverflowed() - ? histogramCount - : estimateRowsFromIndex(primaryIndex); // statistics is supposed to be optional + ? histogramCount + : estimateRowsFromIndex(primaryIndex); // statistics is supposed to be optional if (recreateBloomFilter) bf = FilterFactory.getFilter(estimatedKeys, metadata.getBloomFilterFpChance(), true); @@ -797,10 +734,12 @@ private void buildSummary(boolean recreateBloomFilter, SegmentedFile.Builder ibu summaryBuilder = new IndexSummaryBuilder(estimatedKeys, metadata.getMinIndexInterval(), samplingLevel); long indexPosition; + RowIndexEntry.IndexSerializer rowIndexSerializer = descriptor.getFormat().getIndexSerializer(metadata); + while ((indexPosition = primaryIndex.getFilePointer()) != indexSize) { ByteBuffer key = ByteBufferUtil.readWithShortLength(primaryIndex); - RowIndexEntry indexEntry = metadata.comparator.rowIndexEntrySerializer().deserialize(primaryIndex, descriptor.version); + RowIndexEntry indexEntry = rowIndexSerializer.deserialize(primaryIndex, descriptor.version); DecoratedKey decoratedKey = partitioner.decorateKey(key); if (first == null) first = decoratedKey; @@ -850,7 +789,7 @@ public boolean loadSummary(SegmentedFile.Builder ibuilder, SegmentedFile.Builder try { iStream = new DataInputStream(new FileInputStream(summariesFile)); - indexSummary = IndexSummary.serializer.deserialize(iStream, partitioner, descriptor.version.hasSamplingLevel, metadata.getMinIndexInterval(), metadata.getMaxIndexInterval()); + indexSummary = IndexSummary.serializer.deserialize(iStream, partitioner, descriptor.version.hasSamplingLevel(), metadata.getMinIndexInterval(), metadata.getMaxIndexInterval()); first = partitioner.decorateKey(ByteBufferUtil.readWithLength(iStream)); last = partitioner.decorateKey(ByteBufferUtil.readWithLength(iStream)); ibuilder.deserializeBounds(iStream); @@ -894,7 +833,7 @@ private void saveSummary(SegmentedFile.Builder ibuilder, SegmentedFile.Builder d try { oStream = new DataOutputStreamAndChannel(new FileOutputStream(summariesFile)); - IndexSummary.serializer.serialize(summary, oStream, descriptor.version.hasSamplingLevel); + IndexSummary.serializer.serialize(summary, oStream, descriptor.version.hasSamplingLevel()); ByteBufferUtil.writeWithLength(first.getKey(), oStream); ByteBufferUtil.writeWithLength(last.getKey(), oStream); ibuilder.serializeBounds(oStream); @@ -961,7 +900,7 @@ public void run() } } - SSTableReader replacement = new SSTableReader(descriptor, components, metadata, partitioner, ifile, dfile, indexSummary.readOnlyClone(), bf, maxDataAge, sstableMetadata, + SSTableReader replacement = internalOpen(descriptor, components, metadata, partitioner, ifile, dfile, indexSummary.readOnlyClone(), bf, maxDataAge, sstableMetadata, openReason == OpenReason.EARLY ? openReason : OpenReason.METADATA_CHANGE); replacement.readMeterSyncFuture = this.readMeterSyncFuture; replacement.readMeter = this.readMeter; @@ -1009,21 +948,21 @@ else if (samplingLevel < indexSummary.getSamplingLevel()) SegmentedFile.Builder ibuilder = SegmentedFile.getBuilder(DatabaseDescriptor.getIndexAccessMode()); SegmentedFile.Builder dbuilder = compression - ? SegmentedFile.getCompressedBuilder() - : SegmentedFile.getBuilder(DatabaseDescriptor.getDiskAccessMode()); + ? SegmentedFile.getCompressedBuilder() + : SegmentedFile.getBuilder(DatabaseDescriptor.getDiskAccessMode()); saveSummary(ibuilder, dbuilder, newSummary); } else { throw new AssertionError("Attempted to clone SSTableReader with the same index summary sampling level and " + - "no adjustments to min/max_index_interval"); + "no adjustments to min/max_index_interval"); } long newSize = bytesOnDisk(); StorageMetrics.load.inc(newSize - oldSize); parent.metric.liveDiskSpaceUsed.inc(newSize - oldSize); - SSTableReader replacement = new SSTableReader(descriptor, components, metadata, partitioner, ifile, dfile, newSummary, bf, maxDataAge, sstableMetadata, + SSTableReader replacement = internalOpen(descriptor, components, metadata, partitioner, ifile, dfile, newSummary, bf, maxDataAge, sstableMetadata, openReason == OpenReason.EARLY ? openReason : OpenReason.METADATA_CHANGE); replacement.readMeterSyncFuture = this.readMeterSyncFuture; replacement.readMeter = this.readMeter; @@ -1078,7 +1017,7 @@ public double getEffectiveIndexInterval() return indexSummary.getEffectiveIndexInterval(); } - public void releaseSummary() + public void releaseSummary() throws IOException { indexSummary.close(); indexSummary = null; @@ -1099,7 +1038,7 @@ public long getIndexScanPosition(RowPosition key) return getIndexScanPositionFromBinarySearchResult(indexSummary.binarySearch(key), indexSummary); } - private static long getIndexScanPositionFromBinarySearchResult(int binarySearchResult, IndexSummary referencedIndexSummary) + protected static long getIndexScanPositionFromBinarySearchResult(int binarySearchResult, IndexSummary referencedIndexSummary) { if (binarySearchResult == -1) return -1; @@ -1107,7 +1046,7 @@ private static long getIndexScanPositionFromBinarySearchResult(int binarySearchR return referencedIndexSummary.getPosition(getIndexSummaryIndexFromBinarySearchResult(binarySearchResult)); } - private static int getIndexSummaryIndexFromBinarySearchResult(int binarySearchResult) + protected static int getIndexSummaryIndexFromBinarySearchResult(int binarySearchResult) { if (binarySearchResult < 0) { @@ -1230,8 +1169,8 @@ private static List> getSampleIndexesForRanges(IndexSummar continue; int right = Range.isWrapAround(range.left, range.right) - ? summary.size() - 1 - : summary.binarySearch(rightPosition); + ? summary.size() - 1 + : summary.binarySearch(rightPosition); if (right < 0) { // range are end inclusive so we use the previous index from what binarySearch give us @@ -1339,8 +1278,8 @@ public void cacheKey(DecoratedKey key, RowIndexEntry info) CachingOptions caching = metadata.getCaching(); if (!caching.keyCache.isEnabled() - || keyCache == null - || keyCache.getCapacity() == 0) + || keyCache == null + || keyCache.getCapacity() == 0) { return; } @@ -1355,7 +1294,7 @@ public RowIndexEntry getCachedPosition(DecoratedKey key, boolean updateStats) return getCachedPosition(new KeyCacheKey(metadata.cfId, descriptor, key.getKey()), updateStats); } - private RowIndexEntry getCachedPosition(KeyCacheKey unifiedKey, boolean updateStats) + protected RowIndexEntry getCachedPosition(KeyCacheKey unifiedKey, boolean updateStats) { if (keyCache != null && keyCache.getCapacity() > 0) { if (updateStats) @@ -1376,7 +1315,7 @@ private RowIndexEntry getCachedPosition(KeyCacheKey unifiedKey, boolean updateSt /** * Get position updating key cache and stats. - * @see #getPosition(org.apache.cassandra.db.RowPosition, org.apache.cassandra.io.sstable.SSTableReader.Operator, boolean) + * @see #getPosition(org.apache.cassandra.db.RowPosition, SSTableReader.Operator, boolean) */ public RowIndexEntry getPosition(RowPosition key, Operator op) { @@ -1390,142 +1329,15 @@ public RowIndexEntry getPosition(RowPosition key, Operator op) * @param updateCacheAndStats true if updating stats and cache * @return The index entry corresponding to the key, or null if the key is not present */ - public RowIndexEntry getPosition(RowPosition key, Operator op, boolean updateCacheAndStats) - { - // first, check bloom filter - if (op == Operator.EQ) - { - assert key instanceof DecoratedKey; // EQ only make sense if the key is a valid row key - if (!bf.isPresent(((DecoratedKey)key).getKey())) - { - Tracing.trace("Bloom filter allows skipping sstable {}", descriptor.generation); - return null; - } - } - - // next, the key cache (only make sense for valid row key) - if ((op == Operator.EQ || op == Operator.GE) && (key instanceof DecoratedKey)) - { - DecoratedKey decoratedKey = (DecoratedKey)key; - KeyCacheKey cacheKey = new KeyCacheKey(metadata.cfId, descriptor, decoratedKey.getKey()); - RowIndexEntry cachedPosition = getCachedPosition(cacheKey, updateCacheAndStats); - if (cachedPosition != null) - { - Tracing.trace("Key cache hit for sstable {}", descriptor.generation); - return cachedPosition; - } - } - - // check the smallest and greatest keys in the sstable to see if it can't be present - if (first.compareTo(key) > 0 || last.compareTo(key) < 0) - { - if (op == Operator.EQ && updateCacheAndStats) - bloomFilterTracker.addFalsePositive(); - - if (op.apply(1) < 0) - { - Tracing.trace("Check against min and max keys allows skipping sstable {}", descriptor.generation); - return null; - } - } - - int binarySearchResult = indexSummary.binarySearch(key); - long sampledPosition = getIndexScanPositionFromBinarySearchResult(binarySearchResult, indexSummary); - int sampledIndex = getIndexSummaryIndexFromBinarySearchResult(binarySearchResult); - - // if we matched the -1th position, we'll start at the first position - sampledPosition = sampledPosition == -1 ? 0 : sampledPosition; - - int effectiveInterval = indexSummary.getEffectiveIndexIntervalAfterIndex(sampledIndex); - - // scan the on-disk index, starting at the nearest sampled position. - // The check against IndexInterval is to be exit the loop in the EQ case when the key looked for is not present - // (bloom filter false positive). But note that for non-EQ cases, we might need to check the first key of the - // next index position because the searched key can be greater the last key of the index interval checked if it - // is lesser than the first key of next interval (and in that case we must return the position of the first key - // of the next interval). - int i = 0; - Iterator segments = ifile.iterator(sampledPosition); - while (segments.hasNext() && i <= effectiveInterval) - { - FileDataInput in = segments.next(); - try - { - while (!in.isEOF() && i <= effectiveInterval) - { - i++; - - ByteBuffer indexKey = ByteBufferUtil.readWithShortLength(in); - - boolean opSatisfied; // did we find an appropriate position for the op requested - boolean exactMatch; // is the current position an exact match for the key, suitable for caching + public abstract RowIndexEntry getPosition(RowPosition key, Operator op, boolean updateCacheAndStats); - // Compare raw keys if possible for performance, otherwise compare decorated keys. - if (op == Operator.EQ) - { - opSatisfied = exactMatch = indexKey.equals(((DecoratedKey) key).getKey()); - } - else - { - DecoratedKey indexDecoratedKey = partitioner.decorateKey(indexKey); - int comparison = indexDecoratedKey.compareTo(key); - int v = op.apply(comparison); - opSatisfied = (v == 0); - exactMatch = (comparison == 0); - if (v < 0) - { - Tracing.trace("Partition index lookup allows skipping sstable {}", descriptor.generation); - return null; - } - } + //Corresponds to a name column + public abstract OnDiskAtomIterator iterator(DecoratedKey key, SortedSet columns); + public abstract OnDiskAtomIterator iterator(FileDataInput file, DecoratedKey key, SortedSet columns, RowIndexEntry indexEntry); - if (opSatisfied) - { - // read data position from index entry - RowIndexEntry indexEntry = metadata.comparator.rowIndexEntrySerializer().deserialize(in, descriptor.version); - if (exactMatch && updateCacheAndStats) - { - assert key instanceof DecoratedKey; // key can be == to the index key only if it's a true row key - DecoratedKey decoratedKey = (DecoratedKey)key; - - if (logger.isTraceEnabled()) - { - // expensive sanity check! see CASSANDRA-4687 - FileDataInput fdi = dfile.getSegment(indexEntry.position); - DecoratedKey keyInDisk = partitioner.decorateKey(ByteBufferUtil.readWithShortLength(fdi)); - if (!keyInDisk.equals(key)) - throw new AssertionError(String.format("%s != %s in %s", keyInDisk, key, fdi.getPath())); - fdi.close(); - } - - // store exact match for the key - cacheKey(decoratedKey, indexEntry); - } - if (op == Operator.EQ && updateCacheAndStats) - bloomFilterTracker.addTruePositive(); - Tracing.trace("Partition index with {} entries found for sstable {}", indexEntry.columnsIndex().size(), descriptor.generation); - return indexEntry; - } - - RowIndexEntry.Serializer.skip(in); - } - } - catch (IOException e) - { - markSuspect(); - throw new CorruptSSTableException(e, in.getPath()); - } - finally - { - FileUtils.closeQuietly(in); - } - } - - if (op == Operator.EQ && updateCacheAndStats) - bloomFilterTracker.addFalsePositive(); - Tracing.trace("Partition index lookup complete (bloom filter false positive) for sstable {}", descriptor.generation); - return null; - } + //Corresponds to a slice query + public abstract OnDiskAtomIterator iterator(DecoratedKey key, ColumnSlice[] slices, boolean reverse); + public abstract OnDiskAtomIterator iterator(FileDataInput file, DecoratedKey key, ColumnSlice[] slices, boolean reversed, RowIndexEntry indexEntry); /** * Finds and returns the first key beyond a given token in this SSTable or null if no such key exists. @@ -1649,28 +1461,29 @@ public boolean isMarkedSuspect() return isSuspect.get(); } - /** - * - * @param dataRange filter to use when reading the columns - * @return A Scanner for seeking over the rows of the SSTable. - */ - public SSTableScanner getScanner(DataRange dataRange) - { - return new SSTableScanner(this, dataRange, null); - } /** * I/O SSTableScanner * @return A Scanner for seeking over the rows of the SSTable. */ - public SSTableScanner getScanner() + public ICompactionScanner getScanner() { return getScanner((RateLimiter) null); } - public SSTableScanner getScanner(RateLimiter limiter) + public ICompactionScanner getScanner(RateLimiter limiter) { - return new SSTableScanner(this, DataRange.allData(partitioner), limiter); + return getScanner(DataRange.allData(partitioner), limiter); + } + + /** + * + * @param dataRange filter to use when reading the columns + * @return A Scanner for seeking over the rows of the SSTable. + */ + public ICompactionScanner getScanner(DataRange dataRange) + { + return getScanner(dataRange, null); } /** @@ -1686,21 +1499,22 @@ public ICompactionScanner getScanner(Range range, RateLimiter limiter) return getScanner(Collections.singletonList(range), limiter); } - /** - * Direct I/O SSTableScanner over a defined collection of ranges of tokens. - * - * @param ranges the range of keys to cover - * @return A Scanner for seeking over the rows of the SSTable. - */ - public ICompactionScanner getScanner(Collection> ranges, RateLimiter limiter) - { - // We want to avoid allocating a SSTableScanner if the range don't overlap the sstable (#5249) - List> positions = getPositionsForRanges(Range.normalize(ranges)); - if (positions.isEmpty()) - return new EmptyCompactionScanner(getFilename()); - else - return new SSTableScanner(this, ranges, limiter); - } + /** + * Direct I/O SSTableScanner over a defined collection of ranges of tokens. + * + * @param ranges the range of keys to cover + * @return A Scanner for seeking over the rows of the SSTable. + */ + public abstract ICompactionScanner getScanner(Collection> ranges, RateLimiter limiter); + + /** + * + * @param dataRange filter to use when reading the columns + * @return A Scanner for seeking over the rows of the SSTable. + */ + public abstract ICompactionScanner getScanner(DataRange dataRange, RateLimiter limiter); + + public FileDataInput getFileDataInput(long position) { @@ -1885,15 +1699,15 @@ public RandomAccessReader openDataReader(RateLimiter limiter) { assert limiter != null; return compression - ? CompressedThrottledReader.open(getFilename(), getCompressionMetadata(), limiter) - : ThrottledReader.open(new File(getFilename()), limiter); + ? CompressedThrottledReader.open(getFilename(), getCompressionMetadata(), limiter) + : ThrottledReader.open(new File(getFilename()), limiter); } public RandomAccessReader openDataReader() { return compression - ? CompressedRandomAccessReader.open(getFilename(), getCompressionMetadata()) - : RandomAccessReader.open(new File(getFilename())); + ? CompressedRandomAccessReader.open(getFilename(), getCompressionMetadata()) + : RandomAccessReader.open(new File(getFilename())); } public RandomAccessReader openIndexReader() @@ -2052,4 +1866,16 @@ public int compare(SSTableReader o1, SSTableReader o2) return Longs.compare(o1.onDiskLength(), o2.onDiskLength()); } } + + public static abstract class Factory + { + public abstract SSTableReader open(final Descriptor descriptor, + Set components, + CFMetaData metadata, + IPartitioner partitioner, + Long maxDataAge, + StatsMetadata sstableMetadata, + OpenReason openReason); + + } } diff --git a/src/java/org/apache/cassandra/io/sstable/format/SSTableWriter.java b/src/java/org/apache/cassandra/io/sstable/format/SSTableWriter.java new file mode 100644 index 000000000000..c0175300f4a8 --- /dev/null +++ b/src/java/org/apache/cassandra/io/sstable/format/SSTableWriter.java @@ -0,0 +1,202 @@ +/* + * 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.io.sstable.format; + +import com.google.common.collect.Sets; +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.DatabaseDescriptor; +import org.apache.cassandra.config.Schema; +import org.apache.cassandra.db.ColumnFamily; +import org.apache.cassandra.db.DecoratedKey; +import org.apache.cassandra.db.RowIndexEntry; +import org.apache.cassandra.db.compaction.AbstractCompactedRow; +import org.apache.cassandra.dht.IPartitioner; +import org.apache.cassandra.io.sstable.Component; +import org.apache.cassandra.io.sstable.Descriptor; +import org.apache.cassandra.io.sstable.SSTable; +import org.apache.cassandra.io.sstable.metadata.MetadataCollector; +import org.apache.cassandra.io.sstable.metadata.StatsMetadata; +import org.apache.cassandra.io.util.FileUtils; +import org.apache.cassandra.utils.Pair; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.DataInput; +import java.io.IOException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +/** + * This is the API all table writers must implement. + * + * TableWriter.create() is the primary way to create a writer for a particular format. + * The format information is part of the Descriptor. + */ +public abstract class SSTableWriter extends SSTable +{ + private static final Logger logger = LoggerFactory.getLogger(SSTableWriter.class); + + protected final long repairedAt; + protected final long keyCount; + protected final MetadataCollector metadataCollector; + protected final RowIndexEntry.IndexSerializer rowIndexEntrySerializer; + + protected SSTableWriter(Descriptor descriptor, long keyCount, long repairedAt, CFMetaData metadata, IPartitioner partitioner, MetadataCollector metadataCollector) + { + super(descriptor, components(metadata), metadata, partitioner); + this.keyCount = keyCount; + this.repairedAt = repairedAt; + this.metadataCollector = metadataCollector; + this.rowIndexEntrySerializer = descriptor.version.getSSTableFormat().getIndexSerializer(metadata); + } + + public static SSTableWriter create(Descriptor descriptor, Long keyCount, Long repairedAt, CFMetaData metadata, IPartitioner partitioner, MetadataCollector metadataCollector) + { + Factory writerFactory = descriptor.getFormat().getWriterFactory(); + return writerFactory.open(descriptor, keyCount, repairedAt, metadata, partitioner, metadataCollector); + } + + public static SSTableWriter create(Descriptor descriptor, long keyCount, long repairedAt) + { + return create(descriptor, keyCount, repairedAt, 0); + } + + public static SSTableWriter create(Descriptor descriptor, long keyCount, long repairedAt, int sstableLevel) + { + CFMetaData metadata = Schema.instance.getCFMetaData(descriptor); + MetadataCollector collector = new MetadataCollector(metadata.comparator).sstableLevel(sstableLevel); + + return create(descriptor, keyCount, repairedAt, metadata, DatabaseDescriptor.getPartitioner(), collector); + } + + public static SSTableWriter create(String filename, long keyCount, long repairedAt, int sstableLevel) + { + return create(Descriptor.fromFilename(filename), keyCount, repairedAt, sstableLevel); + } + + public static SSTableWriter create(String filename, long keyCount, long repairedAt) + { + return create(Descriptor.fromFilename(filename), keyCount, repairedAt, 0); + } + + private static Set components(CFMetaData metadata) + { + Set components = new HashSet(Arrays.asList(Component.DATA, + Component.PRIMARY_INDEX, + Component.STATS, + Component.SUMMARY, + Component.TOC, + Component.DIGEST)); + + if (metadata.getBloomFilterFpChance() < 1.0) + components.add(Component.FILTER); + + if (metadata.compressionParameters().sstableCompressor != null) + { + components.add(Component.COMPRESSION_INFO); + } + else + { + // it would feel safer to actually add this component later in maybeWriteDigest(), + // but the components are unmodifiable after construction + components.add(Component.CRC); + } + return components; + } + + + public abstract void mark(); + + + /** + * @param row + * @return null if the row was compacted away entirely; otherwise, the PK index entry for this row + */ + public abstract RowIndexEntry append(AbstractCompactedRow row); + + public abstract void append(DecoratedKey decoratedKey, ColumnFamily cf); + + public abstract long appendFromStream(DecoratedKey key, CFMetaData metadata, DataInput in, Version version) throws IOException; + + public abstract long getFilePointer(); + + public abstract long getOnDiskFilePointer(); + + public abstract void isolateReferences(); + + public abstract void resetAndTruncate(); + + public SSTableReader closeAndOpenReader() + { + return closeAndOpenReader(System.currentTimeMillis()); + } + + public SSTableReader closeAndOpenReader(long maxDataAge) + { + return closeAndOpenReader(maxDataAge, repairedAt); + } + + public abstract SSTableReader closeAndOpenReader(long maxDataAge, long repairedAt); + + public abstract SSTableReader openEarly(long maxDataAge); + + // Close the writer and return the descriptor to the new sstable and it's metadata + public abstract Pair close(); + + + + public static Descriptor rename(Descriptor tmpdesc, Set components) + { + Descriptor newdesc = tmpdesc.asType(Descriptor.Type.FINAL); + rename(tmpdesc, newdesc, components); + return newdesc; + } + + public static void rename(Descriptor tmpdesc, Descriptor newdesc, Set components) + { + for (Component component : Sets.difference(components, Sets.newHashSet(Component.DATA, Component.SUMMARY))) + { + FileUtils.renameWithConfirm(tmpdesc.filenameFor(component), newdesc.filenameFor(component)); + } + + // do -Data last because -Data present should mean the sstable was completely renamed before crash + FileUtils.renameWithConfirm(tmpdesc.filenameFor(Component.DATA), newdesc.filenameFor(Component.DATA)); + + // rename it without confirmation because summary can be available for loadNewSSTables but not for closeAndOpenReader + FileUtils.renameWithOutConfirm(tmpdesc.filenameFor(Component.SUMMARY), newdesc.filenameFor(Component.SUMMARY)); + } + + + /** + * After failure, attempt to close the index writer and data file before deleting all temp components for the sstable + */ + public void abort() + { + abort(true); + } + + public abstract void abort(boolean closeBf); + + + public static abstract class Factory + { + public abstract SSTableWriter open(Descriptor descriptor, long keyCount, long repairedAt, CFMetaData metadata, IPartitioner partitioner, MetadataCollector metadataCollector); + } +} diff --git a/src/java/org/apache/cassandra/io/sstable/format/Version.java b/src/java/org/apache/cassandra/io/sstable/format/Version.java new file mode 100644 index 000000000000..5da0cb835a24 --- /dev/null +++ b/src/java/org/apache/cassandra/io/sstable/format/Version.java @@ -0,0 +1,104 @@ +/* + * 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.io.sstable.format; + +/** + * A set of feature flags associated with a SSTable format + * + * versions are denoted as [major][minor]. Minor versions must be forward-compatible: + * new fields are allowed in e.g. the metadata component, but fields can't be removed + * or have their size changed. + * + * Minor versions were introduced with version "hb" for Cassandra 1.0.3; prior to that, + * we always incremented the major version. + * + */ +public abstract class Version +{ + protected final String version; + protected final SSTableFormat format; + protected Version(SSTableFormat format, String version) + { + this.format = format; + this.version = version; + } + + public abstract boolean isLatestVersion(); + + public abstract boolean hasPostCompressionAdlerChecksums(); + + public abstract boolean hasSamplingLevel(); + + public abstract boolean hasNewStatsFile(); + + public abstract boolean hasAllAdlerChecksums(); + + public abstract boolean hasRepairedAt(); + + public abstract boolean tracksLegacyCounterShards(); + + public abstract boolean hasNewFileName(); + + public String getVersion() + { + return version; + } + + public SSTableFormat getSSTableFormat() + { + return format; + } + + /** + * @param ver SSTable version + * @return True if the given version string matches the format. + * @see #version + */ + public static boolean validate(String ver) + { + return ver != null && ver.matches("[a-z]+"); + } + + abstract public boolean isCompatible(); + + @Override + public String toString() + { + return version; + } + + + @Override + public boolean equals(Object o) + { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Version version1 = (Version) o; + + if (version != null ? !version.equals(version1.version) : version1.version != null) return false; + + return true; + } + + @Override + public int hashCode() + { + return version != null ? version.hashCode() : 0; + } +} diff --git a/src/java/org/apache/cassandra/io/sstable/format/big/BigFormat.java b/src/java/org/apache/cassandra/io/sstable/format/big/BigFormat.java new file mode 100644 index 000000000000..eb43968cef98 --- /dev/null +++ b/src/java/org/apache/cassandra/io/sstable/format/big/BigFormat.java @@ -0,0 +1,224 @@ +/* + * 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.io.sstable.format.big; + +import com.google.common.collect.ImmutableList; +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.db.AbstractCell; +import org.apache.cassandra.db.ColumnSerializer; +import org.apache.cassandra.db.OnDiskAtom; +import org.apache.cassandra.db.RowIndexEntry; +import org.apache.cassandra.db.columniterator.OnDiskAtomIterator; +import org.apache.cassandra.db.compaction.AbstractCompactedRow; +import org.apache.cassandra.db.compaction.CompactionController; +import org.apache.cassandra.db.compaction.LazilyCompactedRow; +import org.apache.cassandra.dht.IPartitioner; +import org.apache.cassandra.io.sstable.Component; +import org.apache.cassandra.io.sstable.Descriptor; +import org.apache.cassandra.io.sstable.IndexHelper; +import org.apache.cassandra.io.sstable.format.SSTableFormat; +import org.apache.cassandra.io.sstable.format.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableWriter; +import org.apache.cassandra.io.sstable.format.Version; +import org.apache.cassandra.io.sstable.metadata.MetadataCollector; +import org.apache.cassandra.io.sstable.metadata.StatsMetadata; +import org.apache.cassandra.io.util.FileDataInput; + +import java.util.Iterator; +import java.util.Set; + +/** + * Legacy bigtable format + */ +public class BigFormat implements SSTableFormat +{ + public static final BigFormat instance = new BigFormat(); + public static final BigVersion latestVersion = new BigVersion(BigVersion.current_version); + private static final SSTableReader.Factory readerFactory = new ReaderFactory(); + private static final SSTableWriter.Factory writerFactory = new WriterFactory(); + + private BigFormat() + { + + } + + @Override + public Version getLatestVersion() + { + return latestVersion; + } + + @Override + public Version getVersion(String version) + { + return new BigVersion(version); + } + + @Override + public SSTableWriter.Factory getWriterFactory() + { + return writerFactory; + } + + @Override + public SSTableReader.Factory getReaderFactory() + { + return readerFactory; + } + + @Override + public Iterator getOnDiskIterator(FileDataInput in, ColumnSerializer.Flag flag, int expireBefore, CFMetaData cfm, Version version) + { + return AbstractCell.onDiskIterator(in, flag, expireBefore, version, cfm.comparator); + } + + @Override + public AbstractCompactedRow getCompactedRowWriter(CompactionController controller, ImmutableList onDiskAtomIterators) + { + return new LazilyCompactedRow(controller, onDiskAtomIterators); + } + + @Override + public RowIndexEntry.IndexSerializer getIndexSerializer(CFMetaData cfMetaData) + { + return new RowIndexEntry.Serializer(new IndexHelper.IndexInfo.Serializer(cfMetaData.comparator)); + } + + static class WriterFactory extends SSTableWriter.Factory + { + @Override + public SSTableWriter open(Descriptor descriptor, long keyCount, long repairedAt, CFMetaData metadata, IPartitioner partitioner, MetadataCollector metadataCollector) + { + return new BigTableWriter(descriptor, keyCount, repairedAt, metadata, partitioner, metadataCollector); + } + } + + static class ReaderFactory extends SSTableReader.Factory + { + @Override + public SSTableReader open(Descriptor descriptor, Set components, CFMetaData metadata, IPartitioner partitioner, Long maxDataAge, StatsMetadata sstableMetadata, SSTableReader.OpenReason openReason) + { + return new BigTableReader(descriptor, components, metadata, partitioner, maxDataAge, sstableMetadata, openReason); + } + } + + // versions are denoted as [major][minor]. Minor versions must be forward-compatible: + // new fields are allowed in e.g. the metadata component, but fields can't be removed + // or have their size changed. + // + // Minor versions were introduced with version "hb" for Cassandra 1.0.3; prior to that, + // we always incremented the major version. + static class BigVersion extends Version + { + public static final String current_version = "la"; + public static final String earliest_supported_version = "ja"; + + // ja (2.0.0): super columns are serialized as composites (note that there is no real format change, + // this is mostly a marker to know if we should expect super columns or not. We do need + // a major version bump however, because we should not allow streaming of super columns + // into this new format) + // tracks max local deletiontime in sstable metadata + // records bloom_filter_fp_chance in metadata component + // remove data size and column count from data file (CASSANDRA-4180) + // tracks max/min column values (according to comparator) + // jb (2.0.1): switch from crc32 to adler32 for compression checksums + // checksum the compressed data + // ka (2.1.0): new Statistics.db file format + // index summaries can be downsampled and the sampling level is persisted + // switch uncompressed checksums to adler32 + // tracks presense of legacy (local and remote) counter shards + // la (3.0.0): new file name format + + private final boolean isLatestVersion; + private final boolean hasPostCompressionAdlerChecksums; + private final boolean hasSamplingLevel; + private final boolean newStatsFile; + private final boolean hasAllAdlerChecksums; + private final boolean hasRepairedAt; + private final boolean tracksLegacyCounterShards; + private final boolean newFileName; + + public BigVersion(String version) + { + super(instance,version); + + isLatestVersion = version.compareTo(current_version) == 0; + hasPostCompressionAdlerChecksums = version.compareTo("jb") >= 0; + hasSamplingLevel = version.compareTo("ka") >= 0; + newStatsFile = version.compareTo("ka") >= 0; + hasAllAdlerChecksums = version.compareTo("ka") >= 0; + hasRepairedAt = version.compareTo("ka") >= 0; + tracksLegacyCounterShards = version.compareTo("ka") >= 0; + newFileName = version.compareTo("la") >= 0; + } + + @Override + public boolean isLatestVersion() + { + return isLatestVersion; + } + + @Override + public boolean hasPostCompressionAdlerChecksums() + { + return hasPostCompressionAdlerChecksums; + } + + @Override + public boolean hasSamplingLevel() + { + return hasSamplingLevel; + } + + @Override + public boolean hasNewStatsFile() + { + return newStatsFile; + } + + @Override + public boolean hasAllAdlerChecksums() + { + return hasAllAdlerChecksums; + } + + @Override + public boolean hasRepairedAt() + { + return hasRepairedAt; + } + + @Override + public boolean tracksLegacyCounterShards() + { + return tracksLegacyCounterShards; + } + + @Override + public boolean hasNewFileName() + { + return newFileName; + } + + @Override + public boolean isCompatible() + { + return version.compareTo(earliest_supported_version) >= 0 && version.charAt(0) <= current_version.charAt(0); + } + } +} diff --git a/src/java/org/apache/cassandra/io/sstable/format/big/BigTableReader.java b/src/java/org/apache/cassandra/io/sstable/format/big/BigTableReader.java new file mode 100644 index 000000000000..2488f86a0ad6 --- /dev/null +++ b/src/java/org/apache/cassandra/io/sstable/format/big/BigTableReader.java @@ -0,0 +1,256 @@ +/* + * 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.io.sstable.format.big; + +import com.google.common.util.concurrent.RateLimiter; +import org.apache.cassandra.cache.KeyCacheKey; +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.db.DataRange; +import org.apache.cassandra.db.DecoratedKey; +import org.apache.cassandra.db.RowIndexEntry; +import org.apache.cassandra.db.RowPosition; +import org.apache.cassandra.db.columniterator.OnDiskAtomIterator; +import org.apache.cassandra.db.compaction.ICompactionScanner; +import org.apache.cassandra.db.composites.CellName; +import org.apache.cassandra.db.filter.ColumnSlice; +import org.apache.cassandra.dht.IPartitioner; +import org.apache.cassandra.dht.Range; +import org.apache.cassandra.dht.Token; +import org.apache.cassandra.io.sstable.Component; +import org.apache.cassandra.io.sstable.CorruptSSTableException; +import org.apache.cassandra.io.sstable.Descriptor; +import org.apache.cassandra.io.sstable.format.SSTableReader; +import org.apache.cassandra.io.sstable.metadata.StatsMetadata; +import org.apache.cassandra.io.util.FileDataInput; +import org.apache.cassandra.io.util.FileUtils; +import org.apache.cassandra.tracing.Tracing; +import org.apache.cassandra.utils.ByteBufferUtil; +import org.apache.cassandra.utils.Pair; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.*; + +/** + * SSTableReaders are open()ed by Keyspace.onStart; after that they are created by SSTableWriter.renameAndOpen. + * Do not re-call open() on existing SSTable files; use the references kept by ColumnFamilyStore post-start instead. + */ +public class BigTableReader extends SSTableReader +{ + private static final Logger logger = LoggerFactory.getLogger(BigTableReader.class); + + BigTableReader(Descriptor desc, Set components, CFMetaData metadata, IPartitioner partitioner, Long maxDataAge, StatsMetadata sstableMetadata, OpenReason openReason) + { + super(desc, components, metadata, partitioner, maxDataAge, sstableMetadata, openReason); + } + + public OnDiskAtomIterator iterator(DecoratedKey key, SortedSet columns) + { + return new SSTableNamesIterator(this, key, columns); + } + + public OnDiskAtomIterator iterator(FileDataInput input, DecoratedKey key, SortedSet columns, RowIndexEntry indexEntry ) + { + return new SSTableNamesIterator(this, input, key, columns, indexEntry); + } + + public OnDiskAtomIterator iterator(DecoratedKey key, ColumnSlice[] slices, boolean reverse) + { + return new SSTableSliceIterator(this, key, slices, reverse); + } + + public OnDiskAtomIterator iterator(FileDataInput input, DecoratedKey key, ColumnSlice[] slices, boolean reverse, RowIndexEntry indexEntry) + { + return new SSTableSliceIterator(this, input, key, slices, reverse, indexEntry); + } + /** + * + * @param dataRange filter to use when reading the columns + * @return A Scanner for seeking over the rows of the SSTable. + */ + public ICompactionScanner getScanner(DataRange dataRange, RateLimiter limiter) + { + return new BigTableScanner(this, dataRange, limiter); + } + + + /** + * Direct I/O SSTableScanner over a defined collection of ranges of tokens. + * + * @param ranges the range of keys to cover + * @return A Scanner for seeking over the rows of the SSTable. + */ + public ICompactionScanner getScanner(Collection> ranges, RateLimiter limiter) + { + // We want to avoid allocating a SSTableScanner if the range don't overlap the sstable (#5249) + List> positions = getPositionsForRanges(Range.normalize(ranges)); + if (positions.isEmpty()) + return new EmptyCompactionScanner(getFilename()); + else + return new BigTableScanner(this, ranges, limiter); + } + + + /** + * @param key The key to apply as the rhs to the given Operator. A 'fake' key is allowed to + * allow key selection by token bounds but only if op != * EQ + * @param op The Operator defining matching keys: the nearest key to the target matching the operator wins. + * @param updateCacheAndStats true if updating stats and cache + * @return The index entry corresponding to the key, or null if the key is not present + */ + public RowIndexEntry getPosition(RowPosition key, Operator op, boolean updateCacheAndStats) + { + // first, check bloom filter + if (op == Operator.EQ) + { + assert key instanceof DecoratedKey; // EQ only make sense if the key is a valid row key + if (!bf.isPresent(((DecoratedKey)key).getKey())) + { + Tracing.trace("Bloom filter allows skipping sstable {}", descriptor.generation); + return null; + } + } + + // next, the key cache (only make sense for valid row key) + if ((op == Operator.EQ || op == Operator.GE) && (key instanceof DecoratedKey)) + { + DecoratedKey decoratedKey = (DecoratedKey)key; + KeyCacheKey cacheKey = new KeyCacheKey(metadata.cfId, descriptor, decoratedKey.getKey()); + RowIndexEntry cachedPosition = getCachedPosition(cacheKey, updateCacheAndStats); + if (cachedPosition != null) + { + Tracing.trace("Key cache hit for sstable {}", descriptor.generation); + return cachedPosition; + } + } + + // check the smallest and greatest keys in the sstable to see if it can't be present + if (first.compareTo(key) > 0 || last.compareTo(key) < 0) + { + if (op == Operator.EQ && updateCacheAndStats) + bloomFilterTracker.addFalsePositive(); + + if (op.apply(1) < 0) + { + Tracing.trace("Check against min and max keys allows skipping sstable {}", descriptor.generation); + return null; + } + } + + int binarySearchResult = indexSummary.binarySearch(key); + long sampledPosition = getIndexScanPositionFromBinarySearchResult(binarySearchResult, indexSummary); + int sampledIndex = getIndexSummaryIndexFromBinarySearchResult(binarySearchResult); + + // if we matched the -1th position, we'll start at the first position + sampledPosition = sampledPosition == -1 ? 0 : sampledPosition; + + int effectiveInterval = indexSummary.getEffectiveIndexIntervalAfterIndex(sampledIndex); + + // scan the on-disk index, starting at the nearest sampled position. + // The check against IndexInterval is to be exit the loop in the EQ case when the key looked for is not present + // (bloom filter false positive). But note that for non-EQ cases, we might need to check the first key of the + // next index position because the searched key can be greater the last key of the index interval checked if it + // is lesser than the first key of next interval (and in that case we must return the position of the first key + // of the next interval). + int i = 0; + Iterator segments = ifile.iterator(sampledPosition); + while (segments.hasNext() && i <= effectiveInterval) + { + FileDataInput in = segments.next(); + try + { + while (!in.isEOF() && i <= effectiveInterval) + { + i++; + + ByteBuffer indexKey = ByteBufferUtil.readWithShortLength(in); + + boolean opSatisfied; // did we find an appropriate position for the op requested + boolean exactMatch; // is the current position an exact match for the key, suitable for caching + + // Compare raw keys if possible for performance, otherwise compare decorated keys. + if (op == Operator.EQ) + { + opSatisfied = exactMatch = indexKey.equals(((DecoratedKey) key).getKey()); + } + else + { + DecoratedKey indexDecoratedKey = partitioner.decorateKey(indexKey); + int comparison = indexDecoratedKey.compareTo(key); + int v = op.apply(comparison); + opSatisfied = (v == 0); + exactMatch = (comparison == 0); + if (v < 0) + { + Tracing.trace("Partition index lookup allows skipping sstable {}", descriptor.generation); + return null; + } + } + + if (opSatisfied) + { + // read data position from index entry + RowIndexEntry indexEntry = rowIndexEntrySerializer.deserialize(in, descriptor.version); + if (exactMatch && updateCacheAndStats) + { + assert key instanceof DecoratedKey; // key can be == to the index key only if it's a true row key + DecoratedKey decoratedKey = (DecoratedKey)key; + + if (logger.isTraceEnabled()) + { + // expensive sanity check! see CASSANDRA-4687 + FileDataInput fdi = dfile.getSegment(indexEntry.position); + DecoratedKey keyInDisk = partitioner.decorateKey(ByteBufferUtil.readWithShortLength(fdi)); + if (!keyInDisk.equals(key)) + throw new AssertionError(String.format("%s != %s in %s", keyInDisk, key, fdi.getPath())); + fdi.close(); + } + + // store exact match for the key + cacheKey(decoratedKey, indexEntry); + } + if (op == Operator.EQ && updateCacheAndStats) + bloomFilterTracker.addTruePositive(); + Tracing.trace("Partition index with {} entries found for sstable {}", indexEntry.columnsIndex().size(), descriptor.generation); + return indexEntry; + } + + RowIndexEntry.Serializer.skip(in); + } + } + catch (IOException e) + { + markSuspect(); + throw new CorruptSSTableException(e, in.getPath()); + } + finally + { + FileUtils.closeQuietly(in); + } + } + + if (op == SSTableReader.Operator.EQ && updateCacheAndStats) + bloomFilterTracker.addFalsePositive(); + Tracing.trace("Partition index lookup complete (bloom filter false positive) for sstable {}", descriptor.generation); + return null; + } + + +} diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableScanner.java b/src/java/org/apache/cassandra/io/sstable/format/big/BigTableScanner.java similarity index 89% rename from src/java/org/apache/cassandra/io/sstable/SSTableScanner.java rename to src/java/org/apache/cassandra/io/sstable/format/big/BigTableScanner.java index 62ac1753713c..c1fc079aa9e2 100644 --- a/src/java/org/apache/cassandra/io/sstable/SSTableScanner.java +++ b/src/java/org/apache/cassandra/io/sstable/format/big/BigTableScanner.java @@ -15,7 +15,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.cassandra.io.sstable; +package org.apache.cassandra.io.sstable.format.big; import java.io.IOException; import java.util.ArrayList; @@ -38,11 +38,14 @@ import org.apache.cassandra.dht.Bounds; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; +import org.apache.cassandra.io.sstable.CorruptSSTableException; +import org.apache.cassandra.io.sstable.SSTableIdentityIterator; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.io.util.RandomAccessReader; import org.apache.cassandra.utils.ByteBufferUtil; -public class SSTableScanner implements ICompactionScanner +public class BigTableScanner implements ICompactionScanner { protected final RandomAccessReader dfile; protected final RandomAccessReader ifile; @@ -52,6 +55,7 @@ public class SSTableScanner implements ICompactionScanner private AbstractBounds currentRange; private final DataRange dataRange; + private final RowIndexEntry.IndexSerializer rowIndexEntrySerializer; protected Iterator iterator; @@ -60,7 +64,7 @@ public class SSTableScanner implements ICompactionScanner * @param dataRange a single range to scan; must not be null * @param limiter background i/o RateLimiter; may be null */ - SSTableScanner(SSTableReader sstable, DataRange dataRange, RateLimiter limiter) + public BigTableScanner(SSTableReader sstable, DataRange dataRange, RateLimiter limiter) { assert sstable != null; @@ -68,6 +72,7 @@ public class SSTableScanner implements ICompactionScanner this.ifile = sstable.openIndexReader(); this.sstable = sstable; this.dataRange = dataRange; + this.rowIndexEntrySerializer = sstable.descriptor.version.getSSTableFormat().getIndexSerializer(sstable.metadata); List> boundsList = new ArrayList<>(2); if (dataRange.isWrapAround() && !dataRange.stopKey().isMinimum(sstable.partitioner)) @@ -89,7 +94,7 @@ public class SSTableScanner implements ICompactionScanner * @param tokenRanges A set of token ranges to scan * @param limiter background i/o RateLimiter; may be null */ - SSTableScanner(SSTableReader sstable, Collection> tokenRanges, RateLimiter limiter) + public BigTableScanner(SSTableReader sstable, Collection> tokenRanges, RateLimiter limiter) { assert sstable != null; @@ -97,6 +102,7 @@ public class SSTableScanner implements ICompactionScanner this.ifile = sstable.openIndexReader(); this.sstable = sstable; this.dataRange = null; + this.rowIndexEntrySerializer = sstable.descriptor.version.getSSTableFormat().getIndexSerializer(sstable.metadata); List> normalized = Range.normalize(tokenRanges); List> boundsList = new ArrayList<>(normalized.size()); @@ -226,7 +232,7 @@ protected OnDiskAtomIterator computeNext() return endOfData(); currentKey = sstable.partitioner.decorateKey(ByteBufferUtil.readWithShortLength(ifile)); - currentEntry = sstable.metadata.comparator.rowIndexEntrySerializer().deserialize(ifile, sstable.descriptor.version); + currentEntry = rowIndexEntrySerializer.deserialize(ifile, sstable.descriptor.version); } while (!currentRange.contains(currentKey)); } else @@ -247,7 +253,7 @@ protected OnDiskAtomIterator computeNext() { // we need the position of the start of the next key, regardless of whether it falls in the current range nextKey = sstable.partitioner.decorateKey(ByteBufferUtil.readWithShortLength(ifile)); - nextEntry = sstable.metadata.comparator.rowIndexEntrySerializer().deserialize(ifile, sstable.descriptor.version); + nextEntry = rowIndexEntrySerializer.deserialize(ifile, sstable.descriptor.version); readEnd = nextEntry.position; if (!currentRange.contains(nextKey)) @@ -259,10 +265,9 @@ protected OnDiskAtomIterator computeNext() if (dataRange == null || dataRange.selectsFullRowFor(currentKey.getKey())) { - dfile.seek(currentEntry.position); + dfile.seek(currentEntry.position + currentEntry.headerOffset()); ByteBufferUtil.readWithShortLength(dfile); // key - long dataSize = readEnd - dfile.getFilePointer(); - return new SSTableIdentityIterator(sstable, dfile, currentKey, dataSize); + return new SSTableIdentityIterator(sstable, dfile, currentKey); } return new LazyColumnIterator(currentKey, new IColumnIteratorFactory() diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java b/src/java/org/apache/cassandra/io/sstable/format/big/BigTableWriter.java similarity index 76% rename from src/java/org/apache/cassandra/io/sstable/SSTableWriter.java rename to src/java/org/apache/cassandra/io/sstable/format/big/BigTableWriter.java index 4da967e172b6..ec53b4eb516a 100644 --- a/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java +++ b/src/java/org/apache/cassandra/io/sstable/format/big/BigTableWriter.java @@ -15,7 +15,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.cassandra.io.sstable; +package org.apache.cassandra.io.sstable.format.big; import java.io.Closeable; import java.io.DataInput; @@ -23,31 +23,23 @@ import java.io.FileOutputStream; import java.io.IOException; import java.nio.ByteBuffer; -import java.util.Arrays; import java.util.Collections; -import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; -import com.google.common.collect.Sets; +import org.apache.cassandra.db.*; +import org.apache.cassandra.io.sstable.*; +import org.apache.cassandra.io.sstable.format.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableWriter; +import org.apache.cassandra.io.sstable.format.Version; +import org.apache.cassandra.io.util.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.DatabaseDescriptor; -import org.apache.cassandra.config.Schema; -import org.apache.cassandra.db.ArrayBackedSortedColumns; -import org.apache.cassandra.db.ColumnFamily; -import org.apache.cassandra.db.ColumnIndex; -import org.apache.cassandra.db.ColumnSerializer; -import org.apache.cassandra.db.CounterCell; -import org.apache.cassandra.db.DecoratedKey; -import org.apache.cassandra.db.DeletionTime; -import org.apache.cassandra.db.OnDiskAtom; -import org.apache.cassandra.db.RangeTombstone; -import org.apache.cassandra.db.RowIndexEntry; import org.apache.cassandra.db.compaction.AbstractCompactedRow; import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.io.FSWriteError; @@ -70,9 +62,9 @@ import org.apache.cassandra.utils.Pair; import org.apache.cassandra.utils.StreamingHistogram; -public class SSTableWriter extends SSTable +public class BigTableWriter extends SSTableWriter { - private static final Logger logger = LoggerFactory.getLogger(SSTableWriter.class); + private static final Logger logger = LoggerFactory.getLogger(BigTableWriter.class); // not very random, but the only value that can't be mistaken for a legal column-name length public static final int END_OF_ROW = 0x0000; @@ -82,61 +74,11 @@ public class SSTableWriter extends SSTable private final SequentialWriter dataFile; private DecoratedKey lastWrittenKey; private FileMark dataMark; - private final MetadataCollector sstableMetadataCollector; - private final long repairedAt; - public SSTableWriter(String filename, long keyCount, long repairedAt, int sstableLevel) + BigTableWriter(Descriptor descriptor, Long keyCount, Long repairedAt, CFMetaData metadata, IPartitioner partitioner, MetadataCollector metadataCollector) { - this(filename, - keyCount, - repairedAt, - Schema.instance.getCFMetaData(Descriptor.fromFilename(filename)), - StorageService.getPartitioner(), - new MetadataCollector(Schema.instance.getCFMetaData(Descriptor.fromFilename(filename)).comparator).sstableLevel(sstableLevel)); - } - - public SSTableWriter(String filename, long keyCount) - { - this(filename, keyCount, ActiveRepairService.UNREPAIRED_SSTABLE, 0); - } - - private static Set components(CFMetaData metadata) - { - Set components = new HashSet(Arrays.asList(Component.DATA, - Component.PRIMARY_INDEX, - Component.STATS, - Component.SUMMARY, - Component.TOC, - Component.DIGEST)); - - if (metadata.getBloomFilterFpChance() < 1.0) - components.add(Component.FILTER); + super(descriptor, keyCount, repairedAt, metadata, partitioner, metadataCollector); - if (metadata.compressionParameters().sstableCompressor != null) - { - components.add(Component.COMPRESSION_INFO); - } - else - { - // it would feel safer to actually add this component later in maybeWriteDigest(), - // but the components are unmodifiable after construction - components.add(Component.CRC); - } - return components; - } - - public SSTableWriter(String filename, - long keyCount, - long repairedAt, - CFMetaData metadata, - IPartitioner partitioner, - MetadataCollector sstableMetadataCollector) - { - super(Descriptor.fromFilename(filename), - components(metadata), - metadata, - partitioner); - this.repairedAt = repairedAt; iwriter = new IndexWriter(keyCount); if (compression) @@ -144,7 +86,7 @@ public SSTableWriter(String filename, dataFile = SequentialWriter.open(getFilename(), descriptor.filenameFor(Component.COMPRESSION_INFO), metadata.compressionParameters(), - sstableMetadataCollector); + metadataCollector); dbuilder = SegmentedFile.getCompressedBuilder((CompressedSequentialWriter) dataFile); } else @@ -152,8 +94,6 @@ public SSTableWriter(String filename, dataFile = SequentialWriter.open(new File(getFilename()), new File(descriptor.filenameFor(Component.CRC))); dbuilder = SegmentedFile.getBuilder(DatabaseDescriptor.getDiskAccessMode()); } - - this.sstableMetadataCollector = sstableMetadataCollector; } public void mark() @@ -181,7 +121,7 @@ private long beforeAppend(DecoratedKey decoratedKey) private void afterAppend(DecoratedKey decoratedKey, long dataPosition, RowIndexEntry index) { - sstableMetadataCollector.addKey(decoratedKey.getKey()); + metadataCollector.addKey(decoratedKey.getKey()); lastWrittenKey = decoratedKey; last = lastWrittenKey; if (first == null) @@ -203,7 +143,7 @@ public RowIndexEntry append(AbstractCompactedRow row) RowIndexEntry entry; try { - entry = row.write(currentPosition, dataFile.stream); + entry = row.write(currentPosition, dataFile); if (entry == null) return null; } @@ -211,7 +151,7 @@ public RowIndexEntry append(AbstractCompactedRow row) { throw new FSWriteError(e, dataFile.getPath()); } - sstableMetadataCollector.update(dataFile.getFilePointer() - currentPosition, row.columnStats()); + metadataCollector.update(dataFile.getFilePointer() - currentPosition, row.columnStats()); afterAppend(row.key, currentPosition, entry); return entry; } @@ -228,10 +168,10 @@ public void append(DecoratedKey decoratedKey, ColumnFamily cf) { throw new FSWriteError(e, dataFile.getPath()); } - sstableMetadataCollector.update(dataFile.getFilePointer() - startPosition, cf.getColumnStats()); + metadataCollector.update(dataFile.getFilePointer() - startPosition, cf.getColumnStats()); } - public static RowIndexEntry rawAppend(ColumnFamily cf, long startPosition, DecoratedKey key, DataOutputPlus out) throws IOException + private static RowIndexEntry rawAppend(ColumnFamily cf, long startPosition, DecoratedKey key, DataOutputPlus out) throws IOException { assert cf.hasColumns() || cf.isMarkedForDelete(); @@ -246,7 +186,7 @@ public static RowIndexEntry rawAppend(ColumnFamily cf, long startPosition, Decor * @throws IOException if a read from the DataInput fails * @throws FSWriteError if a write to the dataFile fails */ - public long appendFromStream(DecoratedKey key, CFMetaData metadata, DataInput in, Descriptor.Version version) throws IOException + public long appendFromStream(DecoratedKey key, CFMetaData metadata, DataInput in, Version version) throws IOException { long currentPosition = beforeAppend(key); @@ -283,7 +223,7 @@ public long appendFromStream(DecoratedKey key, CFMetaData metadata, DataInput in maxColumnNames = ColumnNameHelper.maxComponents(maxColumnNames, rangeTombstone.max, metadata.comparator); } - Iterator iter = metadata.getOnDiskIterator(in, ColumnSerializer.Flag.PRESERVE_SIZE, Integer.MIN_VALUE, version); + Iterator iter = AbstractCell.onDiskIterator(in, ColumnSerializer.Flag.PRESERVE_SIZE, Integer.MIN_VALUE, version, metadata.comparator); try { while (iter.hasNext()) @@ -318,15 +258,16 @@ public long appendFromStream(DecoratedKey key, CFMetaData metadata, DataInput in throw new FSWriteError(e, dataFile.getPath()); } - sstableMetadataCollector.updateMinTimestamp(minTimestampTracker.get()) - .updateMaxTimestamp(maxTimestampTracker.get()) - .updateMaxLocalDeletionTime(maxDeletionTimeTracker.get()) - .addRowSize(dataFile.getFilePointer() - currentPosition) - .addColumnCount(columnIndexer.writtenAtomCount()) - .mergeTombstoneHistogram(tombstones) - .updateMinColumnNames(minColumnNames) - .updateMaxColumnNames(maxColumnNames) - .updateHasLegacyCounterShards(hasLegacyCounterShards); + metadataCollector.updateMinTimestamp(minTimestampTracker.get()) + .updateMaxTimestamp(maxTimestampTracker.get()) + .updateMaxLocalDeletionTime(maxDeletionTimeTracker.get()) + .addRowSize(dataFile.getFilePointer() - currentPosition) + .addColumnCount(columnIndexer.writtenAtomCount()) + .mergeTombstoneHistogram(tombstones) + .updateMinColumnNames(minColumnNames) + .updateMaxColumnNames(maxColumnNames) + .updateHasLegacyCounterShards(hasLegacyCounterShards); + afterAppend(key, currentPosition, RowIndexEntry.create(currentPosition, cf.deletionInfo().getTopLevelDeletion(), columnIndexer.build())); return currentPosition; } @@ -334,10 +275,6 @@ public long appendFromStream(DecoratedKey key, CFMetaData metadata, DataInput in /** * After failure, attempt to close the index writer and data file before deleting all temp components for the sstable */ - public void abort() - { - abort(true); - } public void abort(boolean closeBf) { assert descriptor.type.isTemporary; @@ -379,7 +316,7 @@ public void isolateReferences() public SSTableReader openEarly(long maxDataAge) { - StatsMetadata sstableMetadata = (StatsMetadata) sstableMetadataCollector.finalizeMetadata(partitioner.getClass().getCanonicalName(), + StatsMetadata sstableMetadata = (StatsMetadata) metadataCollector.finalizeMetadata(partitioner.getClass().getCanonicalName(), metadata.getBloomFilterFpChance(), repairedAt).get(MetadataType.STATS); @@ -425,16 +362,6 @@ public SSTableReader openEarly(long maxDataAge) return sstable; } - public SSTableReader closeAndOpenReader() - { - return closeAndOpenReader(System.currentTimeMillis()); - } - - public SSTableReader closeAndOpenReader(long maxDataAge) - { - return closeAndOpenReader(maxDataAge, this.repairedAt); - } - public SSTableReader closeAndOpenReader(long maxDataAge, long repairedAt) { Pair p = close(repairedAt); @@ -479,7 +406,7 @@ private Pair close(long repairedAt) dataFile.close(); dataFile.writeFullChecksum(descriptor); // write sstable statistics - Map metadataComponents = sstableMetadataCollector.finalizeMetadata( + Map metadataComponents = metadataCollector.finalizeMetadata( partitioner.getClass().getCanonicalName(), metadata.getBloomFilterFpChance(), repairedAt); @@ -489,7 +416,7 @@ private Pair close(long repairedAt) SSTable.appendTOC(descriptor, components); // remove the 'tmp' marker from all components - return Pair.create(rename(descriptor, components), (StatsMetadata) metadataComponents.get(MetadataType.STATS)); + return Pair.create(SSTableWriter.rename(descriptor, components), (StatsMetadata) metadataComponents.get(MetadataType.STATS)); } @@ -511,27 +438,6 @@ private static void writeMetadata(Descriptor desc, Map components) - { - Descriptor newdesc = tmpdesc.asType(Descriptor.Type.FINAL); - rename(tmpdesc, newdesc, components); - return newdesc; - } - - public static void rename(Descriptor tmpdesc, Descriptor newdesc, Set components) - { - for (Component component : Sets.difference(components, Sets.newHashSet(Component.DATA, Component.SUMMARY))) - { - FileUtils.renameWithConfirm(tmpdesc.filenameFor(component), newdesc.filenameFor(component)); - } - - // do -Data last because -Data present should mean the sstable was completely renamed before crash - FileUtils.renameWithConfirm(tmpdesc.filenameFor(Component.DATA), newdesc.filenameFor(Component.DATA)); - - // rename it without confirmation because summary can be available for loadNewSSTables but not for closeAndOpenReader - FileUtils.renameWithOutConfirm(tmpdesc.filenameFor(Component.SUMMARY), newdesc.filenameFor(Component.SUMMARY)); - } - public long getFilePointer() { return dataFile.getFilePointer(); @@ -575,7 +481,7 @@ public void append(DecoratedKey key, RowIndexEntry indexEntry) try { ByteBufferUtil.writeWithShortLength(key.getKey(), indexFile.stream); - metadata.comparator.rowIndexEntrySerializer().serialize(indexEntry, indexFile.stream); + rowIndexEntrySerializer.serialize(indexEntry, indexFile.stream); } catch (IOException e) { @@ -631,11 +537,5 @@ public void resetAndTruncate() // we assume that if that worked then we won't be trying to reset. indexFile.resetAndTruncate(mark); } - - @Override - public String toString() - { - return "IndexWriter(" + descriptor + ")"; - } } } diff --git a/src/java/org/apache/cassandra/db/columniterator/IndexedSliceReader.java b/src/java/org/apache/cassandra/io/sstable/format/big/IndexedSliceReader.java similarity index 98% rename from src/java/org/apache/cassandra/db/columniterator/IndexedSliceReader.java rename to src/java/org/apache/cassandra/io/sstable/format/big/IndexedSliceReader.java index 7012321b2c2e..a69cff9d8926 100644 --- a/src/java/org/apache/cassandra/db/columniterator/IndexedSliceReader.java +++ b/src/java/org/apache/cassandra/io/sstable/format/big/IndexedSliceReader.java @@ -15,7 +15,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.cassandra.db.columniterator; +package org.apache.cassandra.io.sstable.format.big; import java.io.IOException; import java.util.ArrayDeque; @@ -25,13 +25,14 @@ import com.google.common.collect.AbstractIterator; import org.apache.cassandra.db.*; +import org.apache.cassandra.db.columniterator.OnDiskAtomIterator; import org.apache.cassandra.db.composites.CellNameType; import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.db.filter.ColumnSlice; import org.apache.cassandra.io.sstable.CorruptSSTableException; import org.apache.cassandra.io.sstable.IndexHelper; import org.apache.cassandra.io.sstable.IndexHelper.IndexInfo; -import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.io.util.FileDataInput; import org.apache.cassandra.io.util.FileMark; import org.apache.cassandra.tracing.Tracing; @@ -64,7 +65,7 @@ class IndexedSliceReader extends AbstractIterator implements OnDiskA * finish (reverse start) elements. i.e. forward: [a,b],[d,e],[g,h] reverse: [h,g],[e,d],[b,a]. This reader also * assumes that validation has been performed in terms of intervals (no overlapping intervals). */ - public IndexedSliceReader(SSTableReader sstable, RowIndexEntry indexEntry, FileDataInput input, ColumnSlice[] slices, boolean reversed) + IndexedSliceReader(SSTableReader sstable, RowIndexEntry indexEntry, FileDataInput input, ColumnSlice[] slices, boolean reversed) { Tracing.trace("Seeking to partition indexed section in data file"); this.sstable = sstable; diff --git a/src/java/org/apache/cassandra/db/columniterator/SSTableNamesIterator.java b/src/java/org/apache/cassandra/io/sstable/format/big/SSTableNamesIterator.java similarity index 96% rename from src/java/org/apache/cassandra/db/columniterator/SSTableNamesIterator.java rename to src/java/org/apache/cassandra/io/sstable/format/big/SSTableNamesIterator.java index 224b63f21f23..07dc59a5d1a5 100644 --- a/src/java/org/apache/cassandra/db/columniterator/SSTableNamesIterator.java +++ b/src/java/org/apache/cassandra/io/sstable/format/big/SSTableNamesIterator.java @@ -15,7 +15,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.cassandra.db.columniterator; +package org.apache.cassandra.io.sstable.format.big; import java.io.IOException; import java.util.*; @@ -24,17 +24,18 @@ import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.db.*; +import org.apache.cassandra.db.columniterator.OnDiskAtomIterator; import org.apache.cassandra.db.composites.CellName; import org.apache.cassandra.db.composites.CellNameType; import org.apache.cassandra.io.sstable.CorruptSSTableException; import org.apache.cassandra.io.sstable.IndexHelper; -import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.io.util.FileDataInput; import org.apache.cassandra.io.util.FileMark; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.utils.ByteBufferUtil; -public class SSTableNamesIterator extends AbstractIterator implements OnDiskAtomIterator +class SSTableNamesIterator extends AbstractIterator implements OnDiskAtomIterator { private ColumnFamily cf; private final SSTableReader sstable; diff --git a/src/java/org/apache/cassandra/db/columniterator/SSTableSliceIterator.java b/src/java/org/apache/cassandra/io/sstable/format/big/SSTableSliceIterator.java similarity index 93% rename from src/java/org/apache/cassandra/db/columniterator/SSTableSliceIterator.java rename to src/java/org/apache/cassandra/io/sstable/format/big/SSTableSliceIterator.java index 0057d52886d2..07d867d8c4be 100644 --- a/src/java/org/apache/cassandra/db/columniterator/SSTableSliceIterator.java +++ b/src/java/org/apache/cassandra/io/sstable/format/big/SSTableSliceIterator.java @@ -15,7 +15,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.cassandra.db.columniterator; +package org.apache.cassandra.io.sstable.format.big; import java.io.IOException; @@ -23,14 +23,15 @@ import org.apache.cassandra.db.DecoratedKey; import org.apache.cassandra.db.OnDiskAtom; import org.apache.cassandra.db.RowIndexEntry; +import org.apache.cassandra.db.columniterator.OnDiskAtomIterator; import org.apache.cassandra.db.filter.ColumnSlice; -import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.io.util.FileDataInput; /** * A Cell Iterator over SSTable */ -public class SSTableSliceIterator implements OnDiskAtomIterator +class SSTableSliceIterator implements OnDiskAtomIterator { private final OnDiskAtomIterator reader; private final DecoratedKey key; diff --git a/src/java/org/apache/cassandra/db/columniterator/SimpleSliceReader.java b/src/java/org/apache/cassandra/io/sstable/format/big/SimpleSliceReader.java similarity index 92% rename from src/java/org/apache/cassandra/db/columniterator/SimpleSliceReader.java rename to src/java/org/apache/cassandra/io/sstable/format/big/SimpleSliceReader.java index bdbf4bd0d9a6..9fec303462f4 100644 --- a/src/java/org/apache/cassandra/db/columniterator/SimpleSliceReader.java +++ b/src/java/org/apache/cassandra/io/sstable/format/big/SimpleSliceReader.java @@ -15,12 +15,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.cassandra.db.columniterator; +package org.apache.cassandra.io.sstable.format.big; import java.io.IOException; import java.util.Iterator; import com.google.common.collect.AbstractIterator; +import org.apache.cassandra.db.columniterator.OnDiskAtomIterator; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,7 +30,6 @@ import org.apache.cassandra.db.composites.CellNameType; import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.io.sstable.CorruptSSTableException; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.io.util.FileDataInput; import org.apache.cassandra.tracing.Tracing; import org.apache.cassandra.utils.ByteBufferUtil; @@ -44,7 +45,7 @@ class SimpleSliceReader extends AbstractIterator implements OnDiskAt private final ColumnFamily emptyColumnFamily; private final Iterator atomIterator; - public SimpleSliceReader(SSTableReader sstable, RowIndexEntry indexEntry, FileDataInput input, Composite finishColumn) + SimpleSliceReader(SSTableReader sstable, RowIndexEntry indexEntry, FileDataInput input, Composite finishColumn) { Tracing.trace("Seeking to partition beginning in data file"); this.finishColumn = finishColumn; diff --git a/src/java/org/apache/cassandra/io/sstable/metadata/CompactionMetadata.java b/src/java/org/apache/cassandra/io/sstable/metadata/CompactionMetadata.java index f801dacb4a43..dd879c459ef6 100644 --- a/src/java/org/apache/cassandra/io/sstable/metadata/CompactionMetadata.java +++ b/src/java/org/apache/cassandra/io/sstable/metadata/CompactionMetadata.java @@ -27,6 +27,7 @@ import org.apache.cassandra.db.TypeSizes; import org.apache.cassandra.io.sstable.Descriptor; +import org.apache.cassandra.io.sstable.format.Version; import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.utils.ByteBufferUtil; @@ -91,7 +92,7 @@ public void serialize(CompactionMetadata component, DataOutputPlus out) throws I ByteBufferUtil.writeWithLength(component.cardinalityEstimator.getBytes(), out); } - public CompactionMetadata deserialize(Descriptor.Version version, DataInput in) throws IOException + public CompactionMetadata deserialize(Version version, DataInput in) throws IOException { int nbAncestors = in.readInt(); Set ancestors = new HashSet<>(nbAncestors); diff --git a/src/java/org/apache/cassandra/io/sstable/metadata/IMetadataComponentSerializer.java b/src/java/org/apache/cassandra/io/sstable/metadata/IMetadataComponentSerializer.java index 49ae3788c566..018d4a028099 100644 --- a/src/java/org/apache/cassandra/io/sstable/metadata/IMetadataComponentSerializer.java +++ b/src/java/org/apache/cassandra/io/sstable/metadata/IMetadataComponentSerializer.java @@ -21,6 +21,7 @@ import java.io.IOException; import org.apache.cassandra.io.sstable.Descriptor; +import org.apache.cassandra.io.sstable.format.Version; import org.apache.cassandra.io.util.DataOutputPlus; /** @@ -55,5 +56,5 @@ public interface IMetadataComponentSerializer * @return Deserialized component * @throws IOException */ - T deserialize(Descriptor.Version version, DataInput in) throws IOException; + T deserialize(Version version, DataInput in) throws IOException; } diff --git a/src/java/org/apache/cassandra/io/sstable/metadata/MetadataCollector.java b/src/java/org/apache/cassandra/io/sstable/metadata/MetadataCollector.java index 7ba2895e673c..152614da7ca8 100644 --- a/src/java/org/apache/cassandra/io/sstable/metadata/MetadataCollector.java +++ b/src/java/org/apache/cassandra/io/sstable/metadata/MetadataCollector.java @@ -37,7 +37,7 @@ import org.apache.cassandra.io.sstable.ColumnStats; import org.apache.cassandra.io.sstable.Component; import org.apache.cassandra.io.sstable.SSTable; -import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.service.ActiveRepairService; import org.apache.cassandra.utils.EstimatedHistogram; import org.apache.cassandra.utils.MurmurHash; diff --git a/src/java/org/apache/cassandra/io/sstable/metadata/StatsMetadata.java b/src/java/org/apache/cassandra/io/sstable/metadata/StatsMetadata.java index a557b88414e5..a501518ab4f5 100644 --- a/src/java/org/apache/cassandra/io/sstable/metadata/StatsMetadata.java +++ b/src/java/org/apache/cassandra/io/sstable/metadata/StatsMetadata.java @@ -23,6 +23,7 @@ import java.util.ArrayList; import java.util.List; +import org.apache.cassandra.io.sstable.format.Version; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; @@ -235,7 +236,7 @@ public void serialize(StatsMetadata component, DataOutputPlus out) throws IOExce out.writeBoolean(component.hasLegacyCounterShards); } - public StatsMetadata deserialize(Descriptor.Version version, DataInput in) throws IOException + public StatsMetadata deserialize(Version version, DataInput in) throws IOException { EstimatedHistogram rowSizes = EstimatedHistogram.serializer.deserialize(in); EstimatedHistogram columnCounts = EstimatedHistogram.serializer.deserialize(in); @@ -247,7 +248,7 @@ public StatsMetadata deserialize(Descriptor.Version version, DataInput in) throw StreamingHistogram tombstoneHistogram = StreamingHistogram.serializer.deserialize(in); int sstableLevel = in.readInt(); long repairedAt = 0; - if (version.hasRepairedAt) + if (version.hasRepairedAt()) repairedAt = in.readLong(); int colCount = in.readInt(); @@ -261,7 +262,7 @@ public StatsMetadata deserialize(Descriptor.Version version, DataInput in) throw maxColumnNames.add(ByteBufferUtil.readWithShortLength(in)); boolean hasLegacyCounterShards = true; - if (version.tracksLegacyCounterShards) + if (version.tracksLegacyCounterShards()) hasLegacyCounterShards = in.readBoolean(); return new StatsMetadata(rowSizes, diff --git a/src/java/org/apache/cassandra/io/sstable/metadata/ValidationMetadata.java b/src/java/org/apache/cassandra/io/sstable/metadata/ValidationMetadata.java index e00c55c0aa1c..aed682028a49 100644 --- a/src/java/org/apache/cassandra/io/sstable/metadata/ValidationMetadata.java +++ b/src/java/org/apache/cassandra/io/sstable/metadata/ValidationMetadata.java @@ -22,6 +22,7 @@ import org.apache.cassandra.db.TypeSizes; import org.apache.cassandra.io.sstable.Descriptor; +import org.apache.cassandra.io.sstable.format.Version; import org.apache.cassandra.io.util.DataOutputPlus; /** @@ -82,7 +83,7 @@ public void serialize(ValidationMetadata component, DataOutputPlus out) throws I out.writeDouble(component.bloomFilterFPChance); } - public ValidationMetadata deserialize(Descriptor.Version version, DataInput in) throws IOException + public ValidationMetadata deserialize(Version version, DataInput in) throws IOException { return new ValidationMetadata(in.readUTF(), in.readDouble()); diff --git a/src/java/org/apache/cassandra/io/util/AbstractDataInput.java b/src/java/org/apache/cassandra/io/util/AbstractDataInput.java index 281526046eeb..588540daabb7 100644 --- a/src/java/org/apache/cassandra/io/util/AbstractDataInput.java +++ b/src/java/org/apache/cassandra/io/util/AbstractDataInput.java @@ -21,9 +21,9 @@ public abstract class AbstractDataInput extends InputStream implements DataInput { - protected abstract void seek(long position) throws IOException; - protected abstract long getPosition(); - protected abstract long getPositionLimit(); + public abstract void seek(long position) throws IOException; + public abstract long getPosition(); + public abstract long getPositionLimit(); public int skipBytes(int n) throws IOException { diff --git a/src/java/org/apache/cassandra/io/util/DataIntegrityMetadata.java b/src/java/org/apache/cassandra/io/util/DataIntegrityMetadata.java index 797b964a08ac..4140c9518bfd 100644 --- a/src/java/org/apache/cassandra/io/util/DataIntegrityMetadata.java +++ b/src/java/org/apache/cassandra/io/util/DataIntegrityMetadata.java @@ -51,7 +51,7 @@ public static class ChecksumValidator implements Closeable public ChecksumValidator(Descriptor descriptor) throws IOException { this.descriptor = descriptor; - checksum = descriptor.version.hasAllAdlerChecksums ? new Adler32() : new PureJavaCrc32(); + checksum = descriptor.version.hasAllAdlerChecksums() ? new Adler32() : new PureJavaCrc32(); reader = RandomAccessReader.open(new File(descriptor.filenameFor(Component.CRC))); chunkSize = reader.readInt(); } diff --git a/src/java/org/apache/cassandra/io/util/FileDataInput.java b/src/java/org/apache/cassandra/io/util/FileDataInput.java index d94075c4fc30..55809ad1bf3c 100644 --- a/src/java/org/apache/cassandra/io/util/FileDataInput.java +++ b/src/java/org/apache/cassandra/io/util/FileDataInput.java @@ -20,6 +20,7 @@ import java.io.Closeable; import java.io.DataInput; import java.io.IOException; +import java.io.InputStream; import java.nio.ByteBuffer; public interface FileDataInput extends DataInput, Closeable diff --git a/src/java/org/apache/cassandra/io/util/FileUtils.java b/src/java/org/apache/cassandra/io/util/FileUtils.java index e590918d9422..35674659c722 100644 --- a/src/java/org/apache/cassandra/io/util/FileUtils.java +++ b/src/java/org/apache/cassandra/io/util/FileUtils.java @@ -17,13 +17,7 @@ */ package org.apache.cassandra.io.util; -import java.io.Closeable; -import java.io.DataInput; -import java.io.EOFException; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.RandomAccessFile; +import java.io.*; import java.nio.ByteBuffer; import java.nio.MappedByteBuffer; import java.nio.file.AtomicMoveNotSupportedException; @@ -442,4 +436,25 @@ public static long folderSize(File directory) } return length; } + + + public static void copyTo(DataInput in, OutputStream out, int length) throws IOException + { + byte[] buffer = new byte[64 * 1024]; + int copiedBytes = 0; + + while (copiedBytes + buffer.length < length) + { + in.readFully(buffer); + out.write(buffer); + copiedBytes += buffer.length; + } + + if (copiedBytes < length) + { + int left = length - copiedBytes; + in.readFully(buffer, 0, left); + out.write(buffer, 0, left); + } + } } diff --git a/src/java/org/apache/cassandra/io/util/MappedFileDataInput.java b/src/java/org/apache/cassandra/io/util/MappedFileDataInput.java index 047925693e23..574a7fbfb506 100644 --- a/src/java/org/apache/cassandra/io/util/MappedFileDataInput.java +++ b/src/java/org/apache/cassandra/io/util/MappedFileDataInput.java @@ -65,12 +65,12 @@ public long getFilePointer() return segmentOffset + position; } - protected long getPosition() + public long getPosition() { return segmentOffset + position; } - protected long getPositionLimit() + public long getPositionLimit() { return segmentOffset + buffer.capacity(); } diff --git a/src/java/org/apache/cassandra/io/util/MemoryInputStream.java b/src/java/org/apache/cassandra/io/util/MemoryInputStream.java index 73ccc1be8ac1..45261e0eed29 100644 --- a/src/java/org/apache/cassandra/io/util/MemoryInputStream.java +++ b/src/java/org/apache/cassandra/io/util/MemoryInputStream.java @@ -41,17 +41,17 @@ public void readFully(byte[] buffer, int offset, int count) throws IOException position += count; } - protected void seek(long pos) + public void seek(long pos) { position = (int) pos; } - protected long getPosition() + public long getPosition() { return position; } - protected long getPositionLimit() + public long getPositionLimit() { return mem.size(); } diff --git a/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java b/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java index 8ab432e7dd78..4e6f856c69c9 100644 --- a/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java +++ b/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java @@ -24,7 +24,7 @@ import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.Keyspace; -import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.io.sstable.metadata.MetadataCollector; import org.apache.cassandra.utils.EstimatedHistogram; diff --git a/src/java/org/apache/cassandra/net/MessagingService.java b/src/java/org/apache/cassandra/net/MessagingService.java index de3c1254a5b9..72d8d6ebcca5 100644 --- a/src/java/org/apache/cassandra/net/MessagingService.java +++ b/src/java/org/apache/cassandra/net/MessagingService.java @@ -74,7 +74,8 @@ public final class MessagingService implements MessagingServiceMBean public static final int VERSION_12 = 6; public static final int VERSION_20 = 7; public static final int VERSION_21 = 8; - public static final int current_version = VERSION_21; + public static final int VERSION_30 = 9; + public static final int current_version = VERSION_30; public static final String FAILURE_CALLBACK_PARAM = "CAL_BAC"; public static final byte[] ONE_BYTE = new byte[1]; diff --git a/src/java/org/apache/cassandra/notifications/SSTableAddedNotification.java b/src/java/org/apache/cassandra/notifications/SSTableAddedNotification.java index e4aff96e29f4..15230ea67af2 100644 --- a/src/java/org/apache/cassandra/notifications/SSTableAddedNotification.java +++ b/src/java/org/apache/cassandra/notifications/SSTableAddedNotification.java @@ -17,7 +17,7 @@ */ package org.apache.cassandra.notifications; -import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableReader; public class SSTableAddedNotification implements INotification { diff --git a/src/java/org/apache/cassandra/notifications/SSTableDeletingNotification.java b/src/java/org/apache/cassandra/notifications/SSTableDeletingNotification.java index 8b0f59794629..dcaa3b5f1a7f 100644 --- a/src/java/org/apache/cassandra/notifications/SSTableDeletingNotification.java +++ b/src/java/org/apache/cassandra/notifications/SSTableDeletingNotification.java @@ -17,7 +17,7 @@ */ package org.apache.cassandra.notifications; -import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableReader; /** * Fired right before removing an SSTable. diff --git a/src/java/org/apache/cassandra/notifications/SSTableListChangedNotification.java b/src/java/org/apache/cassandra/notifications/SSTableListChangedNotification.java index c36583c52760..7ca574bf16f4 100644 --- a/src/java/org/apache/cassandra/notifications/SSTableListChangedNotification.java +++ b/src/java/org/apache/cassandra/notifications/SSTableListChangedNotification.java @@ -19,9 +19,8 @@ import java.util.Collection; -import org.apache.cassandra.io.sstable.SSTableReader; - import org.apache.cassandra.db.compaction.OperationType; +import org.apache.cassandra.io.sstable.format.SSTableReader; public class SSTableListChangedNotification implements INotification { diff --git a/src/java/org/apache/cassandra/notifications/SSTableRepairStatusChanged.java b/src/java/org/apache/cassandra/notifications/SSTableRepairStatusChanged.java index a473a43ff47f..d1398bcdeabb 100644 --- a/src/java/org/apache/cassandra/notifications/SSTableRepairStatusChanged.java +++ b/src/java/org/apache/cassandra/notifications/SSTableRepairStatusChanged.java @@ -20,7 +20,7 @@ import java.util.Collection; -import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableReader; public class SSTableRepairStatusChanged implements INotification { diff --git a/src/java/org/apache/cassandra/repair/RepairMessageVerbHandler.java b/src/java/org/apache/cassandra/repair/RepairMessageVerbHandler.java index 04a27af0a82a..2ad8dc2961bd 100644 --- a/src/java/org/apache/cassandra/repair/RepairMessageVerbHandler.java +++ b/src/java/org/apache/cassandra/repair/RepairMessageVerbHandler.java @@ -24,6 +24,7 @@ import java.util.concurrent.Future; import com.google.common.base.Predicate; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,7 +36,6 @@ import org.apache.cassandra.dht.LocalPartitioner; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.net.IVerbHandler; import org.apache.cassandra.net.MessageIn; import org.apache.cassandra.net.MessageOut; diff --git a/src/java/org/apache/cassandra/service/ActiveRepairService.java b/src/java/org/apache/cassandra/service/ActiveRepairService.java index 670aa0b3e6f1..fa354e62b929 100644 --- a/src/java/org/apache/cassandra/service/ActiveRepairService.java +++ b/src/java/org/apache/cassandra/service/ActiveRepairService.java @@ -29,6 +29,8 @@ import com.google.common.collect.Sets; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; + +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -41,7 +43,6 @@ import org.apache.cassandra.gms.Gossiper; import org.apache.cassandra.gms.IFailureDetector; import org.apache.cassandra.io.sstable.Component; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.locator.TokenMetadata; import org.apache.cassandra.net.IAsyncCallbackWithFailure; import org.apache.cassandra.net.MessageIn; diff --git a/src/java/org/apache/cassandra/service/CacheService.java b/src/java/org/apache/cassandra/service/CacheService.java index 1b93c2cb06aa..2ffd954d4218 100644 --- a/src/java/org/apache/cassandra/service/CacheService.java +++ b/src/java/org/apache/cassandra/service/CacheService.java @@ -33,6 +33,7 @@ import javax.management.ObjectName; import com.google.common.util.concurrent.Futures; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -48,7 +49,6 @@ import org.apache.cassandra.db.context.CounterContext; import org.apache.cassandra.db.filter.QueryFilter; import org.apache.cassandra.io.sstable.Descriptor; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; @@ -472,7 +472,8 @@ public void serialize(KeyCacheKey key, DataOutputPlus out) throws IOException out.writeInt(desc.generation); out.writeBoolean(true); CFMetaData cfm = Schema.instance.getCFMetaData(key.desc.ksname, key.desc.cfname); - cfm.comparator.rowIndexEntrySerializer().serialize(entry, out); + + key.desc.getFormat().getIndexSerializer(cfm).serialize(entry, out); } public Future> deserialize(DataInputStream input, ColumnFamilyStore cfs) throws IOException @@ -492,7 +493,7 @@ public Future> deserialize(DataInputStream inpu RowIndexEntry.Serializer.skipPromotedIndex(input); return null; } - RowIndexEntry entry = reader.metadata.comparator.rowIndexEntrySerializer().deserialize(input, reader.descriptor.version); + RowIndexEntry entry = reader.descriptor.getFormat().getIndexSerializer(reader.metadata).deserialize(input, reader.descriptor.version); return Futures.immediateFuture(Pair.create(new KeyCacheKey(cfs.metadata.cfId, reader.descriptor, key), entry)); } diff --git a/src/java/org/apache/cassandra/streaming/StreamLockfile.java b/src/java/org/apache/cassandra/streaming/StreamLockfile.java index d00842a947e8..a0cf5fc8e2d6 100644 --- a/src/java/org/apache/cassandra/streaming/StreamLockfile.java +++ b/src/java/org/apache/cassandra/streaming/StreamLockfile.java @@ -28,12 +28,12 @@ import java.util.UUID; import com.google.common.base.Charsets; +import org.apache.cassandra.io.sstable.format.SSTableWriter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.cassandra.io.sstable.Descriptor; import org.apache.cassandra.io.sstable.SSTable; -import org.apache.cassandra.io.sstable.SSTableWriter; import org.apache.cassandra.io.util.FileUtils; /** diff --git a/src/java/org/apache/cassandra/streaming/StreamReader.java b/src/java/org/apache/cassandra/streaming/StreamReader.java index 34cbf02e9a61..8c4efcd9c15d 100644 --- a/src/java/org/apache/cassandra/streaming/StreamReader.java +++ b/src/java/org/apache/cassandra/streaming/StreamReader.java @@ -17,16 +17,18 @@ */ package org.apache.cassandra.streaming; -import java.io.DataInput; -import java.io.DataInputStream; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; import java.util.Collection; import java.util.UUID; import com.google.common.base.Throwables; +import org.apache.cassandra.io.sstable.format.SSTableFormat; +import org.apache.cassandra.io.sstable.format.SSTableWriter; +import org.apache.cassandra.io.sstable.format.Version; +import org.apache.cassandra.io.util.FileUtils; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,15 +39,14 @@ import org.apache.cassandra.db.DecoratedKey; import org.apache.cassandra.db.Directories; import org.apache.cassandra.db.Keyspace; -import org.apache.cassandra.io.sstable.Component; import org.apache.cassandra.io.sstable.Descriptor; -import org.apache.cassandra.io.sstable.SSTableWriter; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.streaming.messages.FileMessageHeader; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.BytesReadTracker; import org.apache.cassandra.utils.Pair; + /** * StreamReader reads from stream and writes to SSTable. */ @@ -56,8 +57,9 @@ public class StreamReader protected final long estimatedKeys; protected final Collection> sections; protected final StreamSession session; - protected final Descriptor.Version inputVersion; + protected final Version inputVersion; protected final long repairedAt; + protected final SSTableFormat.Type format; protected final int sstableLevel; protected Descriptor desc; @@ -68,8 +70,9 @@ public StreamReader(FileMessageHeader header, StreamSession session) this.cfId = header.cfId; this.estimatedKeys = header.estimatedKeys; this.sections = header.sections; - this.inputVersion = new Descriptor.Version(header.version); + this.inputVersion = header.format.info.getVersion(header.version); this.repairedAt = header.repairedAt; + this.format = header.format; this.sstableLevel = header.sstableLevel; } @@ -91,7 +94,8 @@ public SSTableWriter read(ReadableByteChannel channel) throws IOException } ColumnFamilyStore cfs = Keyspace.open(kscf.left).getColumnFamilyStore(kscf.right); - SSTableWriter writer = createWriter(cfs, totalSize, repairedAt); + SSTableWriter writer = createWriter(cfs, totalSize, repairedAt, format); + DataInputStream dis = new DataInputStream(new LZFInputStream(Channels.newInputStream(channel))); BytesReadTracker in = new BytesReadTracker(dis); try @@ -99,12 +103,12 @@ public SSTableWriter read(ReadableByteChannel channel) throws IOException while (in.getBytesRead() < totalSize) { writeRow(writer, in, cfs); + // TODO move this to BytesReadTracker session.progress(desc, ProgressInfo.Direction.IN, in.getBytesRead(), totalSize); } return writer; - } - catch (Throwable e) + } catch (Throwable e) { writer.abort(); drain(dis, in.getBytesRead()); @@ -115,13 +119,14 @@ public SSTableWriter read(ReadableByteChannel channel) throws IOException } } - protected SSTableWriter createWriter(ColumnFamilyStore cfs, long totalSize, long repairedAt) throws IOException + protected SSTableWriter createWriter(ColumnFamilyStore cfs, long totalSize, long repairedAt, SSTableFormat.Type format) throws IOException { Directories.DataDirectory localDir = cfs.directories.getWriteableLocation(); if (localDir == null) throw new IOException("Insufficient disk space to store " + totalSize + " bytes"); - desc = Descriptor.fromFilename(cfs.getTempSSTablePath(cfs.directories.getLocationForDisk(localDir))); - return new SSTableWriter(desc.filenameFor(Component.DATA), estimatedKeys, repairedAt, sstableLevel); + desc = Descriptor.fromFilename(cfs.getTempSSTablePath(cfs.directories.getLocationForDisk(localDir), format)); + + return SSTableWriter.create(desc, estimatedKeys, repairedAt, sstableLevel); } protected void drain(InputStream dis, long bytesRead) throws IOException diff --git a/src/java/org/apache/cassandra/streaming/StreamReceiveTask.java b/src/java/org/apache/cassandra/streaming/StreamReceiveTask.java index f26e43980ddc..a6db58cfe1ed 100644 --- a/src/java/org/apache/cassandra/streaming/StreamReceiveTask.java +++ b/src/java/org/apache/cassandra/streaming/StreamReceiveTask.java @@ -28,8 +28,10 @@ import org.apache.cassandra.config.Schema; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.Keyspace; -import org.apache.cassandra.io.sstable.SSTableReader; -import org.apache.cassandra.io.sstable.SSTableWriter; +import org.apache.cassandra.io.sstable.format.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableWriter; +import org.apache.cassandra.service.StorageService; +import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.Pair; /** diff --git a/src/java/org/apache/cassandra/streaming/StreamSession.java b/src/java/org/apache/cassandra/streaming/StreamSession.java index 48b88c4e8f39..8bb34a6eceb6 100644 --- a/src/java/org/apache/cassandra/streaming/StreamSession.java +++ b/src/java/org/apache/cassandra/streaming/StreamSession.java @@ -25,6 +25,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import com.google.common.collect.*; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,7 +39,6 @@ import org.apache.cassandra.gms.*; import org.apache.cassandra.io.sstable.Component; import org.apache.cassandra.io.sstable.Descriptor; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.metrics.StreamingMetrics; import org.apache.cassandra.service.ActiveRepairService; import org.apache.cassandra.streaming.messages.*; diff --git a/src/java/org/apache/cassandra/streaming/StreamTransferTask.java b/src/java/org/apache/cassandra/streaming/StreamTransferTask.java index 18058c1bb68e..a3dd10f1ca4e 100644 --- a/src/java/org/apache/cassandra/streaming/StreamTransferTask.java +++ b/src/java/org/apache/cassandra/streaming/StreamTransferTask.java @@ -23,7 +23,7 @@ import java.util.concurrent.atomic.AtomicInteger; import org.apache.cassandra.concurrent.NamedThreadFactory; -import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.streaming.messages.OutgoingFileMessage; import org.apache.cassandra.utils.Pair; diff --git a/src/java/org/apache/cassandra/streaming/StreamWriter.java b/src/java/org/apache/cassandra/streaming/StreamWriter.java index 43bc26afec1d..93903a7bb19f 100644 --- a/src/java/org/apache/cassandra/streaming/StreamWriter.java +++ b/src/java/org/apache/cassandra/streaming/StreamWriter.java @@ -27,7 +27,7 @@ import com.ning.compress.lzf.LZFOutputStream; import org.apache.cassandra.io.sstable.Component; -import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.io.util.DataIntegrityMetadata; import org.apache.cassandra.io.util.DataIntegrityMetadata.ChecksumValidator; import org.apache.cassandra.io.util.FileUtils; diff --git a/src/java/org/apache/cassandra/streaming/compress/CompressedStreamReader.java b/src/java/org/apache/cassandra/streaming/compress/CompressedStreamReader.java index fb2599f94e09..0595e0cbe2ce 100644 --- a/src/java/org/apache/cassandra/streaming/compress/CompressedStreamReader.java +++ b/src/java/org/apache/cassandra/streaming/compress/CompressedStreamReader.java @@ -18,12 +18,15 @@ package org.apache.cassandra.streaming.compress; import java.io.DataInputStream; + import java.io.IOException; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; import com.google.common.base.Throwables; +import org.apache.cassandra.io.sstable.format.SSTableWriter; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -31,7 +34,6 @@ import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.io.compress.CompressionMetadata; -import org.apache.cassandra.io.sstable.SSTableWriter; import org.apache.cassandra.streaming.ProgressInfo; import org.apache.cassandra.streaming.StreamReader; import org.apache.cassandra.streaming.StreamSession; @@ -72,21 +74,25 @@ public SSTableWriter read(ReadableByteChannel channel) throws IOException } ColumnFamilyStore cfs = Keyspace.open(kscf.left).getColumnFamilyStore(kscf.right); - SSTableWriter writer = createWriter(cfs, totalSize, repairedAt); + SSTableWriter writer = createWriter(cfs, totalSize, repairedAt, format); - CompressedInputStream cis = new CompressedInputStream(Channels.newInputStream(channel), compressionInfo, inputVersion.hasPostCompressionAdlerChecksums); + CompressedInputStream cis = new CompressedInputStream(Channels.newInputStream(channel), compressionInfo, inputVersion.hasPostCompressionAdlerChecksums()); BytesReadTracker in = new BytesReadTracker(new DataInputStream(cis)); try { for (Pair section : sections) { - long length = section.right - section.left; + assert in.getBytesRead() < totalSize; + int sectionLength = (int) (section.right - section.left); + // skip to beginning of section inside chunk cis.position(section.left); in.reset(0); - while (in.getBytesRead() < length) + + while (in.getBytesRead() < sectionLength) { writeRow(writer, in, cfs); + // when compressed, report total bytes of compressed chunks read since remoteFile.size is the sum of chunks transferred session.progress(desc, ProgressInfo.Direction.IN, cis.getTotalCompressedBytesRead(), totalSize); } diff --git a/src/java/org/apache/cassandra/streaming/compress/CompressedStreamWriter.java b/src/java/org/apache/cassandra/streaming/compress/CompressedStreamWriter.java index 001c927ea5ff..786ff23a59a3 100644 --- a/src/java/org/apache/cassandra/streaming/compress/CompressedStreamWriter.java +++ b/src/java/org/apache/cassandra/streaming/compress/CompressedStreamWriter.java @@ -25,7 +25,7 @@ import java.util.List; import org.apache.cassandra.io.compress.CompressionMetadata; -import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.io.util.RandomAccessReader; import org.apache.cassandra.streaming.ProgressInfo; diff --git a/src/java/org/apache/cassandra/streaming/messages/FileMessageHeader.java b/src/java/org/apache/cassandra/streaming/messages/FileMessageHeader.java index 5e378bc31cec..5266e45e6c36 100644 --- a/src/java/org/apache/cassandra/streaming/messages/FileMessageHeader.java +++ b/src/java/org/apache/cassandra/streaming/messages/FileMessageHeader.java @@ -26,6 +26,7 @@ import org.apache.cassandra.db.TypeSizes; import org.apache.cassandra.io.IVersionedSerializer; import org.apache.cassandra.io.compress.CompressionMetadata; +import org.apache.cassandra.io.sstable.format.SSTableFormat; import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.streaming.compress.CompressionInfo; @@ -43,6 +44,9 @@ public class FileMessageHeader public final int sequenceNumber; /** SSTable version */ public final String version; + + /** SSTable format **/ + public final SSTableFormat.Type format; public final long estimatedKeys; public final List> sections; public final CompressionInfo compressionInfo; @@ -52,6 +56,7 @@ public class FileMessageHeader public FileMessageHeader(UUID cfId, int sequenceNumber, String version, + SSTableFormat.Type format, long estimatedKeys, List> sections, CompressionInfo compressionInfo, @@ -61,6 +66,7 @@ public FileMessageHeader(UUID cfId, this.cfId = cfId; this.sequenceNumber = sequenceNumber; this.version = version; + this.format = format; this.estimatedKeys = estimatedKeys; this.sections = sections; this.compressionInfo = compressionInfo; @@ -95,6 +101,7 @@ public String toString() sb.append("cfId: ").append(cfId); sb.append(", #").append(sequenceNumber); sb.append(", version: ").append(version); + sb.append(", format: ").append(format); sb.append(", estimated keys: ").append(estimatedKeys); sb.append(", transfer size: ").append(size()); sb.append(", compressed?: ").append(compressionInfo != null); @@ -128,8 +135,15 @@ public void serialize(FileMessageHeader header, DataOutputPlus out, int version) UUIDSerializer.serializer.serialize(header.cfId, out, version); out.writeInt(header.sequenceNumber); out.writeUTF(header.version); - out.writeLong(header.estimatedKeys); + //We can't stream to a node that doesn't understand a new sstable format + if (version < StreamMessage.VERSION_30 && header.format != SSTableFormat.Type.LEGACY && header.format != SSTableFormat.Type.BIG) + throw new UnsupportedOperationException("Can't stream non-legacy sstables to nodes < 3.0"); + + if (version >= StreamMessage.VERSION_30) + out.writeUTF(header.format.name); + + out.writeLong(header.estimatedKeys); out.writeInt(header.sections.size()); for (Pair section : header.sections) { @@ -146,6 +160,11 @@ public FileMessageHeader deserialize(DataInput in, int version) throws IOExcepti UUID cfId = UUIDSerializer.serializer.deserialize(in, MessagingService.current_version); int sequenceNumber = in.readInt(); String sstableVersion = in.readUTF(); + + SSTableFormat.Type format = SSTableFormat.Type.LEGACY; + if (version >= StreamMessage.VERSION_30) + format = SSTableFormat.Type.validate(in.readUTF()); + long estimatedKeys = in.readLong(); int count = in.readInt(); List> sections = new ArrayList<>(count); @@ -154,7 +173,7 @@ public FileMessageHeader deserialize(DataInput in, int version) throws IOExcepti CompressionInfo compressionInfo = CompressionInfo.serializer.deserialize(in, MessagingService.current_version); long repairedAt = in.readLong(); int sstableLevel = in.readInt(); - return new FileMessageHeader(cfId, sequenceNumber, sstableVersion, estimatedKeys, sections, compressionInfo, repairedAt, sstableLevel); + return new FileMessageHeader(cfId, sequenceNumber, sstableVersion, format, estimatedKeys, sections, compressionInfo, repairedAt, sstableLevel); } public long serializedSize(FileMessageHeader header, int version) @@ -162,6 +181,10 @@ public long serializedSize(FileMessageHeader header, int version) long size = UUIDSerializer.serializer.serializedSize(header.cfId, version); size += TypeSizes.NATIVE.sizeof(header.sequenceNumber); size += TypeSizes.NATIVE.sizeof(header.version); + + if (version >= StreamMessage.VERSION_30) + size += TypeSizes.NATIVE.sizeof(header.format.name); + size += TypeSizes.NATIVE.sizeof(header.estimatedKeys); size += TypeSizes.NATIVE.sizeof(header.sections.size()); diff --git a/src/java/org/apache/cassandra/streaming/messages/IncomingFileMessage.java b/src/java/org/apache/cassandra/streaming/messages/IncomingFileMessage.java index 8569b885eb55..237fb703fd9d 100644 --- a/src/java/org/apache/cassandra/streaming/messages/IncomingFileMessage.java +++ b/src/java/org/apache/cassandra/streaming/messages/IncomingFileMessage.java @@ -22,7 +22,7 @@ import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; -import org.apache.cassandra.io.sstable.SSTableWriter; +import org.apache.cassandra.io.sstable.format.SSTableWriter; import org.apache.cassandra.io.util.DataOutputStreamAndChannel; import org.apache.cassandra.streaming.StreamReader; import org.apache.cassandra.streaming.StreamSession; diff --git a/src/java/org/apache/cassandra/streaming/messages/OutgoingFileMessage.java b/src/java/org/apache/cassandra/streaming/messages/OutgoingFileMessage.java index 13af987da22a..ed4c4cec5f38 100644 --- a/src/java/org/apache/cassandra/streaming/messages/OutgoingFileMessage.java +++ b/src/java/org/apache/cassandra/streaming/messages/OutgoingFileMessage.java @@ -22,7 +22,7 @@ import java.util.List; import org.apache.cassandra.io.compress.CompressionMetadata; -import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.io.util.DataOutputStreamAndChannel; import org.apache.cassandra.streaming.StreamSession; import org.apache.cassandra.streaming.StreamWriter; @@ -74,6 +74,7 @@ public OutgoingFileMessage(SSTableReader sstable, int sequenceNumber, long estim this.header = new FileMessageHeader(sstable.metadata.cfId, sequenceNumber, sstable.descriptor.version.toString(), + sstable.descriptor.formatType, estimatedKeys, sections, compressionInfo, diff --git a/src/java/org/apache/cassandra/streaming/messages/StreamMessage.java b/src/java/org/apache/cassandra/streaming/messages/StreamMessage.java index 372fdd35709c..20490db0ffbf 100644 --- a/src/java/org/apache/cassandra/streaming/messages/StreamMessage.java +++ b/src/java/org/apache/cassandra/streaming/messages/StreamMessage.java @@ -32,7 +32,9 @@ public abstract class StreamMessage { /** Streaming protocol version */ - public static final int CURRENT_VERSION = 3; + public static final int VERSION_20 = 2; + public static final int VERSION_30 = 3; + public static final int CURRENT_VERSION = VERSION_30; public static void serialize(StreamMessage message, DataOutputStreamAndChannel out, int version, StreamSession session) throws IOException { diff --git a/src/java/org/apache/cassandra/tools/SSTableExport.java b/src/java/org/apache/cassandra/tools/SSTableExport.java index 1febbe8a6608..1ab56ce5edd4 100644 --- a/src/java/org/apache/cassandra/tools/SSTableExport.java +++ b/src/java/org/apache/cassandra/tools/SSTableExport.java @@ -22,6 +22,8 @@ import java.io.PrintStream; import java.util.*; +import org.apache.cassandra.db.compaction.ICompactionScanner; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.commons.cli.*; import org.apache.cassandra.config.CFMetaData; @@ -115,7 +117,7 @@ private static List serializeAtom(OnDiskAtom atom, CFMetaData cfMetaData } /** - * Serialize a given cell to a List of Objects that jsonMapper knows how to turn into strings. Format is + * Serialize a given cell to a List of Objects that jsonMapper knows how to turn into strings. Type is * * human_readable_name, value, timestamp, [flag, [options]] * @@ -318,10 +320,10 @@ static void export(SSTableReader reader, PrintStream outs, String[] excludes, CF Set excludeSet = new HashSet(); if (excludes != null) - excludeSet = new HashSet(Arrays.asList(excludes)); + excludeSet = new HashSet<>(Arrays.asList(excludes)); SSTableIdentityIterator row; - SSTableScanner scanner = reader.getScanner(); + ICompactionScanner scanner = reader.getScanner(); try { outs.println("["); diff --git a/src/java/org/apache/cassandra/tools/SSTableImport.java b/src/java/org/apache/cassandra/tools/SSTableImport.java index 05b9dcb18db6..fc4470e68a9e 100644 --- a/src/java/org/apache/cassandra/tools/SSTableImport.java +++ b/src/java/org/apache/cassandra/tools/SSTableImport.java @@ -26,6 +26,8 @@ import java.util.TreeMap; import java.util.concurrent.TimeUnit; +import org.apache.cassandra.io.sstable.Descriptor; +import org.apache.cassandra.io.sstable.format.SSTableWriter; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.Option; @@ -42,7 +44,6 @@ import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.db.marshal.BytesType; import org.apache.cassandra.dht.IPartitioner; -import org.apache.cassandra.io.sstable.SSTableWriter; import org.apache.cassandra.serializers.MarshalException; import org.apache.cassandra.service.ActiveRepairService; import org.apache.cassandra.utils.ByteBufferUtil; @@ -302,7 +303,7 @@ private int importUnsorted(String jsonFile, ColumnFamily columnFamily, String ss Object[] data = parser.readValueAs(new TypeReference(){}); keyCountToImport = (keyCountToImport == null) ? data.length : keyCountToImport; - SSTableWriter writer = new SSTableWriter(ssTablePath, keyCountToImport); + SSTableWriter writer = SSTableWriter.create(Descriptor.fromFilename(ssTablePath), keyCountToImport, ActiveRepairService.UNREPAIRED_SSTABLE, 0); System.out.printf("Importing %s keys...%n", keyCountToImport); @@ -375,7 +376,7 @@ private int importSorted(String jsonFile, ColumnFamily columnFamily, String ssTa System.out.printf("Importing %s keys...%n", keyCountToImport); parser = getParser(jsonFile); // renewing parser - SSTableWriter writer = new SSTableWriter(ssTablePath, keyCountToImport); + SSTableWriter writer = SSTableWriter.create(Descriptor.fromFilename(ssTablePath), keyCountToImport, ActiveRepairService.UNREPAIRED_SSTABLE); int lineNumber = 1; DecoratedKey prevStoredKey = null; diff --git a/src/java/org/apache/cassandra/tools/SSTableRepairedAtSetter.java b/src/java/org/apache/cassandra/tools/SSTableRepairedAtSetter.java index b37d3b4cc9ad..1f596ad21469 100644 --- a/src/java/org/apache/cassandra/tools/SSTableRepairedAtSetter.java +++ b/src/java/org/apache/cassandra/tools/SSTableRepairedAtSetter.java @@ -77,7 +77,7 @@ public static void main(final String[] args) throws IOException for (String fname: fileNames) { Descriptor descriptor = Descriptor.fromFilename(fname); - if (descriptor.version.hasRepairedAt) + if (descriptor.version.hasRepairedAt()) { if (setIsRepaired) { diff --git a/src/java/org/apache/cassandra/tools/StandaloneScrubber.java b/src/java/org/apache/cassandra/tools/StandaloneScrubber.java index 4dffa74c88fe..2c92e60a784e 100644 --- a/src/java/org/apache/cassandra/tools/StandaloneScrubber.java +++ b/src/java/org/apache/cassandra/tools/StandaloneScrubber.java @@ -21,6 +21,7 @@ import java.io.File; import java.util.*; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.commons.cli.*; import org.apache.cassandra.config.DatabaseDescriptor; @@ -66,7 +67,7 @@ public static void main(String args[]) OutputHandler handler = new OutputHandler.SystemOutput(options.verbose, options.debug); Directories.SSTableLister lister = cfs.directories.sstableLister().skipTemporary(true); - List sstables = new ArrayList(); + List sstables = new ArrayList<>(); // Scrub sstables for (Map.Entry> entry : lister.list().entrySet()) diff --git a/src/java/org/apache/cassandra/tools/StandaloneSplitter.java b/src/java/org/apache/cassandra/tools/StandaloneSplitter.java index e078c3b69797..8c7e704ec558 100644 --- a/src/java/org/apache/cassandra/tools/StandaloneSplitter.java +++ b/src/java/org/apache/cassandra/tools/StandaloneSplitter.java @@ -21,6 +21,7 @@ import java.io.File; import java.util.*; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.commons.cli.*; import org.apache.cassandra.config.DatabaseDescriptor; @@ -109,7 +110,7 @@ else if (!cfName.equals(desc.cfname)) String snapshotName = "pre-split-" + System.currentTimeMillis(); - List sstables = new ArrayList(); + List sstables = new ArrayList<>(); for (Map.Entry> fn : parsedFilenames.entrySet()) { try diff --git a/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java b/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java index 1a8a89fd3dbc..9aa02f2e8bae 100644 --- a/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java +++ b/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java @@ -19,6 +19,7 @@ import java.util.*; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.commons.cli.*; import org.apache.cassandra.config.DatabaseDescriptor; @@ -61,7 +62,7 @@ public static void main(String args[]) else lister.includeBackups(false); - Collection readers = new ArrayList(); + Collection readers = new ArrayList<>(); // Upgrade sstables for (Map.Entry> entry : lister.list().entrySet()) @@ -73,7 +74,7 @@ public static void main(String args[]) try { SSTableReader sstable = SSTableReader.openNoValidation(entry.getKey(), components, cfs.metadata); - if (sstable.descriptor.version.equals(Descriptor.Version.CURRENT)) + if (sstable.descriptor.version.equals(DatabaseDescriptor.getSSTableFormat().info.getLatestVersion())) continue; readers.add(sstable); } diff --git a/src/java/org/apache/cassandra/utils/vint/EncodedDataInputStream.java b/src/java/org/apache/cassandra/utils/vint/EncodedDataInputStream.java index 6385e5cff09b..bee8ab028d3b 100644 --- a/src/java/org/apache/cassandra/utils/vint/EncodedDataInputStream.java +++ b/src/java/org/apache/cassandra/utils/vint/EncodedDataInputStream.java @@ -47,17 +47,17 @@ public int read() throws IOException return input.readByte() & 0xFF; } - protected void seek(long position) + public void seek(long position) { throw new UnsupportedOperationException(); } - protected long getPosition() + public long getPosition() { throw new UnsupportedOperationException(); } - protected long getPositionLimit() + public long getPositionLimit() { throw new UnsupportedOperationException(); } diff --git a/test/long/org/apache/cassandra/db/compaction/LongCompactionsTest.java b/test/long/org/apache/cassandra/db/compaction/LongCompactionsTest.java index 7bc8ef50aba7..28ec9759fa33 100644 --- a/test/long/org/apache/cassandra/db/compaction/LongCompactionsTest.java +++ b/test/long/org/apache/cassandra/db/compaction/LongCompactionsTest.java @@ -24,6 +24,7 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; @@ -32,7 +33,6 @@ import org.apache.cassandra.Util; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.db.*; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.io.sstable.SSTableUtils; import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.ByteBufferUtil; @@ -92,7 +92,7 @@ protected void testCompaction(int sstableCount, int rowsPerSSTable, int colsPerR Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore("Standard1"); - ArrayList sstables = new ArrayList(); + ArrayList sstables = new ArrayList<>(); for (int k = 0; k < sstableCount; k++) { SortedMap rows = new TreeMap(); diff --git a/test/long/org/apache/cassandra/db/compaction/LongLeveledCompactionStrategyTest.java b/test/long/org/apache/cassandra/db/compaction/LongLeveledCompactionStrategyTest.java index 159b641551a0..0530d84895dc 100644 --- a/test/long/org/apache/cassandra/db/compaction/LongLeveledCompactionStrategyTest.java +++ b/test/long/org/apache/cassandra/db/compaction/LongLeveledCompactionStrategyTest.java @@ -21,6 +21,7 @@ import java.util.*; import java.util.concurrent.*; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.junit.BeforeClass; import org.junit.Test; @@ -29,7 +30,6 @@ import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.*; import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.FBUtilities; diff --git a/test/unit/org/apache/cassandra/Util.java b/test/unit/org/apache/cassandra/Util.java index fd53170c32c5..2d5e6fc36a51 100644 --- a/test/unit/org/apache/cassandra/Util.java +++ b/test/unit/org/apache/cassandra/Util.java @@ -49,7 +49,7 @@ import org.apache.cassandra.gms.Gossiper; import org.apache.cassandra.gms.VersionedValue; import org.apache.cassandra.io.sstable.Descriptor; -import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.io.util.DataOutputBuffer; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.ByteBufferUtil; diff --git a/test/unit/org/apache/cassandra/cache/AutoSavingCacheTest.java b/test/unit/org/apache/cassandra/cache/AutoSavingCacheTest.java index 3da45555e8f7..c1869b980d42 100644 --- a/test/unit/org/apache/cassandra/cache/AutoSavingCacheTest.java +++ b/test/unit/org/apache/cassandra/cache/AutoSavingCacheTest.java @@ -17,6 +17,7 @@ */ package org.apache.cassandra.cache; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; @@ -29,7 +30,6 @@ import org.apache.cassandra.db.RowIndexEntry; import org.apache.cassandra.db.Mutation; import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.service.CacheService; import org.apache.cassandra.utils.ByteBufferUtil; diff --git a/test/unit/org/apache/cassandra/db/CleanupTest.java b/test/unit/org/apache/cassandra/db/CleanupTest.java index 213c5b8369d1..21de96f3ec8f 100644 --- a/test/unit/org/apache/cassandra/db/CleanupTest.java +++ b/test/unit/org/apache/cassandra/db/CleanupTest.java @@ -39,7 +39,7 @@ import org.apache.cassandra.dht.BytesToken; import org.apache.cassandra.dht.Range; import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.locator.TokenMetadata; import org.apache.cassandra.service.StorageService; diff --git a/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java b/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java index 386be01accf3..be64a6ff7297 100644 --- a/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java +++ b/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java @@ -43,6 +43,9 @@ import com.google.common.base.Function; import com.google.common.collect.Iterables; import com.google.common.collect.Sets; +import org.apache.cassandra.io.sstable.*; +import org.apache.cassandra.io.sstable.format.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableWriter; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.junit.BeforeClass; @@ -74,12 +77,6 @@ import org.apache.cassandra.dht.IncludingExcludingBounds; import org.apache.cassandra.dht.Range; import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.io.sstable.Component; -import org.apache.cassandra.io.sstable.Descriptor; -import org.apache.cassandra.io.sstable.SSTableDeletingTask; -import org.apache.cassandra.io.sstable.SSTableReader; -import org.apache.cassandra.io.sstable.SSTableSimpleWriter; -import org.apache.cassandra.io.sstable.SSTableWriter; import org.apache.cassandra.io.sstable.metadata.MetadataCollector; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.locator.SimpleStrategy; @@ -1780,12 +1777,12 @@ protected SSTableWriter getWriter() { MetadataCollector collector = new MetadataCollector(cfmeta.comparator); collector.addAncestor(sstable1.descriptor.generation); // add ancestor from previously written sstable - return new SSTableWriter(makeFilename(directory, metadata.ksName, metadata.cfName), - 0, - ActiveRepairService.UNREPAIRED_SSTABLE, - metadata, - StorageService.getPartitioner(), - collector); + return SSTableWriter.create(Descriptor.fromFilename(makeFilename(directory, metadata.ksName, metadata.cfName, DatabaseDescriptor.getSSTableFormat())), + 0L, + ActiveRepairService.UNREPAIRED_SSTABLE, + metadata, + DatabaseDescriptor.getPartitioner(), + collector); } }; writer.newRow(key); @@ -1837,12 +1834,12 @@ protected SSTableWriter getWriter() for (int ancestor : ancestors) collector.addAncestor(ancestor); String file = new Descriptor(directory, ks, cf, 3, Descriptor.Type.TEMP).filenameFor(Component.DATA); - return new SSTableWriter(file, - 0, - ActiveRepairService.UNREPAIRED_SSTABLE, - metadata, - StorageService.getPartitioner(), - collector); + return SSTableWriter.create(Descriptor.fromFilename(file), + 0L, + ActiveRepairService.UNREPAIRED_SSTABLE, + metadata, + StorageService.getPartitioner(), + collector); } }; writer.newRow(key); diff --git a/test/unit/org/apache/cassandra/db/KeyCacheTest.java b/test/unit/org/apache/cassandra/db/KeyCacheTest.java index ad3a6bcfcc3a..629b414dc4cc 100644 --- a/test/unit/org/apache/cassandra/db/KeyCacheTest.java +++ b/test/unit/org/apache/cassandra/db/KeyCacheTest.java @@ -17,7 +17,6 @@ */ package org.apache.cassandra.db; -import java.nio.file.Files; import java.util.HashMap; import java.util.Map; import java.util.Set; @@ -25,6 +24,7 @@ import java.util.concurrent.TimeUnit; import com.google.common.util.concurrent.Uninterruptibles; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -37,7 +37,6 @@ import org.apache.cassandra.db.compaction.CompactionManager; import org.apache.cassandra.db.filter.QueryFilter; import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.service.CacheService; import org.apache.cassandra.service.StorageService; @@ -179,7 +178,7 @@ public void testKeyCache() throws ExecutionException, InterruptedException for (SSTableReader reader : readers) reader.releaseReference(); - Uninterruptibles.sleepUninterruptibly(10, TimeUnit.MILLISECONDS);; + Uninterruptibles.sleepUninterruptibly(10, TimeUnit.MILLISECONDS); while (StorageService.tasks.getActiveCount() + StorageService.tasks.getQueue().size() > 0); // after releasing the reference this should drop to 2 diff --git a/test/unit/org/apache/cassandra/db/KeyspaceTest.java b/test/unit/org/apache/cassandra/db/KeyspaceTest.java index 27a4e20235cf..01038c42901d 100644 --- a/test/unit/org/apache/cassandra/db/KeyspaceTest.java +++ b/test/unit/org/apache/cassandra/db/KeyspaceTest.java @@ -26,6 +26,7 @@ import java.io.IOException; import com.google.common.collect.Iterables; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.commons.lang3.StringUtils; import org.junit.BeforeClass; import org.junit.Test; @@ -49,7 +50,6 @@ import static org.apache.cassandra.Util.expiringColumn; import static org.apache.cassandra.Util.cellname; import org.apache.cassandra.Util; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.utils.ByteBufferUtil; diff --git a/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java b/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java index 2a6b952947c2..d2f63cc6d1ba 100644 --- a/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java +++ b/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java @@ -30,6 +30,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterators; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.junit.BeforeClass; import org.junit.Test; @@ -52,12 +53,10 @@ import org.apache.cassandra.db.marshal.Int32Type; import org.apache.cassandra.db.marshal.IntegerType; import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.io.sstable.metadata.StatsMetadata; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.concurrent.OpOrder; -import org.apache.cassandra.utils.memory.MemtableAllocator; import static org.apache.cassandra.Util.dk; import static org.junit.Assert.assertEquals; diff --git a/test/unit/org/apache/cassandra/db/RowIndexEntryTest.java b/test/unit/org/apache/cassandra/db/RowIndexEntryTest.java index 3282b0a14064..e880d95c3a05 100644 --- a/test/unit/org/apache/cassandra/db/RowIndexEntryTest.java +++ b/test/unit/org/apache/cassandra/db/RowIndexEntryTest.java @@ -28,6 +28,7 @@ import org.apache.cassandra.db.composites.CellNames; import org.apache.cassandra.db.composites.SimpleDenseCellNameType; import org.apache.cassandra.db.marshal.UTF8Type; +import org.apache.cassandra.io.sstable.IndexHelper; import org.apache.cassandra.io.util.DataOutputBuffer; import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.ByteBufferUtil; @@ -39,10 +40,10 @@ public class RowIndexEntryTest extends SchemaLoader @Test public void testSerializedSize() throws IOException { - final RowIndexEntry simple = new RowIndexEntry(123); + final RowIndexEntry simple = new RowIndexEntry<>(123); DataOutputBuffer buffer = new DataOutputBuffer(); - RowIndexEntry.Serializer serializer = new RowIndexEntry.Serializer(new SimpleDenseCellNameType(UTF8Type.instance)); + RowIndexEntry.Serializer serializer = new RowIndexEntry.Serializer(new IndexHelper.IndexInfo.Serializer(new SimpleDenseCellNameType(UTF8Type.instance))); serializer.serialize(simple, buffer); @@ -70,7 +71,7 @@ public void testSerializedSize() throws IOException }}.build(); - RowIndexEntry withIndex = RowIndexEntry.create(0xdeadbeef, DeletionTime.LIVE, columnIndex); + RowIndexEntry withIndex = RowIndexEntry.create(0xdeadbeef, DeletionTime.LIVE, columnIndex); serializer.serialize(withIndex, buffer); Assert.assertEquals(buffer.getLength(), serializer.serializedSize(withIndex)); diff --git a/test/unit/org/apache/cassandra/db/ScrubTest.java b/test/unit/org/apache/cassandra/db/ScrubTest.java index 24a6787f2e1b..814b498ef671 100644 --- a/test/unit/org/apache/cassandra/db/ScrubTest.java +++ b/test/unit/org/apache/cassandra/db/ScrubTest.java @@ -37,6 +37,8 @@ import org.apache.cassandra.db.marshal.UUIDType; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.RequestExecutionException; +import org.apache.cassandra.io.sstable.format.SSTableFormat; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.UUIDGen; import org.apache.commons.lang3.StringUtils; @@ -56,7 +58,6 @@ import org.apache.cassandra.exceptions.WriteTimeoutException; import org.apache.cassandra.io.sstable.Component; import org.apache.cassandra.io.sstable.Descriptor; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.utils.ByteBufferUtil; import static org.apache.cassandra.Util.cellname; @@ -230,7 +231,7 @@ public void testScrubOutOfOrder() throws Exception assert root != null; File rootDir = new File(root); assert rootDir.isDirectory(); - Descriptor desc = new Descriptor(new Descriptor.Version("jb"), rootDir, KEYSPACE, columnFamily, 1, Descriptor.Type.FINAL); + Descriptor desc = new Descriptor("jb", rootDir, KEYSPACE, columnFamily, 1, Descriptor.Type.FINAL, SSTableFormat.Type.LEGACY); CFMetaData metadata = Schema.instance.getCFMetaData(desc.ksname, desc.cfname); try diff --git a/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java b/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java index cd5dc7fffc5d..e6e5d55871fc 100644 --- a/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java @@ -29,6 +29,14 @@ import java.util.List; import java.util.concurrent.ExecutionException; +import org.apache.cassandra.config.KSMetaData; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.io.sstable.format.SSTableReader; +import org.apache.cassandra.locator.SimpleStrategy; +import org.junit.BeforeClass; +import org.junit.After; +import org.junit.Test; + import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; import org.apache.cassandra.config.KSMetaData; @@ -41,9 +49,6 @@ import org.apache.cassandra.dht.Token; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.sstable.SSTableIdentityIterator; -import org.apache.cassandra.io.sstable.SSTableReader; -import org.apache.cassandra.io.sstable.SSTableScanner; -import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.service.ActiveRepairService; import org.apache.cassandra.utils.ByteBufferUtil; @@ -110,7 +115,7 @@ public void antiCompactOne() throws InterruptedException, ExecutionException, IO int nonRepairedKeys = 0; for (SSTableReader sstable : store.getSSTables()) { - SSTableScanner scanner = sstable.getScanner(); + ICompactionScanner scanner = sstable.getScanner(); while (scanner.hasNext()) { SSTableIdentityIterator row = (SSTableIdentityIterator) scanner.next(); @@ -187,7 +192,7 @@ public void antiCompactTen(String compactionStrategy) throws InterruptedExceptio int nonRepairedKeys = 0; for (SSTableReader sstable : store.getSSTables()) { - SSTableScanner scanner = sstable.getScanner(); + ICompactionScanner scanner = sstable.getScanner(); while (scanner.hasNext()) { SSTableIdentityIterator row = (SSTableIdentityIterator) scanner.next(); diff --git a/test/unit/org/apache/cassandra/db/compaction/BlacklistingCompactionsTest.java b/test/unit/org/apache/cassandra/db/compaction/BlacklistingCompactionsTest.java index 85f5330f3cc1..1116c9ea62da 100644 --- a/test/unit/org/apache/cassandra/db/compaction/BlacklistingCompactionsTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/BlacklistingCompactionsTest.java @@ -26,6 +26,7 @@ import java.util.HashSet; import java.util.Set; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.junit.BeforeClass; import org.junit.Test; @@ -34,7 +35,6 @@ import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.*; import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.ByteBufferUtil; diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java index 00923b1f329d..5f87ff36a2a5 100644 --- a/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java @@ -28,6 +28,7 @@ import org.apache.cassandra.db.*; import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.locator.SimpleStrategy; import org.junit.BeforeClass; import org.junit.Test; @@ -35,7 +36,6 @@ import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.cql3.UntypedResultSet; import org.apache.cassandra.db.filter.QueryFilter; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.Util; import static org.junit.Assert.assertEquals; diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java index 5be732e4f986..d6fb0ee66d0a 100644 --- a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java @@ -30,7 +30,6 @@ import org.apache.cassandra.Util; import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.*; import org.apache.cassandra.db.columniterator.OnDiskAtomIterator; import org.apache.cassandra.db.filter.QueryFilter; @@ -40,14 +39,11 @@ import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.io.sstable.Component; -import org.apache.cassandra.io.sstable.SSTableReader; -import org.apache.cassandra.io.sstable.SSTableScanner; -import org.apache.cassandra.io.sstable.SSTableWriter; -import org.apache.cassandra.io.sstable.metadata.MetadataCollector; +import org.apache.cassandra.io.sstable.*; +import org.apache.cassandra.io.sstable.format.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableWriter; import org.apache.cassandra.io.sstable.metadata.StatsMetadata; import org.apache.cassandra.locator.SimpleStrategy; -import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.Pair; @@ -193,7 +189,7 @@ public void testSuperColumnTombstones() throws ExecutionException, InterruptedEx // check that the shadowed column is gone SSTableReader sstable = cfs.getSSTables().iterator().next(); Range keyRange = new Range(key, sstable.partitioner.getMinimumToken().maxKeyBound()); - SSTableScanner scanner = sstable.getScanner(DataRange.forKeyRange(keyRange)); + ICompactionScanner scanner = sstable.getScanner(DataRange.forKeyRange(keyRange)); OnDiskAtomIterator iter = scanner.next(); assertEquals(key, iter.getKey()); assertTrue(iter.next() instanceof RangeTombstone); @@ -406,12 +402,7 @@ public void testRangeTombstones() throws IOException, ExecutionException, Interr cf.addColumn(Util.column("a", "a", 3)); cf.deletionInfo().add(new RangeTombstone(Util.cellname("0"), Util.cellname("b"), 2, (int) (System.currentTimeMillis()/1000)),cfmeta.comparator); - SSTableWriter writer = new SSTableWriter(cfs.getTempSSTablePath(dir.getDirectoryForNewSSTables()), - 0, - 0, - cfs.metadata, - StorageService.getPartitioner(), - new MetadataCollector(cfs.metadata.comparator)); + SSTableWriter writer = SSTableWriter.create(Descriptor.fromFilename(cfs.getTempSSTablePath(dir.getDirectoryForNewSSTables())), 0, 0, 0); writer.append(Util.dk("0"), cf); @@ -419,12 +410,7 @@ public void testRangeTombstones() throws IOException, ExecutionException, Interr writer.append(Util.dk("3"), cf); cfs.addSSTable(writer.closeAndOpenReader()); - writer = new SSTableWriter(cfs.getTempSSTablePath(dir.getDirectoryForNewSSTables()), - 0, - 0, - cfs.metadata, - StorageService.getPartitioner(), - new MetadataCollector(cfs.metadata.comparator)); + writer = SSTableWriter.create(Descriptor.fromFilename(cfs.getTempSSTablePath(dir.getDirectoryForNewSSTables())), 0, 0, 0); writer.append(Util.dk("0"), cf); writer.append(Util.dk("1"), cf); diff --git a/test/unit/org/apache/cassandra/db/compaction/DateTieredCompactionStrategyTest.java b/test/unit/org/apache/cassandra/db/compaction/DateTieredCompactionStrategyTest.java index eeb98b7dc867..309f43f8dbc9 100644 --- a/test/unit/org/apache/cassandra/db/compaction/DateTieredCompactionStrategyTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/DateTieredCompactionStrategyTest.java @@ -34,9 +34,8 @@ import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.db.Mutation; import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.io.sstable.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.locator.SimpleStrategy; -import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.Pair; import static org.apache.cassandra.db.compaction.DateTieredCompactionStrategy.getBuckets; diff --git a/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java b/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java index 7d79c7634e8f..a999025f34bf 100644 --- a/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java @@ -26,6 +26,7 @@ import java.util.Map; import java.util.UUID; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; @@ -43,7 +44,6 @@ import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.repair.RepairJobDesc; import org.apache.cassandra.repair.Validator; diff --git a/test/unit/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyTest.java b/test/unit/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyTest.java index 56fa7a1e0d8d..962957c37a99 100644 --- a/test/unit/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyTest.java @@ -20,6 +20,7 @@ import java.nio.ByteBuffer; import java.util.*; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.junit.BeforeClass; import org.junit.Test; @@ -28,7 +29,6 @@ import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.*; import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.metrics.RestorableMeter; import org.apache.cassandra.utils.Pair; diff --git a/test/unit/org/apache/cassandra/db/compaction/TTLExpiryTest.java b/test/unit/org/apache/cassandra/db/compaction/TTLExpiryTest.java index f3a693c248ed..636370b9fd69 100644 --- a/test/unit/org/apache/cassandra/db/compaction/TTLExpiryTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/TTLExpiryTest.java @@ -20,6 +20,7 @@ * */ +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; @@ -31,8 +32,6 @@ import org.apache.cassandra.db.*; import org.apache.cassandra.db.columniterator.OnDiskAtomIterator; import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.io.sstable.SSTableReader; -import org.apache.cassandra.io.sstable.SSTableScanner; import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.ByteBufferUtil; import static org.junit.Assert.assertEquals; @@ -148,7 +147,7 @@ public void testNoExpire() throws InterruptedException cfs.enableAutoCompaction(true); assertEquals(1, cfs.getSSTables().size()); SSTableReader sstable = cfs.getSSTables().iterator().next(); - SSTableScanner scanner = sstable.getScanner(DataRange.allData(sstable.partitioner)); + ICompactionScanner scanner = sstable.getScanner(DataRange.allData(sstable.partitioner)); assertTrue(scanner.hasNext()); while(scanner.hasNext()) { diff --git a/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java b/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java index 71145f7b17cc..70ab8ba3fdd6 100644 --- a/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java @@ -21,7 +21,9 @@ import java.io.IOException; import java.util.UUID; +import org.apache.cassandra.io.sstable.format.SSTableFormat; import org.apache.commons.lang3.StringUtils; +import org.junit.Assert; import org.junit.Test; import org.apache.cassandra.db.Directories; @@ -87,11 +89,11 @@ private void testFromFilenameFor(File dir) checkFromFilename(new Descriptor(idxDir, ksname, cfname + Directories.SECONDARY_INDEX_NAME_SEPARATOR + idxName, 5, Descriptor.Type.TEMP), false); // legacy version - checkFromFilename(new Descriptor("ja", dir, ksname, cfname, 1, Descriptor.Type.FINAL), false); + checkFromFilename(new Descriptor("ja", dir, ksname, cfname, 1, Descriptor.Type.FINAL, SSTableFormat.Type.LEGACY), false); // legacy tmp - checkFromFilename(new Descriptor("ja", dir, ksname, cfname, 2, Descriptor.Type.TEMP), false); + checkFromFilename(new Descriptor("ja", dir, ksname, cfname, 2, Descriptor.Type.TEMP, SSTableFormat.Type.LEGACY), false); // legacy secondary index - checkFromFilename(new Descriptor("ja", dir, ksname, cfname + Directories.SECONDARY_INDEX_NAME_SEPARATOR + idxName, 3, Descriptor.Type.FINAL), false); + checkFromFilename(new Descriptor("ja", dir, ksname, cfname + Directories.SECONDARY_INDEX_NAME_SEPARATOR + idxName, 3, Descriptor.Type.FINAL, SSTableFormat.Type.LEGACY), false); } private void checkFromFilename(Descriptor original, boolean skipComponent) @@ -117,4 +119,48 @@ private void checkFromFilename(Descriptor original, boolean skipComponent) assertEquals(Component.DATA.name(), pair.right); } } + + @Test + public void validateNames() + { + + String names[] = { + /*"system-schema_keyspaces-ka-1-CompressionInfo.db", "system-schema_keyspaces-ka-1-Summary.db", + "system-schema_keyspaces-ka-1-Data.db", "system-schema_keyspaces-ka-1-TOC.txt", + "system-schema_keyspaces-ka-1-Digest.sha1", "system-schema_keyspaces-ka-2-CompressionInfo.db", + "system-schema_keyspaces-ka-1-Filter.db", "system-schema_keyspaces-ka-2-Data.db", + "system-schema_keyspaces-ka-1-Index.db", "system-schema_keyspaces-ka-2-Digest.sha1", + "system-schema_keyspaces-ka-1-Statistics.db", + "system-schema_keyspacest-tmp-ka-1-Data.db",*/ + "system-schema_keyspace-ka-1-"+ SSTableFormat.Type.BIG.name+"-Data.db" + }; + + for (String name : names) + { + Descriptor d = Descriptor.fromFilename(name); + } + } + + @Test + public void badNames() + { + String names[] = { + "system-schema_keyspaces-k234a-1-CompressionInfo.db", "system-schema_keyspaces-ka-aa-Summary.db", + "system-schema_keyspaces-XXX-ka-1-Data.db", "system-schema_keyspaces-k", + "system-schema_keyspace-ka-1-AAA-Data.db", "system-schema-keyspace-ka-1-AAA-Data.db" + }; + + for (String name : names) + { + try + { + Descriptor d = Descriptor.fromFilename(name); + Assert.fail(name); + } catch (Throwable e) { + //good + } + } + } + + } diff --git a/test/unit/org/apache/cassandra/io/sstable/IndexSummaryManagerTest.java b/test/unit/org/apache/cassandra/io/sstable/IndexSummaryManagerTest.java index 2d0c40bb373b..2b881354e48b 100644 --- a/test/unit/org/apache/cassandra/io/sstable/IndexSummaryManagerTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/IndexSummaryManagerTest.java @@ -24,6 +24,7 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; diff --git a/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java b/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java index f0767dbb181f..238309553f19 100644 --- a/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java @@ -26,6 +26,10 @@ import java.util.List; import java.util.Set; +import org.apache.cassandra.db.columniterator.OnDiskAtomIterator; +import org.apache.cassandra.io.sstable.format.SSTableFormat; +import org.apache.cassandra.io.sstable.format.SSTableReader; +import org.apache.cassandra.io.sstable.format.Version; import org.junit.BeforeClass; import org.junit.Test; @@ -37,7 +41,6 @@ import org.apache.cassandra.db.DecoratedKey; import org.apache.cassandra.db.DeletionInfo; import org.apache.cassandra.db.Keyspace; -import org.apache.cassandra.db.columniterator.SSTableNamesIterator; import org.apache.cassandra.db.composites.CellNameType; import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.dht.Range; @@ -92,7 +95,7 @@ public static void beforeClass() protected Descriptor getDescriptor(String ver) { File directory = new File(LEGACY_SSTABLE_ROOT + File.separator + ver + File.separator + KSNAME); - return new Descriptor(ver, directory, KSNAME, CFNAME, 0, Descriptor.Type.FINAL); + return new Descriptor(ver, directory, KSNAME, CFNAME, 0, Descriptor.Type.FINAL, SSTableFormat.Type.LEGACY); } /** @@ -119,7 +122,7 @@ public void testStreaming() throws Throwable StorageService.instance.initServer(); for (File version : LEGACY_SSTABLE_ROOT.listFiles()) - if (Descriptor.Version.validate(version.getName()) && new Descriptor.Version(version.getName()).isCompatible()) + if (Version.validate(version.getName()) && SSTableFormat.Type.LEGACY.info.getVersion(version.getName()).isCompatible()) testStreaming(version.getName()); } @@ -144,7 +147,7 @@ private void testStreaming(String version) throws Exception for (String keystring : TEST_DATA) { ByteBuffer key = ByteBufferUtil.bytes(keystring); - SSTableNamesIterator iter = new SSTableNamesIterator(sstable, Util.dk(key), FBUtilities.singleton(Util.cellname(key), type)); + OnDiskAtomIterator iter = sstable.iterator(Util.dk(key), FBUtilities.singleton(Util.cellname(key), type)); ColumnFamily cf = iter.getColumnFamily(); // check not deleted (CASSANDRA-6527) @@ -160,7 +163,7 @@ public void testVersions() throws Throwable for (File version : LEGACY_SSTABLE_ROOT.listFiles()) { - if (Descriptor.Version.validate(version.getName()) && new Descriptor.Version(version.getName()).isCompatible()) + if (Version.validate(version.getName()) && SSTableFormat.Type.LEGACY.info.getVersion(version.getName()).isCompatible()) { notSkipped = true; testVersion(version.getName()); @@ -181,7 +184,7 @@ public void testVersion(String version) throws Throwable ByteBuffer key = ByteBufferUtil.bytes(keystring); // confirm that the bloom filter does not reject any keys/names DecoratedKey dk = reader.partitioner.decorateKey(key); - SSTableNamesIterator iter = new SSTableNamesIterator(reader, dk, FBUtilities.singleton(Util.cellname(key), type)); + OnDiskAtomIterator iter = reader.iterator(dk, FBUtilities.singleton(Util.cellname(key), type)); assert iter.next().name().toByteBuffer().equals(key); } diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableMetadataTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableMetadataTest.java index 7af40fd1dc8e..67d5e0aaf854 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableMetadataTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableMetadataTest.java @@ -27,6 +27,7 @@ import java.util.List; import java.util.concurrent.ExecutionException; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.junit.BeforeClass; import org.junit.Test; diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java index 71eaad82e4f5..46d5801929d2 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java @@ -36,6 +36,7 @@ import com.google.common.collect.Sets; import org.apache.cassandra.cache.CachingOptions; import org.apache.cassandra.config.KSMetaData; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.locator.SimpleStrategy; import org.junit.Assert; import org.junit.BeforeClass; diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableScannerTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableScannerTest.java index d0449478ebfb..0d7d3c910b83 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableScannerTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableScannerTest.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.Collection; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.junit.BeforeClass; import org.junit.Test; @@ -91,7 +92,7 @@ private static void insertRowWithKey(int key) private static void assertScanMatches(SSTableReader sstable, int scanStart, int scanEnd, int expectedStart, int expectedEnd) { - SSTableScanner scanner = sstable.getScanner(new DataRange(boundsFor(scanStart, scanEnd), new IdentityQueryFilter())); + ICompactionScanner scanner = sstable.getScanner(new DataRange(boundsFor(scanStart, scanEnd), new IdentityQueryFilter())); for (int i = expectedStart; i <= expectedEnd; i++) assertEquals(toKey(i), new String(scanner.next().getKey().getKey().array())); assertFalse(scanner.hasNext()); @@ -99,7 +100,7 @@ private static void assertScanMatches(SSTableReader sstable, int scanStart, int private static void assertScanEmpty(SSTableReader sstable, int scanStart, int scanEnd) { - SSTableScanner scanner = sstable.getScanner(new DataRange(boundsFor(scanStart, scanEnd), new IdentityQueryFilter())); + ICompactionScanner scanner = sstable.getScanner(new DataRange(boundsFor(scanStart, scanEnd), new IdentityQueryFilter())); assertFalse(String.format("scan of (%03d, %03d] should be empty", scanStart, scanEnd), scanner.hasNext()); } @@ -121,7 +122,7 @@ public void testSingleDataRange() SSTableReader sstable = store.getSSTables().iterator().next(); // full range scan - SSTableScanner scanner = sstable.getScanner(); + ICompactionScanner scanner = sstable.getScanner(); for (int i = 2; i < 10; i++) assertEquals(toKey(i), new String(scanner.next().getKey().getKey().array())); @@ -185,7 +186,7 @@ public void testMultipleRanges() SSTableReader sstable = store.getSSTables().iterator().next(); // full range scan - SSTableScanner fullScanner = sstable.getScanner(); + ICompactionScanner fullScanner = sstable.getScanner(); assertScanContainsRanges(fullScanner, 2, 9, 102, 109, @@ -315,7 +316,7 @@ public void testSingleKeyMultipleRanges() SSTableReader sstable = store.getSSTables().iterator().next(); // full range scan - SSTableScanner fullScanner = sstable.getScanner(); + ICompactionScanner fullScanner = sstable.getScanner(); assertScanContainsRanges(fullScanner, 205, 205); // scan three ranges separately diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java b/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java index 57c94772fed8..4f3d22a28a05 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java @@ -25,6 +25,9 @@ import org.apache.cassandra.db.*; import org.apache.cassandra.db.columniterator.OnDiskAtomIterator; +import org.apache.cassandra.db.compaction.ICompactionScanner; +import org.apache.cassandra.io.sstable.format.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableWriter; import org.apache.cassandra.service.ActiveRepairService; import org.apache.cassandra.utils.ByteBufferUtil; @@ -81,8 +84,8 @@ public static File tempSSTableFile(String keyspaceName, String cfname, int gener public static void assertContentEquals(SSTableReader lhs, SSTableReader rhs) { - SSTableScanner slhs = lhs.getScanner(); - SSTableScanner srhs = rhs.getScanner(); + ICompactionScanner slhs = lhs.getScanner(); + ICompactionScanner srhs = rhs.getScanner(); while (slhs.hasNext()) { OnDiskAtomIterator ilhs = slhs.next(); @@ -211,7 +214,7 @@ public SSTableReader write(Map entries) throws IOException public SSTableReader write(int expectedSize, Appender appender) throws IOException { File datafile = (dest == null) ? tempSSTableFile(ksname, cfname, generation) : new File(dest.filenameFor(Component.DATA)); - SSTableWriter writer = new SSTableWriter(datafile.getAbsolutePath(), expectedSize); + SSTableWriter writer = SSTableWriter.create(Descriptor.fromFilename(datafile.getAbsolutePath()), expectedSize, ActiveRepairService.UNREPAIRED_SSTABLE, 0); while (appender.append(writer)) { /* pass */ } SSTableReader reader = writer.closeAndOpenReader(); // mark all components for removal diff --git a/test/unit/org/apache/cassandra/io/sstable/metadata/MetadataSerializerTest.java b/test/unit/org/apache/cassandra/io/sstable/metadata/MetadataSerializerTest.java index 7751a51102fc..9cc2d23a7818 100644 --- a/test/unit/org/apache/cassandra/io/sstable/metadata/MetadataSerializerTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/metadata/MetadataSerializerTest.java @@ -75,7 +75,7 @@ public void testSerialization() throws IOException serializer.serialize(originalMetadata, out); } - Descriptor desc = new Descriptor(Descriptor.Version.CURRENT, statsFile.getParentFile(), "", "", 0, Descriptor.Type.FINAL); + Descriptor desc = new Descriptor( statsFile.getParentFile(), "", "", 0, Descriptor.Type.FINAL); try (RandomAccessReader in = RandomAccessReader.open(statsFile)) { Map deserialized = serializer.deserialize(desc, in, EnumSet.allOf(MetadataType.class)); diff --git a/test/unit/org/apache/cassandra/repair/ValidatorTest.java b/test/unit/org/apache/cassandra/repair/ValidatorTest.java index ea462047060a..74d1ad36b459 100644 --- a/test/unit/org/apache/cassandra/repair/ValidatorTest.java +++ b/test/unit/org/apache/cassandra/repair/ValidatorTest.java @@ -22,6 +22,7 @@ import java.security.MessageDigest; import java.util.UUID; +import org.apache.cassandra.io.util.SequentialWriter; import org.junit.After; import org.junit.BeforeClass; import org.junit.Test; @@ -143,7 +144,7 @@ private CompactedRowStub(DecoratedKey key) super(key); } - public RowIndexEntry write(long currentPosition, DataOutputPlus out) throws IOException + public RowIndexEntry write(long currentPosition, SequentialWriter out) throws IOException { throw new UnsupportedOperationException(); } diff --git a/test/unit/org/apache/cassandra/streaming/StreamTransferTaskTest.java b/test/unit/org/apache/cassandra/streaming/StreamTransferTaskTest.java index 5e4e1c572923..d3685d9b5ac3 100644 --- a/test/unit/org/apache/cassandra/streaming/StreamTransferTaskTest.java +++ b/test/unit/org/apache/cassandra/streaming/StreamTransferTaskTest.java @@ -25,6 +25,7 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.junit.BeforeClass; import org.junit.Test; @@ -36,7 +37,6 @@ import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.utils.FBUtilities; diff --git a/test/unit/org/apache/cassandra/streaming/StreamingTransferTest.java b/test/unit/org/apache/cassandra/streaming/StreamingTransferTest.java index b193d9d4d892..6bc68274e66e 100644 --- a/test/unit/org/apache/cassandra/streaming/StreamingTransferTest.java +++ b/test/unit/org/apache/cassandra/streaming/StreamingTransferTest.java @@ -26,6 +26,7 @@ import com.google.common.collect.Iterables; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; @@ -49,7 +50,6 @@ import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.io.sstable.SSTableUtils; import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.service.StorageService; diff --git a/test/unit/org/apache/cassandra/tools/SSTableExportTest.java b/test/unit/org/apache/cassandra/tools/SSTableExportTest.java index f93e1682e9ff..8e3f5cacb8f2 100644 --- a/test/unit/org/apache/cassandra/tools/SSTableExportTest.java +++ b/test/unit/org/apache/cassandra/tools/SSTableExportTest.java @@ -46,8 +46,8 @@ import org.apache.cassandra.db.marshal.UUIDType; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.sstable.Descriptor; -import org.apache.cassandra.io.sstable.SSTableReader; -import org.apache.cassandra.io.sstable.SSTableWriter; +import org.apache.cassandra.io.sstable.format.SSTableReader; +import org.apache.cassandra.io.sstable.format.SSTableWriter; import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.service.ActiveRepairService; import org.apache.cassandra.utils.ByteBufferUtil; @@ -97,7 +97,7 @@ public void testEnumeratekeys() throws IOException { File tempSS = tempSSTableFile(KEYSPACE1, "Standard1"); ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); - SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2); + SSTableWriter writer = SSTableWriter.create(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE, 0); // Add rowA cfamily.addColumn(Util.cellname("colA"), ByteBufferUtil.bytes("valA"), System.currentTimeMillis()); @@ -134,7 +134,7 @@ public void testExportSimpleCf() throws IOException, ParseException { File tempSS = tempSSTableFile(KEYSPACE1, "Standard1"); ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); - SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2); + SSTableWriter writer = SSTableWriter.create(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE, 0); int nowInSec = (int)(System.currentTimeMillis() / 1000) + 42; //live for 42 seconds // Add rowA @@ -191,7 +191,7 @@ public void testRoundTripStandardCf() throws IOException ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore("Standard1"); File tempSS = tempSSTableFile(KEYSPACE1, "Standard1"); ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); - SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2); + SSTableWriter writer = SSTableWriter.create(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE, 0); // Add rowA cfamily.addColumn(Util.cellname("name"), ByteBufferUtil.bytes("val"), System.currentTimeMillis()); @@ -231,7 +231,7 @@ public void testExportCounterCf() throws IOException, ParseException { File tempSS = tempSSTableFile(KEYSPACE1, "Counter1"); ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Counter1"); - SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2); + SSTableWriter writer = SSTableWriter.create(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE, 0); // Add rowA cfamily.addColumn(BufferCounterCell.createLocal(Util.cellname("colA"), 42, System.currentTimeMillis(), Long.MIN_VALUE)); @@ -263,7 +263,7 @@ public void testEscapingDoubleQuotes() throws IOException, ParseException { File tempSS = tempSSTableFile(KEYSPACE1, "ValuesWithQuotes"); ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "ValuesWithQuotes"); - SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2); + SSTableWriter writer = SSTableWriter.create(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE); // Add rowA cfamily.addColumn(new BufferCell(Util.cellname("data"), UTF8Type.instance.fromString("{\"foo\":\"bar\"}"))); @@ -295,7 +295,7 @@ public void testExportColumnsWithMetadata() throws IOException, ParseException { File tempSS = tempSSTableFile(KEYSPACE1, "Standard1"); ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "Standard1"); - SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2); + SSTableWriter writer = SSTableWriter.create(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE); // Add rowA cfamily.addColumn(Util.cellname("colName"), ByteBufferUtil.bytes("val"), System.currentTimeMillis()); @@ -357,7 +357,7 @@ public void testColumnNameEqualToDefaultKeyAlias() throws IOException, ParseExce { File tempSS = tempSSTableFile(KEYSPACE1, "UUIDKeys"); ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "UUIDKeys"); - SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2); + SSTableWriter writer = SSTableWriter.create(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE); // Add a row cfamily.addColumn(column(CFMetaData.DEFAULT_KEY_ALIAS, "not a uuid", 1L)); @@ -387,7 +387,7 @@ public void testAsciiKeyValidator() throws IOException, ParseException { File tempSS = tempSSTableFile(KEYSPACE1, "AsciiKeys"); ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create(KEYSPACE1, "AsciiKeys"); - SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE, 0); + SSTableWriter writer = SSTableWriter.create(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE, 0); // Add a row cfamily.addColumn(column("column", "value", 1L)); diff --git a/test/unit/org/apache/cassandra/tools/SSTableImportTest.java b/test/unit/org/apache/cassandra/tools/SSTableImportTest.java index 01becfe559bb..e2cecb2edd93 100644 --- a/test/unit/org/apache/cassandra/tools/SSTableImportTest.java +++ b/test/unit/org/apache/cassandra/tools/SSTableImportTest.java @@ -31,6 +31,7 @@ import java.net.URI; import java.net.URISyntaxException; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.junit.BeforeClass; import org.hamcrest.Description; import org.hamcrest.Matcher; @@ -59,7 +60,6 @@ import org.apache.cassandra.db.marshal.CounterColumnType; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.sstable.Descriptor; -import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.locator.SimpleStrategy; import org.apache.thrift.TException; diff --git a/tools/cqlstress-example.yaml b/tools/cqlstress-example.yaml index 4dd5e4a90996..3c60c32b2652 100644 --- a/tools/cqlstress-example.yaml +++ b/tools/cqlstress-example.yaml @@ -42,9 +42,10 @@ table_definition: | uid timeuuid, value blob, PRIMARY KEY((name,choice), date, address, dbl, lval, ival, uid) - ) WITH COMPACT STORAGE - AND compaction = { 'class':'LeveledCompactionStrategy' } - AND comment='A table of many types to test wide rows' + ) + WITH compaction = { 'class':'LeveledCompactionStrategy' } +# AND compression = { 'sstable_compression' : '' } +# AND comment='A table of many types to test wide rows' # # Optional meta information on the generated columns in the above table @@ -67,7 +68,7 @@ table_definition: | columnspec: - name: name size: uniform(1..10) - population: uniform(1..1M) # the range of unique values to select for the field (default is 100Billion) + population: uniform(1..10) # the range of unique values to select for the field (default is 100Billion) - name: date cluster: uniform(20..40) - name: lval diff --git a/tools/cqlstress-insanity-example.yaml b/tools/cqlstress-insanity-example.yaml index ea4f97f09e5b..a286625657a3 100644 --- a/tools/cqlstress-insanity-example.yaml +++ b/tools/cqlstress-insanity-example.yaml @@ -41,8 +41,6 @@ table_definition: | fval float, ival int, uid timeuuid, - dates list, - inets set, value blob, PRIMARY KEY((name, choice), date) ) WITH compaction = { 'class':'LeveledCompactionStrategy' } From 35648e8cbdca376e4543a0df2f82d1401a5c2ed9 Mon Sep 17 00:00:00 2001 From: Yuki Morishita Date: Thu, 23 Oct 2014 17:36:30 -0500 Subject: [PATCH 168/557] remove unused import --- .../org/apache/cassandra/io/compress/CompressionMetadata.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java b/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java index 75fdf1b58d26..7f7ab823061d 100644 --- a/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java +++ b/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java @@ -53,7 +53,6 @@ import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.io.util.Memory; import org.apache.cassandra.utils.Pair; -import org.hsqldb.Database; /** * Holds metadata about compressed file From 82e26b217dab3c327bab882be8cc6b8c0c257139 Mon Sep 17 00:00:00 2001 From: Yuki Morishita Date: Fri, 24 Oct 2014 13:47:40 -0500 Subject: [PATCH 169/557] Fix test timeout in CQLSSTableWriterTest Time out is caused by NPE when creating SSTable writer. 3.0 does not have ks and cf names in SSTable file name, when writing SSTable, it has to be under ks/cf directory. --- .../cassandra/io/sstable/CQLSSTableWriterTest.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java b/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java index 5a09586d4beb..250545a088f9 100644 --- a/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java @@ -70,7 +70,7 @@ public void testUnsortedWriter() throws Exception CQLSSTableWriter writer = CQLSSTableWriter.builder() .inDirectory(dataDir) .forTable(schema) - .withPartitioner(StorageService.instance.getPartitioner()) + .withPartitioner(StorageService.getPartitioner()) .using(insert).build(); writer.addRow(0, "test1", 24); @@ -129,16 +129,21 @@ public void testSyncWithinPartition() throws Exception // Check that the write respect the buffer size even if we only insert rows withing the same partition (#7360) // To do that simply, we use a writer with a buffer of 1MB, and write 2 rows in the same partition with a value // > 1MB and validate that this created more than 1 sstable. + String KS = "ks"; + String TABLE = "test"; + File tempdir = Files.createTempDir(); + File dataDir = new File(tempdir.getAbsolutePath() + File.separator + KS + File.separator + TABLE); + assert dataDir.mkdirs(); String schema = "CREATE TABLE ks.test (" + " k int PRIMARY KEY," + " v blob" + ")"; String insert = "INSERT INTO ks.test (k, v) VALUES (?, ?)"; CQLSSTableWriter writer = CQLSSTableWriter.builder() - .inDirectory(tempdir) + .inDirectory(dataDir) .forTable(schema) - .withPartitioner(StorageService.instance.getPartitioner()) + .withPartitioner(StorageService.getPartitioner()) .using(insert) .withBufferSizeInMB(1) .build(); @@ -156,6 +161,6 @@ public boolean accept(File dir, String name) return name.endsWith("-Data.db"); } }; - assert tempdir.list(filterDataFiles).length > 1 : Arrays.toString(tempdir.list(filterDataFiles)); + assert dataDir.list(filterDataFiles).length > 1 : Arrays.toString(dataDir.list(filterDataFiles)); } } From 95f96669755b3971c9829ef034948515344cd110 Mon Sep 17 00:00:00 2001 From: Joshua McKenzie Date: Mon, 27 Oct 2014 16:42:33 -0500 Subject: [PATCH 170/557] fix error from merge --- src/java/org/apache/cassandra/config/DatabaseDescriptor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java index 577ddcba78d7..ceea3ad2031a 100644 --- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java +++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java @@ -126,8 +126,8 @@ public class DatabaseDescriptor } catch (Exception e) { - throw new ExceptionInInitializerError(e.getMessage() + "\nFatal configuration error; unable to start. See log for stacktrace."); JVMStabilityInspector.inspectThrowable(e); + throw new ExceptionInInitializerError(e.getMessage() + "\nFatal configuration error; unable to start. See log for stacktrace."); } } From fbb6b8abfa359be3475ba55912d939096637b8f8 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Thu, 30 Oct 2014 10:49:42 -0500 Subject: [PATCH 171/557] Update CQLSSTableWriter to allow parallel writing of SSTables on the same table within the same JVM Patch by Carl Yeksigian, reviewed by Benjamin Lerer for CASSANDRA-7463 --- .../sstable/AbstractSSTableSimpleWriter.java | 12 ++- .../io/sstable/CQLSSTableWriter.java | 41 ++++---- .../io/sstable/CQLSSTableWriterTest.java | 93 +++++++++++++++++++ 3 files changed, 127 insertions(+), 19 deletions(-) diff --git a/src/java/org/apache/cassandra/io/sstable/AbstractSSTableSimpleWriter.java b/src/java/org/apache/cassandra/io/sstable/AbstractSSTableSimpleWriter.java index 11d6d5ea5909..285430813110 100644 --- a/src/java/org/apache/cassandra/io/sstable/AbstractSSTableSimpleWriter.java +++ b/src/java/org/apache/cassandra/io/sstable/AbstractSSTableSimpleWriter.java @@ -24,6 +24,7 @@ import java.nio.ByteBuffer; import java.util.HashSet; import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.DatabaseDescriptor; @@ -45,6 +46,7 @@ public abstract class AbstractSSTableSimpleWriter implements Closeable protected ByteBuffer currentSuperColumn; protected final CounterId counterid = CounterId.generate(); private SSTableFormat.Type formatType = DatabaseDescriptor.getSSTableFormat(); + protected static AtomicInteger generation = new AtomicInteger(0); public AbstractSSTableSimpleWriter(File directory, CFMetaData metadata, IPartitioner partitioner) @@ -83,9 +85,15 @@ public boolean accept(File dir, String name) return false; } }); - int maxGen = 0; + int maxGen = generation.getAndIncrement(); for (Descriptor desc : existing) - maxGen = Math.max(maxGen, desc.generation); + { + while (desc.generation > maxGen) + { + maxGen = generation.getAndIncrement(); + } + } + return new Descriptor(directory, keyspace, columnFamily, maxGen + 1, Descriptor.Type.TEMP, fmt).filenameFor(Component.DATA); } diff --git a/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java b/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java index f7d467e2ce2c..d4b4eab1a3ae 100644 --- a/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java +++ b/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java @@ -28,6 +28,7 @@ import java.util.Map; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Iterables; import org.apache.cassandra.cql3.statements.*; import org.apache.cassandra.cql3.*; @@ -338,25 +339,31 @@ public Builder forTable(String schema) { try { - this.schema = getStatement(schema, CreateTableStatement.class, "CREATE TABLE").left.getCFMetaData().rebuild(); - - // We need to register the keyspace/table metadata through Schema, otherwise we won't be able to properly - // build the insert statement in using(). - if (Schema.instance.getKSMetaData(this.schema.ksName) == null) - { - KSMetaData ksm = KSMetaData.newKeyspace(this.schema.ksName, - AbstractReplicationStrategy.getClass("org.apache.cassandra.locator.SimpleStrategy"), - ImmutableMap.of("replication_factor", "1"), - true, - Collections.singleton(this.schema)); - Schema.instance.load(ksm); - } - else if (Schema.instance.getCFMetaData(this.schema.ksName, this.schema.cfName) == null) + synchronized (CQLSSTableWriter.class) { - Schema.instance.load(this.schema); - } + this.schema = getStatement(schema, CreateTableStatement.class, "CREATE TABLE").left.getCFMetaData().rebuild(); - return this; + // We need to register the keyspace/table metadata through Schema, otherwise we won't be able to properly + // build the insert statement in using(). + KSMetaData ksm = Schema.instance.getKSMetaData(this.schema.ksName); + if (ksm == null) + { + ksm = KSMetaData.newKeyspace(this.schema.ksName, + AbstractReplicationStrategy.getClass("org.apache.cassandra.locator.SimpleStrategy"), + ImmutableMap.of("replication_factor", "1"), + true, + Collections.singleton(this.schema)); + Schema.instance.load(ksm); + } + else if (Schema.instance.getCFMetaData(this.schema.ksName, this.schema.cfName) == null) + { + Schema.instance.load(this.schema); + ksm = KSMetaData.cloneWith(ksm, Iterables.concat(ksm.cfMetaData().values(), Collections.singleton(this.schema))); + Schema.instance.setKeyspaceDefinition(ksm); + Keyspace.open(ksm.name).initCf(this.schema.cfId, this.schema.cfName, false); + } + return this; + } } catch (RequestValidationException e) { diff --git a/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java b/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java index 250545a088f9..2a41794067bf 100644 --- a/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java @@ -163,4 +163,97 @@ public boolean accept(File dir, String name) }; assert dataDir.list(filterDataFiles).length > 1 : Arrays.toString(dataDir.list(filterDataFiles)); } + + + private static final int NUMBER_WRITES_IN_RUNNABLE = 10; + private class WriterThread extends Thread + { + private final File dataDir; + private final int id; + public volatile Exception exception; + + public WriterThread(File dataDir, int id) + { + this.dataDir = dataDir; + this.id = id; + } + + @Override + public void run() + { + String schema = "CREATE TABLE cql_keyspace.table2 (" + + " k int," + + " v int," + + " PRIMARY KEY (k, v)" + + ")"; + String insert = "INSERT INTO cql_keyspace.table2 (k, v) VALUES (?, ?)"; + CQLSSTableWriter writer = CQLSSTableWriter.builder() + .inDirectory(dataDir) + .forTable(schema) + .withPartitioner(StorageService.instance.getPartitioner()) + .using(insert).build(); + + try + { + for (int i = 0; i < NUMBER_WRITES_IN_RUNNABLE; i++) + { + writer.addRow(id, i); + } + writer.close(); + } + catch (Exception e) + { + exception = e; + } + } + } + + @Test + public void testConcurrentWriters() throws Exception + { + String KS = "cql_keyspace"; + String TABLE = "table2"; + + File tempdir = Files.createTempDir(); + File dataDir = new File(tempdir.getAbsolutePath() + File.separator + KS + File.separator + TABLE); + assert dataDir.mkdirs(); + + WriterThread[] threads = new WriterThread[5]; + for (int i = 0; i < threads.length; i++) + { + WriterThread thread = new WriterThread(dataDir, i); + threads[i] = thread; + thread.start(); + } + + for (WriterThread thread : threads) + { + thread.join(); + assert !thread.isAlive() : "Thread should be dead by now"; + if (thread.exception != null) + { + throw thread.exception; + } + } + + SSTableLoader loader = new SSTableLoader(dataDir, new SSTableLoader.Client() + { + public void init(String keyspace) + { + for (Range range : StorageService.instance.getLocalRanges("cql_keyspace")) + addRangeForEndpoint(range, FBUtilities.getBroadcastAddress()); + setPartitioner(StorageService.getPartitioner()); + } + + public CFMetaData getCFMetaData(String keyspace, String cfName) + { + return Schema.instance.getCFMetaData(keyspace, cfName); + } + }, new OutputHandler.SystemOutput(false, false)); + + loader.stream().get(); + + UntypedResultSet rs = QueryProcessor.processInternal("SELECT * FROM cql_keyspace.table2;"); + assertEquals(threads.length * NUMBER_WRITES_IN_RUNNABLE, rs.size()); + } } From e60a06cc866e5e85d3e58f25b98f8c048d07ad24 Mon Sep 17 00:00:00 2001 From: Marcus Eriksson Date: Tue, 28 Oct 2014 16:30:50 +0100 Subject: [PATCH 172/557] Mark sstables as repaired after full repair Patch by marcuse; reviewed by yukim for CASSANDRA-7586 --- CHANGES.txt | 1 + .../cassandra/db/ColumnFamilyStore.java | 13 ++-- .../db/compaction/CompactionManager.java | 24 ++++++-- .../repair/RepairMessageVerbHandler.java | 23 ++++--- .../messages/AnticompactionRequest.java | 8 +++ .../repair/messages/PrepareMessage.java | 10 ++- .../repair/messages/RepairOption.java | 7 --- .../repair/messages/SyncRequest.java | 11 ++++ .../repair/messages/ValidationRequest.java | 8 +++ .../service/ActiveRepairService.java | 61 +++++++++++-------- .../cassandra/service/StorageService.java | 44 ++++--------- .../LeveledCompactionStrategyTest.java | 2 +- .../cassandra/repair/LocalSyncTaskTest.java | 2 +- 13 files changed, 127 insertions(+), 87 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index db3b0911ad3d..3a8ada2eb8f0 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0 + * Mark sstables as repaired after full repair (CASSANDRA-7586) * Extend Descriptor to include a format value and refactor reader/writer apis (CASSANDRA-7443) * Integrate JMH for microbenchmarks (CASSANDRA-8151) * Keep sstable levels when bootstrapping (CASSANDRA-7460) diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java index 0e3131c554b6..2a61b3920856 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java @@ -2151,8 +2151,9 @@ public void snapshotWithoutFlush(String snapshotName) snapshotWithoutFlush(snapshotName, null); } - public void snapshotWithoutFlush(String snapshotName, Predicate predicate) + public Set snapshotWithoutFlush(String snapshotName, Predicate predicate) { + Set snapshottedSSTables = new HashSet<>(); for (ColumnFamilyStore cfs : concatWithIndexes()) { DataTracker.View currentView = cfs.markCurrentViewReferenced(); @@ -2171,6 +2172,7 @@ public void snapshotWithoutFlush(String snapshotName, Predicate p filesJSONArr.add(ssTable.descriptor.relativeFilenameFor(Component.DATA)); if (logger.isDebugEnabled()) logger.debug("Snapshot for {} keyspace data file {} created in {}", keyspace, ssTable.getFilename(), snapshotDirectory); + snapshottedSSTables.add(ssTable); } writeSnapshotManifest(filesJSONArr, snapshotName); @@ -2180,6 +2182,7 @@ public void snapshotWithoutFlush(String snapshotName, Predicate p SSTableReader.releaseReferences(currentView.sstables); } } + return snapshottedSSTables; } private void writeSnapshotManifest(final JSONArray filesJSONArr, final String snapshotName) @@ -2216,15 +2219,15 @@ public List getSnapshotSSTableReader(String tag) throws IOExcepti * * @param snapshotName the name of the associated with the snapshot */ - public void snapshot(String snapshotName) + public Set snapshot(String snapshotName) { - snapshot(snapshotName, null); + return snapshot(snapshotName, null); } - public void snapshot(String snapshotName, Predicate predicate) + public Set snapshot(String snapshotName, Predicate predicate) { forceBlockingFlush(); - snapshotWithoutFlush(snapshotName, predicate); + return snapshotWithoutFlush(snapshotName, predicate); } public boolean snapshotExists(String snapshotName) diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java index 18ad7ae29735..3ee36cdca449 100644 --- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java +++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java @@ -903,8 +903,11 @@ private void doValidationCompaction(ColumnFamilyStore cfs, Validator validator) if (isSnapshotValidation) { // If there is a snapshot created for the session then read from there. + // note that we populate the parent repair session when creating the snapshot, meaning the sstables in the snapshot are the ones we + // are supposed to validate. sstables = cfs.getSnapshotSSTableReader(snapshotName); + // Computing gcbefore based on the current time wouldn't be very good because we know each replica will execute // this at a different time (that's the whole purpose of repair with snaphsot). So instead we take the creation // time of the snapshot, which should give us roughtly the same time on each replica (roughtly being in that case @@ -915,12 +918,21 @@ private void doValidationCompaction(ColumnFamilyStore cfs, Validator validator) { // flush first so everyone is validating data that is as similar as possible StorageService.instance.forceKeyspaceFlush(cfs.keyspace.getName(), cfs.name); - // we don't mark validating sstables as compacting in DataTracker, so we have to mark them referenced - // instead so they won't be cleaned up if they do get compacted during the validation - if (validator.desc.parentSessionId == null || ActiveRepairService.instance.getParentRepairSession(validator.desc.parentSessionId) == null) - sstables = cfs.markCurrentSSTablesReferenced(); - else - sstables = ActiveRepairService.instance.getParentRepairSession(validator.desc.parentSessionId).getAndReferenceSSTables(cfs.metadata.cfId); + ActiveRepairService.ParentRepairSession prs = ActiveRepairService.instance.getParentRepairSession(validator.desc.parentSessionId); + Set sstablesToValidate = new HashSet<>(); + for (SSTableReader sstable : cfs.getSSTables()) + { + if (new Bounds<>(sstable.first.getToken(), sstable.last.getToken()).intersects(Arrays.asList(validator.desc.range))) + { + if (!prs.isIncremental || !sstable.isRepaired()) + { + sstablesToValidate.add(sstable); + } + } + } + prs.addSSTables(cfs.metadata.cfId, sstablesToValidate); + + sstables = prs.getAndReferenceSSTablesInRange(cfs.metadata.cfId, validator.desc.range); if (validator.gcBefore > 0) gcBefore = validator.gcBefore; diff --git a/src/java/org/apache/cassandra/repair/RepairMessageVerbHandler.java b/src/java/org/apache/cassandra/repair/RepairMessageVerbHandler.java index 2ad8dc2961bd..f9180c28b04d 100644 --- a/src/java/org/apache/cassandra/repair/RepairMessageVerbHandler.java +++ b/src/java/org/apache/cassandra/repair/RepairMessageVerbHandler.java @@ -18,12 +18,18 @@ package org.apache.cassandra.repair; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Set; import java.util.UUID; import java.util.concurrent.Future; import com.google.common.base.Predicate; + +import org.apache.cassandra.dht.Bounds; +import org.apache.cassandra.dht.Range; +import org.apache.cassandra.dht.Token; import org.apache.cassandra.io.sstable.format.SSTableReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,10 +38,7 @@ import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.db.compaction.CompactionManager; -import org.apache.cassandra.dht.Bounds; import org.apache.cassandra.dht.LocalPartitioner; -import org.apache.cassandra.dht.Range; -import org.apache.cassandra.dht.Token; import org.apache.cassandra.net.IVerbHandler; import org.apache.cassandra.net.MessageIn; import org.apache.cassandra.net.MessageOut; @@ -61,6 +64,7 @@ public void doVerb(MessageIn message, int id) { case PREPARE_MESSAGE: PrepareMessage prepareMessage = (PrepareMessage) message.payload; + logger.debug("Preparing, {}", prepareMessage); List columnFamilyStores = new ArrayList<>(prepareMessage.cfIds.size()); for (UUID cfId : prepareMessage.cfIds) { @@ -70,14 +74,16 @@ public void doVerb(MessageIn message, int id) } ActiveRepairService.instance.registerParentRepairSession(prepareMessage.parentRepairSession, columnFamilyStores, - prepareMessage.ranges); + prepareMessage.ranges, + prepareMessage.isIncremental); MessagingService.instance().sendReply(new MessageOut(MessagingService.Verb.INTERNAL_RESPONSE), id, message.from); break; case SNAPSHOT: + logger.debug("Snapshotting {}", desc); ColumnFamilyStore cfs = Keyspace.open(desc.keyspace).getColumnFamilyStore(desc.columnFamily); final Range repairingRange = desc.range; - cfs.snapshot(desc.sessionId.toString(), new Predicate() + Set snapshottedSSSTables = cfs.snapshot(desc.sessionId.toString(), new Predicate() { public boolean apply(SSTableReader sstable) { @@ -86,13 +92,14 @@ public boolean apply(SSTableReader sstable) new Bounds<>(sstable.first.getToken(), sstable.last.getToken()).intersects(Collections.singleton(repairingRange)); } }); - + ActiveRepairService.instance.getParentRepairSession(desc.parentSessionId).addSSTables(cfs.metadata.cfId, snapshottedSSSTables); logger.debug("Enqueuing response to snapshot request {} to {}", desc.sessionId, message.from); MessagingService.instance().sendReply(new MessageOut(MessagingService.Verb.INTERNAL_RESPONSE), id, message.from); break; case VALIDATION_REQUEST: ValidationRequest validationRequest = (ValidationRequest) message.payload; + logger.debug("Validating {}", validationRequest); // trigger read-only compaction ColumnFamilyStore store = Keyspace.open(desc.keyspace).getColumnFamilyStore(desc.columnFamily); @@ -103,7 +110,7 @@ public boolean apply(SSTableReader sstable) case SYNC_REQUEST: // forwarded sync request SyncRequest request = (SyncRequest) message.payload; - + logger.debug("Syncing {}", request); long repairedAt = ActiveRepairService.UNREPAIRED_SSTABLE; if (desc.parentSessionId != null && ActiveRepairService.instance.getParentRepairSession(desc.parentSessionId) != null) repairedAt = ActiveRepairService.instance.getParentRepairSession(desc.parentSessionId).repairedAt; @@ -113,8 +120,8 @@ public boolean apply(SSTableReader sstable) break; case ANTICOMPACTION_REQUEST: - logger.debug("Got anticompaction request"); AnticompactionRequest anticompactionRequest = (AnticompactionRequest) message.payload; + logger.debug("Got anticompaction request {}", anticompactionRequest); try { List> futures = ActiveRepairService.instance.doAntiCompaction(anticompactionRequest.parentRepairSession); diff --git a/src/java/org/apache/cassandra/repair/messages/AnticompactionRequest.java b/src/java/org/apache/cassandra/repair/messages/AnticompactionRequest.java index 34ea5a5bf691..1a13ad1bdb87 100644 --- a/src/java/org/apache/cassandra/repair/messages/AnticompactionRequest.java +++ b/src/java/org/apache/cassandra/repair/messages/AnticompactionRequest.java @@ -53,4 +53,12 @@ public long serializedSize(AnticompactionRequest message, int version) return UUIDSerializer.serializer.serializedSize(message.parentRepairSession, version); } } + + @Override + public String toString() + { + return "AnticompactionRequest{" + + "parentRepairSession=" + parentRepairSession + + "} " + super.toString(); + } } \ No newline at end of file diff --git a/src/java/org/apache/cassandra/repair/messages/PrepareMessage.java b/src/java/org/apache/cassandra/repair/messages/PrepareMessage.java index 56996772cff3..035ccc4f45b1 100644 --- a/src/java/org/apache/cassandra/repair/messages/PrepareMessage.java +++ b/src/java/org/apache/cassandra/repair/messages/PrepareMessage.java @@ -38,13 +38,15 @@ public class PrepareMessage extends RepairMessage public final Collection> ranges; public final UUID parentRepairSession; + public final boolean isIncremental; - public PrepareMessage(UUID parentRepairSession, List cfIds, Collection> ranges) + public PrepareMessage(UUID parentRepairSession, List cfIds, Collection> ranges, boolean isIncremental) { super(Type.PREPARE_MESSAGE, null); this.parentRepairSession = parentRepairSession; this.cfIds = cfIds; this.ranges = ranges; + this.isIncremental = isIncremental; } public static class PrepareMessageSerializer implements MessageSerializer @@ -58,6 +60,7 @@ public void serialize(PrepareMessage message, DataOutputPlus out, int version) t out.writeInt(message.ranges.size()); for (Range r : message.ranges) Range.serializer.serialize(r, out, version); + out.writeBoolean(message.isIncremental); } public PrepareMessage deserialize(DataInput in, int version) throws IOException @@ -71,7 +74,8 @@ public PrepareMessage deserialize(DataInput in, int version) throws IOException List> ranges = new ArrayList<>(rangeCount); for (int i = 0; i < rangeCount; i++) ranges.add((Range) Range.serializer.deserialize(in, version).toTokenBounds()); - return new PrepareMessage(parentRepairSession, cfIds, ranges); + boolean isIncremental = in.readBoolean(); + return new PrepareMessage(parentRepairSession, cfIds, ranges, isIncremental); } public long serializedSize(PrepareMessage message, int version) @@ -85,6 +89,7 @@ public long serializedSize(PrepareMessage message, int version) size += sizes.sizeof(message.ranges.size()); for (Range r : message.ranges) size += Range.serializer.serializedSize(r, version); + size += sizes.sizeof(message.isIncremental); return size; } } @@ -96,6 +101,7 @@ public String toString() "cfIds='" + cfIds + '\'' + ", ranges=" + ranges + ", parentRepairSession=" + parentRepairSession + + ", isIncremental="+isIncremental + '}'; } } diff --git a/src/java/org/apache/cassandra/repair/messages/RepairOption.java b/src/java/org/apache/cassandra/repair/messages/RepairOption.java index ca023658946e..63446e573258 100644 --- a/src/java/org/apache/cassandra/repair/messages/RepairOption.java +++ b/src/java/org/apache/cassandra/repair/messages/RepairOption.java @@ -211,13 +211,6 @@ public static RepairOption parse(Map options, IPartitioner parti public RepairOption(boolean sequential, boolean primaryRange, boolean incremental, int jobThreads, Collection> ranges) { - if (sequential && incremental) - { - String message = "It is not possible to mix sequential repair and incremental repairs."; - logger.error(message); - throw new IllegalArgumentException(message); - } - if (!FBUtilities.isUnix() && sequential) { logger.warn("Snapshot-based repair is not yet supported on Windows. Reverting to parallel repair."); diff --git a/src/java/org/apache/cassandra/repair/messages/SyncRequest.java b/src/java/org/apache/cassandra/repair/messages/SyncRequest.java index e677cd8a2b7f..c4d0ab69062f 100644 --- a/src/java/org/apache/cassandra/repair/messages/SyncRequest.java +++ b/src/java/org/apache/cassandra/repair/messages/SyncRequest.java @@ -92,4 +92,15 @@ public long serializedSize(SyncRequest message, int version) return size; } } + + @Override + public String toString() + { + return "SyncRequest{" + + "initiator=" + initiator + + ", src=" + src + + ", dst=" + dst + + ", ranges=" + ranges + + "} " + super.toString(); + } } diff --git a/src/java/org/apache/cassandra/repair/messages/ValidationRequest.java b/src/java/org/apache/cassandra/repair/messages/ValidationRequest.java index c73b70849378..43bcf230b8c9 100644 --- a/src/java/org/apache/cassandra/repair/messages/ValidationRequest.java +++ b/src/java/org/apache/cassandra/repair/messages/ValidationRequest.java @@ -41,6 +41,14 @@ public ValidationRequest(RepairJobDesc desc, int gcBefore) this.gcBefore = gcBefore; } + @Override + public String toString() + { + return "ValidationRequest{" + + "gcBefore=" + gcBefore + + "} " + super.toString(); + } + @Override public boolean equals(Object o) { diff --git a/src/java/org/apache/cassandra/service/ActiveRepairService.java b/src/java/org/apache/cassandra/service/ActiveRepairService.java index fa354e62b929..08cef5cf1498 100644 --- a/src/java/org/apache/cassandra/service/ActiveRepairService.java +++ b/src/java/org/apache/cassandra/service/ActiveRepairService.java @@ -228,10 +228,10 @@ else if (hosts != null && !hosts.isEmpty()) return neighbors; } - public UUID prepareForRepair(Set endpoints, Collection> ranges, List columnFamilyStores) + public UUID prepareForRepair(Set endpoints, RepairOption options, List columnFamilyStores) { UUID parentRepairSession = UUIDGen.getTimeUUID(); - registerParentRepairSession(parentRepairSession, columnFamilyStores, ranges); + registerParentRepairSession(parentRepairSession, columnFamilyStores, options.getRanges(), options.isIncremental()); final CountDownLatch prepareLatch = new CountDownLatch(endpoints.size()); final AtomicBoolean status = new AtomicBoolean(true); IAsyncCallbackWithFailure callback = new IAsyncCallbackWithFailure() @@ -259,7 +259,7 @@ public void onFailure(InetAddress from) for(InetAddress neighbour : endpoints) { - PrepareMessage message = new PrepareMessage(parentRepairSession, cfIds, ranges); + PrepareMessage message = new PrepareMessage(parentRepairSession, cfIds, options.getRanges(), options.isIncremental()); MessageOut msg = message.createMessage(); MessagingService.instance().sendRRWithFailure(msg, neighbour, callback); } @@ -282,25 +282,9 @@ public void onFailure(InetAddress from) return parentRepairSession; } - public void registerParentRepairSession(UUID parentRepairSession, List columnFamilyStores, Collection> ranges) + public void registerParentRepairSession(UUID parentRepairSession, List columnFamilyStores, Collection> ranges, boolean isIncremental) { - Map> sstablesToRepair = new HashMap<>(); - for (ColumnFamilyStore cfs : columnFamilyStores) - { - Set sstables = new HashSet<>(); - for (SSTableReader sstable : cfs.getSSTables()) - { - if (new Bounds<>(sstable.first.getToken(), sstable.last.getToken()).intersects(ranges)) - { - if (!sstable.isRepaired()) - { - sstables.add(sstable); - } - } - } - sstablesToRepair.put(cfs.metadata.cfId, sstables); - } - parentRepairSessions.put(parentRepairSession, new ParentRepairSession(columnFamilyStores, ranges, sstablesToRepair, System.currentTimeMillis())); + parentRepairSessions.put(parentRepairSession, new ParentRepairSession(columnFamilyStores, ranges, isIncremental, System.currentTimeMillis())); } public void finishParentSession(UUID parentSession, Set neighbors) @@ -379,18 +363,28 @@ public void handleMessage(InetAddress endpoint, RepairMessage message) public static class ParentRepairSession { - public final Map columnFamilyStores = new HashMap<>(); - public final Collection> ranges; - public final Map> sstableMap; + private final Map columnFamilyStores = new HashMap<>(); + private final Collection> ranges; + private final Map> sstableMap = new HashMap<>(); public final long repairedAt; + public final boolean isIncremental; - public ParentRepairSession(List columnFamilyStores, Collection> ranges, Map> sstables, long repairedAt) + public ParentRepairSession(List columnFamilyStores, Collection> ranges, boolean isIncremental, long repairedAt) { for (ColumnFamilyStore cfs : columnFamilyStores) this.columnFamilyStores.put(cfs.metadata.cfId, cfs); this.ranges = ranges; - this.sstableMap = sstables; this.repairedAt = repairedAt; + this.isIncremental = isIncremental; + } + + public void addSSTables(UUID cfId, Set sstables) + { + Set existingSSTables = this.sstableMap.get(cfId); + if (existingSSTables == null) + existingSSTables = new HashSet<>(); + existingSSTables.addAll(sstables); + this.sstableMap.put(cfId, sstables); } public synchronized Collection getAndReferenceSSTables(UUID cfId) @@ -412,5 +406,20 @@ public synchronized Collection getAndReferenceSSTables(UUID cfId) } return sstables; } + + public synchronized Set getAndReferenceSSTablesInRange(UUID cfId, Range range) + { + Collection allSSTables= getAndReferenceSSTables(cfId); + Set sstables = new HashSet<>(); + for (SSTableReader sstable : allSSTables) + { + if (new Bounds<>(sstable.first.getToken(), sstable.last.getToken()).intersects(Arrays.asList(range))) + sstables.add(sstable); + else + sstable.releaseReference(); + } + return sstables; + + } } } diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index a26858a9b63c..ea21f3daf90d 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -2624,14 +2624,6 @@ protected void runMayThrow() throws Exception logger.info(message); sendNotification("repair", message, new int[]{cmd, ActiveRepairService.Status.STARTED.ordinal()}); - if (options.isSequential() && options.isIncremental()) - { - message = "It is not possible to mix sequential repair and incremental repairs."; - logger.error(message); - sendNotification("repair", message, new int[]{cmd, ActiveRepairService.Status.FINISHED.ordinal()}); - return; - } - final Set allNeighbors = new HashSet<>(); Map> rangeToNeighbors = new HashMap<>(); for (Range range : options.getRanges()) @@ -2664,23 +2656,16 @@ protected void runMayThrow() throws Exception } final UUID parentSession; - long repairedAt = ActiveRepairService.UNREPAIRED_SSTABLE; - if (options.isIncremental()) + long repairedAt; + try { - try - { - parentSession = ActiveRepairService.instance.prepareForRepair(allNeighbors, options.getRanges(), columnFamilyStores); - repairedAt = ActiveRepairService.instance.getParentRepairSession(parentSession).repairedAt; - } - catch (Throwable t) - { - sendNotification("repair", String.format("Repair failed with error %s", t.getMessage()), new int[]{cmd, ActiveRepairService.Status.FINISHED.ordinal()}); - return; - } + parentSession = ActiveRepairService.instance.prepareForRepair(allNeighbors, options, columnFamilyStores); + repairedAt = ActiveRepairService.instance.getParentRepairSession(parentSession).repairedAt; } - else + catch (Throwable t) { - parentSession = null; + sendNotification("repair", String.format("Repair failed with error %s", t.getMessage()), new int[]{cmd, ActiveRepairService.Status.FINISHED.ordinal()}); + return; } // Set up RepairJob executor for this repair command. @@ -2736,16 +2721,13 @@ public void onFailure(Throwable t) { public void onSuccess(@Nullable Object result) { - if (options.isIncremental()) + try { - try - { - ActiveRepairService.instance.finishParentSession(parentSession, allNeighbors); - } - catch (Exception e) - { - logger.error("Error in incremental repair", e); - } + ActiveRepairService.instance.finishParentSession(parentSession, allNeighbors); + } + catch (Exception e) + { + logger.error("Error in incremental repair", e); } repairComplete(); } diff --git a/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java b/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java index a999025f34bf..3cd2ea867ec7 100644 --- a/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java @@ -175,7 +175,7 @@ public void testValidationMultipleSSTablePerLevel() throws Exception Range range = new Range<>(Util.token(""), Util.token("")); int gcBefore = keyspace.getColumnFamilyStore(CF_STANDARDDLEVELED).gcBefore(System.currentTimeMillis()); UUID parentRepSession = UUID.randomUUID(); - ActiveRepairService.instance.registerParentRepairSession(parentRepSession, Arrays.asList(cfs), Arrays.asList(range)); + ActiveRepairService.instance.registerParentRepairSession(parentRepSession, Arrays.asList(cfs), Arrays.asList(range), false); RepairJobDesc desc = new RepairJobDesc(parentRepSession, UUID.randomUUID(), KEYSPACE1, CF_STANDARDDLEVELED, range); Validator validator = new Validator(desc, FBUtilities.getBroadcastAddress(), gcBefore); CompactionManager.instance.submitValidation(cfs, validator).get(); diff --git a/test/unit/org/apache/cassandra/repair/LocalSyncTaskTest.java b/test/unit/org/apache/cassandra/repair/LocalSyncTaskTest.java index b3d333a32e0a..1d1133436482 100644 --- a/test/unit/org/apache/cassandra/repair/LocalSyncTaskTest.java +++ b/test/unit/org/apache/cassandra/repair/LocalSyncTaskTest.java @@ -89,7 +89,7 @@ public void testDifference() throws Throwable Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore("Standard1"); - ActiveRepairService.instance.registerParentRepairSession(parentRepairSession, Arrays.asList(cfs), Arrays.asList(range)); + ActiveRepairService.instance.registerParentRepairSession(parentRepairSession, Arrays.asList(cfs), Arrays.asList(range), false); RepairJobDesc desc = new RepairJobDesc(parentRepairSession, UUID.randomUUID(), KEYSPACE1, "Standard1", range); From 8d640fb1494027b4e028141a230db475f8d8caf7 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Mon, 3 Nov 2014 21:16:41 -0500 Subject: [PATCH 173/557] make Flusher a static inner class --- src/java/org/apache/cassandra/transport/Message.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/cassandra/transport/Message.java b/src/java/org/apache/cassandra/transport/Message.java index 9efc42422b59..d89073799b6a 100644 --- a/src/java/org/apache/cassandra/transport/Message.java +++ b/src/java/org/apache/cassandra/transport/Message.java @@ -348,7 +348,7 @@ private FlushItem(ChannelHandlerContext ctx, Object response, Frame sourceFrame) } } - private final class Flusher implements Runnable + private static final class Flusher implements Runnable { final EventLoop eventLoop; final ConcurrentLinkedQueue queued = new ConcurrentLinkedQueue<>(); From 071b8e391f985e5815bcec977079d5529ad41cca Mon Sep 17 00:00:00 2001 From: Marcus Eriksson Date: Tue, 4 Nov 2014 06:20:01 +0100 Subject: [PATCH 174/557] add the right set - followup to CASSANDRA-7586 --- src/java/org/apache/cassandra/service/ActiveRepairService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/cassandra/service/ActiveRepairService.java b/src/java/org/apache/cassandra/service/ActiveRepairService.java index 08cef5cf1498..171b1c7afd5f 100644 --- a/src/java/org/apache/cassandra/service/ActiveRepairService.java +++ b/src/java/org/apache/cassandra/service/ActiveRepairService.java @@ -384,7 +384,7 @@ public void addSSTables(UUID cfId, Set sstables) if (existingSSTables == null) existingSSTables = new HashSet<>(); existingSSTables.addAll(sstables); - this.sstableMap.put(cfId, sstables); + this.sstableMap.put(cfId, existingSSTables); } public synchronized Collection getAndReferenceSSTables(UUID cfId) From ea0cd4caadfb5e8f049376cf2dc1ecfbd7d7ab36 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Tue, 4 Nov 2014 21:55:10 -0500 Subject: [PATCH 175/557] honor the iterator.next() contract for exceptions --- .../db/ArrayBackedSortedColumns.java | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java b/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java index 80c48aa53550..e239122bca22 100644 --- a/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java +++ b/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java @@ -22,12 +22,12 @@ import java.util.Collection; import java.util.Comparator; import java.util.Iterator; +import java.util.NoSuchElementException; import com.google.common.base.Function; import com.google.common.collect.AbstractIterator; import com.google.common.collect.Iterables; -import net.nicoulaj.compilecommand.annotations.Inline; import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.db.composites.CellName; import org.apache.cassandra.db.composites.Composite; @@ -609,8 +609,17 @@ public boolean hasNext() public Cell next() { - shouldCallNext = false; - return cells[idx--]; + try + { + shouldCallNext = false; + return cells[idx--]; + } + catch (ArrayIndexOutOfBoundsException e) + { + NoSuchElementException ne = new NoSuchElementException(e.getMessage()); + ne.initCause(e); + throw ne; + } } public void remove() @@ -642,8 +651,17 @@ public boolean hasNext() public Cell next() { - shouldCallNext = false; - return cells[idx++]; + try + { + shouldCallNext = false; + return cells[idx++]; + } + catch (ArrayIndexOutOfBoundsException e) + { + NoSuchElementException ne = new NoSuchElementException(e.getMessage()); + ne.initCause(e); + throw ne; + } } public void remove() From e369ff69b76b097d5bfb77a11943eedc2a56203c Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Wed, 5 Nov 2014 02:44:17 -0500 Subject: [PATCH 176/557] oops, fix tabs->spaces --- .../org/apache/cassandra/db/ArrayBackedSortedColumns.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java b/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java index e239122bca22..e5a731c7ac8c 100644 --- a/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java +++ b/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java @@ -609,17 +609,17 @@ public boolean hasNext() public Cell next() { - try - { + try + { shouldCallNext = false; return cells[idx--]; - } + } catch (ArrayIndexOutOfBoundsException e) { NoSuchElementException ne = new NoSuchElementException(e.getMessage()); ne.initCause(e); throw ne; - } + } } public void remove() From aa6233aa19fd052a526fb49b7bb78592ff3e148d Mon Sep 17 00:00:00 2001 From: Jake Luciani Date: Wed, 5 Nov 2014 21:04:55 -0500 Subject: [PATCH 177/557] Fix build --- build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.xml b/build.xml index 264203454e22..2cb637e55549 100644 --- a/build.xml +++ b/build.xml @@ -1106,7 +1106,7 @@ - + From a94b173e2c0b2ac230ec55e5f76de288e36d5f74 Mon Sep 17 00:00:00 2001 From: Aleksey Yeschenko Date: Fri, 7 Nov 2014 14:34:33 +0300 Subject: [PATCH 178/557] Isolate Thrift conversion code from schema definition classes patch by Aleksey Yeschenko; reviewed by Sylvain Lebresne for CASSANDRA-8261 --- .../apache/cassandra/config/CFMetaData.java | 260 +------------ .../cassandra/config/ColumnDefinition.java | 63 --- .../apache/cassandra/config/KSMetaData.java | 37 +- .../cassandra/config/TriggerDefinition.java | 38 +- .../cassandra/cql3/statements/CFPropDefs.java | 2 +- .../cql3/statements/PropertyDefinitions.java | 4 +- .../hadoop/AbstractBulkRecordWriter.java | 8 +- .../hadoop/pig/AbstractCassandraStorage.java | 2 +- .../cassandra/thrift/CassandraServer.java | 16 +- .../cassandra/thrift/ThriftConversion.java | 363 +++++++++++++++++- .../apache/cassandra/tools/BulkLoader.java | 2 +- .../cassandra/config/CFMetaDataTest.java | 11 +- .../config/ColumnDefinitionTest.java | 3 +- .../config/DatabaseDescriptorTest.java | 5 +- .../thrift/ThriftValidationTest.java | 6 +- 15 files changed, 413 insertions(+), 407 deletions(-) diff --git a/src/java/org/apache/cassandra/config/CFMetaData.java b/src/java/org/apache/cassandra/config/CFMetaData.java index 12808f1b0df4..a8d528e855ef 100644 --- a/src/java/org/apache/cassandra/config/CFMetaData.java +++ b/src/java/org/apache/cassandra/config/CFMetaData.java @@ -50,10 +50,6 @@ import org.apache.cassandra.io.compress.LZ4Compressor; import org.apache.cassandra.io.sstable.format.Version; import org.apache.cassandra.io.util.FileDataInput; -import org.apache.cassandra.serializers.MarshalException; -import org.apache.cassandra.thrift.CfDef; -import org.apache.cassandra.thrift.CqlResult; -import org.apache.cassandra.thrift.CqlRow; import org.apache.cassandra.tracing.Tracing; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; @@ -444,7 +440,7 @@ public String toString() public CFMetaData compactionStrategyClass(Class prop) {compactionStrategyClass = prop; return this;} public CFMetaData compactionStrategyOptions(Map prop) {compactionStrategyOptions = prop; return this;} public CFMetaData compressionParameters(CompressionParameters prop) {compressionParameters = prop; return this;} - public CFMetaData bloomFilterFpChance(Double prop) {bloomFilterFpChance = prop; return this;} + public CFMetaData bloomFilterFpChance(double prop) {bloomFilterFpChance = prop; return this;} public CFMetaData caching(CachingOptions prop) {caching = prop; return this;} public CFMetaData minIndexInterval(int prop) {minIndexInterval = prop; return this;} public CFMetaData maxIndexInterval(int prop) {maxIndexInterval = prop; return this;} @@ -454,6 +450,7 @@ public String toString() public CFMetaData droppedColumns(Map cols) {droppedColumns = cols; return this;} public CFMetaData triggers(Map prop) {triggers = prop; return this;} public CFMetaData isDense(Boolean prop) {isDense = prop; return this;} + /** * Create new ColumnFamily metadata with generated random ID. * When loading from existing schema, use CFMetaData @@ -467,7 +464,7 @@ public CFMetaData(String keyspace, String name, ColumnFamilyType type, CellNameT this(keyspace, name, type, comp, UUIDGen.getTimeUUID()); } - private CFMetaData(String keyspace, String name, ColumnFamilyType type, CellNameType comp, UUID id) + public CFMetaData(String keyspace, String name, ColumnFamilyType type, CellNameType comp, UUID id) { cfId = id; ksName = keyspace; @@ -493,7 +490,7 @@ public static CFMetaData denseCFMetaData(String keyspace, String name, AbstractT return denseCFMetaData(keyspace, name, comp, null); } - private static AbstractType makeRawAbstractType(AbstractType comparator, AbstractType subComparator) + public static AbstractType makeRawAbstractType(AbstractType comparator, AbstractType subComparator) { return subComparator == null ? comparator : CompositeType.getInstance(Arrays.asList(comparator, subComparator)); } @@ -621,7 +618,7 @@ static CFMetaData copyOpts(CFMetaData newCFMD, CFMetaData oldCFMD) .compactionStrategyClass(oldCFMD.compactionStrategyClass) .compactionStrategyOptions(new HashMap<>(oldCFMD.compactionStrategyOptions)) .compressionParameters(oldCFMD.compressionParameters.copy()) - .bloomFilterFpChance(oldCFMD.bloomFilterFpChance) + .bloomFilterFpChance(oldCFMD.getBloomFilterFpChance()) .caching(oldCFMD.caching) .defaultTimeToLive(oldCFMD.defaultTimeToLive) .minIndexInterval(oldCFMD.minIndexInterval) @@ -680,7 +677,7 @@ public double getReadRepairChance() return readRepairChance; } - public double getDcLocalReadRepair() + public double getDcLocalReadRepairChance() { return dcLocalReadRepairChance; } @@ -691,7 +688,7 @@ public ReadRepairDecision newReadRepairDecision() if (getReadRepairChance() > chance) return ReadRepairDecision.GLOBAL; - if (getDcLocalReadRepair() > chance) + if (getDcLocalReadRepairChance() > chance) return ReadRepairDecision.DC_LOCAL; return ReadRepairDecision.NONE; @@ -886,7 +883,7 @@ public boolean equals(Object o) && Objects.equal(compactionStrategyClass, other.compactionStrategyClass) && Objects.equal(compactionStrategyOptions, other.compactionStrategyOptions) && Objects.equal(compressionParameters, other.compressionParameters) - && Objects.equal(bloomFilterFpChance, other.bloomFilterFpChance) + && Objects.equal(getBloomFilterFpChance(), other.getBloomFilterFpChance()) && Objects.equal(memtableFlushPeriod, other.memtableFlushPeriod) && Objects.equal(caching, other.caching) && Objects.equal(defaultTimeToLive, other.defaultTimeToLive) @@ -919,7 +916,7 @@ public int hashCode() .append(compactionStrategyClass) .append(compactionStrategyOptions) .append(compressionParameters) - .append(bloomFilterFpChance) + .append(getBloomFilterFpChance()) .append(memtableFlushPeriod) .append(caching) .append(defaultTimeToLive) @@ -938,179 +935,6 @@ public AbstractType getValueValidator(CellName cellName) return def == null ? defaultValidator : def.type; } - /** applies implicit defaults to cf definition. useful in updates */ - private static void applyImplicitDefaults(org.apache.cassandra.thrift.CfDef cf_def) - { - if (!cf_def.isSetComment()) - cf_def.setComment(""); - if (!cf_def.isSetMin_compaction_threshold()) - cf_def.setMin_compaction_threshold(CFMetaData.DEFAULT_MIN_COMPACTION_THRESHOLD); - if (!cf_def.isSetMax_compaction_threshold()) - cf_def.setMax_compaction_threshold(CFMetaData.DEFAULT_MAX_COMPACTION_THRESHOLD); - if (cf_def.compaction_strategy == null) - cf_def.compaction_strategy = DEFAULT_COMPACTION_STRATEGY_CLASS.getSimpleName(); - if (cf_def.compaction_strategy_options == null) - cf_def.compaction_strategy_options = Collections.emptyMap(); - if (!cf_def.isSetCompression_options()) - { - cf_def.setCompression_options(new HashMap() - {{ - if (DEFAULT_COMPRESSOR != null) - put(CompressionParameters.SSTABLE_COMPRESSION, DEFAULT_COMPRESSOR); - }}); - } - if (!cf_def.isSetDefault_time_to_live()) - cf_def.setDefault_time_to_live(CFMetaData.DEFAULT_DEFAULT_TIME_TO_LIVE); - if (!cf_def.isSetDclocal_read_repair_chance()) - cf_def.setDclocal_read_repair_chance(CFMetaData.DEFAULT_DCLOCAL_READ_REPAIR_CHANCE); - - // if index_interval was set, use that for the min_index_interval default - if (!cf_def.isSetMin_index_interval()) - { - if (cf_def.isSetIndex_interval()) - cf_def.setMin_index_interval(cf_def.getIndex_interval()); - else - cf_def.setMin_index_interval(CFMetaData.DEFAULT_MIN_INDEX_INTERVAL); - } - if (!cf_def.isSetMax_index_interval()) - { - // ensure the max is at least as large as the min - cf_def.setMax_index_interval(Math.max(cf_def.min_index_interval, CFMetaData.DEFAULT_MAX_INDEX_INTERVAL)); - } - } - - public static CFMetaData fromThrift(CfDef cf_def) throws InvalidRequestException, ConfigurationException - { - return internalFromThrift(cf_def, Collections.emptyList()); - } - - public static CFMetaData fromThriftForUpdate(CfDef cf_def, CFMetaData toUpdate) throws InvalidRequestException, ConfigurationException - { - return internalFromThrift(cf_def, toUpdate.allColumns()); - } - - // Convert a thrift CfDef, given a list of ColumnDefinitions to copy over to the created CFMetadata before the CQL metadata are rebuild - private static CFMetaData internalFromThrift(CfDef cf_def, Collection previousCQLMetadata) throws InvalidRequestException, ConfigurationException - { - ColumnFamilyType cfType = ColumnFamilyType.create(cf_def.column_type); - if (cfType == null) - throw new InvalidRequestException("Invalid column type " + cf_def.column_type); - - applyImplicitDefaults(cf_def); - - try - { - AbstractType rawComparator = TypeParser.parse(cf_def.comparator_type); - AbstractType subComparator = cfType == ColumnFamilyType.Standard - ? null - : cf_def.subcomparator_type == null ? BytesType.instance : TypeParser.parse(cf_def.subcomparator_type); - - AbstractType fullRawComparator = makeRawAbstractType(rawComparator, subComparator); - - AbstractType keyValidator = cf_def.isSetKey_validation_class() ? TypeParser.parse(cf_def.key_validation_class) : null; - - // Convert the REGULAR definitions from the input CfDef - List defs = ColumnDefinition.fromThrift(cf_def.keyspace, cf_def.name, rawComparator, subComparator, cf_def.column_metadata); - - // Add the keyAlias if there is one, since that's on CQL metadata that thrift can actually change (for - // historical reasons) - boolean hasKeyAlias = cf_def.isSetKey_alias() && keyValidator != null && !(keyValidator instanceof CompositeType); - if (hasKeyAlias) - defs.add(ColumnDefinition.partitionKeyDef(cf_def.keyspace, cf_def.name, cf_def.key_alias, keyValidator, null)); - - // Now add any CQL metadata that we want to copy, skipping the keyAlias if there was one - for (ColumnDefinition def : previousCQLMetadata) - { - // isPartOfCellName basically means 'is not just a CQL metadata' - if (def.isPartOfCellName()) - continue; - - if (def.kind == ColumnDefinition.Kind.PARTITION_KEY && hasKeyAlias) - continue; - - defs.add(def); - } - - CellNameType comparator = CellNames.fromAbstractType(fullRawComparator, calculateIsDense(fullRawComparator, defs)); - - UUID cfId = Schema.instance.getId(cf_def.keyspace, cf_def.name); - if (cfId == null) - cfId = UUIDGen.getTimeUUID(); - - CFMetaData newCFMD = new CFMetaData(cf_def.keyspace, cf_def.name, cfType, comparator, cfId); - - newCFMD.addAllColumnDefinitions(defs); - - if (keyValidator != null) - newCFMD.keyValidator(keyValidator); - if (cf_def.isSetGc_grace_seconds()) - newCFMD.gcGraceSeconds(cf_def.gc_grace_seconds); - if (cf_def.isSetMin_compaction_threshold()) - newCFMD.minCompactionThreshold(cf_def.min_compaction_threshold); - if (cf_def.isSetMax_compaction_threshold()) - newCFMD.maxCompactionThreshold(cf_def.max_compaction_threshold); - if (cf_def.isSetCompaction_strategy()) - newCFMD.compactionStrategyClass(createCompactionStrategy(cf_def.compaction_strategy)); - if (cf_def.isSetCompaction_strategy_options()) - newCFMD.compactionStrategyOptions(new HashMap<>(cf_def.compaction_strategy_options)); - if (cf_def.isSetBloom_filter_fp_chance()) - newCFMD.bloomFilterFpChance(cf_def.bloom_filter_fp_chance); - if (cf_def.isSetMemtable_flush_period_in_ms()) - newCFMD.memtableFlushPeriod(cf_def.memtable_flush_period_in_ms); - if (cf_def.isSetCaching() || cf_def.isSetCells_per_row_to_cache()) - newCFMD.caching(CachingOptions.fromThrift(cf_def.caching, cf_def.cells_per_row_to_cache)); - if (cf_def.isSetRead_repair_chance()) - newCFMD.readRepairChance(cf_def.read_repair_chance); - if (cf_def.isSetDefault_time_to_live()) - newCFMD.defaultTimeToLive(cf_def.default_time_to_live); - if (cf_def.isSetDclocal_read_repair_chance()) - newCFMD.dcLocalReadRepairChance(cf_def.dclocal_read_repair_chance); - if (cf_def.isSetMin_index_interval()) - newCFMD.minIndexInterval(cf_def.min_index_interval); - if (cf_def.isSetMax_index_interval()) - newCFMD.maxIndexInterval(cf_def.max_index_interval); - if (cf_def.isSetSpeculative_retry()) - newCFMD.speculativeRetry(SpeculativeRetry.fromString(cf_def.speculative_retry)); - if (cf_def.isSetTriggers()) - newCFMD.triggers(TriggerDefinition.fromThrift(cf_def.triggers)); - - return newCFMD.comment(cf_def.comment) - .defaultValidator(TypeParser.parse(cf_def.default_validation_class)) - .compressionParameters(CompressionParameters.create(cf_def.compression_options)) - .rebuild(); - } - catch (SyntaxException | MarshalException e) - { - throw new ConfigurationException(e.getMessage()); - } - } - - /** - * Create CFMetaData from thrift {@link CqlRow} that contains columns from schema_columnfamilies. - * - * @param columnsRes CqlRow containing columns from schema_columnfamilies. - * @return CFMetaData derived from CqlRow - */ - public static CFMetaData fromThriftCqlRow(CqlRow cf, CqlResult columnsRes) - { - UntypedResultSet.Row cfRow = new UntypedResultSet.Row(convertThriftCqlRow(cf)); - - List> cols = new ArrayList<>(columnsRes.rows.size()); - for (CqlRow row : columnsRes.rows) - cols.add(convertThriftCqlRow(row)); - UntypedResultSet colsRow = UntypedResultSet.create(cols); - - return fromSchemaNoTriggers(cfRow, colsRow); - } - - private static Map convertThriftCqlRow(CqlRow row) - { - Map m = new HashMap<>(); - for (org.apache.cassandra.thrift.Column column : row.getColumns()) - m.put(UTF8Type.instance.getString(column.bufferForName()), column.value); - return m; - } - public void reload() { Row cfDefRow = SystemKeyspace.readSchemaRow(SystemKeyspace.SCHEMA_COLUMNFAMILIES_CF, ksName, cfName); @@ -1158,7 +982,7 @@ void apply(CFMetaData cfm) throws ConfigurationException minCompactionThreshold = cfm.minCompactionThreshold; maxCompactionThreshold = cfm.maxCompactionThreshold; - bloomFilterFpChance = cfm.bloomFilterFpChance; + bloomFilterFpChance = cfm.getBloomFilterFpChance(); caching = cfm.caching; minIndexInterval = cfm.minIndexInterval; maxIndexInterval = cfm.maxIndexInterval; @@ -1276,51 +1100,6 @@ public AbstractCompactionStrategy createCompactionStrategyInstance(ColumnFamilyS } } - // converts CFM to thrift CfDef - public org.apache.cassandra.thrift.CfDef toThrift() - { - org.apache.cassandra.thrift.CfDef def = new org.apache.cassandra.thrift.CfDef(ksName, cfName); - def.setColumn_type(cfType.name()); - - if (isSuper()) - { - def.setComparator_type(comparator.subtype(0).toString()); - def.setSubcomparator_type(comparator.subtype(1).toString()); - } - else - { - def.setComparator_type(comparator.toString()); - } - - def.setComment(Strings.nullToEmpty(comment)); - def.setRead_repair_chance(readRepairChance); - def.setDclocal_read_repair_chance(dcLocalReadRepairChance); - def.setGc_grace_seconds(gcGraceSeconds); - def.setDefault_validation_class(defaultValidator == null ? null : defaultValidator.toString()); - def.setKey_validation_class(keyValidator.toString()); - def.setMin_compaction_threshold(minCompactionThreshold); - def.setMax_compaction_threshold(maxCompactionThreshold); - // We only return the alias if only one is set since thrift don't know about multiple key aliases - if (partitionKeyColumns.size() == 1) - def.setKey_alias(partitionKeyColumns.get(0).name.bytes); - def.setColumn_metadata(ColumnDefinition.toThrift(columnMetadata)); - def.setCompaction_strategy(compactionStrategyClass.getName()); - def.setCompaction_strategy_options(new HashMap<>(compactionStrategyOptions)); - def.setCompression_options(compressionParameters.asThriftOptions()); - if (bloomFilterFpChance != null) - def.setBloom_filter_fp_chance(bloomFilterFpChance); - def.setMin_index_interval(minIndexInterval); - def.setMax_index_interval(maxIndexInterval); - def.setMemtable_flush_period_in_ms(memtableFlushPeriod); - def.setCaching(caching.toThriftCaching()); - def.setCells_per_row_to_cache(caching.toThriftCellsPerRow()); - def.setDefault_time_to_live(defaultTimeToLive); - def.setSpeculative_retry(speculativeRetry.toString()); - def.setTriggers(TriggerDefinition.toThrift(triggers)); - - return def; - } - /** * Returns the ColumnDefinition for {@code name}. */ @@ -1689,7 +1468,7 @@ private void toSchemaNoColumnsNoTriggers(Mutation mutation, long timestamp) adder.add("key_validator", keyValidator.toString()); adder.add("min_compaction_threshold", minCompactionThreshold); adder.add("max_compaction_threshold", maxCompactionThreshold); - adder.add("bloom_filter_fp_chance", bloomFilterFpChance); + adder.add("bloom_filter_fp_chance", getBloomFilterFpChance()); adder.add("memtable_flush_period_in_ms", memtableFlushPeriod); adder.add("caching", caching.toString()); @@ -1713,8 +1492,8 @@ private void toSchemaNoColumnsNoTriggers(Mutation mutation, long timestamp) adder.add("value_alias", compactValueColumn == null ? null : compactValueColumn.name.toString()); } - // Package protected for use by tests - static CFMetaData fromSchemaNoTriggers(UntypedResultSet.Row result, UntypedResultSet serializedColumnDefinitions) + @VisibleForTesting + public static CFMetaData fromSchemaNoTriggers(UntypedResultSet.Row result, UntypedResultSet serializedColumnDefinitions) { try { @@ -1756,8 +1535,6 @@ static CFMetaData fromSchemaNoTriggers(UntypedResultSet.Row result, UntypedResul cfm.maxCompactionThreshold(result.getInt("max_compaction_threshold")); if (result.has("comment")) cfm.comment(result.getString("comment")); - if (result.has("bloom_filter_fp_chance")) - cfm.bloomFilterFpChance(result.getDouble("bloom_filter_fp_chance")); if (result.has("memtable_flush_period_in_ms")) cfm.memtableFlushPeriod(result.getInt("memtable_flush_period_in_ms")); cfm.caching(CachingOptions.fromString(result.getString("caching"))); @@ -1777,6 +1554,11 @@ else if (result.has("index_interval")) if (result.has("max_index_interval")) cfm.maxIndexInterval(result.getInt("max_index_interval")); + if (result.has("bloom_filter_fp_chance")) + cfm.bloomFilterFpChance(result.getDouble("bloom_filter_fp_chance")); + else + cfm.bloomFilterFpChance(cfm.getBloomFilterFpChance()); + /* * The info previously hold by key_aliases, column_aliases and value_alias is now stored in columnMetadata (because 1) this * make more sense and 2) this allow to store indexing information). @@ -1829,7 +1611,7 @@ public void addColumnMetadataFromAliases(List aliases, AbstractType< /** * Deserialize CF metadata from low-level representation * - * @return Thrift-based metadata deserialized from schema + * @return Metadata deserialized from schema */ public static CFMetaData fromSchema(UntypedResultSet.Row result) { @@ -2128,7 +1910,7 @@ private ColumnDefinition addDefaultValueAlias(ColumnDefinition compactValueDef) * information for table just created through thrift, nor for table prior to CASSANDRA-7744, so this * method does its best to infer whether the table is dense or not based on other elements. */ - private static boolean calculateIsDense(AbstractType comparator, Collection defs) + public static boolean calculateIsDense(AbstractType comparator, Collection defs) { /* * As said above, this method is only here because we need to deal with thrift upgrades. @@ -2247,7 +2029,7 @@ public String toString() .append("compactionStrategyClass", compactionStrategyClass) .append("compactionStrategyOptions", compactionStrategyOptions) .append("compressionParameters", compressionParameters.asThriftOptions()) - .append("bloomFilterFpChance", bloomFilterFpChance) + .append("bloomFilterFpChance", getBloomFilterFpChance()) .append("memtableFlushPeriod", memtableFlushPeriod) .append("caching", caching) .append("defaultTimeToLive", defaultTimeToLive) diff --git a/src/java/org/apache/cassandra/config/ColumnDefinition.java b/src/java/org/apache/cassandra/config/ColumnDefinition.java index e52bc7a4a468..3f3ecd557e07 100644 --- a/src/java/org/apache/cassandra/config/ColumnDefinition.java +++ b/src/java/org/apache/cassandra/config/ColumnDefinition.java @@ -22,16 +22,12 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Objects; -import com.google.common.collect.Maps; import org.apache.cassandra.cql3.*; import org.apache.cassandra.db.*; import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.db.marshal.*; -import org.apache.cassandra.serializers.MarshalException; import org.apache.cassandra.exceptions.*; -import org.apache.cassandra.thrift.ColumnDef; -import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; import static org.apache.cassandra.utils.FBUtilities.json; @@ -239,15 +235,6 @@ public boolean isPrimaryKeyColumn() return kind == Kind.PARTITION_KEY || kind == Kind.CLUSTERING_COLUMN; } - public static List toThrift(Map columns) - { - List thriftDefs = new ArrayList<>(columns.size()); - for (ColumnDefinition def : columns.values()) - if (def.kind == ColumnDefinition.Kind.REGULAR) - thriftDefs.add(def.toThrift()); - return thriftDefs; - } - /** * Whether the name of this definition is serialized in the cell nane, i.e. whether * it's not just a non-stored CQL metadata. @@ -257,56 +244,6 @@ public boolean isPartOfCellName() return kind == Kind.REGULAR || kind == Kind.STATIC; } - public ColumnDef toThrift() - { - ColumnDef cd = new ColumnDef(); - - cd.setName(ByteBufferUtil.clone(name.bytes)); - cd.setValidation_class(type.toString()); - cd.setIndex_type(indexType == null ? null : org.apache.cassandra.thrift.IndexType.valueOf(indexType.name())); - cd.setIndex_name(indexName == null ? null : indexName); - cd.setIndex_options(indexOptions == null ? null : Maps.newHashMap(indexOptions)); - - return cd; - } - - public static ColumnDefinition fromThrift(String ksName, String cfName, AbstractType thriftComparator, AbstractType thriftSubcomparator, ColumnDef thriftColumnDef) throws SyntaxException, ConfigurationException - { - // For super columns, the componentIndex is 1 because the ColumnDefinition applies to the column component. - Integer componentIndex = thriftSubcomparator != null ? 1 : null; - AbstractType comparator = thriftSubcomparator == null ? thriftComparator : thriftSubcomparator; - try - { - comparator.validate(thriftColumnDef.name); - } - catch (MarshalException e) - { - throw new ConfigurationException(String.format("Column name %s is not valid for comparator %s", ByteBufferUtil.bytesToHex(thriftColumnDef.name), comparator)); - } - - return new ColumnDefinition(ksName, - cfName, - new ColumnIdentifier(ByteBufferUtil.clone(thriftColumnDef.name), comparator), - TypeParser.parse(thriftColumnDef.validation_class), - thriftColumnDef.index_type == null ? null : IndexType.valueOf(thriftColumnDef.index_type.name()), - thriftColumnDef.index_options, - thriftColumnDef.index_name, - componentIndex, - Kind.REGULAR); - } - - public static List fromThrift(String ksName, String cfName, AbstractType thriftComparator, AbstractType thriftSubcomparator, List thriftDefs) throws SyntaxException, ConfigurationException - { - if (thriftDefs == null) - return Collections.emptyList(); - - List defs = new ArrayList<>(thriftDefs.size()); - for (ColumnDef thriftColumnDef : thriftDefs) - defs.add(fromThrift(ksName, cfName, thriftComparator, thriftSubcomparator, thriftColumnDef)); - - return defs; - } - /** * Drop specified column from the schema using given mutation. * diff --git a/src/java/org/apache/cassandra/config/KSMetaData.java b/src/java/org/apache/cassandra/config/KSMetaData.java index 64ac3ff7e53d..b5ea3ac6f577 100644 --- a/src/java/org/apache/cassandra/config/KSMetaData.java +++ b/src/java/org/apache/cassandra/config/KSMetaData.java @@ -28,8 +28,6 @@ import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.locator.*; import org.apache.cassandra.service.StorageService; -import org.apache.cassandra.thrift.CfDef; -import org.apache.cassandra.thrift.KsDef; import org.apache.cassandra.tracing.Tracing; import static org.apache.cassandra.utils.FBUtilities.*; @@ -44,7 +42,11 @@ public final class KSMetaData public final UTMetaData userTypes; - KSMetaData(String name, Class strategyClass, Map strategyOptions, boolean durableWrites, Iterable cfDefs) + public KSMetaData(String name, + Class strategyClass, + Map strategyOptions, + boolean durableWrites, + Iterable cfDefs) { this(name, strategyClass, strategyOptions, durableWrites, cfDefs, new UTMetaData()); } @@ -173,35 +175,6 @@ public static Map optsWithRF(final Integer rf) return Collections.singletonMap("replication_factor", rf.toString()); } - public static KSMetaData fromThrift(KsDef ksd, CFMetaData... cfDefs) throws ConfigurationException - { - Class cls = AbstractReplicationStrategy.getClass(ksd.strategy_class); - if (cls.equals(LocalStrategy.class)) - throw new ConfigurationException("Unable to use given strategy class: LocalStrategy is reserved for internal use."); - - return new KSMetaData(ksd.name, - cls, - ksd.strategy_options == null ? Collections.emptyMap() : ksd.strategy_options, - ksd.durable_writes, - Arrays.asList(cfDefs)); - } - - public KsDef toThrift() - { - List cfDefs = new ArrayList<>(cfMetaData.size()); - for (CFMetaData cfm : cfMetaData().values()) - { - // Don't expose CF that cannot be correctly handle by thrift; see CASSANDRA-4377 for further details - if (cfm.isThriftCompatible()) - cfDefs.add(cfm.toThrift()); - } - KsDef ksdef = new KsDef(name, strategyClass.getName(), cfDefs); - ksdef.setStrategy_options(strategyOptions); - ksdef.setDurable_writes(durableWrites); - - return ksdef; - } - public Mutation toSchemaUpdate(KSMetaData newState, long modificationTimestamp) { return newState.toSchema(modificationTimestamp); diff --git a/src/java/org/apache/cassandra/config/TriggerDefinition.java b/src/java/org/apache/cassandra/config/TriggerDefinition.java index aaaf631fb0af..df37cbc89b14 100644 --- a/src/java/org/apache/cassandra/config/TriggerDefinition.java +++ b/src/java/org/apache/cassandra/config/TriggerDefinition.java @@ -27,13 +27,12 @@ import org.apache.cassandra.db.*; import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.db.marshal.UTF8Type; -import org.apache.cassandra.thrift.TriggerDef; public class TriggerDefinition { - private static final String TRIGGER_NAME = "trigger_name"; - private static final String TRIGGER_OPTIONS = "trigger_options"; - private static final String CLASS = "class"; + public static final String TRIGGER_NAME = "trigger_name"; + public static final String TRIGGER_OPTIONS = "trigger_options"; + public static final String CLASS = "class"; public final String name; @@ -41,7 +40,7 @@ public class TriggerDefinition // Proper trigger parametrization will be added later. public final String classOption; - TriggerDefinition(String name, String classOption) + public TriggerDefinition(String name, String classOption) { this.name = name; this.classOption = classOption; @@ -105,35 +104,6 @@ public void deleteFromSchema(Mutation mutation, String cfName, long timestamp) cf.addAtom(new RangeTombstone(prefix, prefix.end(), timestamp, ldt)); } - public static TriggerDefinition fromThrift(TriggerDef thriftDef) - { - return new TriggerDefinition(thriftDef.getName(), thriftDef.getOptions().get(CLASS)); - } - - public TriggerDef toThrift() - { - TriggerDef td = new TriggerDef(); - td.setName(name); - td.setOptions(Collections.singletonMap(CLASS, classOption)); - return td; - } - - public static Map fromThrift(List thriftDefs) - { - Map triggerDefinitions = new HashMap<>(); - for (TriggerDef thriftDef : thriftDefs) - triggerDefinitions.put(thriftDef.getName(), fromThrift(thriftDef)); - return triggerDefinitions; - } - - public static List toThrift(Map triggers) - { - List thriftDefs = new ArrayList<>(triggers.size()); - for (TriggerDefinition def : triggers.values()) - thriftDefs.add(def.toThrift()); - return thriftDefs; - } - @Override public boolean equals(Object o) { diff --git a/src/java/org/apache/cassandra/cql3/statements/CFPropDefs.java b/src/java/org/apache/cassandra/cql3/statements/CFPropDefs.java index aee86a818fee..948bc0b9e98b 100644 --- a/src/java/org/apache/cassandra/cql3/statements/CFPropDefs.java +++ b/src/java/org/apache/cassandra/cql3/statements/CFPropDefs.java @@ -171,7 +171,7 @@ public void applyToCFMetadata(CFMetaData cfm) throws ConfigurationException, Syn cfm.comment(getString(KW_COMMENT, "")); cfm.readRepairChance(getDouble(KW_READREPAIRCHANCE, cfm.getReadRepairChance())); - cfm.dcLocalReadRepairChance(getDouble(KW_DCLOCALREADREPAIRCHANCE, cfm.getDcLocalReadRepair())); + cfm.dcLocalReadRepairChance(getDouble(KW_DCLOCALREADREPAIRCHANCE, cfm.getDcLocalReadRepairChance())); cfm.gcGraceSeconds(getInt(KW_GCGRACESECONDS, cfm.getGcGraceSeconds())); int minCompactionThreshold = toInt(KW_MINCOMPACTIONTHRESHOLD, getCompactionOptions().get(KW_MINCOMPACTIONTHRESHOLD), cfm.getMinCompactionThreshold()); int maxCompactionThreshold = toInt(KW_MAXCOMPACTIONTHRESHOLD, getCompactionOptions().get(KW_MAXCOMPACTIONTHRESHOLD), cfm.getMaxCompactionThreshold()); diff --git a/src/java/org/apache/cassandra/cql3/statements/PropertyDefinitions.java b/src/java/org/apache/cassandra/cql3/statements/PropertyDefinitions.java index eb4f0741621c..23cf8e11ea46 100644 --- a/src/java/org/apache/cassandra/cql3/statements/PropertyDefinitions.java +++ b/src/java/org/apache/cassandra/cql3/statements/PropertyDefinitions.java @@ -94,8 +94,8 @@ public Boolean getBoolean(String key, Boolean defaultValue) throws SyntaxExcepti return (value == null) ? defaultValue : value.toLowerCase().matches("(1|true|yes)"); } - // Return a property value, typed as a Double - public Double getDouble(String key, Double defaultValue) throws SyntaxException + // Return a property value, typed as a double + public double getDouble(String key, double defaultValue) throws SyntaxException { String value = getSimple(key); if (value == null) diff --git a/src/java/org/apache/cassandra/hadoop/AbstractBulkRecordWriter.java b/src/java/org/apache/cassandra/hadoop/AbstractBulkRecordWriter.java index 9ec37f408781..d1a70d4fcc83 100644 --- a/src/java/org/apache/cassandra/hadoop/AbstractBulkRecordWriter.java +++ b/src/java/org/apache/cassandra/hadoop/AbstractBulkRecordWriter.java @@ -40,11 +40,7 @@ import org.apache.cassandra.dht.Token; import org.apache.cassandra.io.sstable.SSTableLoader; import org.apache.cassandra.streaming.StreamState; -import org.apache.cassandra.thrift.AuthenticationRequest; -import org.apache.cassandra.thrift.Cassandra; -import org.apache.cassandra.thrift.CfDef; -import org.apache.cassandra.thrift.KsDef; -import org.apache.cassandra.thrift.TokenRange; +import org.apache.cassandra.thrift.*; import org.apache.cassandra.utils.OutputHandler; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.mapreduce.RecordWriter; @@ -220,7 +216,7 @@ public void init(String keyspace) { Map cfs = new HashMap<>(ksDef.cf_defs.size()); for (CfDef cfDef : ksDef.cf_defs) - cfs.put(cfDef.name, CFMetaData.fromThrift(cfDef)); + cfs.put(cfDef.name, ThriftConversion.fromThrift(cfDef)); knownCfs.put(ksDef.name, cfs); } break; diff --git a/src/java/org/apache/cassandra/hadoop/pig/AbstractCassandraStorage.java b/src/java/org/apache/cassandra/hadoop/pig/AbstractCassandraStorage.java index 19c049a93e2e..baef18616eb2 100644 --- a/src/java/org/apache/cassandra/hadoop/pig/AbstractCassandraStorage.java +++ b/src/java/org/apache/cassandra/hadoop/pig/AbstractCassandraStorage.java @@ -777,7 +777,7 @@ protected CFMetaData getCFMetaData(String ks, String cf, Cassandra.Client client for (CfDef cfDef : ksDef.cf_defs) { if (cfDef.name.equalsIgnoreCase(cf)) - return CFMetaData.fromThrift(cfDef); + return ThriftConversion.fromThrift(cfDef); } return null; } diff --git a/src/java/org/apache/cassandra/thrift/CassandraServer.java b/src/java/org/apache/cassandra/thrift/CassandraServer.java index e9301f0e40d5..b7a1f7fc4ae0 100644 --- a/src/java/org/apache/cassandra/thrift/CassandraServer.java +++ b/src/java/org/apache/cassandra/thrift/CassandraServer.java @@ -1124,7 +1124,7 @@ public KsDef describe_keyspace(String keyspaceName) throws NotFoundException, In if (ksm == null) throw new NotFoundException(); - return ksm.toThrift(); + return ThriftConversion.toThrift(ksm); } public List get_range_slices(ColumnParent column_parent, SlicePredicate predicate, KeyRange range, ConsistencyLevel consistency_level) @@ -1186,7 +1186,7 @@ public List get_range_slices(ColumnParent column_parent, SlicePredicat now, filter, bounds, - ThriftConversion.fromThrift(range.row_filter), + ThriftConversion.indexExpressionsFromThrift(range.row_filter), range.count), consistencyLevel); } @@ -1354,7 +1354,7 @@ public List get_indexed_slices(ColumnParent column_parent, IndexClause now, filter, bounds, - ThriftConversion.fromThrift(index_clause.expressions), + ThriftConversion.indexExpressionsFromThrift(index_clause.expressions), index_clause.count); List rows = StorageProxy.getRangeSlice(command, consistencyLevel); @@ -1531,7 +1531,7 @@ public String system_add_column_family(CfDef cf_def) String keyspace = cState.getKeyspace(); cState.hasKeyspaceAccess(keyspace, Permission.CREATE); cf_def.unsetId(); // explicitly ignore any id set by client (Hector likes to set zero) - CFMetaData cfm = CFMetaData.fromThrift(cf_def); + CFMetaData cfm = ThriftConversion.fromThrift(cf_def); CFMetaData.validateCompactionOptions(cfm.compactionStrategyClass, cfm.compactionStrategyOptions); cfm.addDefaultIndexNames(); @@ -1591,7 +1591,7 @@ public String system_add_keyspace(KsDef ks_def) for (CfDef cf_def : ks_def.cf_defs) { cf_def.unsetId(); // explicitly ignore any id set by client (same as system_add_column_family) - CFMetaData cfm = CFMetaData.fromThrift(cf_def); + CFMetaData cfm = ThriftConversion.fromThrift(cf_def); cfm.addDefaultIndexNames(); if (!cfm.getTriggers().isEmpty()) @@ -1599,7 +1599,7 @@ public String system_add_keyspace(KsDef ks_def) cfDefs.add(cfm); } - MigrationManager.announceNewKeyspace(KSMetaData.fromThrift(ks_def, cfDefs.toArray(new CFMetaData[cfDefs.size()]))); + MigrationManager.announceNewKeyspace(ThriftConversion.fromThrift(ks_def, cfDefs.toArray(new CFMetaData[cfDefs.size()]))); return Schema.instance.getVersion().toString(); } catch (RequestValidationException e) @@ -1643,7 +1643,7 @@ public String system_update_keyspace(KsDef ks_def) if (ks_def.getCf_defs() != null && ks_def.getCf_defs().size() > 0) throw new InvalidRequestException("Keyspace update must not contain any table definitions."); - MigrationManager.announceKeyspaceUpdate(KSMetaData.fromThrift(ks_def)); + MigrationManager.announceKeyspaceUpdate(ThriftConversion.fromThrift(ks_def)); return Schema.instance.getVersion().toString(); } catch (RequestValidationException e) @@ -1671,7 +1671,7 @@ public String system_update_column_family(CfDef cf_def) if (!oldCfm.isThriftCompatible()) throw new InvalidRequestException("Cannot modify CQL3 table " + oldCfm.cfName + " as it may break the schema. You should use cqlsh to modify CQL3 tables instead."); - CFMetaData cfm = CFMetaData.fromThriftForUpdate(cf_def, oldCfm); + CFMetaData cfm = ThriftConversion.fromThriftForUpdate(cf_def, oldCfm); CFMetaData.validateCompactionOptions(cfm.compactionStrategyClass, cfm.compactionStrategyOptions); cfm.addDefaultIndexNames(); diff --git a/src/java/org/apache/cassandra/thrift/ThriftConversion.java b/src/java/org/apache/cassandra/thrift/ThriftConversion.java index 2aca45a56f02..b04a091d6f10 100644 --- a/src/java/org/apache/cassandra/thrift/ThriftConversion.java +++ b/src/java/org/apache/cassandra/thrift/ThriftConversion.java @@ -17,16 +17,30 @@ */ package org.apache.cassandra.thrift; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.nio.ByteBuffer; +import java.util.*; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Strings; +import com.google.common.collect.Maps; + +import org.apache.cassandra.cache.CachingOptions; +import org.apache.cassandra.config.*; +import org.apache.cassandra.cql3.ColumnIdentifier; import org.apache.cassandra.cql3.Operator; +import org.apache.cassandra.cql3.UntypedResultSet; +import org.apache.cassandra.db.ColumnFamilyType; import org.apache.cassandra.db.WriteType; -import org.apache.cassandra.exceptions.RequestExecutionException; -import org.apache.cassandra.exceptions.RequestTimeoutException; -import org.apache.cassandra.exceptions.RequestValidationException; -import org.apache.cassandra.exceptions.WriteTimeoutException; +import org.apache.cassandra.db.composites.CellNameType; +import org.apache.cassandra.db.composites.CellNames; +import org.apache.cassandra.db.marshal.*; +import org.apache.cassandra.exceptions.*; +import org.apache.cassandra.io.compress.CompressionParameters; +import org.apache.cassandra.locator.AbstractReplicationStrategy; +import org.apache.cassandra.locator.LocalStrategy; +import org.apache.cassandra.serializers.MarshalException; +import org.apache.cassandra.utils.ByteBufferUtil; +import org.apache.cassandra.utils.UUIDGen; /** * Static utility methods to convert internal structure to and from thrift ones. @@ -113,7 +127,7 @@ else if (wte.writeType == WriteType.CAS) return toe; } - public static List fromThrift(List exprs) + public static List indexExpressionsFromThrift(List exprs) { if (exprs == null) return null; @@ -130,4 +144,337 @@ public static List fromThrift(List cls = AbstractReplicationStrategy.getClass(ksd.strategy_class); + if (cls.equals(LocalStrategy.class)) + throw new ConfigurationException("Unable to use given strategy class: LocalStrategy is reserved for internal use."); + + return new KSMetaData(ksd.name, + cls, + ksd.strategy_options == null ? Collections.emptyMap() : ksd.strategy_options, + ksd.durable_writes, + Arrays.asList(cfDefs)); + } + + public static KsDef toThrift(KSMetaData ksm) + { + List cfDefs = new ArrayList<>(ksm.cfMetaData().size()); + for (CFMetaData cfm : ksm.cfMetaData().values()) + if (cfm.isThriftCompatible()) // Don't expose CF that cannot be correctly handle by thrift; see CASSANDRA-4377 for further details + cfDefs.add(toThrift(cfm)); + + KsDef ksdef = new KsDef(ksm.name, ksm.strategyClass.getName(), cfDefs); + ksdef.setStrategy_options(ksm.strategyOptions); + ksdef.setDurable_writes(ksm.durableWrites); + + return ksdef; + } + + public static CFMetaData fromThrift(CfDef cf_def) + throws org.apache.cassandra.exceptions.InvalidRequestException, ConfigurationException + { + return internalFromThrift(cf_def, Collections.emptyList()); + } + + public static CFMetaData fromThriftForUpdate(CfDef cf_def, CFMetaData toUpdate) + throws org.apache.cassandra.exceptions.InvalidRequestException, ConfigurationException + { + return internalFromThrift(cf_def, toUpdate.allColumns()); + } + + // Convert a thrift CfDef, given a list of ColumnDefinitions to copy over to the created CFMetadata before the CQL metadata are rebuild + private static CFMetaData internalFromThrift(CfDef cf_def, Collection previousCQLMetadata) + throws org.apache.cassandra.exceptions.InvalidRequestException, ConfigurationException + { + ColumnFamilyType cfType = ColumnFamilyType.create(cf_def.column_type); + if (cfType == null) + throw new org.apache.cassandra.exceptions.InvalidRequestException("Invalid column type " + cf_def.column_type); + + applyImplicitDefaults(cf_def); + + try + { + AbstractType rawComparator = TypeParser.parse(cf_def.comparator_type); + AbstractType subComparator = cfType == ColumnFamilyType.Standard + ? null + : cf_def.subcomparator_type == null ? BytesType.instance : TypeParser.parse(cf_def.subcomparator_type); + + AbstractType fullRawComparator = CFMetaData.makeRawAbstractType(rawComparator, subComparator); + + AbstractType keyValidator = cf_def.isSetKey_validation_class() ? TypeParser.parse(cf_def.key_validation_class) : null; + + // Convert the REGULAR definitions from the input CfDef + List defs = fromThrift(cf_def.keyspace, cf_def.name, rawComparator, subComparator, cf_def.column_metadata); + + // Add the keyAlias if there is one, since that's on CQL metadata that thrift can actually change (for + // historical reasons) + boolean hasKeyAlias = cf_def.isSetKey_alias() && keyValidator != null && !(keyValidator instanceof CompositeType); + if (hasKeyAlias) + defs.add(ColumnDefinition.partitionKeyDef(cf_def.keyspace, cf_def.name, cf_def.key_alias, keyValidator, null)); + + // Now add any CQL metadata that we want to copy, skipping the keyAlias if there was one + for (ColumnDefinition def : previousCQLMetadata) + { + // isPartOfCellName basically means 'is not just a CQL metadata' + if (def.isPartOfCellName()) + continue; + + if (def.kind == ColumnDefinition.Kind.PARTITION_KEY && hasKeyAlias) + continue; + + defs.add(def); + } + + CellNameType comparator = CellNames.fromAbstractType(fullRawComparator, CFMetaData.calculateIsDense(fullRawComparator, defs)); + + UUID cfId = Schema.instance.getId(cf_def.keyspace, cf_def.name); + if (cfId == null) + cfId = UUIDGen.getTimeUUID(); + + CFMetaData newCFMD = new CFMetaData(cf_def.keyspace, cf_def.name, cfType, comparator, cfId); + + newCFMD.addAllColumnDefinitions(defs); + + if (keyValidator != null) + newCFMD.keyValidator(keyValidator); + if (cf_def.isSetGc_grace_seconds()) + newCFMD.gcGraceSeconds(cf_def.gc_grace_seconds); + if (cf_def.isSetMin_compaction_threshold()) + newCFMD.minCompactionThreshold(cf_def.min_compaction_threshold); + if (cf_def.isSetMax_compaction_threshold()) + newCFMD.maxCompactionThreshold(cf_def.max_compaction_threshold); + if (cf_def.isSetCompaction_strategy()) + newCFMD.compactionStrategyClass(CFMetaData.createCompactionStrategy(cf_def.compaction_strategy)); + if (cf_def.isSetCompaction_strategy_options()) + newCFMD.compactionStrategyOptions(new HashMap<>(cf_def.compaction_strategy_options)); + if (cf_def.isSetBloom_filter_fp_chance()) + newCFMD.bloomFilterFpChance(cf_def.bloom_filter_fp_chance); + if (cf_def.isSetMemtable_flush_period_in_ms()) + newCFMD.memtableFlushPeriod(cf_def.memtable_flush_period_in_ms); + if (cf_def.isSetCaching() || cf_def.isSetCells_per_row_to_cache()) + newCFMD.caching(CachingOptions.fromThrift(cf_def.caching, cf_def.cells_per_row_to_cache)); + if (cf_def.isSetRead_repair_chance()) + newCFMD.readRepairChance(cf_def.read_repair_chance); + if (cf_def.isSetDefault_time_to_live()) + newCFMD.defaultTimeToLive(cf_def.default_time_to_live); + if (cf_def.isSetDclocal_read_repair_chance()) + newCFMD.dcLocalReadRepairChance(cf_def.dclocal_read_repair_chance); + if (cf_def.isSetMin_index_interval()) + newCFMD.minIndexInterval(cf_def.min_index_interval); + if (cf_def.isSetMax_index_interval()) + newCFMD.maxIndexInterval(cf_def.max_index_interval); + if (cf_def.isSetSpeculative_retry()) + newCFMD.speculativeRetry(CFMetaData.SpeculativeRetry.fromString(cf_def.speculative_retry)); + if (cf_def.isSetTriggers()) + newCFMD.triggers(triggerDefinitionsFromThrift(cf_def.triggers)); + + return newCFMD.comment(cf_def.comment) + .defaultValidator(TypeParser.parse(cf_def.default_validation_class)) + .compressionParameters(CompressionParameters.create(cf_def.compression_options)) + .rebuild(); + } + catch (SyntaxException | MarshalException e) + { + throw new ConfigurationException(e.getMessage()); + } + } + + /** applies implicit defaults to cf definition. useful in updates */ + private static void applyImplicitDefaults(org.apache.cassandra.thrift.CfDef cf_def) + { + if (!cf_def.isSetComment()) + cf_def.setComment(""); + if (!cf_def.isSetMin_compaction_threshold()) + cf_def.setMin_compaction_threshold(CFMetaData.DEFAULT_MIN_COMPACTION_THRESHOLD); + if (!cf_def.isSetMax_compaction_threshold()) + cf_def.setMax_compaction_threshold(CFMetaData.DEFAULT_MAX_COMPACTION_THRESHOLD); + if (cf_def.compaction_strategy == null) + cf_def.compaction_strategy = CFMetaData.DEFAULT_COMPACTION_STRATEGY_CLASS.getSimpleName(); + if (cf_def.compaction_strategy_options == null) + cf_def.compaction_strategy_options = Collections.emptyMap(); + if (!cf_def.isSetCompression_options()) + cf_def.setCompression_options(Collections.singletonMap(CompressionParameters.SSTABLE_COMPRESSION, CFMetaData.DEFAULT_COMPRESSOR)); + if (!cf_def.isSetDefault_time_to_live()) + cf_def.setDefault_time_to_live(CFMetaData.DEFAULT_DEFAULT_TIME_TO_LIVE); + if (!cf_def.isSetDclocal_read_repair_chance()) + cf_def.setDclocal_read_repair_chance(CFMetaData.DEFAULT_DCLOCAL_READ_REPAIR_CHANCE); + + // if index_interval was set, use that for the min_index_interval default + if (!cf_def.isSetMin_index_interval()) + { + if (cf_def.isSetIndex_interval()) + cf_def.setMin_index_interval(cf_def.getIndex_interval()); + else + cf_def.setMin_index_interval(CFMetaData.DEFAULT_MIN_INDEX_INTERVAL); + } + + if (!cf_def.isSetMax_index_interval()) + { + // ensure the max is at least as large as the min + cf_def.setMax_index_interval(Math.max(cf_def.min_index_interval, CFMetaData.DEFAULT_MAX_INDEX_INTERVAL)); + } + } + + /** + * Create CFMetaData from thrift {@link CqlRow} that contains columns from schema_columnfamilies. + * + * @param columnsRes CqlRow containing columns from schema_columnfamilies. + * @return CFMetaData derived from CqlRow + */ + public static CFMetaData fromThriftCqlRow(CqlRow cf, CqlResult columnsRes) + { + UntypedResultSet.Row cfRow = new UntypedResultSet.Row(convertThriftCqlRow(cf)); + + List> cols = new ArrayList<>(columnsRes.rows.size()); + for (CqlRow row : columnsRes.rows) + cols.add(convertThriftCqlRow(row)); + UntypedResultSet colsRow = UntypedResultSet.create(cols); + + return CFMetaData.fromSchemaNoTriggers(cfRow, colsRow); + } + + private static Map convertThriftCqlRow(CqlRow row) + { + Map m = new HashMap<>(); + for (org.apache.cassandra.thrift.Column column : row.getColumns()) + m.put(UTF8Type.instance.getString(column.bufferForName()), column.value); + return m; + } + + public static CfDef toThrift(CFMetaData cfm) + { + CfDef def = new CfDef(cfm.ksName, cfm.cfName); + def.setColumn_type(cfm.cfType.name()); + + if (cfm.isSuper()) + { + def.setComparator_type(cfm.comparator.subtype(0).toString()); + def.setSubcomparator_type(cfm.comparator.subtype(1).toString()); + } + else + { + def.setComparator_type(cfm.comparator.toString()); + } + + def.setComment(Strings.nullToEmpty(cfm.getComment())); + def.setRead_repair_chance(cfm.getReadRepairChance()); + def.setDclocal_read_repair_chance(cfm.getDcLocalReadRepairChance()); + def.setGc_grace_seconds(cfm.getGcGraceSeconds()); + def.setDefault_validation_class(cfm.getDefaultValidator().toString()); + def.setKey_validation_class(cfm.getKeyValidator().toString()); + def.setMin_compaction_threshold(cfm.getMinCompactionThreshold()); + def.setMax_compaction_threshold(cfm.getMaxCompactionThreshold()); + // We only return the alias if only one is set since thrift don't know about multiple key aliases + if (cfm.partitionKeyColumns().size() == 1) + def.setKey_alias(cfm.partitionKeyColumns().get(0).name.bytes); + def.setColumn_metadata(columnDefinitionsToThrift(cfm.allColumns())); + def.setCompaction_strategy(cfm.compactionStrategyClass.getName()); + def.setCompaction_strategy_options(new HashMap<>(cfm.compactionStrategyOptions)); + def.setCompression_options(cfm.compressionParameters.asThriftOptions()); + def.setBloom_filter_fp_chance(cfm.getBloomFilterFpChance()); + def.setMin_index_interval(cfm.getMinIndexInterval()); + def.setMax_index_interval(cfm.getMaxIndexInterval()); + def.setMemtable_flush_period_in_ms(cfm.getMemtableFlushPeriod()); + def.setCaching(cfm.getCaching().toThriftCaching()); + def.setCells_per_row_to_cache(cfm.getCaching().toThriftCellsPerRow()); + def.setDefault_time_to_live(cfm.getDefaultTimeToLive()); + def.setSpeculative_retry(cfm.getSpeculativeRetry().toString()); + def.setTriggers(triggerDefinitionsToThrift(cfm.getTriggers().values())); + + return def; + } + + public static ColumnDefinition fromThrift(String ksName, + String cfName, + AbstractType thriftComparator, + AbstractType thriftSubcomparator, + ColumnDef thriftColumnDef) + throws SyntaxException, ConfigurationException + { + // For super columns, the componentIndex is 1 because the ColumnDefinition applies to the column component. + Integer componentIndex = thriftSubcomparator != null ? 1 : null; + AbstractType comparator = thriftSubcomparator == null ? thriftComparator : thriftSubcomparator; + try + { + comparator.validate(thriftColumnDef.name); + } + catch (MarshalException e) + { + throw new ConfigurationException(String.format("Column name %s is not valid for comparator %s", ByteBufferUtil.bytesToHex(thriftColumnDef.name), comparator)); + } + + return new ColumnDefinition(ksName, + cfName, + new ColumnIdentifier(ByteBufferUtil.clone(thriftColumnDef.name), comparator), + TypeParser.parse(thriftColumnDef.validation_class), + thriftColumnDef.index_type == null ? null : org.apache.cassandra.config.IndexType.valueOf(thriftColumnDef.index_type.name()), + thriftColumnDef.index_options, + thriftColumnDef.index_name, + componentIndex, + ColumnDefinition.Kind.REGULAR); + } + + private static List fromThrift(String ksName, + String cfName, + AbstractType thriftComparator, + AbstractType thriftSubcomparator, + List thriftDefs) + throws SyntaxException, ConfigurationException + { + if (thriftDefs == null) + return Collections.emptyList(); + + List defs = new ArrayList<>(thriftDefs.size()); + for (ColumnDef thriftColumnDef : thriftDefs) + defs.add(fromThrift(ksName, cfName, thriftComparator, thriftSubcomparator, thriftColumnDef)); + + return defs; + } + + @VisibleForTesting + public static ColumnDef toThrift(ColumnDefinition column) + { + ColumnDef cd = new ColumnDef(); + + cd.setName(ByteBufferUtil.clone(column.name.bytes)); + cd.setValidation_class(column.type.toString()); + cd.setIndex_type(column.getIndexType() == null ? null : org.apache.cassandra.thrift.IndexType.valueOf(column.getIndexType().name())); + cd.setIndex_name(column.getIndexName()); + cd.setIndex_options(column.getIndexOptions() == null ? null : Maps.newHashMap(column.getIndexOptions())); + + return cd; + } + + private static List columnDefinitionsToThrift(Collection columns) + { + List thriftDefs = new ArrayList<>(columns.size()); + for (ColumnDefinition def : columns) + if (def.kind == ColumnDefinition.Kind.REGULAR) + thriftDefs.add(ThriftConversion.toThrift(def)); + return thriftDefs; + } + + private static Map triggerDefinitionsFromThrift(List thriftDefs) + { + Map triggerDefinitions = new HashMap<>(); + for (TriggerDef thriftDef : thriftDefs) + triggerDefinitions.put(thriftDef.getName(), + new TriggerDefinition(thriftDef.getName(), thriftDef.getOptions().get(TriggerDefinition.CLASS))); + return triggerDefinitions; + } + + private static List triggerDefinitionsToThrift(Collection triggers) + { + List thriftDefs = new ArrayList<>(triggers.size()); + for (TriggerDefinition def : triggers) + { + TriggerDef td = new TriggerDef(); + td.setName(def.name); + td.setOptions(Collections.singletonMap(TriggerDefinition.CLASS, def.classOption)); + thriftDefs.add(td); + } + return thriftDefs; + } } diff --git a/src/java/org/apache/cassandra/tools/BulkLoader.java b/src/java/org/apache/cassandra/tools/BulkLoader.java index c639480c550a..be3b81065d96 100644 --- a/src/java/org/apache/cassandra/tools/BulkLoader.java +++ b/src/java/org/apache/cassandra/tools/BulkLoader.java @@ -325,7 +325,7 @@ public void init(String keyspace) columnFamily); CqlResult columnsRes = client.execute_cql3_query(ByteBufferUtil.bytes(columnsQuery), Compression.NONE, ConsistencyLevel.ONE); - CFMetaData metadata = CFMetaData.fromThriftCqlRow(row, columnsRes); + CFMetaData metadata = ThriftConversion.fromThriftCqlRow(row, columnsRes); knownCfs.put(metadata.cfName, metadata); } break; diff --git a/test/unit/org/apache/cassandra/config/CFMetaDataTest.java b/test/unit/org/apache/cassandra/config/CFMetaDataTest.java index 2b98da9cb0f0..79f7f38084e6 100644 --- a/test/unit/org/apache/cassandra/config/CFMetaDataTest.java +++ b/test/unit/org/apache/cassandra/config/CFMetaDataTest.java @@ -36,13 +36,12 @@ import org.apache.cassandra.thrift.CfDef; import org.apache.cassandra.thrift.ColumnDef; import org.apache.cassandra.thrift.IndexType; +import org.apache.cassandra.thrift.ThriftConversion; import org.apache.cassandra.utils.ByteBufferUtil; import org.junit.BeforeClass; import org.junit.Test; -import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; public class CFMetaDataTest { @@ -82,14 +81,14 @@ public void testThriftConversion() throws Exception .setName(CF_STANDARD1); // convert Thrift to CFMetaData - CFMetaData cfMetaData = CFMetaData.fromThrift(cfDef); + CFMetaData cfMetaData = ThriftConversion.fromThrift(cfDef); CfDef thriftCfDef = new CfDef(); thriftCfDef.keyspace = KEYSPACE1; thriftCfDef.name = CF_STANDARD1; thriftCfDef.default_validation_class = cfDef.default_validation_class; thriftCfDef.comment = cfDef.comment; - thriftCfDef.column_metadata = new ArrayList(); + thriftCfDef.column_metadata = new ArrayList<>(); for (ColumnDef columnDef : columnDefs) { ColumnDef c = new ColumnDef(); @@ -100,7 +99,7 @@ public void testThriftConversion() throws Exception thriftCfDef.column_metadata.add(c); } - CfDef converted = cfMetaData.toThrift(); + CfDef converted = ThriftConversion.toThrift(cfMetaData); assertEquals(thriftCfDef.keyspace, converted.keyspace); assertEquals(thriftCfDef.name, converted.name); @@ -136,7 +135,7 @@ private void checkInverses(CFMetaData cfm) throws Exception // Test thrift conversion CFMetaData before = cfm; - CFMetaData after = CFMetaData.fromThriftForUpdate(before.toThrift(), before); + CFMetaData after = ThriftConversion.fromThriftForUpdate(ThriftConversion.toThrift(before), before); assert before.equals(after) : String.format("%n%s%n!=%n%s", before, after); // Test schema conversion diff --git a/test/unit/org/apache/cassandra/config/ColumnDefinitionTest.java b/test/unit/org/apache/cassandra/config/ColumnDefinitionTest.java index 890c46c746a0..2bee0c37d245 100644 --- a/test/unit/org/apache/cassandra/config/ColumnDefinitionTest.java +++ b/test/unit/org/apache/cassandra/config/ColumnDefinitionTest.java @@ -25,6 +25,7 @@ import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.db.marshal.*; +import org.apache.cassandra.thrift.ThriftConversion; import org.apache.cassandra.utils.ByteBufferUtil; public class ColumnDefinitionTest @@ -45,7 +46,7 @@ public void testSerializeDeserialize() throws Exception protected void testSerializeDeserialize(CFMetaData cfm, ColumnDefinition cd) throws Exception { - ColumnDefinition newCd = ColumnDefinition.fromThrift(cfm.ksName, cfm.cfName, cfm.comparator.asAbstractType(), null, cd.toThrift()); + ColumnDefinition newCd = ThriftConversion.fromThrift(cfm.ksName, cfm.cfName, cfm.comparator.asAbstractType(), null, ThriftConversion.toThrift(cd)); Assert.assertNotSame(cd, newCd); Assert.assertEquals(cd.hashCode(), newCd.hashCode()); Assert.assertEquals(cd, newCd); diff --git a/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java b/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java index f6d4ad404dd2..edfd7b6af06b 100644 --- a/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java +++ b/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java @@ -29,6 +29,7 @@ import org.apache.cassandra.gms.Gossiper; import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.service.MigrationManager; +import org.apache.cassandra.thrift.ThriftConversion; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -45,7 +46,7 @@ public void testCFMetaDataSerialization() throws ConfigurationException, Invalid { for (CFMetaData cfm : Schema.instance.getKeyspaceMetaData(keyspaceName).values()) { - CFMetaData cfmDupe = CFMetaData.fromThrift(cfm.toThrift()); + CFMetaData cfmDupe = ThriftConversion.fromThrift(ThriftConversion.toThrift(cfm)); assertNotNull(cfmDupe); assertEquals(cfm, cfmDupe); } @@ -58,7 +59,7 @@ public void testKSMetaDataSerialization() throws ConfigurationException for (KSMetaData ksm : Schema.instance.getKeyspaceDefinitions()) { // Not testing round-trip on the KsDef via serDe() because maps - KSMetaData ksmDupe = KSMetaData.fromThrift(ksm.toThrift()); + KSMetaData ksmDupe = ThriftConversion.fromThrift(ThriftConversion.toThrift(ksm)); assertNotNull(ksmDupe); assertEquals(ksm, ksmDupe); } diff --git a/test/unit/org/apache/cassandra/thrift/ThriftValidationTest.java b/test/unit/org/apache/cassandra/thrift/ThriftValidationTest.java index e81dd3d4f169..708c29a4521f 100644 --- a/test/unit/org/apache/cassandra/thrift/ThriftValidationTest.java +++ b/test/unit/org/apache/cassandra/thrift/ThriftValidationTest.java @@ -161,7 +161,7 @@ public void testValidateKsDef() try { - KSMetaData.fromThrift(ks_def).validate(); + ThriftConversion.fromThrift(ks_def).validate(); } catch (ConfigurationException e) { @@ -176,7 +176,7 @@ public void testValidateKsDef() try { - KSMetaData.fromThrift(ks_def).validate(); + ThriftConversion.fromThrift(ks_def).validate(); } catch (ConfigurationException e) { @@ -191,7 +191,7 @@ public void testValidateKsDef() try { - KSMetaData.fromThrift(ks_def).validate(); + ThriftConversion.fromThrift(ks_def).validate(); } catch (ConfigurationException e) { From f44110c7fc2ab43fb4cb8d1ae3ac6aa52dcc8eea Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Sat, 8 Nov 2014 17:29:15 -0500 Subject: [PATCH 179/557] fix some JDK 8 javadoc lint errors --- src/java/org/apache/cassandra/gms/VersionedValue.java | 4 ++-- .../cassandra/hadoop/AbstractColumnFamilyOutputFormat.java | 2 -- .../org/apache/cassandra/hadoop/ColumnFamilyOutputFormat.java | 1 - src/java/org/apache/cassandra/io/IVersionedSerializer.java | 4 ++-- .../org/apache/cassandra/io/compress/CompressionMetadata.java | 2 ++ .../apache/cassandra/io/compress/CompressionParameters.java | 4 ++++ src/java/org/apache/cassandra/io/util/DataOutputBuffer.java | 4 +++- src/java/org/apache/cassandra/io/util/SequentialWriter.java | 4 +++- src/java/org/apache/cassandra/repair/RepairJob.java | 1 + src/java/org/apache/cassandra/repair/RepairSession.java | 3 +++ src/java/org/apache/cassandra/service/CassandraDaemon.java | 2 -- src/java/org/apache/cassandra/utils/memory/SlabAllocator.java | 4 ++-- 12 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/java/org/apache/cassandra/gms/VersionedValue.java b/src/java/org/apache/cassandra/gms/VersionedValue.java index 36c2f0025624..a779982bd21a 100644 --- a/src/java/org/apache/cassandra/gms/VersionedValue.java +++ b/src/java/org/apache/cassandra/gms/VersionedValue.java @@ -43,9 +43,9 @@ * application wants to make available to the rest of the nodes in the cluster. * Whenever a piece of state needs to be disseminated to the rest of cluster wrap * the state in an instance of ApplicationState and add it to the Gossiper. - *

    + *

    * e.g. if we want to disseminate load information for node A do the following: - *

    + *

    * ApplicationState loadState = new ApplicationState(); * Gossiper.instance.addApplicationState("LOAD STATE", loadState); */ diff --git a/src/java/org/apache/cassandra/hadoop/AbstractColumnFamilyOutputFormat.java b/src/java/org/apache/cassandra/hadoop/AbstractColumnFamilyOutputFormat.java index f4963fbfa9d1..f574641a711d 100644 --- a/src/java/org/apache/cassandra/hadoop/AbstractColumnFamilyOutputFormat.java +++ b/src/java/org/apache/cassandra/hadoop/AbstractColumnFamilyOutputFormat.java @@ -67,8 +67,6 @@ public abstract class AbstractColumnFamilyOutputFormat extends OutputForma * * @param context * information about the job - * @throws IOException - * when output should not be attempted */ public void checkOutputSpecs(JobContext context) { diff --git a/src/java/org/apache/cassandra/hadoop/ColumnFamilyOutputFormat.java b/src/java/org/apache/cassandra/hadoop/ColumnFamilyOutputFormat.java index 49aaf996a692..c5489c6adda1 100644 --- a/src/java/org/apache/cassandra/hadoop/ColumnFamilyOutputFormat.java +++ b/src/java/org/apache/cassandra/hadoop/ColumnFamilyOutputFormat.java @@ -60,7 +60,6 @@ public ColumnFamilyRecordWriter getRecordWriter(org.apache.hadoop.fs.FileSystem * @param context * the information about the current task. * @return a {@link RecordWriter} to write the output for the job. - * @throws IOException */ public ColumnFamilyRecordWriter getRecordWriter(final TaskAttemptContext context) throws InterruptedException { diff --git a/src/java/org/apache/cassandra/io/IVersionedSerializer.java b/src/java/org/apache/cassandra/io/IVersionedSerializer.java index 46494e17dc29..2572840fd156 100644 --- a/src/java/org/apache/cassandra/io/IVersionedSerializer.java +++ b/src/java/org/apache/cassandra/io/IVersionedSerializer.java @@ -30,7 +30,7 @@ public interface IVersionedSerializer * @param t type that needs to be serialized * @param out DataOutput into which serialization needs to happen. * @param version protocol version - * @throws java.io.IOException + * @throws java.io.IOException if serialization fails */ public void serialize(T t, DataOutputPlus out, int version) throws IOException; @@ -39,7 +39,7 @@ public interface IVersionedSerializer * @param in DataInput from which deserialization needs to happen. * @param version protocol version * @return the type that was deserialized - * @throws IOException + * @throws IOException if deserialization fails */ public T deserialize(DataInput in, int version) throws IOException; diff --git a/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java b/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java index 7f7ab823061d..35760572eb6c 100644 --- a/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java +++ b/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java @@ -340,6 +340,8 @@ public long chunkOffsetBy(int chunkIndex) /** * Reset the writer so that the next chunk offset written will be the * one of {@code chunkIndex}. + * + * @param chunkIndex the next index to write */ public void resetAndTruncate(int chunkIndex) { diff --git a/src/java/org/apache/cassandra/io/compress/CompressionParameters.java b/src/java/org/apache/cassandra/io/compress/CompressionParameters.java index d3436c0b6260..d94fed49dbb7 100644 --- a/src/java/org/apache/cassandra/io/compress/CompressionParameters.java +++ b/src/java/org/apache/cassandra/io/compress/CompressionParameters.java @@ -225,6 +225,10 @@ private static Map copyOptions(Map implements Runnable * @param session RepairSession that this RepairJob belongs * @param columnFamily name of the ColumnFamily to repair * @param isSequential when true, validation runs sequentially among replica + * @param repairedAt when the repair occurred (millis) * @param taskExecutor Executor to run various repair tasks */ public RepairJob(RepairSession session, diff --git a/src/java/org/apache/cassandra/repair/RepairSession.java b/src/java/org/apache/cassandra/repair/RepairSession.java index 240a21cf8986..c273c4e6c463 100644 --- a/src/java/org/apache/cassandra/repair/RepairSession.java +++ b/src/java/org/apache/cassandra/repair/RepairSession.java @@ -106,10 +106,13 @@ public class RepairSession extends AbstractFuture> implements /** * Create new repair session. * + * @param parentRepairSession the parent sessions id + * @param id this sessions id * @param range range to repair * @param keyspace name of keyspace * @param isSequential true if performing repair on snapshots sequentially * @param endpoints the data centers that should be part of the repair; null for all DCs + * @param repairedAt when the repair occurred (millis) * @param cfnames names of columnfamilies */ public RepairSession(UUID parentRepairSession, diff --git a/src/java/org/apache/cassandra/service/CassandraDaemon.java b/src/java/org/apache/cassandra/service/CassandraDaemon.java index 35db4504088c..e4d262accfb0 100644 --- a/src/java/org/apache/cassandra/service/CassandraDaemon.java +++ b/src/java/org/apache/cassandra/service/CassandraDaemon.java @@ -91,8 +91,6 @@ public CassandraDaemon(boolean runManaged) { * This is a hook for concrete daemons to initialize themselves suitably. * * Subclasses should override this to finish the job (listening on ports, etc.) - * - * @throws IOException */ protected void setup() { diff --git a/src/java/org/apache/cassandra/utils/memory/SlabAllocator.java b/src/java/org/apache/cassandra/utils/memory/SlabAllocator.java index 19334eee8cba..8defd25622cd 100644 --- a/src/java/org/apache/cassandra/utils/memory/SlabAllocator.java +++ b/src/java/org/apache/cassandra/utils/memory/SlabAllocator.java @@ -34,12 +34,12 @@ * The SlabAllocator is a bump-the-pointer allocator that allocates * large (2MB by default) regions and then doles them out to threads that request * slices into the array. - *

    + *

    * The purpose of this class is to combat heap fragmentation in long lived * objects: by ensuring that all allocations with similar lifetimes * only to large regions of contiguous memory, we ensure that large blocks * get freed up at the same time. - *

    + *

    * Otherwise, variable length byte arrays allocated end up * interleaved throughout the heap, and the old generation gets progressively * more fragmented until a stop-the-world compacting collection occurs. From c832a36f25c3b54f2a12a865455368e5243682bd Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Sat, 8 Nov 2014 23:12:04 -0500 Subject: [PATCH 180/557] route sigar's use of log4j thru slf4j --- build.xml | 10 ++++++++-- lib/licenses/log4j-over-slf4j-1.7.2.jar | 20 ++++++++++++++++++++ lib/log4j-over-slf4j-1.7.2.jar | Bin 0 -> 20886 bytes 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 lib/licenses/log4j-over-slf4j-1.7.2.jar create mode 100644 lib/log4j-over-slf4j-1.7.2.jar diff --git a/build.xml b/build.xml index 5eb1955446f6..c4e27a727904 100644 --- a/build.xml +++ b/build.xml @@ -327,6 +327,7 @@ + @@ -335,7 +336,7 @@ - + @@ -374,7 +375,9 @@ - + + + @@ -468,6 +471,7 @@ + @@ -512,6 +516,7 @@ + + diff --git a/lib/licenses/log4j-over-slf4j-1.7.2.jar b/lib/licenses/log4j-over-slf4j-1.7.2.jar new file mode 100644 index 000000000000..dbfc76934318 --- /dev/null +++ b/lib/licenses/log4j-over-slf4j-1.7.2.jar @@ -0,0 +1,20 @@ +Copyright (c) 2004-2008 QOS.ch +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/lib/log4j-over-slf4j-1.7.2.jar b/lib/log4j-over-slf4j-1.7.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..92e61032fac69736915bdd309eebc3277f3628aa GIT binary patch literal 20886 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 literal 0 HcmV?d00001 From d286ac7d072fe0a2672baebb0f95b9c91676e8f7 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Sun, 9 Nov 2014 00:38:09 -0500 Subject: [PATCH 181/557] fix license extension --- .../{log4j-over-slf4j-1.7.2.jar => log4j-over-slf4j-1.7.2.txt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename lib/licenses/{log4j-over-slf4j-1.7.2.jar => log4j-over-slf4j-1.7.2.txt} (100%) diff --git a/lib/licenses/log4j-over-slf4j-1.7.2.jar b/lib/licenses/log4j-over-slf4j-1.7.2.txt similarity index 100% rename from lib/licenses/log4j-over-slf4j-1.7.2.jar rename to lib/licenses/log4j-over-slf4j-1.7.2.txt From f096eb69db2b649daed0c887e74bd24d157b93be Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Tue, 11 Nov 2014 20:32:01 -0500 Subject: [PATCH 182/557] presize collections --- .../apache/cassandra/config/KSMetaData.java | 2 +- .../cassandra/cql3/statements/CFPropDefs.java | 5 +++-- .../cql3/statements/SelectStatement.java | 2 +- src/java/org/apache/cassandra/db/Mutation.java | 2 +- .../cassandra/db/marshal/TypeParser.java | 8 +++----- .../hadoop/AbstractBulkRecordWriter.java | 2 +- .../apache/cassandra/hadoop/ConfigHelper.java | 2 +- .../cassandra/hadoop/cql3/CqlRecordReader.java | 2 +- .../hadoop/pig/AbstractCassandraStorage.java | 2 +- .../cassandra/hadoop/pig/CassandraStorage.java | 2 +- .../io/compress/CompressionMetadata.java | 2 +- .../apache/cassandra/net/MessagingService.java | 18 +++++++++--------- .../repair/messages/RepairOption.java | 8 ++++---- .../cassandra/service/StorageService.java | 4 ++-- 14 files changed, 30 insertions(+), 31 deletions(-) diff --git a/src/java/org/apache/cassandra/config/KSMetaData.java b/src/java/org/apache/cassandra/config/KSMetaData.java index b5ea3ac6f577..f30fe740c3eb 100644 --- a/src/java/org/apache/cassandra/config/KSMetaData.java +++ b/src/java/org/apache/cassandra/config/KSMetaData.java @@ -287,8 +287,8 @@ public static Map deserializeColumnFamilies(Row row) if (row.cf == null) return Collections.emptyMap(); - Map cfms = new HashMap<>(); UntypedResultSet results = QueryProcessor.resultify("SELECT * FROM system.schema_columnfamilies", row); + Map cfms = new HashMap<>(results.size()); for (UntypedResultSet.Row result : results) { CFMetaData cfm = CFMetaData.fromSchema(result); diff --git a/src/java/org/apache/cassandra/cql3/statements/CFPropDefs.java b/src/java/org/apache/cassandra/cql3/statements/CFPropDefs.java index 948bc0b9e98b..d6d3f729111b 100644 --- a/src/java/org/apache/cassandra/cql3/statements/CFPropDefs.java +++ b/src/java/org/apache/cassandra/cql3/statements/CFPropDefs.java @@ -17,6 +17,7 @@ */ package org.apache.cassandra.cql3.statements; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -138,7 +139,7 @@ public Map getCompactionOptions() throws SyntaxException { Map compactionOptions = getMap(KW_COMPACTION); if (compactionOptions == null) - return new HashMap<>(); + return Collections.emptyMap(); return compactionOptions; } @@ -146,7 +147,7 @@ public Map getCompressionOptions() throws SyntaxException { Map compressionOptions = getMap(KW_COMPRESSION); if (compressionOptions == null) - return new HashMap<>(); + return Collections.emptyMap(); return compressionOptions; } public CachingOptions getCachingOptions() throws SyntaxException, ConfigurationException diff --git a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java index 7701cbd0acd4..f2147749b399 100644 --- a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java @@ -1522,7 +1522,7 @@ private Term prepareLimit(VariableSpecifications boundNames) throws InvalidReque private void updateRestrictionsForRelation(SelectStatement stmt, List defs, MultiColumnRelation relation, VariableSpecifications boundNames) throws InvalidRequestException { List restrictedColumns = new ArrayList<>(); - Set seen = new HashSet<>(); + Set seen = new HashSet<>(defs.size()); int previousPosition = -1; for (ColumnDefinition def : defs) diff --git a/src/java/org/apache/cassandra/db/Mutation.java b/src/java/org/apache/cassandra/db/Mutation.java index 8a0a511a75bc..9dd168614263 100644 --- a/src/java/org/apache/cassandra/db/Mutation.java +++ b/src/java/org/apache/cassandra/db/Mutation.java @@ -305,7 +305,7 @@ public Mutation deserialize(DataInput in, int version, ColumnSerializer.Flag fla } else { - modifications = new HashMap(); + modifications = new HashMap(size); for (int i = 0; i < size; ++i) { ColumnFamily cf = deserializeOneCf(in, version, flag); diff --git a/src/java/org/apache/cassandra/db/marshal/TypeParser.java b/src/java/org/apache/cassandra/db/marshal/TypeParser.java index fed6f7ff5e5b..176ea4da022f 100644 --- a/src/java/org/apache/cassandra/db/marshal/TypeParser.java +++ b/src/java/org/apache/cassandra/db/marshal/TypeParser.java @@ -22,13 +22,12 @@ import java.lang.reflect.Method; import java.nio.ByteBuffer; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; -import org.apache.commons.lang3.StringUtils; - import org.apache.cassandra.exceptions.*; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; @@ -121,14 +120,13 @@ public AbstractType parse() throws SyntaxException, ConfigurationException public Map getKeyValueParameters() throws SyntaxException { - Map map = new HashMap(); - if (isEOS()) - return map; + return Collections.emptyMap(); if (str.charAt(idx) != '(') throw new IllegalStateException(); + Map map = new HashMap(); ++idx; // skipping '(' while (skipBlankAndComma()) diff --git a/src/java/org/apache/cassandra/hadoop/AbstractBulkRecordWriter.java b/src/java/org/apache/cassandra/hadoop/AbstractBulkRecordWriter.java index d1a70d4fcc83..136c8dc2fef2 100644 --- a/src/java/org/apache/cassandra/hadoop/AbstractBulkRecordWriter.java +++ b/src/java/org/apache/cassandra/hadoop/AbstractBulkRecordWriter.java @@ -165,8 +165,8 @@ public ExternalClient(Configuration conf) public void init(String keyspace) { - Set hosts = new HashSet(); String[] nodes = hostlist.split(","); + Set hosts = new HashSet(nodes.length); for (String node : nodes) { try diff --git a/src/java/org/apache/cassandra/hadoop/ConfigHelper.java b/src/java/org/apache/cassandra/hadoop/ConfigHelper.java index 617f7255ac63..6b3c9c5c70a6 100644 --- a/src/java/org/apache/cassandra/hadoop/ConfigHelper.java +++ b/src/java/org/apache/cassandra/hadoop/ConfigHelper.java @@ -503,7 +503,7 @@ public static CompressionParameters getOutputCompressionParamaters(Configuration if (getOutputCompressionClass(conf) == null) return new CompressionParameters(null); - Map options = new HashMap(); + Map options = new HashMap(2); options.put(CompressionParameters.SSTABLE_COMPRESSION, getOutputCompressionClass(conf)); options.put(CompressionParameters.CHUNK_LENGTH_KB, getOutputCompressionChunkLength(conf)); diff --git a/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordReader.java b/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordReader.java index b5362469bbac..555c1cd1f6e1 100644 --- a/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordReader.java +++ b/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordReader.java @@ -272,7 +272,7 @@ protected Pair computeNext() return endOfData(); Row row = rows.next(); - Map keyColumns = new HashMap(); + Map keyColumns = new HashMap(partitionBoundColumns.size()); for (String column : partitionBoundColumns.keySet()) keyColumns.put(column, row.getBytesUnsafe(column)); diff --git a/src/java/org/apache/cassandra/hadoop/pig/AbstractCassandraStorage.java b/src/java/org/apache/cassandra/hadoop/pig/AbstractCassandraStorage.java index baef18616eb2..dc3725257098 100644 --- a/src/java/org/apache/cassandra/hadoop/pig/AbstractCassandraStorage.java +++ b/src/java/org/apache/cassandra/hadoop/pig/AbstractCassandraStorage.java @@ -262,7 +262,7 @@ public InputFormat getInputFormat() throws IOException public static Map getQueryMap(String query) throws UnsupportedEncodingException { String[] params = query.split("&"); - Map map = new HashMap(); + Map map = new HashMap(params.length); for (String param : params) { String[] keyValue = param.split("="); diff --git a/src/java/org/apache/cassandra/hadoop/pig/CassandraStorage.java b/src/java/org/apache/cassandra/hadoop/pig/CassandraStorage.java index 6a6580dd9df8..0eba0718016e 100644 --- a/src/java/org/apache/cassandra/hadoop/pig/CassandraStorage.java +++ b/src/java/org/apache/cassandra/hadoop/pig/CassandraStorage.java @@ -225,7 +225,7 @@ public Tuple getNext() throws IOException Tuple tuple = keyToTuple(key, cfDef, parseType(cfDef.getKey_validation_class())); DefaultDataBag bag = new DefaultDataBag(); // we must add all the indexed columns first to match the schema - Map added = new HashMap(); + Map added = new HashMap(cfDef.column_metadata.size()); // take care to iterate these in the same order as the schema does for (ColumnDef cdef : cfDef.column_metadata) { diff --git a/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java b/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java index 35760572eb6c..8c79186b966f 100644 --- a/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java +++ b/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java @@ -104,7 +104,7 @@ public static CompressionMetadata create(String dataFilePath) { String compressorName = stream.readUTF(); int optionCount = stream.readInt(); - Map options = new HashMap<>(); + Map options = new HashMap<>(optionCount); for (int i = 0; i < optionCount; ++i) { String key = stream.readUTF(); diff --git a/src/java/org/apache/cassandra/net/MessagingService.java b/src/java/org/apache/cassandra/net/MessagingService.java index 093992bf0763..b9490b0e0f2a 100644 --- a/src/java/org/apache/cassandra/net/MessagingService.java +++ b/src/java/org/apache/cassandra/net/MessagingService.java @@ -968,7 +968,7 @@ private boolean authenticate(Socket socket) public Map getCommandPendingTasks() { - Map pendingTasks = new HashMap(); + Map pendingTasks = new HashMap(connectionManagers.size()); for (Map.Entry entry : connectionManagers.entrySet()) pendingTasks.put(entry.getKey().getHostAddress(), entry.getValue().cmdCon.getPendingMessages()); return pendingTasks; @@ -982,7 +982,7 @@ public int getCommandPendingTasks(InetAddress address) public Map getCommandCompletedTasks() { - Map completedTasks = new HashMap(); + Map completedTasks = new HashMap(connectionManagers.size()); for (Map.Entry entry : connectionManagers.entrySet()) completedTasks.put(entry.getKey().getHostAddress(), entry.getValue().cmdCon.getCompletedMesssages()); return completedTasks; @@ -990,7 +990,7 @@ public Map getCommandCompletedTasks() public Map getCommandDroppedTasks() { - Map droppedTasks = new HashMap(); + Map droppedTasks = new HashMap(connectionManagers.size()); for (Map.Entry entry : connectionManagers.entrySet()) droppedTasks.put(entry.getKey().getHostAddress(), entry.getValue().cmdCon.getDroppedMessages()); return droppedTasks; @@ -998,7 +998,7 @@ public Map getCommandDroppedTasks() public Map getResponsePendingTasks() { - Map pendingTasks = new HashMap(); + Map pendingTasks = new HashMap(connectionManagers.size()); for (Map.Entry entry : connectionManagers.entrySet()) pendingTasks.put(entry.getKey().getHostAddress(), entry.getValue().ackCon.getPendingMessages()); return pendingTasks; @@ -1006,7 +1006,7 @@ public Map getResponsePendingTasks() public Map getResponseCompletedTasks() { - Map completedTasks = new HashMap(); + Map completedTasks = new HashMap(connectionManagers.size()); for (Map.Entry entry : connectionManagers.entrySet()) completedTasks.put(entry.getKey().getHostAddress(), entry.getValue().ackCon.getCompletedMesssages()); return completedTasks; @@ -1014,7 +1014,7 @@ public Map getResponseCompletedTasks() public Map getDroppedMessages() { - Map map = new HashMap(); + Map map = new HashMap(droppedMessages.size()); for (Map.Entry entry : droppedMessages.entrySet()) map.put(entry.getKey().toString(), (int) entry.getValue().dropped.count()); return map; @@ -1022,7 +1022,7 @@ public Map getDroppedMessages() public Map getRecentlyDroppedMessages() { - Map map = new HashMap(); + Map map = new HashMap(droppedMessages.size()); for (Map.Entry entry : droppedMessages.entrySet()) map.put(entry.getKey().toString(), entry.getValue().getRecentlyDropped()); return map; @@ -1040,7 +1040,7 @@ public long getRecentTotalTimouts() public Map getTimeoutsPerHost() { - Map result = new HashMap(); + Map result = new HashMap(connectionManagers.size()); for (Map.Entry entry: connectionManagers.entrySet()) { String ip = entry.getKey().getHostAddress(); @@ -1052,7 +1052,7 @@ public Map getTimeoutsPerHost() public Map getRecentTimeoutsPerHost() { - Map result = new HashMap(); + Map result = new HashMap(connectionManagers.size()); for (Map.Entry entry: connectionManagers.entrySet()) { String ip = entry.getKey().getHostAddress(); diff --git a/src/java/org/apache/cassandra/repair/messages/RepairOption.java b/src/java/org/apache/cassandra/repair/messages/RepairOption.java index 63446e573258..fd1d6e7f7d76 100644 --- a/src/java/org/apache/cassandra/repair/messages/RepairOption.java +++ b/src/java/org/apache/cassandra/repair/messages/RepairOption.java @@ -157,8 +157,8 @@ public static RepairOption parse(Map options, IPartitioner parti { dataCenters.add(tokenizer.nextToken().trim()); } + option.getDataCenters().addAll(dataCenters); } - option.getDataCenters().addAll(dataCenters); // hosts String hostsStr = options.get(HOSTS_KEY); @@ -170,21 +170,21 @@ public static RepairOption parse(Map options, IPartitioner parti { hosts.add(tokenizer.nextToken().trim()); } + option.getHosts().addAll(hosts); } - option.getHosts().addAll(hosts); // columnfamilies String cfStr = options.get(COLUMNFAMILIES_KEY); - Collection columnFamilies = new HashSet<>(); if (cfStr != null) { + Collection columnFamilies = new HashSet<>(); StringTokenizer tokenizer = new StringTokenizer(cfStr, ","); while (tokenizer.hasMoreTokens()) { columnFamilies.add(tokenizer.nextToken().trim()); } + option.getColumnFamilies().addAll(columnFamilies); } - option.getColumnFamilies().addAll(columnFamilies); // validate options if (jobThreads > MAX_JOB_THREADS) diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index 25aff6177ada..d1cf6c95b1f4 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -1291,7 +1291,7 @@ public Map getHostIdMap() */ private Map, List> constructRangeToEndpointMap(String keyspace, List> ranges) { - Map, List> rangeToEndpointMap = new HashMap<>(); + Map, List> rangeToEndpointMap = new HashMap<>(ranges.size()); for (Range range : ranges) { rangeToEndpointMap.put(range, Keyspace.open(keyspace).getReplicationStrategy().getNaturalEndpoints(range.right)); @@ -1926,7 +1926,7 @@ private Multimap, InetAddress> getChangedRangesForLeaving(String ke if (logger.isDebugEnabled()) logger.debug("Node {} ranges [{}]", endpoint, StringUtils.join(ranges, ", ")); - Map, List> currentReplicaEndpoints = new HashMap<>(); + Map, List> currentReplicaEndpoints = new HashMap<>(ranges.size()); // Find (for each range) all nodes that store replicas for these ranges as well TokenMetadata metadata = tokenMetadata.cloneOnlyTokenMap(); // don't do this in the loop! #7758 From 611d1baecc448cde9f4e359e639287fed6f8e357 Mon Sep 17 00:00:00 2001 From: Aleksey Yeschenko Date: Wed, 12 Nov 2014 15:16:15 +0300 Subject: [PATCH 183/557] Cleanup and move hardcoded system tables away from CFMetaData patch by Aleksey Yeschenko; reviewed by Sylvain Lebresne for CASSANDRA-8261 --- .../cassandra/cache/AutoSavingCache.java | 6 +- .../apache/cassandra/config/CFMetaData.java | 240 +-------- .../cassandra/config/ColumnDefinition.java | 10 +- .../cassandra/config/DatabaseDescriptor.java | 14 +- .../apache/cassandra/config/KSMetaData.java | 54 +- .../org/apache/cassandra/config/Schema.java | 25 +- .../cassandra/config/TriggerDefinition.java | 10 +- .../apache/cassandra/config/UTMetaData.java | 14 +- .../apache/cassandra/cql3/QueryProcessor.java | 3 +- .../cassandra/cql3/functions/Functions.java | 3 +- .../cassandra/cql3/functions/UDFunction.java | 15 +- .../statements/AlterKeyspaceStatement.java | 4 +- .../cassandra/db/AtomicBTreeColumns.java | 2 +- .../apache/cassandra/db/BatchlogManager.java | 23 +- .../org/apache/cassandra/db/DefsTables.java | 31 +- .../cassandra/db/HintedHandOffManager.java | 25 +- .../org/apache/cassandra/db/Keyspace.java | 11 +- .../org/apache/cassandra/db/Memtable.java | 2 +- .../apache/cassandra/db/SystemKeyspace.java | 482 +++++++++++++----- .../io/sstable/format/SSTableReader.java | 2 +- .../cassandra/service/CassandraDaemon.java | 4 +- .../apache/cassandra/service/ClientState.java | 11 +- .../cassandra/service/MigrationManager.java | 4 +- .../cassandra/service/StorageProxy.java | 10 +- .../cassandra/service/StorageService.java | 25 +- .../cassandra/thrift/ThriftValidation.java | 2 +- .../apache/cassandra/tools/BulkLoader.java | 11 +- .../org/apache/cassandra/tools/NodeTool.java | 6 +- .../cassandra/tracing/TraceKeyspace.java | 73 +++ .../apache/cassandra/tracing/TraceState.java | 4 +- .../org/apache/cassandra/tracing/Tracing.java | 26 +- .../cassandra/config/CFMetaDataTest.java | 4 +- .../cassandra/db/BatchlogManagerTest.java | 4 +- .../cassandra/db/HintedHandOffTest.java | 8 +- .../cassandra/db/RecoveryManager2Test.java | 2 +- .../service/StorageServiceServerTest.java | 3 +- 36 files changed, 599 insertions(+), 574 deletions(-) create mode 100644 src/java/org/apache/cassandra/tracing/TraceKeyspace.java diff --git a/src/java/org/apache/cassandra/cache/AutoSavingCache.java b/src/java/org/apache/cassandra/cache/AutoSavingCache.java index 4aeb8222ead3..9a79e3831f04 100644 --- a/src/java/org/apache/cassandra/cache/AutoSavingCache.java +++ b/src/java/org/apache/cassandra/cache/AutoSavingCache.java @@ -30,12 +30,12 @@ import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.config.Schema; +import org.apache.cassandra.db.ColumnFamilyStore; +import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.db.compaction.CompactionInfo; import org.apache.cassandra.db.compaction.CompactionManager; import org.apache.cassandra.db.compaction.OperationType; import org.apache.cassandra.db.marshal.BytesType; -import org.apache.cassandra.db.ColumnFamilyStore; -import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.io.FSWriteError; import org.apache.cassandra.io.util.*; import org.apache.cassandra.service.CacheService; @@ -198,7 +198,7 @@ else if (cacheType == CacheService.CacheType.COUNTER_CACHE) else type = OperationType.UNKNOWN; - info = new CompactionInfo(CFMetaData.denseCFMetaData(Keyspace.SYSTEM_KS, cacheType.toString(), BytesType.instance), + info = new CompactionInfo(CFMetaData.denseCFMetaData(SystemKeyspace.NAME, cacheType.toString(), BytesType.instance), type, 0, keys.size(), diff --git a/src/java/org/apache/cassandra/config/CFMetaData.java b/src/java/org/apache/cassandra/config/CFMetaData.java index a8d528e855ef..14271c0b7bac 100644 --- a/src/java/org/apache/cassandra/config/CFMetaData.java +++ b/src/java/org/apache/cassandra/config/CFMetaData.java @@ -50,7 +50,6 @@ import org.apache.cassandra.io.compress.LZ4Compressor; import org.apache.cassandra.io.sstable.format.Version; import org.apache.cassandra.io.util.FileDataInput; -import org.apache.cassandra.tracing.Tracing; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.UUIDGen; @@ -59,9 +58,6 @@ import static org.apache.cassandra.utils.FBUtilities.fromJsonMap; import static org.apache.cassandra.utils.FBUtilities.json; -/** - * This class can be tricky to modify. Please read http://wiki.apache.org/cassandra/ConfigurationNotes for how to do so safely. - */ public final class CFMetaData { private static final Logger logger = LoggerFactory.getLogger(CFMetaData.class); @@ -90,214 +86,6 @@ public int compare(ColumnDefinition def1, ColumnDefinition def2) } }; - public static final CFMetaData IndexCf = compile("CREATE TABLE \"" + SystemKeyspace.INDEX_CF + "\" (" - + "table_name text," - + "index_name text," - + "PRIMARY KEY (table_name, index_name)" - + ") WITH COMPACT STORAGE AND COMMENT='indexes that have been completed'"); - - public static final CFMetaData SchemaKeyspacesCf = compile("CREATE TABLE " + SystemKeyspace.SCHEMA_KEYSPACES_CF + " (" - + "keyspace_name text PRIMARY KEY," - + "durable_writes boolean," - + "strategy_class text," - + "strategy_options text" - + ") WITH COMPACT STORAGE AND COMMENT='keyspace definitions' AND gc_grace_seconds=604800"); - - public static final CFMetaData SchemaColumnFamiliesCf = compile("CREATE TABLE " + SystemKeyspace.SCHEMA_COLUMNFAMILIES_CF + " (" - + "keyspace_name text," - + "columnfamily_name text," - + "cf_id uuid," // post-2.1 UUID cfid - + "type text," - + "is_dense boolean," - + "comparator text," - + "subcomparator text," - + "comment text," - + "read_repair_chance double," - + "local_read_repair_chance double," - + "gc_grace_seconds int," - + "default_validator text," - + "key_validator text," - + "min_compaction_threshold int," - + "max_compaction_threshold int," - + "memtable_flush_period_in_ms int," - + "key_aliases text," - + "bloom_filter_fp_chance double," - + "caching text," - + "default_time_to_live int," - + "compaction_strategy_class text," - + "compression_parameters text," - + "value_alias text," - + "column_aliases text," - + "compaction_strategy_options text," - + "speculative_retry text," - + "index_interval int," - + "min_index_interval int," - + "max_index_interval int," - + "dropped_columns map," - + "PRIMARY KEY (keyspace_name, columnfamily_name)" - + ") WITH COMMENT='ColumnFamily definitions' AND gc_grace_seconds=604800"); - - public static final CFMetaData SchemaColumnsCf = compile("CREATE TABLE " + SystemKeyspace.SCHEMA_COLUMNS_CF + " (" - + "keyspace_name text," - + "columnfamily_name text," - + "column_name text," - + "validator text," - + "index_type text," - + "index_options text," - + "index_name text," - + "component_index int," - + "type text," - + "PRIMARY KEY(keyspace_name, columnfamily_name, column_name)" - + ") WITH COMMENT='ColumnFamily column attributes' AND gc_grace_seconds=604800"); - - public static final CFMetaData SchemaTriggersCf = compile("CREATE TABLE " + SystemKeyspace.SCHEMA_TRIGGERS_CF + " (" - + "keyspace_name text," - + "columnfamily_name text," - + "trigger_name text," - + "trigger_options map," - + "PRIMARY KEY (keyspace_name, columnfamily_name, trigger_name)" - + ") WITH COMMENT='triggers metadata table' AND gc_grace_seconds=604800"); - - public static final CFMetaData SchemaUserTypesCf = compile("CREATE TABLE " + SystemKeyspace.SCHEMA_USER_TYPES_CF + " (" - + "keyspace_name text," - + "type_name text," - + "field_names list," - + "field_types list," - + "PRIMARY KEY (keyspace_name, type_name)" - + ") WITH COMMENT='Defined user types' AND gc_grace_seconds=604800"); - - public static final CFMetaData SchemaFunctionsCf = compile("CREATE TABLE " + SystemKeyspace.SCHEMA_FUNCTIONS_CF + " (" - + "namespace text," - + "name text," - + "signature blob," - + "argument_names list," - + "argument_types list," - + "return_type text," - + "deterministic boolean," - + "language text," - + "body text," - + "primary key ((namespace, name), signature)" - + ") WITH COMMENT='user defined functions' AND gc_grace_seconds=604800"); - - public static final CFMetaData HintsCf = compile("CREATE TABLE " + SystemKeyspace.HINTS_CF + " (" - + "target_id uuid," - + "hint_id timeuuid," - + "message_version int," - + "mutation blob," - + "PRIMARY KEY (target_id, hint_id, message_version)" - + ") WITH COMPACT STORAGE " - + "AND COMPACTION={'class' : 'SizeTieredCompactionStrategy', 'enabled' : false} " - + "AND COMMENT='hints awaiting delivery'" - + "AND gc_grace_seconds=0"); - - public static final CFMetaData PeersCf = compile("CREATE TABLE " + SystemKeyspace.PEERS_CF + " (" - + "peer inet PRIMARY KEY," - + "host_id uuid," - + "tokens set," - + "schema_version uuid," - + "release_version text," - + "rpc_address inet," - + "preferred_ip inet," - + "data_center text," - + "rack text" - + ") WITH COMMENT='known peers in the cluster'"); - - public static final CFMetaData PeerEventsCf = compile("CREATE TABLE " + SystemKeyspace.PEER_EVENTS_CF + " (" - + "peer inet PRIMARY KEY," - + "hints_dropped map" - + ") WITH COMMENT='cf contains events related to peers'"); - - public static final CFMetaData LocalCf = compile("CREATE TABLE " + SystemKeyspace.LOCAL_CF + " (" - + "key text PRIMARY KEY," - + "tokens set," - + "cluster_name text," - + "gossip_generation int," - + "bootstrapped text," - + "host_id uuid," - + "release_version text," - + "thrift_version text," - + "cql_version text," - + "native_protocol_version text," - + "data_center text," - + "rack text," - + "partitioner text," - + "schema_version uuid," - + "truncated_at map" - + ") WITH COMMENT='information about the local node'"); - - public static final CFMetaData TraceSessionsCf = compile("CREATE TABLE " + Tracing.SESSIONS_CF + " (" - + "session_id uuid PRIMARY KEY," - + "coordinator inet," - + "request text," - + "started_at timestamp," - + "parameters map," - + "duration int" - + ") WITH COMMENT='traced sessions'", - Tracing.TRACE_KS); - - public static final CFMetaData TraceEventsCf = compile("CREATE TABLE " + Tracing.EVENTS_CF + " (" - + "session_id uuid," - + "event_id timeuuid," - + "source inet," - + "thread text," - + "activity text," - + "source_elapsed int," - + "PRIMARY KEY (session_id, event_id)" - + ")", - Tracing.TRACE_KS); - - public static final CFMetaData BatchlogCf = compile("CREATE TABLE " + SystemKeyspace.BATCHLOG_CF + " (" - + "id uuid PRIMARY KEY," - + "written_at timestamp," - + "data blob," - + "version int," - + ") WITH COMMENT='uncommited batches' AND gc_grace_seconds=0 " - + "AND COMPACTION={'class' : 'SizeTieredCompactionStrategy', 'min_threshold' : 2}"); - - public static final CFMetaData RangeXfersCf = compile("CREATE TABLE " + SystemKeyspace.RANGE_XFERS_CF + " (" - + "token_bytes blob PRIMARY KEY," - + "requested_at timestamp" - + ") WITH COMMENT='ranges requested for transfer here'"); - - public static final CFMetaData CompactionLogCf = compile("CREATE TABLE " + SystemKeyspace.COMPACTION_LOG + " (" - + "id uuid PRIMARY KEY," - + "keyspace_name text," - + "columnfamily_name text," - + "inputs set" - + ") WITH COMMENT='unfinished compactions'"); - - public static final CFMetaData PaxosCf = compile("CREATE TABLE " + SystemKeyspace.PAXOS_CF + " (" - + "row_key blob," - + "cf_id UUID," - + "in_progress_ballot timeuuid," - + "proposal_ballot timeuuid," - + "proposal blob," - + "most_recent_commit_at timeuuid," - + "most_recent_commit blob," - + "PRIMARY KEY (row_key, cf_id)" - + ") WITH COMMENT='in-progress paxos proposals' " - + "AND COMPACTION={'class' : 'LeveledCompactionStrategy'}"); - - public static final CFMetaData SSTableActivityCF = compile("CREATE TABLE " + SystemKeyspace.SSTABLE_ACTIVITY_CF + " (" - + "keyspace_name text," - + "columnfamily_name text," - + "generation int," - + "rate_15m double," - + "rate_120m double," - + "PRIMARY KEY ((keyspace_name, columnfamily_name, generation))" - + ") WITH COMMENT='historic sstable read rates'"); - - public static final CFMetaData CompactionHistoryCf = compile("CREATE TABLE " + SystemKeyspace.COMPACTION_HISTORY_CF + " (" - + "id uuid," - + "keyspace_name text," - + "columnfamily_name text," - + "compacted_at timestamp," - + "bytes_in bigint," - + "bytes_out bigint," - + "rows_merged map," - + "PRIMARY KEY (id)" - + ") WITH COMMENT='show all compaction history' AND DEFAULT_TIME_TO_LIVE=604800"); - public static class SpeculativeRetry { public enum RetryType @@ -500,12 +288,6 @@ public Map getTriggers() return triggers; } - private static CFMetaData compile(String cql) - { - return compile(cql, Keyspace.SYSTEM_KS); - } - - @VisibleForTesting public static CFMetaData compile(String cql, String keyspace) { try @@ -937,7 +719,7 @@ public AbstractType getValueValidator(CellName cellName) public void reload() { - Row cfDefRow = SystemKeyspace.readSchemaRow(SystemKeyspace.SCHEMA_COLUMNFAMILIES_CF, ksName, cfName); + Row cfDefRow = SystemKeyspace.readSchemaRow(SystemKeyspace.SCHEMA_COLUMNFAMILIES_TABLE, ksName, cfName); if (cfDefRow.cf == null || !cfDefRow.cf.hasColumns()) throw new RuntimeException(String.format("%s not found in the schema definitions keyspace.", ksName + ":" + cfName)); @@ -1343,7 +1125,7 @@ private void validateIndexIntervalThresholds() throws ConfigurationException */ public Mutation toSchemaUpdate(CFMetaData newState, long modificationTimestamp, boolean fromThrift) { - Mutation mutation = new Mutation(Keyspace.SYSTEM_KS, SystemKeyspace.getSchemaKSKey(ksName)); + Mutation mutation = new Mutation(SystemKeyspace.NAME, SystemKeyspace.getSchemaKSKey(ksName)); newState.toSchemaNoColumnsNoTriggers(mutation, modificationTimestamp); @@ -1393,11 +1175,11 @@ public Mutation toSchemaUpdate(CFMetaData newState, long modificationTimestamp, */ public Mutation dropFromSchema(long timestamp) { - Mutation mutation = new Mutation(Keyspace.SYSTEM_KS, SystemKeyspace.getSchemaKSKey(ksName)); - ColumnFamily cf = mutation.addOrGet(SchemaColumnFamiliesCf); + Mutation mutation = new Mutation(SystemKeyspace.NAME, SystemKeyspace.getSchemaKSKey(ksName)); + ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SchemaColumnFamiliesTable); int ldt = (int) (System.currentTimeMillis() / 1000); - Composite prefix = SchemaColumnFamiliesCf.comparator.make(cfName); + Composite prefix = SystemKeyspace.SchemaColumnFamiliesTable.comparator.make(cfName); cf.addAtom(new RangeTombstone(prefix, prefix.end(), timestamp, ldt)); for (ColumnDefinition cd : allColumns()) @@ -1408,7 +1190,7 @@ public Mutation dropFromSchema(long timestamp) for (String indexName : Keyspace.open(this.ksName).getColumnFamilyStore(this.cfName).getBuiltIndexes()) { - ColumnFamily indexCf = mutation.addOrGet(IndexCf); + ColumnFamily indexCf = mutation.addOrGet(SystemKeyspace.BuiltIndexesTable); indexCf.addTombstone(indexCf.getComparator().makeCellName(indexName), ldt, timestamp); } @@ -1440,8 +1222,8 @@ private void toSchemaNoColumnsNoTriggers(Mutation mutation, long timestamp) { // For property that can be null (and can be changed), we insert tombstones, to make sure // we don't keep a property the user has removed - ColumnFamily cf = mutation.addOrGet(SchemaColumnFamiliesCf); - Composite prefix = SchemaColumnFamiliesCf.comparator.make(cfName); + ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SchemaColumnFamiliesTable); + Composite prefix = SystemKeyspace.SchemaColumnFamiliesTable.comparator.make(cfName); CFRowAdder adder = new CFRowAdder(cf, prefix, timestamp); adder.add("cf_id", cfId); @@ -1618,10 +1400,10 @@ public static CFMetaData fromSchema(UntypedResultSet.Row result) String ksName = result.getString("keyspace_name"); String cfName = result.getString("columnfamily_name"); - Row serializedColumns = SystemKeyspace.readSchemaRow(SystemKeyspace.SCHEMA_COLUMNS_CF, ksName, cfName); + Row serializedColumns = SystemKeyspace.readSchemaRow(SystemKeyspace.SCHEMA_COLUMNS_TABLE, ksName, cfName); CFMetaData cfm = fromSchemaNoTriggers(result, ColumnDefinition.resultify(serializedColumns)); - Row serializedTriggers = SystemKeyspace.readSchemaRow(SystemKeyspace.SCHEMA_TRIGGERS_CF, ksName, cfName); + Row serializedTriggers = SystemKeyspace.readSchemaRow(SystemKeyspace.SCHEMA_TRIGGERS_TABLE, ksName, cfName); addTriggerDefinitionsFromSchema(cfm, serializedTriggers); return cfm; @@ -1671,7 +1453,7 @@ private static Map convertDroppedColumns(Map MAX_NUM_TOKENS) conf.server_encryption_options = conf.encryption_options; } - // Hardcoded system keyspaces - List systemKeyspaces = Arrays.asList(KSMetaData.systemKeyspace()); - assert systemKeyspaces.size() == Schema.systemKeyspaceNames.size(); - for (KSMetaData ksmd : systemKeyspaces) - Schema.instance.load(ksmd); + // hardcoded system keyspace + Schema.instance.load(SystemKeyspace.definition()); - /* Load the seeds for node contact points */ + // load the seeds for node contact points if (conf.seed_provider == null) { throw new ConfigurationException("seeds configuration is missing; a minimum of one seed is required."); @@ -627,7 +623,7 @@ private static IEndpointSnitch createEndpointSnitch(String snitchClassName) thro /** load keyspace (keyspace) definitions, but do not initialize the keyspace instances. */ public static void loadSchemas() { - ColumnFamilyStore schemaCFS = SystemKeyspace.schemaCFS(SystemKeyspace.SCHEMA_KEYSPACES_CF); + ColumnFamilyStore schemaCFS = SystemKeyspace.schemaCFS(SystemKeyspace.SCHEMA_KEYSPACES_TABLE); // if keyspace with definitions is empty try loading the old way if (schemaCFS.estimateKeys() == 0) @@ -659,7 +655,7 @@ private static boolean hasExistingNoSystemTables() { public boolean accept(File pathname) { - return (pathname.isDirectory() && !Schema.systemKeyspaceNames.contains(pathname.getName())); + return pathname.isDirectory() && !pathname.getName().equals(SystemKeyspace.NAME); } }).length; diff --git a/src/java/org/apache/cassandra/config/KSMetaData.java b/src/java/org/apache/cassandra/config/KSMetaData.java index f30fe740c3eb..d3ff62c024b9 100644 --- a/src/java/org/apache/cassandra/config/KSMetaData.java +++ b/src/java/org/apache/cassandra/config/KSMetaData.java @@ -20,7 +20,6 @@ import java.util.*; import com.google.common.base.Objects; -import com.google.common.collect.ImmutableMap; import org.apache.cassandra.cql3.QueryProcessor; import org.apache.cassandra.cql3.UntypedResultSet; @@ -28,7 +27,6 @@ import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.locator.*; import org.apache.cassandra.service.StorageService; -import org.apache.cassandra.tracing.Tracing; import static org.apache.cassandra.utils.FBUtilities.*; @@ -89,34 +87,6 @@ public static KSMetaData cloneWith(KSMetaData ksm, Iterable cfDefs) return new KSMetaData(ksm.name, ksm.strategyClass, ksm.strategyOptions, ksm.durableWrites, cfDefs, ksm.userTypes); } - public static KSMetaData systemKeyspace() - { - List cfDefs = Arrays.asList(CFMetaData.BatchlogCf, - CFMetaData.RangeXfersCf, - CFMetaData.LocalCf, - CFMetaData.PeersCf, - CFMetaData.PeerEventsCf, - CFMetaData.HintsCf, - CFMetaData.IndexCf, - CFMetaData.SchemaKeyspacesCf, - CFMetaData.SchemaColumnFamiliesCf, - CFMetaData.SchemaColumnsCf, - CFMetaData.SchemaTriggersCf, - CFMetaData.SchemaUserTypesCf, - CFMetaData.SchemaFunctionsCf, - CFMetaData.CompactionLogCf, - CFMetaData.CompactionHistoryCf, - CFMetaData.PaxosCf, - CFMetaData.SSTableActivityCF); - return new KSMetaData(Keyspace.SYSTEM_KS, LocalStrategy.class, Collections.emptyMap(), true, cfDefs); - } - - public static KSMetaData traceKeyspace() - { - List cfDefs = Arrays.asList(CFMetaData.TraceSessionsCf, CFMetaData.TraceEventsCf); - return new KSMetaData(Tracing.TRACE_KS, SimpleStrategy.class, ImmutableMap.of("replication_factor", "2"), true, cfDefs); - } - public static KSMetaData testMetadata(String name, Class strategyClass, Map strategyOptions, CFMetaData... cfDefs) { return new KSMetaData(name, strategyClass, strategyOptions, true, Arrays.asList(cfDefs)); @@ -198,33 +168,33 @@ public KSMetaData validate() throws ConfigurationException public KSMetaData reloadAttributes() { - Row ksDefRow = SystemKeyspace.readSchemaRow(SystemKeyspace.SCHEMA_KEYSPACES_CF, name); + Row ksDefRow = SystemKeyspace.readSchemaRow(SystemKeyspace.SCHEMA_KEYSPACES_TABLE, name); if (ksDefRow.cf == null) - throw new RuntimeException(String.format("%s not found in the schema definitions keyspaceName (%s).", name, SystemKeyspace.SCHEMA_KEYSPACES_CF)); + throw new RuntimeException(String.format("%s not found in the schema definitions keyspaceName (%s).", name, SystemKeyspace.SCHEMA_KEYSPACES_TABLE)); return fromSchema(ksDefRow, Collections.emptyList(), userTypes); } public Mutation dropFromSchema(long timestamp) { - Mutation mutation = new Mutation(Keyspace.SYSTEM_KS, SystemKeyspace.getSchemaKSKey(name)); + Mutation mutation = new Mutation(SystemKeyspace.NAME, SystemKeyspace.getSchemaKSKey(name)); - mutation.delete(SystemKeyspace.SCHEMA_KEYSPACES_CF, timestamp); - mutation.delete(SystemKeyspace.SCHEMA_COLUMNFAMILIES_CF, timestamp); - mutation.delete(SystemKeyspace.SCHEMA_COLUMNS_CF, timestamp); - mutation.delete(SystemKeyspace.SCHEMA_TRIGGERS_CF, timestamp); - mutation.delete(SystemKeyspace.SCHEMA_USER_TYPES_CF, timestamp); - mutation.delete(SystemKeyspace.INDEX_CF, timestamp); + mutation.delete(SystemKeyspace.SCHEMA_KEYSPACES_TABLE, timestamp); + mutation.delete(SystemKeyspace.SCHEMA_COLUMNFAMILIES_TABLE, timestamp); + mutation.delete(SystemKeyspace.SCHEMA_COLUMNS_TABLE, timestamp); + mutation.delete(SystemKeyspace.SCHEMA_TRIGGERS_TABLE, timestamp); + mutation.delete(SystemKeyspace.SCHEMA_USER_TYPES_TABLE, timestamp); + mutation.delete(SystemKeyspace.BUILT_INDEXES_TABLE, timestamp); return mutation; } public Mutation toSchema(long timestamp) { - Mutation mutation = new Mutation(Keyspace.SYSTEM_KS, SystemKeyspace.getSchemaKSKey(name)); - ColumnFamily cf = mutation.addOrGet(CFMetaData.SchemaKeyspacesCf); - CFRowAdder adder = new CFRowAdder(cf, CFMetaData.SchemaKeyspacesCf.comparator.builder().build(), timestamp); + Mutation mutation = new Mutation(SystemKeyspace.NAME, SystemKeyspace.getSchemaKSKey(name)); + ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SchemaKeyspacesTable); + CFRowAdder adder = new CFRowAdder(cf, SystemKeyspace.SchemaKeyspacesTable.comparator.builder().build(), timestamp); adder.add("durable_writes", durableWrites); adder.add("strategy_class", strategyClass.getName()); diff --git a/src/java/org/apache/cassandra/config/Schema.java b/src/java/org/apache/cassandra/config/Schema.java index fed38d809ba1..43cc6b51eb8a 100644 --- a/src/java/org/apache/cassandra/config/Schema.java +++ b/src/java/org/apache/cassandra/config/Schema.java @@ -23,7 +23,6 @@ import java.util.*; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -53,10 +52,10 @@ public class Schema public static final int NAME_LENGTH = 48; /* metadata map for faster keyspace lookup */ - private final Map keyspaces = new NonBlockingHashMap(); + private final Map keyspaces = new NonBlockingHashMap<>(); /* Keyspace objects, one per keyspace. Only one instance should ever exist for any given keyspace. */ - private final Map keyspaceInstances = new NonBlockingHashMap(); + private final Map keyspaceInstances = new NonBlockingHashMap<>(); /* metadata map for faster ColumnFamily lookup */ private final ConcurrentBiMap, UUID> cfIdMap = new ConcurrentBiMap<>(); @@ -65,7 +64,6 @@ public class Schema // 59adb24e-f3cd-3e02-97f0-5b395827453f public static final UUID emptyVersion; - public static final ImmutableSet systemKeyspaceNames = ImmutableSet.of(Keyspace.SYSTEM_KS); static { @@ -212,21 +210,6 @@ public CFMetaData getCFMetaData(Descriptor descriptor) return getCFMetaData(descriptor.ksname, descriptor.cfname); } - /** - * Get type of the ColumnFamily but it's keyspace/name - * - * @param ksName The keyspace name - * @param cfName The ColumnFamily name - * - * @return The type of the ColumnFamily - */ - public ColumnFamilyType getColumnFamilyType(String ksName, String cfName) - { - assert ksName != null && cfName != null; - CFMetaData cfMetaData = getCFMetaData(ksName, cfName); - return (cfMetaData == null) ? null : cfMetaData.cfType; - } - /** * Get metadata about keyspace by its name * @@ -245,7 +228,7 @@ public KSMetaData getKSMetaData(String keyspaceName) */ public List getNonSystemKeyspaces() { - return ImmutableList.copyOf(Sets.difference(keyspaces.keySet(), systemKeyspaceNames)); + return ImmutableList.copyOf(Sets.difference(keyspaces.keySet(), Collections.singleton(SystemKeyspace.NAME))); } /** @@ -425,7 +408,7 @@ public static boolean ignoredSchemaRow(Row row) { try { - return systemKeyspaceNames.contains(ByteBufferUtil.string(row.key.getKey())); + return ByteBufferUtil.string(row.key.getKey()).equals(SystemKeyspace.NAME); } catch (CharacterCodingException e) { diff --git a/src/java/org/apache/cassandra/config/TriggerDefinition.java b/src/java/org/apache/cassandra/config/TriggerDefinition.java index df37cbc89b14..a395549ef52f 100644 --- a/src/java/org/apache/cassandra/config/TriggerDefinition.java +++ b/src/java/org/apache/cassandra/config/TriggerDefinition.java @@ -60,7 +60,7 @@ public static TriggerDefinition create(String name, String classOption) public static List fromSchema(Row serializedTriggers) { List triggers = new ArrayList<>(); - String query = String.format("SELECT * FROM %s.%s", Keyspace.SYSTEM_KS, SystemKeyspace.SCHEMA_TRIGGERS_CF); + String query = String.format("SELECT * FROM %s.%s", SystemKeyspace.NAME, SystemKeyspace.SCHEMA_TRIGGERS_TABLE); for (UntypedResultSet.Row row : QueryProcessor.resultify(query, serializedTriggers)) { String name = row.getString(TRIGGER_NAME); @@ -79,9 +79,9 @@ public static List fromSchema(Row serializedTriggers) */ public void toSchema(Mutation mutation, String cfName, long timestamp) { - ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SCHEMA_TRIGGERS_CF); + ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SCHEMA_TRIGGERS_TABLE); - CFMetaData cfm = CFMetaData.SchemaTriggersCf; + CFMetaData cfm = SystemKeyspace.SchemaTriggersTable; Composite prefix = cfm.comparator.make(cfName, name); CFRowAdder adder = new CFRowAdder(cf, prefix, timestamp); @@ -97,10 +97,10 @@ public void toSchema(Mutation mutation, String cfName, long timestamp) */ public void deleteFromSchema(Mutation mutation, String cfName, long timestamp) { - ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SCHEMA_TRIGGERS_CF); + ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SCHEMA_TRIGGERS_TABLE); int ldt = (int) (System.currentTimeMillis() / 1000); - Composite prefix = CFMetaData.SchemaTriggersCf.comparator.make(cfName, name); + Composite prefix = SystemKeyspace.SchemaTriggersTable.comparator.make(cfName, name); cf.addAtom(new RangeTombstone(prefix, prefix.end(), timestamp, ldt)); } diff --git a/src/java/org/apache/cassandra/config/UTMetaData.java b/src/java/org/apache/cassandra/config/UTMetaData.java index ee653a85d31a..46a7a4f09df8 100644 --- a/src/java/org/apache/cassandra/config/UTMetaData.java +++ b/src/java/org/apache/cassandra/config/UTMetaData.java @@ -75,7 +75,7 @@ private static UserType fromSchema(UntypedResultSet.Row row) public static Map fromSchema(Row row) { - UntypedResultSet results = QueryProcessor.resultify("SELECT * FROM system." + SystemKeyspace.SCHEMA_USER_TYPES_CF, row); + UntypedResultSet results = QueryProcessor.resultify("SELECT * FROM system." + SystemKeyspace.SCHEMA_USER_TYPES_TABLE, row); Map types = new HashMap<>(results.size()); for (UntypedResultSet.Row result : results) { @@ -87,14 +87,14 @@ public static Map fromSchema(Row row) public static Mutation toSchema(UserType newType, long timestamp) { - return toSchema(new Mutation(Keyspace.SYSTEM_KS, SystemKeyspace.getSchemaKSKey(newType.keyspace)), newType, timestamp); + return toSchema(new Mutation(SystemKeyspace.NAME, SystemKeyspace.getSchemaKSKey(newType.keyspace)), newType, timestamp); } public static Mutation toSchema(Mutation mutation, UserType newType, long timestamp) { - ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SCHEMA_USER_TYPES_CF); + ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SCHEMA_USER_TYPES_TABLE); - Composite prefix = CFMetaData.SchemaUserTypesCf.comparator.make(newType.name); + Composite prefix = SystemKeyspace.SchemaUserTypesTable.comparator.make(newType.name); CFRowAdder adder = new CFRowAdder(cf, prefix, timestamp); adder.resetCollection("field_names"); @@ -117,11 +117,11 @@ public Mutation toSchema(Mutation mutation, long timestamp) public static Mutation dropFromSchema(UserType droppedType, long timestamp) { - Mutation mutation = new Mutation(Keyspace.SYSTEM_KS, SystemKeyspace.getSchemaKSKey(droppedType.keyspace)); - ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SCHEMA_USER_TYPES_CF); + Mutation mutation = new Mutation(SystemKeyspace.NAME, SystemKeyspace.getSchemaKSKey(droppedType.keyspace)); + ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SCHEMA_USER_TYPES_TABLE); int ldt = (int) (System.currentTimeMillis() / 1000); - Composite prefix = CFMetaData.SchemaUserTypesCf.comparator.make(droppedType.name); + Composite prefix = SystemKeyspace.SchemaUserTypesTable.comparator.make(droppedType.name); cf.addAtom(new RangeTombstone(prefix, prefix.end(), timestamp, ldt)); return mutation; diff --git a/src/java/org/apache/cassandra/cql3/QueryProcessor.java b/src/java/org/apache/cassandra/cql3/QueryProcessor.java index b20a771822ef..680f9f28a76e 100644 --- a/src/java/org/apache/cassandra/cql3/QueryProcessor.java +++ b/src/java/org/apache/cassandra/cql3/QueryProcessor.java @@ -22,7 +22,6 @@ import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; -import com.google.common.annotations.VisibleForTesting; import com.google.common.primitives.Ints; import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap; import com.googlecode.concurrentlinkedhashmap.EntryWeigher; @@ -147,7 +146,7 @@ private static enum InternalStateInstance ClientState state = ClientState.forInternalCalls(); try { - state.setKeyspace(Keyspace.SYSTEM_KS); + state.setKeyspace(SystemKeyspace.NAME); } catch (InvalidRequestException e) { diff --git a/src/java/org/apache/cassandra/cql3/functions/Functions.java b/src/java/org/apache/cassandra/cql3/functions/Functions.java index e8d6181b3bab..62de2bc57bdd 100644 --- a/src/java/org/apache/cassandra/cql3/functions/Functions.java +++ b/src/java/org/apache/cassandra/cql3/functions/Functions.java @@ -26,7 +26,6 @@ import org.apache.cassandra.config.Schema; import org.apache.cassandra.cql3.*; -import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.exceptions.InvalidRequestException; @@ -40,7 +39,7 @@ public abstract class Functions // to handle it as a special case. private static final FunctionName TOKEN_FUNCTION_NAME = new FunctionName("token"); - private static final String SELECT_UDFS = "SELECT * FROM " + Keyspace.SYSTEM_KS + '.' + SystemKeyspace.SCHEMA_FUNCTIONS_CF; + private static final String SELECT_UDFS = "SELECT * FROM " + SystemKeyspace.NAME + '.' + SystemKeyspace.SCHEMA_FUNCTIONS_TABLE; private Functions() {} diff --git a/src/java/org/apache/cassandra/cql3/functions/UDFunction.java b/src/java/org/apache/cassandra/cql3/functions/UDFunction.java index 374100852c87..bf011a7afe6b 100644 --- a/src/java/org/apache/cassandra/cql3/functions/UDFunction.java +++ b/src/java/org/apache/cassandra/cql3/functions/UDFunction.java @@ -26,7 +26,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.cql3.*; import org.apache.cassandra.db.*; import org.apache.cassandra.db.composites.Composite; @@ -153,16 +152,16 @@ public boolean isNative() private static Mutation makeSchemaMutation(FunctionName name) { - CompositeType kv = (CompositeType)CFMetaData.SchemaFunctionsCf.getKeyValidator(); - return new Mutation(Keyspace.SYSTEM_KS, kv.decompose(name.namespace, name.name)); + CompositeType kv = (CompositeType)SystemKeyspace.SchemaFunctionsTable.getKeyValidator(); + return new Mutation(SystemKeyspace.NAME, kv.decompose(name.namespace, name.name)); } public Mutation toSchemaDrop(long timestamp) { Mutation mutation = makeSchemaMutation(name); - ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SCHEMA_FUNCTIONS_CF); + ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SCHEMA_FUNCTIONS_TABLE); - Composite prefix = CFMetaData.SchemaFunctionsCf.comparator.make(computeSignature(argTypes)); + Composite prefix = SystemKeyspace.SchemaFunctionsTable.comparator.make(computeSignature(argTypes)); int ldt = (int) (System.currentTimeMillis() / 1000); cf.addAtom(new RangeTombstone(prefix, prefix.end(), timestamp, ldt)); @@ -172,9 +171,9 @@ public Mutation toSchemaDrop(long timestamp) public Mutation toSchemaUpdate(long timestamp) { Mutation mutation = makeSchemaMutation(name); - ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SCHEMA_FUNCTIONS_CF); + ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SCHEMA_FUNCTIONS_TABLE); - Composite prefix = CFMetaData.SchemaFunctionsCf.comparator.make(computeSignature(argTypes)); + Composite prefix = SystemKeyspace.SchemaFunctionsTable.comparator.make(computeSignature(argTypes)); CFRowAdder adder = new CFRowAdder(cf, prefix, timestamp); adder.resetCollection("argument_names"); @@ -254,7 +253,7 @@ private static AbstractType parseType(String str) public static Map fromSchema(Row row) { - UntypedResultSet results = QueryProcessor.resultify("SELECT * FROM system." + SystemKeyspace.SCHEMA_FUNCTIONS_CF, row); + UntypedResultSet results = QueryProcessor.resultify("SELECT * FROM system." + SystemKeyspace.SCHEMA_FUNCTIONS_TABLE, row); Map udfs = new HashMap<>(results.size()); for (UntypedResultSet.Row result : results) udfs.put(result.getBlob("signature"), fromSchema(result)); diff --git a/src/java/org/apache/cassandra/cql3/statements/AlterKeyspaceStatement.java b/src/java/org/apache/cassandra/cql3/statements/AlterKeyspaceStatement.java index e65a51e9b5b5..50c3f00c7825 100644 --- a/src/java/org/apache/cassandra/cql3/statements/AlterKeyspaceStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/AlterKeyspaceStatement.java @@ -21,7 +21,7 @@ import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.config.Schema; -import org.apache.cassandra.db.Keyspace; +import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.exceptions.*; import org.apache.cassandra.locator.AbstractReplicationStrategy; import org.apache.cassandra.service.ClientState; @@ -57,7 +57,7 @@ public void validate(ClientState state) throws RequestValidationException KSMetaData ksm = Schema.instance.getKSMetaData(name); if (ksm == null) throw new InvalidRequestException("Unknown keyspace " + name); - if (ksm.name.equalsIgnoreCase(Keyspace.SYSTEM_KS)) + if (ksm.name.equalsIgnoreCase(SystemKeyspace.NAME)) throw new InvalidRequestException("Cannot alter system keyspace"); attrs.validate(); diff --git a/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java b/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java index ec9bb94b8a8c..7e48287ce86a 100644 --- a/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java +++ b/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java @@ -59,7 +59,7 @@ */ public class AtomicBTreeColumns extends ColumnFamily { - static final long EMPTY_SIZE = ObjectSizes.measure(new AtomicBTreeColumns(CFMetaData.IndexCf, null)) + static final long EMPTY_SIZE = ObjectSizes.measure(new AtomicBTreeColumns(SystemKeyspace.BuiltIndexesTable, null)) + ObjectSizes.measure(new Holder(null, null)); // Reserved values for wasteTracker field. These values must not be consecutive (see avoidReservedValues) diff --git a/src/java/org/apache/cassandra/db/BatchlogManager.java b/src/java/org/apache/cassandra/db/BatchlogManager.java index cf36a6493deb..b37de8b02ae8 100644 --- a/src/java/org/apache/cassandra/db/BatchlogManager.java +++ b/src/java/org/apache/cassandra/db/BatchlogManager.java @@ -36,7 +36,6 @@ import org.slf4j.LoggerFactory; import org.apache.cassandra.concurrent.DebuggableScheduledThreadPoolExecutor; -import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.cql3.UntypedResultSet; import org.apache.cassandra.db.compaction.CompactionManager; @@ -97,7 +96,7 @@ public void runMayThrow() throws ExecutionException, InterruptedException public int countAllBatches() { - String query = String.format("SELECT count(*) FROM %s.%s", Keyspace.SYSTEM_KS, SystemKeyspace.BATCHLOG_CF); + String query = String.format("SELECT count(*) FROM %s.%s", SystemKeyspace.NAME, SystemKeyspace.BATCHLOG_TABLE); return (int) executeInternal(query).one().getLong("count"); } @@ -132,12 +131,12 @@ public static Mutation getBatchlogMutationFor(Collection mutations, UU @VisibleForTesting static Mutation getBatchlogMutationFor(Collection mutations, UUID uuid, int version, long now) { - ColumnFamily cf = ArrayBackedSortedColumns.factory.create(CFMetaData.BatchlogCf); - CFRowAdder adder = new CFRowAdder(cf, CFMetaData.BatchlogCf.comparator.builder().build(), now); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(SystemKeyspace.BatchlogTable); + CFRowAdder adder = new CFRowAdder(cf, SystemKeyspace.BatchlogTable.comparator.builder().build(), now); adder.add("data", serializeMutations(mutations, version)) .add("written_at", new Date(now / 1000)) .add("version", version); - return new Mutation(Keyspace.SYSTEM_KS, UUIDType.instance.decompose(uuid), cf); + return new Mutation(SystemKeyspace.NAME, UUIDType.instance.decompose(uuid), cf); } private static ByteBuffer serializeMutations(Collection mutations, int version) @@ -168,8 +167,8 @@ private void replayAllFailedBatches() throws ExecutionException, InterruptedExce RateLimiter rateLimiter = RateLimiter.create(throttleInKB == 0 ? Double.MAX_VALUE : throttleInKB * 1024); UntypedResultSet page = executeInternal(String.format("SELECT id, data, written_at, version FROM %s.%s LIMIT %d", - Keyspace.SYSTEM_KS, - SystemKeyspace.BATCHLOG_CF, + SystemKeyspace.NAME, + SystemKeyspace.BATCHLOG_TABLE, PAGE_SIZE)); while (!page.isEmpty()) @@ -180,8 +179,8 @@ private void replayAllFailedBatches() throws ExecutionException, InterruptedExce break; // we've exhausted the batchlog, next query would be empty. page = executeInternal(String.format("SELECT id, data, written_at, version FROM %s.%s WHERE token(id) > token(?) LIMIT %d", - Keyspace.SYSTEM_KS, - SystemKeyspace.BATCHLOG_CF, + SystemKeyspace.NAME, + SystemKeyspace.BATCHLOG_TABLE, PAGE_SIZE), id); } @@ -193,8 +192,8 @@ private void replayAllFailedBatches() throws ExecutionException, InterruptedExce private void deleteBatch(UUID id) { - Mutation mutation = new Mutation(Keyspace.SYSTEM_KS, UUIDType.instance.decompose(id)); - mutation.delete(SystemKeyspace.BATCHLOG_CF, FBUtilities.timestampMicros()); + Mutation mutation = new Mutation(SystemKeyspace.NAME, UUIDType.instance.decompose(id)); + mutation.delete(SystemKeyspace.BATCHLOG_TABLE, FBUtilities.timestampMicros()); mutation.apply(); } @@ -442,7 +441,7 @@ public void response(MessageIn m) // force flush + compaction to reclaim space from the replayed batches private void cleanup() throws ExecutionException, InterruptedException { - ColumnFamilyStore cfs = Keyspace.open(Keyspace.SYSTEM_KS).getColumnFamilyStore(SystemKeyspace.BATCHLOG_CF); + ColumnFamilyStore cfs = Keyspace.open(SystemKeyspace.NAME).getColumnFamilyStore(SystemKeyspace.BATCHLOG_TABLE); cfs.forceBlockingFlush(); Collection descriptors = new ArrayList<>(); for (SSTableReader sstr : cfs.getSSTables()) diff --git a/src/java/org/apache/cassandra/db/DefsTables.java b/src/java/org/apache/cassandra/db/DefsTables.java index 748d3f4b37e0..a02f65e5ea2d 100644 --- a/src/java/org/apache/cassandra/db/DefsTables.java +++ b/src/java/org/apache/cassandra/db/DefsTables.java @@ -42,7 +42,6 @@ import org.apache.cassandra.db.marshal.UserType; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.service.MigrationManager; -import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.ByteBufferUtil; /** @@ -55,13 +54,13 @@ public class DefsTables private static final Logger logger = LoggerFactory.getLogger(DefsTables.class); /** - * Load keyspace definitions for the system keyspace (system.SCHEMA_KEYSPACES_CF) + * Load keyspace definitions for the system keyspace (system.SCHEMA_KEYSPACES_TABLE) * * @return Collection of found keyspace definitions */ public static Collection loadFromKeyspace() { - List serializedSchema = SystemKeyspace.serializedSchema(SystemKeyspace.SCHEMA_KEYSPACES_CF); + List serializedSchema = SystemKeyspace.serializedSchema(SystemKeyspace.SCHEMA_KEYSPACES_TABLE); List keyspaces = new ArrayList<>(serializedSchema.size()); @@ -78,17 +77,17 @@ public static Collection loadFromKeyspace() private static Row serializedColumnFamilies(DecoratedKey ksNameKey) { - ColumnFamilyStore cfsStore = SystemKeyspace.schemaCFS(SystemKeyspace.SCHEMA_COLUMNFAMILIES_CF); + ColumnFamilyStore cfsStore = SystemKeyspace.schemaCFS(SystemKeyspace.SCHEMA_COLUMNFAMILIES_TABLE); return new Row(ksNameKey, cfsStore.getColumnFamily(QueryFilter.getIdentityFilter(ksNameKey, - SystemKeyspace.SCHEMA_COLUMNFAMILIES_CF, + SystemKeyspace.SCHEMA_COLUMNFAMILIES_TABLE, System.currentTimeMillis()))); } private static Row serializedUserTypes(DecoratedKey ksNameKey) { - ColumnFamilyStore cfsStore = SystemKeyspace.schemaCFS(SystemKeyspace.SCHEMA_USER_TYPES_CF); + ColumnFamilyStore cfsStore = SystemKeyspace.schemaCFS(SystemKeyspace.SCHEMA_USER_TYPES_TABLE); return new Row(ksNameKey, cfsStore.getColumnFamily(QueryFilter.getIdentityFilter(ksNameKey, - SystemKeyspace.SCHEMA_USER_TYPES_CF, + SystemKeyspace.SCHEMA_USER_TYPES_TABLE, System.currentTimeMillis()))); } @@ -115,10 +114,10 @@ public static synchronized void mergeSchemaInternal(Collection mutatio keyspaces.add(ByteBufferUtil.string(mutation.key())); // current state of the schema - Map oldKeyspaces = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_KEYSPACES_CF, keyspaces); - Map oldColumnFamilies = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_COLUMNFAMILIES_CF, keyspaces); - Map oldTypes = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_USER_TYPES_CF, keyspaces); - Map oldFunctions = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_FUNCTIONS_CF); + Map oldKeyspaces = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_KEYSPACES_TABLE, keyspaces); + Map oldColumnFamilies = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_COLUMNFAMILIES_TABLE, keyspaces); + Map oldTypes = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_USER_TYPES_TABLE, keyspaces); + Map oldFunctions = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_FUNCTIONS_TABLE); for (Mutation mutation : mutations) mutation.apply(); @@ -127,10 +126,10 @@ public static synchronized void mergeSchemaInternal(Collection mutatio flushSchemaCFs(); // with new data applied - Map newKeyspaces = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_KEYSPACES_CF, keyspaces); - Map newColumnFamilies = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_COLUMNFAMILIES_CF, keyspaces); - Map newTypes = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_USER_TYPES_CF, keyspaces); - Map newFunctions = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_FUNCTIONS_CF); + Map newKeyspaces = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_KEYSPACES_TABLE, keyspaces); + Map newColumnFamilies = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_COLUMNFAMILIES_TABLE, keyspaces); + Map newTypes = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_USER_TYPES_TABLE, keyspaces); + Map newFunctions = SystemKeyspace.getSchema(SystemKeyspace.SCHEMA_FUNCTIONS_TABLE); Set keyspacesToDrop = mergeKeyspaces(oldKeyspaces, newKeyspaces); mergeColumnFamilies(oldColumnFamilies, newColumnFamilies); @@ -531,7 +530,7 @@ private static KSMetaData makeNewKeyspaceDefinition(KSMetaData ksm, CFMetaData t private static void flushSchemaCFs() { - for (String cf : SystemKeyspace.allSchemaCfs) + for (String cf : SystemKeyspace.ALL_SCHEMA_TABLES) SystemKeyspace.forceBlockingFlush(cf); } } diff --git a/src/java/org/apache/cassandra/db/HintedHandOffManager.java b/src/java/org/apache/cassandra/db/HintedHandOffManager.java index da9d78d2e98d..bab9aa8cd2ee 100644 --- a/src/java/org/apache/cassandra/db/HintedHandOffManager.java +++ b/src/java/org/apache/cassandra/db/HintedHandOffManager.java @@ -40,7 +40,6 @@ import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutor; import org.apache.cassandra.concurrent.NamedThreadFactory; -import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.config.Schema; import org.apache.cassandra.db.composites.CellName; @@ -115,7 +114,7 @@ public class HintedHandOffManager implements HintedHandOffManagerMBean new NamedThreadFactory("HintedHandoff", Thread.MIN_PRIORITY), "internal"); - private final ColumnFamilyStore hintStore = Keyspace.open(Keyspace.SYSTEM_KS).getColumnFamilyStore(SystemKeyspace.HINTS_CF); + private final ColumnFamilyStore hintStore = Keyspace.open(SystemKeyspace.NAME).getColumnFamilyStore(SystemKeyspace.HINTS_TABLE); /** * Returns a mutation representing a Hint to be sent to targetId @@ -134,11 +133,11 @@ public Mutation hintFor(Mutation mutation, long now, int ttl, UUID targetId) UUID hintId = UUIDGen.getTimeUUID(); // serialize the hint with id and version as a composite column name - CellName name = CFMetaData.HintsCf.comparator.makeCellName(hintId, MessagingService.current_version); + CellName name = SystemKeyspace.HintsTable.comparator.makeCellName(hintId, MessagingService.current_version); ByteBuffer value = ByteBuffer.wrap(FBUtilities.serialize(mutation, Mutation.serializer, MessagingService.current_version)); - ColumnFamily cf = ArrayBackedSortedColumns.factory.create(Schema.instance.getCFMetaData(Keyspace.SYSTEM_KS, SystemKeyspace.HINTS_CF)); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(Schema.instance.getCFMetaData(SystemKeyspace.NAME, SystemKeyspace.HINTS_TABLE)); cf.addColumn(name, value, now, ttl); - return new Mutation(Keyspace.SYSTEM_KS, UUIDType.instance.decompose(targetId), cf); + return new Mutation(SystemKeyspace.NAME, UUIDType.instance.decompose(targetId), cf); } /* @@ -181,8 +180,8 @@ public void run() private static void deleteHint(ByteBuffer tokenBytes, CellName columnName, long timestamp) { - Mutation mutation = new Mutation(Keyspace.SYSTEM_KS, tokenBytes); - mutation.delete(SystemKeyspace.HINTS_CF, columnName, timestamp); + Mutation mutation = new Mutation(SystemKeyspace.NAME, tokenBytes); + mutation.delete(SystemKeyspace.HINTS_TABLE, columnName, timestamp); mutation.applyUnsafe(); // don't bother with commitlog since we're going to flush as soon as we're done with delivery } @@ -206,8 +205,8 @@ public void deleteHintsForEndpoint(final InetAddress endpoint) return; UUID hostId = StorageService.instance.getTokenMetadata().getHostId(endpoint); ByteBuffer hostIdBytes = ByteBuffer.wrap(UUIDGen.decompose(hostId)); - final Mutation mutation = new Mutation(Keyspace.SYSTEM_KS, hostIdBytes); - mutation.delete(SystemKeyspace.HINTS_CF, System.currentTimeMillis()); + final Mutation mutation = new Mutation(SystemKeyspace.NAME, hostIdBytes); + mutation.delete(SystemKeyspace.HINTS_TABLE, System.currentTimeMillis()); // execute asynchronously to avoid blocking caller (which may be processing gossip) Runnable runnable = new Runnable() @@ -241,7 +240,7 @@ public void run() try { logger.info("Truncating all stored hints."); - Keyspace.open(Keyspace.SYSTEM_KS).getColumnFamilyStore(SystemKeyspace.HINTS_CF).truncateBlocking(); + Keyspace.open(SystemKeyspace.NAME).getColumnFamilyStore(SystemKeyspace.HINTS_TABLE).truncateBlocking(); } catch (Exception e) { @@ -375,7 +374,7 @@ private void doDeliverHintsToEndpoint(InetAddress endpoint) { long now = System.currentTimeMillis(); QueryFilter filter = QueryFilter.getSliceFilter(epkey, - SystemKeyspace.HINTS_CF, + SystemKeyspace.HINTS_TABLE, startColumn, Composites.EMPTY, false, @@ -600,8 +599,8 @@ private List getHintsSlice(int columnCount) try { - RangeSliceCommand cmd = new RangeSliceCommand(Keyspace.SYSTEM_KS, - SystemKeyspace.HINTS_CF, + RangeSliceCommand cmd = new RangeSliceCommand(SystemKeyspace.NAME, + SystemKeyspace.HINTS_TABLE, System.currentTimeMillis(), predicate, range, diff --git a/src/java/org/apache/cassandra/db/Keyspace.java b/src/java/org/apache/cassandra/db/Keyspace.java index 8986154d52b7..09fc33876677 100644 --- a/src/java/org/apache/cassandra/db/Keyspace.java +++ b/src/java/org/apache/cassandra/db/Keyspace.java @@ -57,7 +57,6 @@ */ public class Keyspace { - public static final String SYSTEM_KS = "system"; private static final int DEFAULT_PAGE_SIZE = 10000; private static final Logger logger = LoggerFactory.getLogger(Keyspace.class); @@ -75,7 +74,7 @@ public class Keyspace public final OpOrder writeOrder = new OpOrder(); /* ColumnFamilyStore per column family */ - private final ConcurrentMap columnFamilyStores = new ConcurrentHashMap(); + private final ConcurrentMap columnFamilyStores = new ConcurrentHashMap<>(); private volatile AbstractReplicationStrategy replicationStrategy; public static final Function keyspaceTransformer = new Function() @@ -94,7 +93,7 @@ public static void setInitialized() public static Keyspace open(String keyspaceName) { - assert initialized || keyspaceName.equals(SYSTEM_KS); + assert initialized || keyspaceName.equals(SystemKeyspace.NAME); return open(keyspaceName, Schema.instance, true); } @@ -273,7 +272,7 @@ private Keyspace(String keyspaceName, boolean loadSSTables) createReplicationStrategy(metadata); this.metric = new KeyspaceMetrics(this); - for (CFMetaData cfm : new ArrayList(metadata.cfMetaData().values())) + for (CFMetaData cfm : new ArrayList<>(metadata.cfMetaData().values())) { logger.debug("Initializing {}.{}", getName(), cfm.cfName); initCf(cfm.cfId, cfm.cfName, loadSSTables); @@ -425,7 +424,7 @@ public static void indexRow(DecoratedKey key, ColumnFamilyStore cfs, Set public List> flush() { - List> futures = new ArrayList>(columnFamilyStores.size()); + List> futures = new ArrayList<>(columnFamilyStores.size()); for (UUID cfId : columnFamilyStores.keySet()) futures.add(columnFamilyStores.get(cfId).forceFlush()); return futures; @@ -443,7 +442,7 @@ public static Iterable nonSystem() public static Iterable system() { - return Iterables.transform(Schema.systemKeyspaceNames, keyspaceTransformer); + return Iterables.transform(Collections.singleton(SystemKeyspace.NAME), keyspaceTransformer); } @Override diff --git a/src/java/org/apache/cassandra/db/Memtable.java b/src/java/org/apache/cassandra/db/Memtable.java index 21a36b832a4c..565bf044f3ab 100644 --- a/src/java/org/apache/cassandra/db/Memtable.java +++ b/src/java/org/apache/cassandra/db/Memtable.java @@ -343,7 +343,7 @@ private SSTableReader writeSortedContents(ReplayPosition context, File sstableDi // and BL data is strictly local, so we don't need to preserve tombstones for repair. // If we have a data row + row level tombstone, then writing it is effectively an expensive no-op so we skip it. // See CASSANDRA-4667. - if (cfs.name.equals(SystemKeyspace.BATCHLOG_CF) && cfs.keyspace.getName().equals(Keyspace.SYSTEM_KS)) + if (cfs.name.equals(SystemKeyspace.BATCHLOG_TABLE) && cfs.keyspace.getName().equals(SystemKeyspace.NAME)) continue; } diff --git a/src/java/org/apache/cassandra/db/SystemKeyspace.java b/src/java/org/apache/cassandra/db/SystemKeyspace.java index 4b18f7fe224a..49c150263ac1 100644 --- a/src/java/org/apache/cassandra/db/SystemKeyspace.java +++ b/src/java/org/apache/cassandra/db/SystemKeyspace.java @@ -22,6 +22,7 @@ import java.net.InetAddress; import java.nio.ByteBuffer; import java.util.*; +import java.util.concurrent.TimeUnit; import javax.management.openmbean.*; import com.google.common.base.Function; @@ -29,7 +30,6 @@ import com.google.common.collect.Iterables; import com.google.common.collect.SetMultimap; import com.google.common.collect.Sets; -import org.apache.cassandra.io.sstable.format.SSTableReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,14 +43,17 @@ import org.apache.cassandra.db.columniterator.IdentityQueryFilter; import org.apache.cassandra.db.compaction.CompactionHistoryTabularData; import org.apache.cassandra.db.commitlog.ReplayPosition; +import org.apache.cassandra.db.compaction.LeveledCompactionStrategy; import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.db.filter.QueryFilter; import org.apache.cassandra.db.marshal.*; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.io.util.DataOutputBuffer; import org.apache.cassandra.locator.IEndpointSnitch; +import org.apache.cassandra.locator.LocalStrategy; import org.apache.cassandra.metrics.RestorableMeter; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.service.paxos.Commit; @@ -62,39 +65,292 @@ import static org.apache.cassandra.cql3.QueryProcessor.executeInternal; import static org.apache.cassandra.cql3.QueryProcessor.executeOnceInternal; -public class SystemKeyspace +public final class SystemKeyspace { private static final Logger logger = LoggerFactory.getLogger(SystemKeyspace.class); - // see CFMetaData for schema definitions - public static final String PEERS_CF = "peers"; - public static final String PEER_EVENTS_CF = "peer_events"; - public static final String LOCAL_CF = "local"; - public static final String INDEX_CF = "IndexInfo"; - public static final String HINTS_CF = "hints"; - public static final String RANGE_XFERS_CF = "range_xfers"; - public static final String BATCHLOG_CF = "batchlog"; - // see layout description in the DefsTables class header - public static final String SCHEMA_KEYSPACES_CF = "schema_keyspaces"; - public static final String SCHEMA_COLUMNFAMILIES_CF = "schema_columnfamilies"; - public static final String SCHEMA_COLUMNS_CF = "schema_columns"; - public static final String SCHEMA_TRIGGERS_CF = "schema_triggers"; - public static final String SCHEMA_USER_TYPES_CF = "schema_usertypes"; - public static final String SCHEMA_FUNCTIONS_CF = "schema_functions"; - public static final String COMPACTION_LOG = "compactions_in_progress"; - public static final String PAXOS_CF = "paxos"; - public static final String SSTABLE_ACTIVITY_CF = "sstable_activity"; - public static final String COMPACTION_HISTORY_CF = "compaction_history"; + public static final String NAME = "system"; + + public static final String SCHEMA_KEYSPACES_TABLE = "schema_keyspaces"; + public static final String SCHEMA_COLUMNFAMILIES_TABLE = "schema_columnfamilies"; + public static final String SCHEMA_COLUMNS_TABLE = "schema_columns"; + public static final String SCHEMA_TRIGGERS_TABLE = "schema_triggers"; + public static final String SCHEMA_USER_TYPES_TABLE = "schema_usertypes"; + public static final String SCHEMA_FUNCTIONS_TABLE = "schema_functions"; + + public static final String BUILT_INDEXES_TABLE = "IndexInfo"; + public static final String HINTS_TABLE = "hints"; + public static final String BATCHLOG_TABLE = "batchlog"; + public static final String PAXOS_TABLE = "paxos"; + public static final String LOCAL_TABLE = "local"; + public static final String PEERS_TABLE = "peers"; + public static final String PEER_EVENTS_TABLE = "peer_events"; + public static final String RANGE_XFERS_TABLE = "range_xfers"; + public static final String COMPACTION_LOG_TABLE = "compactions_in_progress"; + public static final String COMPACTION_HISTORY_TABLE = "compaction_history"; + public static final String SSTABLE_ACTIVITY_TABLE = "sstable_activity"; + + public static final List ALL_SCHEMA_TABLES = + Arrays.asList(SCHEMA_KEYSPACES_TABLE, + SCHEMA_COLUMNFAMILIES_TABLE, + SCHEMA_COLUMNS_TABLE, + SCHEMA_TRIGGERS_TABLE, + SCHEMA_USER_TYPES_TABLE, + SCHEMA_FUNCTIONS_TABLE); + + private static int WEEK = (int) TimeUnit.DAYS.toSeconds(7); + + public static final CFMetaData SchemaKeyspacesTable = + compile(SCHEMA_KEYSPACES_TABLE, "keyspace definitions", + "CREATE TABLE %s (" + + "keyspace_name text," + + "durable_writes boolean," + + "strategy_class text," + + "strategy_options text," + + "PRIMARY KEY ((keyspace_name))) " + + "WITH COMPACT STORAGE") + .gcGraceSeconds(WEEK); + + public static final CFMetaData SchemaColumnFamiliesTable = + compile(SCHEMA_COLUMNFAMILIES_TABLE, "table definitions", + "CREATE TABLE %s (" + + "keyspace_name text," + + "columnfamily_name text," + + "bloom_filter_fp_chance double," + + "caching text," + + "cf_id uuid," // post-2.1 UUID cfid + + "column_aliases text," + + "comment text," + + "compaction_strategy_class text," + + "compaction_strategy_options text," + + "comparator text," + + "compression_parameters text," + + "default_time_to_live int," + + "default_validator text," + + "dropped_columns map," + + "gc_grace_seconds int," + + "index_interval int," + + "is_dense boolean," + + "key_aliases text," + + "key_validator text," + + "local_read_repair_chance double," + + "max_compaction_threshold int," + + "max_index_interval int," + + "memtable_flush_period_in_ms int," + + "min_compaction_threshold int," + + "min_index_interval int," + + "read_repair_chance double," + + "speculative_retry text," + + "subcomparator text," + + "type text," + + "value_alias text," + + "PRIMARY KEY ((keyspace_name), columnfamily_name))") + .gcGraceSeconds(WEEK); + + public static final CFMetaData SchemaColumnsTable = + compile(SCHEMA_COLUMNS_TABLE, "column definitions", + "CREATE TABLE %s (" + + "keyspace_name text," + + "columnfamily_name text," + + "column_name text," + + "component_index int," + + "index_name text," + + "index_options text," + + "index_type text," + + "type text," + + "validator text," + + "PRIMARY KEY ((keyspace_name), columnfamily_name, column_name))") + .gcGraceSeconds(WEEK); + + public static final CFMetaData SchemaTriggersTable = + compile(SCHEMA_TRIGGERS_TABLE, "trigger definitions", + "CREATE TABLE %s (" + + "keyspace_name text," + + "columnfamily_name text," + + "trigger_name text," + + "trigger_options map," + + "PRIMARY KEY ((keyspace_name), columnfamily_name, trigger_name))") + .gcGraceSeconds(WEEK); + + public static final CFMetaData SchemaUserTypesTable = + compile(SCHEMA_USER_TYPES_TABLE, "user defined type definitions", + "CREATE TABLE %s (" + + "keyspace_name text," + + "type_name text," + + "field_names list," + + "field_types list," + + "PRIMARY KEY ((keyspace_name), type_name))") + .gcGraceSeconds(WEEK); + + public static final CFMetaData SchemaFunctionsTable = + compile(SCHEMA_FUNCTIONS_TABLE, "user defined function definitions", + "CREATE TABLE %s (" + + "namespace text," + + "name text," + + "signature blob," + + "argument_names list," + + "argument_types list," + + "body text," + + "deterministic boolean," + + "language text," + + "return_type text," + + "PRIMARY KEY ((namespace, name), signature))") + .gcGraceSeconds(WEEK); + + public static final CFMetaData BuiltIndexesTable = + compile(BUILT_INDEXES_TABLE, "built column indexes", + "CREATE TABLE \"%s\" (" + + "table_name text," + + "index_name text," + + "PRIMARY KEY ((table_name), index_name)) " + + "WITH COMPACT STORAGE"); + + public static final CFMetaData HintsTable = + compile(HINTS_TABLE, "hints awaiting delivery", + "CREATE TABLE %s (" + + "target_id uuid," + + "hint_id timeuuid," + + "message_version int," + + "mutation blob," + + "PRIMARY KEY ((target_id), hint_id, message_version)) " + + "WITH COMPACT STORAGE") + .compactionStrategyOptions(Collections.singletonMap("enabled", "false")) + .gcGraceSeconds(0); + + public static final CFMetaData BatchlogTable = + compile(BATCHLOG_TABLE, "batches awaiting replay", + "CREATE TABLE %s (" + + "id uuid," + + "data blob," + + "version int," + + "written_at timestamp," + + "PRIMARY KEY ((id)))") + .compactionStrategyOptions(Collections.singletonMap("min_threshold", "2")) + .gcGraceSeconds(0); + + private static final CFMetaData PaxosTable = + compile(PAXOS_TABLE, "in-progress paxos proposals", + "CREATE TABLE %s (" + + "row_key blob," + + "cf_id UUID," + + "in_progress_ballot timeuuid," + + "most_recent_commit blob," + + "most_recent_commit_at timeuuid," + + "proposal blob," + + "proposal_ballot timeuuid," + + "PRIMARY KEY ((row_key), cf_id))") + .compactionStrategyClass(LeveledCompactionStrategy.class); + + private static final CFMetaData LocalTable = + compile(LOCAL_TABLE, "information about the local node", + "CREATE TABLE %s (" + + "key text," + + "bootstrapped text," + + "cluster_name text," + + "cql_version text," + + "data_center text," + + "gossip_generation int," + + "host_id uuid," + + "native_protocol_version text," + + "partitioner text," + + "rack text," + + "release_version text," + + "schema_version uuid," + + "thrift_version text," + + "tokens set," + + "truncated_at map," + + "PRIMARY KEY ((key)))"); + + private static final CFMetaData PeersTable = + compile(PEERS_TABLE, "information about known peers in the cluster", + "CREATE TABLE %s (" + + "peer inet," + + "data_center text," + + "host_id uuid," + + "preferred_ip inet," + + "rack text," + + "release_version text," + + "rpc_address inet," + + "schema_version uuid," + + "tokens set," + + "PRIMARY KEY ((peer)))"); + + private static final CFMetaData PeerEventsTable = + compile(PEER_EVENTS_TABLE, "events related to peers", + "CREATE TABLE %s (" + + "peer inet," + + "hints_dropped map," + + "PRIMARY KEY ((peer)))"); + + private static final CFMetaData RangeXfersTable = + compile(RANGE_XFERS_TABLE, "ranges requested for transfer", + "CREATE TABLE %s (" + + "token_bytes blob," + + "requested_at timestamp," + + "PRIMARY KEY ((token_bytes)))"); + + private static final CFMetaData CompactionLogTable = + compile(COMPACTION_LOG_TABLE, "unfinished compactions", + "CREATE TABLE %s (" + + "id uuid," + + "columnfamily_name text," + + "inputs set," + + "keyspace_name text," + + "PRIMARY KEY ((id)))"); + + private static final CFMetaData CompactionHistoryTable = + compile(COMPACTION_HISTORY_TABLE, "week-long compaction history", + "CREATE TABLE %s (" + + "id uuid," + + "bytes_in bigint," + + "bytes_out bigint," + + "columnfamily_name text," + + "compacted_at timestamp," + + "keyspace_name text," + + "rows_merged map," + + "PRIMARY KEY ((id)))") + .defaultTimeToLive(WEEK); + + private static final CFMetaData SSTableActivityTable = + compile(SSTABLE_ACTIVITY_TABLE, "historic sstable read rates", + "CREATE TABLE %s (" + + "keyspace_name text," + + "columnfamily_name text," + + "generation int," + + "rate_120m double," + + "rate_15m double," + + "PRIMARY KEY ((keyspace_name, columnfamily_name, generation)))"); + + private static CFMetaData compile(String table, String comment, String cql) + { + return CFMetaData.compile(String.format(cql, table), NAME).comment(comment); + } + + public static KSMetaData definition() + { + List tables = + Arrays.asList(SchemaKeyspacesTable, + SchemaColumnFamiliesTable, + SchemaColumnsTable, + SchemaTriggersTable, + SchemaUserTypesTable, + SchemaFunctionsTable, + BuiltIndexesTable, + HintsTable, + BatchlogTable, + PaxosTable, + LocalTable, + PeersTable, + PeerEventsTable, + RangeXfersTable, + CompactionLogTable, + CompactionHistoryTable, + SSTableActivityTable); + return new KSMetaData(NAME, LocalStrategy.class, Collections.emptyMap(), true, tables); + } private static final String LOCAL_KEY = "local"; - public static final List allSchemaCfs = Arrays.asList(SCHEMA_KEYSPACES_CF, - SCHEMA_COLUMNFAMILIES_CF, - SCHEMA_COLUMNS_CF, - SCHEMA_TRIGGERS_CF, - SCHEMA_USER_TYPES_CF, - SCHEMA_FUNCTIONS_CF); - private static volatile Map> truncationRecords; public enum BootstrapState @@ -116,15 +372,14 @@ public static void finishStartup() migrateIndexInterval(); migrateCachingOption(); // add entries to system schema columnfamilies for the hardcoded system definitions - KSMetaData ksmd = Schema.instance.getKSMetaData(Keyspace.SYSTEM_KS); + KSMetaData ksmd = Schema.instance.getKSMetaData(NAME); - // delete old, possibly obsolete entries in schema columnfamilies - for (String cfname : Arrays.asList(SystemKeyspace.SCHEMA_KEYSPACES_CF, - SystemKeyspace.SCHEMA_COLUMNFAMILIES_CF, - SystemKeyspace.SCHEMA_COLUMNS_CF, - SystemKeyspace.SCHEMA_TRIGGERS_CF, - SystemKeyspace.SCHEMA_USER_TYPES_CF)) - executeOnceInternal(String.format("DELETE FROM system.%s WHERE keyspace_name = ?", cfname), ksmd.name); + // delete old, possibly obsolete entries in schema tables + // FIXME: once schema_functions moves from 'namespace' to 'keyspace_name', fix this + List schemaTables = new ArrayList<>(ALL_SCHEMA_TABLES); + schemaTables.remove(SCHEMA_FUNCTIONS_TABLE); + for (String table : schemaTables) + executeOnceInternal(String.format("DELETE FROM system.%s WHERE keyspace_name = ?", table), ksmd.name); // (+1 to timestamp to make sure we don't get shadowed by the tombstones we just added) ksmd.toSchema(FBUtilities.timestampMicros() + 1).apply(); @@ -134,7 +389,7 @@ private static void setupVersion() { String req = "INSERT INTO system.%s (key, release_version, cql_version, thrift_version, native_protocol_version, data_center, rack, partitioner) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; IEndpointSnitch snitch = DatabaseDescriptor.getEndpointSnitch(); - executeOnceInternal(String.format(req, LOCAL_CF), + executeOnceInternal(String.format(req, LOCAL_TABLE), LOCAL_KEY, FBUtilities.getReleaseVersionString(), QueryProcessor.CQL_VERSION.toString(), @@ -149,7 +404,7 @@ private static void setupVersion() /** Migrates index_interval values to min_index_interval and sets index_interval to null */ private static void migrateIndexInterval() { - for (UntypedResultSet.Row row : executeOnceInternal(String.format("SELECT * FROM system.%s", SCHEMA_COLUMNFAMILIES_CF))) + for (UntypedResultSet.Row row : executeOnceInternal(String.format("SELECT * FROM system.%s", SCHEMA_COLUMNFAMILIES_TABLE))) { if (!row.has("index_interval")) continue; @@ -157,7 +412,7 @@ private static void migrateIndexInterval() logger.debug("Migrating index_interval to min_index_interval"); CFMetaData table = CFMetaData.fromSchema(row); - String query = String.format("SELECT writetime(type) FROM system.%s WHERE keyspace_name = ? AND columnfamily_name = ?", SCHEMA_COLUMNFAMILIES_CF); + String query = String.format("SELECT writetime(type) FROM system.%s WHERE keyspace_name = ? AND columnfamily_name = ?", SCHEMA_COLUMNFAMILIES_TABLE); long timestamp = executeOnceInternal(query, table.ksName, table.cfName).one().getLong("writetime(type)"); try { @@ -172,7 +427,7 @@ private static void migrateIndexInterval() private static void migrateCachingOption() { - for (UntypedResultSet.Row row : executeOnceInternal(String.format("SELECT * FROM system.%s", SCHEMA_COLUMNFAMILIES_CF))) + for (UntypedResultSet.Row row : executeOnceInternal(String.format("SELECT * FROM system.%s", SCHEMA_COLUMNFAMILIES_TABLE))) { if (!row.has("caching")) continue; @@ -184,7 +439,7 @@ private static void migrateCachingOption() CachingOptions caching = CachingOptions.fromString(row.getString("caching")); CFMetaData table = CFMetaData.fromSchema(row); logger.info("Migrating caching option {} to {} for {}.{}", row.getString("caching"), caching.toString(), table.ksName, table.cfName); - String query = String.format("SELECT writetime(type) FROM system.%s WHERE keyspace_name = ? AND columnfamily_name = ?", SCHEMA_COLUMNFAMILIES_CF); + String query = String.format("SELECT writetime(type) FROM system.%s WHERE keyspace_name = ? AND columnfamily_name = ?", SCHEMA_COLUMNFAMILIES_TABLE); long timestamp = executeOnceInternal(query, table.ksName, table.cfName).one().getLong("writetime(type)"); table.toSchema(timestamp).apply(); } @@ -198,13 +453,13 @@ private static void migrateCachingOption() /** * Write compaction log, except columfamilies under system keyspace. * - * @param cfs + * @param cfs cfs to compact * @param toCompact sstables to compact * @return compaction task id or null if cfs is under system keyspace */ public static UUID startCompaction(ColumnFamilyStore cfs, Iterable toCompact) { - if (Keyspace.SYSTEM_KS.equals(cfs.keyspace.getName())) + if (NAME.equals(cfs.keyspace.getName())) return null; UUID compactionId = UUIDGen.getTimeUUID(); @@ -216,8 +471,8 @@ public Integer apply(SSTableReader sstable) } }); String req = "INSERT INTO system.%s (id, keyspace_name, columnfamily_name, inputs) VALUES (?, ?, ?, ?)"; - executeInternal(String.format(req, COMPACTION_LOG), compactionId, cfs.keyspace.getName(), cfs.name, Sets.newHashSet(generations)); - forceBlockingFlush(COMPACTION_LOG); + executeInternal(String.format(req, COMPACTION_LOG_TABLE), compactionId, cfs.keyspace.getName(), cfs.name, Sets.newHashSet(generations)); + forceBlockingFlush(COMPACTION_LOG_TABLE); return compactionId; } @@ -230,8 +485,8 @@ public static void finishCompaction(UUID taskId) { assert taskId != null; - executeInternal(String.format("DELETE FROM system.%s WHERE id = ?", COMPACTION_LOG), taskId); - forceBlockingFlush(COMPACTION_LOG); + executeInternal(String.format("DELETE FROM system.%s WHERE id = ?", COMPACTION_LOG_TABLE), taskId); + forceBlockingFlush(COMPACTION_LOG_TABLE); } /** @@ -241,7 +496,7 @@ public static void finishCompaction(UUID taskId) public static Map, Map> getUnfinishedCompactions() { String req = "SELECT * FROM system.%s"; - UntypedResultSet resultSet = executeInternal(String.format(req, COMPACTION_LOG)); + UntypedResultSet resultSet = executeInternal(String.format(req, COMPACTION_LOG_TABLE)); Map, Map> unfinishedCompactions = new HashMap<>(); for (UntypedResultSet.Row row : resultSet) @@ -266,7 +521,7 @@ public static Map, Map> getUnfinishedCompact public static void discardCompactionsInProgress() { - ColumnFamilyStore compactionLog = Keyspace.open(Keyspace.SYSTEM_KS).getColumnFamilyStore(COMPACTION_LOG); + ColumnFamilyStore compactionLog = Keyspace.open(NAME).getColumnFamilyStore(COMPACTION_LOG_TABLE); compactionLog.truncateBlocking(); } @@ -278,24 +533,24 @@ public static void updateCompactionHistory(String ksname, Map rowsMerged) { // don't write anything when the history table itself is compacted, since that would in turn cause new compactions - if (ksname.equals("system") && cfname.equals(COMPACTION_HISTORY_CF)) + if (ksname.equals("system") && cfname.equals(COMPACTION_HISTORY_TABLE)) return; String req = "INSERT INTO system.%s (id, keyspace_name, columnfamily_name, compacted_at, bytes_in, bytes_out, rows_merged) VALUES (?, ?, ?, ?, ?, ?, ?)"; - executeInternal(String.format(req, COMPACTION_HISTORY_CF), UUIDGen.getTimeUUID(), ksname, cfname, ByteBufferUtil.bytes(compactedAt), bytesIn, bytesOut, rowsMerged); + executeInternal(String.format(req, COMPACTION_HISTORY_TABLE), UUIDGen.getTimeUUID(), ksname, cfname, ByteBufferUtil.bytes(compactedAt), bytesIn, bytesOut, rowsMerged); } public static TabularData getCompactionHistory() throws OpenDataException { - UntypedResultSet queryResultSet = executeInternal(String.format("SELECT * from system.%s", COMPACTION_HISTORY_CF)); + UntypedResultSet queryResultSet = executeInternal(String.format("SELECT * from system.%s", COMPACTION_HISTORY_TABLE)); return CompactionHistoryTabularData.from(queryResultSet); } public static synchronized void saveTruncationRecord(ColumnFamilyStore cfs, long truncatedAt, ReplayPosition position) { String req = "UPDATE system.%s SET truncated_at = truncated_at + ? WHERE key = '%s'"; - executeInternal(String.format(req, LOCAL_CF, LOCAL_KEY), truncationAsMapEntry(cfs, truncatedAt, position)); + executeInternal(String.format(req, LOCAL_TABLE, LOCAL_KEY), truncationAsMapEntry(cfs, truncatedAt, position)); truncationRecords = null; - forceBlockingFlush(LOCAL_CF); + forceBlockingFlush(LOCAL_TABLE); } /** @@ -304,9 +559,9 @@ public static synchronized void saveTruncationRecord(ColumnFamilyStore cfs, long public static synchronized void removeTruncationRecord(UUID cfId) { String req = "DELETE truncated_at[?] from system.%s WHERE key = '%s'"; - executeInternal(String.format(req, LOCAL_CF, LOCAL_KEY), cfId); + executeInternal(String.format(req, LOCAL_TABLE, LOCAL_KEY), cfId); truncationRecords = null; - forceBlockingFlush(LOCAL_CF); + forceBlockingFlush(LOCAL_TABLE); } private static Map truncationAsMapEntry(ColumnFamilyStore cfs, long truncatedAt, ReplayPosition position) @@ -321,7 +576,7 @@ private static Map truncationAsMapEntry(ColumnFamilyStore cfs, { throw new RuntimeException(e); } - return Collections.singletonMap(cfs.metadata.cfId, ByteBuffer.wrap(out.getData(), 0, out.getLength())); + return Collections.singletonMap(cfs.metadata.cfId, ByteBuffer.wrap(out.getData(), 0, out.getLength())); } public static ReplayPosition getTruncatedPosition(UUID cfId) @@ -345,7 +600,7 @@ private static synchronized Pair getTruncationRecord(UUID private static Map> readTruncationRecords() { - UntypedResultSet rows = executeInternal(String.format("SELECT truncated_at FROM system.%s WHERE key = '%s'", LOCAL_CF, LOCAL_KEY)); + UntypedResultSet rows = executeInternal(String.format("SELECT truncated_at FROM system.%s WHERE key = '%s'", LOCAL_TABLE, LOCAL_KEY)); Map> records = new HashMap<>(); @@ -384,14 +639,14 @@ public static synchronized void updateTokens(InetAddress ep, Collection t } String req = "INSERT INTO system.%s (peer, tokens) VALUES (?, ?)"; - executeInternal(String.format(req, PEERS_CF), ep, tokensAsSet(tokens)); + executeInternal(String.format(req, PEERS_TABLE), ep, tokensAsSet(tokens)); } public static synchronized void updatePreferredIP(InetAddress ep, InetAddress preferred_ip) { String req = "INSERT INTO system.%s (peer, preferred_ip) VALUES (?, ?)"; - executeInternal(String.format(req, PEERS_CF), ep, preferred_ip); - forceBlockingFlush(PEERS_CF); + executeInternal(String.format(req, PEERS_TABLE), ep, preferred_ip); + forceBlockingFlush(PEERS_TABLE); } public static synchronized void updatePeerInfo(InetAddress ep, String columnName, Object value) @@ -400,20 +655,20 @@ public static synchronized void updatePeerInfo(InetAddress ep, String columnName return; String req = "INSERT INTO system.%s (peer, %s) VALUES (?, ?)"; - executeInternal(String.format(req, PEERS_CF, columnName), ep, value); + executeInternal(String.format(req, PEERS_TABLE, columnName), ep, value); } public static synchronized void updateHintsDropped(InetAddress ep, UUID timePeriod, int value) { // with 30 day TTL String req = "UPDATE system.%s USING TTL 2592000 SET hints_dropped[ ? ] = ? WHERE peer = ?"; - executeInternal(String.format(req, PEER_EVENTS_CF), timePeriod, value, ep); + executeInternal(String.format(req, PEER_EVENTS_TABLE), timePeriod, value, ep); } public static synchronized void updateSchemaVersion(UUID version) { String req = "INSERT INTO system.%s (key, schema_version) VALUES ('%s', ?)"; - executeInternal(String.format(req, LOCAL_CF, LOCAL_KEY), version); + executeInternal(String.format(req, LOCAL_TABLE, LOCAL_KEY), version); } private static Set tokensAsSet(Collection tokens) @@ -428,7 +683,7 @@ private static Set tokensAsSet(Collection tokens) private static Collection deserializeTokens(Collection tokensStrings) { Token.TokenFactory factory = StorageService.getPartitioner().getTokenFactory(); - List tokens = new ArrayList(tokensStrings.size()); + List tokens = new ArrayList<>(tokensStrings.size()); for (String tk : tokensStrings) tokens.add(factory.fromString(tk)); return tokens; @@ -440,7 +695,7 @@ private static Collection deserializeTokens(Collection tokensStri public static synchronized void removeEndpoint(InetAddress ep) { String req = "DELETE FROM system.%s WHERE peer = ?"; - executeInternal(String.format(req, PEERS_CF), ep); + executeInternal(String.format(req, PEERS_TABLE), ep); } /** @@ -450,8 +705,8 @@ public static synchronized void updateTokens(Collection tokens) { assert !tokens.isEmpty() : "removeEndpoint should be used instead"; String req = "INSERT INTO system.%s (key, tokens) VALUES ('%s', ?)"; - executeInternal(String.format(req, LOCAL_CF, LOCAL_KEY), tokensAsSet(tokens)); - forceBlockingFlush(LOCAL_CF); + executeInternal(String.format(req, LOCAL_TABLE, LOCAL_KEY), tokensAsSet(tokens)); + forceBlockingFlush(LOCAL_TABLE); } /** @@ -473,7 +728,7 @@ public static synchronized Collection updateLocalTokens(Collection public static void forceBlockingFlush(String cfname) { if (!Boolean.getBoolean("cassandra.unsafesystem")) - FBUtilities.waitOnFuture(Keyspace.open(Keyspace.SYSTEM_KS).getColumnFamilyStore(cfname).forceFlush()); + FBUtilities.waitOnFuture(Keyspace.open(NAME).getColumnFamilyStore(cfname).forceFlush()); } /** @@ -483,7 +738,7 @@ public static void forceBlockingFlush(String cfname) public static SetMultimap loadTokens() { SetMultimap tokenMap = HashMultimap.create(); - for (UntypedResultSet.Row row : executeInternal("SELECT peer, tokens FROM system." + PEERS_CF)) + for (UntypedResultSet.Row row : executeInternal("SELECT peer, tokens FROM system." + PEERS_TABLE)) { InetAddress peer = row.getInetAddress("peer"); if (row.has("tokens")) @@ -499,8 +754,8 @@ public static SetMultimap loadTokens() */ public static Map loadHostIds() { - Map hostIdMap = new HashMap(); - for (UntypedResultSet.Row row : executeInternal("SELECT peer, host_id FROM system." + PEERS_CF)) + Map hostIdMap = new HashMap<>(); + for (UntypedResultSet.Row row : executeInternal("SELECT peer, host_id FROM system." + PEERS_TABLE)) { InetAddress peer = row.getInetAddress("peer"); if (row.has("host_id")) @@ -520,7 +775,7 @@ public static Map loadHostIds() public static InetAddress getPreferredIP(InetAddress ep) { String req = "SELECT preferred_ip FROM system.%s WHERE peer=?"; - UntypedResultSet result = executeInternal(String.format(req, PEERS_CF), ep); + UntypedResultSet result = executeInternal(String.format(req, PEERS_TABLE), ep); if (!result.isEmpty() && result.one().has("preferred_ip")) return result.one().getInetAddress("preferred_ip"); return ep; @@ -531,13 +786,13 @@ public static InetAddress getPreferredIP(InetAddress ep) */ public static Map> loadDcRackInfo() { - Map> result = new HashMap>(); - for (UntypedResultSet.Row row : executeInternal("SELECT peer, data_center, rack from system." + PEERS_CF)) + Map> result = new HashMap<>(); + for (UntypedResultSet.Row row : executeInternal("SELECT peer, data_center, rack from system." + PEERS_TABLE)) { InetAddress peer = row.getInetAddress("peer"); if (row.has("data_center") && row.has("rack")) { - Map dcRack = new HashMap(); + Map dcRack = new HashMap<>(); dcRack.put("data_center", row.getString("data_center")); dcRack.put("rack", row.getString("rack")); result.put(peer, dcRack); @@ -558,7 +813,7 @@ public static void checkHealth() throws ConfigurationException Keyspace keyspace; try { - keyspace = Keyspace.open(Keyspace.SYSTEM_KS); + keyspace = Keyspace.open(NAME); } catch (AssertionError err) { @@ -567,10 +822,10 @@ public static void checkHealth() throws ConfigurationException ex.initCause(err); throw ex; } - ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(LOCAL_CF); + ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(LOCAL_TABLE); String req = "SELECT cluster_name FROM system.%s WHERE key='%s'"; - UntypedResultSet result = executeInternal(String.format(req, LOCAL_CF, LOCAL_KEY)); + UntypedResultSet result = executeInternal(String.format(req, LOCAL_TABLE, LOCAL_KEY)); if (result.isEmpty() || !result.one().has("cluster_name")) { @@ -580,7 +835,7 @@ public static void checkHealth() throws ConfigurationException // no system files. this is a new node. req = "INSERT INTO system.%s (key, cluster_name) VALUES ('%s', ?)"; - executeInternal(String.format(req, LOCAL_CF, LOCAL_KEY), DatabaseDescriptor.getClusterName()); + executeInternal(String.format(req, LOCAL_TABLE, LOCAL_KEY), DatabaseDescriptor.getClusterName()); return; } @@ -592,16 +847,16 @@ public static void checkHealth() throws ConfigurationException public static Collection getSavedTokens() { String req = "SELECT tokens FROM system.%s WHERE key='%s'"; - UntypedResultSet result = executeInternal(String.format(req, LOCAL_CF, LOCAL_KEY)); + UntypedResultSet result = executeInternal(String.format(req, LOCAL_TABLE, LOCAL_KEY)); return result.isEmpty() || !result.one().has("tokens") ? Collections.emptyList() - : deserializeTokens(result.one().getSet("tokens", UTF8Type.instance)); + : deserializeTokens(result.one().getSet("tokens", UTF8Type.instance)); } public static int incrementAndGetGeneration() { String req = "SELECT gossip_generation FROM system.%s WHERE key='%s'"; - UntypedResultSet result = executeInternal(String.format(req, LOCAL_CF, LOCAL_KEY)); + UntypedResultSet result = executeInternal(String.format(req, LOCAL_TABLE, LOCAL_KEY)); int generation; if (result.isEmpty() || !result.one().has("gossip_generation")) @@ -629,8 +884,8 @@ public static int incrementAndGetGeneration() } req = "INSERT INTO system.%s (key, gossip_generation) VALUES ('%s', ?)"; - executeInternal(String.format(req, LOCAL_CF, LOCAL_KEY), generation); - forceBlockingFlush(LOCAL_CF); + executeInternal(String.format(req, LOCAL_TABLE, LOCAL_KEY), generation); + forceBlockingFlush(LOCAL_TABLE); return generation; } @@ -638,7 +893,7 @@ public static int incrementAndGetGeneration() public static BootstrapState getBootstrapState() { String req = "SELECT bootstrapped FROM system.%s WHERE key='%s'"; - UntypedResultSet result = executeInternal(String.format(req, LOCAL_CF, LOCAL_KEY)); + UntypedResultSet result = executeInternal(String.format(req, LOCAL_TABLE, LOCAL_KEY)); if (result.isEmpty() || !result.one().has("bootstrapped")) return BootstrapState.NEEDS_BOOTSTRAP; @@ -659,15 +914,15 @@ public static boolean bootstrapInProgress() public static void setBootstrapState(BootstrapState state) { String req = "INSERT INTO system.%s (key, bootstrapped) VALUES ('%s', ?)"; - executeInternal(String.format(req, LOCAL_CF, LOCAL_KEY), state.name()); - forceBlockingFlush(LOCAL_CF); + executeInternal(String.format(req, LOCAL_TABLE, LOCAL_KEY), state.name()); + forceBlockingFlush(LOCAL_TABLE); } public static boolean isIndexBuilt(String keyspaceName, String indexName) { - ColumnFamilyStore cfs = Keyspace.open(Keyspace.SYSTEM_KS).getColumnFamilyStore(INDEX_CF); + ColumnFamilyStore cfs = Keyspace.open(NAME).getColumnFamilyStore(BUILT_INDEXES_TABLE); QueryFilter filter = QueryFilter.getNamesFilter(decorate(ByteBufferUtil.bytes(keyspaceName)), - INDEX_CF, + BUILT_INDEXES_TABLE, FBUtilities.singleton(cfs.getComparator().makeCellName(indexName), cfs.getComparator()), System.currentTimeMillis()); return ColumnFamilyStore.removeDeleted(cfs.getColumnFamily(filter), Integer.MAX_VALUE) != null; @@ -675,15 +930,15 @@ public static boolean isIndexBuilt(String keyspaceName, String indexName) public static void setIndexBuilt(String keyspaceName, String indexName) { - ColumnFamily cf = ArrayBackedSortedColumns.factory.create(Keyspace.SYSTEM_KS, INDEX_CF); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create(NAME, BUILT_INDEXES_TABLE); cf.addColumn(new BufferCell(cf.getComparator().makeCellName(indexName), ByteBufferUtil.EMPTY_BYTE_BUFFER, FBUtilities.timestampMicros())); - new Mutation(Keyspace.SYSTEM_KS, ByteBufferUtil.bytes(keyspaceName), cf).apply(); + new Mutation(NAME, ByteBufferUtil.bytes(keyspaceName), cf).apply(); } public static void setIndexRemoved(String keyspaceName, String indexName) { - Mutation mutation = new Mutation(Keyspace.SYSTEM_KS, ByteBufferUtil.bytes(keyspaceName)); - mutation.delete(INDEX_CF, CFMetaData.IndexCf.comparator.makeCellName(indexName), FBUtilities.timestampMicros()); + Mutation mutation = new Mutation(NAME, ByteBufferUtil.bytes(keyspaceName)); + mutation.delete(BUILT_INDEXES_TABLE, BuiltIndexesTable.comparator.makeCellName(indexName), FBUtilities.timestampMicros()); mutation.apply(); } @@ -694,7 +949,7 @@ public static void setIndexRemoved(String keyspaceName, String indexName) public static UUID getLocalHostId() { String req = "SELECT host_id FROM system.%s WHERE key='%s'"; - UntypedResultSet result = executeInternal(String.format(req, LOCAL_CF, LOCAL_KEY)); + UntypedResultSet result = executeInternal(String.format(req, LOCAL_TABLE, LOCAL_KEY)); // Look up the Host UUID (return it if found) if (!result.isEmpty() && result.one().has("host_id")) @@ -712,7 +967,7 @@ public static UUID getLocalHostId() public static UUID setLocalHostId(UUID hostId) { String req = "INSERT INTO system.%s (key, host_id) VALUES ('%s', ?)"; - executeInternal(String.format(req, LOCAL_CF, LOCAL_KEY), hostId); + executeInternal(String.format(req, LOCAL_TABLE, LOCAL_KEY), hostId); return hostId; } @@ -722,14 +977,14 @@ public static UUID setLocalHostId(UUID hostId) */ public static ColumnFamilyStore schemaCFS(String cfName) { - return Keyspace.open(Keyspace.SYSTEM_KS).getColumnFamilyStore(cfName); + return Keyspace.open(NAME).getColumnFamilyStore(cfName); } public static List serializedSchema() { List schema = new ArrayList<>(); - for (String cf : allSchemaCfs) + for (String cf : ALL_SCHEMA_TABLES) schema.addAll(serializedSchema(cf)); return schema; @@ -754,7 +1009,7 @@ public static Collection serializeSchema() { Map mutationMap = new HashMap<>(); - for (String cf : allSchemaCfs) + for (String cf : ALL_SCHEMA_TABLES) serializeSchema(mutationMap, cf); return mutationMap.values(); @@ -770,7 +1025,7 @@ private static void serializeSchema(Map mutationMap, Str Mutation mutation = mutationMap.get(schemaRow.key); if (mutation == null) { - mutation = new Mutation(Keyspace.SYSTEM_KS, schemaRow.key.getKey()); + mutation = new Mutation(NAME, schemaRow.key.getKey()); mutationMap.put(schemaRow.key, mutation); } @@ -849,7 +1104,7 @@ public static Row readSchemaRow(String schemaCfName, String ksName, String cfNam public static PaxosState loadPaxosState(ByteBuffer key, CFMetaData metadata) { String req = "SELECT * FROM system.%s WHERE row_key = ? AND cf_id = ?"; - UntypedResultSet results = executeInternal(String.format(req, PAXOS_CF), key, metadata.cfId); + UntypedResultSet results = executeInternal(String.format(req, PAXOS_TABLE), key, metadata.cfId); if (results.isEmpty()) return new PaxosState(key, metadata); UntypedResultSet.Row row = results.one(); @@ -867,23 +1122,10 @@ public static PaxosState loadPaxosState(ByteBuffer key, CFMetaData metadata) return new PaxosState(promised, accepted, mostRecent); } - public static Commit loadPaxosPromise(ByteBuffer key, CFMetaData metadata) - { - String req = "SELECT in_progress_ballot FROM system.%s WHERE row_key = ? AND cf_id = ?"; - UntypedResultSet results = executeInternal(String.format(req, PAXOS_CF), key, metadata.cfId); - if (results.isEmpty()) - return Commit.emptyCommit(key, metadata); - UntypedResultSet.Row row = results.one(); - Commit promised = row.has("in_progress_ballot") - ? new Commit(key, row.getUUID("in_progress_ballot"), ArrayBackedSortedColumns.factory.create(metadata)) - : Commit.emptyCommit(key, metadata); - return promised; - } - public static void savePaxosPromise(Commit promise) { String req = "UPDATE system.%s USING TIMESTAMP ? AND TTL ? SET in_progress_ballot = ? WHERE row_key = ? AND cf_id = ?"; - executeInternal(String.format(req, PAXOS_CF), + executeInternal(String.format(req, PAXOS_TABLE), UUIDGen.microsTimestamp(promise.ballot), paxosTtl(promise.update.metadata), promise.ballot, @@ -893,7 +1135,7 @@ public static void savePaxosPromise(Commit promise) public static void savePaxosProposal(Commit proposal) { - executeInternal(String.format("UPDATE system.%s USING TIMESTAMP ? AND TTL ? SET proposal_ballot = ?, proposal = ? WHERE row_key = ? AND cf_id = ?", PAXOS_CF), + executeInternal(String.format("UPDATE system.%s USING TIMESTAMP ? AND TTL ? SET proposal_ballot = ?, proposal = ? WHERE row_key = ? AND cf_id = ?", PAXOS_TABLE), UUIDGen.microsTimestamp(proposal.ballot), paxosTtl(proposal.update.metadata), proposal.ballot, @@ -913,7 +1155,7 @@ public static void savePaxosCommit(Commit commit) // We always erase the last proposal (with the commit timestamp to no erase more recent proposal in case the commit is old) // even though that's really just an optimization since SP.beginAndRepairPaxos will exclude accepted proposal older than the mrc. String cql = "UPDATE system.%s USING TIMESTAMP ? AND TTL ? SET proposal_ballot = null, proposal = null, most_recent_commit_at = ?, most_recent_commit = ? WHERE row_key = ? AND cf_id = ?"; - executeInternal(String.format(cql, PAXOS_CF), + executeInternal(String.format(cql, PAXOS_TABLE), UUIDGen.microsTimestamp(commit.ballot), paxosTtl(commit.update.metadata), commit.ballot, @@ -932,7 +1174,7 @@ public static void savePaxosCommit(Commit commit) public static RestorableMeter getSSTableReadMeter(String keyspace, String table, int generation) { String cql = "SELECT * FROM system.%s WHERE keyspace_name=? and columnfamily_name=? and generation=?"; - UntypedResultSet results = executeInternal(String.format(cql, SSTABLE_ACTIVITY_CF), keyspace, table, generation); + UntypedResultSet results = executeInternal(String.format(cql, SSTABLE_ACTIVITY_TABLE), keyspace, table, generation); if (results.isEmpty()) return new RestorableMeter(); @@ -950,7 +1192,7 @@ public static void persistSSTableReadMeter(String keyspace, String table, int ge { // Store values with a one-day TTL to handle corner cases where cleanup might not occur String cql = "INSERT INTO system.%s (keyspace_name, columnfamily_name, generation, rate_15m, rate_120m) VALUES (?, ?, ?, ?, ?) USING TTL 864000"; - executeInternal(String.format(cql, SSTABLE_ACTIVITY_CF), + executeInternal(String.format(cql, SSTABLE_ACTIVITY_TABLE), keyspace, table, generation, @@ -964,6 +1206,6 @@ public static void persistSSTableReadMeter(String keyspace, String table, int ge public static void clearSSTableReadMeter(String keyspace, String table, int generation) { String cql = "DELETE FROM system.%s WHERE keyspace_name=? AND columnfamily_name=? and generation=?"; - executeInternal(String.format(cql, SSTABLE_ACTIVITY_CF), keyspace, table, generation); + executeInternal(String.format(cql, SSTABLE_ACTIVITY_TABLE), keyspace, table, generation); } } diff --git a/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java b/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java index 6164883215e4..7eac94b297f1 100644 --- a/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java +++ b/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java @@ -466,7 +466,7 @@ protected SSTableReader(final Descriptor desc, // Don't track read rates for tables in the system keyspace. Also don't track reads for special operations (like early open) // this is to avoid overflowing the executor queue (see CASSANDRA-8066) - if (Keyspace.SYSTEM_KS.equals(desc.ksname) || openReason != OpenReason.NORMAL) + if (SystemKeyspace.NAME.equals(desc.ksname) || openReason != OpenReason.NORMAL) { readMeter = null; readMeterSyncFuture = null; diff --git a/src/java/org/apache/cassandra/service/CassandraDaemon.java b/src/java/org/apache/cassandra/service/CassandraDaemon.java index e4d262accfb0..7a51bb28f468 100644 --- a/src/java/org/apache/cassandra/service/CassandraDaemon.java +++ b/src/java/org/apache/cassandra/service/CassandraDaemon.java @@ -224,7 +224,7 @@ public void uncaughtException(Thread t, Throwable e) // check the system keyspace to keep user from shooting self in foot by changing partitioner, cluster name, etc. // we do a one-off scrub of the system keyspace first; we can't load the list of the rest of the keyspaces, // until system keyspace is opened. - for (CFMetaData cfm : Schema.instance.getKeyspaceMetaData(Keyspace.SYSTEM_KS).values()) + for (CFMetaData cfm : Schema.instance.getKeyspaceMetaData(SystemKeyspace.NAME).values()) ColumnFamilyStore.scrubDataDirectories(cfm); try { @@ -255,7 +255,7 @@ public void uncaughtException(Thread t, Throwable e) for (String keyspaceName : Schema.instance.getKeyspaces()) { // Skip system as we've already cleaned it - if (keyspaceName.equals(Keyspace.SYSTEM_KS)) + if (keyspaceName.equals(SystemKeyspace.NAME)) continue; for (CFMetaData cfm : Schema.instance.getKeyspaceMetaData(keyspaceName).values()) diff --git a/src/java/org/apache/cassandra/service/ClientState.java b/src/java/org/apache/cassandra/service/ClientState.java index 709c97954872..6cc7254e2af5 100644 --- a/src/java/org/apache/cassandra/service/ClientState.java +++ b/src/java/org/apache/cassandra/service/ClientState.java @@ -32,12 +32,11 @@ import org.apache.cassandra.config.Schema; import org.apache.cassandra.cql3.QueryHandler; import org.apache.cassandra.cql3.QueryProcessor; -import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.exceptions.AuthenticationException; import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.exceptions.UnauthorizedException; -import org.apache.cassandra.tracing.Tracing; +import org.apache.cassandra.tracing.TraceKeyspace; import org.apache.cassandra.thrift.ThriftValidation; import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.JVMStabilityInspector; @@ -59,8 +58,8 @@ public class ClientState { // We want these system cfs to be always readable to authenticated users since many tools rely on them // (nodetool, cqlsh, bulkloader, etc.) - for (String cf : Iterables.concat(Arrays.asList(SystemKeyspace.LOCAL_CF, SystemKeyspace.PEERS_CF), SystemKeyspace.allSchemaCfs)) - READABLE_SYSTEM_RESOURCES.add(DataResource.columnFamily(Keyspace.SYSTEM_KS, cf)); + for (String cf : Iterables.concat(Arrays.asList(SystemKeyspace.LOCAL_TABLE, SystemKeyspace.PEERS_TABLE), SystemKeyspace.ALL_SCHEMA_TABLES)) + READABLE_SYSTEM_RESOURCES.add(DataResource.columnFamily(SystemKeyspace.NAME, cf)); PROTECTED_AUTH_RESOURCES.addAll(DatabaseDescriptor.getAuthenticator().protectedResources()); PROTECTED_AUTH_RESOURCES.addAll(DatabaseDescriptor.getAuthorizer().protectedResources()); @@ -263,11 +262,11 @@ private void preventSystemKSSchemaModification(String keyspace, DataResource res return; // prevent system keyspace modification - if (Keyspace.SYSTEM_KS.equalsIgnoreCase(keyspace)) + if (SystemKeyspace.NAME.equalsIgnoreCase(keyspace)) throw new UnauthorizedException(keyspace + " keyspace is not user-modifiable."); // we want to allow altering AUTH_KS and TRACING_KS. - Set allowAlter = Sets.newHashSet(Auth.AUTH_KS, Tracing.TRACE_KS); + Set allowAlter = Sets.newHashSet(Auth.AUTH_KS, TraceKeyspace.NAME); if (allowAlter.contains(keyspace.toLowerCase()) && !(resource.isKeyspaceLevel() && perm.equals(Permission.ALTER))) throw new UnauthorizedException(String.format("Cannot %s %s", perm, resource)); } diff --git a/src/java/org/apache/cassandra/service/MigrationManager.java b/src/java/org/apache/cassandra/service/MigrationManager.java index 449560c38925..a5d4628e5d1e 100644 --- a/src/java/org/apache/cassandra/service/MigrationManager.java +++ b/src/java/org/apache/cassandra/service/MigrationManager.java @@ -357,7 +357,7 @@ public static void announceColumnFamilyDrop(String ksName, String cfName, boolea // Include the serialized keyspace for when a target node missed the CREATE KEYSPACE migration (see #5631). private static Mutation addSerializedKeyspace(Mutation migration, String ksName) { - migration.add(SystemKeyspace.readSchemaRow(SystemKeyspace.SCHEMA_KEYSPACES_CF, ksName).cf); + migration.add(SystemKeyspace.readSchemaRow(SystemKeyspace.SCHEMA_KEYSPACES_TABLE, ksName).cf); return migration; } @@ -464,7 +464,7 @@ public static void resetLocalSchema() throws IOException logger.debug("Truncating schema tables..."); // truncate schema tables - for (String cf : SystemKeyspace.allSchemaCfs) + for (String cf : SystemKeyspace.ALL_SCHEMA_TABLES) SystemKeyspace.schemaCFS(cf).truncateBlocking(); logger.debug("Clearing local schema keyspace definitions..."); diff --git a/src/java/org/apache/cassandra/service/StorageProxy.java b/src/java/org/apache/cassandra/service/StorageProxy.java index 8514ca349013..b577931955e8 100644 --- a/src/java/org/apache/cassandra/service/StorageProxy.java +++ b/src/java/org/apache/cassandra/service/StorageProxy.java @@ -662,7 +662,7 @@ private static void syncWriteToBatchlog(Collection mutations, Collecti AbstractWriteResponseHandler handler = new WriteResponseHandler(endpoints, Collections.emptyList(), ConsistencyLevel.ONE, - Keyspace.open(Keyspace.SYSTEM_KS), + Keyspace.open(SystemKeyspace.NAME), null, WriteType.BATCH_LOG); @@ -697,11 +697,11 @@ private static void asyncRemoveFromBatchlog(Collection endpoints, U AbstractWriteResponseHandler handler = new WriteResponseHandler(endpoints, Collections.emptyList(), ConsistencyLevel.ANY, - Keyspace.open(Keyspace.SYSTEM_KS), + Keyspace.open(SystemKeyspace.NAME), null, WriteType.SIMPLE); - Mutation mutation = new Mutation(Keyspace.SYSTEM_KS, UUIDType.instance.decompose(uuid)); - mutation.delete(SystemKeyspace.BATCHLOG_CF, FBUtilities.timestampMicros()); + Mutation mutation = new Mutation(SystemKeyspace.NAME, UUIDType.instance.decompose(uuid)); + mutation.delete(SystemKeyspace.BATCHLOG_TABLE, FBUtilities.timestampMicros()); MessageOut message = mutation.createMessage(); for (InetAddress target : endpoints) { @@ -1146,7 +1146,7 @@ public void runMayThrow() throws OverloadedException, WriteTimeoutException private static boolean systemKeyspaceQuery(List cmds) { for (ReadCommand cmd : cmds) - if (!cmd.ksName.equals(Keyspace.SYSTEM_KS)) + if (!cmd.ksName.equals(SystemKeyspace.NAME)) return false; return true; } diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index d1cf6c95b1f4..450bc5cf070a 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -88,7 +88,7 @@ import org.apache.cassandra.thrift.EndpointDetails; import org.apache.cassandra.thrift.TokenRange; import org.apache.cassandra.thrift.cassandraConstants; -import org.apache.cassandra.tracing.Tracing; +import org.apache.cassandra.tracing.TraceKeyspace; import org.apache.cassandra.utils.*; import static java.nio.charset.StandardCharsets.ISO_8859_1; @@ -842,11 +842,8 @@ private void joinTokenRing(int delay) throws ConfigurationException } // if we don't have system_traces keyspace at this point, then create it manually - if (Schema.instance.getKSMetaData(Tracing.TRACE_KS) == null) - { - KSMetaData tracingKeyspace = KSMetaData.traceKeyspace(); - MigrationManager.announceNewKeyspace(tracingKeyspace, 0, false); - } + if (Schema.instance.getKSMetaData(TraceKeyspace.NAME) == null) + MigrationManager.announceNewKeyspace(TraceKeyspace.definition(), 0, false); if (!isSurveyMode) { @@ -2144,7 +2141,7 @@ public int getCurrentGenerationNumber() public int forceKeyspaceCleanup(String keyspaceName, String... columnFamilies) throws IOException, ExecutionException, InterruptedException { - if (keyspaceName.equals(Keyspace.SYSTEM_KS)) + if (keyspaceName.equals(SystemKeyspace.NAME)) throw new RuntimeException("Cleanup of the system keyspace is neither necessary nor wise"); CompactionManager.AllSSTableOpStatus status = CompactionManager.AllSSTableOpStatus.SUCCESSFUL; @@ -2296,7 +2293,7 @@ public Map getSnapshotDetails() Map snapshotMap = new HashMap<>(); for (Keyspace keyspace : Keyspace.all()) { - if (Keyspace.SYSTEM_KS.equals(keyspace.getName())) + if (SystemKeyspace.NAME.equals(keyspace.getName())) continue; for (ColumnFamilyStore cfStore : keyspace.getColumnFamilyStores()) @@ -2322,7 +2319,7 @@ public long trueSnapshotsSize() long total = 0; for (Keyspace keyspace : Keyspace.all()) { - if (Keyspace.SYSTEM_KS.equals(keyspace.getName())) + if (SystemKeyspace.NAME.equals(keyspace.getName())) continue; for (ColumnFamilyStore cfStore : keyspace.getColumnFamilyStores()) @@ -3133,7 +3130,7 @@ private void unbootstrap(Runnable onFinish) private Future streamHints() { // StreamPlan will not fail if there are zero files to transfer, so flush anyway (need to get any in-memory hints, as well) - ColumnFamilyStore hintsCF = Keyspace.open(Keyspace.SYSTEM_KS).getColumnFamilyStore(SystemKeyspace.HINTS_CF); + ColumnFamilyStore hintsCF = Keyspace.open(SystemKeyspace.NAME).getColumnFamilyStore(SystemKeyspace.HINTS_TABLE); FBUtilities.waitOnFuture(hintsCF.forceFlush()); // gather all live nodes in the cluster that aren't also leaving @@ -3164,10 +3161,10 @@ private Future streamHints() return new StreamPlan("Hints").transferRanges(hintsDestinationHost, preferred, - Keyspace.SYSTEM_KS, - ranges, - SystemKeyspace.HINTS_CF) - .execute(); + SystemKeyspace.NAME, + ranges, + SystemKeyspace.HINTS_TABLE) + .execute(); } } diff --git a/src/java/org/apache/cassandra/thrift/ThriftValidation.java b/src/java/org/apache/cassandra/thrift/ThriftValidation.java index b2c7e86ffd55..32da1c8c6b5b 100644 --- a/src/java/org/apache/cassandra/thrift/ThriftValidation.java +++ b/src/java/org/apache/cassandra/thrift/ThriftValidation.java @@ -631,7 +631,7 @@ public static void validateKeyspaceNotYetExisting(String newKsName) throws org.a public static void validateKeyspaceNotSystem(String modifiedKeyspace) throws org.apache.cassandra.exceptions.InvalidRequestException { - if (modifiedKeyspace.equalsIgnoreCase(Keyspace.SYSTEM_KS)) + if (modifiedKeyspace.equalsIgnoreCase(SystemKeyspace.NAME)) throw new org.apache.cassandra.exceptions.InvalidRequestException("system keyspace is not user-modifiable"); } diff --git a/src/java/org/apache/cassandra/tools/BulkLoader.java b/src/java/org/apache/cassandra/tools/BulkLoader.java index be3b81065d96..ea388a152c00 100644 --- a/src/java/org/apache/cassandra/tools/BulkLoader.java +++ b/src/java/org/apache/cassandra/tools/BulkLoader.java @@ -32,7 +32,6 @@ import org.apache.cassandra.auth.IAuthenticator; import org.apache.cassandra.config.*; -import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.db.marshal.UTF8Type; import org.apache.cassandra.dht.Range; @@ -309,9 +308,9 @@ public void init(String keyspace) } String cfQuery = String.format("SELECT * FROM %s.%s WHERE keyspace_name = '%s'", - Keyspace.SYSTEM_KS, - SystemKeyspace.SCHEMA_COLUMNFAMILIES_CF, - keyspace); + SystemKeyspace.NAME, + SystemKeyspace.SCHEMA_COLUMNFAMILIES_TABLE, + keyspace); CqlResult cfRes = client.execute_cql3_query(ByteBufferUtil.bytes(cfQuery), Compression.NONE, ConsistencyLevel.ONE); @@ -319,8 +318,8 @@ public void init(String keyspace) { String columnFamily = UTF8Type.instance.getString(row.columns.get(1).bufferForName()); String columnsQuery = String.format("SELECT * FROM %s.%s WHERE keyspace_name = '%s' AND columnfamily_name = '%s'", - Keyspace.SYSTEM_KS, - SystemKeyspace.SCHEMA_COLUMNS_CF, + SystemKeyspace.NAME, + SystemKeyspace.SCHEMA_COLUMNS_TABLE, keyspace, columnFamily); CqlResult columnsRes = client.execute_cql3_query(ByteBufferUtil.bytes(columnsQuery), Compression.NONE, ConsistencyLevel.ONE); diff --git a/src/java/org/apache/cassandra/tools/NodeTool.java b/src/java/org/apache/cassandra/tools/NodeTool.java index 3d7d60e056e9..207da5eddf4c 100644 --- a/src/java/org/apache/cassandra/tools/NodeTool.java +++ b/src/java/org/apache/cassandra/tools/NodeTool.java @@ -40,14 +40,12 @@ import org.apache.commons.lang3.StringUtils; import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutorMBean; -import org.apache.cassandra.config.Schema; import org.apache.cassandra.db.ColumnFamilyStoreMBean; -import org.apache.cassandra.db.Keyspace; +import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.db.compaction.CompactionManagerMBean; import org.apache.cassandra.db.compaction.OperationType; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.locator.EndpointSnitchInfoMBean; -import org.apache.cassandra.locator.LocalStrategy; import org.apache.cassandra.net.MessagingServiceMBean; import org.apache.cassandra.repair.messages.RepairOption; import org.apache.cassandra.service.CacheServiceMBean; @@ -977,7 +975,7 @@ public void execute(NodeProbe probe) for (String keyspace : keyspaces) { - if (Keyspace.SYSTEM_KS.equals(keyspace)) + if (SystemKeyspace.NAME.equals(keyspace)) continue; try diff --git a/src/java/org/apache/cassandra/tracing/TraceKeyspace.java b/src/java/org/apache/cassandra/tracing/TraceKeyspace.java new file mode 100644 index 000000000000..a20fadd234be --- /dev/null +++ b/src/java/org/apache/cassandra/tracing/TraceKeyspace.java @@ -0,0 +1,73 @@ +/* + * 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.tracing; + +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import com.google.common.collect.ImmutableMap; + +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.KSMetaData; +import org.apache.cassandra.locator.SimpleStrategy; + +public final class TraceKeyspace +{ + public static final String NAME = "system_traces"; + + static final String SESSIONS_TABLE = "sessions"; + static final String EVENTS_TABLE = "events"; + + private static final int DAY = (int) TimeUnit.DAYS.toSeconds(1); + + static final CFMetaData SessionsTable = + compile(SESSIONS_TABLE, "tracing sessions", + "CREATE TABLE %s (" + + "session_id uuid," + + "coordinator inet," + + "duration int," + + "parameters map," + + "request text," + + "started_at timestamp," + + "PRIMARY KEY ((session_id)))") + .defaultTimeToLive(DAY); + + static final CFMetaData EventsTable = + compile(EVENTS_TABLE, "tracing events", + "CREATE TABLE %s (" + + "session_id uuid," + + "event_id timeuuid," + + "activity text," + + "source inet," + + "source_elapsed int," + + "thread text," + + "PRIMARY KEY ((session_id), event_id))") + .defaultTimeToLive(DAY); + + private static CFMetaData compile(String table, String comment, String cql) + { + return CFMetaData.compile(String.format(cql, table), NAME).comment(comment); + } + + public static KSMetaData definition() + { + List tables = Arrays.asList(SessionsTable, EventsTable); + return new KSMetaData(NAME, SimpleStrategy.class, ImmutableMap.of("replication_factor", "2"), true, tables); + } +} diff --git a/src/java/org/apache/cassandra/tracing/TraceState.java b/src/java/org/apache/cassandra/tracing/TraceState.java index cfff295f215e..2d89d392f602 100644 --- a/src/java/org/apache/cassandra/tracing/TraceState.java +++ b/src/java/org/apache/cassandra/tracing/TraceState.java @@ -98,14 +98,14 @@ public static void trace(final ByteBuffer sessionIdBytes, final String message, { public void runMayThrow() { - CFMetaData cfMeta = CFMetaData.TraceEventsCf; + CFMetaData cfMeta = TraceKeyspace.EventsTable; ColumnFamily cf = ArrayBackedSortedColumns.factory.create(cfMeta); Tracing.addColumn(cf, Tracing.buildName(cfMeta, eventId, ByteBufferUtil.bytes("activity")), message); Tracing.addColumn(cf, Tracing.buildName(cfMeta, eventId, ByteBufferUtil.bytes("source")), FBUtilities.getBroadcastAddress()); if (elapsed >= 0) Tracing.addColumn(cf, Tracing.buildName(cfMeta, eventId, ByteBufferUtil.bytes("source_elapsed")), elapsed); Tracing.addColumn(cf, Tracing.buildName(cfMeta, eventId, ByteBufferUtil.bytes("thread")), threadName); - Tracing.mutateWithCatch(new Mutation(Tracing.TRACE_KS, sessionIdBytes, cf)); + Tracing.mutateWithCatch(new Mutation(TraceKeyspace.NAME, sessionIdBytes, cf)); } }); } diff --git a/src/java/org/apache/cassandra/tracing/Tracing.java b/src/java/org/apache/cassandra/tracing/Tracing.java index e377c6ef4650..509239aacdff 100644 --- a/src/java/org/apache/cassandra/tracing/Tracing.java +++ b/src/java/org/apache/cassandra/tracing/Tracing.java @@ -54,20 +54,15 @@ */ public class Tracing { - public static final String TRACE_KS = "system_traces"; - public static final String EVENTS_CF = "events"; - public static final String SESSIONS_CF = "sessions"; public static final String TRACE_HEADER = "TraceSession"; - private static final int TTL = 24 * 3600; - private static final Logger logger = LoggerFactory.getLogger(Tracing.class); private final InetAddress localAddress = FBUtilities.getLocalAddress(); - private final ThreadLocal state = new ThreadLocal(); + private final ThreadLocal state = new ThreadLocal<>(); - private final ConcurrentMap sessions = new ConcurrentHashMap(); + private final ConcurrentMap sessions = new ConcurrentHashMap<>(); public static final Tracing instance = new Tracing(); @@ -93,16 +88,15 @@ public static void addColumn(ColumnFamily cf, CellName name, String value) private static void addColumn(ColumnFamily cf, CellName name, ByteBuffer value) { - cf.addColumn(new BufferExpiringCell(name, value, System.currentTimeMillis(), TTL)); + cf.addColumn(name, value, System.currentTimeMillis()); } public void addParameterColumns(ColumnFamily cf, Map rawPayload) { for (Map.Entry entry : rawPayload.entrySet()) - { - cf.addColumn(new BufferExpiringCell(buildName(CFMetaData.TraceSessionsCf, "parameters", entry.getKey()), - bytes(entry.getValue()), System.currentTimeMillis(), TTL)); - } + cf.addColumn(buildName(TraceKeyspace.SessionsTable, "parameters", entry.getKey()), + bytes(entry.getValue()), + System.currentTimeMillis()); } public static CellName buildName(CFMetaData meta, Object... args) @@ -165,10 +159,10 @@ public void stopSession() { public void run() { - CFMetaData cfMeta = CFMetaData.TraceSessionsCf; + CFMetaData cfMeta = TraceKeyspace.SessionsTable; ColumnFamily cf = ArrayBackedSortedColumns.factory.create(cfMeta); addColumn(cf, buildName(cfMeta, "duration"), elapsed); - mutateWithCatch(new Mutation(TRACE_KS, sessionIdBytes, cf)); + mutateWithCatch(new Mutation(TraceKeyspace.NAME, sessionIdBytes, cf)); } }); @@ -203,14 +197,14 @@ public void begin(final String request, final Map parameters) { public void run() { - CFMetaData cfMeta = CFMetaData.TraceSessionsCf; + CFMetaData cfMeta = TraceKeyspace.SessionsTable; ColumnFamily cf = ArrayBackedSortedColumns.factory.create(cfMeta); addColumn(cf, buildName(cfMeta, "coordinator"), FBUtilities.getBroadcastAddress()); addParameterColumns(cf, parameters); addColumn(cf, buildName(cfMeta, bytes("request")), request); addColumn(cf, buildName(cfMeta, bytes("started_at")), started_at); addParameterColumns(cf, parameters); - mutateWithCatch(new Mutation(TRACE_KS, sessionIdBytes, cf)); + mutateWithCatch(new Mutation(TraceKeyspace.NAME, sessionIdBytes, cf)); } }); } diff --git a/test/unit/org/apache/cassandra/config/CFMetaDataTest.java b/test/unit/org/apache/cassandra/config/CFMetaDataTest.java index 79f7f38084e6..79373ea02b1f 100644 --- a/test/unit/org/apache/cassandra/config/CFMetaDataTest.java +++ b/test/unit/org/apache/cassandra/config/CFMetaDataTest.java @@ -140,8 +140,8 @@ private void checkInverses(CFMetaData cfm) throws Exception // Test schema conversion Mutation rm = cfm.toSchema(System.currentTimeMillis()); - ColumnFamily serializedCf = rm.getColumnFamily(Schema.instance.getId(Keyspace.SYSTEM_KS, SystemKeyspace.SCHEMA_COLUMNFAMILIES_CF)); - ColumnFamily serializedCD = rm.getColumnFamily(Schema.instance.getId(Keyspace.SYSTEM_KS, SystemKeyspace.SCHEMA_COLUMNS_CF)); + ColumnFamily serializedCf = rm.getColumnFamily(Schema.instance.getId(SystemKeyspace.NAME, SystemKeyspace.SCHEMA_COLUMNFAMILIES_TABLE)); + ColumnFamily serializedCD = rm.getColumnFamily(Schema.instance.getId(SystemKeyspace.NAME, SystemKeyspace.SCHEMA_COLUMNS_TABLE)); UntypedResultSet.Row result = QueryProcessor.resultify("SELECT * FROM system.schema_columnfamilies", new Row(k, serializedCf)).one(); CFMetaData newCfm = CFMetaData.fromSchemaNoTriggers(result, ColumnDefinition.resultify(new Row(k, serializedCD))); assert cfm.equals(newCfm) : String.format("%n%s%n!=%n%s", cfm, newCfm); diff --git a/test/unit/org/apache/cassandra/db/BatchlogManagerTest.java b/test/unit/org/apache/cassandra/db/BatchlogManagerTest.java index 284305548553..608aee8fe32c 100644 --- a/test/unit/org/apache/cassandra/db/BatchlogManagerTest.java +++ b/test/unit/org/apache/cassandra/db/BatchlogManagerTest.java @@ -101,7 +101,7 @@ public void testReplay() throws Exception } // Flush the batchlog to disk (see CASSANDRA-6822). - Keyspace.open(Keyspace.SYSTEM_KS).getColumnFamilyStore(SystemKeyspace.BATCHLOG_CF).forceBlockingFlush(); + Keyspace.open(SystemKeyspace.NAME).getColumnFamilyStore(SystemKeyspace.BATCHLOG_TABLE).forceBlockingFlush(); assertEquals(1000, BatchlogManager.instance.countAllBatches() - initialAllBatches); assertEquals(0, BatchlogManager.instance.getTotalBatchesReplayed() - initialReplayedBatches); @@ -171,7 +171,7 @@ public void testTruncatedReplay() throws InterruptedException, ExecutionExceptio } // Flush the batchlog to disk (see CASSANDRA-6822). - Keyspace.open(Keyspace.SYSTEM_KS).getColumnFamilyStore(SystemKeyspace.BATCHLOG_CF).forceFlush(); + Keyspace.open(SystemKeyspace.NAME).getColumnFamilyStore(SystemKeyspace.BATCHLOG_TABLE).forceFlush(); // Force batchlog replay and wait for it to complete. BatchlogManager.instance.startBatchlogReplay().get(); diff --git a/test/unit/org/apache/cassandra/db/HintedHandOffTest.java b/test/unit/org/apache/cassandra/db/HintedHandOffTest.java index 13f9b2d97a01..8b6834ca39f7 100644 --- a/test/unit/org/apache/cassandra/db/HintedHandOffTest.java +++ b/test/unit/org/apache/cassandra/db/HintedHandOffTest.java @@ -66,7 +66,7 @@ public void testCompactionOfHintsCF() throws Exception { // prepare hints column family Keyspace systemKeyspace = Keyspace.open("system"); - ColumnFamilyStore hintStore = systemKeyspace.getColumnFamilyStore(SystemKeyspace.HINTS_CF); + ColumnFamilyStore hintStore = systemKeyspace.getColumnFamilyStore(SystemKeyspace.HINTS_TABLE); hintStore.clearUnsafe(); hintStore.metadata.gcGraceSeconds(36000); // 10 hours hintStore.setCompactionStrategyClass(SizeTieredCompactionStrategy.class.getCanonicalName()); @@ -101,7 +101,7 @@ public void testHintsMetrics() throws Exception HintedHandOffManager.instance.metrics.incrPastWindow(InetAddress.getLocalHost()); HintedHandOffManager.instance.metrics.log(); - UntypedResultSet rows = executeInternal("SELECT hints_dropped FROM system." + SystemKeyspace.PEER_EVENTS_CF); + UntypedResultSet rows = executeInternal("SELECT hints_dropped FROM system." + SystemKeyspace.PEER_EVENTS_TABLE); Map returned = rows.one().getMap("hints_dropped", UUIDType.instance, Int32Type.instance); assertEquals(Iterators.getLast(returned.values().iterator()).intValue(), 99); } @@ -110,7 +110,7 @@ public void testHintsMetrics() throws Exception public void testTruncateHints() throws Exception { Keyspace systemKeyspace = Keyspace.open("system"); - ColumnFamilyStore hintStore = systemKeyspace.getColumnFamilyStore(SystemKeyspace.HINTS_CF); + ColumnFamilyStore hintStore = systemKeyspace.getColumnFamilyStore(SystemKeyspace.HINTS_TABLE); hintStore.clearUnsafe(); // insert 1 hint @@ -138,7 +138,7 @@ public void testTruncateHints() throws Exception private int getNoOfHints() { String req = "SELECT * FROM system.%s"; - UntypedResultSet resultSet = executeInternal(String.format(req, SystemKeyspace.HINTS_CF)); + UntypedResultSet resultSet = executeInternal(String.format(req, SystemKeyspace.HINTS_TABLE)); return resultSet.size(); } } diff --git a/test/unit/org/apache/cassandra/db/RecoveryManager2Test.java b/test/unit/org/apache/cassandra/db/RecoveryManager2Test.java index 03d358fcd878..8023d107f108 100644 --- a/test/unit/org/apache/cassandra/db/RecoveryManager2Test.java +++ b/test/unit/org/apache/cassandra/db/RecoveryManager2Test.java @@ -61,7 +61,7 @@ public static void defineSchema() throws ConfigurationException public void testWithFlush() throws Exception { // Flush everything that may be in the commit log now to start fresh - FBUtilities.waitOnFutures(Keyspace.open(Keyspace.SYSTEM_KS).flush()); + FBUtilities.waitOnFutures(Keyspace.open(SystemKeyspace.NAME).flush()); CompactionManager.instance.disableAutoCompaction(); diff --git a/test/unit/org/apache/cassandra/service/StorageServiceServerTest.java b/test/unit/org/apache/cassandra/service/StorageServiceServerTest.java index dd25b35641c2..aea978a4f680 100644 --- a/test/unit/org/apache/cassandra/service/StorageServiceServerTest.java +++ b/test/unit/org/apache/cassandra/service/StorageServiceServerTest.java @@ -27,7 +27,6 @@ import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; -import org.apache.cassandra.dht.BigIntegerToken; import org.apache.cassandra.dht.LongToken; import org.apache.cassandra.dht.Murmur3Partitioner; import org.junit.BeforeClass; @@ -99,7 +98,7 @@ public void testSnapshot() throws IOException public void testColumnFamilySnapshot() throws IOException { // no need to insert extra data, even an "empty" database will have a little information in the system keyspace - StorageService.instance.takeColumnFamilySnapshot(Keyspace.SYSTEM_KS, SystemKeyspace.SCHEMA_KEYSPACES_CF, "cf_snapshot"); + StorageService.instance.takeColumnFamilySnapshot(SystemKeyspace.NAME, SystemKeyspace.SCHEMA_KEYSPACES_TABLE, "cf_snapshot"); } @Test From 93824864022825c5a22d000e78afe86ea5aed796 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Wed, 12 Nov 2014 22:45:32 -0500 Subject: [PATCH 184/557] create the cache name format only once --- src/java/org/apache/cassandra/cache/AutoSavingCache.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/cassandra/cache/AutoSavingCache.java b/src/java/org/apache/cassandra/cache/AutoSavingCache.java index 9a79e3831f04..4ac2328309c6 100644 --- a/src/java/org/apache/cassandra/cache/AutoSavingCache.java +++ b/src/java/org/apache/cassandra/cache/AutoSavingCache.java @@ -306,13 +306,14 @@ private void deleteOldCacheFiles() File[] files = savedCachesDir.listFiles(); if (files != null) { + String cacheNameFormat = String.format("%s-%s.db", cacheType.toString(), CURRENT_VERSION); for (File file : files) { if (!file.isFile()) continue; // someone's been messing with our directory. naughty! - if (file.getName().endsWith(cacheType.toString()) - || file.getName().endsWith(String.format("%s-%s.db", cacheType.toString(), CURRENT_VERSION))) + if (file.getName().endsWith(cacheNameFormat) + || file.getName().endsWith(cacheType.toString())) { if (!file.delete()) logger.warn("Failed to delete {}", file.getAbsolutePath()); From 7c93b04b34844afdc3a502af9e7fb296f43dc068 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Wed, 12 Nov 2014 22:53:47 -0500 Subject: [PATCH 185/557] make sure streams get closed --- .../org/apache/cassandra/db/ColumnFamilyStore.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java index 9994038942ad..07f7f53e3f53 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java @@ -2173,16 +2173,18 @@ public Set snapshotWithoutFlush(String snapshotName, Predicate Date: Thu, 13 Nov 2014 11:34:39 -0600 Subject: [PATCH 186/557] Fix aggregation fn on empty selection, column names Patch by Benjamin Lerer; reviewed by Tyler Hobbs for CASSANDRA-8229 --- CHANGES.txt | 2 + pylib/cqlshlib/cql3handling.py | 9 +--- .../org/apache/cassandra/cql3/ResultSet.java | 5 +++ .../selection/AbstractFunctionSelector.java | 21 ++++++---- .../cql3/selection/FieldSelector.java | 17 ++++---- .../cassandra/cql3/selection/Selection.java | 5 +++ .../cassandra/cql3/selection/Selector.java | 25 ++++++++++- .../cql3/selection/SelectorFactories.java | 20 +++++++++ .../cql3/selection/SimpleSelector.java | 15 ++++--- .../selection/WritetimeOrTTLSelector.java | 16 ++++--- .../cassandra/cql3/AggregationTest.java | 42 ++++++++++++++++++- .../org/apache/cassandra/cql3/CQLTester.java | 18 ++++++++ 12 files changed, 150 insertions(+), 45 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 23e3af56f8b8..04b032208a03 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,6 @@ 3.0 + * Fix aggregate fn results on empty selection, result column name, + and cqlsh parsing (CASSANDRA-8229) * Mark sstables as repaired after full repair (CASSANDRA-7586) * Extend Descriptor to include a format value and refactor reader/writer apis (CASSANDRA-7443) * Integrate JMH for microbenchmarks (CASSANDRA-8151) diff --git a/pylib/cqlshlib/cql3handling.py b/pylib/cqlshlib/cql3handling.py index 5a4907dfcf46..261161cf9540 100644 --- a/pylib/cqlshlib/cql3handling.py +++ b/pylib/cqlshlib/cql3handling.py @@ -39,7 +39,7 @@ def __str__(self): class Cql3ParsingRuleSet(CqlParsingRuleSet): keywords = set(( 'select', 'from', 'where', 'and', 'key', 'insert', 'update', 'with', - 'limit', 'using', 'use', 'count', 'set', + 'limit', 'using', 'use', 'set', 'begin', 'apply', 'batch', 'truncate', 'delete', 'in', 'create', 'function', 'keyspace', 'schema', 'columnfamily', 'table', 'index', 'on', 'drop', 'primary', 'into', 'values', 'timestamp', 'ttl', 'alter', 'add', 'type', @@ -292,7 +292,6 @@ def dequote_value(cqlword): ::= nocomplete= ( | - # | -- to get count(*) completion, treat count as reserved | | | @@ -620,7 +619,6 @@ def working_on_keyspace(ctxt): ; ::= "DISTINCT"? ("AS" )? ("," ("AS" )?)* | "*" - | "COUNT" "(" star=( "*" | "1" ) ")" ("AS" )? ; ::= "." ; @@ -628,6 +626,7 @@ def working_on_keyspace(ctxt): | | "WRITETIME" "(" [colname]= ")" | "TTL" "(" [colname]= ")" + | "COUNT" "(" star=( "*" | "1" ) ")" | ; ::= "(" ( ( "," )* )? ")" @@ -679,10 +678,6 @@ def select_relation_lhs_completer(ctxt, cass): filterable.add(cd.name) return map(maybe_escape_name, filterable) -@completer_for('selectClause', 'star') -def select_count_star_completer(ctxt, cass): - return ['*'] - explain_completion('selector', 'colname') syntax_rules += r''' diff --git a/src/java/org/apache/cassandra/cql3/ResultSet.java b/src/java/org/apache/cassandra/cql3/ResultSet.java index 9762f017c175..c8c38698fbf5 100644 --- a/src/java/org/apache/cassandra/cql3/ResultSet.java +++ b/src/java/org/apache/cassandra/cql3/ResultSet.java @@ -58,6 +58,11 @@ public int size() return rows.size(); } + public boolean isEmpty() + { + return size() == 0; + } + public void addRow(List row) { assert row.size() == metadata.valueCount(); diff --git a/src/java/org/apache/cassandra/cql3/selection/AbstractFunctionSelector.java b/src/java/org/apache/cassandra/cql3/selection/AbstractFunctionSelector.java index b04f3468c3ea..4660e1d9d310 100644 --- a/src/java/org/apache/cassandra/cql3/selection/AbstractFunctionSelector.java +++ b/src/java/org/apache/cassandra/cql3/selection/AbstractFunctionSelector.java @@ -21,13 +21,11 @@ import java.util.Arrays; import java.util.List; -import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.cql3.ColumnIdentifier; -import org.apache.cassandra.cql3.ColumnSpecification; +import org.apache.commons.lang3.text.StrBuilder; + import org.apache.cassandra.cql3.functions.Function; import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.exceptions.InvalidRequestException; -import org.apache.commons.lang3.text.StrBuilder; abstract class AbstractFunctionSelector extends Selector { @@ -56,12 +54,17 @@ public static Factory newFactory(final Function fun, final SelectorFactories fac return new Factory() { - public ColumnSpecification getColumnSpecification(CFMetaData cfm) + protected String getColumnName() + { + return new StrBuilder(fun.name().toString()).append('(') + .appendWithSeparators(factories.getColumnNames(), ", ") + .append(')') + .toString(); + } + + protected AbstractType getReturnType() { - return new ColumnSpecification(cfm.ksName, - cfm.cfName, - new ColumnIdentifier(fun.toString(), true), - fun.returnType()); + return fun.returnType(); } public Selector newInstance() diff --git a/src/java/org/apache/cassandra/cql3/selection/FieldSelector.java b/src/java/org/apache/cassandra/cql3/selection/FieldSelector.java index 0bba56c5a46c..7e1448643929 100644 --- a/src/java/org/apache/cassandra/cql3/selection/FieldSelector.java +++ b/src/java/org/apache/cassandra/cql3/selection/FieldSelector.java @@ -19,9 +19,6 @@ import java.nio.ByteBuffer; -import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.cql3.ColumnIdentifier; -import org.apache.cassandra.cql3.ColumnSpecification; import org.apache.cassandra.cql3.selection.Selection.ResultSetBuilder; import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.db.marshal.UTF8Type; @@ -38,14 +35,16 @@ public static Factory newFactory(final UserType type, final int field, final Sel { return new Factory() { - public ColumnSpecification getColumnSpecification(CFMetaData cfm) + protected String getColumnName() { - ColumnIdentifier identifier = - new ColumnIdentifier(String.format("%s.%s", - factory.getColumnSpecification(cfm).name, - UTF8Type.instance.getString(type.fieldName(field))), true); + return String.format("%s.%s", + factory.getColumnName(), + UTF8Type.instance.getString(type.fieldName(field))); + } - return new ColumnSpecification(cfm.ksName, cfm.cfName, identifier, type.fieldType(field)); + protected AbstractType getReturnType() + { + return type.fieldType(field); } public Selector newInstance() diff --git a/src/java/org/apache/cassandra/cql3/selection/Selection.java b/src/java/org/apache/cassandra/cql3/selection/Selection.java index 17e2e92aa2b1..7c3d34ccc864 100644 --- a/src/java/org/apache/cassandra/cql3/selection/Selection.java +++ b/src/java/org/apache/cassandra/cql3/selection/Selection.java @@ -237,6 +237,11 @@ public ResultSet build() throws InvalidRequestException selectors.reset(); current = null; } + + if (resultSet.isEmpty() && selectors.isAggregate()) + { + resultSet.addRow(selectors.getOutputRow()); + } return resultSet; } diff --git a/src/java/org/apache/cassandra/cql3/selection/Selector.java b/src/java/org/apache/cassandra/cql3/selection/Selector.java index 310e17540503..889da704363a 100644 --- a/src/java/org/apache/cassandra/cql3/selection/Selector.java +++ b/src/java/org/apache/cassandra/cql3/selection/Selector.java @@ -21,6 +21,7 @@ import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.cql3.AssignmentTestable; +import org.apache.cassandra.cql3.ColumnIdentifier; import org.apache.cassandra.cql3.ColumnSpecification; import org.apache.cassandra.cql3.selection.Selection.ResultSetBuilder; import org.apache.cassandra.db.marshal.AbstractType; @@ -46,7 +47,13 @@ public static abstract class Factory * @param cfm the column family meta data * @return a column specification */ - public abstract ColumnSpecification getColumnSpecification(CFMetaData cfm); + public final ColumnSpecification getColumnSpecification(CFMetaData cfm) + { + return new ColumnSpecification(cfm.ksName, + cfm.cfName, + new ColumnIdentifier(getColumnName(), true), + getReturnType()); + } /** * Creates a new Selector instance. @@ -87,6 +94,22 @@ public boolean isTTLSelectorFactory() { return false; } + + /** + * Returns the name of the column corresponding to the output value of the selector instances created by + * this factory. + * + * @return a column name + */ + protected abstract String getColumnName(); + + /** + * Returns the type of the values returned by the selector instances created by this factory. + * + * @return the selector output type + */ + protected abstract AbstractType getReturnType(); + } /** diff --git a/src/java/org/apache/cassandra/cql3/selection/SelectorFactories.java b/src/java/org/apache/cassandra/cql3/selection/SelectorFactories.java index e0335562ed5a..692299422b1f 100644 --- a/src/java/org/apache/cassandra/cql3/selection/SelectorFactories.java +++ b/src/java/org/apache/cassandra/cql3/selection/SelectorFactories.java @@ -21,6 +21,9 @@ import java.util.Iterator; import java.util.List; +import com.google.common.base.Function; +import com.google.common.collect.Lists; + import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.ColumnDefinition; import org.apache.cassandra.cql3.selection.Selector.Factory; @@ -148,4 +151,21 @@ public Iterator iterator() { return factories.iterator(); } + + /** + * Returns the names of the columns corresponding to the output values of the selector instances created by + * these factories. + * + * @return a list of column names + */ + public List getColumnNames() + { + return Lists.transform(factories, new Function() + { + public String apply(Selector.Factory factory) + { + return factory.getColumnName(); + } + }); + } } diff --git a/src/java/org/apache/cassandra/cql3/selection/SimpleSelector.java b/src/java/org/apache/cassandra/cql3/selection/SimpleSelector.java index 37459d2925d5..cdd91b23755a 100644 --- a/src/java/org/apache/cassandra/cql3/selection/SimpleSelector.java +++ b/src/java/org/apache/cassandra/cql3/selection/SimpleSelector.java @@ -19,9 +19,6 @@ import java.nio.ByteBuffer; -import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.cql3.ColumnIdentifier; -import org.apache.cassandra.cql3.ColumnSpecification; import org.apache.cassandra.cql3.selection.Selection.ResultSetBuilder; import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.exceptions.InvalidRequestException; @@ -37,12 +34,14 @@ public static Factory newFactory(final String columnName, final int idx, final A { return new Factory() { - public ColumnSpecification getColumnSpecification(CFMetaData cfm) + protected String getColumnName() { - return new ColumnSpecification(cfm.ksName, - cfm.cfName, - new ColumnIdentifier(columnName, true), - type); + return columnName; + } + + protected AbstractType getReturnType() + { + return type; } public Selector newInstance() diff --git a/src/java/org/apache/cassandra/cql3/selection/WritetimeOrTTLSelector.java b/src/java/org/apache/cassandra/cql3/selection/WritetimeOrTTLSelector.java index a57a3cab9a0c..2494334edba2 100644 --- a/src/java/org/apache/cassandra/cql3/selection/WritetimeOrTTLSelector.java +++ b/src/java/org/apache/cassandra/cql3/selection/WritetimeOrTTLSelector.java @@ -19,9 +19,6 @@ import java.nio.ByteBuffer; -import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.cql3.ColumnIdentifier; -import org.apache.cassandra.cql3.ColumnSpecification; import org.apache.cassandra.cql3.selection.Selection.ResultSetBuilder; import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.db.marshal.Int32Type; @@ -39,13 +36,14 @@ public static Factory newFactory(final String columnName, final int idx, final b { return new Factory() { - public ColumnSpecification getColumnSpecification(CFMetaData cfm) + protected String getColumnName() { - String text = String.format("%s(%s)", isWritetime ? "writetime" : "ttl", columnName); - return new ColumnSpecification(cfm.ksName, - cfm.cfName, - new ColumnIdentifier(text, true), - isWritetime ? LongType.instance : Int32Type.instance); + return String.format("%s(%s)", isWritetime ? "writetime" : "ttl", columnName); + } + + protected AbstractType getReturnType() + { + return isWritetime ? LongType.instance : Int32Type.instance; } public Selector newInstance() diff --git a/test/unit/org/apache/cassandra/cql3/AggregationTest.java b/test/unit/org/apache/cassandra/cql3/AggregationTest.java index 87b7ca7e68a0..99db62a88c24 100644 --- a/test/unit/org/apache/cassandra/cql3/AggregationTest.java +++ b/test/unit/org/apache/cassandra/cql3/AggregationTest.java @@ -32,6 +32,15 @@ public class AggregationTest extends CQLTester public void testFunctions() throws Throwable { createTable("CREATE TABLE %s (a int, b int, c double, d decimal, primary key (a, b))"); + + // Test with empty table + assertColumnNames(execute("SELECT COUNT(*) FROM %s"), "count"); + assertRows(execute("SELECT COUNT(*) FROM %s"), row(0L)); + assertColumnNames(execute("SELECT max(b), min(b), sum(b), avg(b) , max(c), sum(c), avg(c), sum(d), avg(d) FROM %s"), + "max(b)", "min(b)", "sum(b)", "avg(b)" , "max(c)", "sum(c)", "avg(c)", "sum(d)", "avg(d)"); + assertRows(execute("SELECT max(b), min(b), sum(b), avg(b) , max(c), sum(c), avg(c), sum(d), avg(d) FROM %s"), + row(null, null, 0, 0, null, 0.0, 0.0, new BigDecimal("0"), new BigDecimal("0"))); + execute("INSERT INTO %s (a, b, c, d) VALUES (1, 1, 11.5, 11.5)"); execute("INSERT INTO %s (a, b, c, d) VALUES (1, 2, 9.5, 1.5)"); execute("INSERT INTO %s (a, b, c, d) VALUES (1, 3, 9.0, 2.0)"); @@ -45,6 +54,26 @@ public void testFunctions() throws Throwable assertRows(execute("SELECT COUNT(b), count(c) FROM %s"), row(4L, 3L)); } + @Test + public void testFunctionsWithCompactStorage() throws Throwable + { + createTable("CREATE TABLE %s (a int , b int, c double, primary key(a, b) ) WITH COMPACT STORAGE"); + + execute("INSERT INTO %s (a, b, c) VALUES (1, 1, 11.5)"); + execute("INSERT INTO %s (a, b, c) VALUES (1, 2, 9.5)"); + execute("INSERT INTO %s (a, b, c) VALUES (1, 3, 9.0)"); + + assertRows(execute("SELECT max(b), min(b), sum(b), avg(b) , max(c), sum(c), avg(c) FROM %s"), + row(3, 1, 6, 2, 11.5, 30.0, 10.0)); + + assertRows(execute("SELECT COUNT(*) FROM %s"), row(3L)); + assertRows(execute("SELECT COUNT(1) FROM %s"), row(3L)); + assertRows(execute("SELECT COUNT(*) FROM %s WHERE a = 1 AND b > 1"), row(2L)); + assertRows(execute("SELECT COUNT(1) FROM %s WHERE a = 1 AND b > 1"), row(2L)); + assertRows(execute("SELECT max(b), min(b), sum(b), avg(b) , max(c), sum(c), avg(c) FROM %s WHERE a = 1 AND b > 1"), + row(3, 2, 5, 2, 9.5, 18.5, 9.25)); + } + @Test public void testInvalidCalls() throws Throwable { @@ -65,6 +94,17 @@ public void testNestedFunctions() throws Throwable { createTable("CREATE TABLE %s (a int primary key, b timeuuid, c double, d double)"); + execute("CREATE OR REPLACE FUNCTION copySign(magnitude double, sign double) RETURNS double LANGUAGE JAVA\n" + + "AS 'return Double.valueOf(Math.copySign(magnitude.doubleValue(), sign.doubleValue()));';"); + + assertColumnNames(execute("SELECT max(a), max(unixTimestampOf(b)) FROM %s"), "max(a)", "max(unixtimestampof(b))"); + assertRows(execute("SELECT max(a), max(unixTimestampOf(b)) FROM %s"), row(null, null)); + assertColumnNames(execute("SELECT max(a), unixTimestampOf(max(b)) FROM %s"), "max(a)", "unixtimestampof(max(b))"); + assertRows(execute("SELECT max(a), unixTimestampOf(max(b)) FROM %s"), row(null, null)); + + assertColumnNames(execute("SELECT max(copySign(c, d)) FROM %s"), "max(copysign(c, d))"); + assertRows(execute("SELECT max(copySign(c, d)) FROM %s"), row((Object) null)); + execute("INSERT INTO %s (a, b, c, d) VALUES (1, maxTimeuuid('2011-02-03 04:05:00+0000'), -1.2, 2.1)"); execute("INSERT INTO %s (a, b, c, d) VALUES (2, maxTimeuuid('2011-02-03 04:06:00+0000'), 1.3, -3.4)"); execute("INSERT INTO %s (a, b, c, d) VALUES (3, maxTimeuuid('2011-02-03 04:10:00+0000'), 1.4, 1.2)"); @@ -76,8 +116,6 @@ public void testNestedFunctions() throws Throwable assertRows(execute("SELECT max(a), max(unixTimestampOf(b)) FROM %s"), row(3, date.getTime())); assertRows(execute("SELECT max(a), unixTimestampOf(max(b)) FROM %s"), row(3, date.getTime())); - execute("CREATE OR REPLACE FUNCTION copySign(magnitude double, sign double) RETURNS double LANGUAGE JAVA\n" + - "AS 'return Double.valueOf(Math.copySign(magnitude.doubleValue(), sign.doubleValue()));';"); assertRows(execute("SELECT copySign(max(c), min(c)) FROM %s"), row(-1.4)); assertRows(execute("SELECT copySign(c, d) FROM %s"), row(1.2), row(-1.3), row(1.4)); diff --git a/test/unit/org/apache/cassandra/cql3/CQLTester.java b/test/unit/org/apache/cassandra/cql3/CQLTester.java index 4ada0c5c31a7..ca022377e4c6 100644 --- a/test/unit/org/apache/cassandra/cql3/CQLTester.java +++ b/test/unit/org/apache/cassandra/cql3/CQLTester.java @@ -349,6 +349,24 @@ protected void assertRows(UntypedResultSet result, Object[]... rows) Assert.assertTrue(String.format("Got %s rows than expected. Expected %d but got %d", rows.length>i ? "less" : "more", rows.length, i), i == rows.length); } + protected void assertColumnNames(UntypedResultSet result, String... expectedColumnNames) + { + if (result == null) + { + Assert.fail("No rows returned by query."); + return; + } + + List metadata = result.metadata(); + Assert.assertEquals("Got less columns than expected.", expectedColumnNames.length, metadata.size()); + + for (int i = 0, m = metadata.size(); i < m; i++) + { + ColumnSpecification columnSpec = metadata.get(i); + Assert.assertEquals(expectedColumnNames[i], columnSpec.name.toString()); + } + } + protected void assertAllRows(Object[]... rows) throws Throwable { assertRows(execute("SELECT * FROM %s"), rows); From b2808b1dcea1158511421f947660f03d583e84b0 Mon Sep 17 00:00:00 2001 From: Yuki Morishita Date: Mon, 3 Nov 2014 14:17:37 -0600 Subject: [PATCH 187/557] Wait for all repair sessions to finish patch by yukim; reviewed by krummas for CASSANDRA-8208 --- CHANGES.txt | 2 +- .../repair/RepairMessageVerbHandler.java | 2 +- .../apache/cassandra/repair/RepairResult.java | 3 ++ .../cassandra/repair/RepairSession.java | 6 +-- .../cassandra/repair/RepairSessionResult.java | 43 +++++++++++++++++++ .../messages/AnticompactionRequest.java | 26 +++++++++-- .../service/ActiveRepairService.java | 16 ++++--- .../cassandra/service/StorageService.java | 30 ++++++++----- 8 files changed, 104 insertions(+), 24 deletions(-) create mode 100644 src/java/org/apache/cassandra/repair/RepairSessionResult.java diff --git a/CHANGES.txt b/CHANGES.txt index d656faf2c828..82fbbc503e42 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -30,7 +30,7 @@ * Use unsafe mutations for most unit tests (CASSANDRA-6969) * Fix race condition during calculation of pending ranges (CASSANDRA-7390) * Fail on very large batch sizes (CASSANDRA-8011) - * improve concurrency of repair (CASSANDRA-6455) + * improve concurrency of repair (CASSANDRA-6455, 8208) 2.1.3 * Support for frozen collections (CASSANDRA-7859) diff --git a/src/java/org/apache/cassandra/repair/RepairMessageVerbHandler.java b/src/java/org/apache/cassandra/repair/RepairMessageVerbHandler.java index 2e96ee365e74..1880e8e8f5c6 100644 --- a/src/java/org/apache/cassandra/repair/RepairMessageVerbHandler.java +++ b/src/java/org/apache/cassandra/repair/RepairMessageVerbHandler.java @@ -124,7 +124,7 @@ public boolean apply(SSTableReader sstable) logger.debug("Got anticompaction request {}", anticompactionRequest); try { - List> futures = ActiveRepairService.instance.doAntiCompaction(anticompactionRequest.parentRepairSession); + List> futures = ActiveRepairService.instance.doAntiCompaction(anticompactionRequest.parentRepairSession, anticompactionRequest.successfulRanges); FBUtilities.waitOnFutures(futures); } catch (Exception e) diff --git a/src/java/org/apache/cassandra/repair/RepairResult.java b/src/java/org/apache/cassandra/repair/RepairResult.java index 259d5f39118b..333b48ad33e7 100644 --- a/src/java/org/apache/cassandra/repair/RepairResult.java +++ b/src/java/org/apache/cassandra/repair/RepairResult.java @@ -19,6 +19,9 @@ import java.util.List; +/** + * RepairJob's result + */ public class RepairResult { public final RepairJobDesc desc; diff --git a/src/java/org/apache/cassandra/repair/RepairSession.java b/src/java/org/apache/cassandra/repair/RepairSession.java index c273c4e6c463..cc46dbea3a76 100644 --- a/src/java/org/apache/cassandra/repair/RepairSession.java +++ b/src/java/org/apache/cassandra/repair/RepairSession.java @@ -75,7 +75,7 @@ * Similarly, if a job is sequential, it will handle one SyncTask at a time, but will handle * all of them in parallel otherwise. */ -public class RepairSession extends AbstractFuture> implements IEndpointStateChangeSubscriber, +public class RepairSession extends AbstractFuture implements IEndpointStateChangeSubscriber, IFailureDetectionEventListener { private static Logger logger = LoggerFactory.getLogger(RepairSession.class); @@ -223,7 +223,7 @@ public void start(ListeningExecutorService executor) if (endpoints.isEmpty()) { logger.info(String.format("[repair #%s] No neighbors to repair with on range %s: session completed", getId(), range)); - set(Lists.newArrayList()); + set(new RepairSessionResult(id, keyspace, range, Lists.newArrayList())); return; } @@ -255,7 +255,7 @@ public void onSuccess(List results) { // this repair session is completed logger.info(String.format("[repair #%s] session completed successfully", getId())); - set(results); + set(new RepairSessionResult(id, keyspace, range, results)); taskExecutor.shutdown(); // mark this session as terminated terminate(); diff --git a/src/java/org/apache/cassandra/repair/RepairSessionResult.java b/src/java/org/apache/cassandra/repair/RepairSessionResult.java new file mode 100644 index 000000000000..45516081037c --- /dev/null +++ b/src/java/org/apache/cassandra/repair/RepairSessionResult.java @@ -0,0 +1,43 @@ +/* + * 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.repair; + +import java.util.Collection; +import java.util.UUID; + +import org.apache.cassandra.dht.Range; +import org.apache.cassandra.dht.Token; + +/** + * Repair session result + */ +public class RepairSessionResult +{ + public final UUID sessionId; + public final String keyspace; + public final Range range; + public final Collection repairJobResults; + + public RepairSessionResult(UUID sessionId, String keyspace, Range range, Collection repairJobResults) + { + this.sessionId = sessionId; + this.keyspace = keyspace; + this.range = range; + this.repairJobResults = repairJobResults; + } +} diff --git a/src/java/org/apache/cassandra/repair/messages/AnticompactionRequest.java b/src/java/org/apache/cassandra/repair/messages/AnticompactionRequest.java index 1a13ad1bdb87..239ab0e7a9e9 100644 --- a/src/java/org/apache/cassandra/repair/messages/AnticompactionRequest.java +++ b/src/java/org/apache/cassandra/repair/messages/AnticompactionRequest.java @@ -19,8 +19,13 @@ import java.io.DataInput; import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import java.util.UUID; +import org.apache.cassandra.dht.Range; +import org.apache.cassandra.dht.Token; import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.utils.UUIDSerializer; @@ -28,11 +33,16 @@ public class AnticompactionRequest extends RepairMessage { public static MessageSerializer serializer = new AnticompactionRequestSerializer(); public final UUID parentRepairSession; + /** + * Successfully repaired ranges. Does not contain null. + */ + public final Collection> successfulRanges; - public AnticompactionRequest(UUID parentRepairSession) + public AnticompactionRequest(UUID parentRepairSession, Collection> ranges) { super(Type.ANTICOMPACTION_REQUEST, null); this.parentRepairSession = parentRepairSession; + this.successfulRanges = ranges; } public static class AnticompactionRequestSerializer implements MessageSerializer @@ -40,17 +50,27 @@ public static class AnticompactionRequestSerializer implements MessageSerializer public void serialize(AnticompactionRequest message, DataOutputPlus out, int version) throws IOException { UUIDSerializer.serializer.serialize(message.parentRepairSession, out, version); + out.writeInt(message.successfulRanges.size()); + for (Range r : message.successfulRanges) + Range.serializer.serialize(r, out, version); } public AnticompactionRequest deserialize(DataInput in, int version) throws IOException { UUID parentRepairSession = UUIDSerializer.serializer.deserialize(in, version); - return new AnticompactionRequest(parentRepairSession); + int rangeCount = in.readInt(); + List> ranges = new ArrayList<>(rangeCount); + for (int i = 0; i < rangeCount; i++) + ranges.add((Range) Range.serializer.deserialize(in, version).toTokenBounds()); + return new AnticompactionRequest(parentRepairSession, ranges); } public long serializedSize(AnticompactionRequest message, int version) { - return UUIDSerializer.serializer.serializedSize(message.parentRepairSession, version); + long size = UUIDSerializer.serializer.serializedSize(message.parentRepairSession, version); + for (Range r : message.successfulRanges) + size += Range.serializer.serializedSize(r, version); + return size; } } diff --git a/src/java/org/apache/cassandra/service/ActiveRepairService.java b/src/java/org/apache/cassandra/service/ActiveRepairService.java index 763ecdf615d5..3c1cc482fc2a 100644 --- a/src/java/org/apache/cassandra/service/ActiveRepairService.java +++ b/src/java/org/apache/cassandra/service/ActiveRepairService.java @@ -257,7 +257,7 @@ public void onFailure(InetAddress from) for (ColumnFamilyStore cfs : columnFamilyStores) cfIds.add(cfs.metadata.cfId); - for(InetAddress neighbour : endpoints) + for (InetAddress neighbour : endpoints) { PrepareMessage message = new PrepareMessage(parentRepairSession, cfIds, options.getRanges(), options.isIncremental()); MessageOut msg = message.createMessage(); @@ -287,17 +287,17 @@ public void registerParentRepairSession(UUID parentRepairSession, List neighbors) + public void finishParentSession(UUID parentSession, Set neighbors, Collection> successfulRanges) { try { for (InetAddress neighbor : neighbors) { - AnticompactionRequest acr = new AnticompactionRequest(parentSession); + AnticompactionRequest acr = new AnticompactionRequest(parentSession, successfulRanges); MessageOut req = acr.createMessage(); MessagingService.instance().sendOneWay(req, neighbor); } - List> futures = doAntiCompaction(parentSession); + List> futures = doAntiCompaction(parentSession, successfulRanges); FBUtilities.waitOnFutures(futures); } finally @@ -316,12 +316,16 @@ public ParentRepairSession removeParentRepairSession(UUID parentSessionId) return parentRepairSessions.remove(parentSessionId); } - public List> doAntiCompaction(UUID parentRepairSession) + public List> doAntiCompaction(UUID parentRepairSession, Collection> successfulRanges) { assert parentRepairSession != null; ParentRepairSession prs = getParentRepairSession(parentRepairSession); + assert prs.ranges.containsAll(successfulRanges) : "Trying to perform anticompaction on unknown ranges"; List> futures = new ArrayList<>(); + // if we don't have successful repair ranges, then just skip anticompaction + if (successfulRanges.isEmpty()) + return futures; for (Map.Entry columnFamilyStoreEntry : prs.columnFamilyStores.entrySet()) { @@ -338,7 +342,7 @@ public List> doAntiCompaction(UUID parentRepairSession) success = sstables.isEmpty() || cfs.getDataTracker().markCompacting(sstables); } - futures.add(CompactionManager.instance.submitAntiCompaction(cfs, prs.ranges, sstables, prs.repairedAt)); + futures.add(CompactionManager.instance.submitAntiCompaction(cfs, successfulRanges, sstables, prs.repairedAt)); } return futures; diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index 450bc5cf070a..a0b7975cd594 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -30,7 +30,6 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; -import javax.annotation.Nullable; import javax.management.JMX; import javax.management.MBeanServer; import javax.management.Notification; @@ -78,6 +77,7 @@ import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.net.ResponseVerbHandler; import org.apache.cassandra.repair.RepairMessageVerbHandler; +import org.apache.cassandra.repair.RepairSessionResult; import org.apache.cassandra.repair.messages.RepairOption; import org.apache.cassandra.repair.RepairResult; import org.apache.cassandra.repair.RepairSession; @@ -2679,7 +2679,7 @@ protected void runMayThrow() throws Exception new NamedThreadFactory("Repair#" + cmd), "internal")); - List> futures = new ArrayList<>(options.getRanges().size()); + List> futures = new ArrayList<>(options.getRanges().size()); String[] cfnames = new String[columnFamilyStores.size()]; for (int i = 0; i < columnFamilyStores.size(); i++) { @@ -2698,9 +2698,9 @@ protected void runMayThrow() throws Exception if (session == null) continue; // After repair session completes, notify client its result - Futures.addCallback(session, new FutureCallback>() + Futures.addCallback(session, new FutureCallback() { - public void onSuccess(List results) + public void onSuccess(RepairSessionResult result) { String message = String.format("Repair session %s for range %s finished", session.getId(), session.getRange().toString()); logger.info(message); @@ -2719,14 +2719,23 @@ public void onFailure(Throwable t) // After all repair sessions completes(successful or not), // run anticompaction if necessary and send finish notice back to client - ListenableFuture allSessions = Futures.allAsList(futures); - Futures.addCallback(allSessions, new FutureCallback() + final ListenableFuture> allSessions = Futures.successfulAsList(futures); + Futures.addCallback(allSessions, new FutureCallback>() { - public void onSuccess(@Nullable Object result) + public void onSuccess(List result) { + // filter out null(=failed) results and get successful ranges + Collection> successfulRanges = new ArrayList<>(); + for (RepairSessionResult sessionResult : result) + { + if (sessionResult != null) + { + successfulRanges.add(sessionResult.range); + } + } try { - ActiveRepairService.instance.finishParentSession(parentSession, allNeighbors); + ActiveRepairService.instance.finishParentSession(parentSession, allNeighbors, successfulRanges); } catch (Exception e) { @@ -2742,14 +2751,15 @@ public void onFailure(Throwable t) private void repairComplete() { - String duration = DurationFormatUtils.formatDurationWords(System.currentTimeMillis() - startTime, true, true); + String duration = DurationFormatUtils.formatDurationWords(System.currentTimeMillis() - startTime, + true, true); String message = String.format("Repair command #%d finished in %s", cmd, duration); sendNotification("repair", message, new int[]{cmd, ActiveRepairService.Status.FINISHED.ordinal()}); logger.info(message); executor.shutdownNow(); } - }, MoreExecutors.sameThreadExecutor()); + }); } }, null); } From b4d7f3bed0687b449f6a275d9dd675e25d794aeb Mon Sep 17 00:00:00 2001 From: Robert Stupp Date: Fri, 14 Nov 2014 18:18:38 +0300 Subject: [PATCH 188/557] Deal with conflicts between system functions and UDFs patch by Robert Stupp; reviewed by Benjamin Lerer for CASSANDRA-7813 --- CHANGES.txt | 4 +- build.xml | 2 + pylib/cqlshlib/cql3handling.py | 2 +- src/java/org/apache/cassandra/auth/Auth.java | 6 +- .../apache/cassandra/config/KSMetaData.java | 1 + .../org/apache/cassandra/cql3/Attributes.java | 6 + .../apache/cassandra/cql3/CQLStatement.java | 2 + .../cassandra/cql3/ColumnCondition.java | 16 +- src/java/org/apache/cassandra/cql3/Cql.g | 8 +- .../org/apache/cassandra/cql3/Operation.java | 6 +- .../apache/cassandra/cql3/QueryProcessor.java | 29 +- src/java/org/apache/cassandra/cql3/Term.java | 12 + .../org/apache/cassandra/cql3/UserTypes.java | 9 + .../cql3/functions/FunctionCall.java | 13 +- .../cql3/functions/FunctionName.java | 36 +- .../cassandra/cql3/functions/Functions.java | 27 +- .../cql3/functions/NativeFunction.java | 8 +- .../cassandra/cql3/functions/UDFunction.java | 21 +- .../selection/AbstractFunctionSelector.java | 7 +- .../cassandra/cql3/selection/Selection.java | 10 + .../cassandra/cql3/selection/Selector.java | 5 + .../cql3/selection/SelectorFactories.java | 8 + .../cql3/statements/BatchStatement.java | 10 + .../statements/CreateFunctionStatement.java | 28 +- .../statements/DropFunctionStatement.java | 28 +- .../statements/ModificationStatement.java | 20 +- .../cql3/statements/ParsedStatement.java | 5 + .../cql3/statements/Restriction.java | 2 + .../cql3/statements/SelectStatement.java | 22 +- .../statements/SingleColumnRestriction.java | 40 ++ .../org/apache/cassandra/db/DefsTables.java | 5 +- .../apache/cassandra/db/SystemKeyspace.java | 7 +- .../cassandra/service/IMigrationListener.java | 6 +- .../cassandra/service/MigrationManager.java | 26 +- .../org/apache/cassandra/transport/Event.java | 24 +- .../apache/cassandra/transport/Server.java | 8 +- .../cassandra/cql3/AggregationTest.java | 10 +- .../apache/cassandra/cql3/PgStringTest.java | 4 +- .../org/apache/cassandra/cql3/UFTest.java | 378 +++++++++++++----- 39 files changed, 637 insertions(+), 224 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index f250edccdd57..ff255d858162 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,7 +1,7 @@ 3.0 * Fix aggregate fn results on empty selection, result column name, and cqlsh parsing (CASSANDRA-8229) - * Mark sstables as repaired after full repair (CASSANDRA-7586) + * Mark sstables as repaired after full repair (CASSANDRA-7586) * Extend Descriptor to include a format value and refactor reader/writer apis (CASSANDRA-7443) * Integrate JMH for microbenchmarks (CASSANDRA-8151) * Keep sstable levels when bootstrapping (CASSANDRA-7460) @@ -15,7 +15,7 @@ * Remove YamlFileNetworkTopologySnitch (CASSANDRA-7917) * Do anticompaction in groups (CASSANDRA-6851) * Support pure user-defined functions (CASSANDRA-7395, 7526, 7562, 7740, 7781, 7929, - 7924, 7812, 8063) + 7924, 7812, 8063, 7813) * Permit configurable timestamps with cassandra-stress (CASSANDRA-7416) * Move sstable RandomAccessReader to nio2, which allows using the FILE_SHARE_DELETE flag on Windows (CASSANDRA-4050) diff --git a/build.xml b/build.xml index c4e27a727904..c7aa83e324c4 100644 --- a/build.xml +++ b/build.xml @@ -212,6 +212,8 @@ + + diff --git a/pylib/cqlshlib/cql3handling.py b/pylib/cqlshlib/cql3handling.py index 261161cf9540..f8a3069d9d21 100644 --- a/pylib/cqlshlib/cql3handling.py +++ b/pylib/cqlshlib/cql3handling.py @@ -209,7 +209,7 @@ def dequote_value(cqlword): ::= "{" ":" ( "," ":" )* "}" ; - ::= ( ":" ":" )? + ::= ( "." )? | "TOKEN" ; diff --git a/src/java/org/apache/cassandra/auth/Auth.java b/src/java/org/apache/cassandra/auth/Auth.java index 07c9a6793edf..8c12df693440 100644 --- a/src/java/org/apache/cassandra/auth/Auth.java +++ b/src/java/org/apache/cassandra/auth/Auth.java @@ -337,7 +337,7 @@ public void onDropUserType(String ksName, String userType) { } - public void onDropFunction(String namespace, String functionName) + public void onDropFunction(String ksName, String functionName) { } @@ -353,7 +353,7 @@ public void onCreateUserType(String ksName, String userType) { } - public void onCreateFunction(String namespace, String functionName) + public void onCreateFunction(String ksName, String functionName) { } @@ -369,7 +369,7 @@ public void onUpdateUserType(String ksName, String userType) { } - public void onUpdateFunction(String namespace, String functionName) + public void onUpdateFunction(String ksName, String functionName) { } } diff --git a/src/java/org/apache/cassandra/config/KSMetaData.java b/src/java/org/apache/cassandra/config/KSMetaData.java index d3ff62c024b9..494f98b8fb67 100644 --- a/src/java/org/apache/cassandra/config/KSMetaData.java +++ b/src/java/org/apache/cassandra/config/KSMetaData.java @@ -185,6 +185,7 @@ public Mutation dropFromSchema(long timestamp) mutation.delete(SystemKeyspace.SCHEMA_COLUMNS_TABLE, timestamp); mutation.delete(SystemKeyspace.SCHEMA_TRIGGERS_TABLE, timestamp); mutation.delete(SystemKeyspace.SCHEMA_USER_TYPES_TABLE, timestamp); + mutation.delete(SystemKeyspace.SCHEMA_FUNCTIONS_TABLE, timestamp); mutation.delete(SystemKeyspace.BUILT_INDEXES_TABLE, timestamp); return mutation; diff --git a/src/java/org/apache/cassandra/cql3/Attributes.java b/src/java/org/apache/cassandra/cql3/Attributes.java index df40b0c24a3b..851e1b48d99a 100644 --- a/src/java/org/apache/cassandra/cql3/Attributes.java +++ b/src/java/org/apache/cassandra/cql3/Attributes.java @@ -45,6 +45,12 @@ private Attributes(Term timestamp, Term timeToLive) this.timeToLive = timeToLive; } + public boolean usesFunction(String ksName, String functionName) + { + return (timestamp != null && timestamp.usesFunction(ksName, functionName)) + || (timeToLive != null && timeToLive.usesFunction(ksName, functionName)); + } + public boolean isTimestampSet() { return timestamp != null; diff --git a/src/java/org/apache/cassandra/cql3/CQLStatement.java b/src/java/org/apache/cassandra/cql3/CQLStatement.java index a1642efeb717..d555ec31b9b1 100644 --- a/src/java/org/apache/cassandra/cql3/CQLStatement.java +++ b/src/java/org/apache/cassandra/cql3/CQLStatement.java @@ -58,4 +58,6 @@ public interface CQLStatement * @param state the current query state */ public ResultMessage executeInternal(QueryState state, QueryOptions options) throws RequestValidationException, RequestExecutionException; + + boolean usesFunction(String ksName, String functionName); } diff --git a/src/java/org/apache/cassandra/cql3/ColumnCondition.java b/src/java/org/apache/cassandra/cql3/ColumnCondition.java index fc45fdc97555..7daec0268f8e 100644 --- a/src/java/org/apache/cassandra/cql3/ColumnCondition.java +++ b/src/java/org/apache/cassandra/cql3/ColumnCondition.java @@ -34,15 +34,12 @@ import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.transport.Server; import org.apache.cassandra.utils.ByteBufferUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * A CQL3 condition on the value of a column or collection element. For example, "UPDATE .. IF a = 0". */ public class ColumnCondition { - private static final Logger logger = LoggerFactory.getLogger(ColumnCondition.class); public final ColumnDefinition column; @@ -96,6 +93,19 @@ public static ColumnCondition inCondition(ColumnDefinition column, Term collecti return new ColumnCondition(column, collectionElement, inMarker, null, Operator.IN); } + public boolean usesFunction(String ksName, String functionName) + { + if (collectionElement != null && collectionElement.usesFunction(ksName, functionName)) + return true; + if (value != null && value.usesFunction(ksName, functionName)) + return true; + if (inValues != null) + for (Term value : inValues) + if (value != null && value.usesFunction(ksName, functionName)) + return true; + return false; + } + /** * Collects the column specification for the bind variables of this operation. * diff --git a/src/java/org/apache/cassandra/cql3/Cql.g b/src/java/org/apache/cassandra/cql3/Cql.g index 37e94b7198fb..4c051e39db9e 100644 --- a/src/java/org/apache/cassandra/cql3/Cql.g +++ b/src/java/org/apache/cassandra/cql3/Cql.g @@ -310,7 +310,7 @@ selectionFunctionArgs returns [List a] selectCountClause returns [List expr] @init{ ColumnIdentifier alias = new ColumnIdentifier("count", false); } - : K_COUNT '(' countArgument ')' (K_AS c=ident { alias = c; })? { $expr = new ArrayList(); $expr.add( new RawSelector(new Selectable.WithFunction.Raw(new FunctionName("countRows"), Collections.emptyList()), alias));} + : K_COUNT '(' countArgument ')' (K_AS c=ident { alias = c; })? { $expr = new ArrayList(); $expr.add( new RawSelector(new Selectable.WithFunction.Raw(FunctionName.nativeFunction("countRows"), Collections.emptyList()), alias));} ; countArgument @@ -977,12 +977,12 @@ intValue returns [Term.Raw value] ; functionName returns [FunctionName s] - : f=allowedFunctionName { $s = new FunctionName(f); } - | b=allowedFunctionName '::' f=allowedFunctionName { $s = new FunctionName(b, f); } + : (ks=keyspaceName '.')? f=allowedFunctionName { $s = new FunctionName(ks, f); } ; allowedFunctionName returns [String s] - : f=IDENT { $s = $f.text; } + : f=IDENT { $s = $f.text.toLowerCase(); } + | f=QUOTED_NAME { $s = $f.text; } | u=unreserved_function_keyword { $s = u; } | K_TOKEN { $s = "token"; } | K_COUNT { $s = "count"; } diff --git a/src/java/org/apache/cassandra/cql3/Operation.java b/src/java/org/apache/cassandra/cql3/Operation.java index 816acb20abaf..583158b4fc75 100644 --- a/src/java/org/apache/cassandra/cql3/Operation.java +++ b/src/java/org/apache/cassandra/cql3/Operation.java @@ -19,7 +19,6 @@ import java.nio.ByteBuffer; -import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.ColumnDefinition; import org.apache.cassandra.db.ColumnFamily; import org.apache.cassandra.db.composites.Composite; @@ -56,6 +55,11 @@ protected Operation(ColumnDefinition column, Term t) this.t = t; } + public boolean usesFunction(String ksName, String functionName) + { + return t != null && t.usesFunction(ksName, functionName); + } + /** * @return whether the operation requires a read of the previous value to be executed * (only lists setterByIdx, discard and discardByIdx requires that). diff --git a/src/java/org/apache/cassandra/cql3/QueryProcessor.java b/src/java/org/apache/cassandra/cql3/QueryProcessor.java index 680f9f28a76e..cd5607520d00 100644 --- a/src/java/org/apache/cassandra/cql3/QueryProcessor.java +++ b/src/java/org/apache/cassandra/cql3/QueryProcessor.java @@ -31,6 +31,7 @@ import org.github.jamm.MemoryMeter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.apache.cassandra.cql3.functions.*; import org.apache.cassandra.cql3.statements.*; import org.apache.cassandra.db.*; import org.apache.cassandra.db.composites.*; @@ -591,11 +592,20 @@ else if (statement instanceof SelectStatement) public void onCreateKeyspace(String ksName) { } public void onCreateColumnFamily(String ksName, String cfName) { } public void onCreateUserType(String ksName, String typeName) { } - public void onCreateFunction(String namespace, String functionName) { } + public void onCreateFunction(String ksName, String functionName) { + if (Functions.getOverloadCount(new FunctionName(ksName, functionName)) > 1) + { + // in case there are other overloads, we have to remove all overloads since argument type + // matching may change (due to type casting) + removeInvalidPreparedStatementsForFunction(preparedStatements.values().iterator(), ksName, functionName); + removeInvalidPreparedStatementsForFunction(thriftPreparedStatements.values().iterator(), ksName, functionName); + } + } + public void onUpdateKeyspace(String ksName) { } public void onUpdateColumnFamily(String ksName, String cfName) { } public void onUpdateUserType(String ksName, String typeName) { } - public void onUpdateFunction(String namespace, String functionName) { } + public void onUpdateFunction(String ksName, String functionName) { } public void onDropKeyspace(String ksName) { @@ -608,6 +618,17 @@ public void onDropColumnFamily(String ksName, String cfName) } public void onDropUserType(String ksName, String typeName) { } - public void onDropFunction(String namespace, String functionName) { } - } + public void onDropFunction(String ksName, String functionName) { + removeInvalidPreparedStatementsForFunction(preparedStatements.values().iterator(), ksName, functionName); + removeInvalidPreparedStatementsForFunction(thriftPreparedStatements.values().iterator(), ksName, functionName); + } + + private void removeInvalidPreparedStatementsForFunction(Iterator iterator, + String ksName, String functionName) + { + while (iterator.hasNext()) + if (iterator.next().statement.usesFunction(ksName, functionName)) + iterator.remove(); + } + } } diff --git a/src/java/org/apache/cassandra/cql3/Term.java b/src/java/org/apache/cassandra/cql3/Term.java index 3f4d728d4146..7e20df8717e1 100644 --- a/src/java/org/apache/cassandra/cql3/Term.java +++ b/src/java/org/apache/cassandra/cql3/Term.java @@ -67,6 +67,8 @@ public interface Term */ public abstract boolean containsBindMarker(); + boolean usesFunction(String ksName, String functionName); + /** * A parsed, non prepared (thus untyped) term. * @@ -115,6 +117,11 @@ public abstract class Terminal implements Term public void collectMarkerSpecification(VariableSpecifications boundNames) {} public Terminal bind(QueryOptions options) { return this; } + public boolean usesFunction(String ksName, String functionName) + { + return false; + } + // While some NonTerminal may not have bind markers, no Term can be Terminal // with a bind marker public boolean containsBindMarker() @@ -156,6 +163,11 @@ public interface CollectionTerminal */ public abstract class NonTerminal implements Term { + public boolean usesFunction(String ksName, String functionName) + { + return false; + } + public ByteBuffer bindAndGet(QueryOptions options) throws InvalidRequestException { Terminal t = bind(options); diff --git a/src/java/org/apache/cassandra/cql3/UserTypes.java b/src/java/org/apache/cassandra/cql3/UserTypes.java index 22063ffb98cb..934344c19dc4 100644 --- a/src/java/org/apache/cassandra/cql3/UserTypes.java +++ b/src/java/org/apache/cassandra/cql3/UserTypes.java @@ -148,6 +148,15 @@ public DelayedValue(UserType type, List values) this.values = values; } + public boolean usesFunction(String ksName, String functionName) + { + if (values != null) + for (Term value : values) + if (value != null && value.usesFunction(ksName, functionName)) + return true; + return false; + } + public boolean containsBindMarker() { for (Term t : values) diff --git a/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java b/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java index 3b80fc088646..efaa12a042dd 100644 --- a/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java +++ b/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java @@ -41,6 +41,11 @@ private FunctionCall(ScalarFunction fun, List terms) this.terms = terms; } + public boolean usesFunction(String ksName, String functionName) + { + return fun.name().keyspace.equals(ksName) && fun.name().name.equals(functionName); + } + public void collectMarkerSpecification(VariableSpecifications boundNames) { for (Term t : terms) @@ -54,7 +59,7 @@ public Term.Terminal bind(QueryOptions options) throws InvalidRequestException public ByteBuffer bindAndGet(QueryOptions options) throws InvalidRequestException { - List buffers = new ArrayList(terms.size()); + List buffers = new ArrayList<>(terms.size()); for (Term t : terms) { // For now, we don't allow nulls as argument as no existing function needs it and it @@ -110,7 +115,7 @@ private static Term.Terminal makeTerminal(Function fun, ByteBuffer result, int v public static class Raw implements Term.Raw { - private final FunctionName name; + private FunctionName name; private final List terms; public Raw(FunctionName name, List terms) @@ -140,7 +145,7 @@ public Term prepare(String keyspace, ColumnSpecification receiver) throws Invali throw new InvalidRequestException(String.format("Incorrect number of arguments specified for function %s (expected %d, found %d)", fun.name(), fun.argTypes().size(), terms.size())); - List parameters = new ArrayList(terms.size()); + List parameters = new ArrayList<>(terms.size()); boolean allTerminal = true; for (int i = 0; i < terms.size(); i++) { @@ -160,7 +165,7 @@ public Term prepare(String keyspace, ColumnSpecification receiver) throws Invali // All parameters must be terminal private static ByteBuffer execute(ScalarFunction fun, List parameters) throws InvalidRequestException { - List buffers = new ArrayList(parameters.size()); + List buffers = new ArrayList<>(parameters.size()); for (Term t : parameters) { assert t instanceof Term.Terminal; diff --git a/src/java/org/apache/cassandra/cql3/functions/FunctionName.java b/src/java/org/apache/cassandra/cql3/functions/FunctionName.java index 814bbbfc1651..460e7a67ed8c 100644 --- a/src/java/org/apache/cassandra/cql3/functions/FunctionName.java +++ b/src/java/org/apache/cassandra/cql3/functions/FunctionName.java @@ -19,32 +19,40 @@ import com.google.common.base.Objects; -public class FunctionName +import org.apache.cassandra.db.Keyspace; +import org.apache.cassandra.db.SystemKeyspace; + +public final class FunctionName { - public final String namespace; + public final String keyspace; public final String name; - // Use by toString rather than built from 'bundle' and 'name' so as to - // preserve the original case. - private final String displayName; + public static FunctionName nativeFunction(String name) + { + return new FunctionName(SystemKeyspace.NAME, name); + } - public FunctionName(String name) + public FunctionName(String keyspace, String name) { - this("", name); + assert name != null : "Name parameter must not be null"; + this.keyspace = keyspace != null ? keyspace : null; + this.name = name; } - public FunctionName(String namespace, String name) + public FunctionName asNativeFunction() { - this.namespace = namespace.toLowerCase(); - this.name = name.toLowerCase(); + return FunctionName.nativeFunction(name); + } - this.displayName = namespace.isEmpty() ? name : namespace + "::" + name; + public boolean hasKeyspace() + { + return keyspace != null; } @Override public final int hashCode() { - return Objects.hashCode(namespace, name); + return Objects.hashCode(keyspace, name); } @Override @@ -54,13 +62,13 @@ public final boolean equals(Object o) return false; FunctionName that = (FunctionName)o; - return Objects.equal(this.namespace, that.namespace) + return Objects.equal(this.keyspace, that.keyspace) && Objects.equal(this.name, that.name); } @Override public String toString() { - return displayName; + return keyspace == null ? name : keyspace + "." + name; } } diff --git a/src/java/org/apache/cassandra/cql3/functions/Functions.java b/src/java/org/apache/cassandra/cql3/functions/Functions.java index 62de2bc57bdd..7021475e380e 100644 --- a/src/java/org/apache/cassandra/cql3/functions/Functions.java +++ b/src/java/org/apache/cassandra/cql3/functions/Functions.java @@ -37,7 +37,7 @@ public abstract class Functions // We special case the token function because that's the only function whose argument types actually // depend on the table on which the function is called. Because it's the sole exception, it's easier // to handle it as a special case. - private static final FunctionName TOKEN_FUNCTION_NAME = new FunctionName("token"); + private static final FunctionName TOKEN_FUNCTION_NAME = FunctionName.nativeFunction("token"); private static final String SELECT_UDFS = "SELECT * FROM " + SystemKeyspace.NAME + '.' + SystemKeyspace.SCHEMA_FUNCTIONS_TABLE; @@ -108,6 +108,11 @@ public static ColumnSpecification makeArgSpec(String receiverKs, String receiver fun.argTypes().get(i)); } + public static int getOverloadCount(FunctionName name) + { + return declared.get(name).size(); + } + public static Function get(String keyspace, FunctionName name, List providedArgs, @@ -115,10 +120,25 @@ public static Function get(String keyspace, String receiverCf) throws InvalidRequestException { - if (name.equals(TOKEN_FUNCTION_NAME)) + if (name.hasKeyspace() + ? name.equals(TOKEN_FUNCTION_NAME) + : name.name.equals(TOKEN_FUNCTION_NAME.name)) return new TokenFct(Schema.instance.getCFMetaData(receiverKs, receiverCf)); - List candidates = declared.get(name); + List candidates; + if (!name.hasKeyspace()) + { + // function name not fully qualified + candidates = new ArrayList<>(); + // add 'SYSTEM' (native) candidates + candidates.addAll(declared.get(name.asNativeFunction())); + // add 'current keyspace' candidates + candidates.addAll(declared.get(new FunctionName(keyspace, name.name))); + } + else + // function name is fully qualified (keyspace + name) + candidates = declared.get(name); + if (candidates.isEmpty()) return null; @@ -165,6 +185,7 @@ public static List find(FunctionName name) public static Function find(FunctionName name, List> argTypes) { + assert name.hasKeyspace() : "function name not fully qualified"; for (Function f : declared.get(name)) { if (f.argTypes().equals(argTypes)) diff --git a/src/java/org/apache/cassandra/cql3/functions/NativeFunction.java b/src/java/org/apache/cassandra/cql3/functions/NativeFunction.java index d658d9dd9e0f..bff768818ef2 100644 --- a/src/java/org/apache/cassandra/cql3/functions/NativeFunction.java +++ b/src/java/org/apache/cassandra/cql3/functions/NativeFunction.java @@ -28,12 +28,7 @@ public abstract class NativeFunction extends AbstractFunction { protected NativeFunction(String name, AbstractType returnType, AbstractType... argTypes) { - this(new FunctionName(name), returnType, argTypes); - } - - protected NativeFunction(FunctionName name, AbstractType returnType, AbstractType... argTypes) - { - super(name, Arrays.asList(argTypes), returnType); + super(FunctionName.nativeFunction(name), Arrays.asList(argTypes), returnType); } // Most of our functions are pure, the other ones should override this @@ -47,4 +42,3 @@ public boolean isNative() return true; } } - diff --git a/src/java/org/apache/cassandra/cql3/functions/UDFunction.java b/src/java/org/apache/cassandra/cql3/functions/UDFunction.java index bf011a7afe6b..42418c67a64d 100644 --- a/src/java/org/apache/cassandra/cql3/functions/UDFunction.java +++ b/src/java/org/apache/cassandra/cql3/functions/UDFunction.java @@ -30,7 +30,6 @@ import org.apache.cassandra.db.*; import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.db.marshal.AbstractType; -import org.apache.cassandra.db.marshal.CompositeType; import org.apache.cassandra.db.marshal.UTF8Type; import org.apache.cassandra.db.marshal.TypeParser; import org.apache.cassandra.exceptions.*; @@ -152,8 +151,8 @@ public boolean isNative() private static Mutation makeSchemaMutation(FunctionName name) { - CompositeType kv = (CompositeType)SystemKeyspace.SchemaFunctionsTable.getKeyValidator(); - return new Mutation(SystemKeyspace.NAME, kv.decompose(name.namespace, name.name)); + UTF8Type kv = (UTF8Type)SystemKeyspace.SchemaFunctionsTable.getKeyValidator(); + return new Mutation(SystemKeyspace.NAME, kv.decompose(name.keyspace)); } public Mutation toSchemaDrop(long timestamp) @@ -161,7 +160,7 @@ public Mutation toSchemaDrop(long timestamp) Mutation mutation = makeSchemaMutation(name); ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SCHEMA_FUNCTIONS_TABLE); - Composite prefix = SystemKeyspace.SchemaFunctionsTable.comparator.make(computeSignature(argTypes)); + Composite prefix = SystemKeyspace.SchemaFunctionsTable.comparator.make(name.name, computeSignature(argTypes)); int ldt = (int) (System.currentTimeMillis() / 1000); cf.addAtom(new RangeTombstone(prefix, prefix.end(), timestamp, ldt)); @@ -173,7 +172,7 @@ public Mutation toSchemaUpdate(long timestamp) Mutation mutation = makeSchemaMutation(name); ColumnFamily cf = mutation.addOrGet(SystemKeyspace.SCHEMA_FUNCTIONS_TABLE); - Composite prefix = SystemKeyspace.SchemaFunctionsTable.comparator.make(computeSignature(argTypes)); + Composite prefix = SystemKeyspace.SchemaFunctionsTable.comparator.make(name.name, computeSignature(argTypes)); CFRowAdder adder = new CFRowAdder(cf, prefix, timestamp); adder.resetCollection("argument_names"); @@ -194,9 +193,9 @@ public Mutation toSchemaUpdate(long timestamp) public static UDFunction fromSchema(UntypedResultSet.Row row) { - String namespace = row.getString("namespace"); - String fname = row.getString("name"); - FunctionName name = new FunctionName(namespace, fname); + String ksName = row.getString("keyspace_name"); + String functionName = row.getString("function_name"); + FunctionName name = new FunctionName(ksName, functionName); List names = row.getList("argument_names", UTF8Type.instance); List types = row.getList("argument_types", UTF8Type.instance); @@ -251,12 +250,12 @@ private static AbstractType parseType(String str) } } - public static Map fromSchema(Row row) + public static Map fromSchema(Row row) { UntypedResultSet results = QueryProcessor.resultify("SELECT * FROM system." + SystemKeyspace.SCHEMA_FUNCTIONS_TABLE, row); - Map udfs = new HashMap<>(results.size()); + Map udfs = new HashMap<>(results.size()); for (UntypedResultSet.Row result : results) - udfs.put(result.getBlob("signature"), fromSchema(result)); + udfs.put(SystemKeyspace.SchemaFunctionsTable.comparator.make(result.getString("function_name"), result.getBlob("signature")), fromSchema(result)); return udfs; } diff --git a/src/java/org/apache/cassandra/cql3/selection/AbstractFunctionSelector.java b/src/java/org/apache/cassandra/cql3/selection/AbstractFunctionSelector.java index 4660e1d9d310..3778d4194adc 100644 --- a/src/java/org/apache/cassandra/cql3/selection/AbstractFunctionSelector.java +++ b/src/java/org/apache/cassandra/cql3/selection/AbstractFunctionSelector.java @@ -49,7 +49,7 @@ public static Factory newFactory(final Function fun, final SelectorFactories fac { if (factories.doesAggregation() && !factories.containsOnlyAggregateFunctions()) throw new InvalidRequestException(String.format("the %s function arguments must be either all aggregates or all none aggregates", - fun.name().name)); + fun.name())); } return new Factory() @@ -67,6 +67,11 @@ protected AbstractType getReturnType() return fun.returnType(); } + public boolean usesFunction(String ksName, String functionName) + { + return fun.name().keyspace.equals(ksName) && fun.name().name.equals(functionName); + } + public Selector newInstance() { return fun.isAggregate() ? new AggregateFunctionSelector(fun, factories.newInstances()) diff --git a/src/java/org/apache/cassandra/cql3/selection/Selection.java b/src/java/org/apache/cassandra/cql3/selection/Selection.java index 7c3d34ccc864..7c7dab714a39 100644 --- a/src/java/org/apache/cassandra/cql3/selection/Selection.java +++ b/src/java/org/apache/cassandra/cql3/selection/Selection.java @@ -82,6 +82,11 @@ public int addColumnForOrdering(ColumnDefinition c) return columns.size() - 1; } + public boolean usesFunction(String ksName, String functionName) + { + return false; + } + private static boolean isUsingFunction(List rawSelectors) { for (RawSelector rawSelector : rawSelectors) @@ -346,6 +351,11 @@ public SelectionWithFunctions(Collection columns, throw new InvalidRequestException("the select clause must either contains only aggregates or none"); } + public boolean usesFunction(String ksName, String functionName) + { + return factories.usesFunction(ksName, functionName); + } + public boolean isAggregate() { return factories.containsOnlyAggregateFunctions(); diff --git a/src/java/org/apache/cassandra/cql3/selection/Selector.java b/src/java/org/apache/cassandra/cql3/selection/Selector.java index 889da704363a..f2c729b70757 100644 --- a/src/java/org/apache/cassandra/cql3/selection/Selector.java +++ b/src/java/org/apache/cassandra/cql3/selection/Selector.java @@ -40,6 +40,11 @@ public abstract class Selector implements AssignmentTestable */ public static abstract class Factory { + public boolean usesFunction(String ksName, String functionName) + { + return false; + } + /** * Returns the column specification corresponding to the output value of the selector instances created by * this factory. diff --git a/src/java/org/apache/cassandra/cql3/selection/SelectorFactories.java b/src/java/org/apache/cassandra/cql3/selection/SelectorFactories.java index 692299422b1f..4d3e9748f86b 100644 --- a/src/java/org/apache/cassandra/cql3/selection/SelectorFactories.java +++ b/src/java/org/apache/cassandra/cql3/selection/SelectorFactories.java @@ -89,6 +89,14 @@ private SelectorFactories(List selectables, } } + public boolean usesFunction(String ksName, String functionName) + { + for (Factory factory : factories) + if (factory != null && factory.usesFunction(ksName, functionName)) + return true; + return false; + } + /** * Checks if this SelectorFactories contains only factories for aggregates. * diff --git a/src/java/org/apache/cassandra/cql3/statements/BatchStatement.java b/src/java/org/apache/cassandra/cql3/statements/BatchStatement.java index f0874c1478c0..2db00df8daad 100644 --- a/src/java/org/apache/cassandra/cql3/statements/BatchStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/BatchStatement.java @@ -77,6 +77,16 @@ public BatchStatement(int boundTerms, Type type, List sta this.hasConditions = hasConditions; } + public boolean usesFunction(String ksName, String functionName) + { + if (attrs.usesFunction(ksName, functionName)) + return true; + for (ModificationStatement statement : statements) + if (statement.usesFunction(ksName, functionName)) + return true; + return false; + } + public long measureForPreparedCache(MemoryMeter meter) { long size = meter.measure(this) diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java index 712a4744e158..c41fb08d5b32 100644 --- a/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java @@ -22,6 +22,7 @@ import java.util.List; import org.apache.cassandra.auth.Permission; +import org.apache.cassandra.config.Schema; import org.apache.cassandra.cql3.CQL3Type; import org.apache.cassandra.cql3.ColumnIdentifier; import org.apache.cassandra.cql3.functions.*; @@ -31,6 +32,7 @@ import org.apache.cassandra.exceptions.UnauthorizedException; import org.apache.cassandra.service.ClientState; import org.apache.cassandra.service.MigrationManager; +import org.apache.cassandra.thrift.ThriftValidation; import org.apache.cassandra.transport.Event; /** @@ -40,7 +42,7 @@ public final class CreateFunctionStatement extends SchemaAlteringStatement { private final boolean orReplace; private final boolean ifNotExists; - private final FunctionName functionName; + private FunctionName functionName; private final String language; private final String body; private final boolean deterministic; @@ -70,17 +72,31 @@ public CreateFunctionStatement(FunctionName functionName, this.ifNotExists = ifNotExists; } - public void checkAccess(ClientState state) throws UnauthorizedException + public void prepareKeyspace(ClientState state) throws InvalidRequestException + { + if (!functionName.hasKeyspace() && state.getRawKeyspace() != null) + functionName = new FunctionName(state.getKeyspace(), functionName.name); + + if (!functionName.hasKeyspace()) + throw new InvalidRequestException("You need to be logged in a keyspace or use a fully qualified function name"); + + ThriftValidation.validateKeyspaceNotSystem(functionName.keyspace); + } + + public void checkAccess(ClientState state) throws UnauthorizedException, InvalidRequestException { // TODO CASSANDRA-7557 (function DDL permission) - state.hasAllKeyspacesAccess(Permission.CREATE); + state.hasKeyspaceAccess(functionName.keyspace, Permission.CREATE); } public void validate(ClientState state) throws InvalidRequestException { if (ifNotExists && orReplace) throw new InvalidRequestException("Cannot use both 'OR REPLACE' and 'IF NOT EXISTS' directives"); + + if (Schema.instance.getKSMetaData(functionName.keyspace) == null) + throw new InvalidRequestException(String.format("Cannot add function '%s' to non existing keyspace '%s'.", functionName.name, functionName.keyspace)); } public Event.SchemaChange changeEvent() @@ -98,7 +114,7 @@ public boolean announceMigration(boolean isLocalOnly) throws RequestValidationEx for (CQL3Type.Raw rawType : argRawTypes) // We have no proper keyspace to give, which means that this will break (NPE currently) // for UDT: #7791 is open to fix this - argTypes.add(rawType.prepare(null).getType()); + argTypes.add(rawType.prepare(functionName.keyspace).getType()); AbstractType returnType = rawReturnType.prepare(null).getType(); @@ -110,10 +126,6 @@ public boolean announceMigration(boolean isLocalOnly) throws RequestValidationEx if (!orReplace) throw new InvalidRequestException(String.format("Function %s already exists", old)); - // Means we're replacing the function. We still need to validate that 1) it's not a native function and 2) that the return type - // matches (or that could break existing code badly) - if (old.isNative()) - throw new InvalidRequestException(String.format("Cannot replace native function %s", old)); if (!old.returnType().isValueCompatibleWith(returnType)) throw new InvalidRequestException(String.format("Cannot replace function %s, the new return type %s is not compatible with the return type %s of existing function", functionName, returnType.asCQL3Type(), old.returnType().asCQL3Type())); diff --git a/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java b/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java index 78c860791a18..5aaf9b148a8d 100644 --- a/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java @@ -29,6 +29,7 @@ import org.apache.cassandra.exceptions.UnauthorizedException; import org.apache.cassandra.service.ClientState; import org.apache.cassandra.service.MigrationManager; +import org.apache.cassandra.thrift.ThriftValidation; import org.apache.cassandra.transport.Event; /** @@ -36,7 +37,7 @@ */ public final class DropFunctionStatement extends SchemaAlteringStatement { - private final FunctionName functionName; + private FunctionName functionName; private final boolean ifExists; private final List argRawTypes; private final boolean argsPresent; @@ -52,11 +53,22 @@ public DropFunctionStatement(FunctionName functionName, this.ifExists = ifExists; } - public void checkAccess(ClientState state) throws UnauthorizedException + public void prepareKeyspace(ClientState state) throws InvalidRequestException + { + if (!functionName.hasKeyspace() && state.getRawKeyspace() != null) + functionName = new FunctionName(state.getKeyspace(), functionName.name); + + if (!functionName.hasKeyspace()) + throw new InvalidRequestException("You need to be logged in a keyspace or use a fully qualified function name"); + + ThriftValidation.validateKeyspaceNotSystem(functionName.keyspace); + } + + public void checkAccess(ClientState state) throws UnauthorizedException, InvalidRequestException { // TODO CASSANDRA-7557 (function DDL permission) - state.hasAllKeyspacesAccess(Permission.DROP); + state.hasKeyspaceAccess(functionName.keyspace, Permission.DROP); } /** @@ -88,11 +100,7 @@ public boolean announceMigration(boolean isLocalOnly) throws RequestValidationEx List> argTypes = new ArrayList<>(argRawTypes.size()); for (CQL3Type.Raw rawType : argRawTypes) - { - // We have no proper keyspace to give, which means that this will break (NPE currently) - // for UDT: #7791 is open to fix this - argTypes.add(rawType.prepare(null).getType()); - } + argTypes.add(rawType.prepare(functionName.keyspace).getType()); Function old; if (argsPresent) @@ -125,10 +133,6 @@ public boolean announceMigration(boolean isLocalOnly) throws RequestValidationEx old = olds.get(0); } - if (old.isNative()) - throw new InvalidRequestException(String.format("Cannot drop function '%s' because it is a " + - "native (built-in) function", functionName)); - MigrationManager.announceFunctionDrop((UDFunction)old, isLocalOnly); return true; } diff --git a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java index 61f6401b7324..7dc9c66b20c2 100644 --- a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java @@ -22,7 +22,6 @@ import com.google.common.base.Function; import com.google.common.collect.Iterables; -import org.apache.cassandra.db.marshal.AbstractType; import org.github.jamm.MemoryMeter; import org.apache.cassandra.auth.Permission; @@ -88,6 +87,25 @@ public ModificationStatement(StatementType type, int boundTerms, CFMetaData cfm, this.attrs = attrs; } + public boolean usesFunction(String ksName, String functionName) + { + if (attrs.usesFunction(ksName, functionName)) + return true; + for (Restriction restriction : processedKeys.values()) + if (restriction != null && restriction.usesFunction(ksName, functionName)) + return true; + for (Operation operation : columnOperations) + if (operation != null && operation.usesFunction(ksName, functionName)) + return true; + for (ColumnCondition condition : columnConditions) + if (condition != null && condition.usesFunction(ksName, functionName)) + return true; + for (ColumnCondition condition : staticConditions) + if (condition != null && condition.usesFunction(ksName, functionName)) + return true; + return false; + } + public long measureForPreparedCache(MemoryMeter meter) { return meter.measure(this) diff --git a/src/java/org/apache/cassandra/cql3/statements/ParsedStatement.java b/src/java/org/apache/cassandra/cql3/statements/ParsedStatement.java index d048327f20e2..bcce9ce0b931 100644 --- a/src/java/org/apache/cassandra/cql3/statements/ParsedStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/ParsedStatement.java @@ -61,4 +61,9 @@ public Prepared(CQLStatement statement) this(statement, Collections.emptyList()); } } + + public boolean usesFunction(String ksName, String functionName) + { + return false; + } } diff --git a/src/java/org/apache/cassandra/cql3/statements/Restriction.java b/src/java/org/apache/cassandra/cql3/statements/Restriction.java index 659ed95ca835..b264156e86da 100644 --- a/src/java/org/apache/cassandra/cql3/statements/Restriction.java +++ b/src/java/org/apache/cassandra/cql3/statements/Restriction.java @@ -49,6 +49,8 @@ public interface Restriction // Not supported by Slice, but it's convenient to have here public List values(QueryOptions options) throws InvalidRequestException; + boolean usesFunction(String ksName, String functionName); + public static interface EQ extends Restriction {} public static interface IN extends Restriction diff --git a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java index f2147749b399..621c4dbc0a73 100644 --- a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java @@ -56,8 +56,6 @@ import org.apache.cassandra.serializers.MarshalException; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Encapsulates a completely parsed SELECT query, including the target @@ -66,8 +64,6 @@ */ public class SelectStatement implements CQLStatement, MeasurableForPreparedCache { - private static final Logger logger = LoggerFactory.getLogger(SelectStatement.class); - private static final int DEFAULT_COUNT_PAGE_SIZE = 10000; private final int boundTerms; @@ -125,6 +121,24 @@ public SelectStatement(CFMetaData cfm, int boundTerms, Parameters parameters, Se initStaticColumnsInfo(); } + public boolean usesFunction(String ksName, String functionName) + { + if (selection.usesFunction(ksName, functionName)) + return true; + if (limit != null && limit.usesFunction(ksName, functionName)) + return true; + for (Restriction restriction : metadataRestrictions.values()) + if (restriction != null && restriction.usesFunction(ksName, functionName)) + return true; + for (Restriction restriction : keyRestrictions) + if (restriction != null && restriction.usesFunction(ksName, functionName)) + return true; + for (Restriction restriction : columnRestrictions) + if (restriction != null && restriction.usesFunction(ksName, functionName)) + return true; + return false; + } + private void initStaticColumnsInfo() { if (!cfm.hasStaticColumns()) diff --git a/src/java/org/apache/cassandra/cql3/statements/SingleColumnRestriction.java b/src/java/org/apache/cassandra/cql3/statements/SingleColumnRestriction.java index b1c6ccc57073..b6ca640e7649 100644 --- a/src/java/org/apache/cassandra/cql3/statements/SingleColumnRestriction.java +++ b/src/java/org/apache/cassandra/cql3/statements/SingleColumnRestriction.java @@ -43,6 +43,11 @@ public EQ(Term value, boolean onToken) this.onToken = onToken; } + public boolean usesFunction(String ksName, String functionName) + { + return value != null && value.usesFunction(ksName, functionName); + } + public List values(QueryOptions options) throws InvalidRequestException { return Collections.singletonList(value.bindAndGet(options)); @@ -94,6 +99,15 @@ public InWithValues(List values) this.values = values; } + public boolean usesFunction(String ksName, String functionName) + { + if (values != null) + for (Term value : values) + if (value != null && value.usesFunction(ksName, functionName)) + return true; + return false; + } + public List values(QueryOptions options) throws InvalidRequestException { List buffers = new ArrayList<>(values.size()); @@ -153,6 +167,11 @@ public InWithMarker(AbstractMarker marker) this.marker = marker; } + public boolean usesFunction(String ksName, String functionName) + { + return false; + } + public List values(QueryOptions options) throws InvalidRequestException { Term.MultiItemTerminal lval = (Term.MultiItemTerminal)marker.bind(options); @@ -216,6 +235,14 @@ public Slice(boolean onToken) this.onToken = onToken; } + public boolean usesFunction(String ksName, String functionName) + { + for (Term value : bounds) + if (value != null && value.usesFunction(ksName, functionName)) + return true; + return false; + } + public boolean isSlice() { return true; @@ -343,6 +370,19 @@ public static class Contains extends SingleColumnRestriction private List values; // for CONTAINS private List keys; // for CONTAINS_KEY + public boolean usesFunction(String ksName, String functionName) + { + if (values != null) + for (Term value : values) + if (value != null && value.usesFunction(ksName, functionName)) + return true; + if (keys != null) + for (Term key : keys) + if (key != null && key.usesFunction(ksName, functionName)) + return true; + return false; + } + public boolean hasContains() { return values != null; diff --git a/src/java/org/apache/cassandra/db/DefsTables.java b/src/java/org/apache/cassandra/db/DefsTables.java index a02f65e5ea2d..bcb0893cd5bb 100644 --- a/src/java/org/apache/cassandra/db/DefsTables.java +++ b/src/java/org/apache/cassandra/db/DefsTables.java @@ -37,6 +37,7 @@ import org.apache.cassandra.cql3.functions.UDFunction; import org.apache.cassandra.db.commitlog.CommitLog; import org.apache.cassandra.db.compaction.CompactionManager; +import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.db.filter.QueryFilter; import org.apache.cassandra.db.marshal.AsciiType; import org.apache.cassandra.db.marshal.UserType; @@ -303,7 +304,7 @@ private static void mergeFunctions(Map before, Map diff = Maps.difference(before, after); - // New namespace with functions + // New keyspace with functions for (Map.Entry entry : diff.entriesOnlyOnRight().entrySet()) if (entry.getValue().hasColumns()) created.addAll(UDFunction.fromSchema(new Row(entry.getKey(), entry.getValue())).values()); @@ -315,7 +316,7 @@ private static void mergeFunctions(Map before, Map delta = + MapDifference delta = Maps.difference(UDFunction.fromSchema(new Row(entry.getKey(), pre)), UDFunction.fromSchema(new Row(entry.getKey(), post))); diff --git a/src/java/org/apache/cassandra/db/SystemKeyspace.java b/src/java/org/apache/cassandra/db/SystemKeyspace.java index 49c150263ac1..7806d5fe3939 100644 --- a/src/java/org/apache/cassandra/db/SystemKeyspace.java +++ b/src/java/org/apache/cassandra/db/SystemKeyspace.java @@ -182,11 +182,12 @@ public final class SystemKeyspace + "PRIMARY KEY ((keyspace_name), type_name))") .gcGraceSeconds(WEEK); + public static final CFMetaData SchemaFunctionsTable = compile(SCHEMA_FUNCTIONS_TABLE, "user defined function definitions", "CREATE TABLE %s (" - + "namespace text," - + "name text," + + "keyspace_name text," + + "function_name text," + "signature blob," + "argument_names list," + "argument_types list," @@ -194,7 +195,7 @@ public final class SystemKeyspace + "deterministic boolean," + "language text," + "return_type text," - + "PRIMARY KEY ((namespace, name), signature))") + + "PRIMARY KEY ((keyspace_name), function_name, signature))") .gcGraceSeconds(WEEK); public static final CFMetaData BuiltIndexesTable = diff --git a/src/java/org/apache/cassandra/service/IMigrationListener.java b/src/java/org/apache/cassandra/service/IMigrationListener.java index b4eb39218ec3..bc67e8aaab07 100644 --- a/src/java/org/apache/cassandra/service/IMigrationListener.java +++ b/src/java/org/apache/cassandra/service/IMigrationListener.java @@ -22,16 +22,16 @@ public interface IMigrationListener public void onCreateKeyspace(String ksName); public void onCreateColumnFamily(String ksName, String cfName); public void onCreateUserType(String ksName, String typeName); - public void onCreateFunction(String namespace, String functionName); + public void onCreateFunction(String ksName, String functionName); public void onUpdateKeyspace(String ksName); public void onUpdateColumnFamily(String ksName, String cfName); public void onUpdateUserType(String ksName, String typeName); - public void onUpdateFunction(String namespace, String functionName); + public void onUpdateFunction(String ksName, String functionName); public void onDropKeyspace(String ksName); public void onDropColumnFamily(String ksName, String cfName); public void onDropUserType(String ksName, String typeName); - public void onDropFunction(String namespace, String functionName); + public void onDropFunction(String ksName, String functionName); } diff --git a/src/java/org/apache/cassandra/service/MigrationManager.java b/src/java/org/apache/cassandra/service/MigrationManager.java index a5d4628e5d1e..8c3199f2588f 100644 --- a/src/java/org/apache/cassandra/service/MigrationManager.java +++ b/src/java/org/apache/cassandra/service/MigrationManager.java @@ -38,8 +38,11 @@ import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.config.UTMetaData; import org.apache.cassandra.config.Schema; +import org.apache.cassandra.cql3.functions.AggregateFunction; +import org.apache.cassandra.cql3.functions.ScalarFunction; import org.apache.cassandra.cql3.functions.UDFunction; import org.apache.cassandra.db.*; +import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.db.marshal.UserType; import org.apache.cassandra.exceptions.AlreadyExistsException; import org.apache.cassandra.exceptions.ConfigurationException; @@ -177,19 +180,36 @@ public void notifyCreateUserType(UserType ut) public void notifyCreateFunction(UDFunction udf) { for (IMigrationListener listener : listeners) - listener.onCreateFunction(udf.name().namespace, udf.name().name); + listener.onCreateFunction(udf.name().keyspace, udf.name().name); } public void notifyUpdateFunction(UDFunction udf) { for (IMigrationListener listener : listeners) - listener.onUpdateFunction(udf.name().namespace, udf.name().name); + listener.onUpdateFunction(udf.name().keyspace, udf.name().name); } public void notifyDropFunction(UDFunction udf) { for (IMigrationListener listener : listeners) - listener.onDropFunction(udf.name().namespace, udf.name().name); + listener.onDropFunction(udf.name().keyspace, udf.name().name); + } + + private List asString(List> abstractTypes) + { + List r = new ArrayList<>(abstractTypes.size()); + for (AbstractType abstractType : abstractTypes) + r.add(abstractType.asCQL3Type().toString()); + return r; + } + + private String udType(UDFunction udf) + { + if (udf instanceof ScalarFunction) + return "scalar"; + if (udf instanceof AggregateFunction) + return "aggregate"; + return ""; } public void notifyUpdateKeyspace(KSMetaData ksm) diff --git a/src/java/org/apache/cassandra/transport/Event.java b/src/java/org/apache/cassandra/transport/Event.java index 85943cfe7cf5..99625996877e 100644 --- a/src/java/org/apache/cassandra/transport/Event.java +++ b/src/java/org/apache/cassandra/transport/Event.java @@ -208,15 +208,15 @@ public enum Target { KEYSPACE, TABLE, TYPE } public final Change change; public final Target target; - public final String keyOrNamespace; + public final String keyspace; public final String tableOrTypeOrFunction; - public SchemaChange(Change change, Target target, String keyOrNamespace, String tableOrTypeOrFunction) + public SchemaChange(Change change, Target target, String keyspace, String tableOrTypeOrFunction) { super(Type.SCHEMA_CHANGE); this.change = change; this.target = target; - this.keyOrNamespace = keyOrNamespace; + this.keyspace = keyspace; this.tableOrTypeOrFunction = tableOrTypeOrFunction; if (target != Target.KEYSPACE) assert this.tableOrTypeOrFunction != null : "Table or type should be set for non-keyspace schema change events"; @@ -252,7 +252,7 @@ public void serializeEvent(ByteBuf dest, int version) { CBUtil.writeEnumValue(change, dest); CBUtil.writeEnumValue(target, dest); - CBUtil.writeString(keyOrNamespace, dest); + CBUtil.writeString(keyspace, dest); if (target != Target.KEYSPACE) CBUtil.writeString(tableOrTypeOrFunction, dest); } @@ -263,13 +263,13 @@ public void serializeEvent(ByteBuf dest, int version) // For the v1/v2 protocol, we have no way to represent type changes, so we simply say the keyspace // was updated. See CASSANDRA-7617. CBUtil.writeEnumValue(Change.UPDATED, dest); - CBUtil.writeString(keyOrNamespace, dest); + CBUtil.writeString(keyspace, dest); CBUtil.writeString("", dest); } else { CBUtil.writeEnumValue(change, dest); - CBUtil.writeString(keyOrNamespace, dest); + CBUtil.writeString(keyspace, dest); CBUtil.writeString(target == Target.KEYSPACE ? "" : tableOrTypeOrFunction, dest); } } @@ -281,7 +281,7 @@ public int eventSerializedSize(int version) { int size = CBUtil.sizeOfEnumValue(change) + CBUtil.sizeOfEnumValue(target) - + CBUtil.sizeOfString(keyOrNamespace); + + CBUtil.sizeOfString(keyspace); if (target != Target.KEYSPACE) size += CBUtil.sizeOfString(tableOrTypeOrFunction); @@ -293,11 +293,11 @@ public int eventSerializedSize(int version) if (target == Target.TYPE) { return CBUtil.sizeOfEnumValue(Change.UPDATED) - + CBUtil.sizeOfString(keyOrNamespace) + + CBUtil.sizeOfString(keyspace) + CBUtil.sizeOfString(""); } return CBUtil.sizeOfEnumValue(change) - + CBUtil.sizeOfString(keyOrNamespace) + + CBUtil.sizeOfString(keyspace) + CBUtil.sizeOfString(target == Target.KEYSPACE ? "" : tableOrTypeOrFunction); } } @@ -305,13 +305,13 @@ public int eventSerializedSize(int version) @Override public String toString() { - return change + " " + target + " " + keyOrNamespace + (tableOrTypeOrFunction == null ? "" : "." + tableOrTypeOrFunction); + return change + " " + target + " " + keyspace + (tableOrTypeOrFunction == null ? "" : "." + tableOrTypeOrFunction); } @Override public int hashCode() { - return Objects.hashCode(change, target, keyOrNamespace, tableOrTypeOrFunction); + return Objects.hashCode(change, target, keyspace, tableOrTypeOrFunction); } @Override @@ -323,7 +323,7 @@ public boolean equals(Object other) SchemaChange scc = (SchemaChange)other; return Objects.equal(change, scc.change) && Objects.equal(target, scc.target) - && Objects.equal(keyOrNamespace, scc.keyOrNamespace) + && Objects.equal(keyspace, scc.keyspace) && Objects.equal(tableOrTypeOrFunction, scc.tableOrTypeOrFunction); } } diff --git a/src/java/org/apache/cassandra/transport/Server.java b/src/java/org/apache/cassandra/transport/Server.java index f8822a52043f..15fad88e9200 100644 --- a/src/java/org/apache/cassandra/transport/Server.java +++ b/src/java/org/apache/cassandra/transport/Server.java @@ -27,8 +27,6 @@ import javax.net.ssl.SSLContext; import javax.net.ssl.SSLEngine; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.PooledByteBufAllocator; import io.netty.channel.epoll.Epoll; import io.netty.channel.epoll.EpollEventLoopGroup; import io.netty.channel.epoll.EpollServerSocketChannel; @@ -411,7 +409,7 @@ public void onCreateUserType(String ksName, String typeName) server.connectionTracker.send(new Event.SchemaChange(Event.SchemaChange.Change.CREATED, Event.SchemaChange.Target.TYPE, ksName, typeName)); } - public void onCreateFunction(String namespace, String functionName) + public void onCreateFunction(String ksName, String functionName) { } @@ -430,7 +428,7 @@ public void onUpdateUserType(String ksName, String typeName) server.connectionTracker.send(new Event.SchemaChange(Event.SchemaChange.Change.UPDATED, Event.SchemaChange.Target.TYPE, ksName, typeName)); } - public void onUpdateFunction(String namespace, String functionName) + public void onUpdateFunction(String ksName, String functionName) { } @@ -449,7 +447,7 @@ public void onDropUserType(String ksName, String typeName) server.connectionTracker.send(new Event.SchemaChange(Event.SchemaChange.Change.DROPPED, Event.SchemaChange.Target.TYPE, ksName, typeName)); } - public void onDropFunction(String namespace, String functionName) + public void onDropFunction(String ksName, String functionName) { } } diff --git a/test/unit/org/apache/cassandra/cql3/AggregationTest.java b/test/unit/org/apache/cassandra/cql3/AggregationTest.java index 99db62a88c24..859fe6593c83 100644 --- a/test/unit/org/apache/cassandra/cql3/AggregationTest.java +++ b/test/unit/org/apache/cassandra/cql3/AggregationTest.java @@ -37,7 +37,7 @@ public void testFunctions() throws Throwable assertColumnNames(execute("SELECT COUNT(*) FROM %s"), "count"); assertRows(execute("SELECT COUNT(*) FROM %s"), row(0L)); assertColumnNames(execute("SELECT max(b), min(b), sum(b), avg(b) , max(c), sum(c), avg(c), sum(d), avg(d) FROM %s"), - "max(b)", "min(b)", "sum(b)", "avg(b)" , "max(c)", "sum(c)", "avg(c)", "sum(d)", "avg(d)"); + "system.max(b)", "system.min(b)", "system.sum(b)", "system.avg(b)" , "system.max(c)", "system.sum(c)", "system.avg(c)", "system.sum(d)", "system.avg(d)"); assertRows(execute("SELECT max(b), min(b), sum(b), avg(b) , max(c), sum(c), avg(c), sum(d), avg(d) FROM %s"), row(null, null, 0, 0, null, 0.0, 0.0, new BigDecimal("0"), new BigDecimal("0"))); @@ -94,15 +94,15 @@ public void testNestedFunctions() throws Throwable { createTable("CREATE TABLE %s (a int primary key, b timeuuid, c double, d double)"); - execute("CREATE OR REPLACE FUNCTION copySign(magnitude double, sign double) RETURNS double LANGUAGE JAVA\n" + + execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".copySign(magnitude double, sign double) RETURNS double LANGUAGE JAVA\n" + "AS 'return Double.valueOf(Math.copySign(magnitude.doubleValue(), sign.doubleValue()));';"); - assertColumnNames(execute("SELECT max(a), max(unixTimestampOf(b)) FROM %s"), "max(a)", "max(unixtimestampof(b))"); + assertColumnNames(execute("SELECT max(a), max(unixTimestampOf(b)) FROM %s"), "system.max(a)", "system.max(system.unixtimestampof(b))"); assertRows(execute("SELECT max(a), max(unixTimestampOf(b)) FROM %s"), row(null, null)); - assertColumnNames(execute("SELECT max(a), unixTimestampOf(max(b)) FROM %s"), "max(a)", "unixtimestampof(max(b))"); + assertColumnNames(execute("SELECT max(a), unixTimestampOf(max(b)) FROM %s"), "system.max(a)", "system.unixtimestampof(system.max(b))"); assertRows(execute("SELECT max(a), unixTimestampOf(max(b)) FROM %s"), row(null, null)); - assertColumnNames(execute("SELECT max(copySign(c, d)) FROM %s"), "max(copysign(c, d))"); + assertColumnNames(execute("SELECT max(copySign(c, d)) FROM %s"), "system.max("+KEYSPACE+".copysign(c, d))"); assertRows(execute("SELECT max(copySign(c, d)) FROM %s"), row((Object) null)); execute("INSERT INTO %s (a, b, c, d) VALUES (1, maxTimeuuid('2011-02-03 04:05:00+0000'), -1.2, 2.1)"); diff --git a/test/unit/org/apache/cassandra/cql3/PgStringTest.java b/test/unit/org/apache/cassandra/cql3/PgStringTest.java index 856a255a5217..1870a9ab1485 100644 --- a/test/unit/org/apache/cassandra/cql3/PgStringTest.java +++ b/test/unit/org/apache/cassandra/cql3/PgStringTest.java @@ -26,7 +26,7 @@ public class PgStringTest extends CQLTester @Test public void testPgSyleFunction() throws Throwable { - execute("create or replace function pg::pgfun1 ( input double ) returns text language java\n" + + execute("create or replace function "+KEYSPACE+".pgfun1 ( input double ) returns text language java\n" + "AS $$return \"foobar\";$$"); } @@ -70,7 +70,7 @@ public void testPgSyleInsert() throws Throwable public void testMarkerPgFail() throws Throwable { // must throw SyntaxException - not StringIndexOutOfBoundsException or similar - execute("create function foo::pgfun1 ( input double ) returns text language java\n" + + execute("create function "+KEYSPACE+".pgfun1 ( input double ) returns text language java\n" + "AS $javasrc$return 0L;$javasrc$;"); } } diff --git a/test/unit/org/apache/cassandra/cql3/UFTest.java b/test/unit/org/apache/cassandra/cql3/UFTest.java index 95bede4ccfea..ce850b78b77f 100644 --- a/test/unit/org/apache/cassandra/cql3/UFTest.java +++ b/test/unit/org/apache/cassandra/cql3/UFTest.java @@ -19,14 +19,82 @@ import java.math.BigDecimal; import java.math.BigInteger; +import java.util.Date; +import org.junit.After; import org.junit.Assert; +import org.junit.Before; import org.junit.Test; +import org.apache.cassandra.cql3.functions.FunctionName; +import org.apache.cassandra.cql3.functions.Functions; import org.apache.cassandra.exceptions.InvalidRequestException; +import org.apache.cassandra.service.ClientState; +import org.apache.cassandra.transport.messages.ResultMessage; public class UFTest extends CQLTester { + private static final String KS_FOO = "cqltest_foo"; + + @Before + public void createKsFoo() throws Throwable + { + execute("CREATE KEYSPACE IF NOT EXISTS "+KS_FOO+" WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3};"); + } + + @After + public void dropKsFoo() throws Throwable + { + execute("DROP KEYSPACE IF EXISTS "+KS_FOO+";"); + } + + @Test + public void testFunctionDropOnKeyspaceDrop() throws Throwable + { + execute("CREATE FUNCTION " + KS_FOO + ".sin ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(Math.sin(input.doubleValue()));'"); + + Assert.assertEquals(1, Functions.find(new FunctionName(KS_FOO, "sin")).size()); + + assertRows(execute("SELECT function_name, language FROM system.schema_functions WHERE keyspace_name=?", KS_FOO), + row("sin", "java")); + + execute("DROP KEYSPACE "+KS_FOO+";"); + + assertRows(execute("SELECT function_name, language FROM system.schema_functions WHERE keyspace_name=?", KS_FOO)); + + Assert.assertEquals(0, Functions.find(new FunctionName(KS_FOO, "sin")).size()); + } + + @Test + public void testFunctionDropPreparedStatement() throws Throwable + { + createTable("CREATE TABLE %s (key int PRIMARY KEY, d double)"); + + execute("CREATE FUNCTION " + KS_FOO + ".sin ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(Math.sin(input.doubleValue()));'"); + + Assert.assertEquals(1, Functions.find(new FunctionName(KS_FOO, "sin")).size()); + + ResultMessage.Prepared prepared = QueryProcessor.prepare("SELECT key, "+KS_FOO+".sin(d) FROM "+KEYSPACE+'.'+currentTable(), ClientState.forInternalCalls(), false); + Assert.assertNotNull(QueryProcessor.instance.getPrepared(prepared.statementId)); + + execute("DROP FUNCTION " + KS_FOO + ".sin(double);"); + + Assert.assertNull(QueryProcessor.instance.getPrepared(prepared.statementId)); + + // + + execute("CREATE FUNCTION " + KS_FOO + ".sin ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(Math.sin(input.doubleValue()));'"); + + Assert.assertEquals(1, Functions.find(new FunctionName(KS_FOO, "sin")).size()); + + prepared = QueryProcessor.prepare("SELECT key, "+KS_FOO+".sin(d) FROM "+KEYSPACE+'.'+currentTable(), ClientState.forInternalCalls(), false); + Assert.assertNotNull(QueryProcessor.instance.getPrepared(prepared.statementId)); + + execute("DROP KEYSPACE " + KS_FOO + ";"); + + Assert.assertNull(QueryProcessor.instance.getPrepared(prepared.statementId)); + } + @Test public void testFunctionCreationAndDrop() throws Throwable { @@ -37,45 +105,47 @@ public void testFunctionCreationAndDrop() throws Throwable execute("INSERT INTO %s(key, d) VALUES (?, ?)", 3, 3d); // simple creation - execute("CREATE FUNCTION foo::sin ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(Math.sin(input.doubleValue()));'"); + execute("CREATE FUNCTION "+KS_FOO+".sin ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(Math.sin(input.doubleValue()));'"); // check we can't recreate the same function - assertInvalid("CREATE FUNCTION foo::sin ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(Math.sin(input.doubleValue()));'"); + assertInvalid("CREATE FUNCTION "+KS_FOO+".sin ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(Math.sin(input.doubleValue()));'"); // but that it doesn't complay with "IF NOT EXISTS" - execute("CREATE FUNCTION IF NOT EXISTS foo::sin ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(Math.sin(input.doubleValue()));'"); + execute("CREATE FUNCTION IF NOT EXISTS "+KS_FOO+".sin ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(Math.sin(input.doubleValue()));'"); // Validate that it works as expected - assertRows(execute("SELECT key, foo::sin(d) FROM %s"), + assertRows(execute("SELECT key, "+KS_FOO+".sin(d) FROM %s"), row(1, Math.sin(1d)), row(2, Math.sin(2d)), row(3, Math.sin(3d)) ); + // Replace the method with incompatible return type + assertInvalid("CREATE OR REPLACE FUNCTION " + KS_FOO + ".sin ( input double ) RETURNS text LANGUAGE java AS 'return Double.valueOf(42d);'"); // proper replacement - execute("CREATE OR REPLACE FUNCTION foo::sin ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(42d);'"); + execute("CREATE OR REPLACE FUNCTION "+KS_FOO+".sin ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(42d);'"); // Validate the method as been replaced - assertRows(execute("SELECT key, foo::sin(d) FROM %s"), + assertRows(execute("SELECT key, "+KS_FOO+".sin(d) FROM %s"), row(1, 42.0), row(2, 42.0), row(3, 42.0) ); // same function but without namespace - execute("CREATE FUNCTION sin ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(Math.sin(input.doubleValue()));'"); - assertRows(execute("SELECT key, sin(d) FROM %s"), + execute("CREATE FUNCTION "+KEYSPACE+".sin ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(Math.sin(input.doubleValue()));'"); + assertRows(execute("SELECT key, "+KEYSPACE+".sin(d) FROM %s"), row(1, Math.sin(1d)), row(2, Math.sin(2d)), row(3, Math.sin(3d)) ); - // Drop with and without namespace - execute("DROP FUNCTION foo::sin"); - execute("DROP FUNCTION sin"); + // Drop with and without keyspace + execute("DROP FUNCTION "+KS_FOO+".sin"); + execute("DROP FUNCTION "+KEYSPACE+".sin"); // Drop unexisting function - assertInvalid("DROP FUNCTION foo::sin"); + assertInvalid("DROP FUNCTION "+KS_FOO+".sin"); // but don't complain with "IF EXISTS" - execute("DROP FUNCTION IF EXISTS foo::sin"); + execute("DROP FUNCTION IF EXISTS "+KS_FOO+".sin"); // can't drop native functions assertInvalid("DROP FUNCTION dateof"); @@ -92,13 +162,13 @@ public void testFunctionExecution() throws Throwable execute("INSERT INTO %s(v) VALUES (?)", "aaa"); - execute("CREATE FUNCTION repeat (v text, n int) RETURNS text LANGUAGE java AS 'StringBuilder sb = new StringBuilder();\n" + + execute("CREATE FUNCTION "+KEYSPACE+".repeat (v text, n int) RETURNS text LANGUAGE java AS 'StringBuilder sb = new StringBuilder();\n" + " for (int i = 0; i < n.intValue(); i++)\n" + " sb.append(v);\n" + " return sb.toString();'"); - assertRows(execute("SELECT v FROM %s WHERE v=repeat(?, ?)", "a", 3), row("aaa")); - assertEmpty(execute("SELECT v FROM %s WHERE v=repeat(?, ?)", "a", 2)); + assertRows(execute("SELECT v FROM %s WHERE v="+KEYSPACE+".repeat(?, ?)", "a", 3), row("aaa")); + assertEmpty(execute("SELECT v FROM %s WHERE v="+KEYSPACE+".repeat(?, ?)", "a", 2)); } @Test @@ -108,46 +178,46 @@ public void testFunctionOverloading() throws Throwable execute("INSERT INTO %s(k, v) VALUES (?, ?)", "f2", 1); - execute("CREATE FUNCTION overloaded(v varchar) RETURNS text LANGUAGE java AS 'return \"f1\";'"); - execute("CREATE OR REPLACE FUNCTION overloaded(i int) RETURNS text LANGUAGE java AS 'return \"f2\";'"); - execute("CREATE OR REPLACE FUNCTION overloaded(v1 text, v2 text) RETURNS text LANGUAGE java AS 'return \"f3\";'"); - execute("CREATE OR REPLACE FUNCTION overloaded(v ascii) RETURNS text LANGUAGE java AS 'return \"f1\";'"); + execute("CREATE FUNCTION "+KEYSPACE+".overloaded(v varchar) RETURNS text LANGUAGE java AS 'return \"f1\";'"); + execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".overloaded(i int) RETURNS text LANGUAGE java AS 'return \"f2\";'"); + execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".overloaded(v1 text, v2 text) RETURNS text LANGUAGE java AS 'return \"f3\";'"); + execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".overloaded(v ascii) RETURNS text LANGUAGE java AS 'return \"f1\";'"); // text == varchar, so this should be considered as a duplicate - assertInvalid("CREATE FUNCTION overloaded(v varchar) RETURNS text LANGUAGE java AS 'return \"f1\";'"); + assertInvalid("CREATE FUNCTION "+KEYSPACE+".overloaded(v varchar) RETURNS text LANGUAGE java AS 'return \"f1\";'"); - assertRows(execute("SELECT overloaded(k), overloaded(v), overloaded(k, k) FROM %s"), + assertRows(execute("SELECT "+KEYSPACE+".overloaded(k), "+KEYSPACE+".overloaded(v), "+KEYSPACE+".overloaded(k, k) FROM %s"), row("f1", "f2", "f3") ); forcePreparedValues(); // This shouldn't work if we use preparation since there no way to know which overload to use - assertInvalid("SELECT v FROM %s WHERE k = overloaded(?)", "foo"); + assertInvalid("SELECT v FROM %s WHERE k = "+KEYSPACE+".overloaded(?)", "foo"); stopForcingPreparedValues(); // but those should since we specifically cast - assertEmpty(execute("SELECT v FROM %s WHERE k = overloaded((text)?)", "foo")); - assertRows(execute("SELECT v FROM %s WHERE k = overloaded((int)?)", 3), row(1)); - assertEmpty(execute("SELECT v FROM %s WHERE k = overloaded((ascii)?)", "foo")); + assertEmpty(execute("SELECT v FROM %s WHERE k = "+KEYSPACE+".overloaded((text)?)", "foo")); + assertRows(execute("SELECT v FROM %s WHERE k = "+KEYSPACE+".overloaded((int)?)", 3), row(1)); + assertEmpty(execute("SELECT v FROM %s WHERE k = "+KEYSPACE+".overloaded((ascii)?)", "foo")); // And since varchar == text, this should work too - assertEmpty(execute("SELECT v FROM %s WHERE k = overloaded((varchar)?)", "foo")); + assertEmpty(execute("SELECT v FROM %s WHERE k = "+KEYSPACE+".overloaded((varchar)?)", "foo")); // no such functions exist... - assertInvalid("DROP FUNCTION overloaded(boolean)"); - assertInvalid("DROP FUNCTION overloaded(bigint)"); + assertInvalid("DROP FUNCTION "+KEYSPACE+".overloaded(boolean)"); + assertInvalid("DROP FUNCTION "+KEYSPACE+".overloaded(bigint)"); // 'overloaded' has multiple overloads - so it has to fail (CASSANDRA-7812) - assertInvalid("DROP FUNCTION overloaded"); - execute("DROP FUNCTION overloaded(varchar)"); - assertInvalid("SELECT v FROM %s WHERE k = overloaded((text)?)", "foo"); - execute("DROP FUNCTION overloaded(text, text)"); - assertInvalid("SELECT v FROM %s WHERE k = overloaded((text)?,(text)?)", "foo", "bar"); - execute("DROP FUNCTION overloaded(ascii)"); - assertInvalid("SELECT v FROM %s WHERE k = overloaded((ascii)?)", "foo"); + assertInvalid("DROP FUNCTION "+KEYSPACE+".overloaded"); + execute("DROP FUNCTION " + KEYSPACE + ".overloaded(varchar)"); + assertInvalid("SELECT v FROM %s WHERE k = " + KEYSPACE + ".overloaded((text)?)", "foo"); + execute("DROP FUNCTION " + KEYSPACE + ".overloaded(text, text)"); + assertInvalid("SELECT v FROM %s WHERE k = " + KEYSPACE + ".overloaded((text)?,(text)?)", "foo", "bar"); + execute("DROP FUNCTION " + KEYSPACE + ".overloaded(ascii)"); + assertInvalid("SELECT v FROM %s WHERE k = "+KEYSPACE+".overloaded((ascii)?)", "foo"); // single-int-overload must still work - assertRows(execute("SELECT v FROM %s WHERE k = overloaded((int)?)", 3), row(1)); + assertRows(execute("SELECT v FROM %s WHERE k = " + KEYSPACE + ".overloaded((int)?)", 3), row(1)); // overloaded has just one overload now - so the following DROP FUNCTION is not ambigious (CASSANDRA-7812) - execute("DROP FUNCTION overloaded"); + execute("DROP FUNCTION "+KEYSPACE+".overloaded"); } @Test @@ -158,7 +228,7 @@ public void testCreateOrReplaceJavaFunction() throws Throwable execute("INSERT INTO %s (key, val) VALUES (?, ?)", 2, 2d); execute("INSERT INTO %s (key, val) VALUES (?, ?)", 3, 3d); - execute("create function foo::corjf ( input double ) returns double language java\n" + + execute("create function "+KS_FOO+".corjf ( input double ) returns double language java\n" + "AS '\n" + " // parameter val is of type java.lang.Double\n" + " /* return type is of type java.lang.Double */\n" + @@ -170,19 +240,19 @@ public void testCreateOrReplaceJavaFunction() throws Throwable "';"); // just check created function - assertRows(execute("SELECT key, val, foo::corjf(val) FROM %s"), + assertRows(execute("SELECT key, val, "+KS_FOO+".corjf(val) FROM %s"), row(1, 1d, Math.sin(1d)), row(2, 2d, Math.sin(2d)), row(3, 3d, Math.sin(3d)) ); - execute("create or replace function foo::corjf ( input double ) returns double language java\n" + + execute("create or replace function "+KS_FOO+".corjf ( input double ) returns double language java\n" + "AS '\n" + " return input;\n" + "';"); // check if replaced function returns correct result - assertRows(execute("SELECT key, val, foo::corjf(val) FROM %s"), + assertRows(execute("SELECT key, val, "+KS_FOO+".corjf(val) FROM %s"), row(1, 1d, 1d), row(2, 2d, 2d), row(3, 3d, 3d) @@ -196,18 +266,18 @@ public void testJavaFunctionNoParameters() throws Throwable String functionBody = "\n return Long.valueOf(1L);\n"; - String cql = "CREATE OR REPLACE FUNCTION jfnpt() RETURNS bigint LANGUAGE JAVA\n" + - "AS '" + functionBody + "';"; + String cql = String.format("CREATE OR REPLACE FUNCTION %s.jfnpt() RETURNS bigint LANGUAGE JAVA\n" + + "AS '%s';", KEYSPACE, functionBody); execute(cql); - assertRows(execute("SELECT language, body FROM system.schema_functions WHERE namespace='' AND name='jfnpt'"), + assertRows(execute("SELECT language, body FROM system.schema_functions WHERE keyspace_name=? AND function_name='jfnpt'", KEYSPACE), row("java", functionBody)); execute("INSERT INTO %s (key, val) VALUES (?, ?)", 1, 1d); execute("INSERT INTO %s (key, val) VALUES (?, ?)", 2, 2d); execute("INSERT INTO %s (key, val) VALUES (?, ?)", 3, 3d); - assertRows(execute("SELECT key, val, jfnpt() FROM %s"), + assertRows(execute("SELECT key, val, "+KEYSPACE+".jfnpt() FROM %s"), row(1, 1d, 1L), row(2, 2d, 1L), row(3, 3d, 1L) @@ -219,7 +289,7 @@ public void testJavaFunctionInvalidBodies() throws Throwable { try { - execute("CREATE OR REPLACE FUNCTION jfinv() RETURNS bigint LANGUAGE JAVA\n" + + execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".jfinv() RETURNS bigint LANGUAGE JAVA\n" + "AS '\n" + "foobarbaz" + "\n';"); @@ -233,7 +303,7 @@ public void testJavaFunctionInvalidBodies() throws Throwable try { - execute("CREATE OR REPLACE FUNCTION jfinv() RETURNS bigint LANGUAGE JAVA\n" + + execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".jfinv() RETURNS bigint LANGUAGE JAVA\n" + "AS '\n" + "foobarbaz;" + "\n';"); @@ -266,7 +336,7 @@ public void testJavaFunctionArgumentTypeMismatch() throws Throwable String functionBody = "\n" + " return val;\n"; - String cql = "CREATE OR REPLACE FUNCTION jft(val double) RETURNS double LANGUAGE JAVA\n" + + String cql = "CREATE OR REPLACE FUNCTION "+KEYSPACE+".jft(val double) RETURNS double LANGUAGE JAVA\n" + "AS '" + functionBody + "';"; execute(cql); @@ -274,7 +344,7 @@ public void testJavaFunctionArgumentTypeMismatch() throws Throwable execute("INSERT INTO %s (key, val) VALUES (?, ?)", 1, 1L); execute("INSERT INTO %s (key, val) VALUES (?, ?)", 2, 2L); execute("INSERT INTO %s (key, val) VALUES (?, ?)", 3, 3L); - assertInvalid("SELECT key, val, jft(val) FROM %s"); + assertInvalid("SELECT key, val, "+KEYSPACE+".jft(val) FROM %s"); } @Test @@ -291,18 +361,18 @@ public void testJavaFunction() throws Throwable " double v = Math.sin( val.doubleValue() );\n" + " return Double.valueOf(v);\n"; - String cql = "CREATE OR REPLACE FUNCTION jft(val double) RETURNS double LANGUAGE JAVA\n" + - "AS '" + functionBody + "';"; + String cql = String.format("CREATE OR REPLACE FUNCTION %s.jft(val double) RETURNS double LANGUAGE JAVA\n" + + "AS '%s';", KEYSPACE, functionBody); execute(cql); - assertRows(execute("SELECT language, body FROM system.schema_functions WHERE namespace='' AND name='jft'"), + assertRows(execute("SELECT language, body FROM system.schema_functions WHERE keyspace_name=? AND function_name='jft'", KEYSPACE), row("java", functionBody)); execute("INSERT INTO %s (key, val) VALUES (?, ?)", 1, 1d); execute("INSERT INTO %s (key, val) VALUES (?, ?)", 2, 2d); execute("INSERT INTO %s (key, val) VALUES (?, ?)", 3, 3d); - assertRows(execute("SELECT key, val, jft(val) FROM %s"), + assertRows(execute("SELECT key, val, " + KEYSPACE + ".jft(val) FROM %s"), row(1, 1d, Math.sin(1d)), row(2, 2d, Math.sin(2d)), row(3, 3d, Math.sin(3d)) @@ -310,7 +380,103 @@ public void testJavaFunction() throws Throwable } @Test - public void testJavaNamespaceFunction() throws Throwable + public void testFunctionInTargetKeyspace() throws Throwable + { + createTable("CREATE TABLE %s (key int primary key, val double)"); + + execute("CREATE TABLE "+KS_FOO+".second_tab (key int primary key, val double)"); + + String functionBody = "\n" + + " return val;\n"; + + String cql = "CREATE OR REPLACE FUNCTION "+KS_FOO+".jfitks(val double) RETURNS double LANGUAGE JAVA\n" + + "AS '" + functionBody + "';"; + + execute(cql); + + execute("INSERT INTO %s (key, val) VALUES (?, ?)", 1, 1d); + execute("INSERT INTO %s (key, val) VALUES (?, ?)", 2, 2d); + execute("INSERT INTO %s (key, val) VALUES (?, ?)", 3, 3d); + assertInvalid("SELECT key, val, " + KEYSPACE + ".jfitks(val) FROM %s"); + + execute("INSERT INTO "+KS_FOO+".second_tab (key, val) VALUES (?, ?)", 1, 1d); + execute("INSERT INTO "+KS_FOO+".second_tab (key, val) VALUES (?, ?)", 2, 2d); + execute("INSERT INTO "+KS_FOO+".second_tab (key, val) VALUES (?, ?)", 3, 3d); + assertRows(execute("SELECT key, val, jfitks(val) FROM " + KS_FOO + ".second_tab"), + row(1, 1d, 1d), + row(2, 2d, 2d), + row(3, 3d, 3d) + ); + } + + @Test + public void testFunctionWithReservedName() throws Throwable + { + execute("CREATE TABLE " + KS_FOO + ".second_tab (key int primary key, val double)"); + + String cql = "CREATE OR REPLACE FUNCTION "+KS_FOO+".now() RETURNS timestamp LANGUAGE JAVA\n" + + "AS 'return null;';"; + + execute(cql); + + execute("INSERT INTO "+KS_FOO+".second_tab (key, val) VALUES (?, ?)", 1, 1d); + execute("INSERT INTO "+KS_FOO+".second_tab (key, val) VALUES (?, ?)", 2, 2d); + execute("INSERT INTO "+KS_FOO+".second_tab (key, val) VALUES (?, ?)", 3, 3d); + + // ensure that system now() is executed + UntypedResultSet rows = execute("SELECT key, val, now() FROM " + KS_FOO + ".second_tab"); + Assert.assertEquals(3, rows.size()); + UntypedResultSet.Row row = rows.iterator().next(); + Date ts = row.getTimestamp(row.getColumns().get(2).name.toString()); + Assert.assertNotNull(ts); + + // ensure that KS_FOO's now() is executed + rows = execute("SELECT key, val, "+KS_FOO+".now() FROM " + KS_FOO + ".second_tab"); + Assert.assertEquals(3, rows.size()); + row = rows.iterator().next(); + Assert.assertFalse(row.has(row.getColumns().get(2).name.toString())); + } + + @Test + public void testFunctionInSystemKS() throws Throwable + { + execute("CREATE OR REPLACE FUNCTION " + KEYSPACE + ".dateof(val timeuuid) RETURNS timestamp LANGUAGE JAVA\n" + + "AS 'return null;';"); + + assertInvalid("CREATE OR REPLACE FUNCTION system.jnft(val double) RETURNS double LANGUAGE JAVA\n" + + "AS 'return null;';"); + assertInvalid("CREATE OR REPLACE FUNCTION system.dateof(val timeuuid) RETURNS timestamp LANGUAGE JAVA\n" + + "AS 'return null;';"); + assertInvalid("DROP FUNCTION system.now"); + + // KS for executeInternal() is system + assertInvalid("CREATE OR REPLACE FUNCTION jnft(val double) RETURNS double LANGUAGE JAVA\n" + + "AS 'return null;';"); + assertInvalid("CREATE OR REPLACE FUNCTION dateof(val timeuuid) RETURNS timestamp LANGUAGE JAVA\n" + + "AS 'return null;';"); + assertInvalid("DROP FUNCTION now"); + } + + @Test + public void testFunctionNonExistingKeyspace() throws Throwable + { + String cql = "CREATE OR REPLACE FUNCTION this_ks_does_not_exist.jnft(val double) RETURNS double LANGUAGE JAVA\n" + + "AS 'return null;';"; + assertInvalid(cql); + } + + @Test + public void testFunctionAfterOnDropKeyspace() throws Throwable + { + dropKsFoo(); + + String cql = "CREATE OR REPLACE FUNCTION "+KS_FOO+".jnft(val double) RETURNS double LANGUAGE JAVA\n" + + "AS 'return null;';"; + assertInvalid(cql); + } + + @Test + public void testJavaKeyspaceFunction() throws Throwable { createTable("CREATE TABLE %s (key int primary key, val double)"); @@ -323,18 +489,18 @@ public void testJavaNamespaceFunction() throws Throwable " double v = Math.sin( val.doubleValue() );\n" + " return Double.valueOf(v);\n"; - String cql = "CREATE OR REPLACE FUNCTION foo::jnft(val double) RETURNS double LANGUAGE JAVA\n" + + String cql = "CREATE OR REPLACE FUNCTION "+KS_FOO+".jnft(val double) RETURNS double LANGUAGE JAVA\n" + "AS '" + functionBody + "';"; execute(cql); - assertRows(execute("SELECT language, body FROM system.schema_functions WHERE namespace='foo' AND name='jnft'"), + assertRows(execute("SELECT language, body FROM system.schema_functions WHERE keyspace_name='"+KS_FOO+"' AND function_name='jnft'"), row("java", functionBody)); execute("INSERT INTO %s (key, val) VALUES (?, ?)", 1, 1d); execute("INSERT INTO %s (key, val) VALUES (?, ?)", 2, 2d); execute("INSERT INTO %s (key, val) VALUES (?, ?)", 3, 3d); - assertRows(execute("SELECT key, val, foo::jnft(val) FROM %s"), + assertRows(execute("SELECT key, val, "+KS_FOO+".jnft(val) FROM %s"), row(1, 1d, Math.sin(1d)), row(2, 2d, Math.sin(2d)), row(3, 3d, Math.sin(3d)) @@ -349,12 +515,12 @@ public void testJavaRuntimeException() throws Throwable String functionBody = "\n" + " throw new RuntimeException(\"oh no!\");\n"; - String cql = "CREATE OR REPLACE FUNCTION foo::jrtef(val double) RETURNS double LANGUAGE JAVA\n" + + String cql = "CREATE OR REPLACE FUNCTION "+KS_FOO+".jrtef(val double) RETURNS double LANGUAGE JAVA\n" + "AS '" + functionBody + "';"; execute(cql); - assertRows(execute("SELECT language, body FROM system.schema_functions WHERE namespace='foo' AND name='jrtef'"), + assertRows(execute("SELECT language, body FROM system.schema_functions WHERE keyspace_name='"+KS_FOO+"' AND function_name='jrtef'"), row("java", functionBody)); execute("INSERT INTO %s (key, val) VALUES (?, ?)", 1, 1d); @@ -362,7 +528,7 @@ public void testJavaRuntimeException() throws Throwable execute("INSERT INTO %s (key, val) VALUES (?, ?)", 3, 3d); // function throws a RuntimeException which is wrapped by InvalidRequestException - assertInvalid("SELECT key, val, foo::jrtef(val) FROM %s"); + assertInvalid("SELECT key, val, "+KS_FOO+".jrtef(val) FROM %s"); } @Test @@ -377,11 +543,11 @@ public void testJavaDollarQuotedFunction() throws Throwable " double v = Math.sin( input.doubleValue() );\n" + " return \"'\"+Double.valueOf(v)+'\\\'';\n"; - execute("create function foo::pgfun1 ( input double ) returns text language java\n" + + execute("create function "+KS_FOO+".pgfun1 ( input double ) returns text language java\n" + "AS $$" + functionBody + "$$;"); - execute("CREATE FUNCTION foo::pgsin ( input double ) RETURNS double LANGUAGE java AS $$return Double.valueOf(Math.sin(input.doubleValue()));$$"); + execute("CREATE FUNCTION "+KS_FOO+".pgsin ( input double ) RETURNS double LANGUAGE java AS $$return Double.valueOf(Math.sin(input.doubleValue()));$$"); - assertRows(execute("SELECT language, body FROM system.schema_functions WHERE namespace='foo' AND name='pgfun1'"), + assertRows(execute("SELECT language, body FROM system.schema_functions WHERE keyspace_name='"+KS_FOO+"' AND function_name='pgfun1'"), row("java", functionBody)); } @@ -393,12 +559,12 @@ public void testJavascriptFunction() throws Throwable String functionBody = "\n" + " Math.sin(val);\n"; - String cql = "CREATE OR REPLACE FUNCTION jsft(val double) RETURNS double LANGUAGE javascript\n" + + String cql = "CREATE OR REPLACE FUNCTION "+KEYSPACE+".jsft(val double) RETURNS double LANGUAGE javascript\n" + "AS '" + functionBody + "';"; execute(cql); - assertRows(execute("SELECT language, body FROM system.schema_functions WHERE namespace='' AND name='jsft'"), + assertRows(execute("SELECT language, body FROM system.schema_functions WHERE keyspace_name='"+KEYSPACE+"' AND function_name='jsft'"), row("javascript", functionBody)); execute("INSERT INTO %s (key, val) VALUES (?, ?)", 1, 1d); @@ -416,7 +582,7 @@ public void testJavascriptBadReturnType() throws Throwable { createTable("CREATE TABLE %s (key int primary key, val double)"); - execute("CREATE OR REPLACE FUNCTION jsft(val double) RETURNS double LANGUAGE javascript\n" + + execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".jsft(val double) RETURNS double LANGUAGE javascript\n" + "AS '\"string\";';"); execute("INSERT INTO %s (key, val) VALUES (?, ?)", 1, 1d); @@ -429,7 +595,7 @@ public void testJavascriptThrow() throws Throwable { createTable("CREATE TABLE %s (key int primary key, val double)"); - execute("CREATE OR REPLACE FUNCTION jsft(val double) RETURNS double LANGUAGE javascript\n" + + execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".jsft(val double) RETURNS double LANGUAGE javascript\n" + "AS 'throw \"fool\";';"); execute("INSERT INTO %s (key, val) VALUES (?, ?)", 1, 1d); @@ -440,21 +606,21 @@ public void testJavascriptThrow() throws Throwable @Test public void testDuplicateArgNames() throws Throwable { - assertInvalid("CREATE OR REPLACE FUNCTION scrinv(val double, val text) RETURNS text LANGUAGE javascript\n" + + assertInvalid("CREATE OR REPLACE FUNCTION "+KEYSPACE+".scrinv(val double, val text) RETURNS text LANGUAGE javascript\n" + "AS '\"foo bar\";';"); } @Test public void testJavascriptCompileFailure() throws Throwable { - assertInvalid("CREATE OR REPLACE FUNCTION scrinv(val double) RETURNS double LANGUAGE javascript\n" + + assertInvalid("CREATE OR REPLACE FUNCTION "+KEYSPACE+".scrinv(val double) RETURNS double LANGUAGE javascript\n" + "AS 'foo bar';"); } @Test public void testScriptInvalidLanguage() throws Throwable { - assertInvalid("CREATE OR REPLACE FUNCTION scrinv(val double) RETURNS double LANGUAGE artificial_intelligence\n" + + assertInvalid("CREATE OR REPLACE FUNCTION "+KEYSPACE+".scrinv(val double) RETURNS double LANGUAGE artificial_intelligence\n" + "AS 'question for 42?';"); } @@ -464,85 +630,85 @@ public void testScriptReturnTypeCasting() throws Throwable createTable("CREATE TABLE %s (key int primary key, val double)"); execute("INSERT INTO %s (key, val) VALUES (?, ?)", 1, 1d); - execute("CREATE OR REPLACE FUNCTION js(val double) RETURNS boolean LANGUAGE javascript\n" + + execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".js(val double) RETURNS boolean LANGUAGE javascript\n" + "AS 'true;';"); assertRows(execute("SELECT key, val, js(val) FROM %s"), row(1, 1d, true)); - execute("CREATE OR REPLACE FUNCTION js(val double) RETURNS boolean LANGUAGE javascript\n" + + execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".js(val double) RETURNS boolean LANGUAGE javascript\n" + "AS 'false;';"); assertRows(execute("SELECT key, val, js(val) FROM %s"), row(1, 1d, false)); - execute("DROP FUNCTION js(double)"); + execute("DROP FUNCTION "+KEYSPACE+".js(double)"); // declared rtype = int , return type = int - execute("CREATE OR REPLACE FUNCTION js(val double) RETURNS int LANGUAGE javascript\n" + + execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".js(val double) RETURNS int LANGUAGE javascript\n" + "AS '100;';"); assertRows(execute("SELECT key, val, js(val) FROM %s"), row(1, 1d, 100)); - execute("DROP FUNCTION js(double)"); + execute("DROP FUNCTION "+KEYSPACE+".js(double)"); // declared rtype = int , return type = double - execute("CREATE OR REPLACE FUNCTION js(val double) RETURNS int LANGUAGE javascript\n" + + execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".js(val double) RETURNS int LANGUAGE javascript\n" + "AS '100.;';"); assertRows(execute("SELECT key, val, js(val) FROM %s"), row(1, 1d, 100)); - execute("DROP FUNCTION js(double)"); + execute("DROP FUNCTION "+KEYSPACE+".js(double)"); // declared rtype = double , return type = int - execute("CREATE OR REPLACE FUNCTION js(val double) RETURNS double LANGUAGE javascript\n" + + execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".js(val double) RETURNS double LANGUAGE javascript\n" + "AS '100;';"); assertRows(execute("SELECT key, val, js(val) FROM %s"), row(1, 1d, 100d)); - execute("DROP FUNCTION js(double)"); + execute("DROP FUNCTION "+KEYSPACE+".js(double)"); // declared rtype = double , return type = double - execute("CREATE OR REPLACE FUNCTION js(val double) RETURNS double LANGUAGE javascript\n" + + execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".js(val double) RETURNS double LANGUAGE javascript\n" + "AS '100.;';"); assertRows(execute("SELECT key, val, js(val) FROM %s"), row(1, 1d, 100d)); - execute("DROP FUNCTION js(double)"); + execute("DROP FUNCTION "+KEYSPACE+".js(double)"); // declared rtype = bigint , return type = int - execute("CREATE OR REPLACE FUNCTION js(val double) RETURNS bigint LANGUAGE javascript\n" + + execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".js(val double) RETURNS bigint LANGUAGE javascript\n" + "AS '100;';"); assertRows(execute("SELECT key, val, js(val) FROM %s"), row(1, 1d, 100L)); - execute("DROP FUNCTION js(double)"); + execute("DROP FUNCTION "+KEYSPACE+".js(double)"); // declared rtype = bigint , return type = double - execute("CREATE OR REPLACE FUNCTION js(val double) RETURNS bigint LANGUAGE javascript\n" + + execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".js(val double) RETURNS bigint LANGUAGE javascript\n" + "AS '100.;';"); assertRows(execute("SELECT key, val, js(val) FROM %s"), row(1, 1d, 100L)); - execute("DROP FUNCTION js(double)"); + execute("DROP FUNCTION "+KEYSPACE+".js(double)"); // declared rtype = varint , return type = int - execute("CREATE OR REPLACE FUNCTION js(val double) RETURNS varint LANGUAGE javascript\n" + + execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".js(val double) RETURNS varint LANGUAGE javascript\n" + "AS '100;';"); assertRows(execute("SELECT key, val, js(val) FROM %s"), row(1, 1d, BigInteger.valueOf(100L))); - execute("DROP FUNCTION js(double)"); + execute("DROP FUNCTION "+KEYSPACE+".js(double)"); // declared rtype = varint , return type = double - execute("CREATE OR REPLACE FUNCTION js(val double) RETURNS varint LANGUAGE javascript\n" + + execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".js(val double) RETURNS varint LANGUAGE javascript\n" + "AS '100.;';"); assertRows(execute("SELECT key, val, js(val) FROM %s"), row(1, 1d, BigInteger.valueOf(100L))); - execute("DROP FUNCTION js(double)"); + execute("DROP FUNCTION "+KEYSPACE+".js(double)"); // declared rtype = decimal , return type = int - execute("CREATE OR REPLACE FUNCTION js(val double) RETURNS decimal LANGUAGE javascript\n" + + execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".js(val double) RETURNS decimal LANGUAGE javascript\n" + "AS '100;';"); assertRows(execute("SELECT key, val, js(val) FROM %s"), row(1, 1d, BigDecimal.valueOf(100L))); - execute("DROP FUNCTION js(double)"); + execute("DROP FUNCTION "+KEYSPACE+".js(double)"); // declared rtype = decimal , return type = double - execute("CREATE OR REPLACE FUNCTION js(val double) RETURNS decimal LANGUAGE javascript\n" + + execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".js(val double) RETURNS decimal LANGUAGE javascript\n" + "AS '100.;';"); assertRows(execute("SELECT key, val, js(val) FROM %s"), row(1, 1d, BigDecimal.valueOf(100d))); - execute("DROP FUNCTION js(double)"); + execute("DROP FUNCTION "+KEYSPACE+".js(double)"); } @Test @@ -553,45 +719,45 @@ public void testScriptParamReturnTypes() throws Throwable 1, 1L, 1f, 1d, BigInteger.valueOf(1L), BigDecimal.valueOf(1d)); // type = int - execute("CREATE OR REPLACE FUNCTION jsint(val int) RETURNS int LANGUAGE javascript\n" + + execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".jsint(val int) RETURNS int LANGUAGE javascript\n" + "AS 'val+1;';"); assertRows(execute("SELECT key, ival, jsint(ival) FROM %s"), row(1, 1, 2)); - execute("DROP FUNCTION jsint(int)"); + execute("DROP FUNCTION "+KEYSPACE+".jsint(int)"); // bigint - execute("CREATE OR REPLACE FUNCTION jsbigint(val bigint) RETURNS bigint LANGUAGE javascript\n" + + execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".jsbigint(val bigint) RETURNS bigint LANGUAGE javascript\n" + "AS 'val+1;';"); assertRows(execute("SELECT key, lval, jsbigint(lval) FROM %s"), row(1, 1L, 2L)); - execute("DROP FUNCTION jsbigint(bigint)"); + execute("DROP FUNCTION "+KEYSPACE+".jsbigint(bigint)"); // float - execute("CREATE OR REPLACE FUNCTION jsfloat(val float) RETURNS float LANGUAGE javascript\n" + + execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".jsfloat(val float) RETURNS float LANGUAGE javascript\n" + "AS 'val+1;';"); assertRows(execute("SELECT key, fval, jsfloat(fval) FROM %s"), row(1, 1f, 2f)); - execute("DROP FUNCTION jsfloat(float)"); + execute("DROP FUNCTION "+KEYSPACE+".jsfloat(float)"); // double - execute("CREATE OR REPLACE FUNCTION jsdouble(val double) RETURNS double LANGUAGE javascript\n" + + execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".jsdouble(val double) RETURNS double LANGUAGE javascript\n" + "AS 'val+1;';"); assertRows(execute("SELECT key, dval, jsdouble(dval) FROM %s"), row(1, 1d, 2d)); - execute("DROP FUNCTION jsdouble(double)"); + execute("DROP FUNCTION "+KEYSPACE+".jsdouble(double)"); // varint - execute("CREATE OR REPLACE FUNCTION jsvarint(val varint) RETURNS varint LANGUAGE javascript\n" + + execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".jsvarint(val varint) RETURNS varint LANGUAGE javascript\n" + "AS 'val+1;';"); assertRows(execute("SELECT key, vval, jsvarint(vval) FROM %s"), row(1, BigInteger.valueOf(1L), BigInteger.valueOf(2L))); - execute("DROP FUNCTION jsvarint(varint)"); + execute("DROP FUNCTION "+KEYSPACE+".jsvarint(varint)"); // decimal - execute("CREATE OR REPLACE FUNCTION jsdecimal(val decimal) RETURNS decimal LANGUAGE javascript\n" + + execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".jsdecimal(val decimal) RETURNS decimal LANGUAGE javascript\n" + "AS 'val+1;';"); assertRows(execute("SELECT key, ddval, jsdecimal(ddval) FROM %s"), row(1, BigDecimal.valueOf(1d), BigDecimal.valueOf(2d))); - execute("DROP FUNCTION jsdecimal(decimal)"); + execute("DROP FUNCTION "+KEYSPACE+".jsdecimal(decimal)"); } } From 58fdc6b5c027215edad4802b2ced453f3ebba2cc Mon Sep 17 00:00:00 2001 From: Joshua McKenzie Date: Fri, 14 Nov 2014 10:52:28 -0600 Subject: [PATCH 189/557] Allow snapshot-based repair on Windows for 3.0 Patch by jmckenzie; reviewed by yukim for CASSANDRA-8309 --- .../apache/cassandra/repair/messages/RepairOption.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/java/org/apache/cassandra/repair/messages/RepairOption.java b/src/java/org/apache/cassandra/repair/messages/RepairOption.java index fd1d6e7f7d76..3f59d7b92305 100644 --- a/src/java/org/apache/cassandra/repair/messages/RepairOption.java +++ b/src/java/org/apache/cassandra/repair/messages/RepairOption.java @@ -211,15 +211,7 @@ public static RepairOption parse(Map options, IPartitioner parti public RepairOption(boolean sequential, boolean primaryRange, boolean incremental, int jobThreads, Collection> ranges) { - if (!FBUtilities.isUnix() && sequential) - { - logger.warn("Snapshot-based repair is not yet supported on Windows. Reverting to parallel repair."); - this.sequential = false; - } - else - { - this.sequential = sequential; - } + this.sequential = sequential; this.primaryRange = primaryRange; this.incremental = incremental; this.jobThreads = jobThreads; From cbbc1191ce1656a92354a4fa3859626cb10083e5 Mon Sep 17 00:00:00 2001 From: Aleksey Yeschenko Date: Fri, 14 Nov 2014 20:58:33 +0300 Subject: [PATCH 190/557] Remove post-2.1 dead schema migrations and columns --- .../cassandra/cache/CachingOptions.java | 9 +-- .../apache/cassandra/config/CFMetaData.java | 45 +------------- .../apache/cassandra/db/SystemKeyspace.java | 62 +------------------ 3 files changed, 5 insertions(+), 111 deletions(-) diff --git a/src/java/org/apache/cassandra/cache/CachingOptions.java b/src/java/org/apache/cassandra/cache/CachingOptions.java index 6eeaa377a4d7..f9c7e6413f0c 100644 --- a/src/java/org/apache/cassandra/cache/CachingOptions.java +++ b/src/java/org/apache/cassandra/cache/CachingOptions.java @@ -130,11 +130,7 @@ public int hashCode() return result; } - public static boolean isLegacy(String CachingOptions) - { - return legacyOptions.contains(CachingOptions.toUpperCase()); - } - + // FIXME: move to ThriftConversion public static CachingOptions fromThrift(String caching, String cellsPerRow) throws ConfigurationException { @@ -153,6 +149,7 @@ public static CachingOptions fromThrift(String caching, String cellsPerRow) thro return new CachingOptions(kc, rc); } + // FIXME: move to ThriftConversion public String toThriftCaching() { if (rowCache.isEnabled() && keyCache.isEnabled()) @@ -164,6 +161,7 @@ public String toThriftCaching() return "NONE"; } + // FIXME: move to ThriftConversion public String toThriftCellsPerRow() { if (rowCache.cacheFullPartitions()) @@ -171,7 +169,6 @@ public String toThriftCellsPerRow() return String.valueOf(rowCache.rowsToCache); } - public static class KeyCache { public final Type type; diff --git a/src/java/org/apache/cassandra/config/CFMetaData.java b/src/java/org/apache/cassandra/config/CFMetaData.java index 14271c0b7bac..2ed4a95617e1 100644 --- a/src/java/org/apache/cassandra/config/CFMetaData.java +++ b/src/java/org/apache/cassandra/config/CFMetaData.java @@ -54,7 +54,6 @@ import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.UUIDGen; -import static org.apache.cassandra.utils.FBUtilities.fromJsonList; import static org.apache.cassandra.utils.FBUtilities.fromJsonMap; import static org.apache.cassandra.utils.FBUtilities.json; @@ -1251,7 +1250,6 @@ private void toSchemaNoColumnsNoTriggers(Mutation mutation, long timestamp) adder.add("min_compaction_threshold", minCompactionThreshold); adder.add("max_compaction_threshold", maxCompactionThreshold); adder.add("bloom_filter_fp_chance", getBloomFilterFpChance()); - adder.add("memtable_flush_period_in_ms", memtableFlushPeriod); adder.add("caching", caching.toString()); adder.add("default_time_to_live", defaultTimeToLive); @@ -1260,18 +1258,12 @@ private void toSchemaNoColumnsNoTriggers(Mutation mutation, long timestamp) adder.add("compaction_strategy_options", json(compactionStrategyOptions)); adder.add("min_index_interval", minIndexInterval); adder.add("max_index_interval", maxIndexInterval); - adder.add("index_interval", null); adder.add("speculative_retry", speculativeRetry.toString()); for (Map.Entry entry : droppedColumns.entrySet()) adder.addMapEntry("dropped_columns", entry.getKey().toString(), entry.getValue()); adder.add("is_dense", isDense); - - // Save the CQL3 metadata "the old way" for compatibility sake - adder.add("key_aliases", aliasesToJson(partitionKeyColumns)); - adder.add("column_aliases", aliasesToJson(clusteringColumns)); - adder.add("value_alias", compactValueColumn == null ? null : compactValueColumn.name.toString()); } @VisibleForTesting @@ -1328,11 +1320,9 @@ public static CFMetaData fromSchemaNoTriggers(UntypedResultSet.Row result, Untyp cfm.compressionParameters(CompressionParameters.create(fromJsonMap(result.getString("compression_parameters")))); cfm.compactionStrategyOptions(fromJsonMap(result.getString("compaction_strategy_options"))); - // migrate old index_interval values to min_index_interval, if present if (result.has("min_index_interval")) cfm.minIndexInterval(result.getInt("min_index_interval")); - else if (result.has("index_interval")) - cfm.minIndexInterval(result.getInt("index_interval")); + if (result.has("max_index_interval")) cfm.maxIndexInterval(result.getInt("max_index_interval")); @@ -1341,20 +1331,6 @@ else if (result.has("index_interval")) else cfm.bloomFilterFpChance(cfm.getBloomFilterFpChance()); - /* - * The info previously hold by key_aliases, column_aliases and value_alias is now stored in columnMetadata (because 1) this - * make more sense and 2) this allow to store indexing information). - * However, for upgrade sake we need to still be able to read those old values. Moreover, we cannot easily - * remove those old columns once "converted" to columnMetadata because that would screw up nodes that may - * not have upgraded. So for now we keep the both info and in sync, even though its redundant. - */ - if (result.has("key_aliases")) - cfm.addColumnMetadataFromAliases(aliasesFromStrings(fromJsonList(result.getString("key_aliases"))), cfm.keyValidator, ColumnDefinition.Kind.PARTITION_KEY); - if (result.has("column_aliases")) - cfm.addColumnMetadataFromAliases(aliasesFromStrings(fromJsonList(result.getString("column_aliases"))), cfm.comparator.asAbstractType(), ColumnDefinition.Kind.CLUSTERING_COLUMN); - if (result.has("value_alias")) - cfm.addColumnMetadataFromAliases(Collections.singletonList(result.getBytes("value_alias")), cfm.defaultValidator, ColumnDefinition.Kind.COMPACT_VALUE); - if (result.has("dropped_columns")) cfm.droppedColumns(convertDroppedColumns(result.getMap("dropped_columns", UTF8Type.instance, LongType.instance))); @@ -1415,25 +1391,6 @@ private static CFMetaData fromSchema(Row row) return fromSchema(result); } - private String aliasesToJson(List rawAliases) - { - if (rawAliases == null) - return null; - - List aliases = new ArrayList<>(rawAliases.size()); - for (ColumnDefinition rawAlias : rawAliases) - aliases.add(rawAlias.name.toString()); - return json(aliases); - } - - private static List aliasesFromStrings(List aliases) - { - List rawAliases = new ArrayList<>(aliases.size()); - for (String alias : aliases) - rawAliases.add(UTF8Type.instance.decompose(alias)); - return rawAliases; - } - private static Map convertDroppedColumns(Map raw) { Map converted = Maps.newHashMap(); diff --git a/src/java/org/apache/cassandra/db/SystemKeyspace.java b/src/java/org/apache/cassandra/db/SystemKeyspace.java index 7806d5fe3939..ddf6fa05dc00 100644 --- a/src/java/org/apache/cassandra/db/SystemKeyspace.java +++ b/src/java/org/apache/cassandra/db/SystemKeyspace.java @@ -33,7 +33,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.cassandra.cache.CachingOptions; import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.config.KSMetaData; @@ -119,7 +118,6 @@ public final class SystemKeyspace + "bloom_filter_fp_chance double," + "caching text," + "cf_id uuid," // post-2.1 UUID cfid - + "column_aliases text," + "comment text," + "compaction_strategy_class text," + "compaction_strategy_options text," @@ -129,9 +127,7 @@ public final class SystemKeyspace + "default_validator text," + "dropped_columns map," + "gc_grace_seconds int," - + "index_interval int," + "is_dense boolean," - + "key_aliases text," + "key_validator text," + "local_read_repair_chance double," + "max_compaction_threshold int," @@ -143,7 +139,6 @@ public final class SystemKeyspace + "speculative_retry text," + "subcomparator text," + "type text," - + "value_alias text," + "PRIMARY KEY ((keyspace_name), columnfamily_name))") .gcGraceSeconds(WEEK); @@ -370,16 +365,11 @@ public static void finishStartup() { setupVersion(); - migrateIndexInterval(); - migrateCachingOption(); // add entries to system schema columnfamilies for the hardcoded system definitions KSMetaData ksmd = Schema.instance.getKSMetaData(NAME); // delete old, possibly obsolete entries in schema tables - // FIXME: once schema_functions moves from 'namespace' to 'keyspace_name', fix this - List schemaTables = new ArrayList<>(ALL_SCHEMA_TABLES); - schemaTables.remove(SCHEMA_FUNCTIONS_TABLE); - for (String table : schemaTables) + for (String table : ALL_SCHEMA_TABLES) executeOnceInternal(String.format("DELETE FROM system.%s WHERE keyspace_name = ?", table), ksmd.name); // (+1 to timestamp to make sure we don't get shadowed by the tombstones we just added) @@ -401,56 +391,6 @@ private static void setupVersion() DatabaseDescriptor.getPartitioner().getClass().getName()); } - // TODO: In 3.0, remove this and the index_interval column from system.schema_columnfamilies - /** Migrates index_interval values to min_index_interval and sets index_interval to null */ - private static void migrateIndexInterval() - { - for (UntypedResultSet.Row row : executeOnceInternal(String.format("SELECT * FROM system.%s", SCHEMA_COLUMNFAMILIES_TABLE))) - { - if (!row.has("index_interval")) - continue; - - logger.debug("Migrating index_interval to min_index_interval"); - - CFMetaData table = CFMetaData.fromSchema(row); - String query = String.format("SELECT writetime(type) FROM system.%s WHERE keyspace_name = ? AND columnfamily_name = ?", SCHEMA_COLUMNFAMILIES_TABLE); - long timestamp = executeOnceInternal(query, table.ksName, table.cfName).one().getLong("writetime(type)"); - try - { - table.toSchema(timestamp).apply(); - } - catch (ConfigurationException e) - { - // shouldn't happen - } - } - } - - private static void migrateCachingOption() - { - for (UntypedResultSet.Row row : executeOnceInternal(String.format("SELECT * FROM system.%s", SCHEMA_COLUMNFAMILIES_TABLE))) - { - if (!row.has("caching")) - continue; - - if (!CachingOptions.isLegacy(row.getString("caching"))) - continue; - try - { - CachingOptions caching = CachingOptions.fromString(row.getString("caching")); - CFMetaData table = CFMetaData.fromSchema(row); - logger.info("Migrating caching option {} to {} for {}.{}", row.getString("caching"), caching.toString(), table.ksName, table.cfName); - String query = String.format("SELECT writetime(type) FROM system.%s WHERE keyspace_name = ? AND columnfamily_name = ?", SCHEMA_COLUMNFAMILIES_TABLE); - long timestamp = executeOnceInternal(query, table.ksName, table.cfName).one().getLong("writetime(type)"); - table.toSchema(timestamp).apply(); - } - catch (ConfigurationException e) - { - // shouldn't happen - } - } - } - /** * Write compaction log, except columfamilies under system keyspace. * From 105360cb14513ee77b1d9145d7367690a3ad2dc4 Mon Sep 17 00:00:00 2001 From: Yuki Morishita Date: Fri, 14 Nov 2014 15:36:04 -0600 Subject: [PATCH 191/557] fix test throw unknown keyspace error --- .../org/apache/cassandra/io/sstable/SSTableReaderTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java index 8de2e75dc777..cd85d785e0ec 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java @@ -215,13 +215,13 @@ private void clearAndLoad(ColumnFamilyStore cfs) public void testReadRateTracking() { // try to make sure CASSANDRA-8239 never happens again - Keyspace keyspace = Keyspace.open("Keyspace1"); + Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore("Standard1"); for (int j = 0; j < 10; j++) { ByteBuffer key = ByteBufferUtil.bytes(String.valueOf(j)); - Mutation rm = new Mutation("Keyspace1", key); + Mutation rm = new Mutation(KEYSPACE1, key); rm.add("Standard1", cellname("0"), ByteBufferUtil.EMPTY_BYTE_BUFFER, j); rm.apply(); } From ce2a99d4332fca99ccec6f7769982ae536f17c6e Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Sat, 15 Nov 2014 15:14:30 -0500 Subject: [PATCH 192/557] don't declare throwing exceptions that aren't --- .../cassandra/cql3/selection/SimpleSelector.java | 12 +++++++++--- .../cql3/statements/DropFunctionStatement.java | 9 ++++++--- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/java/org/apache/cassandra/cql3/selection/SimpleSelector.java b/src/java/org/apache/cassandra/cql3/selection/SimpleSelector.java index cdd91b23755a..a5ff4cd32474 100644 --- a/src/java/org/apache/cassandra/cql3/selection/SimpleSelector.java +++ b/src/java/org/apache/cassandra/cql3/selection/SimpleSelector.java @@ -21,7 +21,6 @@ import org.apache.cassandra.cql3.selection.Selection.ResultSetBuilder; import org.apache.cassandra.db.marshal.AbstractType; -import org.apache.cassandra.exceptions.InvalidRequestException; public final class SimpleSelector extends Selector { @@ -34,16 +33,19 @@ public static Factory newFactory(final String columnName, final int idx, final A { return new Factory() { + @Override protected String getColumnName() { return columnName; } + @Override protected AbstractType getReturnType() { return type; } + @Override public Selector newInstance() { return new SimpleSelector(columnName, idx, type); @@ -51,21 +53,25 @@ public Selector newInstance() }; } - public void addInput(ResultSetBuilder rs) throws InvalidRequestException + @Override + public void addInput(ResultSetBuilder rs) { current = rs.current.get(idx); } - public ByteBuffer getOutput() throws InvalidRequestException + @Override + public ByteBuffer getOutput() { return current; } + @Override public void reset() { current = null; } + @Override public AbstractType getType() { return type; diff --git a/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java b/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java index 5aaf9b148a8d..4cd946093d25 100644 --- a/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java @@ -53,6 +53,7 @@ public DropFunctionStatement(FunctionName functionName, this.ifExists = ifExists; } + @Override public void prepareKeyspace(ClientState state) throws InvalidRequestException { if (!functionName.hasKeyspace() && state.getRawKeyspace() != null) @@ -64,6 +65,7 @@ public void prepareKeyspace(ClientState state) throws InvalidRequestException ThriftValidation.validateKeyspaceNotSystem(functionName.keyspace); } + @Override public void checkAccess(ClientState state) throws UnauthorizedException, InvalidRequestException { // TODO CASSANDRA-7557 (function DDL permission) @@ -75,18 +77,19 @@ public void checkAccess(ClientState state) throws UnauthorizedException, Invalid * The CqlParser only goes as far as extracting the keyword arguments * from these statements, so this method is responsible for processing and * validating. - * - * @throws org.apache.cassandra.exceptions.InvalidRequestException if arguments are missing or unacceptable */ - public void validate(ClientState state) throws RequestValidationException + @Override + public void validate(ClientState state) { } + @Override public Event.SchemaChange changeEvent() { return null; } + @Override public boolean announceMigration(boolean isLocalOnly) throws RequestValidationException { List olds = Functions.find(functionName); From 9c564f10fddce15746e81f003798ddddd023522b Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Sat, 15 Nov 2014 15:26:55 -0500 Subject: [PATCH 193/557] remove dead field --- .../org/apache/cassandra/locator/Ec2MultiRegionSnitch.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/cassandra/locator/Ec2MultiRegionSnitch.java b/src/java/org/apache/cassandra/locator/Ec2MultiRegionSnitch.java index 511cbb53c8a5..ab1b5d0d4db8 100644 --- a/src/java/org/apache/cassandra/locator/Ec2MultiRegionSnitch.java +++ b/src/java/org/apache/cassandra/locator/Ec2MultiRegionSnitch.java @@ -41,13 +41,12 @@ public class Ec2MultiRegionSnitch extends Ec2Snitch { private static final String PUBLIC_IP_QUERY_URL = "http://169.254.169.254/latest/meta-data/public-ipv4"; private static final String PRIVATE_IP_QUERY_URL = "http://169.254.169.254/latest/meta-data/local-ipv4"; - private final InetAddress localPublicAddress; private final String localPrivateAddress; public Ec2MultiRegionSnitch() throws IOException, ConfigurationException { super(); - localPublicAddress = InetAddress.getByName(awsApiCall(PUBLIC_IP_QUERY_URL)); + InetAddress localPublicAddress = InetAddress.getByName(awsApiCall(PUBLIC_IP_QUERY_URL)); logger.info("EC2Snitch using publicIP as identifier: {}", localPublicAddress); localPrivateAddress = awsApiCall(PRIVATE_IP_QUERY_URL); // use the Public IP to broadcast Address to other nodes. @@ -55,6 +54,7 @@ public Ec2MultiRegionSnitch() throws IOException, ConfigurationException DatabaseDescriptor.setBroadcastRpcAddress(localPublicAddress); } + @Override public void gossiperStarting() { super.gossiperStarting(); From 2c3f9ba048af3f4f4bb144f7fdb41a84df5346e2 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Sat, 15 Nov 2014 16:22:33 -0500 Subject: [PATCH 194/557] avoid npe chance, use == with enums --- .../apache/cassandra/auth/DataResource.java | 10 +++--- .../cassandra/cache/CachingOptions.java | 12 +++---- .../apache/cassandra/config/CFMetaData.java | 2 +- .../cassandra/cql3/ColumnCondition.java | 34 +++++++++---------- .../cql3/statements/SelectStatement.java | 4 +-- .../org/apache/cassandra/db/DataTracker.java | 2 +- .../apache/cassandra/service/ClientState.java | 8 ++--- .../cassandra/service/StorageService.java | 6 ++-- 8 files changed, 40 insertions(+), 38 deletions(-) diff --git a/src/java/org/apache/cassandra/auth/DataResource.java b/src/java/org/apache/cassandra/auth/DataResource.java index 9c7a777acd8b..75a3fdf3dc25 100644 --- a/src/java/org/apache/cassandra/auth/DataResource.java +++ b/src/java/org/apache/cassandra/auth/DataResource.java @@ -152,17 +152,17 @@ public IResource getParent() public boolean isRootLevel() { - return level.equals(Level.ROOT); + return level == Level.ROOT; } public boolean isKeyspaceLevel() { - return level.equals(Level.KEYSPACE); + return level == Level.KEYSPACE; } public boolean isColumnFamilyLevel() { - return level.equals(Level.COLUMN_FAMILY); + return level == Level.COLUMN_FAMILY; } /** * @return keyspace of the resource. Throws IllegalStateException if it's the root-level resource. @@ -187,14 +187,16 @@ public String getColumnFamily() /** * @return Whether or not the resource has a parent in the hierarchy. */ + @Override public boolean hasParent() { - return !level.equals(Level.ROOT); + return level != Level.ROOT; } /** * @return Whether or not the resource exists in Cassandra. */ + @Override public boolean exists() { switch (level) diff --git a/src/java/org/apache/cassandra/cache/CachingOptions.java b/src/java/org/apache/cassandra/cache/CachingOptions.java index f9c7e6413f0c..c2605f58479b 100644 --- a/src/java/org/apache/cassandra/cache/CachingOptions.java +++ b/src/java/org/apache/cassandra/cache/CachingOptions.java @@ -188,7 +188,7 @@ public static KeyCache fromString(String keyCache) public boolean isEnabled() { - return type.equals(Type.ALL); + return type == Type.ALL; } @Override @@ -223,7 +223,7 @@ public static class RowCache public RowCache(Type type) { - this(type, type.equals(Type.ALL) ? Integer.MAX_VALUE : 0); + this(type, (type == Type.ALL) ? Integer.MAX_VALUE : 0); } public RowCache(Type type, int rowsToCache) { @@ -246,17 +246,17 @@ else if (rowCache.equalsIgnoreCase("all")) } public boolean isEnabled() { - return type.equals(Type.ALL) || type.equals(Type.HEAD); + return (type == Type.ALL) || (type == Type.HEAD); } public boolean cacheFullPartitions() { - return type.equals(Type.ALL); + return type == Type.ALL; } @Override public String toString() { - if (type.equals(Type.ALL)) return "ALL"; - if (type.equals(Type.NONE)) return "NONE"; + if (type == Type.ALL) return "ALL"; + if (type == Type.NONE) return "NONE"; return String.valueOf(rowsToCache); } diff --git a/src/java/org/apache/cassandra/config/CFMetaData.java b/src/java/org/apache/cassandra/config/CFMetaData.java index 607359451f73..23c1b8b63932 100644 --- a/src/java/org/apache/cassandra/config/CFMetaData.java +++ b/src/java/org/apache/cassandra/config/CFMetaData.java @@ -815,7 +815,7 @@ public void validateCompatility(CFMetaData cfm) throws ConfigurationException throw new ConfigurationException(String.format("Column family ID mismatch (found %s; expected %s)", cfm.cfId, cfId)); - if (!cfm.cfType.equals(cfType)) + if (cfm.cfType != cfType) throw new ConfigurationException("types do not match."); if (!cfm.comparator.isCompatibleWith(comparator)) diff --git a/src/java/org/apache/cassandra/cql3/ColumnCondition.java b/src/java/org/apache/cassandra/cql3/ColumnCondition.java index 7daec0268f8e..a8c8cc2ada36 100644 --- a/src/java/org/apache/cassandra/cql3/ColumnCondition.java +++ b/src/java/org/apache/cassandra/cql3/ColumnCondition.java @@ -59,7 +59,7 @@ private ColumnCondition(ColumnDefinition column, Term collectionElement, Term va this.inValues = inValues; this.operator = op; - if (!operator.equals(Operator.IN)) + if (operator != Operator.IN) assert this.inValues == null; } @@ -117,7 +117,7 @@ public void collectMarkerSpecification(VariableSpecifications boundNames) if (collectionElement != null) collectionElement.collectMarkerSpecification(boundNames); - if (operator.equals(Operator.IN) && inValues != null) + if ((operator == Operator.IN) && inValues != null) { for (Term value : inValues) value.collectMarkerSpecification(boundNames); @@ -130,7 +130,7 @@ public void collectMarkerSpecification(VariableSpecifications boundNames) public ColumnCondition.Bound bind(QueryOptions options) throws InvalidRequestException { - boolean isInCondition = operator.equals(Operator.IN); + boolean isInCondition = operator == Operator.IN; if (column.type instanceof CollectionType) { if (collectionElement == null) @@ -186,7 +186,7 @@ protected boolean compareWithOperator(Operator operator, AbstractType type, B else if (otherValue == null) { // the condition value is not null, so only NEQ can return true - return operator.equals(Operator.NEQ); + return operator == Operator.NEQ; } int comparison = type.compare(otherValue, value); switch (operator) @@ -236,7 +236,7 @@ private SimpleBound(ColumnCondition condition, QueryOptions options) throws Inva { super(condition.column, condition.operator); assert !(column.type instanceof CollectionType) && condition.collectionElement == null; - assert !condition.operator.equals(Operator.IN); + assert condition.operator != Operator.IN; this.value = condition.value.bindAndGet(options); } @@ -258,7 +258,7 @@ private SimpleInBound(ColumnCondition condition, QueryOptions options) throws In { super(condition.column, condition.operator); assert !(column.type instanceof CollectionType) && condition.collectionElement == null; - assert condition.operator.equals(Operator.IN); + assert condition.operator == Operator.IN; if (condition.inValues == null) this.inValues = ((Lists.Marker) condition.value).bind(options).getElements(); else @@ -291,7 +291,7 @@ private ElementAccessBound(ColumnCondition condition, QueryOptions options) thro { super(condition.column, condition.operator); assert column.type instanceof CollectionType && condition.collectionElement != null; - assert !condition.operator.equals(Operator.IN); + assert condition.operator != Operator.IN; this.collectionElement = condition.collectionElement.bindAndGet(options); this.value = condition.value.bindAndGet(options); } @@ -468,7 +468,7 @@ private CollectionBound(ColumnCondition condition, QueryOptions options) throws { super(condition.column, condition.operator); assert column.type.isCollection() && condition.collectionElement == null; - assert !condition.operator.equals(Operator.IN); + assert condition.operator != Operator.IN; this.value = condition.value.bind(options); } @@ -481,9 +481,9 @@ public boolean appliesTo(Composite rowPrefix, ColumnFamily current, final long n Iterator iter = collectionColumns(current.metadata().comparator.create(rowPrefix, column), current, now); if (value == null) { - if (operator.equals(Operator.EQ)) + if (operator == Operator.EQ) return !iter.hasNext(); - else if (operator.equals(Operator.NEQ)) + else if (operator == Operator.NEQ) return iter.hasNext(); else throw new InvalidRequestException(String.format("Invalid comparison with null for operator \"%s\"", operator)); @@ -535,7 +535,7 @@ private static boolean setOrListAppliesTo(AbstractType type, Iterator i while(iter.hasNext()) { if (!conditionIter.hasNext()) - return operator.equals(Operator.GT) || operator.equals(Operator.GTE) || operator.equals(Operator.NEQ); + return (operator == Operator.GT) || (operator == Operator.GTE) || (operator == Operator.NEQ); // for lists we use the cell value; for sets we use the cell name ByteBuffer cellValue = isSet? iter.next().name().collectionElement() : iter.next().value(); @@ -545,7 +545,7 @@ private static boolean setOrListAppliesTo(AbstractType type, Iterator i } if (conditionIter.hasNext()) - return operator.equals(Operator.LT) || operator.equals(Operator.LTE) || operator.equals(Operator.NEQ); + return (operator == Operator.LT) || (operator == Operator.LTE) || (operator == Operator.NEQ); // they're equal return operator == Operator.EQ || operator == Operator.LTE || operator == Operator.GTE; @@ -590,7 +590,7 @@ static boolean mapAppliesTo(MapType type, Iterator iter, Map conditionEntry = conditionIter.next(); Cell c = iter.next(); @@ -607,7 +607,7 @@ static boolean mapAppliesTo(MapType type, Iterator iter, Map(); if (condition.inValues == null) { @@ -768,7 +768,7 @@ public ColumnCondition prepare(String keyspace, ColumnDefinition receiver) throw if (collectionElement == null) { - if (operator.equals(Operator.IN)) + if (operator == Operator.IN) { if (inValues == null) return ColumnCondition.inCondition(receiver, inMarker.prepare(keyspace, receiver)); @@ -802,7 +802,7 @@ public ColumnCondition prepare(String keyspace, ColumnDefinition receiver) throw default: throw new AssertionError(); } - if (operator.equals(Operator.IN)) + if (operator == Operator.IN) { if (inValues == null) return ColumnCondition.inCondition(receiver, collectionElement.prepare(keyspace, elementSpec), inMarker.prepare(keyspace, valueSpec)); diff --git a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java index 621c4dbc0a73..960abaa788b3 100644 --- a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java @@ -1422,7 +1422,7 @@ public ParsedStatement.Prepared prepare() throws InvalidRequestException hasQueriableIndex |= queriable[0]; hasQueriableClusteringColumnIndex |= queriable[1]; names.add(def); - hasMultiColumnRelations |= ColumnDefinition.Kind.CLUSTERING_COLUMN.equals(def.kind); + hasMultiColumnRelations |= ColumnDefinition.Kind.CLUSTERING_COLUMN == def.kind; } updateRestrictionsForRelation(stmt, names, rel, boundNames); } @@ -1434,7 +1434,7 @@ public ParsedStatement.Prepared prepare() throws InvalidRequestException boolean[] queriable = processRelationEntity(stmt, indexManager, relation, entity, def); hasQueriableIndex |= queriable[0]; hasQueriableClusteringColumnIndex |= queriable[1]; - hasSingleColumnRelations |= ColumnDefinition.Kind.CLUSTERING_COLUMN.equals(def.kind); + hasSingleColumnRelations |= ColumnDefinition.Kind.CLUSTERING_COLUMN == def.kind; updateRestrictionsForRelation(stmt, def, rel, boundNames); } } diff --git a/src/java/org/apache/cassandra/db/DataTracker.java b/src/java/org/apache/cassandra/db/DataTracker.java index 2799556c75a5..f8b9376b927b 100644 --- a/src/java/org/apache/cassandra/db/DataTracker.java +++ b/src/java/org/apache/cassandra/db/DataTracker.java @@ -312,7 +312,7 @@ public void replaceWithNewInstances(Collection toReplace, Collect public void replaceEarlyOpenedFiles(Collection toReplace, Collection replaceWith) { for (SSTableReader s : toReplace) - assert s.openReason.equals(SSTableReader.OpenReason.EARLY); + assert s.openReason == SSTableReader.OpenReason.EARLY; // note that we can replace an early opened file with a real one replaceReaders(toReplace, replaceWith, false); } diff --git a/src/java/org/apache/cassandra/service/ClientState.java b/src/java/org/apache/cassandra/service/ClientState.java index 6cc7254e2af5..9c8d7d86e435 100644 --- a/src/java/org/apache/cassandra/service/ClientState.java +++ b/src/java/org/apache/cassandra/service/ClientState.java @@ -235,10 +235,10 @@ private void hasAccess(String keyspace, Permission perm, DataResource resource) return; validateLogin(); preventSystemKSSchemaModification(keyspace, resource, perm); - if (perm.equals(Permission.SELECT) && READABLE_SYSTEM_RESOURCES.contains(resource)) + if ((perm == Permission.SELECT) && READABLE_SYSTEM_RESOURCES.contains(resource)) return; if (PROTECTED_AUTH_RESOURCES.contains(resource)) - if (perm.equals(Permission.CREATE) || perm.equals(Permission.ALTER) || perm.equals(Permission.DROP)) + if ((perm == Permission.CREATE) || (perm == Permission.ALTER) || (perm == Permission.DROP)) throw new UnauthorizedException(String.format("%s schema is protected", resource)); ensureHasPermission(perm, resource); } @@ -258,7 +258,7 @@ public void ensureHasPermission(Permission perm, IResource resource) throws Unau private void preventSystemKSSchemaModification(String keyspace, DataResource resource, Permission perm) throws UnauthorizedException { // we only care about schema modification. - if (!(perm.equals(Permission.ALTER) || perm.equals(Permission.DROP) || perm.equals(Permission.CREATE))) + if (!((perm == Permission.ALTER) || (perm == Permission.DROP) || (perm == Permission.CREATE))) return; // prevent system keyspace modification @@ -267,7 +267,7 @@ private void preventSystemKSSchemaModification(String keyspace, DataResource res // we want to allow altering AUTH_KS and TRACING_KS. Set allowAlter = Sets.newHashSet(Auth.AUTH_KS, TraceKeyspace.NAME); - if (allowAlter.contains(keyspace.toLowerCase()) && !(resource.isKeyspaceLevel() && perm.equals(Permission.ALTER))) + if (allowAlter.contains(keyspace.toLowerCase()) && !(resource.isKeyspaceLevel() && (perm == Permission.ALTER))) throw new UnauthorizedException(String.format("Cannot %s %s", perm, resource)); } diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index a0b7975cd594..9cc643babaf0 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -1335,7 +1335,7 @@ public void beforeChange(InetAddress endpoint, EndpointState currentState, Appli */ public void onChange(InetAddress endpoint, ApplicationState state, VersionedValue value) { - if (state.equals(ApplicationState.STATUS)) + if (state == ApplicationState.STATUS) { String apStateValue = value.value; String[] pieces = apStateValue.split(VersionedValue.DELIMITER_STR, -1); @@ -2194,7 +2194,7 @@ public void forceKeyspaceCompaction(String keyspaceName, String... columnFamilie */ public void takeSnapshot(String tag, String... keyspaceNames) throws IOException { - if (operationMode.equals(Mode.JOINING)) + if (operationMode == Mode.JOINING) throw new IOException("Cannot snapshot until bootstrap completes"); if (tag == null || tag.equals("")) throw new IOException("You must supply a snapshot name."); @@ -2233,7 +2233,7 @@ public void takeColumnFamilySnapshot(String keyspaceName, String columnFamilyNam { if (keyspaceName == null) throw new IOException("You must supply a keyspace name"); - if (operationMode.equals(Mode.JOINING)) + if (operationMode == Mode.JOINING) throw new IOException("Cannot snapshot until bootstrap completes"); if (columnFamilyName == null) From 2877bc235a957dfd60ac934c572e07f4092d9fa9 Mon Sep 17 00:00:00 2001 From: Robert Stupp Date: Tue, 18 Nov 2014 14:31:47 -0600 Subject: [PATCH 195/557] Ninja: fix test for js return type under rhino engine --- test/unit/org/apache/cassandra/cql3/UFTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unit/org/apache/cassandra/cql3/UFTest.java b/test/unit/org/apache/cassandra/cql3/UFTest.java index ce850b78b77f..4975ca9833fe 100644 --- a/test/unit/org/apache/cassandra/cql3/UFTest.java +++ b/test/unit/org/apache/cassandra/cql3/UFTest.java @@ -698,9 +698,9 @@ public void testScriptReturnTypeCasting() throws Throwable // declared rtype = decimal , return type = int execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".js(val double) RETURNS decimal LANGUAGE javascript\n" + - "AS '100;';"); + "AS 'parseInt(\"100\");';"); assertRows(execute("SELECT key, val, js(val) FROM %s"), - row(1, 1d, BigDecimal.valueOf(100L))); + row(1, 1d, BigDecimal.valueOf(100d))); execute("DROP FUNCTION "+KEYSPACE+".js(double)"); // declared rtype = decimal , return type = double From 3cc9a0c87fbefc857380039834820132c4e361b2 Mon Sep 17 00:00:00 2001 From: Tyler Hobbs Date: Tue, 18 Nov 2014 15:36:47 -0600 Subject: [PATCH 196/557] Temporary fix for CASSANDRA-8326 This is a temporary python driver fix for CASSANDRA-8326. The patch has not been properly reviewed and tested by the python driver team. The driver version bundled here can be found at the following branch: https://github.com/thobbs/python-driver/tree/CASSANDRA-8326-temp-fix --- ...andra-driver-internal-only-2.1.2.post.zip} | Bin 131353 -> 132021 bytes 1 file changed, 0 insertions(+), 0 deletions(-) rename lib/{cassandra-driver-internal-only-2.1.2.zip => cassandra-driver-internal-only-2.1.2.post.zip} (72%) diff --git a/lib/cassandra-driver-internal-only-2.1.2.zip b/lib/cassandra-driver-internal-only-2.1.2.post.zip similarity index 72% rename from lib/cassandra-driver-internal-only-2.1.2.zip rename to lib/cassandra-driver-internal-only-2.1.2.post.zip index ff04cb2abc8cffaf927b1cfeac2f6e149e694f4f..79c9780b3dc2767db90a3233eea0b30999454ae2 100644 GIT binary patch delta 26140 zcmY(qV{k6O5-l3rwr$&XvSZt}lP|Vy+ctM>+qSXeyi@npt$WUo`Lk+uSI<;UbyxT5 z%pj=NaHs?vV9NA`zrfhw42}*iu8nN)u*gT=&f;QSS?Vl6KtR0zIpqIENVb7h2PXS3 zpm__n7zUW)zmW`#Q?UQzq>Ij`kOl$>s0IlL=)Y~!zpsHE052?N*9&}#DrKCaS$4KH zWT{0h%2}hWKMSQYUVAU^5V zoop-Z0*aYZVWvBi4y|3yZm#4Y4DfAUf?lkd{uy|=E~u7?8-H(HB4&xTKfU{2+)^5e zPU+JtKYG7@00zZNe4Yf6%b|Lsc1Rs7*XkMmM0};iKF0r8uzR(wDT3e3qTEb_+xiR5 zcn)8glDqq2FX_M{_ZQn>|GBa76^YZy(Ko4oG!y${l64M-n=Y;E7FU^WRXsDDd5dbu zNpPbGw_7|re%)SPBO7_qz9th-(8aKqvDDVUs0Q`614iv-fp7wz(LOCxB^yCWnP(=B zwaQvf3fpn7K?KxxHH^y;ewTe#hw{((d7fsyLv<{6m-sn+BU>n-T{Nu)UUm9=lVYx;ZtV~K1=E^J6L%Q47rbJVN@1`APUsHO*1AeTZ^h37eK`18a=KyI zCpqyq092U7<(O*89JOk0)k=Cw@S9!wwoAur*@`|a9(6%@#9N;#Yj^5Z^zmR)+Ri|% zl2$2lA;+$$E`AC5#QmRP!K5V&l9y7oP_KdZYY>(!w5DQS66%Q)TrzFdpBeT%FFyto zHag$Mn*_=TE8(kUk3TAXMh<1mVvnW?Lf+y(3hYq9)7$b!04-IRUC+iwd>;XDGX&URK~_3FjyWoqcV+* zCon9BBg&}F9090pdU-IUV9GBq(A`n&5Eg9E$1>CS=IQ`N)F=z+I0*Ih5WjS~*7^hG6B?_W%*jSi4Akt4zw$~)54uwnp3 zFY*jdNJmU@&dEXMq%R%8aT8@*L7LZouxOvN{8>3WEzF|rf35W*thOx{N7Lc)a}J^g z0pxQWo%WuJ{7rsnN2)o5J=6kD&3nm&dQ@B|)NU%V|a<~EhuiYjlwknZQF4hV-` z#8_Zh0Jza2f>Ln5G|GD1LD9pO7g-LpS%rjd*=(gzw~{k(5UyIsqM)L%*{Ip4_a_Mr zjzv8Uhz^9!eh;!+ye3v1{={)#{%y|u3Xbz?09V6`^cv^bd1 zis{LYT2Z#XZZ|s10$G8t#!I?9o{c?!THemJ*WM38zVsT*hcCRmST@}=p0f3pJ-9mG zGJaivIn-ORy-PWKO?bs~DM!t`>6PixIcj#ewujGqaXYckay4{$z@Y_dMgk?O4>^_0 z(<};OmaD>?(p$pmF09J{#AqfP$FIXStQ)XLVLXcL8AXnQPBem!WZY(%TdSvIHNgTl zw~_3r1XcF%<&3y#5E=qlT%UcdrjA@w!VN)*tkk(Q2`=D)fchwbfJpy4Ilz&?BK%Lv zNoHo!2d4jTN+nYqA~4f`BY%Wg!2Xw$D<+Qt%>3URFda*R|FsJ9+6DPv#NXEi0+{u` ztkMzQfw7uNgHLh)*BNO(8}|R2I(6tl{ci~817G0(%lR2Cw?y9gPxh?0ES54C5sVuS~kCm$LC@XX2#K zp58(uG$bL?cj>^2x=lE3i+O+0J@p>Fq}Gso`7L{dzOTohAOAGuqUNf;pQeP^EXF;& zeqTT5*ADZjzbA_VWE^ZL0x=us0g}vx ztWcArcQ(WkNmC7_(3}+GoyK6GXY$I9u@dcY?^VZU9@{9qiS|`O(*pu?YD35 zS1;g;-$8swUCqe*6u$0=O^c5XhFMAQXIr)OM^|-ijS2f3eKicIm9up`jZ5}r|5?7Z zW2N?1++8O+^=I>#5F+@cE$r7X7mtEcjT*x4+mT6XUvZY&28ZZR?u;vIZ08q`QjDKm ze_x%AX(0tN$}ogC;x1-e5#l1P|t1oBG>xyDS-j;%yKcZj9Zstx_eCmmg90V%+jK8r)g z;apY+X%qaO%TE&}*71a$2`ws<%nGoi&TgxLgO(mmAv0t;Bch=6(@oU|FGTiNn##_N z7D_Qi2gGTB@hYZ)N{DWuVa1YZuyrSmNI}exG7W#K1|u=vgaTDkQ(*!rXcU_cW`E?k z){@mQ&{kLP8*Z945!aLpZ?PXx1B1mMtQW(gkfMxX)mYCYbsSVU4)Wep831r2G>3rm zQ=*RyehE{DPjX3#qMs!#9Ami81TXR`c_5namn_KTQ06#y2dfiKZIlQb21c-4giQbC z|4gBglHhK%cltoM=R!3&zx z_WM<%>EFS?v@&%gkHgbRmpw3MrPb=2i#!uhCCGuXTINA59S!WF$t$v)wWM%OvjTW1 zYN=NTbSpUMO4z^?6U!>vowhhbqVQqLS(bdksX$*+Ffs>!$Gqe0eE_o}{r;}`rJO{i z-Gn9J=d_+O-Zp%V!{FbDEPSciL^D~c&Y%lfiJDKaKekwAIijlSWaxy$K`|+C zxL-}^FQA)zWUdLBHpJrPfng~Umn$MS!=mX`-bEwwHAh7s8}IHMw=F)6v?PBqYD zrf=!aT%VnjQxA5mDgc#MmmDOAJ&uS1+5OBE_9N(GRr#(OxC0|d z(0=XNJVV!^nBgXgwiiazXo+l1yV~ZV(=txg`Jx z4D5t2hRx0M!%1~Tk3Z`&zc}E{v6~{oPK9TB#*LFz9Pk~?I~ZVN;m8!Re-NkpeqBLn zI_SCp9xH&EvBf-!4z%;Wa*zpm|NY>#~RAf1MdYInqo1aSIJ_)>v0tuYgOyF(IA6Dyp*KL9>^*IAYbV!;`gApTIf>hMR3wCTd?`HDU>PR_@wMi^q3s ztK=}LD}ysC^_v%0^Zt;Q(WMurv&32 z5P&>7X`}EbHSjCe>F#ej)$T4`%&p7n?jOz4!1W^bkV>~`E}Bf6S-+{yg3GK^0w{3r zdDW7&L?15?+2OzuBrTlN8|3jyGEme=Hc-o*|%q-)py@RVh;GWOoH3n z+Va4Z|0CGUBgL?%v>1`V6p;HUA#lrDV`e+g0y=ou2x)m3PLL&j;%&@Pc6Y?epOhbq^v{XO-K{kCJCo0oVe#YdoH(t8HEZ-6TSy)oeSk) z@GgP%sy|sU=ByNqX(d|3rXiZ{BJNO%ju{u_o&Hte)n538JdOu#xgfrMmNNvIw17uY#c@sC8z2aZhE2-DQtc5Y$a z-$!I}n)dDE71cefvn!Ph~-8bo#cTU}MD;j&ON~@o)bSf zatiE$gKHUfgb%~{@arKYmrLL7k##s-RFL0)BXF+q0-n%vK zl4>YC9uFnx0QPqC1QNgPXxR~kU4=K3rx7-ck~_f`+x`-#&H3St*%s{3ySOC)s`r}@ zKl9%5-wfOhgVP9BZULMAqpx>yvB)mkio={k99B=RoVO`Lwn&CpVEi><-~_+AeL}^? zod{Ru1llplC?W`#EZ1o!5)VyIdXEgWN-Ff?l6{pCfD3#&kv2kysi<&ao}*D=aTX7` z({WPmm1x4BtJ~qc)>pfmA(3DZZ=$( zVgDHX4)awT0)3=P3wtQ6E1S87N|;zkrdP>5=$kP?@H|6){p%v&q4qhT*)Xw#F6+(1 z11+soz?|p3Wf75FGD*Mq0kz38?t(Fy>ycQ@X5>^xvbA-Ia_O|nWQ_A{akDmE)fLKg zdTFP_z&db~bB+|h7cS{awxgE6~s^z{p(s(Sn&K3M~B(dGi6h2cx!fgD{ z{VBU4Sermt6Q$O>V?Mu}xo^L_VkAh<2@E&|!l>=Iq$~Uu{4lIkvfrs6tUGb)@xYlM zV1?7r*I-LRyYyPG7DOX`OT!(Nb zP`;;Bf8>xRr}byNc1-v3wgdRWZStVQ=1(~@Seb1FHLzJC8qu5zI?iT@)5xKbMHikq z!9m$tWFqTyjd^7@OCo|i7e5@mdYbN;N6bTxP3qgNed`AY*#R$3E}xw$U|_CO)h~j> z$^rpjbN)Eyk4IP&EWX8hz=>1E`Dn6?-6jJa+yW*x(}uffrjIS}=X)d%gAE{3q`j5m zTi}#jdA%duHn%JB_6Kfr!&%z4^bM@fI2GI~f*vf&az0|?Fl}tP0&Qi8h&u&*Tg3@h zu%7k)w(7uD8OVn4)(&nQFe1ss&}6~~JicF_9Du3jmA*9M57R|uz*kZY*KA5iq5?<6 z;(H3ygaBXWH@7v~D;~)I*PqQWG0`8fie_I!O)W-CmS=gtJd-#vhW`0j zVjR}i6FfUueCrRVsV?~6$h^Dsyy_EpS6S0}`|@L9{QWb}&wzjB0F?a5*%Ef{&vK5g zAGy%yjc320*SlpTx`u3PD{$aa_;^flGBzb_m%JvGq*=S3p*pqiZ2|QpxIOeK)P-G* zmzz$Ozt4DK$@cSUnV*J&D2_cZ8B4}i${#P#&NP?&e^jv*>b zpvDrcUnv2BbH6;xK1Q_G5k47l_nckp5A|6S;CCk7&645}Fq_PZw8b^BC^a1@{euW8 zvv5Z~4u>S_KQa5mtZ}a2IkXl&ou{21H&N}F%PS_e`K6=6fUB4Hl;NgyQ4c`yNlgQ9 zYc|=Q`z+>6TK+*NcJ-F-*w~X(o^Rq8pLE_Pfe}U)3s9H*V*%u@jWMN}u`3oPj(hPO zNQq~#xge#%KD;84JKD?{TjG}pA)Kc(`Hj}83od)Y{Cl{CfNdF<5TCOhy{TZeG) zj`Iaa`mR$dz>*HtIVJr?u^zzl`EX9|((;N~|K=vP<>i_Xv;7^p;z;6*xyi2=CxDRL z|AywD6~p^xH7Pox@({fd<4TEcz0|WHF_fV#$8Us+S*2gY%86>M^Pv<+;AJkRoBpvS zy6SeJB_1J;gRrI20*N)O-P2~NxJ8M6kn->H#NG=FAUTpAnG3a~7u}3wVtD&-V=6=P zq_ESot&q%Xy2OQ-`}oN{a)EkGCZ{3t(ohq^S78cUHD`v02fy2Lq^^5POLMWb=u~u( zFuC(0Ochp46lp1Dc+W%*9Ve1Z*7>u+A@*4Ftmzuvsw*Y3S}j!w@)W)_nD#P>H}XL( z4~$n0IPN~?CfwG~+X-OF)JjW^_9P8#KZ5$UW5zw3mE$30of)pzN7*B}!1+?>GvdJ> zs85%Qm%ZXis)Iq0LrayDQr(`pfLNDmsak=tS$?KZgAq-pnT`~Wrs^K6tVK%Zo_CAO zwOvWtE?h{I%&kdrO;jD^C&)b~Nl+7ld9RN62_;;swU>c>hk8OA==EH{Q?IP79bM7fyvA=y$t(DhsbSi*Imu@(8ik4f7^4UZz^Cx?FA4Nwq`rt()@xAbIs{S!W^i>AK zK|VYUYw3}V>_up2rKV-dzLv>Lca_!vYkdZ`PH8r*7rH4kaU$+r4P|8l#>0HK;%YlY z8|ta(xJt(yNlCX2j+JEdl<0fGg@^j=-v`Bicbvx$ z@h#b@#HXya1{#-ecB;FKIKMVwNTIOp%_nN~OXM40Q1zfW-hLQ9I~ zCCTs+z9zqz)S(=4%f#{SEdH9j`|W@rBd*d%kVnH{g#Dj19*Uv(p*`=Ki;Sn@ zIZnOPPJyH0{A`!FtGLZ0*Q1XPfojwcikGXgUt+#n!bbeRv9IPt;MAr>ka;gN;2U=f zi>;FQ;x<}Zad5?hb+8L3hCX6|R&CHge93PS5Q_GhqKI^2k*whsTcDR82_?Gf%e;zP zv^4cY#;JK`sd>}cT+UF-iM(^^ZCzV2_i?i#6(`kqjsB2YIK*qlDO#;ryt|tj=5Ro?m!$_Xv<1)*j6b@b#SIC`ePXDK z!Os}38ZM`@h{x8r3}2Tj17o61-Bv9KE#^p?%o3z+v8^+s6qP>38ro#;lCP0Kv_Vvg zBc39IP-&Oxd?U#bG+!2=U9Z*c=B4?sNH+=}8%L?Y$rm(NE%WjL=5-z#yp~R4c2iX#_Qv ze}n|Ak6r-v%#snng}5i=?w303RF+x9!M(F*8Td)?`|aa#Q9H9M<@Hl3XgeCmYGrlB zxqE=?i^Z$*h5ce*^4vnj)$UjMr^mUJtxOtChQjLE)?+Kq91d1D@ZqDWN$d}=BziEU z%=uf&tAq~M=!~>b$$vg6^s%$+xcw51K#A>dq^JZPc|Q$+lyo?y_&@D4+dufp>ul$2 zdAiEY4vpqneAhbh2zi@LpHDD4j? zXtwl9-s8gs@uq%5Jq_>OOc^zUvh~v)spiRImU@5WPU0{jnE2ziaGww1&|crHn&W3V z&=JacaU@azynUqsVvSx4fvRny?Qg+e*CS7h-bFWIs2L!1n4m;a&%^LmbWcpK0bU77 z3PPgpthMk!bRv=~i`N5M8wH?q z;>6^k%~CRsbR($alS>2H!i}i-lXCh&_!^ssrKP_B6as9T8xx!ht)cm(>RAh__GW2& z*CdwoM|X?lRP-}C+BrkDcby$MFElX>p=3^xJ%tcMp+}TQM2?&C-iLuPVH7;ldZlF| zs9x)54(-A?nt%`yIsJt~OX;RV0iS_xo*t@|e>^z+skpZ&E44WHoZ0Zg&L$jc;t}hv z^X*{(0<0L&)M%k^!~jAYEd5>=800>-W0u16%SSj#7W}s;tKYxUD=;gv+_LwfJ}Gnt z>I6wM%i5%dt~8~FCEPNPEXY^#pF+crmS1-bXPlZ)3zm!=!F`~|1SRoE+bJW)9^%8| z&huCcpR=3x89YuCmPYB^;sv0W`Kc_%Urg2aK(+?~g?E>go6wmP9i{4)80ncBLXlj^8JyH2K zlt+HWSfmFyYue}TWF7qFV`2iJltd`$#$o2NiBE$3}Rr-95KNo62i|`qZEl3wPq; z#%f2ha3cEFR52v=WiFTu?WD}KpAnvGf%uAs4uKyITLHl1Iz>$RNg#Pv)X z?0USY0Y}_%WQ)3k11n_=PF)@eV+Yy*HFeOvf$$1+CU`qymZ&ZI$14I_52Ad2duqhv z=GoTRr!8QNmtn+7pQ>o;Yf>fCr3lBTB>wJFojEW1ad@|qCt?!L7qsr5KQb0C@`_S^ zYOun4uUwDVbgz7$@8(Nif2CJT4Aiuf*|>8h8EOWs69;NA%$VG@x5C z?56{dGLd4{DlOPh{TW+Z@17T=sR>&L$QU>LVLWC(gp6-&$8%M(cQQ=5>5)f|`=N>| z*!&^nqu|XcRFl%Wv#7x=^-nvA?`5avVLbYIC1j+}1Xcr?LMs*-(?5xT#LZ1so#T)S z?nj#}<7uOc1=9t_E}sIjJ|%haKly_F1+m#*p59-t=g*WqiMS971QL4+jEL$VN5?9l zTnB^KP#tqIeZkPc1Gz2>i;#)NPg0}WZ&t_US?E19=HFbdvYP9bsCb~<3MdqPm%uum z!Cd#esGd&44Xmq{q$Xp4{CS0{he)|ppZf(=C&>HpszSxE9BALC;ksS1UErmv8&Vyz zk~j9sG9gcy_|$?2#>p_oz25JK^Aj&;_n+J6^YFDiv8~>2RTiEAa_sNZ?~V7XrK4oR z|BPDe_46qJZ`9Zb#{5WGefj&c^D$@9nO=~)MZrIq#0DNnfnef*gjX>DOV6C@(M!#k zpFUY2psbCtCJNFxpQNIudu^*P{BN!`wN2o(-g%UPJhOW}#_F{=sQA}f*$R2OM zS7)pq>*9U(Xhm>+g(z}bEk3>=ePG?cyocqSQdfb&lhH9FhfNVeW0N88+p|J$w{_U- zOzY}pRVt1pTZYpBWdeG+fz>me7ziv z%l7=;A+{l-Cd}QXR92_L;kny_1Ev2nFGRMIp370c+0^CbS_xW#u!HaAbd56Mc6hV}E~c z0s{Q5P-R~?e5933rrMz?+H_r9x2_Kd6NY@+6CTgseImZ{eQrYLO>p+W7Gc4JL@A2* z2*;37RC7=P#@huAF-^g&J#!#2QdFo)fWclPg$hHP-H zxY_iVZKAb1DSJxTTwucLgs=4(f4WqD`s<9z&-I=`TWlW@n+XBR=!wU*7_3^o?eSDf zSJwwJB}H1Mmp4XDI|Dex_yLZ%IX$28q_f?0A$qd_NM>tc#YvHW3@aH1&J>g4t!PIJ zZF=8VR1wivf1Q}_oovn{+tgi|sW5$Bl8jA}t$hy$4_eY4x$-;siX^addjL=7Y*3X# zJ7woGR^<~guM}Uw%y-F-#7vFa2rxcx`pcKRM`StpuQHSmrv(U-r4Y?-%2ruZ`bOz*6+y_mdPVvx8~lO@P{Tb_Q>m zy^T&~8jep1qxOCTOdk@}P8t=B%}bQ|M<-;~2XW34oNehytXQIhE_)(^K6gX(67wI9 z3a8ZSJH4DW<|uQR^}V6Q-7WJ82~jkQp@RrOk3Ws(5ba=>M@ty=oRUX-$~a0la4JKu zlxJu!q!S8a38|8BYUPHf-6Qn_4g|s+yb-xWF>%nkkOWp$)R1l18@!!4NdT^OP@kvU zg#GSMwZR+|KjP}jt($0hAG%@djm?x=jaJGxSV^DQ;}^; zTf)xqn+yYv6|a8~^_15s7it~`ZQ~7hduSz<{#?tX2H=!dMN#!)1OsI}CEe0K@mT`w+EZg}WO^#W` zjS8YQ9+g8;cnIFeIqk!RR29ecgt<}4Jx%SP(PVwdp76OBwPm%v$WNt*GFsvQ_mv3V zMXOy9Qb5t-SiYtM=cD=_EaH1UW^#&!*7QXn7q1Tj+R*) zjExd$ShN4;l6P7@n-uGm&dW zWyKira96AJ@I>1H^;g|Yhf(oaZB@D8MTs_D3fDTODg?n;RW9HS5D}08yi*|PtL1{9 zA0oUKCmp`@chkmt6<7P3t1JxD-pL$-22|an;?RW&6*F5dR);^g^{;0_>#+=KYAFY) zfx&g4P6X=Std^FDskc6w2%eyi2vGC?GzdFwjW6Q96pWp>gb}K7>59T%>xVC`bGBz@ zwS-~?AF|3HuL+kJnAUy+bS)H8IzHrHK9L$gm?#YU0|A{6W%)Md&@3g(v;yk?8Ty4u zI?5TghP`X<)|OP2x~{VdIuC3*6^B}l5pcL>Rs_~Khk0;W2?iMh8n>g*g_9>S1b=arg4~`ENXXD zFyok6CIdH8hsQVC()FblFh!H!5rKuUNM^Ket(ILj<*=*DiCSv>=R-3TiDy2p4>l^4 zh>w78I%-a7eR>L4;ElJ5R4QdA`P~Gae(AF0`}0+FCqKap=tf1+EJ?sk!_Nz(MUxg1 z+*sVP{!>h&-Ty;jW51|I4ZGg$0Q+Y>t0dnN@FWsz4|ETfKl`loxPm)fqE*A`7upcP z_gHtVqn1nKtWyi&^BT0UcVla<%dBT~8^ZPcM(!m#a+) z?}PNtwY#Mc;J1l4uyN0OwIWmMmQi*OJ#)jBOM%Dss_xIS9)$B_c>nrF=J$kvkQP4C z{Gc&$=b!$SUr!m_F8NytU>8&t7En>q>Q6QM%F^2J6SS>1&I7AV)sF!a3eA>CQ z?&yCH(f~H@B}}}kPI$xH=+o=D-VuBJC;nQ_zrlZ)mk8>H8xm;=u^_P5mp<$4{WXMG zuZR!X@cez7zSX25Gi5JmuaTcu#!?WbVq9l!&VndbbGW|$3!2WL0gUrM8p?KK4d7)c zV8;KFRkkY`0?$JIkEF7l%L=#%4|&ejS=@xgBQgvc2^@b?3kV{;L|_6q%O@o%T~$oY>+fD{LH^JuhGVhtJJxh_4=jSq0cWe|88B!{_XF5 zIB_3?UQI8frMf_PRRbxZE3S`t z4pKzJzJ7Z$YrzE`9Ub3(Uk~Aba^=m9wR;!tuqr(zDR3^y@K4@oKisoxTXLj1v*Q^!N7|C3^{m49Ga- zfZm0oJy}B@MN=i#O@Hoy_U;G%E;c|`v|EZEoYMnER;TBwmD*QPyT3Wk3YL&_^V zFdu|!0my|9B)Yn~>%Y;URyvk#Dw1yw&Os%st!!HsoBQ&Fswi4d1EgqjhAZ-MZ5WQu zNPxgiannYpvSy}`M$pkd!9)ZvjBH|^TJv_!YIH9xi9qYd5vNE6NN|nUz?^el(!o-NlpmsBG z6CtiC31p*y=Sdaln<&DOpz!=%W{pzI!2raS`2OV*e5W+cF{vMPsv49o|C}IL>TOJK z9bM@lOr$mbSSI?(i){d{&8Jny&fHn$$;qc`7VwLZwKWFcVQXmpCq^ zVN|!*6J0t@;pH7+Wo~9QXjo{n#1J4I~&y*2M4qG~fe00s-~w z0ZGXL4LDE&m12Mt{^|+Mt^uDAbPXV_4&S~7cfmiwY zW@UhN{rtWnRJRVlm3~VO;RA=H#+e}~p(fI&1nZg34xd7RWaUgBp z3+V^bE7^|)Cz5Zi=PK|E%>>XVtoQ*+tOwIjQ|$l)TP5JDH_MtA5Oud}ajq3T>tvrF z`ZuC~?>b{D^9i@tBSF1d766qyh3OI|qJnH?5n^Ur_>cE~rOKr3mS{}9+#5ZIPY5X1 zn$AXvBg6lZ7tFjub&$$|e)dL?(Ezy#8OA_FqvYoTR8LU^QP3b_A~s#DbSkY8H>6V0 z8TPx{$F1H4q&18@OjlU6*;CtToKBYJn~?gzO_FZbq{>%BtY~pw%mDV9B8WC>mO8+4 zlz$^6XqA+X!QRA=YZjF7SXKLyhg6D6g-s$~^|DSD5pjLk2r_)b)IxiSt%qD1zrAz0 zyEU=ZVe(-%sr4`tTJV-{mY;J$YG%MJY+gt$cxo8YfSoA+fe@@>!#x%G-S2AIH0tcIwg)%C4g@SlxHsFVoqILWHzF>)Zbp8xtbIv#ZH|G6Fg0SrZsVX>?tV71{yhC8-A zCeUtSmJ9vKPV9{&cZ)-Y(`h+p-~~v?Y09;BG<;4-*t0r|9Rc2;@YsJPo_xS1DBj7^ z5g`U6?@Z)eM!+|$#aZb5?&GHli4~&I@jm0&vXnm@CEJ#O)TC z%xy}I2a|OT&_2d;8~!Q3z(|kJyDY6AB5T84Eor6LD!10Fb?Szy{ysv{m}fCY6m;nd zsO$HbAx%u2=1AAF4(Qm1Hz=JJA>}4qGXb{OFYPb*w+XC9jhxp?ITtkP zY}B98A0TbuH%MaPa`xv0Eq_b8J1tqVB8p8M*Mrj4@&0kZ;e2)F3J%zogAklOt8~kR z-*bpnVAn?6S7qAF_0kBQ>rFT>)$HvL)}_;?L7vGbJRHtW&I9U#&${-Ij)M3tf|K~8 zE1r3fuK@Nfg2x}Xf}yWX|4L^hM(Q8Oc!cbwKKr3Uq@5Mlrd-k$x<~_!1o_qe4k)0! zE{>BlysK67o5|Nv+nm#FGh4qdqONe`K!|TlqF--LdB_AsLOoUca?!#4Gwdc;34maa z+s2G{HlASuD|_Tb=I3Z?Vv<$)n`xDz+rc|icLMlR6x-4+EMA*_M1n2wcL>WeU~|Rjqaf~eI1W!pM#ylR5)T7mFf$Al41m*^=6^pOZe+2|Im?^E`C&@mS z@u})KMm4TLSf8Y~4~1e8&3r2=WW2*6V8rcuUY`ylEKb?AWJX8Er_aq8i#5ealzU`o z-~$i`L`+MgbgyrP=GJ$@Qb-$+3uouY$BeFxD+wRPWs$~x+5{u~*e{HYF zU@Wuj^8t_Mm!or%F={<;vqcJPxX2#5_ZQ^L`fcr|$cPeBLin|v39_y2E` zrZ2_=(}Rze>-*TWgCzhn0t3EB!fjr^A5Kml-d`?`qx5u}lB1v6%h$>=&+aeqc?Et0 zzYm_jZX%qBP~nCI8Eu9M6Q&bG_(Z++oNkGj>cK>2lI9-01cJR%J*uDMn!7Ip*U06< z>AiZ#adpQb=BI#U5*Z&k>@KorOAdQ`2MrrMVxv1Nn$VH1`e>TMW&lwwz#>Z-@oL}D zMoU>BMN??f+dxWv`)0HdC{neJJ8)qjA`i}O=HP&R@YaA4t1EUL^#+>Gkeqa_p9G8Q zmi14k5t}z23g6dLw^kr7@j(j^7b01;_8K`%J{ygxplAy0{rOYay1eQ+(y(8P9?K>E zcPMquzF>CU8SNKnT)-vey9GOk9AQG83i$i5+$G!@n=z)4P0!t_)~%i%p@BZ7L)>0ok6<61`&;zR5mJ}j?4JF#VXLA5!4K#2x~w_4 zqHN$%%<@{s_sv~^&FGn&09c(Cy;wHXFD}6ivnTLfB zVW(D4S^)WKD^XKNfGZ7;#`5JO-HSVF1m-)doS+757>^?-P+pMmwy=;#@bGfAHf_R- zw%dBhYvEarNrlG3%oUD4t_&Zomqv8BFlhW8S&uva4EQp{x7U8s{^vVBOQx_YF>~v0vY~;4ELeJ{iFG(mFGfy|>r*T~;g#=3KcM zjQBoXQA!|-+X!aLZT6WT6NrqA^w@kc-6q~tN)}rd1 zj)>JY11N`12==b36f1As&0lgDx;I;|4o|uHAfkzNf5On++2yWY)zjtT?X^cAW`2hP zzj$X2|7Q$=@fOYj*`S~So|qyXbHsSsH1G_d(BI-%?2kLT$EFdUaGqs72%HgmDQU+3 zfO*QnJU$1qdddpphPl5BAZYjwa}40z2)Jp60)$6_TR&suVe5)v?z?Q9an}3l4!DQU zTfqrTRZS$)YN{URcPP```odd{hK$^vU*+K@zK$ggtsln3!+~%z3jS0(y>VVf#C?ml z>6T1Y*kDV_RYn=D@#qKn#?fog@&q^towyw!+Np3C3NlH8LgU3?`ChT$^vDjDS=g#S z0nm2rf%Wdeyn^k z*B4;QaZH`LIF85^w&I|1e`(W12qOAJ0#M5&>wozSk(5f1#Msvv*dXMl9$QslJ8Ihu zM~Mp9hmlHB1B|*0=vv znBRcfkyJqW#W#WOiFs0L=ank10YWpdo57M$Tum*b+Y<0ucpyZXwn&EY=SvH0eScM< z)`EvbE+ieQ)G{{|nfeX$%5JWA`PAa548;&&&tJ*oBr}O7NFGuteMC26n~;-6Uw8_y z!6zTR)SUBSyf#`=zCik<*m=w^R4+;U#5DI%DyX}ZfnYz6?MOZ4RLIg00Bn{yZFK_) z{JSo4InXm^T2(yZ7evUnPF^}7NBpm+!B-=qsNA^@L@cnIVdsI=e224kzV<) zmQh^*nvzhu!oQ*%tSOPd5lbByLTC?sY_+<|BAq2jlMQVU75Np!&_M?p9fu^L5K?M1 zUZ76MX0sIhnjDXt^{?i6_GtN|~gAGq`Ih*{5B0k6`GnIgrlExUG z%6`rP1*Me#L1jo_ES#O*8**k`bf%Y!`2X7b3Z}T0cIz1&f(LiE;2tcvyG!ukWPl(+ zLI!uYL4vz$a1X)VLU1QYa1D0JdGEOgPO82i@YTDgc1=~UwVvL4PgVCbGySZFlDUm0 z*F9}Ifz|rpXVu9!QvW;>gUqNcyXLKp&D6$Pml4MT2b;bI&hk!vIsgYA9_CHDtD}zA zTmSt*Us+m8-=(eh;KWToka=z5g1T6m^gxk2ZPmr(`6?d+*AV-|PtQm+8U80V(%e-_ zs#-79RS>lu&IAQBY*k|*ZYfmDZ*fkdDep{eU+z@p-7NYrv~If_c+SWm1gx5Z&jPy} zB)d$Mn7)%bfB8UyPO1G&eq+r`%7YmM;1;hNet!;VIb9SO1_zk!c)W?UMhqe9$=5QH zmueh@hm?`nX{R&dG^~{_L};7M^s&1v>!2qC{4jjq#_!mpKPi zqxur%+-y16G+dB7mwUN1uRaYjU%V;3ygg@JsyZVH47dT$nsuE;eV#(t(95NEKCd~9 zs~Pdv0K%6NPe;R2R*tXH&)V~id*6;SH4e!ok~U<9)_hIn333V-ut5lig}RvQZ=$J{ z5j+*IP*Ssv>oGW6McR^_$u^)i3lF)fG?TlIGQ~lJJ-DVjnp!_Ty<|LG-dkP2WWvANLfP%tPu*OG2SadPC=wE?NOi%tWMGr_>JOypz*ONR*39s7StzIsy68^~ zg>D!4p@h4iiW#CQ>FkZ#PQ?A13i^R@$QFMufdu4G&`2sgowN>4$q0wTQpnFYLS!k= zUmj4*CvElg_#o(AkD2Yiefo3VR+O|a8=ecgbP3!ch2ntFy4KX6V?K9{R1B*eET8YG z1_h{y$;cqUC%b-Lu!$oqIJV)5)Qk_TMo!q?D#8!43nC(O+Gphxdojz5)PhGh z#Y^X^3weiJjo^m7e@uCGwM+fgj7y1Q?e$XWI3JUqj?8GUpu31OjV#-EkJDRD9Az{j zuq;?QT=|`vMMDLuceO{q(c9#33ATk2N>%WUy~EW?3Vo=(gSSjFHuct4v5B-Cob?K# zvi%|gHK!>VnlUKv%6w{dFA9&VO%L0u#Y_kX3(pL`IbsBy*l&e?kq;%-(ZFBn7yJ%t z*`FqPw%*Ait&Y)WI+vrKYn*w4H(Nwnr3nn3Va-%LwQxIHH6s`T(1*%`a*Da~EmfOf zEp`_()nidIJs0d-bYf^rB>2=ZpsjP>1hA6Zy~#i2W;u2lqR3K^$m`r;KAS*~kLH++ z+nmVt^c5eGTP?{-1`>}ZnQ$Cpk-eFhr7LAS;a4VMhxa0{md-+d-ao}EKdDi`1_Lg6 zs8WaC&J2>J8#=n%d9O3tc~J!aO%h9{?=v-a`eH5~pyIiHJQUkOd0425xu3tz#G>e|m8G#e!e|??oWWFj z0*%eySZ{vF*46h(fYk8aOi!juN;tVFZlbo>rDT@HSUas=tOMDJRKqUuz_r)M)7J%zbyUIMonmR zNU?cX>3=dp&oGt)Q%#s^ovB7JiPEX5X}V%Cty0DJuxU!aQ$u9ML2d;f zVern}7-DkTL$K~vxkciTw$!(>G;SGw`B2+c?qfd3H-mfenaG8Gt>&N+9MuQQUr9gB zGt#(ZB{H^TlRFnH2(%g$b|u`p>aN*Q?9g6Kq1oErgmF#hJELPCcf#|hp(2gsgoSd` zCGES*IoJ#X;T}I%ZC>y{Z*@q~3oT!Cr(auMg=olQ0o1U2Vmbhp;-nxqu zIAvkZWn@IB$5t28$kTy<8N6^ag2(wuhC;f{r%_1G-&{7pod=VmtU-4D&= z_k>kLn60t)v8nov!AI1}-zoA~V99*bQ)GLDb>0i^6a)&1CJBLVBsPys@(bEJT$KU&i`}>NcBZB6BUJlK4#B2uqifowcBitZp*+1PP;N7%;j# z;l+1LUS#8v@nOfLX-(5hOJE}xUZ0tU>g3)=Ri?rOaDTGydpT>}f)kB9N2tQv%LtZP zOp!g`f$y*zkWZ8fV3I45A$;O(vYyV=lIj(Tb96rd{8-m%i-MhC-%?eZi8cag1{zHj zh6q~=&?au^XM5=KZokM-xo{Cmd;3{b+XAjwYE*fFQm*n!B)!~Wh@8AmV8Lt((x@hp z?@Gz9X`}*FG`1Nb0jv%k=rUq$A}4Ik_PM-a5=#5o;fX^!a2u7X71y^01E)wU^nR=k zd7kdBeJb$^%;%m|W*_N+3W5H2Kgq+TithYGE`G$~&dpO$sjP{<;@huF;aaeKTah{*=Vwp<8 zXh3-Hu=Z!$#&^tsiSGJupZAAz=4>tO_yM-X(2Hkz(8|B8xqV*G-H!jvaog|av#<2v z-s!8|LaDJ~^e}R$o=rshfgfw`7}MJC8vKi0L!?Leqb``ywIdpN*c3x*X6+v4^n4Ec7z_*>DOkfS`F!;J&!K6D+28aMxRH?& z;X!rwEkGl5;DKw8pA9)k<9#2Nx!CHz8-M8)m7ie{ zEj*1TnkLdbUQ)rWQ(0lGKU&6sM9JN=2D-Q!kK6`VB=l$XN8NtYp4LKCMQfS>cW<_{ zxk3?zy*fY&a!(>dzX>jo+e*cmhQi9%$wRfU#i$s}B>r;^WO;6o9M{n+w$_)@h; zlTP1Htx8y#lLRHO(uxW?l;(AGttBfpSA7|S3QDmHMFm-#doM>ri!Af=(0wn9b8@mV z&ZQCXp*;FE_Vr1C>zl*ON#Y>d^OSnM?Qtfj-PDTYXu$yhMy-PDFey0gO0lsT-g8NT!bWuS^6rWYOzW}$AH{SfK7N5G;%0FT$| zu5*-B#>T7F&CKylocqP9THqRj1>Fb*#-y{IjQJN{eY$}5VoA$y0=#UvwErmBfZRdW z7!E2s zu23D00%+ejB)H5n+cBh<%8J|(yUxa$^N2o7UW{JK`UFEoaISE;;R@MW(ccGv3FE9e zW{7j2amY-ImRiGoY&@H|2GOg|J??Fs$HVk3OK?p_m_kaB3Qa8<))_RM15c%)j!QCe z%jlX1_wn$-(+ue&5TeN?=i*&YBBkc+@r4;`nq@O9XDE60x%*v7lY!vQguIRk3 z3Kko@JU?AHR^YmOHGi_=eqsbNGsu;ovrqbZ1!`RHDx|5FLYeFg4BSsk!?9KtIUZKc zuU9h`*V`9;{<&mj!m*~oI!y}@5-YQZMJ(imU&@DK1kFv)13?C_#Rq}|EBMoGI!PDM|H1Cpfd z<)3JoJAEkmD^TSIx8NlY)QK6oH|TDb6MKireRk{w6~ZpwL7&@XJ#?p3)37QpPNDc+ z680x0t~BXIuqRWUqQjkIx=Yf+TZF!?9Q^psW>S|16Pnwp*R>xIFHuQzPZXLM>{`5S zj)|hFAD&;vLtLDqke%6AMQ0EzBORi)AoXi@0@YNTzcmqp{TjR=-jPc}&-uY>iH?{d z6TJocXFoA>$X+PF+n8L_a9W#`K(W&|G&RS%oKTm>PoAI&@8fZwG8|uCajvC6=?dv@ zbv)q7le=sC zmD!64ll?4Pp@If)Uel#auWjidid`*+Au>;N!yZ@5jT{2fRg}}>QKh|@+0kfiJ|ZIZ zh)qtv1Q}RKeLit4sT@~l7LBOdp<2kzm2a=SD9tss=hl;*Lk}p)la2`vL1$Ef6A|Vs z0ug*NmC}FKH*b^t=>>bmI*wBH_rN?RUMvbo{4KUQrR*@6V^K|Gd%aG|x>|m(^euIi z0sA`B+2VmB6%z~cn0`KM2xA?>s(H6uD!=1HTKV8@3M=UmQV zz_%;ZIeA_HVcs}*5ca9hh!OFUa5(?m%=BEy3&N!q2P5c`(-Hqj`}m2@X1a8FwOePd zR}>Vq!4nrar)K6CK^|?yxJxcRc;=%{Se_-{ADsBTRiNld#<$auPP)rO{jxJNl4M;W zdUPM?Oyqv!T9v4%*&9uj-Bi0ss4$P+WJae_Lxv_pW|aCa&ja`>Zd)uF*L9D2{NmYl zT}Rd~4H!S*qqm>w5v9Ie!Tvp0YjPt&B=h`azJe({*)K-|6h|rJrRfMf*$|Q17^#;k zXC{DY*}_uuY7PAt0(^R}`P*UR$UD~t+hOqt_NbJEmRY4f;0T)#VFJ}w1s2u13zmMHD}*S%PF z?m6tjV2KS2x9kLtnUXA%ftu2tR?hqFx*uA>hHe;M`^A!)!+9KqiEnw`SEz<=FmH_l zgjm61QCEdq(uF0pN}`V35~)YuUU5pG4(!h(Y!2eL0hXEbfFK!%nS^ z9}H&r@fOmK4*O(}?C%zpgzP9LLnLiu>1?uE)G&|we4DNq+@>3cG}mn} z*#~|1REUr=zYrdeEA)}=bS1l(Zg&rR+0%pjwx!F+YU2zbfR6Aa@fo&DM`!;wfw<GA50xjgsP)LbdPqTo!GZdpa1K5DJ>E80k_#R$W%Ebgo6aP^DaiO z`q{Oc2v!-`9dx zlnB_*GO?OIkyzINkm$x(&qSTJGcR6)D$#tJ%%q)EZ)c%+!^#39n;>fO*XXeO8cFU2`RXw<&;_av0!oZNX+Q>x|ocx zB)=3KC&@-o4L`x1V$=S4LvBZYTqeQq;4TO%(g>fk-qG(2bwUh4Z0ks82TNDmZ&%-D z85(62W7x*HUw;Se#BLnX@#(z}Xt3HKgAE6{Nm}@*x~UOkt8!-S!V>#a7JZDc5f6-a zoDHk_h%4`rwV%s!q7mvaKI5FTD*owE!SBo5p?J-%xkS!2cOK{2DD<@-=}HW7yTk}) zAuEL(J-J&E_HhHZO8Z8DCHRYhqx>~+c!MgH5{Z2)(?0JkY(2>I>f0?$XDnc_*d_MfrKiO%}cr^;a;Zr2;qip$t4EQB?SVy-w_tAN=)>7QGWfyfmT z`G?-_ov%w7=KRmla;<26WFd@sK#?uN>N5-)}BUG)i1rub;HN@ z%YViQPs13+dMKm?JFfpa$gYCc-#{EeqlC7?$CAH1H(jOJk<0TtN#@>^Lk3yuo(+?P z<1UWhTR)_(2Ap&R&q&LcZ5V1aeLT`Q0Uw3;*z?Z%Y|MET%fA+-lHVQ*qB~WFiN3NV zq~Bv4QSU7?VLXz2)ph#X;8&Eo(a4rsu=%ZC#2ofpw{P z)|N_Lt4!bwN7^9AIe!g?432>v`5!mU4FUa8fSiw-AfP)SeqHPwFboLfecV292PCf3TmaId{^h|O3-^s3`oWeH z_;AWT<{6&=2_aJVKrE6qD8N7e<^MK+Hh=T^0{MZD^l*y(p=rDaqCmLzfH;4}AM~y^ zeg441csND>;708M=}~`&{KpC!aKpHfvCwS#!-1Q7djZX6fcf^T} zX2tv8D^QgX5m%64e&^`)?+f^6N_*Jd;7NcW!ruY@vj#3c3JM!Se-1=Pr+mbz@jfO0 zhXXM_2U4LweGDY5kMPoSARRi>BYlo{%47WY9LS8$`UIC2{zo6HB8&~OyZ{pYD@Ky| zKO9KO#X}6XCoy349^nsWyzKw#Bh2j){`wNg_Afm6!z29jZ=B;vd_vzx_=6KS=fC>r zO@D-2U;WX4X#GEUtV2CEyPI|(ens*`~@T@|HHuh$u(cH0Asyz zaQ}CKLA$ z9pmK_re5y2Vgom7$?008G7@U7o9^P}j zQ5GJv9@1bg4BjV%vBk%PhkTfx{P%$IBolrlsPPv6`B?CGVodgz>PasAL{LE48 z|4a2GD}JIP+W(`kha?%9>Hjsl2tA1q`DcWO6dEBu2@3hIzMqV?Pn6ha|LU6tM_CT` WVS|xj^k|F{0tl!a2?*%Fs^mdj2LON8snyhzxm0s(Y-)*0l)B7vhdO_k8uhIO zT~P1FmMs^S*wEPf6091JBQNgs4TP3a;jTr>p**5hqqO0z3VnLn$J!}1>SRKV&U>x8 zM_XK-*g)wZ$1SA;#WG@Yv5P$jJ&TT~FTx_Xn2o`FdtV$2#z@aG%b))AyB(CS!QVCm|9utpFo+0*R>71NB}>mZ=Nw>?E{rN7g-s1Cf{^Q8{dVie2(*Fl3^|yg%a;&q`1c!q^R zDtq)Q*eYS2^=P}SFYiYy#gn-|38bbzfQyeEnbzY(AZb|y!xO65q{xIEd*eF92i7Bx zJx9lom18OVO7ua2h3hRKdGpX1s`&{T7Hr8$cQ?Xi`SRUgS}(h5fZDd`RN=?Mmf9|$ zYUTBsDeIkK{p2&YNzOHS6TrcFh+`!ytP_wifxwh)$L;~giMV{c$Jg+bW~NmQdn2h_ zy)2d5WmTv{pm1BK%exC^fWkl;UWv(`-!@lf?)C|`=dCjoEsmsWFHZ7v01>;|a72)z z=OW2hSHfDG2CX>zL)BF{gEAKrJw_dz$I&uFs(Pn3CGhxfI*K*h20-~lehTqd{Z65J z^7pA;avSK<`ze)~pcxuVg6Uk^9#Xb;Eez3|5Ho!lT0}ffF3#B+!*>@qrN1b4%8BAg zI$}3a^ek0Kx_XqQy+=~({5R?`L_G`hlIAc8%Z&T2_Q5OuybGAYE6Fe0QLsukS&#NE zq_IKYQLjAQWMhLs5wNPfuMn${^;h?x1QnQ7hc94&^-x?!9GcN^5JF+d^Lo=H;QGP! zZa@410J;DD*Kr4;wK~sbq@O?)iIv)`i4r(&gLsj&0`nhY)>NvyeC-tsgX?}Lm@K-p zhHO2xLdB6{nz8%kg366n&btmCFZFn{eR1{{6v8pP!Am-o0YFm`+D+C3SZ8}KELbCz z^W-?L_|xmvEmG%@2{?){^la7PNv!%`yj2YJi1CI?&Lz#PS%C%X$n z7R_S&h%y`yZQ7r!7wp;okH36sF30PA?6)SVb}bRcvgL{jOyc{u%jSQ3)^(-0mI6dI zwyaO8)Vtf*+--Z7FtAG&)9LU(G076HK}HGykp_!$Fi2oP&R- zQr7JYh7z>3DRgZhpeAy|=&g)>P*jJFdS5h=g_(mXO2e>q-w&fFzl!3i+}-x3!O&@- zge=KSI*IRCU9l$;QQ9a{QpJTd&wxPs*R(tA$Iyz^-2t&LcDA7vHj`Y}C2M)S>h{n? zwF4jbmI^;#8UBQ`-|ubc0&fLaTHuBuKQ#L`&9OacJ7&JZJw>WCnY{V*_b% zbRwn1xd9lNJ4`z89K)Ii3M<#*mbwjJGLE{HbKGU_sh!BtKuX!TL-5BI7u~_sbdsaM z7)oJrd5m^mIdKn2wm@R=xF!KMl5KGqD9fFQo+btTp)|X+74y|N9J8zH`CP_^lP~{( zdSS5x-4EmbqTx0N9h~C2x@+G+DvIWD8;ti z4CEde#+E}`zul}g0iXg?_WAE^ z2lE%37f`a)4nIHsz7dkZoz4GknVXc8(ca$+Xq?jw?_cj0{r(WYUy=_jw-1jD06_(X zs?DSQ$-(3!H)hm7v?r5gSh)`8i5jele=&EGvXq5@Vvl^li~4Sy zsd7c%*}t^!oTYb>hon0KzrVl9D8(qR;p8Ke~in_2V?Rw8{9wmTMycXT% zoqEslM66~C`g?#9XzG&&@4cLz1*G}}1O&MWL1P4Sb-#YDyQ7a3$1N?WyU0n?Fvqhs$ zc$CfITGR+D!-QL1OMBBFClEZvfT0bf0{hJf-?&~i#yS1@rib=|@j4|CGKBX8x5k&)b_$H-nC}?B&Rzz15 zjFqeLCLhgc4B4f0(0)K|k5#%?<#yL}cF{$XJh+_yWx5{ds_Wq1y4`92o@=PrZ(Cp? z`eQm59;A@aSu@Guk%VjgLAB))UG+oiMAPD+usbcm&87LS$e_Bbl}s;A8_2j9mqOSE z#!oLK1o|8J)`*}I;xF0&KRo*1no}=Ha>pgaaTKIR{9b!t$ag>}%Dzqd6qo8>fLET&KHI3d;sBHI~YhrtB|<&UeJih+@$=~%%MjA~ zz(S=Na_Q|ldqY5%N->x2in29@gGE#D!)?vq7NA5Z%0k!YS|UDWd*~5hK#lWI5m=+x z?AmZJa@=(ph!aT`FY_(7IeSD8{&FVQP?KyJ(#qUm4Vb>%ZUh4)#>Dc+2c%(MVh&O8 zV8G8$A4B0Yo;mXrm$I~0$!OmYQ6gv<3GC5h7sQ%h1{Q$nNj#MdVGUIqU5Y`8#(g6` zM8A805+mXyaV=N~5O3tBExTDTjog8e9)r$8#^ETHE70??eS}z*aPx~^Lpy-o@YVXC z^Y1x_x#DJRwX@0(5|D*ZGtC9l!AOIxdTHI0P5 z6r8w|QwXASV4Z{)vym{KWqjjC-6pY%w};MJ3u1sc3v!zJ&0$}98MK&{>m^Tzd`FelZQUjA6>ZLORg6R6@It;J9u z6Yg?uN5B;_-B7IN?n*rbiU;}ULaZ?K(81HP8`L%8?1~3wh^EuP3}@TwwKU8f1SmaZ z8Vp6H*!Sg4iPM!}jkr21No~ZkTqKI>3pNpciEitlsD<%?+0$SYrZU9LS zLvUJlV4*}h@W{uw7A%nfjq+B^a%*#LwRjqu^-55apk8ds<>|y|u;=^&v4#dlsL%rA zh3Ljn%d1AMfSF@1n0Q192TuPFCLHkAogkGcc{@zg;sw#qGa@3YQ=^i~;pO<^s=A9s zHNiNLf3w#YL}{~@temT>a+uGc?SNq5bp=Bcq`_gk&X-MPkBOl3VptkK2Bvo77+RpN z$CXNbIuTcqDOu-i5ogMd?&2cbQ3XSxMgk?dL7S1PK2*yT?-x)ioB4{Q)rU-qpyQJ` zEM*X>O2Q|0HQ_rQ9F~YjVC~8eOFYr{eZ>CMpgW&Z z`7WG2n3kE7Ml>!E5+*0&B%ps(XiP>TkUnh>j-OqwXH@T{#)$QjAz-XV(0EQi6u$9V*t$Zp0niSu+%wqqk{!H6yHU_f->#5Q{z$E3QD4A?I=^|Mxs11c0fTN7NZCfTR zavyEpEH4|`I*^EG7c9>*u~fNL!-5bWrA}0XL{%&4Z-T*tR6ablB3!@nv}rMCxp3J- z=REoJ^W_E$CTiq^WSh9bW#xNCMZ6IG5z0Ls4~OZW2e>=@*{`)0$af3#^-nb0H8<_P zr8hz(Xl{F>P1_cEx0pQ5dk1<&w`D`il@i^6Ic+{G8513+clGhOpLK{-QC6vJ`~A!h zQpopmjmp%@Bg3IjlGwg?FVly+whSCM>@_oX7zgtl$d`Sn_+{DPDa=I`@f`d_fAZ#2CR+KZL zI$VuPWxC1l_@QU)-Z(e zHj6N~92_V7t1f}^0)#PVUj)$z(ldxgY8Jft^ufX;*)%}* zhqdO-K~650+|li{>`s=BI+mEVGl!d;A2CcKco?6%Pg(0tJ-5_{8L6-AJ!7M!c+8Br zTXWON7fZS;wg{E%g2lvV^&ed^JKCo@UcC_Yf4w_N3@pnmIo~~Jh@!7|ZgRBE%X5AI=Nz5@F4Ep3B!eTg@OEY$~*Rh@&uO~pE z@c#`x=Ov^LIF6j13ZTx`N^Ueu>PGI_v}o-#mafeao3B10H3L^q%C?g9^9X{dXuap{7 z4qW|N5Qp%y;cPv(nkw8p)O=wo(~_$ZCT_{C^td_asxu z4HmBa{$70FkI5XTp;ItV*i{6t13j)duQvdeC{QmrA3UUckD^=o z7V2sC*0Sib8*rQxhJ_Tkt?mLo{1j1W>a$_pGLJKzX5*9)spW4uJCo5W0HhP#oyFLE zX<8J-yj3_Om?EEKokZO4w#v9mX5zCanQWgVzKCOdhb0-SjUCG3hxNTN&{3z~Pt>w&f9VpWrKtbL!D+mF#$O zN!70#>s?J;pXyyzTR^D$_$K|*v2yPAf4su9@O$wD>5j!HR$4m12GG$zU+{j~pIx7l zu|FkFXQ%fQ|9Xy@^cL(*ycK*KO+WYy|9%vr(&Sj&ax^Ghwj;TDMvTF9$c?3l()?XL z>d#w!btc-tE9ZYk*0y^>)g5kZIpI7%q2K9_em(11k%BD4;02ngVP2C^1s3*4}!iqj= zA;`69sVaeH&-tH)2{i2*6fHD{M9SG()k!ou)lT->kYabjZ@v2}*p|M5`5OaOsg0O} zh_ls1ykDgea#o$?78BWry_2Z?ttWgy!CF#t*)m8Y_aZqYZAY0A%o+M&p4-5RmA>5wZA|!8E;O6?x51kHzu?3Jek8Fxfs+AcAucyrm}k zBUaJuue<4$)sWd)-))a1NOkFXI+GrOuk{4Y4i?>1z_QeV9Ejb%M(Zv;Kva=0LO@-JyxVLD-~hX@AV7N{nj*JD$Ku-=R7lTaN(=;AT+L^`19N4Ewo z_?Y1U0VwMQsiASqK7yz{EO+rPE~XeO+{7m;iEF-k!R_`bt)M+pp=UaISDk|*#e*MB zJ6e7g*=S9QrKYq|Xlk~G?T@ZV1nCdIX!c8&i7^M^E8>aLV*uT{BkE0|Wa;_Az-5`B}tm}K&{a0-L_ zRDeGIJQP3>5F3$~8b48C;<#78g0$R0jQUFn2=6TmT~TEzR+5gE?qc0_pk_7KT#=eD ztvT-Trq+qyEb63>wpxLN*|mv^J_Hb)^f)7iSq3V<3SRo`#v!VqvM^*8e_I2HfViIl%=F^3F<$sqTA=6SB_1fB_mA^!kv~ z;{g&Z&E)o6laBTTS8LeeeeVdLtKz2MTD+J9Khmg7^WX&TqT|KOr44mu0iNryAo;4Q zrc_2RyG)&k)m)WASt@j=gQg1qf8qEC<&ZxA`PslFjrz%wHLn`^WZ?b`LzzNfl}pYR z3)adrqez4z8~>1rP8pAW12meuvR@m~nVqzzIA3_Ws)gH`>{v;3Lhb#th;}UI9y>4y zJCp%am+>}IJ0ifx7ySN;C)5LUlf)Bh@6^CC?^%6)_>Nc=J$Nf?$S#La>2>sy*W)Jc zN$icmN4It3U6Mj}3dMh~Z~GTy&A1ct<2){`F>52RViZb{%v--K0KA9%Kw-iLGe{VZ z#~^Z9RqGS?ztU(Zf)Rrax@ynQAB$f({VqCp4@dU0{o-umwoE(@w>ku>kVAN$m%{$1^Xxc{vS_fBWU}AjfFy@hQiL+u9oTSq*!NhAiEll(rTbWC2yV zl$1Ook21%C*>X=I#T#eC!$*&k7Rjf)u}Fff_N%NaROTasfV}6SQ`T4E{`d5IQPUa9 ziw;W<-`eE>BXGgN0#c30e_mEMYViD z+mv}aPsz~ci7cI=6e{}{@;BqnB)H0oWi?gwSS$?^UBT+h^bEFyeZFcM7Rn-I{i`Oo zKX?-mSus0N0OKl(_V55~aHrMh^!##qvnuzr7E)gsnV4dcnrxh8hony(Yl`U!_=Fp? zU+E5rc<+=V*9^S;J~;Bv<(Ft;WA-zl5yTkUP>r}AL`YaQR|rx@pXh0nT_gx_T>u4t zWslW~4xZy#&0{PA6N$^Sl(VocJPwYzQ!QS}$|y5Mel3U~7xsYM_a}al-5?5C#v9;Piht7o zd$YOv+2Ep3)1R%n`} z{_5U-W4YBZfR0tqFuj4a>Y|pXTM+W1c%G&`%xtazLNaTzAVZX1EdNrieotZcp1)}- zruu-Y&MXqc9o1()0l-E(+VEvAZ?T(YyK_j5zTbkfDojN zKALKA57mu)VXJWE0!6Ro?HRK2Wrxs%#o#wJ){Hm3C@*R$Oj^j0QEwiu} zAO8T2iNi;W8p1lUxnpn`+QE&4?<87M6~utJLh(@1W2}}Z%{|> zO@u>`@_vx;wB2zPm1d?+$qU~_%Y)?t%)az&pk-u}2X;6AexyZLPp*L%I|wIrh$X!i zcRTu8;BhH*3oHIjTwD;7#He0Sqaxw_8+>iNDX@d5XF7wVfegGL1QFy|=;?|BMebucVyQa=T-?Fw zu%N$1SbYvz?LhyL#g@HeC^AzxH{mDSZd{cRI#-JhN<5*OtQMVpE zg;BLN)#`%j;bj^tfyFx97CXN6pa1uGM0Y;ps4@LIQ;<;h>l%871`r6R0ZCi_u@dcy zpk|=m!L_^HTHyiDACG8amYQr^#&3>~y_bIB-R+bH&0QmykvcEOvC=*VRwP=E zsSt&NdwaHWyT+v9{(#M{5g75<#;VP!b0FLKM)E{-7>GEIKatD5;d}_|RXMnx+{i`h zBAhK@6IAx)6N)}De+zwI0Ud>WDYxF^9CHpzvi{0zs=0DTgn=Z{5+T``SDTDGZCC3- z8%mNqgv8D!4o2&UrLOAzuHh?+>_|^G@$~tF#`C@T^&IkyxrXxIRYO@NQ|CR-M&R1f zU?=?U1zypquyb_US8HtN8|E#{kZI}nApx2KYxiIJxODSrsLVvOfZ4Q85WE>)Na*jU z^sJZEF<6P&n@3UZN~QSw++TuUOn6g2Pa%2 zvF?cKM#&0e=|2$f0Ck1OMZv8$ku43H?-DkuOxRHSS~ed3Jnx8i%cgeVu`C4Runaqh zjBjkmeN(b`EsBhc$YVmoaAhq_fiU7R$kuf7F&Vviv|#Sqm+Y92S`+g~Z0&*q5~4L? zlfD#@L(`0j5)x7NR!WXZXk`~Jyv`%B{9#A&pbD)W_31x%}Uw?&f69 zaf`jf$iGBP4@@5~+FneRIF$L;15SwMIs<;*Pw1{tKsQ&>X#x>wmy$`=2jz)`HtL3& z*JFhSLqlS?Mz|ABNlf?3h#OOOBY}Ik1JU$hsYXDRu?3>Mm1Ddt>L-Je9wT-Gq}5>p zIF1x|tEjx*08%dqx#G5X+r)%_<0V-j2MqjaL1ThcxILbqC*6mbn3M0L+s%g#23{z3 zuU9IAXFzGDPnRC2nDuiC3jOlCdA+`FX};fnEL;(*LY5!CL5RZH3Kpm?{0lYVKk38< zuSkJl;z%!Igy*{!EQ#J*hXUMf_a+ZnLlvGxFO!^;fGVF>yD0ni>eLx<7PmrLfA&d= zPURiS_l*{ub42`zO7WxP>PO6AB3Q4<$JRV(z8o}{v^qCOxK@yk5RVZBhlDlwcnRe& zVvOi%5)gb@)Dst8&{f`Uih^N7E$k|VxkUTG6w-)mo0DJJP{oC05}v|iTmu|Spe9Ot zS>Ba#0F|@964SZDGLe^xgvLPi1aV(&laZeJehDdEJr!urb=Rao`BfOph0D3LEBV%A4^W|a!#1Dr?u8R!TQ$~q{ zOWeZAZzotliX0bv^r&z9RV@t)Vvn1z*)YE=8bsUHV@chZ=~TRIj)@qC*XIU99i1l_ zKJnAJE(b+lb}vm-D+I)5%HsXQ6_-%(F9+!mBGfDeKj*{`!;o+GL0Se!%%UVuwnI-G z&=d~s`;EL9?yHuUsgi8Y+PE_LT9Vc?GaR18_omyby zji}U2y{p*wsc$BhRIV*&_PlgOt5p4Uplw=|dwgMxu5~j&L(Cs=MsU{-;5+G=*4;1z zAQdC5NoT75EyZb;RS;vZJ|)4o?;3Rgga;bv62?J73fR;4E^b9BKpY#_-#Cb26b_{m z;3@b(hd)M6lU9WuoOiF+heHyhS8QR)Q}1wT4g3ueJbM&?fdm1qHY;WdzZEZ52yFq> z<{7Gmd~w~El?)=KW*;E6-h;{@MTHd^SiBaHn!$sU!lDF-Q!kmn^)G*I8Zedv=JUTX zzh)T#&$puTBSop19iZyW>1r>oJ11=_}Af+-SLm!+KY0)k3LK*F57UMjsgE{nXr;p6}fFZ zsWo3;)|hUvFRs!+w2UbWmP#-IPW26^L<;+XY+y7MENr;(^8RuCVS&RYqMB3N712Z( z2?Sv@hfJ5mKO(uAQ2Sk31@!v(P1(`N&$EA&9v%P8Bi7s2fZn0oDSUCk;sfIrxHmNb z|NYks=UVScIQ{@>ZtBidycM>l(6ma6j_ew*<<-)Ori0L6-06QUW>j$xU>1d~q02e( z@KV08LBt_pS?3;-uwKLtI2ig&W_9yclxE{V8l9X#f5XRxi=0rZ=1nQ zJUofzE(0vDtD=uMLO?a`P3+Q_Qbf<_E)`4%iL z1^w>Cqp=|o-PJlaPDp}8muG$=(3?ga{Q)^=Wjo=1&LKrWtqEqPnH}LXV>#B{pAMEg zejfh!FSA5EvCsE^C(oxf0ArqI?d2~C_Go!a+-Q`iG~FRaCxkui={NCjPO2Vgc!4t} z!N6PI;(6N*+z1|kW?vJc)iOKD0RBHO)RWRu$FE49St?0c{9v-Xxy8skSN*?&3k-CG z3gwlq=ql6)wM3j+xy3ABB}rqNXnU@RY|zatfPs4J=hBgtJojtUkGMCI%{!wLZkdXJ zFm_B!1fukKncb1W<|N3uy`9pT{3bR+h)M9#!d7*>g+T-w7a_?O2L3d4Ah7CS_2KvSj3o1L`bVceFK( z*opVR?1s4Tr+=g{2X0X2l0#6Z?p6JIVdb#jY7MP_ZS{Od+K7TYLM)ie+L+&JgxC}| zm3da0-z0<~IUJ-lQL;fycs&UGk|P13ozu08T6lMWOqdC`w;8sE=L;Y&K@nZrFLhVw zYtc3XynV|%{S3%MKEt_AM+Wq}QuBD4^Ov_%MXsm5Cqr@7+v?5(1J^xT0p0bH_^1by z1#`HuTP?q$rT9s-WESYnCQVYfdxBO_ENH7pl*!Azd`jw2C$|C#s$HPnI_wsoEqJnZ z@n~%ThF&gL+9I0?Dq4s#drRmw%zdS2eln*UBso@&8*}$+8N*`2R!beMjKVmBnOYPo z_Dn)AR7@ZVEgttoi8+P!$q8J6HJ%n`sg${--)4yHb0xKa-<(R`^W4MFMF|5+I8qB)82k9*aGRjc*YrbWz;y;<^hRsYN5PVnpIAqvxT+x%e44(WjJCS>T@ zwngSpdS&Rp1wya#y^`nSb&A$ux?qP2dy7r3gM!AkrsP4il{-X)-JBeN zdHvqd*aMYUnt$Hcg~lY{$J_PpuUV@_8uG`(K;{p5690n3on-9`56&LeYT=B}#10}-B(NhUcW4N;Wi;b`$_ zYpjw6v!7zy^7Ch~+xW3688_8k%V7%88Radu8R7FPFpU?PeMiCQ=NZedPO=V{-sNo* zUkJnS{DDO}il9clGuftUhV2)$j&sg>?18z*7mY_V+?Bt3EL6;}t=3?>S62P*U>QUC z_)o$x=zCG{*m5I!ew?AO_E1s-Q(Cnga#AYnQYOBx4y0H(>MyLBPnRh8-_)uY6cq6STiW^A;frhTluE zdK2%_SAFpF4^$sKV%1-)re5TqiP-1MeUk^ua1-8#x0~g^T_xxv$;>T8F2s9AT z1>yh8`{jiLV*?y;IWhd#>xuBd(m>5}I(BaAFuauTA(5-JD~{OClEr3~P_h@5@SW+Z zqpuzIZWD5<&95kM(KH1oSdR|43FlM8A7k{YznN3BYmGGO^#PA4f_qKvfA2aE5J5Q< zh6-M5USs4eRdOeQNe1heVTj0S*pHEM|eVn-aKcX1YzlW1yXg8~UrA?x3>*8bYfyz#3 z2w^>fssgAFv(*gesD`|yN)so|2U@hVK^4I}#8k4?>R41&)#BhjYf*&$@EKVYbK}m> zZ@d=2dkO%>#~*gTE+cwe9a?hW?(D`ooY?Z1tS@i3A9mkAVL04woV{Sa48Ofx2S8Uq z8;=YNkbePDONWw>_|1k^0Bh1hO5KW6t+R~uB?08eID_m~dZkcp!>`4=lC$6{ff+&4 zHE&7|#^Q2pY0jRBluE-!t($>^_3JUm@RaPEx%?3k8l^t{8SZW|hxOwR7*T8}272nn zdkBQy3uQ>N?c2g|O|++1;f}KhnbnuK*lljFa=?qg7mia?j(wR6)39jg0?&XTO?; z|EqfBImsfjyNzvxZ_t2A<7Z?b3SK-Jf}5(Xj)PcmWJ`-GszXcxwUvRJ2ytaWAp77q zL0Xcgg-Xl;7E-T>tjE+Lg8!yHATfyuH`5Fd8BHaza6bW$6#PQ3#9;AwInwil2Vc2j>Tx3IGn7S8Us5diJ z$+INb(j@5U(h8wD$MWI=eaaR2IQbL&=IfAor6x8>)zl5OrDkAznBQtAcSJcD_BX?| zga9Pym00bxoHHc{6$h`q~Wlxde>H`U)^m+IZ1e zqpMEbUh1t5#IxGGp5k{+B(8zJF#H^ z6uA8^AMG<$XQ^*>F*2~3Gy+s-=1SR2Vt~N;fHaxH0*ASP*oU^Se(&m?M zXdJ`U>4(i!y{3~icERbRX4@U*ns#8$TePX{#EV@rZIT?rT4`D&fnCXmBF2;p5+)+= zqDQof3%SfId?m-rO#!m-V<6)mRv55*rdN)4LgTCzG*|G_xHUA$0FouoRtyv0b-`U)2-2L6xl-&++-{M{n6}h-Fj?0C z?IXOl;Z^w=Mta8aq^xa}wFOUoJef+X+*+gBxf7=H=NMV-iOm2>_}TAW)9d~p>cy3W zM$qu5jHIPn+6w-=nB8;WP@v#a>-g{4;0?ja@88gC3IM^g(P=*XtLyZP6Jr-jYi{sA z9BrI^N6BkHm6R+&8BZT@cK-dJRSK?MJ|fb~xh?@2 ztS-;SZCu=FUV_eI>@^Y596uDvUdeR1^ocQjADz8}IBwK5pJ9a2tU71u+@}5lMoXOy z1R~dgBS6-TFfGx}tT?JA2?D}?K`3J^*AoXEj_1xyKG1e$z<8p+wZ=KnZWt8%Fgdh7 zhs$-P#xZO!trpwt2Rxj64_+fy4x>@Lg@-%h>Ac&WZa!z5(^y`!KlD5cO|Qa8SN1hx zXWx9jvCrb?(y+v6{lhqqu)Wl0KU9d5v*P+RDxTpszje*wm+Y~TVF%PU zJAm`132)8`6cw?=vSe0bw|2i}%EyRt=ph_Fv!}{;7C6v1Q(D4Ll6@}YL)B4?T3dmz zK1pvM3dItd`F2FeNQVPp)a`0OpAI7|P9;YwyFJC-&t{y-m})r8IjTJHITy%SU9Dih zcZur4ci2os14svZ>%-HOriCL82c>b24$!8#k~$T!AJX5;&5$bnbHj?os(p{V|<#D__i>U#(-u>QwsUazV$0-J3k4g2`~uc}1e+{+U?szT=F zxyvQB-}Z@ZEKEYFK(nU?t)~ydhj~MUU%#E z(nMfJU_f>>;`-I+;q>(3!J9l!;? zgVXA8WC_|P-Pmy8A^(nTXJLK@V6B0pm)C6CY7GB4Lvu4We-Y2CTQ$BOMy=nu$-Q08 zURnb?Mg`4-od~5>*=uDoc&^o@fn&3~{>hf#kOTzumdoGswJRsLJ_(IxrWVK$P zasXBoALgxXGX#kA%3&TNGgq+ZtVS3D*2LCr@Ggv3z4;F}gY>K2can>9qjJzzK?o2`@Z~SA09bBJOhq?3;bqH(43Gy&h}3j&mZ&S@_)}qAAjFH znf`Wn3H0?S?BezFzn{FZY#cDU$BUk^a09vT{gOc*oK`RKvpSXB&6UfTOX z>#*}#-;p}ZTaoNYz8pMT#`nQ{D0lZ^HJ$#X*MQzY?D?0Nt5kmn)>FFat(Gx92Lhb< zA4X;`IB>{H#M$&_j$OtF-a$EoO#sv^;G-Ee* zdE1h)D^1+pl0VyHg(Kf_%L=Q52k=`nz2^jp{F9XQ@gDgPUd9@Kt>n2Lb(?dLt6!ir zF|v=RP9)1t=dKkLAqg4%Oxb5IvZPo9GT^&(+_rg-75=5BJ8TQLz2E^YlsRbahW3y zxz61P6Fy#@LD^AZQLLH)Z*ilNWh=lhvM7-7ulbdbu5V}?dfMHz>-(EroqhKhqAXr8AyzJ}P?if!we|_O z@CJDF(8W|JnB)30ra_i}Gd=CLrG9zhhAk?<$fvpILm)XoSCi+=&uC{{^b?9fOJ;3w zPN)X@LA?iFaEE|*O+nk{NdR~>7!`{;p5~6odI9rh`FlMNPQcsvBIV3)bk!7+b%x4` zfPXTT9gplK*r*uY#q~b+Vq1i=2qw|20xVE}d%oW4#}4)?NO@imH=Pq1itEhqm`iEG z^e#Q2AGq6eYtMlCfK%5)1zY4w&k^m#;RxKY;de_7Cs{eFy`tvY0sz!pfnS1--onIe zL(OObnL@t(M#!;{EkTH)80`D-{gkOA2yph0aIUK`J4()@P}XC_eL&^SC zn?fcP2Enqi!paRg49|2#)H!;SBUZ!+rkdQTKT~)%u z!}X=wZ;$&POh(>MAAosK2qQ6=Le=1F5tD%yIz-;qfbA(5b2wuy(IcTQsErobDHfDK zaD0DY%z)N|H*;UT`i_>UCH)uT<4i8te4bF_i61zuXjW3nqb;d#dTSfvIhNJ=wOALJU*YIxc5;A7%7u2-1VJEfg zmSUZ9k4&Q+kVQr~S5L7%5Vm@4kl4+9SG;EBxT(q7Vrg#eNguuJjDwU8JcmRu0va@gJ#JB0c|cvycS z(tHxrY>Y(Eq%Pv&7K_?*89V-w$|0X_e*$ z^GB5lm_DamyeZKysY|;sN@gIc`t}_7I3cNLW}6Jyp*bTS@1D?PS~;El_!UF#UVi=Y zVpu_h361cxT99pyodmHoqK0?GTGm8o#)QZY_4Nw z_d2544~x~DCIIj;?FZiV$2tvYOVH4rF_mC0y3RJzei%1QQk-z4*srqF1nZq^**oRg zdBg4U4xqA^QJ}IfX-nywACu;A}c+gL=p4bn$d>At7$;t1G;~QQS z`91?Y(V=ZcdqExX5qr5{sXgo>nFgt1`q3>^Wp1z`V%&()9bVn;WR){5uZ?*n*r(*T zZ@^pQ?iwb!YoI$@mPuyX+;}Bwm;C5kM!gOHRcg{E4&!TGdT+WSh=62$mkTT8XK?YIZN8-JSVi=o|&LFKVGIR zeR}pSt&ea-ShE}&A4Lyf(7S*Zf%vBM)3emHt20{87M{pVc=-b}z8(7mJNCUU*MBW- z?A_^2r{vKnbz`?Dxm2N-ETekzi%`ljN*?x&Zq`(@uvA=9ig z6$h=|;SBG`puC*-EB&&mK3}?~&pIr8xC~Z09LB47pc9lVRpL}w7v#V8Lr=~zEF}jf zJ`_HKle?^k?KI`g9rMMGF8OjJGIr?hs+MtBES|<>6$h&{luX`4;1Qm7P{@fA$7?DK zKU~iTBO;aL_L0417t0kYdpsv~`CS|mYu+!ed-SzJTcpV-fuqaOtQu(~XuN_G)BVK~ zC+)UGjra53RVVvo^-~eZ#VpdH88{ikst*q%Gx`p7Fn5SSWcjJX49%a0!q>e9K=&l*Q$~E)jfn|A2eyO z(@Ym&-I48!+TR8ldZupaMBfR#2bzaa)gVaY z9+l3MhK#EB;cAc5$GkaHhjr?$VdG~i8WrChRa$HU-*1wY*EmstE%>*C8^8pVhA7=Y~x`>+}l%&7Y7IB45~hr{)BzhEV-v3636Ia6Izo zWwl*;8PpfltG=`L@u?a}4W^?fPCy^R9I?)3#9z3^S3*|xluM5xew@T)m}Rf<6E<6M zo-JC=mQcQ4RbO+$rg6wdLs4&-kuFnp>R_J3VoFJ=j5xBpNT_X7H+qog?o1+Dp_H~_ z3aL?YH}oT0l{LyWBSZF2Tcb z`Mlcec|AL0JQc3n#>3T2$TBCT`irT}hs(KWU-e4q6_v6H3&+DYHts)|_V2$A6&Ecw&BdaoyVZ*_vl_ACgW0d10L!fip7%yn{D2b4X*O z#&_+b5eNOUDNWMk;#y89XB&I?Zmv{m_P$PtdWZHJ)KGL^9Cs%Inxjj&tajom-)!9N zOYBWU^UYK53nj;1jWXTYxH8AozzFMCZ${Wdj6(T7pIEPGpA$Do z)+iA(@;Z+R%=Ih@%TQqOX*|4Ve>b{GK!1p6#Px9iZJpUPmO9ql0)?UWM=#*>-czsDhhaT{-URk)kP6RDio! zTmDZu&!YFt(q%BQ!cf{xqn1=}VY6QP5YQT9c4i0SOEvq2>A4|3-aCTlYqBvxg`a?H z@SWHsf)%Y%^D{iI8B?@-0f1w~l~ozZG1-|hDc4Va+dGdvqB-|K2G8{Xi!s)Gxdy8y zfSGkL_EKadlc-Zy6Gm)kO*in_lKz}Erq+@lHT@P`feTi>Ej|}}$WI`b#gzG_KXX1W z3>RWmkXSU#%bNeCcDz%v=tyPe72gj1vtz3q(=ZlCGZiiSG^{>-yd6PV-!{rSJs~oi za#yYbvk-puNHr@S&7FGB4y#hL@N5SwJ7n=b8;H-LHCge25fHPd{7V7OCc!1)CNW7363or4RHI6DM>Dzw+H*g z+ur4Nh0y2$B&{c%wI&Uzcy*v9TsxG5+V}djmSC)waY2^&CXorox)2;~PYcdq6`74z z4L<+HA90yY6wf#+Yx*7u@eWpWyjX#ZLAzBBn7I@kgSK<{GDfwN1Y1iKRxp7Pr)rA* zN%;(nZ@{%bH^3dpmAJ(fv))Ma+z~>MnE5_x@!5=o zem1Pio@*tn+~TCN7i({R>% z*<`b9_sE5-@D>deEqk}04IW5AFZt|$f=!K$inGeBznm1pZfW0nqP z|Bv5Nu}RV_h&VGlDr2u*t+#sZnBTY$(}!C~7!DudoN3qU?X=HC7%x?*Y(AM9czkc% z!*m)$A26xHY$K>yM)-{-s$NvG_fduj%=y_{+4ReSh(qG=EQWz1-RwH0z3q#kM02}c zA&KC3WRJe+hVW9pFPE^BWR#j@RGb^nfdsO=366>mem+f>zuA(%ybF7U;f;K^;G*E zW=qaifq;7FhZaPBfM=^nQxY^=VT0t`SyL{K^I*UA`P1j|O|0r7^ieq!3jex?1ZHClxID|@D8`|3k57G-`(4%sR9p59d0 zvkDNI5wtJVHGfp>4x;R_Z%?I3tseL+#`6cn@^ROP^BYO%c zOwy0$VIy3%1V9Tb+QJt_*ZWMZ)*$J@j-SGpy)xP=IRArvO_FoWu~KxtK)bezFvQ&7 zA74pED_fmqL+}q*na}PT>P})+&AX;geoeZ%?6?YLK;@PU<>8&a z>Y=e-gPzGdse4iga?Qh4OY-Q$$AyJagDeieq&n$3ffDoD3k+M;b zA?OlT9^s@CkFctVU9>8vxINQ|HxA91e0DMA)ijVUWB)P?3Q;LMRLR#4xOf)2q`#bm zv%6Kk|9Tx}Y*rsFKm6nTbQ!2AbS?dndCebY;mT@QtjOV>)koxt9O&hwY)~dhYm1CL zq)#Gud?b6EpkCTSWvO85DoD~)wZ0WkGfwcP%|k8vh$-|lLQ&`nQU#JnqVeQw1F)582qth!G(bX^aHEaee)qxJjy<^B25$>3S zg5$jW=i)9Lb1;8oP3XOyuvTHG3}zaQfd}4rc6WkiwsE`{bSLzklVQz=Fd{>I|7=P# z5YjSr?V*RI{|*JCz{oi7+ZB(k@%Kw^5g3VF5(!{JzUUksK57|+S=`w#k<_6(RKNKz z($JAG96y@Yt9{-4;DDY1^-2?Z=)io|*(*5l8JYWI zR{##V#O*6Ce9G^Z804^0Xb9V}9>2Zp{9aaEr!&ZSY*w<+E0nrwBWMx4PYrUyOK+~O zD1L}<<+g++yv4m-zIRyd7|c~B@uh}(uQtvYCQ0)=z^iAqvBA36^*!#ae7JA$vLt7$ zmFBe=IX}q}WJ;5qx(Z3Hy=*EDG0aesPgT)rXFG`_Ek!1t29(hC*9v>{pK-MyqeIjs zb)Wp0?9dU{mjnCbET&7CkuHclJuZOzBhC7;5Z~_lVa*|~RdOTo&AaFFk7^r^ zy@I*xLCOS@+;WIUFk_O>oO=r3Bp^+5@93l|?DY$`eoVN-2KvQ9vHdfpF%FI~H5?Y1 zx#Y-Hp-#;34Y1=Lt;n0k!o>@*StAE77zJ3_*!y^QQkQLQ{%UrTUo?lO*acS}qQ~-H zVFCvN4rOGdGY}ydtt+evw>i|*80DcfGKj^Q-S?azrv)YteYgfT5V3xy`pTK>r902u z#K6`()=aFzOV!EVHn2G3Pz5 z(LM^Ob=FY0c+N;w&0Sq&fvz1~;qPw%!Rii+oc$6g?sxCiM_NI+NaZQ<*!g6{u8{#y z{KY)Umfe)Ym}J1wi9e@6kS=~7OeS-dYtx_vXm0Qn1Fz>uOM4F+%e$EUu}`a!UJ=f0 zOhq@L?oXX4jI|O|B>V~uy&kz1Z^N|@9wkl8LK>fpcj)N##u77OR)f+Ay|ksZ(rmv# z+&wm`Tx`H1y+E1|JqP7#vI9vfd>LmTrfq-Oig-gowk?HWXXwlRA4RgTb?v(>pCq|n ztdA?-Jr+=T@;ykLP%`l0LybuGO_h`hbJMT!Y&D_F0%>LHNuL=(wOV3RGcbk^r{EF1 zhYQ4-(?qtvyA8dTS$f8`W8JIVifHg>$U6HC^$@EQdD)jT4*O^dFs(w%8u0$oB9Xi* z{~+YJk*(q}ewPVn(~NU7timb0bd7XtXw8K{(v%tVqeOLi1SEqD24=ecwtjj*3X}Mx z+^9jd@}%mEl<}_ExP5ZVp?TXcWTrJNFJi1P1fySsxb1+(}<^8Go+d8;2xO`qgf!Qk%x;E+O&$#Mqt z=(Ddu8b<=k6{jbL`hgj6JF(Cau8LBPrHVuKlUE(eooYW{#G-jYh3Z9xZ=S9=_e|ii zJ8T=S<2*PGrV1I>mQ+@=Z3-aH-eBLQ?7SwR0#93c{3J*e?#qj0A$W-)YR6EcjXZ_8 zrSX=L!vkfoS$kD&VI(XM85jqS`I4TJ(+2oJ4Q&ndeJ9%mt#TBMNe=Q-qO|Ehju^gg zm#rYe?HSklZU{TkGm9a|*6w<5v3aInxerVHBm&7gccNkU z9eB58D>!s6iiFaymZYD^Cp=XIGa289`f zhF>{7_^HxWyt)rd5g~|%S`Zt$wTeOc!}tp7I(Q#Z%CzfL^jWie87I^)a_4Ql{G~tP z>Zrr;bpr5eD+>0K6VSN-R;*X9HESQSb4)2ZTK(uSuYKFflAi>`Vw56Iy8wv4u!^o2 zV%bt1VjSQYvN&*zTI%OB{zP})$KZ_aZR}6C;0YMjHYtNe&nIWLR1To|OU{m53P5iB zX09ueTwOnAiA+_mI3A(#k<#7AXt|TF%%Ht$Ww~y#spjGSoJ~jiE*P(rcq_uUq4!j@idukxjoT?AVs5fi5b_26d*zLPvOZ8dg-jA}2x5I!r+Vfi_z4{QxUNUO4-p)r z);G~f-2l&vZ1Kp2-&;Y*d@X|gEKmiw_$stQVT*{oBmcP4C5@@dO zgGM2#Ueq1MT^zPq4jKHsr~rV|6c9Wg;Xl9;{hsKh1s=?e?9Q5fkiwj>1$A;$pyl29 z$zro}sya{)%Obj)vweUSANng|d0&L#AQPrf`b)hJ*GK6EMY%R(*;(dZTn*~ zALVlSe6!y-q7kgi>vcjeSpnxv>77Fr-H!Zs(vyx0{U%-7?D@ZO3BRT_tF0m_LYlx% z)K3JsaJ4Cn2sMltE!P5SfJJRBpj8WP;M*urg^{)e)`ZVvb?HKgvi)Vfq})O!iL|Wv zf{0XG_f`}vf|m+5 zrG$gO1K2<}?|l8wRuo){A^=|a_&IS24}edfM`vjS}(xlXlSpk(9mwza8N+i z82VF#`&Nx{6I2Z;Q*!vjO91VEbF@V|O} zeTnMj@roSYa`m@fk}arlH<8Qy|8)f#yHEuB^KVz+LqCcje*(aaf6HRNbyhjN=>T-f zKhezO@cX}Rn%_R@`-Uidv-*P)p7;lI-5O16fx(eBAH=j4R#0Uz6qCW)j-U3QXD6o$%1bT1_U@fDX+}J`+ z)Qxz{5dKBk80@+CFXjLDhm0usEo*p7zVH|MjZ>sT$#0p&TXNa`|5U&6jQHID+g&Pl pYv`N54CTN;Cq;F-^}};Z&U5nbPHga380h#wmm6=Jar(yr|3AxalUo1) From 07893d704598f7cbbc316c9a65a8c415e5404dfa Mon Sep 17 00:00:00 2001 From: Branimir Lambov Date: Fri, 21 Nov 2014 07:58:28 -0800 Subject: [PATCH 197/557] Remove hidden references to partitioner in Tokens Patch by blambov; reviewed by jmckenzie for CASSANDRA-8244 --- .../apache/cassandra/client/RingCache.java | 2 +- .../cql3/statements/SelectStatement.java | 2 +- .../cassandra/db/ColumnFamilyStore.java | 6 +- .../org/apache/cassandra/db/DataTracker.java | 2 +- .../org/apache/cassandra/db/DecoratedKey.java | 15 +- .../cassandra/db/HintedHandOffManager.java | 2 +- .../org/apache/cassandra/db/Memtable.java | 6 +- .../AbstractCompactionStrategy.java | 2 +- .../db/compaction/CompactionManager.java | 2 +- .../compaction/LeveledCompactionStrategy.java | 2 +- ...AbstractSimplePerColumnSecondaryIndex.java | 7 - .../cassandra/db/index/SecondaryIndex.java | 12 +- .../index/composites/CompositesSearcher.java | 2 +- .../cassandra/db/index/keys/KeysSearcher.java | 2 +- .../apache/cassandra/dht/AbstractBounds.java | 6 +- .../dht/AbstractByteOrderedPartitioner.java | 206 -------------- .../cassandra/dht/AbstractPartitioner.java | 31 --- .../apache/cassandra/dht/BigIntegerToken.java | 35 --- src/java/org/apache/cassandra/dht/Bounds.java | 24 +- .../cassandra/dht/ByteOrderedPartitioner.java | 257 +++++++++++++++++- .../org/apache/cassandra/dht/BytesToken.java | 79 ------ .../apache/cassandra/dht/ExcludingBounds.java | 21 +- .../apache/cassandra/dht/IPartitioner.java | 9 - .../dht/IncludingExcludingBounds.java | 22 +- .../cassandra/dht/LocalPartitioner.java | 68 ++++- .../org/apache/cassandra/dht/LocalToken.java | 46 ---- .../org/apache/cassandra/dht/LongToken.java | 62 ----- .../cassandra/dht/Murmur3Partitioner.java | 66 ++++- .../dht/OrderPreservingPartitioner.java | 31 ++- .../cassandra/dht/RandomPartitioner.java | 41 ++- src/java/org/apache/cassandra/dht/Range.java | 45 ++- .../apache/cassandra/dht/RingPosition.java | 4 +- .../org/apache/cassandra/dht/StringToken.java | 29 -- src/java/org/apache/cassandra/dht/Token.java | 35 ++- .../AbstractColumnFamilyInputFormat.java | 11 +- .../io/sstable/CQLSSTableWriter.java | 2 +- .../sstable/format/big/BigTableScanner.java | 14 +- .../cassandra/service/StorageProxy.java | 2 +- .../cassandra/thrift/CassandraServer.java | 8 +- .../cassandra/thrift/ThriftValidation.java | 4 +- .../apache/cassandra/tools/BulkLoader.java | 2 +- .../apache/cassandra/utils/FBUtilities.java | 30 +- .../apache/cassandra/utils/MerkleTree.java | 2 +- test/unit/org/apache/cassandra/Util.java | 1 + .../org/apache/cassandra/db/CleanupTest.java | 2 +- .../org/apache/cassandra/db/RowCacheTest.java | 2 +- .../cassandra/db/SystemKeyspaceTest.java | 2 +- .../db/compaction/AntiCompactionTest.java | 8 +- .../db/compaction/CompactionsTest.java | 2 +- .../dht/ByteOrderedPartitionerTest.java | 2 +- .../cassandra/dht/KeyCollisionTest.java | 55 ++-- .../cassandra/dht/Murmur3PartitionerTest.java | 2 +- .../dht/OrderPreservingPartitionerTest.java | 2 +- .../cassandra/dht/PartitionerTestCase.java | 5 + .../cassandra/dht/RandomPartitionerTest.java | 2 +- .../org/apache/cassandra/dht/RangeTest.java | 168 ++++++------ .../io/sstable/IndexSummaryTest.java | 2 +- .../io/sstable/SSTableReaderTest.java | 4 +- .../io/sstable/SSTableScannerTest.java | 2 +- .../locator/NetworkTopologyStrategyTest.java | 2 +- .../OldNetworkTopologyStrategyTest.java | 2 +- .../ReplicationStrategyEndpointCacheTest.java | 2 +- .../cassandra/locator/SimpleStrategyTest.java | 4 +- .../cassandra/repair/LocalSyncTaskTest.java | 2 +- .../cassandra/repair/RepairSessionTest.java | 4 +- .../repair/messages/RepairOptionTest.java | 2 +- .../service/LeaveAndBootstrapTest.java | 15 +- .../apache/cassandra/service/MoveTest.java | 7 +- .../apache/cassandra/service/RemoveTest.java | 2 +- .../cassandra/service/SerializationsTest.java | 2 +- .../service/StorageServiceServerTest.java | 8 +- .../cassandra/utils/MerkleTreeTest.java | 3 +- 72 files changed, 746 insertions(+), 826 deletions(-) delete mode 100644 src/java/org/apache/cassandra/dht/AbstractByteOrderedPartitioner.java delete mode 100644 src/java/org/apache/cassandra/dht/AbstractPartitioner.java delete mode 100644 src/java/org/apache/cassandra/dht/BigIntegerToken.java delete mode 100644 src/java/org/apache/cassandra/dht/BytesToken.java delete mode 100644 src/java/org/apache/cassandra/dht/LocalToken.java delete mode 100644 src/java/org/apache/cassandra/dht/LongToken.java delete mode 100644 src/java/org/apache/cassandra/dht/StringToken.java diff --git a/src/java/org/apache/cassandra/client/RingCache.java b/src/java/org/apache/cassandra/client/RingCache.java index d58d5d93f0ca..5865cd01f111 100644 --- a/src/java/org/apache/cassandra/client/RingCache.java +++ b/src/java/org/apache/cassandra/client/RingCache.java @@ -75,7 +75,7 @@ public void refreshEndpointMap() { Token left = partitioner.getTokenFactory().fromString(range.start_token); Token right = partitioner.getTokenFactory().fromString(range.end_token); - Range r = new Range(left, right, partitioner); + Range r = new Range(left, right); for (String host : range.endpoints) { try diff --git a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java index 99c22976bf1e..9fb636ed9a59 100644 --- a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java @@ -424,7 +424,7 @@ private AbstractBounds getKeyBounds(QueryOptions options) throws In RowPosition startKey = RowPosition.ForKey.get(startKeyBytes, p); RowPosition finishKey = RowPosition.ForKey.get(finishKeyBytes, p); - if (startKey.compareTo(finishKey) > 0 && !finishKey.isMinimum(p)) + if (startKey.compareTo(finishKey) > 0 && !finishKey.isMinimum()) return null; if (includeKeyBound(Bound.START)) diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java index 999886e1b02a..82132caef8ed 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java @@ -1804,7 +1804,7 @@ public ViewFragment select(Function> filte */ public Function> viewFilter(final DecoratedKey key) { - assert !key.isMinimum(partitioner); + assert !key.isMinimum(); return new Function>() { public List apply(DataTracker.View view) @@ -1914,7 +1914,7 @@ public boolean needsFiltering() */ private AbstractScanIterator getSequentialIterator(final DataRange range, long now) { - assert !(range.keyRange() instanceof Range) || !((Range)range.keyRange()).isWrapAround() || range.keyRange().right.isMinimum(partitioner) : range.keyRange(); + assert !(range.keyRange() instanceof Range) || !((Range)range.keyRange()).isWrapAround() || range.keyRange().right.isMinimum() : range.keyRange(); final ViewFragment view = select(viewFilter(range.keyRange())); Tracing.trace("Executing seq scan across {} sstables for {}", view.sstables.size(), range.keyRange().getString(metadata.getKeyValidator())); @@ -1933,7 +1933,7 @@ protected Row computeNext() Row current = iterator.next(); DecoratedKey key = current.key; - if (!range.stopKey().isMinimum(partitioner) && range.stopKey().compareTo(key) < 0) + if (!range.stopKey().isMinimum() && range.stopKey().compareTo(key) < 0) return endOfData(); // skipping outside of assigned range diff --git a/src/java/org/apache/cassandra/db/DataTracker.java b/src/java/org/apache/cassandra/db/DataTracker.java index f8b9376b927b..5eda67ea4971 100644 --- a/src/java/org/apache/cassandra/db/DataTracker.java +++ b/src/java/org/apache/cassandra/db/DataTracker.java @@ -757,7 +757,7 @@ public String toString() public List sstablesInBounds(AbstractBounds rowBounds) { - RowPosition stopInTree = rowBounds.right.isMinimum(liveMemtables.get(0).cfs.partitioner) ? intervalTree.max() : rowBounds.right; + RowPosition stopInTree = rowBounds.right.isMinimum() ? intervalTree.max() : rowBounds.right; return intervalTree.search(Interval.create(rowBounds.left, stopInTree)); } } diff --git a/src/java/org/apache/cassandra/db/DecoratedKey.java b/src/java/org/apache/cassandra/db/DecoratedKey.java index fb3d7ab76823..365d26123cf6 100644 --- a/src/java/org/apache/cassandra/db/DecoratedKey.java +++ b/src/java/org/apache/cassandra/db/DecoratedKey.java @@ -22,7 +22,7 @@ import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.dht.Token; -import org.apache.cassandra.service.StorageService; +import org.apache.cassandra.dht.Token.KeyBound; import org.apache.cassandra.utils.ByteBufferUtil; /** @@ -95,15 +95,20 @@ public static int compareTo(IPartitioner partitioner, ByteBuffer key, RowPositio return cmp == 0 ? ByteBufferUtil.compareUnsigned(key, otherKey.getKey()) : cmp; } - public boolean isMinimum(IPartitioner partitioner) + public IPartitioner getPartitioner() { - // A DecoratedKey can never be the minimum position on the ring - return false; + return getToken().getPartitioner(); + } + + public KeyBound minValue() + { + return getPartitioner().getMinimumToken().minKeyBound(); } public boolean isMinimum() { - return isMinimum(StorageService.getPartitioner()); + // A DecoratedKey can never be the minimum position on the ring + return false; } public RowPosition.Kind kind() diff --git a/src/java/org/apache/cassandra/db/HintedHandOffManager.java b/src/java/org/apache/cassandra/db/HintedHandOffManager.java index b976ef7425eb..a17a42f32c6f 100644 --- a/src/java/org/apache/cassandra/db/HintedHandOffManager.java +++ b/src/java/org/apache/cassandra/db/HintedHandOffManager.java @@ -513,7 +513,7 @@ private void scheduleAllDeliveries() IPartitioner p = StorageService.getPartitioner(); RowPosition minPos = p.getMinimumToken().minKeyBound(); - Range range = new Range(minPos, minPos, p); + Range range = new Range(minPos, minPos); IDiskAtomFilter filter = new NamesQueryFilter(ImmutableSortedSet.of()); List rows = hintStore.getRangeSlice(range, null, filter, Integer.MAX_VALUE, System.currentTimeMillis()); for (Row row : rows) diff --git a/src/java/org/apache/cassandra/db/Memtable.java b/src/java/org/apache/cassandra/db/Memtable.java index 565bf044f3ab..505d88935503 100644 --- a/src/java/org/apache/cassandra/db/Memtable.java +++ b/src/java/org/apache/cassandra/db/Memtable.java @@ -39,7 +39,7 @@ import org.apache.cassandra.db.commitlog.ReplayPosition; import org.apache.cassandra.db.composites.CellNameType; import org.apache.cassandra.db.index.SecondaryIndexManager; -import org.apache.cassandra.dht.LongToken; +import org.apache.cassandra.dht.Murmur3Partitioner.LongToken; import org.apache.cassandra.io.sstable.metadata.MetadataCollector; import org.apache.cassandra.io.util.DiskAwareRunnable; import org.apache.cassandra.service.ActiveRepairService; @@ -179,7 +179,7 @@ long put(DecoratedKey key, ColumnFamily cf, SecondaryIndexManager.Updater indexe previous = empty; // allocate the row overhead after the fact; this saves over allocating and having to free after, but // means we can overshoot our declared limit. - int overhead = (int) (cfs.partitioner.getHeapSizeOf(key.getToken()) + ROW_OVERHEAD_HEAP_SIZE); + int overhead = (int) (key.getToken().getHeapSize() + ROW_OVERHEAD_HEAP_SIZE); allocator.onHeap().allocate(overhead, opGroup); } else @@ -226,7 +226,7 @@ public Iterator> getEntryIterator(final Ro { return new Iterator>() { - private Iterator> iter = stopAt.isMinimum(cfs.partitioner) + private Iterator> iter = stopAt.isMinimum() ? rows.tailMap(startWith).entrySet().iterator() : rows.subMap(startWith, true, stopAt, true).entrySet().iterator(); diff --git a/src/java/org/apache/cassandra/db/compaction/AbstractCompactionStrategy.java b/src/java/org/apache/cassandra/db/compaction/AbstractCompactionStrategy.java index 333c609999c4..1d6d2e1b32ad 100644 --- a/src/java/org/apache/cassandra/db/compaction/AbstractCompactionStrategy.java +++ b/src/java/org/apache/cassandra/db/compaction/AbstractCompactionStrategy.java @@ -385,7 +385,7 @@ else if (CompactionController.getFullyExpiredSSTables(cfs, Collections.singleton long keys = sstable.estimatedKeys(); Set> ranges = new HashSet>(overlaps.size()); for (SSTableReader overlap : overlaps) - ranges.add(new Range<>(overlap.first.getToken(), overlap.last.getToken(), overlap.partitioner)); + ranges.add(new Range<>(overlap.first.getToken(), overlap.last.getToken())); long remainingKeys = keys - sstable.estimatedKeysForRanges(ranges); // next, calculate what percentage of columns we have within those keys long columns = sstable.getEstimatedColumnCount().mean() * remainingKeys; diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java index 55311a027b74..a9a47737c7fc 100644 --- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java +++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java @@ -412,7 +412,7 @@ public void performAnticompaction(ColumnFamilyStore cfs, SSTableReader sstable = sstableIterator.next(); for (Range r : Range.normalize(ranges)) { - Range sstableRange = new Range<>(sstable.first.getToken(), sstable.last.getToken(), sstable.partitioner); + Range sstableRange = new Range<>(sstable.first.getToken(), sstable.last.getToken()); if (r.contains(sstableRange)) { logger.info("SSTable {} fully contained in range {}, mutating repairedAt instead of anticompacting", sstable, r); diff --git a/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java b/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java index 3ac16ab3e440..99ae9cd9eae8 100644 --- a/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java +++ b/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java @@ -316,7 +316,7 @@ public static List intersecting(Collection sstable ArrayList filtered = new ArrayList<>(); for (SSTableReader sstable : sstables) { - Range sstableRange = new Range<>(sstable.first.getToken(), sstable.last.getToken(), sstable.partitioner); + Range sstableRange = new Range<>(sstable.first.getToken(), sstable.last.getToken()); if (range == null || sstableRange.intersects(range)) filtered.add(sstable); } diff --git a/src/java/org/apache/cassandra/db/index/AbstractSimplePerColumnSecondaryIndex.java b/src/java/org/apache/cassandra/db/index/AbstractSimplePerColumnSecondaryIndex.java index 4c398c4aaf5a..e52e5198e5a8 100644 --- a/src/java/org/apache/cassandra/db/index/AbstractSimplePerColumnSecondaryIndex.java +++ b/src/java/org/apache/cassandra/db/index/AbstractSimplePerColumnSecondaryIndex.java @@ -27,7 +27,6 @@ import org.apache.cassandra.db.composites.CellNameType; import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.dht.LocalPartitioner; -import org.apache.cassandra.dht.LocalToken; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.concurrent.OpOrder; @@ -65,12 +64,6 @@ protected AbstractType getIndexKeyComparator() return columnDef.type; } - @Override - public DecoratedKey getIndexKeyFor(ByteBuffer value) - { - return new BufferDecoratedKey(new LocalToken(getIndexKeyComparator(), value), value); - } - @Override String indexTypeForGrouping() { diff --git a/src/java/org/apache/cassandra/db/index/SecondaryIndex.java b/src/java/org/apache/cassandra/db/index/SecondaryIndex.java index b74b84e2179c..2df7f91c546c 100644 --- a/src/java/org/apache/cassandra/db/index/SecondaryIndex.java +++ b/src/java/org/apache/cassandra/db/index/SecondaryIndex.java @@ -36,7 +36,10 @@ import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.ColumnDefinition; import org.apache.cassandra.cql3.Operator; -import org.apache.cassandra.db.*; +import org.apache.cassandra.db.Cell; +import org.apache.cassandra.db.ColumnFamilyStore; +import org.apache.cassandra.db.DecoratedKey; +import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.db.compaction.CompactionManager; import org.apache.cassandra.db.composites.CellName; import org.apache.cassandra.db.composites.CellNameType; @@ -46,7 +49,6 @@ import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.db.marshal.BytesType; import org.apache.cassandra.db.marshal.LocalByPartionerType; -import org.apache.cassandra.dht.LocalToken; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.sstable.ReducingKeyIterator; import org.apache.cassandra.service.StorageService; @@ -296,15 +298,13 @@ public boolean supportsOperator(Operator operator) } /** - * Returns the decoratedKey for a column value + * Returns the decoratedKey for a column value. Assumes an index CFS is present. * @param value column value * @return decorated key */ public DecoratedKey getIndexKeyFor(ByteBuffer value) { - // FIXME: this imply one column definition per index - ByteBuffer name = columnDefs.iterator().next().name.bytes; - return new BufferDecoratedKey(new LocalToken(baseCfs.metadata.getColumnDefinition(name).type, value), value); + return getIndexCfs().partitioner.decorateKey(value); } /** diff --git a/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java b/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java index 5c1abc977569..df4aab09abbf 100644 --- a/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java +++ b/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java @@ -233,7 +233,7 @@ else if (!currentKey.equals(dk)) { // Either we're not yet in the range cause the range is start excluding, or we're // past it. - if (!range.right.isMinimum(baseCfs.partitioner) && range.right.compareTo(dk) < 0) + if (!range.right.isMinimum() && range.right.compareTo(dk) < 0) { logger.trace("Reached end of assigned scan range"); return endOfData(); diff --git a/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java b/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java index 4055b7c9bc00..3e046746c1a7 100644 --- a/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java +++ b/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java @@ -161,7 +161,7 @@ else if (range instanceof Range && indexColumns.hasNext() && firstCell.name().eq } DecoratedKey dk = baseCfs.partitioner.decorateKey(lastSeenKey.toByteBuffer()); - if (!range.right.isMinimum(baseCfs.partitioner) && range.right.compareTo(dk) < 0) + if (!range.right.isMinimum() && range.right.compareTo(dk) < 0) { logger.trace("Reached end of assigned scan range"); return endOfData(); diff --git a/src/java/org/apache/cassandra/dht/AbstractBounds.java b/src/java/org/apache/cassandra/dht/AbstractBounds.java index 90eb6b54e1cc..c7a35058eaa6 100644 --- a/src/java/org/apache/cassandra/dht/AbstractBounds.java +++ b/src/java/org/apache/cassandra/dht/AbstractBounds.java @@ -44,13 +44,11 @@ private enum Type public final T left; public final T right; - protected transient final IPartitioner partitioner; - - public AbstractBounds(T left, T right, IPartitioner partitioner) + public AbstractBounds(T left, T right) { + assert left.getPartitioner() == right.getPartitioner(); this.left = left; this.right = right; - this.partitioner = partitioner; } /** diff --git a/src/java/org/apache/cassandra/dht/AbstractByteOrderedPartitioner.java b/src/java/org/apache/cassandra/dht/AbstractByteOrderedPartitioner.java deleted file mode 100644 index d3124efe58d7..000000000000 --- a/src/java/org/apache/cassandra/dht/AbstractByteOrderedPartitioner.java +++ /dev/null @@ -1,206 +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.dht; - -import java.math.BigInteger; -import java.nio.ByteBuffer; -import java.util.*; - -import org.apache.cassandra.config.*; -import org.apache.cassandra.db.BufferDecoratedKey; -import org.apache.commons.lang3.ArrayUtils; - -import org.apache.cassandra.db.DecoratedKey; -import org.apache.cassandra.db.marshal.AbstractType; -import org.apache.cassandra.db.marshal.BytesType; -import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.service.StorageService; -import org.apache.cassandra.utils.FBUtilities; -import org.apache.cassandra.utils.Hex; -import org.apache.cassandra.utils.Pair; - -public abstract class AbstractByteOrderedPartitioner extends AbstractPartitioner -{ - public static final BytesToken MINIMUM = new BytesToken(ArrayUtils.EMPTY_BYTE_ARRAY); - - public static final BigInteger BYTE_MASK = new BigInteger("255"); - - public DecoratedKey decorateKey(ByteBuffer key) - { - return new BufferDecoratedKey(getToken(key), key); - } - - public BytesToken midpoint(Token lt, Token rt) - { - BytesToken ltoken = (BytesToken) lt; - BytesToken rtoken = (BytesToken) rt; - - int sigbytes = Math.max(ltoken.token.length, rtoken.token.length); - BigInteger left = bigForBytes(ltoken.token, sigbytes); - BigInteger right = bigForBytes(rtoken.token, sigbytes); - - Pair midpair = FBUtilities.midpoint(left, right, 8*sigbytes); - return new BytesToken(bytesForBig(midpair.left, sigbytes, midpair.right)); - } - - /** - * Convert a byte array containing the most significant of 'sigbytes' bytes - * representing a big-endian magnitude into a BigInteger. - */ - private BigInteger bigForBytes(byte[] bytes, int sigbytes) - { - byte[] b; - if (sigbytes != bytes.length) - { - b = new byte[sigbytes]; - System.arraycopy(bytes, 0, b, 0, bytes.length); - } else - b = bytes; - return new BigInteger(1, b); - } - - /** - * Convert a (positive) BigInteger into a byte array representing its magnitude. - * If remainder is true, an additional byte with the high order bit enabled - * will be added to the end of the array - */ - private byte[] bytesForBig(BigInteger big, int sigbytes, boolean remainder) - { - byte[] bytes = new byte[sigbytes + (remainder ? 1 : 0)]; - if (remainder) - { - // remaining bit is the most significant in the last byte - bytes[sigbytes] |= 0x80; - } - // bitmask for a single byte - for (int i = 0; i < sigbytes; i++) - { - int maskpos = 8 * (sigbytes - (i + 1)); - // apply bitmask and get byte value - bytes[i] = (byte)(big.and(BYTE_MASK.shiftLeft(maskpos)).shiftRight(maskpos).intValue() & 0xFF); - } - return bytes; - } - - public BytesToken getMinimumToken() - { - return MINIMUM; - } - - public BytesToken getRandomToken() - { - Random r = new Random(); - byte[] buffer = new byte[16]; - r.nextBytes(buffer); - return new BytesToken(buffer); - } - - private final Token.TokenFactory tokenFactory = new Token.TokenFactory() { - public ByteBuffer toByteArray(Token token) - { - BytesToken bytesToken = (BytesToken) token; - return ByteBuffer.wrap(bytesToken.token); - } - - public Token fromByteArray(ByteBuffer bytes) - { - return new BytesToken(bytes); - } - - public String toString(Token token) - { - BytesToken bytesToken = (BytesToken) token; - return Hex.bytesToHex(bytesToken.token); - } - - public void validate(String token) throws ConfigurationException - { - try - { - if (token.length() % 2 == 1) - token = "0" + token; - Hex.hexToBytes(token); - } - catch (NumberFormatException e) - { - throw new ConfigurationException("Token " + token + " contains non-hex digits"); - } - } - - public Token fromString(String string) - { - if (string.length() % 2 == 1) - string = "0" + string; - return new BytesToken(Hex.hexToBytes(string)); - } - }; - - public Token.TokenFactory getTokenFactory() - { - return tokenFactory; - } - - public boolean preservesOrder() - { - return true; - } - - public abstract BytesToken getToken(ByteBuffer key); - - public Map describeOwnership(List sortedTokens) - { - // allTokens will contain the count and be returned, sorted_ranges is shorthand for token<->token math. - Map allTokens = new HashMap(); - List> sortedRanges = new ArrayList>(sortedTokens.size()); - - // this initializes the counts to 0 and calcs the ranges in order. - Token lastToken = sortedTokens.get(sortedTokens.size() - 1); - for (Token node : sortedTokens) - { - allTokens.put(node, new Float(0.0)); - sortedRanges.add(new Range(lastToken, node)); - lastToken = node; - } - - for (String ks : Schema.instance.getKeyspaces()) - { - for (CFMetaData cfmd : Schema.instance.getKSMetaData(ks).cfMetaData().values()) - { - for (Range r : sortedRanges) - { - // Looping over every KS:CF:Range, get the splits size and add it to the count - allTokens.put(r.right, allTokens.get(r.right) + StorageService.instance.getSplits(ks, cfmd.cfName, r, 1).size()); - } - } - } - - // Sum every count up and divide count/total for the fractional ownership. - Float total = new Float(0.0); - for (Float f : allTokens.values()) - total += f; - for (Map.Entry row : allTokens.entrySet()) - allTokens.put(row.getKey(), row.getValue() / total); - - return allTokens; - } - - public AbstractType getTokenValidator() - { - return BytesType.instance; - } -} diff --git a/src/java/org/apache/cassandra/dht/AbstractPartitioner.java b/src/java/org/apache/cassandra/dht/AbstractPartitioner.java deleted file mode 100644 index ed077c965e47..000000000000 --- a/src/java/org/apache/cassandra/dht/AbstractPartitioner.java +++ /dev/null @@ -1,31 +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.dht; - -abstract class AbstractPartitioner implements IPartitioner -{ - @SuppressWarnings("unchecked") - public > R minValue(Class klass) - { - Token minToken = getMinimumToken(); - if (minToken.getClass().equals(klass)) - return (R)minToken; - else - return (R)minToken.minKeyBound(); - } -} diff --git a/src/java/org/apache/cassandra/dht/BigIntegerToken.java b/src/java/org/apache/cassandra/dht/BigIntegerToken.java deleted file mode 100644 index f05051934cb4..000000000000 --- a/src/java/org/apache/cassandra/dht/BigIntegerToken.java +++ /dev/null @@ -1,35 +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.dht; - -import java.math.BigInteger; - -public class BigIntegerToken extends ComparableObjectToken -{ - static final long serialVersionUID = -5833589141319293006L; - - public BigIntegerToken(BigInteger token) - { - super(token); - } - - // convenience method for testing - public BigIntegerToken(String token) { - this(new BigInteger(token)); - } -} diff --git a/src/java/org/apache/cassandra/dht/Bounds.java b/src/java/org/apache/cassandra/dht/Bounds.java index 396fc301e885..8f8755346d38 100644 --- a/src/java/org/apache/cassandra/dht/Bounds.java +++ b/src/java/org/apache/cassandra/dht/Bounds.java @@ -21,7 +21,6 @@ import java.util.List; import org.apache.cassandra.db.RowPosition; -import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.Pair; /** @@ -31,14 +30,9 @@ public class Bounds> extends AbstractBounds { public Bounds(T left, T right) { - this(left, right, StorageService.getPartitioner()); - } - - public Bounds(T left, T right, IPartitioner partitioner) - { - super(left, right, partitioner); + super(left, right); // unlike a Range, a Bounds may not wrap - assert left.compareTo(right) <= 0 || right.isMinimum(partitioner) : "[" + left + "," + right + "]"; + assert left.compareTo(right) <= 0 || right.isMinimum() : "[" + left + "," + right + "]"; } public boolean contains(T position) @@ -46,7 +40,7 @@ public boolean contains(T position) // Range.contains doesnt work correctly if left == right (unless both // are minimum) because for Range that means a wrapping range that select // the whole ring. So we must explicitely handle this case - return left.equals(position) || ((right.isMinimum(partitioner) || !left.equals(right)) && Range.contains(left, right, position)); + return left.equals(position) || ((right.isMinimum() || !left.equals(right)) && Range.contains(left, right, position)); } public Pair, AbstractBounds> split(T position) @@ -56,8 +50,8 @@ public Pair, AbstractBounds> split(T position) if (position.equals(right)) return null; - AbstractBounds lb = new Bounds(left, position, partitioner); - AbstractBounds rb = new Range(position, right, partitioner); + AbstractBounds lb = new Bounds(left, position); + AbstractBounds rb = new Range(position, right); return Pair.create(lb, rb); } @@ -101,21 +95,21 @@ protected String getClosingString() /** * Compute a bounds of keys corresponding to a given bounds of token. */ - public static Bounds makeRowBounds(Token left, Token right, IPartitioner partitioner) + public static Bounds makeRowBounds(Token left, Token right) { - return new Bounds(left.minKeyBound(partitioner), right.maxKeyBound(partitioner), partitioner); + return new Bounds(left.minKeyBound(), right.maxKeyBound()); } @SuppressWarnings("unchecked") public AbstractBounds toRowBounds() { - return (left instanceof Token) ? makeRowBounds((Token)left, (Token)right, partitioner) : (Bounds)this; + return (left instanceof Token) ? makeRowBounds((Token)left, (Token)right) : (Bounds)this; } @SuppressWarnings("unchecked") public AbstractBounds toTokenBounds() { - return (left instanceof RowPosition) ? new Bounds(((RowPosition)left).getToken(), ((RowPosition)right).getToken(), partitioner) : (Bounds)this; + return (left instanceof RowPosition) ? new Bounds(((RowPosition)left).getToken(), ((RowPosition)right).getToken()) : (Bounds)this; } public AbstractBounds withNewRight(T newRight) diff --git a/src/java/org/apache/cassandra/dht/ByteOrderedPartitioner.java b/src/java/org/apache/cassandra/dht/ByteOrderedPartitioner.java index 888ef35e9f7c..297e5a6cbcd5 100644 --- a/src/java/org/apache/cassandra/dht/ByteOrderedPartitioner.java +++ b/src/java/org/apache/cassandra/dht/ByteOrderedPartitioner.java @@ -17,14 +17,107 @@ */ package org.apache.cassandra.dht; +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.Schema; +import org.apache.cassandra.db.BufferDecoratedKey; +import org.apache.cassandra.db.DecoratedKey; +import org.apache.cassandra.db.marshal.AbstractType; +import org.apache.cassandra.db.marshal.BytesType; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.service.StorageService; +import org.apache.cassandra.utils.ByteBufferUtil; +import org.apache.cassandra.utils.FBUtilities; +import org.apache.cassandra.utils.Hex; import org.apache.cassandra.utils.ObjectSizes; +import org.apache.cassandra.utils.Pair; +import org.apache.commons.lang3.ArrayUtils; + +import java.math.BigInteger; import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; -public class ByteOrderedPartitioner extends AbstractByteOrderedPartitioner +public class ByteOrderedPartitioner implements IPartitioner { + public static final BytesToken MINIMUM = new BytesToken(ArrayUtils.EMPTY_BYTE_ARRAY); + + public static final BigInteger BYTE_MASK = new BigInteger("255"); + private static final long EMPTY_SIZE = ObjectSizes.measure(MINIMUM); + public static final ByteOrderedPartitioner instance = new ByteOrderedPartitioner(); + + public static class BytesToken extends Token + { + static final long serialVersionUID = -2630749093733680626L; + + final byte[] token; + + public BytesToken(ByteBuffer token) + { + this(ByteBufferUtil.getArray(token)); + } + + public BytesToken(byte[] token) + { + this.token = token; + } + + @Override + public String toString() + { + return Hex.bytesToHex(token); + } + + public int compareTo(Token other) + { + BytesToken o = (BytesToken) other; + return FBUtilities.compareUnsigned(token, o.token, 0, 0, token.length, o.token.length); + } + + @Override + public int hashCode() + { + final int prime = 31; + return prime + Arrays.hashCode(token); + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + return true; + if (!(obj instanceof BytesToken)) + return false; + BytesToken other = (BytesToken) obj; + + return Arrays.equals(token, other.token); + } + + @Override + public IPartitioner getPartitioner() + { + return instance; + } + + @Override + public long getHeapSize() + { + return EMPTY_SIZE + ObjectSizes.sizeOfArray(token); + } + + @Override + public Object getTokenValue() + { + return token; + } + } + public BytesToken getToken(ByteBuffer key) { if (key.remaining() == 0) @@ -32,9 +125,165 @@ public BytesToken getToken(ByteBuffer key) return new BytesToken(key); } - @Override - public long getHeapSizeOf(Token token) + public DecoratedKey decorateKey(ByteBuffer key) + { + return new BufferDecoratedKey(getToken(key), key); + } + + public BytesToken midpoint(Token lt, Token rt) + { + BytesToken ltoken = (BytesToken) lt; + BytesToken rtoken = (BytesToken) rt; + + int sigbytes = Math.max(ltoken.token.length, rtoken.token.length); + BigInteger left = bigForBytes(ltoken.token, sigbytes); + BigInteger right = bigForBytes(rtoken.token, sigbytes); + + Pair midpair = FBUtilities.midpoint(left, right, 8*sigbytes); + return new BytesToken(bytesForBig(midpair.left, sigbytes, midpair.right)); + } + + /** + * Convert a byte array containing the most significant of 'sigbytes' bytes + * representing a big-endian magnitude into a BigInteger. + */ + private BigInteger bigForBytes(byte[] bytes, int sigbytes) + { + byte[] b; + if (sigbytes != bytes.length) + { + b = new byte[sigbytes]; + System.arraycopy(bytes, 0, b, 0, bytes.length); + } else + b = bytes; + return new BigInteger(1, b); + } + + /** + * Convert a (positive) BigInteger into a byte array representing its magnitude. + * If remainder is true, an additional byte with the high order bit enabled + * will be added to the end of the array + */ + private byte[] bytesForBig(BigInteger big, int sigbytes, boolean remainder) + { + byte[] bytes = new byte[sigbytes + (remainder ? 1 : 0)]; + if (remainder) + { + // remaining bit is the most significant in the last byte + bytes[sigbytes] |= 0x80; + } + // bitmask for a single byte + for (int i = 0; i < sigbytes; i++) + { + int maskpos = 8 * (sigbytes - (i + 1)); + // apply bitmask and get byte value + bytes[i] = (byte)(big.and(BYTE_MASK.shiftLeft(maskpos)).shiftRight(maskpos).intValue() & 0xFF); + } + return bytes; + } + + public BytesToken getMinimumToken() + { + return MINIMUM; + } + + public BytesToken getRandomToken() + { + Random r = new Random(); + byte[] buffer = new byte[16]; + r.nextBytes(buffer); + return new BytesToken(buffer); + } + + private final Token.TokenFactory tokenFactory = new Token.TokenFactory() { + public ByteBuffer toByteArray(Token token) + { + BytesToken bytesToken = (BytesToken) token; + return ByteBuffer.wrap(bytesToken.token); + } + + public Token fromByteArray(ByteBuffer bytes) + { + return new BytesToken(bytes); + } + + public String toString(Token token) + { + BytesToken bytesToken = (BytesToken) token; + return Hex.bytesToHex(bytesToken.token); + } + + public void validate(String token) throws ConfigurationException + { + try + { + if (token.length() % 2 == 1) + token = "0" + token; + Hex.hexToBytes(token); + } + catch (NumberFormatException e) + { + throw new ConfigurationException("Token " + token + " contains non-hex digits"); + } + } + + public Token fromString(String string) + { + if (string.length() % 2 == 1) + string = "0" + string; + return new BytesToken(Hex.hexToBytes(string)); + } + }; + + public Token.TokenFactory getTokenFactory() + { + return tokenFactory; + } + + public boolean preservesOrder() + { + return true; + } + + public Map describeOwnership(List sortedTokens) + { + // allTokens will contain the count and be returned, sorted_ranges is shorthand for token<->token math. + Map allTokens = new HashMap(); + List> sortedRanges = new ArrayList>(sortedTokens.size()); + + // this initializes the counts to 0 and calcs the ranges in order. + Token lastToken = sortedTokens.get(sortedTokens.size() - 1); + for (Token node : sortedTokens) + { + allTokens.put(node, new Float(0.0)); + sortedRanges.add(new Range(lastToken, node)); + lastToken = node; + } + + for (String ks : Schema.instance.getKeyspaces()) + { + for (CFMetaData cfmd : Schema.instance.getKSMetaData(ks).cfMetaData().values()) + { + for (Range r : sortedRanges) + { + // Looping over every KS:CF:Range, get the splits size and add it to the count + allTokens.put(r.right, allTokens.get(r.right) + StorageService.instance.getSplits(ks, cfmd.cfName, r, 1).size()); + } + } + } + + // Sum every count up and divide count/total for the fractional ownership. + Float total = new Float(0.0); + for (Float f : allTokens.values()) + total += f; + for (Map.Entry row : allTokens.entrySet()) + allTokens.put(row.getKey(), row.getValue() / total); + + return allTokens; + } + + public AbstractType getTokenValidator() { - return EMPTY_SIZE + ObjectSizes.sizeOfArray(((BytesToken) token).token); + return BytesType.instance; } } diff --git a/src/java/org/apache/cassandra/dht/BytesToken.java b/src/java/org/apache/cassandra/dht/BytesToken.java deleted file mode 100644 index b130d36a893a..000000000000 --- a/src/java/org/apache/cassandra/dht/BytesToken.java +++ /dev/null @@ -1,79 +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.dht; - -import java.nio.ByteBuffer; -import java.util.Arrays; - -import org.apache.cassandra.utils.ByteBufferUtil; -import org.apache.cassandra.utils.FBUtilities; -import org.apache.cassandra.utils.Hex; - -public class BytesToken extends Token -{ - static final long serialVersionUID = -2630749093733680626L; - - final byte[] token; - - public BytesToken(ByteBuffer token) - { - this(ByteBufferUtil.getArray(token)); - } - - public BytesToken(byte[] token) - { - this.token = token; - } - - @Override - public String toString() - { - return Hex.bytesToHex(token); - } - - public int compareTo(Token other) - { - BytesToken o = (BytesToken) other; - return FBUtilities.compareUnsigned(token, o.token, 0, 0, token.length, o.token.length); - } - - @Override - public int hashCode() - { - final int prime = 31; - return prime + Arrays.hashCode(token); - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - return true; - if (!(obj instanceof BytesToken)) - return false; - BytesToken other = (BytesToken) obj; - - return Arrays.equals(token, other.token); - } - - @Override - public byte[] getTokenValue() - { - return token; - } -} diff --git a/src/java/org/apache/cassandra/dht/ExcludingBounds.java b/src/java/org/apache/cassandra/dht/ExcludingBounds.java index 33e48b648e88..f4f313d75ff1 100644 --- a/src/java/org/apache/cassandra/dht/ExcludingBounds.java +++ b/src/java/org/apache/cassandra/dht/ExcludingBounds.java @@ -31,14 +31,9 @@ public class ExcludingBounds> extends AbstractBounds, AbstractBounds> split(T position) assert contains(position) || left.equals(position); if (left.equals(position)) return null; - AbstractBounds lb = new Range(left, position, partitioner); - AbstractBounds rb = new ExcludingBounds(position, right, partitioner); + AbstractBounds lb = new Range(left, position); + AbstractBounds rb = new ExcludingBounds(position, right); return Pair.create(lb, rb); } @@ -90,21 +85,21 @@ protected String getClosingString() /** * Compute a bounds of keys corresponding to a given bounds of token. */ - private static ExcludingBounds makeRowBounds(Token left, Token right, IPartitioner partitioner) + private static ExcludingBounds makeRowBounds(Token left, Token right) { - return new ExcludingBounds(left.maxKeyBound(partitioner), right.minKeyBound(partitioner), partitioner); + return new ExcludingBounds(left.maxKeyBound(), right.minKeyBound()); } @SuppressWarnings("unchecked") public AbstractBounds toRowBounds() { - return (left instanceof Token) ? makeRowBounds((Token)left, (Token)right, partitioner) : (ExcludingBounds)this; + return (left instanceof Token) ? makeRowBounds((Token)left, (Token)right) : (ExcludingBounds)this; } @SuppressWarnings("unchecked") public AbstractBounds toTokenBounds() { - return (left instanceof RowPosition) ? new ExcludingBounds(((RowPosition)left).getToken(), ((RowPosition)right).getToken(), partitioner) : (ExcludingBounds)this; + return (left instanceof RowPosition) ? new ExcludingBounds(((RowPosition)left).getToken(), ((RowPosition)right).getToken()) : (ExcludingBounds)this; } public AbstractBounds withNewRight(T newRight) diff --git a/src/java/org/apache/cassandra/dht/IPartitioner.java b/src/java/org/apache/cassandra/dht/IPartitioner.java index 64515353599a..b22da66c8bd3 100644 --- a/src/java/org/apache/cassandra/dht/IPartitioner.java +++ b/src/java/org/apache/cassandra/dht/IPartitioner.java @@ -55,13 +55,6 @@ public interface IPartitioner */ public Token getToken(ByteBuffer key); - /** - * - * @param token - * @return the on-heap memory used by the provided token - */ - public long getHeapSizeOf(Token token); - /** * @return a randomly generated token */ @@ -85,6 +78,4 @@ public interface IPartitioner public Map describeOwnership(List sortedTokens); public AbstractType getTokenValidator(); - - public > R minValue(Class klass); } diff --git a/src/java/org/apache/cassandra/dht/IncludingExcludingBounds.java b/src/java/org/apache/cassandra/dht/IncludingExcludingBounds.java index e8e9c743c361..e9801ca4f2ab 100644 --- a/src/java/org/apache/cassandra/dht/IncludingExcludingBounds.java +++ b/src/java/org/apache/cassandra/dht/IncludingExcludingBounds.java @@ -21,7 +21,6 @@ import java.util.List; import org.apache.cassandra.db.RowPosition; -import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.Pair; /** @@ -31,15 +30,10 @@ public class IncludingExcludingBounds> extends Abstrac { public IncludingExcludingBounds(T left, T right) { - this(left, right, StorageService.getPartitioner()); - } - - IncludingExcludingBounds(T left, T right, IPartitioner partitioner) - { - super(left, right, partitioner); + super(left, right); // unlike a Range, an IncludingExcludingBounds may not wrap, nor have // right == left unless the right is the min token - assert left.compareTo(right) < 0 || right.isMinimum(partitioner) : "[" + left + "," + right + ")"; + assert left.compareTo(right) < 0 || right.isMinimum() : "[" + left + "," + right + ")"; } public boolean contains(T position) @@ -50,8 +44,8 @@ public boolean contains(T position) public Pair, AbstractBounds> split(T position) { assert contains(position); - AbstractBounds lb = new Bounds(left, position, partitioner); - AbstractBounds rb = new ExcludingBounds(position, right, partitioner); + AbstractBounds lb = new Bounds(left, position); + AbstractBounds rb = new ExcludingBounds(position, right); return Pair.create(lb, rb); } @@ -89,21 +83,21 @@ protected String getClosingString() /** * Compute a bounds of keys corresponding to a given bounds of token. */ - private static IncludingExcludingBounds makeRowBounds(Token left, Token right, IPartitioner partitioner) + private static IncludingExcludingBounds makeRowBounds(Token left, Token right) { - return new IncludingExcludingBounds(left.maxKeyBound(partitioner), right.minKeyBound(partitioner), partitioner); + return new IncludingExcludingBounds(left.maxKeyBound(), right.minKeyBound()); } @SuppressWarnings("unchecked") public AbstractBounds toRowBounds() { - return (left instanceof Token) ? makeRowBounds((Token)left, (Token)right, partitioner) : (IncludingExcludingBounds)this; + return (left instanceof Token) ? makeRowBounds((Token)left, (Token)right) : (IncludingExcludingBounds)this; } @SuppressWarnings("unchecked") public AbstractBounds toTokenBounds() { - return (left instanceof RowPosition) ? new IncludingExcludingBounds(((RowPosition)left).getToken(), ((RowPosition)right).getToken(), partitioner) : (IncludingExcludingBounds)this; + return (left instanceof RowPosition) ? new IncludingExcludingBounds(((RowPosition)left).getToken(), ((RowPosition)right).getToken()) : (IncludingExcludingBounds)this; } public AbstractBounds withNewRight(T newRight) diff --git a/src/java/org/apache/cassandra/dht/LocalPartitioner.java b/src/java/org/apache/cassandra/dht/LocalPartitioner.java index 1cbeba4d9c14..dfb0e7d6a8f8 100644 --- a/src/java/org/apache/cassandra/dht/LocalPartitioner.java +++ b/src/java/org/apache/cassandra/dht/LocalPartitioner.java @@ -28,11 +28,11 @@ import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.ObjectSizes; -public class LocalPartitioner extends AbstractPartitioner +public class LocalPartitioner implements IPartitioner { - private static final long EMPTY_SIZE = ObjectSizes.measure(new LocalToken(null, null)); + private static final long EMPTY_SIZE = ObjectSizes.measure(new LocalPartitioner(null).new LocalToken(null)); - private final AbstractType comparator; + final AbstractType comparator; // package-private to avoid access workarounds in embedded LocalToken. public LocalPartitioner(AbstractType comparator) { @@ -51,17 +51,12 @@ public Token midpoint(Token left, Token right) public LocalToken getMinimumToken() { - return new LocalToken(comparator, ByteBufferUtil.EMPTY_BYTE_BUFFER); + return new LocalToken(ByteBufferUtil.EMPTY_BYTE_BUFFER); } public LocalToken getToken(ByteBuffer key) { - return new LocalToken(comparator, key); - } - - public long getHeapSizeOf(Token token) - { - return EMPTY_SIZE + ObjectSizes.sizeOnHeapOf(((LocalToken) token).token); + return new LocalToken(key); } public LocalToken getRandomToken() @@ -88,4 +83,57 @@ public AbstractType getTokenValidator() { return comparator; } + + public class LocalToken extends ComparableObjectToken + { + static final long serialVersionUID = 8437543776403014875L; + + public LocalToken(ByteBuffer token) + { + super(token); + } + + @Override + public String toString() + { + return comparator.getString(token); + } + + @Override + public int compareTo(Token o) + { + assert getPartitioner() == o.getPartitioner(); + return comparator.compare(token, ((LocalToken) o).token); + } + + @Override + public int hashCode() + { + final int prime = 31; + return prime + token.hashCode(); + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + return true; + if (!(obj instanceof LocalToken)) + return false; + LocalToken other = (LocalToken) obj; + return token.equals(other.token); + } + + @Override + public IPartitioner getPartitioner() + { + return LocalPartitioner.this; + } + + @Override + public long getHeapSize() + { + return EMPTY_SIZE + ObjectSizes.sizeOnHeapOf(token); + } + } } diff --git a/src/java/org/apache/cassandra/dht/LocalToken.java b/src/java/org/apache/cassandra/dht/LocalToken.java deleted file mode 100644 index 29e98eb5f6f7..000000000000 --- a/src/java/org/apache/cassandra/dht/LocalToken.java +++ /dev/null @@ -1,46 +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.dht; - -import java.nio.ByteBuffer; - -import org.apache.cassandra.db.marshal.AbstractType; - -public class LocalToken extends ComparableObjectToken -{ - static final long serialVersionUID = 8437543776403014875L; - - private final AbstractType comparator; - - public LocalToken(AbstractType comparator, ByteBuffer token) - { - super(token); - this.comparator = comparator; - } - - @Override - public String toString() - { - return comparator.getString(token); - } - - public int compareTo(Token o) - { - return comparator.compare(token, ((LocalToken) o).token); - } -} diff --git a/src/java/org/apache/cassandra/dht/LongToken.java b/src/java/org/apache/cassandra/dht/LongToken.java deleted file mode 100644 index 8d606530856a..000000000000 --- a/src/java/org/apache/cassandra/dht/LongToken.java +++ /dev/null @@ -1,62 +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.dht; - -import com.google.common.primitives.Longs; - -public class LongToken extends Token -{ - static final long serialVersionUID = -5833580143318243006L; - - final long token; - - public LongToken(long token) - { - this.token = token; - } - - public String toString() - { - return Long.toString(token); - } - - public boolean equals(Object obj) - { - if (this == obj) - return true; - if (obj == null || this.getClass() != obj.getClass()) - return false; - - return token == (((LongToken)obj).token); - } - - public int hashCode() - { - return Longs.hashCode(token); - } - - public int compareTo(Token o) - { - return Long.compare(token, ((LongToken) o).token); - } - - public Long getTokenValue() - { - return token; - } -} diff --git a/src/java/org/apache/cassandra/dht/Murmur3Partitioner.java b/src/java/org/apache/cassandra/dht/Murmur3Partitioner.java index cf91c8651163..0ff5eeb7a5ee 100644 --- a/src/java/org/apache/cassandra/dht/Murmur3Partitioner.java +++ b/src/java/org/apache/cassandra/dht/Murmur3Partitioner.java @@ -35,16 +35,20 @@ import org.apache.cassandra.utils.MurmurHash; import org.apache.cassandra.utils.ObjectSizes; +import com.google.common.primitives.Longs; + /** * This class generates a BigIntegerToken using a Murmur3 hash. */ -public class Murmur3Partitioner extends AbstractPartitioner +public class Murmur3Partitioner implements IPartitioner { public static final LongToken MINIMUM = new LongToken(Long.MIN_VALUE); public static final long MAXIMUM = Long.MAX_VALUE; private static final int HEAP_SIZE = (int) ObjectSizes.measureDeep(MINIMUM); + public static final Murmur3Partitioner instance = new Murmur3Partitioner(); + public DecoratedKey decorateKey(ByteBuffer key) { return new BufferDecoratedKey(getToken(key), key); @@ -82,6 +86,61 @@ public LongToken getMinimumToken() return MINIMUM; } + public static class LongToken extends Token + { + static final long serialVersionUID = -5833580143318243006L; + + final long token; + + public LongToken(long token) + { + this.token = token; + } + + public String toString() + { + return Long.toString(token); + } + + public boolean equals(Object obj) + { + if (this == obj) + return true; + if (obj == null || this.getClass() != obj.getClass()) + return false; + + return token == (((LongToken)obj).token); + } + + public int hashCode() + { + return Longs.hashCode(token); + } + + public int compareTo(Token o) + { + return Long.compare(token, ((LongToken) o).token); + } + + @Override + public IPartitioner getPartitioner() + { + return instance; + } + + @Override + public long getHeapSize() + { + return HEAP_SIZE; + } + + @Override + public Object getTokenValue() + { + return token; + } + } + /** * Generate the token of a key. * Note that we need to ensure all generated token are strictly bigger than MINIMUM. @@ -98,11 +157,6 @@ public LongToken getToken(ByteBuffer key) return new LongToken(normalize(hash[0])); } - public long getHeapSizeOf(Token token) - { - return HEAP_SIZE; - } - public LongToken getRandomToken() { return new LongToken(normalize(ThreadLocalRandom.current().nextLong())); diff --git a/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java b/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java index 44d98e054f81..86ff18468f6a 100644 --- a/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java +++ b/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java @@ -35,7 +35,7 @@ import org.apache.cassandra.utils.ObjectSizes; import org.apache.cassandra.utils.Pair; -public class OrderPreservingPartitioner extends AbstractPartitioner +public class OrderPreservingPartitioner implements IPartitioner { public static final StringToken MINIMUM = new StringToken(""); @@ -43,6 +43,8 @@ public class OrderPreservingPartitioner extends AbstractPartitioner private static final long EMPTY_SIZE = ObjectSizes.measure(MINIMUM); + public static final OrderPreservingPartitioner instance = new OrderPreservingPartitioner(); + public DecoratedKey decorateKey(ByteBuffer key) { return new BufferDecoratedKey(getToken(key), key); @@ -161,6 +163,28 @@ public boolean preservesOrder() return true; } + public static class StringToken extends ComparableObjectToken + { + static final long serialVersionUID = 5464084395277974963L; + + public StringToken(String token) + { + super(token); + } + + @Override + public IPartitioner getPartitioner() + { + return instance; + } + + @Override + public long getHeapSize() + { + return EMPTY_SIZE + ObjectSizes.sizeOf(token); + } + } + public StringToken getToken(ByteBuffer key) { String skey; @@ -175,11 +199,6 @@ public StringToken getToken(ByteBuffer key) return new StringToken(skey); } - public long getHeapSizeOf(Token token) - { - return EMPTY_SIZE + ObjectSizes.sizeOf(((StringToken) token).token); - } - public Map describeOwnership(List sortedTokens) { // allTokens will contain the count and be returned, sorted_ranges is shorthand for token<->token math. diff --git a/src/java/org/apache/cassandra/dht/RandomPartitioner.java b/src/java/org/apache/cassandra/dht/RandomPartitioner.java index fa44f47ebce5..eec08b8471d0 100644 --- a/src/java/org/apache/cassandra/dht/RandomPartitioner.java +++ b/src/java/org/apache/cassandra/dht/RandomPartitioner.java @@ -22,6 +22,8 @@ import java.nio.ByteBuffer; import java.util.*; +import com.google.common.annotations.VisibleForTesting; + import org.apache.cassandra.db.BufferDecoratedKey; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.db.DecoratedKey; @@ -36,13 +38,15 @@ /** * This class generates a BigIntegerToken using MD5 hash. */ -public class RandomPartitioner extends AbstractPartitioner +public class RandomPartitioner implements IPartitioner { public static final BigInteger ZERO = new BigInteger("0"); public static final BigIntegerToken MINIMUM = new BigIntegerToken("-1"); public static final BigInteger MAXIMUM = new BigInteger("2").pow(127); - private static final int EMPTY_SIZE = (int) ObjectSizes.measureDeep(new BigIntegerToken(FBUtilities.hashToBigInteger(ByteBuffer.allocate(1)))); + private static final int HEAP_SIZE = (int) ObjectSizes.measureDeep(new BigIntegerToken(FBUtilities.hashToBigInteger(ByteBuffer.allocate(1)))); + + public static final RandomPartitioner instance = new RandomPartitioner(); public DecoratedKey decorateKey(ByteBuffer key) { @@ -122,6 +126,34 @@ public boolean preservesOrder() return false; } + public static class BigIntegerToken extends ComparableObjectToken + { + static final long serialVersionUID = -5833589141319293006L; + + public BigIntegerToken(BigInteger token) + { + super(token); + } + + // convenience method for testing + @VisibleForTesting + public BigIntegerToken(String token) { + this(new BigInteger(token)); + } + + @Override + public IPartitioner getPartitioner() + { + return instance; + } + + @Override + public long getHeapSize() + { + return HEAP_SIZE; + } + } + public BigIntegerToken getToken(ByteBuffer key) { if (key.remaining() == 0) @@ -129,11 +161,6 @@ public BigIntegerToken getToken(ByteBuffer key) return new BigIntegerToken(FBUtilities.hashToBigInteger(key)); } - public long getHeapSizeOf(Token token) - { - return EMPTY_SIZE; - } - public Map describeOwnership(List sortedTokens) { Map ownerships = new HashMap(); diff --git a/src/java/org/apache/cassandra/dht/Range.java b/src/java/org/apache/cassandra/dht/Range.java index 44b76d5c4f4a..7ab328f56454 100644 --- a/src/java/org/apache/cassandra/dht/Range.java +++ b/src/java/org/apache/cassandra/dht/Range.java @@ -22,7 +22,6 @@ import org.apache.commons.lang3.ObjectUtils; import org.apache.cassandra.db.RowPosition; -import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.Pair; /** @@ -38,12 +37,7 @@ public class Range> extends AbstractBounds implemen public Range(T left, T right) { - this(left, right, StorageService.getPartitioner()); - } - - public Range(T left, T right, IPartitioner partitioner) - { - super(left, right, partitioner); + super(left, right); } public static > boolean contains(T left, T right, T point) @@ -173,8 +167,7 @@ public Set> intersectionWith(Range that) if (!(left.compareTo(that.right) < 0 && that.left.compareTo(right) < 0)) return Collections.emptySet(); return rangeSet(new Range(ObjectUtils.max(this.left, that.left), - ObjectUtils.min(this.right, that.right), - partitioner)); + ObjectUtils.min(this.right, that.right))); } if (thiswraps && thatwraps) { @@ -202,8 +195,8 @@ private static > Set> intersectionBothWrappin { Set> intersection = new HashSet>(2); if (that.right.compareTo(first.left) > 0) - intersection.add(new Range(first.left, that.right, first.partitioner)); - intersection.add(new Range(that.left, first.right, first.partitioner)); + intersection.add(new Range(first.left, that.right)); + intersection.add(new Range(that.left, first.right)); return Collections.unmodifiableSet(intersection); } @@ -211,10 +204,10 @@ private static > Set> intersectionOneWrapping { Set> intersection = new HashSet>(2); if (other.contains(wrapping.right)) - intersection.add(new Range(other.left, wrapping.right, wrapping.partitioner)); + intersection.add(new Range(other.left, wrapping.right)); // need the extra compareto here because ranges are asymmetrical; wrapping.left _is not_ contained by the wrapping range if (other.contains(wrapping.left) && wrapping.left.compareTo(other.right) < 0) - intersection.add(new Range(wrapping.left, other.right, wrapping.partitioner)); + intersection.add(new Range(wrapping.left, other.right)); return Collections.unmodifiableSet(intersection); } @@ -225,20 +218,19 @@ public Pair, AbstractBounds> split(T position) if (position.equals(left) || position.equals(right)) return null; - AbstractBounds lb = new Range(left, position, partitioner); - AbstractBounds rb = new Range(position, right, partitioner); + AbstractBounds lb = new Range(left, position); + AbstractBounds rb = new Range(position, right); return Pair.create(lb, rb); } public List> unwrap() { - @SuppressWarnings("unchecked") - T minValue = (T) partitioner.minValue(right.getClass()); + T minValue = right.minValue(); if (!isWrapAround() || right.equals(minValue)) return Arrays.asList(this); List> unwrapped = new ArrayList>(2); - unwrapped.add(new Range(left, minValue, partitioner)); - unwrapped.add(new Range(minValue, right, partitioner)); + unwrapped.add(new Range(left, minValue)); + unwrapped.add(new Range(minValue, right)); return unwrapped; } @@ -277,9 +269,9 @@ private ArrayList> subtractContained(Range contained) ArrayList> difference = new ArrayList>(2); if (!left.equals(contained.left)) - difference.add(new Range(left, contained.left, partitioner)); + difference.add(new Range(left, contained.left)); if (!right.equals(contained.right)) - difference.add(new Range(contained.right, right, partitioner)); + difference.add(new Range(contained.right, right)); return difference; } @@ -420,8 +412,7 @@ private static > List> deoverlap(List> iter = ranges.iterator(); Range current = iter.next(); - @SuppressWarnings("unchecked") - T min = (T) current.partitioner.minValue(current.left.getClass()); + T min = (T) current.left.minValue(); while (iter.hasNext()) { // If current goes to the end of the ring, we're done @@ -460,21 +451,21 @@ private static > List> deoverlap(List makeRowRange(Token left, Token right, IPartitioner partitioner) + public static Range makeRowRange(Token left, Token right) { - return new Range(left.maxKeyBound(partitioner), right.maxKeyBound(partitioner), partitioner); + return new Range(left.maxKeyBound(), right.maxKeyBound()); } @SuppressWarnings("unchecked") public AbstractBounds toRowBounds() { - return (left instanceof Token) ? makeRowRange((Token)left, (Token)right, partitioner) : (Range)this; + return (left instanceof Token) ? makeRowRange((Token)left, (Token)right) : (Range)this; } @SuppressWarnings("unchecked") public AbstractBounds toTokenBounds() { - return (left instanceof RowPosition) ? new Range(((RowPosition)left).getToken(), ((RowPosition)right).getToken(), partitioner) : (Range)this; + return (left instanceof RowPosition) ? new Range(((RowPosition)left).getToken(), ((RowPosition)right).getToken()) : (Range)this; } public AbstractBounds withNewRight(T newRight) diff --git a/src/java/org/apache/cassandra/dht/RingPosition.java b/src/java/org/apache/cassandra/dht/RingPosition.java index fefc3b37cde0..f2d83ad93cbb 100644 --- a/src/java/org/apache/cassandra/dht/RingPosition.java +++ b/src/java/org/apache/cassandra/dht/RingPosition.java @@ -25,5 +25,7 @@ public interface RingPosition> extends Comparable { public Token getToken(); - public boolean isMinimum(IPartitioner partitioner); + public IPartitioner getPartitioner(); + public boolean isMinimum(); + public C minValue(); } diff --git a/src/java/org/apache/cassandra/dht/StringToken.java b/src/java/org/apache/cassandra/dht/StringToken.java deleted file mode 100644 index f54131341e5c..000000000000 --- a/src/java/org/apache/cassandra/dht/StringToken.java +++ /dev/null @@ -1,29 +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.dht; - - -public class StringToken extends ComparableObjectToken -{ - static final long serialVersionUID = 5464084395277974963L; - - public StringToken(String token) - { - super(token); - } -} diff --git a/src/java/org/apache/cassandra/dht/Token.java b/src/java/org/apache/cassandra/dht/Token.java index 98babf567ce2..719fd46b0373 100644 --- a/src/java/org/apache/cassandra/dht/Token.java +++ b/src/java/org/apache/cassandra/dht/Token.java @@ -72,6 +72,8 @@ public long serializedSize(Token object, TypeSizes typeSizes) } } + abstract public IPartitioner getPartitioner(); + abstract public long getHeapSize(); abstract public Object getTokenValue(); public Token getToken() @@ -79,14 +81,14 @@ public Token getToken() return this; } - public boolean isMinimum(IPartitioner partitioner) + public Token minValue() { - return this.equals(partitioner.getMinimumToken()); + return getPartitioner().getMinimumToken(); } public boolean isMinimum() { - return isMinimum(StorageService.getPartitioner()); + return this.equals(minValue()); } /* @@ -103,17 +105,12 @@ public boolean isMinimum() * Note that those are "fake" keys and should only be used for comparison * of other keys, for selection of keys when only a token is known. */ - public KeyBound minKeyBound(IPartitioner partitioner) - { - return new KeyBound(this, true); - } - public KeyBound minKeyBound() { - return minKeyBound(null); + return new KeyBound(this, true); } - public KeyBound maxKeyBound(IPartitioner partitioner) + public KeyBound maxKeyBound() { /* * For each token, we needs both minKeyBound and maxKeyBound @@ -122,16 +119,11 @@ public KeyBound maxKeyBound(IPartitioner partitioner) * simpler to associate the same value for minKeyBound and * maxKeyBound for the minimun token. */ - if (isMinimum(partitioner)) + if (isMinimum()) return minKeyBound(); return new KeyBound(this, false); } - public KeyBound maxKeyBound() - { - return maxKeyBound(StorageService.getPartitioner()); - } - @SuppressWarnings("unchecked") public > R upperBound(Class klass) { @@ -172,14 +164,19 @@ public int compareTo(RowPosition pos) return ((pos instanceof KeyBound) && !((KeyBound)pos).isMinimumBound) ? 0 : 1; } - public boolean isMinimum(IPartitioner partitioner) + public IPartitioner getPartitioner() + { + return getToken().getPartitioner(); + } + + public KeyBound minValue() { - return getToken().isMinimum(partitioner); + return getPartitioner().getMinimumToken().minKeyBound(); } public boolean isMinimum() { - return isMinimum(StorageService.getPartitioner()); + return getToken().isMinimum(); } public RowPosition.Kind kind() diff --git a/src/java/org/apache/cassandra/hadoop/AbstractColumnFamilyInputFormat.java b/src/java/org/apache/cassandra/hadoop/AbstractColumnFamilyInputFormat.java index 83685191efc0..f4ad40f7d320 100644 --- a/src/java/org/apache/cassandra/hadoop/AbstractColumnFamilyInputFormat.java +++ b/src/java/org/apache/cassandra/hadoop/AbstractColumnFamilyInputFormat.java @@ -150,14 +150,12 @@ public List getSplits(JobContext context) throws IOException if (jobKeyRange.end_token != null) throw new IllegalArgumentException("only start_key supported"); jobRange = new Range<>(partitioner.getToken(jobKeyRange.start_key), - partitioner.getToken(jobKeyRange.end_key), - partitioner); + partitioner.getToken(jobKeyRange.end_key)); } else if (jobKeyRange.start_token != null) { jobRange = new Range<>(partitioner.getTokenFactory().fromString(jobKeyRange.start_token), - partitioner.getTokenFactory().fromString(jobKeyRange.end_token), - partitioner); + partitioner.getTokenFactory().fromString(jobKeyRange.end_token)); } else { @@ -175,8 +173,7 @@ else if (jobKeyRange.start_token != null) else { Range dhtRange = new Range(partitioner.getTokenFactory().fromString(range.start_token), - partitioner.getTokenFactory().fromString(range.end_token), - partitioner); + partitioner.getTokenFactory().fromString(range.end_token)); if (dhtRange.intersects(jobRange)) { @@ -252,7 +249,7 @@ public List call() throws Exception { Token left = factory.fromString(subSplit.getStart_token()); Token right = factory.fromString(subSplit.getEnd_token()); - Range range = new Range(left, right, partitioner); + Range range = new Range(left, right); List> ranges = range.isWrapAround() ? range.unwrap() : ImmutableList.of(range); for (Range subrange : ranges) { diff --git a/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java b/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java index d4b4eab1a3ae..43cd2c0e7f28 100644 --- a/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java +++ b/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java @@ -272,7 +272,7 @@ public void close() throws IOException public static class Builder { private File directory; - private IPartitioner partitioner = new Murmur3Partitioner(); + private IPartitioner partitioner = Murmur3Partitioner.instance; protected SSTableFormat.Type formatType = null; diff --git a/src/java/org/apache/cassandra/io/sstable/format/big/BigTableScanner.java b/src/java/org/apache/cassandra/io/sstable/format/big/BigTableScanner.java index db5535344ecf..7e3c877fdd21 100644 --- a/src/java/org/apache/cassandra/io/sstable/format/big/BigTableScanner.java +++ b/src/java/org/apache/cassandra/io/sstable/format/big/BigTableScanner.java @@ -76,16 +76,16 @@ public BigTableScanner(SSTableReader sstable, DataRange dataRange, RateLimiter l this.rowIndexEntrySerializer = sstable.descriptor.version.getSSTableFormat().getIndexSerializer(sstable.metadata); List> boundsList = new ArrayList<>(2); - if (dataRange.isWrapAround() && !dataRange.stopKey().isMinimum(sstable.partitioner)) + if (dataRange.isWrapAround() && !dataRange.stopKey().isMinimum()) { // split the wrapping range into two parts: 1) the part that starts at the beginning of the sstable, and // 2) the part that comes before the wrap-around - boundsList.add(new Bounds<>(sstable.partitioner.getMinimumToken().minKeyBound(), dataRange.stopKey(), sstable.partitioner)); - boundsList.add(new Bounds<>(dataRange.startKey(), sstable.partitioner.getMinimumToken().maxKeyBound(), sstable.partitioner)); + boundsList.add(new Bounds<>(sstable.partitioner.getMinimumToken().minKeyBound(), dataRange.stopKey())); + boundsList.add(new Bounds<>(dataRange.startKey(), sstable.partitioner.getMinimumToken().maxKeyBound())); } else { - boundsList.add(new Bounds<>(dataRange.startKey(), dataRange.stopKey(), sstable.partitioner)); + boundsList.add(new Bounds<>(dataRange.startKey(), dataRange.stopKey())); } this.rangeIterator = boundsList.iterator(); } @@ -109,16 +109,14 @@ public BigTableScanner(SSTableReader sstable, Collection> tokenRang List> normalized = Range.normalize(tokenRanges); List> boundsList = new ArrayList<>(normalized.size()); for (Range range : normalized) - boundsList.add(new Range(range.left.maxKeyBound(sstable.partitioner), - range.right.maxKeyBound(sstable.partitioner), - sstable.partitioner)); + boundsList.add(new Range(range.left.maxKeyBound(), range.right.maxKeyBound())); this.rangeIterator = boundsList.iterator(); } private void seekToCurrentRangeStart() { - if (currentRange.left.isMinimum(sstable.partitioner)) + if (currentRange.left.isMinimum()) return; long indexPosition = sstable.getIndexScanPosition(currentRange.left); diff --git a/src/java/org/apache/cassandra/service/StorageProxy.java b/src/java/org/apache/cassandra/service/StorageProxy.java index b577931955e8..93bf5717d817 100644 --- a/src/java/org/apache/cassandra/service/StorageProxy.java +++ b/src/java/org/apache/cassandra/service/StorageProxy.java @@ -1882,7 +1882,7 @@ public boolean isLatencyForSnitch() static > List> getRestrictedRanges(final AbstractBounds queryRange) { // special case for bounds containing exactly 1 (non-minimum) token - if (queryRange instanceof Bounds && queryRange.left.equals(queryRange.right) && !queryRange.left.isMinimum(StorageService.getPartitioner())) + if (queryRange instanceof Bounds && queryRange.left.equals(queryRange.right) && !queryRange.left.isMinimum()) { return Collections.singletonList(queryRange); } diff --git a/src/java/org/apache/cassandra/thrift/CassandraServer.java b/src/java/org/apache/cassandra/thrift/CassandraServer.java index b7a1f7fc4ae0..dd461f3c5633 100644 --- a/src/java/org/apache/cassandra/thrift/CassandraServer.java +++ b/src/java/org/apache/cassandra/thrift/CassandraServer.java @@ -1167,12 +1167,12 @@ public List get_range_slices(ColumnParent column_parent, SlicePredicat Token.TokenFactory tokenFactory = p.getTokenFactory(); Token left = tokenFactory.fromString(range.start_token); Token right = tokenFactory.fromString(range.end_token); - bounds = Range.makeRowRange(left, right, p); + bounds = Range.makeRowRange(left, right); } else { RowPosition end = range.end_key == null - ? p.getTokenFactory().fromString(range.end_token).maxKeyBound(p) + ? p.getTokenFactory().fromString(range.end_token).maxKeyBound() : RowPosition.ForKey.get(range.end_key, p); bounds = new Bounds(RowPosition.ForKey.get(range.start_key, p), end); } @@ -1255,12 +1255,12 @@ public List get_paged_slice(String column_family, KeyRange range, Byte Token.TokenFactory tokenFactory = p.getTokenFactory(); Token left = tokenFactory.fromString(range.start_token); Token right = tokenFactory.fromString(range.end_token); - bounds = Range.makeRowRange(left, right, p); + bounds = Range.makeRowRange(left, right); } else { RowPosition end = range.end_key == null - ? p.getTokenFactory().fromString(range.end_token).maxKeyBound(p) + ? p.getTokenFactory().fromString(range.end_token).maxKeyBound() : RowPosition.ForKey.get(range.end_key, p); bounds = new Bounds(RowPosition.ForKey.get(range.start_key, p), end); } diff --git a/src/java/org/apache/cassandra/thrift/ThriftValidation.java b/src/java/org/apache/cassandra/thrift/ThriftValidation.java index 32da1c8c6b5b..242b5cb7cbac 100644 --- a/src/java/org/apache/cassandra/thrift/ThriftValidation.java +++ b/src/java/org/apache/cassandra/thrift/ThriftValidation.java @@ -522,7 +522,7 @@ public static void validateKeyRange(CFMetaData metadata, ByteBuffer superColumn, { Token startToken = p.getToken(range.start_key); Token endToken = p.getToken(range.end_key); - if (startToken.compareTo(endToken) > 0 && !endToken.isMinimum(p)) + if (startToken.compareTo(endToken) > 0 && !endToken.isMinimum()) { if (p.preservesOrder()) throw new org.apache.cassandra.exceptions.InvalidRequestException("start key must sort before (or equal to) finish key in your partitioner!"); @@ -533,7 +533,7 @@ public static void validateKeyRange(CFMetaData metadata, ByteBuffer superColumn, else if (range.start_key != null && range.end_token != null) { // start_token/end_token can wrap, but key/token should not - RowPosition stop = p.getTokenFactory().fromString(range.end_token).maxKeyBound(p); + RowPosition stop = p.getTokenFactory().fromString(range.end_token).maxKeyBound(); if (RowPosition.ForKey.get(range.start_key, p).compareTo(stop) > 0 && !stop.isMinimum()) throw new org.apache.cassandra.exceptions.InvalidRequestException("Start key's token sorts after end token"); } diff --git a/src/java/org/apache/cassandra/tools/BulkLoader.java b/src/java/org/apache/cassandra/tools/BulkLoader.java index ea388a152c00..8e7e0e9c2b39 100644 --- a/src/java/org/apache/cassandra/tools/BulkLoader.java +++ b/src/java/org/apache/cassandra/tools/BulkLoader.java @@ -300,7 +300,7 @@ public void init(String keyspace) for (TokenRange tr : client.describe_ring(keyspace)) { - Range range = new Range<>(tkFactory.fromString(tr.start_token), tkFactory.fromString(tr.end_token), getPartitioner()); + Range range = new Range<>(tkFactory.fromString(tr.start_token), tkFactory.fromString(tr.end_token)); for (String ep : tr.endpoints) { addRangeForEndpoint(range, InetAddress.getByName(ep)); diff --git a/src/java/org/apache/cassandra/utils/FBUtilities.java b/src/java/org/apache/cassandra/utils/FBUtilities.java index 470770ab2061..acd19ad478da 100644 --- a/src/java/org/apache/cassandra/utils/FBUtilities.java +++ b/src/java/org/apache/cassandra/utils/FBUtilities.java @@ -37,7 +37,6 @@ import com.google.common.base.Joiner; import com.google.common.collect.AbstractIterator; -import org.apache.cassandra.io.util.FileUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -52,6 +51,7 @@ import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.IVersionedSerializer; import org.apache.cassandra.io.util.DataOutputBuffer; +import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.io.util.IAllocator; import org.apache.cassandra.net.AsyncOneResponse; import org.apache.thrift.TBase; @@ -413,7 +413,7 @@ public static IPartitioner newPartitioner(String partitionerClassName) throws Co { if (!partitionerClassName.contains(".")) partitionerClassName = "org.apache.cassandra.dht." + partitionerClassName; - return FBUtilities.construct(partitionerClassName, "partitioner"); + return FBUtilities.instanceOrConstruct(partitionerClassName, "partitioner"); } public static IAllocator newOffHeapAllocator(String offheap_allocator) throws ConfigurationException @@ -459,6 +459,27 @@ public static Class classForName(String classname, String readable) throw } } + /** + * Constructs an instance of the given class, which must have a no-arg or default constructor. + * @param classname Fully qualified classname. + * @param readable Descriptive noun for the role the class plays. + * @throws ConfigurationException If the class cannot be found. + */ + public static T instanceOrConstruct(String classname, String readable) throws ConfigurationException + { + Class cls = FBUtilities.classForName(classname, readable); + try + { + Field instance = cls.getField("instance"); + return cls.cast(instance.get(null)); + } + catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) + { + // Could not get instance field. Try instantiating. + return construct(cls, classname, readable); + } + } + /** * Constructs an instance of the given class, which must have a no-arg or default constructor. * @param classname Fully qualified classname. @@ -468,6 +489,11 @@ public static Class classForName(String classname, String readable) throw public static T construct(String classname, String readable) throws ConfigurationException { Class cls = FBUtilities.classForName(classname, readable); + return construct(cls, classname, readable); + } + + private static T construct(Class cls, String classname, String readable) throws ConfigurationException + { try { return cls.newInstance(); diff --git a/src/java/org/apache/cassandra/utils/MerkleTree.java b/src/java/org/apache/cassandra/utils/MerkleTree.java index 8e6d5c0a1271..394b12a0ae69 100644 --- a/src/java/org/apache/cassandra/utils/MerkleTree.java +++ b/src/java/org/apache/cassandra/utils/MerkleTree.java @@ -108,7 +108,7 @@ public MerkleTree deserialize(DataInput in, int version) throws IOException // full range Token left = Token.serializer.deserialize(in); Token right = Token.serializer.deserialize(in); - Range fullRange = new Range<>(left, right, partitioner); + Range fullRange = new Range<>(left, right); MerkleTree mt = new MerkleTree(partitioner, fullRange, hashdepth, maxsize); mt.size = size; diff --git a/test/unit/org/apache/cassandra/Util.java b/test/unit/org/apache/cassandra/Util.java index 2d5e6fc36a51..cdb7ac6b913f 100644 --- a/test/unit/org/apache/cassandra/Util.java +++ b/test/unit/org/apache/cassandra/Util.java @@ -45,6 +45,7 @@ import org.apache.cassandra.db.filter.NamesQueryFilter; import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.dht.*; +import org.apache.cassandra.dht.RandomPartitioner.BigIntegerToken; import org.apache.cassandra.gms.ApplicationState; import org.apache.cassandra.gms.Gossiper; import org.apache.cassandra.gms.VersionedValue; diff --git a/test/unit/org/apache/cassandra/db/CleanupTest.java b/test/unit/org/apache/cassandra/db/CleanupTest.java index 5d2217be3ee1..81f7d41a76b4 100644 --- a/test/unit/org/apache/cassandra/db/CleanupTest.java +++ b/test/unit/org/apache/cassandra/db/CleanupTest.java @@ -39,7 +39,7 @@ import org.apache.cassandra.db.columniterator.IdentityQueryFilter; import org.apache.cassandra.db.compaction.CompactionManager; import org.apache.cassandra.db.index.SecondaryIndex; -import org.apache.cassandra.dht.BytesToken; +import org.apache.cassandra.dht.ByteOrderedPartitioner.BytesToken; import org.apache.cassandra.dht.Range; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.sstable.format.SSTableReader; diff --git a/test/unit/org/apache/cassandra/db/RowCacheTest.java b/test/unit/org/apache/cassandra/db/RowCacheTest.java index 4bed2add1a65..7d5799a7cd4e 100644 --- a/test/unit/org/apache/cassandra/db/RowCacheTest.java +++ b/test/unit/org/apache/cassandra/db/RowCacheTest.java @@ -36,7 +36,7 @@ import org.apache.cassandra.db.filter.QueryFilter; import org.apache.cassandra.db.marshal.IntegerType; import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.dht.BytesToken; +import org.apache.cassandra.dht.ByteOrderedPartitioner.BytesToken; import org.apache.cassandra.locator.TokenMetadata; import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.service.CacheService; diff --git a/test/unit/org/apache/cassandra/db/SystemKeyspaceTest.java b/test/unit/org/apache/cassandra/db/SystemKeyspaceTest.java index 3eebe98713b6..b66a0bd398e6 100644 --- a/test/unit/org/apache/cassandra/db/SystemKeyspaceTest.java +++ b/test/unit/org/apache/cassandra/db/SystemKeyspaceTest.java @@ -31,7 +31,7 @@ import org.junit.Test; -import org.apache.cassandra.dht.BytesToken; +import org.apache.cassandra.dht.ByteOrderedPartitioner.BytesToken; import org.apache.cassandra.dht.Token; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; diff --git a/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java b/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java index fffc310e0fbc..87e43151a764 100644 --- a/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java @@ -46,20 +46,14 @@ import org.apache.cassandra.db.DecoratedKey; import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.db.Mutation; -import org.apache.cassandra.dht.BytesToken; +import org.apache.cassandra.dht.ByteOrderedPartitioner.BytesToken; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; -import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.sstable.SSTableIdentityIterator; import org.apache.cassandra.service.ActiveRepairService; -import org.apache.cassandra.io.sstable.metadata.MetadataCollector; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.ByteBufferUtil; -import org.junit.After; -import org.junit.BeforeClass; -import org.junit.Test; - import com.google.common.collect.Iterables; public class AntiCompactionTest diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java index cf3bb32edc1b..faf380888ef5 100644 --- a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java @@ -35,7 +35,7 @@ import org.apache.cassandra.db.filter.QueryFilter; import org.apache.cassandra.db.marshal.BytesType; import org.apache.cassandra.db.marshal.LongType; -import org.apache.cassandra.dht.BytesToken; +import org.apache.cassandra.dht.ByteOrderedPartitioner.BytesToken; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; import org.apache.cassandra.exceptions.ConfigurationException; diff --git a/test/unit/org/apache/cassandra/dht/ByteOrderedPartitionerTest.java b/test/unit/org/apache/cassandra/dht/ByteOrderedPartitionerTest.java index cfe5f525118e..e70e0861365b 100644 --- a/test/unit/org/apache/cassandra/dht/ByteOrderedPartitionerTest.java +++ b/test/unit/org/apache/cassandra/dht/ByteOrderedPartitionerTest.java @@ -22,6 +22,6 @@ public class ByteOrderedPartitionerTest extends PartitionerTestCase { public void initPartitioner() { - partitioner = new ByteOrderedPartitioner(); + partitioner = ByteOrderedPartitioner.instance; } } diff --git a/test/unit/org/apache/cassandra/dht/KeyCollisionTest.java b/test/unit/org/apache/cassandra/dht/KeyCollisionTest.java index aaa3bc99f88d..e8a5ee2883ce 100644 --- a/test/unit/org/apache/cassandra/dht/KeyCollisionTest.java +++ b/test/unit/org/apache/cassandra/dht/KeyCollisionTest.java @@ -22,6 +22,7 @@ import java.nio.ByteBuffer; import java.util.*; +import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.apache.cassandra.SchemaLoader; @@ -48,13 +49,15 @@ */ public class KeyCollisionTest { - IPartitioner oldPartitioner; + static IPartitioner oldPartitioner; private static final String KEYSPACE1 = "KeyCollisionTest1"; private static final String CF = "Standard1"; @BeforeClass public static void defineSchema() throws ConfigurationException { + oldPartitioner = DatabaseDescriptor.getPartitioner(); + DatabaseDescriptor.setPartitioner(LengthPartitioner.instance); SchemaLoader.prepareServer(); SchemaLoader.createKeyspace(KEYSPACE1, SimpleStrategy.class, @@ -62,13 +65,8 @@ public static void defineSchema() throws ConfigurationException SchemaLoader.standardCFMD(KEYSPACE1, CF)); } - protected void setUp() - { - oldPartitioner = DatabaseDescriptor.getPartitioner(); - DatabaseDescriptor.setPartitioner(new LengthPartitioner()); - } - - protected void tearDown() + @AfterClass + public static void tearDown() { DatabaseDescriptor.setPartitioner(oldPartitioner); } @@ -80,14 +78,14 @@ public void testGetSliceWithCollision() throws Exception ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF); cfs.clearUnsafe(); - insert("k1", "k2", "k3"); // token = 2 + insert("k1", "k2", "kq"); // token = 2, kq ordered after row below lexicographically insert("key1", "key2", "key3"); // token = 4 insert("longKey1", "longKey2"); // token = 8 List rows = cfs.getRangeSlice(new Bounds(dk("k2"), dk("key2")), null, new IdentityQueryFilter(), 10000); assert rows.size() == 4 : "Expecting 4 keys, got " + rows.size(); assert rows.get(0).key.getKey().equals(ByteBufferUtil.bytes("k2")); - assert rows.get(1).key.getKey().equals(ByteBufferUtil.bytes("k3")); + assert rows.get(1).key.getKey().equals(ByteBufferUtil.bytes("kq")); assert rows.get(2).key.getKey().equals(ByteBufferUtil.bytes("key1")); assert rows.get(3).key.getKey().equals(ByteBufferUtil.bytes("key2")); } @@ -106,11 +104,40 @@ private void insert(String key) rm.applyUnsafe(); } - public static class LengthPartitioner extends AbstractPartitioner + static class BigIntegerToken extends ComparableObjectToken + { + private static final long serialVersionUID = 1L; + + public BigIntegerToken(BigInteger token) + { + super(token); + } + + // convenience method for testing + public BigIntegerToken(String token) { + this(new BigInteger(token)); + } + + @Override + public IPartitioner getPartitioner() + { + return LengthPartitioner.instance; + } + + @Override + public long getHeapSize() + { + return 0; + } + } + + public static class LengthPartitioner implements IPartitioner { public static final BigInteger ZERO = new BigInteger("0"); public static final BigIntegerToken MINIMUM = new BigIntegerToken("-1"); + public static LengthPartitioner instance = new LengthPartitioner(); + public DecoratedKey decorateKey(ByteBuffer key) { return new BufferDecoratedKey(getToken(key), key); @@ -179,12 +206,6 @@ public BigIntegerToken getToken(ByteBuffer key) return new BigIntegerToken(BigInteger.valueOf(key.remaining())); } - @Override - public long getHeapSizeOf(Token token) - { - return 0; - } - public Map describeOwnership(List sortedTokens) { // allTokens will contain the count and be returned, sorted_ranges is shorthand for token<->token math. diff --git a/test/unit/org/apache/cassandra/dht/Murmur3PartitionerTest.java b/test/unit/org/apache/cassandra/dht/Murmur3PartitionerTest.java index 71c7e896195c..9f330d3bf7ed 100644 --- a/test/unit/org/apache/cassandra/dht/Murmur3PartitionerTest.java +++ b/test/unit/org/apache/cassandra/dht/Murmur3PartitionerTest.java @@ -24,7 +24,7 @@ public class Murmur3PartitionerTest extends PartitionerTestCase { public void initPartitioner() { - partitioner = new Murmur3Partitioner(); + partitioner = Murmur3Partitioner.instance; } @Override diff --git a/test/unit/org/apache/cassandra/dht/OrderPreservingPartitionerTest.java b/test/unit/org/apache/cassandra/dht/OrderPreservingPartitionerTest.java index aa4326526981..397d7cc9a016 100644 --- a/test/unit/org/apache/cassandra/dht/OrderPreservingPartitionerTest.java +++ b/test/unit/org/apache/cassandra/dht/OrderPreservingPartitionerTest.java @@ -35,7 +35,7 @@ public static void cleanStatesFromPreviousTest() public void initPartitioner() { - partitioner = new OrderPreservingPartitioner(); + partitioner = OrderPreservingPartitioner.instance; } @Test diff --git a/test/unit/org/apache/cassandra/dht/PartitionerTestCase.java b/test/unit/org/apache/cassandra/dht/PartitionerTestCase.java index db0349d12f04..8080a0c0d3cf 100644 --- a/test/unit/org/apache/cassandra/dht/PartitionerTestCase.java +++ b/test/unit/org/apache/cassandra/dht/PartitionerTestCase.java @@ -21,6 +21,7 @@ import java.nio.ByteBuffer; import java.util.*; +import org.apache.cassandra.service.StorageService; import org.junit.Before; import org.junit.Test; @@ -122,6 +123,10 @@ public void testTokenFactoryStrings() @Test public void testDescribeOwnership() { + // This call initializes StorageService, needed to populate the keyspaces. + // TODO: This points to potential problems in the initialization sequence. Should be solved by CASSANDRA-7837. + StorageService.getPartitioner(); + try { testDescribeOwnershipWith(0); diff --git a/test/unit/org/apache/cassandra/dht/RandomPartitionerTest.java b/test/unit/org/apache/cassandra/dht/RandomPartitionerTest.java index 09a1d65182db..6b22617d69ae 100644 --- a/test/unit/org/apache/cassandra/dht/RandomPartitionerTest.java +++ b/test/unit/org/apache/cassandra/dht/RandomPartitionerTest.java @@ -24,6 +24,6 @@ public class RandomPartitionerTest extends PartitionerTestCase { public void initPartitioner() { - partitioner = new RandomPartitioner(); + partitioner = RandomPartitioner.instance; } } diff --git a/test/unit/org/apache/cassandra/dht/RangeTest.java b/test/unit/org/apache/cassandra/dht/RangeTest.java index 906396c787b6..d93356ab94f2 100644 --- a/test/unit/org/apache/cassandra/dht/RangeTest.java +++ b/test/unit/org/apache/cassandra/dht/RangeTest.java @@ -22,12 +22,15 @@ import java.util.HashSet; import java.util.List; import java.util.Set; + import static java.util.Arrays.asList; import org.apache.commons.lang3.StringUtils; import org.junit.Test; - import org.apache.cassandra.db.RowPosition; +import org.apache.cassandra.dht.RandomPartitioner.BigIntegerToken; +import org.apache.cassandra.dht.ByteOrderedPartitioner.BytesToken; + import static org.apache.cassandra.Util.range; @@ -36,7 +39,7 @@ public class RangeTest @Test public void testContains() { - Range left = new Range(new BigIntegerToken("0"), new BigIntegerToken("100")); + Range left = new Range(new BigIntegerToken("0"), new BigIntegerToken("100")); assert !left.contains(new BigIntegerToken("0")); assert left.contains(new BigIntegerToken("10")); assert left.contains(new BigIntegerToken("100")); @@ -46,13 +49,13 @@ public void testContains() @Test public void testContainsWrapping() { - Range range = new Range(new BigIntegerToken("0"), new BigIntegerToken("0")); + Range range = new Range(new BigIntegerToken("0"), new BigIntegerToken("0")); assert range.contains(new BigIntegerToken("0")); assert range.contains(new BigIntegerToken("10")); assert range.contains(new BigIntegerToken("100")); assert range.contains(new BigIntegerToken("101")); - range = new Range(new BigIntegerToken("100"), new BigIntegerToken("0")); + range = new Range(new BigIntegerToken("100"), new BigIntegerToken("0")); assert range.contains(new BigIntegerToken("0")); assert !range.contains(new BigIntegerToken("1")); assert !range.contains(new BigIntegerToken("100")); @@ -62,10 +65,10 @@ public void testContainsWrapping() @Test public void testContainsRange() { - Range one = new Range(new BigIntegerToken("2"), new BigIntegerToken("10")); - Range two = new Range(new BigIntegerToken("2"), new BigIntegerToken("5")); - Range thr = new Range(new BigIntegerToken("5"), new BigIntegerToken("10")); - Range fou = new Range(new BigIntegerToken("10"), new BigIntegerToken("12")); + Range one = new Range(new BigIntegerToken("2"), new BigIntegerToken("10")); + Range two = new Range(new BigIntegerToken("2"), new BigIntegerToken("5")); + Range thr = new Range(new BigIntegerToken("5"), new BigIntegerToken("10")); + Range fou = new Range(new BigIntegerToken("10"), new BigIntegerToken("12")); assert one.contains(two); assert one.contains(thr); @@ -87,11 +90,11 @@ public void testContainsRange() @Test public void testContainsRangeWrapping() { - Range one = new Range(new BigIntegerToken("10"), new BigIntegerToken("2")); - Range two = new Range(new BigIntegerToken("5"), new BigIntegerToken("3")); - Range thr = new Range(new BigIntegerToken("10"), new BigIntegerToken("12")); - Range fou = new Range(new BigIntegerToken("2"), new BigIntegerToken("6")); - Range fiv = new Range(new BigIntegerToken("0"), new BigIntegerToken("0")); + Range one = new Range(new BigIntegerToken("10"), new BigIntegerToken("2")); + Range two = new Range(new BigIntegerToken("5"), new BigIntegerToken("3")); + Range thr = new Range(new BigIntegerToken("10"), new BigIntegerToken("12")); + Range fou = new Range(new BigIntegerToken("2"), new BigIntegerToken("6")); + Range fiv = new Range(new BigIntegerToken("0"), new BigIntegerToken("0")); assert !one.contains(two); assert one.contains(thr); @@ -118,12 +121,12 @@ public void testContainsRangeWrapping() @Test public void testContainsRangeOneWrapping() { - Range wrap1 = new Range(new BigIntegerToken("0"), new BigIntegerToken("0")); - Range wrap2 = new Range(new BigIntegerToken("10"), new BigIntegerToken("2")); + Range wrap1 = new Range(new BigIntegerToken("0"), new BigIntegerToken("0")); + Range wrap2 = new Range(new BigIntegerToken("10"), new BigIntegerToken("2")); - Range nowrap1 = new Range(new BigIntegerToken("0"), new BigIntegerToken("2")); - Range nowrap2 = new Range(new BigIntegerToken("2"), new BigIntegerToken("10")); - Range nowrap3 = new Range(new BigIntegerToken("10"), new BigIntegerToken("100")); + Range nowrap1 = new Range(new BigIntegerToken("0"), new BigIntegerToken("2")); + Range nowrap2 = new Range(new BigIntegerToken("2"), new BigIntegerToken("10")); + Range nowrap3 = new Range(new BigIntegerToken("10"), new BigIntegerToken("100")); assert wrap1.contains(nowrap1); assert wrap1.contains(nowrap2); @@ -137,10 +140,10 @@ public void testContainsRangeOneWrapping() @Test public void testIntersects() { - Range all = new Range(new BigIntegerToken("0"), new BigIntegerToken("0")); // technically, this is a wrapping range - Range one = new Range(new BigIntegerToken("2"), new BigIntegerToken("10")); - Range two = new Range(new BigIntegerToken("0"), new BigIntegerToken("8")); - Range not = new Range(new BigIntegerToken("10"), new BigIntegerToken("12")); + Range all = new Range(new BigIntegerToken("0"), new BigIntegerToken("0")); // technically, this is a wrapping range + Range one = new Range(new BigIntegerToken("2"), new BigIntegerToken("10")); + Range two = new Range(new BigIntegerToken("0"), new BigIntegerToken("8")); + Range not = new Range(new BigIntegerToken("10"), new BigIntegerToken("12")); assert all.intersects(one); assert all.intersects(two); @@ -158,12 +161,12 @@ public void testIntersects() @Test public void testIntersectsWrapping() { - Range onewrap = new Range(new BigIntegerToken("10"), new BigIntegerToken("2")); - Range onecomplement = new Range(onewrap.right, onewrap.left); - Range onestartswith = new Range(onewrap.left, new BigIntegerToken("12")); - Range oneendswith = new Range(new BigIntegerToken("1"), onewrap.right); - Range twowrap = new Range(new BigIntegerToken("5"), new BigIntegerToken("3")); - Range not = new Range(new BigIntegerToken("2"), new BigIntegerToken("6")); + Range onewrap = new Range(new BigIntegerToken("10"), new BigIntegerToken("2")); + Range onecomplement = new Range(onewrap.right, onewrap.left); + Range onestartswith = new Range(onewrap.left, new BigIntegerToken("12")); + Range oneendswith = new Range(new BigIntegerToken("1"), onewrap.right); + Range twowrap = new Range(new BigIntegerToken("5"), new BigIntegerToken("3")); + Range not = new Range(new BigIntegerToken("2"), new BigIntegerToken("6")); assert !onewrap.intersects(onecomplement); assert onewrap.intersects(onestartswith); @@ -179,20 +182,21 @@ public void testIntersectsWrapping() assert not.intersects(twowrap); } - static > void assertIntersection(Range one, Range two, Range ... ranges) + @SafeVarargs + static > void assertIntersection(Range one, Range two, Range ... ranges) { Set> correct = Range.rangeSet(ranges); - Set result1 = one.intersectionWith(two); + Set> result1 = one.intersectionWith(two); assert result1.equals(correct) : String.format("%s != %s", StringUtils.join(result1, ","), StringUtils.join(correct, ",")); - Set result2 = two.intersectionWith(one); + Set> result2 = two.intersectionWith(one); assert result2.equals(correct) : String.format("%s != %s", StringUtils.join(result2, ","), StringUtils.join(correct, ",")); } - private void assertNoIntersection(Range wraps1, Range nowrap3) + private void assertNoIntersection(Range wraps1, Range nowrap3) { assertIntersection(wraps1, nowrap3); } @@ -200,11 +204,11 @@ private void assertNoIntersection(Range wraps1, Range nowrap3) @Test public void testIntersectionWithAll() { - Range all0 = new Range(new BigIntegerToken("0"), new BigIntegerToken("0")); - Range all10 = new Range(new BigIntegerToken("10"), new BigIntegerToken("10")); - Range all100 = new Range(new BigIntegerToken("100"), new BigIntegerToken("100")); - Range all1000 = new Range(new BigIntegerToken("1000"), new BigIntegerToken("1000")); - Range wraps = new Range(new BigIntegerToken("100"), new BigIntegerToken("10")); + Range all0 = new Range(new BigIntegerToken("0"), new BigIntegerToken("0")); + Range all10 = new Range(new BigIntegerToken("10"), new BigIntegerToken("10")); + Range all100 = new Range(new BigIntegerToken("100"), new BigIntegerToken("100")); + Range all1000 = new Range(new BigIntegerToken("1000"), new BigIntegerToken("1000")); + Range wraps = new Range(new BigIntegerToken("100"), new BigIntegerToken("10")); assertIntersection(all0, wraps, wraps); assertIntersection(all10, wraps, wraps); @@ -215,12 +219,12 @@ public void testIntersectionWithAll() @Test public void testIntersectionContains() { - Range wraps1 = new Range(new BigIntegerToken("100"), new BigIntegerToken("10")); - Range wraps2 = new Range(new BigIntegerToken("90"), new BigIntegerToken("20")); - Range wraps3 = new Range(new BigIntegerToken("90"), new BigIntegerToken("0")); - Range nowrap1 = new Range(new BigIntegerToken("100"), new BigIntegerToken("110")); - Range nowrap2 = new Range(new BigIntegerToken("0"), new BigIntegerToken("10")); - Range nowrap3 = new Range(new BigIntegerToken("0"), new BigIntegerToken("9")); + Range wraps1 = new Range(new BigIntegerToken("100"), new BigIntegerToken("10")); + Range wraps2 = new Range(new BigIntegerToken("90"), new BigIntegerToken("20")); + Range wraps3 = new Range(new BigIntegerToken("90"), new BigIntegerToken("0")); + Range nowrap1 = new Range(new BigIntegerToken("100"), new BigIntegerToken("110")); + Range nowrap2 = new Range(new BigIntegerToken("0"), new BigIntegerToken("10")); + Range nowrap3 = new Range(new BigIntegerToken("0"), new BigIntegerToken("9")); assertIntersection(wraps1, wraps2, wraps1); assertIntersection(wraps3, wraps2, wraps3); @@ -238,11 +242,11 @@ public void testIntersectionContains() @Test public void testNoIntersection() { - Range wraps1 = new Range(new BigIntegerToken("100"), new BigIntegerToken("10")); - Range wraps2 = new Range(new BigIntegerToken("100"), new BigIntegerToken("0")); - Range nowrap1 = new Range(new BigIntegerToken("0"), new BigIntegerToken("100")); - Range nowrap2 = new Range(new BigIntegerToken("100"), new BigIntegerToken("200")); - Range nowrap3 = new Range(new BigIntegerToken("10"), new BigIntegerToken("100")); + Range wraps1 = new Range(new BigIntegerToken("100"), new BigIntegerToken("10")); + Range wraps2 = new Range(new BigIntegerToken("100"), new BigIntegerToken("0")); + Range nowrap1 = new Range(new BigIntegerToken("0"), new BigIntegerToken("100")); + Range nowrap2 = new Range(new BigIntegerToken("100"), new BigIntegerToken("200")); + Range nowrap3 = new Range(new BigIntegerToken("10"), new BigIntegerToken("100")); assertNoIntersection(wraps1, nowrap3); assertNoIntersection(wraps2, nowrap1); @@ -252,51 +256,51 @@ public void testNoIntersection() @Test public void testIntersectionOneWraps() { - Range wraps1 = new Range(new BigIntegerToken("100"), new BigIntegerToken("10")); - Range wraps2 = new Range(new BigIntegerToken("100"), new BigIntegerToken("0")); - Range nowrap1 = new Range(new BigIntegerToken("0"), new BigIntegerToken("200")); - Range nowrap2 = new Range(new BigIntegerToken("0"), new BigIntegerToken("100")); + Range wraps1 = new Range(new BigIntegerToken("100"), new BigIntegerToken("10")); + Range wraps2 = new Range(new BigIntegerToken("100"), new BigIntegerToken("0")); + Range nowrap1 = new Range(new BigIntegerToken("0"), new BigIntegerToken("200")); + Range nowrap2 = new Range(new BigIntegerToken("0"), new BigIntegerToken("100")); assertIntersection(wraps1, nowrap1, - new Range(new BigIntegerToken("0"), new BigIntegerToken("10")), - new Range(new BigIntegerToken("100"), new BigIntegerToken("200"))); + new Range(new BigIntegerToken("0"), new BigIntegerToken("10")), + new Range(new BigIntegerToken("100"), new BigIntegerToken("200"))); assertIntersection(wraps2, nowrap1, - new Range(new BigIntegerToken("100"), new BigIntegerToken("200"))); + new Range(new BigIntegerToken("100"), new BigIntegerToken("200"))); assertIntersection(wraps1, nowrap2, - new Range(new BigIntegerToken("0"), new BigIntegerToken("10"))); + new Range(new BigIntegerToken("0"), new BigIntegerToken("10"))); } @Test public void testIntersectionTwoWraps() { - Range wraps1 = new Range(new BigIntegerToken("100"), new BigIntegerToken("20")); - Range wraps2 = new Range(new BigIntegerToken("120"), new BigIntegerToken("90")); - Range wraps3 = new Range(new BigIntegerToken("120"), new BigIntegerToken("110")); - Range wraps4 = new Range(new BigIntegerToken("10"), new BigIntegerToken("0")); - Range wraps5 = new Range(new BigIntegerToken("10"), new BigIntegerToken("1")); - Range wraps6 = new Range(new BigIntegerToken("30"), new BigIntegerToken("10")); + Range wraps1 = new Range(new BigIntegerToken("100"), new BigIntegerToken("20")); + Range wraps2 = new Range(new BigIntegerToken("120"), new BigIntegerToken("90")); + Range wraps3 = new Range(new BigIntegerToken("120"), new BigIntegerToken("110")); + Range wraps4 = new Range(new BigIntegerToken("10"), new BigIntegerToken("0")); + Range wraps5 = new Range(new BigIntegerToken("10"), new BigIntegerToken("1")); + Range wraps6 = new Range(new BigIntegerToken("30"), new BigIntegerToken("10")); assertIntersection(wraps1, wraps2, - new Range(new BigIntegerToken("120"), new BigIntegerToken("20"))); + new Range(new BigIntegerToken("120"), new BigIntegerToken("20"))); assertIntersection(wraps1, wraps3, - new Range(new BigIntegerToken("120"), new BigIntegerToken("20")), - new Range(new BigIntegerToken("100"), new BigIntegerToken("110"))); + new Range(new BigIntegerToken("120"), new BigIntegerToken("20")), + new Range(new BigIntegerToken("100"), new BigIntegerToken("110"))); assertIntersection(wraps1, wraps4, - new Range(new BigIntegerToken("10"), new BigIntegerToken("20")), - new Range(new BigIntegerToken("100"), new BigIntegerToken("0"))); + new Range(new BigIntegerToken("10"), new BigIntegerToken("20")), + new Range(new BigIntegerToken("100"), new BigIntegerToken("0"))); assertIntersection(wraps1, wraps5, - new Range(new BigIntegerToken("10"), new BigIntegerToken("20")), - new Range(new BigIntegerToken("100"), new BigIntegerToken("1"))); + new Range(new BigIntegerToken("10"), new BigIntegerToken("20")), + new Range(new BigIntegerToken("100"), new BigIntegerToken("1"))); assertIntersection(wraps1, wraps6, - new Range(new BigIntegerToken("100"), new BigIntegerToken("10"))); + new Range(new BigIntegerToken("100"), new BigIntegerToken("10"))); } @Test @@ -319,25 +323,25 @@ public void testByteTokensCompare() assert t1.compareTo(t4) == 0; } - private Range makeRange(String token1, String token2) + private Range makeRange(String token1, String token2) { - return new Range(new BigIntegerToken(token1), new BigIntegerToken(token2)); + return new Range(new BigIntegerToken(token1), new BigIntegerToken(token2)); } - private Set makeRanges(String[][] tokenPairs) + private Set> makeRanges(String[][] tokenPairs) { - Set ranges = new HashSet(); + Set> ranges = new HashSet>(); for (int i = 0; i < tokenPairs.length; ++i) ranges.add(makeRange(tokenPairs[i][0], tokenPairs[i][1])); return ranges; } - private void checkDifference(Range oldRange, String[][] newTokens, String[][] expected) + private void checkDifference(Range oldRange, String[][] newTokens, String[][] expected) { - Set ranges = makeRanges(newTokens); - for (Range newRange : ranges) + Set> ranges = makeRanges(newTokens); + for (Range newRange : ranges) { - Set diff = oldRange.differenceToFetch(newRange); + Set> diff = oldRange.differenceToFetch(newRange); assert diff.equals(makeRanges(expected)) : "\n" + "Old range: " + oldRange.toString() + "\n" + "New range: " + newRange.toString() + "\n" + @@ -348,7 +352,7 @@ private void checkDifference(Range oldRange, String[][] newTokens, String[][] ex @Test public void testDifferenceToFetchNoWrap() { - Range oldRange = makeRange("10", "40"); + Range oldRange = makeRange("10", "40"); // New range is entirely contained String[][] newTokens1 = { { "20", "30" }, { "10", "20" }, { "10", "40" }, { "20", "40" } }; @@ -374,7 +378,7 @@ public void testDifferenceToFetchNoWrap() @Test public void testDifferenceToFetchBothWrap() { - Range oldRange = makeRange("1010", "40"); + Range oldRange = makeRange("1010", "40"); // New range is entirely contained String[][] newTokens1 = { { "1020", "30" }, { "1010", "20" }, { "1010", "40" }, { "1020", "40" } }; @@ -400,7 +404,7 @@ public void testDifferenceToFetchBothWrap() @Test public void testDifferenceToFetchOldWraps() { - Range oldRange = makeRange("1010", "40"); + Range oldRange = makeRange("1010", "40"); // New range is entirely contained String[][] newTokens1 = { { "0", "30" }, { "0", "40" }, { "10", "40" } }; @@ -431,7 +435,7 @@ public void testDifferenceToFetchOldWraps() @Test public void testDifferenceToFetchNewWraps() { - Range oldRange = makeRange("0", "40"); + Range oldRange = makeRange("0", "40"); // Only the LHS of the new range is needed String[][] newTokens1 = { { "1010", "0" }, { "1010", "10" }, { "1010", "40" } }; diff --git a/test/unit/org/apache/cassandra/io/sstable/IndexSummaryTest.java b/test/unit/org/apache/cassandra/io/sstable/IndexSummaryTest.java index 9aca66d60086..0fbec391d176 100644 --- a/test/unit/org/apache/cassandra/io/sstable/IndexSummaryTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/IndexSummaryTest.java @@ -90,7 +90,7 @@ public void testSerialization() throws IOException @Test public void testAddEmptyKey() throws Exception { - IPartitioner p = new RandomPartitioner(); + IPartitioner p = RandomPartitioner.instance; IndexSummaryBuilder builder = new IndexSummaryBuilder(1, 1, BASE_SAMPLING_LEVEL); builder.maybeAddEntry(p.decorateKey(ByteBufferUtil.EMPTY_BYTE_BUFFER), 0); IndexSummary summary = builder.build(p); diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java index cd85d785e0ec..2a0c3e664105 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java @@ -62,7 +62,7 @@ import org.apache.cassandra.db.compaction.ICompactionScanner; import org.apache.cassandra.db.composites.Composites; import org.apache.cassandra.dht.LocalPartitioner; -import org.apache.cassandra.dht.LocalToken; +import org.apache.cassandra.dht.LocalPartitioner.LocalToken; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; import org.apache.cassandra.io.util.FileDataInput; @@ -370,7 +370,7 @@ public void testGetScannerForNoIntersectingRanges() boolean foundScanner = false; for (SSTableReader s : store.getSSTables()) { - ICompactionScanner scanner = s.getScanner(new Range(t(0), t(1), s.partitioner), null); + ICompactionScanner scanner = s.getScanner(new Range(t(0), t(1)), null); scanner.next(); // throws exception pre 5407 foundScanner = true; } diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableScannerTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableScannerTest.java index 0d7d3c910b83..d4053eb2e6fb 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableScannerTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableScannerTest.java @@ -32,7 +32,7 @@ import org.apache.cassandra.db.columniterator.IdentityQueryFilter; import org.apache.cassandra.db.compaction.ICompactionScanner; import org.apache.cassandra.dht.Bounds; -import org.apache.cassandra.dht.BytesToken; +import org.apache.cassandra.dht.ByteOrderedPartitioner.BytesToken; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; import org.apache.cassandra.locator.SimpleStrategy; diff --git a/test/unit/org/apache/cassandra/locator/NetworkTopologyStrategyTest.java b/test/unit/org/apache/cassandra/locator/NetworkTopologyStrategyTest.java index be93faa58611..a3ac416bdbe9 100644 --- a/test/unit/org/apache/cassandra/locator/NetworkTopologyStrategyTest.java +++ b/test/unit/org/apache/cassandra/locator/NetworkTopologyStrategyTest.java @@ -37,7 +37,7 @@ import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.config.DatabaseDescriptor; -import org.apache.cassandra.dht.StringToken; +import org.apache.cassandra.dht.OrderPreservingPartitioner.StringToken; import org.apache.cassandra.dht.Token; import com.google.common.collect.HashMultimap; diff --git a/test/unit/org/apache/cassandra/locator/OldNetworkTopologyStrategyTest.java b/test/unit/org/apache/cassandra/locator/OldNetworkTopologyStrategyTest.java index 517167f6f5ee..b854e189d673 100644 --- a/test/unit/org/apache/cassandra/locator/OldNetworkTopologyStrategyTest.java +++ b/test/unit/org/apache/cassandra/locator/OldNetworkTopologyStrategyTest.java @@ -32,7 +32,7 @@ import java.util.Set; import org.apache.cassandra.config.KSMetaData; -import org.apache.cassandra.dht.BigIntegerToken; +import org.apache.cassandra.dht.RandomPartitioner.BigIntegerToken; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; import org.apache.cassandra.service.StorageService; diff --git a/test/unit/org/apache/cassandra/locator/ReplicationStrategyEndpointCacheTest.java b/test/unit/org/apache/cassandra/locator/ReplicationStrategyEndpointCacheTest.java index 2a41e501e4d0..093de9ba338b 100644 --- a/test/unit/org/apache/cassandra/locator/ReplicationStrategyEndpointCacheTest.java +++ b/test/unit/org/apache/cassandra/locator/ReplicationStrategyEndpointCacheTest.java @@ -30,7 +30,7 @@ import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.dht.BigIntegerToken; +import org.apache.cassandra.dht.RandomPartitioner.BigIntegerToken; import org.apache.cassandra.dht.Token; public class ReplicationStrategyEndpointCacheTest diff --git a/test/unit/org/apache/cassandra/locator/SimpleStrategyTest.java b/test/unit/org/apache/cassandra/locator/SimpleStrategyTest.java index 87c8613db45a..61255f32f792 100644 --- a/test/unit/org/apache/cassandra/locator/SimpleStrategyTest.java +++ b/test/unit/org/apache/cassandra/locator/SimpleStrategyTest.java @@ -34,6 +34,8 @@ import org.apache.cassandra.config.Schema; import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.dht.*; +import org.apache.cassandra.dht.RandomPartitioner.BigIntegerToken; +import org.apache.cassandra.dht.OrderPreservingPartitioner.StringToken; import org.apache.cassandra.service.PendingRangeCalculatorService; import org.apache.cassandra.service.StorageServiceAccessor; import org.apache.cassandra.utils.ByteBufferUtil; @@ -74,7 +76,7 @@ public void testBigIntegerEndpoints() throws UnknownHostException @Test public void testStringEndpoints() throws UnknownHostException { - IPartitioner partitioner = new OrderPreservingPartitioner(); + IPartitioner partitioner = OrderPreservingPartitioner.instance; List endpointTokens = new ArrayList(); List keyTokens = new ArrayList(); diff --git a/test/unit/org/apache/cassandra/repair/LocalSyncTaskTest.java b/test/unit/org/apache/cassandra/repair/LocalSyncTaskTest.java index 1d1133436482..3a162625090f 100644 --- a/test/unit/org/apache/cassandra/repair/LocalSyncTaskTest.java +++ b/test/unit/org/apache/cassandra/repair/LocalSyncTaskTest.java @@ -42,7 +42,7 @@ public class LocalSyncTaskTest extends SchemaLoader { - private static final IPartitioner partirioner = new Murmur3Partitioner(); + private static final IPartitioner partirioner = Murmur3Partitioner.instance; public static final String KEYSPACE1 = "DifferencerTest"; public static final String CF_STANDARD = "Standard1"; diff --git a/test/unit/org/apache/cassandra/repair/RepairSessionTest.java b/test/unit/org/apache/cassandra/repair/RepairSessionTest.java index 9811fcc70d23..e21e5d4e30a8 100644 --- a/test/unit/org/apache/cassandra/repair/RepairSessionTest.java +++ b/test/unit/org/apache/cassandra/repair/RepairSessionTest.java @@ -49,8 +49,8 @@ public void testConviction() throws Exception // Set up RepairSession UUID parentSessionId = UUIDGen.getTimeUUID(); UUID sessionId = UUID.randomUUID(); - IPartitioner p = new Murmur3Partitioner(); - Range repairRange = new Range<>(p.getToken(ByteBufferUtil.bytes(0)), p.getToken(ByteBufferUtil.bytes(100)), p); + IPartitioner p = Murmur3Partitioner.instance; + Range repairRange = new Range<>(p.getToken(ByteBufferUtil.bytes(0)), p.getToken(ByteBufferUtil.bytes(100))); Set endpoints = Sets.newHashSet(remote); RepairSession session = new RepairSession(parentSessionId, sessionId, repairRange, "Keyspace1", true, endpoints, ActiveRepairService.UNREPAIRED_SSTABLE, "Standard1"); diff --git a/test/unit/org/apache/cassandra/repair/messages/RepairOptionTest.java b/test/unit/org/apache/cassandra/repair/messages/RepairOptionTest.java index 59ad8a3a1bc1..03e6fa2f4165 100644 --- a/test/unit/org/apache/cassandra/repair/messages/RepairOptionTest.java +++ b/test/unit/org/apache/cassandra/repair/messages/RepairOptionTest.java @@ -37,7 +37,7 @@ public class RepairOptionTest @Test public void testParseOptions() { - IPartitioner partitioner = new Murmur3Partitioner(); + IPartitioner partitioner = Murmur3Partitioner.instance; Token.TokenFactory tokenFactory = partitioner.getTokenFactory(); // parse with empty options diff --git a/test/unit/org/apache/cassandra/service/LeaveAndBootstrapTest.java b/test/unit/org/apache/cassandra/service/LeaveAndBootstrapTest.java index bf34ba61fddb..4a09b7ad0b29 100644 --- a/test/unit/org/apache/cassandra/service/LeaveAndBootstrapTest.java +++ b/test/unit/org/apache/cassandra/service/LeaveAndBootstrapTest.java @@ -36,6 +36,7 @@ import org.apache.cassandra.config.Schema; import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.dht.*; +import org.apache.cassandra.dht.RandomPartitioner.BigIntegerToken; import org.apache.cassandra.gms.ApplicationState; import org.apache.cassandra.gms.Gossiper; import org.apache.cassandra.gms.VersionedValue; @@ -45,7 +46,7 @@ public class LeaveAndBootstrapTest { - private static final IPartitioner partitioner = new RandomPartitioner(); + private static final IPartitioner partitioner = RandomPartitioner.instance; private static IPartitioner oldPartitioner; private static final String KEYSPACE1 = "LeaveAndBootstrapTestKeyspace1"; private static final String KEYSPACE2 = "LeaveAndBootstrapTestKeyspace2"; @@ -79,7 +80,7 @@ public void newTestWriteEndpointsDuringLeave() throws Exception TokenMetadata tmd = ss.getTokenMetadata(); tmd.clearUnsafe(); - IPartitioner partitioner = new RandomPartitioner(); + IPartitioner partitioner = RandomPartitioner.instance; VersionedValue.VersionedValueFactory valueFactory = new VersionedValue.VersionedValueFactory(partitioner); ArrayList endpointTokens = new ArrayList(); @@ -150,7 +151,7 @@ public void testSimultaneousMove() throws UnknownHostException final int RING_SIZE = 10; TokenMetadata tmd = ss.getTokenMetadata(); tmd.clearUnsafe(); - IPartitioner partitioner = new RandomPartitioner(); + IPartitioner partitioner = RandomPartitioner.instance; VersionedValue.VersionedValueFactory valueFactory = new VersionedValue.VersionedValueFactory(partitioner); ArrayList endpointTokens = new ArrayList(); @@ -450,7 +451,7 @@ public void testStateJumpToBootstrap() throws UnknownHostException StorageService ss = StorageService.instance; TokenMetadata tmd = ss.getTokenMetadata(); tmd.clearUnsafe(); - IPartitioner partitioner = new RandomPartitioner(); + IPartitioner partitioner = RandomPartitioner.instance; VersionedValue.VersionedValueFactory valueFactory = new VersionedValue.VersionedValueFactory(partitioner); ArrayList endpointTokens = new ArrayList(); @@ -527,7 +528,7 @@ public void testStateJumpToNormal() throws UnknownHostException StorageService ss = StorageService.instance; TokenMetadata tmd = ss.getTokenMetadata(); tmd.clearUnsafe(); - IPartitioner partitioner = new RandomPartitioner(); + IPartitioner partitioner = RandomPartitioner.instance; VersionedValue.VersionedValueFactory valueFactory = new VersionedValue.VersionedValueFactory(partitioner); ArrayList endpointTokens = new ArrayList(); @@ -569,7 +570,7 @@ public void testStateJumpToLeaving() throws UnknownHostException StorageService ss = StorageService.instance; TokenMetadata tmd = ss.getTokenMetadata(); tmd.clearUnsafe(); - IPartitioner partitioner = new RandomPartitioner(); + IPartitioner partitioner = RandomPartitioner.instance; VersionedValue.VersionedValueFactory valueFactory = new VersionedValue.VersionedValueFactory(partitioner); ArrayList endpointTokens = new ArrayList(); @@ -619,7 +620,7 @@ public void testStateJumpToLeft() throws UnknownHostException StorageService ss = StorageService.instance; TokenMetadata tmd = ss.getTokenMetadata(); tmd.clearUnsafe(); - IPartitioner partitioner = new RandomPartitioner(); + IPartitioner partitioner = RandomPartitioner.instance; VersionedValue.VersionedValueFactory valueFactory = new VersionedValue.VersionedValueFactory(partitioner); ArrayList endpointTokens = new ArrayList(); diff --git a/test/unit/org/apache/cassandra/service/MoveTest.java b/test/unit/org/apache/cassandra/service/MoveTest.java index 1ee71dd29c88..6c9e58963038 100644 --- a/test/unit/org/apache/cassandra/service/MoveTest.java +++ b/test/unit/org/apache/cassandra/service/MoveTest.java @@ -39,6 +39,7 @@ import org.apache.cassandra.Util; import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.dht.*; +import org.apache.cassandra.dht.RandomPartitioner.BigIntegerToken; import org.apache.cassandra.gms.ApplicationState; import org.apache.cassandra.gms.VersionedValue; import org.apache.cassandra.locator.AbstractReplicationStrategy; @@ -47,7 +48,7 @@ public class MoveTest { - private static final IPartitioner partitioner = new RandomPartitioner(); + private static final IPartitioner partitioner = RandomPartitioner.instance; private static IPartitioner oldPartitioner; private static final String KEYSPACE1 = "MoveTestKeyspace1"; private static final String KEYSPACE2 = "MoveTestKeyspace2"; @@ -164,7 +165,7 @@ public void testSimultaneousMove() throws UnknownHostException StorageService ss = StorageService.instance; final int RING_SIZE = 10; TokenMetadata tmd = ss.getTokenMetadata(); - IPartitioner partitioner = new RandomPartitioner(); + IPartitioner partitioner = RandomPartitioner.instance; VersionedValue.VersionedValueFactory valueFactory = new VersionedValue.VersionedValueFactory(partitioner); ArrayList endpointTokens = new ArrayList(); @@ -506,7 +507,7 @@ public void testStateJumpToNormal() throws UnknownHostException { StorageService ss = StorageService.instance; TokenMetadata tmd = ss.getTokenMetadata(); - IPartitioner partitioner = new RandomPartitioner(); + IPartitioner partitioner = RandomPartitioner.instance; VersionedValue.VersionedValueFactory valueFactory = new VersionedValue.VersionedValueFactory(partitioner); ArrayList endpointTokens = new ArrayList(); diff --git a/test/unit/org/apache/cassandra/service/RemoveTest.java b/test/unit/org/apache/cassandra/service/RemoveTest.java index 2574dcf2c897..e5e462050df7 100644 --- a/test/unit/org/apache/cassandra/service/RemoveTest.java +++ b/test/unit/org/apache/cassandra/service/RemoveTest.java @@ -47,7 +47,7 @@ public class RemoveTest { - static final IPartitioner partitioner = new RandomPartitioner(); + static final IPartitioner partitioner = RandomPartitioner.instance; StorageService ss = StorageService.instance; TokenMetadata tmd = ss.getTokenMetadata(); static IPartitioner oldPartitioner; diff --git a/test/unit/org/apache/cassandra/service/SerializationsTest.java b/test/unit/org/apache/cassandra/service/SerializationsTest.java index 49632f96f082..35e598a93764 100644 --- a/test/unit/org/apache/cassandra/service/SerializationsTest.java +++ b/test/unit/org/apache/cassandra/service/SerializationsTest.java @@ -93,7 +93,7 @@ public void testValidationRequestRead() throws IOException private void testValidationCompleteWrite() throws IOException { - IPartitioner p = new RandomPartitioner(); + IPartitioner p = RandomPartitioner.instance; // empty validation MerkleTree mt = new MerkleTree(p, FULL_RANGE, MerkleTree.RECOMMENDED_DEPTH, (int) Math.pow(2, 15)); Validator v0 = new Validator(DESC, FBUtilities.getBroadcastAddress(), -1); diff --git a/test/unit/org/apache/cassandra/service/StorageServiceServerTest.java b/test/unit/org/apache/cassandra/service/StorageServiceServerTest.java index aea978a4f680..f98751a0ad80 100644 --- a/test/unit/org/apache/cassandra/service/StorageServiceServerTest.java +++ b/test/unit/org/apache/cassandra/service/StorageServiceServerTest.java @@ -27,8 +27,6 @@ import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; -import org.apache.cassandra.dht.LongToken; -import org.apache.cassandra.dht.Murmur3Partitioner; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; @@ -41,8 +39,10 @@ import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.dht.Range; -import org.apache.cassandra.dht.StringToken; import org.apache.cassandra.dht.Token; +import org.apache.cassandra.dht.OrderPreservingPartitioner.StringToken; +import org.apache.cassandra.dht.Murmur3Partitioner; +import org.apache.cassandra.dht.Murmur3Partitioner.LongToken; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.locator.IEndpointSnitch; import org.apache.cassandra.locator.PropertyFileSnitch; @@ -465,7 +465,7 @@ public void testPrimaryRangeForEndpointWithinDCWithSimpleStrategy() throws Excep @Test public void testCreateRepairRangeFrom() throws Exception { - StorageService.instance.setPartitionerUnsafe(new Murmur3Partitioner()); + StorageService.instance.setPartitionerUnsafe(Murmur3Partitioner.instance); TokenMetadata metadata = StorageService.instance.getTokenMetadata(); metadata.clearUnsafe(); diff --git a/test/unit/org/apache/cassandra/utils/MerkleTreeTest.java b/test/unit/org/apache/cassandra/utils/MerkleTreeTest.java index 116e194e34e7..a9e051e96220 100644 --- a/test/unit/org/apache/cassandra/utils/MerkleTreeTest.java +++ b/test/unit/org/apache/cassandra/utils/MerkleTreeTest.java @@ -30,6 +30,7 @@ import org.junit.Test; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.dht.*; +import org.apache.cassandra.dht.RandomPartitioner.BigIntegerToken; import org.apache.cassandra.io.util.DataOutputBuffer; import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.utils.MerkleTree.Hashable; @@ -62,7 +63,7 @@ private Range fullRange() public void clear() { TOKEN_SCALE = new BigInteger("8"); - partitioner = new RandomPartitioner(); + partitioner = RandomPartitioner.instance; // TODO need to trickle TokenSerializer DatabaseDescriptor.setPartitioner(partitioner); mt = new MerkleTree(partitioner, fullRange(), RECOMMENDED_DEPTH, Integer.MAX_VALUE); From 395720c37ad772f6031cde79c0402fb2805df015 Mon Sep 17 00:00:00 2001 From: Yuki Morishita Date: Mon, 24 Nov 2014 18:57:50 -0600 Subject: [PATCH 198/557] fix to run test --- build.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.xml b/build.xml index e5c5c834f519..06c79e02af09 100644 --- a/build.xml +++ b/build.xml @@ -1113,7 +1113,8 @@ - + + From c5cec004628c2b669d48c4cf565bfa5482a766f3 Mon Sep 17 00:00:00 2001 From: Aleksey Yeschenko Date: Wed, 26 Nov 2014 23:17:09 +0300 Subject: [PATCH 199/557] Fix PaxosStateTest --- test/unit/org/apache/cassandra/service/PaxosStateTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/unit/org/apache/cassandra/service/PaxosStateTest.java b/test/unit/org/apache/cassandra/service/PaxosStateTest.java index d41d89f869b6..7f4bc49d6725 100644 --- a/test/unit/org/apache/cassandra/service/PaxosStateTest.java +++ b/test/unit/org/apache/cassandra/service/PaxosStateTest.java @@ -45,6 +45,7 @@ public class PaxosStateTest public static void setUpClass() throws Throwable { SchemaLoader.loadSchema(); + SchemaLoader.schemaDefinition("PaxosStateTest"); } @AfterClass @@ -56,7 +57,7 @@ public static void stopGossiper() @Test public void testCommittingAfterTruncation() throws Exception { - ColumnFamilyStore cfs = Keyspace.open("Keyspace1").getColumnFamilyStore("Standard1"); + ColumnFamilyStore cfs = Keyspace.open("PaxosStateTestKeyspace1").getColumnFamilyStore("Standard1"); DecoratedKey key = Util.dk("key" + System.nanoTime()); CellName name = Util.cellname("col"); ByteBuffer value = ByteBufferUtil.bytes(0); From e13121318b1a3186f75a652c28ca317edac719d4 Mon Sep 17 00:00:00 2001 From: Robert Stupp Date: Wed, 26 Nov 2014 12:51:37 -0800 Subject: [PATCH 200/557] Validate functionality of different JSR-223 providers in UDFs. patch by Robert Stupp; reviewed by Mikhail Stepura for CASSANDRA-7874 --- .gitignore | 12 ++++++++ bin/cassandra.bat | 23 +++++++++++++++ bin/cassandra.in.bat | 21 ++++++++++++++ bin/cassandra.in.sh | 21 ++++++++++++++ conf/cassandra-env.ps1 | 37 ++++++++++++++++++++++++ lib/jsr223/clojure/README.txt | 8 ++++++ lib/jsr223/groovy/README.txt | 35 +++++++++++++++++++++++ lib/jsr223/jaskell/README.txt | 5 ++++ lib/jsr223/jruby/README.txt | 54 +++++++++++++++++++++++++++++++++++ lib/jsr223/jython/README.txt | 33 +++++++++++++++++++++ lib/jsr223/scala/README.txt | 37 ++++++++++++++++++++++++ 11 files changed, 286 insertions(+) create mode 100644 lib/jsr223/clojure/README.txt create mode 100644 lib/jsr223/groovy/README.txt create mode 100644 lib/jsr223/jaskell/README.txt create mode 100644 lib/jsr223/jruby/README.txt create mode 100644 lib/jsr223/jython/README.txt create mode 100644 lib/jsr223/scala/README.txt diff --git a/.gitignore b/.gitignore index c7cf9fdb4e95..fd3740710948 100644 --- a/.gitignore +++ b/.gitignore @@ -57,3 +57,15 @@ target/ *.tmp .DS_Store Thumbs.db + +# JSR223 +lib/jsr223/clojure/*.jar +lib/jsr223/groovy/*.jar +lib/jsr223/jaskell/*.jar +lib/jsr223/jruby/*.jar +lib/jsr223/jruby/jni +lib/jsr223/jruby/ruby +lib/jsr223/jython/*.jar +lib/jsr223/jython/cachedir +lib/jsr223/scala/*.jar + diff --git a/bin/cassandra.bat b/bin/cassandra.bat index a16bf1a28037..3445af2ce988 100644 --- a/bin/cassandra.bat +++ b/bin/cassandra.bat @@ -85,6 +85,29 @@ goto :eof REM ----------------------------------------------------------------------------- :okClasspath + +REM JSR223 - collect all JSR223 engines' jars +for /D %%P in ("%CASSANDRA_HOME%\lib\jsr223\*.*") do ( + for %%i in ("%%P\*.jar") do call :append "%%i" +) + +REM JSR223/JRuby - set ruby lib directory +if EXIST "%CASSANDRA_HOME%\lib\jsr223\jruby\ruby" ( + set JAVA_OPTS=%JAVA_OPTS% "-Djruby.lib=%CASSANDRA_HOME%\lib\jsr223\jruby" +) +REM JSR223/JRuby - set ruby JNI libraries root directory +if EXIST "%CASSANDRA_HOME%\lib\jsr223\jruby\jni" ( + set JAVA_OPTS=%JAVA_OPTS% "-Djffi.boot.library.path=%CASSANDRA_HOME%\lib\jsr223\jruby\jni" +) +REM JSR223/Jython - set python.home system property +if EXIST "%CASSANDRA_HOME%\lib\jsr223\jython\jython.jar" ( + set JAVA_OPTS=%JAVA_OPTS% "-Dpython.home=%CASSANDRA_HOME%\lib\jsr223\jython" +) +REM JSR223/Scala - necessary system property +if EXIST "%CASSANDRA_HOME%\lib\jsr223\scala\scala-compiler.jar" ( + set JAVA_OPTS=%JAVA_OPTS% "-Dscala.usejavacp=true" +) + REM Include the build\classes\main directory so it works in development set CASSANDRA_CLASSPATH=%CLASSPATH%;"%CASSANDRA_HOME%\build\classes\main";"%CASSANDRA_HOME%\build\classes\thrift" set CASSANDRA_PARAMS=-Dcassandra -Dcassandra-foreground=yes diff --git a/bin/cassandra.in.bat b/bin/cassandra.in.bat index a0eced5b6fdb..1b4e38e0fe56 100644 --- a/bin/cassandra.in.bat +++ b/bin/cassandra.in.bat @@ -49,5 +49,26 @@ set CASSANDRA_CLASSPATH=%CLASSPATH%;"%CASSANDRA_HOME%\build\classes\main";%CASSA REM Add the default storage location. Can be overridden in conf\cassandra.yaml set CASSANDRA_PARAMS=%CASSANDRA_PARAMS% "-Dcassandra.storagedir=%CASSANDRA_HOME%\data" +REM JSR223 - collect all JSR223 engines' jars +for /r %%P in ("%CASSANDRA_HOME%\lib\jsr223\*.jar") do ( + set CLASSPATH=%CLASSPATH%;%%~fP +) +REM JSR223/JRuby - set ruby lib directory +if EXIST "%CASSANDRA_HOME%\lib\jsr223\jruby\ruby" ( + set JAVA_OPTS=%JAVA_OPTS% "-Djruby.lib=%CASSANDRA_HOME%\lib\jsr223\jruby" +) +REM JSR223/JRuby - set ruby JNI libraries root directory +if EXIST "%CASSANDRA_HOME%\lib\jsr223\jruby\jni" ( + set JAVA_OPTS=%JAVA_OPTS% "-Djffi.boot.library.path=%CASSANDRA_HOME%\lib\jsr223\jruby\jni" +) +REM JSR223/Jython - set python.home system property +if EXIST "%$CASSANDRA_HOME%\lib\jsr223\jython\jython.jar" ( + set JAVA_OPTS=%JAVA_OPTS% "-Dpython.home=%CASSANDRA_HOME%\lib\jsr223\jython" +) +REM JSR223/Scala - necessary system property +if EXIST "$CASSANDRA_HOME\lib\jsr223\scala\scala-compiler.jar" ( + set JAVA_OPTS=%JAVA_OPTS% "-Dscala.usejavacp=true" +) + REM Add the sigar-bin path to the java.library.path CASSANDRA-7838 set JAVA_OPTS=%JAVA_OPTS% -Djava.library.path=%CASSANDRA_HOME%\lib\sigar-bin" diff --git a/bin/cassandra.in.sh b/bin/cassandra.in.sh index 6b0581d7971d..92f79c7d4621 100644 --- a/bin/cassandra.in.sh +++ b/bin/cassandra.in.sh @@ -44,6 +44,27 @@ for jar in "$CASSANDRA_HOME"/lib/*.jar; do CLASSPATH="$CLASSPATH:$jar" done +# JSR223 - collect all JSR223 engines' jars +for jsr223jar in "$CASSANDRA_HOME"/lib/jsr223/*/*.jar; do + CLASSPATH="$CLASSPATH:$jsr223jar" +done +# JSR223/JRuby - set ruby lib directory +if [ -d "$CASSANDRA_HOME"/lib/jsr223/jruby/ruby ] ; then + export JVM_OPTS="$JVM_OPTS -Djruby.lib=$CASSANDRA_HOME/lib/jsr223/jruby" +fi +# JSR223/JRuby - set ruby JNI libraries root directory +if [ -d "$CASSANDRA_HOME"/lib/jsr223/jruby/jni ] ; then + export JVM_OPTS="$JVM_OPTS -Djffi.boot.library.path=$CASSANDRA_HOME/lib/jsr223/jruby/jni" +fi +# JSR223/Jython - set python.home system property +if [ -f "$CASSANDRA_HOME"/lib/jsr223/jython/jython.jar ] ; then + export JVM_OPTS="$JVM_OPTS -Dpython.home=$CASSANDRA_HOME/lib/jsr223/jython" +fi +# JSR223/Scala - necessary system property +if [ -f "$CASSANDRA_HOME"/lib/jsr223/scala/scala-compiler.jar ] ; then + export JVM_OPTS="$JVM_OPTS -Dscala.usejavacp=true" +fi + # set JVM javaagent opts to avoid warnings/errors if [ "$JVM_VENDOR" != "OpenJDK" -o "$JVM_VERSION" \> "1.6.0" ] \ || [ "$JVM_VERSION" = "1.6.0" -a "$JVM_PATCH_VERSION" -ge 23 ] diff --git a/conf/cassandra-env.ps1 b/conf/cassandra-env.ps1 index 8793cf4e40d5..8acb5079e099 100644 --- a/conf/cassandra-env.ps1 +++ b/conf/cassandra-env.ps1 @@ -196,6 +196,42 @@ Function CalculateHeapSizes } } +#----------------------------------------------------------------------------- +Function SetJsr223Env +{ + $cp = """$env:CLASSPATH""" + foreach ($jsrDir in Get-ChildItem -Path "$env:CASSANDRA_HOME\lib\jsr223") + { + foreach ($file in Get-ChildItem -Path "$env:CASSANDRA_HOME\lib\jsr223\$jsrDir\*.jar") + { + $file = $file -replace "\\", "/" + $cp = $cp + ";" + """$file""" + } + } + $env:CLASSPATH=$cp + + # JSR223/JRuby - set ruby lib directory + if (Test-Path "$env:CASSANDRA_HOME\lib\jsr223\jruby\ruby") + { + $env:CASSANDRA_PARAMS=$env:CASSANDRA_PARAMS + " -Djruby.lib=$env:CASSANDRA_HOME\lib\jsr223\jruby" + } + # JSR223/JRuby - set ruby JNI libraries root directory + if (Test-Path "$env:CASSANDRA_HOME\lib\jsr223\jruby\jni") + { + $env:CASSANDRA_PARAMS=$env:CASSANDRA_PARAMS + " -Djffi.boot.library.path=$env:CASSANDRA_HOME\lib\jsr223\jruby\jni" + } + # JSR223/Jython - set python.home system property + if (Test-Path "$env:CASSANDRA_HOME\lib\jsr223\jython\jython.jar") + { + $env:CASSANDRA_PARAMS=$env:CASSANDRA_PARAMS + " -Dpython.home=$env:CASSANDRA_HOME\lib\jsr223\jython" + } + # JSR223/Scala - necessary system property + if (Test-Path "$env:CASSANDRA_HOME\lib\jsr223\scala\scala-compiler.jar") + { + $env:CASSANDRA_PARAMS=$env:CASSANDRA_PARAMS + " -Dscala.usejavacp=true" + } +} + #----------------------------------------------------------------------------- Function ParseJVMInfo { @@ -276,6 +312,7 @@ Function SetCassandraEnvironment SetCassandraMain BuildClassPath + SetJsr223Env # Override these to set the amount of memory to allocate to the JVM at # start-up. For production use you may wish to adjust this for your diff --git a/lib/jsr223/clojure/README.txt b/lib/jsr223/clojure/README.txt new file mode 100644 index 000000000000..7ed7551a00f7 --- /dev/null +++ b/lib/jsr223/clojure/README.txt @@ -0,0 +1,8 @@ +Apache Cassandra User-Defined-Functions JSR 223 scripting +========================================================= + +Unfortunately the JSR-223 support provided by the project https://github.com/ato/clojure-jsr223 +and the related ones do not provide compileable script support. + +The JSR-223 javax.script.Compilable implementation takes source file names or readers but not script sources +as all other JSR-223 implementations do. diff --git a/lib/jsr223/groovy/README.txt b/lib/jsr223/groovy/README.txt new file mode 100644 index 000000000000..09fef93aa3e6 --- /dev/null +++ b/lib/jsr223/groovy/README.txt @@ -0,0 +1,35 @@ +Apache Cassandra User-Defined-Functions JSR 223 scripting +========================================================= + +Using JSR-223 capable Groovy + +Tested with version 2.3.6 + +Installation +------------ + +1. Download Groovy binary release +2. Unpack the downloaded archive into a temporary directory +3. Copy the jar groovy-all-2.3.6-indy.jar from the Groovy embeddable directory to $CASSANDRA_HOME/lib/jsr223/groovy + "indy" means "invokedynamic" and is a JVM instruction for scripting languages new to Java 7. +4. Restart your Cassandra daemon if it's already running + +Cassandra log should contain a line like this: + INFO 10:49:45 Found scripting engine Groovy Scripting Engine 2.0 - Groovy 2.3.6 - language names: [groovy, Groovy] +Such a line appears when you already have scripted UDFs in your system or add a scripted UDF for the first time (see below). + +Smoke Test +---------- + +To test Groovy functionality, open cqlsh and execute the following command: + CREATE OR REPLACE FUNCTION foobar ( input text ) RETURNS text LANGUAGE groovy AS 'return "foo";' ; + +If you get the error + code=2200 [Invalid query] message="Invalid language groovy for 'foobar'" +Groovy for Apache Cassandra has not been installed correctly. + +Notes / Java7 invokedynamic +--------------------------- + +Groovy provides jars that support invokedynamic bytecode instruction. These jars are whose ending with +"-indy.jar". diff --git a/lib/jsr223/jaskell/README.txt b/lib/jsr223/jaskell/README.txt new file mode 100644 index 000000000000..53e942e08180 --- /dev/null +++ b/lib/jsr223/jaskell/README.txt @@ -0,0 +1,5 @@ +Apache Cassandra User-Defined-Functions JSR 223 scripting +========================================================= + +Unfortunately Jaskell JSR-223 support is quite old and the Jaskell engine seems to be quite +unsupported. If you find a solution, please open a ticket at Apache Cassandra JIRA. diff --git a/lib/jsr223/jruby/README.txt b/lib/jsr223/jruby/README.txt new file mode 100644 index 000000000000..cbc12dca075a --- /dev/null +++ b/lib/jsr223/jruby/README.txt @@ -0,0 +1,54 @@ +Apache Cassandra User-Defined-Functions JSR 223 scripting +========================================================= + +Using JSR-223 capable JRuby + +Tested with version 1.7.15 + +Installation +------------ + +1. Download JRuby binary release +2. Unpack the downloaded archive into a temporary directory +3. Copy everything from the JRuby lib directory to $CASSANDRA_HOME/lib/jsr223/jruby +4. Restart your Cassandra daemon if it's already running + +Cassandra log should contain a line like this: + INFO 10:29:03 Found scripting engine JSR 223 JRuby Engine 1.7.15 - ruby jruby 1.7.15 - language names: [ruby, jruby] +Such a line appears when you already have scripted UDFs in your system or add a scripted UDF for the first time (see below). + + +Smoke Test +---------- + +To test JRuby functionality, open cqlsh and execute the following command: + CREATE OR REPLACE FUNCTION foobar ( input text ) RETURNS text LANGUAGE ruby AS 'return "foo";' ; + +If you get the error + code=2200 [Invalid query] message="Invalid language ruby for 'foobar'" +JRuby for Apache Cassandra has not been installed correctly. + + +Ruby require/include +-------------------- + +You can use Ruby require and include in your scripts as in the following example: + + +CREATE OR REPLACE FUNCTION foobar ( input text ) RETURNS text LANGUAGE ruby AS ' +require "bigdecimal" +require "bigdecimal/math" + +include BigMath + +a = BigDecimal((PI(100)/2).to_s) + +return "foo " + a.to_s; +' ; + + +Notes / Java7 invokedynamic +--------------------------- + +See JRuby wiki pages https://github.com/jruby/jruby/wiki/ConfiguringJRuby and +https://github.com/jruby/jruby/wiki/PerformanceTuning for more information and optimization tips. diff --git a/lib/jsr223/jython/README.txt b/lib/jsr223/jython/README.txt new file mode 100644 index 000000000000..bef3c83cd7ed --- /dev/null +++ b/lib/jsr223/jython/README.txt @@ -0,0 +1,33 @@ +Apache Cassandra User-Defined-Functions JSR 223 scripting +========================================================= + +Using JSR-223 capable Jython + +Tested with version 2.3.5 + +Installation +------------ + +1. Download Jython binary release +2. Unpack the downloaded archive into a temporary directory +3. Copy the jar jython.jar from the Jython directory to $CASSANDRA_HOME/lib/jsr223/jython +4. Restart your Cassandra daemon if it's already running + +Cassandra log should contain a line like this: + INFO 10:58:18 Found scripting engine jython 2.5.3 - python 2.5 - language names: [python, jython] +Such a line appears when you already have scripted UDFs in your system or add a scripted UDF for the first time (see below). + +Smoke Test +---------- + +To test Jython functionality, open cqlsh and execute the following command: + CREATE OR REPLACE FUNCTION foobar ( input text ) RETURNS text LANGUAGE python AS '''foo''' ; + +If you get the error + code=2200 [Invalid query] message="Invalid language python for 'foobar'" +Jython for Apache Cassandra has not been installed correctly. + +Notes / Java7 invokedynamic +--------------------------- + +Jython currently targets Java6 only. They want to switch to Java7 + invokedynamic in Jython 3. diff --git a/lib/jsr223/scala/README.txt b/lib/jsr223/scala/README.txt new file mode 100644 index 000000000000..7f5d6fe83610 --- /dev/null +++ b/lib/jsr223/scala/README.txt @@ -0,0 +1,37 @@ +Apache Cassandra User-Defined-Functions JSR 223 scripting +========================================================= + +Using JSR-223 capable Scala + +Tested with version 2.11.2 + +Installation +------------ + +1. Download Scala binary release +2. Unpack the downloaded archive into a temporary directory +3. Copy the following jars from the Scala lib directory to $CASSANDRA_HOME/lib/jsr223/scala + scala-compiler.jar + scala-library.jar + scala-reflect.jar +4. Restart your Cassandra daemon if it's already running + +Cassandra log should contain a line like this: + INFO 11:42:35 Found scripting engine Scala Interpreter 1.0 - Scala version 2.11.2 - language names: [scala] +Such a line appears when you already have scripted UDFs in your system or add a scripted UDF for the first time (see below). + +Smoke Test +---------- + +To test Scala functionality, open cqlsh and execute the following command: + CREATE OR REPLACE FUNCTION foobar ( input text ) RETURNS text LANGUAGE scala AS 'return "foo";' ; + +If you get the error + code=2200 [Invalid query] message="Invalid language scala for 'foobar'" +Scala for Apache Cassandra has not been installed correctly. + +Notes / Java7 invokedynamic +--------------------------- + +Scala 2.10 has Java6 support only. 2.11 has experimental invokedynamic support (use at your own risk!). +2.12 introduces an upgrade directly to Java8 - see https://stackoverflow.com/questions/14285894/advantages-of-scala-emitting-bytecode-for-the-jvm-1-7 \ No newline at end of file From 794d68b51b77c2a3cb09374010b6f84231ead604 Mon Sep 17 00:00:00 2001 From: Robert Stupp Date: Wed, 26 Nov 2014 17:49:45 -0600 Subject: [PATCH 201/557] Support for UDTs, tuples, and collections in UDFs Patch by Robert Stupp; reviewed by Tyler Hobbs for CASSANDRA-7563 --- CHANGES.txt | 2 + .../org/apache/cassandra/cql3/CQL3Type.java | 12 +- .../cql3/functions/BytesConversionFcts.java | 8 +- .../cql3/functions/FunctionCall.java | 9 +- .../cql3/functions/FunctionName.java | 1 - .../cassandra/cql3/functions/Functions.java | 50 +- .../cql3/functions/JavaSourceUDFFactory.java | 51 +- .../cql3/functions/ScalarFunction.java | 3 +- .../cql3/functions/ScriptBasedUDF.java | 13 +- .../cql3/functions/TimeuuidFcts.java | 10 +- .../cassandra/cql3/functions/TokenFct.java | 2 +- .../cassandra/cql3/functions/UDFunction.java | 177 ++- .../cassandra/cql3/functions/UuidFcts.java | 2 +- .../selection/AggregateFunctionSelector.java | 8 +- .../cql3/selection/FieldSelector.java | 8 +- .../selection/ScalarFunctionSelector.java | 10 +- .../cassandra/cql3/selection/Selection.java | 30 +- .../cassandra/cql3/selection/Selector.java | 6 +- .../cql3/selection/SimpleSelector.java | 5 +- .../selection/WritetimeOrTTLSelector.java | 4 +- .../statements/CreateFunctionStatement.java | 23 +- .../statements/DropFunctionStatement.java | 10 +- .../cql3/statements/DropTypeStatement.java | 11 + .../statements/ModificationStatement.java | 2 +- .../cql3/statements/SelectStatement.java | 8 +- .../hadoop/cql3/CqlRecordReader.java | 2 +- .../apache/cassandra/transport/Server.java | 1 + .../org/apache/cassandra/cql3/CQLTester.java | 232 ++- .../org/apache/cassandra/cql3/UFTest.java | 1356 +++++++++++++---- tools/lib/cassandra-driver-core-2.0.5.jar | Bin 544552 -> 0 bytes 30 files changed, 1643 insertions(+), 413 deletions(-) delete mode 100644 tools/lib/cassandra-driver-core-2.0.5.jar diff --git a/CHANGES.txt b/CHANGES.txt index 162d57989e14..55c86dd49217 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,6 @@ 3.0 + * Support UDTs, tuples, and collections in user-defined + functions (CASSANDRA-7563) * Fix aggregate fn results on empty selection, result column name, and cqlsh parsing (CASSANDRA-8229) * Mark sstables as repaired after full repair (CASSANDRA-7586) diff --git a/src/java/org/apache/cassandra/cql3/CQL3Type.java b/src/java/org/apache/cassandra/cql3/CQL3Type.java index b656de8a213c..98d1b155789e 100644 --- a/src/java/org/apache/cassandra/cql3/CQL3Type.java +++ b/src/java/org/apache/cassandra/cql3/CQL3Type.java @@ -315,6 +315,11 @@ public boolean isCounter() return false; } + public String keyspace() + { + return null; + } + public void freeze() throws InvalidRequestException { String message = String.format("frozen<> is only allowed on collections, tuples, and user-defined types (got %s)", this); @@ -474,6 +479,11 @@ private RawUT(UTName name) this.name = name; } + public String keyspace() + { + return name.getKeyspace(); + } + public void freeze() { frozen = true; @@ -485,7 +495,7 @@ public CQL3Type prepare(String keyspace) throws InvalidRequestException { // The provided keyspace is the one of the current statement this is part of. If it's different from the keyspace of // the UTName, we reject since we want to limit user types to their own keyspace (see #6643) - if (!keyspace.equals(name.getKeyspace())) + if (keyspace != null && !keyspace.equals(name.getKeyspace())) throw new InvalidRequestException(String.format("Statement on keyspace %s cannot refer to a user type in keyspace %s; " + "user types can only be used in the keyspace they are defined in", keyspace, name.getKeyspace())); diff --git a/src/java/org/apache/cassandra/cql3/functions/BytesConversionFcts.java b/src/java/org/apache/cassandra/cql3/functions/BytesConversionFcts.java index 1cd1d69fe036..ddb33fc09354 100644 --- a/src/java/org/apache/cassandra/cql3/functions/BytesConversionFcts.java +++ b/src/java/org/apache/cassandra/cql3/functions/BytesConversionFcts.java @@ -36,7 +36,7 @@ public static Function makeToBlobFunction(AbstractType fromType) String name = fromType.asCQL3Type() + "asblob"; return new NativeScalarFunction(name, BytesType.instance, fromType) { - public ByteBuffer execute(List parameters) + public ByteBuffer execute(int protocolVersion, List parameters) { return parameters.get(0); } @@ -48,7 +48,7 @@ public static Function makeFromBlobFunction(final AbstractType toType) final String name = "blobas" + toType.asCQL3Type(); return new NativeScalarFunction(name, toType, BytesType.instance) { - public ByteBuffer execute(List parameters) throws InvalidRequestException + public ByteBuffer execute(int protocolVersion, List parameters) throws InvalidRequestException { ByteBuffer val = parameters.get(0); try @@ -68,7 +68,7 @@ public ByteBuffer execute(List parameters) throws InvalidRequestExce public static final Function VarcharAsBlobFct = new NativeScalarFunction("varcharasblob", BytesType.instance, UTF8Type.instance) { - public ByteBuffer execute(List parameters) + public ByteBuffer execute(int protocolVersion, List parameters) { return parameters.get(0); } @@ -76,7 +76,7 @@ public ByteBuffer execute(List parameters) public static final Function BlobAsVarcharFact = new NativeScalarFunction("blobasvarchar", UTF8Type.instance, BytesType.instance) { - public ByteBuffer execute(List parameters) + public ByteBuffer execute(int protocolVersion, List parameters) { return parameters.get(0); } diff --git a/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java b/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java index efaa12a042dd..01443d2d03b9 100644 --- a/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java +++ b/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java @@ -27,6 +27,7 @@ import org.apache.cassandra.db.marshal.MapType; import org.apache.cassandra.db.marshal.SetType; import org.apache.cassandra.exceptions.InvalidRequestException; +import org.apache.cassandra.transport.Server; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.serializers.MarshalException; @@ -69,12 +70,12 @@ public ByteBuffer bindAndGet(QueryOptions options) throws InvalidRequestExceptio throw new InvalidRequestException(String.format("Invalid null value for argument to %s", fun)); buffers.add(val); } - return executeInternal(fun, buffers); + return executeInternal(options.getProtocolVersion(), fun, buffers); } - private static ByteBuffer executeInternal(ScalarFunction fun, List params) throws InvalidRequestException + private static ByteBuffer executeInternal(int protocolVersion, ScalarFunction fun, List params) throws InvalidRequestException { - ByteBuffer result = fun.execute(params); + ByteBuffer result = fun.execute(protocolVersion, params); try { // Check the method didn't lied on it's declared return type @@ -172,7 +173,7 @@ private static ByteBuffer execute(ScalarFunction fun, List parameters) thr buffers.add(((Term.Terminal)t).get(QueryOptions.DEFAULT)); } - return executeInternal(fun, buffers); + return executeInternal(Server.CURRENT_VERSION, fun, buffers); } public AssignmentTestable.TestResult testAssignment(String keyspace, ColumnSpecification receiver) diff --git a/src/java/org/apache/cassandra/cql3/functions/FunctionName.java b/src/java/org/apache/cassandra/cql3/functions/FunctionName.java index 460e7a67ed8c..bb30040a3e0e 100644 --- a/src/java/org/apache/cassandra/cql3/functions/FunctionName.java +++ b/src/java/org/apache/cassandra/cql3/functions/FunctionName.java @@ -19,7 +19,6 @@ import com.google.common.base.Objects; -import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.db.SystemKeyspace; public final class FunctionName diff --git a/src/java/org/apache/cassandra/cql3/functions/Functions.java b/src/java/org/apache/cassandra/cql3/functions/Functions.java index 7021475e380e..a8fdf0f837c9 100644 --- a/src/java/org/apache/cassandra/cql3/functions/Functions.java +++ b/src/java/org/apache/cassandra/cql3/functions/Functions.java @@ -18,6 +18,7 @@ package org.apache.cassandra.cql3.functions; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import com.google.common.collect.ArrayListMultimap; @@ -29,6 +30,8 @@ import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.exceptions.InvalidRequestException; +import org.apache.cassandra.service.IMigrationListener; +import org.apache.cassandra.service.MigrationManager; public abstract class Functions { @@ -83,6 +86,8 @@ private Functions() {} declare(AggregateFcts.avgFunctionForDouble); declare(AggregateFcts.avgFunctionForVarint); declare(AggregateFcts.avgFunctionForDecimal); + + MigrationManager.instance.register(new FunctionsMigrationListener()); } private static void declare(Function fun) @@ -188,7 +193,7 @@ public static Function find(FunctionName name, List> argTypes) assert name.hasKeyspace() : "function name not fully qualified"; for (Function f : declared.get(name)) { - if (f.argTypes().equals(argTypes)) + if (typeEquals(f.argTypes(), argTypes)) return f; } return null; @@ -284,4 +289,47 @@ public static void replaceFunction(UDFunction fun) removeFunction(fun.name(), fun.argTypes()); addFunction(fun); } + + public static Collection all() + { + return declared.values(); + } + + public static boolean typeEquals(AbstractType t1, AbstractType t2) + { + return t1.asCQL3Type().toString().equals(t2.asCQL3Type().toString()); + } + + public static boolean typeEquals(List> t1, List> t2) + { + if (t1.size() != t2.size()) + return false; + for (int i = 0; i < t1.size(); i ++) + if (!typeEquals(t1.get(i), t2.get(i))) + return false; + return true; + } + + private static class FunctionsMigrationListener implements IMigrationListener + { + public void onCreateKeyspace(String ksName) { } + public void onCreateColumnFamily(String ksName, String cfName) { } + public void onCreateUserType(String ksName, String typeName) { } + public void onCreateFunction(String ksName, String functionName) { } + + public void onUpdateKeyspace(String ksName) { } + public void onUpdateColumnFamily(String ksName, String cfName) { } + public void onUpdateUserType(String ksName, String typeName) { + for (Function function : all()) + if (function instanceof UDFunction) + ((UDFunction)function).userTypeUpdated(ksName, typeName); + } + public void onUpdateFunction(String ksName, String functionName) { } + + public void onDropKeyspace(String ksName) { } + public void onDropColumnFamily(String ksName, String cfName) { } + public void onDropUserType(String ksName, String typeName) { } + public void onDropFunction(String ksName, String functionName) { } + + } } diff --git a/src/java/org/apache/cassandra/cql3/functions/JavaSourceUDFFactory.java b/src/java/org/apache/cassandra/cql3/functions/JavaSourceUDFFactory.java index 0f5fe48847c5..560f0779232b 100644 --- a/src/java/org/apache/cassandra/cql3/functions/JavaSourceUDFFactory.java +++ b/src/java/org/apache/cassandra/cql3/functions/JavaSourceUDFFactory.java @@ -20,13 +20,13 @@ import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Modifier; -import java.nio.ByteBuffer; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.datastax.driver.core.DataType; import javassist.CannotCompileException; import javassist.ClassPool; import javassist.CtClass; @@ -56,8 +56,14 @@ static UDFunction buildUDF(FunctionName name, boolean deterministic) throws InvalidRequestException { - Class javaReturnType = UDFunction.javaType(returnType); - Class[] javaParamTypes = UDFunction.javaParamTypes(argTypes); + // argDataTypes is just the C* internal argTypes converted to the Java Driver DataType + DataType[] argDataTypes = UDFunction.driverTypes(argTypes); + // returnDataType is just the C* internal returnType converted to the Java Driver DataType + DataType returnDataType = UDFunction.driverType(returnType); + // javaParamTypes is just the Java representation for argTypes resp. argDataTypes + Class[] javaParamTypes = UDFunction.javaTypes(argDataTypes); + // javaReturnType is just the Java representation for returnType resp. returnDataType + Class javaReturnType = returnDataType.asJavaClass(); String clsName = generateClassName(name); @@ -92,9 +98,13 @@ static UDFunction buildUDF(FunctionName name, Constructor ctor = cc.toClass().getDeclaredConstructor( - FunctionName.class, List.class, List.class, - AbstractType.class, String.class, boolean.class); - return (UDFunction) ctor.newInstance(name, argNames, argTypes, returnType, body, deterministic); + FunctionName.class, List.class, List.class, DataType[].class, + AbstractType.class, DataType.class, + String.class, boolean.class); + return (UDFunction) ctor.newInstance( + name, argNames, argTypes, argDataTypes, + returnType, returnDataType, + body, deterministic); } catch (NotFoundException | CannotCompileException | NoSuchMethodException | LinkageError | InstantiationException | IllegalAccessException e) { @@ -133,10 +143,12 @@ private static String generateConstructor(String clsName) "(org.apache.cassandra.cql3.functions.FunctionName name, " + "java.util.List argNames, " + "java.util.List argTypes, " + + "com.datastax.driver.core.DataType[] argDataTypes, " + "org.apache.cassandra.db.marshal.AbstractType returnType, " + + "com.datastax.driver.core.DataType returnDataType, " + "String body," + "boolean deterministic)\n{" + - " super(name, argNames, argTypes, returnType, \"java\", body, deterministic);\n" + + " super(name, argNames, argTypes, argDataTypes, returnType, returnDataType, \"java\", body, deterministic);\n" + "}"; } @@ -177,15 +189,17 @@ private static String generateExecuteInternalMethod(List argNa * Generated looks like this: *
          *
    -     * public java.nio.ByteBuffer execute(java.util.List params)
    +     * public java.nio.ByteBuffer execute(int protocolVersion, java.util.List params)
          * throws org.apache.cassandra.exceptions.InvalidRequestException
          * {
          *     try
          *     {
          *         Object result = executeInternal(
    -     *             ()org.apache.cassandra.cql3.functions.JavaSourceUDFFactory.compose(argTypes, params, 0)
    +     *             ()compose(protocolVersion, 0, (java.nio.ByteBuffer)params.get(0)),
    +     *             ()compose(protocolVersion, 1, (java.nio.ByteBuffer)params.get(1)),
    +     *             ...
          *         );
    -     *         return result != null ? returnType.decompose(result) : null;
    +     *         return decompose(protocolVersion, result);
          *     }
          *     catch (Throwable t)
          *     {
    @@ -202,7 +216,7 @@ private static String generateExecuteMethod(List argNames, Cla
             // usual methods are 700-800 chars long (prevent temp object allocations)
             StringBuilder code = new StringBuilder(1024);
             // overrides org.apache.cassandra.cql3.functions.Function.execute(java.util.List)
    -        code.append("public java.nio.ByteBuffer execute(java.util.List params)\n" +
    +        code.append("public java.nio.ByteBuffer execute(int protocolVersion, java.util.List params)\n" +
                         "throws org.apache.cassandra.exceptions.InvalidRequestException\n" +
                         "{\n" +
                         "  try\n" +
    @@ -219,13 +233,13 @@ private static String generateExecuteMethod(List argNames, Cla
                 code.
                      // cast to Java type
                      append("\n      (").append(paramTypes[i].getName()).append(")").
    -                 // generate object representation of input parameter
    -                 append("org.apache.cassandra.cql3.functions.JavaSourceUDFFactory.compose(argTypes, params, ").append(i).append(')');
    +                 // generate object representation of input parameter (call UDFunction.compose)
    +                 append("compose(protocolVersion, ").append(i).append(", (java.nio.ByteBuffer)params.get(").append(i).append("))");
             }
     
             code.append("\n    );\n" +
    -                    // generate serialized return value (returnType is a field in AbstractFunction class)
    -                    "    return result != null ? returnType.decompose(result) : null;\n" +
    +                    // generate serialized return value (returnType is a field in AbstractFunction class), (call UDFunction.decompose)
    +                    "    return decompose(protocolVersion, result);\n" +
                         //
                         // error handling ...
                         "  }\n" +
    @@ -242,11 +256,4 @@ private static String generateExecuteMethod(List argNames, Cla
             return code.toString();
         }
     
    -    // Used by execute() implementations of generated java source UDFs.
    -    public static Object compose(List> argTypes, List parameters, int param)
    -    {
    -        ByteBuffer bb = parameters.get(param);
    -        return bb == null ? null : argTypes.get(param).compose(bb);
    -    }
    -
     }
    diff --git a/src/java/org/apache/cassandra/cql3/functions/ScalarFunction.java b/src/java/org/apache/cassandra/cql3/functions/ScalarFunction.java
    index ba2a3741ca18..f00faf79d3fa 100644
    --- a/src/java/org/apache/cassandra/cql3/functions/ScalarFunction.java
    +++ b/src/java/org/apache/cassandra/cql3/functions/ScalarFunction.java
    @@ -30,9 +30,10 @@ public interface ScalarFunction extends Function
         /**
          * Applies this function to the specified parameter.
          *
    +     * @param protocolVersion protocol version used for parameters and return value
          * @param parameters the input parameters
          * @return the result of applying this function to the parameter
          * @throws InvalidRequestException if this function cannot not be applied to the parameter
          */
    -    public ByteBuffer execute(List parameters) throws InvalidRequestException;
    +    public ByteBuffer execute(int protocolVersion, List parameters) throws InvalidRequestException;
     }
    diff --git a/src/java/org/apache/cassandra/cql3/functions/ScriptBasedUDF.java b/src/java/org/apache/cassandra/cql3/functions/ScriptBasedUDF.java
    index 73fc43b1f680..059a61298fa9 100644
    --- a/src/java/org/apache/cassandra/cql3/functions/ScriptBasedUDF.java
    +++ b/src/java/org/apache/cassandra/cql3/functions/ScriptBasedUDF.java
    @@ -88,15 +88,11 @@ public class ScriptBasedUDF extends UDFunction
             }
         }
     
    -    public ByteBuffer execute(List parameters) throws InvalidRequestException
    +    public ByteBuffer execute(int protocolVersion, List parameters) throws InvalidRequestException
         {
             Object[] params = new Object[argTypes.size()];
             for (int i = 0; i < params.length; i++)
    -        {
    -            ByteBuffer bb = parameters.get(i);
    -            if (bb != null)
    -                params[i] = argTypes.get(i).compose(bb);
    -        }
    +            params[i] = compose(protocolVersion, i, parameters.get(i));
     
             try
             {
    @@ -108,7 +104,7 @@ public ByteBuffer execute(List parameters) throws InvalidRequestExce
                 if (result == null)
                     return null;
     
    -            Class javaReturnType = returnType.getSerializer().getType();
    +            Class javaReturnType = returnDataType.asJavaClass();
                 Class resultType = result.getClass();
                 if (!javaReturnType.isAssignableFrom(resultType))
                 {
    @@ -138,8 +134,7 @@ else if (javaReturnType == BigDecimal.class)
                     }
                 }
     
    -            @SuppressWarnings("unchecked") ByteBuffer r = ((AbstractType) returnType).decompose(result);
    -            return r;
    +            return decompose(protocolVersion, result);
             }
             catch (RuntimeException | ScriptException e)
             {
    diff --git a/src/java/org/apache/cassandra/cql3/functions/TimeuuidFcts.java b/src/java/org/apache/cassandra/cql3/functions/TimeuuidFcts.java
    index e481cf5021be..c1c3490a2010 100644
    --- a/src/java/org/apache/cassandra/cql3/functions/TimeuuidFcts.java
    +++ b/src/java/org/apache/cassandra/cql3/functions/TimeuuidFcts.java
    @@ -31,7 +31,7 @@ public abstract class TimeuuidFcts
     {
         public static final Function nowFct = new NativeScalarFunction("now", TimeUUIDType.instance)
         {
    -        public ByteBuffer execute(List parameters)
    +        public ByteBuffer execute(int protocolVersion, List parameters)
             {
                 return ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes());
             }
    @@ -45,7 +45,7 @@ public boolean isPure()
     
         public static final Function minTimeuuidFct = new NativeScalarFunction("mintimeuuid", TimeUUIDType.instance, TimestampType.instance)
         {
    -        public ByteBuffer execute(List parameters)
    +        public ByteBuffer execute(int protocolVersion, List parameters)
             {
                 ByteBuffer bb = parameters.get(0);
                 if (bb == null)
    @@ -57,7 +57,7 @@ public ByteBuffer execute(List parameters)
     
         public static final Function maxTimeuuidFct = new NativeScalarFunction("maxtimeuuid", TimeUUIDType.instance, TimestampType.instance)
         {
    -        public ByteBuffer execute(List parameters)
    +        public ByteBuffer execute(int protocolVersion, List parameters)
             {
                 ByteBuffer bb = parameters.get(0);
                 if (bb == null)
    @@ -69,7 +69,7 @@ public ByteBuffer execute(List parameters)
     
         public static final Function dateOfFct = new NativeScalarFunction("dateof", TimestampType.instance, TimeUUIDType.instance)
         {
    -        public ByteBuffer execute(List parameters)
    +        public ByteBuffer execute(int protocolVersion, List parameters)
             {
                 ByteBuffer bb = parameters.get(0);
                 if (bb == null)
    @@ -81,7 +81,7 @@ public ByteBuffer execute(List parameters)
     
         public static final Function unixTimestampOfFct = new NativeScalarFunction("unixtimestampof", LongType.instance, TimeUUIDType.instance)
         {
    -        public ByteBuffer execute(List parameters)
    +        public ByteBuffer execute(int protocolVersion, List parameters)
             {
                 ByteBuffer bb = parameters.get(0);
                 if (bb == null)
    diff --git a/src/java/org/apache/cassandra/cql3/functions/TokenFct.java b/src/java/org/apache/cassandra/cql3/functions/TokenFct.java
    index ca4d473d8557..9d50a972f625 100644
    --- a/src/java/org/apache/cassandra/cql3/functions/TokenFct.java
    +++ b/src/java/org/apache/cassandra/cql3/functions/TokenFct.java
    @@ -50,7 +50,7 @@ private static AbstractType[] getKeyTypes(CFMetaData cfm)
             return types;
         }
     
    -    public ByteBuffer execute(List parameters) throws InvalidRequestException
    +    public ByteBuffer execute(int protocolVersion, List parameters) throws InvalidRequestException
         {
             CBuilder builder = cfm.getKeyValidatorAsCType().builder();
             for (int i = 0; i < parameters.size(); i++)
    diff --git a/src/java/org/apache/cassandra/cql3/functions/UDFunction.java b/src/java/org/apache/cassandra/cql3/functions/UDFunction.java
    index 42418c67a64d..973c70ad3f6c 100644
    --- a/src/java/org/apache/cassandra/cql3/functions/UDFunction.java
    +++ b/src/java/org/apache/cassandra/cql3/functions/UDFunction.java
    @@ -17,6 +17,9 @@
      */
     package org.apache.cassandra.cql3.functions;
     
    +import java.lang.invoke.MethodHandle;
    +import java.lang.invoke.MethodHandles;
    +import java.lang.reflect.Method;
     import java.nio.ByteBuffer;
     import java.nio.charset.StandardCharsets;
     import java.security.MessageDigest;
    @@ -26,6 +29,11 @@
     import org.slf4j.Logger;
     import org.slf4j.LoggerFactory;
     
    +import com.datastax.driver.core.DataType;
    +import com.datastax.driver.core.ProtocolVersion;
    +import com.datastax.driver.core.UserType;
    +import org.apache.cassandra.config.KSMetaData;
    +import org.apache.cassandra.config.Schema;
     import org.apache.cassandra.cql3.*;
     import org.apache.cassandra.db.*;
     import org.apache.cassandra.db.composites.Composite;
    @@ -33,6 +41,8 @@
     import org.apache.cassandra.db.marshal.UTF8Type;
     import org.apache.cassandra.db.marshal.TypeParser;
     import org.apache.cassandra.exceptions.*;
    +import org.apache.cassandra.service.MigrationManager;
    +import org.apache.cassandra.utils.ByteBufferUtil;
     import org.apache.cassandra.utils.FBUtilities;
     
     /**
    @@ -42,11 +52,83 @@ public abstract class UDFunction extends AbstractFunction implements ScalarFunct
     {
         protected static final Logger logger = LoggerFactory.getLogger(UDFunction.class);
     
    +    // TODO make these c'tors and methods public in Java-Driver - see https://datastax-oss.atlassian.net/browse/JAVA-502
    +    static final MethodHandle methodParseOne;
    +    static
    +    {
    +        try
    +        {
    +            Class cls = Class.forName("com.datastax.driver.core.CassandraTypeParser");
    +            Method m = cls.getDeclaredMethod("parseOne", String.class);
    +            m.setAccessible(true);
    +            methodParseOne = MethodHandles.lookup().unreflect(m);
    +        }
    +        catch (Exception e)
    +        {
    +            throw new RuntimeException(e);
    +        }
    +    }
    +
    +    /**
    +     * Construct an array containing the Java classes for the given Java Driver {@link com.datastax.driver.core.DataType}s.
    +     *
    +     * @param dataTypes array with UDF argument types
    +     * @return array of same size with UDF arguments
    +     */
    +    public static Class[] javaTypes(DataType[] dataTypes)
    +    {
    +        Class paramTypes[] = new Class[dataTypes.length];
    +        for (int i = 0; i < paramTypes.length; i++)
    +            paramTypes[i] = dataTypes[i].asJavaClass();
    +        return paramTypes;
    +    }
    +
    +    /**
    +     * Construct an array containing the Java Driver {@link com.datastax.driver.core.DataType}s for the
    +     * C* internal types.
    +     *
    +     * @param abstractTypes list with UDF argument types
    +     * @return array with argument types as {@link com.datastax.driver.core.DataType}
    +     */
    +    public static DataType[] driverTypes(List> abstractTypes)
    +    {
    +        DataType[] argDataTypes = new DataType[abstractTypes.size()];
    +        for (int i = 0; i < argDataTypes.length; i++)
    +            argDataTypes[i] = driverType(abstractTypes.get(i));
    +        return argDataTypes;
    +    }
    +
    +    /**
    +     * Returns the Java Driver {@link com.datastax.driver.core.DataType} for the C* internal type.
    +     */
    +    public static DataType driverType(AbstractType abstractType)
    +    {
    +        CQL3Type cqlType = abstractType.asCQL3Type();
    +        try
    +        {
    +            return (DataType) methodParseOne.invoke(cqlType.getType().toString());
    +        }
    +        catch (RuntimeException | Error e)
    +        {
    +            // immediately rethrow these...
    +            throw e;
    +        }
    +        catch (Throwable e)
    +        {
    +            throw new RuntimeException("cannot parse driver type " + cqlType.getType().toString(), e);
    +        }
    +    }
    +
    +    // instance vars
    +
         protected final List argNames;
     
         protected final String language;
         protected final String body;
    -    private final boolean deterministic;
    +    protected final boolean deterministic;
    +
    +    protected final DataType[] argDataTypes;
    +    protected final DataType returnDataType;
     
         protected UDFunction(FunctionName name,
                              List argNames,
    @@ -56,12 +138,53 @@ protected UDFunction(FunctionName name,
                              String body,
                              boolean deterministic)
         {
    +        this(name, argNames, argTypes, driverTypes(argTypes), returnType,
    +             driverType(returnType), language, body, deterministic);
    +    }
    +
    +    protected UDFunction(FunctionName name,
    +                         List argNames,
    +                         List> argTypes,
    +                         DataType[] argDataTypes,
    +                         AbstractType returnType,
    +                         DataType returnDataType,
    +                         String language,
    +                         String body,
    +                         boolean deterministic)
    +        {
             super(name, argTypes, returnType);
             assert new HashSet<>(argNames).size() == argNames.size() : "duplicate argument names";
             this.argNames = argNames;
             this.language = language;
             this.body = body;
             this.deterministic = deterministic;
    +        this.argDataTypes = argDataTypes;
    +        this.returnDataType = returnDataType;
    +    }
    +
    +    /**
    +     * Used by UDF implementations (both Java code generated by {@link org.apache.cassandra.cql3.functions.JavaSourceUDFFactory}
    +     * and script executor {@link org.apache.cassandra.cql3.functions.ScriptBasedUDF}) to convert the C*
    +     * serialized representation to the Java object representation.
    +     *
    +     * @param protocolVersion the native protocol version used for serialization
    +     * @param argIndex        index of the UDF input argument
    +     */
    +    protected Object compose(int protocolVersion, int argIndex, ByteBuffer value)
    +    {
    +        return value == null ? null : argDataTypes[argIndex].deserialize(value, ProtocolVersion.fromInt(protocolVersion));
    +    }
    +
    +    /**
    +     * Used by UDF implementations (both Java code generated by {@link org.apache.cassandra.cql3.functions.JavaSourceUDFFactory}
    +     * and script executor {@link org.apache.cassandra.cql3.functions.ScriptBasedUDF}) to convert the Java
    +     * object representation for the return value to the C* serialized representation.
    +     *
    +     * @param protocolVersion the native protocol version used for serialization
    +     */
    +    protected ByteBuffer decompose(int protocolVersion, Object value)
    +    {
    +        return value == null ? null : returnDataType.serialize(value, ProtocolVersion.fromInt(protocolVersion));
         }
     
         public boolean isAggregate()
    @@ -85,19 +208,6 @@ public static UDFunction create(FunctionName name,
             }
         }
     
    -    static Class[] javaParamTypes(List> argTypes)
    -    {
    -        Class paramTypes[] = new Class[argTypes.size()];
    -        for (int i = 0; i < paramTypes.length; i++)
    -            paramTypes[i] = javaType(argTypes.get(i));
    -        return paramTypes;
    -    }
    -
    -    static Class javaType(AbstractType type)
    -    {
    -        return type.getSerializer().getType();
    -    }
    -
         /**
          * It can happen that a function has been declared (is listed in the scheam) but cannot
          * be loaded (maybe only on some nodes). This is the case for instance if the class defining
    @@ -117,7 +227,7 @@ private static UDFunction createBrokenFunction(FunctionName name,
         {
             return new UDFunction(name, argNames, argTypes, returnType, language, body, true)
             {
    -            public ByteBuffer execute(List parameters) throws InvalidRequestException
    +            public ByteBuffer execute(int protocolVersion, List parameters) throws InvalidRequestException
                 {
                     throw new InvalidRequestException(String.format("Function '%s' exists but hasn't been loaded successfully for the following reason: %s. "
                                                                   + "Please see the server log for more details", this, reason.getMessage()));
    @@ -135,7 +245,7 @@ private static ByteBuffer computeSignature(List> argTypes)
         {
             MessageDigest digest = FBUtilities.newMessageDigest("SHA-1");
             for (AbstractType type : argTypes)
    -            digest.update(type.toString().getBytes(StandardCharsets.UTF_8));
    +            digest.update(type.asCQL3Type().toString().getBytes(StandardCharsets.UTF_8));
             return ByteBuffer.wrap(digest.digest());
         }
     
    @@ -268,8 +378,8 @@ public boolean equals(Object o)
             UDFunction that = (UDFunction)o;
             return Objects.equal(this.name, that.name)
                 && Objects.equal(this.argNames, that.argNames)
    -            && Objects.equal(this.argTypes, that.argTypes)
    -            && Objects.equal(this.returnType, that.returnType)
    +            && Functions.typeEquals(this.argTypes, that.argTypes)
    +            && Functions.typeEquals(this.returnType, that.returnType)
                 && Objects.equal(this.language, that.language)
                 && Objects.equal(this.body, that.body)
                 && Objects.equal(this.deterministic, that.deterministic);
    @@ -280,4 +390,35 @@ public int hashCode()
         {
             return Objects.hashCode(name, argNames, argTypes, returnType, language, body, deterministic);
         }
    +
    +    public void userTypeUpdated(String ksName, String typeName)
    +    {
    +        boolean updated = false;
    +
    +        for (int i = 0; i < argDataTypes.length; i++)
    +        {
    +            DataType dataType = argDataTypes[i];
    +            if (dataType instanceof UserType)
    +            {
    +                UserType userType = (UserType) dataType;
    +                if (userType.getKeyspace().equals(ksName) && userType.getTypeName().equals(typeName))
    +                {
    +                    KSMetaData ksm = Schema.instance.getKSMetaData(ksName);
    +                    assert ksm != null;
    +
    +                    org.apache.cassandra.db.marshal.UserType ut = ksm.userTypes.getType(ByteBufferUtil.bytes(typeName));
    +
    +                    DataType newUserType = driverType(ut);
    +                    argDataTypes[i] = newUserType;
    +
    +                    argTypes.set(i, ut);
    +
    +                    updated = true;
    +                }
    +            }
    +        }
    +
    +        if (updated)
    +            MigrationManager.announceNewFunction(this, true);
    +    }
     }
    diff --git a/src/java/org/apache/cassandra/cql3/functions/UuidFcts.java b/src/java/org/apache/cassandra/cql3/functions/UuidFcts.java
    index b3cef8566723..afb5aaebf4df 100644
    --- a/src/java/org/apache/cassandra/cql3/functions/UuidFcts.java
    +++ b/src/java/org/apache/cassandra/cql3/functions/UuidFcts.java
    @@ -28,7 +28,7 @@ public abstract class UuidFcts
     {
         public static final Function uuidFct = new NativeScalarFunction("uuid", UUIDType.instance)
         {
    -        public ByteBuffer execute(List parameters)
    +        public ByteBuffer execute(int protocolVersion, List parameters)
             {
                 return UUIDSerializer.instance.serialize(UUID.randomUUID());
             }
    diff --git a/src/java/org/apache/cassandra/cql3/selection/AggregateFunctionSelector.java b/src/java/org/apache/cassandra/cql3/selection/AggregateFunctionSelector.java
    index 6ea9716cfc7f..7702796ee610 100644
    --- a/src/java/org/apache/cassandra/cql3/selection/AggregateFunctionSelector.java
    +++ b/src/java/org/apache/cassandra/cql3/selection/AggregateFunctionSelector.java
    @@ -34,20 +34,20 @@ public boolean isAggregate()
             return true;
         }
     
    -    public void addInput(ResultSetBuilder rs) throws InvalidRequestException
    +    public void addInput(int protocolVersion, ResultSetBuilder rs) throws InvalidRequestException
         {
             // Aggregation of aggregation is not supported
             for (int i = 0, m = argSelectors.size(); i < m; i++)
             {
                 Selector s = argSelectors.get(i);
    -            s.addInput(rs);
    -            args.set(i, s.getOutput());
    +            s.addInput(protocolVersion, rs);
    +            args.set(i, s.getOutput(protocolVersion));
                 s.reset();
             }
             this.aggregate.addInput(args);
         }
     
    -    public ByteBuffer getOutput() throws InvalidRequestException
    +    public ByteBuffer getOutput(int protocolVersion) throws InvalidRequestException
         {
             return aggregate.compute();
         }
    diff --git a/src/java/org/apache/cassandra/cql3/selection/FieldSelector.java b/src/java/org/apache/cassandra/cql3/selection/FieldSelector.java
    index 7e1448643929..d69559870a18 100644
    --- a/src/java/org/apache/cassandra/cql3/selection/FieldSelector.java
    +++ b/src/java/org/apache/cassandra/cql3/selection/FieldSelector.java
    @@ -64,14 +64,14 @@ public boolean isAggregate()
             return false;
         }
     
    -    public void addInput(ResultSetBuilder rs) throws InvalidRequestException
    +    public void addInput(int protocolVersion, ResultSetBuilder rs) throws InvalidRequestException
         {
    -        selected.addInput(rs);
    +        selected.addInput(protocolVersion, rs);
         }
     
    -    public ByteBuffer getOutput() throws InvalidRequestException
    +    public ByteBuffer getOutput(int protocolVersion) throws InvalidRequestException
         {
    -        ByteBuffer value = selected.getOutput();
    +        ByteBuffer value = selected.getOutput(protocolVersion);
             if (value == null)
                 return null;
             ByteBuffer[] buffers = type.split(value);
    diff --git a/src/java/org/apache/cassandra/cql3/selection/ScalarFunctionSelector.java b/src/java/org/apache/cassandra/cql3/selection/ScalarFunctionSelector.java
    index 4ceadb9103cb..bb56bb8dcce7 100644
    --- a/src/java/org/apache/cassandra/cql3/selection/ScalarFunctionSelector.java
    +++ b/src/java/org/apache/cassandra/cql3/selection/ScalarFunctionSelector.java
    @@ -36,12 +36,12 @@ public boolean isAggregate()
             return argSelectors.get(0).isAggregate();
         }
     
    -    public void addInput(ResultSetBuilder rs) throws InvalidRequestException
    +    public void addInput(int protocolVersion, ResultSetBuilder rs) throws InvalidRequestException
         {
             for (int i = 0, m = argSelectors.size(); i < m; i++)
             {
                 Selector s = argSelectors.get(i);
    -            s.addInput(rs);
    +            s.addInput(protocolVersion, rs);
             }
         }
     
    @@ -49,15 +49,15 @@ public void reset()
         {
         }
     
    -    public ByteBuffer getOutput() throws InvalidRequestException
    +    public ByteBuffer getOutput(int protocolVersion) throws InvalidRequestException
         {
             for (int i = 0, m = argSelectors.size(); i < m; i++)
             {
                 Selector s = argSelectors.get(i);
    -            args.set(i, s.getOutput());
    +            args.set(i, s.getOutput(protocolVersion));
                 s.reset();
             }
    -        return fun.execute(args);
    +        return fun.execute(protocolVersion, args);
         }
     
         ScalarFunctionSelector(Function fun, List argSelectors)
    diff --git a/src/java/org/apache/cassandra/cql3/selection/Selection.java b/src/java/org/apache/cassandra/cql3/selection/Selection.java
    index 888d96d506d1..6ad36e9da394 100644
    --- a/src/java/org/apache/cassandra/cql3/selection/Selection.java
    +++ b/src/java/org/apache/cassandra/cql3/selection/Selection.java
    @@ -219,33 +219,33 @@ private boolean isDead(Cell c)
                 return c == null || !c.isLive(now);
             }
     
    -        public void newRow() throws InvalidRequestException
    +        public void newRow(int protocolVersion) throws InvalidRequestException
             {
                 if (current != null)
                 {
    -                selectors.addInputRow(this);
    +                selectors.addInputRow(protocolVersion, this);
                     if (!selectors.isAggregate())
                     {
    -                    resultSet.addRow(selectors.getOutputRow());
    +                    resultSet.addRow(selectors.getOutputRow(protocolVersion));
                         selectors.reset();
                     }
                 }
                 current = new ArrayList(columns.size());
             }
     
    -        public ResultSet build() throws InvalidRequestException
    +        public ResultSet build(int protocolVersion) throws InvalidRequestException
             {
                 if (current != null)
                 {
    -                selectors.addInputRow(this);
    -                resultSet.addRow(selectors.getOutputRow());
    +                selectors.addInputRow(protocolVersion, this);
    +                resultSet.addRow(selectors.getOutputRow(protocolVersion));
                     selectors.reset();
                     current = null;
                 }
     
                 if (resultSet.isEmpty() && selectors.isAggregate())
                 {
    -                resultSet.addRow(selectors.getOutputRow());
    +                resultSet.addRow(selectors.getOutputRow(protocolVersion));
                 }
                 return resultSet;
             }
    @@ -268,9 +268,9 @@ private static interface Selectors
              * @param rs the ResultSetBuilder
              * @throws InvalidRequestException
              */
    -        public void addInputRow(ResultSetBuilder rs) throws InvalidRequestException;
    +        public void addInputRow(int protocolVersion, ResultSetBuilder rs) throws InvalidRequestException;
     
    -        public List getOutputRow() throws InvalidRequestException;
    +        public List getOutputRow(int protocolVersion) throws InvalidRequestException;
     
             public void reset();
         }
    @@ -318,12 +318,12 @@ public void reset()
                         current = null;
                     }
     
    -                public List getOutputRow()
    +                public List getOutputRow(int protocolVersion)
                     {
                         return current;
                     }
     
    -                public void addInputRow(ResultSetBuilder rs) throws InvalidRequestException
    +                public void addInputRow(int protocolVersion, ResultSetBuilder rs) throws InvalidRequestException
                     {
                         current = rs.current;
                     }
    @@ -388,22 +388,22 @@ public boolean isAggregate()
                         return factories.containsOnlyAggregateFunctions();
                     }
     
    -                public List getOutputRow() throws InvalidRequestException
    +                public List getOutputRow(int protocolVersion) throws InvalidRequestException
                     {
                         List outputRow = new ArrayList<>(selectors.size());
     
                         for (int i = 0, m = selectors.size(); i < m; i++)
                         {
    -                        outputRow.add(selectors.get(i).getOutput());
    +                        outputRow.add(selectors.get(i).getOutput(protocolVersion));
                         }
                         return outputRow;
                     }
     
    -                public void addInputRow(ResultSetBuilder rs) throws InvalidRequestException
    +                public void addInputRow(int protocolVersion, ResultSetBuilder rs) throws InvalidRequestException
                     {
                         for (int i = 0, m = selectors.size(); i < m; i++)
                         {
    -                        selectors.get(i).addInput(rs);
    +                        selectors.get(i).addInput(protocolVersion, rs);
                         }
                     }
                 };
    diff --git a/src/java/org/apache/cassandra/cql3/selection/Selector.java b/src/java/org/apache/cassandra/cql3/selection/Selector.java
    index f2c729b70757..0c1933f57d64 100644
    --- a/src/java/org/apache/cassandra/cql3/selection/Selector.java
    +++ b/src/java/org/apache/cassandra/cql3/selection/Selector.java
    @@ -120,18 +120,20 @@ public boolean isTTLSelectorFactory()
         /**
          * Add the current value from the specified ResultSetBuilder.
          *
    +     * @param protocolVersion protocol version used for serialization
          * @param rs the ResultSetBuilder
          * @throws InvalidRequestException if a problem occurs while add the input value
          */
    -    public abstract void addInput(ResultSetBuilder rs) throws InvalidRequestException;
    +    public abstract void addInput(int protocolVersion, ResultSetBuilder rs) throws InvalidRequestException;
     
         /**
          * Returns the selector output.
          *
    +     * @param protocolVersion protocol version used for serialization
          * @return the selector output
          * @throws InvalidRequestException if a problem occurs while computing the output value
          */
    -    public abstract ByteBuffer getOutput() throws InvalidRequestException;
    +    public abstract ByteBuffer getOutput(int protocolVersion) throws InvalidRequestException;
     
         /**
          * Returns the Selector output type.
    diff --git a/src/java/org/apache/cassandra/cql3/selection/SimpleSelector.java b/src/java/org/apache/cassandra/cql3/selection/SimpleSelector.java
    index a5ff4cd32474..c2edaeddc34c 100644
    --- a/src/java/org/apache/cassandra/cql3/selection/SimpleSelector.java
    +++ b/src/java/org/apache/cassandra/cql3/selection/SimpleSelector.java
    @@ -21,6 +21,7 @@
     
     import org.apache.cassandra.cql3.selection.Selection.ResultSetBuilder;
     import org.apache.cassandra.db.marshal.AbstractType;
    +import org.apache.cassandra.exceptions.InvalidRequestException;
     
     public final class SimpleSelector extends Selector
     {
    @@ -54,13 +55,13 @@ public Selector newInstance()
         }
     
         @Override
    -    public void addInput(ResultSetBuilder rs)
    +    public void addInput(int protocolVersion, ResultSetBuilder rs) throws InvalidRequestException
         {
             current = rs.current.get(idx);
         }
     
         @Override
    -    public ByteBuffer getOutput()
    +    public ByteBuffer getOutput(int protocolVersion) throws InvalidRequestException
         {
             return current;
         }
    diff --git a/src/java/org/apache/cassandra/cql3/selection/WritetimeOrTTLSelector.java b/src/java/org/apache/cassandra/cql3/selection/WritetimeOrTTLSelector.java
    index 2494334edba2..a1ecd3d4d8a7 100644
    --- a/src/java/org/apache/cassandra/cql3/selection/WritetimeOrTTLSelector.java
    +++ b/src/java/org/apache/cassandra/cql3/selection/WritetimeOrTTLSelector.java
    @@ -63,7 +63,7 @@ public boolean isTTLSelectorFactory()
             };
         }
     
    -    public void addInput(ResultSetBuilder rs)
    +    public void addInput(int protocolVersion, ResultSetBuilder rs)
         {
             if (isWritetime)
             {
    @@ -77,7 +77,7 @@ public void addInput(ResultSetBuilder rs)
             }
         }
     
    -    public ByteBuffer getOutput()
    +    public ByteBuffer getOutput(int protocolVersion)
         {
             return current;
         }
    diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java
    index c41fb08d5b32..8d8c27adc06d 100644
    --- a/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java
    +++ b/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java
    @@ -50,6 +50,7 @@ public final class CreateFunctionStatement extends SchemaAlteringStatement
         private final List argNames;
         private final List argRawTypes;
         private final CQL3Type.Raw rawReturnType;
    +    private String currentKeyspace;
     
         public CreateFunctionStatement(FunctionName functionName,
                                        String language,
    @@ -74,8 +75,10 @@ public CreateFunctionStatement(FunctionName functionName,
     
         public void prepareKeyspace(ClientState state) throws InvalidRequestException
         {
    -        if (!functionName.hasKeyspace() && state.getRawKeyspace() != null)
    -            functionName = new FunctionName(state.getKeyspace(), functionName.name);
    +        currentKeyspace = state.getRawKeyspace();
    +
    +        if (!functionName.hasKeyspace() && currentKeyspace != null)
    +            functionName = new FunctionName(currentKeyspace, functionName.name);
     
             if (!functionName.hasKeyspace())
                 throw new InvalidRequestException("You need to be logged in a keyspace or use a fully qualified function name");
    @@ -112,11 +115,9 @@ public boolean announceMigration(boolean isLocalOnly) throws RequestValidationEx
     
             List> argTypes = new ArrayList<>(argRawTypes.size());
             for (CQL3Type.Raw rawType : argRawTypes)
    -            // We have no proper keyspace to give, which means that this will break (NPE currently)
    -            // for UDT: #7791 is open to fix this
    -            argTypes.add(rawType.prepare(functionName.keyspace).getType());
    +            argTypes.add(rawType.prepare(typeKeyspace(rawType)).getType());
     
    -        AbstractType returnType = rawReturnType.prepare(null).getType();
    +        AbstractType returnType = rawReturnType.prepare(typeKeyspace(rawReturnType)).getType();
     
             Function old = Functions.find(functionName, argTypes);
             if (old != null)
    @@ -126,7 +127,7 @@ public boolean announceMigration(boolean isLocalOnly) throws RequestValidationEx
                 if (!orReplace)
                     throw new InvalidRequestException(String.format("Function %s already exists", old));
     
    -            if (!old.returnType().isValueCompatibleWith(returnType))
    +            if (!Functions.typeEquals(old.returnType(), returnType))
                     throw new InvalidRequestException(String.format("Cannot replace function %s, the new return type %s is not compatible with the return type %s of existing function",
                                                                     functionName, returnType.asCQL3Type(), old.returnType().asCQL3Type()));
             }
    @@ -134,4 +135,12 @@ public boolean announceMigration(boolean isLocalOnly) throws RequestValidationEx
             MigrationManager.announceNewFunction(UDFunction.create(functionName, argNames, argTypes, returnType, language, body, deterministic), isLocalOnly);
             return true;
         }
    +
    +    private String typeKeyspace(CQL3Type.Raw rawType)
    +    {
    +        String ks = rawType.keyspace();
    +        if (ks != null)
    +            return ks;
    +        return functionName.keyspace;
    +    }
     }
    diff --git a/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java b/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java
    index 4cd946093d25..0ba3721cccf4 100644
    --- a/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java
    +++ b/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java
    @@ -103,7 +103,7 @@ public boolean announceMigration(boolean isLocalOnly) throws RequestValidationEx
     
             List> argTypes = new ArrayList<>(argRawTypes.size());
             for (CQL3Type.Raw rawType : argRawTypes)
    -            argTypes.add(rawType.prepare(functionName.keyspace).getType());
    +            argTypes.add(rawType.prepare(typeKeyspace(rawType)).getType());
     
             Function old;
             if (argsPresent)
    @@ -139,4 +139,12 @@ public boolean announceMigration(boolean isLocalOnly) throws RequestValidationEx
             MigrationManager.announceFunctionDrop((UDFunction)old, isLocalOnly);
             return true;
         }
    +
    +    private String typeKeyspace(CQL3Type.Raw rawType)
    +    {
    +        String ks = rawType.keyspace();
    +        if (ks != null)
    +            return ks;
    +        return functionName.keyspace;
    +    }
     }
    diff --git a/src/java/org/apache/cassandra/cql3/statements/DropTypeStatement.java b/src/java/org/apache/cassandra/cql3/statements/DropTypeStatement.java
    index a3b82a4bd97d..ed219570776d 100644
    --- a/src/java/org/apache/cassandra/cql3/statements/DropTypeStatement.java
    +++ b/src/java/org/apache/cassandra/cql3/statements/DropTypeStatement.java
    @@ -20,6 +20,8 @@
     import org.apache.cassandra.auth.Permission;
     import org.apache.cassandra.config.*;
     import org.apache.cassandra.cql3.*;
    +import org.apache.cassandra.cql3.functions.Function;
    +import org.apache.cassandra.cql3.functions.Functions;
     import org.apache.cassandra.db.marshal.*;
     import org.apache.cassandra.exceptions.*;
     import org.apache.cassandra.service.ClientState;
    @@ -72,6 +74,15 @@ public void validate(ClientState state) throws RequestValidationException
             // we drop and 2) existing tables referencing the type (maybe in a nested
             // way).
     
    +        for (Function function : Functions.all())
    +        {
    +            if (isUsedBy(function.returnType()))
    +                throw new InvalidRequestException(String.format("Cannot drop user type %s as it is still used by function %s", name, function));
    +            for (AbstractType argType : function.argTypes())
    +                if (isUsedBy(argType))
    +                    throw new InvalidRequestException(String.format("Cannot drop user type %s as it is still used by function %s", name, function));
    +        }
    +
             for (KSMetaData ksm2 : Schema.instance.getKeyspaceDefinitions())
             {
                 for (UserType ut : ksm2.userTypes.getAllTypes().values())
    diff --git a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java
    index 2607e121b312..4e39614b9df9 100644
    --- a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java
    +++ b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java
    @@ -630,7 +630,7 @@ private static ResultSet buildCasFailureResultSet(ByteBuffer key, ColumnFamily c
             Selection.ResultSetBuilder builder = selection.resultSetBuilder(now);
             SelectStatement.forSelection(cfm, selection).processColumnFamily(key, cf, options, now, builder);
     
    -        return builder.build();
    +        return builder.build(options.getProtocolVersion());
         }
     
         public ResultMessage executeInternal(QueryState queryState, QueryOptions options) throws RequestValidationException, RequestExecutionException
    diff --git a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
    index 2d28b715869f..3360d4090f48 100644
    --- a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
    +++ b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
    @@ -280,7 +280,7 @@ private ResultMessage.Rows pageAggregateQuery(QueryPager pager, QueryOptions opt
                     processColumnFamily(row.key.getKey(), row.cf, options, now, result);
                 }
             }
    -        return new ResultMessage.Rows(result.build());
    +        return new ResultMessage.Rows(result.build(options.getProtocolVersion()));
         }
     
         public ResultMessage.Rows processResults(List rows, QueryOptions options, int limit, long now) throws RequestValidationException
    @@ -1149,7 +1149,7 @@ private ResultSet process(List rows, QueryOptions options, int limit, long
                 processColumnFamily(row.key.getKey(), row.cf, options, now, result);
             }
     
    -        ResultSet cqlRows = result.build();
    +        ResultSet cqlRows = result.build(options.getProtocolVersion());
     
             orderResults(cqlRows);
     
    @@ -1189,7 +1189,7 @@ void processColumnFamily(ByteBuffer key, ColumnFamily cf, QueryOptions options,
             CQL3Row staticRow = iter.getStaticRow();
             if (staticRow != null && !iter.hasNext() && !usesSecondaryIndexing && hasNoClusteringColumnsRestriction())
             {
    -            result.newRow();
    +            result.newRow(options.getProtocolVersion());
                 for (ColumnDefinition def : selection.getColumns())
                 {
                     switch (def.kind)
    @@ -1212,7 +1212,7 @@ void processColumnFamily(ByteBuffer key, ColumnFamily cf, QueryOptions options,
                 CQL3Row cql3Row = iter.next();
     
                 // Respect requested order
    -            result.newRow();
    +            result.newRow(options.getProtocolVersion());
                 // Respect selection order
                 for (ColumnDefinition def : selection.getColumns())
                 {
    diff --git a/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordReader.java b/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordReader.java
    index 555c1cd1f6e1..21e30e2b9026 100644
    --- a/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordReader.java
    +++ b/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordReader.java
    @@ -236,7 +236,7 @@ public long getPos() throws IOException
     
         public Long createKey()
         {
    -        return new Long(0L);
    +        return Long.valueOf(0L);
         }
     
         public Row createValue()
    diff --git a/src/java/org/apache/cassandra/transport/Server.java b/src/java/org/apache/cassandra/transport/Server.java
    index 15fad88e9200..cc071b13fb19 100644
    --- a/src/java/org/apache/cassandra/transport/Server.java
    +++ b/src/java/org/apache/cassandra/transport/Server.java
    @@ -64,6 +64,7 @@ public class Server implements CassandraDaemon.Server
         private static final Logger logger = LoggerFactory.getLogger(Server.class);
         private static final boolean enableEpoll = Boolean.valueOf(System.getProperty("cassandra.native.epoll.enabled", "true"));
     
    +    public static final int VERSION_2 = 2;
         public static final int VERSION_3 = 3;
         public static final int CURRENT_VERSION = VERSION_3;
     
    diff --git a/test/unit/org/apache/cassandra/cql3/CQLTester.java b/test/unit/org/apache/cassandra/cql3/CQLTester.java
    index 9105b9d4b5ab..68f90bd83bed 100644
    --- a/test/unit/org/apache/cassandra/cql3/CQLTester.java
    +++ b/test/unit/org/apache/cassandra/cql3/CQLTester.java
    @@ -18,8 +18,11 @@
     package org.apache.cassandra.cql3;
     
     import java.io.File;
    +import java.io.IOException;
     import java.math.BigDecimal;
     import java.math.BigInteger;
    +import java.net.InetAddress;
    +import java.net.ServerSocket;
     import java.nio.ByteBuffer;
     import java.util.*;
     import java.util.concurrent.CountDownLatch;
    @@ -29,23 +32,31 @@
     
     import com.google.common.base.Objects;
     import com.google.common.collect.ImmutableSet;
    +import org.apache.cassandra.utils.ByteBufferUtil;
     import org.junit.AfterClass;
     import org.junit.After;
     import org.junit.Assert;
    +import org.junit.Before;
     import org.junit.BeforeClass;
     import org.slf4j.Logger;
     import org.slf4j.LoggerFactory;
     
    +import com.datastax.driver.core.*;
    +import com.datastax.driver.core.ResultSet;
     import org.apache.cassandra.SchemaLoader;
     import org.apache.cassandra.concurrent.ScheduledExecutors;
     import org.apache.cassandra.config.CFMetaData;
     import org.apache.cassandra.config.Schema;
     import org.apache.cassandra.db.Directories;
     import org.apache.cassandra.db.Keyspace;
    +import org.apache.cassandra.db.SystemKeyspace;
     import org.apache.cassandra.db.marshal.*;
    +import org.apache.cassandra.db.marshal.TupleType;
     import org.apache.cassandra.exceptions.*;
     import org.apache.cassandra.io.util.FileUtils;
     import org.apache.cassandra.serializers.TypeSerializer;
    +import org.apache.cassandra.service.StorageService;
    +import org.apache.cassandra.transport.Server;
     
     /**
      * Base class for CQL tests.
    @@ -55,17 +66,38 @@ public abstract class CQLTester
         protected static final Logger logger = LoggerFactory.getLogger(CQLTester.class);
     
         public static final String KEYSPACE = "cql_test_keyspace";
    +    public static final String KEYSPACE_PER_TEST = "cql_test_keyspace_alt";
         private static final boolean USE_PREPARED_VALUES = Boolean.valueOf(System.getProperty("cassandra.test.use_prepared", "true"));
         private static final AtomicInteger seqNumber = new AtomicInteger();
     
    +    private static org.apache.cassandra.transport.Server server;
    +    private static final int nativePort;
    +    private static final InetAddress nativeAddr;
    +    private static final Cluster cluster[] = new Cluster[Server.CURRENT_VERSION];
    +    private static final Session session[] = new Session[Server.CURRENT_VERSION];
    +
         static
         {
             // Once per-JVM is enough
             SchemaLoader.prepareServer();
    +
    +        nativeAddr = InetAddress.getLoopbackAddress();
    +
    +        try
    +        {
    +            ServerSocket serverSocket = new ServerSocket(0);
    +            nativePort = serverSocket.getLocalPort();
    +        }
    +        catch (IOException e)
    +        {
    +            throw new RuntimeException(e);
    +        }
         }
     
         private String currentTable;
         private final Set currentTypes = new HashSet<>();
    +    private final Set currentFunctions = new HashSet<>();
    +    private final Set currentAggregates = new HashSet<>();
     
         // We don't use USE_PREPARED_VALUES in the code below so some test can foce value preparation (if the result
         // is not expected to be the same without preparation)
    @@ -80,11 +112,28 @@ public static void setUpClass() throws Throwable
         @AfterClass
         public static void tearDownClass()
         {
    +        for (Session sess : session)
    +            if (sess != null)
    +                sess.close();
    +        for (Cluster cl : cluster)
    +            if (cl != null)
    +                cl.close();
    +
    +        if (server != null)
    +            server.stop();
    +    }
    +
    +    @Before
    +    public void beforeTest() throws Throwable
    +    {
    +        schemaChange(String.format("CREATE KEYSPACE IF NOT EXISTS %s WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}", KEYSPACE_PER_TEST));
         }
     
         @After
         public void afterTest() throws Throwable
         {
    +        dropPerTestKeyspace();
    +
             // Restore standard behavior in case it was changed
             usePrepared = USE_PREPARED_VALUES;
     
    @@ -93,8 +142,12 @@ public void afterTest() throws Throwable
     
             final String tableToDrop = currentTable;
             final Set typesToDrop = currentTypes.isEmpty() ? Collections.emptySet() : new HashSet(currentTypes);
    +        final Set functionsToDrop = currentFunctions.isEmpty() ? Collections.emptySet() : new HashSet(currentFunctions);
    +        final Set aggregatesToDrop = currentAggregates.isEmpty() ? Collections.emptySet() : new HashSet(currentAggregates);
             currentTable = null;
             currentTypes.clear();
    +        currentFunctions.clear();
    +        currentAggregates.clear();
     
             // We want to clean up after the test, but dropping a table is rather long so just do that asynchronously
             ScheduledExecutors.optionalTasks.execute(new Runnable()
    @@ -105,6 +158,12 @@ public void run()
                     {
                         schemaChange(String.format("DROP TABLE IF EXISTS %s.%s", KEYSPACE, tableToDrop));
     
    +                    for (String aggregateName : aggregatesToDrop)
    +                        schemaChange(String.format("DROP AGGREGATE IF EXISTS %s", aggregateName));
    +
    +                    for (String functionName : functionsToDrop)
    +                        schemaChange(String.format("DROP FUNCTION IF EXISTS %s", functionName));
    +
                         for (String typeName : typesToDrop)
                             schemaChange(String.format("DROP TYPE IF EXISTS %s.%s", KEYSPACE, typeName));
     
    @@ -133,6 +192,40 @@ public void run()
             });
         }
     
    +    // lazy initialization for all tests that require Java Driver
    +    private static void requireNetwork() throws ConfigurationException
    +    {
    +        if (server != null)
    +            return;
    +
    +        SystemKeyspace.finishStartup();
    +        StorageService.instance.initServer();
    +        SchemaLoader.startGossiper();
    +
    +        server = new org.apache.cassandra.transport.Server(nativeAddr, nativePort);
    +        server.start();
    +
    +        for (int version = 1; version <= Server.CURRENT_VERSION; version++)
    +        {
    +            if (cluster[version-1] != null)
    +                continue;
    +
    +            cluster[version-1] = Cluster.builder().addContactPoints(nativeAddr)
    +                                  .withClusterName("Test Cluster")
    +                                  .withPort(nativePort)
    +                                  .withProtocolVersion(ProtocolVersion.fromInt(version))
    +                                  .build();
    +            session[version-1] = cluster[version-1].connect();
    +
    +            logger.info("Started Java Driver instance for protocol version {}", version);
    +        }
    +    }
    +
    +    protected void dropPerTestKeyspace() throws Throwable
    +    {
    +        execute(String.format("DROP KEYSPACE IF EXISTS %s", KEYSPACE_PER_TEST));
    +    }
    +
         public void flush()
         {
             try
    @@ -183,7 +276,7 @@ protected void stopForcingPreparedValues()
     
         protected String createType(String query)
         {
    -        String typeName = "type_" + seqNumber.getAndIncrement();
    +        String typeName = callerName() + "_type_" + seqNumber.getAndIncrement();
             String fullQuery = String.format(query, KEYSPACE + "." + typeName);
             currentTypes.add(typeName);
             logger.info(fullQuery);
    @@ -191,18 +284,48 @@ protected String createType(String query)
             return typeName;
         }
     
    +    protected String createFunction(String keyspace, String argTypes, String query) throws Throwable
    +    {
    +        String functionName = keyspace + "." + callerName() + "_function_" + seqNumber.getAndIncrement();
    +        createFunctionOverload(functionName, argTypes, query);
    +        return functionName;
    +    }
    +
    +    protected void createFunctionOverload(String functionName, String argTypes, String query) throws Throwable
    +    {
    +        String fullQuery = String.format(query, functionName);
    +        currentFunctions.add(functionName + '(' + argTypes + ')');
    +        logger.info(fullQuery);
    +        execute(fullQuery);
    +    }
    +
    +    protected String createAggregate(String keyspace, String argTypes, String query) throws Throwable
    +    {
    +        String aggregateName = keyspace + "." + callerName() + "_aggregate_" + seqNumber.getAndIncrement();
    +        createAggregateOverload(aggregateName, argTypes, query);
    +        return aggregateName;
    +    }
    +
    +    protected void createAggregateOverload(String aggregateName, String argTypes, String query) throws Throwable
    +    {
    +        String fullQuery = String.format(query, aggregateName);
    +        currentAggregates.add(aggregateName + '(' + argTypes + ')');
    +        logger.info(fullQuery);
    +        execute(fullQuery);
    +    }
    +
         protected void createTable(String query)
         {
    -        currentTable = "table_" + seqNumber.getAndIncrement();
    -        String fullQuery = String.format(query, KEYSPACE + "." + currentTable);
    +        currentTable = callerName() + "_table_" + seqNumber.getAndIncrement();
    +        String fullQuery = formatQuery(query);
             logger.info(fullQuery);
             schemaChange(fullQuery);
         }
     
         protected void createTableMayThrow(String query) throws Throwable
         {
    -        currentTable = "table_" + seqNumber.getAndIncrement();
    -        String fullQuery = String.format(query, KEYSPACE + "." + currentTable);
    +        currentTable = callerName() + "_table_" + seqNumber.getAndIncrement();
    +        String fullQuery = formatQuery(query);
             logger.info(fullQuery);
             try
             {
    @@ -216,14 +339,14 @@ protected void createTableMayThrow(String query) throws Throwable
     
         protected void alterTable(String query)
         {
    -        String fullQuery = String.format(query, KEYSPACE + "." + currentTable);
    +        String fullQuery = formatQuery(query);
             logger.info(fullQuery);
             schemaChange(fullQuery);
         }
     
         protected void alterTableMayThrow(String query) throws Throwable
         {
    -        String fullQuery = String.format(query, KEYSPACE + "." + currentTable);
    +        String fullQuery = formatQuery(query);
             logger.info(fullQuery);
             try
             {
    @@ -244,14 +367,14 @@ protected void dropTable(String query)
     
         protected void createIndex(String query)
         {
    -        String fullQuery = String.format(query, KEYSPACE + "." + currentTable);
    +        String fullQuery = formatQuery(query);
             logger.info(fullQuery);
             schemaChange(fullQuery);
         }
     
         protected void createIndexMayThrow(String query) throws Throwable
         {
    -        String fullQuery = String.format(query, KEYSPACE + "." + currentTable);
    +        String fullQuery = formatQuery(query);
             logger.info(fullQuery);
             try
             {
    @@ -270,6 +393,11 @@ protected void dropIndex(String query) throws Throwable
             schemaChange(fullQuery);
         }
     
    +    private static String callerName()
    +    {
    +        return new Exception().getStackTrace()[2].getMethodName().toLowerCase();
    +    }
    +
         private static void schemaChange(String query)
         {
             try
    @@ -288,11 +416,24 @@ protected CFMetaData currentTableMetadata()
             return Schema.instance.getCFMetaData(KEYSPACE, currentTable);
         }
     
    +    protected com.datastax.driver.core.ResultSet executeNet(int protocolVersion, String query, Object... values) throws Throwable
    +    {
    +        requireNetwork();
    +
    +        return session[protocolVersion-1].execute(formatQuery(query), values);
    +    }
    +
    +    private String formatQuery(String query)
    +    {
    +        query = currentTable == null ? query : String.format(query, KEYSPACE + "." + currentTable);
    +        return query;
    +    }
    +
         protected UntypedResultSet execute(String query, Object... values) throws Throwable
         {
             try
             {
    -            query = currentTable == null ? query : String.format(query, KEYSPACE + "." + currentTable);
    +            query = formatQuery(query);
     
                 UntypedResultSet rs;
                 if (usePrepared)
    @@ -318,6 +459,64 @@ protected UntypedResultSet execute(String query, Object... values) throws Throwa
             }
         }
     
    +    protected void assertRowsNet(int protocolVersion, ResultSet result, Object[]... rows)
    +    {
    +        if (result == null)
    +        {
    +            if (rows.length > 0)
    +                Assert.fail(String.format("No rows returned by query but %d expected", rows.length));
    +            return;
    +        }
    +
    +        ColumnDefinitions meta = result.getColumnDefinitions();
    +        Iterator iter = result.iterator();
    +        int i = 0;
    +        while (iter.hasNext() && i < rows.length)
    +        {
    +            Object[] expected = rows[i];
    +            Row actual = iter.next();
    +
    +            Assert.assertEquals(String.format("Invalid number of (expected) values provided for row %d (using protocol version %d)",
    +                                              i, protocolVersion),
    +                                meta.size(), expected.length);
    +
    +            for (int j = 0; j < meta.size(); j++)
    +            {
    +                DataType type = meta.getType(j);
    +                ByteBuffer expectedByteValue = type.serialize(expected[j], ProtocolVersion.fromInt(protocolVersion));
    +                int expectedBytes = expectedByteValue.remaining();
    +                ByteBuffer actualValue = actual.getBytesUnsafe(meta.getName(j));
    +                int actualBytes = actualValue.remaining();
    +
    +                if (!Objects.equal(expectedByteValue, actualValue))
    +                    Assert.fail(String.format("Invalid value for row %d column %d (%s of type %s), " +
    +                                              "expected <%s> (%d bytes) but got <%s> (%d bytes) " +
    +                                              "(using protocol version %d)",
    +                                              i, j, meta.getName(j), type,
    +                                              type.format(expected[j]),
    +                                              expectedBytes,
    +                                              type.format(type.deserialize(actualValue, ProtocolVersion.fromInt(protocolVersion))),
    +                                              actualBytes,
    +                                              protocolVersion));
    +            }
    +            i++;
    +        }
    +
    +        if (iter.hasNext())
    +        {
    +            while (iter.hasNext())
    +            {
    +                iter.next();
    +                i++;
    +            }
    +            Assert.fail(String.format("Got less rows than expected. Expected %d but got %d (using protocol version %d).",
    +                                      rows.length, i, protocolVersion));
    +        }
    +
    +        Assert.assertTrue(String.format("Got %s rows than expected. Expected %d but got %d (using protocol version %d)",
    +                                        rows.length>i ? "less" : "more", rows.length, i, protocolVersion), i == rows.length);
    +    }
    +
         protected void assertRows(UntypedResultSet result, Object[]... rows)
         {
             if (result == null)
    @@ -394,7 +593,7 @@ protected Object[] row(Object... expected)
         protected void assertEmpty(UntypedResultSet result) throws Throwable
         {
             if (result != null && result.size() != 0)
    -            throw new InvalidRequestException(String.format("Expected empty result but got %d rows", result.size()));
    +            throw new AssertionError(String.format("Expected empty result but got %d rows", result.size()));
         }
     
         protected void assertInvalid(String query, Object... values) throws Throwable
    @@ -406,7 +605,16 @@ protected void assertInvalidMessage(String errorMessage, String query, Object...
         {
             try
             {
    -            execute(query, values);
    +            try
    +            {
    +                execute(query, values);
    +            }
    +            catch (RuntimeException e)
    +            {
    +                Throwable cause = e.getCause();
    +                if (cause instanceof InvalidRequestException)
    +                    throw cause;
    +            }
                 String q = USE_PREPARED_VALUES
                          ? query + " (values: " + formatAllValues(values) + ")"
                          : replaceValues(query, values);
    diff --git a/test/unit/org/apache/cassandra/cql3/UFTest.java b/test/unit/org/apache/cassandra/cql3/UFTest.java
    index 4975ca9833fe..824719bb38d0 100644
    --- a/test/unit/org/apache/cassandra/cql3/UFTest.java
    +++ b/test/unit/org/apache/cassandra/cql3/UFTest.java
    @@ -19,50 +19,51 @@
     
     import java.math.BigDecimal;
     import java.math.BigInteger;
    -import java.util.Date;
    +import java.util.*;
     
    -import org.junit.After;
     import org.junit.Assert;
    -import org.junit.Before;
     import org.junit.Test;
     
    +import com.datastax.driver.core.*;
     import org.apache.cassandra.cql3.functions.FunctionName;
     import org.apache.cassandra.cql3.functions.Functions;
     import org.apache.cassandra.exceptions.InvalidRequestException;
     import org.apache.cassandra.service.ClientState;
    +import org.apache.cassandra.transport.Server;
     import org.apache.cassandra.transport.messages.ResultMessage;
     
     public class UFTest extends CQLTester
     {
    -    private static final String KS_FOO = "cqltest_foo";
     
    -    @Before
    -    public void createKsFoo() throws Throwable
    +    public static FunctionName parseFunctionName(String qualifiedName)
         {
    -        execute("CREATE KEYSPACE IF NOT EXISTS "+KS_FOO+" WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3};");
    -    }
    -
    -    @After
    -    public void dropKsFoo() throws Throwable
    -    {
    -        execute("DROP KEYSPACE IF EXISTS "+KS_FOO+";");
    +        int i = qualifiedName.indexOf('.');
    +        return i == -1
    +               ? FunctionName.nativeFunction(qualifiedName)
    +               : new FunctionName(qualifiedName.substring(0, i).trim(), qualifiedName.substring(i+1).trim());
         }
     
         @Test
         public void testFunctionDropOnKeyspaceDrop() throws Throwable
         {
    -        execute("CREATE FUNCTION " + KS_FOO + ".sin ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(Math.sin(input.doubleValue()));'");
    +        String fSin = createFunction(KEYSPACE_PER_TEST, "double",
    +                                     "CREATE FUNCTION %s ( input double ) " +
    +                                     "RETURNS double " +
    +                                     "LANGUAGE java " +
    +                                     "AS 'return Double.valueOf(Math.sin(input.doubleValue()));'");
     
    -        Assert.assertEquals(1, Functions.find(new FunctionName(KS_FOO, "sin")).size());
    +        FunctionName fSinName = parseFunctionName(fSin);
     
    -        assertRows(execute("SELECT function_name, language FROM system.schema_functions WHERE keyspace_name=?", KS_FOO),
    -                   row("sin", "java"));
    +        Assert.assertEquals(1, Functions.find(parseFunctionName(fSin)).size());
     
    -        execute("DROP KEYSPACE "+KS_FOO+";");
    +        assertRows(execute("SELECT function_name, language FROM system.schema_functions WHERE keyspace_name=?", KEYSPACE_PER_TEST),
    +                   row(fSinName.name, "java"));
     
    -        assertRows(execute("SELECT function_name, language FROM system.schema_functions WHERE keyspace_name=?", KS_FOO));
    +        dropPerTestKeyspace();
     
    -        Assert.assertEquals(0, Functions.find(new FunctionName(KS_FOO, "sin")).size());
    +        assertRows(execute("SELECT function_name, language FROM system.schema_functions WHERE keyspace_name=?", KEYSPACE_PER_TEST));
    +
    +        Assert.assertEquals(0, Functions.find(fSinName).size());
         }
     
         @Test
    @@ -70,27 +71,40 @@ public void testFunctionDropPreparedStatement() throws Throwable
         {
             createTable("CREATE TABLE %s (key int PRIMARY KEY, d double)");
     
    -        execute("CREATE FUNCTION " + KS_FOO + ".sin ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(Math.sin(input.doubleValue()));'");
    +        String fSin = createFunction(KEYSPACE_PER_TEST, "double",
    +                                     "CREATE FUNCTION %s ( input double ) " +
    +                                     "RETURNS double " +
    +                                     "LANGUAGE java " +
    +                                     "AS 'return Double.valueOf(Math.sin(input.doubleValue()));'");
    +
    +        FunctionName fSinName = parseFunctionName(fSin);
     
    -        Assert.assertEquals(1, Functions.find(new FunctionName(KS_FOO, "sin")).size());
    +        Assert.assertEquals(1, Functions.find(parseFunctionName(fSin)).size());
     
    -        ResultMessage.Prepared prepared = QueryProcessor.prepare("SELECT key, "+KS_FOO+".sin(d) FROM "+KEYSPACE+'.'+currentTable(), ClientState.forInternalCalls(), false);
    +        ResultMessage.Prepared prepared = QueryProcessor.prepare(
    +                                                    String.format("SELECT key, %s(d) FROM %s.%s", fSin, KEYSPACE, currentTable()),
    +                                                    ClientState.forInternalCalls(), false);
             Assert.assertNotNull(QueryProcessor.instance.getPrepared(prepared.statementId));
     
    -        execute("DROP FUNCTION " + KS_FOO + ".sin(double);");
    +        execute("DROP FUNCTION " + fSin + "(double);");
     
             Assert.assertNull(QueryProcessor.instance.getPrepared(prepared.statementId));
     
             //
     
    -        execute("CREATE FUNCTION " + KS_FOO + ".sin ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(Math.sin(input.doubleValue()));'");
    +        execute("CREATE FUNCTION " + fSin + " ( input double ) " +
    +                "RETURNS double " +
    +                "LANGUAGE java " +
    +                "AS 'return Double.valueOf(Math.sin(input.doubleValue()));'");
     
    -        Assert.assertEquals(1, Functions.find(new FunctionName(KS_FOO, "sin")).size());
    +        Assert.assertEquals(1, Functions.find(fSinName).size());
     
    -        prepared = QueryProcessor.prepare("SELECT key, "+KS_FOO+".sin(d) FROM "+KEYSPACE+'.'+currentTable(), ClientState.forInternalCalls(), false);
    +        prepared = QueryProcessor.prepare(
    +                                         String.format("SELECT key, %s(d) FROM %s.%s", fSin, KEYSPACE, currentTable()),
    +                                         ClientState.forInternalCalls(), false);
             Assert.assertNotNull(QueryProcessor.instance.getPrepared(prepared.statementId));
     
    -        execute("DROP KEYSPACE " + KS_FOO + ";");
    +        dropPerTestKeyspace();
     
             Assert.assertNull(QueryProcessor.instance.getPrepared(prepared.statementId));
         }
    @@ -105,47 +119,55 @@ public void testFunctionCreationAndDrop() throws Throwable
             execute("INSERT INTO %s(key, d) VALUES (?, ?)", 3, 3d);
     
             // simple creation
    -        execute("CREATE FUNCTION "+KS_FOO+".sin ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(Math.sin(input.doubleValue()));'");
    +        String fSin = createFunction(KEYSPACE_PER_TEST, "double",
    +                                     "CREATE FUNCTION %s ( input double ) " +
    +                                     "RETURNS double " +
    +                                     "LANGUAGE java " +
    +                                     "AS 'return Double.valueOf(Math.sin(input.doubleValue()));'");
             // check we can't recreate the same function
    -        assertInvalid("CREATE FUNCTION "+KS_FOO+".sin ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(Math.sin(input.doubleValue()));'");
    -        // but that it doesn't complay with "IF NOT EXISTS"
    -        execute("CREATE FUNCTION IF NOT EXISTS "+KS_FOO+".sin ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(Math.sin(input.doubleValue()));'");
    +        assertInvalid("CREATE FUNCTION " + fSin + " ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(Math.sin(input.doubleValue()));'");
    +        // but that it doesn't comply with "IF NOT EXISTS"
    +        execute("CREATE FUNCTION IF NOT EXISTS " + fSin + " ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(Math.sin(input.doubleValue()));'");
     
             // Validate that it works as expected
    -        assertRows(execute("SELECT key, "+KS_FOO+".sin(d) FROM %s"),
    +        assertRows(execute("SELECT key, " + fSin + "(d) FROM %s"),
                 row(1, Math.sin(1d)),
                 row(2, Math.sin(2d)),
                 row(3, Math.sin(3d))
             );
     
             // Replace the method with incompatible return type
    -        assertInvalid("CREATE OR REPLACE FUNCTION " + KS_FOO + ".sin ( input double ) RETURNS text LANGUAGE java AS 'return Double.valueOf(42d);'");
    +        assertInvalid("CREATE OR REPLACE FUNCTION " + fSin + " ( input double ) RETURNS text LANGUAGE java AS 'return Double.valueOf(42d);'");
             // proper replacement
    -        execute("CREATE OR REPLACE FUNCTION "+KS_FOO+".sin ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(42d);'");
    +        execute("CREATE OR REPLACE FUNCTION " + fSin + " ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(42d);'");
     
             // Validate the method as been replaced
    -        assertRows(execute("SELECT key, "+KS_FOO+".sin(d) FROM %s"),
    +        assertRows(execute("SELECT key, " + fSin + "(d) FROM %s"),
                 row(1, 42.0),
                 row(2, 42.0),
                 row(3, 42.0)
             );
     
    -        // same function but without namespace
    -        execute("CREATE FUNCTION "+KEYSPACE+".sin ( input double ) RETURNS double LANGUAGE java AS 'return Double.valueOf(Math.sin(input.doubleValue()));'");
    -        assertRows(execute("SELECT key, "+KEYSPACE+".sin(d) FROM %s"),
    +        // same function but other keyspace
    +        String fSin2 = createFunction(KEYSPACE, "double",
    +                                      "CREATE FUNCTION %s ( input double ) " +
    +                                      "RETURNS double " +
    +                                      "LANGUAGE java " +
    +                                      "AS 'return Double.valueOf(Math.sin(input.doubleValue()));'");
    +        assertRows(execute("SELECT key, " + fSin2 + "(d) FROM %s"),
                 row(1, Math.sin(1d)),
                 row(2, Math.sin(2d)),
                 row(3, Math.sin(3d))
             );
     
    -        // Drop with and without keyspace
    -        execute("DROP FUNCTION "+KS_FOO+".sin");
    -        execute("DROP FUNCTION "+KEYSPACE+".sin");
    +        // Drop
    +        execute("DROP FUNCTION " + fSin);
    +        execute("DROP FUNCTION " + fSin2);
     
             // Drop unexisting function
    -        assertInvalid("DROP FUNCTION "+KS_FOO+".sin");
    +        assertInvalid("DROP FUNCTION " + fSin);
             // but don't complain with "IF EXISTS"
    -        execute("DROP FUNCTION IF EXISTS "+KS_FOO+".sin");
    +        execute("DROP FUNCTION IF EXISTS " + fSin);
     
             // can't drop native functions
             assertInvalid("DROP FUNCTION dateof");
    @@ -162,13 +184,17 @@ public void testFunctionExecution() throws Throwable
     
             execute("INSERT INTO %s(v) VALUES (?)", "aaa");
     
    -        execute("CREATE FUNCTION "+KEYSPACE+".repeat (v text, n int) RETURNS text LANGUAGE java AS 'StringBuilder sb = new StringBuilder();\n" +
    -                "        for (int i = 0; i < n.intValue(); i++)\n" +
    -                "            sb.append(v);\n" +
    -                "        return sb.toString();'");
    -
    -        assertRows(execute("SELECT v FROM %s WHERE v="+KEYSPACE+".repeat(?, ?)", "a", 3), row("aaa"));
    -        assertEmpty(execute("SELECT v FROM %s WHERE v="+KEYSPACE+".repeat(?, ?)", "a", 2));
    +        String fRepeat = createFunction(KEYSPACE_PER_TEST, "text,int",
    +                                        "CREATE FUNCTION %s(v text, n int) " +
    +                                        "RETURNS text " +
    +                                        "LANGUAGE java " +
    +                                        "AS 'StringBuilder sb = new StringBuilder();\n" +
    +                                        "    for (int i = 0; i < n.intValue(); i++)\n" +
    +                                        "        sb.append(v);\n" +
    +                                        "    return sb.toString();'");
    +
    +        assertRows(execute("SELECT v FROM %s WHERE v=" + fRepeat + "(?, ?)", "a", 3), row("aaa"));
    +        assertEmpty(execute("SELECT v FROM %s WHERE v=" + fRepeat + "(?, ?)", "a", 2));
         }
     
         @Test
    @@ -178,46 +204,56 @@ public void testFunctionOverloading() throws Throwable
     
             execute("INSERT INTO %s(k, v) VALUES (?, ?)", "f2", 1);
     
    -        execute("CREATE FUNCTION "+KEYSPACE+".overloaded(v varchar) RETURNS text LANGUAGE java AS 'return \"f1\";'");
    -        execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".overloaded(i int) RETURNS text LANGUAGE java AS 'return \"f2\";'");
    -        execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".overloaded(v1 text, v2 text) RETURNS text LANGUAGE java AS 'return \"f3\";'");
    -        execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".overloaded(v ascii) RETURNS text LANGUAGE java AS 'return \"f1\";'");
    +        String fOverload = createFunction(KEYSPACE_PER_TEST, "varchar",
    +                                          "CREATE FUNCTION %s ( input varchar ) " +
    +                                          "RETURNS text " +
    +                                          "LANGUAGE java " +
    +                                          "AS 'return \"f1\";'");
    +        createFunctionOverload(fOverload,
    +                               "int",
    +                               "CREATE OR REPLACE FUNCTION %s(i int) RETURNS text LANGUAGE java AS 'return \"f2\";'");
    +        createFunctionOverload(fOverload,
    +                               "text,text",
    +                               "CREATE OR REPLACE FUNCTION %s(v1 text, v2 text) RETURNS text LANGUAGE java AS 'return \"f3\";'");
    +        createFunctionOverload(fOverload,
    +                               "ascii",
    +                               "CREATE OR REPLACE FUNCTION %s(v ascii) RETURNS text LANGUAGE java AS 'return \"f1\";'");
     
             // text == varchar, so this should be considered as a duplicate
    -        assertInvalid("CREATE FUNCTION "+KEYSPACE+".overloaded(v varchar) RETURNS text LANGUAGE java AS 'return \"f1\";'");
    +        assertInvalid("CREATE FUNCTION " + fOverload + "(v varchar) RETURNS text LANGUAGE java AS 'return \"f1\";'");
     
    -        assertRows(execute("SELECT "+KEYSPACE+".overloaded(k), "+KEYSPACE+".overloaded(v), "+KEYSPACE+".overloaded(k, k) FROM %s"),
    +        assertRows(execute("SELECT " + fOverload + "(k), " + fOverload + "(v), " + fOverload + "(k, k) FROM %s"),
                 row("f1", "f2", "f3")
             );
     
             forcePreparedValues();
             // This shouldn't work if we use preparation since there no way to know which overload to use
    -        assertInvalid("SELECT v FROM %s WHERE k = "+KEYSPACE+".overloaded(?)", "foo");
    +        assertInvalid("SELECT v FROM %s WHERE k = " + fOverload + "(?)", "foo");
             stopForcingPreparedValues();
     
             // but those should since we specifically cast
    -        assertEmpty(execute("SELECT v FROM %s WHERE k = "+KEYSPACE+".overloaded((text)?)", "foo"));
    -        assertRows(execute("SELECT v FROM %s WHERE k = "+KEYSPACE+".overloaded((int)?)", 3), row(1));
    -        assertEmpty(execute("SELECT v FROM %s WHERE k = "+KEYSPACE+".overloaded((ascii)?)", "foo"));
    +        assertEmpty(execute("SELECT v FROM %s WHERE k = " + fOverload + "((text)?)", "foo"));
    +        assertRows(execute("SELECT v FROM %s WHERE k = " + fOverload + "((int)?)", 3), row(1));
    +        assertEmpty(execute("SELECT v FROM %s WHERE k = " + fOverload + "((ascii)?)", "foo"));
             // And since varchar == text, this should work too
    -        assertEmpty(execute("SELECT v FROM %s WHERE k = "+KEYSPACE+".overloaded((varchar)?)", "foo"));
    +        assertEmpty(execute("SELECT v FROM %s WHERE k = " + fOverload + "((varchar)?)", "foo"));
     
             // no such functions exist...
    -        assertInvalid("DROP FUNCTION "+KEYSPACE+".overloaded(boolean)");
    -        assertInvalid("DROP FUNCTION "+KEYSPACE+".overloaded(bigint)");
    +        assertInvalid("DROP FUNCTION " + fOverload + "(boolean)");
    +        assertInvalid("DROP FUNCTION " + fOverload + "(bigint)");
     
             // 'overloaded' has multiple overloads - so it has to fail (CASSANDRA-7812)
    -        assertInvalid("DROP FUNCTION "+KEYSPACE+".overloaded");
    -        execute("DROP FUNCTION " + KEYSPACE + ".overloaded(varchar)");
    -        assertInvalid("SELECT v FROM %s WHERE k = " + KEYSPACE + ".overloaded((text)?)", "foo");
    -        execute("DROP FUNCTION " + KEYSPACE + ".overloaded(text, text)");
    -        assertInvalid("SELECT v FROM %s WHERE k = " + KEYSPACE + ".overloaded((text)?,(text)?)", "foo", "bar");
    -        execute("DROP FUNCTION " + KEYSPACE + ".overloaded(ascii)");
    -        assertInvalid("SELECT v FROM %s WHERE k = "+KEYSPACE+".overloaded((ascii)?)", "foo");
    +        assertInvalid("DROP FUNCTION " + fOverload);
    +        execute("DROP FUNCTION " + fOverload + "(varchar)");
    +        assertInvalid("SELECT v FROM %s WHERE k = " + fOverload + "((text)?)", "foo");
    +        execute("DROP FUNCTION " + fOverload + "(text, text)");
    +        assertInvalid("SELECT v FROM %s WHERE k = " + fOverload + "((text)?,(text)?)", "foo", "bar");
    +        execute("DROP FUNCTION " + fOverload + "(ascii)");
    +        assertInvalid("SELECT v FROM %s WHERE k = " + fOverload + "((ascii)?)", "foo");
             // single-int-overload must still work
    -        assertRows(execute("SELECT v FROM %s WHERE k = " + KEYSPACE + ".overloaded((int)?)", 3), row(1));
    +        assertRows(execute("SELECT v FROM %s WHERE k = " + fOverload + "((int)?)", 3), row(1));
             // overloaded has just one overload now - so the following DROP FUNCTION is not ambigious (CASSANDRA-7812)
    -        execute("DROP FUNCTION "+KEYSPACE+".overloaded");
    +        execute("DROP FUNCTION " + fOverload + "");
         }
     
         @Test
    @@ -228,7 +264,9 @@ public void testCreateOrReplaceJavaFunction() throws Throwable
             execute("INSERT INTO %s (key, val) VALUES (?, ?)", 2, 2d);
             execute("INSERT INTO %s (key, val) VALUES (?, ?)", 3, 3d);
     
    -        execute("create function "+KS_FOO+".corjf ( input double ) returns double language java\n" +
    +        String fName = createFunction(KEYSPACE_PER_TEST, "double",
    +                "CREATE FUNCTION %s( input double ) " +
    +                "RETURNS double LANGUAGE java\n" +
                     "AS '\n" +
                     "  // parameter val is of type java.lang.Double\n" +
                     "  /* return type is of type java.lang.Double */\n" +
    @@ -240,19 +278,20 @@ public void testCreateOrReplaceJavaFunction() throws Throwable
                     "';");
     
             // just check created function
    -        assertRows(execute("SELECT key, val, "+KS_FOO+".corjf(val) FROM %s"),
    +        assertRows(execute("SELECT key, val, " + fName + "(val) FROM %s"),
                        row(1, 1d, Math.sin(1d)),
                        row(2, 2d, Math.sin(2d)),
                        row(3, 3d, Math.sin(3d))
             );
     
    -        execute("create or replace function "+KS_FOO+".corjf ( input double ) returns double language java\n" +
    +        execute("CREATE OR REPLACE FUNCTION " + fName + "( input double ) " +
    +                "RETURNS double LANGUAGE java\n" +
                     "AS '\n" +
                     "  return input;\n" +
                     "';");
     
             // check if replaced function returns correct result
    -        assertRows(execute("SELECT key, val, "+KS_FOO+".corjf(val) FROM %s"),
    +        assertRows(execute("SELECT key, val, " + fName + "(val) FROM %s"),
                        row(1, 1d, 1d),
                        row(2, 2d, 2d),
                        row(3, 3d, 3d)
    @@ -266,18 +305,18 @@ public void testJavaFunctionNoParameters() throws Throwable
     
             String functionBody = "\n  return Long.valueOf(1L);\n";
     
    -        String cql = String.format("CREATE OR REPLACE FUNCTION %s.jfnpt() RETURNS bigint LANGUAGE JAVA\n" +
    -                     "AS '%s';", KEYSPACE, functionBody);
    -
    -        execute(cql);
    +        String fName = createFunction(KEYSPACE, "",
    +                                      "CREATE OR REPLACE FUNCTION %s() RETURNS bigint LANGUAGE JAVA\n" +
    +                                      "AS '" +functionBody + "';");
     
    -        assertRows(execute("SELECT language, body FROM system.schema_functions WHERE keyspace_name=? AND function_name='jfnpt'", KEYSPACE),
    +        assertRows(execute("SELECT language, body FROM system.schema_functions WHERE keyspace_name=? AND function_name=?",
    +                           KEYSPACE, parseFunctionName(fName).name),
                        row("java", functionBody));
     
             execute("INSERT INTO %s (key, val) VALUES (?, ?)", 1, 1d);
             execute("INSERT INTO %s (key, val) VALUES (?, ?)", 2, 2d);
             execute("INSERT INTO %s (key, val) VALUES (?, ?)", 3, 3d);
    -        assertRows(execute("SELECT key, val, "+KEYSPACE+".jfnpt() FROM %s"),
    +        assertRows(execute("SELECT key, val, " + fName + "() FROM %s"),
                        row(1, 1d, 1L),
                        row(2, 2d, 1L),
                        row(3, 3d, 1L)
    @@ -289,7 +328,7 @@ public void testJavaFunctionInvalidBodies() throws Throwable
         {
             try
             {
    -            execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".jfinv() RETURNS bigint LANGUAGE JAVA\n" +
    +            execute("CREATE OR REPLACE FUNCTION " + KEYSPACE + ".jfinv() RETURNS bigint LANGUAGE JAVA\n" +
                         "AS '\n" +
                         "foobarbaz" +
                         "\n';");
    @@ -303,7 +342,7 @@ public void testJavaFunctionInvalidBodies() throws Throwable
     
             try
             {
    -            execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".jfinv() RETURNS bigint LANGUAGE JAVA\n" +
    +            execute("CREATE OR REPLACE FUNCTION " + KEYSPACE + ".jfinv() RETURNS bigint LANGUAGE JAVA\n" +
                         "AS '\n" +
                         "foobarbaz;" +
                         "\n';");
    @@ -319,13 +358,8 @@ public void testJavaFunctionInvalidBodies() throws Throwable
         @Test
         public void testJavaFunctionInvalidReturn() throws Throwable
         {
    -        String functionBody = "\n" +
    -                              "  return Long.valueOf(1L);\n";
    -
    -        String cql = "CREATE OR REPLACE FUNCTION jfir(val double) RETURNS double LANGUAGE JAVA\n" +
    -                     "AS '" + functionBody + "';";
    -
    -        assertInvalid(cql);
    +        assertInvalid("CREATE OR REPLACE FUNCTION jfir(val double) RETURNS double LANGUAGE JAVA\n" +
    +                      "AS 'return Long.valueOf(1L);';");
         }
     
         @Test
    @@ -333,18 +367,15 @@ public void testJavaFunctionArgumentTypeMismatch() throws Throwable
         {
             createTable("CREATE TABLE %s (key int primary key, val bigint)");
     
    -        String functionBody = "\n" +
    -                              "  return val;\n";
    -
    -        String cql = "CREATE OR REPLACE FUNCTION "+KEYSPACE+".jft(val double) RETURNS double LANGUAGE JAVA\n" +
    -                     "AS '" + functionBody + "';";
    -
    -        execute(cql);
    +        String fName = createFunction(KEYSPACE, "double",
    +                                      "CREATE OR REPLACE FUNCTION " + KEYSPACE + ".jft(val double)" +
    +                                      "RETURNS double LANGUAGE JAVA " +
    +                                      "AS 'return val;';");
     
             execute("INSERT INTO %s (key, val) VALUES (?, ?)", 1, 1L);
             execute("INSERT INTO %s (key, val) VALUES (?, ?)", 2, 2L);
             execute("INSERT INTO %s (key, val) VALUES (?, ?)", 3, 3L);
    -        assertInvalid("SELECT key, val, "+KEYSPACE+".jft(val) FROM %s");
    +        assertInvalid("SELECT key, val, " + fName + "(val) FROM %s");
         }
     
         @Test
    @@ -361,18 +392,22 @@ public void testJavaFunction() throws Throwable
                                   "  double v = Math.sin( val.doubleValue() );\n" +
                                   "  return Double.valueOf(v);\n";
     
    -        String cql = String.format("CREATE OR REPLACE FUNCTION %s.jft(val double) RETURNS double LANGUAGE JAVA\n" +
    -                     "AS '%s';", KEYSPACE, functionBody);
    +        String fName = createFunction(KEYSPACE, "double",
    +                                      "CREATE OR REPLACE FUNCTION %s(val double) " +
    +                                      "RETURNS double " +
    +                                      "LANGUAGE JAVA " +
    +                                      "AS '" + functionBody + "';");
     
    -        execute(cql);
    +        FunctionName fNameName = parseFunctionName(fName);
     
    -        assertRows(execute("SELECT language, body FROM system.schema_functions WHERE keyspace_name=? AND function_name='jft'", KEYSPACE),
    +        assertRows(execute("SELECT language, body FROM system.schema_functions WHERE keyspace_name=? AND function_name=?",
    +                           fNameName.keyspace, fNameName.name),
                        row("java", functionBody));
     
             execute("INSERT INTO %s (key, val) VALUES (?, ?)", 1, 1d);
             execute("INSERT INTO %s (key, val) VALUES (?, ?)", 2, 2d);
             execute("INSERT INTO %s (key, val) VALUES (?, ?)", 3, 3d);
    -        assertRows(execute("SELECT key, val, " + KEYSPACE + ".jft(val) FROM %s"),
    +        assertRows(execute("SELECT key, val, " + fName + "(val) FROM %s"),
                        row(1, 1d, Math.sin(1d)),
                        row(2, 2d, Math.sin(2d)),
                        row(3, 3d, Math.sin(3d))
    @@ -384,25 +419,21 @@ public void testFunctionInTargetKeyspace() throws Throwable
         {
             createTable("CREATE TABLE %s (key int primary key, val double)");
     
    -        execute("CREATE TABLE "+KS_FOO+".second_tab (key int primary key, val double)");
    +        execute("CREATE TABLE " + KEYSPACE_PER_TEST + ".second_tab (key int primary key, val double)");
     
    -        String functionBody = "\n" +
    -                              "  return val;\n";
    -
    -        String cql = "CREATE OR REPLACE FUNCTION "+KS_FOO+".jfitks(val double) RETURNS double LANGUAGE JAVA\n" +
    -                     "AS '" + functionBody + "';";
    -
    -        execute(cql);
    +        String fName = createFunction(KEYSPACE_PER_TEST, "double",
    +                                      "CREATE OR REPLACE FUNCTION %s(val double) RETURNS double LANGUAGE JAVA " +
    +                                      "AS 'return val;';");
     
             execute("INSERT INTO %s (key, val) VALUES (?, ?)", 1, 1d);
             execute("INSERT INTO %s (key, val) VALUES (?, ?)", 2, 2d);
             execute("INSERT INTO %s (key, val) VALUES (?, ?)", 3, 3d);
    -        assertInvalid("SELECT key, val, " + KEYSPACE + ".jfitks(val) FROM %s");
    +        assertInvalid("SELECT key, val, " + parseFunctionName(fName).name + "(val) FROM %s");
     
    -        execute("INSERT INTO "+KS_FOO+".second_tab (key, val) VALUES (?, ?)", 1, 1d);
    -        execute("INSERT INTO "+KS_FOO+".second_tab (key, val) VALUES (?, ?)", 2, 2d);
    -        execute("INSERT INTO "+KS_FOO+".second_tab (key, val) VALUES (?, ?)", 3, 3d);
    -        assertRows(execute("SELECT key, val, jfitks(val) FROM " + KS_FOO + ".second_tab"),
    +        execute("INSERT INTO " + KEYSPACE_PER_TEST + ".second_tab (key, val) VALUES (?, ?)", 1, 1d);
    +        execute("INSERT INTO " + KEYSPACE_PER_TEST + ".second_tab (key, val) VALUES (?, ?)", 2, 2d);
    +        execute("INSERT INTO " + KEYSPACE_PER_TEST + ".second_tab (key, val) VALUES (?, ?)", 3, 3d);
    +        assertRows(execute("SELECT key, val, " + fName + "(val) FROM " + KEYSPACE_PER_TEST + ".second_tab"),
                        row(1, 1d, 1d),
                        row(2, 2d, 2d),
                        row(3, 3d, 3d)
    @@ -412,26 +443,25 @@ public void testFunctionInTargetKeyspace() throws Throwable
         @Test
         public void testFunctionWithReservedName() throws Throwable
         {
    -        execute("CREATE TABLE " + KS_FOO + ".second_tab (key int primary key, val double)");
    -
    -        String cql = "CREATE OR REPLACE FUNCTION "+KS_FOO+".now() RETURNS timestamp LANGUAGE JAVA\n" +
    -                     "AS 'return null;';";
    +        execute("CREATE TABLE " + KEYSPACE_PER_TEST + ".second_tab (key int primary key, val double)");
     
    -        execute(cql);
    +        String fName = createFunction(KEYSPACE_PER_TEST, "",
    +                                      "CREATE OR REPLACE FUNCTION %s() RETURNS timestamp LANGUAGE JAVA " +
    +                                      "AS 'return null;';");
     
    -        execute("INSERT INTO "+KS_FOO+".second_tab (key, val) VALUES (?, ?)", 1, 1d);
    -        execute("INSERT INTO "+KS_FOO+".second_tab (key, val) VALUES (?, ?)", 2, 2d);
    -        execute("INSERT INTO "+KS_FOO+".second_tab (key, val) VALUES (?, ?)", 3, 3d);
    +        execute("INSERT INTO " + KEYSPACE_PER_TEST + ".second_tab (key, val) VALUES (?, ?)", 1, 1d);
    +        execute("INSERT INTO " + KEYSPACE_PER_TEST + ".second_tab (key, val) VALUES (?, ?)", 2, 2d);
    +        execute("INSERT INTO " + KEYSPACE_PER_TEST + ".second_tab (key, val) VALUES (?, ?)", 3, 3d);
     
             // ensure that system now() is executed
    -        UntypedResultSet rows = execute("SELECT key, val, now() FROM " + KS_FOO + ".second_tab");
    +        UntypedResultSet rows = execute("SELECT key, val, now() FROM " + KEYSPACE_PER_TEST + ".second_tab");
             Assert.assertEquals(3, rows.size());
             UntypedResultSet.Row row = rows.iterator().next();
             Date ts = row.getTimestamp(row.getColumns().get(2).name.toString());
             Assert.assertNotNull(ts);
     
    -        // ensure that KS_FOO's now() is executed
    -        rows = execute("SELECT key, val, "+KS_FOO+".now() FROM " + KS_FOO + ".second_tab");
    +        // ensure that KEYSPACE_PER_TEST's now() is executed
    +        rows = execute("SELECT key, val, " + fName + "() FROM " + KEYSPACE_PER_TEST + ".second_tab");
             Assert.assertEquals(3, rows.size());
             row = rows.iterator().next();
             Assert.assertFalse(row.has(row.getColumns().get(2).name.toString()));
    @@ -460,19 +490,17 @@ public void testFunctionInSystemKS() throws Throwable
         @Test
         public void testFunctionNonExistingKeyspace() throws Throwable
         {
    -        String cql = "CREATE OR REPLACE FUNCTION this_ks_does_not_exist.jnft(val double) RETURNS double LANGUAGE JAVA\n" +
    -                     "AS 'return null;';";
    -        assertInvalid(cql);
    +        assertInvalid("CREATE OR REPLACE FUNCTION this_ks_does_not_exist.jnft(val double) RETURNS double LANGUAGE JAVA\n" +
    +                      "AS 'return null;';");
         }
     
         @Test
         public void testFunctionAfterOnDropKeyspace() throws Throwable
         {
    -        dropKsFoo();
    +        dropPerTestKeyspace();
     
    -        String cql = "CREATE OR REPLACE FUNCTION "+KS_FOO+".jnft(val double) RETURNS double LANGUAGE JAVA\n" +
    -                     "AS 'return null;';";
    -        assertInvalid(cql);
    +        assertInvalid("CREATE OR REPLACE FUNCTION " + KEYSPACE_PER_TEST + ".jnft(val double) RETURNS double LANGUAGE JAVA\n" +
    +                      "AS 'return null;';");
         }
     
         @Test
    @@ -489,18 +517,20 @@ public void testJavaKeyspaceFunction() throws Throwable
                                   "  double v = Math.sin( val.doubleValue() );\n" +
                                   "  return Double.valueOf(v);\n";
     
    -        String cql = "CREATE OR REPLACE FUNCTION "+KS_FOO+".jnft(val double) RETURNS double LANGUAGE JAVA\n" +
    -                     "AS '" + functionBody + "';";
    +        String fName = createFunction(KEYSPACE_PER_TEST, "double",
    +                                     "CREATE OR REPLACE FUNCTION %s(val double) RETURNS double LANGUAGE JAVA " +
    +                                     "AS '" + functionBody + "';");
     
    -        execute(cql);
    +        FunctionName fNameName = parseFunctionName(fName);
     
    -        assertRows(execute("SELECT language, body FROM system.schema_functions WHERE keyspace_name='"+KS_FOO+"' AND function_name='jnft'"),
    +        assertRows(execute("SELECT language, body FROM system.schema_functions WHERE keyspace_name=? AND function_name=?",
    +                           fNameName.keyspace, fNameName.name),
                        row("java", functionBody));
     
             execute("INSERT INTO %s (key, val) VALUES (?, ?)", 1, 1d);
             execute("INSERT INTO %s (key, val) VALUES (?, ?)", 2, 2d);
             execute("INSERT INTO %s (key, val) VALUES (?, ?)", 3, 3d);
    -        assertRows(execute("SELECT key, val, "+KS_FOO+".jnft(val) FROM %s"),
    +        assertRows(execute("SELECT key, val, " + fName + "(val) FROM %s"),
                        row(1, 1d, Math.sin(1d)),
                        row(2, 2d, Math.sin(2d)),
                        row(3, 3d, Math.sin(3d))
    @@ -515,12 +545,14 @@ public void testJavaRuntimeException() throws Throwable
             String functionBody = "\n" +
                                   "  throw new RuntimeException(\"oh no!\");\n";
     
    -        String cql = "CREATE OR REPLACE FUNCTION "+KS_FOO+".jrtef(val double) RETURNS double LANGUAGE JAVA\n" +
    -                     "AS '" + functionBody + "';";
    +        String fName = createFunction(KEYSPACE_PER_TEST, "double",
    +                                      "CREATE OR REPLACE FUNCTION %s(val double) RETURNS double LANGUAGE JAVA\n" +
    +                                      "AS '" + functionBody + "';");
     
    -        execute(cql);
    +        FunctionName fNameName = parseFunctionName(fName);
     
    -        assertRows(execute("SELECT language, body FROM system.schema_functions WHERE keyspace_name='"+KS_FOO+"' AND function_name='jrtef'"),
    +        assertRows(execute("SELECT language, body FROM system.schema_functions WHERE keyspace_name=? AND function_name=?",
    +                           fNameName.keyspace, fNameName.name),
                        row("java", functionBody));
     
             execute("INSERT INTO %s (key, val) VALUES (?, ?)", 1, 1d);
    @@ -528,7 +560,7 @@ public void testJavaRuntimeException() throws Throwable
             execute("INSERT INTO %s (key, val) VALUES (?, ?)", 3, 3d);
     
             // function throws a RuntimeException which is wrapped by InvalidRequestException
    -        assertInvalid("SELECT key, val, "+KS_FOO+".jrtef(val) FROM %s");
    +        assertInvalid("SELECT key, val, " + fName + "(val) FROM %s");
         }
     
         @Test
    @@ -541,16 +573,824 @@ public void testJavaDollarQuotedFunction() throws Throwable
                                   "    return null;\n" +
                                   "  }\n" +
                                   "  double v = Math.sin( input.doubleValue() );\n" +
    -                              "  return \"'\"+Double.valueOf(v)+'\\\'';\n";
    +                              "  return \"'\" + Double.valueOf(v)+'\\\'';\n";
     
    -        execute("create function "+KS_FOO+".pgfun1 ( input double ) returns text language java\n" +
    -                "AS $$" + functionBody + "$$;");
    -        execute("CREATE FUNCTION "+KS_FOO+".pgsin ( input double ) RETURNS double LANGUAGE java AS $$return Double.valueOf(Math.sin(input.doubleValue()));$$");
    +        String fName = createFunction(KEYSPACE_PER_TEST, "double",
    +                                      "CREATE FUNCTION %s( input double ) " +
    +                                      "RETURNS text " +
    +                                      "LANGUAGE java\n" +
    +                                      "AS $$" + functionBody + "$$;");
     
    -        assertRows(execute("SELECT language, body FROM system.schema_functions WHERE keyspace_name='"+KS_FOO+"' AND function_name='pgfun1'"),
    +        FunctionName fNameName = parseFunctionName(fName);
    +
    +        assertRows(execute("SELECT language, body FROM system.schema_functions WHERE keyspace_name=? AND function_name=?",
    +                           fNameName.keyspace, fNameName.name),
                        row("java", functionBody));
         }
     
    +    @Test
    +    public void testJavaSimpleCollections() throws Throwable
    +    {
    +        createTable("CREATE TABLE %s (key int primary key, lst list, st set, mp map)");
    +
    +        String fList = createFunction(KEYSPACE_PER_TEST, "list",
    +                                     "CREATE FUNCTION %s( lst list ) " +
    +                                     "RETURNS list LANGUAGE java\n" +
    +                                     "AS $$return lst;$$;");
    +        String fSet = createFunction(KEYSPACE_PER_TEST, "set",
    +                                     "CREATE FUNCTION %s( st set ) " +
    +                                     "RETURNS set LANGUAGE java\n" +
    +                                     "AS $$return st;$$;");
    +        String fMap = createFunction(KEYSPACE_PER_TEST, "map",
    +                                     "CREATE FUNCTION %s( mp map ) " +
    +                                     "RETURNS map LANGUAGE java\n" +
    +                                     "AS $$return mp;$$;");
    +
    +        List list = Arrays.asList(1d, 2d, 3d);
    +        Set set = new TreeSet<>(Arrays.asList("one", "three", "two"));
    +        Map map = new TreeMap<>();
    +        map.put(1, true);
    +        map.put(2, false);
    +        map.put(3, true);
    +
    +        execute("INSERT INTO %s (key, lst, st, mp) VALUES (1, ?, ?, ?)", list, set, map);
    +
    +        assertRows(execute("SELECT " + fList + "(lst), " + fSet + "(st), " + fMap + "(mp) FROM %s WHERE key = 1"),
    +                   row(list, set, map));
    +
    +        // same test - but via native protocol
    +        for (int version = Server.VERSION_2; version <= Server.CURRENT_VERSION; version++)
    +            assertRowsNet(version,
    +                          executeNet(version, "SELECT " + fList + "(lst), " + fSet + "(st), " + fMap + "(mp) FROM %s WHERE key = 1"),
    +                          row(list, set, map));
    +    }
    +
    +    @Test
    +    public void testComplexNullValues() throws Throwable
    +    {
    +        String type = KEYSPACE + "." + createType("CREATE TYPE %s (txt text, i int)");
    +
    +        createTable("CREATE TABLE %s (key int primary key, lst list, st set, mp map," +
    +                    "tup frozen>, udt frozen<" + type + ">)");
    +
    +        String fList = createFunction(KEYSPACE, "list",
    +                                      "CREATE FUNCTION %s( coll list ) " +
    +                                      "RETURNS list " +
    +                                      "LANGUAGE java\n" +
    +                                      "AS $$return coll;$$;");
    +        String fSet = createFunction(KEYSPACE, "set",
    +                                     "CREATE FUNCTION %s( coll set ) " +
    +                                     "RETURNS set " +
    +                                     "LANGUAGE java\n" +
    +                                     "AS $$return coll;$$;");
    +        String fMap = createFunction(KEYSPACE, "map",
    +                                     "CREATE FUNCTION %s( coll map ) " +
    +                                     "RETURNS map " +
    +                                     "LANGUAGE java\n" +
    +                                     "AS $$return coll;$$;");
    +        String fTup = createFunction(KEYSPACE, "frozen>",
    +                                     "CREATE FUNCTION %s( val frozen> ) " +
    +                                     "RETURNS frozen> " +
    +                                     "LANGUAGE java\n" +
    +                                     "AS $$return val;$$;");
    +        String fUdt = createFunction(KEYSPACE, "frozen<" + type+'>',
    +                                     "CREATE FUNCTION %s( val frozen<" + type + "> ) " +
    +                                     "RETURNS frozen<" + type + "> " +
    +                                     "LANGUAGE java\n" +
    +                                     "AS $$return val;$$;");
    +        List list = Arrays.asList(1d, 2d, 3d);
    +        Set set = new TreeSet<>(Arrays.asList("one", "three", "two"));
    +        Map map = new TreeMap<>();
    +        map.put(1, true);
    +        map.put(2, false);
    +        map.put(3, true);
    +        Object t = tuple(1d, "one", 42, false);
    +
    +        execute("INSERT INTO %s (key, lst, st, mp, tup, udt) VALUES (1, ?, ?, ?, ?, {txt: 'one', i:1})", list, set, map, t);
    +        execute("INSERT INTO %s (key, lst, st, mp, tup, udt) VALUES (2, ?, ?, ?, ?, null)", null, null, null, null);
    +
    +        execute("SELECT " +
    +                fList + "(lst), " +
    +                fSet + "(st), " +
    +                fMap + "(mp), " +
    +                fTup + "(tup), " +
    +                fUdt + "(udt) FROM %s WHERE key = 1");
    +        UntypedResultSet.Row row = execute("SELECT " +
    +                                           fList + "(lst) as l, " +
    +                                           fSet + "(st) as s, " +
    +                                           fMap + "(mp) as m, " +
    +                                           fTup + "(tup) as t, " +
    +                                           fUdt + "(udt) as u " +
    +                                           "FROM %s WHERE key = 1").one();
    +        Assert.assertNotNull(row.getBytes("l"));
    +        Assert.assertNotNull(row.getBytes("s"));
    +        Assert.assertNotNull(row.getBytes("m"));
    +        Assert.assertNotNull(row.getBytes("t"));
    +        Assert.assertNotNull(row.getBytes("u"));
    +        row = execute("SELECT " +
    +                      fList + "(lst) as l, " +
    +                      fSet + "(st) as s, " +
    +                      fMap + "(mp) as m, " +
    +                      fTup + "(tup) as t, " +
    +                      fUdt + "(udt) as u " +
    +                      "FROM %s WHERE key = 2").one();
    +        Assert.assertNull(row.getBytes("l"));
    +        Assert.assertNull(row.getBytes("s"));
    +        Assert.assertNull(row.getBytes("m"));
    +        Assert.assertNull(row.getBytes("t"));
    +        Assert.assertNull(row.getBytes("u"));
    +
    +        for (int version = Server.VERSION_2; version <= Server.CURRENT_VERSION; version++)
    +        {
    +            Row r = executeNet(version, "SELECT " +
    +                                        fList + "(lst) as l, " +
    +                                        fSet + "(st) as s, " +
    +                                        fMap + "(mp) as m, " +
    +                                        fTup + "(tup) as t, " +
    +                                        fUdt + "(udt) as u " +
    +                                        "FROM %s WHERE key = 1").one();
    +            Assert.assertNotNull(r.getBytesUnsafe("l"));
    +            Assert.assertNotNull(r.getBytesUnsafe("s"));
    +            Assert.assertNotNull(r.getBytesUnsafe("m"));
    +            Assert.assertNotNull(r.getBytesUnsafe("t"));
    +            Assert.assertNotNull(r.getBytesUnsafe("u"));
    +            r = executeNet(version, "SELECT " +
    +                                    fList + "(lst) as l, " +
    +                                    fSet + "(st) as s, " +
    +                                    fMap + "(mp) as m, " +
    +                                    fTup + "(tup) as t, " +
    +                                    fUdt + "(udt) as u " +
    +                                    "FROM %s WHERE key = 2").one();
    +            Assert.assertNull(r.getBytesUnsafe("l"));
    +            Assert.assertNull(r.getBytesUnsafe("s"));
    +            Assert.assertNull(r.getBytesUnsafe("m"));
    +            Assert.assertNull(r.getBytesUnsafe("t"));
    +            Assert.assertNull(r.getBytesUnsafe("u"));
    +        }
    +    }
    +
    +    @Test
    +    public void testJavaTupleType() throws Throwable
    +    {
    +        createTable("CREATE TABLE %s (key int primary key, tup frozen>)");
    +
    +        String fName = createFunction(KEYSPACE, "frozen>",
    +                                     "CREATE FUNCTION %s( tup frozen> ) " +
    +                                     "RETURNS frozen> " +
    +                                     "LANGUAGE java\n" +
    +                                     "AS $$return tup;$$;");
    +
    +        Object t = tuple(1d, "foo", 2, true);
    +
    +        execute("INSERT INTO %s (key, tup) VALUES (1, ?)", t);
    +
    +        assertRows(execute("SELECT tup FROM %s WHERE key = 1"),
    +                   row(t));
    +
    +        assertRows(execute("SELECT " + fName + "(tup) FROM %s WHERE key = 1"),
    +                   row(t));
    +    }
    +
    +    @Test
    +    public void testJavaTupleTypeCollection() throws Throwable
    +    {
    +        String tupleTypeDef = "frozen, set, map>>";
    +
    +        createTable("CREATE TABLE %s (key int primary key, tup " + tupleTypeDef + ")");
    +
    +        String fTup0 = createFunction(KEYSPACE_PER_TEST, tupleTypeDef,
    +                "CREATE FUNCTION %s( tup " + tupleTypeDef + " ) " +
    +                "RETURNS " + tupleTypeDef + " " +
    +                "LANGUAGE java\n" +
    +                "AS $$return " +
    +                "       tup;$$;");
    +        String fTup1 = createFunction(KEYSPACE_PER_TEST, tupleTypeDef,
    +                "CREATE FUNCTION %s( tup " + tupleTypeDef + " ) " +
    +                "RETURNS double " +
    +                "LANGUAGE java\n" +
    +                "AS $$return " +
    +                "       Double.valueOf(tup.getDouble(0));$$;");
    +        String fTup2 = createFunction(KEYSPACE_PER_TEST, tupleTypeDef,
    +                "CREATE FUNCTION %s( tup " + tupleTypeDef + " ) " +
    +                "RETURNS list " +
    +                "LANGUAGE java\n" +
    +                "AS $$return " +
    +                "       tup.getList(1, Double.class);$$;");
    +        String fTup3 = createFunction(KEYSPACE_PER_TEST, tupleTypeDef,
    +                "CREATE FUNCTION %s( tup " + tupleTypeDef + " ) " +
    +                "RETURNS set " +
    +                "LANGUAGE java\n" +
    +                "AS $$return " +
    +                "       tup.getSet(2, String.class);$$;");
    +        String fTup4 = createFunction(KEYSPACE_PER_TEST, tupleTypeDef,
    +                "CREATE FUNCTION %s( tup " + tupleTypeDef + " ) " +
    +                "RETURNS map " +
    +                "LANGUAGE java\n" +
    +                "AS $$return " +
    +                "       tup.getMap(3, Integer.class, Boolean.class);$$;");
    +
    +        List list = Arrays.asList(1d, 2d, 3d);
    +        Set set = new TreeSet<>(Arrays.asList("one", "three", "two"));
    +        Map map = new TreeMap<>();
    +        map.put(1, true);
    +        map.put(2, false);
    +        map.put(3, true);
    +
    +        Object t = tuple(1d, list, set, map);
    +
    +        execute("INSERT INTO %s (key, tup) VALUES (1, ?)", t);
    +
    +        assertRows(execute("SELECT " + fTup0 + "(tup) FROM %s WHERE key = 1"),
    +                   row(t));
    +        assertRows(execute("SELECT " + fTup1 + "(tup) FROM %s WHERE key = 1"),
    +                   row(1d));
    +        assertRows(execute("SELECT " + fTup2 + "(tup) FROM %s WHERE key = 1"),
    +                   row(list));
    +        assertRows(execute("SELECT " + fTup3 + "(tup) FROM %s WHERE key = 1"),
    +                   row(set));
    +        assertRows(execute("SELECT " + fTup4 + "(tup) FROM %s WHERE key = 1"),
    +                   row(map));
    +
    +        TupleType tType = TupleType.of(DataType.cdouble(),
    +                                       DataType.list(DataType.cdouble()),
    +                                       DataType.set(DataType.text()),
    +                                       DataType.map(DataType.cint(), DataType.cboolean()));
    +        TupleValue tup = tType.newValue(1d, list, set, map);
    +        for (int version = Server.VERSION_2; version <= Server.CURRENT_VERSION; version++)
    +        {
    +            assertRowsNet(version,
    +                          executeNet(version, "SELECT " + fTup0 + "(tup) FROM %s WHERE key = 1"),
    +                          row(tup));
    +            assertRowsNet(version,
    +                          executeNet(version, "SELECT " + fTup1 + "(tup) FROM %s WHERE key = 1"),
    +                          row(1d));
    +            assertRowsNet(version,
    +                          executeNet(version, "SELECT " + fTup2 + "(tup) FROM %s WHERE key = 1"),
    +                          row(list));
    +            assertRowsNet(version,
    +                          executeNet(version, "SELECT " + fTup3 + "(tup) FROM %s WHERE key = 1"),
    +                          row(set));
    +            assertRowsNet(version,
    +                          executeNet(version, "SELECT " + fTup4 + "(tup) FROM %s WHERE key = 1"),
    +                          row(map));
    +        }
    +    }
    +
    +    @Test
    +    public void testJavaUserTypeWithUse() throws Throwable
    +    {
    +        String type = createType("CREATE TYPE %s (txt text, i int)");
    +        createTable("CREATE TABLE %s (key int primary key, udt frozen<" + KEYSPACE + "." + type + ">)");
    +        execute("INSERT INTO %s (key, udt) VALUES (1, {txt: 'one', i:1})");
    +
    +        for (int version = Server.VERSION_2; version <= Server.CURRENT_VERSION; version++)
    +        {
    +            executeNet(version, "USE " + KEYSPACE);
    +
    +            executeNet(version,
    +                       "CREATE FUNCTION f_use1( udt frozen<" + type + "> ) " +
    +                       "RETURNS frozen<" + type + "> " +
    +                       "LANGUAGE java " +
    +                       "AS $$return " +
    +                       "     udt;$$;");
    +            try
    +            {
    +                List rowsNet = executeNet(version, "SELECT f_use1(udt) FROM %s WHERE key = 1").all();
    +                Assert.assertEquals(1, rowsNet.size());
    +                UDTValue udtVal = rowsNet.get(0).getUDTValue(0);
    +                Assert.assertEquals("one", udtVal.getString("txt"));
    +                Assert.assertEquals(1, udtVal.getInt("i"));
    +            }
    +            finally
    +            {
    +                executeNet(version, "DROP FUNCTION f_use1");
    +            }
    +        }
    +    }
    +
    +    @Test
    +    public void testJavaUserTypeOtherKeyspace() throws Throwable
    +    {
    +        String type = KEYSPACE + "." + createType("CREATE TYPE %s (txt text, i int)");
    +
    +        String fName = createFunction(KEYSPACE_PER_TEST, "frozen<" + type + ">",
    +                                      "CREATE FUNCTION %s( udt frozen<" + type + "> ) " +
    +                                      "RETURNS frozen<" + type + "> " +
    +                                      "LANGUAGE java " +
    +                                      "AS $$return " +
    +                                      "     udt;$$;");
    +
    +        execute("DROP FUNCTION " + fName);
    +    }
    +
    +    @Test
    +    public void testJavaUserType() throws Throwable
    +    {
    +        String type = KEYSPACE + "." + createType("CREATE TYPE %s (txt text, i int)");
    +
    +        createTable("CREATE TABLE %s (key int primary key, udt frozen<" + type + ">)");
    +
    +        String fUdt0 = createFunction(KEYSPACE, "frozen<" + type + ">",
    +                                      "CREATE FUNCTION %s( udt frozen<" + type + "> ) " +
    +                                      "RETURNS frozen<" + type + "> " +
    +                                      "LANGUAGE java " +
    +                                      "AS $$return " +
    +                                      "     udt;$$;");
    +        String fUdt1 = createFunction(KEYSPACE, "frozen<" + type + ">",
    +                                      "CREATE FUNCTION %s( udt frozen<" + type + "> ) " +
    +                                      "RETURNS text " +
    +                                      "LANGUAGE java " +
    +                                      "AS $$return " +
    +                                      "     udt.getString(\"txt\");$$;");
    +        String fUdt2 = createFunction(KEYSPACE, "frozen<" + type + ">",
    +                                      "CREATE FUNCTION %s( udt frozen<" + type + "> ) " +
    +                                      "RETURNS int " +
    +                                      "LANGUAGE java " +
    +                                      "AS $$return " +
    +                                      "     Integer.valueOf(udt.getInt(\"i\"));$$;");
    +
    +        execute("INSERT INTO %s (key, udt) VALUES (1, {txt: 'one', i:1})");
    +
    +        UntypedResultSet rows = execute("SELECT " + fUdt0 + "(udt) FROM %s WHERE key = 1");
    +        Assert.assertEquals(1, rows.size());
    +        assertRows(execute("SELECT " + fUdt1 + "(udt) FROM %s WHERE key = 1"),
    +                   row("one"));
    +        assertRows(execute("SELECT " + fUdt2 + "(udt) FROM %s WHERE key = 1"),
    +                   row(1));
    +
    +        for (int version = Server.VERSION_2; version <= Server.CURRENT_VERSION; version++)
    +        {
    +            List rowsNet = executeNet(version, "SELECT " + fUdt0 + "(udt) FROM %s WHERE key = 1").all();
    +            Assert.assertEquals(1, rowsNet.size());
    +            UDTValue udtVal = rowsNet.get(0).getUDTValue(0);
    +            Assert.assertEquals("one", udtVal.getString("txt"));
    +            Assert.assertEquals(1, udtVal.getInt("i"));
    +            assertRowsNet(version,
    +                          executeNet(version, "SELECT " + fUdt1 + "(udt) FROM %s WHERE key = 1"),
    +                          row("one"));
    +            assertRowsNet(version,
    +                          executeNet(version, "SELECT " + fUdt2 + "(udt) FROM %s WHERE key = 1"),
    +                          row(1));
    +        }
    +    }
    +
    +    @Test
    +    public void testUserTypeDrop() throws Throwable
    +    {
    +        String type = KEYSPACE + "." + createType("CREATE TYPE %s (txt text, i int)");
    +
    +        createTable("CREATE TABLE %s (key int primary key, udt frozen<" + type + ">)");
    +
    +        String fName = createFunction(KEYSPACE, "frozen<" + type + ">",
    +                                      "CREATE FUNCTION %s( udt frozen<" + type + "> ) " +
    +                                      "RETURNS int " +
    +                                      "LANGUAGE java " +
    +                                      "AS $$return " +
    +                                      "     Integer.valueOf(udt.getInt(\"i\"));$$;");
    +
    +        FunctionName fNameName = parseFunctionName(fName);
    +
    +        Assert.assertEquals(1, Functions.find(fNameName).size());
    +
    +        ResultMessage.Prepared prepared = QueryProcessor.prepare(String.format("SELECT key, %s(udt) FROM %s.%s", fName, KEYSPACE, currentTable()),
    +                                                                 ClientState.forInternalCalls(), false);
    +        Assert.assertNotNull(QueryProcessor.instance.getPrepared(prepared.statementId));
    +
    +        // UT still referenced by table
    +        assertInvalid("DROP TYPE " + type);
    +
    +        execute("DROP TABLE %s");
    +
    +        // UT still referenced by UDF
    +        assertInvalid("DROP TYPE " + type);
    +
    +        Assert.assertNull(QueryProcessor.instance.getPrepared(prepared.statementId));
    +
    +        // function stays
    +        Assert.assertEquals(1, Functions.find(fNameName).size());
    +    }
    +
    +    @Test
    +    public void testJavaUserTypeRenameField() throws Throwable
    +    {
    +        String type = KEYSPACE + "." + createType("CREATE TYPE %s (txt text, i int)");
    +
    +        createTable("CREATE TABLE %s (key int primary key, udt frozen<" + type + ">)");
    +
    +        String fName = createFunction(KEYSPACE, "frozen<" + type + ">",
    +                                      "CREATE FUNCTION %s( udt frozen<" + type + "> ) " +
    +                                      "RETURNS text LANGUAGE java\n" +
    +                                      "AS $$return udt.getString(\"txt\");$$;");
    +
    +        execute("INSERT INTO %s (key, udt) VALUES (1, {txt: 'one', i:1})");
    +
    +        assertRows(execute("SELECT " + fName + "(udt) FROM %s WHERE key = 1"),
    +                   row("one"));
    +
    +        execute("ALTER TYPE " + type + " RENAME txt TO str");
    +
    +        assertInvalid("SELECT " + fName + "(udt) FROM %s WHERE key = 1");
    +
    +        execute("ALTER TYPE " + type + " RENAME str TO txt");
    +
    +        assertRows(execute("SELECT " + fName + "(udt) FROM %s WHERE key = 1"),
    +                   row("one"));
    +    }
    +
    +    @Test
    +    public void testJavaUserTypeAddFieldWithReplace() throws Throwable
    +    {
    +        String type = KEYSPACE + "." + createType("CREATE TYPE %s (txt text, i int)");
    +
    +        createTable("CREATE TABLE %s (key int primary key, udt frozen<" + type + ">)");
    +
    +        String fName1replace = createFunction(KEYSPACE, "frozen<" + type + ">",
    +                                              "CREATE FUNCTION %s( udt frozen<" + type + "> ) " +
    +                                              "RETURNS text LANGUAGE java\n" +
    +                                              "AS $$return udt.getString(\"txt\");$$;");
    +        String fName2replace = createFunction(KEYSPACE, "frozen<" + type + ">",
    +                                              "CREATE FUNCTION %s( udt frozen<" + type + "> ) " +
    +                                              "RETURNS int LANGUAGE java\n" +
    +                                              "AS $$return Integer.valueOf(udt.getInt(\"i\"));$$;");
    +        String fName3replace = createFunction(KEYSPACE, "frozen<" + type + ">",
    +                                              "CREATE FUNCTION %s( udt frozen<" + type + "> ) " +
    +                                              "RETURNS double LANGUAGE java\n" +
    +                                              "AS $$return Double.valueOf(udt.getDouble(\"added\"));$$;");
    +        String fName4replace = createFunction(KEYSPACE, "frozen<" + type + ">",
    +                                              "CREATE FUNCTION %s( udt frozen<" + type + "> ) " +
    +                                              "RETURNS frozen<" + type + "> LANGUAGE java\n" +
    +                                              "AS $$return udt;$$;");
    +
    +        String fName1noReplace = createFunction(KEYSPACE, "frozen<" + type + ">",
    +                                              "CREATE FUNCTION %s( udt frozen<" + type + "> ) " +
    +                                              "RETURNS text LANGUAGE java\n" +
    +                                              "AS $$return udt.getString(\"txt\");$$;");
    +        String fName2noReplace = createFunction(KEYSPACE, "frozen<" + type + ">",
    +                                              "CREATE FUNCTION %s( udt frozen<" + type + "> ) " +
    +                                              "RETURNS int LANGUAGE java\n" +
    +                                              "AS $$return Integer.valueOf(udt.getInt(\"i\"));$$;");
    +        String fName3noReplace = createFunction(KEYSPACE, "frozen<" + type + ">",
    +                                                "CREATE FUNCTION %s( udt frozen<" + type + "> ) " +
    +                                                "RETURNS double LANGUAGE java\n" +
    +                                                "AS $$return Double.valueOf(udt.getDouble(\"added\"));$$;");
    +        String fName4noReplace = createFunction(KEYSPACE, "frozen<" + type + ">",
    +                                                "CREATE FUNCTION %s( udt frozen<" + type + "> ) " +
    +                                                "RETURNS frozen<" + type + "> LANGUAGE java\n" +
    +                                                "AS $$return udt;$$;");
    +
    +        execute("INSERT INTO %s (key, udt) VALUES (1, {txt: 'one', i:1})");
    +
    +        assertRows(execute("SELECT " + fName1replace + "(udt) FROM %s WHERE key = 1"),
    +                   row("one"));
    +        assertRows(execute("SELECT " + fName2replace + "(udt) FROM %s WHERE key = 1"),
    +                   row(1));
    +
    +        // add field
    +
    +        execute("ALTER TYPE " + type + " ADD added double");
    +
    +        execute("INSERT INTO %s (key, udt) VALUES (2, {txt: 'two', i:2, added: 2})");
    +
    +        // note: type references of functions remain at the state _before_ the type mutation
    +        // means we need to recreate the functions
    +
    +        execute(String.format("CREATE OR REPLACE FUNCTION %s( udt frozen<%s> ) " +
    +                              "RETURNS text LANGUAGE java\n" +
    +                              "AS $$return " +
    +                              "     udt.getString(\"txt\");$$;",
    +                              fName1replace, type));
    +        Assert.assertEquals(1, Functions.find(parseFunctionName(fName1replace)).size());
    +        execute(String.format("CREATE OR REPLACE FUNCTION %s( udt frozen<%s> ) " +
    +                              "RETURNS int LANGUAGE java\n" +
    +                              "AS $$return " +
    +                              "     Integer.valueOf(udt.getInt(\"i\"));$$;",
    +                              fName2replace, type));
    +        Assert.assertEquals(1, Functions.find(parseFunctionName(fName2replace)).size());
    +        execute(String.format("CREATE OR REPLACE FUNCTION %s( udt frozen<%s> ) " +
    +                              "RETURNS double LANGUAGE java\n" +
    +                              "AS $$return " +
    +                              "     Double.valueOf(udt.getDouble(\"added\"));$$;",
    +                              fName3replace, type));
    +        Assert.assertEquals(1, Functions.find(parseFunctionName(fName3replace)).size());
    +        execute(String.format("CREATE OR REPLACE FUNCTION %s( udt frozen<%s> ) " +
    +                              "RETURNS frozen<%s> LANGUAGE java\n" +
    +                              "AS $$return " +
    +                              "     udt;$$;",
    +                              fName4replace, type, type));
    +        Assert.assertEquals(1, Functions.find(parseFunctionName(fName4replace)).size());
    +
    +        assertRows(execute("SELECT " + fName1replace + "(udt) FROM %s WHERE key = 2"),
    +                   row("two"));
    +        assertRows(execute("SELECT " + fName2replace + "(udt) FROM %s WHERE key = 2"),
    +                   row(2));
    +        assertRows(execute("SELECT " + fName3replace + "(udt) FROM %s WHERE key = 2"),
    +                   row(2d));
    +        assertRows(execute("SELECT " + fName3replace + "(udt) FROM %s WHERE key = 1"),
    +                   row(0d));
    +
    +        // un-replaced functions will work since the user type has changed
    +        // and the UDF has exchanged the user type reference
    +
    +        assertRows(execute("SELECT " + fName1noReplace + "(udt) FROM %s WHERE key = 2"),
    +                   row("two"));
    +        assertRows(execute("SELECT " + fName2noReplace + "(udt) FROM %s WHERE key = 2"),
    +                   row(2));
    +        assertRows(execute("SELECT " + fName3noReplace + "(udt) FROM %s WHERE key = 2"),
    +                   row(2d));
    +        assertRows(execute("SELECT " + fName3noReplace + "(udt) FROM %s WHERE key = 1"),
    +                   row(0d));
    +
    +        execute("DROP FUNCTION " + fName1replace);
    +        execute("DROP FUNCTION " + fName2replace);
    +        execute("DROP FUNCTION " + fName3replace);
    +        execute("DROP FUNCTION " + fName4replace);
    +        execute("DROP FUNCTION " + fName1noReplace);
    +        execute("DROP FUNCTION " + fName2noReplace);
    +        execute("DROP FUNCTION " + fName3noReplace);
    +        execute("DROP FUNCTION " + fName4noReplace);
    +    }
    +
    +    @Test
    +    public void testJavaUTCollections() throws Throwable
    +    {
    +        String type = KEYSPACE + "." + createType("CREATE TYPE %s (txt text, i int)");
    +
    +        createTable(String.format("CREATE TABLE %%s " +
    +                                  "(key int primary key, lst list>, st set>, mp map>)",
    +                                  type, type, type));
    +
    +        String fName1 = createFunction(KEYSPACE, "list>",
    +                              "CREATE FUNCTION %s( lst list> ) " +
    +                              "RETURNS text LANGUAGE java\n" +
    +                              "AS $$" +
    +                              "     com.datastax.driver.core.UDTValue udtVal = (com.datastax.driver.core.UDTValue)lst.get(1);" +
    +                              "     return udtVal.getString(\"txt\");$$;");
    +        String fName2 = createFunction(KEYSPACE, "set>",
    +                              "CREATE FUNCTION %s( st set> ) " +
    +                              "RETURNS text LANGUAGE java\n" +
    +                              "AS $$" +
    +                              "     com.datastax.driver.core.UDTValue udtVal = (com.datastax.driver.core.UDTValue)st.iterator().next();" +
    +                              "     return udtVal.getString(\"txt\");$$;");
    +        String fName3 = createFunction(KEYSPACE, "map>",
    +                              "CREATE FUNCTION %s( mp map> ) " +
    +                              "RETURNS text LANGUAGE java\n" +
    +                              "AS $$" +
    +                              "     com.datastax.driver.core.UDTValue udtVal = (com.datastax.driver.core.UDTValue)mp.get(Integer.valueOf(3));" +
    +                              "     return udtVal.getString(\"txt\");$$;");
    +
    +        execute("INSERT INTO %s (key, lst, st, mp) values (1, " +
    +                "[ {txt: 'one', i:1}, {txt: 'three', i:1}, {txt: 'one', i:1} ] , " +
    +                "{ {txt: 'one', i:1}, {txt: 'three', i:3}, {txt: 'two', i:2} }, " +
    +                "{ 1: {txt: 'one', i:1}, 2: {txt: 'one', i:3}, 3: {txt: 'two', i:2} })");
    +
    +        assertRows(execute("SELECT " + fName1 + "(lst), " + fName2 + "(st), " + fName3 + "(mp) FROM %s WHERE key = 1"),
    +                   row("three", "one", "two"));
    +
    +        for (int version = Server.VERSION_2; version <= Server.CURRENT_VERSION; version++)
    +            assertRowsNet(version,
    +                          executeNet(version, "SELECT " + fName1 + "(lst), " + fName2 + "(st), " + fName3 + "(mp) FROM %s WHERE key = 1"),
    +                          row("three", "one", "two"));
    +    }
    +
    +    @Test
    +    public void testJavascriptSimpleCollections() throws Throwable
    +    {
    +        createTable("CREATE TABLE %s (key int primary key, lst list, st set, mp map)");
    +
    +        String fName1 = createFunction(KEYSPACE_PER_TEST, "list",
    +                "CREATE FUNCTION %s( lst list ) " +
    +                "RETURNS list " +
    +                "LANGUAGE javascript\n" +
    +                "AS 'lst;';");
    +        String fName2 = createFunction(KEYSPACE_PER_TEST, "set",
    +                "CREATE FUNCTION %s( st set ) " +
    +                "RETURNS set " +
    +                "LANGUAGE javascript\n" +
    +                "AS 'st;';");
    +        String fName3 = createFunction(KEYSPACE_PER_TEST, "map",
    +                "CREATE FUNCTION %s( mp map ) " +
    +                "RETURNS map " +
    +                "LANGUAGE javascript\n" +
    +                "AS 'mp;';");
    +
    +        List list = Arrays.asList(1d, 2d, 3d);
    +        Set set = new TreeSet<>(Arrays.asList("one", "three", "two"));
    +        Map map = new TreeMap<>();
    +        map.put(1, true);
    +        map.put(2, false);
    +        map.put(3, true);
    +
    +        execute("INSERT INTO %s (key, lst, st, mp) VALUES (1, ?, ?, ?)", list, set, map);
    +
    +        assertRows(execute("SELECT lst, st, mp FROM %s WHERE key = 1"),
    +                   row(list, set, map));
    +
    +        assertRows(execute("SELECT " + fName1 + "(lst), " + fName2 + "(st), " + fName3 + "(mp) FROM %s WHERE key = 1"),
    +                   row(list, set, map));
    +
    +        for (int version = Server.VERSION_2; version <= Server.CURRENT_VERSION; version++)
    +            assertRowsNet(version,
    +                          executeNet(version, "SELECT " + fName1 + "(lst), " + fName2 + "(st), " + fName3 + "(mp) FROM %s WHERE key = 1"),
    +                          row(list, set, map));
    +    }
    +
    +    @Test
    +    public void testJavascriptTupleType() throws Throwable
    +    {
    +        createTable("CREATE TABLE %s (key int primary key, tup frozen>)");
    +
    +        String fName = createFunction(KEYSPACE_PER_TEST, "frozen>",
    +                "CREATE FUNCTION %s( tup frozen> ) " +
    +                "RETURNS frozen> " +
    +                "LANGUAGE javascript\n" +
    +                "AS $$tup;$$;");
    +
    +        Object t = tuple(1d, "foo", 2, true);
    +
    +        execute("INSERT INTO %s (key, tup) VALUES (1, ?)", t);
    +
    +        assertRows(execute("SELECT tup FROM %s WHERE key = 1"),
    +                   row(t));
    +
    +        assertRows(execute("SELECT " + fName + "(tup) FROM %s WHERE key = 1"),
    +                   row(t));
    +    }
    +
    +    @Test
    +    public void testJavascriptTupleTypeCollection() throws Throwable
    +    {
    +        String tupleTypeDef = "frozen, set, map>>";
    +        createTable("CREATE TABLE %s (key int primary key, tup " + tupleTypeDef + ")");
    +
    +        String fTup1 = createFunction(KEYSPACE_PER_TEST, tupleTypeDef,
    +                "CREATE FUNCTION %s( tup " + tupleTypeDef + " ) " +
    +                "RETURNS frozen, set, map>> " +
    +                "LANGUAGE javascript\n" +
    +                "AS $$" +
    +                "       tup;$$;");
    +        String fTup2 = createFunction(KEYSPACE_PER_TEST, tupleTypeDef,
    +                "CREATE FUNCTION %s( tup " + tupleTypeDef + " ) " +
    +                "RETURNS double LANGUAGE " +
    +                "javascript\n" +
    +                "AS $$" +
    +                "       tup.getDouble(0);$$;");
    +        String fTup3 = createFunction(KEYSPACE_PER_TEST, tupleTypeDef,
    +                "CREATE FUNCTION %s( tup " + tupleTypeDef + " ) " +
    +                "RETURNS list " +
    +                "LANGUAGE javascript\n" +
    +                "AS $$" +
    +                "       tup.getList(1, java.lang.Class.forName(\"java.lang.Double\"));$$;");
    +        String fTup4 = createFunction(KEYSPACE_PER_TEST, tupleTypeDef,
    +                "CREATE FUNCTION %s( tup " + tupleTypeDef + " ) " +
    +                "RETURNS set " +
    +                "LANGUAGE javascript\n" +
    +                "AS $$" +
    +                "       tup.getSet(2, java.lang.Class.forName(\"java.lang.String\"));$$;");
    +        String fTup5 = createFunction(KEYSPACE_PER_TEST, tupleTypeDef,
    +                "CREATE FUNCTION %s( tup " + tupleTypeDef + " ) " +
    +                "RETURNS map " +
    +                "LANGUAGE javascript\n" +
    +                "AS $$" +
    +                "       tup.getMap(3, java.lang.Class.forName(\"java.lang.Integer\"), java.lang.Class.forName(\"java.lang.Boolean\"));$$;");
    +
    +        List list = Arrays.asList(1d, 2d, 3d);
    +        Set set = new TreeSet<>(Arrays.asList("one", "three", "two"));
    +        Map map = new TreeMap<>();
    +        map.put(1, true);
    +        map.put(2, false);
    +        map.put(3, true);
    +
    +        Object t = tuple(1d, list, set, map);
    +
    +        execute("INSERT INTO %s (key, tup) VALUES (1, ?)", t);
    +
    +        assertRows(execute("SELECT " + fTup1 + "(tup) FROM %s WHERE key = 1"),
    +                   row(t));
    +        assertRows(execute("SELECT " + fTup2 + "(tup) FROM %s WHERE key = 1"),
    +                   row(1d));
    +        assertRows(execute("SELECT " + fTup3 + "(tup) FROM %s WHERE key = 1"),
    +                   row(list));
    +        assertRows(execute("SELECT " + fTup4 + "(tup) FROM %s WHERE key = 1"),
    +                   row(set));
    +        assertRows(execute("SELECT " + fTup5 + "(tup) FROM %s WHERE key = 1"),
    +                   row(map));
    +
    +        // same test - but via native protocol
    +        TupleType tType = TupleType.of(DataType.cdouble(),
    +                                       DataType.list(DataType.cdouble()),
    +                                       DataType.set(DataType.text()),
    +                                       DataType.map(DataType.cint(), DataType.cboolean()));
    +        TupleValue tup = tType.newValue(1d, list, set, map);
    +        for (int version = Server.VERSION_2; version <= Server.CURRENT_VERSION; version++)
    +        {
    +            assertRowsNet(version,
    +                          executeNet(version, "SELECT " + fTup1 + "(tup) FROM %s WHERE key = 1"),
    +                          row(tup));
    +            assertRowsNet(version,
    +                          executeNet(version, "SELECT " + fTup2 + "(tup) FROM %s WHERE key = 1"),
    +                          row(1d));
    +            assertRowsNet(version,
    +                          executeNet(version, "SELECT " + fTup3 + "(tup) FROM %s WHERE key = 1"),
    +                          row(list));
    +            assertRowsNet(version,
    +                          executeNet(version, "SELECT " + fTup4 + "(tup) FROM %s WHERE key = 1"),
    +                          row(set));
    +            assertRowsNet(version,
    +                          executeNet(version, "SELECT " + fTup5 + "(tup) FROM %s WHERE key = 1"),
    +                          row(map));
    +        }
    +    }
    +
    +    @Test
    +    public void testJavascriptUserType() throws Throwable
    +    {
    +        String type = createType("CREATE TYPE %s (txt text, i int)");
    +
    +        createTable("CREATE TABLE %s (key int primary key, udt frozen<" + type + ">)");
    +
    +        String fUdt1 = createFunction(KEYSPACE, "frozen<" + type + ">",
    +                              "CREATE FUNCTION %s( udt frozen<" + type + "> ) " +
    +                              "RETURNS frozen<" + type + "> " +
    +                              "LANGUAGE javascript\n" +
    +                              "AS $$" +
    +                              "     udt;$$;");
    +        String fUdt2 = createFunction(KEYSPACE, "frozen<" + type + ">",
    +                              "CREATE FUNCTION %s( udt frozen<" + type + "> ) " +
    +                              "RETURNS text " +
    +                              "LANGUAGE javascript\n" +
    +                              "AS $$" +
    +                              "     udt.getString(\"txt\");$$;");
    +        String fUdt3 = createFunction(KEYSPACE, "frozen<" + type + ">",
    +                              "CREATE FUNCTION %s( udt frozen<" + type + "> ) " +
    +                              "RETURNS int " +
    +                              "LANGUAGE javascript\n" +
    +                              "AS $$" +
    +                              "     udt.getInt(\"i\");$$;");
    +
    +        execute("INSERT INTO %s (key, udt) VALUES (1, {txt: 'one', i:1})");
    +
    +        UntypedResultSet rows = execute("SELECT " + fUdt1 + "(udt) FROM %s WHERE key = 1");
    +        Assert.assertEquals(1, rows.size());
    +        assertRows(execute("SELECT " + fUdt2 + "(udt) FROM %s WHERE key = 1"),
    +                   row("one"));
    +        assertRows(execute("SELECT " + fUdt3 + "(udt) FROM %s WHERE key = 1"),
    +                   row(1));
    +    }
    +
    +    @Test
    +    public void testJavascriptUTCollections() throws Throwable
    +    {
    +        String type = createType("CREATE TYPE %s (txt text, i int)");
    +
    +        createTable(String.format("CREATE TABLE %%s " +
    +                                  "(key int primary key, lst list>, st set>, mp map>)",
    +                                  type, type, type));
    +
    +        String fName = createFunction(KEYSPACE, "list>",
    +                       "CREATE FUNCTION %s( lst list> ) " +
    +                       "RETURNS text " +
    +                       "LANGUAGE javascript\n" +
    +                       "AS $$" +
    +                       "        lst.get(1).getString(\"txt\");$$;");
    +        createFunctionOverload(fName, "set>",
    +                               "CREATE FUNCTION %s( st set> ) " +
    +                               "RETURNS text " +
    +                               "LANGUAGE javascript\n" +
    +                               "AS $$" +
    +                               "        st.iterator().next().getString(\"txt\");$$;");
    +        createFunctionOverload(fName, "map>",
    +                       "CREATE FUNCTION %s( mp map> ) " +
    +                       "RETURNS text " +
    +                       "LANGUAGE javascript\n" +
    +                       "AS $$" +
    +                       "        mp.get(java.lang.Integer.valueOf(3)).getString(\"txt\");$$;");
    +
    +        execute("INSERT INTO %s (key, lst, st, mp) values (1, " +
    +                // list>
    +                "[ {txt: 'one', i:1}, {txt: 'three', i:1}, {txt: 'one', i:1} ] , " +
    +                // set>
    +                "{ {txt: 'one', i:1}, {txt: 'three', i:3}, {txt: 'two', i:2} }, " +
    +                // map>
    +                "{ 1: {txt: 'one', i:1}, 2: {txt: 'one', i:3}, 3: {txt: 'two', i:2} })");
    +
    +        assertRows(execute("SELECT " + fName + "(lst) FROM %s WHERE key = 1"),
    +                   row("three"));
    +        assertRows(execute("SELECT " + fName + "(st) FROM %s WHERE key = 1"),
    +                   row("one"));
    +        assertRows(execute("SELECT " + fName + "(mp) FROM %s WHERE key = 1"),
    +                   row("two"));
    +
    +        String cqlSelect = "SELECT " + fName + "(lst), " + fName + "(st), " + fName + "(mp) FROM %s WHERE key = 1";
    +        assertRows(execute(cqlSelect),
    +                   row("three", "one", "two"));
    +
    +        // same test - but via native protocol
    +        for (int version = Server.VERSION_2; version <= Server.CURRENT_VERSION; version++)
    +            assertRowsNet(version,
    +                          executeNet(version, cqlSelect),
    +                          row("three", "one", "two"));
    +    }
    +
         @Test
         public void testJavascriptFunction() throws Throwable
         {
    @@ -559,18 +1399,21 @@ public void testJavascriptFunction() throws Throwable
             String functionBody = "\n" +
                                   "  Math.sin(val);\n";
     
    -        String cql = "CREATE OR REPLACE FUNCTION "+KEYSPACE+".jsft(val double) RETURNS double LANGUAGE javascript\n" +
    -                     "AS '" + functionBody + "';";
    +        String fName = createFunction(KEYSPACE, "double",
    +                                      "CREATE OR REPLACE FUNCTION %s(val double) " +
    +                                      "RETURNS double LANGUAGE javascript\n" +
    +                                      "AS '" + functionBody + "';");
     
    -        execute(cql);
    +        FunctionName fNameName = parseFunctionName(fName);
     
    -        assertRows(execute("SELECT language, body FROM system.schema_functions WHERE keyspace_name='"+KEYSPACE+"' AND function_name='jsft'"),
    +        assertRows(execute("SELECT language, body FROM system.schema_functions WHERE keyspace_name=? AND function_name=?",
    +                           fNameName.keyspace, fNameName.name),
                        row("javascript", functionBody));
     
             execute("INSERT INTO %s (key, val) VALUES (?, ?)", 1, 1d);
             execute("INSERT INTO %s (key, val) VALUES (?, ?)", 2, 2d);
             execute("INSERT INTO %s (key, val) VALUES (?, ?)", 3, 3d);
    -        assertRows(execute("SELECT key, val, jsft(val) FROM %s"),
    +        assertRows(execute("SELECT key, val, " + fName + "(val) FROM %s"),
                        row(1, 1d, Math.sin(1d)),
                        row(2, 2d, Math.sin(2d)),
                        row(3, 3d, Math.sin(3d))
    @@ -582,12 +1425,15 @@ public void testJavascriptBadReturnType() throws Throwable
         {
             createTable("CREATE TABLE %s (key int primary key, val double)");
     
    -        execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".jsft(val double) RETURNS double LANGUAGE javascript\n" +
    -                "AS '\"string\";';");
    +        String fName = createFunction(KEYSPACE, "double",
    +                                      "CREATE OR REPLACE FUNCTION %s(val double) " +
    +                                      "RETURNS double " +
    +                                      "LANGUAGE javascript\n" +
    +                                      "AS '\"string\";';");
     
             execute("INSERT INTO %s (key, val) VALUES (?, ?)", 1, 1d);
             // throws IRE with ClassCastException
    -        assertInvalid("SELECT key, val, jsft(val) FROM %s");
    +        assertInvalid("SELECT key, val, " + fName + "(val) FROM %s");
         }
     
         @Test
    @@ -595,32 +1441,38 @@ public void testJavascriptThrow() throws Throwable
         {
             createTable("CREATE TABLE %s (key int primary key, val double)");
     
    -        execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".jsft(val double) RETURNS double LANGUAGE javascript\n" +
    -                "AS 'throw \"fool\";';");
    +        String fName = createFunction(KEYSPACE, "double",
    +                       "CREATE OR REPLACE FUNCTION %s(val double) " +
    +                       "RETURNS double " +
    +                       "LANGUAGE javascript\n" +
    +                       "AS 'throw \"fool\";';");
     
             execute("INSERT INTO %s (key, val) VALUES (?, ?)", 1, 1d);
             // throws IRE with ScriptException
    -        assertInvalid("SELECT key, val, jsft(val) FROM %s");
    +        assertInvalid("SELECT key, val, " + fName + "(val) FROM %s");
         }
     
         @Test
         public void testDuplicateArgNames() throws Throwable
         {
    -        assertInvalid("CREATE OR REPLACE FUNCTION "+KEYSPACE+".scrinv(val double, val text) RETURNS text LANGUAGE javascript\n" +
    +        assertInvalid("CREATE OR REPLACE FUNCTION " + KEYSPACE + ".scrinv(val double, val text) " +
    +                      "RETURNS text LANGUAGE javascript\n" +
                           "AS '\"foo bar\";';");
         }
     
         @Test
         public void testJavascriptCompileFailure() throws Throwable
         {
    -        assertInvalid("CREATE OR REPLACE FUNCTION "+KEYSPACE+".scrinv(val double) RETURNS double LANGUAGE javascript\n" +
    +        assertInvalid("CREATE OR REPLACE FUNCTION " + KEYSPACE + ".scrinv(val double) " +
    +                      "RETURNS double LANGUAGE javascript\n" +
                           "AS 'foo bar';");
         }
     
         @Test
         public void testScriptInvalidLanguage() throws Throwable
         {
    -        assertInvalid("CREATE OR REPLACE FUNCTION "+KEYSPACE+".scrinv(val double) RETURNS double LANGUAGE artificial_intelligence\n" +
    +        assertInvalid("CREATE OR REPLACE FUNCTION " + KEYSPACE + ".scrinv(val double) " +
    +                      "RETURNS double LANGUAGE artificial_intelligence\n" +
                           "AS 'question for 42?';");
         }
     
    @@ -630,85 +1482,36 @@ public void testScriptReturnTypeCasting() throws Throwable
             createTable("CREATE TABLE %s (key int primary key, val double)");
             execute("INSERT INTO %s (key, val) VALUES (?, ?)", 1, 1d);
     
    -        execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".js(val double) RETURNS boolean LANGUAGE javascript\n" +
    -                "AS 'true;';");
    -        assertRows(execute("SELECT key, val, js(val) FROM %s"),
    -                   row(1, 1d, true));
    -        execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".js(val double) RETURNS boolean LANGUAGE javascript\n" +
    -                "AS 'false;';");
    -        assertRows(execute("SELECT key, val, js(val) FROM %s"),
    -                   row(1, 1d, false));
    -        execute("DROP FUNCTION "+KEYSPACE+".js(double)");
    -
    -        // declared rtype = int , return type = int
    -        execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".js(val double) RETURNS int LANGUAGE javascript\n" +
    -                "AS '100;';");
    -        assertRows(execute("SELECT key, val, js(val) FROM %s"),
    -                   row(1, 1d, 100));
    -        execute("DROP FUNCTION "+KEYSPACE+".js(double)");
    -
    -        // declared rtype = int , return type = double
    -        execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".js(val double) RETURNS int LANGUAGE javascript\n" +
    -                "AS '100.;';");
    -        assertRows(execute("SELECT key, val, js(val) FROM %s"),
    -                   row(1, 1d, 100));
    -        execute("DROP FUNCTION "+KEYSPACE+".js(double)");
    -
    -        // declared rtype = double , return type = int
    -        execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".js(val double) RETURNS double LANGUAGE javascript\n" +
    -                "AS '100;';");
    -        assertRows(execute("SELECT key, val, js(val) FROM %s"),
    -                   row(1, 1d, 100d));
    -        execute("DROP FUNCTION "+KEYSPACE+".js(double)");
    -
    -        // declared rtype = double , return type = double
    -        execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".js(val double) RETURNS double LANGUAGE javascript\n" +
    -                "AS '100.;';");
    -        assertRows(execute("SELECT key, val, js(val) FROM %s"),
    -                   row(1, 1d, 100d));
    -        execute("DROP FUNCTION "+KEYSPACE+".js(double)");
    -
    -        // declared rtype = bigint , return type = int
    -        execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".js(val double) RETURNS bigint LANGUAGE javascript\n" +
    -                "AS '100;';");
    -        assertRows(execute("SELECT key, val, js(val) FROM %s"),
    -                   row(1, 1d, 100L));
    -        execute("DROP FUNCTION "+KEYSPACE+".js(double)");
    -
    -        // declared rtype = bigint , return type = double
    -        execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".js(val double) RETURNS bigint LANGUAGE javascript\n" +
    -                "AS '100.;';");
    -        assertRows(execute("SELECT key, val, js(val) FROM %s"),
    -                   row(1, 1d, 100L));
    -        execute("DROP FUNCTION "+KEYSPACE+".js(double)");
    -
    -        // declared rtype = varint , return type = int
    -        execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".js(val double) RETURNS varint LANGUAGE javascript\n" +
    -                "AS '100;';");
    -        assertRows(execute("SELECT key, val, js(val) FROM %s"),
    -                   row(1, 1d, BigInteger.valueOf(100L)));
    -        execute("DROP FUNCTION "+KEYSPACE+".js(double)");
    -
    -        // declared rtype = varint , return type = double
    -        execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".js(val double) RETURNS varint LANGUAGE javascript\n" +
    -                "AS '100.;';");
    -        assertRows(execute("SELECT key, val, js(val) FROM %s"),
    -                   row(1, 1d, BigInteger.valueOf(100L)));
    -        execute("DROP FUNCTION "+KEYSPACE+".js(double)");
    -
    -        // declared rtype = decimal , return type = int
    -        execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".js(val double) RETURNS decimal LANGUAGE javascript\n" +
    -                "AS 'parseInt(\"100\");';");
    -        assertRows(execute("SELECT key, val, js(val) FROM %s"),
    -                   row(1, 1d, BigDecimal.valueOf(100d)));
    -        execute("DROP FUNCTION "+KEYSPACE+".js(double)");
    -
    -        // declared rtype = decimal , return type = double
    -        execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".js(val double) RETURNS decimal LANGUAGE javascript\n" +
    -                "AS '100.;';");
    -        assertRows(execute("SELECT key, val, js(val) FROM %s"),
    -                   row(1, 1d, BigDecimal.valueOf(100d)));
    -        execute("DROP FUNCTION "+KEYSPACE+".js(double)");
    +        Object[][] variations = new Object[][]
    +                                {
    +                                new Object[]    {   "true",     "boolean",  true    },
    +                                new Object[]    {   "false",    "boolean",  false   },
    +                                new Object[]    {   "100",      "int",      100     },
    +                                new Object[]    {   "100.",     "int",      100     },
    +                                new Object[]    {   "100",      "double",   100d    },
    +                                new Object[]    {   "100.",     "double",   100d    },
    +                                new Object[]    {   "100",      "bigint",   100L    },
    +                                new Object[]    {   "100.",     "bigint",   100L    },
    +                                new Object[]    {   "100",      "varint",   BigInteger.valueOf(100L)    },
    +                                new Object[]    {   "100.",     "varint",   BigInteger.valueOf(100L)    },
    +                                new Object[]    {   "parseInt(\"100\");", "decimal",  BigDecimal.valueOf(100d)    },
    +                                new Object[]    {   "100.",     "decimal",  BigDecimal.valueOf(100d)    },
    +                                };
    +
    +        for (Object[] variation : variations)
    +        {
    +            Object functionBody = variation[0];
    +            Object returnType = variation[1];
    +            Object expectedResult = variation[2];
    +
    +            String fName = createFunction(KEYSPACE, "double",
    +                                          "CREATE OR REPLACE FUNCTION %s(val double) " +
    +                                          "RETURNS " +returnType + " " +
    +                                          "LANGUAGE javascript " +
    +                                          "AS '" + functionBody + ";';");
    +            assertRows(execute("SELECT key, val, " + fName + "(val) FROM %s"),
    +                       row(1, 1d, expectedResult));
    +        }
         }
     
         @Test
    @@ -718,46 +1521,29 @@ public void testScriptParamReturnTypes() throws Throwable
             execute("INSERT INTO %s (key, ival, lval, fval, dval, vval, ddval) VALUES (?, ?, ?, ?, ?, ?, ?)", 1,
                     1, 1L, 1f, 1d, BigInteger.valueOf(1L), BigDecimal.valueOf(1d));
     
    -        // type = int
    -        execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".jsint(val int) RETURNS int LANGUAGE javascript\n" +
    -                "AS 'val+1;';");
    -        assertRows(execute("SELECT key, ival, jsint(ival) FROM %s"),
    -                   row(1, 1, 2));
    -        execute("DROP FUNCTION "+KEYSPACE+".jsint(int)");
    -
    -        // bigint
    -        execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".jsbigint(val bigint) RETURNS bigint LANGUAGE javascript\n" +
    -                "AS 'val+1;';");
    -        assertRows(execute("SELECT key, lval, jsbigint(lval) FROM %s"),
    -                   row(1, 1L, 2L));
    -        execute("DROP FUNCTION "+KEYSPACE+".jsbigint(bigint)");
    -
    -        // float
    -        execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".jsfloat(val float) RETURNS float LANGUAGE javascript\n" +
    -                "AS 'val+1;';");
    -        assertRows(execute("SELECT key, fval, jsfloat(fval) FROM %s"),
    -                   row(1, 1f, 2f));
    -        execute("DROP FUNCTION "+KEYSPACE+".jsfloat(float)");
    -
    -        // double
    -        execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".jsdouble(val double) RETURNS double LANGUAGE javascript\n" +
    -                "AS 'val+1;';");
    -        assertRows(execute("SELECT key, dval, jsdouble(dval) FROM %s"),
    -                   row(1, 1d, 2d));
    -        execute("DROP FUNCTION "+KEYSPACE+".jsdouble(double)");
    -
    -        // varint
    -        execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".jsvarint(val varint) RETURNS varint LANGUAGE javascript\n" +
    -                "AS 'val+1;';");
    -        assertRows(execute("SELECT key, vval, jsvarint(vval) FROM %s"),
    -                   row(1, BigInteger.valueOf(1L), BigInteger.valueOf(2L)));
    -        execute("DROP FUNCTION "+KEYSPACE+".jsvarint(varint)");
    -
    -        // decimal
    -        execute("CREATE OR REPLACE FUNCTION "+KEYSPACE+".jsdecimal(val decimal) RETURNS decimal LANGUAGE javascript\n" +
    -                "AS 'val+1;';");
    -        assertRows(execute("SELECT key, ddval, jsdecimal(ddval) FROM %s"),
    -                   row(1, BigDecimal.valueOf(1d), BigDecimal.valueOf(2d)));
    -        execute("DROP FUNCTION "+KEYSPACE+".jsdecimal(decimal)");
    +        Object[][] variations = new Object[][]
    +                                {
    +                                new Object[] {  "int",      "ival",     1,                      2  },
    +                                new Object[] {  "bigint",   "lval",     1L,                     2L  },
    +                                new Object[] {  "float",    "fval",     1f,                     2f  },
    +                                new Object[] {  "double",   "dval",     1d,                     2d  },
    +                                new Object[] {  "varint",   "vval",     BigInteger.valueOf(1L), BigInteger.valueOf(2L)  },
    +                                new Object[] {  "decimal",  "ddval",    BigDecimal.valueOf(1d), BigDecimal.valueOf(2d)  },
    +                                };
    +
    +        for (Object[] variation : variations)
    +        {
    +            Object type = variation[0];
    +            Object col = variation[1];
    +            Object expected1 = variation[2];
    +            Object expected2 = variation[3];
    +            String fName = createFunction(KEYSPACE, type.toString(),
    +                           "CREATE OR REPLACE FUNCTION %s(val " + type + ") " +
    +                           "RETURNS " + type + " " +
    +                           "LANGUAGE javascript " +
    +                           "AS 'val+1;';");
    +            assertRows(execute("SELECT key, " + col + ", " + fName + "(" + col + ") FROM %s"),
    +                       row(1, expected1, expected2));
    +        }
         }
     }
    diff --git a/tools/lib/cassandra-driver-core-2.0.5.jar b/tools/lib/cassandra-driver-core-2.0.5.jar
    deleted file mode 100644
    index 260183ef7576b74f8d7f456231d3f36a296c6efa..0000000000000000000000000000000000000000
    GIT binary patch
    literal 0
    HcmV?d00001
    
    literal 544552
    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%0D%QuCSI3X0R?p;nl*}
    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	Q#v6f7G%U78RnlNk0w4741+q(2<<|5+A6Sn{s
    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�K>NRH
    z!x{gtaOZD+TkY>an#L|0E;z8FFJ*)nYrma4A6A24Fh!#>Q{#aGcuR78&gJ0Fn80xkBbB$Lmb$8G>$OAG|*lG
    z@UBJp!t0(J@^1PSL21BVH|8t8DxqMG=j%A+0;!oF%9T_El$fV1RH!HG%(-#b4vg=S
    z_WK5#bIS0m8L)tQ@C!z?HmVky=%_SBqud8)9_opHA9I3dBL9G+|6jmtX>o8P`Rv~YDg2H?N_9LLHS%UHxS|}LU17d5e
    zQBPV07%C|Zs|MT0VIqfkQI8;TlnWxO5V>dM-ZW?!x3D{+;?Du6B0nVdqRxqh!$Ps1
    zeuY)_4OJ3#n35(`^p>+mb;SpidH8$uafLKaX$(;gSx@%+lM6l(eHkcz;XzN}<^j9R
    zl^yb1hIM_&Gftl!%SS_bJm30wYlzsj4MVTwoc8Il+|tDp8GX}Sw(76mnx%Fdetl=s
    z75;Tq`Jc(GR9uamUELi2D_!TGV6+xiB3)C6bLTok20^&UFLacyuBNoiCJA?T?a7Q}
    zGo)hI91lD2e`~C!$Wbz4rT--Au5w(uU;apXdiUU>F0z$TT1yrd86jRdYbq)(#t(kM
    zO+|m_(G7Y(f@J^DSjD_+tbYBWv65i~EYaz79^iY)=$5!qYmB&S81Sg#wSwgTp5BCWv?Yqq}!6mz1AUfZ-;F(`%rwJZ*c`8CVF@_om2;@jz>>}kzw$=?|
    zP@ol0Eg;l8dy8;F!d5@6KoTkki4-w&2z_~%cSyJG)k)`^zyira8aoCUyk`Q$@G}n_
    za5;6pmugk>#7m6~Yf*8%F39~QfWWD+|FpSogBO{+KtEj|y!y6x7n`kwExX1h@*p+&
    zc*`LTG9wrLb)20i)?($9Zu^{v4)5c%Th&%V&@eZ3*|FweW)KA+blJ;oy+;nu1V|Bc
    zL*xre&{s$2B^ww?DYP&ge6GL6*?}3OD*q+^tv=rd$jyTgbsCM=%=f
    z9^A-mX+Ep{41Sw|2@9A>hmB?dmM9_NF$Rsr*Al`K!}&}7kjh+`r9yQnm3#%8wuCxU
    z{^9$98H-z-(Af=Anl`PU#3Mw8ep!Z#;=x$ffa(V}&=JfrWD{Z5Gr$cbsNK_9{Q)RU#j@y
    z?}c_Gz%uUKrfO3m8_kB9x~i%*sLjPbfY<%%N;&PD75C?AY0lBv+!Npbp8Kk*u+pv~
    z`_pgAIr0j;OKYk8zJ2$TYlk)5HLDdhPus#xOz|@cj~=MQ#v66bcf3L(a3FF!Rk@?R
    zc5bm@zQ%%&tt)xk+uVAgO7;2+780qKA*llf-bSrAuWhAV)A-w%UAjVr`C#n;&P=+&
    z7S=4?6Xpx*VdazV4INKYMcTvJs*-#O8)Y@FSp$y=SL!#yf=a@+;(Cb?UQxp{i1Q`B
    zB@cw9$px^%EcAmU$iVpD3cZcEF4fwrOkHw*!|V%YZ6Nzku2agc!C1cuv|O#90o#O{
    zg;>9CJo>4pwPrJ{f6Fh_2h%7(gCc8m8s(1Dq-**on&tWx=+dOs41~-Bb`cOV4+W0r
    zYJYP0V@z6Bp30n<0i%cK0f=za5*BoDA$~3N@UzB)#tZvFXJm#*A&@m$-HI>NcO
    zqiwMkjVO~q_juuGGvN(C)^l~f{!W{6I$3F^
    zG2)yIX@z1o-k@S5Bo^w=NMqXlbnk)~fR5poCoZBrPxfYKS6y2Ze^mj51f6~Uh^Z|P
    z<7Fi_$Vn^6E7?{@W(W3ZtlaNQ!4QDY6Wgw~O>+9%ibpwI;HbOPpjvZ7z)6;^s0yK*
    zH?(bYk8Y-Y;S#=*QaSso{thF{n3{M^yk$lB`Xv6(eI2gR29JPgZF{>2thPcQPafuIAK>?SdqS%YD*^1Qiz*!}~@aPAZGIVs!C)ErPA}=}@Fg6#o6Y
    zCp2ZeLvp@(Q5nFFG8!J)L=Z6^(jiTFdAE}w1*h8AdB$G1#O$=gJ*0FjpTO9q!*z+n
    zUK`hH`GIzmdeFto<)`pxkPBMfp(g@gBn!Jz@Gaa9*Me~R4!0=KdLSWPjG$)wqb^0+
    z6xZN7p$8&WH(m`vFl!BX?;PvfLk7uLt?wR+_|u4-93vSd6i}B82yW8r$?0h$f(R_O
    zEC|r{DzR4xP`5KOdk4mTY}o`)AHRU^tixaMJ*x%Xp^aO>8MXC_5%+z828MM;^n-d`
    zC(7ipGzQknXFH?clNiqk*A%;Dt!|bY;@}6IFUfv<#_!={bqXamfHF_>ROyj}swUWE
    zF-4JgfdRyB5%Hg@_is%B4RB54zZof#3_KwVgw8{7eK2vl5cq>zbPYW`p?M#Mwf}WF
    zPVt`%!++sVOwykg5zwa8oPA~yE8Wj5un`{x0tiAqO=c^gNrzMSS8}{8Iv2-ZU$3q{1@Qe+V+y7Vm4J)GXof_d7Z|8>
    z%8@KBm%?yA^h$a#nkp(Jm5&itQ9Q~p$@1Ps*9Ldn8kgh&<-(Y6S`#2*g@PDJaLAWwg$@+L2H%f?Dy*1?;(%$^ac&6yGpYSUnE
    zer+-|FZCj&^hgXup>?;juYpA(;{?2Y+Ufm
    zYXmHxfI)impn?6T${KcwX=?e_!<>9A+T2F+e6$Br0lM
    zyuJ2yx8D`z)qI#6Ji}4XSMO13IJx$yJ-|kN!d4cMMm*@HJq3Bvcr@z7b>1ipBW`%R
    z6V~Lc0~pE*#__N*DC>i~y2(_nY)o@>32PIgOoMfa(?(DB;Jku6rG5}QBzcT*YtVc`|^(+>7rl9QfMqd@>c*`evQW})-mxca>0jL?n4=7n_m
    z-7O>YoY{W#U}J?WQQdkDk3MMyUc9Rh6czFoHZ0;_L!-3cs5%td!#Vk+@jT$9A&k9J
    zKAeklyH0B8IA0eO4;X&s>jrG4fBgtB(>
    zO6(HalmVc1sOTrs;*RAO5~2&^rhfn(dJ2yNm8Mb0$sMRK&3`TFgxF_35EP5PLKB>K2H-K6Ggx
    zf{@TgX^*0M8gDvXkj)^g&AInZIWYK5PsZ@EPU_7ws1V1#b&>^f!D8x2fjtU;#B)i}
    zJFr*Im{%o!EenCx}t7%@95
    znp*FG$zv8*cQLofO?G!mBe*H0^^fT6jKYYmZyyJ$vwqr8`c8dIz@fyPa8Tl98&K-Q
    zXek~WU;9mwKJ1)pN`Ihhgg@2xo%Y}v{YrF_CxgPp
    z|2-REud*yaz`Ua_So=3>3DxAZ#Tn(G7k3&wx*E3-yBIVY0Ms6E*i`pd@df$9vm)r%y%05w{r_a-E*jj`7aE{&khBr
    z-z3H0IVJ6&Bg+!-3oB(2Rt8n+UjDpPpW0%T>hvxnasO9S73Y7}$bUpvi&z@j+M3y0
    z{Ff7^_&xUp?LGIUVZ(h*J6{p37djmBDToe+pEAGEP#xKOy1=(>
    zq+SNY`TK=|P19(PmQc};1u-kXc+b{-rZQMK?heiwHo?Y?_@a>$jf&#c8Sy|!EJkG`
    z?fteup>ZnDqIdGs1k{sgZaE1T%#g5d91m|U$9RpwCSuEeN7LusPs6PR6=|MwqO(4`
    z?zcwCgD_!!sAb0;BOH9v&UkDZYYPN@h2w6q6B;&5XHcK;YZ}6{=XsW_)>)!8paL^wi5zVlP((HbWh
    zv6}QI6HxgiAy6~a=xgg3Qk%79Nv44Nz+lEE(_Kg}q1}O0T77?|51IegXz^A=P${6-
    zg&gqn?VGyPGCM`vWD+X$5#<;%wT)Xak6e^tGMj>U)cfI2oda<_KeZJMH3|>EWA|(2
    zyVV-xEXNgFZM92f7x}+TuWQ{&PEWrVZK<-zFoq~+dD24}rGcxZ7P;R~K4+-RC&xT^sNE4LPC2F~J5)Ot
    zPV@s7%(VOz@Z^$Z+4DHf@^A;@n
    z#Js&96e;|n&dx_KAZ`3ll3=o)lFay?uSw~@_roNoX??&EJ)@r+C-d`)5WEwFqK&|I
    zox?-)1$mMCm~%+5pFjTbK{WnGTE6rCbj$qLKKfr0;Q#p`{{Q;u?=7P0UmnF1Qul0b
    zIm#txt2x$WUBVV;1=WO-P<1%J`~uVp2-ZwAQnP@FRHMtB-fb|C)yF`o)V9=(nF+oPCJ20-e*MjSn=<*lh#)l(I3$8_^}ML{
    ztdy27HGrm95-{UEjQa`r9WG|MhR>1vxtORvkI#+Xe?HC)LBmO|R|FyMQZ%3xn|>EA
    zg~QG*BQn2~Z6HDQBD#RLIw&=!$%5hs_DYu6xz6HbJ-hmRE*h&I|NKoHRlq-%(2
    zIju&Ts1~nmYP+&dIx}*1$y514p*tZzhH{>rs|ysdPGn5A#4KZFCLNDzDcXEVjN7*?
    zUd;CkM{YvM(WPjVll;P#`vzwfuGoEnx6Q!+6UxtG6mJ$B-3lc$nOF&Vfntl?9_&>f
    zrh!!Qc2d(l*f$)O%K#XZb2RFTNOg8nB#vLo&5Rim`%R}vB|=(D*t@FrmjtA_Kk;vS
    zmoD8fedR_x3~J$(D4
    zT*->Jab@1i)#+c&E&mtgs^Vs1V&?K+v)um#edYY1{4Mx8!8}``OChjgNVG&uw92yW
    zIai)W_%ZsG4b*#rSLA1K@fZWSXSpFy52^tmjNQ1o#aT|9%l`mA7rT8e~
    zfFnxPy)Gm2NJeuEUeyc9chH{>vOhjU6(P)6HH?>0*JHd+b5p5makuI7@3(=f1|-wP
    z;NYw;@_p-~?2y|qI@Gdno3NId3lY(`onQ^sV{YAraqeZ*S*+4)n$$aMeHN@5+D||<2VKOHN2FFSF#UuPh!mY8$p0OmOP$tanTP>zU_
    z3?)Gsn9K}JsRt%G^IJc%y5KA{*l&?}
    zhq(9hH?IButt1@sC86lCmyQ$)t-+S!tG4^-S?bo5vPq`p4$_4L*10VWGD+hLv&&SD
    z&*VCfi-rHo>nmChuQe4ZQ>8KDor+?D1}r8zx{72zY0pPUGe`{3wKl~%2T$`vaDdR7
    ztKQktnmV#$kfEaX`mOf52BU&uAv7=&VU34TTip_}z|FSN_aOWUbo#LFDJH#$zw}hc
    z2DRXNt4s6iK6`s(dLZTMJ)(AN+J#E&MfSEyZIv3uo1krs@U)6$geLYRq;hZKyy{ak
    z){YyhdAcPh{pSs?<)8j@t9D5i_1i1zK5M`60-q*5ThFJ7RK+Jmdcj2^nsGsz)e!?l
    zyOF>OfJ=V@FpC*1C52YGkAHFX5BTyq+gYm;C`ewOZ0@flp!Z}PK0A-`~&O#O$W5F%7z9lDvXa-<_Z45`gU*y1hMxr
    zHTzer=lIV@{6CUVO^p6K8?RVZ@6QQ;&fepw9X%*$Gf1<}pdS4?6cx2BGaa2xUCJ~2
    z4DmG4Z1|Tv?DL000ceAPzf09#=KYdT3=)gW!CBWqcGr8YzB4g+J?dKOpMW2n-9#%=yBv?|Am)J4jdoMy;6uPQ
    z5LeBjE8w1OiVwBwY5p2g5oiYGBRUH-8tgOEH7bi;*8wDb#vJJ(0rhmVE{0BZ48O~HuOx^)YSB@bG!>9&o!E^Kl9xwt29ov3?Dr)W~>QdnfbmtXh
    zvV!DSJR63vs`<1b5m{|Dj;s!X&>LhcBIkg4F(>d#so(YOQhkjczcgr?xF&`Q=e8#c
    z$F`@qY#6|*^npdfI*
    zK+2NcR`Q?G>ydEL5UR2=QCg5!a5XHJ3$fp*Y&V(P7$o(Y?Y0-S*RMi`-=}OM*-|21
    zNDe8lWi{Y6#@q@s_WD8YlmQmP(kkYklwmH+)UI3tyxkb!ICG(~ZPSUWFA9xE{ng3j%sf1=(hmWL5j}~9`0Ecs%$PehP*`6~j3L#D2y!GvcgTL-QN60R(2=hgD5yN)pVyI);m7$QdbF3w
    zAYx76R*>m&LLfl5`KY=(@E}qNcbFZ7j6Lw>F(6U7N&JU{LuhI`hybc&NA42TT~vF~
    zpD^+}x5oP%f57r=C#9#`dtImgYhC{@ij#lpTFlwm!TBFjyjnxY7F`YaTC#EbYf`>g
    zS6fR|NY}_GkWS5B$KH;reHqhMrcQP6=&UiPK8K2>p)0_nGb(b)(~B8fE*ZENs4f}J
    zKt9A#sK9$^X)Nn|3-&zuPUtw$&X`&p=)R75biWC_aa~U3`sX
    zZ>&7**+%Ae5_Km?*q{$Aqz*bnblOu299HFxH33&BqYR{1^MO#NmQG0B0Y&Ox!(LZv
    zf~jn^Mmn3SiZW6f!Y+eTprfC&(#@?^=QFC$loL){mLfpPWXg?MP9WX_<->j?ZI9HO
    z^AuZfyA3D5jP?dBIkdw?X5tRJqgzUiF=r1&pS44U738;bnIR3$wU>6}@?$IT?0?-J
    zP-!+9SOa*BG*bd^nhLW{V94!?eBbQq%-4>hkgk_&a9RLUI8k?|K0f7Z%e8Y-CB5eh
    zYI}Bhiy|bkM_70!BCg1KnwKNV=xTk+JMkv1pr2HV*f5u^YZXY3A%MevZ{9*3zf1Qi
    zrfUAS096P3X2z6J>N4$R8Irn;8Vk+xI&+id5k;;;AVqzNNzoCNl==-|&`%{-AcJ}N
    z!1ODHNonkPS~Rrxuj}-nn}<5F2i&f@P$#ySl4zo-M!F1`c}iT@r|`i>Z@ar8F@j%M
    zjLP_8(yM%YZk=KTzZ-;mP#j;bjT61VwE~TTawEfnZr||NG5g(a_({0Uk}2WDZGb!O
    z4O6pSRU#b5d3my?<)7(~v$AsMe`I_Hosz>fZA@}gnS7&a8Md24%_99^UrA1rQm3~s
    z9kqS4W`$7cL?JcH7^H++Y6PHwl(+IkReLkD
    z1#4#@2jq`gM@$DA$vu-Q{@v+y%{fYr44>dO4~QQ>F-JJ6lz;LeoYV;knY}K^3LX6_
    zLi7C0^sNCku7mrVoOf`kE}604m_-;>*+>UJ9XXE=hx57A@1%P3-(W9EDj`Zs?6kR=YU9%nl%EAuhrA|JGR3~X;9i<4>wlDvZ6xE#jCCW`$wb6I
    zGbDRTt0t%687T&g8RGv^`%1O=M-*PhU*ZGXDOefjW5
    zpR4NX*D_YrOy)k4TIS7kR}NZrZJk@Y6^mOe`W8{cftfH(SmOxIJqTTl(Uw
    z`1Lkmz!AE7{KV6hd5Om9}IR*q6E!Pt$Yy<{jTF>4-1i
    zohUc!l>*qF8E&DMjOgB)vOk;+b;YMCr2fiw?)Cbf;`r;l;#@J`5ImGl4GpG|I-&;>
    zUCluBvZR(X#=wuyN@NuRQI>!6qD>Sbf%3c7vNrDnW*W+`Nc0qpvl?^21H%{Rkm3VaO98@c7z1%B4N@R%TIlzAr*-n1tn#`L>};B!+1XU^pCNk7
    z1-Cg+@
    zs=pgT0CXY%9;FBkbHGLaK(8NX#FH27O5d&r4gVm!Z|o^&7~VaK
    z+dXW@1-$z%$FD(*`CV$dmk4qJVuIOzE!yHRxR7#`f;{Tx8bdBVJJS>D-TDZ+7;OWV
    z5w^Y85B!Da+CxwNU;iW!Zg{g7qS*xd{_*ajoOJW2sR!Oe^nIq#kUh-PMslsBRp-LHpG
    zl@3})?y-lDF-5b?r_0&klLFbAH(QvCC^IZ9YM(FKRN6J&^g`$5OYczR`FG#%Bz50y
    zcsw26seQIEM|BP@&t$Ney!rf=^YCWz_P9;(3b6&_Z}tUAL;Hd?mx;@-Idrb_@iNNMRl
    zL+dKDqWfmPbpq8*H0>)+r2uOhRYS9&IC1ND1TWZA_B~P~<$F&HCl{U^#P0*@AF>73
    z(9HzPE}<39=Ec;iykzhP#pi2D%%Ae`kS(dWl4|f+lhIq#(=P`0DI|&v?sO~C;cxIc
    zrHH8HNT=(#7Bbo*tDs{K5HCroqBA7(1=reaZmaalR?bWd&?$#=_S_qGeNq`1hSmEUR5
    z;*IR3^$#GxzE{E&7*c?UC5uy{Ghj&3
    zZk9`rxl{-H3uN`&Hp#PI%+cx(<7hAB!T!=exm7_Z9m1(@$wLL|&^6R_zF$IXV(as%
    zRw7>8`DT}bla#uvjeV>>K}Dl8;h}Sr+306QrFEw|?O=B4(wQ-s1jGbN?!@(qGm>re
    zlrMXC18}SNbim_CjhOal6-!I%I)Yy9o`tuL;1SAkGfU3{7o4Wg8*A3OezhdebQ2y`EDp~xNu!4YY@F4Z3^gj{8Q8J66?@BM!FDihr4
    zU2lI9_1bBUOFZI`Y>_RvId;)^bqu-9O=Ke1@xyKDH+eV>56nyh)j)V{`VqG;)k*_t
    z+9c40q{ik4ICqB4rF6ZmW4WAHuF8vi{AC2Em(9;FEy|DMBO@1*_xSf@o0Bh?4aT!Y
    z=_g}5bDZ{Dcjo^f%J}1I<2tGrJ@J&)@AV4aNlSey<|Xp6N7`S!
    zYHsPfeX2UTDYdB;QP&}*=C+uW!#s14yw0uIks4tv^*Ie8L|
    zHuYrcVnXZAs;3$t4(}akn$)E2tNV$E1Htk|}litSWv+pJWQo3-{n=i<4~I{W~`Ws`=UV41k|Vx~C2uqA9$FQxTy)Z0_H%ulFn``6gA)+z&VVlEvBg+wDk_F1tbw
    zyr&on?1AHxSFMr32D%0YfN#D@=RcvUqPOTZZc#sbBgKMkOGRRBOMTu%i)nbGtirnX
    zAlLC0vRgyH;Rif#k~I3uUD|UALI=;UF6kM+@UFh-tV}hf?~Oq+Z^EJPexi`)&}
    zx%Q1g?%%~9g4w<9V>!-+auGx0j{RUfe4&Sc%x+?-}c_df1+QQHzVQlcqlRWhwtWbO4RVSI1U~E+A4wGum+b^;S?HBl%JgCmvC1VfF
    z*n;~hg6iowgsF}Q`=Yx`Qpu}z$;Ur1e@%Lafs5rxA1j^AsQ+}+{-=|k+sFIGe@%LY
    ziGQ<#z;}6kUPpPnq}$fuhKbyH%T_Wqs9;i(LM4t8v=nQvbS|gPVYj^G;y}Czp&c-f
    z0(g?aDs5r%utGg9Uf$n_=_6;8Z%_C4y#B6y3%T0?z)+qt&H4B~5EAAXt`+VHZW_V~
    z@U(q~QnX8b(^!dT78Su+cM-c<5+)gT!)c6c%3EV)ZFM&Q?^3lG4RI|lw}u1Dx8I=S
    z#s}4fj}RERW}tbza`V&0qrWeVC{1B2M%-Y973H7`c2hPx_!oIw+d`2Mz9H4KyR|OP
    z-9#=$-}Ie02EmU73%_h5UI+#0j>C~E-KlY^HY4f7Fhd$Vtv-0s>!{x8b`R-QQUp)^
    zuTwc+RWE7=lulZGvL*BVXDygOSda)o7jdzz$By0hUA4g8n3cI1%R7mOE*llh?}{ig%`WF+sq|55Y@d@HTZ2|uR=D%9N=&zQ4J3^o0$Eb3KsAy?bO+!n~_VH6|h$u#UrNIy@
    zm-1fYDc>4xBwH=r(syh^OL_wPLoPsUW;+*=_$9t@J@eYj-pozn<@WKz%jclBYFi-U
    z+n&%CMsEND6B$PZ52hCma3?>6y3sb_qyL0p
    zpoG`!g4e5hof>r*-=kFZayO?mqZhzt%Xn)~=P7?|H
    zgeIK&)xG>QJb1kqDW?o3I9hcNvnbA&ejsdodkeu{_=YG->Cg-@<&=gXI-p`3OXSdZ
    zpfDHKfu_uH&h;#&Oqukt9+O3*r^#w|A?76Eq{cU+EUY#J$U1HTDg)ycJ`BA~=PG68
    z0;~4;qB}b@L}8u#?4JDD(%v7#pj!X02XJW;yIBq@Ly0Fm27_pWQ3#
    z=w=Qiz8zknfSYyN9Mt1tY*-~`+H}RKAqR`-t-1^z9;#tZ;Az7Kv30^5O~Ye~U=V>Y
    zjiRsUj;d6vv~|pu5}HyHxeG;z_8wjgY)dpBN>%}Le(V9;N0J)?zaD^F;^rJxCFoeR
    zWWQPppVS%ld{^4PA(%#sxBc!nS9zkihktYCxFq}q!{fCTlfN4_vjG*
    zz^anC3=W+$qaCSq1&_s&xKL6i&L=ba$P-#jm+$wtT`BUG52fD+wEO-M+W%qARWUU*
    z`EUEi!i0a+u`Enr65>Ge-Rj>JOKj)d>Zu0()7&2wb+mB9qHKK>4}FM>eKh?Cbv>`yo^NoK|J?EW@kY>>A;Vc9Xe6yU_Tr&AUBRum)L
    z1LKAq)dc})-b9DY5L?VA{T#kO&{G@6pfT8s8@X2>HC(GJ)~t^p6-Bj1`rcwaw$yAE
    zBZo$ZX8GNUd$|W}Af_k-6l@={o}=+Y(dAcs>!<=pLkwfzEL4c$%{$0V4CJ8Sz?4%U
    z&An`7AqOtFV~M4T`)aEkm}+P>^~BOFLioHOX->K3QUlPHKrUZ2P5%l&|1nVIL9`d!
    z=6!t4hb@%7t-A+gg(LNoEKoiEp(!FN8Jnxk5gE>*V}7LZj)+ixySO;>t})t*#(YOB
    z2q|h^%L+UoC2lHdXaD`kSq@ycME<(%h3Ze!R&SoOv4e;
    z^HynObc@83j{5>8@s(}9Yka_5{Lk-JMVxGHP6u?GdyaU!lmZP3=~H{(Af74i-;w#c
    zPV8$V+)9qkSKYBN1HVyXEz~|=V&Ycz`bL?yxpaQ5i9xa}MWmI2d2AT`dv-?UQg8nB
    zfv%)~Tz~x!3+LbH`Y$qK%B}TJ)tLkZ<@Q0PxX~ymjO|eLKT+n8wci)~r
    zOJ)D5edz}HXdX!VF$0&C``JYmQsg$%aQHvhrBJ8+GzIL<9jOLU0QV
    z-|aY|tyHV~>9zChZ@sr1#G^A59r$S0Q!A(5&1N-NOwy52Ebs=#0bdfL-S_a>6Md_f
    zGnJQ$+DG`A%UrO~Lzbf1d4;zC<%F?IK?!_D2wdPCpvu80Jl~66d|(U~gYB+rQL5
    z1o?U^&mTM0?*9m?|3N1AUxa{)sk5uifA@)%YTAnPLKtsmGz{9b#L5`eVRRQzN2Ge+
    z`afIMInIb7AP=T2yJ<$qTCXq$_=PY<2zYqiN#b<7VH1YMulG~39gdH4Z*n^yq#svr
    z>UV*+1i(<%wFrdq!BbA=rn(dgr>1^kwl@0I^g+^cL)?P@&O7wF1_|kR)llXzz*M0D
    zsyw^C&#aV{Uo}>6aswwNL?%gknA|3FA9iPuI
    z7;`hF&)2+IvOBUZpLPpWT6XzP^u#{ixbEzXDbhMB&89iA7+7OyzYs)S=Yu)a?$+7Z
    zrEs{9I6^%!bX=lxB=Bjw@%z>Vyqs&O{EK_mC2ouKIX6du6Y`5RA1$;U90GpDYl=^0
    z2{i~YiT9J~hq|^-$nBT)6RTYa!UsKj3V`=$ly7A?FS^5f82er1v@?1=O>j9t7}4I(
    zKK?5Qljr0|N}Tc0w8@td|AOx)yc5JXe+DBWIKdZtiRmGl8PQ08tNctITnHfEl%EbLuxfuj$B<&9%Aj1>>=?Jf>U
    zs5rU=rpb?Jz`hPBq7apsF!$>zQgs`qcK-VE6IOx5vsx-Y<`z$j%E4SVJ05jOa&z=f
    zfIa3n+Y^${CCXF*q_5JO91GQoFTuDNZ(lMwSFodwklCKH$hATS)OV`4@3nWRgB$ww
    z_}1F^q$g4F#8xe!6@78Wq(x@&Qbz)SDV>u!kC}tYSe?`e=TEyL{rtPfB%Jl9woOexX7QDhGHawlk-na)V7p<-ExjOp=I28xh!b>%rr@|P^
    zT@kyw?HgM9#kV&=lf;8vm#;J~ME+M={0{C=MQwdWue?+4h-(E88EHbTp|9kGm=Mj7
    z&`1k!V_oWBF-Cx+1pcg3;|kx1+fO*WahgSdELjDv2v8j>MQh1!s=pCmOnp?j9rrzs
    zVjhi<2Xu{a53Hu)3GT;bhgn=KSkp~}RQT^R%}_jjjl~D>0;~;Dk^@$;F1D&dyfkZ+
    zdh$Z%T5PtugmO=h!lzP&N@42YqVO4_z&3)sn+H%+&!a!TuT0OdVGg^Bq7%B56lmY?
    z-hpd)1}yX$l#goOK3gHX=gX^S<+$J%fzs&`lIO`0-lotih_f)rJU*~&)1##L(itzZvtt6OO3Idr#W
    zSa5)1GCeWj`@`SqR*K(ePon-usQ-sMV*f7cvX*ux|LPYSHLM-*eqp{m}2<+v}pW9ecy)
    z7~fxj?=%P|w6!$>uP@dymG-wmyrEF^Ck)PPvkCK#qx!(f?LcS~J;UPd%NE(Xk$TLc7=(MVAP
    zK*;3NpmyUvh)@`JC7rz?Byas|_anU@&IM
    ziVCa%Kbs-m0LT~)zr@SP@6|fmE^-05O0_jw5Z=5I6wOuy4T1=NWg(q#9v@CleZvdP
    zMFuNCP+7brMrOJ*h=9b+dGP>-?$nMEAR6xX=1HsTLgZuWe)6@ysE5`oJHOOzd
    zL?7OVX|OCZ?=d9ey?aPswgR>UIvpYm!Nm=0x%pc|a$IDvpew3MV=mQFha0)kEPe`4
    za(Mpqa_>FDQkjV}8BE8x?8?>vtZY&48)|6{kM!sUzBsDnw6jR!x^00WwqNB)xc4LC
    z=Hb6ZU&0wpq%OFyh;qe~l*X)zkJU!oj62?Zg@JfEr{VQmyT~BDnv`q1)v`LDtWE6_
    ztgU9#Fx1NN49JSV&QJdK^;!*Sp9E8X?#h*KoWw_TfDD&#pW>p|4pCUAdWQvZoxZz}
    zr1u66anmrexaHVz!u`X%{X62SLw&@hwFj;sie~c`bJm0wxt>Y!WGE5W`idQ#0E5m}NofOEV1S?*5Iy3^XpR}NP<6v4@5T^dYk_X&s;
    z&a6|54JxR5ZNF0$>q)|D|2X>AmxRgRPt8^C5T1$|t}t6}CjYwoeIkkDT4C8&%k?`%
    z^8Jqps56q+CDY!HSipI96elP_tZINsfMZ>JncoJ3s3mri(ar3;f3lvIv{6(Y)Fslg#b{oVoxf!z}OC-b%j5FdzAr-
    z!BPa|sh6jc05hF3;4vBzu0QFRz*WGzS7wE9b{rshZ@cXyr1hR(u%S%NrONI!_Q;*&zB6ywV$uw6rttmHjT1ADY*7{UQDmpajZ&*_4>F*Ym-002&n{u%mQOc?V*U8(
    z;2Mt<-@g#R`iH}i(kIQJCfj=
    z@cf&qgw{2FiCqeeb#00f79ckZdxyYAiDl(%fQniDo`_`RthJ9R=lJ!=RrGLwZqG;d
    z!@y0h2=GAm?FYTD0-gEfyAM{@SL;Ywn*1c+`j!)Rb*c4V5$#c5eoL>*lxpukB+e)Z
    zmY&A7S@T)pl#gkWxmp+6Wu7qPC-|x~Z@jS5=$ckctL~W>W|8h8@r!F(-(yVZRc8as
    zX?Q{r!>gP*TbnAsy|SyjRvxdGxiru*{p1Xd6}xl|C(`w97i~?bQRve*#*1%i2%T-a
    zRHGM+6e_!4`R09>AcjNH*A9n!}sCUc@4^vO}gOSq^lwBLgs+-FF6
    zFAWGx7sT1eAa=@%ev_;*?h_o5wgxo`1~ZXVTw$BTE-L#h2Ui=^hYA{rK2bi+aRd+b
    z=vR_>L4nn&q^+4TGSWiox%?c&!*cPRXiHefve89Dv$YxCc!GbaD_c>WQj
    z{g>xBKl+zt6F8Kf7sTK&=@xooY?d(4rwB?ZFctA@c4=S@z^!y0F{N9C=u@rC=Ie*s
    zI7I=y46)J^^YIVq>^Xk^^|_bR#~I{L5UIa%ay5ct1Q1^V(^rsFY6w6nB+DyfO;K1f
    zTD=m0TD%Et6i(504BPy`jx2)A3N0+KD9SKm`9?xvDUwekFY_QO>9CN(4$nz<`Rf`-
    zpYnBt#X*QFV=KZo&K!nYTR(v$7eWuWwvCfE2H+=i#)vlF_ki{_$LAQmnrH^YQ_nFh
    zo^4Ks1m+pzq9Zuw6{b%5u#Uqe5qjfgaUXtj?if4x#r0p#`@htTq^lk4bYwisO*-6U
    z#j5uzdKpE{ZPyS4f+o@VSH;|%EM}?UC7ob6gU1S!;Unr;?QK>2_2zt=>ZX{#hu27X
    z-$AB*y#}T#Bvw)IecR^hpw6QzxM|__LCA&5w{U8gitRv^Q|7XF13#4}P*ddWc1L*`XogoiQv6O?f39R;
    zUX`dKUwA;VTq5n5y!7Q~HrJ;Y5p<%oBTiz@WdYKxx?+F47Kr8IlAm;2Qw7Cw-qWtI
    zn%PEVyw07k4&ka@e9H1%gEz|Z1=r0wlR%aZL4sW?h$lUr
    z0EkAS<#n2^Hq0g1IN*P)*~rz6}z$~Sv7$G;MyU_??$@JV|F|01W-woi+}KLnso
    z|Cplje|XaVJ(M;6R}yP5W%Rxl%mAIyfD__ZMiJCPC=A;fFw?>9;|A_TW)eeC;#g!i
    zoPO{OPDkf+K0c@AF;|q(*p_IW*W{V+W)^?Dx!>!XHzaXDR0K1$ngu|GB`P>Vfe*xz
    zmj{+lixD*fNV(P=Bp0<9{g9QVN2yNBgoQYaXR;UjyY4FH<+IBacZ;}
    zKb_tb?S0tmMbQL)L$jN?1CV}BrpRa*(bZ@{7{!ycag;nlFaV70oy*G~61wwul^@5{
    zGT<}V^NNtYGpv$kYr@gEodIOY;qUc*;x<>7{_GD;#w7P-=~p-v6|VB5a%H8#q=Up+xiHt;O~k
    zn0$HqvM6VV*|6A(82<=56iw+YwrXjxgcsFqid4`W$Ma?Qq9zCZ3R?m^tmv?82dd@l
    zRjhu8)If>9rVqp^FexBQ9ngVXWS)vE>16b2!R~r-1;$4va)^$Nd>zp=2-8Ss#9_ku
    zURGoVsHhwV3^Hk^n1{I5WdJU+tkM-aZxIq?CQx-0&pqEFXSHp`tBU|_llICdBLt!L
    z${V}orS&UY)maBA@9>!xHaOLQuEBD+!(RONUyfYIu?ds6qgxepW&ShT+K6O8i>46E
    z@e+3E)8l;KVl^^LTE0
    z9oPFAZtTP`nrFnfC8fI+)8<)4Yh6-|e~_p12;OXTDaJj%dx9Q7;vp2lpZmXVoo_@V
    zZ~kV3EfNX2{z_sE{>KCNA1bc@KUdqorostzTW54N3}3r+GtRLU%J?QXF+>2#a#sPI
    zaDOm7JJe^I`2q}Kan9q+7P+?7<#l4e0Y4IvRUBT3O#;v7txHEf^ZH7a2J+Yblv}qc
    z=Z%N8^gnNl_KKe{h(EkyA_0tBc|aDOhcekvi$zwK-kaW2Uk9A&ygA^*5y
    z6WqVc%ma6xYK&ihu_Zldu*mUGcX=Z7{Z%e={i=Z*oc|3rQ4%WDiB
    zl-)f7{d+eRX7~2eSBJJ$3CpUxOQX-=lCZmDu9h#6^D@8v3zFC{%PIJ?NlQ*=IhSR7
    z7y_gwo<~%#IF?gH+JClgM9Q!Ubbc

    +TWtB`ng1o#wK>lswpLuT>LOZc}@=wYu;~hTt`xa2sm@mu)9{2!-<+f?uB5 zO_AdTmf`39)OPR;n;ST=b4y9#iSBE}GAEKZ;EXEPC`N4;VydaCE%pfIOooe?tpL(ZD z&c)t6^<4MvGi2>SIu#d7_OHEsd8!YC1fqIrc4S(ncG@4h)MHhov}^F-0Y~P8+vfcY zst-KKwAmC*`TVO=OXiUM*+<)r9PYp9XRzZ^-+Fu|EJ%OGY3u1~Yi{b(+*Ma=MjgbF zt_qv-PVB#wU9x!~i0Hk~<$~&krxC}3FG*!e*i*`!lS`z1KDckwozjD1K^zpiw69mK z5aD#@sZBXMvo$w4RW%3MZIy4C?yxt$T17W8O%hM+mEwF%u9|#y?xtpvn{yIMJxATQ zD{%6IKG(c=M-zK~Lf2Q0P1Y_coG3>P%CGx8ub6hYQyh|hd5Kkb{>j`00hVT(bZ)cT z2ky>HU(lYI>K#5=DkIXGbUA)kfnQ6V_jeHrVJ+m=L&7&0&AoH1mLsn5SFfaV_Z8jy znlK;~@_y?(F1KB?BEpnLE-0&a-7VSy<_|xeR{Um0>U)$cgF8ClODh?(i2OO-)f>Y@ z`uy~S9qP$j)vV2|I~lp$-t60K@l{aW2tE1k;->>oWeNqBW0!nFP^#rFH;|)acVu=H z2WMVA{CH1Mv~}v(k(FtM$&1a$&npERF+?REi1K7*k1V|W#`(Bx1AA#n^Bew;A4y9i zs+YH0w$@%*j6EIlY5Rkh{yVt`AsFq&HZNOC8FO z(wn?Hz4eAD6Y{Z01~0?-#e1Q2i$h5z74i8d9_1`Ersg4xj05|G%VvZfrl^f>4>|T{ zn>y>z-8fi5%@VxGWLfrTSMIf@l!wvJ-lIdSZWdTBP~1D;oHEkLl>W`Kk@?)JyNcpP zp-KWJ|GPVno};f0P!n$4`ayo|@hQQUy>B}h81q`j{DpPe`mWuaVDhgSF=&XAzQd;5 zkSygteamF46_Z+c;5Vs`?PkJ98{_n!#$S;>ixZ_q!(FO*Modi0BWMn#LvgNDwkXXSytD)c;OHr;CQ@_VhN8l19?H+$k$bY9BS zb8Z>lw@qf~DRy1W5-s~kMG^3F*VAe$WRuUEM)I?#!uOF3w~3|-pm#6&S}DKZaP5x+KGX7mxNBKOJX@*VX2H+?&$am% zBRzPo=JiL0o0Wg7`;_7bF@oOcce3ud=WO6TWyBFmij7Jln}E zzs>Eu_6#O?ZqHX=*0mAd zTq<(>E1i~0p*Ja`n!;h~(dNnYlcOK*7C13QG|xYAwTU=`;-naHYq&ht&HVZKmb)_B zFReTgM{Gq9osAQl-Br$Sl%Lqi_r|H?1!r8pcWt4)_{aO>9MOf7NjJhR8!4jRX_1zNeu5x%gq)=#e8*$ zwh3vnr7Z2Hesn$}$$Oe%a>VO!oZIR=3n`d%(d@a;B)y z= zQP3 z+Yw&B3s?BeLVd1MyDM|#1!uWwXxgdtQ&MiU{em((0~JLg_fmrK5tt6f?4 zP+oDgj8A`-=F|#uqCqzxHPS9=dC+eACh7!+!6ylOBvG#wrXIdC9bB#1K~UZkDCavO zcxtsgGJcv-?i5uOcdaR6DUr3RVC3Uc2su@iQSe~>RL{`j43WfYdWh2138m*Vyh}z( z-*ld&j)<-|2N-$iOqZ;@Tib^9JK^u2%a%F66f z^l9{h62rIN%ip`E6CTwBMyB{3B_H&7;dYbO9MvS2Z?B`gP5tIgEw;*_ zJZ4Mdj^U<9N#@&QOrNkl${30G{M0~qmS2~xij+|IgPewm?j;H10@7wF6JGiGMAvrX z%pwaB)##kWr@IHA8;7g3wtKWaeN+5x5XvhQA4m^Caila(m`qF`Q(Yd$#^iUp!($atyp@Q zHlDIBS(_)VZ}}youiUHn(5lOGhlG)6*jGRT`JV5*zqrJ8P0Jz)hvZ_WU3a3QqQ=sN z61Ez?_s>7w6sa$_>b#T2)L9_0iAkwm7%( zMs~z&Po!CbWep{FWwc}5XVa7q+{wOgjSfG3&s`q8V4$e@B09OKELmsXI>N%J>|6?1 zjZ9CbS7MdSWs-Cqm(jiF>Uut;`J@}Qw352TRfk2D#MnEpT}furrc}g_#Dy<^x$3*R zdS!mUen6$OrnRN7^H+xjp}mNfxd$m3X0`5!@rxC87JD^}ZztSq_&^vS6D{u>>0Nsu zuEr;`?EnQy&h<9lhR}i5mnY>si-pwULuo0aJf@py&VR9>7fLNc2iD7qWM*g&J)wM> zb1*BUR(r1S zG;5Y1;3CM-kE)(;4H4RYeZS!q9``rn+YDYdsb?^~N}}v@l%P+F)Vea@>&TxaJxj#- zVYZtm@S1UR=E2g=Wn*ux!Yc*|d|zM1FNtQDn7N#fo$U@8JDne7ApOoW>qdooYFv}4 zl7jT&XU_21{)z{3E1Iq=-%r@LHz_zfJv-2K^5JO9gLjq|ru<#6ErL&dXVEQ)*%y)D z(v@gle@;iAl$)p1Q6x3Jh;es->mdQ}me+orts!5oq_ou)R8VEyntXd(q|AQk)b#Sw zWEdIhb;gZ;vU}!RrSCNuu=|9jKfmb{Voo7fMaAM{`&7G!26$G7+UFe&c;FRto&|jEKm3G6TqZa>>IYzHU?GL8sD0@kWVt z4`jSi7%w`TO8F*}lAdg~oW+sbR+hnyERw->e?6&mUL^hagZ;eSnuqhJlD3jcXNAzu zgfK*%k>e)3XZLi`A@4+wSl0_XedBbW8>F^FgonmCIaV4iEm0Z@%XI$^HzQ@Eo7FDzt?`FyNtLQdLTPW@+Fbg&-$>cL(2L(NT<(%Z za`(&H@T2Y)m7_Bb>b};p46%k*qZes(+hQLSXouf-P#w{aaqBgVB5p3{x}?yW<|95@ zg2>Ij?YUdmYYB0vDp$fu*U4));|24J=97`nN%UyG8nx~lm*RAFxg?OZ5A{G-uJAc} z_07|WuW8g=xwB@R;(KiSsWijWP`9^NYj0A{ zaq{KGm9{Lza24=*UUy&A7qcYjrRO_DFuNu}ma zoJNX-2}u)H*eEE%E8=rP_892PG%{Y8lUqtoeDciF<7x7Fgcs!r`5#z3*2caWYQZ}sS#jM9X z&a4m>(<>Nf#^(ldmu*@tY~vVhj7^Q!R?u6{FI#+}Q9$s$W7DQKRa3e#KNe{c{q%%0 z>C@cZ4KL+)9Pvdg^lYl=TZnAtKB>10(_Se1Lu3% zY>oLjtE6Hp>PZ`7yo@EA6^$?;WlgpIl!tHgP~!N%^vp`k<2T z>F@--8htrM%g4b|Xy(IjIC7p!AE^CCfLd<+u)UITiXBNiGEC$dmMgQYc&@o}hM;DN zy>sD;9l=z6ZQTjh?=rQE+s36aW;XxZh@Xu+)we9x1K(&OE!j zea2s0_rZ=5&ZmE5covBQ=2rk!@EAQdtQYC*lK{MwaI@0UE!ib1; z74EoYe==NiQ$%y_(ebGam-_mFld|%asVdXkd?RHhKcCuFaX{gY>EolSTR)XWJ`_cl zO${aTe9}K!t32zt`N9-ZPf(eGoX`^eOgg~1}H+fQ`mrCs4BV;eO$vWEYEOK9NMx!v-PmX0VZ***!#whfrn_Gw z1uBkCXq>fv)by&~Y|kCJO$zBeub3;1SrZ=#4cP|GPkBD(+)_$iO&B>VbhxR)K+quj zaK_;RmHcw%kKL{%H*6ASr<+2d(vj5g~ypEzPU z87t7GJEV9+B2!Y9`J?x7(~{%m{Z3j^M|KysoYHkJIeneuOM({BH7DlE&KC~=GE85a_I}XdvKUQsQ`k}yg+ofqRh`+kH}Ma?A@=OuJ>#Uc)T@1DYw1;Q)zsK4ozs;eqRtP} z--eYexGvEslIhmcS|5-+usbFxZ+KzHgk11kD@cj_k}i+ zMO@leI0BAtkG?Q`FBBJli8Ncc+n4wF>7Mk(V}n0lDNyk;bk-sxAdsYoW@v<)s0pYE zh>3{_pz8g}J$9s@Kqa0El;o)iz|kexM_1igSy)p~LsVB;Pg6tP$XG;I<6G08DA137 zmh-_>@VAcyIC=LU%35;h|NHqf@Ic{jpJTuO%-z-(ffU8{W1ioBNxrKL1R;P7Pe`(7{ANpbF!41snbUmmWgAe(r9+ z6aHKt`l(~Md9jlIv$})p7r<(N`xyQEi=UdrsXyx9eh99fUi;I3SEg{019$oD(~Sk; z5A{N&4?+&cqD9~dZQx-L=mynaA7;=ctZQ1zc3$3STYGOqggpw0MA$=@TOS0b>h|-N zh~JwF9W5*tJS%zum^&-r0xNUBeNF=Ab$N^s;H3l<^5@kYYtd;~18B2=SLm1x7rzJbFV*p-b*WWUHX5Z?CA;C>b(Z}4;m=3cryeww7XgMgq3Xa+jK z`s*VFgDix%FNu&Zg=-rQBpMm`wr7{A&azj88#mprt?8(&!lot$?2VG|K z>k|l8wKvo)%mjm7()zK$cV2=QfP{acgFoFjz>@%V{7-1e@s~&2E_?xJdL9A$hC}Dr z;ez(@b~Zqxd|ez6XiR1XL07$2PBH+{ionzaVXaWSi5(};DYw?@(0gD{5yoI``IHrpt1B%4#;}S@=9%1fykRcFyn@C zgvH|EP*pJjJ6isPge1~sC0KhKKy3oe2G0N6r|$+X$e)=hWFrQ)XfNzuDo9L;JPe%Q z4A=`iP=2_%L53eh|BR-Xd&6e6m&+FfzRKY+)d_P1P^RYBzTy{*3BgV8@|D9TV@V`%?08yJaMmkiwC~0EfS

    a#O=r_yY&Sxy$Dx^gZ`0Y}dKJ^hp3=XRKH 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­i84Pei}EXfQCZeNe!tYE!{E1e@#s=5{MAX$cQ!R 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%0D^8xvGJrG2eYa;>~$vapp&wGyAl3QexL-jNp{M{ zAOXmSg#JE`5>S%X6QF3c@Lbjy3l%Zld1NpP27+153#F3q<^?&*(iRfFL&+Ff z_PsG;)=Kw*F>((WVbu6qFNdG7tx75U0_TEIG1MFs;Xg6J$l1nBDvmsBA=p#!9QtX@ zcVy%loq=fmt0js%m8JSNk=!u29w)pStBL1J zd$Usa-GFF)-`gYbEo&AXGW$Nb(%Nkav{Xq5o0yBw zYQ$#Vo#4;FcE-z{uFz+yw9Oq2BgfnXN{yixHE}X8`^TLHp7gBQ87;|AJ{enp^4GtI&)M~dlCj~4lfq=-O1nS=C;V!l zX+!QDE<;ozN;<(YUdBr;nGz9a5_-xjP6cQqP5vI|L@gP?yKJVV&i!+>htrE6Q?3%1 z+nS@iL{!NIl||tQN?y98Vz*w~5!#|e8r26uekuD#PC#2K38#OwM-zT0Py=B}X|}T3 zaCCCKw99gsKs*G7sVufNOXzjxgwQymu{%k~5yVdZSyslzM}@4v7?I$hsus31cu)5|_##c59@KxP}lFlm`)wuN`#%GLu0&50_R z9dGEVCt|09mD=q*JG!VhQ4gNv0vsCR8xxk9@b5io5Q545>ypU<%qe&ADq`^u`cS`) z!cl1c-(q;nAzZoeI56(8WA5QOyNF3mR_+v zz(#PL1Tcj_LqrKJnZuveiy_MFcQXX5py1>_fwbKdWlUT5rel!=7yX7h`lF=T#_f3h zEhYdUv>FP7Gb&R14F&hLoX-{Fm0NE{ZY);sRr$O|+~yeD!bA?oVfRG4FbRnZw6i0Q zG-r z9sT>y)KsE?V)q^N+qX5ie@{(h+NeTb+2~&v>DN008!Ngm5k2DiUZ@NSZTnmn)opY zhpp>U7weyx+W}YKayq(Q?I%OqDMS8r`u0P&2ygrf48VWP3jeidDe?7*zZdX-3ypw{ zrKOR95m$NsxZyzlwyiAkd z`})`$?<L!Z9+B=oV@k>%w8^3(O`F1Qp5uZjlb^ax?*B1>-r-(hEK8tkX565LJ;>K8)zg zITR8pwbTydU|LTRufZtTF~Fd2I9M``0`|*vIts#KRNbqldhh5D;Ei3X;{TP=JjS`t zHo~*gAh_HY*2ki_?wj!Kh5)Cy_Bl{7(E@Ny` z$zi^{CUCYEiV+-4=|ou8@Ob@uV4hvAG8f8R8-ib+fmcW}s&e~$eXmPtdHZa=gGAnl z5-u0vyPm&kHl*9hFJPVNIMV8~fNnkgz&aT@AXn8J2!`&x(WbE?Na>x7f2)&`lR z^a9=7MeDV;XdqB(lJt?EDFnJ~?Hbs@A8YrKdQ-2(GdI?bEDXQC1>aOv&sIzPD0$0S zQCs)Q7eY!Yg?%i<{iuCqb^j2(UrakuMfv|Yd&lTV+jU#G)3I%JY?~e1w#|y2bX2iz z+ji2iZJQlioj!Trb@mzGTI1Vm?7e=}s8P?asv7sDd0%tRq&%9Wn&agb(LT=)S=9~f z%TLd98LK;|PqLpTh3p%~Pb=RyH$T#o;*i#~Y>U9546}^FLLB=w60I%q;cc<_Z+ud3 zTh2fqP-*j?J_*8)@DX$Tjq0qVey4%!ud?ovj5RZY$( zThc}4W+oPs`87*zzH8`GI^CeBd!N%WRN6M3EH8)HEu^M)67kD6l5$HW%iChKS z$KOd&Y&jy2=5xDA^WQogNc?9p>SFgPMEkD+TBIuNgev|Spbr|7m9|7iP++J+P$#BK zD+hum=NgW92P3X1*lEL-q*apvyuZ%-(f=UQE3`T73ZXk>;wkNp#lW1VC0#rh)zcIy zP2bDNKP_)NPj|l^PxpL@+*5?H+?c!ZfWhgG-5V!`xK2WADSGA(Mj29W4GaS#M|~EP zD>*RI3=faC#NTEfSn{B##bR!v@XpG>r&pT@K0>WHOu^b~R!65x@#iBo-N0!6-Wxml zG2DFF(X2s*&-A+xvsHJe)-D3exrcdY@E#DU4ci-knkrg zKDvXu9IZqS5AYpuYIC^4g?Ff0oNUR}cienE)@(8D@Kh$MiaL5!YNzBv0nlEGq>Dp1 zzx5OLWMK@&5&lCTlun`sH(|K-^Q$i-00$e?{Mz4N`dMQ*2Etb;3x%mR)Jr7|{1s8U z$j|`#2|jWMMEK>;GGzaVWY$d8#j)eG(h3gTakPPVMkxN63zEMh1^YXd$~yn zmR*ppJO}G|ZUu*dVcM>YE4%u-7p96^@V;ofcxf3x+0bvIVk!Ofx7vACi%!f^Xowy* zy%|l{IS>(gW&A_sq-9*3#Os=f$2Z~$ip4$DconaJqDMrh_?S;t9|RtI6`yr{1R{?~ z=#OA#Q2>{C!*`@2LdGI@6alJ0#$IIY}ywm7ngGvs2kieK(`m4qytZIWPW2s zlWHbB$Ol`3&&PLnd{wjkv$` zVDn0Ng~JGd!V_9QHAcfHzz+!xyhkgEwr4 zTkEuh>CiZiCZRmHEVE*Z#BpoeznvDFOqMmoRUO9|qL5$7K$l;#{#0bg;=@Qy4VL{} zq~^{YMB2xt_8m1E!9UcsAcH>fs;+(RcOQlp+ZrZMsE+?4YWWMo1X#FMk|Oeu|j%1b!V4)72MTrq*k)i|5#Bfr`q zb3*`D8H7H)o0M)Vd+Kzx`cB_ZA{u8a}50m(TIyzaIkrqfYm)U{N-8mNaqy?_wnZ z45jZYkt1?cI7~cjEz*^vA_|By`VA3Qd87A=38s#WYyTxVIpTX9g9@|~|1*ehqUp2^ zSTHHLYWKbKlT6P1XP5ik&*u-ww=fwbABlT`K2}T?oe2mcWBO1J(zaH@pP=3R2bbbH zypQ`~g!0&(?ONsr*ud&^rE)8{-ScWC<%4*m^AUTP4y{>DgA=_4_)Sf-P_aL2Q(Vb* z=d>nM;sdvE-Hl}^TLNkvjZs!@xtbYLd8Akq`ATCn$x|1_^T*x`w!pkfJ07md(b5O> z^(D8+dNWQqr6ERE8eJtD?E>XrtNEJAs)LF);$`FIMa!(x^y$guSE_6kilt{{NxUUU zs8xV6#+hwIjbh!EBak(};*h{g+S!w2Dq$02Lul*Y9NWg5Z22W~o zXAFPCgKY#hYQJ_?m!tE1Yut9K5}fGdayxs}4`%Zb#kg?gCQ53b-ShR`oBTe}c>vmG zt#W%_w_2rqy67EhRF^T-(L}lG!jg0L{!hz5bFTCtMhvohV*w$kK$L2dz2W#EQ{Jcj z;2`wERte>8ep-i%q9D~u$<#jX{xiQeD`4CB-t*08K&4@j_`SSjVDic6&|cDQLduHG z;QxeY%D1kXvv8}bLulYwGmFq`8y`jrE9M~*$xoA8XQ5-haPD3%n(X)^&+qxc)Aqdo zOMqqLYbv7s?X6pw!>h^L$=kz>&AdSZ#!-W8h5CuQg&k00e&lhM8%w^{-r#10i1#K< z*d0;ix|VYSQDr8I@4k;13zy^|tivB`kWIki-VQ3+I&+SMRc?&ReuvzH^N@dag9ZB! zjQ$>$Zr+pl33(w~D4UMCGwjqDtOY@2h&Rd?`95vrELA|bkn!?sRv}}U_JOfb zM--2Udy4bv0E=L@q~Z!+ymBaeM{HqI4m4oT_}-U`s$2W{2|ObL)uP@536(jTX_hqR z=tg(^r%b4f)dSov+%!4Vrv-04L=0{#f-ck;SNFfk#M@;`&VD-Nyl zp&zIb@n>$Paj|TBv+#8M9c8(M#)=j*xBw`sw!*_X+(B?GMIDix#8;A5(xh>vHk7~Q zg_yuF2VsQ0jrR;`=bW*?YNfNt6u!G{CVg` zv4INBN~D#=(DNv6U5{o#x5mCaXawYtfQPKw3Qv z?G6RH7^1$E=ohq&5c6|RlTWfQ* zkJ^dY0^+t`t7u7^9B*CMCW<#ggN|*MT-fu}a*ke# zE36`62cW>A%yHO=g)Qnyi|V~qa3(XUBFlzdOwx8BmYtQwfFZoBBNs555rP%Yh%(X; zzJ)R05DoimzksOBjLmtUz5m27hqHe$&?v|u1O#rsL)RY^^-Q@+=7QmpA0HN8Vj-u$ z!%At`YI~rnB%_ik;KJ)YU;FCVm@{r~{ZSvWEP$vH<@H$3XnMC%A9)0=Nels`} zZ|)4A_O)c3LNy>L)bc17L`7~F@Zn*E&bZry|LvscL>Yc8yj=m3oTJVo@pdaq+&n{7W1m{xau;-(bD@Wd>f8%s|_2p zT`jSU@uc-KyjRw;cKA=LYqh9#p&>!$b6+F`VZTLyK3DV#^E&X9*`lJ@a^(=i4KFZR zUkyi1+y1Zk`jgLLJIiF#Ww;9b7-c!%Y^TtY9m5lp$^Jr0W|+_-Uj}EwIPg3bZOFb% z2i()l8s~Taw(KM-T>~|YiR*X&E8*mu0jl5RC z86;Q_YGn(9EHl3a7mpSN3AGFWRUnXM%#)O74jRGjmGzW=VQRGdf6k zvYE@NLU~D2Usnh z9PAR@Ncui`dw}$XKVKg)SWKn6aK$@Q<0nR+k12(Nt}2!iylh-nLX_;#$KNbHXY146 zoX>(J{cpQI_WvLt{sCoXsc74y{6#ijSCWFQvh8{-E=6mUt_wpT8OUuiOBT&sH`(HwB zI*QFBXBf_lO!+XOjin(hVlAcXl{Q|NY>LCt46ryb6`~PB0UsXCeMfCmD!MmkyH$Rx z!=)`NN%{y4C)xuM=}TKrxm0v4q{+5I0;{jTUsvPKdhlK90rYX+*3#y3OnxfZKXv+F z046~v#hdrXrFYl)rZFE=6rS}v@|^K+W!ekXw4As@CzZLw+vOsy#Ac>B^@0M3mT!c5 zD5eVAR1HyhS?P`(aNQzHkL$wdfLa?Yw4Da-FMg_oP0oQz#ug9)k$!i#-_`g&;IVP) zBFre#cWrH=J??s-raNs7IkiKNhwPX#=>c_VvL>8ivdj%FqxIN_R*_Va7xU|hK#%xv zGiFKY8S#0k><*JGQTEsh9U{dtU-4V*M5mYo>UdH@q<;3~+Q2sx+o*=o4tSAtLsLoqU9A*`0L6W7*33YtCZs zWDd%bU5T>9fRWT^xps_RxViPy#o^2gScU<=jB9McfNdJ#)lGtRN#Mn&w{VWHdQ9NP z_aU^1Z>-K)ZpI_za|Bz`eu-Nw$3heDYZI^%zYjEZM};G4OI@M5w9GJmQ3WnpYEvMa zhXcuuerLJt(%!iwn0bab4^66GV%@f}ub$cBpeb7A?O`{I_9SYKqf9l9>Z;G|N0}`V zme!4U$97P-27O*6+EGIQ!CIUl`0P#$*KSMD)-Y_WyyJGQlnUjDmvKUMP)xTENPB)nWlodPtbj&2R1(>JIqb}Kg$>aW$>PRD&NrVn#~{K)cM_EV$ir7bM9&0uoKj*fNP|2jZJ+V+R(tbEk-%O(mBjFD#6+oyLl+35k(iP08y_BCA8cbTE(ix zlECiYDABajq8>Vr6@2|{vaOdtN1#;uei!2$2@;OvoS$@|9XMT{G>V@H~MVBjj_}L;_1*EssO|UnBtqX0PL{V z7)Tg1L0snxwDp9q=&ON$Xl~$Ij4(%$>vueh%mkZ%S+p@`jxV}w1V7N_#qp?m)HG8y z+A1-bYP{mPH3tjtKC65rB!$;HBkT3=*D>&D&Ec2!L*(0K(-Q!HmGl+mW!TB#W<$H6~+3^FZa0-YU&3AYK4yyJB9vmuTqCk9k*AC{LFq?lz3ix)>Er}QC@%L>s^ z=jWFwOpETA4=3MH*E6jQ%I0Fje&Hgv--Le+e+dU`#i5_8ooxvJ4q;*X-=(|%TV~Zg z+*KCQ|8z}|+B16~)gy&M@K`L2%6vl>r1iHT4?=saPt?D0bTspd?Yb41hEMzONL zU#*Beg-YT#*^t*aOjp=;Q*9S)SUuwvH!rc2_0;8cJ!UoJV~`bdZ4SR-b5s!!v>SQS z@gxBGX0lidkf(y~MOs^!_aU1+F0kn8Jn1V8XSH4f)zNTV%1#$Q4{!fO&qxKY@5RgmuGiv?9ZiOaS5*euIF6%(vnU4~I%=(%<8CFPu&E8m%owe2S>QY#~S=^93F@!Hlq)+G^ zdv>p=Kk{~S+=csl00}^Cu+$yelj6N?oDUMF9G*J&TdPzpHuuf960-!S->=#S%3ke* zB)V{>u=DZ+WS)LKhIRM!T#FzqXf`zj2)H-yrna_K0Y{qnIaOk+%KG}{*!E|?e z)3Y`vqjMs?9bLI^hW4Mlbw&2>Uw5p(qT zRIZA!ZkdvMmgEsxsxaGeqeY0qZ{`cp*^v(EHrVyt8D-{@?021{u2&2T7o)G{uJgcU zFwsFj;q2o7GJ0&)ME_&zA}hWs(W9l7^EgPQQij*EJPI0c?T`KCDUk3(lUjfmmUvO`~_T?ghXtkF-oF& zO=?ok(eRK*1SH~xq$1!u#hn6e3WZ-!)gdLMEZ!Y~X^+OGuz9r0+)KUV*E@_c{GW9p ze=b@Bcxp_pTv}fs8zB;n6%dFhknpevJ`GE3xxk)~SWm&l5s2KdJp98AOZ^M3ZJ_al zJ{UWzUqyT4C=}43=(UoC1eY)9O)c)DelHyNi8Y(^lw?gW#YlYwR0^@F8Bi_d0x=kh ze40*jMSieXicqo7Dy3)y%Gp3<>Otu?s(S9}BUBstQEe1xK&6D!QA>yiXDMdKXN@>; zf6@WH59tyCkoFRnMZ@9lnZs%O;(4>fT)5?+R1=%9@(#O5d|XhfuXn&$ZJk6R2Tb$M z5Jg9@A{YooJzZXXvx6E@c`n}%OP7+G>Yq0z|eP=N9gB`3XokM!J z?;+t`oDCa3aOf3|72{5URJ7cY4NC6n%SdX;9iL*-ca8y#5fRgJyP1OS6~~KVA0-N0 zp?y2Bl$_yCmhT?Z+@ah0y58N!3;eH#uCdz^tp0}s2gG|l;kNjS`m$)h!k&vx#6THd zkRV3#v`6wFLofRWo)qhk9d3^$>yN)+-|?F26WP@$7Km8!eQr_=dI9hqsk*?Hh0X0L zjF+Pr<*x>+ZSZ2u_ucW3L#hZmVL;chA_%6er!!JfVxv3D=1U7zKD7G!?$I}(vMV4~O(nbmHj$U^to=npYW|20OuMyke#;=HGTW`d=3 zeHAQ~-=S-bRb7s$h_qv30Cg9PfgU4G57vUFPS_W3PL|zEqLCh0-56f~GdZvnnGaIY zYn;&vSWCHcl;YpD1706CK3@3U@i${Kcp@5oVe}zGerf^@*3b{{kUHL4h76VmN)s=9 z45a0T&{Gc)7b@iT)KWH-lJS%Grjz3_xm0hQ%^#$8MqY@n#)x*#`3KT(X`+9S$3nvT zzHUtD8f&sbp1n&$>*Xn_X!=5=yiAP=fD2JdI>JxtvO^)>{m%E9^Mjz##xIn(jX-at z;|g%2S&2A2uT&zx=C!xDcged4uW%f9((Mhu-H7WiO_+YL28!v!WIKCchkekYUSw+P zfb&NQL{Al{Ky19M@u>kaDQPhu{uHC!$yuP0sUF8tlO@^T`2NLiJhQ$Jd0$j1;1!J? zd!ld{MCCHa#6Gxy6qCz|-gMOTi|Gr38b({NV`*ddA_<}2H-0~7uMfn(x=*jW7DB>L z(jzqbzw18#=SYu`rJaeap`-PG*)%69{a@M3VActtED=H7+eR{E6~ExhW(Xng&-D?muHabnO?kn}*~P47;qJ+LQZ9 ze6enxl2JXy?JQQiW}3F(H?D=fc3u!RZ9M&z_jmnqyA343JAW}BRJ^^1YV#v&22pEPCBIh$$cPhw<8ys3&edRH ze5kJAz2zFIh6JGHh(I*S1b zzk#%v)f@ri>#W57(7gnKm0=jpt$wE)x~XCI_#t|m$}y|y0aEQ z-n;t>T_5>cOv#X0!bi2QIg?0LjzlcjVHW*!;ue#Xf2@*A%bc`Xg3ucp`}OtCIi0Ye z?i-gVsfJ~)5i3(k1XcK#`S-{HM9P0(*)-KJ^L@xo3{F=Cg2A` z;Q_k>44pxpmbMLrL6~h_5=tFus6aoP0Nn$-41(deiGeie^gjoI)kUqzi1aycPUVQ* zCyqH2Nb#dGY9nXDkDr0I-SXu2xJps;@%9_>3!(yyF$Iu__tRIk8>tJk?;Pe%DU~7k zMJlx>_(d$$K3Fkm6;%wKoBijf=ytmy3d)WZW9dQ zCvhZu5tJdh$mns~!OTJ9Wm=V5635!)dTFx_=YP-`P`zTBz~XFgJ1ZeCHP7aiY^Ze! z$6D8qG=}9N)S0>H+^xmGwSSacuU;7EUztZei2q51XyL)CNBr~+1N1WXs84hjV>%w^ zNlLd*P0A?N(aJ?6^Eg^fK&BhvTiq8cao<^7MAa2aENBu{$lw#n>ie(bekC!_XpG%0 z&m1A3rjV*HJqa#kk-~kgz=NluFflh=T?!wqG>co3<(ZE*54aJbN)9&py`>B1#wSd5 zti2p*(r$F;?BSQg7_@E4U_LXaR(-EDkpUri5^Ubt$LNhw4;f4(M`IbLs-(gVY&A2D zthaM=suFpjqHv|ciC8ae7*mhJ=lCh!?JID3PN?cLdpyo}X&UlRi2O7+2ieiWyLW zd@#pkZW6~mQvrI!a!4J%d>vV9PhU}{m{v*L>QNU=Q`@W93c1lvm9FZ1A$Hji2N_Kk zb!rE`>8!6wRxOIf&N^eQ5mg*G$D^h1X$0n%>mAWsFWn z>`{?H;NJ9x$kHguH!`U%&>6AV7~2chy^M>{pG!CW`v@@$3GtVpr1d6yUqkaU?nBH& zKR}sY{|(6sv%$Jup~43&ZFkp%S2 zMD*Oy`@nPY08m@}t)>mJtW&*u*xkB@d_z2)4@|(Hc$@lqMxGf?_(e}jaIEEB-gBrk z4k{g1hj7I35XJ~O(lPB=75zCK!lm^_{C<56UHTeo^p%hm45`XLqRp%63wfD%+8Loh zOh}YV6Z#ia%c~fyM`GZ5V$fymccTMw#QcTg7-u5g0bBKhRslRd(fgO@whShw!Rl{g z5NCza%Z1VV$OIiqJZLvK;JR+#VYr7iSOystBf%7Sdu6_Wqoexi?&%fTHvf7{qH(@6uM+U`w(n~LRdu#m5-{0MjWS*L5~`ap!g zuJW^Pa=+n+ae>m+m2=P2O7XgL`WC$30FB|e=yu`Fd5$Lk93^}tNOWQ@=d$h3B!styM2r%&;?Zcd9OSu zHN^of%G>XMWzB`Tv#;%+$WiS-t^NON*8H~`e*d(fFZ54Y^S>Y@FK@I(Y`zAb3`ut3 zkw7q^&~RcqcHBS#L5Tr!|3oMdQW$E{G#eme?W(Sud9Q(WQ<0jrb;Z)!%o3!UWkpkN zeSq4h$c?pjQx<$?Dv#UczSrhm*45NL;YJVPPnn{j z7!0^11ODcSql)~ObVB{%sG?SA4(nD?@AK<@HShlEw)KI4_1`OD_OCZ|-s>?ufRfbb z=+ste)@}4j`q^`g$xWk20{Ev_#Xuq=ml%sV9PYshAK&vq{@D$NbV!jqzFA&M_N%A; zH+KnE#J3wL-<@HMcZL3#pde5jf(Mds=bmuiG3H|;rgK8K?Sf$vpvg1xtt%tKxO!(gAAE5(nGr}xjIfkNwY**E2 z+XwJe6tWwf%aR(~@(YL0VsKok4XG`#**4o*@jjV8EH)&TxR`8DWR;U<`CNF?sgwA1 z5?0^VY}bIPcA5f`A0m-F1;3S)Cvn8p7Q)$D5ZBDStbTj4^r{YKO!S&;Kq>1MHIN#K zyk&TugS9wrEt`|sz$i=^f42$Z02t1ik;KPGYmY{2P)i*r4`Wwk{=TTw7+?(=H^q%K z=|I2u#g39O0mc!fO(-2SXv4rUE&HGgB+&zlQv)VChD>s zirJH7ZbxG!w2~Pm`Pmgx)hkf6%n4@rtS>PQ>s(edjz7Bb&el98`H>w0<|>i8UJ#=> zs=+A)4e!QGY)b|h)fzN$@11?j2VWuo6@W*FV1LHGr&J0|!8-Px=T~+=qE%xgid7dG z{K2$hUCnCxg*y}U0V0SY+r%EDi_2>*OTwW7g(y~R$eS@c>`l`6XF4JPR*SVWlPSNd zre+wgwy#ctw%p)x<(r90j0@>-Dg9BLvsutnl>cm-3n$Sv#BO@RZ7x?&PWa##(I^mZrs(TQbY`Z&EvCrBQ!<$fSebG$ zVy38?Q0&8TV_D-DqfSb1$>d|H=Om&WNq=C#gvBtk0rhd3YqUvKf=6{QXv^HWylA8d zeT{_uoyV}nM{yBU85+c$+k>wBsPMR^p4N`^lA+Aw4y4Jpz$2~}c zqk3~H6_;-*Rac!z>5HE;yvV&Y>sgezMAObJ_o-u37X9m*Oc%Q*F``&VojQqHZJ14L zeyJ%xZI<;aph-|SEmtK$C8ijL+Je)_ghs=gmAd$_OFb#(2>w<8q+6BoiPAFS@NvY7 zHBhQpgK2L_EiJETgGYOH1bI$=ZtW~_kv{G+geV-2=5PZRX4v=Mi1{nL4*83dk-s#> zG8`6r1tJMMO-d>c`!$*@kQ#?w8)s-kvm;BE&V$s={GcscFbmFjyN;r&!S|po^Sv?il67~(U9fy15=->!$Ka5Dw4#;Z@uKX20gk}ZZ z__Bg_yGzbKN!g!GGc2X%cu*Y4w;R@O|Bt`$S4zByH6Z$A8!Bcio z=M-D0cw4HPwb_LBh`@nP8L+qeqa`-bNHc<#d?Q=3_4LJN)GdzI`v`lL*XiRbG=5p( zIe@2lBZ+hZ1VREw*+zu8(;j9;W=zcRJi1$j*NAJp(?Jnd_(fWu2qfX_MR4)L1G4n{ zdSq*~3Aw3k%3*z3ZJ>uQ*kalHo6YWa3t@sNzDbQzqAKNy!FFKqyIHVlj}Dq9*N_n9 zw)DnTkt0EV?z_+r`s?0W^Q94d*%AsjsH>pBMN!l2PKTo3bDNmv|a3)BO zNg-2A66b?=?O5SW=Y$honGrE6a=!LaLCp*5c#qdgbx^f$v3u>I?#M1tDL8wmmB=EB z=jB{-D4W>w;grkKy57;cR?X9e{|$#19Uq5&ha#f3!i0X?$O~E*kFXQ-u%rI* zt*BD8u}pbvDJ!_zCZ=_cQz(&GYwvJ{9Hw+7T8ZfRi!jktVLYMg`tGrHAJTnp{E@C3 zg&FUUbf>HSflC7kxS&VF_<)O2c%V?)%B64>B%&d+>CA5XBJq^+V=nK>W*`i*nQA&0 zvXtlvBw~3!7-?rd;aM9%pH-+ zW3Ams^5sd7peUC0E8tJfCjSZ%1?jx#8e0C)SP0m`z33x|M+{6J+g{c)?O%2xF12zO z()+2m`*xzE?1wW`!dDAnZ5ax9mD2kw?L-7WItmZTAu2n`qW0AwLl9rxslW7J8t+tC zs^VX8`!|DGOqQwmaW5hU=E|fw)NWtD_qTOD-V!CF=x{S*ILohTRFvj zP1StK9_(BL4}z75(Ba#|=|>9l3r@Zap+-<(D7iu>`2>i#QOTdyf3-}@r_wZC^wy1x zX&cikLLwS6>gS*(~aPA?Id zkk>3{P??a}?^1N4DYha9$LUL3J=5bnuaFBjq({p&H!ku$7@6UuLc0&Z4)xw8%-;E# z&DKJE?sqwzuz{BPY|Z`XvHlweLxe_(+|mQk zM2pl)%EPNZ_1Q8eBN#szmd>^FqnMcFvi{67lZi<#?0u&}YPhQ;aEUfYR;q0=FZ*fX zv2b1*aS25A@HR<=JB$Qtv-9|SX=btngyC|TS2su!2a3bZBoa5J=;?tntWKDmaiyRH zG|yT)MA*8K$er4}=oyNW?F81>vP{;Q27@@io;jxvoc1OYz9(oT1b6Mg&Ai{RolXl@ zO}>z4LW^e;FWubwRSZ$eOJ%>7n(UOJfy<+$EFFR4>5tQjT~6MM-BvD;Lb8k9X?GD; z5p$_*`ml>u8}*nCrpLk+!dt9Im0L&qmnE7$N7V@M!+mAs(=#*XmX}Tg6AcH;$Fo70 zBMA(18z~k?P_ky)G$5g4o|XxoH~_*f1Q;)p<>^E-(>N^fvRPh>l-bjQ2olG%j#NTKw8 zDhZ*wV?KnOD8{ikd$=~H{d!)$$UdNMQIkbjO2V|S`k5zPjf@PlWZKaop7jgYyJwWu zgXUO=LOSG|*Ru3oc$)JizCV!y9zhMS3&YW7;M^ukO~0fAZScmoMQ?Ce(iBgPwxfO4 zCM@l1D0-!cf6$HFWME>D;6BkB?0<(Dvi^_J8etnl7bnyIM+%M1nSnLisOFaLR>L%tFm~vW%VO zw5SlU6&WLglKO0hjm|@_8g2c+Uj+=xa8SWF=Bj5}!=D~%*yS{krrriFmYf?;vZm6K zzPY23U-|$Sc#vU62NEMa?xsyVr57Iq#pE)7@{WuRo3AsPq4rRm4=7H?F2>E~@@mGt z{=UE8)j5}}{QRvCpRfO(A@Of5EdFT<`@jE&pplcaqoJ|$KR*6r7%Ng*mFgEj<4Y*E zjHBV5OMWZT-JGy6eqmwv`4-2bQo0nx}<|VEy(8VQR8Phx+@fyl^55p>|ixa zzx1yXCcwFE+i|zeuFsmK7@BKv2l}9skD(qb*_*QRtSs4bQ5uP4goDC@1AqHf1{hjn zvG+d$0vQj=n~F8_mJ>s^E`l!8^6}vKAc@#bj}x&EE?#LOUyooNH}ne-NePO2g>D3%UTbU z>a`_==fR1(qtp8vkF%Gw;;rBRF#j;FQ#`({G>vTywZ!%_olEOXz z3CR4{-L?PqVGy>r1^gv#{ZEJClWmIjiCx+~k@BTE6Ub$ggQ0;=(7*{@3kn56ixec} zl9T2WKTbFc^%r`bi<2g*X_}U=Cr}v6LhjSKFq}`@pFdvlsBd zMRm_QMR_yZa?+<+4MkciJMn3opU^Wsr5MAw;VHP$4$o#xn1eSh&?n{$MC6Zgz0k}S*_lYXbGNMn!)Jhg?*Z#)Abk~ z6RyOE|Hic4yEC_l7NMylVKrTe=IIU5@+=M&`aPjlT!CGjz&x=LYL>HX3&Dj_M8q8E z+YcvLr7$zO(K;9#nm8!=B3r>JIy%b8+nEO&=iIy^lRlL_CYk|El9_Dt9Lq>2CY46mazU^c6Inc?P?$(irGA`qni1Zt;B~euz)6I zr`1-wIUJ+0+(Nh`T&}wlxQw2ucIxjQ_=>Fv5F5;xk&v4iq@xoNh0v@QRXq^!ApL+f zMVBc{9RdM%|LJvZm-y8o!Rr(m(SCw@BbdD;xrl;YEm8WsM4Uqk2q{Q323$7TG8%Yl zd9yR$CpP5PyyH|l&>iqZhvTxS^m+(yPbygZEbNhGlqyUu*-wxg;w;JRaTN?xmhb?p zj@4Gh?PGs&xd(k1_uc!U{TN7-P)bcec1D&=o)LVTdV5^QS?6kytS;V0xJ|jHlEx--OUynOYWZacTX9%?3>T8p6ogmA{4pR{!x z>`xrj3blb-9wwydi3Jnul?2o+vuXS9>TAER@~?rWT|wh-{Dg?hTLIiuh|Y=_QcMM# zy30u6A-`IKD>_6Rd-C|ZgMgzRY4L9?1a_n>niZ!`-$$f0H-8BR@JsO41%-Hr_IQVm zvQ^^=@l_ED_oA1dp{8G#Bwm;={G@TmftA>&?kd#Zf$JVXt41!U-oy8fdb)`^5n)i( z6fW4yie-}8e2WE53fy)ML@0~?WJ~6ofl6pZDm{>FEzAvn{AFX`>>@#DI*lb z8xn9R^_@QTM(t~vY5YP4zz2DOl;Ds)QABE0jXjH==^@TWJ|b}@dQMGkt?NK~$NUS+ zjOhH)I`)ZWN`2l%{`Xas=YQK%NZS2>Q)ZUhwmR;oAqhFO4U}}4Wgc2-R8ljvq-4b- zWB{dtMFI4pP#%bFha|h?1EuTzG1(CKfU{PTdVNj zg@jEloQ^L)UasVOzPLkfKhFf-d`hqd1xYg4J?{*u@Dw{J!?lnOeBSHu zdj|wzN)nm@wBd3*Z_+T`f_&9Roci9Yv5wa3es~#4gl&pK=SV*Xs6kpvxM^CoyEZ@7`S7EdKcST3e2&wP0&DKI;x)5C36`*3^k1gD6vbD z4716yNifUy?r9MhU>a)W~(}nm!m#Dn&qp}G~NX~k4 zj3v0e&oYe09cWvQDj>|a8p*wNeSlK{S=+e!kcUoeEp@>UV%1^*gJ42l0Vz;C5hf3o zskRgjw0K5~c?>IAu{UKvV<;VI$w76V7R6?6qDuUl;y;MRx2UMzsTGpY=#pI&}zFg;Dqb zV0eWB?-|H{TsFN@W&Zjzdv<3xIHU760n$d%%XN=Q$7Y~0Y#ir}de!W4Slzig%6ip- zXUqEmH^EDn#PYGJ)Y@IP?Dw>U!A!+v+MB4_ zl4`Nh+z&K9sZl04{3;>jLU~_AkuFG)j{LS5Qq0%gycgE3!Ut?EAMx+7cIjS_B(7LNy~yp+%|YNZa7H-&=*n*v zQ5=*Sa3d12_7Itrmc~j%ibEpH3cM$d5)M^$_>jXA30l~R0odjx-M;Y| z2?6W{9d|k0IRLT9>$E<_2JMo{acx@1F8FY2cBs>!?A#G{vQV8`#9&_^4b6iPH`0Cf9#?`(e7b;}b`+^u1#-KW{8 z=si$e1q;M)*q44g35-j39GY#{d6R!g;8wz1m6Pb>)EO4fP%gc^M`qx9p8me{A>BC` z`}vtDxBhLS{Qkd9l**R202|YPN|q|te;GpZ&10<5R|p&u?SP^eUV($bAqr{{F_rxv z&fY1yvUXb+uGqFK$&78=wr$(CZQC|0wr!(gqvE9g>~HOJv3F}{wRQfhIa-_J@*Vx{ zy+3*>P)F|lN2j*ki9qys93e9tneQKMDAzBkL9Suu9Ium^Y^SH|>~%grzfW-bC^#@^ zMTen;R3TA#4KR-1Xy)mu>(RKTMd?w7xrD~8n8+nQzI`p=Y){RNMo>m}83h;qY}%if z2b=Ue-&gM3ylQn;t7s!TLG@4wGi z43^PiI90q~hAe2$DGhH)9Y)-%N^t(zBoTTwbO*{IJ^tn_EJz8yazkybf+bcH#5{ly zP*{yHrm@|XnZ_vDK%k?^tZ)`?qh<$8^t2h z6XoX_?6;@E3_fA<3?AVJ%@3*kt#~1}d*Ko!XKc6f#HRqvKKi|HnSZ#dsUqWV6Gdj} zbx6?)A`+X-$qDs0E}{%0X9d_#{%81Mds46H(^ymluLEB9SmBch{eBeu=Y5-fhPUm9 z;8A-51o30SBgpyUl z_Kb#lvIpyO21bFsA(eL0hY*JqEQw>yFpFJ64g`h!ogz=8KL1I!hlFVfJN@RLF#lTt zDC7U*NA<6vJw-{!Zjm09M^{K`!}e-KA9h5&?K-MJl%9|ojZh{fo>Jwqpy)>Sz$O=& ztSKkrlR7uveGlTc2$2mgW$j7O`V4>f(Cd=wediyw+b#Mp7v=ingOI2+T25GfbNCcw zPecc!V26hBdV28#=5b|lW7FU$n$QjT=`LD}5k^^J2BTI9r%RkF4}F-}f;Rz53qD5W zrzbMlnV(P*HZjHDxs_`eZ^`dS3{pjaz4>6PjCVhYQC;!DIUF#F%aAQcqgOS$rF%_t zI`QV)TE+sq4{1?ChT$Ba1q%EmZx1^^=kdA@3N|Qjj}|V+-cUATJMX6q;r%-L&zsVfexKze?T>jEvid%xILT!&J<+9^H&=ZoBl4 zQc$*kIR<|zo@=Bnjk5}=&}y=gW^{l-I9)Y|K>y3yY? zX9y!{bP?QRz%6zct};amHaQ3%LaCO%qfjl&G*f!VUAEX%v50!S!qy(Zo(>Ck82~p( zvd^{eAOGcqha-FS4;Ahp?UJ$Ndv;3Jes=j#@*xIHA=OrE~@xL%|1& zuYNhqZvN&$VwBeM`tZ+k_}yN56s!gk2 zg6^ii4LSGk>64KOG+TF>xVR4thITV@`Zy2+EZzg?cSnd$+mg5+BJ4!~=t{5^nKfov zNe7mGmZvua7wQwCc^lQ|H!6G2m@5~=Kw1iW?%ON(>V^`=44nAWQ0RkC6lh;U(-CZi z1lLYk6W1$$bE}WtiT_Q%rxq3jq_Xnaq*j;o`znp~6 zO^hj@RA3U{1V;8oJXqpCRuG?3Py8!evl9g4Oyj$Xwf|e;&4kLq}1UEWnzyQSUdS z$n>S|ts%VygaCNcc=f~|N|^N|9$J_ynXUd?IJr_nA>Kq7lh9`hEE3v&f@#`sa5`mE z$yIsKA*wKr70Wd+m&pcQdhXe(->&uG!Ca=X8Cly|d06QcX^X=(pvpXnKA|MHcEmDE ze$LzkI1?KQr{T3s59J!MXTd}Al0yxl5@no(ZJ>}UBcJ&Vt2E`gX*Hm$yc)^8nA61E z(q6q0>Wx5ZbR8-{L2@ivYmo6cWG1b&rX;fL0NTA{P43_0FRB{+q0>Mkon}zpK#iHH zqGX1s&{U^P>$D-S^$}x&X>HCiaAgar1*n&aqq#QHI3EDyr zwn`(=5D}u9)U8R9mf*x1P^kQwI8;HXQK{4`AIoWVjDQ`FZn^P2r(ws|E!(5ps60$A zXU|kC4t4IojGpLs_Udjd6E?#(p>HJh2;mD@iBZ z0|AB~AaKLW5)Lw2t)!+kL8jP}bt@W{0;pYumTGllMrQ!ezx`n}{3eB=i>PZ$isE$gC;{SXW=d6#!`+W!m@oF$_wY%SRQ1&$+@cm?dL0 z53;yJ6^cWW4$B`AZl_@lX4agY*`aKvAs+>>|$gRPKKv*}O!w>nS_95jeULM*-z!$r|+W;M+SL$bQ5C=3DU_ zM#f>>HHJqJ*4aZH(5jsT@lX6^?$!fRFL@PPn0H^9yAI?F2WDniT&OzZ2{;D>R|UhrW&mCk=rEauWeb zVhmfZB#Qljw?4gG{~nph z{|8U*e=p^^|KslNzb|&B@B959qt^chXH;~YHic1ntbV1|l*c;skV{0s!L7}N6;PCr zl+2YfU}mG*XT_JAnA*@pXlgJvW=r6|ikW~Xro!H?%-mABhwfv6n_^x|RvM9!3Mukc ztGc<(ay(ylugw1S{!8rt&|YSU*yI4a7Z})P*j~P8gZ7>3BZ7HDp00#6XiZSNrvs*@ z@@Sws?B%XEQ#-!jiF>R9+)jvrj_RGiClq>$HpsYD1-ox;n?cBEcM(|7Yprfrp;8BZ zf?k)2Dv@%9&6d_-H1_-x(}69TRH%zcTEPi!({N5Ql_c9Ei7hKIl{Ur7wL9M_jZLRV zWe(3si9ICqDtthVX5U&(E3`uCH#lMYfi{kLEU3exv3%`27bImC7rwfEV!o`JwyszG z7*4>o`82DRi=x&{>dk|UE`3LfZh3pGLCq{)Qi+n|(1FWrl~8_ixCQez*rJL0rGTa< zyz26->G&Z$&Ko)i6+>{QN+?rU`IAn>ipLckUP9LL`_Lcmo?wFTD_bpKX=J?y zEm;{Es4uWAP4@ z!xH@(R0hklDBnvB-BeE9X`n6{1_QGL7$q#XSu81>b&GQ)sn}-oqlzu(JQCS-0^E_dZiy1 zSW7l}aLHi;0_#l~R`5$UU|hG@A$SM+(U>uF7wkQhl(0+OXbI*kkcrvy3%o11>CxC7 z>um2H|9DQflttBP$D^Qv0AfvKJ@F{I_-aUea(i({D9Lh@y{8y;M$BsZe z6eQ!0E~~7-d6U0IkRYLFtkhbW`0r;#t!C>E;^~S>QN8)VVaXGS8*LciL0l#~E8Q1u& zei($!V-Jo-azkl>z+vv4E`+7y9R8KVlqTGo(9cF6)Ue>mh`r2jbdw#K|)^4m{6oIqoWI0o8-e(c+ z>^3!`K3S8&M_)(Quajr4IInAtNxr{dcNqQ#A9JBj>XP{glSHb><|7bS?*1x0pYlUt zP~O3D9WMYNq&!k{t$jH#c!iF+c75$?2Zi5;IWRdYWtt=!O4`E?DK;8Se`ri6D@~YQ z6Gks3`xoJ2TuFVt5*P}j;?7I2W1%o5ML>5Az@65`JvI2P7Z%21P&l@Yn{+GsE=5Z8 z=Vaw(6w!<{8eG1()}lKuIER-S8)w=d7I+qoSvwA13UsZ;ycfv!&wkpZrKF!hW13R~ z15HO(K+P43;uq8SaLXMoE5%%!>c=u3b98E;3TPmoOw`(bw_}B#-9!B`oOtPkhiW*C z#QDoD_q8&!z_O(a%fKwCP2_5BuL)=wzp63u`TjIjJPuaIR%ki49yC_BwT@UTUI1Fa zjyF=?QwyrlbPHSp$(=}YI2_@Eli0(=Q_qWOl8a)eKWxtu3QDg8fE)+ETFzz)Ys!5) zGnLL%?$sCZ{w`eF>Q!R6*1+IRasRk10hL`KR5a2r)f{i2F`e^RDdMV@t?rh^ob=9N z#wUz8_45<*bxF`uO08+suxd*OSFCc8rl~J9BX_M43Ao>u)yOnOE2}PdX5(_7*I1ID zCbEHMZ_*klIO3S4>$7bkLsc<}O~S=4mQ1&-&H|Sq@@d|FR*a5A(;`NB{gizM5P7Al zx*?>&?niPm2Ih{7i4xg)BtKK+u>E;Dj{>@G4^DH?9RQ0D>wZs=UTam{-@jGM4X1&M zYoH;7le|q4or-cN+Go;EyXDB0d;y*XaF4Dc8^cPqkLYdn$w1ldrv`6gCeVkv0iulr z1yiFWwi0e>O95NMJWz|c34_tW8rm52TQ3O_FQR?he=q3Gq4CS4VA|1Iw&36P5F9MI z09**F_<1qd(<4e1nee=7Yx0Rx!q$YJXli`=@rT564hs|N_f~|qmp~5K2FKW zk^wU2npdCQ*_@mKf<%R&kChkF+r>iT=ig}aTGo`Su(uc*uL3QTlF@Qp`uvztn&KJ2 zs=g;B{KSjihNuU_{vqA8qK?&n$m)?}Q*5_CS0rS!jDzjm9SaTu+se{t>4r<*v3*T()I_HpH`g>7aC4>?# zpu#G|pQ|XKVl%{FP8dWf4Ysc>2r%>-;Tlp@wLkhi5NCvH_r9-G1m{rrUM4Op9|RBd zEFAR{2l_e&yfgq2m=_C9ItW1RR#td&&BN!$92I-}c(v#3ocrvPdp3v6jY5No9Yna- zG~d@$kg696Y&(p5O#rkwU59}Gr^pVza}oIdt22DES+`i#KK6^aH<%T6fm7Iu0N;Rj zC6exrrYExHU+&yOcDx)f-#yv&zwOEX^NriTs_TDuVrpmq6{Pc52AveDNME^HYEz$L z#8`h$(I#r45mZ2<@~5)aCj2-EM3Tgmw0vistDemy$0yY#hlvGG8NugVZ$(+z^9-!l z9^lcQ(XM0jX2Z$dD~7iR;ENxrEk;{+7zsF8*s}2Ipd@u#M%vXlrry{*i+8^Qz#`yB3Fw#wT}mo zO&&GH_NeiiLEkQ^pg1_p-et19IMWjH?7xfg3<$oS-fK;|}3*QZByJ$%N%Jp%qX*-&Z-VTj_5pol{J~f=Zb8u1H7s0mm??sj5vukQCrL zMg_zx=NF0$oSlD~;n`7`4^mhr{c;d5s5-}5xo?ejL+y%sM(v720N`$rrlmg%ah~oh z>045l>=AoY3q;P#rQAgX$~nZ9H}p^u3o(G-5~2{7!P+Rc4Scwvj{uGj& z>`;;&Auxkw@htc$ooH1dZd;Q_LPafjp0QL?#N;t}$;hM=%W{*z*t7gQ@(cR<39nw{ zQH2Tljk3d4&Dd?hlX|DAY2H~=T~$d-D=YZxJkhM>SI*X(?dC6su*Uv+#g0Ip6Wo25 z&IZ;Y)q$nIP*yGmt~|WM_|M;fvzJ%$-D+JHmZuThLJ{txZ>*zVsYbFE^Qmr82Lg6Y z#R=#85}!qNfgV>b$p%*Dr(hxw_F=?tbptU5ah}!&c(%)xOz99S8Hu z1DDTpd2aQtp6WMAqI@yfMlk^7agiljL4z?%wD=@YjbUEKEq>G3qz+YRB%#=jb2UOM z&_@x7)Z-t2YCtME_)pg-R%i-+iSD>Q;_CHcu8UNd zCnilU^W=*lxX=5=)<%OmqeI_TL~sve2;r^>I$~UKsG+8gJs~rdIoVgGDDA@9s}!)D92)!x z+a2BQVW_^Me>?N1>%eVt-P!*NI!inu@4n?T)Wn%$nCnLM@tLR2`!$!0M;-h~*sxFN z@!mSI2ulJ??VVNUdGFEZxHzV_#Be;}XqT$I8whfXJFBw%u2{%sK{Qs$THdl>YX1?G ziw!l1NfAUW&2E^5CT$mFgh_|89X1L77p)RWz7wq66uZK70QF3?GL`;wb5q=dfK-xL zmgwW3DIDdplPd9hGnw%}D*pd}wVH&jlZm7A|Mqp$P{RG@#9h-*i6RijhX80J46{S# z03+5vk?1jv{p&~kwHBSQutTpU=z=4D`SmqQ>MgtZ%u&LbR5yA*iD~3+F2W8wFrYQq-LwMu3$X666q-0 zbV(Tc5~wtyM0+VDOgir9*xm>BjuvuwNI^1A>z%M~=v6X1`GjOPqSi@4$xCd9}NxL2`%g#xs9d85A zI9{uju2v(ew6JsEQmRC4?4ZlEgUrS6)sU&pN=DrA6R|!Fm|d1cZaVzJl4I1(J)yD( zOQ*YYtnp}+aTO2^2LQU7Z8cWISZ6Uvr_5t`in93GvS3{0p=%!*squ@r$lXmoxzv4~ zl7cd)rr1tE?1djpxt$1lnO%Hap zmF5A8R)ka&wE^om1(5%Sa1+U8j~n z^k4f*{6DZ~kTus+cKYjlbNBYx>^vgx3*kl#U~ zpC!0cRD|p{++-CbpQkA-)^ngvN3fz$o)AFqf=E!03M-v63Xu&9UK)E8VCNwb9sYLu zD5i#tUI9)Nxap1(?OuNNis^89!Y?Y{^a$hz_OKUA_u@`Z&tgVk@Am!U(!2HtG;W*A z_R^e|`8IoVFk+8;k#;uP4k{P+7&Zn#a9g3j$FZ9u2LUun9~S~n|0m&iZ?pECD zpz*ycPVLkqb;avU&z<0435&px0apks@6dt$>7PPsoL_>p|J^#z{o6wNpSRBcDy08s zC1K@-GmPfDn%J`7nZyo_iF{BvBugZ9F$Nk23{{ZW5Y(57GwEPBVAG9FWi?4<;$}ib zTSAj2D78o>e;SgS>IG9UoEBep&Bpu4_h{uOybm-Jz0&AC9O^rFIhDr%3V?CvzQDbagcEd6K zs@01%zMRyFTglmrE|C$Lcw3AyE-UpcH{PDSb0cw?3y&E2gJ&4GV0Ye5lUgYk+vw@` zJHjGV7jxbwsjge5*J}r$6V?Wrkq=I$F-&m=9uY3KYKE=}o?hit>ECuXh)PiK2X$4i zMebA+sVP=PS6rpx-dxseBr&AXEHHQ*$G(~RS)ru)v`ol~EXV{Mr6O`t@#xM0x$nV1 zYh^iR9H<+>UZDyoRxQ+x^CC9F7Ri;s++j!Qnz~%Gl)+>J@@hv%6 zbypa0xhMwQbYxiH%-I8Su<)bH-J$5J#0#ZH?3B9#)m~@pD0(s@clV!-O~i}=>wcYV zI1!aEAi7EpRJKX=Jc-v)#^7PZ-DZpH`_++r2Xc(MYIkNIArq{QoLMv3(ehiw<5N1t z$8a;Rq&tdttUC&Kv^z=leo#i8^7q!Mkhb|4Rnen{ zkGH!R7mYtuhIem!q7jt8L&Awr8NX@|2wud8VNF%0_Nzg^APqJ8=3xTMcoIdyY+=cPC%@z5cW4JES8kV|t z-WM$uw@O_eL>)azA9mp1+r|a_b!BgD(sBu%HT_29*_VqoxKHz3x_Ky3f?IgZ*8=_{AfP9r%*25>_VFV^pbU{H!V$_LhqB%fh)kUW;w*U% zFL1!p6Ce-l0sCCrxY3R9>FVC-GEMTmz)D^4NuuGLA-aV~ z$Py1*j%Spu2?tjon(m|2nX^N@12b~H922XWFW4LRvxl0Q zt@f?wvPRzctMdi$ac6I8`R4oExm$DGPul%($hyO}G+k{IE9Xez4_ao;lfh$j*3t8hQi(oYrl&(C(<( z8-TVZM5nVXo5F_Qm8WY|R>2%&XS8GYN~Ew$h*adN6k6>%zfM34cF zL-A!_e90%iZ;da3t+&`4b%uY<+iULf%nAMsV;npDIu>u|L%VKISe|n`;Pf zZoSVjkD=>|M z#I07&e*S@lC|G*2z^kl;OoUVZKm zYJyq^Pzw|Vk}DvhCjN+W7XYgu5~!?(enAXQY#TT2PpHRv793Ag_YI)yQ75r{-Gg{h zu$;Bd2Oz@WFDx!H`OKVM=X|_<9+LTEQ5Po+xI;_)E}GV|%y&RdKxlUDiU1 z?Z&=dv9^m@#fIK$aW~5G61>*xcfZwqfn7wK+-AAp-t+C-&2W*sT+g-W$hGN#v$5+% zj}*-zqT_B%s0P@v+LZMiGfHPKDMlh67Y5NI!Zi_n=*vd*vs-n@_Jtg#1uN<8@5Ej)42?W6&pI!|@l5KXEBehEc$EQC17Pv7#EUll z1Mu$diK=*U)f3yfeh4rz+^TlG|I3S!Y_31c!beIl#Q;b`*i={eyU{^r%uBNZ@8=LW8E zAPqjwDLuZi7$4n^O-{VdV;AXxcjpg`dx@|a7q{KQRm*ext73BVUp7g0moFR`*Clkz z`UfRv7Gct(mh26;nWr${XfbyTV3-fzgxjHxNBQtGZvH{i`F2u0 z#YtqY6=yoXr$^c$nn>`2bP@~Zcs#5mnlkVQwFDpv`(R=fi^qCvuDWc!2thF5v5hZ7 zNhw{>?@tPfjl~|gR*|7JOQO;|ot48up3bSzAM|-pO>A$HQO0-M>CJ-8bDfd2f4PVL$XaMuf`)Fu-0?exya+ zGJa?V6TQUz=tb+FIrk$A1kp7~+l9H!gp_^SGe)orm!Hx65(tJ~xsM}K9>@cIX@X4B zC>pPx*Aq?$r)!+l6LClR8oBvZ3WpeNV$Q&MS%E_0%iNq^8Xu7Prz&6=a&N+ z4vfw*N2=ctPGXL6woW)eM2#koYQWHmtA5<)2qBADF9>iW<*Zli8;8%P9H7i5-IE}y z9>IdoKI_u}&ZQPa=@dB~?Es!ZX@JHEuZPEI%oG7ujZzP40bYry2igXvMK?g9MXeVI zhSwg^rNyuhfy`;IMBTVWO`t7agd0nS?M(l$d5dTRro|5En|T zk+8P;p+QZoG&V%+OqQ2kyvZ@rUX>b*=U0(9=Snb)`S3SbRFn&1J_h!ppw_1n;ZGuv z#ND;Xnh2>0*g7e~2#8{{8X;exqj-b06%~jX2xaO^@`#-euQa5|o%~O3cJg;k6)8MP zX8ikmc1ykh_VY#g@B%+=VhM;Yr!6B12;D|Ld{ZK7X0(3eOr&Kj=P16fsxN+_GQLt~?7W9k8mNj5Rm=p$($c!yFyaW6 zo{70u3Z;bOk%lY_-v(0?X2$OK&f@S;-Hi(ZSP4mP$>*?W_$)<@{c$Z!E&rI{LV?6> z)-hWf#VIet2O+oQT1$P5cjHji$`=VA5ol4wR8_lH?$1$W)UD{BF${#oa@k+;byAVn zMFr_}aXe$aLh8AE7*J*8K*zdbJJ&9AqYN7RRHy9lZ>j3hg3?+rk)MQg9<6tvZ!BbC;Yw8w7?#88236WEX9mm9U9Q<9GnRl(wXaf4wt+c-$6ga*7c}pVZ z*lVrUo%hG5C$Q0lt<#7qf0dlWxhdVg8tGCr(%bv;>r9N$dG4Haea+M$&)c6ljf67<5RR)z0WYzt^B_zoY+z74Erko#H zpqFm@@Z2Z{x)YnR{QUUIz%=vy>{%qNxc3uCDo-gsUM6ng1mK;6UR&RW9<{oARSr^w zd0N|}<+DBZ<_QPzmA@{b593kh4hM4DrTUt*-C3_qpR$AI($n;8_Vod{2(QRHDP?N( zQ%)3dcA8SLtcx-anv(+YW2;!9!Subv!ac7(*TxIFH}E4ykzV|+Vgn4lg7m=f>eraL z$EsJiR9^4PGG-NDJ#|G^LUwvmY6wQpn)m>UxglrTQhZEQ6Xd3(Sn>dA40F+|iwo3v z+sp?YNppM33bNL=MLwoC9@=)0Sfb`*xNXrKNu?%yUqjIx{~+q(7xU*|dzeLLzE&)HgV=F~qrJKAsulhx3p9jGS)nCYd0%DpPC-9n1lG zL8%?#~n1iI-9eor!^bd~K?5Bdzw`Q~*0TlM@5^=*~P0{v84 zGZXAd@GxZAp{L)Li%Ltwsj*H<;VD7}e&r#gmBk$li`%{jFjS*I*4L?B4Gn$Rq;6^O z;Qus{x9U^2P|4K^k;lHyCcVlPCJV|g9f>!;!8S5b-d2}+Aq*(H&ZNv2GSGZVJf``` zu}h9C2>ePlzL90P&~Y?WNgX`Uo{?keKQ!vMtRHQ+Go{bMie3lO02}L?Z3tX5AccWyjfMa5Ll~f(S;iB`c6m-gBZV5B-RUy zl>_C2b?6aTDMMKJ^KOMf_?oatGHo+fQ&7t z&5vUTn9u!_I4>xV@xsoyEH6a$N8qmtuGy!gf#ga!fcI3M=myK>^nxgEIi~{IoLOf> zqS~k7)8R1=5aDo~gR~*uFimS&(U(tbjWRh*l6MIHjsP@OraT ze3|ZF4J+ZdwwhlKfDAvt!5jQbXlRS_B;RGr0VFfdH#*~-y2gV0^he?9LUmzsq!}~B zC3k~^xIQ1p&Go777HwSBt8ZVs*>KIV3#j(cVw5l1y zzFb<1hcn2M6~R*F*zQW5Wo4>g!=e3)3Jb_L@`veGbf;Ls6*l6zZBZ}r+ztyg4tL9+ z!FmR?vddmDeg!sV)Iav#ZEq&Xexc}SXiN9Dom2-7QcXEcGX7rSPg%D#HprI}U_0RW z?wr`mAx%x7JKf_H)C^)=LVL=7| z99!k{pA;_QWlK|l{;6U`S*Ma~Dasa><;|=me%@{JWfBd~P4W~bq00BEKuNix)$_<| z=1SFPt>p>R!ezMP<(Lo)mP{F{tO!*xm=#OrELB#Nn(NtuWsuu^@Rb4!5q-SejSS`k zR-FFarL#f^ukaP{r4g3J5>)(|WiYd7q}o{p3~oJj3~t~!O@vjoMsp`F@69=|wn3wD zTKDY5-$=D~rX>o$_PA7A7-3eQC8`jh7tbTCH8X;%rZwtS<-T8NO>#8d z#EwU@_uPj*XpmxqWA|z_#-3?mB*wHYy3pTTlpzd#hw@@U%8vlDW(nF(4!6evZx5Oq zmS<8My!j%zW+mLtJSq9&bXB~EVLI~oEr7!*sAae-h4dY-qwDKX)`dwr{UTux+j%cf zj*_BS_Q>H=lc!L!D0@>YcOLY*m9y{jrra%aWatW$rBvGoWD6cyQkE&L2RAvur(Be0 z%N>DJUQ}!eA0bn6m1|3ykfl&nTn4Z?z@==KTNgLRO_U^#3Fs^9cC3s2 zuP86V`#NR?3FbS9m!fF1(#=RJ(we)$tyzy5F049W!X&DXE2wbF z%SBk?m@O-{nCv(EI0uujI22~Lk9m;jr&thPklG66IaQUw4RQ!q6Lr$U66i1`BMwFV zuI$^ac_$t*2f|7tSE_3T~HNLVAyGf68YPFx%9bxwwx7#rHOG_HZNj zn0WQn?}!fY**!%hjgO!t5-GDms3<*%g=nCfTG6BOWm`6N&x?X~>hE|oYaHQrj z=sLhjf=TUdMW|FlLwChdMn=x!?N9nwx?%}4D$6IvmiU0092715zKGyX{sXGy#uq8= zY1dp+@!uz4N4|gZA+2^D5A44;JxBj`)AOGzD*pRi|1U*Fjnbqg>bC-&ZJQ}4H(K=Y zJ?A^T>Zb)_jG=Nkk^pAna4@yAijqzQnq_4}C+GPB-$Do^?Z*#3$*xcRu>l#;Uj?$u zKG|M!Jieb_cPM>6TUS4a{$K*x3adxjC(Zd*);!HZ3D}vWA=;W&5KSR8t7r|o7jMO4 zVzpAkGEz*{+IMQRjm-5fauDKE78S2%kT~mURc)0bdDO1`asS!mkO)oZNXJWBu^2W% z!stZlp-28~p=_SiSYoQ4i&%qVs+8kpQ$oglRwF%&0%-&}AH^A{#YwA?q|pj!8hDFI ztfOI4ina;X3RX&T+_W7u@9zxj?hjx`jX-kc!}2V<`g&`|##XE)@U!2j!s9vaM(8?W z)%0piYrv_1->e6XmuszIZE7mTgo>hyu-_L9& z5X8@&F%S3{xyScmh! zPmP?TfVG9ee@8sFsA;*Od{cpBZIh(S3W{4r=t(UDm}x)}MBV;oGCbD$s za1walLL>>(pi6E`vta;XB5#Ro1%(bxbQyeXZsBzeY)ww3g`?0E{j+%~XXOJf2#zVF z^&)g;OHhB-Dd)uA1=TV8U}3ZB9)#qpf-P+1IB;va%Acajf{0z)vf0czaZ#y|ul)Hc zD@qrNcNj3+$Fsmx-)m{Js8?m#7Uf07*%HT4*5MfCR`c7X3}m)aF{#YlB7BJQCj2<= zTgWB(n7lLLm?EsnIp{;JU-UINV3H>0GwPO4kN%uzZ?qL1TR<$c7s>5} zdj80I{i1O5UC3^jjDHD*Sc-L3R!P)&CP)Q-(T+)%>L5J{e~F#%i!JA7)VK1JEo}G&HrY*4A7F#v z05r_xL>pzV%^Ve`6rjG75@UxEUO{UdTzxbu(KC5AGh+a2Emb$F$ZU$#XzJZ6C>I&{ zHOu|Zz$5j7Jt${Nci1>4>I(4UXW5){wrC=i4&=d&jtU+_i_Z146@p$Hu=(UbxV7>< z>X~`fbzzdsjB^%P7tWfD)L;uRx_y&Sb(Ilcos+{#S+kvk&yz;)1q#k8#$oO_t}~kv zl*#GZmtfA}!%ACw7B)PBqb@`?8#xbK7L}2=q4?X#K()I}`6o^xOV*t+$A=*wB(&^N zFtDt8k6eTGO)~<-UaK5p<8?7}U3MQ?f&0xBS3&L_`FaGosL>`^o(Bn9C_Bpb@HWg= zx>IRJYw!9$uoncydkoIA#MZD>ILf!+CjPd2q+~e4-owk8wWihLs+pX?AC#Q^d zR?cFuvyuW~A?FY3^J7)bjt|-wCP7>cH3~LlpN*N*j*FMtzf9q_OCxH3;fYTrr1YVy zcwM_q^x(MRVCtCFO!YZ*u%zGj474TJ3^G_lxn3k7id{vzLw+3obG)7nR zX@I|v=*H)p@jEw0offtpNb@6CjWJe_V7uLUcrHF9>inVMPD7ILMYyqHp6+8)4*h!! z3oKMv^$XVG=XmWv)+Gh8dkDI_O(G->gcpR(rB0XPZy(Zcn{2_pgumC5Z4^Sa@Tc z^_MF|=>Wl?($K_py{LKmdF-U;0zAVUp>{VI2?ceB2lYA)cdglb`WmkQ%zJXz|Hs-p zMn~Fi>%!f!S+Q-~9XlNxU9mgq*tYF-Y}*~PW7~Ge{_1_#+UM-O$2e=OHOBX&M*Xhm zp3gP!n)AYYMQ~+)?*dCkWl*|K&ALfD%*aNRUT?mRCTGAwuGEqXK}2vz9-RXsg9&}t zaj1PTSrYKONegXxmNVuVeEc1S;Tc`UHv=PR6A`CFm)4m;Vj})p$x;_d@o5T;=`Kjx zwqW&IB{iTd4Q!7$C2&!C2@%aXA@I%L``#+5#S5|joO~p@h2i1=B0ez?S+7*~a?@&u zsH9)$%e8^o&+rYn3E;CGYJFa!ij8QTv*ZT?FKBEoT@)FD*ZrXcPE^?~Nq5zL3Hi%W z;mT(N>mBU5W+>?EEM^2cM$>k?2k!2hn!|lBMn_EqmG;|`EM02Lw(cHF`ngT!Ykyru zTN;oh>J2<>uE|vsQO#!O(xsI53Zap|QPP)DHN~NSefGYcXUw%AdL|#m1Z2W&l{c@S zYfY8sc&-I+n4^r#wWNKt)kOLXPS}Ys^1$P{ak*7mop5OLNr->E{pbY&`fNMksP^UfPBuwz@vv$d~VciFy%94FqM+M5tr1@9UhZ73%waP`0#R($M-N%{o(C{ z-2K^eIw-3py_c~gXKMhka;?mzKS=jOM@>;iIDj!oO1MWZylL!@g*u#QxD}eG9-K;e zI3O9&1aMGZi|vi;P3ld^qaEk~fTCiR?J|U?d4n zZ=o)A_!MXY8=`CfrieVq`tx4em{)2Q9Ruiw0DevS&0K>a3nX=Si)}hv;g?_dW$DNT z?x2d?Bzl?80mb3KLHd{(h^@|3)XbXi{HZXePN<3JxvNNtg+8u*Sstih*O<&M_Pt zb8e8bt-w=uP+TsM&?!QA8hrW?FmNtV*=y?v%&NHnzgGeqvK}kUrlPM@N4e=WcJ08> ztLLq~Zw1mPFwC_0ljnWB)xMrk{2H{8L^nGhFvK0!wE&*@Q)|f2TQm$)Z>}d6&gLCV zl;SpKIn^Cmr(>w6apE*FCfk|2DU7PrXr9xk%?6$pK|`0K4ela_=X{uGDAWmtUl*Mm z8RxaE^?#QXNNaGHZE=Lrn6toUhvY$25pS1qBjVcYIH~$zAtpF@_(4t< zoxfnr{ik{n&@pihwXt_Jq=WFXld54CvTK82-x1)#v(fj0Pqbwe{l?vG4--zcfq2tap@-erfwH?xm6QYK~08D@c8e%kTjhy2N$`TR=| zzOQze;9ZdQV^laR(0KA~fSjsTA;Ht3D3|6Zo!-qQjUx(D^|=1tS8hzX`@lkVbLnyH zXq}(n;|Zj8;kHs3jp}G*Z5yuS52or!NwJ~SpS@Nprm9q&Q=k*ex7cV`;#zrt$9dlS zxY6my5s5Nf>%MoD_#oL7z;nXRILfqCZSczuYFqGS-V5Kp3ZbGlQBgDJ%4NP27hz!* zyFga%izi+s-j6qU^RYMI`!RSaPx$-B>UZoBLgmli63`d9Siim@ciNN&)L`*+`Lz?p3w)$Hy4}eS%YM;oU<+KcuSc_2Z6aC0-E+92-JR3j zbIPLKczJ%M7|>h0!f5ezE1bdkr`uF1yFeEnG zz>61z&%FPVD)aC2R{w#||0Vfya|M{;e8@W|q#-2KXc1$?CqmBFoiQ%Q{%FMKgoU+U zCy#|NENN134q;|a({nZhuWd}~E4OT{9Prc6q#{X zI89FgK0&%|d^{n#ZHLG=ejQK!UM%b(EOAfi-dR@5>&Qs6Ym=f!I#Na{SA{`sezNUy z*6bm8>kn~MgM=$YR4j4b_^WuiWC3cj$P^O?+61uXm)E7Jjh3ur}7fXv9UOq$5C%Apr$n1)2e8 zxjt7(0M_(qwj#JVQP7NBvCh=Jo*9||jw$J+Vl|0yYf*Xu>q2Q*R%;-CY<+IsRw>H6 ztgR8-4%6l+h9^Tcj~!N$N$Wz*L&DdFLS{M+YrDkxu}0iF$T_aOe0=6TlA+U`9b}n~ z*Ae1j$8=L@)9jn$!#mN)*0HJO{h9XOJTk zw-{DL^119|L*!Hh$Sa+ZGixB${p_!X8Y84!)79m0HQN*i?AbMyeh1vYD>*iwg=Hur<=h+ms!FiQ@OUB zVr6FST;+V12noIt(4{I^F+r`(@9;z{*S#FRLR0=uIG`cqRHO)gOZa z$|dIbc$YKz5Z}yBj=L@?sdu;Wmu9v-ca=frUzU8=^apvR2c4D8wti^Z}=^;ET z;yuil$jKjC#0_(9c9d9gp?RbzS*pxrCpE;@{$;5+UfYno%fc{{4*xkHPWZ}hy3ei5IzyI!j4XV=f)~boA zW71n)k&F8DP6&2u>b)B~oRa&ogB zXv>*?ErB#>aq%!I#!m7vp0WE>Gh(S8<-6dyvH-jBRJekyAmCxA4KIsVJe#^7NBgr) zR4b=g2P%F6#i!v2T4@=u2+RGb-k~0fRZJc^`#vFgsf@!vSr9y^DnlSs50G0eT9+7~ z*CloEsv~!niXgC%FQD{*c)ol7>RxX{Wqyww|Ku(FTUp4#^{KOB*zKE~?5UZW$lj#L zknl53KW-%sK&KcZ9u{v2IbQ3JHK#+E<8r~kIBZ|3^6+!7^V7@(Yq8Dwo7?`xrE?IQ@EC z`S=Yqbx0eWHCz7w<9ipvMcsb7h(|h1JN-i{a-x_Hf3`*UCJIAnEkOMNOBi z(r)&&NJEbeaP&leJ|2rV<2$cmPG+4{Jm`2Mr80C*vI`604wlKFj>t{Ccj7h6L*mQp z^+c56MB~u=t;9G8rF9m{<44Aff52u;&Q`w>EwjvR>CxF7wR3;^8EzyUsM_A70bMPC z_?1|5of+)om~^}MrzG{<3W+(v=JgcRl4uoyp+=H4o zLo6!>F-?X>?9@8^l(&Uczd+DpNJH;h?3n60sU6~UH+Jf`DfOH>H!X#V;@i(-m#D7c zqQD#?1jeYW@caGXmxkOyP~V|xvo$L<&K$FM)Wg&uIOZbIwFM-3aOdSC<@F)urKe&0 zBYc8vV1)icQ7wW6Gw86FcWChj*19`@Kfs|iz#&C)PVFpQl5vS+__zr-F0u2Qnb?<-0n)=j50p#b9S3~xv_qqjuZt$|#B7~`9x2G1{)+bT1T zo08FnOxyAc6Z>LzP76By2FKXnqX#$J3qSt$$Yc#=hBkox^r;H#UrlfSeWtVO4<}nA zP(tf}F`aEx(3Ak)n9~DJYU~Cx6*a0Tv1;`i<7hK!rm;BSPS37-RSmH43|Lg&3LiP9 za2e^xMnuo@^0Te*ny}orpYJmrF5R*ZGX*@nU!VUVcGEhuBLHiO0$^n6@<_rdqSjL3 zL`8{`y)@${)!YuFgE`icE(99FOyOpAXHv+WG)mA%&%5TTvaN7eVz^%q7~#fPHTF+n--NABmiNQj2e2?79wA_X@eaJ*(AzxJTp*{BMueF7{ zw6C-~ylAeJWUFw7A6x=(3vIHoA`p!VS76OS{@0uae)y$97nI@puF(+yx>)~OMJuL# z)tkBznOC>uFRO8lW5=-4h+Y+{JDmFrPDu}ko#Jh$1A^mF^0n&4rC7DIWiKTiWa@5R?qkTlU+<_-}7N)a;BwZx6Y!gM)>c?O!p+|7Y=` zq)9BLh(;O7GP!2fJgoDOZ zJ8m@ku{+|BOf;@Rx$;i|8+F1{d_9sTkuGx%U5j%w)o zbdHn-H4P`-J9q8oC^uj+#~9{ud3H?%TXx){1x0;{(H4x-AQa-PT@3S?bRapmMvj0X zG0(^pyY;d0=yL@yoaMW%#FE*38h@qruy%U-PgNVyiLnUziwa@yMw7D6J+dO2vu*xX zMss)WcvJy3RaX8$`=CsgTk)IVTqO=CC^l`t=u3Uzx%|r~Egzwysrg;|Ov{S~~Nub{v%Pv&OZy+}?U+^p|Ca&W*6A zfvpHj;-3qQew4h!snD4YbPTKb&*zt~D^%zypo|^!0(FJaX5KfXoSkCzh8T3vjnpa9 zp3!EVRI^Zdn5tLiad8IPqw*Y;0a^ZKO0}9)2@`o;CI{wmKv{|)@Y$P&S7zE}LXE$? z9w)QCM+2=Jf*UI?C^haE82{X+Tb>q}8O1PjdqIY9738mo0pN(I`j^!T_ zaTz~Y({&yt1Usxnd2l=LAl7+|Bt+VjiyudO-cd@zeP`hZh*$bI;{@k%l9Z`tAH(sf z%#ZSFRQxs0!sr;f78KliMEPlVy9)#jwfb3n$?zrPwn1FXAr}4#d;G6<{9y_BT9H2@ zrCFj?@Qdw(cj+hW<)r&nxF=bn5c+x=O#?y3Zwjv(X7XA5?xH43&B?)ocHg4(g0>Zx zzM8j=y|2f}(2TrUk$pRgNjG*>yB#a|skRH*rl3qi3cr%#GxCSDcvjq2C9jMrdQuk? zH%-2=L^cCs1%tPqq;F1A?IpbC_(~{caYjTqwT*gR4O$cnOZn_p75KIl$Um~Lq;w_z z*jJ$@+b94Qf70jteDmq3jL`}<>S3nh^ZHSqJ=H~i(#x?$;(H*j`I+1uV-Cq39quGk z&M{R@#``^C{CNZ9Bh>gKF2N%v@|3j$Y@nVL*t-f`r{CvIcELzU4;lWzum`7{X5_PlPMr)sn-X@|DFU~U8^7_hhlNT$DrlA5G z0vs*gF>8uRzk@lj6)TIbKNhYQqG7?^sz1QHPy75zRiS(*z#aBz61y64GdtCPx+=2!cH%EwyNWO9jP89_ z5?8gg+~v!#?MCU9UD^#;!=1o6+5Ws`v)w)GmwpKcZrcON-w7tiQ6l&lc<_*9ot772~RX@wMXNrP0=aQ|pTfN8cUxl%M~m;a|Aq3J|4gn=At#5H$>l25F4s($LUXTWfTY3t z+dHnXaK$;5C(w^MVM5MV)uwaPCmgvgc~p7v$J1HNkJd?JUzFeq*po3qHmaAGdz1TR z4@#f6w^gD~jN9#${2?Jqj$2CDGJreHNZ}yNLK_kv9XK*PafmVHBjpOIb2XYD$`#T; zDWFVT%1-UyONeLyB+WwM5{waBBo%_vJUjdPw0xhbxqLPCsZ80{QLCzUbCzImQDim; zp!geXa8LNpm)Ww`w}?x46bJ#;;-pV z(ii>^bxH1X{Yk=UysC=AYCZZBmEBiQwNf~7nM^Wobb_I;a3zY3-Ig9+Ht_nh-o%(J z)cJ=OLKTMAa~V8UJERU*9nf#k1k|D5+?aZ7_z_ex zh{VO%%c>R{>gwv;4l-55$aAHxJKoYmQ{!`X)2Mwxg%rRzZTM1o_#xU27Kb+NM1mX{ z6t~g>cs@0#IC5vm5$mLeryr`dY0H9B#wE7(AtY+`KJsk>Ml@v^RnM-5e*6oLt2Q#L ztA}MldKV(~%=e#GY5W`uY%Du^6(cNa8GqdJmrtvepCXJ#VTd7*y^p zmROV;_O3A&T|A0lsLYb;4AZE$ic362DIZ`6hlgVZvP&LagHS-tm zeO{`%FUc$GZQ^5kP^5^Q=d2vn`EK|jXH)!z3m{9zm$pvwhdd_?sGUWiTa2tR)p{01 z#*>ndQ~zazXnub$GRgZ0L^97DyumlSN_^djG9Io=%tMfTzon0i;T9aE!vDDgAI;rm z%xw^XjKAJ8Y!A7}?LIxp;+ugVfW3n~2s4!78nKIM>(CLv65RmUP2EcECy2H%<~F4; zM7qIuu}|1uA^E9+ZNRejT%8Tkch{%Dm;Svm1}B&^gw5!Oy?6;kp2JENBfL|RGG_(eN{eA7T*Qx$D9^s(!=T)-8ChMQtpLg3 z^9k09)0O!?aSZM#4||{|UdI*fTVb#kIGWjUdrp8L(b2v}wxYH{PCIW$sI&Iu7R3sW ztj6vwkCNo+wDBV5N&K(;_YF*3Z>X1PHJ>zN_)=f_+&KB1B>7#86+RF%9KHJUg&IC= zp0QNkSbjD!LFs(*D{RH72Kxd~aQO~iWQ2&eg@|~N5bYtK^`eR3f)m6XNXba|9TGUQ zci2Jt2!omCJg*Cug10V=jJm9`f6i+=t5f3QNoCL;Il%9BUcZT2ndz~vm1!!5uDRPm ztXUvg-sEpe97AHKZ0@GBm|;X@qDeG|k@K2{Uc*O_dz*t^Lqm}BS_0p^ibsiea_T42 zgA-~%_lC)LT}Aw<-5P^lxe5KlU&0sp(Yyv`rfaL|+c#Vu!L57HmzsAgA11$xitUB@ z%K0u&XV7kso2hQL)+QQ1Dm^xCgWy&|Pq&K~!%sM{=q*Cbd%w~TRp^+u=|vBLKYAU9 zRmgToe~?pA?q*>0#nF`{rbJIq8}tkBpenr@oO4275K%pYtFPTe_x|?G__7x|LI*6*TSi70Mp+aU?_?SrH@Rvmi(G znE{x{Jt@{L$ISJx?BRQf!ekOwBr0K=g~3Ep)#O8#_+d8L)1{C12YR=f z=VoB>l>)Y&qQ545KA|NWdnmI__1LDeuyr7+KjT0VKu4L6VW0^R3@8HN&=AT3rGc{B zQgKO!lHqzZ_x{6>*NmdXR;Lo9rslG?w0tt8r$@(P%FS8A!9{KYCe#WGXb626LdXS4Kt6{B#wPa@%$Sulb+@(QCY_Mc)$LR=1!<}I7IGaN!Xo1~}`;`ua z#`hBPNVk~g#u8GSsH?qp*w0oG{<-=r>`>c$?pzMF32iG!f||i&9BKJ$=O+^qD3>hk zF)N%HzLCj4Ods!FKB<-8nA{J?)hM@_v}m{6%k*3X*NCB9&hFQB7*D-Q2sg$zidUkx zs2f+7Gp_l>0e+*-u+OxP+z|`rAVg*a7h%b0e)tFoF;k4`GHkE};yY~At|{}PNA0(N z(PmK&d###NfHjkrHrpTJ#flObJ;iQI!ye-?q;KzHq*u10Xyn<}Yz;Bh)^MmpR=s8+ zOL7EKje^$3Rm55q@t9wuX*mxgLNXBM&k>o)E$^$Po3ZG{oo3aDqAKHu(rw!-OIy5Z zwU_o88(?-(YO>IzVn&KC=nyzk0DPqKhwZp}g}k**tNQfyYBR2Z{ly<%98dES-twu* zv_<2FEO(L`<*DiDrPkWDqYSL0E^H>pe#6T+;)OShq!AMZr6vXD3ES4SfdXR=>V%Po zjUgCn7)|SZ%wLl1el?}3o%Ge_t2Acit*OyRMgAs|OP~^b8Zvj1Y0*b!+)UsRO4&0< zn#|A|eGOy`F>`ni@jm7ra^oMLjzS)}43LswkR2JZ+xtocdCf8e@+jJ6^Bh4P&_GDB zy!Oi{(%`PzrW_*Z_{|cD8m$y*AGwPWt-;d661K=qNIb$qF~DxhO=y^GL|(5|tP%OZG8+6KXw~jI*Y|s6k?{gIUp}$}aAl;D_mSMYXHW3q_?6 z#rJ|dv6zX|j(eQ^=JhML7HRCd%K$a>L$hZ+%GBAf#bdOEjN$@@al39zUOuN=KzZw+ zpWqdqB+rKT8)7VG8okjj1*gKM3RA1~oP4wyyhfd#Q1CgXZM*eca!0mBTrTYA z(N~$9k|93X;wfe$^$>h-kfH$#;GPRat^>1wc!ai4)US_VQlGy%T?ueKKa0e8qJM8a zU2TDRdXV*Xw}4^F38NOp&bi~QuWgCzl?rq{AY%UAO*h6?-Q8N((XYh+1B&oRm7`bJB|R_i zA+6B++xf#Mq@8*g+a6uOx}u4>5_>>1kPxS~lUOun2aORvE=pw3FtG{I-UKcVeJA{r zj>wV-x5!?QCfZIJ%9scsu!XWeL4=>8e^!K_Y_~1)kbKxuePnelc`B}}fS#tbBi~HL zV%_lJ%UEw9w@#G#xyWw9RjJhJ80 z3tSBAVi9p2C)SRb5XF;HlDC72g^q;X&~k6^puzSk>~#mf*)*}0{@k%hUTtK8Hkt9F zb3C>_M@5do46DU1I|>J?c^G3A@lH|nz=$zS3fh9tGY&60aAS}(cB%q99fHApPk#js z?}lC1v#e+R_P5eb)d|x4)(zT9uyqFEFPIc%QwXOHf6KWiT8}*`Rhms1?xhxc_eVD! zE>>3k9NM41dD<)#@%inJVeRrsTup}`*AdflsZ4Q~dzU&Qv1o2lXQvz|fo~s`so^wA zTb9QPBIQO3e3(2`Kr4PF&!_tEIB5)*Am?DddKpfpjgqYE{(-#c+>Fv~|Gto$o0~P# zMrY-WooF>~6H})~;*ED+!Gpl~iE~v9vDhUJaoB%|HAM`jN_wk{D|HO$2-`KWTvtwbJ_>Tm36aE8;BrAf%R)(8zGUqPLB>JaLg_=rH#-`7Ll6})fk0;F z4^;{dvGd<1pF!A7{gw*Y0VuG^0n@h;OmQY)``vWEwS)rG@uGzIafqb3uMGq+VI{eE z!H-kx;+Dy_hoPW-1C4~sy_~i#o+8@_NABl?n4$%62|Stx%Atn$)+nmbLiJbr@anNz z)+9QN6o(ZtEy5;Fll3yS8db&}!lM%+WPs7g7TQiPOLzu+pS(bR&W@$oE<{i zS7Arj{$AWpxpJB3#C1`Sg{>DgJMdz5tU)ZIs zbpAxtH7W#3y$5r?Dtvwwu6oxpVNq|w7KMA!i&5M3pM?$mgMk1Z*IH6WUck0Z;g9nUNC;8hKtpgbWFRhuC4 z9)vtS(bd8?RJmvWW=Qbaz}wH?k)eu4PEy(ldK|cR52Ax_aI^L3mT)o;E5;lqnjyZ! zVIpL~dvD@Sl-77J9_hEJ05API|dI@)?L@5 zxFA9aU>S;VEk$M_rPkAn3V3(ws_59Ah~!tm7PnI4l_69cPTP3PqUh3l%7gjwi|0?W z>;DAehmWn8QyUhj+B8I|?zfgz3QYIAQd8p9*$!ig)F$%g7KluX$-riPr7JDnZorM1 z9{m#U2-w8ug4j=Q=(x0lGW1FSX@BhqswC+FPqEyw zG>;4l;`>09JX2>lN&Q@bMnj!1?d+-j{r3U0XVw4(JWKw${1XYCH-Gv-hAN1yteSvA zkmUg4am$JltY$NW)c9+IJOx{6`IzXM**FIWD%@8b8Eyeqkx$SthT{FP`G@ZN1s2jN zNhRV(9itNIF&5lHB?Ga^;f>bH9D@+%AZ*-FIIut{TZ^yI#%+j zQ1c$VO{*_i#}SX9H8%lIxskxRwu-03N+WpOMVDx!qk`q?3sU_2;iE`z%44_& zY1SJ#sy|xSAXf#yYs(FUs87UY$-=y|%k-lM{^8IkA%*MRNZ*`tPozQTzjhic|^O<_ljn+VEX3mPQQFj+QCoCjCUaeZ-Zjee`99&uDX zzdq2rZW|7LLHq`~gC9zG>&(9Y>rWa9?oN(0~OgJ}H z&BnRrw!y% z>)}SPkncZ;7Na4T|A&f|smI&hHZUVwC-k@a50wzy$J#U)PSgQ)_N`CSRtzq#Fv#Es zp`$c$+o;frhBNT1w^e8Y`mk)BNq%4Y5XwwzPK3TKi_wc}iVJeZF1pLCD9GsWQABAi zXzJI~_Z2Jx>-a+z;!(MT8&zBmIm<$9x3f3C-JRf6;2^yErwi4F8}w*ZR9dF@barU= zvJtBOHe9c6`I^&I%c$ukv3T#2=XC4i-X5t6z7i3+oW&455xATpI+|F_7p?6}NmFi=HYO0&%<% zf8upU3I2?+bGwO-Kf{h*l{6BnyrOjDp>kwwTKj!r*9!a4pP6-Q3hNr?9k_=u|6Mfb zH;*1^@Ms7Q8<0Mj5ifX!4hrt-3MHoU>C+%7zk=b^Z98}j=GOK|NULV-5Q+lEmXb98 z$)C@ROuf4-8AB+9Ox^jcLkGqY=7oYO;Iic}2M(9iWyrrIJ2&u}SZjj-5EjmEEM#&Y-Mo9MuZ3F0E! znH#4LRz*TwVyF&?lvGyUK$1LY7%-*~m`c!Z{R8^^Uy0uTej5M2uv6{tr=eltXf6-@ zVf9}rm|3cNe@6?~&w1C1h%@Aslu*C*Vn7(u_Y_dzCisUDlXrolg^QZ%om`TKef|WA zv0V2MZN;!|q%jZ^L%62$xm^4fINV^Xe|edlH274+k|Ke&OGAF8nL%YCM_eqgpCJM^ z03m~Ljr1VYD%j^(x$Trmsll)K8Zmo2&~(a&IO&o#nR|LUCpvAbTtI5V_7{`EP1UDUalkH^*K{Pr(S?qbeE4d=94_7)% zPAPx|h<8x}x^w=&OPcRLe8K-JX?38r(?97;St_zB=)x%Prs#hRgFedNS7@4JWk>Yeqek-3Ltr6M=MpN^Z-prBb^wcyBA z_&_?Yr(6l4MMlx^2lu8k>vn{so13}3(fK1%gg_&XAR^WI#NbWCRGc&s^t+IN8JOjI zjL@!MBituhD0QxsAP#b&UFC|>x5eI0fwEs!C{1D-e~53X%iky0W6Fwy(?RjhTO!XK zBz)gn9(wMv4TE+(c7BW@b~e3fmk_e0pHh{@hS_UU&J3r5@*Ac3Icg&@D6(m;Gl6%% zHezx;gF497ak{Tg{3|+w7O`W|B<5WWOH( z03<3W7E%$@I3d#6Rt23Dd;9~mkw)P8 zE*v$Mrq2NUg|(4pZ`JOQskH|VM+=!k5m6=&ps~r;v59LvDqfVNlr~7!XkY!}`NT)I zIZfGRkX-Ci^2|7P!VU@DE>63Mj?P-QJu#lku*vS99LoalRoN9(dqAr!_Tu=Pe#|56 z^v+YqWI)97+~4#eg&G+geNY+yH7xsomodwKR>uGAQYt+Pt6xyOGPs=$m8EF>k{g1i z5`)FIluOTZVPGjl$`XHk?sY@2{uW^r(iqiiX8$FQ`xg9J38P*?RW(VJeysk+^sqCF zAjapT^#gJX{e%;tqbaU01I+C^Lxole$o}?I@Q%wSR@weFGaxqzH^7TBKY~bC56)y; zKvZ~_@xf5oqlY=(&!-<60+UbZiNl5e;wRrwT>SeJ7nH--XVw)n>cx-EjT2Vv%5I83 zB9hNL)P%QzyxRgyaq!P;r#~n-vZ11mM1m1kv%Hz@bP2DScgTj+{%BJd6H#yL4v4JZ z8XmU-co3=78h&!~M~T^Rm2$8>my9z8B*e>C@*)||V}&Ri^eOD{wH1+KD$bbJhnl6D znHMQGUHNUFMg~f`1J6O${atjF>zOamHpOjdeJSiuF{1rfJPh`{Hp^}AF!lG628$&# zfrmNJ?FH?!`oV-J+~V2jymHLnxCV#W(_Mx)D0w1`5926a!U5_^Um%%a7{1ok2C~Mw zY9}RqNgq=g=iE0hS~idFA-t1Yfxd2-cqZSijt;}9OmJm7meZTJ?5!aFdJ3fmoQY5- ze6DV!;gz(CTfi^1!G41Nt93K$mYwv1)b-o{Bfk27w{EU~zd#%kF4DRwlA$f(c?()rX`N&_L>)C||0uoKx+|7>SG6Vt(nT zY`)0-s!%u*T7=-+Kio;eGruikkAC3pyJKUX-*+_0UA&M=r(3Nv_IbS! zX|CKzXf2%*&UIZISQ1Iy=h>e{cqq${|DLHXV~3}V)}+oi?CFJb+LXaP)z25-Etj`q z|E6Q!$1(+MaW*$W5Z8IzS!oc|PApd9-=XP~_fUUJSO$)t*E+z6n@@F}Hhe(NsXgq? z&r=Uu-fD5f1w;OMPE;b-aT3fua=cfvQ-A0YG@i1ABKzb48PzEf)Y${(5rNyu^#eN^ zh&s$K-pBeC6=PV)F9AKhom^r-VUgpF?$&$yDb#;)ahUm%P3F?)I!Tq#BgI~mhw`u_ z$v*tGBU@H|z){T%_w^4~O*9+&l~!g3xT(+QqQ|GR4&Pm4`EVTb(w=vSziO?}ivtZB z1V$$R!^z=)*V=zTa`{KC+1Z)c8k+zOt^cd5Dzz*0eL=~D4<=V2M%hpW06O}m*?rN( zN#kN;5dg3NN30hZtW37d$xu&B3^YihZb^~_PPD{sjP`nm`f{%hpN_82OGD`qu=JR< zy8Uo{swx&HItb_)IvNNHRB+^?<0{(ORQX-(0@KK0r5viTT%Wk;PBj+M{l|Cx zlP?FxcdAwvyt$!9(my4$iK1MID?%$>cl?xMX6%GmHX;kU#OPHSXtUlm=>&%J^qzBxu>Wooh9ZU_ZPdd}%$Z8VQ zoX*x`TN?3F>!ISw(u~y{`3>kz;*52=nZY)d3I#~{s$*9zbaz_i-0d_D@=pc^Tj@rOfhN-zjj^;1$_17de=BdUcSa;uS zxyJqjiT4oCcRzkh0dDO2L+%$2@5c=0pwEf=f6rlYB;G{BLC1af|Lbu}hytyx|8cFz zQqlQ}u7vVl#L!s*NlT1X2?p2F*^Q|g`~fD_8bZ;#b$Y(6kFc&%H?q@ zqB>Pdnt2=gk?fU(Qvbl3u0)lT|16Wup)2ia!o^g`XLA{n+0TlFTCq@?hTG2(0tb?$ zpm0QnjdnbhT^nK-RSrd@Ns|SJAjqVal3jL5b|v#L^?t_5Ul|qYr+e@&8t>0nC^t=A zPRAIMZM-5IcP`j6_ZpFe$T|Mz-zlm2gu3bixQ3hJq6nxMDYwp=JO zrjV_v#q`wB6n4AY{St-Vu~baPcK9@X%R)gzKp6Te{zGA%)g_lxEWQ>tO-TRtoaMk>zslR z14L{TN)l>5+=@Ad9zIb?@ixHyvk%p3?5~6C6a*aa3jyx|#mxmqE4Ci@Wm^SFxv<_Y2vh%|)&Z$Psh=3%O}kVhqqx9E2W@VO_9 zFfl*?_hw7TV0nj8M8U6CDrHS5i{(qyYH&MY^@BZ<3m4|Jce1oeNly<{feu>FBH|ER zF(0tMkZ;&>UcCtP8hHQ9yY+wY7xC|QrVMmZas0nt{#kMIvY=)byjeQkz@jarEyP5~ zKL-Z|ah>Bz0|?CfHea9NIG@DcGrkbxQSJlE;JpwJy5ARoKdMpYE zq^X-#Ns-;x6;F&%2WNI>r230R=rWMQqgz#RavjNSUl9C%{UlfBGK@2cZ*J02T0!LP z4gDS3o|8WxH7A^CiKF{a(1q+ldttZVU&5_J@MFnxy1?MKjLmuTnCp2%G1;=}LU;-~ zXT|T32yvo(Y=>I0rRNmz-Z_`CzAG7tU@Dz@Hti2^6uMVdq+fuqQ@lGR-M=D8HDvHP zc$zV)-@(eNh4Qabt@!n+p6HJdkYE$3`?(hno-H4#!QG5Y`!@ka(7%Z%{idJM;gCf$ zll&$eA~&%Rm?1gM7PV|G;yhJs+5L8?{yIt!qa?);glcC064m~Lze#@`RHLbnErLir5a z<2q;AGe^V%i*?2kr~;0nhS&zZ87KLLMyq;fuL7+F$u?*C6&o4~;K$`gIo${*RL1M$ zlVF#}<AH)5*eL{7>qZ>%AfM;Z!$rcQTG7SY~P60C3WsGO$14{ZO+ zy5(~h&EukY?iBNhJ@O%cHlTVV>ZF(^8i2?nz-NLkrY{m-}O>8Y>oy{>-$`+Dx{=^6L^KIgN}=X}o6w5wS99PjHp)MBQG zE;c%Om9toAhO}7LXxNfB_OAA@ncip5>qlDR{q9E(>^m^LiFdDmp)9o=f9PmfTllAa z*28w5{=s!S>RxcpsCbHa4tZqOW$TrzUpp-++VrNrQjMvpZpXX5#?4k?fqT1KXod}3 zMg?Z-M7ym79$CMC>uNRmmZq}vnY7(9kNlv}i~z6uJ9GKouvu66K@OIl@LC2>=bfP% zo<{^dqob4jQ&M_&m} zlrOW@f`?xpDQQ^TnvOTz!uSR>_kLI5?-1A2H=*3v~>LVv>0+(qJ)kAFG%oFa| z4e(geTYJ}a6LR0I<2+=$yoH&dUzuBq@6|hoDkVil=d^QAygF^=C9a$)bboa`KhTJ< zSn52n&wQWPQ$NoyfwFWnw-qQ&d&w6TYQ$#VM?^lLlx;60rMoCA7ZhmAtw>it|Kg)Z zoe#aorI-5e`zxgk!{|1xRuqPsMNb?~G_#)=5FS|R*>Ab|#P@lEM9sGja_@54i<;TS zRHyEfOa*KO% za^cGr z$~`*PN;G6VR09$;%15I$?;MC#4e|YUW4k(ibFXlBYRQ6%-cFx}PS%gA+BH)0^-~28 z-Ia|sw`SjW)#6L@dl|6V{F0Soc6Tm~@6Ku6oFFOnM2dx83ZZw|fS+pF6U)xCS zj`!Ofa@MouLE^XG;cX?7Bd^ZHx|F9Y4UnlA$ki6#c_|q9w*;!ASjF zjUsPs-$266jDzwSd(I~w=4ROXcKHO)qmWQ`X-k2Q-iE#YhL$|%Uxo}bCm08qR{VtBIcfS~D=AWqGSV&5>F#vM3-=mu#`VIF8xGKG=M0>TH(VK9`BTLLK>e zuk$yv+ZTEJs%^_8^a(W3Vbp6)7D$iQS>fZeXX@vh+r=Zz+l*20yRpWgD?_lHCk=B)_YVldA^#y%)nyYba-X;Sa4v$8`+%C+nZZm+4^pu z<9f~B6*_h*=W2fG{hGQe%Djmfe_92>t|uRC6IinKo4k|t8s~@=T1wCY8rMF>l|`d; z@A6cCi7j{&oN@WHv+g~oLoHMv=Ig{e0=Cr>)kLY<>hBv4n=(>J^t;Tiq#MH`C^5CW zYM;Y|S@^aw5<+5Dzor1rL;A=0It!-g@~7tniH!A0GjH~}isb}Q>)-hxOqA|-Sx2-} z`Lo;$w1_*UZ>XVjIO=eC|YLG_wA-}AH}`6UH~A#a`c{aZ-*4HIK!WqswV z4xIE2rMu5_e}Ga@;&}LD^8oig-sp!d3Z%;q!5vv6X>6ahIS`~IayfbIiMtc7r?rJ! zA2QU=)6ws|QKJ6#aKf|BS&4bdS9|ts-)}!$ntyv1T_baP&dgk0IFgj%Mk51S6w zZ$9Z%^K8yRg!8nT!<^tQKhLL>36Jzeo0&!}5aaA7!^#O1pV`AGnop|57>PtJi#%ea z=U~~J7SfzUXJbAYz0C56_JSXS{62}Q_`xT}(QFQElnkFJob0k5u(lmc7!>`quW9k= zDq+;g$Qh!oK8kg3lY-1C2SsN?&-+U*vV4v$xG_+X+f=%E|Fg8j>2u(sy8}97!D**R zC2ucSSO~ToL=095NM?Q3>@QI4@F{OLZI2y#e-XqVic850YxV=PHqqnOnQM^_3SRyr5HqpVCBT;JQiAUp#=MbDX*ybGz zQ|TFQM5w$gCWzni!agB0(rAPX9ed^`EbBOMtXQy>~;e{j*Hyv$V z@q!aC(pdBeqL&H~uk^Q>I@@d_V=2*hv%X(5%So^HQ++0VYID`- z*e3fF<&Lk2h@iqO+Bp5%9RaCHyY8OrqnWyRq^rzO?0(^Cwo_`B>GAt2vuPh9&5q^A zrK^T%>>;3Ld?PG)6&dYks~=6g^olyU{`AlpHU(E9I+GJE4E?)Ihl4pv(x=Wm->iRi zQgU_lQjh9UV;wa!Dg78zj$X?{9mR&{l;+y&N?1*sJsp$XUrW~ImQaunjnyTvJ#L~f zBsRVCjdI?I&PiU~nE*vhXwA9fd03p8>n-H5db1|GfMl(K=lW5#9~rr|ozC|M#N9HR z6Oy^Xl>N#6FiY9$okcFiJFZEsnQly|tOR4N<&p~|F5u*G&BZj>+rY@3o;jm7v9o!MxKPNOws4eAFmwz#`$ECb_qJokJ4&;@z^GSqR;|;E z)kTY4hiZ%3-U#{5nvaK5ISTXXnVa0Af5*&uWA@tC-CzBJ)M?HXT(vabssLV&T#;~Q z6Z$;-Q0NH1&>iQ+?ctR<>Q=QG6*^1xO@T+m@3jrDhD$ZKf7{&t?b?U9QPR?-u2+Uv ztA$@TiQhTys<&Ldh3aq(zqCh_u18aA$(F@fOzs@bj4qkS@slBr{;8a!VtYNC=s6fu>(1{}Tb6C5OE`^cdTp|M6qpuBAvE>GflhP180TT&h?Cpwr_Y^4b!JcRs*joW|*0% zQnVlN-2Fwaas2(>R?4sR-E~`B(oT~MZ{?$*5#7Hx6%paMo%yqjDbG}3p>$@LxuV+xw>#`|uOE;%Jm3GBeQeS^ z$oUM-yUcUEyC)8x{=}GJR%7f?aPiR1Zrc2a`kUgPcMzAaU=3KrIzF#q& zex5I77x0<=ZXJ_)4uH4)7iZs`gweMJz+b(=cKp91;U3Q7xs+b~NoBO1g zf>Het#dSFw!_6d{q8WB6?D-%za7%PRDDLnF?R#Gg3y$2>1_MEdntpKF=}>`%MYa!` zSLUdPB59*_p^4CIuui#gDn;{YIki@X(7Vxh?0&3!x@Hz5?E21l3(XK~ zhFMk`XuEBde%@6QaLp3=QS4oEro~R*d0Gv=DOdh4%~HXSHubb+%31BV3*242)p9J~ zSl@b2z5_eyid6SqS9fBR_o1@W^lyHkTR!6?sYVJS8o5ZiX| z$pzlq9oAXfVoXt2&J7Nj@Bi93TCThA8o@|u(LgxC2kw}m(;AxJWUkF{2xm_{UKx~r z`f2}4)L8uCgqyb|Y%LKUY%X;IwZwOeJ*Gc7RLzz4t!M@aa3b>?Mi$TvNd4d<)0zpF zoqNyrYr3s)5vL%!3BwO}nx8DJxL0RL(f3@e$9zXen6y~XiQ)&Ybyo}gE_{mnvWu!! zC28B+#&=UImWz&RGlRv;m(O%w-le2OICJV^p5IorRr;5Srqc5tiv#(^6v;?lo>2w2 zq3%c&w9tt**V$)5x{rBjGW>y7HX__MXTMD9EmW6Kob%k(Mkc2_-!JHUuS98o5DMhy ztn(RR|K`t7H@ef(G-!z_NQ7|4-_4WoY;JC@X%Pn-a_7Vwr>8mbge7OT!z5*&9VpA~tnl?pE%wzk^qw zXt*Cya$`N^*Uh!)MT;wA)Jo6B&!BH8=RGo3v31)tc^0>V_GAovCh}=HeYAEpf z`;V`@!WV3>IbQtcaEIunmreoAL)L#`(z-uY__GOfaO61W3lkzl^xlzB!<@^v#!whr4cu-YQTv-ehLcKl559 zm2M``zn`75lv$3_OP%+6DQC7j?NNUcrhf4|yF}Hh4yi1k3y7J3NPaM#@g_hd8*d|4NQR{T1%!qB{cMdp-F*YT zGt-`~3*{4;-p4N0PVmX;g$qmTmEKi3VQ6q|A}&(X@{RBC`IINg9*u1WoI{E~`F`5x z_@wiNmvKpj*b3={Ud^km$X$C3$oF)TA~P(JIs2^i>tCtt`Mk}%rNFp4iQojI$*f~m zwQzThg$pMt^JpdWha15Gene!`dI6%(7QJ{C&N)$d#cx|AAo!q4^&NGlKTNHJ>Cys4 z)YX?RneR6p^4CvW7_U@3OR}me{8lfGob{X}x+C?gnwJSnVnwQ}e^u1v{_Kl2QNr!t zo${W&xbj@{`&nslS+il&(>JA0o03z#=;t4wB@C};9a&1`+lDe?pH)vx-70Ezj!XV) z?sAe%K!82SaMM*jHx zT31_pFR=jl@9V&+_AC;5e;cR})+-s_Jj^S7(<4a2+yKpsP9(QT|&vT&*gJb$%i}hIw0^2@$ z&~z#)f*0CP4lX}i8F+p7)J&?p5y4H*HX@>7t8-U8G6zGa9#6Ax@46JjxLNUm*jVjO zJwK1m1KG6o!xeT53heUl8Wt5~Cu$`sxt=Rc4~44uY2-Z=3NfvlzDZ{_`^Kk|-4S*1 z&4J-(tQ9jxD^WdZyZFKax%w*f-h~s>J7&IS)17+Pa66Fi32IAc>45C$ zyTwvu_l4HkP0R9>C!?%-oOQcX#iX~>Gta;JFkC6!@i?%!i;bPvg(09amwneL7mYX- z^}ddiI?M)w_O6w=o$clJ=5@D{GYtf*`!g2nOe7KQ9<8RwP)VG~;>nu>$~*i&b~_kK z>ZBxA%w@f#>B^wYs-?8-pL>9uyfQ=_%Y2n>4_8Jd!t5?f??UdEa;Z!cKJ7+#J+Lk&UHoKY9EmLN)P9558W&7B7Pk#TwIpIwX zlVNwbMbKikl=~DCT^KFyoukc|ep{$^d{1U~<7z{R-{lvA?EN}S#zdp9tco9;jSOi} zXO60vd!U&l=iV7$IHICA&YN&UNAMugC*7)P^fwd1-JT^KD&rF-_5;HUx>5?qkGAeT zs>kRPY}a=GU`wG%Sb?!v6`TItG2bT9q8W2ae$I@E4)v%nx5iHx5*SSTbPM!FRqYgwRJxgR z#m<

    token(a) = token(1)
    ). + * + * @return true if this relation is a token relation, false otherwise. + */ + public boolean onToken() + { + return false; + } + + /** + * Checks if the operator of this relation is a CONTAINS. + * @return true if the operator of this relation is a CONTAINS, false + * otherwise. + */ + public final boolean isContains() + { + return relationType == Operator.CONTAINS; + } + + /** + * Checks if the operator of this relation is a CONTAINS_KEY. + * @return true if the operator of this relation is a CONTAINS_KEY, false + * otherwise. + */ + public final boolean isContainsKey() + { + return relationType == Operator.CONTAINS_KEY; + } + + /** + * Checks if the operator of this relation is a IN. + * @return true if the operator of this relation is a IN, false + * otherwise. + */ + public final boolean isIN() + { + return relationType == Operator.IN; + } + + /** + * Checks if the operator of this relation is a EQ. + * @return true if the operator of this relation is a EQ, false + * otherwise. + */ + public final boolean isEQ() + { + return relationType == Operator.EQ; + } + + /** + * Checks if the operator of this relation is a Slice (GT, GTE, LTE, LT). + * + * @return true if the operator of this relation is a Slice, false otherwise. + */ + public final boolean isSlice() + { + return relationType == Operator.GT + || relationType == Operator.GTE + || relationType == Operator.LTE + || relationType == Operator.LT; + } + + /** + * Converts this Relation into a Restriction. + * + * @param cfm the Column Family meta data + * @param boundNames the variables specification where to collect the bind variables + * @return the Restriction corresponding to this Relation + * @throws InvalidRequestException if this Relation is not valid + */ + public final Restriction toRestriction(CFMetaData cfm, + VariableSpecifications boundNames) throws InvalidRequestException + { + switch (relationType) + { + case EQ: return newEQRestriction(cfm, boundNames); + case LT: return newSliceRestriction(cfm, boundNames, Bound.END, false); + case LTE: return newSliceRestriction(cfm, boundNames, Bound.END, true); + case GTE: return newSliceRestriction(cfm, boundNames, Bound.START, true); + case GT: return newSliceRestriction(cfm, boundNames, Bound.START, false); + case IN: return newINRestriction(cfm, boundNames); + case CONTAINS: return newContainsRestriction(cfm, boundNames, false); + case CONTAINS_KEY: return newContainsRestriction(cfm, boundNames, true); + default: throw invalidRequest("Unsupported \"!=\" relation: %s", this); + } + } + + /** + * Creates a new EQ restriction instance. + * + * @param cfm the Column Family meta data + * @param boundNames the variables specification where to collect the bind variables + * @return a new EQ restriction instance. + * @throws InvalidRequestException if the relation cannot be converted into an EQ restriction. + */ + protected abstract Restriction newEQRestriction(CFMetaData cfm, + VariableSpecifications boundNames) throws InvalidRequestException; + + /** + * Creates a new IN restriction instance. + * + * @param cfm the Column Family meta data + * @param boundNames the variables specification where to collect the bind variables + * @return a new IN restriction instance + * @throws InvalidRequestException if the relation cannot be converted into an IN restriction. + */ + protected abstract Restriction newINRestriction(CFMetaData cfm, + VariableSpecifications boundNames) throws InvalidRequestException; + + /** + * Creates a new Slice restriction instance. + * + * @param cfm the Column Family meta data + * @param boundNames the variables specification where to collect the bind variables + * @param bound the slice bound + * @param inclusive true if the bound is included. + * @return a new slice restriction instance + * @throws InvalidRequestException if the Relation is not valid + */ + protected abstract Restriction newSliceRestriction(CFMetaData cfm, + VariableSpecifications boundNames, + Bound bound, + boolean inclusive) throws InvalidRequestException; + + /** + * Creates a new Contains restriction instance. + * + * @param cfm the Column Family meta data + * @param boundNames the variables specification where to collect the bind variables + * @param isKey true if the restriction to create is a CONTAINS KEY + * @return a new Contains Restriction instance + * @throws InvalidRequestException if the Relation is not valid + */ + protected abstract Restriction newContainsRestriction(CFMetaData cfm, + VariableSpecifications boundNames, + boolean isKey) throws InvalidRequestException; + + /** + * Converts the specified Raw into a Term. + * @param receivers the columns to which the values must be associated at + * @param raw the raw term to convert + * @param keyspace the keyspace name + * @param boundNames the variables specification where to collect the bind variables + * + * @return the Term corresponding to the specified Raw + * @throws InvalidRequestException if the Raw term is not valid + */ + protected abstract Term toTerm(List receivers, + Term.Raw raw, + String keyspace, + VariableSpecifications boundNames) + throws InvalidRequestException; + + /** + * Converts the specified Raw terms into a Terms. + * @param receivers the columns to which the values must be associated at + * @param raws the raw terms to convert + * @param keyspace the keyspace name + * @param boundNames the variables specification where to collect the bind variables + * + * @return the Terms corresponding to the specified Raw terms + * @throws InvalidRequestException if the Raw terms are not valid + */ + protected final List toTerms(List receivers, + List raws, + String keyspace, + VariableSpecifications boundNames) throws InvalidRequestException + { + if (raws == null) + return null; + + List terms = new ArrayList<>(); + for (int i = 0, m = raws.size(); i < m; i++) + terms.add(toTerm(receivers, raws.get(i), keyspace, boundNames)); + + return terms; + } + + /** + * Converts the specified entity into a column definition. + * + * @param cfm the column family meta data + * @param entity the entity to convert + * @return the column definition corresponding to the specified entity + * @throws InvalidRequestException if the entity cannot be recognized + */ + protected final ColumnDefinition toColumnDefinition(CFMetaData cfm, + ColumnIdentifier.Raw entity) throws InvalidRequestException + { + ColumnIdentifier identifier = entity.prepare(cfm); + ColumnDefinition def = cfm.getColumnDefinition(identifier); + + if (def == null) + throw new UnrecognizedEntityException(identifier, this); + + return def; + } } diff --git a/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java b/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java index d5109f508d58..7817d434ef0d 100644 --- a/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java +++ b/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java @@ -17,27 +17,38 @@ */ package org.apache.cassandra.cql3; +import java.util.Collections; import java.util.List; +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.ColumnDefinition; +import org.apache.cassandra.cql3.Term.Raw; +import org.apache.cassandra.cql3.restrictions.Restriction; +import org.apache.cassandra.cql3.restrictions.SingleColumnRestriction; +import org.apache.cassandra.cql3.statements.Bound; +import org.apache.cassandra.db.marshal.CollectionType; +import org.apache.cassandra.db.marshal.MapType; +import org.apache.cassandra.exceptions.InvalidRequestException; + +import static org.apache.cassandra.cql3.statements.RequestValidations.checkFalse; + /** * Relations encapsulate the relationship between an entity of some kind, and * a value (term). For example, > "start" or "colname1" = "somevalue". * */ -public class SingleColumnRelation extends Relation +public final class SingleColumnRelation extends Relation { private final ColumnIdentifier.Raw entity; private final Term.Raw value; private final List inValues; - public final boolean onToken; - private SingleColumnRelation(ColumnIdentifier.Raw entity, Operator type, Term.Raw value, List inValues, boolean onToken) + private SingleColumnRelation(ColumnIdentifier.Raw entity, Operator type, Term.Raw value, List inValues) { this.entity = entity; this.relationType = type; this.value = value; this.inValues = inValues; - this.onToken = onToken; } /** @@ -49,17 +60,12 @@ private SingleColumnRelation(ColumnIdentifier.Raw entity, Operator type, Term.Ra */ public SingleColumnRelation(ColumnIdentifier.Raw entity, Operator type, Term.Raw value) { - this(entity, type, value, null, false); - } - - public SingleColumnRelation(ColumnIdentifier.Raw entity, Operator type, Term.Raw value, boolean onToken) - { - this(entity, type, value, null, onToken); + this(entity, type, value, null); } public static SingleColumnRelation createInRelation(ColumnIdentifier.Raw entity, List inValues) { - return new SingleColumnRelation(entity, Operator.IN, null, inValues, false); + return new SingleColumnRelation(entity, Operator.IN, null, inValues); } public ColumnIdentifier.Raw getEntity() @@ -67,21 +73,18 @@ public ColumnIdentifier.Raw getEntity() return entity; } - public Term.Raw getValue() - { - assert relationType != Operator.IN || value == null || value instanceof AbstractMarker.INRaw; - return value; - } - - public List getInValues() + @Override + protected Term toTerm(List receivers, + Raw raw, + String keyspace, + VariableSpecifications boundNames) + throws InvalidRequestException { - assert relationType == Operator.IN; - return inValues; - } + assert receivers.size() == 1; - public boolean isMultiColumn() - { - return false; + Term term = raw.prepare(keyspace, receivers.get(0)); + term.collectMarkerSpecification(boundNames); + return term; } public SingleColumnRelation withNonStrictOperator() @@ -97,11 +100,131 @@ public SingleColumnRelation withNonStrictOperator() @Override public String toString() { - if (relationType == Operator.IN) + if (isIN()) return String.format("%s IN %s", entity, inValues); - else if (onToken) - return String.format("token(%s) %s %s", entity, relationType, value); - else - return String.format("%s %s %s", entity, relationType, value); + + return String.format("%s %s %s", entity, relationType, value); + } + + @Override + protected Restriction newEQRestriction(CFMetaData cfm, + VariableSpecifications boundNames) throws InvalidRequestException + { + ColumnDefinition columnDef = toColumnDefinition(cfm, entity); + Term term = toTerm(toReceivers(cfm, columnDef), value, cfm.ksName, boundNames); + return new SingleColumnRestriction.EQ(columnDef, term); + } + + @Override + protected Restriction newINRestriction(CFMetaData cfm, + VariableSpecifications boundNames) throws InvalidRequestException + { + ColumnDefinition columnDef = cfm.getColumnDefinition(getEntity().prepare(cfm)); + List receivers = toReceivers(cfm, columnDef); + List terms = toTerms(receivers, inValues, cfm.ksName, boundNames); + if (terms == null) + { + Term term = toTerm(receivers, value, cfm.ksName, boundNames); + return new SingleColumnRestriction.InWithMarker(columnDef, (Lists.Marker) term); + } + return new SingleColumnRestriction.InWithValues(columnDef, terms); + } + + @Override + protected Restriction newSliceRestriction(CFMetaData cfm, + VariableSpecifications boundNames, + Bound bound, + boolean inclusive) throws InvalidRequestException + { + ColumnDefinition columnDef = toColumnDefinition(cfm, entity); + Term term = toTerm(toReceivers(cfm, columnDef), value, cfm.ksName, boundNames); + return new SingleColumnRestriction.Slice(columnDef, bound, inclusive, term); + } + + @Override + protected Restriction newContainsRestriction(CFMetaData cfm, + VariableSpecifications boundNames, + boolean isKey) throws InvalidRequestException + { + ColumnDefinition columnDef = toColumnDefinition(cfm, entity); + Term term = toTerm(toReceivers(cfm, columnDef), value, cfm.ksName, boundNames); + return new SingleColumnRestriction.Contains(columnDef, term, isKey); + } + + /** + * Returns the receivers for this relation. + * + * @param cfm the Column Family meta data + * @param columnDef the column definition + * @return the receivers for the specified relation. + * @throws InvalidRequestException if the relation is invalid + */ + private List toReceivers(CFMetaData cfm, ColumnDefinition columnDef) throws InvalidRequestException + { + ColumnSpecification receiver = columnDef; + + checkFalse(columnDef.isCompactValue(), + "Predicates on the non-primary-key column (%s) of a COMPACT table are not yet supported", + columnDef.name); + + if (isIN()) + { + // For partition keys we only support IN for the last name so far + checkFalse(columnDef.isPartitionKey() && !isLastPartitionKey(cfm, columnDef), + "Partition KEY part %s cannot be restricted by IN relation (only the last part of the partition key can)", + columnDef.name); + + // We only allow IN on the row key and the clustering key so far, never on non-PK columns, and this even if + // there's an index + // Note: for backward compatibility reason, we conside a IN of 1 value the same as a EQ, so we let that + // slide. + checkFalse(!columnDef.isPrimaryKeyColumn() && !canHaveOnlyOneValue(), + "IN predicates on non-primary-key columns (%s) is not yet supported", columnDef.name); + } + else if (isSlice()) + { + // Non EQ relation is not supported without token(), even if we have a 2ndary index (since even those + // are ordered by partitioner). + // Note: In theory we could allow it for 2ndary index queries with ALLOW FILTERING, but that would + // probably require some special casing + // Note bis: This is also why we don't bother handling the 'tuple' notation of #4851 for keys. If we + // lift the limitation for 2ndary + // index with filtering, we'll need to handle it though. + checkFalse(columnDef.isPartitionKey(), "Only EQ and IN relation are supported on the partition key (unless you use the token() function)"); + } + + checkFalse(isContainsKey() && !(receiver.type instanceof MapType), "Cannot use CONTAINS KEY on non-map column %s", receiver.name); + + if (receiver.type.isCollection()) + { + // We don't support relations against entire collections (unless they're frozen), like "numbers = {1, 2, 3}" + checkFalse(receiver.type.isMultiCell() && !(isContainsKey() || isContains()), + "Collection column '%s' (%s) cannot be restricted by a '%s' relation", + receiver.name, + receiver.type.asCQL3Type(), + operator()); + + if (isContainsKey() || isContains()) + receiver = ((CollectionType) receiver.type).makeCollectionReceiver(receiver, isContainsKey()); + } + return Collections.singletonList(receiver); + } + + /** + * Checks if the specified column is the last column of the partition key. + * + * @param cfm the column family meta data + * @param columnDef the column to check + * @return true if the specified column is the last column of the partition key, false + * otherwise. + */ + private static boolean isLastPartitionKey(CFMetaData cfm, ColumnDefinition columnDef) + { + return columnDef.position() == cfm.partitionKeyColumns().size() - 1; + } + + private boolean canHaveOnlyOneValue() + { + return isEQ() || (isIN() && inValues != null && inValues.size() == 1); } } diff --git a/src/java/org/apache/cassandra/cql3/TokenRelation.java b/src/java/org/apache/cassandra/cql3/TokenRelation.java new file mode 100644 index 000000000000..d1bd265148b7 --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/TokenRelation.java @@ -0,0 +1,164 @@ +/* + * 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.cql3; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import com.google.common.base.Joiner; + +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.ColumnDefinition; +import org.apache.cassandra.cql3.Term.Raw; +import org.apache.cassandra.cql3.restrictions.Restriction; +import org.apache.cassandra.cql3.restrictions.TokenRestriction; +import org.apache.cassandra.cql3.statements.Bound; +import org.apache.cassandra.exceptions.InvalidRequestException; +import org.apache.cassandra.service.StorageService; + +import static org.apache.cassandra.cql3.statements.RequestValidations.checkContainsNoDuplicates; +import static org.apache.cassandra.cql3.statements.RequestValidations.checkContainsOnly; +import static org.apache.cassandra.cql3.statements.RequestValidations.checkTrue; +import static org.apache.cassandra.cql3.statements.RequestValidations.invalidRequest; + +/** + * A relation using the token function. + * Examples: + *
      + *
    • SELECT ... WHERE token(a) > token(1)
    • + *
    • SELECT ... WHERE token(a, b) > token(1, 3)
    • + *
    + */ +public final class TokenRelation extends Relation +{ + private final List entities; + + private final Term.Raw value; + + public TokenRelation(List entities, Operator type, Term.Raw value) + { + this.entities = entities; + this.relationType = type; + this.value = value; + } + + @Override + public boolean onToken() + { + return true; + } + + @Override + protected Restriction newEQRestriction(CFMetaData cfm, VariableSpecifications boundNames) throws InvalidRequestException + { + List columnDefs = getColumnDefinitions(cfm); + Term term = toTerm(toReceivers(cfm, columnDefs), value, cfm.ksName, boundNames); + return new TokenRestriction.EQ(columnDefs, term); + } + + @Override + protected Restriction newINRestriction(CFMetaData cfm, VariableSpecifications boundNames) throws InvalidRequestException + { + throw invalidRequest("%s cannot be used with the token function", operator()); + } + + @Override + protected Restriction newSliceRestriction(CFMetaData cfm, + VariableSpecifications boundNames, + Bound bound, + boolean inclusive) throws InvalidRequestException + { + List columnDefs = getColumnDefinitions(cfm); + Term term = toTerm(toReceivers(cfm, columnDefs), value, cfm.ksName, boundNames); + return new TokenRestriction.Slice(columnDefs, bound, inclusive, term); + } + + @Override + protected Restriction newContainsRestriction(CFMetaData cfm, VariableSpecifications boundNames, boolean isKey) throws InvalidRequestException + { + throw invalidRequest("%s cannot be used with the token function", operator()); + } + + @Override + protected Term toTerm(List receivers, + Raw raw, + String keyspace, + VariableSpecifications boundNames) throws InvalidRequestException + { + Term term = raw.prepare(keyspace, receivers.get(0)); + term.collectMarkerSpecification(boundNames); + return term; + } + + @Override + public String toString() + { + return String.format("token(%s) %s %s", Tuples.tupleToString(entities), relationType, value); + } + + /** + * Returns the definition of the columns to which apply the token restriction. + * + * @param cfm the column family metadata + * @return the definition of the columns to which apply the token restriction. + * @throws InvalidRequestException if the entity cannot be resolved + */ + private List getColumnDefinitions(CFMetaData cfm) throws InvalidRequestException + { + List columnDefs = new ArrayList<>(); + for ( ColumnIdentifier.Raw raw : entities) + { + columnDefs.add(toColumnDefinition(cfm, raw)); + } + return columnDefs; + } + + /** + * Returns the receivers for this relation. + * + * @param cfm the Column Family meta data + * @param columnDefs the column definitions + * @return the receivers for the specified relation. + * @throws InvalidRequestException if the relation is invalid + */ + private static List toReceivers(CFMetaData cfm, + List columnDefs) + throws InvalidRequestException + { + + if (!columnDefs.equals(cfm.partitionKeyColumns())) + { + checkTrue(columnDefs.containsAll(cfm.partitionKeyColumns()), + "The token() function must be applied to all partition key components or none of them"); + + checkContainsNoDuplicates(columnDefs, "The token() function contains duplicate partition key components"); + + checkContainsOnly(columnDefs, cfm.partitionKeyColumns(), "The token() function must contains only partition key components"); + + throw invalidRequest("The token function arguments must be in the partition key order: %s", + Joiner.on(", ").join(ColumnDefinition.toIdentifiers(cfm.partitionKeyColumns()))); + } + + ColumnDefinition firstColumn = columnDefs.get(0); + return Collections.singletonList(new ColumnSpecification(firstColumn.ksName, + firstColumn.cfName, + new ColumnIdentifier("partition key token", true), + StorageService.getPartitioner().getTokenValidator())); + } +} diff --git a/src/java/org/apache/cassandra/cql3/Tuples.java b/src/java/org/apache/cassandra/cql3/Tuples.java index b203546571c2..a66c534988bd 100644 --- a/src/java/org/apache/cassandra/cql3/Tuples.java +++ b/src/java/org/apache/cassandra/cql3/Tuples.java @@ -23,6 +23,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.apache.cassandra.cql3.Term.MultiColumnRaw; import org.apache.cassandra.db.marshal.*; import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.serializers.MarshalException; @@ -319,7 +320,7 @@ public AbstractMarker prepare(String keyspace, ColumnSpecification receiver) /** * A raw marker for an IN list of tuples, like "SELECT ... WHERE (a, b, c) IN ?" */ - public static class INRaw extends AbstractMarker.Raw + public static class INRaw extends AbstractMarker.Raw implements MultiColumnRaw { public INRaw(int bindIndex) { diff --git a/src/java/org/apache/cassandra/cql3/VariableSpecifications.java b/src/java/org/apache/cassandra/cql3/VariableSpecifications.java index ef786194fb03..0a55ced82f39 100644 --- a/src/java/org/apache/cassandra/cql3/VariableSpecifications.java +++ b/src/java/org/apache/cassandra/cql3/VariableSpecifications.java @@ -18,6 +18,7 @@ package org.apache.cassandra.cql3; import java.util.Arrays; +import java.util.Collections; import java.util.List; public class VariableSpecifications @@ -31,6 +32,15 @@ public VariableSpecifications(List variableNames) this.specs = new ColumnSpecification[variableNames.size()]; } + /** + * Returns an empty instance of VariableSpecifications. + * @return an empty instance of VariableSpecifications + */ + public static VariableSpecifications empty() + { + return new VariableSpecifications(Collections. emptyList()); + } + public int size() { return variableNames.size(); diff --git a/src/java/org/apache/cassandra/cql3/restrictions/AbstractPrimaryKeyRestrictions.java b/src/java/org/apache/cassandra/cql3/restrictions/AbstractPrimaryKeyRestrictions.java new file mode 100644 index 000000000000..f137a776f518 --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/restrictions/AbstractPrimaryKeyRestrictions.java @@ -0,0 +1,36 @@ +/* + * 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.cql3.restrictions; + +/** + * Base class for PrimaryKeyRestrictions. + */ +abstract class AbstractPrimaryKeyRestrictions extends AbstractRestriction implements PrimaryKeyRestrictions +{ + @Override + public final boolean isEmpty() + { + return getColumnDefs().isEmpty(); + } + + @Override + public final int size() + { + return getColumnDefs().size(); + } +} diff --git a/src/java/org/apache/cassandra/cql3/restrictions/AbstractRestriction.java b/src/java/org/apache/cassandra/cql3/restrictions/AbstractRestriction.java new file mode 100644 index 000000000000..0ae7b22311a3 --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/restrictions/AbstractRestriction.java @@ -0,0 +1,129 @@ +/* + * 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.cql3.restrictions; + +import java.nio.ByteBuffer; +import java.util.List; + +import org.apache.cassandra.cql3.ColumnSpecification; +import org.apache.cassandra.cql3.QueryOptions; +import org.apache.cassandra.cql3.Term; +import org.apache.cassandra.cql3.statements.Bound; +import org.apache.cassandra.exceptions.InvalidRequestException; + +import static org.apache.cassandra.cql3.statements.RequestValidations.checkFalse; +import static org.apache.cassandra.cql3.statements.RequestValidations.checkNotNull; + +/** + * Base class for Restrictions + */ +abstract class AbstractRestriction implements Restriction +{ + @Override + public boolean isOnToken() + { + return false; + } + + @Override + public boolean isMultiColumn() + { + return false; + } + + @Override + public boolean isSlice() + { + return false; + } + + @Override + public boolean isEQ() + { + return false; + } + + @Override + public boolean isIN() + { + return false; + } + + @Override + public boolean isContains() + { + return false; + } + + @Override + public boolean hasBound(Bound b) + { + return true; + } + + @Override + public List bounds(Bound b, QueryOptions options) throws InvalidRequestException + { + return values(options); + } + + @Override + public boolean isInclusive(Bound b) + { + return true; + } + + protected static ByteBuffer validateIndexedValue(ColumnSpecification columnSpec, + ByteBuffer value) + throws InvalidRequestException + { + checkNotNull(value, "Unsupported null value for indexed column %s", columnSpec.name); + checkFalse(value.remaining() > 0xFFFF, "Index expression values may not be larger than 64K"); + return value; + } + + /** + * Checks if the specified term is using the specified function. + * + * @param term the term to check + * @param ksName the function keyspace name + * @param functionName the function name + * @return true if the specified term is using the specified function, false otherwise. + */ + protected static final boolean usesFunction(Term term, String ksName, String functionName) + { + return term != null && term.usesFunction(ksName, functionName); + } + + /** + * Checks if one of the specified term is using the specified function. + * + * @param terms the terms to check + * @param ksName the function keyspace name + * @param functionName the function name + * @return true if onee of the specified term is using the specified function, false otherwise. + */ + protected static final boolean usesFunction(List terms, String ksName, String functionName) + { + if (terms != null) + for (Term value : terms) + if (usesFunction(value, ksName, functionName)) + return true; + return false; + } +} \ No newline at end of file diff --git a/src/java/org/apache/cassandra/cql3/restrictions/ForwardingPrimaryKeyRestrictions.java b/src/java/org/apache/cassandra/cql3/restrictions/ForwardingPrimaryKeyRestrictions.java new file mode 100644 index 000000000000..8a57292151e7 --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/restrictions/ForwardingPrimaryKeyRestrictions.java @@ -0,0 +1,159 @@ +/* + * 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.cql3.restrictions; + +import java.nio.ByteBuffer; +import java.util.Collection; +import java.util.List; + +import org.apache.cassandra.config.ColumnDefinition; +import org.apache.cassandra.cql3.QueryOptions; +import org.apache.cassandra.cql3.statements.Bound; +import org.apache.cassandra.db.IndexExpression; +import org.apache.cassandra.db.composites.Composite; +import org.apache.cassandra.db.index.SecondaryIndexManager; +import org.apache.cassandra.exceptions.InvalidRequestException; + +/** + * A PrimaryKeyRestrictions which forwards all its method calls to another + * PrimaryKeyRestrictions. Subclasses should override one or more methods to modify the behavior + * of the backing PrimaryKeyRestrictions as desired per the decorator pattern. + */ +abstract class ForwardingPrimaryKeyRestrictions implements PrimaryKeyRestrictions +{ + /** + * Returns the backing delegate instance that methods are forwarded to. + * @return the backing delegate instance that methods are forwarded to. + */ + protected abstract PrimaryKeyRestrictions getDelegate(); + + @Override + public boolean usesFunction(String ksName, String functionName) + { + return getDelegate().usesFunction(ksName, functionName); + } + + @Override + public Collection getColumnDefs() + { + return getDelegate().getColumnDefs(); + } + + @Override + public PrimaryKeyRestrictions mergeWith(Restriction restriction) throws InvalidRequestException + { + return getDelegate().mergeWith(restriction); + } + + @Override + public boolean hasSupportingIndex(SecondaryIndexManager secondaryIndexManager) + { + return getDelegate().hasSupportingIndex(secondaryIndexManager); + } + + @Override + public List values(QueryOptions options) throws InvalidRequestException + { + return getDelegate().values(options); + } + + @Override + public List valuesAsComposites(QueryOptions options) throws InvalidRequestException + { + return getDelegate().valuesAsComposites(options); + } + + @Override + public List bounds(Bound bound, QueryOptions options) throws InvalidRequestException + { + return getDelegate().bounds(bound, options); + } + + @Override + public List boundsAsComposites(Bound bound, QueryOptions options) throws InvalidRequestException + { + return getDelegate().boundsAsComposites(bound, options); + } + + @Override + public boolean isInclusive(Bound bound) + { + return getDelegate().isInclusive(bound.reverse()); + } + + @Override + public boolean isEmpty() + { + return getDelegate().isEmpty(); + } + + @Override + public int size() + { + return getDelegate().size(); + } + + @Override + public boolean isOnToken() + { + return getDelegate().isOnToken(); + } + + @Override + public boolean isSlice() + { + return getDelegate().isSlice(); + } + + @Override + public boolean isEQ() + { + return getDelegate().isEQ(); + } + + @Override + public boolean isIN() + { + return getDelegate().isIN(); + } + + @Override + public boolean isContains() + { + return getDelegate().isContains(); + } + + @Override + public boolean isMultiColumn() + { + return getDelegate().isMultiColumn(); + } + + @Override + public boolean hasBound(Bound b) + { + return getDelegate().hasBound(b); + } + + @Override + public void addIndexExpressionTo(List expressions, + QueryOptions options) throws InvalidRequestException + { + getDelegate().addIndexExpressionTo(expressions, options); + } +} diff --git a/src/java/org/apache/cassandra/cql3/restrictions/MultiColumnRestriction.java b/src/java/org/apache/cassandra/cql3/restrictions/MultiColumnRestriction.java new file mode 100644 index 000000000000..e3b3c4cfda6c --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/restrictions/MultiColumnRestriction.java @@ -0,0 +1,520 @@ +/* + * 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.cql3.restrictions; + +import java.nio.ByteBuffer; +import java.util.*; + +import org.apache.cassandra.config.ColumnDefinition; +import org.apache.cassandra.cql3.AbstractMarker; +import org.apache.cassandra.cql3.Operator; +import org.apache.cassandra.cql3.QueryOptions; +import org.apache.cassandra.cql3.Term; +import org.apache.cassandra.cql3.Tuples; +import org.apache.cassandra.cql3.statements.Bound; +import org.apache.cassandra.db.IndexExpression; +import org.apache.cassandra.db.composites.CBuilder; +import org.apache.cassandra.db.composites.CType; +import org.apache.cassandra.db.composites.Composite; +import org.apache.cassandra.db.composites.Composites; +import org.apache.cassandra.db.index.SecondaryIndex; +import org.apache.cassandra.db.index.SecondaryIndexManager; +import org.apache.cassandra.exceptions.InvalidRequestException; + +import static org.apache.cassandra.cql3.statements.RequestValidations.checkFalse; +import static org.apache.cassandra.cql3.statements.RequestValidations.checkNotNull; +import static org.apache.cassandra.cql3.statements.RequestValidations.checkTrue; +import static org.apache.cassandra.cql3.statements.RequestValidations.invalidRequest; + +public abstract class MultiColumnRestriction extends AbstractPrimaryKeyRestrictions +{ + protected final CType ctype; + + /** + * The columns to which the restriction apply. + */ + protected final List columnDefs; + + public MultiColumnRestriction(CType ctype, List columnDefs) + { + this.ctype = ctype; + this.columnDefs = columnDefs; + } + + @Override + public boolean isMultiColumn() + { + return true; + } + + @Override + public Collection getColumnDefs() + { + return columnDefs; + } + + @Override + public List values(QueryOptions options) throws InvalidRequestException + { + return Composites.toByteBuffers(valuesAsComposites(options)); + } + + @Override + public final PrimaryKeyRestrictions mergeWith(Restriction otherRestriction) throws InvalidRequestException + { + checkTrue(otherRestriction.isMultiColumn(), + "Mixing single column relations and multi column relations on clustering columns is not allowed"); + return doMergeWith((PrimaryKeyRestrictions) otherRestriction); + } + + protected abstract PrimaryKeyRestrictions doMergeWith(PrimaryKeyRestrictions otherRestriction) throws InvalidRequestException; + + /** + * Returns the names of the columns that are specified within this Restrictions and the other one + * as a comma separated String. + * + * @param otherRestrictions the other restrictions + * @return the names of the columns that are specified within this Restrictions and the other one + * as a comma separated String. + */ + protected final String getColumnsInCommons(Restrictions otherRestrictions) + { + Set commons = new HashSet<>(getColumnDefs()); + commons.retainAll(otherRestrictions.getColumnDefs()); + StringBuilder builder = new StringBuilder(); + for (ColumnDefinition columnDefinition : commons) + { + if (builder.length() != 0) + builder.append(" ,"); + builder.append(columnDefinition.name); + } + return builder.toString(); + } + + @Override + public final boolean hasSupportingIndex(SecondaryIndexManager indexManager) + { + for (ColumnDefinition columnDef : columnDefs) + { + SecondaryIndex index = indexManager.getIndexForColumn(columnDef.name.bytes); + if (index != null && isSupportedBy(index)) + return true; + } + return false; + } + + /** + * Check if this type of restriction is supported for the specified column by the specified index. + * @param index the Secondary index + * + * @return true this type of restriction is supported by the specified index, + * false otherwise. + */ + protected abstract boolean isSupportedBy(SecondaryIndex index); + + public static class EQ extends MultiColumnRestriction + { + protected final Term value; + + public EQ(CType ctype, List columnDefs, Term value) + { + super(ctype, columnDefs); + this.value = value; + } + + @Override + public boolean usesFunction(String ksName, String functionName) + { + return usesFunction(value, ksName, functionName); + } + + @Override + public String toString() + { + return String.format("EQ(%s)", value); + } + + @Override + public PrimaryKeyRestrictions doMergeWith(PrimaryKeyRestrictions otherRestriction) throws InvalidRequestException + { + throw invalidRequest("%s cannot be restricted by more than one relation if it includes an Equal", + getColumnsInCommons(otherRestriction)); + } + + @Override + public List valuesAsComposites(QueryOptions options) throws InvalidRequestException + { + return Collections.singletonList(compositeValue(options)); + } + + @Override + public List boundsAsComposites(Bound bound, QueryOptions options) throws InvalidRequestException + { + Composite prefix = compositeValue(options); + return Collections.singletonList(ctype.size() > prefix.size() && bound.isEnd() + ? prefix.end() + : prefix); + } + + @Override + protected boolean isSupportedBy(SecondaryIndex index) + { + return index.supportsOperator(Operator.EQ); + } + + private Composite compositeValue(QueryOptions options) throws InvalidRequestException + { + CBuilder builder = ctype.builder(); + Tuples.Value t = ((Tuples.Value) value.bind(options)); + List values = t.getElements(); + for (int i = 0; i < values.size(); i++) + { + ByteBuffer component = checkNotNull(values.get(i), + "Invalid null value in condition for column %s", + columnDefs.get(i).name); + builder.add(component); + } + + return builder.build(); + } + + @Override + public final void addIndexExpressionTo(List expressions, + QueryOptions options) throws InvalidRequestException + { + Tuples.Value t = ((Tuples.Value) value.bind(options)); + List values = t.getElements(); + for (int i = 0; i < values.size(); i++) + { + ColumnDefinition columnDef = columnDefs.get(i); + ByteBuffer component = validateIndexedValue(columnDef, values.get(i)); + expressions.add(new IndexExpression(columnDef.name.bytes, Operator.EQ, component)); + } + } + } + + public abstract static class IN extends MultiColumnRestriction + { + @Override + public List valuesAsComposites(QueryOptions options) throws InvalidRequestException + { + CBuilder builder = ctype.builder(); + List> splitInValues = splitValues(options); + // The IN query might not have listed the values in comparator order, so we need to re-sort + // the bounds lists to make sure the slices works correctly (also, to avoid duplicates). + TreeSet inValues = new TreeSet<>(ctype); + for (List components : splitInValues) + { + for (int i = 0; i < components.size(); i++) + checkNotNull(components.get(i), "Invalid null value in condition for column " + columnDefs.get(i).name); + + inValues.add(builder.buildWith(components)); + } + return new ArrayList<>(inValues); + } + + @Override + public List boundsAsComposites(Bound bound, QueryOptions options) throws InvalidRequestException + { + CBuilder builder = ctype.builder(); + List> splitInValues = splitValues(options); + // The IN query might not have listed the values in comparator order, so we need to re-sort + // the bounds lists to make sure the slices works correctly (also, to avoid duplicates). + TreeSet inValues = new TreeSet<>(ctype); + for (List components : splitInValues) + { + for (int i = 0; i < components.size(); i++) + checkNotNull(components.get(i), "Invalid null value in condition for column %s", columnDefs.get(i).name); + + Composite prefix = builder.buildWith(components); + inValues.add(bound.isEnd() && builder.remainingCount() - components.size() > 0 + ? prefix.end() + : prefix); + } + return new ArrayList<>(inValues); + } + + @Override + public void addIndexExpressionTo(List expressions, + QueryOptions options) throws InvalidRequestException + { + List> splitInValues = splitValues(options); + checkTrue(splitInValues.size() == 1, "IN restrictions are not supported on indexed columns"); + + List values = splitInValues.get(0); + checkTrue(values.size() == 1, "IN restrictions are not supported on indexed columns"); + + ColumnDefinition columnDef = columnDefs.get(0); + ByteBuffer component = validateIndexedValue(columnDef, values.get(0)); + expressions.add(new IndexExpression(columnDef.name.bytes, Operator.EQ, component)); + } + + public IN(CType ctype, List columnDefs) + { + super(ctype, columnDefs); + } + + @Override + public boolean isIN() + { + return true; + } + + @Override + public PrimaryKeyRestrictions doMergeWith(PrimaryKeyRestrictions otherRestrictions) throws InvalidRequestException + { + throw invalidRequest("%s cannot be restricted by more than one relation if it includes a IN", + getColumnsInCommons(otherRestrictions)); + } + + @Override + protected boolean isSupportedBy(SecondaryIndex index) + { + return index.supportsOperator(Operator.IN); + } + + protected abstract List> splitValues(QueryOptions options) throws InvalidRequestException; + } + + /** + * An IN restriction that has a set of terms for in values. + * For example: "SELECT ... WHERE (a, b, c) IN ((1, 2, 3), (4, 5, 6))" or "WHERE (a, b, c) IN (?, ?)" + */ + public static class InWithValues extends MultiColumnRestriction.IN + { + protected final List values; + + public InWithValues(CType ctype, List columnDefs, List values) + { + super(ctype, columnDefs); + this.values = values; + } + + @Override + public boolean usesFunction(String ksName, String functionName) + { + return usesFunction(values, ksName, functionName); + } + + @Override + public String toString() + { + return String.format("IN(%s)", values); + } + + @Override + protected List> splitValues(QueryOptions options) throws InvalidRequestException + { + List> buffers = new ArrayList<>(values.size()); + for (Term value : values) + { + Term.MultiItemTerminal term = (Term.MultiItemTerminal) value.bind(options); + buffers.add(term.getElements()); + } + return buffers; + } + } + + /** + * An IN restriction that uses a single marker for a set of IN values that are tuples. + * For example: "SELECT ... WHERE (a, b, c) IN ?" + */ + public static class InWithMarker extends MultiColumnRestriction.IN + { + protected final AbstractMarker marker; + + public InWithMarker(CType ctype, List columnDefs, AbstractMarker marker) + { + super(ctype, columnDefs); + this.marker = marker; + } + + @Override + public boolean usesFunction(String ksName, String functionName) + { + return false; + } + + @Override + public String toString() + { + return "IN ?"; + } + + @Override + protected List> splitValues(QueryOptions options) throws InvalidRequestException + { + Tuples.InMarker inMarker = (Tuples.InMarker) marker; + Tuples.InValue inValue = inMarker.bind(options); + checkNotNull(inValue, "Invalid null value for IN restriction"); + return inValue.getSplitValues(); + } + } + + public static class Slice extends MultiColumnRestriction + { + private final TermSlice slice; + + public Slice(CType ctype, List columnDefs, Bound bound, boolean inclusive, Term term) + { + this(ctype, columnDefs, TermSlice.newInstance(bound, inclusive, term)); + } + + private Slice(CType ctype, List columnDefs, TermSlice slice) + { + super(ctype, columnDefs); + this.slice = slice; + } + + @Override + public boolean isSlice() + { + return true; + } + + @Override + public List valuesAsComposites(QueryOptions options) throws InvalidRequestException + { + throw new UnsupportedOperationException(); + } + + @Override + public List bounds(Bound b, QueryOptions options) throws InvalidRequestException + { + return Composites.toByteBuffers(boundsAsComposites(b, options)); + } + + @Override + public List boundsAsComposites(Bound bound, QueryOptions options) throws InvalidRequestException + { + CBuilder builder = ctype.builder(); + Iterator iter = columnDefs.iterator(); + ColumnDefinition firstName = iter.next(); + // A hack to preserve pre-6875 behavior for tuple-notation slices where the comparator mixes ASCENDING + // and DESCENDING orders. This stores the bound for the first component; we will re-use it for all following + // components, even if they don't match the first component's reversal/non-reversal. Note that this does *not* + // guarantee correct query results, it just preserves the previous behavior. + Bound firstComponentBound = !firstName.isReversedType() ? bound : bound.reverse(); + + if (!hasBound(firstComponentBound)) + { + Composite prefix = builder.build(); + return Collections.singletonList(builder.remainingCount() > 0 && bound.isEnd() + ? prefix.end() + : prefix); + } + + List vals = componentBounds(firstComponentBound, options); + + ByteBuffer v = checkNotNull(vals.get(firstName.position()), "Invalid null value in condition for column %s", firstName.name); + builder.add(v); + + while (iter.hasNext()) + { + ColumnDefinition def = iter.next(); + if (def.position() >= vals.size()) + break; + + v = checkNotNull(vals.get(def.position()), "Invalid null value in condition for column %s", def.name); + builder.add(v); + } + Composite.EOC eoc = eocFor(this, bound, firstComponentBound); + return Collections.singletonList(builder.build().withEOC(eoc)); + } + + @Override + public void addIndexExpressionTo(List expressions, + QueryOptions options) throws InvalidRequestException + { + throw invalidRequest("Slice restrictions are not supported on indexed columns which are part of a multi column relation"); + } + + @Override + protected boolean isSupportedBy(SecondaryIndex index) + { + return slice.isSupportedBy(index); + } + + private static Composite.EOC eocFor(Restriction r, Bound eocBound, Bound inclusiveBound) + { + if (eocBound.isStart()) + return r.isInclusive(inclusiveBound) ? Composite.EOC.NONE : Composite.EOC.END; + + return r.isInclusive(inclusiveBound) ? Composite.EOC.END : Composite.EOC.START; + } + + @Override + public boolean hasBound(Bound b) + { + return slice.hasBound(b); + } + + @Override + public boolean usesFunction(String ksName, String functionName) + { + return (slice.hasBound(Bound.START) && usesFunction(slice.bound(Bound.START), ksName, functionName)) + || (slice.hasBound(Bound.END) && usesFunction(slice.bound(Bound.END), ksName, functionName)); + } + + @Override + public boolean isInclusive(Bound b) + { + return slice.isInclusive(b); + } + + @Override + public PrimaryKeyRestrictions doMergeWith(PrimaryKeyRestrictions otherRestriction) throws InvalidRequestException + { + checkTrue(otherRestriction.isSlice(), + "Column \"%s\" cannot be restricted by both an equality and an inequality relation", + getColumnsInCommons(otherRestriction)); + + Slice otherSlice = (Slice) otherRestriction; + + checkFalse(hasBound(Bound.START) && otherSlice.hasBound(Bound.START), + "More than one restriction was found for the start bound on %s", + getColumnsInCommons(otherRestriction)); + checkFalse(hasBound(Bound.END) && otherSlice.hasBound(Bound.END), + "More than one restriction was found for the end bound on %s", + getColumnsInCommons(otherRestriction)); + + List newColumnDefs = size() >= otherSlice.size() ? columnDefs : otherSlice.columnDefs; + return new Slice(ctype, newColumnDefs, slice.merge(otherSlice.slice)); + } + + @Override + public String toString() + { + return "SLICE" + slice; + } + + /** + * Similar to bounds(), but returns one ByteBuffer per-component in the bound instead of a single + * ByteBuffer to represent the entire bound. + * @param b the bound type + * @param options the query options + * @return one ByteBuffer per-component in the bound + * @throws InvalidRequestException if the components cannot be retrieved + */ + private List componentBounds(Bound b, QueryOptions options) throws InvalidRequestException + { + Tuples.Value value = (Tuples.Value) slice.bound(b).bind(options); + return value.getElements(); + } + } +} diff --git a/src/java/org/apache/cassandra/cql3/restrictions/PrimaryKeyRestrictions.java b/src/java/org/apache/cassandra/cql3/restrictions/PrimaryKeyRestrictions.java new file mode 100644 index 000000000000..5f977b750d98 --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/restrictions/PrimaryKeyRestrictions.java @@ -0,0 +1,40 @@ +/* + * 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.cql3.restrictions; + +import java.util.List; + +import org.apache.cassandra.cql3.QueryOptions; +import org.apache.cassandra.cql3.statements.Bound; +import org.apache.cassandra.db.composites.Composite; +import org.apache.cassandra.exceptions.InvalidRequestException; + +/** + * A set of restrictions on a primary key part (partition key or clustering key). + * + */ +interface PrimaryKeyRestrictions extends Restriction, Restrictions +{ + + @Override + public PrimaryKeyRestrictions mergeWith(Restriction restriction) throws InvalidRequestException; + + public List valuesAsComposites(QueryOptions options) throws InvalidRequestException; + + public List boundsAsComposites(Bound bound, QueryOptions options) throws InvalidRequestException; +} diff --git a/src/java/org/apache/cassandra/cql3/restrictions/Restriction.java b/src/java/org/apache/cassandra/cql3/restrictions/Restriction.java new file mode 100644 index 000000000000..d0ed1932e9b0 --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/restrictions/Restriction.java @@ -0,0 +1,97 @@ +/* + * 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.cql3.restrictions; + +import java.nio.ByteBuffer; +import java.util.List; + +import org.apache.cassandra.cql3.QueryOptions; +import org.apache.cassandra.cql3.statements.Bound; +import org.apache.cassandra.db.IndexExpression; +import org.apache.cassandra.db.index.SecondaryIndexManager; +import org.apache.cassandra.exceptions.InvalidRequestException; + +/** + * A restriction/clause on a column. + * The goal of this class being to group all conditions for a column in a SELECT. + */ +public interface Restriction +{ + public boolean isOnToken(); + public boolean isSlice(); + public boolean isEQ(); + public boolean isIN(); + public boolean isContains(); + public boolean isMultiColumn(); + + public List values(QueryOptions options) throws InvalidRequestException; + + /** + * Returns true if one of the restrictions use the specified function. + * + * @param ksName the keyspace name + * @param functionName the function name + * @return true if one of the restrictions use the specified function, false otherwise. + */ + public boolean usesFunction(String ksName, String functionName); + + /** + * Checks if the specified bound is set or not. + * @param b the bound type + * @return true if the specified bound is set, false otherwise + */ + public boolean hasBound(Bound b); + + public List bounds(Bound b, QueryOptions options) throws InvalidRequestException; + + /** + * Checks if the specified bound is inclusive or not. + * @param b the bound type + * @return true if the specified bound is inclusive, false otherwise + */ + public boolean isInclusive(Bound b); + + /** + * Merges this restriction with the specified one. + * + * @param otherRestriction the restriction to merge into this one + * @return the restriction resulting of the merge + * @throws InvalidRequestException if the restrictions cannot be merged + */ + public Restriction mergeWith(Restriction otherRestriction) throws InvalidRequestException; + + /** + * Check if the restriction is on indexed columns. + * + * @param indexManager the index manager + * @return true if the restriction is on indexed columns, false + */ + public boolean hasSupportingIndex(SecondaryIndexManager indexManager); + + /** + * Adds to the specified list the IndexExpressions corresponding to this Restriction. + * + * @param expressions the list to add the IndexExpressions to + * @param options the query options + * @throws InvalidRequestException if this Restriction cannot be converted into + * IndexExpressions + */ + public void addIndexExpressionTo(List expressions, + QueryOptions options) + throws InvalidRequestException; +} diff --git a/src/java/org/apache/cassandra/cql3/restrictions/Restrictions.java b/src/java/org/apache/cassandra/cql3/restrictions/Restrictions.java new file mode 100644 index 000000000000..cf2555ee3040 --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/restrictions/Restrictions.java @@ -0,0 +1,82 @@ +/* + * 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.cql3.restrictions; + +import java.util.Collection; +import java.util.List; + +import org.apache.cassandra.config.ColumnDefinition; +import org.apache.cassandra.cql3.QueryOptions; +import org.apache.cassandra.db.IndexExpression; +import org.apache.cassandra.db.index.SecondaryIndexManager; +import org.apache.cassandra.exceptions.InvalidRequestException; + +/** + * Sets of restrictions + */ +interface Restrictions +{ + /** + * Returns the column definitions in position order. + * @return the column definitions in position order. + */ + public Collection getColumnDefs(); + + /** + * Returns true if one of the restrictions use the specified function. + * + * @param ksName the keyspace name + * @param functionName the function name + * @return true if one of the restrictions use the specified function, false otherwise. + */ + public boolean usesFunction(String ksName, String functionName); + + /** + * Check if the restriction is on indexed columns. + * + * @param indexManager the index manager + * @return true if the restriction is on indexed columns, false + */ + public boolean hasSupportingIndex(SecondaryIndexManager indexManager); + + /** + * Adds to the specified list the IndexExpressions corresponding to this Restriction. + * + * @param expressions the list to add the IndexExpressions to + * @param options the query options + * @throws InvalidRequestException if this Restriction cannot be converted into + * IndexExpressions + */ + public void addIndexExpressionTo(List expressions, + QueryOptions options) + throws InvalidRequestException; + + /** + * Checks if this SingleColumnPrimaryKeyRestrictions is empty or not. + * + * @return true if this SingleColumnPrimaryKeyRestrictions is empty, false otherwise. + */ + boolean isEmpty(); + + /** + * Returns the number of columns that have a restriction. + * + * @return the number of columns that have a restriction. + */ + public int size(); +} \ No newline at end of file diff --git a/src/java/org/apache/cassandra/cql3/restrictions/ReversedPrimaryKeyRestrictions.java b/src/java/org/apache/cassandra/cql3/restrictions/ReversedPrimaryKeyRestrictions.java new file mode 100644 index 000000000000..9b3316117dd0 --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/restrictions/ReversedPrimaryKeyRestrictions.java @@ -0,0 +1,77 @@ +/* + * 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.cql3.restrictions; + +import java.nio.ByteBuffer; +import java.util.Collections; +import java.util.List; + +import org.apache.cassandra.cql3.QueryOptions; +import org.apache.cassandra.cql3.statements.Bound; +import org.apache.cassandra.db.composites.Composite; +import org.apache.cassandra.exceptions.InvalidRequestException; + +/** + * PrimaryKeyRestrictions decorator that reverse the slices. + */ +final class ReversedPrimaryKeyRestrictions extends ForwardingPrimaryKeyRestrictions +{ + /** + * The decorated restrictions. + */ + private PrimaryKeyRestrictions restrictions; + + public ReversedPrimaryKeyRestrictions(PrimaryKeyRestrictions restrictions) + { + this.restrictions = restrictions; + } + + @Override + public PrimaryKeyRestrictions mergeWith(Restriction restriction) throws InvalidRequestException + { + return new ReversedPrimaryKeyRestrictions(this.restrictions.mergeWith(restriction)); + } + + @Override + public List bounds(Bound bound, QueryOptions options) throws InvalidRequestException + { + List buffers = restrictions.bounds(bound.reverse(), options); + Collections.reverse(buffers); + return buffers; + } + + @Override + public List boundsAsComposites(Bound bound, QueryOptions options) throws InvalidRequestException + { + List composites = restrictions.boundsAsComposites(bound.reverse(), options); + Collections.reverse(composites); + return composites; + } + + @Override + public boolean isInclusive(Bound bound) + { + return this.restrictions.isInclusive(bound.reverse()); + } + + @Override + protected PrimaryKeyRestrictions getDelegate() + { + return this.restrictions; + } +} diff --git a/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnPrimaryKeyRestrictions.java b/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnPrimaryKeyRestrictions.java new file mode 100644 index 000000000000..3858cdc43324 --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnPrimaryKeyRestrictions.java @@ -0,0 +1,307 @@ +/* + * 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.cql3.restrictions; + +import java.nio.ByteBuffer; +import java.util.*; + +import org.apache.cassandra.config.ColumnDefinition; +import org.apache.cassandra.cql3.QueryOptions; +import org.apache.cassandra.cql3.statements.Bound; +import org.apache.cassandra.db.IndexExpression; +import org.apache.cassandra.db.composites.CBuilder; +import org.apache.cassandra.db.composites.CType; +import org.apache.cassandra.db.composites.Composite; +import org.apache.cassandra.db.composites.Composite.EOC; +import org.apache.cassandra.db.composites.Composites; +import org.apache.cassandra.db.composites.CompositesBuilder; +import org.apache.cassandra.db.index.SecondaryIndexManager; +import org.apache.cassandra.exceptions.InvalidRequestException; + +import static org.apache.cassandra.cql3.statements.RequestValidations.checkFalse; +import static org.apache.cassandra.cql3.statements.RequestValidations.checkNotNull; +import static org.apache.cassandra.cql3.statements.RequestValidations.checkTrue; + +/** + * A set of single column restrictions on a primary key part (partition key or clustering key). + */ +final class SingleColumnPrimaryKeyRestrictions extends AbstractPrimaryKeyRestrictions +{ + /** + * The composite type. + */ + private final CType ctype; + + /** + * The restrictions. + */ + private final SingleColumnRestrictions restrictions; + + /** + * true if the restrictions are corresponding to an EQ, false otherwise. + */ + private boolean eq; + + /** + * true if the restrictions are corresponding to an IN, false otherwise. + */ + private boolean in; + + /** + * true if the restrictions are corresponding to a Slice, false otherwise. + */ + private boolean slice; + + /** + * true if the restrictions are corresponding to a Contains, false otherwise. + */ + private boolean contains; + + public SingleColumnPrimaryKeyRestrictions(CType ctype) + { + this.ctype = ctype; + this.restrictions = new SingleColumnRestrictions(); + this.eq = true; + } + + private SingleColumnPrimaryKeyRestrictions(SingleColumnPrimaryKeyRestrictions primaryKeyRestrictions, + SingleColumnRestriction restriction) throws InvalidRequestException + { + this.restrictions = primaryKeyRestrictions.restrictions.addRestriction(restriction); + this.ctype = primaryKeyRestrictions.ctype; + + if (!primaryKeyRestrictions.isEmpty()) + { + ColumnDefinition lastColumn = primaryKeyRestrictions.restrictions.lastColumn(); + ColumnDefinition newColumn = restriction.getColumnDef(); + + checkFalse(primaryKeyRestrictions.isSlice() && newColumn.position() > lastColumn.position(), + "Clustering column \"%s\" cannot be restricted (preceding column \"%s\" is restricted by a non-EQ relation)", + newColumn.name, + lastColumn.name); + + if (newColumn.position() < lastColumn.position()) + checkFalse(restriction.isSlice(), + "PRIMARY KEY column \"%s\" cannot be restricted (preceding column \"%s\" is restricted by a non-EQ relation)", + restrictions.nextColumn(newColumn).name, + newColumn.name); + } + + if (restriction.isSlice() || primaryKeyRestrictions.isSlice()) + this.slice = true; + else if (restriction.isContains() || primaryKeyRestrictions.isContains()) + this.contains = true; + else if (restriction.isIN()) + this.in = true; + else + this.eq = true; + } + + @Override + public boolean isSlice() + { + return slice; + } + + @Override + public boolean isEQ() + { + return eq; + } + + @Override + public boolean isIN() + { + return in; + } + + @Override + public boolean isOnToken() + { + return false; + } + + @Override + public boolean isContains() + { + return contains; + } + + @Override + public boolean isMultiColumn() + { + return false; + } + + @Override + public boolean usesFunction(String ksName, String functionName) + { + return restrictions.usesFunction(ksName, functionName); + } + + @Override + public PrimaryKeyRestrictions mergeWith(Restriction restriction) throws InvalidRequestException + { + if (restriction.isMultiColumn()) + { + checkTrue(isEmpty(), + "Mixing single column relations and multi column relations on clustering columns is not allowed"); + return (PrimaryKeyRestrictions) restriction; + } + + if (restriction.isOnToken()) + { + checkTrue(isEmpty(), "Columns \"%s\" cannot be restricted by both a normal relation and a token relation", + ((TokenRestriction) restriction).getColumnNamesAsString()); + return (PrimaryKeyRestrictions) restriction; + } + + return new SingleColumnPrimaryKeyRestrictions(this, (SingleColumnRestriction) restriction); + } + + @Override + public List valuesAsComposites(QueryOptions options) throws InvalidRequestException + { + CompositesBuilder builder = new CompositesBuilder(ctype.builder(), ctype); + for (ColumnDefinition def : restrictions.getColumnDefs()) + { + Restriction r = restrictions.getRestriction(def); + assert !r.isSlice(); + + List values = r.values(options); + + if (values.isEmpty()) + return null; + + builder.addEachElementToAll(values); + checkFalse(builder.containsNull(), "Invalid null value for column %s", def.name); + } + + return builder.build(); + } + + @Override + public List boundsAsComposites(Bound bound, QueryOptions options) throws InvalidRequestException + { + CBuilder builder = ctype.builder(); + List defs = new ArrayList<>(restrictions.getColumnDefs()); + + CompositesBuilder compositeBuilder = new CompositesBuilder(builder, ctype); + // The end-of-component of composite doesn't depend on whether the + // component type is reversed or not (i.e. the ReversedType is applied + // to the component comparator but not to the end-of-component itself), + // it only depends on whether the slice is reversed + int keyPosition = 0; + for (ColumnDefinition def : defs) + { + // In a restriction, we always have Bound.START < Bound.END for the "base" comparator. + // So if we're doing a reverse slice, we must inverse the bounds when giving them as start and end of the slice filter. + // But if the actual comparator itself is reversed, we must inversed the bounds too. + Bound b = !def.isReversedType() ? bound : bound.reverse(); + Restriction r = restrictions.getRestriction(def); + if (keyPosition != def.position() || r.isContains()) + { + EOC eoc = !compositeBuilder.isEmpty() && bound.isEnd() ? EOC.END : EOC.NONE; + return compositeBuilder.buildWithEOC(eoc); + } + if (r.isSlice()) + { + if (!r.hasBound(b)) + { + // There wasn't any non EQ relation on that key, we select all records having the preceding component as prefix. + // For composites, if there was preceding component and we're computing the end, we must change the last component + // End-Of-Component, otherwise we would be selecting only one record. + EOC eoc = !compositeBuilder.isEmpty() && bound.isEnd() ? EOC.END : EOC.NONE; + return compositeBuilder.buildWithEOC(eoc); + } + + ByteBuffer value = checkNotNull(r.bounds(b, options).get(0), "Invalid null clustering key part %s", r); + compositeBuilder.addElementToAll(value); + Composite.EOC eoc = eocFor(r, bound, b); + return compositeBuilder.buildWithEOC(eoc); + } + + compositeBuilder.addEachElementToAll(r.values(options)); + + checkFalse(compositeBuilder.containsNull(), "Invalid null clustering key part %s", def.name); + keyPosition++; + } + // Means no relation at all or everything was an equal + // Note: if the builder is "full", there is no need to use the end-of-component bit. For columns selection, + // it would be harmless to do it. However, we use this method got the partition key too. And when a query + // with 2ndary index is done, and with the the partition provided with an EQ, we'll end up here, and in that + // case using the eoc would be bad, since for the random partitioner we have no guarantee that + // prefix.end() will sort after prefix (see #5240). + EOC eoc = bound.isEnd() && compositeBuilder.hasRemaining() ? EOC.END : EOC.NONE; + return compositeBuilder.buildWithEOC(eoc); + } + + @Override + public List values(QueryOptions options) throws InvalidRequestException + { + return Composites.toByteBuffers(valuesAsComposites(options)); + } + + @Override + public List bounds(Bound b, QueryOptions options) throws InvalidRequestException + { + return Composites.toByteBuffers(boundsAsComposites(b, options)); + } + + private static Composite.EOC eocFor(Restriction r, Bound eocBound, Bound inclusiveBound) + { + if (eocBound.isStart()) + return r.isInclusive(inclusiveBound) ? Composite.EOC.NONE : Composite.EOC.END; + + return r.isInclusive(inclusiveBound) ? Composite.EOC.END : Composite.EOC.START; + } + + @Override + public boolean hasBound(Bound b) + { + if (isEmpty()) + return false; + return restrictions.lastRestriction().hasBound(b); + } + + @Override + public boolean isInclusive(Bound b) + { + if (isEmpty()) + return false; + return restrictions.lastRestriction().isInclusive(b); + } + + @Override + public boolean hasSupportingIndex(SecondaryIndexManager indexManager) + { + return restrictions.hasSupportingIndex(indexManager); + } + + @Override + public void addIndexExpressionTo(List expressions, QueryOptions options) throws InvalidRequestException + { + restrictions.addIndexExpressionTo(expressions, options); + } + + @Override + public Collection getColumnDefs() + { + return restrictions.getColumnDefs(); + } +} \ No newline at end of file diff --git a/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestriction.java b/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestriction.java new file mode 100644 index 000000000000..0f0f9c8b8370 --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestriction.java @@ -0,0 +1,477 @@ +/* + * 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.cql3.restrictions; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import org.apache.cassandra.config.ColumnDefinition; +import org.apache.cassandra.cql3.AbstractMarker; +import org.apache.cassandra.cql3.Operator; +import org.apache.cassandra.cql3.QueryOptions; +import org.apache.cassandra.cql3.Term; +import org.apache.cassandra.cql3.statements.Bound; +import org.apache.cassandra.db.IndexExpression; +import org.apache.cassandra.db.index.SecondaryIndex; +import org.apache.cassandra.db.index.SecondaryIndexManager; +import org.apache.cassandra.exceptions.InvalidRequestException; + +import static org.apache.cassandra.cql3.statements.RequestValidations.checkFalse; +import static org.apache.cassandra.cql3.statements.RequestValidations.checkTrue; +import static org.apache.cassandra.cql3.statements.RequestValidations.invalidRequest; + +public abstract class SingleColumnRestriction extends AbstractRestriction +{ + /** + * The definition of the column to which apply the restriction. + */ + protected final ColumnDefinition columnDef; + + public SingleColumnRestriction(ColumnDefinition columnDef) + { + this.columnDef = columnDef; + } + + /** + * Returns the definition of the column to which is associated this restriction. + * @return the definition of the column to which is associated this restriction + */ + public ColumnDefinition getColumnDef() + { + return columnDef; + } + + @Override + public void addIndexExpressionTo(List expressions, + QueryOptions options) throws InvalidRequestException + { + List values = values(options); + checkTrue(values.size() == 1, "IN restrictions are not supported on indexed columns"); + + ByteBuffer value = validateIndexedValue(columnDef, values.get(0)); + expressions.add(new IndexExpression(columnDef.name.bytes, Operator.EQ, value)); + } + + @Override + public boolean hasSupportingIndex(SecondaryIndexManager indexManager) + { + SecondaryIndex index = indexManager.getIndexForColumn(columnDef.name.bytes); + return index != null && isSupportedBy(index); + } + + /** + * Check if this type of restriction is supported by the specified index. + * + * @param index the Secondary index + * @return true this type of restriction is supported by the specified index, + * false otherwise. + */ + protected abstract boolean isSupportedBy(SecondaryIndex index); + + public static final class EQ extends SingleColumnRestriction + { + private final Term value; + + public EQ(ColumnDefinition columnDef, Term value) + { + super(columnDef); + this.value = value; + } + + @Override + public boolean usesFunction(String ksName, String functionName) + { + return usesFunction(value, ksName, functionName); + } + + public boolean isEQ() + { + return true; + } + + @Override + public List values(QueryOptions options) throws InvalidRequestException + { + return Collections.singletonList(value.bindAndGet(options)); + } + + @Override + public String toString() + { + return String.format("EQ(%s)", value); + } + + @Override + public Restriction mergeWith(Restriction otherRestriction) throws InvalidRequestException + { + throw invalidRequest("%s cannot be restricted by more than one relation if it includes an Equal", columnDef.name); + } + + @Override + protected boolean isSupportedBy(SecondaryIndex index) + { + return index.supportsOperator(Operator.EQ); + } + } + + public static abstract class IN extends SingleColumnRestriction + { + public IN(ColumnDefinition columnDef) + { + super(columnDef); + } + + @Override + public final boolean isIN() + { + return true; + } + + @Override + public final Restriction mergeWith(Restriction otherRestriction) throws InvalidRequestException + { + throw invalidRequest("%s cannot be restricted by more than one relation if it includes a IN", columnDef.name); + } + + @Override + protected final boolean isSupportedBy(SecondaryIndex index) + { + return index.supportsOperator(Operator.IN); + } + } + + public static class InWithValues extends IN + { + protected final List values; + + public InWithValues(ColumnDefinition columnDef, List values) + { + super(columnDef); + this.values = values; + } + + @Override + public boolean usesFunction(String ksName, String functionName) + { + return usesFunction(values, ksName, functionName); + } + + @Override + public List values(QueryOptions options) throws InvalidRequestException + { + List buffers = new ArrayList<>(values.size()); + for (Term value : values) + buffers.add(value.bindAndGet(options)); + return buffers; + } + + @Override + public String toString() + { + return String.format("IN(%s)", values); + } + } + + public static class InWithMarker extends IN + { + protected final AbstractMarker marker; + + public InWithMarker(ColumnDefinition columnDef, AbstractMarker marker) + { + super(columnDef); + this.marker = marker; + } + + @Override + public boolean usesFunction(String ksName, String functionName) + { + return false; + } + + public List values(QueryOptions options) throws InvalidRequestException + { + Term.MultiItemTerminal lval = (Term.MultiItemTerminal) marker.bind(options); + if (lval == null) + throw new InvalidRequestException("Invalid null value for IN restriction"); + return lval.getElements(); + } + + @Override + public String toString() + { + return "IN ?"; + } + } + + public static class Slice extends SingleColumnRestriction + { + private final TermSlice slice; + + public Slice(ColumnDefinition columnDef, Bound bound, boolean inclusive, Term term) + { + super(columnDef); + slice = TermSlice.newInstance(bound, inclusive, term); + } + + @Override + public boolean usesFunction(String ksName, String functionName) + { + return (slice.hasBound(Bound.START) && usesFunction(slice.bound(Bound.START), ksName, functionName)) + || (slice.hasBound(Bound.END) && usesFunction(slice.bound(Bound.END), ksName, functionName)); + } + + public boolean isSlice() + { + return true; + } + + @Override + public List values(QueryOptions options) throws InvalidRequestException + { + throw new UnsupportedOperationException(); + } + + @Override + public boolean hasBound(Bound b) + { + return slice.hasBound(b); + } + + @Override + public List bounds(Bound b, QueryOptions options) throws InvalidRequestException + { + return Collections.singletonList(slice.bound(b).bindAndGet(options)); + } + + @Override + public boolean isInclusive(Bound b) + { + return slice.isInclusive(b); + } + + @Override + public Restriction mergeWith(Restriction otherRestriction) + throws InvalidRequestException + { + checkTrue(otherRestriction.isSlice(), + "Column \"%s\" cannot be restricted by both an equality and an inequality relation", + columnDef.name); + + SingleColumnRestriction.Slice otherSlice = (SingleColumnRestriction.Slice) otherRestriction; + + checkFalse(hasBound(Bound.START) && otherSlice.hasBound(Bound.START), + "More than one restriction was found for the start bound on %s", columnDef.name); + + checkFalse(hasBound(Bound.END) && otherSlice.hasBound(Bound.END), + "More than one restriction was found for the end bound on %s", columnDef.name); + + return new Slice(columnDef, slice.merge(otherSlice.slice)); + } + + @Override + public void addIndexExpressionTo(List expressions, + QueryOptions options) throws InvalidRequestException + { + for (Bound b : Bound.values()) + { + if (hasBound(b)) + { + ByteBuffer value = validateIndexedValue(columnDef, slice.bound(b).bindAndGet(options)); + Operator op = slice.getIndexOperator(b); + // If the underlying comparator for name is reversed, we need to reverse the IndexOperator: user operation + // always refer to the "forward" sorting even if the clustering order is reversed, but the 2ndary code does + // use the underlying comparator as is. + op = columnDef.isReversedType() ? op.reverse() : op; + expressions.add(new IndexExpression(columnDef.name.bytes, op, value)); + } + } + } + + @Override + protected boolean isSupportedBy(SecondaryIndex index) + { + return slice.isSupportedBy(index); + } + + @Override + public String toString() + { + return String.format("SLICE%s", slice); + } + + private Slice(ColumnDefinition columnDef, TermSlice slice) + { + super(columnDef); + this.slice = slice; + } + } + + // This holds both CONTAINS and CONTAINS_KEY restriction because we might want to have both of them. + public static final class Contains extends SingleColumnRestriction + { + private List values = new ArrayList<>(); // for CONTAINS + private List keys = new ArrayList<>(); // for CONTAINS_KEY + + public Contains(ColumnDefinition columnDef, Term t, boolean isKey) + { + super(columnDef); + if (isKey) + keys.add(t); + else + values.add(t); + } + + @Override + public List values(QueryOptions options) throws InvalidRequestException + { + return bindAndGet(values, options); + } + + @Override + public boolean isContains() + { + return true; + } + + @Override + public Restriction mergeWith(Restriction otherRestriction) throws InvalidRequestException + { + checkTrue(otherRestriction.isContains(), + "Collection column %s can only be restricted by CONTAINS or CONTAINS KEY", + getColumnDef().name); + + SingleColumnRestriction.Contains newContains = new Contains(getColumnDef()); + + copyKeysAndValues(this, newContains); + copyKeysAndValues((Contains) otherRestriction, newContains); + + return newContains; + } + + @Override + public void addIndexExpressionTo(List expressions, + QueryOptions options) + throws InvalidRequestException + { + for (ByteBuffer value : values(options)) + { + validateIndexedValue(columnDef, value); + expressions.add(new IndexExpression(columnDef.name.bytes, Operator.CONTAINS, value)); + } + for (ByteBuffer key : keys(options)) + { + validateIndexedValue(columnDef, key); + expressions.add(new IndexExpression(columnDef.name.bytes, Operator.CONTAINS_KEY, key)); + } + } + + @Override + protected boolean isSupportedBy(SecondaryIndex index) + { + boolean supported = false; + + if (numberOfValues() > 0) + supported |= index.supportsOperator(Operator.CONTAINS); + + if (numberOfKeys() > 0) + supported |= index.supportsOperator(Operator.CONTAINS_KEY); + + return supported; + } + + public int numberOfValues() + { + return values.size(); + } + + public int numberOfKeys() + { + return keys.size(); + } + + @Override + public boolean usesFunction(String ksName, String functionName) + { + return usesFunction(values, ksName, functionName) || usesFunction(keys, ksName, functionName); + } + + @Override + public String toString() + { + return String.format("CONTAINS(values=%s, keys=%s)", values, keys); + } + + @Override + public boolean hasBound(Bound b) + { + throw new UnsupportedOperationException(); + } + + @Override + public List bounds(Bound b, QueryOptions options) throws InvalidRequestException + { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isInclusive(Bound b) + { + throw new UnsupportedOperationException(); + } + private List keys(QueryOptions options) throws InvalidRequestException + { + return bindAndGet(keys, options); + } + + /** + * Binds the query options to the specified terms and returns the resulting values. + * + * @param terms the terms + * @param options the query options + * @return the value resulting from binding the query options to the specified terms + * @throws InvalidRequestException if a problem occurs while binding the query options + */ + private static List bindAndGet(List terms, QueryOptions options) throws InvalidRequestException + { + List buffers = new ArrayList<>(terms.size()); + for (Term value : terms) + buffers.add(value.bindAndGet(options)); + return buffers; + } + + /** + * Copies the keys and value from the first Contains to the second one. + * + * @param from the Contains to copy from + * @param to the Contains to copy to + */ + private static void copyKeysAndValues(Contains from, Contains to) + { + to.values.addAll(from.values); + to.keys.addAll(from.keys); + } + + private Contains(ColumnDefinition columnDef) + { + super(columnDef); + } + } +} diff --git a/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestrictions.java b/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestrictions.java new file mode 100644 index 000000000000..ec74cc9884c8 --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestrictions.java @@ -0,0 +1,209 @@ +/* + * 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.cql3.restrictions; + +import java.util.*; + +import org.apache.cassandra.config.ColumnDefinition; +import org.apache.cassandra.cql3.QueryOptions; +import org.apache.cassandra.cql3.restrictions.SingleColumnRestriction.Contains; +import org.apache.cassandra.db.IndexExpression; +import org.apache.cassandra.db.index.SecondaryIndexManager; +import org.apache.cassandra.exceptions.InvalidRequestException; + +/** + * Sets of single column restrictions. + */ +final class SingleColumnRestrictions implements Restrictions +{ + /** + * The comparator used to sort the Restrictions. + */ + private static final Comparator COLUMN_DEFINITION_COMPARATOR = new Comparator() + { + @Override + public int compare(ColumnDefinition column, ColumnDefinition otherColumn) + { + int value = Integer.compare(column.position(), otherColumn.position()); + return value != 0 ? value : column.name.bytes.compareTo(otherColumn.name.bytes); + } + }; + + /** + * The restrictions per column. + */ + protected final TreeMap restrictions; + + public SingleColumnRestrictions() + { + this(new TreeMap(COLUMN_DEFINITION_COMPARATOR)); + } + + protected SingleColumnRestrictions(TreeMap restrictions) + { + this.restrictions = restrictions; + } + + @Override + public final void addIndexExpressionTo(List expressions, + QueryOptions options) throws InvalidRequestException + { + for (Restriction restriction : restrictions.values()) + restriction.addIndexExpressionTo(expressions, options); + } + + @Override + public final Set getColumnDefs() + { + return restrictions.keySet(); + } + + /** + * Returns the restriction associated to the specified column. + * + * @param columnDef the column definition + * @return the restriction associated to the specified column + */ + public Restriction getRestriction(ColumnDefinition columnDef) + { + return restrictions.get(columnDef); + } + + @Override + public boolean usesFunction(String ksName, String functionName) + { + for (Restriction restriction : restrictions.values()) + if (restriction.usesFunction(ksName, functionName)) + return true; + + return false; + } + + @Override + public final boolean isEmpty() + { + return getColumnDefs().isEmpty(); + } + + @Override + public final int size() + { + return getColumnDefs().size(); + } + + /** + * Adds the specified restriction to this set of restrictions. + * + * @param restriction the restriction to add + * @return the new set of restrictions + * @throws InvalidRequestException if the new restriction cannot be added + */ + public SingleColumnRestrictions addRestriction(SingleColumnRestriction restriction) throws InvalidRequestException + { + TreeMap newRestrictions = new TreeMap<>(this.restrictions); + return new SingleColumnRestrictions(mergeRestrictions(newRestrictions, restriction)); + } + + private static TreeMap mergeRestrictions(TreeMap restrictions, + Restriction restriction) + throws InvalidRequestException + { + ColumnDefinition def = ((SingleColumnRestriction) restriction).getColumnDef(); + Restriction existing = restrictions.get(def); + Restriction newRestriction = mergeRestrictions(existing, restriction); + restrictions.put(def, newRestriction); + return restrictions; + } + + @Override + public final boolean hasSupportingIndex(SecondaryIndexManager indexManager) + { + for (Restriction restriction : restrictions.values()) + { + if (restriction.hasSupportingIndex(indexManager)) + return true; + } + return false; + } + + /** + * Returns the column after the specified one. + * + * @param columnDef the column for which the next one need to be found + * @return the column after the specified one. + */ + ColumnDefinition nextColumn(ColumnDefinition columnDef) + { + return restrictions.tailMap(columnDef, false).firstKey(); + } + + /** + * Returns the definition of the last column. + * + * @return the definition of the last column. + */ + ColumnDefinition lastColumn() + { + return isEmpty() ? null : this.restrictions.lastKey(); + } + + /** + * Returns the last restriction. + * + * @return the last restriction. + */ + Restriction lastRestriction() + { + return isEmpty() ? null : this.restrictions.lastEntry().getValue(); + } + + /** + * Merges the two specified restrictions. + * + * @param restriction the first restriction + * @param otherRestriction the second restriction + * @return the merged restriction + * @throws InvalidRequestException if the two restrictions cannot be merged + */ + private static Restriction mergeRestrictions(Restriction restriction, + Restriction otherRestriction) throws InvalidRequestException + { + return restriction == null ? otherRestriction + : restriction.mergeWith(otherRestriction); + } + + /** + * Checks if the restrictions contains multiple contains or contains key. + * + * @return true if the restrictions contains multiple contains or contains key., + * false otherwise + */ + public final boolean hasMultipleContains() + { + int numberOfContains = 0; + for (Restriction restriction : restrictions.values()) + { + if (restriction.isContains()) + { + Contains contains = (Contains) restriction; + numberOfContains += (contains.numberOfValues() + contains.numberOfKeys()); + } + } + return numberOfContains > 1; + } +} \ No newline at end of file diff --git a/src/java/org/apache/cassandra/cql3/restrictions/StatementRestrictions.java b/src/java/org/apache/cassandra/cql3/restrictions/StatementRestrictions.java new file mode 100644 index 000000000000..60c7465b5456 --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/restrictions/StatementRestrictions.java @@ -0,0 +1,600 @@ +/* + * 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.cql3.restrictions; + +import java.nio.ByteBuffer; +import java.util.*; + +import com.google.common.base.Joiner; + +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.ColumnDefinition; +import org.apache.cassandra.cql3.ColumnIdentifier; +import org.apache.cassandra.cql3.QueryOptions; +import org.apache.cassandra.cql3.Relation; +import org.apache.cassandra.cql3.VariableSpecifications; +import org.apache.cassandra.cql3.statements.Bound; +import org.apache.cassandra.db.ColumnFamilyStore; +import org.apache.cassandra.db.IndexExpression; +import org.apache.cassandra.db.Keyspace; +import org.apache.cassandra.db.RowPosition; +import org.apache.cassandra.db.composites.Composite; +import org.apache.cassandra.db.index.SecondaryIndexManager; +import org.apache.cassandra.dht.*; +import org.apache.cassandra.exceptions.InvalidRequestException; +import org.apache.cassandra.service.StorageService; +import org.apache.cassandra.utils.ByteBufferUtil; + +import static org.apache.cassandra.cql3.statements.RequestValidations.checkFalse; +import static org.apache.cassandra.cql3.statements.RequestValidations.checkNotNull; +import static org.apache.cassandra.cql3.statements.RequestValidations.checkTrue; +import static org.apache.cassandra.cql3.statements.RequestValidations.invalidRequest; + +/** + * The restrictions corresponding to the relations specified on the where-clause of CQL query. + */ +public final class StatementRestrictions +{ + /** + * The Column Family meta data + */ + public final CFMetaData cfm; + + /** + * Restrictions on partitioning columns + */ + private PrimaryKeyRestrictions partitionKeyRestrictions; + + /** + * Restrictions on clustering columns + */ + private PrimaryKeyRestrictions clusteringColumnsRestrictions; + + /** + * Restriction on non-primary key columns (i.e. secondary index restrictions) + */ + private SingleColumnRestrictions nonPrimaryKeyRestrictions; + + /** + * The restrictions used to build the index expressions + */ + private final List indexRestrictions = new ArrayList<>(); + + /** + * true if the secondary index need to be queried, false otherwise + */ + private boolean usesSecondaryIndexing; + + /** + * Specify if the query will return a range of partition keys. + */ + private boolean isKeyRange; + + /** + * Creates a new empty StatementRestrictions. + * + * @param cfm the column family meta data + * @return a new empty StatementRestrictions. + */ + public static StatementRestrictions empty(CFMetaData cfm) + { + return new StatementRestrictions(cfm); + } + + private StatementRestrictions(CFMetaData cfm) + { + this.cfm = cfm; + this.partitionKeyRestrictions = new SingleColumnPrimaryKeyRestrictions(cfm.getKeyValidatorAsCType()); + this.clusteringColumnsRestrictions = new SingleColumnPrimaryKeyRestrictions(cfm.comparator); + this.nonPrimaryKeyRestrictions = new SingleColumnRestrictions(); + } + + public StatementRestrictions(CFMetaData cfm, + List whereClause, + VariableSpecifications boundNames, + boolean selectsOnlyStaticColumns, + boolean selectACollection) throws InvalidRequestException + { + this.cfm = cfm; + this.partitionKeyRestrictions = new SingleColumnPrimaryKeyRestrictions(cfm.getKeyValidatorAsCType()); + this.clusteringColumnsRestrictions = new SingleColumnPrimaryKeyRestrictions(cfm.comparator); + this.nonPrimaryKeyRestrictions = new SingleColumnRestrictions(); + + /* + * WHERE clause. For a given entity, rules are: - EQ relation conflicts with anything else (including a 2nd EQ) + * - Can't have more than one LT(E) relation (resp. GT(E) relation) - IN relation are restricted to row keys + * (for now) and conflicts with anything else (we could allow two IN for the same entity but that doesn't seem + * very useful) - The value_alias cannot be restricted in any way (we don't support wide rows with indexed value + * in CQL so far) + */ + for (Relation relation : whereClause) + addRestriction(relation.toRestriction(cfm, boundNames)); + + ColumnFamilyStore cfs = Keyspace.open(cfm.ksName).getColumnFamilyStore(cfm.cfName); + SecondaryIndexManager secondaryIndexManager = cfs.indexManager; + + boolean hasQueriableClusteringColumnIndex = clusteringColumnsRestrictions.hasSupportingIndex(secondaryIndexManager); + boolean hasQueriableIndex = hasQueriableClusteringColumnIndex + || partitionKeyRestrictions.hasSupportingIndex(secondaryIndexManager) + || nonPrimaryKeyRestrictions.hasSupportingIndex(secondaryIndexManager); + + // At this point, the select statement if fully constructed, but we still have a few things to validate + processPartitionKeyRestrictions(hasQueriableIndex); + + // Some but not all of the partition key columns have been specified; + // hence we need turn these restrictions into index expressions. + if (usesSecondaryIndexing) + indexRestrictions.add(partitionKeyRestrictions); + + checkFalse(selectsOnlyStaticColumns && hasClusteringColumnsRestriction(), + "Cannot restrict clustering columns when selecting only static columns"); + + processClusteringColumnsRestrictions(hasQueriableIndex, selectACollection); + + // Covers indexes on the first clustering column (among others). + if (isKeyRange && hasQueriableClusteringColumnIndex) + usesSecondaryIndexing = true; + + if (usesSecondaryIndexing) + { + indexRestrictions.add(clusteringColumnsRestrictions); + } + else if (clusteringColumnsRestrictions.isContains()) + { + indexRestrictions.add(new ForwardingPrimaryKeyRestrictions() { + + @Override + protected PrimaryKeyRestrictions getDelegate() + { + return clusteringColumnsRestrictions; + } + + @Override + public void addIndexExpressionTo(List expressions, QueryOptions options) throws InvalidRequestException + { + List list = new ArrayList<>(); + super.addIndexExpressionTo(list, options); + + for (IndexExpression expression : list) + { + if (expression.isContains() || expression.isContainsKey()) + expressions.add(expression); + } + } + }); + usesSecondaryIndexing = true; + } + // Even if usesSecondaryIndexing is false at this point, we'll still have to use one if + // there is restrictions not covered by the PK. + if (!nonPrimaryKeyRestrictions.isEmpty()) + { + usesSecondaryIndexing = true; + indexRestrictions.add(nonPrimaryKeyRestrictions); + } + + if (usesSecondaryIndexing) + validateSecondaryIndexSelections(selectsOnlyStaticColumns); + } + + private void addRestriction(Restriction restriction) throws InvalidRequestException + { + if (restriction.isMultiColumn()) + clusteringColumnsRestrictions = clusteringColumnsRestrictions.mergeWith(restriction); + else if (restriction.isOnToken()) + partitionKeyRestrictions = partitionKeyRestrictions.mergeWith(restriction); + else + addSingleColumnRestriction((SingleColumnRestriction) restriction); + } + + public boolean usesFunction(String ksName, String functionName) + { + return partitionKeyRestrictions.usesFunction(ksName, functionName) + || clusteringColumnsRestrictions.usesFunction(ksName, functionName) + || nonPrimaryKeyRestrictions.usesFunction(ksName, functionName); + } + + private void addSingleColumnRestriction(SingleColumnRestriction restriction) throws InvalidRequestException + { + ColumnDefinition def = restriction.getColumnDef(); + if (def.isPartitionKey()) + partitionKeyRestrictions = partitionKeyRestrictions.mergeWith(restriction); + else if (def.isClusteringColumn()) + clusteringColumnsRestrictions = clusteringColumnsRestrictions.mergeWith(restriction); + else + nonPrimaryKeyRestrictions = nonPrimaryKeyRestrictions.addRestriction(restriction); + } + + /** + * Checks if the restrictions on the partition key is an IN restriction. + * + * @return true the restrictions on the partition key is an IN restriction, false + * otherwise. + */ + public boolean keyIsInRelation() + { + return partitionKeyRestrictions.isIN(); + } + + /** + * Checks if the query request a range of partition keys. + * + * @return true if the query request a range of partition keys, false otherwise. + */ + public boolean isKeyRange() + { + return this.isKeyRange; + } + + /** + * Checks if the secondary index need to be queried. + * + * @return true if the secondary index need to be queried, false otherwise. + */ + public boolean usesSecondaryIndexing() + { + return this.usesSecondaryIndexing; + } + + private void processPartitionKeyRestrictions(boolean hasQueriableIndex) throws InvalidRequestException + { + // If there is a queriable index, no special condition are required on the other restrictions. + // But we still need to know 2 things: + // - If we don't have a queriable index, is the query ok + // - Is it queriable without 2ndary index, which is always more efficient + // If a component of the partition key is restricted by a relation, all preceding + // components must have a EQ. Only the last partition key component can be in IN relation. + if (partitionKeyRestrictions.isOnToken()) + { + isKeyRange = true; + } + else if (hasPartitionKeyUnrestrictedComponents()) + { + if (!partitionKeyRestrictions.isEmpty()) + { + if (!hasQueriableIndex) + throw invalidRequest("Partition key parts: %s must be restricted as other parts are", + Joiner.on(", ").join(getPartitionKeyUnrestrictedComponents())); + } + + isKeyRange = true; + usesSecondaryIndexing = hasQueriableIndex; + } + } + + /** + * Checks if the partition key has some unrestricted components. + * @return true if the partition key has some unrestricted components, false otherwise. + */ + private boolean hasPartitionKeyUnrestrictedComponents() + { + return partitionKeyRestrictions.size() < cfm.partitionKeyColumns().size(); + } + + /** + * Returns the partition key components that are not restricted. + * @return the partition key components that are not restricted. + */ + private List getPartitionKeyUnrestrictedComponents() + { + List list = new ArrayList<>(cfm.partitionKeyColumns()); + list.removeAll(partitionKeyRestrictions.getColumnDefs()); + return ColumnDefinition.toIdentifiers(list); + } + + /** + * Processes the clustering column restrictions. + * + * @param hasQueriableIndex true if some of the queried data are indexed, false otherwise + * @param selectACollection true if the query should return a collection column + * @throws InvalidRequestException if the request is invalid + */ + private void processClusteringColumnsRestrictions(boolean hasQueriableIndex, + boolean selectACollection) throws InvalidRequestException + { + checkFalse(clusteringColumnsRestrictions.isIN() && selectACollection, + "Cannot restrict clustering columns by IN relations when a collection is selected by the query"); + checkFalse(clusteringColumnsRestrictions.isContains() && !hasQueriableIndex, + "Cannot restrict clustering columns by a CONTAINS relation without a secondary index"); + + if (hasClusteringColumnsRestriction()) + { + List clusteringColumns = cfm.clusteringColumns(); + List restrictedColumns = new LinkedList<>(clusteringColumnsRestrictions.getColumnDefs()); + + for (int i = 0, m = restrictedColumns.size(); i < m; i++) + { + ColumnDefinition clusteringColumn = clusteringColumns.get(i); + ColumnDefinition restrictedColumn = restrictedColumns.get(i); + + if (!clusteringColumn.equals(restrictedColumn)) + { + checkTrue(hasQueriableIndex, + "PRIMARY KEY column \"%s\" cannot be restricted as preceding column \"%s\" is not restricted", + restrictedColumn.name, + clusteringColumn.name); + + usesSecondaryIndexing = true; // handle gaps and non-keyrange cases. + break; + } + } + } + + if (clusteringColumnsRestrictions.isContains()) + usesSecondaryIndexing = true; + } + + public List getIndexExpressions(QueryOptions options) throws InvalidRequestException + { + if (!usesSecondaryIndexing || indexRestrictions.isEmpty()) + return Collections.emptyList(); + + List expressions = new ArrayList<>(); + for (Restrictions restrictions : indexRestrictions) + restrictions.addIndexExpressionTo(expressions, options); + + return expressions; + } + + /** + * Returns the partition keys for which the data is requested. + * + * @param options the query options + * @return the partition keys for which the data is requested. + * @throws InvalidRequestException if the partition keys cannot be retrieved + */ + public Collection getPartitionKeys(final QueryOptions options) throws InvalidRequestException + { + return partitionKeyRestrictions.values(options); + } + + /** + * Returns the specified bound of the partition key. + * + * @param b the boundary type + * @param options the query options + * @return the specified bound of the partition key + * @throws InvalidRequestException if the boundary cannot be retrieved + */ + private ByteBuffer getPartitionKeyBound(Bound b, QueryOptions options) throws InvalidRequestException + { + // Deal with unrestricted partition key components (special-casing is required to deal with 2i queries on the + // first + // component of a composite partition key). + if (hasPartitionKeyUnrestrictedComponents()) + return ByteBufferUtil.EMPTY_BYTE_BUFFER; + + // We deal with IN queries for keys in other places, so we know buildBound will return only one result + return partitionKeyRestrictions.bounds(b, options).get(0); + } + + /** + * Returns the partition key bounds. + * + * @param options the query options + * @return the partition key bounds + * @throws InvalidRequestException if the query is invalid + */ + public AbstractBounds getPartitionKeyBounds(QueryOptions options) throws InvalidRequestException + { + IPartitioner p = StorageService.getPartitioner(); + + if (partitionKeyRestrictions.isOnToken()) + { + return getPartitionKeyBoundsForTokenRestrictions(p, options); + } + + return getPartitionKeyBounds(p, options); + } + + private AbstractBounds getPartitionKeyBounds(IPartitioner p, + QueryOptions options) throws InvalidRequestException + { + ByteBuffer startKeyBytes = getPartitionKeyBound(Bound.START, options); + ByteBuffer finishKeyBytes = getPartitionKeyBound(Bound.END, options); + + RowPosition startKey = RowPosition.ForKey.get(startKeyBytes, p); + RowPosition finishKey = RowPosition.ForKey.get(finishKeyBytes, p); + + if (startKey.compareTo(finishKey) > 0 && !finishKey.isMinimum()) + return null; + + if (partitionKeyRestrictions.isInclusive(Bound.START)) + { + return partitionKeyRestrictions.isInclusive(Bound.END) + ? new Bounds<>(startKey, finishKey) + : new IncludingExcludingBounds<>(startKey, finishKey); + } + + return partitionKeyRestrictions.isInclusive(Bound.END) + ? new Range<>(startKey, finishKey) + : new ExcludingBounds<>(startKey, finishKey); + } + + private AbstractBounds getPartitionKeyBoundsForTokenRestrictions(IPartitioner p, + QueryOptions options) + throws InvalidRequestException + { + Token startToken = getTokenBound(Bound.START, options, p); + Token endToken = getTokenBound(Bound.END, options, p); + + boolean includeStart = partitionKeyRestrictions.isInclusive(Bound.START); + boolean includeEnd = partitionKeyRestrictions.isInclusive(Bound.END); + + /* + * If we ask SP.getRangeSlice() for (token(200), token(200)], it will happily return the whole ring. + * However, wrapping range doesn't really make sense for CQL, and we want to return an empty result in that + * case (CASSANDRA-5573). So special case to create a range that is guaranteed to be empty. + * + * In practice, we want to return an empty result set if either startToken > endToken, or both are equal but + * one of the bound is excluded (since [a, a] can contains something, but not (a, a], [a, a) or (a, a)). + * Note though that in the case where startToken or endToken is the minimum token, then this special case + * rule should not apply. + */ + int cmp = startToken.compareTo(endToken); + if (!startToken.isMinimum() && !endToken.isMinimum() + && (cmp > 0 || (cmp == 0 && (!includeStart || !includeEnd)))) + return null; + + RowPosition start = includeStart ? startToken.minKeyBound() : startToken.maxKeyBound(); + RowPosition end = includeEnd ? endToken.maxKeyBound() : endToken.minKeyBound(); + + return new Range<>(start, end); + } + + private Token getTokenBound(Bound b, QueryOptions options, IPartitioner p) throws InvalidRequestException + { + if (!partitionKeyRestrictions.hasBound(b)) + return p.getMinimumToken(); + + ByteBuffer value = partitionKeyRestrictions.bounds(b, options).get(0); + checkNotNull(value, "Invalid null token value"); + return p.getTokenFactory().fromByteArray(value); + } + + /** + * Checks if the query does not contains any restriction on the clustering columns. + * + * @return true if the query does not contains any restriction on the clustering columns, + * false otherwise. + */ + public boolean hasNoClusteringColumnsRestriction() + { + return clusteringColumnsRestrictions.isEmpty(); + } + + // For non-composite slices, we don't support internally the difference between exclusive and + // inclusive bounds, so we deal with it manually. + public boolean isNonCompositeSliceWithExclusiveBounds() + { + return !cfm.comparator.isCompound() + && clusteringColumnsRestrictions.isSlice() + && (!clusteringColumnsRestrictions.isInclusive(Bound.START) || !clusteringColumnsRestrictions.isInclusive(Bound.END)); + } + + /** + * Returns the requested clustering columns as Composites. + * + * @param options the query options + * @return the requested clustering columns as Composites + * @throws InvalidRequestException if the query is not valid + */ + public List getClusteringColumnsAsComposites(QueryOptions options) throws InvalidRequestException + { + return clusteringColumnsRestrictions.valuesAsComposites(options); + } + + /** + * Returns the bounds (start or end) of the clustering columns as Composites. + * + * @param b the bound type + * @param options the query options + * @return the bounds (start or end) of the clustering columns as Composites + * @throws InvalidRequestException if the request is not valid + */ + public List getClusteringColumnsBoundsAsComposites(Bound b, + QueryOptions options) throws InvalidRequestException + { + return clusteringColumnsRestrictions.boundsAsComposites(b, options); + } + + /** + * Returns the bounds (start or end) of the clustering columns. + * + * @param b the bound type + * @param options the query options + * @return the bounds (start or end) of the clustering columns + * @throws InvalidRequestException if the request is not valid + */ + public List getClusteringColumnsBounds(Bound b, QueryOptions options) throws InvalidRequestException + { + return clusteringColumnsRestrictions.bounds(b, options); + } + + /** + * Checks if the bounds (start or end) of the clustering columns are inclusive. + * + * @param bound the bound type + * @return true if the bounds (start or end) of the clustering columns are inclusive, + * false otherwise + */ + public boolean areRequestedBoundsInclusive(Bound bound) + { + return clusteringColumnsRestrictions.isInclusive(bound); + } + + /** + * Checks if the query returns a range of columns. + * + * @return true if the query returns a range of columns, false otherwise. + */ + public boolean isColumnRange() + { + // Due to CASSANDRA-5762, we always do a slice for CQL3 tables (not dense, composite). + // Static CF (non dense but non composite) never entails a column slice however + if (!cfm.comparator.isDense()) + return cfm.comparator.isCompound(); + + // Otherwise (i.e. for compact table where we don't have a row marker anyway and thus don't care about + // CASSANDRA-5762), + // it is a range query if it has at least one the column alias for which no relation is defined or is not EQ. + return clusteringColumnsRestrictions.size() < cfm.clusteringColumns().size() || clusteringColumnsRestrictions.isSlice(); + } + + /** + * Checks if the query need to use filtering. + * @return true if the query need to use filtering, false otherwise. + */ + public boolean needFiltering() + { + int numberOfRestrictedColumns = 0; + for (Restrictions restrictions : indexRestrictions) + numberOfRestrictedColumns += restrictions.size(); + + return numberOfRestrictedColumns > 1 + || (numberOfRestrictedColumns == 0 && !clusteringColumnsRestrictions.isEmpty()) + || (numberOfRestrictedColumns != 0 + && nonPrimaryKeyRestrictions.hasMultipleContains()); + } + + private void validateSecondaryIndexSelections(boolean selectsOnlyStaticColumns) throws InvalidRequestException + { + checkFalse(keyIsInRelation(), + "Select on indexed columns and with IN clause for the PRIMARY KEY are not supported"); + // When the user only select static columns, the intent is that we don't query the whole partition but just + // the static parts. But 1) we don't have an easy way to do that with 2i and 2) since we don't support index on + // static columns + // so far, 2i means that you've restricted a non static column, so the query is somewhat non-sensical. + checkFalse(selectsOnlyStaticColumns, "Queries using 2ndary indexes don't support selecting only static columns"); + } + + /** + * Checks if the query has some restrictions on the clustering columns. + * + * @return true if the query has some restrictions on the clustering columns, + * false otherwise. + */ + private boolean hasClusteringColumnsRestriction() + { + return !clusteringColumnsRestrictions.isEmpty(); + } + + public void reverse() + { + clusteringColumnsRestrictions = new ReversedPrimaryKeyRestrictions(clusteringColumnsRestrictions); + } +} diff --git a/src/java/org/apache/cassandra/cql3/restrictions/TermSlice.java b/src/java/org/apache/cassandra/cql3/restrictions/TermSlice.java new file mode 100644 index 000000000000..3622220453fe --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/restrictions/TermSlice.java @@ -0,0 +1,167 @@ +/* + * 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.cql3.restrictions; + +import org.apache.cassandra.cql3.Operator; +import org.apache.cassandra.cql3.Term; +import org.apache.cassandra.cql3.statements.Bound; +import org.apache.cassandra.db.index.SecondaryIndex; + +final class TermSlice +{ + /** + * The slice boundaries. + */ + private final Term[] bounds; + + /** + * Specifies if a slice boundary is inclusive or not. + */ + private final boolean[] boundInclusive; + + /** + * Creates a new TermSlice with the specified boundaries. + * + * @param start the lower boundary + * @param includeStart true if the lower boundary is inclusive + * @param end the upper boundary + * @param includeEnd true if the upper boundary is inclusive + */ + private TermSlice(Term start, boolean includeStart, Term end, boolean includeEnd) + { + bounds = new Term[]{start, end}; + boundInclusive = new boolean[]{includeStart, includeEnd}; + } + + /** + * Creates a new TermSlice with the specified boundary. + * + * @param bound the boundary type + * @param include true if the boundary is inclusive + * @param term the value + * @return a new TermSlice instance + */ + public static TermSlice newInstance(Bound bound, boolean include, Term term) + { + return bound.isStart() ? new TermSlice(term, include, null, false) + : new TermSlice(null, false, term, include); + } + + /** + * Returns the boundary value. + * + * @param bound the boundary type + * @return the boundary value + */ + public Term bound(Bound bound) + { + return bounds[bound.idx]; + } + + /** + * Checks if this slice has a boundary for the specified type. + * + * @param b the boundary type + * @return true if this slice has a boundary for the specified type, false otherwise. + */ + public boolean hasBound(Bound b) + { + return bounds[b.idx] != null; + } + + /** + * Checks if this slice boundary is inclusive for the specified type. + * + * @param b the boundary type + * @return true if this slice boundary is inclusive for the specified type, + * false otherwise. + */ + public boolean isInclusive(Bound b) + { + return bounds[b.idx] == null || boundInclusive[b.idx]; + } + + /** + * Merges this slice with the specified one. + * + * @param otherSlice the slice to merge to + * @return the new slice resulting from the merge + */ + public TermSlice merge(TermSlice otherSlice) + { + if (hasBound(Bound.START)) + { + assert !otherSlice.hasBound(Bound.START); + + return new TermSlice(bound(Bound.START), + isInclusive(Bound.START), + otherSlice.bound(Bound.END), + otherSlice.isInclusive(Bound.END)); + } + assert !otherSlice.hasBound(Bound.END); + + return new TermSlice(otherSlice.bound(Bound.START), + otherSlice.isInclusive(Bound.START), + bound(Bound.END), + isInclusive(Bound.END)); + } + + @Override + public String toString() + { + return String.format("(%s %s, %s %s)", boundInclusive[0] ? ">=" : ">", + bounds[0], + boundInclusive[1] ? "<=" : "<", + bounds[1]); + } + + /** + * Returns the index operator corresponding to the specified boundary. + * + * @param b the boundary type + * @return the index operator corresponding to the specified boundary + */ + public Operator getIndexOperator(Bound b) + { + if (b.isStart()) + return boundInclusive[b.idx] ? Operator.GTE : Operator.GT; + + return boundInclusive[b.idx] ? Operator.LTE : Operator.LT; + } + + /** + * Check if this TermSlice is supported by the specified index. + * + * @param index the Secondary index + * @return true this type of TermSlice is supported by the specified index, + * false otherwise. + */ + public boolean isSupportedBy(SecondaryIndex index) + { + boolean supported = false; + + if (hasBound(Bound.START)) + supported |= isInclusive(Bound.START) ? index.supportsOperator(Operator.GTE) + : index.supportsOperator(Operator.GT); + if (hasBound(Bound.END)) + supported |= isInclusive(Bound.END) ? index.supportsOperator(Operator.LTE) + : index.supportsOperator(Operator.LT); + + return supported; + } +} diff --git a/src/java/org/apache/cassandra/cql3/restrictions/TokenRestriction.java b/src/java/org/apache/cassandra/cql3/restrictions/TokenRestriction.java new file mode 100644 index 000000000000..85d614eded49 --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/restrictions/TokenRestriction.java @@ -0,0 +1,224 @@ +/* + * 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.cql3.restrictions; + +import java.nio.ByteBuffer; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import com.google.common.base.Joiner; + +import org.apache.cassandra.config.ColumnDefinition; +import org.apache.cassandra.cql3.QueryOptions; +import org.apache.cassandra.cql3.Term; +import org.apache.cassandra.cql3.statements.Bound; +import org.apache.cassandra.db.IndexExpression; +import org.apache.cassandra.db.composites.Composite; +import org.apache.cassandra.db.index.SecondaryIndexManager; +import org.apache.cassandra.exceptions.InvalidRequestException; + +import static org.apache.cassandra.cql3.statements.RequestValidations.invalidRequest; + +/** + * Restriction using the token function. + */ +public abstract class TokenRestriction extends AbstractPrimaryKeyRestrictions +{ + /** + * The definition of the columns to which apply the token restriction. + */ + protected final List columnDefs; + + /** + * Creates a new TokenRestriction that apply to the specified columns. + * + * @param columnDefs the definition of the columns to which apply the token restriction + */ + public TokenRestriction(List columnDefs) + { + this.columnDefs = columnDefs; + } + + @Override + public boolean isOnToken() + { + return true; + } + + @Override + public Collection getColumnDefs() + { + return columnDefs; + } + + @Override + public boolean hasSupportingIndex(SecondaryIndexManager secondaryIndexManager) + { + return false; + } + + @Override + public void addIndexExpressionTo(List expressions, QueryOptions options) + { + throw new UnsupportedOperationException("Index expression cannot be created for token restriction"); + } + + @Override + public List valuesAsComposites(QueryOptions options) throws InvalidRequestException + { + throw new UnsupportedOperationException(); + } + + @Override + public List boundsAsComposites(Bound bound, QueryOptions options) throws InvalidRequestException + { + throw new UnsupportedOperationException(); + } + + /** + * Returns the column names as a comma separated String. + * + * @return the column names as a comma separated String. + */ + protected final String getColumnNamesAsString() + { + return Joiner.on(", ").join(ColumnDefinition.toIdentifiers(columnDefs)); + } + + public static final class EQ extends TokenRestriction + { + private final Term value; + + public EQ(List columnDefs, Term value) + { + super(columnDefs); + this.value = value; + } + + @Override + public boolean isEQ() + { + return true; + } + + @Override + public boolean usesFunction(String ksName, String functionName) + { + return usesFunction(value, ksName, functionName); + } + + @Override + public PrimaryKeyRestrictions mergeWith(Restriction restriction) throws InvalidRequestException + { + throw invalidRequest("%s cannot be restricted by more than one relation if it includes an Equal", + Joiner.on(", ").join(ColumnDefinition.toIdentifiers(columnDefs))); + } + + @Override + public List values(QueryOptions options) throws InvalidRequestException + { + return Collections.singletonList(value.bindAndGet(options)); + } + } + + public static class Slice extends TokenRestriction + { + private final TermSlice slice; + + public Slice(List columnDefs, Bound bound, boolean inclusive, Term term) + { + super(columnDefs); + slice = TermSlice.newInstance(bound, inclusive, term); + } + + @Override + public boolean isSlice() + { + return true; + } + + @Override + public List values(QueryOptions options) throws InvalidRequestException + { + throw new UnsupportedOperationException(); + } + + @Override + public boolean hasBound(Bound b) + { + return slice.hasBound(b); + } + + @Override + public List bounds(Bound b, QueryOptions options) throws InvalidRequestException + { + return Collections.singletonList(slice.bound(b).bindAndGet(options)); + } + + @Override + public boolean usesFunction(String ksName, String functionName) + { + return (slice.hasBound(Bound.START) && usesFunction(slice.bound(Bound.START), ksName, functionName)) + || (slice.hasBound(Bound.END) && usesFunction(slice.bound(Bound.END), ksName, functionName)); + } + + @Override + public boolean isInclusive(Bound b) + { + return slice.isInclusive(b); + } + + @Override + public PrimaryKeyRestrictions mergeWith(Restriction otherRestriction) + throws InvalidRequestException + { + if (!otherRestriction.isOnToken()) + throw invalidRequest("Columns \"%s\" cannot be restricted by both a normal relation and a token relation", + getColumnNamesAsString()); + + if (!otherRestriction.isSlice()) + throw invalidRequest("Columns \"%s\" cannot be restricted by both an equality and an inequality relation", + getColumnNamesAsString()); + + TokenRestriction.Slice otherSlice = (TokenRestriction.Slice) otherRestriction; + + if (hasBound(Bound.START) && otherSlice.hasBound(Bound.START)) + throw invalidRequest("More than one restriction was found for the start bound on %s", + getColumnNamesAsString()); + + if (hasBound(Bound.END) && otherSlice.hasBound(Bound.END)) + throw invalidRequest("More than one restriction was found for the end bound on %s", + getColumnNamesAsString()); + + return new Slice(columnDefs, slice.merge(otherSlice.slice)); + } + + @Override + public String toString() + { + return String.format("SLICE%s", slice); + } + + private Slice(List columnDefs, TermSlice slice) + { + super(columnDefs); + this.slice = slice; + } + } +} diff --git a/src/java/org/apache/cassandra/cql3/selection/Selection.java b/src/java/org/apache/cassandra/cql3/selection/Selection.java index 6ad36e9da394..e44a39f1517d 100644 --- a/src/java/org/apache/cassandra/cql3/selection/Selection.java +++ b/src/java/org/apache/cassandra/cql3/selection/Selection.java @@ -35,17 +35,36 @@ import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.utils.ByteBufferUtil; +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; import com.google.common.collect.Iterators; public abstract class Selection { + /** + * A predicate that returns true for static columns. + */ + private static final Predicate STATIC_COLUMN_FILTER = new Predicate() + { + public boolean apply(ColumnDefinition def) + { + return def.isStatic(); + } + }; + + private final CFMetaData cfm; private final Collection columns; private final ResultSet.Metadata metadata; private final boolean collectTimestamps; private final boolean collectTTLs; - protected Selection(Collection columns, List metadata, boolean collectTimestamps, boolean collectTTLs) + protected Selection(CFMetaData cfm, + Collection columns, + List metadata, + boolean collectTimestamps, + boolean collectTTLs) { + this.cfm = cfm; this.columns = columns; this.metadata = new ResultSet.Metadata(metadata); this.collectTimestamps = collectTimestamps; @@ -55,9 +74,79 @@ protected Selection(Collection columns, Listtrue if this selection contains static columns, false otherwise; + */ + public boolean containsStaticColumns() + { + if (!cfm.hasStaticColumns()) + return false; + + if (isWildcard()) + return true; + + return !Iterables.isEmpty(Iterables.filter(columns, STATIC_COLUMN_FILTER)); + } + + /** + * Checks if this selection contains only static columns. + * @return true if this selection contains only static columns, false otherwise; + */ + public boolean containsOnlyStaticColumns() + { + if (!containsStaticColumns()) + return false; + + if (isWildcard()) + return false; + + for (ColumnDefinition def : getColumns()) + { + if (!def.isPartitionKey() && !def.isStatic()) + return false; + } + + return true; + } + + /** + * Checks if this selection contains a collection. + * + * @return true if this selection contains a collection, false otherwise. + */ + public boolean containsACollection() + { + if (!cfm.comparator.hasCollections()) + return false; + + for (ColumnDefinition def : getColumns()) + if (def.type.isCollection() && def.type.isMultiCell()) + return true; + return false; } + /** + * Returns the index of the specified column. + * + * @param def the column definition + * @return the index of the specified column + */ + public int indexOf(final ColumnDefinition def) + { + return Iterators.indexOf(getColumns().iterator(), new Predicate() + { + public boolean apply(ColumnDefinition n) + { + return def.name.equals(n.name); + } + }); + } + public ResultSet.Metadata getResultMetadata() { return metadata; @@ -67,12 +156,12 @@ public static Selection wildcard(CFMetaData cfm) { List all = new ArrayList(cfm.allColumns().size()); Iterators.addAll(all, cfm.allColumnsInSelectOrder()); - return new SimpleSelection(all, true); + return new SimpleSelection(cfm, all, true); } - public static Selection forColumns(Collection columns) + public static Selection forColumns(CFMetaData cfm, Collection columns) { - return new SimpleSelection(columns, false); + return new SimpleSelection(cfm, columns, false); } public int addColumnForOrdering(ColumnDefinition c) @@ -105,8 +194,8 @@ public static Selection fromSelectors(CFMetaData cfm, List rawSelec SelectorFactories.createFactoriesAndCollectColumnDefinitions(RawSelector.toSelectables(rawSelectors, cfm), cfm, defs); List metadata = collectMetadata(cfm, rawSelectors, factories); - return processesSelection(rawSelectors) ? new SelectionWithProcessing(defs, metadata, factories) - : new SimpleSelection(defs, metadata, false); + return processesSelection(rawSelectors) ? new SelectionWithProcessing(cfm, defs, metadata, factories) + : new SimpleSelection(cfm, defs, metadata, false); } private static List collectMetadata(CFMetaData cfm, @@ -280,19 +369,22 @@ private static class SimpleSelection extends Selection { private final boolean isWildcard; - public SimpleSelection(Collection columns, boolean isWildcard) + public SimpleSelection(CFMetaData cfm, Collection columns, boolean isWildcard) { - this(columns, new ArrayList(columns), isWildcard); + this(cfm, columns, new ArrayList(columns), isWildcard); } - public SimpleSelection(Collection columns, List metadata, boolean isWildcard) + public SimpleSelection(CFMetaData cfm, + Collection columns, + List metadata, + boolean isWildcard) { /* * In theory, even a simple selection could have multiple time the same column, so we * could filter those duplicate out of columns. But since we're very unlikely to * get much duplicate in practice, it's more efficient not to bother. */ - super(columns, metadata, false, false); + super(cfm, columns, metadata, false, false); this.isWildcard = isWildcard; } @@ -340,17 +432,24 @@ private static class SelectionWithProcessing extends Selection { private final SelectorFactories factories; - public SelectionWithProcessing(Collection columns, + public SelectionWithProcessing(CFMetaData cfm, + Collection columns, List metadata, SelectorFactories factories) throws InvalidRequestException { - super(columns, metadata, factories.containsWritetimeSelectorFactory(), factories.containsTTLSelectorFactory()); + super(cfm, + columns, + metadata, + factories.containsWritetimeSelectorFactory(), + factories.containsTTLSelectorFactory()); + this.factories = factories; if (factories.doesAggregation() && !factories.containsOnlyAggregateFunctions()) throw new InvalidRequestException("the select clause must either contains only aggregates or none"); } + @Override public boolean usesFunction(String ksName, String functionName) { return factories.usesFunction(ksName, functionName); diff --git a/src/java/org/apache/cassandra/cql3/statements/Bound.java b/src/java/org/apache/cassandra/cql3/statements/Bound.java index 8aa3a375fd94..7742642804bb 100644 --- a/src/java/org/apache/cassandra/cql3/statements/Bound.java +++ b/src/java/org/apache/cassandra/cql3/statements/Bound.java @@ -28,8 +28,18 @@ public enum Bound this.idx = idx; } - public static Bound reverse(Bound b) + public Bound reverse() { - return b == START ? END : START; + return isStart() ? END : START; + } + + public boolean isStart() + { + return this == START; + } + + public boolean isEnd() + { + return this == END; } } diff --git a/src/java/org/apache/cassandra/cql3/statements/DeleteStatement.java b/src/java/org/apache/cassandra/cql3/statements/DeleteStatement.java index 33c61e7f5bb1..ff685cfde461 100644 --- a/src/java/org/apache/cassandra/cql3/statements/DeleteStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/DeleteStatement.java @@ -23,6 +23,7 @@ import com.google.common.collect.Iterators; import org.apache.cassandra.cql3.*; +import org.apache.cassandra.cql3.restrictions.Restriction; import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.ColumnDefinition; import org.apache.cassandra.db.*; diff --git a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java index 4e39614b9df9..8347ef582583 100644 --- a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java @@ -27,6 +27,8 @@ import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.ColumnDefinition; import org.apache.cassandra.cql3.*; +import org.apache.cassandra.cql3.restrictions.Restriction; +import org.apache.cassandra.cql3.restrictions.SingleColumnRestriction; import org.apache.cassandra.cql3.selection.Selection; import org.apache.cassandra.db.*; import org.apache.cassandra.db.composites.CBuilder; @@ -237,7 +239,7 @@ private void addKeyValues(ColumnDefinition def, Restriction values) throws Inval public void addKeyValue(ColumnDefinition def, Term value) throws InvalidRequestException { - addKeyValues(def, new SingleColumnRestriction.EQ(value, false)); + addKeyValues(def, new SingleColumnRestriction.EQ(def, value)); } public void processWhereClause(List whereClause, VariableSpecifications names) throws InvalidRequestException @@ -251,7 +253,7 @@ public void processWhereClause(List whereClause, VariableSpecification } SingleColumnRelation rel = (SingleColumnRelation) relation; - if (rel.onToken) + if (rel.onToken()) throw new InvalidRequestException(String.format("The token function cannot be used in WHERE clauses for UPDATE and DELETE statements: %s", relation)); ColumnIdentifier id = rel.getEntity().prepare(cfm); @@ -265,31 +267,9 @@ public void processWhereClause(List whereClause, VariableSpecification case CLUSTERING_COLUMN: Restriction restriction; - if (rel.operator() == Operator.EQ) + if (rel.isEQ() || (def.isPartitionKey() && rel.isIN())) { - Term t = rel.getValue().prepare(keyspace(), def); - t.collectMarkerSpecification(names); - restriction = new SingleColumnRestriction.EQ(t, false); - } - else if (def.kind == ColumnDefinition.Kind.PARTITION_KEY && rel.operator() == Operator.IN) - { - if (rel.getValue() != null) - { - Term t = rel.getValue().prepare(keyspace(), def); - t.collectMarkerSpecification(names); - restriction = new SingleColumnRestriction.InWithMarker((Lists.Marker)t); - } - else - { - List values = new ArrayList(rel.getInValues().size()); - for (Term.Raw raw : rel.getInValues()) - { - Term t = raw.prepare(keyspace(), def); - t.collectMarkerSpecification(names); - values.add(t); - } - restriction = new SingleColumnRestriction.InWithValues(values); - } + restriction = rel.toRestriction(cfm, names); } else { @@ -623,7 +603,8 @@ private static ResultSet buildCasFailureResultSet(ByteBuffer key, ColumnFamily c } for (ColumnDefinition def : columnsWithConditions) defs.add(def); - selection = Selection.forColumns(new ArrayList<>(defs)); + selection = Selection.forColumns(cfm, new ArrayList<>(defs)); + } long now = System.currentTimeMillis(); diff --git a/src/java/org/apache/cassandra/cql3/statements/MultiColumnRestriction.java b/src/java/org/apache/cassandra/cql3/statements/MultiColumnRestriction.java deleted file mode 100644 index 96cb905cbde7..000000000000 --- a/src/java/org/apache/cassandra/cql3/statements/MultiColumnRestriction.java +++ /dev/null @@ -1,137 +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.cql3.statements; - -import org.apache.cassandra.cql3.AbstractMarker; -import org.apache.cassandra.cql3.QueryOptions; -import org.apache.cassandra.cql3.Term; -import org.apache.cassandra.cql3.Tuples; -import org.apache.cassandra.exceptions.InvalidRequestException; - -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.List; - -public interface MultiColumnRestriction extends Restriction -{ - public static class EQ extends SingleColumnRestriction.EQ implements MultiColumnRestriction - { - public EQ(Term value, boolean onToken) - { - super(value, onToken); - } - - public boolean isMultiColumn() - { - return true; - } - - public List values(QueryOptions options) throws InvalidRequestException - { - Tuples.Value t = (Tuples.Value)value.bind(options); - return t.getElements(); - } - } - - public interface IN extends MultiColumnRestriction - { - public List> splitValues(QueryOptions options) throws InvalidRequestException; - } - - /** - * An IN restriction that has a set of terms for in values. - * For example: "SELECT ... WHERE (a, b, c) IN ((1, 2, 3), (4, 5, 6))" or "WHERE (a, b, c) IN (?, ?)" - */ - public static class InWithValues extends SingleColumnRestriction.InWithValues implements MultiColumnRestriction.IN - { - public InWithValues(List values) - { - super(values); - } - - public boolean isMultiColumn() - { - return true; - } - - public List> splitValues(QueryOptions options) throws InvalidRequestException - { - List> buffers = new ArrayList<>(values.size()); - for (Term value : values) - { - Term.MultiItemTerminal term = (Term.MultiItemTerminal)value.bind(options); - buffers.add(term.getElements()); - } - return buffers; - } - } - - /** - * An IN restriction that uses a single marker for a set of IN values that are tuples. - * For example: "SELECT ... WHERE (a, b, c) IN ?" - */ - public static class InWithMarker extends SingleColumnRestriction.InWithMarker implements MultiColumnRestriction.IN - { - public InWithMarker(AbstractMarker marker) - { - super(marker); - } - - public boolean isMultiColumn() - { - return true; - } - - public List> splitValues(QueryOptions options) throws InvalidRequestException - { - Tuples.InMarker inMarker = (Tuples.InMarker)marker; - Tuples.InValue inValue = inMarker.bind(options); - if (inValue == null) - throw new InvalidRequestException("Invalid null value for IN restriction"); - return inValue.getSplitValues(); - } - } - - public static class Slice extends SingleColumnRestriction.Slice implements MultiColumnRestriction - { - public Slice(boolean onToken) - { - super(onToken); - } - - public boolean isMultiColumn() - { - return true; - } - - public ByteBuffer bound(Bound b, QueryOptions options) throws InvalidRequestException - { - throw new UnsupportedOperationException("Multicolumn slice restrictions do not support bound()"); - } - - /** - * Similar to bounds(), but returns one ByteBuffer per-component in the bound instead of a single - * ByteBuffer to represent the entire bound. - */ - public List componentBounds(Bound b, QueryOptions options) throws InvalidRequestException - { - Tuples.Value value = (Tuples.Value)bounds[b.idx].bind(options); - return value.getElements(); - } - } -} diff --git a/src/java/org/apache/cassandra/cql3/statements/RequestValidations.java b/src/java/org/apache/cassandra/cql3/statements/RequestValidations.java new file mode 100644 index 000000000000..ce15e159ef0b --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/statements/RequestValidations.java @@ -0,0 +1,194 @@ +/* + * 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.cql3.statements; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; + +import org.apache.cassandra.exceptions.InvalidRequestException; + +import static org.apache.commons.lang3.ArrayUtils.EMPTY_OBJECT_ARRAY; + +/** + * Utility methods use to perform request validation. + */ +public final class RequestValidations +{ + /** + * Checks that the specified expression is true. If not an InvalidRequestException will + * be thrown. + * + * @param expression the expression to test + * @param messageTemplate the error message + * @param messageArgs the message arguments + * @throws InvalidRequestException if the specified expression is false. + */ + public static void checkTrue(boolean expression, String message) throws InvalidRequestException + { + checkTrue(expression, message, EMPTY_OBJECT_ARRAY); + } + + /** + * Checks that the specified expression is true. If not an InvalidRequestException will + * be thrown. + * + * @param expression the expression to test + * @param messageTemplate the template used to build the error message + * @param messageArgs the message arguments + * @throws InvalidRequestException if the specified expression is false. + */ + public static void checkTrue(boolean expression, + String messageTemplate, + Object... messageArgs) + throws InvalidRequestException + { + if (!expression) + throw invalidRequest(messageTemplate, messageArgs); + } + + /** + * Checks that the specified list does not contains duplicates. + * + * @param list the list to test + * @param messageTemplate the template used to build the error message + * @param messageArgs the message arguments + * @throws InvalidRequestException if the specified list contains duplicates. + */ + public static void checkContainsNoDuplicates(List list, String message) throws InvalidRequestException + { + if (new HashSet<>(list).size() != list.size()) + throw invalidRequest(message); + } + + /** + * Checks that the specified list contains only the specified elements. + * + * @param list the list to test + * @param expectedElements the expected elements + * @param message the error message + * @throws InvalidRequestException if the specified list contains duplicates. + */ + public static void checkContainsOnly(List list, + List expectedElements, + String message) throws InvalidRequestException + { + List copy = new ArrayList<>(list); + copy.removeAll(expectedElements); + if (!copy.isEmpty()) + throw invalidRequest(message); + } + + /** + * Checks that the specified expression is false. If not an InvalidRequestException will + * be thrown. + * + * @param expression the expression to test + * @param messageTemplate the template used to build the error message + * @param messageArgs the message arguments + * @throws InvalidRequestException if the specified expression is true. + */ + public static void checkFalse(boolean expression, + String messageTemplate, + Object... messageArgs) + throws InvalidRequestException + { + checkTrue(!expression, messageTemplate, messageArgs); + } + + /** + * Checks that the specified expression is false. If not an InvalidRequestException will + * be thrown. + * + * @param expression the expression to test + * @param message the error message + * @throws InvalidRequestException if the specified expression is true. + */ + public static void checkFalse(boolean expression, String message) throws InvalidRequestException + { + checkTrue(!expression, message); + } + + /** + * Checks that the specified object is NOT null. + * If it is an InvalidRequestException will be throws. + * + * @param object the object to test + * @param messageTemplate the template used to build the error message + * @param messageArgs the message arguments + * @return the object + * @throws InvalidRequestException if the specified object is null. + */ + public static T checkNotNull(T object, String messageTemplate, Object... messageArgs) + throws InvalidRequestException + { + checkTrue(object != null, messageTemplate, messageArgs); + return object; + } + + /** + * Checks that the specified object is null. + * If it is not an InvalidRequestException will be throws. + * + * @param object the object to test + * @param messageTemplate the template used to build the error message + * @param messageArgs the message arguments + * @return the object + * @throws InvalidRequestException if the specified object is not null. + */ + public static T checkNull(T object, String messageTemplate, Object... messageArgs) + throws InvalidRequestException + { + checkTrue(object == null, messageTemplate, messageArgs); + return object; + } + + /** + * Checks that the specified object is null. + * If it is not an InvalidRequestException will be throws. + * + * @param object the object to test + * @param message the error message + * @return the object + * @throws InvalidRequestException if the specified object is not null. + */ + public static T checkNull(T object, String message) throws InvalidRequestException + { + return checkNull(object, message, EMPTY_OBJECT_ARRAY); + } + + /** + * Returns an InvalidRequestException with the specified message. + * + * @param messageTemplate the template used to build the error message + * @param messageArgs the message arguments + * @return an InvalidRequestException with the specified message. + */ + public static InvalidRequestException invalidRequest(String messageTemplate, Object... messageArgs) + { + return new InvalidRequestException(String.format(messageTemplate, messageArgs)); + } + + /** + * This class must not be instantiated as it only contains static methods. + */ + private RequestValidations() + { + + } +} diff --git a/src/java/org/apache/cassandra/cql3/statements/Restriction.java b/src/java/org/apache/cassandra/cql3/statements/Restriction.java deleted file mode 100644 index b264156e86da..000000000000 --- a/src/java/org/apache/cassandra/cql3/statements/Restriction.java +++ /dev/null @@ -1,79 +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.cql3.statements; - -import java.nio.ByteBuffer; -import java.util.List; - -import org.apache.cassandra.cql3.ColumnIdentifier; -import org.apache.cassandra.cql3.Operator; -import org.apache.cassandra.cql3.QueryOptions; -import org.apache.cassandra.cql3.Term; -import org.apache.cassandra.exceptions.InvalidRequestException; - -/** - * A restriction/clause on a column. - * The goal of this class being to group all conditions for a column in a SELECT. - */ -public interface Restriction -{ - public boolean isOnToken(); - - public boolean isSlice(); - public boolean isEQ(); - public boolean isIN(); - public boolean isContains(); - public boolean isMultiColumn(); - - /** - * Returns true if, when applied to a clustering column, this restriction can be handled through one or more slices - * alone without filtering. For example, EQ restrictions can be represented as a slice, but CONTAINS cannot. - */ - public boolean canEvaluateWithSlices(); - - // Not supported by Slice, but it's convenient to have here - public List values(QueryOptions options) throws InvalidRequestException; - - boolean usesFunction(String ksName, String functionName); - - public static interface EQ extends Restriction {} - - public static interface IN extends Restriction - { - public boolean canHaveOnlyOneValue(); - } - - public static interface Slice extends Restriction - { - public List values(QueryOptions options) throws InvalidRequestException; - - /** Returns true if the start or end bound (depending on the argument) is set, false otherwise */ - public boolean hasBound(Bound b); - - public ByteBuffer bound(Bound b, QueryOptions options) throws InvalidRequestException; - - /** Returns true if the start or end bound (depending on the argument) is inclusive, false otherwise */ - public boolean isInclusive(Bound b); - - public Operator getRelation(Bound eocBound, Bound inclusiveBound); - - public Operator getIndexOperator(Bound b); - - public void setBound(ColumnIdentifier name, Operator type, Term t) throws InvalidRequestException; - } -} diff --git a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java index 3360d4090f48..022105caa8b6 100644 --- a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java @@ -20,41 +20,50 @@ import java.nio.ByteBuffer; import java.util.*; -import com.google.common.base.Joiner; import com.google.common.base.Objects; import com.google.common.base.Predicate; -import com.google.common.collect.AbstractIterator; import com.google.common.collect.Iterables; import com.google.common.collect.Iterators; import org.apache.cassandra.auth.Permission; +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.ColumnDefinition; import org.apache.cassandra.cql3.*; -import org.apache.cassandra.cql3.statements.SingleColumnRestriction.Contains; +import org.apache.cassandra.cql3.restrictions.StatementRestrictions; import org.apache.cassandra.cql3.selection.RawSelector; import org.apache.cassandra.cql3.selection.Selection; -import org.apache.cassandra.db.composites.*; -import org.apache.cassandra.db.composites.Composite.EOC; -import org.apache.cassandra.transport.messages.ResultMessage; -import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.config.ColumnDefinition; import org.apache.cassandra.db.*; -import org.apache.cassandra.db.filter.*; -import org.apache.cassandra.db.index.SecondaryIndex; +import org.apache.cassandra.db.composites.CellName; +import org.apache.cassandra.db.composites.CellNameType; +import org.apache.cassandra.db.composites.Composite; +import org.apache.cassandra.db.composites.Composites; +import org.apache.cassandra.db.filter.ColumnSlice; +import org.apache.cassandra.db.filter.IDiskAtomFilter; +import org.apache.cassandra.db.filter.NamesQueryFilter; +import org.apache.cassandra.db.filter.SliceQueryFilter; import org.apache.cassandra.db.index.SecondaryIndexManager; -import org.apache.cassandra.db.marshal.*; -import org.apache.cassandra.dht.*; +import org.apache.cassandra.db.marshal.CollectionType; +import org.apache.cassandra.db.marshal.CompositeType; +import org.apache.cassandra.db.marshal.Int32Type; +import org.apache.cassandra.dht.AbstractBounds; import org.apache.cassandra.exceptions.*; +import org.apache.cassandra.serializers.MarshalException; import org.apache.cassandra.service.ClientState; import org.apache.cassandra.service.QueryState; import org.apache.cassandra.service.StorageProxy; -import org.apache.cassandra.service.StorageService; -import org.apache.cassandra.service.pager.*; -import org.apache.cassandra.db.ConsistencyLevel; +import org.apache.cassandra.service.pager.Pageable; +import org.apache.cassandra.service.pager.QueryPager; +import org.apache.cassandra.service.pager.QueryPagers; import org.apache.cassandra.thrift.ThriftValidation; -import org.apache.cassandra.serializers.MarshalException; +import org.apache.cassandra.transport.messages.ResultMessage; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; +import static org.apache.cassandra.cql3.statements.RequestValidations.checkFalse; +import static org.apache.cassandra.cql3.statements.RequestValidations.checkNotNull; +import static org.apache.cassandra.cql3.statements.RequestValidations.checkTrue; +import static org.apache.cassandra.cql3.statements.RequestValidations.invalidRequest; + /** * Encapsulates a completely parsed SELECT query, including the target * column family, expression, result count, and ordering clause. @@ -70,96 +79,43 @@ public class SelectStatement implements CQLStatement private final Selection selection; private final Term limit; - /** Restrictions on partitioning columns */ - private final Restriction[] keyRestrictions; - - /** Restrictions on clustering columns */ - private final Restriction[] columnRestrictions; - - /** Restrictions on non-primary key columns (i.e. secondary index restrictions) */ - private final Map metadataRestrictions = new HashMap(); - - // All restricted columns not covered by the key or index filter - private final Set restrictedColumns = new HashSet(); - private Restriction.Slice sliceRestriction; - - private boolean isReversed; - private boolean onToken; - private boolean isKeyRange; - private boolean keyIsInRelation; - private boolean usesSecondaryIndexing; + private final StatementRestrictions restrictions; - private Map orderingIndexes; + private final boolean isReversed; - private boolean selectsStaticColumns; - private boolean selectsOnlyStaticColumns; + /** + * The comparator used to orders results when multiple keys are selected (using IN). + */ + private final Comparator> orderingComparator; // Used by forSelection below private static final Parameters defaultParameters = new Parameters(Collections.emptyMap(), false, false); - private static final Predicate isStaticFilter = new Predicate() - { - public boolean apply(ColumnDefinition def) - { - return def.isStatic(); - } - }; - - public SelectStatement(CFMetaData cfm, int boundTerms, Parameters parameters, Selection selection, Term limit) + public SelectStatement(CFMetaData cfm, + int boundTerms, + Parameters parameters, + Selection selection, + StatementRestrictions restrictions, + boolean isReversed, + Comparator> orderingComparator, + Term limit) { this.cfm = cfm; this.boundTerms = boundTerms; this.selection = selection; - this.keyRestrictions = new Restriction[cfm.partitionKeyColumns().size()]; - this.columnRestrictions = new Restriction[cfm.clusteringColumns().size()]; + this.restrictions = restrictions; + this.isReversed = isReversed; + this.orderingComparator = orderingComparator; this.parameters = parameters; this.limit = limit; - - // Now gather a few info on whether we should bother with static columns or not for this statement - initStaticColumnsInfo(); } + @Override public boolean usesFunction(String ksName, String functionName) { - if (selection.usesFunction(ksName, functionName)) - return true; - if (limit != null && limit.usesFunction(ksName, functionName)) - return true; - for (Restriction restriction : metadataRestrictions.values()) - if (restriction != null && restriction.usesFunction(ksName, functionName)) - return true; - for (Restriction restriction : keyRestrictions) - if (restriction != null && restriction.usesFunction(ksName, functionName)) - return true; - for (Restriction restriction : columnRestrictions) - if (restriction != null && restriction.usesFunction(ksName, functionName)) - return true; - return false; - } - - private void initStaticColumnsInfo() - { - if (!cfm.hasStaticColumns()) - return; - - // If it's a wildcard, we do select static but not only them - if (selection.isWildcard()) - { - selectsStaticColumns = true; - return; - } - - // Otherwise, check the selected columns - selectsStaticColumns = !Iterables.isEmpty(Iterables.filter(selection.getColumns(), isStaticFilter)); - selectsOnlyStaticColumns = true; - for (ColumnDefinition def : selection.getColumns()) - { - if (def.kind != ColumnDefinition.Kind.PARTITION_KEY && def.kind != ColumnDefinition.Kind.STATIC) - { - selectsOnlyStaticColumns = false; - break; - } - } + return selection.usesFunction(ksName, functionName) + || restrictions.usesFunction(ksName, functionName) + || (limit != null && limit.usesFunction(ksName, functionName)); } // Creates a simple select based on the given selection. @@ -167,7 +123,14 @@ private void initStaticColumnsInfo() // queried data through processColumnFamily. static SelectStatement forSelection(CFMetaData cfm, Selection selection) { - return new SelectStatement(cfm, 0, defaultParameters, selection, null); + return new SelectStatement(cfm, + 0, + defaultParameters, + selection, + StatementRestrictions.empty(cfm), + false, + null, + null); } public ResultSet.Metadata getResultMetadata() @@ -193,8 +156,7 @@ public void validate(ClientState state) throws InvalidRequestException public ResultMessage.Rows execute(QueryState state, QueryOptions options) throws RequestExecutionException, RequestValidationException { ConsistencyLevel cl = options.getConsistency(); - if (cl == null) - throw new InvalidRequestException("Invalid empty consistency level"); + checkNotNull(cl, "Invalid empty consistency level"); cl.validateForRead(keyspace()); @@ -216,13 +178,14 @@ public ResultMessage.Rows execute(QueryState state, QueryOptions options) throws } QueryPager pager = QueryPagers.pager(command, cl, state.getClientState(), options.getPagingState()); + if (selection.isAggregate()) return pageAggregateQuery(pager, options, pageSize, now); // We can't properly do post-query ordering if we page (see #6722) - if (needsPostQueryOrdering()) - throw new InvalidRequestException("Cannot page queries with both ORDER BY and a IN restriction on the partition key; you must either remove the " - + "ORDER BY or the IN and sort client side, or disable paging for this query"); + checkFalse(needsPostQueryOrdering(), + "Cannot page queries with both ORDER BY and a IN restriction on the partition key;" + + " you must either remove the ORDER BY or the IN and sort client side, or disable paging for this query"); List page = pager.fetchPage(pageSize); ResultMessage.Rows msg = processResults(page, options, limit, now); @@ -236,7 +199,7 @@ public ResultMessage.Rows execute(QueryState state, QueryOptions options) throws private Pageable getPageableCommand(QueryOptions options, int limit, long now) throws RequestValidationException { int limitForQuery = updateLimitForQuery(limit); - if (isKeyRange || usesSecondaryIndexing) + if (restrictions.isKeyRange() || restrictions.usesSecondaryIndexing()) return getRangeCommand(options, limitForQuery, now); List commands = getSliceCommands(options, limitForQuery, now); @@ -330,9 +293,7 @@ public String columnFamily() private List getSliceCommands(QueryOptions options, int limit, long now) throws RequestValidationException { - Collection keys = getKeys(options); - if (keys.isEmpty()) // in case of IN () for (the last column of) the partition key. - return null; + Collection keys = restrictions.getPartitionKeys(options); List commands = new ArrayList<>(keys.size()); @@ -363,69 +324,12 @@ private RangeSliceCommand getRangeCommand(QueryOptions options, int limit, long List expressions = getValidatedIndexExpressions(options); // The LIMIT provided by the user is the number of CQL row he wants returned. // We want to have getRangeSlice to count the number of columns, not the number of keys. - AbstractBounds keyBounds = getKeyBounds(options); + AbstractBounds keyBounds = restrictions.getPartitionKeyBounds(options); return keyBounds == null ? null : new RangeSliceCommand(keyspace(), columnFamily(), now, filter, keyBounds, expressions, limit, !parameters.isDistinct, false); } - private AbstractBounds getKeyBounds(QueryOptions options) throws InvalidRequestException - { - IPartitioner p = StorageService.getPartitioner(); - - if (onToken) - { - Token startToken = getTokenBound(Bound.START, options, p); - Token endToken = getTokenBound(Bound.END, options, p); - - boolean includeStart = includeKeyBound(Bound.START); - boolean includeEnd = includeKeyBound(Bound.END); - - /* - * If we ask SP.getRangeSlice() for (token(200), token(200)], it will happily return the whole ring. - * However, wrapping range doesn't really make sense for CQL, and we want to return an empty result - * in that case (CASSANDRA-5573). So special case to create a range that is guaranteed to be empty. - * - * In practice, we want to return an empty result set if either startToken > endToken, or both are - * equal but one of the bound is excluded (since [a, a] can contains something, but not (a, a], [a, a) - * or (a, a)). Note though that in the case where startToken or endToken is the minimum token, then - * this special case rule should not apply. - */ - int cmp = startToken.compareTo(endToken); - if (!startToken.isMinimum() && !endToken.isMinimum() && (cmp > 0 || (cmp == 0 && (!includeStart || !includeEnd)))) - return null; - - RowPosition start = includeStart ? startToken.minKeyBound() : startToken.maxKeyBound(); - RowPosition end = includeEnd ? endToken.maxKeyBound() : endToken.minKeyBound(); - - return new Range(start, end); - } - else - { - ByteBuffer startKeyBytes = getKeyBound(Bound.START, options); - ByteBuffer finishKeyBytes = getKeyBound(Bound.END, options); - - RowPosition startKey = RowPosition.ForKey.get(startKeyBytes, p); - RowPosition finishKey = RowPosition.ForKey.get(finishKeyBytes, p); - - if (startKey.compareTo(finishKey) > 0 && !finishKey.isMinimum()) - return null; - - if (includeKeyBound(Bound.START)) - { - return includeKeyBound(Bound.END) - ? new Bounds(startKey, finishKey) - : new IncludingExcludingBounds(startKey, finishKey); - } - else - { - return includeKeyBound(Bound.END) - ? new Range(startKey, finishKey) - : new ExcludingBounds(startKey, finishKey); - } - } - } - private ColumnSlice makeStaticSlice() { // Note: we could use staticPrefix.start() for the start bound, but EMPTY gives us the @@ -444,18 +348,18 @@ private IDiskAtomFilter makeFilter(QueryOptions options, int limit) // For distinct, we only care about fetching the beginning of each partition. If we don't have // static columns, we in fact only care about the first cell, so we query only that (we don't "group"). // If we do have static columns, we do need to fetch the first full group (to have the static columns values). - return new SliceQueryFilter(ColumnSlice.ALL_COLUMNS_ARRAY, false, 1, selectsStaticColumns ? toGroup : -1); + return new SliceQueryFilter(ColumnSlice.ALL_COLUMNS_ARRAY, false, 1, selection.containsStaticColumns() ? toGroup : -1); } - else if (isColumnRange()) + else if (restrictions.isColumnRange()) { - List startBounds = getRequestedBound(Bound.START, options); - List endBounds = getRequestedBound(Bound.END, options); + List startBounds = restrictions.getClusteringColumnsBoundsAsComposites(Bound.START, options); + List endBounds = restrictions.getClusteringColumnsBoundsAsComposites(Bound.END, options); assert startBounds.size() == endBounds.size(); // Handles fetching static columns. Note that for 2i, the filter is just used to restrict // the part of the index to query so adding the static slice would be useless and confusing. // For 2i, static columns are retrieve in CompositesSearcher with each index hit. - ColumnSlice staticSlice = selectsStaticColumns && !usesSecondaryIndexing + ColumnSlice staticSlice = selection.containsStaticColumns() && !restrictions.usesSecondaryIndexing() ? makeStaticSlice() : null; @@ -550,187 +454,41 @@ private SliceQueryFilter sliceFilter(ColumnSlice[] slices, int limit, int toGrou private int getLimit(QueryOptions options) throws InvalidRequestException { - int l = Integer.MAX_VALUE; if (limit != null) { - ByteBuffer b = limit.bindAndGet(options); - if (b == null) - throw new InvalidRequestException("Invalid null value of limit"); + ByteBuffer b = checkNotNull(limit.bindAndGet(options), "Invalid null value of limit"); try { Int32Type.instance.validate(b); - l = Int32Type.instance.compose(b); + int l = Int32Type.instance.compose(b); + checkTrue(l > 0, "LIMIT must be strictly positive"); + return l; } catch (MarshalException e) { throw new InvalidRequestException("Invalid limit value"); } } - - if (l <= 0) - throw new InvalidRequestException("LIMIT must be strictly positive"); - - return l; + return Integer.MAX_VALUE; } private int updateLimitForQuery(int limit) { // Internally, we don't support exclusive bounds for slices. Instead, we query one more element if necessary // and exclude it later (in processColumnFamily) - return sliceRestriction != null && (!sliceRestriction.isInclusive(Bound.START) || !sliceRestriction.isInclusive(Bound.END)) && limit != Integer.MAX_VALUE + return restrictions.isNonCompositeSliceWithExclusiveBounds() && limit != Integer.MAX_VALUE ? limit + 1 : limit; } - private Collection getKeys(final QueryOptions options) throws InvalidRequestException - { - List keys = new ArrayList(); - CBuilder builder = cfm.getKeyValidatorAsCType().builder(); - for (ColumnDefinition def : cfm.partitionKeyColumns()) - { - Restriction r = keyRestrictions[def.position()]; - assert r != null && !r.isSlice(); - - List values = r.values(options); - - if (builder.remainingCount() == 1) - { - for (ByteBuffer val : values) - { - if (val == null) - throw new InvalidRequestException(String.format("Invalid null value for partition key part %s", def.name)); - keys.add(builder.buildWith(val).toByteBuffer()); - } - } - else - { - // Note: for backward compatibility reasons, we let INs with 1 value slide - if (values.size() != 1) - throw new InvalidRequestException("IN is only supported on the last column of the partition key"); - ByteBuffer val = values.get(0); - if (val == null) - throw new InvalidRequestException(String.format("Invalid null value for partition key part %s", def.name)); - builder.add(val); - } - } - return keys; - } - - private ByteBuffer getKeyBound(Bound b, QueryOptions options) throws InvalidRequestException - { - // Deal with unrestricted partition key components (special-casing is required to deal with 2i queries on the first - // component of a composite partition key). - for (int i = 0; i < keyRestrictions.length; i++) - if (keyRestrictions[i] == null) - return ByteBufferUtil.EMPTY_BYTE_BUFFER; - - // We deal with IN queries for keys in other places, so we know buildBound will return only one result - return buildBound(b, cfm.partitionKeyColumns(), keyRestrictions, false, cfm.getKeyValidatorAsCType(), options).get(0).toByteBuffer(); - } - - private Token getTokenBound(Bound b, QueryOptions options, IPartitioner p) throws InvalidRequestException - { - assert onToken; - - Restriction restriction = keyRestrictions[0]; - - assert !restriction.isMultiColumn() : "Unexpectedly got a multi-column restriction on a partition key for a range query"; - SingleColumnRestriction keyRestriction = (SingleColumnRestriction)restriction; - - ByteBuffer value; - if (keyRestriction.isEQ()) - { - value = keyRestriction.values(options).get(0); - } - else - { - SingleColumnRestriction.Slice slice = (SingleColumnRestriction.Slice)keyRestriction; - if (!slice.hasBound(b)) - return p.getMinimumToken(); - - value = slice.bound(b, options); - } - - if (value == null) - throw new InvalidRequestException("Invalid null token value"); - return p.getTokenFactory().fromByteArray(value); - } - - private boolean includeKeyBound(Bound b) - { - for (Restriction r : keyRestrictions) - { - if (r == null) - return true; - else if (r.isSlice()) - { - assert !r.isMultiColumn() : "Unexpectedly got multi-column restriction on partition key"; - return ((SingleColumnRestriction.Slice)r).isInclusive(b); - } - } - // All equality - return true; - } - - private boolean isColumnRange() - { - // Due to CASSANDRA-5762, we always do a slice for CQL3 tables (not dense, composite). - // Static CF (non dense but non composite) never entails a column slice however - if (!cfm.comparator.isDense()) - return cfm.comparator.isCompound(); - - // Otherwise (i.e. for compact table where we don't have a row marker anyway and thus don't care about CASSANDRA-5762), - // it is a range query if it has at least one the column alias for which no relation is defined or is not EQ. - for (Restriction r : columnRestrictions) - { - if (r == null || r.isSlice()) - return true; - } - return false; - } - private SortedSet getRequestedColumns(QueryOptions options) throws InvalidRequestException { // Note: getRequestedColumns don't handle static columns, but due to CASSANDRA-5762 // we always do a slice for CQL3 tables, so it's ok to ignore them here - assert !isColumnRange(); - - CompositesBuilder builder = new CompositesBuilder(cfm.comparator.prefixBuilder(), cfm.comparator); - Iterator idIter = cfm.clusteringColumns().iterator(); - for (int i = 0; i < columnRestrictions.length; i++) - { - Restriction r = columnRestrictions[i]; - ColumnDefinition def = idIter.next(); - assert r != null && !r.isSlice(); - - if (r.isEQ() || !r.isMultiColumn()) - { - List values = r.values(options); - if (values.isEmpty()) - return null; - builder.addEachElementToAll(values); - } - else - { - // we have a multi-column IN restriction - List> splitValues = ((MultiColumnRestriction.IN) r).splitValues(options); - if (splitValues.isEmpty()) - return null; - - builder.addAllElementsToAll(splitValues); - - // increment i to skip the remainder of the multicolumn restriction - i += splitValues.get(0).size() - 1; - } - - if (builder.containsNull()) - throw new InvalidRequestException(String.format("Invalid null value for clustering key part %s", - def.name)); - } - - SortedSet columns = new TreeSet<>(cfm.comparator); - for (Composite composite : builder.build()) + assert !restrictions.isColumnRange(); + SortedSet columns = new TreeSet(cfm.comparator); + for (Composite composite : restrictions.getClusteringColumnsAsComposites(options)) columns.addAll(addSelectedColumns(composite)); return columns; } @@ -743,10 +501,6 @@ private SortedSet addSelectedColumns(Composite prefix) } else { - // Collections require doing a slice query because a given collection is a - // non-know set of columns, so we shouldn't get there - assert !selectACollection(); - SortedSet columns = new TreeSet(cfm.comparator); // We need to query the selected column as well as the marker @@ -760,7 +514,7 @@ private SortedSet addSelectedColumns(Composite prefix) // selected columns for (ColumnDefinition def : selection.getColumns()) - if (def.kind == ColumnDefinition.Kind.REGULAR || def.kind == ColumnDefinition.Kind.STATIC) + if (def.isRegular() || def.isStatic()) columns.add(cfm.comparator.create(prefix, def)); } else @@ -773,368 +527,45 @@ private SortedSet addSelectedColumns(Composite prefix) } } - /** Returns true if a non-frozen collection is selected, false otherwise. */ - private boolean selectACollection() - { - if (!cfm.comparator.hasCollections()) - return false; - - for (ColumnDefinition def : selection.getColumns()) - { - if (def.type.isCollection() && def.type.isMultiCell()) - return true; - } - - return false; - } - - private static List buildBound(Bound bound, - List defs, - Restriction[] restrictions, - boolean isReversed, - CType type, - QueryOptions options) throws InvalidRequestException - { - CBuilder builder = type.builder(); - - // check the first restriction to see if we're dealing with a multi-column restriction - if (!defs.isEmpty()) - { - Restriction firstRestriction = restrictions[0]; - if (firstRestriction != null && firstRestriction.isMultiColumn()) - { - if (firstRestriction.isSlice()) - return buildMultiColumnSliceBound(bound, defs, (MultiColumnRestriction.Slice) firstRestriction, isReversed, builder, options); - else if (firstRestriction.isIN()) - return buildMultiColumnInBound(bound, defs, (MultiColumnRestriction.IN) firstRestriction, isReversed, builder, type, options); - else - return buildMultiColumnEQBound(bound, defs, (MultiColumnRestriction.EQ) firstRestriction, isReversed, builder, options); - } - } - - CompositesBuilder compositeBuilder = new CompositesBuilder(builder, isReversed ? type.reverseComparator() : type); - // The end-of-component of composite doesn't depend on whether the - // component type is reversed or not (i.e. the ReversedType is applied - // to the component comparator but not to the end-of-component itself), - // it only depends on whether the slice is reversed - Bound eocBound = isReversed ? Bound.reverse(bound) : bound; - for (Iterator iter = defs.iterator(); iter.hasNext();) - { - ColumnDefinition def = iter.next(); - - // In a restriction, we always have Bound.START < Bound.END for the "base" comparator. - // So if we're doing a reverse slice, we must inverse the bounds when giving them as start and end of the slice filter. - // But if the actual comparator itself is reversed, we must inversed the bounds too. - Bound b = isReversed == isReversedType(def) ? bound : Bound.reverse(bound); - Restriction r = restrictions[def.position()]; - if (isNullRestriction(r, b) || !r.canEvaluateWithSlices()) - { - // There wasn't any non EQ relation on that key, we select all records having the preceding component as prefix. - // For composites, if there was preceding component and we're computing the end, we must change the last component - // End-Of-Component, otherwise we would be selecting only one record. - EOC eoc = !compositeBuilder.isEmpty() && eocBound == Bound.END ? EOC.END : EOC.NONE; - return compositeBuilder.buildWithEOC(eoc); - } - if (r.isSlice()) - { - compositeBuilder.addElementToAll(getSliceValue(r, b, options)); - Operator relType = ((Restriction.Slice) r).getRelation(eocBound, b); - return compositeBuilder.buildWithEOC(eocForRelation(relType)); - } - - compositeBuilder.addEachElementToAll(r.values(options)); - - if (compositeBuilder.containsNull()) - throw new InvalidRequestException( - String.format("Invalid null clustering key part %s", def.name)); - } - // Means no relation at all or everything was an equal - // Note: if the builder is "full", there is no need to use the end-of-component bit. For columns selection, - // it would be harmless to do it. However, we use this method got the partition key too. And when a query - // with 2ndary index is done, and with the the partition provided with an EQ, we'll end up here, and in that - // case using the eoc would be bad, since for the random partitioner we have no guarantee that - // prefix.end() will sort after prefix (see #5240). - EOC eoc = eocBound == Bound.END && compositeBuilder.hasRemaining() ? EOC.END : EOC.NONE; - return compositeBuilder.buildWithEOC(eoc); - } - - private static Composite.EOC eocForRelation(Operator op) - { - switch (op) - { - case LT: - // < X => using startOf(X) as finish bound - return Composite.EOC.START; - case GT: - case LTE: - // > X => using endOf(X) as start bound - // <= X => using endOf(X) as finish bound - return Composite.EOC.END; - default: - // >= X => using X as start bound (could use START_OF too) - // = X => using X - return Composite.EOC.NONE; - } - } - - private static List buildMultiColumnSliceBound(Bound bound, - List defs, - MultiColumnRestriction.Slice slice, - boolean isReversed, - CBuilder builder, - QueryOptions options) throws InvalidRequestException - { - Bound eocBound = isReversed ? Bound.reverse(bound) : bound; - - Iterator iter = defs.iterator(); - ColumnDefinition firstName = iter.next(); - // A hack to preserve pre-6875 behavior for tuple-notation slices where the comparator mixes ASCENDING - // and DESCENDING orders. This stores the bound for the first component; we will re-use it for all following - // components, even if they don't match the first component's reversal/non-reversal. Note that this does *not* - // guarantee correct query results, it just preserves the previous behavior. - Bound firstComponentBound = isReversed == isReversedType(firstName) ? bound : Bound.reverse(bound); - - if (!slice.hasBound(firstComponentBound)) - { - Composite prefix = builder.build(); - return Collections.singletonList(builder.remainingCount() > 0 && eocBound == Bound.END - ? prefix.end() - : prefix); - } - - List vals = slice.componentBounds(firstComponentBound, options); - - ByteBuffer v = vals.get(firstName.position()); - if (v == null) - throw new InvalidRequestException("Invalid null value in condition for column " + firstName.name); - builder.add(v); - - while (iter.hasNext()) - { - ColumnDefinition def = iter.next(); - if (def.position() >= vals.size()) - break; - - v = vals.get(def.position()); - if (v == null) - throw new InvalidRequestException("Invalid null value in condition for column " + def.name); - builder.add(v); - } - Operator relType = slice.getRelation(eocBound, firstComponentBound); - return Collections.singletonList(builder.build().withEOC(eocForRelation(relType))); - } - - private static List buildMultiColumnInBound(Bound bound, - List defs, - MultiColumnRestriction.IN restriction, - boolean isReversed, - CBuilder builder, - CType type, - QueryOptions options) throws InvalidRequestException - { - List> splitInValues = restriction.splitValues(options); - Bound eocBound = isReversed ? Bound.reverse(bound) : bound; - - // The IN query might not have listed the values in comparator order, so we need to re-sort - // the bounds lists to make sure the slices works correctly (also, to avoid duplicates). - TreeSet inValues = new TreeSet<>(isReversed ? type.reverseComparator() : type); - for (List components : splitInValues) - { - for (int i = 0; i < components.size(); i++) - if (components.get(i) == null) - throw new InvalidRequestException("Invalid null value in condition for column " + defs.get(i)); - - Composite prefix = builder.buildWith(components); - inValues.add(eocBound == Bound.END && builder.remainingCount() - components.size() > 0 - ? prefix.end() - : prefix); - } - return new ArrayList<>(inValues); - } - - private static List buildMultiColumnEQBound(Bound bound, - List defs, - MultiColumnRestriction.EQ restriction, - boolean isReversed, - CBuilder builder, - QueryOptions options) throws InvalidRequestException - { - Bound eocBound = isReversed ? Bound.reverse(bound) : bound; - List values = restriction.values(options); - for (int i = 0; i < values.size(); i++) - { - ByteBuffer component = values.get(i); - if (component == null) - throw new InvalidRequestException("Invalid null value in condition for column " + defs.get(i)); - builder.add(component); - } - - Composite prefix = builder.build(); - return Collections.singletonList(builder.remainingCount() > 0 && eocBound == Bound.END - ? prefix.end() - : prefix); - } - - private static boolean isNullRestriction(Restriction r, Bound b) - { - return r == null || (r.isSlice() && !((Restriction.Slice)r).hasBound(b)); - } - - private static ByteBuffer getSliceValue(Restriction r, Bound b, QueryOptions options) throws InvalidRequestException - { - Restriction.Slice slice = (Restriction.Slice)r; - assert slice.hasBound(b); - ByteBuffer val = slice.bound(b, options); - if (val == null) - throw new InvalidRequestException(String.format("Invalid null clustering key part %s", r)); - return val; - } - - private List getRequestedBound(Bound b, QueryOptions options) throws InvalidRequestException - { - assert isColumnRange(); - return buildBound(b, cfm.clusteringColumns(), columnRestrictions, isReversed, cfm.comparator, options); - } - public List getValidatedIndexExpressions(QueryOptions options) throws InvalidRequestException { - if (!usesSecondaryIndexing || restrictedColumns.isEmpty()) + if (!restrictions.usesSecondaryIndexing()) return Collections.emptyList(); - List expressions = new ArrayList(); - for (ColumnDefinition def : restrictedColumns) - { - Restriction restriction; - switch (def.kind) - { - case PARTITION_KEY: - restriction = keyRestrictions[def.position()]; - break; - case CLUSTERING_COLUMN: - restriction = columnRestrictions[def.position()]; - break; - case REGULAR: - case STATIC: - restriction = metadataRestrictions.get(def.name); - break; - default: - // We don't allow restricting a COMPACT_VALUE for now in prepare. - throw new AssertionError(); - } - - if (restriction.isSlice()) - { - Restriction.Slice slice = (Restriction.Slice)restriction; - for (Bound b : Bound.values()) - { - if (slice.hasBound(b)) - { - ByteBuffer value = validateIndexedValue(def, slice.bound(b, options)); - Operator op = slice.getIndexOperator(b); - // If the underlying comparator for name is reversed, we need to reverse the IndexOperator: user operation - // always refer to the "forward" sorting even if the clustering order is reversed, but the 2ndary code does - // use the underlying comparator as is. - if (def.type instanceof ReversedType) - op = reverse(op); - expressions.add(new IndexExpression(def.name.bytes, op, value)); - } - } - } - else if (restriction.isContains()) - { - SingleColumnRestriction.Contains contains = (SingleColumnRestriction.Contains)restriction; - for (ByteBuffer value : contains.values(options)) - { - validateIndexedValue(def, value); - expressions.add(new IndexExpression(def.name.bytes, Operator.CONTAINS, value)); - } - for (ByteBuffer key : contains.keys(options)) - { - validateIndexedValue(def, key); - expressions.add(new IndexExpression(def.name.bytes, Operator.CONTAINS_KEY, key)); - } - } - else - { - List values = restriction.values(options); - - if (values.size() != 1) - throw new InvalidRequestException("IN restrictions are not supported on indexed columns"); + List expressions = restrictions.getIndexExpressions(options); - ByteBuffer value = validateIndexedValue(def, values.get(0)); - expressions.add(new IndexExpression(def.name.bytes, Operator.EQ, value)); - } - } + ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(columnFamily()); + SecondaryIndexManager secondaryIndexManager = cfs.indexManager; + secondaryIndexManager.validateIndexSearchersForQuery(expressions); - if (usesSecondaryIndexing) - { - ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(columnFamily()); - SecondaryIndexManager secondaryIndexManager = cfs.indexManager; - secondaryIndexManager.validateIndexSearchersForQuery(expressions); - } - return expressions; } - private static ByteBuffer validateIndexedValue(ColumnDefinition def, ByteBuffer value) throws InvalidRequestException - { - if (value == null) - throw new InvalidRequestException(String.format("Unsupported null value for indexed column %s", def.name)); - if (value.remaining() > 0xFFFF) - throw new InvalidRequestException("Index expression values may not be larger than 64K"); - return value; - } - private CellName makeExclusiveSliceBound(Bound bound, CellNameType type, QueryOptions options) throws InvalidRequestException { - if (sliceRestriction.isInclusive(bound)) + if (restrictions.areRequestedBoundsInclusive(bound)) return null; - if (sliceRestriction.isMultiColumn()) - return type.makeCellName(((MultiColumnRestriction.Slice) sliceRestriction).componentBounds(bound, options).toArray()); - else - return type.makeCellName(sliceRestriction.bound(bound, options)); + return type.makeCellName(restrictions.getClusteringColumnsBounds(bound, options).get(0)); } private Iterator applySliceRestriction(final Iterator cells, final QueryOptions options) throws InvalidRequestException { - assert sliceRestriction != null; - final CellNameType type = cfm.comparator; + final CellName excludedStart = makeExclusiveSliceBound(Bound.START, type, options); final CellName excludedEnd = makeExclusiveSliceBound(Bound.END, type, options); - return new AbstractIterator() + return Iterators.filter(cells, new Predicate() { - protected Cell computeNext() + public boolean apply(Cell c) { - while (cells.hasNext()) - { - Cell c = cells.next(); - - // For dynamic CF, the column could be out of the requested bounds (because we don't support strict bounds internally (unless - // the comparator is composite that is)), filter here - if ( (excludedStart != null && type.compare(c.name(), excludedStart) == 0) - || (excludedEnd != null && type.compare(c.name(), excludedEnd) == 0) ) - continue; - - return c; - } - return endOfData(); + // For dynamic CF, the column could be out of the requested bounds (because we don't support strict bounds internally (unless + // the comparator is composite that is)), filter here + return !((excludedStart != null && type.compare(c.name(), excludedStart) == 0) + || (excludedEnd != null && type.compare(c.name(), excludedEnd) == 0)); } - }; - } - - private static Operator reverse(Operator op) - { - switch (op) - { - case LT: return Operator.GT; - case LTE: return Operator.GTE; - case GT: return Operator.LT; - case GTE: return Operator.LTE; - default: return op; - } + }); } private ResultSet process(List rows, QueryOptions options, int limit, long now) throws InvalidRequestException @@ -1178,7 +609,7 @@ void processColumnFamily(ByteBuffer key, ColumnFamily cf, QueryOptions options, } Iterator cells = cf.getSortedColumns().iterator(); - if (sliceRestriction != null) + if (restrictions.isNonCompositeSliceWithExclusiveBounds()) cells = applySliceRestriction(cells, options); CQL3Row.RowIterator iter = cfm.comparator.CQL3RowBuilder(cfm, now).group(cells); @@ -1187,7 +618,7 @@ void processColumnFamily(ByteBuffer key, ColumnFamily cf, QueryOptions options, // partition selection (i.e. not a 2ndary index search and there was no condition on clustering columns) // then we want to include the static columns in the result set (and we're done). CQL3Row staticRow = iter.getStaticRow(); - if (staticRow != null && !iter.hasNext() && !usesSecondaryIndexing && hasNoClusteringColumnsRestriction()) + if (staticRow != null && !iter.hasNext() && !restrictions.usesSecondaryIndexing() && restrictions.hasNoClusteringColumnsRestriction()) { result.newRow(options.getProtocolVersion()); for (ColumnDefinition def : selection.getColumns()) @@ -1259,18 +690,10 @@ private static void addValue(Selection.ResultSetBuilder result, ColumnDefinition result.add(row.getColumn(def.name)); } - private boolean hasNoClusteringColumnsRestriction() - { - for (int i = 0; i < columnRestrictions.length; i++) - if (columnRestrictions[i] != null) - return false; - return true; - } - private boolean needsPostQueryOrdering() { // We need post-query ordering only for queries with IN on the partition key and an ORDER BY. - return keyIsInRelation && !parameters.orderings.isEmpty(); + return restrictions.keyIsInRelation() && !parameters.orderings.isEmpty(); } /** @@ -1281,83 +704,7 @@ private void orderResults(ResultSet cqlRows) if (cqlRows.size() == 0 || !needsPostQueryOrdering()) return; - assert orderingIndexes != null; - - List idToSort = new ArrayList(); - List> sorters = new ArrayList>(); - - for (ColumnIdentifier.Raw identifier : parameters.orderings.keySet()) - { - ColumnDefinition orderingColumn = cfm.getColumnDefinition(identifier.prepare(cfm)); - idToSort.add(orderingIndexes.get(orderingColumn.name)); - sorters.add(orderingColumn.type); - } - - Comparator> comparator = idToSort.size() == 1 - ? new SingleColumnComparator(idToSort.get(0), sorters.get(0)) - : new CompositeComparator(sorters, idToSort); - Collections.sort(cqlRows.rows, comparator); - } - - private static boolean isReversedType(ColumnDefinition def) - { - return def.type instanceof ReversedType; - } - - private boolean columnFilterIsIdentity() - { - for (Restriction r : columnRestrictions) - { - if (r != null) - return false; - } - return true; - } - - private boolean hasClusteringColumnsRestriction() - { - for (int i = 0; i < columnRestrictions.length; i++) - if (columnRestrictions[i] != null) - return true; - return false; - } - - private void validateDistinctSelection() - throws InvalidRequestException - { - Collection requestedColumns = selection.getColumns(); - for (ColumnDefinition def : requestedColumns) - if (def.kind != ColumnDefinition.Kind.PARTITION_KEY && def.kind != ColumnDefinition.Kind.STATIC) - throw new InvalidRequestException(String.format("SELECT DISTINCT queries must only request partition key columns and/or static columns (not %s)", def.name)); - - // If it's a key range, we require that all partition key columns are selected so we don't have to bother with post-query grouping. - if (!isKeyRange) - return; - - for (ColumnDefinition def : cfm.partitionKeyColumns()) - if (!requestedColumns.contains(def)) - throw new InvalidRequestException(String.format("SELECT DISTINCT queries must request all the partition key columns (missing %s)", def.name)); - } - - /** - * Checks if the specified column is restricted by multiple contains or contains key. - * - * @param columnDef the definition of the column to check - * @return true the specified column is restricted by multiple contains or contains key, - * false otherwise - */ - private boolean isRestrictedByMultipleContains(ColumnDefinition columnDef) - { - if (!columnDef.type.isCollection()) - return false; - - Restriction restriction = metadataRestrictions.get(columnDef.name); - - if (!(restriction instanceof Contains)) - return false; - - Contains contains = (Contains) restriction; - return (contains.numberOfValues() + contains.numberOfKeys()) > 1; + Collections.sort(cqlRows.rows, orderingComparator); } public static class RawStatement extends CFStatement @@ -1385,136 +732,65 @@ public ParsedStatement.Prepared prepare() throws InvalidRequestException ? Selection.wildcard(cfm) : Selection.fromSelectors(cfm, selectClause); - SelectStatement stmt = new SelectStatement(cfm, boundNames.size(), parameters, selection, prepareLimit(boundNames)); - - /* - * WHERE clause. For a given entity, rules are: - * - EQ relation conflicts with anything else (including a 2nd EQ) - * - Can't have more than one LT(E) relation (resp. GT(E) relation) - * - IN relation are restricted to row keys (for now) and conflicts with anything else - * (we could allow two IN for the same entity but that doesn't seem very useful) - * - The value_alias cannot be restricted in any way (we don't support wide rows with indexed value in CQL so far) - */ - boolean hasQueriableIndex = false; - boolean hasQueriableClusteringColumnIndex = false; - boolean hasSingleColumnRelations = false; - boolean hasMultiColumnRelations = false; - - ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(columnFamily()); - SecondaryIndexManager indexManager = cfs.indexManager; - - for (Relation relation : whereClause) - { - if (relation.isMultiColumn()) - { - MultiColumnRelation rel = (MultiColumnRelation) relation; - List names = new ArrayList<>(rel.getEntities().size()); - for (ColumnIdentifier.Raw rawEntity : rel.getEntities()) - { - ColumnIdentifier entity = rawEntity.prepare(cfm); - ColumnDefinition def = cfm.getColumnDefinition(entity); - boolean[] queriable = processRelationEntity(stmt, indexManager, relation, entity, def); - hasQueriableIndex |= queriable[0]; - hasQueriableClusteringColumnIndex |= queriable[1]; - names.add(def); - hasMultiColumnRelations |= ColumnDefinition.Kind.CLUSTERING_COLUMN == def.kind; - } - updateRestrictionsForRelation(stmt, names, rel, boundNames); - } - else - { - SingleColumnRelation rel = (SingleColumnRelation) relation; - ColumnIdentifier entity = rel.getEntity().prepare(cfm); - ColumnDefinition def = cfm.getColumnDefinition(entity); - boolean[] queriable = processRelationEntity(stmt, indexManager, relation, entity, def); - hasQueriableIndex |= queriable[0]; - hasQueriableClusteringColumnIndex |= queriable[1]; - hasSingleColumnRelations |= ColumnDefinition.Kind.CLUSTERING_COLUMN == def.kind; - updateRestrictionsForRelation(stmt, def, rel, boundNames); - } - } - if (hasSingleColumnRelations && hasMultiColumnRelations) - throw new InvalidRequestException("Mixing single column relations and multi column relations on clustering columns is not allowed"); + StatementRestrictions restrictions = prepareRestrictions(cfm, boundNames, selection); - // At this point, the select statement if fully constructed, but we still have a few things to validate - processPartitionKeyRestrictions(stmt, hasQueriableIndex, cfm); - - // All (or none) of the partition key columns have been specified; - // hence there is no need to turn these restrictions into index expressions. - if (!stmt.usesSecondaryIndexing) - stmt.restrictedColumns.removeAll(cfm.partitionKeyColumns()); - - if (stmt.selectsOnlyStaticColumns && stmt.hasClusteringColumnsRestriction()) - throw new InvalidRequestException("Cannot restrict clustering columns when selecting only static columns"); - - processColumnRestrictions(stmt, hasQueriableIndex, cfm); + if (parameters.isDistinct) + validateDistinctSelection(cfm, selection, restrictions); - // Covers indexes on the first clustering column (among others). - if (stmt.isKeyRange && hasQueriableClusteringColumnIndex) - stmt.usesSecondaryIndexing = true; + Comparator> orderingComparator = null; + boolean isReversed = false; - if (!stmt.usesSecondaryIndexing) + if (!parameters.orderings.isEmpty()) { - for (ColumnDefinition def : cfm.clusteringColumns()) - { - // Remove clustering column restrictions that can be handled by slices; the remainder will be - // handled by filters (which may require a secondary index). - Restriction restriction = stmt.columnRestrictions[def.position()]; - if (restriction != null) - { - if (restriction.canEvaluateWithSlices()) - stmt.restrictedColumns.remove(def); - else - stmt.usesSecondaryIndexing = true; - } - } + verifyOrderingIsAllowed(restrictions); + orderingComparator = getOrderingComparator(cfm, selection, restrictions); + isReversed = isReversed(cfm); } - // Even if usesSecondaryIndexing is false at this point, we'll still have to use one if - // there are restrictions not covered by the PK. - if (!stmt.metadataRestrictions.isEmpty()) - stmt.usesSecondaryIndexing = true; - - if (stmt.usesSecondaryIndexing) - validateSecondaryIndexSelections(stmt); - - if (!stmt.parameters.orderings.isEmpty()) - processOrderingClause(stmt, cfm); + if (isReversed) + restrictions.reverse(); - checkNeedsFiltering(stmt); + checkNeedsFiltering(restrictions); - if (parameters.isDistinct) - stmt.validateDistinctSelection(); + SelectStatement stmt = new SelectStatement(cfm, + boundNames.size(), + parameters, + selection, + restrictions, + isReversed, + orderingComparator, + prepareLimit(boundNames)); return new ParsedStatement.Prepared(stmt, boundNames); } - /** Returns a pair of (hasQueriableIndex, hasQueriableClusteringColumnIndex) */ - private boolean[] processRelationEntity(SelectStatement stmt, - SecondaryIndexManager indexManager, - Relation relation, - ColumnIdentifier entity, - ColumnDefinition def) throws InvalidRequestException - { - if (def == null) - handleUnrecognizedEntity(entity, relation); - - stmt.restrictedColumns.add(def); - - SecondaryIndex index = indexManager.getIndexForColumn(def.name.bytes); - if (index != null && index.supportsOperator(relation.operator())) - return new boolean[]{true, def.kind == ColumnDefinition.Kind.CLUSTERING_COLUMN}; - - return new boolean[]{false, false}; - } - - /** Throws an InvalidRequestException for an unrecognized identifier in the WHERE clause */ - private void handleUnrecognizedEntity(ColumnIdentifier entity, Relation relation) throws InvalidRequestException + /** + * Prepares the restrictions. + * + * @param cfm the column family meta data + * @param boundNames the variable specifications + * @param selection the selection + * @return the restrictions + * @throws InvalidRequestException if a problem occurs while building the restrictions + */ + private StatementRestrictions prepareRestrictions(CFMetaData cfm, + VariableSpecifications boundNames, + Selection selection) throws InvalidRequestException { - if (containsAlias(entity)) - throw new InvalidRequestException(String.format("Aliases aren't allowed in the where clause ('%s')", relation)); - else - throw new InvalidRequestException(String.format("Undefined name %s in where clause ('%s')", entity, relation)); + try + { + return new StatementRestrictions(cfm, + whereClause, + boundNames, + selection.containsOnlyStaticColumns(), + selection.containsACollection()); + } + catch (UnrecognizedEntityException e) + { + if (containsAlias(e.entity)) + throw invalidRequest("Aliases aren't allowed in the where clause ('%s')", e.relation); + throw e; + } } /** Returns a Term for the limit or null if no limit is set */ @@ -1528,478 +804,89 @@ private Term prepareLimit(VariableSpecifications boundNames) throws InvalidReque return prepLimit; } - private void updateRestrictionsForRelation(SelectStatement stmt, List defs, MultiColumnRelation relation, VariableSpecifications boundNames) throws InvalidRequestException + private static void verifyOrderingIsAllowed(StatementRestrictions restrictions) throws InvalidRequestException { - List restrictedColumns = new ArrayList<>(); - Set seen = new HashSet<>(defs.size()); - - int previousPosition = -1; - for (ColumnDefinition def : defs) - { - // ensure multi-column restriction only applies to clustering columns - if (def.kind != ColumnDefinition.Kind.CLUSTERING_COLUMN) - throw new InvalidRequestException(String.format("Multi-column relations can only be applied to clustering columns: %s", def)); - - if (seen.contains(def)) - throw new InvalidRequestException(String.format("Column \"%s\" appeared twice in a relation: %s", def, relation)); - seen.add(def); - - // check that no clustering columns were skipped - if (def.position() != previousPosition + 1) - { - if (previousPosition == -1) - throw new InvalidRequestException(String.format( - "Clustering columns may not be skipped in multi-column relations. " + - "They should appear in the PRIMARY KEY order. Got %s", relation)); - else - throw new InvalidRequestException(String.format( - "Clustering columns must appear in the PRIMARY KEY order in multi-column relations: %s", relation)); - } - previousPosition++; - - Restriction existing = getExistingRestriction(stmt, def); - Operator operator = relation.operator(); - if (existing != null) - { - if (operator == Operator.EQ || operator == Operator.IN) - throw new InvalidRequestException(String.format("Column \"%s\" cannot be restricted by more than one relation if it is in an %s relation", def, relation.operator())); - else if (!existing.isSlice()) - throw new InvalidRequestException(String.format("Column \"%s\" cannot be restricted by an equality relation and an inequality relation", def)); - } - restrictedColumns.add(def); - } - - switch (relation.operator()) - { - case EQ: - { - Term t = relation.getValue().prepare(keyspace(), defs); - t.collectMarkerSpecification(boundNames); - Restriction restriction = new MultiColumnRestriction.EQ(t, false); - for (ColumnDefinition def : restrictedColumns) - stmt.columnRestrictions[def.position()] = restriction; - break; - } - case IN: - { - Restriction restriction; - List inValues = relation.getInValues(); - if (inValues != null) - { - // we have something like "(a, b, c) IN ((1, 2, 3), (4, 5, 6), ...) or - // "(a, b, c) IN (?, ?, ?) - List terms = new ArrayList<>(inValues.size()); - for (Term.MultiColumnRaw tuple : inValues) - { - Term t = tuple.prepare(keyspace(), defs); - t.collectMarkerSpecification(boundNames); - terms.add(t); - } - restriction = new MultiColumnRestriction.InWithValues(terms); - } - else - { - Tuples.INRaw rawMarker = relation.getInMarker(); - AbstractMarker t = rawMarker.prepare(keyspace(), defs); - t.collectMarkerSpecification(boundNames); - restriction = new MultiColumnRestriction.InWithMarker(t); - } - for (ColumnDefinition def : restrictedColumns) - stmt.columnRestrictions[def.position()] = restriction; - - break; - } - case LT: - case LTE: - case GT: - case GTE: - { - Term t = relation.getValue().prepare(keyspace(), defs); - t.collectMarkerSpecification(boundNames); - for (ColumnDefinition def : defs) - { - Restriction.Slice restriction = (Restriction.Slice)getExistingRestriction(stmt, def); - if (restriction == null) - restriction = new MultiColumnRestriction.Slice(false); - else if (!restriction.isMultiColumn()) - throw new InvalidRequestException(String.format("Column \"%s\" cannot have both tuple-notation inequalities and single-column inequalities: %s", def.name, relation)); - restriction.setBound(def.name, relation.operator(), t); - stmt.columnRestrictions[def.position()] = restriction; - } - break; - } - case NEQ: - throw new InvalidRequestException(String.format("Unsupported \"!=\" relation: %s", relation)); - } + checkFalse(restrictions.usesSecondaryIndexing(), "ORDER BY with 2ndary indexes is not supported."); + checkFalse(restrictions.isKeyRange(), "ORDER BY is only supported when the partition key is restricted by an EQ or an IN."); } - private Restriction getExistingRestriction(SelectStatement stmt, ColumnDefinition def) + private static void validateDistinctSelection(CFMetaData cfm, + Selection selection, + StatementRestrictions restrictions) + throws InvalidRequestException { - switch (def.kind) - { - case PARTITION_KEY: - return stmt.keyRestrictions[def.position()]; - case CLUSTERING_COLUMN: - return stmt.columnRestrictions[def.position()]; - case REGULAR: - case STATIC: - return stmt.metadataRestrictions.get(def.name); - default: - throw new AssertionError(); - } - } + Collection requestedColumns = selection.getColumns(); + for (ColumnDefinition def : requestedColumns) + checkFalse(!def.isPartitionKey() && !def.isStatic(), + "SELECT DISTINCT queries must only request partition key columns and/or static columns (not %s)", + def.name); - private void updateRestrictionsForRelation(SelectStatement stmt, ColumnDefinition def, SingleColumnRelation relation, VariableSpecifications names) throws InvalidRequestException - { - switch (def.kind) - { - case PARTITION_KEY: - stmt.keyRestrictions[def.position()] = updateSingleColumnRestriction(def, stmt.keyRestrictions[def.position()], relation, names); - break; - case CLUSTERING_COLUMN: - stmt.columnRestrictions[def.position()] = updateSingleColumnRestriction(def, stmt.columnRestrictions[def.position()], relation, names); - break; - case COMPACT_VALUE: - throw new InvalidRequestException(String.format("Predicates on the non-primary-key column (%s) of a COMPACT table are not yet supported", def.name)); - case REGULAR: - case STATIC: - // We only all IN on the row key and last clustering key so far, never on non-PK columns, and this even if there's an index - Restriction r = updateSingleColumnRestriction(def, stmt.metadataRestrictions.get(def.name), relation, names); - if (r.isIN() && !((Restriction.IN)r).canHaveOnlyOneValue()) - // Note: for backward compatibility reason, we conside a IN of 1 value the same as a EQ, so we let that slide. - throw new InvalidRequestException(String.format("IN predicates on non-primary-key columns (%s) is not yet supported", def.name)); - stmt.metadataRestrictions.put(def.name, r); - break; - } - } - - Restriction updateSingleColumnRestriction(ColumnDefinition def, Restriction existingRestriction, SingleColumnRelation newRel, VariableSpecifications boundNames) throws InvalidRequestException - { - ColumnSpecification receiver = def; - if (newRel.onToken) - { - if (def.kind != ColumnDefinition.Kind.PARTITION_KEY) - throw new InvalidRequestException(String.format("The token() function is only supported on the partition key, found on %s", def.name)); + // If it's a key range, we require that all partition key columns are selected so we don't have to bother + // with post-query grouping. + if (!restrictions.isKeyRange()) + return; - receiver = new ColumnSpecification(def.ksName, - def.cfName, - new ColumnIdentifier("partition key token", true), - StorageService.getPartitioner().getTokenValidator()); - } - - // We don't support relations against entire collections (unless they're frozen), like "numbers = {1, 2, 3}" - if (receiver.type.isCollection() && receiver.type.isMultiCell() && !(newRel.operator() == Operator.CONTAINS_KEY || newRel.operator() == Operator.CONTAINS)) - { - throw new InvalidRequestException(String.format("Collection column '%s' (%s) cannot be restricted by a '%s' relation", - def.name, receiver.type.asCQL3Type(), newRel.operator())); - } - - switch (newRel.operator()) - { - case EQ: - { - if (existingRestriction != null) - throw new InvalidRequestException(String.format("%s cannot be restricted by more than one relation if it includes an Equal", def.name)); - Term t = newRel.getValue().prepare(keyspace(), receiver); - t.collectMarkerSpecification(boundNames); - existingRestriction = new SingleColumnRestriction.EQ(t, newRel.onToken); - } - break; - case IN: - if (existingRestriction != null) - throw new InvalidRequestException(String.format("%s cannot be restricted by more than one relation if it includes a IN", def.name)); - - if (newRel.getInValues() == null) - { - // Means we have a "SELECT ... IN ?" - assert newRel.getValue() != null; - Term t = newRel.getValue().prepare(keyspace(), receiver); - t.collectMarkerSpecification(boundNames); - existingRestriction = new SingleColumnRestriction.InWithMarker((Lists.Marker)t); - } - else - { - List inValues = new ArrayList<>(newRel.getInValues().size()); - for (Term.Raw raw : newRel.getInValues()) - { - Term t = raw.prepare(keyspace(), receiver); - t.collectMarkerSpecification(boundNames); - inValues.add(t); - } - existingRestriction = new SingleColumnRestriction.InWithValues(inValues); - } - break; - case NEQ: - throw new InvalidRequestException(String.format("Unsupported \"!=\" relation on column \"%s\"", def.name)); - case GT: - case GTE: - case LT: - case LTE: - { - if (existingRestriction == null) - existingRestriction = new SingleColumnRestriction.Slice(newRel.onToken); - else if (!existingRestriction.isSlice()) - throw new InvalidRequestException(String.format("Column \"%s\" cannot be restricted by both an equality and an inequality relation", def.name)); - else if (existingRestriction.isMultiColumn()) - throw new InvalidRequestException(String.format("Column \"%s\" cannot be restricted by both a tuple notation inequality and a single column inequality (%s)", def.name, newRel)); - else if (existingRestriction.isOnToken() != newRel.onToken) - // For partition keys, we shouldn't have slice restrictions without token(). And while this is rejected later by - // processPartitionKeysRestrictions, we shouldn't update the existing restriction by the new one if the old one was using token() - // and the new one isn't since that would bypass that later test. - throw new InvalidRequestException("Only EQ and IN relation are supported on the partition key (unless you use the token() function)"); - - Term t = newRel.getValue().prepare(keyspace(), receiver); - t.collectMarkerSpecification(boundNames); - ((SingleColumnRestriction.Slice)existingRestriction).setBound(def.name, newRel.operator(), t); - } - break; - case CONTAINS_KEY: - if (!(receiver.type instanceof MapType)) - throw new InvalidRequestException(String.format("Cannot use CONTAINS KEY on non-map column %s", def.name)); - // Fallthrough on purpose - case CONTAINS: - { - if (!receiver.type.isCollection()) - throw new InvalidRequestException(String.format("Cannot use %s relation on non collection column %s", newRel.operator(), def.name)); - - if (existingRestriction == null) - existingRestriction = new SingleColumnRestriction.Contains(); - else if (!existingRestriction.isContains()) - throw new InvalidRequestException(String.format("Collection column %s can only be restricted by CONTAINS or CONTAINS KEY", def.name)); - - boolean isKey = newRel.operator() == Operator.CONTAINS_KEY; - receiver = makeCollectionReceiver(receiver, isKey); - Term t = newRel.getValue().prepare(keyspace(), receiver); - t.collectMarkerSpecification(boundNames); - ((SingleColumnRestriction.Contains)existingRestriction).add(t, isKey); - break; - } - } - return existingRestriction; + for (ColumnDefinition def : cfm.partitionKeyColumns()) + checkTrue(requestedColumns.contains(def), + "SELECT DISTINCT queries must request all the partition key columns (missing %s)", def.name); } - private void processPartitionKeyRestrictions(SelectStatement stmt, boolean hasQueriableIndex, CFMetaData cfm) throws InvalidRequestException + private void handleUnrecognizedOrderingColumn(ColumnIdentifier column) throws InvalidRequestException { - // If there is a queriable index, no special condition are required on the other restrictions. - // But we still need to know 2 things: - // - If we don't have a queriable index, is the query ok - // - Is it queriable without 2ndary index, which is always more efficient - // If a component of the partition key is restricted by a relation, all preceding - // components must have a EQ. Only the last partition key component can be in IN relation. - boolean canRestrictFurtherComponents = true; - ColumnDefinition previous = null; - stmt.keyIsInRelation = false; - Iterator iter = cfm.partitionKeyColumns().iterator(); - for (int i = 0; i < stmt.keyRestrictions.length; i++) - { - ColumnDefinition cdef = iter.next(); - Restriction restriction = stmt.keyRestrictions[i]; - - if (restriction == null) - { - if (stmt.onToken) - throw new InvalidRequestException("The token() function must be applied to all partition key components or none of them"); - - // The only time not restricting a key part is allowed is if none are restricted or an index is used. - if (i > 0 && stmt.keyRestrictions[i - 1] != null) - { - if (hasQueriableIndex) - { - stmt.usesSecondaryIndexing = true; - stmt.isKeyRange = true; - break; - } - throw new InvalidRequestException(String.format("Partition key part %s must be restricted since preceding part is", cdef.name)); - } - - stmt.isKeyRange = true; - canRestrictFurtherComponents = false; - } - else if (!canRestrictFurtherComponents) - { - if (hasQueriableIndex) - { - stmt.usesSecondaryIndexing = true; - break; - } - throw new InvalidRequestException(String.format( - "Partitioning column \"%s\" cannot be restricted because the preceding column (\"%s\") is " + - "either not restricted or is restricted by a non-EQ relation", cdef.name, previous)); - } - else if (restriction.isOnToken()) - { - // If this is a query on tokens, it's necessarily a range query (there can be more than one key per token). - stmt.isKeyRange = true; - stmt.onToken = true; - } - else if (stmt.onToken) - { - throw new InvalidRequestException(String.format("The token() function must be applied to all partition key components or none of them")); - } - else if (!restriction.isSlice()) - { - if (restriction.isIN()) - { - // We only support IN for the last name so far - if (i != stmt.keyRestrictions.length - 1) - throw new InvalidRequestException(String.format("Partition KEY part %s cannot be restricted by IN relation (only the last part of the partition key can)", cdef.name)); - stmt.keyIsInRelation = true; - } - } - else - { - // Non EQ relation is not supported without token(), even if we have a 2ndary index (since even those are ordered by partitioner). - // Note: In theory we could allow it for 2ndary index queries with ALLOW FILTERING, but that would probably require some special casing - // Note bis: This is also why we don't bother handling the 'tuple' notation of #4851 for keys. If we lift the limitation for 2ndary - // index with filtering, we'll need to handle it though. - throw new InvalidRequestException("Only EQ and IN relation are supported on the partition key (unless you use the token() function)"); - } - previous = cdef; - } - - if (stmt.onToken) - checkTokenFunctionArgumentsOrder(cfm); + checkFalse(containsAlias(column), "Aliases are not allowed in order by clause ('%s')", column); + checkFalse(true, "Order by on unknown column %s", column); } - /** - * Checks that the column identifiers used as argument for the token function have been specified in the - * partition key order. - * @param cfm the Column Family MetaData - * @throws InvalidRequestException if the arguments have not been provided in the proper order. - */ - private void checkTokenFunctionArgumentsOrder(CFMetaData cfm) throws InvalidRequestException + private Comparator> getOrderingComparator(CFMetaData cfm, + Selection selection, + StatementRestrictions restrictions) + throws InvalidRequestException { - Iterator iter = Iterators.cycle(cfm.partitionKeyColumns()); - for (Relation relation : whereClause) - { - SingleColumnRelation singleColumnRelation = (SingleColumnRelation) relation; - if (singleColumnRelation.onToken && !cfm.getColumnDefinition(singleColumnRelation.getEntity().prepare(cfm)).equals(iter.next())) - throw new InvalidRequestException(String.format("The token function arguments must be in the partition key order: %s", - Joiner.on(',').join(cfm.partitionKeyColumns()))); - } - } + if (!restrictions.keyIsInRelation()) + return null; - private void processColumnRestrictions(SelectStatement stmt, boolean hasQueriableIndex, CFMetaData cfm) throws InvalidRequestException - { - // If a clustering key column is restricted by a non-EQ relation, all preceding - // columns must have a EQ, and all following must have no restriction. Unless - // the column is indexed that is. - boolean canRestrictFurtherComponents = true; - ColumnDefinition previous = null; - boolean previousIsSlice = false; - Iterator iter = cfm.clusteringColumns().iterator(); - for (int i = 0; i < stmt.columnRestrictions.length; i++) - { - ColumnDefinition cdef = iter.next(); - Restriction restriction = stmt.columnRestrictions[i]; + Map orderingIndexes = getOrderingIndex(cfm, selection); - if (restriction == null) - { - canRestrictFurtherComponents = false; - previousIsSlice = false; - } - else if (!canRestrictFurtherComponents) - { - // We're here if the previous clustering column was either not restricted or was a slice. - // We can't restrict the current column unless: - // 1) we're in the special case of the 'tuple' notation from #4851 which we expand as multiple - // consecutive slices: in which case we're good with this restriction and we continue - // 2) we have a 2ndary index, in which case we have to use it but can skip more validation - if (!(previousIsSlice && restriction.isSlice() && restriction.isMultiColumn())) - { - if (hasQueriableIndex) - { - stmt.usesSecondaryIndexing = true; // handle gaps and non-keyrange cases. - break; - } - throw new InvalidRequestException(String.format( - "PRIMARY KEY column \"%s\" cannot be restricted (preceding column \"%s\" is either not restricted or by a non-EQ relation)", cdef.name, previous)); - } - } - else if (restriction.isSlice()) - { - canRestrictFurtherComponents = false; - previousIsSlice = true; - Restriction.Slice slice = (Restriction.Slice)restriction; - // For non-composite slices, we don't support internally the difference between exclusive and - // inclusive bounds, so we deal with it manually. - if (!cfm.comparator.isCompound() && (!slice.isInclusive(Bound.START) || !slice.isInclusive(Bound.END))) - stmt.sliceRestriction = slice; - } - else if (restriction.isIN()) - { - if (stmt.selectACollection()) - throw new InvalidRequestException(String.format("Cannot restrict column \"%s\" by IN relation as a collection is selected by the query", cdef.name)); - } - else if (restriction.isContains()) - { - if (!hasQueriableIndex) - throw new InvalidRequestException(String.format("Cannot restrict column \"%s\" by a CONTAINS relation without a secondary index", cdef.name)); - stmt.usesSecondaryIndexing = true; - } + List idToSort = new ArrayList(); + List> sorters = new ArrayList>(); - previous = cdef; + for (ColumnIdentifier.Raw raw : parameters.orderings.keySet()) + { + ColumnIdentifier identifier = raw.prepare(cfm); + ColumnDefinition orderingColumn = cfm.getColumnDefinition(identifier); + idToSort.add(orderingIndexes.get(orderingColumn.name)); + sorters.add(orderingColumn.type); } + return idToSort.size() == 1 ? new SingleColumnComparator(idToSort.get(0), sorters.get(0)) + : new CompositeComparator(sorters, idToSort); } - private void validateSecondaryIndexSelections(SelectStatement stmt) throws InvalidRequestException + private Map getOrderingIndex(CFMetaData cfm, Selection selection) + throws InvalidRequestException { - if (stmt.keyIsInRelation) - throw new InvalidRequestException("Select on indexed columns and with IN clause for the PRIMARY KEY are not supported"); - // When the user only select static columns, the intent is that we don't query the whole partition but just - // the static parts. But 1) we don't have an easy way to do that with 2i and 2) since we don't support index on static columns - // so far, 2i means that you've restricted a non static column, so the query is somewhat non-sensical. - if (stmt.selectsOnlyStaticColumns) - throw new InvalidRequestException("Queries using 2ndary indexes don't support selecting only static columns"); - } - - private void verifyOrderingIsAllowed(SelectStatement stmt) throws InvalidRequestException - { - if (stmt.usesSecondaryIndexing) - throw new InvalidRequestException("ORDER BY with 2ndary indexes is not supported."); - - if (stmt.isKeyRange) - throw new InvalidRequestException("ORDER BY is only supported when the partition key is restricted by an EQ or an IN."); - } - - private void handleUnrecognizedOrderingColumn(ColumnIdentifier column) throws InvalidRequestException - { - if (containsAlias(column)) - throw new InvalidRequestException(String.format("Aliases are not allowed in order by clause ('%s')", column)); - else - throw new InvalidRequestException(String.format("Order by on unknown column %s", column)); - } - - private void processOrderingClause(SelectStatement stmt, CFMetaData cfm) throws InvalidRequestException - { - verifyOrderingIsAllowed(stmt); - - // If we order post-query (see orderResults), the sorted column needs to be in the ResultSet for sorting, even if we don't + // If we order post-query (see orderResults), the sorted column needs to be in the ResultSet for sorting, + // even if we don't // ultimately ship them to the client (CASSANDRA-4911). - if (stmt.keyIsInRelation) + Map orderingIndexes = new HashMap<>(); + for (ColumnIdentifier.Raw raw : parameters.orderings.keySet()) { - stmt.orderingIndexes = new HashMap<>(); - for (ColumnIdentifier.Raw rawColumn : stmt.parameters.orderings.keySet()) - { - ColumnIdentifier column = rawColumn.prepare(cfm); - final ColumnDefinition def = cfm.getColumnDefinition(column); - if (def == null) - handleUnrecognizedOrderingColumn(column); - - int index = indexOf(def, stmt.selection); - if (index < 0) - index = stmt.selection.addColumnForOrdering(def); - stmt.orderingIndexes.put(def.name, index); - } + ColumnIdentifier column = raw.prepare(cfm); + final ColumnDefinition def = cfm.getColumnDefinition(column); + if (def == null) + handleUnrecognizedOrderingColumn(column); + int index = selection.indexOf(def); + if (index < 0) + index = selection.addColumnForOrdering(def); + orderingIndexes.put(def.name, index); } - stmt.isReversed = isReversed(stmt, cfm); + return orderingIndexes; } - private boolean isReversed(SelectStatement stmt, CFMetaData cfm) throws InvalidRequestException + private boolean isReversed(CFMetaData cfm) throws InvalidRequestException { Boolean[] reversedMap = new Boolean[cfm.clusteringColumns().size()]; int i = 0; - for (Map.Entry entry : stmt.parameters.orderings.entrySet()) + for (Map.Entry entry : parameters.orderings.entrySet()) { ColumnIdentifier column = entry.getKey().prepare(cfm); boolean reversed = entry.getValue(); @@ -2008,13 +895,13 @@ private boolean isReversed(SelectStatement stmt, CFMetaData cfm) throws InvalidR if (def == null) handleUnrecognizedOrderingColumn(column); - if (def.kind != ColumnDefinition.Kind.CLUSTERING_COLUMN) - throw new InvalidRequestException(String.format("Order by is currently only supported on the clustered columns of the PRIMARY KEY, got %s", column)); + checkTrue(def.isClusteringColumn(), + "Order by is currently only supported on the clustered columns of the PRIMARY KEY, got %s", column); - if (i++ != def.position()) - throw new InvalidRequestException(String.format("Order by currently only support the ordering of columns following their declared order in the PRIMARY KEY")); + checkTrue(i++ == def.position(), + "Order by currently only support the ordering of columns following their declared order in the PRIMARY KEY"); - reversedMap[def.position()] = (reversed != isReversedType(def)); + reversedMap[def.position()] = (reversed != def.isReversedType()); } // Check that all boolean in reversedMap, if set, agrees @@ -2030,26 +917,25 @@ private boolean isReversed(SelectStatement stmt, CFMetaData cfm) throws InvalidR isReversed = b; continue; } - if (!isReversed.equals(b)) - throw new InvalidRequestException(String.format("Unsupported order by relation")); + checkTrue(isReversed.equals(b), "Unsupported order by relation"); } assert isReversed != null; return isReversed; } /** If ALLOW FILTERING was not specified, this verifies that it is not needed */ - private void checkNeedsFiltering(SelectStatement stmt) throws InvalidRequestException + private void checkNeedsFiltering(StatementRestrictions restrictions) throws InvalidRequestException { // non-key-range non-indexed queries cannot involve filtering underneath - if (!parameters.allowFiltering && (stmt.isKeyRange || stmt.usesSecondaryIndexing)) + if (!parameters.allowFiltering && (restrictions.isKeyRange() || restrictions.usesSecondaryIndexing())) { // We will potentially filter data if either: // - Have more than one IndexExpression // - Have no index expression and the column filter is not the identity - if (needFiltering(stmt)) - throw new InvalidRequestException("Cannot execute this query as it might involve data filtering and " + - "thus may have unpredictable performance. If you want to execute " + - "this query despite the performance unpredictability, use ALLOW FILTERING"); + checkFalse(restrictions.needFiltering(), + "Cannot execute this query as it might involve data filtering and " + + "thus may have unpredictable performance. If you want to execute " + + "this query despite the performance unpredictability, use ALLOW FILTERING"); } // We don't internally support exclusive slice bounds on non-composite tables. To deal with it we do an @@ -2062,46 +948,15 @@ private void checkNeedsFiltering(SelectStatement stmt) throws InvalidRequestExce // to bump the query limit by N where N is the number of rows we will return, but we don't know that in // advance. So, since we currently don't have a good way to handle such query, we refuse it (#7059) rather // than answering with something that is wrong. - if (stmt.sliceRestriction != null && stmt.isKeyRange && limit != null) + if (restrictions.isNonCompositeSliceWithExclusiveBounds() && restrictions.isKeyRange() && limit != null) { - SingleColumnRelation rel = findInclusiveClusteringRelationForCompact(stmt.cfm); - throw new InvalidRequestException(String.format("The query requests a restriction of rows with a strict bound (%s) over a range of partitions. " - + "This is not supported by the underlying storage engine for COMPACT tables if a LIMIT is provided. " - + "Please either make the condition non strict (%s) or remove the user LIMIT", rel, rel.withNonStrictOperator())); + SingleColumnRelation rel = findInclusiveClusteringRelationForCompact(restrictions.cfm); + throw invalidRequest("The query requests a restriction of rows with a strict bound (%s) over a range of partitions. " + + "This is not supported by the underlying storage engine for COMPACT tables if a LIMIT is provided. " + + "Please either make the condition non strict (%s) or remove the user LIMIT", rel, rel.withNonStrictOperator()); } } - /** - * Checks if the specified statement will need to filter the data. - * - * @param stmt the statement to test. - * @return true if the specified statement will need to filter the data, false - * otherwise. - */ - private static boolean needFiltering(SelectStatement stmt) - { - return stmt.restrictedColumns.size() > 1 - || (stmt.restrictedColumns.isEmpty() && !stmt.columnFilterIsIdentity()) - || (!stmt.restrictedColumns.isEmpty() - && stmt.isRestrictedByMultipleContains(Iterables.getOnlyElement(stmt.restrictedColumns))); - } - - private int indexOf(ColumnDefinition def, Selection selection) - { - return indexOf(def, selection.getColumns().iterator()); - } - - private int indexOf(final ColumnDefinition def, Iterator defs) - { - return Iterators.indexOf(defs, new Predicate() - { - public boolean apply(ColumnDefinition n) - { - return def.name.equals(n.name); - } - }); - } - private SingleColumnRelation findInclusiveClusteringRelationForCompact(CFMetaData cfm) { for (Relation r : whereClause) @@ -2109,8 +964,9 @@ private SingleColumnRelation findInclusiveClusteringRelationForCompact(CFMetaDat // We only call this when sliceRestriction != null, i.e. for compact table with non composite comparator, // so it can't be a MultiColumnRelation. SingleColumnRelation rel = (SingleColumnRelation)r; - if (cfm.getColumnDefinition(rel.getEntity().prepare(cfm)).kind == ColumnDefinition.Kind.CLUSTERING_COLUMN - && (rel.operator() == Operator.GT || rel.operator() == Operator.LT)) + + if (cfm.getColumnDefinition(rel.getEntity().prepare(cfm)).isClusteringColumn() + && (rel.operator() == Operator.GT || rel.operator() == Operator.LT)) return rel; } @@ -2134,23 +990,6 @@ private ColumnSpecification limitReceiver() return new ColumnSpecification(keyspace(), columnFamily(), new ColumnIdentifier("[limit]", true), Int32Type.instance); } - private static ColumnSpecification makeCollectionReceiver(ColumnSpecification collection, boolean isKey) - { - assert collection.type.isCollection(); - switch (((CollectionType)collection.type).kind) - { - case LIST: - assert !isKey; - return Lists.valueSpecOf(collection); - case SET: - assert !isKey; - return Sets.valueSpecOf(collection); - case MAP: - return isKey ? Maps.keySpecOf(collection) : Maps.valueSpecOf(collection); - } - throw new AssertionError(); - } - @Override public String toString() { diff --git a/src/java/org/apache/cassandra/cql3/statements/SingleColumnRestriction.java b/src/java/org/apache/cassandra/cql3/statements/SingleColumnRestriction.java deleted file mode 100644 index b6ca640e7649..000000000000 --- a/src/java/org/apache/cassandra/cql3/statements/SingleColumnRestriction.java +++ /dev/null @@ -1,486 +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.cql3.statements; - -import org.apache.cassandra.cql3.*; -import org.apache.cassandra.exceptions.InvalidRequestException; - -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public abstract class SingleColumnRestriction implements Restriction -{ - public boolean isMultiColumn() - { - return false; - } - - public static class EQ extends SingleColumnRestriction implements Restriction.EQ - { - protected final Term value; - private final boolean onToken; - - public EQ(Term value, boolean onToken) - { - this.value = value; - this.onToken = onToken; - } - - public boolean usesFunction(String ksName, String functionName) - { - return value != null && value.usesFunction(ksName, functionName); - } - - public List values(QueryOptions options) throws InvalidRequestException - { - return Collections.singletonList(value.bindAndGet(options)); - } - - public boolean isSlice() - { - return false; - } - - public boolean isEQ() - { - return true; - } - - public boolean isIN() - { - return false; - } - - public boolean isContains() - { - return false; - } - - public boolean isOnToken() - { - return onToken; - } - - public boolean canEvaluateWithSlices() - { - return true; - } - - @Override - public String toString() - { - return String.format("EQ(%s)%s", value, onToken ? "*" : ""); - } - } - - public static class InWithValues extends SingleColumnRestriction implements Restriction.IN - { - protected final List values; - - public InWithValues(List values) - { - this.values = values; - } - - public boolean usesFunction(String ksName, String functionName) - { - if (values != null) - for (Term value : values) - if (value != null && value.usesFunction(ksName, functionName)) - return true; - return false; - } - - public List values(QueryOptions options) throws InvalidRequestException - { - List buffers = new ArrayList<>(values.size()); - for (Term value : values) - buffers.add(value.bindAndGet(options)); - return buffers; - } - - public boolean canHaveOnlyOneValue() - { - return values.size() == 1; - } - - public boolean isSlice() - { - return false; - } - - public boolean isEQ() - { - return false; - } - - public boolean isIN() - { - return true; - } - - public boolean isContains() - { - return false; - } - - public boolean isOnToken() - { - return false; - } - - public boolean canEvaluateWithSlices() - { - return true; - } - - @Override - public String toString() - { - return String.format("IN(%s)", values); - } - } - - public static class InWithMarker extends SingleColumnRestriction implements Restriction.IN - { - protected final AbstractMarker marker; - - public InWithMarker(AbstractMarker marker) - { - this.marker = marker; - } - - public boolean usesFunction(String ksName, String functionName) - { - return false; - } - - public List values(QueryOptions options) throws InvalidRequestException - { - Term.MultiItemTerminal lval = (Term.MultiItemTerminal)marker.bind(options); - if (lval == null) - throw new InvalidRequestException("Invalid null value for IN restriction"); - return lval.getElements(); - } - - public boolean canHaveOnlyOneValue() - { - return false; - } - - public boolean isSlice() - { - return false; - } - - public boolean isEQ() - { - return false; - } - - public boolean isIN() - { - return true; - } - - public boolean isContains() - { - return false; - } - - public boolean isOnToken() - { - return false; - } - - public boolean canEvaluateWithSlices() - { - return true; - } - - @Override - public String toString() - { - return "IN ?"; - } - } - - public static class Slice extends SingleColumnRestriction implements Restriction.Slice - { - protected final Term[] bounds; - protected final boolean[] boundInclusive; - protected final boolean onToken; - - public Slice(boolean onToken) - { - this.bounds = new Term[2]; - this.boundInclusive = new boolean[2]; - this.onToken = onToken; - } - - public boolean usesFunction(String ksName, String functionName) - { - for (Term value : bounds) - if (value != null && value.usesFunction(ksName, functionName)) - return true; - return false; - } - - public boolean isSlice() - { - return true; - } - - public boolean isEQ() - { - return false; - } - - public boolean isIN() - { - return false; - } - - public boolean isContains() - { - return false; - } - - public List values(QueryOptions options) throws InvalidRequestException - { - throw new UnsupportedOperationException(); - } - - public boolean isOnToken() - { - return onToken; - } - - public boolean canEvaluateWithSlices() - { - return true; - } - - /** Returns true if the start or end bound (depending on the argument) is set, false otherwise */ - public boolean hasBound(Bound b) - { - return bounds[b.idx] != null; - } - - public ByteBuffer bound(Bound b, QueryOptions options) throws InvalidRequestException - { - return bounds[b.idx].bindAndGet(options); - } - - /** Returns true if the start or end bound (depending on the argument) is inclusive, false otherwise */ - public boolean isInclusive(Bound b) - { - return bounds[b.idx] == null || boundInclusive[b.idx]; - } - - public Operator getRelation(Bound eocBound, Bound inclusiveBound) - { - switch (eocBound) - { - case START: - return boundInclusive[inclusiveBound.idx] ? Operator.GTE : Operator.GT; - case END: - return boundInclusive[inclusiveBound.idx] ? Operator.LTE : Operator.LT; - } - throw new AssertionError(); - } - - public Operator getIndexOperator(Bound b) - { - switch (b) - { - case START: - return boundInclusive[b.idx] ? Operator.GTE : Operator.GT; - case END: - return boundInclusive[b.idx] ? Operator.LTE : Operator.LT; - } - throw new AssertionError(); - } - - public void setBound(ColumnIdentifier name, Operator operator, Term t) throws InvalidRequestException - { - Bound b; - boolean inclusive; - switch (operator) - { - case GT: - b = Bound.START; - inclusive = false; - break; - case GTE: - b = Bound.START; - inclusive = true; - break; - case LT: - b = Bound.END; - inclusive = false; - break; - case LTE: - b = Bound.END; - inclusive = true; - break; - default: - throw new AssertionError(); - } - - if (bounds[b.idx] != null) - throw new InvalidRequestException(String.format( - "More than one restriction was found for the %s bound on %s", b.name().toLowerCase(), name)); - - bounds[b.idx] = t; - boundInclusive[b.idx] = inclusive; - } - - @Override - public String toString() - { - return String.format("SLICE(%s %s, %s %s)%s", boundInclusive[0] ? ">=" : ">", - bounds[0], - boundInclusive[1] ? "<=" : "<", - bounds[1], - onToken ? "*" : ""); - } - } - - // This holds both CONTAINS and CONTAINS_KEY restriction because we might want to have both of them. - public static class Contains extends SingleColumnRestriction - { - private List values; // for CONTAINS - private List keys; // for CONTAINS_KEY - - public boolean usesFunction(String ksName, String functionName) - { - if (values != null) - for (Term value : values) - if (value != null && value.usesFunction(ksName, functionName)) - return true; - if (keys != null) - for (Term key : keys) - if (key != null && key.usesFunction(ksName, functionName)) - return true; - return false; - } - - public boolean hasContains() - { - return values != null; - } - - public boolean hasContainsKey() - { - return keys != null; - } - - public int numberOfValues() - { - return values == null ? 0 : values.size(); - } - - public int numberOfKeys() - { - return keys == null ? 0 : keys.size(); - } - - public void add(Term t, boolean isKey) - { - if (isKey) - addKey(t); - else - addValue(t); - } - - public void addValue(Term t) - { - if (values == null) - values = new ArrayList<>(); - values.add(t); - } - - public void addKey(Term t) - { - if (keys == null) - keys = new ArrayList<>(); - keys.add(t); - } - - public List values(QueryOptions options) throws InvalidRequestException - { - if (values == null) - return Collections.emptyList(); - - List buffers = new ArrayList(values.size()); - for (Term value : values) - buffers.add(value.bindAndGet(options)); - return buffers; - } - - public List keys(QueryOptions options) throws InvalidRequestException - { - if (keys == null) - return Collections.emptyList(); - - List buffers = new ArrayList(keys.size()); - for (Term value : keys) - buffers.add(value.bindAndGet(options)); - return buffers; - } - - public boolean isSlice() - { - return false; - } - - public boolean isEQ() - { - return false; - } - - public boolean isIN() - { - return false; - } - - public boolean isContains() - { - return true; - } - - public boolean isOnToken() - { - return false; - } - - public boolean canEvaluateWithSlices() - { - return false; - } - - @Override - public String toString() - { - return String.format("CONTAINS(values=%s, keys=%s)", values, keys); - } - } -} diff --git a/src/java/org/apache/cassandra/db/composites/Composites.java b/src/java/org/apache/cassandra/db/composites/Composites.java index f6626e08432f..fa0df48c5278 100644 --- a/src/java/org/apache/cassandra/db/composites/Composites.java +++ b/src/java/org/apache/cassandra/db/composites/Composites.java @@ -22,8 +22,11 @@ import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.db.filter.ColumnSlice; -import org.apache.cassandra.utils.memory.AbstractAllocator; import org.apache.cassandra.utils.ByteBufferUtil; +import org.apache.cassandra.utils.memory.AbstractAllocator; + +import com.google.common.base.Function; +import com.google.common.collect.Lists; public abstract class Composites { @@ -31,6 +34,23 @@ private Composites() {} public static final Composite EMPTY = new EmptyComposite(); + /** + * Converts the specified Composites into ByteBuffers. + * + * @param composites the composites to convert. + * @return the ByteBuffers corresponding to the specified Composites. + */ + public static List toByteBuffers(List composites) + { + return Lists.transform(composites, new Function() + { + public ByteBuffer apply(Composite composite) + { + return composite.toByteBuffer(); + } + }); + } + static final CBuilder EMPTY_BUILDER = new CBuilder() { public int remainingCount() { return 0; } diff --git a/src/java/org/apache/cassandra/db/composites/CompositesBuilder.java b/src/java/org/apache/cassandra/db/composites/CompositesBuilder.java index 4542ac5d25c2..9a32dccff6ba 100644 --- a/src/java/org/apache/cassandra/db/composites/CompositesBuilder.java +++ b/src/java/org/apache/cassandra/db/composites/CompositesBuilder.java @@ -20,6 +20,7 @@ import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Comparator; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.TreeSet; @@ -240,8 +241,8 @@ public List buildWithEOC(EOC eoc) if (elementsList.isEmpty()) return singletonList(builder.build().withEOC(eoc)); - // Use a TreeSet to sort and eliminate duplicates - Set set = new TreeSet(comparator); + // Use a Set to sort if needed and eliminate duplicates + Set set = newSet(); for (int i = 0, m = elementsList.size(); i < m; i++) { @@ -252,6 +253,16 @@ public List buildWithEOC(EOC eoc) return new ArrayList<>(set); } + /** + * Returns a new Set instance that will be used to eliminate duplicates and sort the results. + * + * @return a new Set instance. + */ + private Set newSet() + { + return comparator == null ? new LinkedHashSet() : new TreeSet(comparator); + } + private void checkUpdateable() { if (!hasRemaining() || built) diff --git a/src/java/org/apache/cassandra/db/marshal/CollectionType.java b/src/java/org/apache/cassandra/db/marshal/CollectionType.java index 24ad5333e579..31218994a425 100644 --- a/src/java/org/apache/cassandra/db/marshal/CollectionType.java +++ b/src/java/org/apache/cassandra/db/marshal/CollectionType.java @@ -26,6 +26,11 @@ import org.slf4j.LoggerFactory; import org.apache.cassandra.cql3.CQL3Type; +import org.apache.cassandra.cql3.ColumnSpecification; +import org.apache.cassandra.cql3.Lists; +import org.apache.cassandra.cql3.Maps; +import org.apache.cassandra.cql3.Sets; + import org.apache.cassandra.serializers.CollectionSerializer; import org.apache.cassandra.serializers.MarshalException; import org.apache.cassandra.utils.ByteBufferUtil; @@ -43,7 +48,29 @@ public abstract class CollectionType extends AbstractType public enum Kind { - MAP, SET, LIST + MAP + { + public ColumnSpecification makeCollectionReceiver(ColumnSpecification collection, boolean isKey) + { + return isKey ? Maps.keySpecOf(collection) : Maps.valueSpecOf(collection); + } + }, + SET + { + public ColumnSpecification makeCollectionReceiver(ColumnSpecification collection, boolean isKey) + { + return Sets.valueSpecOf(collection); + } + }, + LIST + { + public ColumnSpecification makeCollectionReceiver(ColumnSpecification collection, boolean isKey) + { + return Lists.valueSpecOf(collection); + } + }; + + public abstract ColumnSpecification makeCollectionReceiver(ColumnSpecification collection, boolean isKey); } public final Kind kind; @@ -59,6 +86,11 @@ protected CollectionType(Kind kind) @Override public abstract CollectionSerializer getSerializer(); + public ColumnSpecification makeCollectionReceiver(ColumnSpecification collection, boolean isKey) + { + return kind.makeCollectionReceiver(collection, isKey); + } + public String getString(ByteBuffer bytes) { return BytesType.instance.getString(bytes); diff --git a/src/java/org/apache/cassandra/exceptions/UnrecognizedEntityException.java b/src/java/org/apache/cassandra/exceptions/UnrecognizedEntityException.java new file mode 100644 index 000000000000..e8392e9862ab --- /dev/null +++ b/src/java/org/apache/cassandra/exceptions/UnrecognizedEntityException.java @@ -0,0 +1,49 @@ +/* + * 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.exceptions; + +import org.apache.cassandra.cql3.ColumnIdentifier; +import org.apache.cassandra.cql3.Relation; + +/** + * Exception thrown when an entity is not recognized within a relation. + */ +public final class UnrecognizedEntityException extends InvalidRequestException +{ + /** + * The unrecognized entity. + */ + public final ColumnIdentifier entity; + + /** + * The entity relation. + */ + public final Relation relation; + + /** + * Creates a new UnrecognizedEntityException. + * @param entity the unrecognized entity + * @param relation the entity relation + */ + public UnrecognizedEntityException(ColumnIdentifier entity, Relation relation) + { + super(String.format("Undefined name %s in where clause ('%s')", entity, relation)); + this.entity = entity; + this.relation = relation; + } +} diff --git a/test/unit/org/apache/cassandra/cql3/AliasTest.java b/test/unit/org/apache/cassandra/cql3/AliasTest.java new file mode 100644 index 000000000000..132aa045742e --- /dev/null +++ b/test/unit/org/apache/cassandra/cql3/AliasTest.java @@ -0,0 +1,40 @@ +/* + * 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.cql3; + +import org.junit.Test; + +public class AliasTest extends CQLTester +{ + @Test + public void testAlias() throws Throwable + { + createTable("CREATE TABLE %s (id int PRIMARY KEY, name text)"); + + for (int i = 0; i < 5; i++) + execute("INSERT INTO %s (id, name) VALUES (?, ?) USING TTL 10 AND TIMESTAMP 0", i, Integer.toString(i)); + + assertInvalidMessage("Aliases aren't allowed in the where clause" , + "SELECT id AS user_id, name AS user_name FROM %s WHERE user_id = 0"); + + // test that select throws a meaningful exception for aliases in order by clause + assertInvalidMessage("Aliases are not allowed in order by clause", + "SELECT id AS user_id, name AS user_name FROM %s WHERE id IN (0) ORDER BY user_name"); + + } +} diff --git a/test/unit/org/apache/cassandra/cql3/ContainsRelationTest.java b/test/unit/org/apache/cassandra/cql3/ContainsRelationTest.java index 12d65fabef85..8f78553ab552 100644 --- a/test/unit/org/apache/cassandra/cql3/ContainsRelationTest.java +++ b/test/unit/org/apache/cassandra/cql3/ContainsRelationTest.java @@ -26,7 +26,11 @@ public void testSetContains() throws Throwable row("test", 5, set("lmn")) ); - assertInvalid("SELECT * FROM %s WHERE account = ? AND categories CONTAINS ? AND categories CONTAINS ?", "xyz", "lmn", "notPresent"); + assertInvalidMessage("Unsupported null value for indexed column categories", + "SELECT * FROM %s WHERE account = ? AND id = ? AND categories CONTAINS ?", "test", 5, null); + + assertInvalidMessage("Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING", + "SELECT * FROM %s WHERE account = ? AND categories CONTAINS ? AND categories CONTAINS ?", "xyz", "lmn", "notPresent"); assertEmpty(execute("SELECT * FROM %s WHERE account = ? AND categories CONTAINS ? AND categories CONTAINS ? ALLOW FILTERING", "xyz", "lmn", "notPresent")); } @@ -52,8 +56,12 @@ public void testListContains() throws Throwable row("test", 5, list("lmn")) ); - assertInvalid("SELECT * FROM %s WHERE account = ? AND id = ? AND categories CONTAINS ? AND categories CONTAINS ?", - "test", 5, "lmn", "notPresent"); + assertInvalidMessage("Unsupported null value for indexed column categories", + "SELECT * FROM %s WHERE account = ? AND id = ? AND categories CONTAINS ?", "test", 5, null); + + assertInvalidMessage("Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING", + "SELECT * FROM %s WHERE account = ? AND id = ? AND categories CONTAINS ? AND categories CONTAINS ?", + "test", 5, "lmn", "notPresent"); assertEmpty(execute("SELECT * FROM %s WHERE account = ? AND id = ? AND categories CONTAINS ? AND categories CONTAINS ? ALLOW FILTERING", "test", 5, "lmn", "notPresent")); } @@ -79,13 +87,18 @@ public void testMapKeyContains() throws Throwable row("test", 5, map("lmn", "foo")) ); - assertInvalid("SELECT * FROM %s WHERE account = ? AND id = ? AND categories CONTAINS KEY ? AND categories CONTAINS KEY ?", - "test", 5, "lmn", "notPresent"); + assertInvalidMessage("Unsupported null value for indexed column categories", + "SELECT * FROM %s WHERE account = ? AND id = ? AND categories CONTAINS KEY ?", "test", 5, null); + + assertInvalidMessage("Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING", + "SELECT * FROM %s WHERE account = ? AND id = ? AND categories CONTAINS KEY ? AND categories CONTAINS KEY ?", + "test", 5, "lmn", "notPresent"); assertEmpty(execute("SELECT * FROM %s WHERE account = ? AND id = ? AND categories CONTAINS KEY ? AND categories CONTAINS KEY ? ALLOW FILTERING", "test", 5, "lmn", "notPresent")); - assertInvalid("SELECT * FROM %s WHERE account = ? AND id = ? AND categories CONTAINS KEY ? AND categories CONTAINS ?", - "test", 5, "lmn", "foo"); + assertInvalidMessage("Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING", + "SELECT * FROM %s WHERE account = ? AND id = ? AND categories CONTAINS KEY ? AND categories CONTAINS ?", + "test", 5, "lmn", "foo"); } @Test @@ -110,7 +123,11 @@ public void testMapValueContains() throws Throwable row("test", 5, map("lmn", "foo")) ); - assertInvalid("SELECT * FROM %s WHERE account = ? AND id = ? AND categories CONTAINS ? AND categories CONTAINS ?" + assertInvalidMessage("Unsupported null value for indexed column categories", + "SELECT * FROM %s WHERE account = ? AND id = ? AND categories CONTAINS ?", "test", 5, null); + + assertInvalidMessage("Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING", + "SELECT * FROM %s WHERE account = ? AND id = ? AND categories CONTAINS ? AND categories CONTAINS ?" , "test", 5, "foo", "notPresent"); assertEmpty(execute("SELECT * FROM %s WHERE account = ? AND id = ? AND categories CONTAINS ? AND categories CONTAINS ? ALLOW FILTERING" @@ -197,7 +214,8 @@ public void testContainsKeyAndContainsWithIndexOnMapKey() throws Throwable execute("INSERT INTO %s (account, id , categories) VALUES (?, ?, ?)", "test", 5, map("lmn", "foo")); execute("INSERT INTO %s (account, id , categories) VALUES (?, ?, ?)", "test", 6, map("lmn", "foo2")); - assertInvalid("SELECT * FROM %s WHERE account = ? AND categories CONTAINS ?", "test", "foo"); + assertInvalidMessage("No secondary indexes on the restricted columns support the provided operators: 'categories CONTAINS '", + "SELECT * FROM %s WHERE account = ? AND categories CONTAINS ?", "test", "foo"); assertRows(execute("SELECT * FROM %s WHERE account = ? AND categories CONTAINS KEY ?", "test", "lmn"), row("test", 5, map("lmn", "foo")), @@ -219,7 +237,8 @@ public void testContainsKeyAndContainsWithIndexOnMapValue() throws Throwable execute("INSERT INTO %s (account, id , categories) VALUES (?, ?, ?)", "test", 5, map("lmn", "foo")); execute("INSERT INTO %s (account, id , categories) VALUES (?, ?, ?)", "test", 6, map("lmn2", "foo")); - assertInvalid("SELECT * FROM %s WHERE account = ? AND categories CONTAINS KEY ?", "test", "lmn"); + assertInvalidMessage("No secondary indexes on the restricted columns support the provided operators: 'categories CONTAINS KEY '", + "SELECT * FROM %s WHERE account = ? AND categories CONTAINS KEY ?", "test", "lmn"); assertRows(execute("SELECT * FROM %s WHERE account = ? AND categories CONTAINS ?", "test", "foo"), row("test", 5, map("lmn", "foo")), diff --git a/test/unit/org/apache/cassandra/cql3/FrozenCollectionsTest.java b/test/unit/org/apache/cassandra/cql3/FrozenCollectionsTest.java index bf7ccfd862d2..896bc5fcd399 100644 --- a/test/unit/org/apache/cassandra/cql3/FrozenCollectionsTest.java +++ b/test/unit/org/apache/cassandra/cql3/FrozenCollectionsTest.java @@ -75,8 +75,8 @@ public void testPartitionKeyUsage() throws Throwable ); assertRows(execute("SELECT * FROM %s WHERE k IN ?", list(set(4, 5, 6), set())), - row(set(4, 5, 6), 0), - row(set(), 0) + row(set(), 0), + row(set(4, 5, 6), 0) ); assertRows(execute("SELECT * FROM %s WHERE token(k) >= token(?)", set(4, 5, 6)), @@ -144,9 +144,9 @@ public void testNestedPartitionKeyUsage() throws Throwable ); assertRows(execute("SELECT * FROM %s WHERE k IN ?", list(map(set(4, 5, 6), list(1, 2, 3)), map(), map(set(), list(1, 2, 3)))), - row(map(set(4, 5, 6), list(1, 2, 3)), 0), - row(map(), 0), - row(map(set(), list(1, 2, 3)), 0) + row(map(), 0), + row(map(set(), list(1, 2, 3)), 0), + row(map(set(4, 5, 6), list(1, 2, 3)), 0) ); assertRows(execute("SELECT * FROM %s WHERE token(k) >= token(?)", map(set(4, 5, 6), list(1, 2, 3))), @@ -615,10 +615,10 @@ public void testSecondaryIndex() throws Throwable "SELECT * FROM %s WHERE c CONTAINS KEY ?", 1); // normal indexes on frozen collections don't support CONTAINS or CONTAINS KEY - assertInvalidMessage("Cannot restrict column \"b\" by a CONTAINS relation without a secondary index", + assertInvalidMessage("Cannot restrict clustering columns by a CONTAINS relation without a secondary index", "SELECT * FROM %s WHERE b CONTAINS ?", 1); - assertInvalidMessage("Cannot restrict column \"b\" by a CONTAINS relation without a secondary index", + assertInvalidMessage("Cannot restrict clustering columns by a CONTAINS relation without a secondary index", "SELECT * FROM %s WHERE b CONTAINS ? ALLOW FILTERING", 1); assertInvalidMessage("No secondary indexes on the restricted columns support the provided operator", @@ -627,7 +627,7 @@ public void testSecondaryIndex() throws Throwable assertInvalidMessage("No secondary indexes on the restricted columns support the provided operator", "SELECT * FROM %s WHERE d CONTAINS KEY ? ALLOW FILTERING", 1); - assertInvalidMessage("Cannot restrict column \"b\" by a CONTAINS relation without a secondary index", + assertInvalidMessage("Cannot restrict clustering columns by a CONTAINS relation without a secondary index", "SELECT * FROM %s WHERE b CONTAINS ? AND d CONTAINS KEY ? ALLOW FILTERING", 1, 1); // index lookup on b diff --git a/test/unit/org/apache/cassandra/cql3/MultiColumnRelationTest.java b/test/unit/org/apache/cassandra/cql3/MultiColumnRelationTest.java index 4c3ba2a03ed2..291afd8a2646 100644 --- a/test/unit/org/apache/cassandra/cql3/MultiColumnRelationTest.java +++ b/test/unit/org/apache/cassandra/cql3/MultiColumnRelationTest.java @@ -24,56 +24,77 @@ public class MultiColumnRelationTest extends CQLTester @Test public void testSingleClusteringInvalidQueries() throws Throwable { - for (String compactOption : new String[]{"", " WITH COMPACT STORAGE"}) + for (String compactOption : new String[] { "", " WITH COMPACT STORAGE" }) { createTable("CREATE TABLE %s (a int, b int, c int, PRIMARY KEY (a, b))" + compactOption); assertInvalidSyntax("SELECT * FROM %s WHERE () = (?, ?)", 1, 2); - assertInvalid("SELECT * FROM %s WHERE a = 0 AND (b) = (?) AND (b) > (?)", 0, 0); - assertInvalid("SELECT * FROM %s WHERE a = 0 AND (b) > (?) AND (b) > (?)", 0, 1); - assertInvalid("SELECT * FROM %s WHERE (a, b) = (?, ?)", 0, 0); + assertInvalidMessage("b cannot be restricted by more than one relation if it includes an Equal", + "SELECT * FROM %s WHERE a = 0 AND (b) = (?) AND (b) > (?)", 0, 0); + assertInvalidMessage("More than one restriction was found for the start bound on b", + "SELECT * FROM %s WHERE a = 0 AND (b) > (?) AND (b) > (?)", 0, 1); + assertInvalidMessage("Multi-column relations can only be applied to clustering columns but was applied to: a", + "SELECT * FROM %s WHERE (a, b) = (?, ?)", 0, 0); } } @Test public void testMultiClusteringInvalidQueries() throws Throwable { - for (String compactOption : new String[]{"", " WITH COMPACT STORAGE"}) + for (String compactOption : new String[] { "", " WITH COMPACT STORAGE" }) { createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a, b, c, d))" + compactOption); assertInvalidSyntax("SELECT * FROM %s WHERE a = 0 AND (b, c) > ()"); - assertInvalid("SELECT * FROM %s WHERE a = 0 AND (b, c) > (?, ?, ?)", 1, 2, 3); - assertInvalid("SELECT * FROM %s WHERE a = 0 AND (b, c) > (?, ?)", 1, null); + assertInvalidMessage("Expected 2 elements in value tuple, but got 3: (?, ?, ?)", + "SELECT * FROM %s WHERE a = 0 AND (b, c) > (?, ?, ?)", 1, 2, 3); + assertInvalidMessage("Invalid null value in condition for column c", + "SELECT * FROM %s WHERE a = 0 AND (b, c) > (?, ?)", 1, null); // Wrong order of columns - assertInvalid("SELECT * FROM %s WHERE a = 0 AND (d, c, b) = (?, ?, ?)", 0, 0, 0); - assertInvalid("SELECT * FROM %s WHERE a = 0 AND (d, c, b) > (?, ?, ?)", 0, 0, 0); + assertInvalidMessage("Clustering columns may not be skipped in multi-column relations. They should appear in the PRIMARY KEY order. Got (d, c, b) = (?, ?, ?)", + "SELECT * FROM %s WHERE a = 0 AND (d, c, b) = (?, ?, ?)", 0, 0, 0); + assertInvalidMessage("Clustering columns may not be skipped in multi-column relations. They should appear in the PRIMARY KEY order. Got (d, c, b) > (?, ?, ?)", + "SELECT * FROM %s WHERE a = 0 AND (d, c, b) > (?, ?, ?)", 0, 0, 0); // Wrong number of values - assertInvalid("SELECT * FROM %s WHERE a=0 AND (b, c, d) IN ((?, ?))", 0, 1); - assertInvalid("SELECT * FROM %s WHERE a=0 AND (b, c, d) IN ((?, ?, ?, ?, ?))", 0, 1, 2, 3, 4); + assertInvalidMessage("Expected 3 elements in value tuple, but got 2: (?, ?)", + "SELECT * FROM %s WHERE a=0 AND (b, c, d) IN ((?, ?))", 0, 1); + assertInvalidMessage("Expected 3 elements in value tuple, but got 5: (?, ?, ?, ?, ?)", + "SELECT * FROM %s WHERE a=0 AND (b, c, d) IN ((?, ?, ?, ?, ?))", 0, 1, 2, 3, 4); // Missing first clustering column - assertInvalid("SELECT * FROM %s WHERE a = 0 AND (c, d) = (?, ?)", 0, 0); - assertInvalid("SELECT * FROM %s WHERE a = 0 AND (c, d) > (?, ?)", 0, 0); + assertInvalidMessage("Clustering columns may not be skipped in multi-column relations. They should appear in the PRIMARY KEY order. Got (c, d) = (?, ?)", + "SELECT * FROM %s WHERE a = 0 AND (c, d) = (?, ?)", 0, 0); + assertInvalidMessage("Clustering columns may not be skipped in multi-column relations. They should appear in the PRIMARY KEY order. Got (c, d) > (?, ?)", + "SELECT * FROM %s WHERE a = 0 AND (c, d) > (?, ?)", 0, 0); // Nulls - assertInvalid("SELECT * FROM %s WHERE a = 0 AND (b, c, d) IN ((?, ?, ?))", 1, 2, null); + assertInvalidMessage("Invalid null value in condition for column d", + "SELECT * FROM %s WHERE a = 0 AND (b, c, d) IN ((?, ?, ?))", 1, 2, null); // Wrong type for 'd' assertInvalid("SELECT * FROM %s WHERE a = 0 AND (b, c, d) = (?, ?, ?)", 1, 2, "foobar"); - assertInvalid("SELECT * FROM %s WHERE a = 0 AND b = (?, ?, ?)", 1, 2, 3); // Mix single and tuple inequalities - assertInvalid("SELECT * FROM %s WHERE a = 0 AND (b, c, d) > (?, ?, ?) AND b < ?", 0, 1, 0, 1); - assertInvalid("SELECT * FROM %s WHERE a = 0 AND (b, c, d) > (?, ?, ?) AND c < ?", 0, 1, 0, 1); - assertInvalid("SELECT * FROM %s WHERE a = 0 AND b > ? AND (b, c, d) < (?, ?, ?)", 1, 1, 1, 0); - assertInvalid("SELECT * FROM %s WHERE a = 0 AND c > ? AND (b, c, d) < (?, ?, ?)", 1, 1, 1, 0); - - assertInvalid("SELECT * FROM %s WHERE (a, b, c, d) IN ((?, ?, ?, ?))", 0, 1, 2, 3); - assertInvalid("SELECT * FROM %s WHERE (c, d) IN ((?, ?))", 0, 1); + assertInvalidMessage("Mixing single column relations and multi column relations on clustering columns is not allowed", + "SELECT * FROM %s WHERE a = 0 AND (b, c, d) > (?, ?, ?) AND b < ?", 0, 1, 0, 1); + assertInvalidMessage("Mixing single column relations and multi column relations on clustering columns is not allowed", + "SELECT * FROM %s WHERE a = 0 AND (b, c, d) > (?, ?, ?) AND c < ?", 0, 1, 0, 1); + assertInvalidMessage("Mixing single column relations and multi column relations on clustering columns is not allowed", + "SELECT * FROM %s WHERE a = 0 AND b > ? AND (b, c, d) < (?, ?, ?)", 1, 1, 1, 0); + assertInvalidMessage("Mixing single column relations and multi column relations on clustering columns is not allowed", + "SELECT * FROM %s WHERE a = 0 AND c > ? AND (b, c, d) < (?, ?, ?)", 1, 1, 1, 0); + + assertInvalidMessage("Multi-column relations can only be applied to clustering columns but was applied to: a", + "SELECT * FROM %s WHERE (a, b, c, d) IN ((?, ?, ?, ?))", 0, 1, 2, 3); + assertInvalidMessage("Clustering columns may not be skipped in multi-column relations. They should appear in the PRIMARY KEY order. Got (c, d) IN ((?, ?))", + "SELECT * FROM %s WHERE (c, d) IN ((?, ?))", 0, 1); + + assertInvalidMessage("Mixing single column relations and multi column relations on clustering columns is not allowed", + "SELECT * FROM %s WHERE a = ? AND (b, c) in ((?, ?), (?, ?)) AND d > ?", + 0, 0, 0, 0, 0, 0); assertInvalid("SELECT * FROM %s WHERE a = ? AND (b, c) in ((?, ?), (?, ?)) AND d > ?", 0, 0, 0, 0, 0, 0); } @@ -85,10 +106,12 @@ public void testSinglePartitionInvalidQueries() throws Throwable for (String compactOption : new String[]{"", " WITH COMPACT STORAGE"}) { createTable("CREATE TABLE %s (a int PRIMARY KEY, b int)" + compactOption); - - assertInvalid("SELECT * FROM %s WHERE (a) > (?)", 0); - assertInvalid("SELECT * FROM %s WHERE (a) = (?)", 0); - assertInvalid("SELECT * FROM %s WHERE (b) = (?)", 0); + assertInvalidMessage("Multi-column relations can only be applied to clustering columns but was applied to: a", + "SELECT * FROM %s WHERE (a) > (?)", 0); + assertInvalidMessage("Multi-column relations can only be applied to clustering columns but was applied to: a", + "SELECT * FROM %s WHERE (a) = (?)", 0); + assertInvalidMessage("Multi-column relations can only be applied to clustering columns but was applied to: b", + "SELECT * FROM %s WHERE (b) = (?)", 0); } } @@ -150,7 +173,8 @@ public void testNonEqualsRelation() throws Throwable for (String compactOption : new String[]{"", " WITH COMPACT STORAGE"}) { createTable("CREATE TABLE %s (a int PRIMARY KEY, b int)" + compactOption); - assertInvalid("SELECT * FROM %s WHERE a = 0 AND (b) != (0)"); + assertInvalidMessage("Unsupported \"!=\" relation: (b) != (0)", + "SELECT * FROM %s WHERE a = 0 AND (b) != (0)"); } } @@ -444,10 +468,10 @@ public void testMultipleClustering() throws Throwable // same query, but reversed order for the IN values assertRows(execute("SELECT * FROM %s WHERE a IN (?, ?) AND (b, c, d) IN (?, ?)", 1, 0, tuple(0, 1, 1), tuple(0, 1, 0)), - row(1, 0, 1, 0), - row(1, 0, 1, 1), row(0, 0, 1, 0), - row(0, 0, 1, 1) + row(0, 0, 1, 1), + row(1, 0, 1, 0), + row(1, 0, 1, 1) ); assertRows(execute("SELECT * FROM %s WHERE a IN (?, ?) and (b, c) IN ((?, ?))", 0, 1, 0, 1), @@ -555,4 +579,81 @@ public void testMultipleClusteringReversedComponents() throws Throwable assertEmpty(execute("SELECT * FROM %s WHERE a = ? AND (b, c) > (?, ?)", 0, 1, 0)); } } + + @Test + public void testMultipleClusteringWithIndex() throws Throwable + { + createTable("CREATE TABLE %s (a int, b int, c int, d int, e int, PRIMARY KEY (a, b, c, d))"); + createIndex("CREATE INDEX ON %s (b)"); + createIndex("CREATE INDEX ON %s (e)"); + + execute("INSERT INTO %s (a, b, c, d, e) VALUES (?, ?, ?, ?, ?)", 0, 0, 0, 0, 0); + execute("INSERT INTO %s (a, b, c, d, e) VALUES (?, ?, ?, ?, ?)", 0, 0, 1, 0, 1); + execute("INSERT INTO %s (a, b, c, d, e) VALUES (?, ?, ?, ?, ?)", 0, 0, 1, 1, 2); + + execute("INSERT INTO %s (a, b, c, d, e) VALUES (?, ?, ?, ?, ?)", 0, 1, 0, 0, 0); + execute("INSERT INTO %s (a, b, c, d, e) VALUES (?, ?, ?, ?, ?)", 0, 1, 1, 0, 1); + execute("INSERT INTO %s (a, b, c, d, e) VALUES (?, ?, ?, ?, ?)", 0, 1, 1, 1, 2); + + execute("INSERT INTO %s (a, b, c, d, e) VALUES (?, ?, ?, ?, ?)", 0, 2, 0, 0, 0); + + assertRows(execute("SELECT * FROM %s WHERE (b) = (?)", 1), + row(0, 1, 0, 0, 0), + row(0, 1, 1, 0, 1), + row(0, 1, 1, 1, 2)); + + assertRows(execute("SELECT * FROM %s WHERE (b, c) = (?, ?) ALLOW FILTERING", 1, 1), + row(0, 1, 1, 0, 1), + row(0, 1, 1, 1, 2)); + + assertRows(execute("SELECT * FROM %s WHERE (b, c) = (?, ?) AND e = ? ALLOW FILTERING", 1, 1, 2), + row(0, 1, 1, 1, 2)); + + assertRows(execute("SELECT * FROM %s WHERE (b) IN ((?)) AND e = ? ALLOW FILTERING", 1, 2), + row(0, 1, 1, 1, 2)); + + assertInvalidMessage("IN restrictions are not supported on indexed columns", + "SELECT * FROM %s WHERE (b) IN ((?), (?)) AND e = ? ALLOW FILTERING", 0, 1, 2); + + assertInvalidMessage("IN restrictions are not supported on indexed columns", + "SELECT * FROM %s WHERE (b, c) IN ((?, ?)) AND e = ? ALLOW FILTERING", 0, 1, 2); + + assertInvalidMessage("IN restrictions are not supported on indexed columns", + "SELECT * FROM %s WHERE (b, c) IN ((?, ?), (?, ?)) AND e = ? ALLOW FILTERING", 0, 1, 1, 1, 2); + + assertInvalidMessage("Slice restrictions are not supported on indexed columns which are part of a multi column relation", + "SELECT * FROM %s WHERE (b) >= (?) AND e = ? ALLOW FILTERING", 1, 2); + } + + @Test + public void testMultiplePartitionKeyAndMultiClusteringWithIndex() throws Throwable + { + createTable("CREATE TABLE %s (a int, b int, c int, d int, e int, PRIMARY KEY ((a, b), c, d, e))"); + createIndex("CREATE INDEX ON %s (c)"); + + execute("INSERT INTO %s (a, b, c, d, e) VALUES (?, ?, ?, ?, ?)", 0, 0, 0, 0, 0); + execute("INSERT INTO %s (a, b, c, d, e) VALUES (?, ?, ?, ?, ?)", 0, 0, 0, 1, 0); + execute("INSERT INTO %s (a, b, c, d, e) VALUES (?, ?, ?, ?, ?)", 0, 0, 0, 1, 1); + + execute("INSERT INTO %s (a, b, c, d, e) VALUES (?, ?, ?, ?, ?)", 0, 0, 1, 0, 0); + execute("INSERT INTO %s (a, b, c, d, e) VALUES (?, ?, ?, ?, ?)", 0, 0, 1, 1, 0); + execute("INSERT INTO %s (a, b, c, d, e) VALUES (?, ?, ?, ?, ?)", 0, 0, 1, 1, 1); + + execute("INSERT INTO %s (a, b, c, d, e) VALUES (?, ?, ?, ?, ?)", 0, 0, 2, 0, 0); + + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (c) = (?) ALLOW FILTERING", 0, 1), + row(0, 0, 1, 0, 0), + row(0, 0, 1, 1, 0), + row(0, 0, 1, 1, 1)); + + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (c, d) = (?, ?) ALLOW FILTERING", 0, 1, 1), + row(0, 0, 1, 1, 0), + row(0, 0, 1, 1, 1)); + + assertInvalidMessage("Partition key parts: b must be restricted as other parts are", + "SELECT * FROM %s WHERE a = ? AND (c, d) IN ((?, ?)) ALLOW FILTERING", 0, 1, 1); + + assertInvalidMessage("Partition key parts: b must be restricted as other parts are", + "SELECT * FROM %s WHERE a = ? AND (c, d) >= (?, ?) ALLOW FILTERING", 0, 1, 1); + } } diff --git a/test/unit/org/apache/cassandra/cql3/SelectWithTokenFunctionTest.java b/test/unit/org/apache/cassandra/cql3/SelectWithTokenFunctionTest.java index 6f9f5e278671..39b62e37c175 100644 --- a/test/unit/org/apache/cassandra/cql3/SelectWithTokenFunctionTest.java +++ b/test/unit/org/apache/cassandra/cql3/SelectWithTokenFunctionTest.java @@ -30,17 +30,34 @@ public void testTokenFunctionWithSingleColumnPartitionKey() throws Throwable assertRows(execute("SELECT * FROM %s WHERE token(a) >= token(?)", 0), row(0, "a")); assertRows(execute("SELECT * FROM %s WHERE token(a) >= token(?) and token(a) < token(?)", 0, 1), row(0, "a")); assertInvalid("SELECT * FROM %s WHERE token(a) > token(?)", "a"); - assertInvalid("SELECT * FROM %s WHERE token(a, b) >= token(?, ?)", "b", 0); - assertInvalid("SELECT * FROM %s WHERE token(a) >= token(?) and token(a) >= token(?)", 0, 1); - assertInvalid("SELECT * FROM %s WHERE token(a) >= token(?) and token(a) = token(?)", 0, 1); + assertInvalidMessage("Columns \"a\" cannot be restricted by both a normal relation and a token relation", + "SELECT * FROM %s WHERE token(a) > token(?) AND a = ?", 1, 1); + assertInvalidMessage("Columns \"a\" cannot be restricted by both a normal relation and a token relation", + "SELECT * FROM %s WHERE a = ? and token(a) > token(?)", 1, 1); + assertInvalidMessage("The token() function must contains only partition key components", + "SELECT * FROM %s WHERE token(a, b) >= token(?, ?)", "b", 0); + assertInvalidMessage("More than one restriction was found for the start bound on a", + "SELECT * FROM %s WHERE token(a) >= token(?) and token(a) >= token(?)", 0, 1); + assertInvalidMessage("Columns \"a\" cannot be restricted by both an equality and an inequality relation", + "SELECT * FROM %s WHERE token(a) >= token(?) and token(a) = token(?)", 0, 1); assertInvalidSyntax("SELECT * FROM %s WHERE token(a) = token(?) and token(a) IN (token(?))", 0, 1); + + assertInvalidMessage("More than one restriction was found for the start bound on a", + "SELECT * FROM %s WHERE token(a) > token(?) AND token(a) > token(?)", 1, 2); + assertInvalidMessage("More than one restriction was found for the end bound on a", + "SELECT * FROM %s WHERE token(a) <= token(?) AND token(a) < token(?)", 1, 2); + assertInvalidMessage("Columns \"a\" cannot be restricted by both an equality and an inequality relation", + "SELECT * FROM %s WHERE token(a) > token(?) AND token(a) = token(?)", 1, 2); + assertInvalidMessage("a cannot be restricted by more than one relation if it includes an Equal", + "SELECT * FROM %s WHERE token(a) = token(?) AND token(a) > token(?)", 1, 2); } @Test public void testTokenFunctionWithPartitionKeyAndClusteringKeyArguments() throws Throwable { createTable("CREATE TABLE IF NOT EXISTS %s (a int, b text, PRIMARY KEY (a, b))"); - assertInvalid("SELECT * FROM %s WHERE token(a, b) > token(0, 'c')"); + assertInvalidMessage("The token() function must contains only partition key components", + "SELECT * FROM %s WHERE token(a, b) > token(0, 'c')"); } @Test @@ -59,8 +76,16 @@ public void testTokenFunctionWithMultiColumnPartitionKey() throws Throwable 0, "d"), row(0, "b"), row(0, "c")); - assertInvalid("SELECT * FROM %s WHERE token(a) > token(?) and token(b) > token(?)", 0, "a"); - assertInvalid("SELECT * FROM %s WHERE token(a) > token(?, ?) and token(a) < token(?, ?) and token(b) > token(?, ?) ", 0, "a", 0, "d", 0, "a"); - assertInvalid("SELECT * FROM %s WHERE token(b, a) > token(0, 'c')"); + assertInvalidMessage("The token() function must be applied to all partition key components or none of them", + "SELECT * FROM %s WHERE token(a) > token(?) and token(b) > token(?)", 0, "a"); + assertInvalidMessage("The token() function must be applied to all partition key components or none of them", + "SELECT * FROM %s WHERE token(a) > token(?, ?) and token(a) < token(?, ?) and token(b) > token(?, ?) ", + 0, "a", 0, "d", 0, "a"); + assertInvalidMessage("The token function arguments must be in the partition key order: a, b", + "SELECT * FROM %s WHERE token(b, a) > token(0, 'c')"); + assertInvalidMessage("The token() function must be applied to all partition key components or none of them", + "SELECT * FROM %s WHERE token(a, b) > token(?, ?) and token(b) < token(?, ?)", 0, "a", 0, "a"); + assertInvalidMessage("The token() function must be applied to all partition key components or none of them", + "SELECT * FROM %s WHERE token(a) > token(?, ?) and token(b) > token(?, ?)", 0, "a", 0, "a"); } } diff --git a/test/unit/org/apache/cassandra/cql3/SingleColumnRelationTest.java b/test/unit/org/apache/cassandra/cql3/SingleColumnRelationTest.java index c93147bdc03b..112da06e86e5 100644 --- a/test/unit/org/apache/cassandra/cql3/SingleColumnRelationTest.java +++ b/test/unit/org/apache/cassandra/cql3/SingleColumnRelationTest.java @@ -31,9 +31,12 @@ public void testInvalidCollectionEqualityRelation() throws Throwable createIndex("CREATE INDEX ON %s (c)"); createIndex("CREATE INDEX ON %s (d)"); - assertInvalid("SELECT * FROM %s WHERE a = 0 AND b=?", set(0)); - assertInvalid("SELECT * FROM %s WHERE a = 0 AND c=?", list(0)); - assertInvalid("SELECT * FROM %s WHERE a = 0 AND d=?", map(0, 0)); + assertInvalidMessage("Collection column 'b' (set) cannot be restricted by a '=' relation", + "SELECT * FROM %s WHERE a = 0 AND b=?", set(0)); + assertInvalidMessage("Collection column 'c' (list) cannot be restricted by a '=' relation", + "SELECT * FROM %s WHERE a = 0 AND c=?", list(0)); + assertInvalidMessage("Collection column 'd' (map) cannot be restricted by a '=' relation", + "SELECT * FROM %s WHERE a = 0 AND d=?", map(0, 0)); } @Test @@ -44,11 +47,16 @@ public void testInvalidCollectionNonEQRelation() throws Throwable execute("INSERT INTO %s (a, b, c) VALUES (0, {0}, 0)"); // non-EQ operators - assertInvalid("SELECT * FROM %s WHERE c = 0 AND b > ?", set(0)); - assertInvalid("SELECT * FROM %s WHERE c = 0 AND b >= ?", set(0)); - assertInvalid("SELECT * FROM %s WHERE c = 0 AND b < ?", set(0)); - assertInvalid("SELECT * FROM %s WHERE c = 0 AND b <= ?", set(0)); - assertInvalid("SELECT * FROM %s WHERE c = 0 AND b IN (?)", set(0)); + assertInvalidMessage("Collection column 'b' (set) cannot be restricted by a '>' relation", + "SELECT * FROM %s WHERE c = 0 AND b > ?", set(0)); + assertInvalidMessage("Collection column 'b' (set) cannot be restricted by a '>=' relation", + "SELECT * FROM %s WHERE c = 0 AND b >= ?", set(0)); + assertInvalidMessage("Collection column 'b' (set) cannot be restricted by a '<' relation", + "SELECT * FROM %s WHERE c = 0 AND b < ?", set(0)); + assertInvalidMessage("Collection column 'b' (set) cannot be restricted by a '<=' relation", + "SELECT * FROM %s WHERE c = 0 AND b <= ?", set(0)); + assertInvalidMessage("Collection column 'b' (set) cannot be restricted by a 'IN' relation", + "SELECT * FROM %s WHERE c = 0 AND b IN (?)", set(0)); } @Test @@ -114,7 +122,8 @@ private void testSelectQueriesWithClusteringColumnRelations() throws Throwable row("first", 2, 6, 2), row("first", 3, 7, 3)); - assertInvalid("select * from %s where a = ? and b in ? and c in ?", "first", null, Arrays.asList(7, 6)); + assertInvalidMessage("Invalid null value for IN restriction", + "select * from %s where a = ? and b in ? and c in ?", "first", null, Arrays.asList(7, 6)); assertRows(execute("select * from %s where a = ? and c >= ? and b in (?, ?)", "first", 6, 3, 2), row("first", 2, 6, 2), @@ -128,11 +137,32 @@ private void testSelectQueriesWithClusteringColumnRelations() throws Throwable assertRows(execute("select * from %s where a = ? and c < ? and b in (?, ?)", "first", 7, 3, 2), row("first", 2, 6, 2)); +//--- + assertRows(execute("select * from %s where a = ? and c >= ? and c <= ? and b in (?, ?)", "first", 6, 7, 3, 2), + row("first", 2, 6, 2), + row("first", 3, 7, 3)); + + assertRows(execute("select * from %s where a = ? and c > ? and c <= ? and b in (?, ?)", "first", 6, 7, 3, 2), + row("first", 3, 7, 3)); + + assertEmpty(execute("select * from %s where a = ? and c > ? and c < ? and b in (?, ?)", "first", 6, 7, 3, 2)); + + assertInvalidMessage("Column \"c\" cannot be restricted by both an equality and an inequality relation", + "select * from %s where a = ? and c > ? and c = ? and b in (?, ?)", "first", 6, 7, 3, 2); + + assertInvalidMessage("c cannot be restricted by more than one relation if it includes an Equal", + "select * from %s where a = ? and c = ? and c > ? and b in (?, ?)", "first", 6, 7, 3, 2); assertRows(execute("select * from %s where a = ? and c in (?, ?) and b in (?, ?) order by b DESC", "first", 7, 6, 3, 2), row("first", 3, 7, 3), row("first", 2, 6, 2)); + + assertInvalidMessage("More than one restriction was found for the start bound on b", + "select * from %s where a = ? and b > ? and b > ?", "first", 6, 3, 2); + + assertInvalidMessage("More than one restriction was found for the end bound on b", + "select * from %s where a = ? and b < ? and b <= ?", "first", 6, 3, 2); } @Test @@ -144,8 +174,16 @@ public void testPartitionKeyColumnRelations() throws Throwable execute("insert into %s (a, b, c, d) values (?, ?, ?, ?)", "first", 3, 3, 3); execute("insert into %s (a, b, c, d) values (?, ?, ?, ?)", "second", 4, 4, 4); - assertInvalid("select * from %s where a in (?, ?)", "first", "second"); - assertInvalid("select * from %s where a in (?, ?) and b in (?, ?)", "first", "second", 2, 3); + assertInvalidMessage("Partition KEY part a cannot be restricted by IN relation (only the last part of the partition key can)", + "select * from %s where a in (?, ?)", "first", "second"); + assertInvalidMessage("Partition KEY part a cannot be restricted by IN relation (only the last part of the partition key can)", + "select * from %s where a in (?, ?) and b in (?, ?)", "first", "second", 2, 3); + assertInvalidMessage("Partition key parts: b must be restricted as other parts are", + "select * from %s where a = ?", "first"); + assertInvalidMessage("b cannot be restricted by more than one relation if it includes a IN", + "select * from %s where a = ? AND b IN (?, ?) AND b = ?", "first", 2, 2, 3); + assertInvalidMessage("b cannot be restricted by more than one relation if it includes an Equal", + "select * from %s where a = ? AND b = ? AND b IN (?, ?)", "first", 2, 2, 3); } @Test @@ -167,4 +205,162 @@ public void testClusteringColumnRelationsWithClusteringOrder() throws Throwable row("first", 2, 6, 2), row("first", 3, 7, 3)); } + + @Test + public void testAllowFilteringWithClusteringColumn() throws Throwable + { + createTable("CREATE TABLE %s (k int, c int, v int, PRIMARY KEY (k, c))"); + + execute("INSERT INTO %s (k, c, v) VALUES(?, ?, ?)", 1, 2, 1); + execute("INSERT INTO %s (k, c, v) VALUES(?, ?, ?)", 1, 3, 2); + execute("INSERT INTO %s (k, c, v) VALUES(?, ?, ?)", 2, 2, 3); + + // Don't require filtering, always allowed + assertRows(execute("SELECT * FROM %s WHERE k = ?", 1), + row(1, 2, 1), + row(1, 3, 2)); + + assertRows(execute("SELECT * FROM %s WHERE k = ? AND c > ?", 1, 2), row(1, 3, 2)); + + assertRows(execute("SELECT * FROM %s WHERE k = ? AND c = ?", 1, 2), row(1, 2, 1)); + + assertRows(execute("SELECT * FROM %s WHERE k = ? ALLOW FILTERING", 1), + row(1, 2, 1), + row(1, 3, 2)); + + assertRows(execute("SELECT * FROM %s WHERE k = ? AND c > ? ALLOW FILTERING", 1, 2), row(1, 3, 2)); + + assertRows(execute("SELECT * FROM %s WHERE k = ? AND c = ? ALLOW FILTERING", 1, 2), row(1, 2, 1)); + + // Require filtering, allowed only with ALLOW FILTERING + assertInvalidMessage("Cannot execute this query as it might involve data filtering", + "SELECT * FROM %s WHERE c = ?", 2); + assertInvalidMessage("Cannot execute this query as it might involve data filtering", + "SELECT * FROM %s WHERE c > ? AND c <= ?", 2, 4); + + assertRows(execute("SELECT * FROM %s WHERE c = ? ALLOW FILTERING", 2), + row(1, 2, 1), + row(2, 2, 3)); + + assertRows(execute("SELECT * FROM %s WHERE c > ? AND c <= ? ALLOW FILTERING", 2, 4), row(1, 3, 2)); + } + + @Test + public void testAllowFilteringWithIndexedColumn() throws Throwable + { + createTable("CREATE TABLE %s (k int PRIMARY KEY, a int, b int)"); + createIndex("CREATE INDEX ON %s(a)"); + + execute("INSERT INTO %s(k, a, b) VALUES(?, ?, ?)", 1, 10, 100); + execute("INSERT INTO %s(k, a, b) VALUES(?, ?, ?)", 2, 20, 200); + execute("INSERT INTO %s(k, a, b) VALUES(?, ?, ?)", 3, 30, 300); + execute("INSERT INTO %s(k, a, b) VALUES(?, ?, ?)", 4, 40, 400); + + // Don't require filtering, always allowed + assertRows(execute("SELECT * FROM %s WHERE k = ?", 1), row(1, 10, 100)); + assertRows(execute("SELECT * FROM %s WHERE a = ?", 20), row(2, 20, 200)); + assertRows(execute("SELECT * FROM %s WHERE k = ? ALLOW FILTERING", 1), row(1, 10, 100)); + assertRows(execute("SELECT * FROM %s WHERE a = ? ALLOW FILTERING", 20), row(2, 20, 200)); + + assertInvalid("SELECT * FROM %s WHERE a = ? AND b = ?"); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND b = ? ALLOW FILTERING", 20, 200), row(2, 20, 200)); + } + + @Test + public void testIndexQueriesOnComplexPrimaryKey() throws Throwable + { + createTable("CREATE TABLE %s (pk0 int, pk1 int, ck0 int, ck1 int, ck2 int, value int, PRIMARY KEY ((pk0, pk1), ck0, ck1, ck2))"); + + createIndex("CREATE INDEX ON %s (ck1)"); + createIndex("CREATE INDEX ON %s (ck2)"); + createIndex("CREATE INDEX ON %s (pk0)"); + createIndex("CREATE INDEX ON %s (ck0)"); + + execute("INSERT INTO %s (pk0, pk1, ck0, ck1, ck2, value) VALUES (?, ?, ?, ?, ?, ?)", 0, 1, 2, 3, 4, 5); + execute("INSERT INTO %s (pk0, pk1, ck0, ck1, ck2, value) VALUES (?, ?, ?, ?, ?, ?)", 1, 2, 3, 4, 5, 0); + execute("INSERT INTO %s (pk0, pk1, ck0, ck1, ck2, value) VALUES (?, ?, ?, ?, ?, ?)", 2, 3, 4, 5, 0, 1); + execute("INSERT INTO %s (pk0, pk1, ck0, ck1, ck2, value) VALUES (?, ?, ?, ?, ?, ?)", 3, 4, 5, 0, 1, 2); + execute("INSERT INTO %s (pk0, pk1, ck0, ck1, ck2, value) VALUES (?, ?, ?, ?, ?, ?)", 4, 5, 0, 1, 2, 3); + execute("INSERT INTO %s (pk0, pk1, ck0, ck1, ck2, value) VALUES (?, ?, ?, ?, ?, ?)", 5, 0, 1, 2, 3, 4); + + assertRows(execute("SELECT value FROM %s WHERE pk0 = 2"), row(1)); + assertRows(execute("SELECT value FROM %s WHERE ck0 = 0"), row(3)); + assertRows(execute("SELECT value FROM %s WHERE pk0 = 3 AND pk1 = 4 AND ck1 = 0"), row(2)); + assertRows(execute("SELECT value FROM %s WHERE pk0 = 5 AND pk1 = 0 AND ck0 = 1 AND ck2 = 3 ALLOW FILTERING"), row(4)); + } + + @Test + public void testIndexOnClusteringColumns() throws Throwable + { + createTable("CREATE TABLE %s (id1 int, id2 int, author text, time bigint, v1 text, v2 text, PRIMARY KEY ((id1, id2), author, time))"); + createIndex("CREATE INDEX ON %s(time)"); + createIndex("CREATE INDEX ON %s(id2)"); + + execute("INSERT INTO %s(id1, id2, author, time, v1, v2) VALUES(0, 0, 'bob', 0, 'A', 'A')"); + execute("INSERT INTO %s(id1, id2, author, time, v1, v2) VALUES(0, 0, 'bob', 1, 'B', 'B')"); + execute("INSERT INTO %s(id1, id2, author, time, v1, v2) VALUES(0, 1, 'bob', 2, 'C', 'C')"); + execute("INSERT INTO %s(id1, id2, author, time, v1, v2) VALUES(0, 0, 'tom', 0, 'D', 'D')"); + execute("INSERT INTO %s(id1, id2, author, time, v1, v2) VALUES(0, 1, 'tom', 1, 'E', 'E')"); + + assertRows(execute("SELECT v1 FROM %s WHERE time = 1"), row("B"), row("E")); + + assertRows(execute("SELECT v1 FROM %s WHERE id2 = 1"), row("C"), row("E")); + + assertRows(execute("SELECT v1 FROM %s WHERE id1 = 0 AND id2 = 0 AND author = 'bob' AND time = 0"), row("A")); + + // Test for CASSANDRA-8206 + execute("UPDATE %s SET v2 = null WHERE id1 = 0 AND id2 = 0 AND author = 'bob' AND time = 1"); + + assertRows(execute("SELECT v1 FROM %s WHERE id2 = 0"), row("A"), row("B"), row("D")); + + assertRows(execute("SELECT v1 FROM %s WHERE time = 1"), row("B"), row("E")); + + assertInvalidMessage("IN restrictions are not supported on indexed columns", + "SELECT v1 FROM %s WHERE id2 = 0 and time IN (1, 2) ALLOW FILTERING"); + } + + @Test + public void testCompositeIndexWithPrimaryKey() throws Throwable + { + createTable("CREATE TABLE %s (blog_id int, time1 int, time2 int, author text, content text, PRIMARY KEY (blog_id, time1, time2))"); + + createIndex("CREATE INDEX ON %s(author)"); + + String req = "INSERT INTO %s (blog_id, time1, time2, author, content) VALUES (?, ?, ?, ?, ?)"; + execute(req, 1, 0, 0, "foo", "bar1"); + execute(req, 1, 0, 1, "foo", "bar2"); + execute(req, 2, 1, 0, "foo", "baz"); + execute(req, 3, 0, 1, "gux", "qux"); + + assertRows(execute("SELECT blog_id, content FROM %s WHERE author='foo'"), + row(1, "bar1"), + row(1, "bar2"), + row(2, "baz")); + assertRows(execute("SELECT blog_id, content FROM %s WHERE time1 > 0 AND author='foo' ALLOW FILTERING"), row(2, "baz")); + assertRows(execute("SELECT blog_id, content FROM %s WHERE time1 = 1 AND author='foo' ALLOW FILTERING"), row(2, "baz")); + assertRows(execute("SELECT blog_id, content FROM %s WHERE time1 = 1 AND time2 = 0 AND author='foo' ALLOW FILTERING"), + row(2, "baz")); + assertEmpty(execute("SELECT content FROM %s WHERE time1 = 1 AND time2 = 1 AND author='foo' ALLOW FILTERING")); + assertEmpty(execute("SELECT content FROM %s WHERE time1 = 1 AND time2 > 0 AND author='foo' ALLOW FILTERING")); + + assertInvalidMessage("Cannot execute this query as it might involve data filtering", + "SELECT content FROM %s WHERE time2 >= 0 AND author='foo'"); + } + + @Test + public void testRangeQueryOnIndex() throws Throwable + { + createTable("CREATE TABLE %s (id int primary key, row int, setid int);"); + createIndex("CREATE INDEX ON %s (setid)"); + + String q = "INSERT INTO %s (id, row, setid) VALUES (?, ?, ?);"; + execute(q, 0, 0, 0); + execute(q, 1, 1, 0); + execute(q, 2, 2, 0); + execute(q, 3, 3, 0); + + assertInvalidMessage("Cannot execute this query as it might involve data filtering", + "SELECT * FROM %s WHERE setid = 0 AND row < 1;"); + assertRows(execute("SELECT * FROM %s WHERE setid = 0 AND row < 1 ALLOW FILTERING;"), row(0, 0, 0)); + } } diff --git a/test/unit/org/apache/cassandra/cql3/ThriftCompatibilityTest.java b/test/unit/org/apache/cassandra/cql3/ThriftCompatibilityTest.java index deb30820ddd5..88ee6881bff9 100644 --- a/test/unit/org/apache/cassandra/cql3/ThriftCompatibilityTest.java +++ b/test/unit/org/apache/cassandra/cql3/ThriftCompatibilityTest.java @@ -33,7 +33,7 @@ public class ThriftCompatibilityTest extends SchemaLoader @BeforeClass public static void defineSchema() throws Exception { - SchemaLoader.prepareServer(); + // The before class annotation of SchemaLoader will prepare the service so no need to do it here SchemaLoader.createKeyspace("thriftcompat", SimpleStrategy.class, KSMetaData.optsWithRF(1), From f5866ca2bac8ce530bb4e20832ff61e622206815 Mon Sep 17 00:00:00 2001 From: Ben Chan Date: Wed, 3 Dec 2014 13:15:10 -0600 Subject: [PATCH 209/557] Add repair tracing Patch by Ben Chan; reviewed by jmckenzie for CASSANDRA-5483 --- conf/cassandra.yaml | 4 + .../DebuggableThreadPoolExecutor.java | 15 ++ .../org/apache/cassandra/config/Config.java | 4 + .../cassandra/config/DatabaseDescriptor.java | 10 ++ .../org/apache/cassandra/db/CFRowAdder.java | 13 +- .../org/apache/cassandra/net/MessageOut.java | 7 +- .../cassandra/net/OutboundTcpConnection.java | 4 +- .../cassandra/repair/LocalSyncTask.java | 39 +++++- .../cassandra/repair/RemoteSyncTask.java | 5 +- .../apache/cassandra/repair/RepairJob.java | 4 + .../cassandra/repair/RepairSession.java | 23 +++- .../org/apache/cassandra/repair/SyncTask.java | 3 + .../apache/cassandra/repair/Validator.java | 6 +- .../repair/messages/RepairOption.java | 18 ++- .../service/ActiveRepairService.java | 2 +- .../cassandra/service/StorageService.java | 128 +++++++++++++++++- .../service/StorageServiceMBean.java | 2 + .../org/apache/cassandra/tools/NodeProbe.java | 5 + .../org/apache/cassandra/tools/NodeTool.java | 11 +- .../cassandra/tracing/ExpiredTraceState.java | 4 +- .../cassandra/tracing/TraceKeyspace.java | 21 +-- .../apache/cassandra/tracing/TraceState.java | 87 +++++++++++- .../org/apache/cassandra/tracing/Tracing.java | 98 ++++++++++++-- 23 files changed, 465 insertions(+), 48 deletions(-) diff --git a/conf/cassandra.yaml b/conf/cassandra.yaml index 9c4f0b58988c..f458ed8ea978 100644 --- a/conf/cassandra.yaml +++ b/conf/cassandra.yaml @@ -765,3 +765,7 @@ internode_compression: all # reducing overhead from the TCP protocol itself, at the cost of increasing # latency if you block for cross-datacenter responses. inter_dc_tcp_nodelay: false + +# TTL for different trace types used during logging of the repair process. +tracetype_query_ttl: 86400 +tracetype_repair_ttl: 604800 diff --git a/src/java/org/apache/cassandra/concurrent/DebuggableThreadPoolExecutor.java b/src/java/org/apache/cassandra/concurrent/DebuggableThreadPoolExecutor.java index ea04af34cc21..fe6cadecd950 100644 --- a/src/java/org/apache/cassandra/concurrent/DebuggableThreadPoolExecutor.java +++ b/src/java/org/apache/cassandra/concurrent/DebuggableThreadPoolExecutor.java @@ -99,6 +99,21 @@ public DebuggableThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long this.setRejectedExecutionHandler(blockingExecutionHandler); } + /** + * Creates a thread pool that creates new threads as needed, but + * will reuse previously constructed threads when they are + * available. + * @param threadPoolName the name of the threads created by this executor + * @return The new DebuggableThreadPoolExecutor + */ + public static DebuggableThreadPoolExecutor createCachedThreadpoolWithMaxSize(String threadPoolName) + { + return new DebuggableThreadPoolExecutor(0, Integer.MAX_VALUE, + 60L, TimeUnit.SECONDS, + new SynchronousQueue(), + new NamedThreadFactory(threadPoolName)); + } + /** * Returns a ThreadPoolExecutor with a fixed number of threads. * When all threads are actively executing tasks, new tasks are queued. diff --git a/src/java/org/apache/cassandra/config/Config.java b/src/java/org/apache/cassandra/config/Config.java index ca6276c23fb0..8c3021d42804 100644 --- a/src/java/org/apache/cassandra/config/Config.java +++ b/src/java/org/apache/cassandra/config/Config.java @@ -214,6 +214,10 @@ public class Config private static final CsvPreference STANDARD_SURROUNDING_SPACES_NEED_QUOTES = new CsvPreference.Builder(CsvPreference.STANDARD_PREFERENCE) .surroundingSpacesNeedQuotes(true).build(); + // TTL for different types of trace events. + public Integer tracetype_query_ttl = 60 * 60 * 24; + public Integer tracetype_repair_ttl = 60 * 60 * 24 * 7; + public static boolean getOutboundBindAny() { return outboundBindAny; diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java index a359cce780bb..c34c6ea93fc8 100644 --- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java +++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java @@ -1601,4 +1601,14 @@ public static boolean hasLargeAddressSpace() String arch = System.getProperty("os.arch"); return arch.contains("64") || arch.contains("sparcv9"); } + + public static int getTracetypeRepairTTL() + { + return conf.tracetype_repair_ttl; + } + + public static int getTracetypeQueryTTL() + { + return conf.tracetype_query_ttl; + } } diff --git a/src/java/org/apache/cassandra/db/CFRowAdder.java b/src/java/org/apache/cassandra/db/CFRowAdder.java index 3ff91711cd48..6fab8d51ccb1 100644 --- a/src/java/org/apache/cassandra/db/CFRowAdder.java +++ b/src/java/org/apache/cassandra/db/CFRowAdder.java @@ -41,13 +41,20 @@ public class CFRowAdder public final ColumnFamily cf; public final Composite prefix; public final long timestamp; + public final int ttl; private final int ldt; public CFRowAdder(ColumnFamily cf, Composite prefix, long timestamp) + { + this(cf, prefix, timestamp, 0); + } + + public CFRowAdder(ColumnFamily cf, Composite prefix, long timestamp, int ttl) { this.cf = cf; this.prefix = prefix; this.timestamp = timestamp; + this.ttl = ttl; this.ldt = (int) (System.currentTimeMillis() / 1000); // If a CQL3 table, add the row marker @@ -103,7 +110,11 @@ private CFRowAdder add(CellName name, ColumnDefinition def, Object value) AbstractType valueType = def.type.isCollection() ? ((CollectionType) def.type).valueComparator() : def.type; - cf.addColumn(new BufferCell(name, value instanceof ByteBuffer ? (ByteBuffer)value : valueType.decompose(value), timestamp)); + ByteBuffer valueBytes = value instanceof ByteBuffer ? (ByteBuffer)value : valueType.decompose(value); + if (ttl == 0) + cf.addColumn(new BufferCell(name, valueBytes, timestamp)); + else + cf.addColumn(new BufferExpiringCell(name, valueBytes, timestamp, ttl)); } return this; } diff --git a/src/java/org/apache/cassandra/net/MessageOut.java b/src/java/org/apache/cassandra/net/MessageOut.java index 70c4f5ce2877..5193c2bbae64 100644 --- a/src/java/org/apache/cassandra/net/MessageOut.java +++ b/src/java/org/apache/cassandra/net/MessageOut.java @@ -36,6 +36,7 @@ import org.apache.cassandra.utils.UUIDGen; import static org.apache.cassandra.tracing.Tracing.TRACE_HEADER; +import static org.apache.cassandra.tracing.Tracing.TRACE_TYPE; import static org.apache.cassandra.tracing.Tracing.isTracing; public class MessageOut @@ -57,8 +58,10 @@ public MessageOut(MessagingService.Verb verb, T payload, IVersionedSerializer this(verb, payload, serializer, - isTracing() ? ImmutableMap.of(TRACE_HEADER, UUIDGen.decompose(Tracing.instance.getSessionId())) - : Collections.emptyMap()); + isTracing() + ? ImmutableMap.of(TRACE_HEADER, UUIDGen.decompose(Tracing.instance.getSessionId()), + TRACE_TYPE, new byte[] { Tracing.TraceType.serialize(Tracing.instance.getTraceType()) }) + : Collections.emptyMap()); } private MessageOut(MessagingService.Verb verb, T payload, IVersionedSerializer serializer, Map parameters) diff --git a/src/java/org/apache/cassandra/net/OutboundTcpConnection.java b/src/java/org/apache/cassandra/net/OutboundTcpConnection.java index a0ad0114c55a..cddce079bcd2 100644 --- a/src/java/org/apache/cassandra/net/OutboundTcpConnection.java +++ b/src/java/org/apache/cassandra/net/OutboundTcpConnection.java @@ -215,7 +215,9 @@ private void writeConnected(QueuedMessage qm, boolean flush) // session may have already finished; see CASSANDRA-5668 if (state == null) { - TraceState.trace(ByteBuffer.wrap(sessionBytes), message, -1); + byte[] traceTypeBytes = qm.message.parameters.get(Tracing.TRACE_TYPE); + Tracing.TraceType traceType = traceTypeBytes == null ? Tracing.TraceType.QUERY : Tracing.TraceType.deserialize(traceTypeBytes[0]); + TraceState.trace(ByteBuffer.wrap(sessionBytes), message, -1, traceType.getTTL(), null); } else { diff --git a/src/java/org/apache/cassandra/repair/LocalSyncTask.java b/src/java/org/apache/cassandra/repair/LocalSyncTask.java index a43d3269c010..bbb6362fea2a 100644 --- a/src/java/org/apache/cassandra/repair/LocalSyncTask.java +++ b/src/java/org/apache/cassandra/repair/LocalSyncTask.java @@ -26,10 +26,13 @@ import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; +import org.apache.cassandra.streaming.ProgressInfo; import org.apache.cassandra.streaming.StreamEvent; import org.apache.cassandra.streaming.StreamEventHandler; import org.apache.cassandra.streaming.StreamPlan; import org.apache.cassandra.streaming.StreamState; +import org.apache.cassandra.tracing.TraceState; +import org.apache.cassandra.tracing.Tracing; import org.apache.cassandra.utils.FBUtilities; /** @@ -37,6 +40,8 @@ */ public class LocalSyncTask extends SyncTask implements StreamEventHandler { + private final TraceState state = Tracing.instance.get(); + private static final Logger logger = LoggerFactory.getLogger(LocalSyncTask.class); private final long repairedAt; @@ -58,7 +63,9 @@ protected void startSync(List> differences) InetAddress dst = r2.endpoint.equals(local) ? r1.endpoint : r2.endpoint; InetAddress preferred = SystemKeyspace.getPreferredIP(dst); - logger.info(String.format("[repair #%s] Performing streaming repair of %d ranges with %s", desc.sessionId, differences.size(), dst)); + String message = String.format("Performing streaming repair of %d ranges with %s", differences.size(), dst); + logger.info("[repair #{}] {}", desc.sessionId, message); + Tracing.traceRepair(message); new StreamPlan("Repair", repairedAt, 1, false).listeners(this) .flushBeforeTransfer(true) // request ranges from the remote node @@ -68,11 +75,37 @@ protected void startSync(List> differences) .execute(); } - public void handleStreamEvent(StreamEvent event) { /* noop */ } + public void handleStreamEvent(StreamEvent event) + { + if (state == null) + return; + switch (event.eventType) + { + case STREAM_PREPARED: + StreamEvent.SessionPreparedEvent spe = (StreamEvent.SessionPreparedEvent) event; + state.trace("Streaming session with {} prepared", spe.session.peer); + break; + case STREAM_COMPLETE: + StreamEvent.SessionCompleteEvent sce = (StreamEvent.SessionCompleteEvent) event; + state.trace("Streaming session with {} {}", sce.peer, sce.success ? "completed successfully" : "failed"); + break; + case FILE_PROGRESS: + ProgressInfo pi = ((StreamEvent.ProgressEvent) event).progress; + state.trace("{}/{} bytes ({}%) {} idx:{}{}", + new Object[] { pi.currentBytes, + pi.totalBytes, + pi.currentBytes * 100 / pi.totalBytes, + pi.direction == ProgressInfo.Direction.OUT ? "sent to" : "received from", + pi.sessionIndex, + pi.peer }); + } + } public void onSuccess(StreamState result) { - logger.info(String.format("[repair #%s] Sync complete between %s and %s on %s", desc.sessionId, r1.endpoint, r2.endpoint, desc.columnFamily)); + String message = String.format("Sync complete between %s and %s on %s", desc.sessionId, r1.endpoint, r2.endpoint, desc.columnFamily); + logger.info("[repair #{}] {}", desc.sessionId, message); + Tracing.traceRepair(message); set(stat); } diff --git a/src/java/org/apache/cassandra/repair/RemoteSyncTask.java b/src/java/org/apache/cassandra/repair/RemoteSyncTask.java index ca5c99862d90..ededc4070047 100644 --- a/src/java/org/apache/cassandra/repair/RemoteSyncTask.java +++ b/src/java/org/apache/cassandra/repair/RemoteSyncTask.java @@ -28,6 +28,7 @@ import org.apache.cassandra.exceptions.RepairException; import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.repair.messages.SyncRequest; +import org.apache.cassandra.tracing.Tracing; import org.apache.cassandra.utils.FBUtilities; /** @@ -49,7 +50,9 @@ protected void startSync(List> differences) { InetAddress local = FBUtilities.getBroadcastAddress(); SyncRequest request = new SyncRequest(desc, local, r1.endpoint, r2.endpoint, differences); - logger.info(String.format("[repair #%s] Forwarding streaming repair of %d ranges to %s (to be streamed with %s)", desc.sessionId, request.ranges.size(), request.src, request.dst)); + String message = String.format("Forwarding streaming repair of %d ranges to %s (to be streamed with %s)", request.ranges.size(), request.src, request.dst); + logger.info("[repair #{}] {}", desc.sessionId, message); + Tracing.traceRepair(message); MessagingService.instance().sendOneWay(request.createMessage(), request.src); } diff --git a/src/java/org/apache/cassandra/repair/RepairJob.java b/src/java/org/apache/cassandra/repair/RepairJob.java index 708ee7087f99..5c649afbd67a 100644 --- a/src/java/org/apache/cassandra/repair/RepairJob.java +++ b/src/java/org/apache/cassandra/repair/RepairJob.java @@ -26,6 +26,7 @@ import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.Keyspace; +import org.apache.cassandra.tracing.Tracing; import org.apache.cassandra.gms.FailureDetector; import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.Pair; @@ -180,6 +181,9 @@ public void onFailure(Throwable t) */ private ListenableFuture> sendValidationRequest(Collection endpoints) { + String message = String.format("Requesting merkle trees for %s (to %s)", desc.columnFamily, endpoints); + logger.info("[repair #{}] {}", desc.sessionId, message); + Tracing.traceRepair(message); int gcBefore = Keyspace.open(desc.keyspace).getColumnFamilyStore(desc.columnFamily).gcBefore(System.currentTimeMillis()); List> tasks = new ArrayList<>(endpoints.size()); for (InetAddress endpoint : endpoints) diff --git a/src/java/org/apache/cassandra/repair/RepairSession.java b/src/java/org/apache/cassandra/repair/RepairSession.java index d9787e2891cd..9a8f645a304f 100644 --- a/src/java/org/apache/cassandra/repair/RepairSession.java +++ b/src/java/org/apache/cassandra/repair/RepairSession.java @@ -30,11 +30,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.cassandra.concurrent.NamedThreadFactory; +import org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; import org.apache.cassandra.gms.*; +import org.apache.cassandra.tracing.Tracing; import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.MerkleTree; import org.apache.cassandra.utils.Pair; @@ -99,7 +100,7 @@ public class RepairSession extends AbstractFuture implement private final ConcurrentMap, RemoteSyncTask> syncingTasks = new ConcurrentHashMap<>(); // Tasks(snapshot, validate request, differencing, ...) are run on taskExecutor - private final ListeningExecutorService taskExecutor = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool(new NamedThreadFactory("RepairJobTask"))); + private final ListeningExecutorService taskExecutor = MoreExecutors.listeningDecorator(DebuggableThreadPoolExecutor.createCachedThreadpoolWithMaxSize("RepairJobTask")); private volatile boolean terminated = false; @@ -172,7 +173,9 @@ public void validationComplete(RepairJobDesc desc, InetAddress endpoint, MerkleT return; } - logger.info(String.format("[repair #%s] Received merkle tree for %s from %s", getId(), desc.columnFamily, endpoint)); + String message = String.format("Received merkle tree for %s from %s", desc.columnFamily, endpoint); + logger.info("[repair #{}] {}", getId(), message); + Tracing.traceRepair(message); task.treeReceived(tree); } @@ -215,14 +218,17 @@ private String repairedNodes() */ public void start(ListeningExecutorService executor) { + String message; if (terminated) return; logger.info(String.format("[repair #%s] new session: will sync %s on range %s for %s.%s", getId(), repairedNodes(), range, keyspace, Arrays.toString(cfnames))); + Tracing.traceRepair("Syncing range {}", range); if (endpoints.isEmpty()) { - logger.info(String.format("[repair #%s] No neighbors to repair with on range %s: session completed", getId(), range)); + logger.info("[repair #{}] {}", getId(), message = String.format("No neighbors to repair with on range %s: session completed", range)); + Tracing.traceRepair(message); set(new RepairSessionResult(id, keyspace, range, Lists.newArrayList())); return; } @@ -232,7 +238,7 @@ public void start(ListeningExecutorService executor) { if (!FailureDetector.instance.isAlive(endpoint)) { - String message = String.format("Cannot proceed on repair because a neighbor (%s) is dead: session failed", endpoint); + message = String.format("Cannot proceed on repair because a neighbor (%s) is dead: session failed", endpoint); logger.error("[repair #{}] {}", getId(), message); setException(new IOException(message)); return; @@ -254,8 +260,10 @@ public void start(ListeningExecutorService executor) public void onSuccess(List results) { // this repair session is completed - logger.info(String.format("[repair #%s] session completed successfully", getId())); + logger.info("[repair #{}] {}", getId(), "Session completed successfully"); + Tracing.traceRepair("Completed sync of range {}", range); set(new RepairSessionResult(id, keyspace, range, results)); + taskExecutor.shutdown(); // mark this session as terminated terminate(); @@ -263,7 +271,8 @@ public void onSuccess(List results) public void onFailure(Throwable t) { - logger.error("Repair job failed", t); + logger.error(String.format("[repair #%s] Session completed with the following error", getId()), t); + Tracing.traceRepair("Session completed with the following error: {}", t); setException(t); } }); diff --git a/src/java/org/apache/cassandra/repair/SyncTask.java b/src/java/org/apache/cassandra/repair/SyncTask.java index 3ce553211fd9..7350a6600506 100644 --- a/src/java/org/apache/cassandra/repair/SyncTask.java +++ b/src/java/org/apache/cassandra/repair/SyncTask.java @@ -26,6 +26,7 @@ import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; +import org.apache.cassandra.tracing.Tracing; import org.apache.cassandra.utils.MerkleTree; /** @@ -65,12 +66,14 @@ public void run() if (differences.isEmpty()) { logger.info(String.format(format, "are consistent")); + Tracing.traceRepair("Endpoint {} is consistent with {} for {}", r1.endpoint, r2.endpoint, desc.columnFamily); set(stat); return; } // non-0 difference: perform streaming repair logger.info(String.format(format, "have " + differences.size() + " range(s) out of sync")); + Tracing.traceRepair("Endpoint {} has {} range(s) out of sync with {} for {}", r1.endpoint, differences.size(), r2.endpoint, desc.columnFamily); startSync(differences); } diff --git a/src/java/org/apache/cassandra/repair/Validator.java b/src/java/org/apache/cassandra/repair/Validator.java index 641717e1cce4..972afd6ee5a5 100644 --- a/src/java/org/apache/cassandra/repair/Validator.java +++ b/src/java/org/apache/cassandra/repair/Validator.java @@ -34,6 +34,7 @@ import org.apache.cassandra.db.compaction.AbstractCompactedRow; import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.repair.messages.ValidationComplete; +import org.apache.cassandra.tracing.Tracing; import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.MerkleTree; @@ -241,7 +242,10 @@ public void run() { // respond to the request that triggered this validation if (!initiator.equals(FBUtilities.getBroadcastAddress())) - logger.info(String.format("[repair #%s] Sending completed merkle tree to %s for %s/%s", desc.sessionId, initiator, desc.keyspace, desc.columnFamily)); + { + logger.info(String.format("[repair #%s] Sending completed merkle tree to %s for %s.%s", desc.sessionId, initiator, desc.keyspace, desc.columnFamily)); + Tracing.traceRepair("Sending completed merkle tree to {} for {}.{}", initiator, desc.keyspace, desc.columnFamily); + } MessagingService.instance().sendOneWay(new ValidationComplete(desc, tree).createMessage(), initiator); } } diff --git a/src/java/org/apache/cassandra/repair/messages/RepairOption.java b/src/java/org/apache/cassandra/repair/messages/RepairOption.java index d11f94f6461d..5987aedd2c2c 100644 --- a/src/java/org/apache/cassandra/repair/messages/RepairOption.java +++ b/src/java/org/apache/cassandra/repair/messages/RepairOption.java @@ -40,6 +40,7 @@ public class RepairOption public static final String COLUMNFAMILIES_KEY = "columnFamilies"; public static final String DATACENTERS_KEY = "dataCenters"; public static final String HOSTS_KEY = "hosts"; + public static final String TRACE_KEY = "trace"; // we don't want to push nodes too much for repair public static final int MAX_JOB_THREADS = 4; @@ -76,6 +77,11 @@ public class RepairOption *

    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 Date: Fri, 28 Nov 2014 19:06:47 +0100 Subject: [PATCH 202/557] Fix CQLTester patch by snazy; reviewed by blerer for CASSANDRA-8392 --- .../org/apache/cassandra/cql3/CQLTester.java | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/test/unit/org/apache/cassandra/cql3/CQLTester.java b/test/unit/org/apache/cassandra/cql3/CQLTester.java index 68f90bd83bed..eb73ff9c2605 100644 --- a/test/unit/org/apache/cassandra/cql3/CQLTester.java +++ b/test/unit/org/apache/cassandra/cql3/CQLTester.java @@ -32,7 +32,6 @@ import com.google.common.base.Objects; import com.google.common.collect.ImmutableSet; -import org.apache.cassandra.utils.ByteBufferUtil; import org.junit.AfterClass; import org.junit.After; import org.junit.Assert; @@ -276,7 +275,7 @@ protected void stopForcingPreparedValues() protected String createType(String query) { - String typeName = callerName() + "_type_" + seqNumber.getAndIncrement(); + String typeName = "type_" + seqNumber.getAndIncrement(); String fullQuery = String.format(query, KEYSPACE + "." + typeName); currentTypes.add(typeName); logger.info(fullQuery); @@ -286,7 +285,7 @@ protected String createType(String query) protected String createFunction(String keyspace, String argTypes, String query) throws Throwable { - String functionName = keyspace + "." + callerName() + "_function_" + seqNumber.getAndIncrement(); + String functionName = keyspace + ".function_" + seqNumber.getAndIncrement(); createFunctionOverload(functionName, argTypes, query); return functionName; } @@ -301,7 +300,7 @@ protected void createFunctionOverload(String functionName, String argTypes, Stri protected String createAggregate(String keyspace, String argTypes, String query) throws Throwable { - String aggregateName = keyspace + "." + callerName() + "_aggregate_" + seqNumber.getAndIncrement(); + String aggregateName = keyspace + "." + "aggregate_" + seqNumber.getAndIncrement(); createAggregateOverload(aggregateName, argTypes, query); return aggregateName; } @@ -316,7 +315,7 @@ protected void createAggregateOverload(String aggregateName, String argTypes, St protected void createTable(String query) { - currentTable = callerName() + "_table_" + seqNumber.getAndIncrement(); + currentTable = "table_" + seqNumber.getAndIncrement(); String fullQuery = formatQuery(query); logger.info(fullQuery); schemaChange(fullQuery); @@ -324,7 +323,7 @@ protected void createTable(String query) protected void createTableMayThrow(String query) throws Throwable { - currentTable = callerName() + "_table_" + seqNumber.getAndIncrement(); + currentTable = "table_" + seqNumber.getAndIncrement(); String fullQuery = formatQuery(query); logger.info(fullQuery); try @@ -393,11 +392,6 @@ protected void dropIndex(String query) throws Throwable schemaChange(fullQuery); } - private static String callerName() - { - return new Exception().getStackTrace()[2].getMethodName().toLowerCase(); - } - private static void schemaChange(String query) { try From 630e47ba4cd7fe7264f7373b3432ca96a38a6610 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Fri, 28 Nov 2014 21:53:29 -0500 Subject: [PATCH 203/557] use parameterized logging --- src/java/org/apache/cassandra/repair/RepairJob.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/java/org/apache/cassandra/repair/RepairJob.java b/src/java/org/apache/cassandra/repair/RepairJob.java index 34b421710a57..708ee7087f99 100644 --- a/src/java/org/apache/cassandra/repair/RepairJob.java +++ b/src/java/org/apache/cassandra/repair/RepairJob.java @@ -203,7 +203,7 @@ private ListenableFuture> sendSequentialValidationRequest(Col Queue requests = new LinkedList<>(endpoints); InetAddress address = requests.poll(); ValidationTask firstTask = new ValidationTask(desc, address, gcBefore); - logger.info("Validating " + address); + logger.info("Validating {}", address); session.waitForValidation(Pair.create(desc, address), firstTask); tasks.add(firstTask); ValidationTask currentTask = firstTask; @@ -216,7 +216,7 @@ private ListenableFuture> sendSequentialValidationRequest(Col { public void onSuccess(TreeResponse result) { - logger.info("Validating " + nextAddress); + logger.info("Validating {}", nextAddress); session.waitForValidation(Pair.create(desc, nextAddress), nextTask); taskExecutor.execute(nextTask); } @@ -257,7 +257,7 @@ private ListenableFuture> sendDCAwareValidationRequest(Collec Queue requests = entry.getValue(); InetAddress address = requests.poll(); ValidationTask firstTask = new ValidationTask(desc, address, gcBefore); - logger.info("Validating " + address); + logger.info("Validating {}", address); session.waitForValidation(Pair.create(desc, address), firstTask); tasks.add(firstTask); ValidationTask currentTask = firstTask; @@ -270,7 +270,7 @@ private ListenableFuture> sendDCAwareValidationRequest(Collec { public void onSuccess(TreeResponse result) { - logger.info("Validating " + nextAddress); + logger.info("Validating {}", nextAddress); session.waitForValidation(Pair.create(desc, nextAddress), nextTask); taskExecutor.execute(nextTask); } From 1850ec7275e6262660698a3651d46f6634f06b5d Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Sat, 29 Nov 2014 19:06:48 -0500 Subject: [PATCH 204/557] don't declare throwing exceptions that aren't --- .../cassandra/io/sstable/SSTableSimpleUnsortedWriter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java b/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java index bc9f2ca71c6f..2dcbe3d97ad9 100644 --- a/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java +++ b/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java @@ -124,7 +124,7 @@ protected void countColumn(Cell cell) throws IOException sync(); } - protected ColumnFamily getColumnFamily() throws IOException + protected ColumnFamily getColumnFamily() { ColumnFamily previous = buffer.get(currentKey); // If the CF already exist in memory, we'll just continue adding to it @@ -142,7 +142,7 @@ protected ColumnFamily getColumnFamily() throws IOException return previous; } - protected ColumnFamily createColumnFamily() throws IOException + protected ColumnFamily createColumnFamily() { return ArrayBackedSortedColumns.factory.create(metadata); } From f0ea366b3d7733572e7de6a2eb3c9c197f484864 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Sat, 29 Nov 2014 19:19:54 -0500 Subject: [PATCH 205/557] use try-with-resources --- .../io/sstable/SSTableLoaderTest.java | 14 +++-- .../io/sstable/SSTableSimpleWriterTest.java | 62 +++++++++---------- 2 files changed, 39 insertions(+), 37 deletions(-) diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableLoaderTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableLoaderTest.java index 815fc681b264..b245994a14a7 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableLoaderTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableLoaderTest.java @@ -70,14 +70,16 @@ public void testLoadingSSTable() throws Exception File dataDir = new File(tempdir.getAbsolutePath() + File.separator + KEYSPACE1 + File.separator + CF_STANDARD); assert dataDir.mkdirs(); CFMetaData cfmeta = Schema.instance.getCFMetaData(KEYSPACE1, CF_STANDARD); - SSTableSimpleUnsortedWriter writer = new SSTableSimpleUnsortedWriter(dataDir, + DecoratedKey key = Util.dk("key1"); + + try (SSTableSimpleUnsortedWriter writer = new SSTableSimpleUnsortedWriter(dataDir, cfmeta, StorageService.getPartitioner(), - 1); - DecoratedKey key = Util.dk("key1"); - writer.newRow(key.getKey()); - writer.addColumn(ByteBufferUtil.bytes("col1"), ByteBufferUtil.bytes(100), 1); - writer.close(); + 1)) + { + writer.newRow(key.getKey()); + writer.addColumn(ByteBufferUtil.bytes("col1"), ByteBufferUtil.bytes(100), 1); + } SSTableLoader loader = new SSTableLoader(dataDir, new SSTableLoader.Client() { diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableSimpleWriterTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableSimpleWriterTest.java index df9c56bd78de..499caf774f8a 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableSimpleWriterTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableSimpleWriterTest.java @@ -64,42 +64,42 @@ public void testSSTableSimpleUnsortedWriter() throws Exception assert dir.exists(); IPartitioner partitioner = StorageService.getPartitioner(); - SSTableSimpleUnsortedWriter writer = new SSTableSimpleUnsortedWriter(dir, partitioner, keyspaceName, cfname, IntegerType.instance, null, 16); - - int k = 0; - - // Adding a few rows first - for (; k < 10; ++k) + try (SSTableSimpleUnsortedWriter writer = new SSTableSimpleUnsortedWriter(dir, partitioner, keyspaceName, cfname, IntegerType.instance, null, 16)) { - writer.newRow(bytes("Key" + k)); - writer.addColumn(bytes(1), bytes("v"), 0); - writer.addColumn(bytes(2), bytes("v"), 0); - writer.addColumn(bytes(3), bytes("v"), 0); - } - - // Testing multiple opening of the same row - // We'll write column 0, 5, 10, .., on the first row, then 1, 6, 11, ... on the second one, etc. - for (int i = 0; i < INC; ++i) - { - writer.newRow(bytes("Key" + k)); - for (int j = 0; j < NBCOL; ++j) + int k = 0; + + // Adding a few rows first + for (; k < 10; ++k) { - writer.addColumn(bytes(i + INC * j), bytes("v"), 1); + writer.newRow(bytes("Key" + k)); + writer.addColumn(bytes(1), bytes("v"), 0); + writer.addColumn(bytes(2), bytes("v"), 0); + writer.addColumn(bytes(3), bytes("v"), 0); + } + + + // Testing multiple opening of the same row + // We'll write column 0, 5, 10, .., on the first row, then 1, 6, 11, ... on the second one, etc. + for (int i = 0; i < INC; ++i) + { + writer.newRow(bytes("Key" + k)); + for (int j = 0; j < NBCOL; ++j) + { + writer.addColumn(bytes(i + INC * j), bytes("v"), 1); + } + } + k++; + + // Adding a few more rows + for (; k < 20; ++k) + { + writer.newRow(bytes("Key" + k)); + writer.addColumn(bytes(1), bytes("v"), 0); + writer.addColumn(bytes(2), bytes("v"), 0); + writer.addColumn(bytes(3), bytes("v"), 0); } } - k++; - - // Adding a few more rows - for (; k < 20; ++k) - { - writer.newRow(bytes("Key" + k)); - writer.addColumn(bytes(1), bytes("v"), 0); - writer.addColumn(bytes(2), bytes("v"), 0); - writer.addColumn(bytes(3), bytes("v"), 0); - } - - writer.close(); // Now add that newly created files to the column family ColumnFamilyStore cfs = t.getColumnFamilyStore(cfname); From 7add7ead1884325c9c648802b66af45a258104ee Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Mon, 1 Dec 2014 12:00:28 -0600 Subject: [PATCH 206/557] Workaround for output name restriction when using MultipleOutputs with CqlBulkOutputFormat MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Patch by Paul Pak, reviewed by Piotr Kołaczkowski for CASSANDRA-7827 --- .../cassandra/hadoop/cql3/CqlBulkOutputFormat.java | 11 +++++++++++ .../cassandra/hadoop/cql3/CqlBulkRecordWriter.java | 7 +++++++ 2 files changed, 18 insertions(+) diff --git a/src/java/org/apache/cassandra/hadoop/cql3/CqlBulkOutputFormat.java b/src/java/org/apache/cassandra/hadoop/cql3/CqlBulkOutputFormat.java index bdc9fbfe9289..78080e2901b5 100644 --- a/src/java/org/apache/cassandra/hadoop/cql3/CqlBulkOutputFormat.java +++ b/src/java/org/apache/cassandra/hadoop/cql3/CqlBulkOutputFormat.java @@ -54,6 +54,7 @@ public class CqlBulkOutputFormat extends AbstractBulkOutputFormatCqlBulkRecordWriter maps the output <key, value> * pairs to a Cassandra column family. In particular, it applies the binded variables @@ -85,6 +86,12 @@ private void setConfigs() throws IOException // if anything is missing, exceptions will be thrown here, instead of on write() keyspace = ConfigHelper.getOutputKeyspace(conf); columnFamily = ConfigHelper.getOutputColumnFamily(conf); + + // check if columnFamily is aliased + String aliasedCf = CqlBulkOutputFormat.getColumnFamilyForAlias(conf, columnFamily); + if (aliasedCf != null) + columnFamily = aliasedCf; + schema = CqlBulkOutputFormat.getColumnFamilySchema(conf, columnFamily); insertStatement = CqlBulkOutputFormat.getColumnFamilyInsertStatement(conf, columnFamily); outputDir = getColumnFamilyDirectory(); From 5ab1d95b29509ee5a061eddda39d7f4189abbe37 Mon Sep 17 00:00:00 2001 From: Benedict Elliott Smith Date: Tue, 2 Dec 2014 17:17:35 +0000 Subject: [PATCH 207/557] BTree updates may call provided update function twice patch by Benjamin; reviewed by Benedict for CASSANDRA-8018 --- CHANGES.txt | 1 + .../apache/cassandra/utils/btree/Builder.java | 2 +- .../cassandra/utils/btree/NodeBuilder.java | 6 +- .../org/apache/cassandra/utils/BTreeTest.java | 120 ++++++++++++++++-- 4 files changed, 117 insertions(+), 12 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 7df396d05029..c5ac66c09921 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 2.1.3 + * BTree updates may call provided update function twice (CASSANDRA-8018) * Release sstable references after anticompaction (CASSANDRA-8386) * Handle abort() in SSTableRewriter properly (CASSANDRA-8320) * Fix high size calculations for prepared statements (CASSANDRA-8231) diff --git a/src/java/org/apache/cassandra/utils/btree/Builder.java b/src/java/org/apache/cassandra/utils/btree/Builder.java index f6677d4dc7b9..0f2fd5bdcfa2 100644 --- a/src/java/org/apache/cassandra/utils/btree/Builder.java +++ b/src/java/org/apache/cassandra/utils/btree/Builder.java @@ -109,7 +109,7 @@ public Object[] build(Iterable source, UpdateFunction updateF, int siz current.reset(EMPTY_LEAF, POSITIVE_INFINITY, updateF, null); for (V key : source) - current.addNewKey(key); + current.addNewKey(updateF.apply(key)); current = current.ascendToRoot(); diff --git a/src/java/org/apache/cassandra/utils/btree/NodeBuilder.java b/src/java/org/apache/cassandra/utils/btree/NodeBuilder.java index 9d5718258600..c7158739a94a 100644 --- a/src/java/org/apache/cassandra/utils/btree/NodeBuilder.java +++ b/src/java/org/apache/cassandra/utils/btree/NodeBuilder.java @@ -133,7 +133,7 @@ NodeBuilder update(Object key) int i = copyFromKeyPosition; boolean found; // exact key match? - boolean owns = true; // true iff this node (or a child) should contain the key + boolean owns = true; // true if this node (or a child) should contain the key if (i == copyFromKeyEnd) { found = false; @@ -185,7 +185,7 @@ else if (i == copyFromKeyEnd && compare(comparator, key, upperBound) >= 0) } else { - // if not found, we need to apply updateFunction still + // if not found, we still need to apply the update function key = updateFunction.apply(key); addNewKey(key); // handles splitting parent if necessary via ensureRoom } @@ -319,7 +319,7 @@ private void replaceNextKey(Object with) void addNewKey(Object key) { ensureRoom(buildKeyPosition + 1); - buildKeys[buildKeyPosition++] = updateFunction.apply(key); + buildKeys[buildKeyPosition++] = key; } // copies children from copyf to the builder, up to the provided index in copyf (exclusive) diff --git a/test/unit/org/apache/cassandra/utils/BTreeTest.java b/test/unit/org/apache/cassandra/utils/BTreeTest.java index a6d4528f43bb..e1bf388ecb11 100644 --- a/test/unit/org/apache/cassandra/utils/BTreeTest.java +++ b/test/unit/org/apache/cassandra/utils/BTreeTest.java @@ -17,22 +17,21 @@ */ package org.apache.cassandra.utils; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.Random; +import java.util.*; import java.util.concurrent.ThreadLocalRandom; import org.junit.Test; -import junit.framework.Assert; import org.apache.cassandra.utils.btree.BTree; import org.apache.cassandra.utils.btree.BTreeSet; import org.apache.cassandra.utils.btree.UpdateFunction; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertTrue; + public class BTreeTest { - static Integer[] ints = new Integer[20]; static { @@ -114,13 +113,78 @@ public void testUpdate_UpdateFunctionReplacement() } } + /** + * Tests that the apply method of the UpdateFunction is only called once with each key update. + * (see CASSANDRA-8018). + */ + @Test + public void testUpdate_UpdateFunctionCallBack() + { + Object[] btree = new Object[0]; + CallsMonitor monitor = new CallsMonitor(); + + btree = BTree.update(btree, CMP, Arrays.asList(1), true, monitor); + assertArrayEquals(new Object[] {1, null}, btree); + assertEquals(1, monitor.getNumberOfCalls(1)); + + monitor.clear(); + btree = BTree.update(btree, CMP, Arrays.asList(2), true, monitor); + assertArrayEquals(new Object[] {1, 2}, btree); + assertEquals(1, monitor.getNumberOfCalls(2)); + + // with existing value + monitor.clear(); + btree = BTree.update(btree, CMP, Arrays.asList(1), true, monitor); + assertArrayEquals(new Object[] {1, 2}, btree); + assertEquals(1, monitor.getNumberOfCalls(1)); + + // with two non-existing values + monitor.clear(); + btree = BTree.update(btree, CMP, Arrays.asList(3, 4), true, monitor); + assertArrayEquals(new Object[] {1, 2, 3, 4}, btree); + assertEquals(1, monitor.getNumberOfCalls(3)); + assertEquals(1, monitor.getNumberOfCalls(4)); + + // with one existing value and one non existing value in disorder + monitor.clear(); + btree = BTree.update(btree, CMP, Arrays.asList(5, 2), false, monitor); + assertArrayEquals(new Object[] {3, new Object[]{1, 2}, new Object[]{4, 5}}, btree); + assertEquals(1, monitor.getNumberOfCalls(2)); + assertEquals(1, monitor.getNumberOfCalls(5)); + } + + /** + * Tests that the apply method of the UpdateFunction is only called once per value with each build call. + */ + @Test + public void testBuilding_UpdateFunctionCallBack() + { + CallsMonitor monitor = new CallsMonitor(); + Object[] btree = BTree.build(Arrays.asList(1), CMP, true, monitor); + assertArrayEquals(new Object[] {1, null}, btree); + assertEquals(1, monitor.getNumberOfCalls(1)); + + monitor.clear(); + btree = BTree.build(Arrays.asList(1, 2), CMP, true, monitor); + assertArrayEquals(new Object[] {1, 2}, btree); + assertEquals(1, monitor.getNumberOfCalls(1)); + assertEquals(1, monitor.getNumberOfCalls(2)); + + monitor.clear(); + btree = BTree.build(Arrays.asList(3, 1, 2), CMP, false, monitor); + assertArrayEquals(new Object[] {1, 2, 3, null}, btree); + assertEquals(1, monitor.getNumberOfCalls(1)); + assertEquals(1, monitor.getNumberOfCalls(2)); + assertEquals(1, monitor.getNumberOfCalls(3)); + } + private static void checkResult(int count, Object[] btree) { BTreeSet vs = new BTreeSet<>(btree, CMP); assert vs.size() == count; int i = 0; for (Integer j : vs) - Assert.assertEquals(j, ints[i++]); + assertEquals(j, ints[i++]); } @Test @@ -137,7 +201,7 @@ public int compare(String o1, String o2) Object[] btree = BTree.build(ranges(range(0, 8)), cmp, true, UpdateFunction.NoOp.instance()); BTree.update(btree, cmp, ranges(range(0, 94)), false, new AbortAfterX(90)); btree = BTree.update(btree, cmp, ranges(range(0, 94)), false, UpdateFunction.NoOp.instance()); - Assert.assertTrue(BTree.isWellFormed(btree, cmp)); + assertTrue(BTree.isWellFormed(btree, cmp)); } private static final class AbortAfterX implements UpdateFunction @@ -181,4 +245,44 @@ private static List ranges(int[] ... ranges) } return r; } + + /** + * UpdateFunction that count the number of call made to apply for each value. + */ + public static final class CallsMonitor implements UpdateFunction + { + private int[] numberOfCalls = new int[20]; + + public Integer apply(Integer replacing, Integer update) + { + numberOfCalls[update] = numberOfCalls[update] + 1; + return update; + } + + public boolean abortEarly() + { + return false; + } + + public void allocated(long heapSize) + { + + } + + public Integer apply(Integer integer) + { + numberOfCalls[integer] = numberOfCalls[integer] + 1; + return integer; + } + + public int getNumberOfCalls(Integer key) + { + return numberOfCalls[key]; + } + + public void clear() + { + Arrays.fill(numberOfCalls, 0); + } + }; } From 65a7088e71061b876e9cd51140f31c92ded92777 Mon Sep 17 00:00:00 2001 From: blerer Date: Tue, 2 Dec 2014 13:08:25 -0600 Subject: [PATCH 208/557] Refactor SelectStatement and Restrictions Patch by Benjamin Lerer; reviewed by Tyler Hobbs for CASSANDRA-7981 --- CHANGES.txt | 2 + NEWS.txt | 3 + .../cassandra/config/ColumnDefinition.java | 40 + .../cassandra/cql3/ColumnSpecification.java | 6 + src/java/org/apache/cassandra/cql3/Cql.g | 5 +- .../cassandra/cql3/MultiColumnRelation.java | 130 +- .../org/apache/cassandra/cql3/Operator.java | 119 +- .../org/apache/cassandra/cql3/Relation.java | 221 ++- .../cassandra/cql3/SingleColumnRelation.java | 181 +- .../apache/cassandra/cql3/TokenRelation.java | 164 ++ .../org/apache/cassandra/cql3/Tuples.java | 3 +- .../cql3/VariableSpecifications.java | 10 + .../AbstractPrimaryKeyRestrictions.java | 36 + .../restrictions/AbstractRestriction.java | 129 ++ .../ForwardingPrimaryKeyRestrictions.java | 159 ++ .../restrictions/MultiColumnRestriction.java | 520 ++++++ .../restrictions/PrimaryKeyRestrictions.java | 40 + .../cql3/restrictions/Restriction.java | 97 + .../cql3/restrictions/Restrictions.java | 82 + .../ReversedPrimaryKeyRestrictions.java | 77 + .../SingleColumnPrimaryKeyRestrictions.java | 307 ++++ .../restrictions/SingleColumnRestriction.java | 477 +++++ .../SingleColumnRestrictions.java | 209 +++ .../restrictions/StatementRestrictions.java | 600 +++++++ .../cql3/restrictions/TermSlice.java | 167 ++ .../cql3/restrictions/TokenRestriction.java | 224 +++ .../cassandra/cql3/selection/Selection.java | 123 +- .../cassandra/cql3/statements/Bound.java | 14 +- .../cql3/statements/DeleteStatement.java | 1 + .../statements/ModificationStatement.java | 35 +- .../statements/MultiColumnRestriction.java | 137 -- .../cql3/statements/RequestValidations.java | 194 ++ .../cql3/statements/Restriction.java | 79 - .../cql3/statements/SelectStatement.java | 1597 +++-------------- .../statements/SingleColumnRestriction.java | 486 ----- .../cassandra/db/composites/Composites.java | 22 +- .../db/composites/CompositesBuilder.java | 15 +- .../cassandra/db/marshal/CollectionType.java | 34 +- .../UnrecognizedEntityException.java | 49 + .../org/apache/cassandra/cql3/AliasTest.java | 40 + .../cassandra/cql3/ContainsRelationTest.java | 39 +- .../cassandra/cql3/FrozenCollectionsTest.java | 16 +- .../cql3/MultiColumnRelationTest.java | 161 +- .../cql3/SelectWithTokenFunctionTest.java | 39 +- .../cql3/SingleColumnRelationTest.java | 218 ++- .../cql3/ThriftCompatibilityTest.java | 2 +- 46 files changed, 5031 insertions(+), 2278 deletions(-) create mode 100644 src/java/org/apache/cassandra/cql3/TokenRelation.java create mode 100644 src/java/org/apache/cassandra/cql3/restrictions/AbstractPrimaryKeyRestrictions.java create mode 100644 src/java/org/apache/cassandra/cql3/restrictions/AbstractRestriction.java create mode 100644 src/java/org/apache/cassandra/cql3/restrictions/ForwardingPrimaryKeyRestrictions.java create mode 100644 src/java/org/apache/cassandra/cql3/restrictions/MultiColumnRestriction.java create mode 100644 src/java/org/apache/cassandra/cql3/restrictions/PrimaryKeyRestrictions.java create mode 100644 src/java/org/apache/cassandra/cql3/restrictions/Restriction.java create mode 100644 src/java/org/apache/cassandra/cql3/restrictions/Restrictions.java create mode 100644 src/java/org/apache/cassandra/cql3/restrictions/ReversedPrimaryKeyRestrictions.java create mode 100644 src/java/org/apache/cassandra/cql3/restrictions/SingleColumnPrimaryKeyRestrictions.java create mode 100644 src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestriction.java create mode 100644 src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestrictions.java create mode 100644 src/java/org/apache/cassandra/cql3/restrictions/StatementRestrictions.java create mode 100644 src/java/org/apache/cassandra/cql3/restrictions/TermSlice.java create mode 100644 src/java/org/apache/cassandra/cql3/restrictions/TokenRestriction.java delete mode 100644 src/java/org/apache/cassandra/cql3/statements/MultiColumnRestriction.java create mode 100644 src/java/org/apache/cassandra/cql3/statements/RequestValidations.java delete mode 100644 src/java/org/apache/cassandra/cql3/statements/Restriction.java delete mode 100644 src/java/org/apache/cassandra/cql3/statements/SingleColumnRestriction.java create mode 100644 src/java/org/apache/cassandra/exceptions/UnrecognizedEntityException.java create mode 100644 test/unit/org/apache/cassandra/cql3/AliasTest.java diff --git a/CHANGES.txt b/CHANGES.txt index 3cb1c0f80baf..6761c31ab89f 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,6 @@ 3.0 + * Refactor SelectStatement, return IN results in natural order instead + of IN value list order (CASSANDRA-7981) * Support UDTs, tuples, and collections in user-defined functions (CASSANDRA-7563) * Fix aggregate fn results on empty selection, result column name, diff --git a/NEWS.txt b/NEWS.txt index 1d168f0dc953..8d8ebdcf3db5 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -33,6 +33,9 @@ Upgrading in 2.0.0). Please switch to CQL3 if you haven't already done so. - Very large batches will now be rejected (defaults to 50kb). This can be customized by modifying batch_size_fail_threshold_in_kb. + - The results of CQL3 queries containing an IN restriction will be ordered + in the normal order and not anymore in the order in which the column values were + specified in the IN restriction. 2.1.2 ===== diff --git a/src/java/org/apache/cassandra/config/ColumnDefinition.java b/src/java/org/apache/cassandra/config/ColumnDefinition.java index 10a5a8be5004..354a6f170850 100644 --- a/src/java/org/apache/cassandra/config/ColumnDefinition.java +++ b/src/java/org/apache/cassandra/config/ColumnDefinition.java @@ -21,7 +21,9 @@ import java.util.*; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Function; import com.google.common.base.Objects; +import com.google.common.collect.Lists; import org.apache.cassandra.cql3.*; import org.apache.cassandra.db.*; @@ -171,11 +173,31 @@ public boolean isOnAllComponents() return componentIndex == null; } + public boolean isPartitionKey() + { + return kind == Kind.PARTITION_KEY; + } + + public boolean isClusteringColumn() + { + return kind == Kind.CLUSTERING_COLUMN; + } + public boolean isStatic() { return kind == Kind.STATIC; } + public boolean isRegular() + { + return kind == Kind.REGULAR; + } + + public boolean isCompactValue() + { + return kind == Kind.COMPACT_VALUE; + } + // The componentIndex. This never return null however for convenience sake: // if componentIndex == null, this return 0. So caller should first check // isOnAllComponents() to distinguish if that's a possibility. @@ -425,4 +447,22 @@ public boolean hasIndexOption(String name) { return indexOptions.containsKey(name); } + + /** + * Converts the specified column definitions into column identifiers. + * + * @param definitions the column definitions to convert. + * @return the column identifiers corresponding to the specified definitions + */ + public static List toIdentifiers(List definitions) + { + return Lists.transform(definitions, new Function() + { + @Override + public ColumnIdentifier apply(ColumnDefinition columnDef) + { + return columnDef.name; + } + }); + } } diff --git a/src/java/org/apache/cassandra/cql3/ColumnSpecification.java b/src/java/org/apache/cassandra/cql3/ColumnSpecification.java index 2584f857f5a4..cc5437557472 100644 --- a/src/java/org/apache/cassandra/cql3/ColumnSpecification.java +++ b/src/java/org/apache/cassandra/cql3/ColumnSpecification.java @@ -18,6 +18,7 @@ package org.apache.cassandra.cql3; import org.apache.cassandra.db.marshal.AbstractType; +import org.apache.cassandra.db.marshal.ReversedType; public class ColumnSpecification { @@ -44,4 +45,9 @@ public ColumnSpecification withAlias(ColumnIdentifier alias) { return new ColumnSpecification(ksName, cfName, alias, type); } + + public boolean isReversedType() + { + return type instanceof ReversedType; + } } diff --git a/src/java/org/apache/cassandra/cql3/Cql.g b/src/java/org/apache/cassandra/cql3/Cql.g index 4c051e39db9e..77156f2aeab3 100644 --- a/src/java/org/apache/cassandra/cql3/Cql.g +++ b/src/java/org/apache/cassandra/cql3/Cql.g @@ -1091,10 +1091,7 @@ relationType returns [Operator op] relation[List clauses] : name=cident type=relationType t=term { $clauses.add(new SingleColumnRelation(name, type, t)); } | K_TOKEN l=tupleOfIdentifiers type=relationType t=term - { - for (ColumnIdentifier.Raw id : l) - $clauses.add(new SingleColumnRelation(id, type, t, true)); - } + { $clauses.add(new TokenRelation(l, type, t)); } | name=cident K_IN marker=inMarker { $clauses.add(new SingleColumnRelation(name, Operator.IN, marker)); } | name=cident K_IN inValues=singleColumnInValues diff --git a/src/java/org/apache/cassandra/cql3/MultiColumnRelation.java b/src/java/org/apache/cassandra/cql3/MultiColumnRelation.java index 37eb69e2140f..d754968332e4 100644 --- a/src/java/org/apache/cassandra/cql3/MultiColumnRelation.java +++ b/src/java/org/apache/cassandra/cql3/MultiColumnRelation.java @@ -17,8 +17,22 @@ */ package org.apache.cassandra.cql3; +import java.util.ArrayList; import java.util.List; +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.ColumnDefinition; +import org.apache.cassandra.cql3.Term.MultiColumnRaw; +import org.apache.cassandra.cql3.Term.Raw; +import org.apache.cassandra.cql3.restrictions.MultiColumnRestriction; +import org.apache.cassandra.cql3.restrictions.Restriction; +import org.apache.cassandra.cql3.statements.Bound; +import org.apache.cassandra.exceptions.InvalidRequestException; + +import static org.apache.cassandra.cql3.statements.RequestValidations.checkFalse; +import static org.apache.cassandra.cql3.statements.RequestValidations.checkTrue; +import static org.apache.cassandra.cql3.statements.RequestValidations.invalidRequest; + /** * A relation using the tuple notation, which typically affects multiple columns. * Examples: @@ -55,6 +69,7 @@ private MultiColumnRelation(List entities, Operator relati * @param entities the columns on the LHS of the relation * @param relationType the relation operator * @param valuesOrMarker a Tuples.Literal instance or a Tuples.Raw marker + * @return a new MultiColumnRelation instance */ public static MultiColumnRelation createNonInRelation(List entities, Operator relationType, Term.MultiColumnRaw valuesOrMarker) { @@ -67,6 +82,7 @@ public static MultiColumnRelation createNonInRelation(List * For example: "SELECT ... WHERE (a, b) IN ((0, 1), (2, 3))" * @param entities the columns on the LHS of the relation * @param inValues a list of Tuples.Literal instances or a Tuples.Raw markers + * @return a new MultiColumnRelation instance */ public static MultiColumnRelation createInRelation(List entities, List inValues) { @@ -78,6 +94,7 @@ public static MultiColumnRelation createInRelation(List en * For example: "SELECT ... WHERE (a, b) IN ?" * @param entities the columns on the LHS of the relation * @param inMarker a single IN marker + * @return a new MultiColumnRelation instance */ public static MultiColumnRelation createSingleMarkerInRelation(List entities, Tuples.INRaw inMarker) { @@ -91,54 +108,109 @@ public List getEntities() /** * For non-IN relations, returns the Tuples.Literal or Tuples.Raw marker for a single tuple. + * @return a Tuples.Literal for non-IN relations or Tuples.Raw marker for a single tuple. */ - public Term.MultiColumnRaw getValue() + private Term.MultiColumnRaw getValue() { - assert relationType != Operator.IN; - return valuesOrMarker; + return relationType == Operator.IN ? inMarker : valuesOrMarker; } - /** - * For IN relations, returns the list of Tuples.Literal instances or Tuples.Raw markers. - * If a single IN marker was used, this will return null; - */ - public List getInValues() + @Override + public boolean isMultiColumn() { + return true; + } - return inValues; + @Override + protected Restriction newEQRestriction(CFMetaData cfm, + VariableSpecifications boundNames) throws InvalidRequestException + { + List receivers = receivers(cfm); + Term term = toTerm(receivers, getValue(), cfm.ksName, boundNames); + return new MultiColumnRestriction.EQ(cfm.comparator, receivers, term); } - /** - * For IN relations, returns the single marker for the IN values if there is one, otherwise null. - */ - public Tuples.INRaw getInMarker() + @Override + protected Restriction newINRestriction(CFMetaData cfm, + VariableSpecifications boundNames) throws InvalidRequestException + { + List receivers = receivers(cfm); + List terms = toTerms(receivers, inValues, cfm.ksName, boundNames); + if (terms == null) + { + Term term = toTerm(receivers, getValue(), cfm.ksName, boundNames); + return new MultiColumnRestriction.InWithMarker(cfm.comparator, receivers, (AbstractMarker) term); + } + return new MultiColumnRestriction.InWithValues(cfm.comparator, receivers, terms); + } + + @Override + protected Restriction newSliceRestriction(CFMetaData cfm, + VariableSpecifications boundNames, + Bound bound, + boolean inclusive) throws InvalidRequestException { - return inMarker; + List receivers = receivers(cfm); + Term term = toTerm(receivers(cfm), getValue(), cfm.ksName, boundNames); + return new MultiColumnRestriction.Slice(cfm.comparator, receivers, bound, inclusive, term); } - public boolean isMultiColumn() + @Override + protected Restriction newContainsRestriction(CFMetaData cfm, + VariableSpecifications boundNames, + boolean isKey) throws InvalidRequestException { - return true; + throw invalidRequest("%s cannot be used for Multi-column relations", operator()); } @Override - public String toString() + protected Term toTerm(List receivers, + Raw raw, + String keyspace, + VariableSpecifications boundNames) throws InvalidRequestException { - if (relationType == Operator.IN) + Term term = ((MultiColumnRaw) raw).prepare(keyspace, receivers); + term.collectMarkerSpecification(boundNames); + return term; + } + + protected List receivers(CFMetaData cfm) throws InvalidRequestException + { + List names = new ArrayList<>(getEntities().size()); + int previousPosition = -1; + for (ColumnIdentifier.Raw raw : getEntities()) { - StringBuilder sb = new StringBuilder(Tuples.tupleToString(entities)); - sb.append(" IN "); - sb.append(inMarker != null ? '?' : Tuples.tupleToString(inValues)); - return sb.toString(); + ColumnDefinition def = toColumnDefinition(cfm, raw); + checkTrue(def.isClusteringColumn(), "Multi-column relations can only be applied to clustering columns but was applied to: %s", def.name); + checkFalse(names.contains(def), "Column \"%s\" appeared twice in a relation: %s", def.name, this); + + // check that no clustering columns were skipped + if (def.position() != previousPosition + 1) + { + checkFalse(previousPosition == -1, "Clustering columns may not be skipped in multi-column relations. " + + "They should appear in the PRIMARY KEY order. Got %s", this); + throw invalidRequest("Clustering columns must appear in the PRIMARY KEY order in multi-column relations: %s", this); + } + names.add(def); + previousPosition = def.position(); } - else + return names; + } + + @Override + public String toString() + { + StringBuilder builder = new StringBuilder(Tuples.tupleToString(entities)); + if (isIN()) { - StringBuilder sb = new StringBuilder(Tuples.tupleToString(entities)); - sb.append(" "); - sb.append(relationType); - sb.append(" "); - sb.append(valuesOrMarker); - return sb.toString(); + return builder.append(" IN ") + .append(inMarker != null ? '?' : Tuples.tupleToString(inValues)) + .toString(); } + return builder.append(" ") + .append(relationType) + .append(" ") + .append(valuesOrMarker) + .toString(); } } \ No newline at end of file diff --git a/src/java/org/apache/cassandra/cql3/Operator.java b/src/java/org/apache/cassandra/cql3/Operator.java index 359fcb8ed17e..86bcbd38e8cb 100644 --- a/src/java/org/apache/cassandra/cql3/Operator.java +++ b/src/java/org/apache/cassandra/cql3/Operator.java @@ -23,7 +23,92 @@ public enum Operator { - EQ(0), LT(4), LTE(3), GTE(1), GT(2), IN(7), CONTAINS(5), CONTAINS_KEY(6), NEQ(8); + EQ(0) + { + @Override + public String toString() + { + return "="; + } + }, + LT(4) + { + @Override + public String toString() + { + return "<"; + } + + @Override + public Operator reverse() + { + return GT; + } + }, + LTE(3) + { + @Override + public String toString() + { + return "<="; + } + + @Override + public Operator reverse() + { + return GTE; + } + }, + GTE(1) + { + @Override + public String toString() + { + return ">="; + } + + @Override + public Operator reverse() + { + return LTE; + } + }, + GT(2) + { + @Override + public String toString() + { + return ">"; + } + + @Override + public Operator reverse() + { + return LT; + } + }, + IN(7) + { + }, + CONTAINS(5) + { + }, + CONTAINS_KEY(6) + { + @Override + public String toString() + { + return "CONTAINS KEY"; + } + }, + NEQ(8) + { + @Override + public String toString() + { + return "!="; + } + }; /** * The binary representation of this Enum value. @@ -70,24 +155,16 @@ public static Operator readFrom(DataInput input) throws IOException @Override public String toString() { - switch (this) - { - case EQ: - return "="; - case LT: - return "<"; - case LTE: - return "<="; - case GT: - return ">"; - case GTE: - return ">="; - case NEQ: - return "!="; - case CONTAINS_KEY: - return "CONTAINS KEY"; - default: - return this.name(); - } + return this.name(); + } + + /** + * Returns the reverse operator if this one. + * + * @return the reverse operator of this one. + */ + public Operator reverse() + { + return this; } -} \ No newline at end of file +} diff --git a/src/java/org/apache/cassandra/cql3/Relation.java b/src/java/org/apache/cassandra/cql3/Relation.java index 91d41006a6a1..1337096b9021 100644 --- a/src/java/org/apache/cassandra/cql3/Relation.java +++ b/src/java/org/apache/cassandra/cql3/Relation.java @@ -17,6 +17,18 @@ */ package org.apache.cassandra.cql3; +import java.util.ArrayList; +import java.util.List; + +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.ColumnDefinition; +import org.apache.cassandra.cql3.restrictions.Restriction; +import org.apache.cassandra.cql3.statements.Bound; +import org.apache.cassandra.exceptions.InvalidRequestException; +import org.apache.cassandra.exceptions.UnrecognizedEntityException; + +import static org.apache.cassandra.cql3.statements.RequestValidations.invalidRequest; + public abstract class Relation { protected Operator relationType; @@ -26,5 +38,212 @@ public Operator operator() return relationType; } - public abstract boolean isMultiColumn(); + /** + * Checks if this relation apply to multiple columns. + * + * @return true if this relation apply to multiple columns, false otherwise. + */ + public boolean isMultiColumn() + { + return false; + } + + /** + * Checks if this relation is a token relation (e.g.

    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 Map getMap(String name, Class keysClass, Class valuesC { return row.getMap(name, keysClass, valuesClass); } + + @Override + public UDTValue getUDTValue(int i) + { + return row.getUDTValue(i); + } + + @Override + public UDTValue getUDTValue(String name) + { + return row.getUDTValue(name); + } + + @Override + public TupleValue getTupleValue(int i) + { + return row.getTupleValue(i); + } + + @Override + public TupleValue getTupleValue(String name) + { + return row.getTupleValue(name); + } } /** From 6801cb0415f40d6be1333262ae95befd8abd9175 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Tue, 14 Oct 2014 10:36:04 -0500 Subject: [PATCH 160/557] Remove fat client mode Patch by brandonwilliams, reviewed by Joshua McKenzie for CASSANDRA-7820 --- NEWS.txt | 1 + examples/client_only/README.txt | 49 -- examples/client_only/bin/client_only | 56 -- examples/client_only/build.xml | 70 -- examples/client_only/conf/cassandra.yaml | 625 ------------------ .../client_only/src/ClientOnlyExample.java | 114 ---- .../org/apache/cassandra/config/Config.java | 12 - .../cassandra/config/DatabaseDescriptor.java | 14 +- .../org/apache/cassandra/db/DefsTables.java | 78 +-- .../org/apache/cassandra/db/Directories.java | 5 - .../org/apache/cassandra/db/Keyspace.java | 3 +- .../org/apache/cassandra/gms/Gossiper.java | 4 +- .../hadoop/AbstractBulkRecordWriter.java | 1 - .../cassandra/io/sstable/SSTableLoader.java | 1 - .../cassandra/io/sstable/SSTableReader.java | 5 +- .../service/AbstractReadExecutor.java | 5 - .../cassandra/service/MigrationManager.java | 2 +- .../cassandra/service/StorageService.java | 93 +-- .../locator/DynamicEndpointSnitchTest.java | 2 +- .../cassandra/service/InitClientTest.java | 33 - .../service/StorageServiceClientTest.java | 46 -- 21 files changed, 48 insertions(+), 1171 deletions(-) delete mode 100644 examples/client_only/README.txt delete mode 100755 examples/client_only/bin/client_only delete mode 100644 examples/client_only/build.xml delete mode 100644 examples/client_only/conf/cassandra.yaml delete mode 100644 examples/client_only/src/ClientOnlyExample.java delete mode 100644 test/unit/org/apache/cassandra/service/InitClientTest.java delete mode 100644 test/unit/org/apache/cassandra/service/StorageServiceClientTest.java diff --git a/NEWS.txt b/NEWS.txt index 99144caaf1a1..9e8f7267c194 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -25,6 +25,7 @@ New features Upgrading --------- + - Fat client support has been removed since we have push notifications to clients - cassandra-cli has been removed. Please use cqlsh instead. - YamlFileNetworkTopologySnitch has been removed; switch to GossipingPropertyFileSnitch instead. diff --git a/examples/client_only/README.txt b/examples/client_only/README.txt deleted file mode 100644 index 47e6a3dc31f8..000000000000 --- a/examples/client_only/README.txt +++ /dev/null @@ -1,49 +0,0 @@ -The client_only example uses the fat client to insert data into and read -data from Cassandra. - --- Warning -- -The method used in this example (the fat client) should generally -not be used instead of the thrift interface because of possible -instability of the internal Cassandra API. - --- Prerequisite -- -Build the Cassandra source in the current source tree. Also, if -running the client_only code against a local Cassandra node, start -the local node prior to running the client_only script. See the -configuration below for more info. - --- Build -- -To build, run ant from the contrib/client_only directory. It will build -the source, then jar up the compiled class, the conf/cassandra.yaml, and -dependencies into build/client_only.jar. - --- Run -- -To run, from the contrib/client_only directory run: -bin/client_only write -or -bin/client_only read - -'write' will create keyspace Keyspace1 and column family Standard1. If -it is already there, it will error out. It will then write a bunch of -data to the cluster it connects to. - -'read' will read the data that was written in the write step. - --- Configuration -- -The conf/cassandra.yaml is to start up the fat client. The fat client -joins the gossip network but does not participate in storage. It -needs to have the same configuration as the rest of the cluster except -listen address and rpc address. If you are running your cluster just -on your local machine, you'll need to use another address for this node. -Therefore, your local full Cassandra node can be 127.0.0.1 and the fat -client can be 127.0.0.2. Such aliasing is enabled by default on linux. -On Mac OS X, use the following command to use the second IP address: -sudo ifconfig lo0 alias 127.0.0.2 up - -cassandra.yaml can be on the classpath as is done here, can be specified -(by modifying the script) in a location within the classpath like this: -java -Xmx1G -Dcassandra.config=/path/in/classpath/to/cassandra.yaml ... -or can be retrieved from a location outside the classpath like this: -... -Dcassandra.config=file:///path/to/cassandra.yaml ... -or -... -Dcassandra.config=http://awesomesauce.com/cassandra.yaml ... \ No newline at end of file diff --git a/examples/client_only/bin/client_only b/examples/client_only/bin/client_only deleted file mode 100755 index af2a62312d7f..000000000000 --- a/examples/client_only/bin/client_only +++ /dev/null @@ -1,56 +0,0 @@ -#!/bin/sh - -# 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. - -cwd=`dirname $0` - -name=client_only - -# Cassandra class files -if [ ! -d $cwd/../../../build/classes/main ]; then - echo "Unable to locate cassandra class files" >&2 - exit 1 -fi - -# output jar -if [ ! -e $cwd/../build/$name.jar ]; then - echo "Unable to locate $name jar" >&2 - exit 1 -fi - -CLASSPATH=$CLASSPATH:$cwd/../build/$name.jar -CLASSPATH=$CLASSPATH:$cwd/../../../build/classes/main -for jar in $cwd/../../../lib/*.jar; do - CLASSPATH=$CLASSPATH:$jar -done -for jar in $cwd/../../../build/lib/jars/*.jar; do - CLASSPATH=$CLASSPATH:$jar -done - -if [ -x $JAVA_HOME/bin/java ]; then - JAVA=$JAVA_HOME/bin/java -else - JAVA=`which java` -fi - -if [ "x$JAVA" = "x" ]; then - echo "Java executable not found (hint: set JAVA_HOME)" >&2 - exit 1 -fi - -#echo $CLASSPATH -$JAVA -Xmx1G -ea -cp $CLASSPATH ClientOnlyExample $@ diff --git a/examples/client_only/build.xml b/examples/client_only/build.xml deleted file mode 100644 index 1052d43f5a9a..000000000000 --- a/examples/client_only/build.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/client_only/conf/cassandra.yaml b/examples/client_only/conf/cassandra.yaml deleted file mode 100644 index a6b3b431b427..000000000000 --- a/examples/client_only/conf/cassandra.yaml +++ /dev/null @@ -1,625 +0,0 @@ -# Cassandra storage config YAML - -# NOTE: -# See http://wiki.apache.org/cassandra/StorageConfiguration for -# full explanations of configuration directives -# /NOTE - -# The name of the cluster. This is mainly used to prevent machines in -# one logical cluster from joining another. -cluster_name: 'Test Cluster' - -# This defines the number of tokens randomly assigned to this node on the ring -# The more tokens, relative to other nodes, the larger the proportion of data -# that this node will store. You probably want all nodes to have the same number -# of tokens assuming they have equal hardware capability. -# -# If you leave this unspecified, Cassandra will use the default of 1 token for legacy compatibility, -# and will use the initial_token as described below. -# -# Specifying initial_token will override this setting. -# -# If you already have a cluster with 1 token per node, and wish to migrate to -# multiple tokens per node, see http://wiki.apache.org/cassandra/Operations -# num_tokens: 256 - -# If you haven't specified num_tokens, or have set it to the default of 1 then -# you should always specify InitialToken when setting up a production -# cluster for the first time, and often when adding capacity later. -# The principle is that each node should be given an equal slice of -# the token ring; see http://wiki.apache.org/cassandra/Operations -# for more details. -# -# If blank, Cassandra will request a token bisecting the range of -# the heaviest-loaded existing node. If there is no load information -# available, such as is the case with a new cluster, it will pick -# a random token, which will lead to hot spots. -initial_token: - -# See http://wiki.apache.org/cassandra/HintedHandoff -hinted_handoff_enabled: true -# this defines the maximum amount of time a dead host will have hints -# generated. After it has been dead this long, new hints for it will not be -# created until it has been seen alive and gone down again. -max_hint_window_in_ms: 10800000 # 3 hours -# throttle in KB's per second, per delivery thread -hinted_handoff_throttle_in_kb: 1024 -# Number of threads with which to deliver hints; -# Consider increasing this number when you have multi-dc deployments, since -# cross-dc handoff tends to be slower -max_hints_delivery_threads: 2 - -# authentication backend, implementing IAuthenticator; used to identify users -authenticator: org.apache.cassandra.auth.AllowAllAuthenticator - -# authorization backend, implementing IAuthorizer; used to limit access/provide permissions -authorizer: org.apache.cassandra.auth.AllowAllAuthorizer - -# The partitioner is responsible for distributing rows (by key) across -# nodes in the cluster. Any IPartitioner may be used, including your -# own as long as it is on the classpath. Out of the box, Cassandra -# provides org.apache.cassandra.dht.{Murmur3Partitioner, RandomPartitioner -# ByteOrderedPartitioner, OrderPreservingPartitioner (deprecated)}. -# -# - RandomPartitioner distributes rows across the cluster evenly by md5. -# This is the default prior to 1.2 and is retained for compatibility. -# - Murmur3Partitioner is similar to RandomPartioner but uses Murmur3_128 -# Hash Function instead of md5. When in doubt, this is the best option. -# - ByteOrderedPartitioner orders rows lexically by key bytes. BOP allows -# scanning rows in key order, but the ordering can generate hot spots -# for sequential insertion workloads. -# - OrderPreservingPartitioner is an obsolete form of BOP, that stores -# - keys in a less-efficient format and only works with keys that are -# UTF8-encoded Strings. -# - CollatingOPP colates according to EN,US rules rather than lexical byte -# ordering. Use this as an example if you need custom collation. -# -# See http://wiki.apache.org/cassandra/Operations for more on -# partitioners and token selection. -partitioner: org.apache.cassandra.dht.Murmur3Partitioner - -# directories where Cassandra should store data on disk. -data_file_directories: - - /tmp/fat-client/data - -# commit log -commitlog_directory: /tmp/fat-client/commitlog - -# policy for data disk failures: -# stop: shut down gossip and Thrift, leaving the node effectively dead, but -# still inspectable via JMX. -# best_effort: stop using the failed disk and respond to requests based on -# remaining available sstables. This means you WILL see obsolete -# data at CL.ONE! -# ignore: ignore fatal errors and let requests fail, as in pre-1.2 Cassandra -disk_failure_policy: stop - -# Maximum size of the key cache in memory. -# -# Each key cache hit saves 1 seek and each row cache hit saves 2 seeks at the -# minimum, sometimes more. The key cache is fairly tiny for the amount of -# time it saves, so it's worthwhile to use it at large numbers. -# The row cache saves even more time, but must store the whole values of -# its rows, so it is extremely space-intensive. It's best to only use the -# row cache if you have hot rows or static rows. -# -# NOTE: if you reduce the size, you may not get you hottest keys loaded on startup. -# -# Default value is empty to make it "auto" (min(5% of Heap (in MB), 100MB)). Set to 0 to disable key cache. -key_cache_size_in_mb: - -# Duration in seconds after which Cassandra should -# safe the keys cache. Caches are saved to saved_caches_directory as -# specified in this configuration file. -# -# Saved caches greatly improve cold-start speeds, and is relatively cheap in -# terms of I/O for the key cache. Row cache saving is much more expensive and -# has limited use. -# -# Default is 14400 or 4 hours. -key_cache_save_period: 14400 - -# Number of keys from the key cache to save -# Disabled by default, meaning all keys are going to be saved -# key_cache_keys_to_save: 100 - -# Maximum size of the row cache in memory. -# NOTE: if you reduce the size, you may not get you hottest keys loaded on startup. -# -# Default value is 0, to disable row caching. -row_cache_size_in_mb: 0 - -# Duration in seconds after which Cassandra should -# safe the row cache. Caches are saved to saved_caches_directory as specified -# in this configuration file. -# -# Saved caches greatly improve cold-start speeds, and is relatively cheap in -# terms of I/O for the key cache. Row cache saving is much more expensive and -# has limited use. -# -# Default is 0 to disable saving the row cache. -row_cache_save_period: 0 - -# Number of keys from the row cache to save -# Disabled by default, meaning all keys are going to be saved -# row_cache_keys_to_save: 100 - -# The provider for the row cache to use. -# -# Supported values are: ConcurrentLinkedHashCacheProvider, SerializingCacheProvider -# -# SerializingCacheProvider serialises the contents of the row and stores -# it in native memory, i.e., off the JVM Heap. Serialized rows take -# significantly less memory than "live" rows in the JVM, so you can cache -# more rows in a given memory footprint. And storing the cache off-heap -# means you can use smaller heap sizes, reducing the impact of GC pauses. -# -# It is also valid to specify the fully-qualified class name to a class -# that implements org.apache.cassandra.cache.IRowCacheProvider. -# -# Defaults to SerializingCacheProvider -row_cache_provider: SerializingCacheProvider - -# The pluggable Memory allocation for Off heap row cache, Experiments show that JEMAlloc -# saves some memory than the native GCC allocator. -# -# Supported values are: NativeAllocator, JEMallocAllocator -# -# If you intend to use JEMallocAllocator you have to install JEMalloc as library and -# modify cassandra-env.sh as directed in the file. -# -# Defaults to NativeAllocator -# memory_allocator: NativeAllocator - -# saved caches -saved_caches_directory: /tmp/fat-client/saved_caches - -# commitlog_sync may be either "periodic" or "batch." -# When in batch mode, Cassandra won't ack writes until the commit log -# has been fsynced to disk. It will wait up to -# commitlog_sync_batch_window_in_ms milliseconds for other writes, before -# performing the sync. -# -# commitlog_sync: batch -# commitlog_sync_batch_window_in_ms: 50 -# -# the other option is "periodic" where writes may be acked immediately -# and the CommitLog is simply synced every commitlog_sync_period_in_ms -# milliseconds. -commitlog_sync: periodic -commitlog_sync_period_in_ms: 10000 - -# The size of the individual commitlog file segments. A commitlog -# segment may be archived, deleted, or recycled once all the data -# in it (potentally from each columnfamily in the system) has been -# flushed to sstables. -# -# The default size is 32, which is almost always fine, but if you are -# archiving commitlog segments (see commitlog_archiving.properties), -# then you probably want a finer granularity of archiving; 8 or 16 MB -# is reasonable. -commitlog_segment_size_in_mb: 32 - -# any class that implements the SeedProvider interface and has a -# constructor that takes a Map of parameters will do. -seed_provider: - # Addresses of hosts that are deemed contact points. - # Cassandra nodes use this list of hosts to find each other and learn - # the topology of the ring. You must change this if you are running - # multiple nodes! - - class_name: org.apache.cassandra.locator.SimpleSeedProvider - parameters: - # seeds is actually a comma-delimited list of addresses. - # Ex: ",," - - seeds: "127.0.0.1" - -# For workloads with more data than can fit in memory, Cassandra's -# bottleneck will be reads that need to fetch data from -# disk. "concurrent_reads" should be set to (16 * number_of_drives) in -# order to allow the operations to enqueue low enough in the stack -# that the OS and drives can reorder them. -# -# On the other hand, since writes are almost never IO bound, the ideal -# number of "concurrent_writes" is dependent on the number of cores in -# your system; (8 * number_of_cores) is a good rule of thumb. -concurrent_reads: 32 -concurrent_writes: 32 - -# Total memory to use for memtables. Cassandra will flush the largest -# memtable when this much memory is used. -# If omitted, Cassandra will set it to 1/3 of the heap. -# memtable_total_space_in_mb: 2048 - -# Total space to use for commitlogs. Since commitlog segments are -# mmapped, and hence use up address space, the default size is 32 -# on 32-bit JVMs, and 1024 on 64-bit JVMs. -# -# If space gets above this value (it will round up to the next nearest -# segment multiple), Cassandra will flush every dirty CF in the oldest -# segment and remove it. So a small total commitlog space will tend -# to cause more flush activity on less-active columnfamilies. -# commitlog_total_space_in_mb: 4096 - -# This sets the amount of memtable flush writer threads. These will -# be blocked by disk io, and each one will hold a memtable in memory -# while blocked. If you have a large heap and many data directories, -# you can increase this value for better flush performance. -# By default this will be set to the amount of data directories defined. -#memtable_flush_writers: 1 - -# the number of full memtables to allow pending flush, that is, -# waiting for a writer thread. At a minimum, this should be set to -# the maximum number of secondary indexes created on a single CF. -memtable_flush_queue_size: 4 - -# Whether to, when doing sequential writing, fsync() at intervals in -# order to force the operating system to flush the dirty -# buffers. Enable this to avoid sudden dirty buffer flushing from -# impacting read latencies. Almost always a good idea on SSD:s; not -# necessarily on platters. -trickle_fsync: false -trickle_fsync_interval_in_kb: 10240 - -# TCP port, for commands and data -storage_port: 7000 - -# SSL port, for encrypted communication. Unused unless enabled in -# encryption_options -ssl_storage_port: 7001 - -# Address to bind to and tell other Cassandra nodes to connect to. You -# _must_ change this if you want multiple nodes to be able to -# communicate! -# -# Leaving it blank leaves it up to InetAddress.getLocalHost(). This -# will always do the Right Thing *if* the node is properly configured -# (hostname, name resolution, etc), and the Right Thing is to use the -# address associated with the hostname (it might not be). -# -# Setting this to 0.0.0.0 is always wrong. -listen_address: 127.0.0.2 - -# Address to broadcast to other Cassandra nodes -# Leaving this blank will set it to the same value as listen_address -# broadcast_address: 1.2.3.4 - - -# Whether to start the native transport server. -# Currently, only the thrift server is started by default because the native -# transport is considered beta. -# Please note that the address on which the native transport is bound is the -# same as the rpc_address. The port however is different and specified below. -start_native_transport: false -# port for the CQL native transport to listen for clients on -native_transport_port: 9042 -# The minimum and maximum threads for handling requests when the native -# transport is used. The meaning is those is similar to the one of -# rpc_min_threads and rpc_max_threads, though the default differ slightly and -# are the ones below: -# native_transport_min_threads: 16 -# native_transport_max_threads: 128 - - -# Whether to start the thrift rpc server. -start_rpc: false -# The address to bind the Thrift RPC service to -- clients connect -# here. Unlike ListenAddress above, you *can* specify 0.0.0.0 here if -# you want Thrift to listen on all interfaces. -# -# Leaving this blank has the same effect it does for ListenAddress, -# (i.e. it will be based on the configured hostname of the node). -rpc_address: localhost -# port for Thrift to listen for clients on -rpc_port: 9160 - -# enable or disable keepalive on rpc connections -rpc_keepalive: true - -# Cassandra provides three out-of-the-box options for the RPC Server: -# -# sync -> One thread per thrift connection. For a very large number of clients, memory -# will be your limiting factor. On a 64 bit JVM, 128KB is the minimum stack size -# per thread, and that will correspond to your use of virtual memory (but physical memory -# may be limited depending on use of stack space). -# -# hsha -> Stands for "half synchronous, half asynchronous." All thrift clients are handled -# asynchronously using a small number of threads that does not vary with the amount -# of thrift clients (and thus scales well to many clients). The rpc requests are still -# synchronous (one thread per active request). -# -# The default is sync because on Windows hsha is about 30% slower. On Linux, -# sync/hsha performance is about the same, with hsha of course using less memory. -# -# Alternatively, can provide your own RPC server by providing the fully-qualified class name -# of an o.a.c.t.TServerFactory that can create an instance of it. -rpc_server_type: sync - -# Uncomment rpc_min|max_thread to set request pool size limits. -# -# Regardless of your choice of RPC server (see above), the number of maximum requests in the -# RPC thread pool dictates how many concurrent requests are possible (but if you are using the sync -# RPC server, it also dictates the number of clients that can be connected at all). -# -# The default is unlimited and thus provide no protection against clients overwhelming the server. You are -# encouraged to set a maximum that makes sense for you in production, but do keep in mind that -# rpc_max_threads represents the maximum number of client requests this server may execute concurrently. -# -# rpc_min_threads: 16 -# rpc_max_threads: 2048 - -# uncomment to set socket buffer sizes on rpc connections -# rpc_send_buff_size_in_bytes: -# rpc_recv_buff_size_in_bytes: - -# uncomment to set socket buffer size for internode communication -# internode_send_buff_size_in_bytes: -# internode_recv_buff_size_in_bytes: - -# Frame size for thrift (maximum field length). -thrift_framed_transport_size_in_mb: 15 - -# The max length of a thrift message, including all fields and -# internal thrift overhead. -thrift_max_message_length_in_mb: 16 - -# Set to true to have Cassandra create a hard link to each sstable -# flushed or streamed locally in a backups/ subdirectory of the -# Keyspace data. Removing these links is the operator's -# responsibility. -incremental_backups: false - -# Whether or not to take a snapshot before each compaction. Be -# careful using this option, since Cassandra won't clean up the -# snapshots for you. Mostly useful if you're paranoid when there -# is a data format change. -snapshot_before_compaction: false - -# Whether or not a snapshot is taken of the data before keyspace truncation -# or dropping of column families. The STRONGLY advised default of true -# should be used to provide data safety. If you set this flag to false, you will -# lose data on truncation or drop. -auto_snapshot: true - -# Add column indexes to a row after its contents reach this size. -# Increase if your column values are large, or if you have a very large -# number of columns. The competing causes are, Cassandra has to -# deserialize this much of the row to read a single column, so you want -# it to be small - at least if you do many partial-row reads - but all -# the index data is read for each access, so you don't want to generate -# that wastefully either. -column_index_size_in_kb: 64 - -# Size limit for rows being compacted in memory. Larger rows will spill -# over to disk and use a slower two-pass compaction process. A message -# will be logged specifying the row key. -in_memory_compaction_limit_in_mb: 64 - -# Number of simultaneous compactions to allow, NOT including -# validation "compactions" for anti-entropy repair. Simultaneous -# compactions can help preserve read performance in a mixed read/write -# workload, by mitigating the tendency of small sstables to accumulate -# during a single long running compactions. The default is usually -# fine and if you experience problems with compaction running too -# slowly or too fast, you should look at -# compaction_throughput_mb_per_sec first. -# -# concurrent_compactors defaults to the number of cores. -# Uncomment to make compaction mono-threaded, the pre-0.8 default. -#concurrent_compactors: 1 - -# Multi-threaded compaction. When enabled, each compaction will use -# up to one thread per core, plus one thread per sstable being merged. -# This is usually only useful for SSD-based hardware: otherwise, -# your concern is usually to get compaction to do LESS i/o (see: -# compaction_throughput_mb_per_sec), not more. -multithreaded_compaction: false - -# Throttles compaction to the given total throughput across the entire -# system. The faster you insert data, the faster you need to compact in -# order to keep the sstable count down, but in general, setting this to -# 16 to 32 times the rate you are inserting data is more than sufficient. -# Setting this to 0 disables throttling. Note that this account for all types -# of compaction, including validation compaction. -compaction_throughput_mb_per_sec: 16 - -# Track cached row keys during compaction, and re-cache their new -# positions in the compacted sstable. Disable if you use really large -# key caches. -compaction_preheat_key_cache: true - -# Throttles all outbound streaming file transfers on this node to the -# given total throughput in Mbps. This is necessary because Cassandra does -# mostly sequential IO when streaming data during bootstrap or repair, which -# can lead to saturating the network connection and degrading rpc performance. -# When unset, the default is 400 Mbps or 50 MB/s. -# stream_throughput_outbound_megabits_per_sec: 400 - -# How long the coordinator should wait for read operations to complete -read_request_timeout_in_ms: 10000 -# How long the coordinator should wait for seq or index scans to complete -range_request_timeout_in_ms: 10000 -# How long the coordinator should wait for writes to complete -write_request_timeout_in_ms: 10000 -# How long the coordinator should wait for truncates to complete -# (This can be much longer, because unless auto_snapshot is disabled -# we need to flush first so we can snapshot before removing the data.) -truncate_request_timeout_in_ms: 60000 -# The default timeout for other, miscellaneous operations -request_timeout_in_ms: 10000 - -# Enable operation timeout information exchange between nodes to accurately -# measure request timeouts, If disabled cassandra will assuming the request -# was forwarded to the replica instantly by the coordinator -# -# Warning: before enabling this property make sure to ntp is installed -# and the times are synchronized between the nodes. -cross_node_timeout: false - -# Enable socket timeout for streaming operation. -# When a timeout occurs during streaming, streaming is retried from the start -# of the current file. This *can* involve re-streaming an important amount of -# data, so you should avoid setting the value too low. -# Default value is 0, which never timeout streams. -# streaming_socket_timeout_in_ms: 0 - -# phi value that must be reached for a host to be marked down. -# most users should never need to adjust this. -# phi_convict_threshold: 8 - -# endpoint_snitch -- Set this to a class that implements -# IEndpointSnitch. The snitch has two functions: -# - it teaches Cassandra enough about your network topology to route -# requests efficiently -# - it allows Cassandra to spread replicas around your cluster to avoid -# correlated failures. It does this by grouping machines into -# "datacenters" and "racks." Cassandra will do its best not to have -# more than one replica on the same "rack" (which may not actually -# be a physical location) -# -# IF YOU CHANGE THE SNITCH AFTER DATA IS INSERTED INTO THE CLUSTER, -# YOU MUST RUN A FULL REPAIR, SINCE THE SNITCH AFFECTS WHERE REPLICAS -# ARE PLACED. -# -# Out of the box, Cassandra provides -# - SimpleSnitch: -# Treats Strategy order as proximity. This improves cache locality -# when disabling read repair, which can further improve throughput. -# Only appropriate for single-datacenter deployments. -# - PropertyFileSnitch: -# Proximity is determined by rack and data center, which are -# explicitly configured in cassandra-topology.properties. -# - GossipingPropertyFileSnitch -# The rack and datacenter for the local node are defined in -# cassandra-rackdc.properties and propagated to other nodes via gossip. If -# cassandra-topology.properties exists, it is used as a fallback, allowing -# migration from the PropertyFileSnitch. -# - RackInferringSnitch: -# Proximity is determined by rack and data center, which are -# assumed to correspond to the 3rd and 2nd octet of each node's -# IP address, respectively. Unless this happens to match your -# deployment conventions (as it did Facebook's), this is best used -# as an example of writing a custom Snitch class. -# - Ec2Snitch: -# Appropriate for EC2 deployments in a single Region. Loads Region -# and Availability Zone information from the EC2 API. The Region is -# treated as the Datacenter, and the Availability Zone as the rack. -# Only private IPs are used, so this will not work across multiple -# Regions. -# - Ec2MultiRegionSnitch: -# Uses public IPs as broadcast_address to allow cross-region -# connectivity. (Thus, you should set seed addresses to the public -# IP as well.) You will need to open the storage_port or -# ssl_storage_port on the public IP firewall. (For intra-Region -# traffic, Cassandra will switch to the private IP after -# establishing a connection.) -# -# You can use a custom Snitch by setting this to the full class name -# of the snitch, which will be assumed to be on your classpath. -endpoint_snitch: SimpleSnitch - -# controls how often to perform the more expensive part of host score -# calculation -dynamic_snitch_update_interval_in_ms: 100 -# controls how often to reset all host scores, allowing a bad host to -# possibly recover -dynamic_snitch_reset_interval_in_ms: 600000 -# if set greater than zero and read_repair_chance is < 1.0, this will allow -# 'pinning' of replicas to hosts in order to increase cache capacity. -# The badness threshold will control how much worse the pinned host has to be -# before the dynamic snitch will prefer other replicas over it. This is -# expressed as a double which represents a percentage. Thus, a value of -# 0.2 means Cassandra would continue to prefer the static snitch values -# until the pinned host was 20% worse than the fastest. -dynamic_snitch_badness_threshold: 0.1 - -# request_scheduler -- Set this to a class that implements -# RequestScheduler, which will schedule incoming client requests -# according to the specific policy. This is useful for multi-tenancy -# with a single Cassandra cluster. -# NOTE: This is specifically for requests from the client and does -# not affect inter node communication. -# org.apache.cassandra.scheduler.NoScheduler - No scheduling takes place -# org.apache.cassandra.scheduler.RoundRobinScheduler - Round robin of -# client requests to a node with a separate queue for each -# request_scheduler_id. The scheduler is further customized by -# request_scheduler_options as described below. -request_scheduler: org.apache.cassandra.scheduler.NoScheduler - -# Scheduler Options vary based on the type of scheduler -# NoScheduler - Has no options -# RoundRobin -# - throttle_limit -- The throttle_limit is the number of in-flight -# requests per client. Requests beyond -# that limit are queued up until -# running requests can complete. -# The value of 80 here is twice the number of -# concurrent_reads + concurrent_writes. -# - default_weight -- default_weight is optional and allows for -# overriding the default which is 1. -# - weights -- Weights are optional and will default to 1 or the -# overridden default_weight. The weight translates into how -# many requests are handled during each turn of the -# RoundRobin, based on the scheduler id. -# -# request_scheduler_options: -# throttle_limit: 80 -# default_weight: 5 -# weights: -# Keyspace1: 1 -# Keyspace2: 5 - -# request_scheduler_id -- An identifer based on which to perform -# the request scheduling. Currently the only valid option is keyspace. -# request_scheduler_id: keyspace - -# Enable or disable inter-node encryption -# Default settings are TLS v1, RSA 1024-bit keys (it is imperative that -# users generate their own keys) TLS_RSA_WITH_AES_128_CBC_SHA as the cipher -# suite for authentication, key exchange and encryption of the actual data transfers. -# NOTE: No custom encryption options are enabled at the moment -# The available internode options are : all, none, dc, rack -# -# If set to dc cassandra will encrypt the traffic between the DCs -# If set to rack cassandra will encrypt the traffic between the racks -# -# The passwords used in these options must match the passwords used when generating -# the keystore and truststore. For instructions on generating these files, see: -# http://download.oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#CreateKeystore -# -server_encryption_options: - internode_encryption: none - keystore: conf/.keystore - keystore_password: cassandra - truststore: conf/.truststore - truststore_password: cassandra - # More advanced defaults below: - # protocol: TLS - # algorithm: SunX509 - # store_type: JKS - # cipher_suites: [TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA] - # require_client_auth: false - -# enable or disable client/server encryption. -client_encryption_options: - enabled: false - keystore: conf/.keystore - keystore_password: cassandra - # More advanced defaults below: - # protocol: TLS - # algorithm: SunX509 - # store_type: JKS - # cipher_suites: [TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA] - # require_client_auth: false - -# internode_compression controls whether traffic between nodes is -# compressed. -# can be: all - all traffic is compressed -# dc - traffic between different datacenters is compressed -# none - nothing is compressed. -internode_compression: all - -# Enable or disable tcp_nodelay for inter-dc communication. -# Disabling it will result in larger (but fewer) network packets being sent, -# reducing overhead from the TCP protocol itself, at the cost of increasing -# latency if you block for cross-datacenter responses. -inter_dc_tcp_nodelay: false diff --git a/examples/client_only/src/ClientOnlyExample.java b/examples/client_only/src/ClientOnlyExample.java deleted file mode 100644 index 7b42140e469b..000000000000 --- a/examples/client_only/src/ClientOnlyExample.java +++ /dev/null @@ -1,114 +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. - */ - -import java.util.concurrent.TimeUnit; - -import com.google.common.util.concurrent.Uninterruptibles; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.apache.cassandra.cql3.QueryProcessor; -import org.apache.cassandra.cql3.UntypedResultSet; -import org.apache.cassandra.db.ConsistencyLevel; -import org.apache.cassandra.exceptions.RequestExecutionException; -import org.apache.cassandra.exceptions.RequestValidationException; -import org.apache.cassandra.service.*; - -public class ClientOnlyExample -{ - private static final Logger logger = LoggerFactory.getLogger(ClientOnlyExample.class); - - private static final String KEYSPACE = "keyspace1"; - private static final String COLUMN_FAMILY = "standard1"; - - private static void startClient() throws Exception - { - StorageService.instance.initClient(); - } - - private static void testWriting() throws Exception - { - // do some writing. - for (int i = 0; i < 100; i++) - { - QueryProcessor.process(String.format("INSERT INTO %s.%s (id, name, value) VALUES ( 'key%d', 'colb', 'value%d')", - KEYSPACE, - COLUMN_FAMILY, - i, - i), - ConsistencyLevel.QUORUM); - - System.out.println("wrote key" + i); - } - System.out.println("Done writing."); - } - - private static void testReading() throws Exception - { - // do some queries. - for (int i = 0; i < 100; i++) - { - String query = String.format("SELECT id, name, value FROM %s.%s WHERE id = 'key%d'", - KEYSPACE, - COLUMN_FAMILY, - i); - UntypedResultSet.Row row = QueryProcessor.process(query, ConsistencyLevel.QUORUM).one(); - System.out.println(String.format("ID: %s, Name: %s, Value: %s", row.getString("id"), row.getString("name"), row.getString("value"))); - } - } - - /** - * First, bring one or more nodes up. Then run ClientOnlyExample with these VM arguments: - *

    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%0AF`qA-g-9Czu% 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 CMfaNk literal 0 HcmV?d00001 diff --git a/lib/sigar-bin/libsigar-s390x-linux.so b/lib/sigar-bin/libsigar-s390x-linux.so new file mode 100644 index 0000000000000000000000000000000000000000..c275f4ac693af6d3ce185714a02a573ee04a715e GIT binary patch literal 269932 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 rW5QyNzc^SyxC|dt%uwyf3y1p6>n+y=AxY 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 NFMT14j)KG1{{|eS_XGd{ literal 0 HcmV?d00001 diff --git a/lib/sigar-bin/libsigar-sparc-solaris.so b/lib/sigar-bin/libsigar-sparc-solaris.so new file mode 100644 index 0000000000000000000000000000000000000000..aa847d2b54d52b8de50748ca2402cace88674fec GIT binary patch literal 285004 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 z±*KfSW;|1n5)qT0Uo3yaze+CH`WfOzIH_{F+Rzj*FPxc-)ki1h+=C8~{DZqyh0 zj%V)VHj29DHemOQ(5N>0%txWCL)(#KH`q{i8?DdNMrAl|qYbNQqjvo+*m%A+YS#y$ z&(}un`WEQ(wNbmi4f=d-)UNMkntZ%T8-&*6<4xK&XiYxer0s*&jzH^QrFIP3(p74s(3Y)II{|I^Dz!0aD^{tUg0^y%+BmdTtJG4T zzhjl!1hj!wYUiM>UZpk(ZH<%Gq0g^%=<}0Veg0De%YT?cpPyLS=l@T0y3coQ&Fu5z zQ|R*pnSK5ro>zUo%ZonW&wW0P=llT?AL2gW@6hM_Ri7XKICKr@Yy1x5^6@-#2ApRdoi>nEYl*XP^yQ_$z@^X>ZM(C6#(?fN+M`TBgjej56G zeZE~k1AV?e->yFieZD^5u1`Rpug|yZXQ9v6=iBvj(C6#(?fTQu=j-$B`Xu!E`h2_o z4D|W>e7k-g`h0!9U4It(oPEA-m)yPj8Yt~^In@=imJ6q>r#w?N_lPa zi||dQ0rB+Pc??wQFa|1BW1y$s3|%>Vr~D1du&o>sb>%GwD8w=U>#n9&)3)%HP=<|(* z?D`Vu^Noe&#kA=ua(tY1H*g~{4&wRR+`@S*?Yv}vn>sGFr%HK(`mPcW*u08o2 z)>)rjcVdFp3u%3Owjk&x+rzP=bF{wg6&Frpo$jtTC9jw*@O#i!so%TcIdR_H>71ch}-H~B|XA85)W`A1V9Xws5@H1&ZdE%`@NA868&e>C-hCha`5 zran+=4gN7X>-Lv9_(#3oqJO*j=D_mrZos_(?v?)WcMDYB%0G$)D`WlkslUQpZX$Co z_q$Hi6V`9VkKxD4*pEd}Uu6OOT?6|u*qw3xwoLi4r!Iu96n0T&p37}3%j3snIQB>7 ztC-8#^%ZDu`TUn%UkQCa|7F)#L7&fm+4Vc1&*#7F`T+F#{Fhx{4Si1kMRk|$Ep3-p#7Jd+rK~GT8<3I zbIplWw12z)DB455_HWZS)j*%G{oC}x81(ttzg<5CeZKZ@*RN(R$EI(pMf^G2zpe)^ zPg?uQH-53jADo6h-&&4cPirlu_OT{xIQutoyPnog%FaViYbWLBp+5uL&X@Yg{He{IsX!B3g|wMiR- z*5t2E+CFGa{@SFCKx^{XChZWkCVy?xjzDYj*Cy>4v?hOT(ng^*jRQ?u^qt0Wph-)8 zXPIG6ZPHTTX<7?0Y2(mVtTJBeJ56gLrg*9EG_8f0wA6Q+)>htNfId@>MZeJoT`}x2V7B|b_xs6kY{zYR?4IuTv+FzZ*nPG>r0t%{ ziR?am>_qvp*=`uNEAKx>IXR6D0&Kfp3Tv=k_;;i2nzZEKO}1;&l7BbZu1QP&-DJB` zYqLlDy=`6xdkkgS;}ZkRzy4p`^E3--D8y zqC9BM{dJ5f8@OKE&>uGh#1o&F^?Fsb!BDR>ro=iA*~=53hOPwTg$8rI<{eYYa9pqW zeKu#k(iqXE-<@xMldZ@4SWcgotw(xt`m}64jX`scDXHAjcDa2Ad|+{&aZ&@@CEZ8S zV6e+6qg|S{X1g?N$zPhrNv1T!p*4+@Oj`1nrg4%78lIq!oVI?c;$ z`XKq3k`1Z#?Csu+x>z|cvxVJVjIcR>uZ7RpW%D;a_?vw9o9$wMQ%3eic9ulH{w$t7 zH0$1eh}s3Umlx0%&bhZmkw*_5gHGO823y@g;jqpTI)yMV;J!0DPjO&8z8<=b6o$f@ z!W~@qbcOkPNqJ9Nj&LD|aD{o&ImqesrqlUSlG2$c+!%+Gf5)uy_tL3VggeUNe75UN z=PMVKXPoMQbaX8Wi*dk{FJQi>(}{DN={U{dsUA+D9%w)7Z>-7xn&y2bE%g_sd7soe z_+N+n*q+K>bBhfu|KfA_?O?}B|NG0gP`Y^>bN~3dr!cqEe~0||*OAYn%yG;w==mQs zjv0e4$UgGjqzj10@%K#_pI#LWI{3(-@{x~!06O~ZAZYfH+fHV*%j|Vp4#z$+u?in4 zufzITwBvj}(ypI_KG)og>OPom_uEdR-RJx5Ajs{W{;n%XWoK?rar&Elr}i5>xbCUX zn8PLAxx+o}6fUFPlU_#j_@ zZ;$^h^f|}mS@ADGpRd2S$3G5zzI9%^eggWO>%3^YEw;9M6m8d^XO7UqZ5Mrel;-Mx zO51HYxbDe?KcVd++}EALWwc$S%RWXxxGAS_@?LU>z8>Me;S|oX?aFdl_f4m8w8mm= z^D5l8oWjvuBS*O7PT}ZT9jS0xJ`MSM$|;;*_w@#!hHy_WIQXau*= zBLmC-{Sf+R=@-d|rRPUy-YuUhuwwm)`mr|U(;mGQI(n8*+e)9ds%QDgaO^{3tMF-dJ<^c3f41v8pwHPq z>wIu}CZW&g)9mq2K`(t8>eXqEVbjaseu~p`jBUp=#xhxR3@US*|B1u@`11H4{O&-{ zr;^Y0X(QXn8gn|WQJA#!`@zb!Go;B7FReS6)+kI`TF)@8QJA!}?qFJ@FllK#ZCax+ zX=yyIf6KA|-XXQN@ihGo!O!$^e6CM2tGzxvu>A8AXs@aD-*kKZ?~kP0Yxdvx$Iha? zX8n!-&*xQpm4D;kq1vlOf8*Z~5V6m4d+l&&udsbu7mU&Kf9P-gI~>|;zWc&uIMqIa z=ri-K3)=PQGxN4ryB_`^Z+o@tSJPhY`c!+RdYCob>!Ztw^LrfW$u|bE$B#CecMM|J zPeY$`43d?e8R&DaGi2#cLSLHazHNJYFkj03`*K$NG+!z|kN9c6RB;}9%$M@s7j92K z#>jc^3%BcOjGXhn@T~mKLmxPg^q+;k`aJYB=B+so{UY?Wx%A{K(tU`334MbeUpU!yF=^GD~uhB=mg{%DBj zEMfSjP(VC#Gmn8n4r8E@8UsCo`y=I?CFC#$%J=+H8IH#URjU{S+4Vc%qw}pP+VuhG z^UYc8`fBL&%~|aF8tC(_!`St;(B~WjQC-;jn7UQWQ{X#O^A!18dDc7yZQt-4Kdxiw zkErdN`WTaz+P-O?V$xFEH}x?lEwz2qJjJA?wr`rJn6%XPO?`~iI<$R<=Z~&V) z<)3~YZNGYD+n*1l+rG6fb6w%#8O&3nqX*^v+kAiaPoL&>g>zU}=;Jmz47=zHh=*Ib zjrKXT(LU8iAN~+@v{u?@Zll|#Gv>-G*ZpNUp2uUHoOhmL)9kt%Gl&^-I&eQF>imk1HM=SpLb!aUXx`??2LOAV2+cn{T--f_pmt^!xaa zPGDRSp*URU{p_Hh+@;197Vhhc_Os7A4qNOGh@(~Pv-%x;R=@IDN3Vvi3T><3?6bC? z&f~LWIBt`eyXN&-cKs;YWImr|*N;J;&u7{7hoH~rv+VjP^!a?2T|W+eKA&aRPe7l~ zXW8{fq0i~FbiHx;$Dq%*wqlQe68h3ybMLJ9r=Tx84}Ayp<+=1^t2UpDu`d4Z6l?eB zi=F27{p@oqDXhWg4mtQ-lQshXVe+{q?Fh7{ahFLu2Cd2GnzZO6j6T<-r9Q&sb4^Sf)TSn-{!XYbJM-iG8~UV zJ$d{&-M4Sk?+&BA=kn(=owoLladR}^-w2|O%6S&u?;XK2#*!B`H z=oQbonx@EBVTbg-D;b9D%l3Qekio7RG4|-tc9kA`{CGWGC#vQyRm!gL9wWSGM%mSo zFD{hgo-K8r=Qd~l7U%RkX9n4>=$$izuq*2S>76r!2D_qn&J40$l|o1FoEgk|=S;58wSe&vy`PQVMYI8VuBZ1%QCtuI%Fs#dRD@a zDx(MglXU1ahc@CKOxU*V{S$O=Y{v7;RxB2f3py#%Mzek7;QCiLS zT%_->H2l^-ME3|d{MPSypOwvagIRU+z`*j0G0e$RfB$N$8_bVWe>eSz%_q`tl<jq^tr~mS!ru3 zhd$R>mwfMV+P>u9v3PUZ7xZjj^fyz(RCifxT=TZER{A$+vzGedm18Zlmc|$>$697B zjWJe^wai)?W2~Itveqybn45JwKEFb@O+8=y>cH{~zs6W#O8ca=&wlYsX`ht+EVT!( z#adJ_(-*x+ev0nfqi3m&u+5)^e;5gf3HUd8kIRU`=II`n5oPleQ_#_~)J9hNq9DDm zD&KGBG924I<}G>Wb#^_?TXKy9=stRzepSy>v*}m$EH%5H<}LZ=b#^_irRAH~+4QS= zmYPi;j3fSh^E$hp*52~X>+Jej==06%?E2Ht=bP8r^-1V+&g(MkH+T~Iid^%+Ed31h zmFJ0i@rR-zS3!4ius`&r_!_3Mhw0(X!Di!-y==hHu$NP zzS10T2-=mt(yZ-+cBQX0YccLN_)4=D;}GM#)RZ@rlW|^Z($YNIG%q!2qtKe>r6%nJ zw5EBfNgIQ<%rMt9X=%=FnwOfi)W@0Tr6w))ai-s#P1*#sRjW)d&7)1fIh*25LTmcX zS!xY^Cq0L>n&vq)N22tk$BZl9BR4*<{QQ*|&-d%TGd*T}{$JC5r%0;tJl$VvAJ2cS zedT!m`FE&3RQv$iQSL)O3O_R%5D)x{`_NHCA4=o-QPqb&@KfmMS+=9LapTZz#<+3! zuyNdoFyud|{~X)6ZISvdHpuXV?uS)u63-JA>B)v=f zDE;ln7p_TS42+)w9p_F-x4uuB;)E`B-#J|e>k+ehogn*}=k&aD*ggFXMrxhF_AK?$ zx%9KtX^tb~oh=9!I%sI!NNd!)tC1eEO(* zQ$pp0e4a_S-^a7pEAAgyPQDK9_xQ^8oBWZj{qlVL@%ha5`#}H7_M7}5uCM3gW88ju zKK=mx{XgC3J?7AU$5i|M>hDO0dKz0f243;Es;2q)n9T<3Rxuw(e;`0&8;fBg&QB&F~j^{3!BzUlP~s()Qi4`4lu>KXMHrh4La zrHe2pNz!|a6R$imP3uYUnVS;pPE3y;l<$XLr)?DRFCe_v8xhaP5I2=GUH@Q_EZ+v3 z&)Eo@lE2H5J)zx88)?@_@R=dsDx9bj1B2j{60U)8CKN@vS)i;D~!%9(P4V zVdQH;dZ+n?IDeU~JxLpZe#d= zr&0fH9O5aOv;EC4txIt^Zq|QC2mQ&E9_d|$K9SZxxElRzT7P6U`qOFsgj@@zG*SNS z>8J9bV{@+iln=!-P$+NDqKIC z7i;_$*~R)3%Xb`EbBl*;19kaEYO67?*p&9qCx#*qM5)f*FRY6OQFlJr)r8ve9%6oPSDbI`UsOL%auM4FSx+azR z7V=Lneg-b${Vv&=H)6SD+j2)MxgXg_b{-JpT_eT*|oCiZ#b*CHXBi?(`%5Nl)5$ z?LKFpBiqKE+1ErKbB_PA_3k|5KUtQPu37Yt@TVS>p?+3LvGLitC~MNvxR3oR%JsZ` z>Y%K5*b4c|$X5fNH$?>f?ziOu?Az*G`ZCxG{$@L;FY6>5B)g!rk*&Yr!fzV*?M2)9 zL02H-Z~g6lfx=OE9hSnqK<~>zm~{AH1ntlG_k6P)UfL1b#B&HwW6m!YAiN7>T5;c` z^fLub0>4Ae)3u&Om{C_`y_gv|J&f=M`lhXf?kGTIQIKL^=|NQVl zTzdoj&o#>b1a0rdA^&s#yOjS4mf38vp2lVfw-IaZWy=5De*<)-_iJH}00tQQZ^}habl^x4?g1k{;(h zJw?Ybzx>L;^6A%O-an1+Gvps9<@n2@aqm{lfy-!KKL>ky4$sGUwqToFW1z9)Y(YRI z-g;u<6u&1*X<&!YP*|lwn|bSrSRRcBnyEaRLTKW7G+tMtErs(>*i}Z|z zRQ*#u==vkON{2bHenZTst$1Jd+@fQajqIxj^m&{n4no z0K>Q@@a@-^o_k2;iN{wvFkp7dhj62}SXdoHqS zSs%CrN4cc+`KD9Hac^Hb5%HXAwTt@C=fCcU)3a=S)4;?yPgDPjv=-m9L{Rl)X|o;Oj#1h&gu>|7Tzq&*Ez^ zzQkYVYp3JyIRSqUh@Z3<|N3mzCw|^NKNA_7(?nO^XZkFXZxHVo!wLNP$3zQsw5dL5 zI8!|Du=?#lJX585=!bt-9jXg{{uMaH&$e-YYtY2i)W)C1Oq-L(;x0DHzfb3QT>CN! z_Cp8qBpxO09C8NZAHTY|1$vq&ue*uRH)-*Wc{zPQ9&b#Vcw^2<45VErRQKve^cKF} zed|j86-&1qF%GC!WFv8ejMY3}tAd^118uO_z@`!^Gvml$6s&1?{lpr`Sx z&^Hl&&dlDXRqpBF9|N9pd}HgmrK-=aS7=?RakPWj9R0!C$r{=_<7muH$PWKWShi}oO2 z@cNO5ocw4h{0_&c*P(O7lj)Wx)##=eaF2>EtAFMQ-vG2o2NgRF4N2(RNI85*6Ju6P zHUb^3f<=kK)tS8@KUf_A|7 zAkL=P^i_qF?DpS%7`X0X-X+WO=cVf!ja-}c%vfmuMR}aRF(~K9%~lb+J0;F$zKvpa zpJJ${9v?oVxLG*PAHKV{rEITuvn?_!d@zDCjlalZM=K4fhV@I@UpEmkX`gNLY zNgrzf=z*{4u4Ut|R9LrEIh9vAl~);+6^^6KB`E*JzDTZxd1p>I1WUWe)@@ZzX{>pnF(>e*Wicj=!f7(*B`)-Oocj6 z6Z0FRb9IF>6JmZ9_`aq>nT~LraI9^1eu?eTT2xorTGYDJ$%-8tZ8pyMI@f7l-7UX2 zv`({hAHFFvGcE1h|2Q;johD@S4rX(l-9g4=Z?L8J%SN}2>+mrj$k_J^Ys>enFa2;5 z_MQDNbNb3{&iLBS55FS0wKm7h=VWuJx9zKA>&y4=7M-%Kk+JpVAHD&)WOur(-C1kx z&W*m^x$lS8?yMcBdCcyxj*wgH+nxLL{XZ9-zV=kRqxGFRyF+%Te0@iD$CR_{H78|v zWV3w#d(M4D^qu@^`qHfPsIArpvGx%zyDEpCEMMyh>+N#*e&Ek^Mx`9S0DSm+t4=^0 zd~B{@<3jCPDV=ZDebkN$I=sBD{lK5e1{wZ`bpF-o{9yetSjQ>X`D?At=l(*Y^XZGq zYtm;}$GJby`Jr{3osz9bljD9C^#p6uueFY|V#MlQ^(B0qekkg&$0HZp#JY|2_XhBW z;zr|p&w-aLg!FyeM14Q<2K3v6{g0LOz2q2uPo0_Ap-9g7*21IunHwflzjTjcQNF+E zL{#PsbvNKEHc|I!@3vK2Ro=)vZ4Rx4Gw&*f)~Yj$UIR9?R-IWK=+d$_89NqgQ)|#B zWbu@>v9hw4sZT;>XI3g}_30nFZgW)nbpQCippQT5e|rvndf(qtuk>kX-DZ$^rm^Ro zSxP-3|6e?mEGrI!Z|~||^vbu_I8%S^j^|=tzZ;7X|KWd<|8Zn^S`V=;^i~zVf2_c~ zk>`m1OTNeF08hU3yScgL#o0O8Tdf)GUSImbe&zvLum92#^UrGSN%YtO4&G=LdW-j} z^`*nhM2qH4q(9|-E)(3b(Wo`0$7=?cBa7OPHgkQc^pAp-ZU)~Jo}0*<0sUtqbB*xg z0_G9>p;O;ZkzSu67}C3yt~76NPW33hgr7U%kkb6(-ai2@In4X1dVW;_Js<+^pEbj?2M0!G4?Z@` z+7)T}5!RCIYGBh`yES|FGX>B9_>EktKA1QLFy*t=3?b}%=x&u6t$C1d2oZf?WYb=hBsljzh zM@}~j#>Om~_7V#y5(}WbVjnhUdhd0>n3w>xGF}Z%;!uYl7aU`vdVu=Ymxf;z&WU4p zFl*~!eT;I9uLyA&#=y)%gqQ;|O+I^U?#&3-F7g*B#zDI@)`UytLa{2v#uA}+7=46J zxQqH9L?>{!hkKLi40Mxtr?J8r3dNSpK7Pd!;hWCVYajn9ygM9OkyX7mRx};@E|LBf ze6Y_-`J%)6jCSARy$eZyz55nL^L512o}o|I4bhL`IH>Hu+Cd-9QeEMA#>olsjC_WOGZt6SH|zz@u}4Pw=AMgyQ>P1j5q{N8fxeOK(qH9sZbPTm#D>uotc!Vp zzA-w8HL~5!Zg8K#RE?R?+FP|m6 zm)VZZd-R=vGmXu4;#(g&P&mN#p4Whvj!>QN5PV1%1m`@1bKSevm%e`!lH$%J5f0_EME@AAR(HAL)PXK?Wd1g6$ z1MshPel1K7y6ued&2s!Lz?aW0!@95>Uh&g2#W&00X99nw_+~l03%rSMN*<+arE|ml zSN|KmihjYCA`4^j&C{Ky>##bO_-3v{cs0M%7^6S67a><^P8sswIzm3)ewC4KkdG%> zz&Cv4bm!*q*-yR4$1gKbp^W*yOHjtICvC>hY3P1T^Fz%=gLoLcikt>E4{Wd}VSL_P znIF%{{=ZJV1z>|c39p5B1lUUFnk)6mabPQ*Yc{a5UuAdh6o+H3&U=i_VMD&z7V&a@ zY3Nt#d-<67kJa-1WH<3mnzc@@wI}H;VB1DJ<#X(QX%}}O$)5q<_%rDH69>?Jl!^bt z#qMlyYMlyS^U~4*exW+U>qR?(n?>wyHU8BZ_6-buGoUZxRoaWOn;2ZBJp)5;6AjR` zQ08yx)A|1Ry632@?AiZt&j9mmz*sx(p9`Wr!Mq39?WXO>jck|JV8v_dY7>ljHg0RiVzHW2 z;QO;a&@?AKgkMbkUspNtYP_$%X6F_|=KDXv945zIM7~U=94k+spuS-Kk`Nx%8Jbh* z>|wR)qn_`mPbb!+n1`FNeAvbu!>r$`?Z?40RBh&6E$BKk#~+Hj#4_B3((Qh&%ecSm z(6~=JXDM}PFGJvuwpd=OoYvvbQvF5Bi$Pt~xW!MkL3#c z&>rYvrBPNf49-BNby znvW;dCjDpbEIoi;z^~4kIc9Vqb7^T}zZ?wC5Zm);2Y(&Non)?`xPP|h;BnQHcJBH; z^)v~8VamZ@i{FfOt!eXJJL7A~Z(`3&;5TKIZ(}*%dlPWFd!6;LgU4y}4|ty*;)R(j zlD=E%7I#8%DC#Zhzu}3`uWzbNp|W-!{=Kb&5q+WwTzm9x_c2tTjJXN59od*IJt00S zf3yQ%+2`l&Du-{V^V^No`!xA&2Yi0w^NOE$J!<&5FXK!bnU1O*o`;Lo}}eMty&E8Olb@tu4r8%UZgzcQSmX}!n49pR44hT-5V$VR+@XEhtCyG>0w68 zjsHLFjWc_w7_a4f9Jd$2+4DnxjIl|c8L7V@IvAYGmtp0tk^fLdi zl*}=1%J*SyVO+EpVrJZ{><1`&h2|O5p%{XZfBNRv;CL%_Cj9X-IB~pC-p(^jd_?8E zeluQb8hx36ld0byV@*msOd0gc71HJ6Gd@PJ-zzynp4F4fpd;~I)Lmp~`9@l?t@<8h zv%;RGM$s4INtrGf9Mc7~rA7MS3};bIyTyaoi7)!!!6!b@XT9r7-~BDNbQpddW1f^? z-%9IIctHIvg&1v)_<9~5n0->{Zen?vEqce-GJCa$V*36ur%K5S$#bLGe`j@DP#(Kv zzH1@A!^@P{pEEHw)x}sb`_`zt$;>zDd#eLY-CEzo#^i*{+L)%%xMyPhUcb{C@pWVi za{6^}G#44?WqdYxWcL}H&BCp^LVV6zo;-?O&3pTD#zz#d!1?!CpXM0>uPEClop-Xs zHE}59$k<%ylTVS5jUDQ68<eJW> z(?wdZOK5>92sk>8g*qPC!fTSLWwf*UGnvUT9rt z=DzA@?#7fK2YvW)X~XAG|4tA3Hzj>7{QQO@Ir=wk%Fw@xY0e1A(DWf-tPGtLUeRWK z#c(`0OS;xpB%gmwI~JlJgfmz_nXPs+$B8LE;qCRuyY##4=WxVb9>g~Cow=B|uP7TZ zS+v;vv9k}B4w6|SjL}hmzcb(?hrIO_D=5G`wBPGt9 zXC+gXM+xQ?N#tvh@1K6x*khI5PFa;vS(Q<}X{WCsI{bWdemzJx{$_>rf2;(rG;rZV z__`{HJ^OX+e4$dAw6pWqO855qYh`L9X}=WTMkC|$EtY8>Q%iBeq}jZI?{JeKCxq7 zCQ^uawKqTI)TwUrRL64R1!q%$lm7W@n|HO%s}J&;ysG({^RZu|n|4gLa2X3%6@u%q za4F#GEZj9dT;FfT;hdQAz^A#zbm&=aVa%M>`f|0l{6}owzm1o#s{o5h96Bh30z*PY!U1#n-0B$e@ zr}jzD7lDfabJEuN)e0~_1SST|OBUvf6=41um^d&mTbTY3%(pB}PXjZ}($4%y{o8j> z2<~eZ?jUdhZ(|nDj0?l}!P2iR4(2-s$JP)I+i%Xp;FtuD%(-jo@hZUV0p@IA%>G(n zt`EW7V`Xb3KA;XVso)WWq|y7;EMKOUG926SxzuAVw)T9`kt0P`te z8h~*v%pZqf*4p~61?DVUpBaPD_0AAnP~U3cs=?J|aV@C;^OwL(0jAr+yr}}r`+;c% zrpLl`SAcmBFm1prv@ml*Fz>K*Uk1z!OZOrRXLO|cHpHikftw1h#TF(R!WFdb4Zxsl z-L!=<`rG1}XY1<%rqR}SnGd()l@Ko1!pYy6Y2lVyI5TIp_@-I77T{Veobg-J&W?W% z;R|SE{JXQDZJEVY3}Db>+D|`Q_@v)&KJGZB((fDiE#tSYR4Se1f3Z}0IpIIQ+{5#7 z`+UOxFPPx>N=vEqO3r_O<(X3H)kXY9dC&0M!f#;Q-t1Ud*%s{3ezOX8Xou|PDd|e1 z-SaBh8$YjaMR^`RDgLbI;5$w)T#h7U0+p-b2XKxH|s2g7^ zMj_IABbln94*95k^91`Senrz@>7<^sHExT?nVdFaiIN{HL&NwzRrq=M5}9Z5`>Nz` zvOZZrZW_SD-8t^H$k7OA9}>B^8!y!3jNz*l=HtKCyRvP`!}Hy$;d(bRJl~Cw7Uez4 zdyIGO)jdL5H9RblUafb^&&b7`I+Z2;xA1aizT24@@I&&VepDagBkHWrOyGVGyouH5 zS$sA6*zdDQ3Y(ur2MUMvKlF{HD)@OP{M5djmuTY=%Klny91w4aH^AE>Y2TIYM;^|T z@4^3>;yd=l=-lDDT%CAZsPk&QZDzmFRM8?ImY5zglTOUTM^sz_T+fkbVifS5n27pp z#|ZsZC%^bGapfKJa*;wRU&}tQs^QMG`cCtNM(Dg!a%IQ7;g$C9(1$;vzarrIwqO~* zW3qGqPY zeTVL~k?vMIKdt`I+*Iq}UVqM+#+cp9GkGR9F+|@pmLrViw?m8g^)AbYOT`Dq_f%w~ z{(z6OnfwnE`>E1=G#kq+W{6L{!6}@X4HJrN@{DtA1dOoz6wvsWL)}GN_cv_a zMb%B-qH*3n{t|sg{H~~Y!)Mo*UVRT^RNpfo9)-Na&qtXH@MFKv^TB=}X6P~$M1Gvs-Z#pUVB_tXCsc*suefqyx;SS!F4m^v0nRjMyqp4$r|PFw0j|1 zp>a9m4tv_388GF9t388tD2<+zlP-~sK$rAhOFHLx4c+VW^W9RT&#RltXeXxa#(F&G zI`Do_?Xj^5WB=i;SEQ|K7j?*HHH%*T_w`2a`)v8YqJ7JQy+m!E^MN-|-<$be#P6}Q z+znryRy;8<&D~<}ZOnx3ZH&;ycd9&i*_YaTF>N?oV-^0_lOFK@E!5ov{WDcRaBsAH zU!<~?_&x$p$rIn>;yKUjD)AnCXpY{Lcz=NQVXp)G+AiFCxqlJ)nE_lQd@6vWTJ%A; zY&dEyY=x)g!YqnM1QO z>+X3l-MD*|lYHnrciICz#kxIj%+x*Dm7BJ!#Y^_Kq^I;p^0kc9JJy$8S;aU#=Jgvn zItTjd_nhZetkS+tn)>tRJ+*n8-WQ|??X@wiD*Io$ zJ&CWjrZ=AP=sVB0jdS_WV|TX8#){r;`ag8#;2PpVCHU&nzcqa^Cy~Q`7p`!`TUWlh zdB5B<@4zImOJ07S$2qgXQo*JJ_lnZMtFgKCR~i$4(^^V-f#e!lxzXF4&CXUoFtm zbb$Vnk80^6cAN3%H?;i#~SLf3((f z`})$$-y;rpU*Idxr9aQ%H-~)A44>GKkDo?9cQ_jYpE}@KNl`&Zo@B9yr-G8 zZ;=+YbhqePb&~#d@`Euk#oMQK;Y&-{f-udsN~aEN(RS{gbzSLX{QIw|ZOWrvI!B~F z-7VP{esDjmI#eh0$DlnTnxVHU7#H{d^lR(#oeq8NMhX`?PQKHP@k{V)puGIKAl5pW z_57ILNk7gvl1764&8%B!&jEWJh+VN?U*-kn>Qh3fWm?ixPIKq34GxTQ>zO`Dp zcsFBk1HQj(OVZA_E}_lv_|g*XeU|g&BbwuS`^!`QD&(tg2%*W&>6yUky zkg=gTIo;Q6bp4@7UibUgX|5z(59B?KC4A{jYycWq!!q|#D6NNnq0U^D<4lNO%Wozh zzdZXv+HU4q(}1OIZM0Ykxr-jPG(GvYnrwMt^0`6+Ymiql|4})vl`qKi=rrdQZU+8RKn4iZO zLiu zfHmUdL*SMUTma3XdL9AirK(3bl^)`sXK8ua(t1C0=w}71m=Wa`A|FLN_UagiMbT)> zJPKU{I>SiYrL!C4Q&C3o7sFpPGw7n8(Sn2yXf z(jL}L+^QZ=b4WJ=tnM+M;q5C*2TT&LEzT!woti&KDLVldco>smJuxWVE&YcW)Cusj@ve;2Ea+Xj}Jv$E$~a{vd9CMk^jl)rBUJqFJXrz$BA7vxnGL@Itykyw_eV%limpHbY;Wl+Mvw z)Tq{?zU9wbZTYcsewp9#UCv^+%Bat@X3IW>s^LhwZC6wA5NY+$gATZJH*|*A9JgfY z6Vi7g59ThV-sGI)JLeUv`%+&0_IbH@HicdE?P0y_CeQTVows9a>NL)_v)^Wb|Dtcl zai>=8VgAuD055Evd=tX0%MzO$h@<1@Yi-suI@81^J7rJql-;X4(CeDmq{;>D6~4Y* z8R@KQ(lw^n2$nGr<@q8#3wHa@-73pV>FgHxvTc3ocYlwLG4VRB`!N=yeewr*9;$Qd zylol99$tag@z?|UcbI(o#NZJ>DHk`fzW2(PGW{DD48DnCe~Hv!>3700foAw=Y4|L< zBa56&N5^-C@iNA1cSFyR!If?hF4|eU3%{c;nyE5$k#`1Kli{+`0my9qSlJN07LGQL z(<@lf)j3#tUio4AeO}-39@!tmU;i$1Yq##WJe)3>46n!f?JoTu9m4%5?anAXtbqH% zFb?&dt&@3P#X5T`r7JD%+|jKuAJ7@5$I?RV{P_m#!!gxiv%r=LR;RPVWRvZ`<}M>m)ZBF_WcUm7Gj;+)7joFxl1tycwR_*&7M6y2kF?jMWjb$ zJM=7_2|Rl*+KDsVvB~G{?Z4xly4y|6#o|lT{yi#3dOE!3X9#Y!eaQe*iGW8{ffzI@;QRmrz# z1@8w2MEfl8LCf$g@QI#T;DaXKTX}Eg-4$)Tckzz==32deFR=*y(ob8!Q|tA4eBUBB z)9cSC67Wv%$}_QWo)>5y3cg0h3FG()*`opRfq)NmzDaa47jX{kO*ap$bein?K`T7g z-W}t&#^_gH_U`z9l}5QqieKI}-<`el!VKdtU)ML;b#_h8RBgY|r5+Fd-|-0PwKwMy zX&dX*9^t8~3)~UaBVJhCEx_lLFWlcI7JAqD;C_?EJqg^C!2PB%+&cr@f>nDq?y1c` zOc<(Lgdg9D=(A%SQ;v7$4zk_`*(^@^pZFHP1 z*vqRb?Rx=FSFmWJ%i?n1YP5fYuCzA-J)su!iX53I(oHUoT)*y{{;=^etr#VNz zlbAPH`i9!B{s{V^R4RG=ivNvYA7%FQd*U=@3)bEsr;@4LzR;JP$NxLDHl&yhe81yk zl2>03Yk$<^TXHpzAE&Rk5YJwXO@9KI)xaiuYo7RdHr}rCtfRHFCe&Wa#=F$d%;D}Z z@xT21F3s^Zo|Q&?vYlARlPB<%fSnV-Dwat3Ii#h`GyQL37Q~mU`kMCS@ki?N^Hb!X zLw&cO^x@Aj>-O5uMY}xF?YH5!?;<bA+o2gKtR3}fVX$|oJ0SD8QR19<*D+NkwDwG(-} zoftOpD*S7BtoD<3+h+2^`-rphrL)QN|8Z!npSK;A?_a6?wAu7?mNo1h#GHB~X){;p zO_~4IdbfO;3tyt+{hz5jg)fuObgZEz4|ly((Z?9w|ls5!%y(x;L9I}@-=4?pU(>N(Y5ck zc-{$I+}5Y~pWr5i;NEKC-V(ysVBxfm7|?Z*g=0$UB800$1Ub_Nd`;gQ)>#PejHrT@jZ4qNY!LuE|N5jghQwQJrY zxE>29`3l-mEgGnw`%unv^c;-sQt8zr=wIy%>bC#&9Q=0k91FcGeGO$kQkF*gt9_xg z{?N0^JnQR_^EBU*+*IM~yXt%NglJ^++};em#wNqFx&kz==X^&f4Zqs7p-OGgv&!KU z(O=9BNwaf>!m!}b?b=_kll4*h{`?{C9uC@ES)Xm=n;DhIYa#w&?LQK2QJ;Rr&Wjmn zXa8sr&k5vu+b6Q|4+T2AGZ()`^JtCbPcn8dw%==Uu@x(LciAWWV7@zTVYYn~zX?5D zMAv4bF%#np);QZ2YV8p@i61layzPI9H}rkA;!w8l7d=NF=~@fK*E2CG)y*8yMW?tI zYu{0r52Wdwn6(*Ozl+VlCqLC@gmg&^T@oGF9k;cjJE}vvBX)}Jh-b=d$JVc(j@M=M ze1SDQ_Yb3I+sQIr_Il{K{|xlRL;TsCP0p!kYeM{q!yny~V0G)ZLK!{r*TJ6~&OlE~ zh@MsOYgr}!s6PgfO=2RP198!R+r9)HAse4*IRhQ9)Ant>va;>l`mWbWKYI0?TqXKL z{A`&hZ`*Dvu?+5QKE|5HiQ?SB z;tO*X1xW?sy@xvZJh^Hr}EH+ z^_n|LClPnw&noc^;0e~%V#=dl)-239u<61H4rti62OPn=D|c46Uj|$qva2<0<+m$; zh#0o$0AWnPwBWUOXIg*mYXOUn3T{x2QO06?rv$ z)1p@8urptvF3o#67whnS7^9CTiN_)SULUj-KE#KBBX+(>xF}a$NM#oBzF6-(n>q`T z9N&`4r7bLX;AAcf$;djj6&cxxjJ!qr|12Nl=xXF|>ksK0bf5TS_NOeRzy5}{2Qt)+ ztoY|%kR8@nBts)w1C?CCx22LLzdnC{FbrSBAIqD$qclY8#+>gWWA6((??>o zPkiD`cY*%ax{SuaJaFm!md52`gNt{qC9ozllYaP&Y$yLuhWUAjzV>ptDp(lfe?szP z<_i%waj4C8H+jXX4e6Y7=wjDZtdqVp^S(yvv2Dtu7iQwGJ*qvQYMWp*2S?5uMJM-= zpP(JbeBH2hI9$Jc7~n(mpv}c>@`B83=u-BHF|M#p(xLiaFt%Z9x&MErd6Ctrn+wQF zh56r;hL^N)1F`+h%nug9*K~nCvh!nPV(Y{BsCDv%;9Ji?&6Dfsha=)2W9cHTnQAP+ z+j9#acrwp(4RCYSPukl+y&+wl)>ye)@}PaX^ecMhuL-J&)azd5B?AnBAldjLI)d=q!ye68|HGkc%?xLjWQ$+gGg zxYivD+>4y8!;aKtB3`dk3*Y0rBE_m;+|rg`^+s~sE0Axf8!Y`7eB2_O;QkNj()wkn zZ3nfkt-j|>+w+V4F`L>3>?M>5bl1`{dFYfp^dk?{{q|fuGhcGBPiOA!UhX-L6Dc$p z`S90=cn+_*VobdNUDvJyy^Yd79 zc<;*jlFbF!R-Ug``?K+t^MSh&84%sI`S~mVLNLheB%6OV`RxC5=aaV;e9hVqN!oAd zqb9S~Fy4+i|Hc`p@cymu} z+u>Bs#HMK9UFfyhYTq<;|KYO+*)QV~hiPAy?`*%y$U$d2`zJY5an|4wr4OAo_>;pI zwqG@TVf*`sE^J>uKAyk!lI@R6@B_3*MzUjL@>>)u)Si>S8!&BF%t-#hroTo%6~uGi ztDr~zmLvTU_ndC^J2F5Faq}?g+G{79H$6W;H%0HH|Fh(4PEVqZGb;aE^3vO~ViI_C z24~C{VeLkHx{j%iLg${ zQEa|b`TYN&)&2iVx*xwfdDq2mawqH7*}5EhshF^OscCr0p2r$}8D6F_Ok1iB$M>io zqr;thZimKY{9kvtbI(or&OKRvSMgh(jpwvSO19P4*)1!kKvQQxljx`YXNBm$3HsM5 z&8KmT`~}n21%6xGLa@+y%jn>iaar5U-59PT`;Dxf zYkm7zKVy@+&Nq6)u7|2_uivb*;A^+{4D;)Y>{T0xoo=oj?rdj1-QKOd=AK9!`Q5aq zMS4I!9JC=jo1X}H&sb|D4vtRPR1h!i-pOh7pV2W|r{G!NdI4tR=jbDJ%ciHTe6>ry zRF~#@(*{dF;6MGc>6fZUWfafWISb0(KGd0sDNXGgl}_q+YN>xpp)-?!CXFxVhepS^ z%rnN$2T|v7e~ySwg`PMzb0F@z6Z!eIfnNGYe3VVrnkaX_(jS|y6kheYc&D{K`t7X) zveW9%eowZ$TjyU?&z|lK>rgryBwN3+KPU?iW(&SBYsF*Mwwp0Ty7osG3-J|K**aQi z<1?f^>-DA+3y^K{R%dITOwvc-+_YYLMrjs4A-@6nLA!3sGp91TB1Ji9)jrOm&VP9Q z<~ve9;{CX20(K_&I3JUfu3(<(YQOzhy`&kvN?YUP#qqz?FB#Qc#9WyuOM!i(YmqPu5!S>6&%yG$CT&ysNQ{yb!4Nt5X;-L zRTnk-diWaT?w27Nz9Jm*E8$mC&%z6yZsFu?{5;t=+gG!NgFMcQy2h`9rZ%M&sfTpd zI?Q=OwFi0Fcvv#2vdBwPa6`aR4|;1;n_z9fuFl52>FQhgY@&hu$3+MAPnA631AQcD zGkMj5DVVsck)a;p*4QgVe4P(n=P8Y|YE}EEwy!ng4|sH4BQRzR0MjJCLg(*7?P(BQ zL%@puVkE7x8nkC`(4Lg%JY(wj`=wU&sLXSbbffqNt*oz$j~kzZw@rd&oUzwe^Nox- zYuF#l+4G_8>&Dx*QFdN!3&!bZ)Q(5|woS9+;|8VaY{=s^2Xl{|)xLqcliSbFMWB~` zcV8RfUG303<(+ArsGPMA;7Vgguv-B8W1s=^Dp^U9-!!Bqaf~WfpZ_>UVq*zu$EpMKp>> zJLt1v&M?XDvu`e|epKHg@7a({{6;+1IE?tdjBJP22+SB{Y+a%&AapyXpH`qElrg>y&eaU*$OWSc9*yW(W>joYK!h9{1y{@NBsz z$~BGWz4}}7g1OM{5MTZQm~y_<1bjiJWt)twv%lc~Q6K6(Y$HS$_Q_jcdT}Yf{9@|4 zuP`3_&|Yr*o{fLQxCy=$Xkr869evbKzVxQrISpE*^Lq7Pc)_)w_wB+rfPC}3LV4l( zd1oBnx>U3&ed3)ix0*Aq71G~U30`U7S|T0>Wy1URj>p@V`)xJ*2$w<66excjgY3J>9v;vCj6@)GZxBd{K7p z)-L;;;rSdrBOBWDehqw698~s8Yqzw2!*-)1g}2|+zNsm~Nj>1%@DbW&aPkhW4Xf>Y zhWBfDzs9~_BO0XVk9E4O{@LSnQ*eH+jTnPye%Ny)jF1I%2l#u zo>NbsnR|)A`6cDs@jFbvsUI3i-zEJPriXN7_m)4Strf=ZE$=@~`kz!vR~oobqzK*v_bin+rftSic3ZhajvpMD)M*H45wn4!(n^K%a#!apa@a`2g5#Kn-E z!@Fw^9(~tsbT-HMmD2Hk|K7T&%5iY)oTgBH{#{GHOnyf7k)Oy?CvqR?Zuq|8 z?V?NR@;^mKKm+$am^PQS_rajO$ed}f%CMfKeeKnSPEYMKYqFwc9G5wl&`jO!+IvKs zJ_GN*#ke~JZ(@>L%Ck2l^@yJNzkd|@4VPCx+j9ROWr}<^)Qg+5b+|`+dw6`~% zh#}YDX{LRXXr%SHYj;yKUR`$*jx1ZmBUKr=exw$KX^CmiH zB3N*-j@d5WF5+y7+0SitgY^wkk6PYbi+)%m+ss+E7DK!QiiSmho_1rfT>C zlO8#I!Qj7>{`29wOqBE(>AwKJn)DO&Z5?^P^!BZnZb8S$mvGN7%=eH}6XSaiu_3;} z?800p$^Ki#HOxLHZ{MnCNo!y~uDyRO^_b{U8=(Jl@Jlhmw+N5Q2~PWV*{@r-Yx1g+ z;)0Z~IRL-GY1XQQ6WfUI>FN%N|J)sQs}_-`cVH%OXU!DfOZKzgrp@s7K3^hDIOu<# z_x|)*`gp3I1)q&@55O($PPgYoc12R9yDlzj&9xTUG4gm|Q>IFG5BYc^pnv4u(xguI+93N}lbzC}aFl*_fw^ zCyknT&@E3>-h7`4`I=(uK;Pu5ptD+aDGh#V>^x)hV_K(!PJA4v4gX(yU;3JL8+S3Z zkax@9>lv6U`QHk!EzGU&R=WIH>Z=p1#cB4YsSmUGzLa|t_N29kKCt;_Pa65ubL)J; z+-zjtx3@3M%`F|M$t}f4nSVgB=gE$f<6dU3-(5wYH8OVbx7}-?OXmw&!(g8zvZiO! z8k8q^{v*Y=Xx?RDXm>5P6uauyf~P^{EKDST8OL+8=DKx)5Af^xDD@m*_ruJ=(vS6? zpFbGh|GMSyFv^W&2x4CTAkjh0jgSL=R17JWZCa zzvUN)h_Q$lfi2gb4XtH+dp*UlW>AK?Z7z~x95L2o$bMY?3;%UTh~^dOEdvuJt*RkyPn>tZ%@M;sP z8@qDm9-0k~$9f#HvNzozy8-{}I|oa@{U&F(?un*38}HQv* z@hJaYejTHX;c%bz#xE`TbiBenx<%Q)Nyy3t;Jk^o$AQ!BV+Cgy__}P}=kVNZpHn>d z*yq_iFSO6B^`{ouXYPhfEw<0ocuw1A+49TmGxtHImfC0TBurglpViJ~_PK`VtL(FM z)p9-a|LSl%OQq5>epmBb&2KF~kKgV5w7;{T-vB@D!+(a~Fux+d6Sj|TV!!4A#^xGt zmor_qBhT2j^<<LV#ln1J9A}x{FJFc`4(qzqe^+ z7HxTPf%!-uz5zPZ@X_{(;xU1ZGV8I-#w z=?Q_1mNA_;k6M@m0;YrYb8*r_% zr*VxzQPVmdoDe(H` zW9XDc-oA|V7(Qc0I?mit3V&v)3^+7iTV8jmwAem!R`g(D^vyJ6o9L zID7XJhg<2%Z_)Y>^IF*(@3ZpRgeyinlt-G@n05D=e^!jWGdmY%{Ig;WtZ6lHo@=2? z+dTN@wFl?9bXKe|%f**-9qzv2Ot$OneK1{{TV?E+@P0yg%j#+j)m6Of%yq>>b+P_s z_6@2o&gh>~*YZ>ATK{6Gu8}j>wf+~Ox<;srxrb>NYcQwOr8}w1+O_`2p}GpMQCA^U z7w5;=JMP!zR;Vjgp{{(Wu4i7OuCIjZdWO2XY+YRy>eBqIyj>54>dL=HUH63Q%2QX5 zt*htMy4IhlP}jClU5~v+UF$=2Jw{!NY+anCa-9Rn;eaoP_}lBh2VSE`tjsIzZe^&ir?Oh^>Z;^i6 zY0|e;N>>_XHlQy9+i7r-c9-f2{Kc~P(T(U{;zvi919x*4pINr#!TD}vw8Ks0JKPxQ zCPoPUgzk6sefLkZPbY{6t~B?RU}wy?aEN8tv*a#!J+h_~ajSlgKHtNd4!BlJ?`pk` z^61G=|F!TD(=@siKU*==Hpx`6I_>P2Pu}l35zk5TeS5QyfcWaP!c4(CO~~?Bm}@p` z@2&Pc7h>t!0yGvo(8axG?dUgxEg1Zo!+1K|_6y;r?mw2DInn7Rj&?c|?A|c&@L@W* z^<7pI^Y!h;`n%x+-vHKL?2NfD13%tLF}ILiQa$YXN@A;OMuFj-wQ#2~!n@j}G{Fc+;_4B%t%Zt8}X*x^Xt z>0$4w{;Lf2zbNF3CnS<^qA^3vyMQ*Uwm3_Sl>jcA14;?ZbZNzXZE^ zo;!Qv0>!HGk&#)s%+3XF)uCCr)y3I^%ekvBN*x*Q>x)pwI?mW{8CjBBlf-{3F3EX} zkIx&Kjf{_tGTm{5)g3dDX`T01j3e;3i}Jm9NRJ>BH-Bq9#(@v2wMCWvB|dx+AAY3K zw=Kip#E*yWwx3W|GQfQMeD*QngPXa#b5A4_)tvy@$@q%4J^YTt1k#8vQ zU-3Wr=iY;EB6ip{~M|HOfH0&*^&i_&wTVF#p_jqoqb0Yk2^>X;`!MgW%_k;c z-jnv7`*O^C%)aB7n0N6lCK~O#xu;R@^zjztZK$AgAxj*G=LgJlr)&fF1$4R%!|_bV zaHp#~1{M{TxINr)%iS3+=Sb3;i--rDYv7&>&W0chMi-Lbbts-me-$2lWl?VS$tCV0 z@|W(pusDNnRo8uUMT#s{31X zKcJ^Qk0&<2DKmrnC8|F+zgWGmKhHhn`TG8AytaGK&s3u)s&(%IV|Xg#x21P)y8er- z4d1%3I4ir-se3G$p7y|bZse{7nOQqIEAizwW@a7iE=D#GOMiTGdPZ(qddh?6Wg?rg zVUN9&`4+hLZb(nfUFNiG^76GC(q7_=7iG@=!Ub;h^9wU)e~vpjAL=Qd{XkbPx_hcO zwQs7^oNe)@+@5A- z;p|H}NxqGDob=5~xA6h(3&O{^>8~yRjiQnIwI<$3`rr2@JF14RNMnaGx;yxq{#ZJR zoLs>9)Fd`aJUGg z^4(suU+1Sc_SPI+rt*x$T*EbSb!_Y+$&h$B0uJ62{F3}y`MLbM`1PzWmHtHYIn@!YY5zCzycIm=&aeQF z`hz}NBRazPZTd$~lm0iA(v=3Tzfya`xJbJ}_yQhy=P>+-yLgwx#RfQ?20PyZz@d4CUpYz-QL+vBks|bE z&mU4g`rj{qNcB(pAC^Dse^|cue^`D-Kz_#Omf3me1kco5O*A}-^7E=oz(rb8D1xH>>nSBx$?gigX3Elj=2j= zWqFV5oqWCpo;GnIz1uwQBLtT9B<_QHnY5}!>=iO;F{1|}*cL8zoicCC(-@K9qeD$UJmic_`twL!IzX= z>Rx2Y(Ewv&qKAB5PXB@)!52+G&;^&{Qj3J?J>|DqiVC_sfQyO_F8!L zBaGfdti?cMLox1lFuo=+Cx|?7Nb7%&Vh{^de|gyBAAe>1S~ZukaV!yn5l) zdMay(d~4S2P#qQUYtPlG_%HYI4`1$f>07Yk19cJCb%fvWmVS~y#QA;4;rqkjpk35s z?vswB8^lY&4}@$p^MaR|2Q1>ZoZoJKhxGI9hT-d4`1)pI@WUa#Ugh(Zv%JjL7%%4D zk6_LgwEZYF9FC{CKh|YGZ;|ofHU1=?NsP>NoL$j;?V+~3=BuaUGjYi*xpk-`A-B^0E3G zhTc7~e$hHi-Rgr8=;)24CyCa+s8bin@oD-){7>>*%rDE2xm)Q8`a^q9>5G>SoA@97 z%vk;+vE0=fqv*?-oXOjbzuXoZpPMLFq5WPb6z@cindizrt-B97nXWwmtpAVVpR+gZ z1`~789!BJ-7P)K{4C!Hvbc$d}0s5_gUvSHvhw+e7l#E z?-ziZK8Vo{&Je$PNb4l@0do=ASVM2?Kxk~h^DXG7vG(L>zirbe=!dne=jZ#H9yI$V zR1Uh|Q;7NPLZ6wlI*b#|`^+9g?r@~fuD=Wz<~3%nVek1^w^ik#<&S(Fdi@LHZ9Zl6 zdjoxZ0)9_sPQe)gWSa8y^$F~(?#VXmq~QHmmC?RxbYF^ebLM~Oa`Ub})x6N|g_vXZ z{|$o&KHMUHP_tE+8>pwtQ zGoSb42nRjn7G0ca%|-?lsz!Zw~$ph2aZ|>79|F3m@sg!3-n!As|Z)CPdekkowUE*zsSCU(uyFgBV|BvVk z&D&$lF~zs)MP?5(ec{_)&0XKD@~THXqppA8J_h8=%xkfCeqP$S?#uAn@PoeQ&hPd` z&^k|iF@8`a9r!^VjlSGJrhD{c1BoAV4kcs!%Odv#%4Qsnd9{iq8~Y@Gnfk!XUE%GE zhTlf>;59pAM}eEqwtEog>H=Ywj;AMp`~_gjG|NQ82#Yb7?nSC${4-w z<*+=^j}yiyZLb%tmM&McV7plBeC2Mno4QZ2-{>fhzA7q4ufBu!W$H)q68yoPVBP8? z_^COh)+L$_P!IS-WAQ*7p7Gz?XMEV1L+robK0m`5$F!BbSF+%4GiR$EK*nRmKJ-!Cf?XV4m{xhFv9goICcXwOZ;fj%|(p}CXvMs!KCd|o7dU5FF| zy46O`Ybh50%7+;bX8xx3XpMySG{Qg5y2&>vs;;qhWBL(YT`HrEm-(y=DY{UqkYrM`cHbuwRG*r2gq8SX79b_Z-;nF+b)tl#ujw>WAKwV24j%A z>{{3d)=EtTiCJl{|o555bS&(HWL$U;k~}> z!Sl}Y?|-oF6MW}aHh$(=(6+1Tr)kD^EBDBtb8_z@T{>VHb=1)xj8)lpS8b5*lCvaAV0=N{QKtJxLVdDjh`EE`FTd5dGK#|SaMEQwrW5=5Ux%*y zD*v$;zoKsLSWKf&T!(ecsQi4s7h`k|aS-G!?d-+hNA|RDv{C#jT#|O+*;>}>>kErB zJ^c7yL8kS&4)e_S6j<+Foay47Z)dRH+mV^c9a2B$8NRyut|ohkGHxTd=(nY6EB7tT z&>ROIO?x=zO|yBAD$m$L-xf^S2Oa3#TE4Ss?rVCeyBJM7Yjc`6nQ=K-8qLLA;voKe z(_rZ(opbdb%1DpZntK0ZghimndUw*@Na=n<~%BW`C=}X zYZd%{UQ!w)e-v3)-%Cpr+x2Iefw#H;1wqT7XBI?Y`&Wm_(&;a z{CG!NHtydg8+tBOyTTvE|4E`JxUbyA9;)$+g0+feY8P`$|xytg$^bPG9`;N|VU6Fgj$HtQEvH6zqP%JaEw+TOq zKBvDMxPKhq^163x%=bn3#zIG?OLJT7YCUoo=)L8t2U?{Qu&uxUtaKFgenIqRBPD!a zb6y91#9nLUhP*qFovZ1a9a;8)*fr8P_TdD&f3YneMb5hN{8WxPh2kkYDZhsC{EiYEmIl6z#Pg5F*GC6x)yZH)cErk)7R zZ$4(*_I}!C+R6XNPD9HoON%-GGm)0Hj~ZIk?#i?n|Nk{;dAFtIjUigR)6kN(w0ttm z7y9A*vPoY*Jx@OLI(TxfrGxv<$9QtnY3P_`>DVOML%yZs%|3d{W&#<*UcD$eLxx!U zbMU8-(>fz>lZU!9UA_#=dE_*8RNFcpR5_lz29o3RmQv}JJn^V2_>BUV$%5VskHWwu45mI<~eKDbA$l@q6hi99r~uDBNA!n+LP#BzGFV7Pp(lr zj-Hc7fB)`~+QI)%@V}9>79-M+_%S+1gCDkbC3?MEJ}=`ulJCa$l8(-5V$N*t*HEkk zxhDR=ovh#>eU0>wP1iS+kK=DERvQ6#uvfH3{dOQGTdT1Qj=|Eu`gLAA%zvHJl3t5@ z{YBYdr2L_n%4Vw2U3@pwb^KV)gX=gyNt`)D+dugZL+N``KTnYUF>0s_NLO@MV*lji^88LdWkmz-?$I>p%`}0w^xco)Kach zb4}GlefTxMdwU--Vc@F;&-?p@ThF4KcCv<)mY$Z6U&a1m?5w%Z>r31JgeiT}pCCAXoUBtF-=GLmaZm@JrYY72<+HYd{DnlI)%OA31z^rBQ zjc?N)+KSI-=;*hw_~TwUZoz!09ho(8tvE1}$Gf44@pvtJ0)zb^W<6_*+RxbkTkiGR z&e&floPs5O@hCEO!qTuvJZdDavY#{j&=3_5O`JgXBjSjk+SiQ@LZ3x)i9N(BK)Ki0= zzgx$QjC|zf&f3`kVLrvK?vp^;Ipj zi$0KEYghZ|?=7Q(av`6PIjih(Al2T8XWtqYH0swXm3(Kp6}3@ldZZ?{DlVa zXwN@!SlwILz6=`wnSEC1gZ5?UxoTe?u3fJG=x6a$HbL{Krg51%m=#ToF}3yUjIjcA z4`tdN%s>bQD7Lm~SjudKOQlN9)a!tu@;BSz)i* znx{^aK3FMTY2Z3oS?2ujN@25-^v6f(5B8<~G%Z$xq<65> z^fj^LOme8Bqr1@2(RDb*T4k)GJIk6vA(aEhJU0}ukv82Uy@B*D#&oRU!*}(@I$HTQ zW{e;HhKr6C{T-W!;4yu2 zJMFE5-iAKbwV}0j7+RsXg{6 z+78D=PjL$VH0JolDb$@0@%l63 zHEp;_w#wpf6#nO8&>l@o#+oSGptMHc{*78YS3eTXG-Q#r!%_LO*S-^4t9m@=L%>fO zfj*1R%-su7BU_@?pBq|Qkv06uj$mGL@;TCx*A~?QzW4~`z}=&I!2LeSt?UPi(^hjo!IPSvdOfEIC>u2!+mVSu6k zFL(>>XeRF`$Vub4zMi17KEnLyJB-cSH4fvfg^3oesSNvl!5J~{57t@ISLm>r=&&Ai zm`fX0lC}`s@}-_pJK${uTJf9Kd;`1VDc-@j(D&Dp7VcTg%f5h@;5mnO2Qpa@o;i-w z0-oC5mQ@kjs<|G1k-5Xn#9}P2VT|BTc#Pp@rcy7J-fY*vrUD1snM>$!Dc>oe@7JU1@3OV=vI=F~3anBl<;l zSa;Zsl^OTf%o!@l+FEQUawywbG_gf^CLhDBmoa9w4?%sdGe`87dkw#J(iOnHKY(K# z)ihf;@}E^c@bMS02fa<1n+lx6QolgU*#2_SD7@7FVd{Sl+r5FZM%N7^P2S#|bm*mm zA^j?yQ$QZ1TdoC9at7)5G-r;hUh2sFtU5obnrD2U+6~Fv)x?t{HN5|X@w_Qn{K!%4 z#nemrP9kHN`xX8-`xO3#{y%xBIv<@5+)%36vb))R?CBmR z$b7!)n=#j=uBpgt1NBWVaM{#IgWERTop*qpF>;=4C2MnCq+`E^Q{1DAOpm0Bngh2! zmnvfK-I=7f7E;BT-%J(VpQQ56(NwYF_`IU-?WxbtD^8_-Z&5qLIwQmp2kjc4$gIAW^L`#(&&`IU)y^L z&3Q6l%$T#bFveDbUkOi$-Yu3Eo#9d6u3}EGUov6lSm35#r;c7Q_-hN7R$kEOs63;S z=^JB{Ok8-fQ_FqgXIX#6=yPbUA|6OP*8Cs#-aWpq;=23ZmX3}twn4IGBO3>{g=`C3 z*upr57=w@T1v~hnSTZQwbyJekV9@jZ&7LhC3lsW&-oDTK5BhwL_S!RRX4b4(vu4ej z*)wm5=Ctx-w%j$8TMoUNubFRIeY(=igO)7GrT9-?KU2Qxd6E7BuP-^*VpnMnD_nTh z{xY~3JpWE<#>w+s`qL5GsV}{(>Dd0_RmjP{$$Pd&YMds&Hs%ao8$g@PD_qdK=f59+ytL;w>*Spr?d<%=Zmxyf*ZZ-=mai?x^tnUpDP08KeG# zzIj@8Q6JR!DEp=azR6A{t(h|kPA{8sm6o$eetwAgYGJ_Jmy@CXN?r$%&qJb{Jaf-b zCy&Q%_fkjgDGbVXuzfp98DEwTNy}e%ek=c%$bSR+?=RB$IN!>Dqr%|lUt&9)<{pe+ zTDvTZdmv5|SCPDW;Fp4}Tp3;vUPSn5+O>|jU*bp1*gGY@NBp2IIS0wzCO&Y#1~_fM zfNsgc?Rr{zm#9v{2lpY<{^SGhPb}`o^gK^pIE(DHD7@159h}>uHMNm1tDRZT8tA7k zh0zK7Y+syc%jyze;KRf4&F9xn8}^{W$m7;DSxJfZ=mBG&27d*QEu9aGPMsHE-%nUQ zBHdaxM5k1q(#e1Ut(89Y-Ke8{W#7T0Z1ib7(e35 z+KI;vPxIVc)CS~TkSGrMG`wnfm*I^C#MyaI&L6-(_GnM2ghvxX9QkM8H|yQfKR)dY z>U^>C;CTU0&L0fxt~R~rgq)n@VQ56|@_GM-jo+>KSaA2h65p!18}Zq~gI4*OvxH0B zcT`WotOvbA`Hk$`d&#T^v1bIkV)Wa+kdt@60C&@%ZjI> zy(8}c|46jx-P4N>XDb-KnEQI5{Y6WA(&M%Boiy4Tm1Yq9Xq+*J?-am4%9+TcyhnHQ zg|D%1Dnujg-wY4sr}`5w-<%)Y_pf>H87FKxUr8%xT$^S7z1ocSXtlUc+O!MoJN@3B zKtIpdJKu^Phqooj+b7^H@^)GHeCv-PC-)+o{vj{F+_m<7k9~j2zDw_r|J!fs{V?@H zo^PPqQ`L6(;?z%8@mmRNjNFxDn*k%o;nh6Lg-6&jwPnZ&{*&cVws@pCFFZS-aF1^- z_0oe@kDZWyu{MQd#@L6=W>T#@`b6{6qb896hui=4?G971-z z{*e%me}8XATnx!6}-Z9@b@V;2@@W2Up_c5!UMvEuEWrv25=2Hx2# zn(Vo;(*#=@&#}=dTmCT7UZHx^9^&mJ*(rpTNl%e4_t{I2y}gURkyq}`B`Q?cL~%&r z!z$P2Q>O5K=9P*0p;4P+WaRB7BaCxASKDWm_f*(>{oby7@3`}&`Ca(uEC09UOr4_8 zbb@knfcy9*d5?MTZ#g3)Z{-sf#x-66%-(guZG_ zSA@rSq~mv3quaA(_x4Pw{j%(j0OOS%$6~uj&UR`n zvuVx#0{JTZxi9(>e}Ln}riO>5=e`Fm(Rf1p*mN&Zh95qtaD1*obZM5t^W$Y&*TJ8d zJDA5jBqPoqr~&O|nlyc2wdwP;LxIYD8Jt0rPhympHlH%_%HwBrVk{$(|G3#3mazPcYCVMV6ZzPj zoS%{!_G$NdtatGX{;ks-N&J%CF*p%l8G9WbH)jeZ@`Gxh1)&_}(UWiNQqv}?BV*-< z2Qw0*byNNKLW?Ia(HuyZe_Lk?AZzA5P1fEz<;$At2py(QJsBbH4UMYpeEO$IhW;n$ zH+B_uuzAJB3)xtM$X1eiq>7`GjX8Uv0oh`o$Xh?v*q$yYN{gH{>>l~;tMto)T#t{$%^p!>>(pbiRX`vumFgb^T5c@A=@r#(T6cn!hCK zWUxPC)V5YT!XNGxQ~NpJf;Us3n>{A3PoKT-X2pnXyY%+7JZhrPC#-)$=VkjcZQ9n? ze}%}iWKr?xyoIWl=!P%D@XE|Np(Xca!_%nbH;4XLqBQg!={H|j7}*fL;^pHR@>wTx zmy*BmEWf1xa#)+m-Ai9g=0&yFCoj3c(K&ATGZK^On{R18FfQ+u=77?hJsBa^iWB0A z);DskycqjGod+t<@?jpnwxg<#^pw@5<+OjE(M1{XA3CX%nOlLE-gf4WV%q(Z9&~_h zPcv6mTGbW$C(@?)Djj`O@6(fYKKZru=q`d%$~ngu89)}4hCaC0Z)4F4p633;UO!*) zj$}MZTTouP=KklYb3Oa9e@Q<+ah@`!*fM@kW!U=crOYS%{_s9!PW>HavUc|K3eoGy zuJ8YF%sC?XOujgtC-6hG4v@~=t#lCI2J;*F46c3_*tV7AHIKdNMz1_RB~?xtAXi9P-LYT*i2BY>eN2T)0*? z>qNKZN&m~V?bW0gUtT8fkkj-f+FJLTXNWHP#&X)_ATpJ!yr3r!oPRu=@0vBsj|itY zgby#|TnkKJUw;KpTUNhhQTZ!v$Z7m%^>vM{N+*1ZzfSn%`Iq1nNap~5U-;;WoY?eK zx#~RIwr5&=xqJztO+HPn ztBX%+FSSP!T8C(d*hS$X>Ebkf8jLBe4TFcd{n%KldyiKqGuE+>%ZzpXmpO)(809`r zy!wph*rcC0Wb_xF5bU?!;;7-DWXRHvkEE$x^hep-7hs%}zx%M|v+#_c{XkTN>t|$oPjC6MT7i-LGS`H?DDHn&_e) zhZL^5h$rF&b(;9-;`pWFJMEpDq+Xnb$6mh#-`+U6v@5zkDjlu!el*6g|HajLKgJ)e zJXN0_@`?qcc}6avS^Aaq6Tg65M4vV?p*7se@a6ZAP4wF*|4=+oep*}Cof48O&Ya8{ zbP`UKbCb#9645By)JLSJ=_9ZA&|Z5oLu#u$@qs$%jF8FdZ#^OQ6;Owm!yTu^%E!rh z#Z5SjOa3>yx&uvjGj~rIJUQu9p<{DmVe2Y=0+LJil zD>m8k)Qo?;&k#;;F}5T$8(O?RmAelbJ>AZC4WgTRc;DzIbeECrZpJN_J6>t)-muzB zG)+91F(7}lbhiBH={7}BboK$9rOCFyr#>1 zdOz-;>rhYEnM=O?&=u`V6hh}Z)z|j#9JQ6#$KN~~OY7qbACkH1!V$pCVa;mV)I-Y{^ea{!(}1A6Jr?}6i{>n^{&RhHzt z2irlmk{|B3QM@=bGumhJnj8->2KB8N0o~|&^6fYLvf)#hJ19Lg@XbPan6h)J+f3D8 z;peG;+}3}lU;p&--zW~9Glr`!j0YR(d->Y$+)rOS91PK?!_q0*FF7L?3}?skR=gRT z8%XbCrcM0y*LIah8|0jU ze;z;GcFK4|x`#4zHU5p|bv%|v^V8&a(5JZ%dazA?NZI~aw@-P8ob6_8wlZmSi*y?4 zPNLKDCEwuX(H;e~*GX)@BE=J@b#iQhMx6sypm{cQU)Z00{0#JF5k~uN-=n8~-rZx3 zJ4kQ#|1BOE`L90qZmVvRNz2C~kEX^u((*JudCG|pmT&P)I}D#AQ^(r%&7|dJ9dm+1 zk}>M#E`VOj3CPY!ZlFIARy;8Bj*-`1Hy8LV3+Dm9DcItvPCtlE3s0ghy{d=iN1}uG z7mz9Md%CET(Hq!3VrhF*};klnZ{(1V>>`0dk}L;|0PYT>GBQz86I08(vw? zn<}e^a%Fc}ejj1q+i+=W- zg7eXkPmkqi!^M>0&uO$C&R7|qgk1SyM`Y7T<`@U$pLtmH@;#;5>vB2awti9kGX7lc zq-d3o1^Jle$;b9zQqGiKPd+Z_p$=(fxN2{e10Nm(uRvq3o?5FVY}nXQgi%&qAnMdx z9-BQH#Q%-*j`Ju1YGWQHs8?Lw%Gox^0IX^eZbb?B=}!IpP02r^*Pnk){FU*#w3$B`;JHJRG={G zldbyDkMl*ZXe2M~n=atz)7nG0kv(Yrjmo$A`LwG48d{-0Ao(Sa-GoVZujh$PVPr;j zR#N&XnUOGd%zfV<({IX`ep$17FEq;@a1fhX@d;ObVBP@=1lD~nXKKG5C(7QV}`es^)R~iwln1Q9yEO%T@e*c z>I0VVlf?6v1F{z-dkNWm6GdkXJq{0gM7#P1{o;t^S?4F8$w-*Jr{^i(tedBoPdn7CJGH&+-9P@p) z?u!gL^%ud<2^KfYOW)v~?_l|3=`VqXVd|T{&qZUBXq&G_Ya&n$!fSXQu#1#{;OqY%O{M_ zH+LU;fWEjQxgf;8>o8*#gpz*BKAEO_~I|$vYO}_Iv&x^86zVoA#dosflT{WUi38kGZ`rVP#Z)wiH& zvTO>U7WI+XbnAZw7uq%7%r*F#4t+7<^h^y)uNnSI*TM_ax1`G-C+%RSgPyE^ing2B z!~2=^wjlqIQ->|h{<9uea_85*R5HU{7n}60@Au@pPC5J6-=ki>zc7(rU-GhY=`gmM z^w8lfwXoUSN&UTYh^L&dtDN+HB>Azt-cCO{3cgu;uynjSbQ67;Iz)Soy_T0K4vq5e zz1q>HJ)v}i8PYLf)!XP3>nEKg9LYbtO!HfrxxVpRLF=c*>-V5_Ikaj&r_RCl<=*h- zIryw`R%4PGLzq9GkLFj%oAlR+2DL4HFo`VWy;4m3k`|e}@D=)@t&8zn`+bcuY=YWu zs6_pgd<_0uH*4-p8(wGAjF-(1D_nV~OxaS@y-YNyY{u8=va@6tyaC@1O^cWQiZY&^ z7G8}!nmK`WemF^yS=U(+C={euVTFm?hUQdIj>4}9=pPt2{2YH_=+Z7qSO}fw8 z5f?Hx%g`8qbRH}{BQuOl<_$j9RQ?Q8JC z?FHA^aLiNQOtbCT1LtJQzEyggR_klb{Y@ErlN+L@4CL%hg{yqogYt3UBm0#01EtGb zT3xPYtbH@RF8Eps)Tid~GySbFUXH%-d~~e&FqVv`yDN?EU-t&W{@$cA_Ni+gnW?oG z(Vh%M;Z;cfGua!3ad4@3U2;Rhr~f|{PMFp%3b6Brd#0VchB$~0qE73m-#NB}bVORc zCQvUId0t1|6BV7n~`w z5#zz|1m^iVhbligKZ*?-ny7hwaKM|(seF|u{uo9{mIy_Yr`_U#0CXV%@+#^cxBY}<;S&yjAmaK+~#_@{9;$bG+-7lyCi7#fug zU7)^<%mvUb=G=LnYQsF~4aTgydNM}m(RO`>_9Y>_;cUQj; zm~mS5Bu?vmDcMV^V=B{OoLMnKzWZcXNzbPDOXy*aQ*$M>jef_XJsUQhGn~#FzTkY} z3L~$1(EqM)WxTlBPmGU?9&j~&nfeK^<5O<$YqV1KYCRuT@xvY$VlC<)^`sr@d`oLKe? zzXWb2--Ua7O!+~^!XSOWE0z(TApMjqiB#z4>46%)>Gtl8v-nou6`OIGIKJt2bjH4P z+a&Fqwdu^hPRhEmC;R!Z>MEI|EK^3JBvM5gRXq2B^9tb;=`;TKCuV(PFc8`2hZW*0 zQePYN@c#<@OlW?XI+ob84T5J%BHN(n7m{yiS$ihK=R;&KW$onm5ak_$4@Eq0=NINz z$FC6@Qq-eB`;2KPyIxsq*3o5aabD|5`WJg|To>G%kd=w4K%`lIGw?q|p04DQc11So znlvV>&U5L9akWJtveSO!noYfSf}7vN6WoY!6&CH?{SJ9?7a#L2)>rsmsf&C00zDZa zGj1d^RECSMDeNlGR7oTb?S1@?@H@)y1%4;_rDA~y`%N^bkL=>y&hk`AP zDD!H*XMTfr%t7`pO@d3<{tB+2WTp z=4fqv-_&B+)qGDZnXAnv{Wj~5W-h?^!8_qkd*zrlk4sFx+})-;i2Ir;gZ_uk%ov_& z&UItVC^qAo()#hpBX|9T*_#n|qkU1`XP275(#Q3f8*mx0xX)`~>=97Pg-8uLq(|j>b67$~_$mgagv+b`9wr@Sw}hAWz-- zYJ5=2lR9N-EF~|Edj;j}8H@IMdw9@6_&oh~51H|nGG@@`+BcN<BJ===do+Ump*c>dnvrhe;}He$em(&@Fy4EnO$^NABeJojNoV{}*!9 z^XbsU*bPpe@>V!`{B|7f6pQPo;kw|OGZ?5B`yk%tT;&xb>MPi!KNUSHJ55hV2@8Ld z?}<_w&J0fm-yUJiuOPeveVI#}UuFBWY$e;*YEGv0wFL$6AU0*TS+jx8r0BF`U5Vme z%SgGz=R=e6Eosc--oL`VQ})Xbo2#=?v8nSo7jIZ|u8gQNo$v5ZGY@wT^IiO(;v*gm zhG^HY884t?3UacUa?Bh~bFnz~_Aoe#Bb>9>BkQ3tnpha$P1|Ks?+NL3PuJ%@4}RtG z;CA?S9N)l(=mA5E^epF3O2^cEF0I~1mr*a{&nK>ja{Y61v-;t?%00uFE;xyk0rJ(NV=c^dha9Po4bmGUd+#~p*S5AFds8jt2Jv)@{1Kf|fu z?EXDYe8K~qfiYB+F!w2_AC1Wg{pezs``yCa`8FzNIfQZd+PShvnC?R49=K7we8ME7 z=g1vlA@o}aJ{^P}on7^hU&suvOXoTE^-l2-ITMfT88c7otlVVK4Zw#?*7`G_r=9qr zlWMMopQC*_M!vN9172UA@HsOU9ti0yNbl?`YY!}@A0_4rw}!FS-nsIXu=2agv=1=y zW!E5P&yqg|eg`;jQo83kmC2Lw!p-OWPK#IkI{k{h7xddX@k!9j_c001bedpn5$$#Q zFhA{sItb3Q{El8U+dVRUf5~&xe^$nLTlaKX3jc11@vw$7+T2X)EBiw8BJPoxU3ZE& z^yXCPnML_~g~RuA>s1y!yPf{Yx(_xyV<_LJy{a@yo0bll4`chw2A*)O(y71F4>aZ* zdvR%$^Ej~k$gd9EtCXkKKSItY-cnxLoA&sWpOw;2Cu(nu>`?YGGY&Z9PGB{7%p`5U2WS=T$X^{@ws1!P;N{4IAA#N6VgNtkj!?e49?sy0~ zBGMh^tXJI?GZaKVGeYKEIL0u};|)3c*ei6Jjb->bCY@d$&*7KPuZW+^uasXozia4A zSMdyeez|)o<(vCIpmQbpPuG|^7zm?x!$uZ#7cApyuEy0t%H%GXqolvAkFwu`&I3N3 zQRGRqicZn%)2XxUu%+|AVCW5r-pSDOp7bIM*`k;BzZf1Ho)XC^R^fPlTg;l?$FzD8Kh{M18?)d66{(bJkr4OEYF?-;QbkTI^_`~=NyM8fS zewv&g%ygVT-2c$(9|T>a&+m`V2%z_t_;L4hH~RhiKYPP{@thmJvtr;3?HJ)M(KD%8 zan9L|8k$9$p7wAZH5{`&ts?d(;9_90{) z+T9b#&Z$}PqQ~uBoIK5)n>@`Or$h7==^*Xhk}jS<@XkT$MEZf&S*MR1cOC-QW!$-y z^#ks8{&~CPk3Ki00G)?SenR8#AUN7jO5I+kKkyB(*B?GR)*r6XIPfBx_OttQZlJFP zf4~?`Us$g2A;O1v*H~}wdXinQGM~k+KTA0eKwJ9!t{L6?V{c4zt~X;EIv%)lh1L*FZ(rvOSd^@+FFx%D|yXu6mdO=r6{;;XQ*juZueqSg1i@wX6QtuhoWhefK z#YD-*32ZR+b?s*wbfV@=VRSnCOw3#{|MT2m{a*7$&Qp5*$A)Kd>5xoxM9%&3ht@(X z@Ml-QcyWlm^t4qkYsC1WUc5duXF!gt#6H`BsT5q_@?|CPcA1N)EKF`l#L_P^@$4!%W^u_~=g!Ssw z{tIf0#hOD0_MdzY+=<}g4>0X9)o(MkM|z&%JSOCA z`}L?7=K;))@s#Z9Jdr$}X8$j8F_SXrf1jA6youACqg?e#qs7QLI;vOlt#I#~z~g@S zQ@-3&W&rzM=S$A%hmK@Myi7I~Hj4b|j7u(agQzo<5ijp0oVETuXt4K@n{i9$$;?P` zr!eI`+{3;-+ZGoPR?4`)?^O1{lgbMj=R99m=UqCFe>#MobtZ9lH1iB|R$)N*5tF8f zA9I;=>mz!}|1QUbjTXqw`Z)J-y6RYB&&s{W=eF z?>YCSXMB;fQSmuU#OIL5p1REYuL^&NM%4Z4MUO5BV~ZP|RUm$JmBOGb00MCnWXuV(h_FY zB==*_9@vv8=vy7d$7tFle|(#$4p!DDF_+&%U37PdKQ|4W@#Knosu*X2?l#7YDCK;L zbTc(yW*p>9{P-Tm%xh?)hZtA6zajo`a+CWOw(;wP#lQ*B2Dy(d3tx(?>;tD9oW02l z-2Vbca$5ALS*HqT6`^Mf9A_KrTnEp0o&>U>HS;Yz<#)N2Cw>vPQZmA`ir?zw!no1r zeqS0H8F`f--@1ndQ}0hwZjRFGJvG-g>FoR^_?r^P@o9%=HxEMV9O{B@I}EJ$hrML#1oB6==y!0uD`?V2hv^)>K?RsU$Hc8lbu4{3aH~f zN~@oTbBFf-7W5a!o26F{XGhTqVYS1&`MrAbRx9H;y`=EJwD;U|y8D9do?A z&?J0{S__jtn-OE($lw$w9O3x!__L73_ypDaFl|OX4kxptGqhe4Kz>B4-eW;{Hh%>+ z#cemmg5(eX1_=lMUh;*eJ5E4t<7xBO zC~|eX&I&r`zN|CF(b4;|$TL6f{)Frp@9?4=Ubv!{y1YIZj5?GvI#wW?zxi~2ZMkHV zvVU`k?{wm{r54a9rbXAi2>! zN!){pxlzr*G|n0O5V@^VdT?gHoaKhV*$qAA$jp_v0=*T_z~_HgeT-zthk(V@|s4Stp2%G_D6yAkLahYQuQHl<^P=#NA989tU>fcxAF&fNVH2X z(&R0u`3`aN1$-}by@^|Fzh3k!%xBV&c1@XDqoQuBsZ~f>N?Pmes*mANRU%?BeHcZk^=(3`x{sJGY zl|j)QeWuu%j@*i_WWe-C>4Kk#HuCvB(ROZoc>5E`gF4=E8F{DeH!x?2Yrluu>jLxx z-@ng}t1bFzi?nu_NZ#wo+tb_Rv3um~e(G-4$BUy*hW6+cprc9Or}SxQnHSx*Y&31K zk8e)Svd26_%<-|zo50KpLK}n z0ax;dEhC)U=7Y1$uEG4X!C}tg+cDH5iVm!>^)Tyy$h6j7OnTKHJ@{F*HMDN+N3P)8 z4a!@xPkRN_Uc_xuT*&!&+{Agl@#$(uuPuwsUY$4Q9XmZZ@7U|Yf&MRQz0mfd4+$^1 z$;ja%@||JQfk*kzK!?gN^zxc*zK0TR$_IMB^0@Bggr3Ftr-j3uE2%U|!p%Gjo?~OZ z@YHuhjLXM{Z9YeRU6CeZ0orgs`EqyE?3eWHLC*Xqwzh`wLq=q_n!EJ$UC(EGPONSy9m$$2?D91yLd4}N*;S=b&b z3w~$!gCkgUq09f_a4@{@T)GeEi9+}wuZN?$wHMTrdZFE-GHbi>xH~h=F&D;>zhugl7gAzlXD*>sQ(8hm?7O z{&!MybadYg%GW%78hI;i82fk%ez3g?vwhQFKQn2pEb&d|*}})O58rF`?FC87ApJGA z>>GeTEO;<0VrA*@y@WZ^q3~;&^nKbGUVbICX>aABY5QO5pFaC!wC~{Q9Of0+(tQ0^ zdK&un(Py+)k$*V*+nQtLD1Xrdzu?bpx1zgsA4mR_fsvo79Pz{QKSOaO5I*(WNuR1C&fGIQg)u<&JP=5*=hTeZf7e$MrRUUD+M<-`!-tiY+o_D-2Iq&#On(sZq-WBSX2TtFq zdB=|q&O83FzI!XT41RUt@m%H1qnQOOGFA?4J75?BlOK zO5C&0geDGOdOUux-pPCLs?^2o1(*uXDb4rU6ENkA3sPBMc-r8c+*j-5;TM>SUtr1; zOTw2t#yq=^^1hCL;3@nBd#6P&eDK5JOYUdBu6tDa$sUfX^auaB66h>i4yU;Q;G|foJcxbz9@)eY-q0>szJqK<^$~Kgx@* zrhcWVfP5P8;H3N-J)aIurEVXhZke$gu;Zv7b@~u>$~;1So>)vA>r{IbuC*!3`}P&# z%;yg9od9(^(h$x0I)0I-@Q-}6ESyQbC#qh3&`JICzJi}bbqDukUtKhZx=y67c~2~* z{T9Zv;^h12((uLXPtAIolPqbEi}z7q+G6I{Y2&ZaW?x(wR-4R#-_vN5qOX>xE`F*s zp7jKBp?xy3Y0ib(EAwb+N`9P7+AHHh_?9$XlYR5C#$4{sYKeI5N`?W>k zT-tlaz5-{$1N!!UjZ^f+g{fTHHggaCi2gT&_RXMuC(<8_XxqGBWXCJWXBv4Frk1Dj zPc3I0TAtEAK78e_gU*{e&IcMxZn|7PjViv0co17&>mS|p`$>C)m;1I}5_<>x;g;W^ z8~pEHv(5w;I5F&%IAv2)Q^k6B$E z^5#Idenz?o+OO*6ZaBt~Q1)Qf?oj$9aoBZQi{;Ko zvu140EnyutE5*934az0G>$WVj8iK17&8_{?zu-@?pnEekQHgS;@c1O-Z_p=#&V~zRH+a`>7>Tp>`)am3|thy*%^Eqf_ ze!r~(8jJVBA8_u(#yp+Oi|boIntJU5Qd=y#PfNZI(9z&H1I=VA}!p9eqS)0HT5 zoHUyKa&pd-W_(>n>mVLOznez?GUzvZPDDR_Qg(yy-Rg*JQ^;qoi^ z_~tw&@GqwQjGY7j#3OGXbXI~@%bWkp$EUC1(>`_@dDHx(U?@Aj8ac*izkl1~$bf8u z!MSzliEWw_jFth+`k4C8E&rQzW{#d%SUVC6)+vmAXfFD7WMmS4J?356hl6$8KY9%N z%k;NK@||wyNWZ7{C;vOhXZlz_dH&RM$Wk(x3ZQc;`8H@PYkk^3m5F}Rya_O|@5=|X3C}*Znm+sny6jCKkMI!T%LzZrzEg*AgU?#4_H<6f zU!K9*vz}RcN5`B7&OD4R8w%b@`EmKXKKDFpsD0VTPQ~FXwC0QNv=wvo67>)53IDX} zktmCDx7)D|*8i$=$?_?Go$PbuOmhzEdCNW6YE!5u_tPI+%{(JhPueQe>R{ zk^dqb9vutWxVe6u`XXtw$#)rfwklkAzaV4Pq9wVx1RdpY?~w`n`0IIL^zX6dSHef> z5b2E5Gx>n)in!+0g|z*Tsn@hP?L_~}Wh@IEncl0h=_ADBe=+ShmG>;wU->TP+~@;= z;Yq|Z$G>G|Pxi42g~PM!MMKEh${c=n7=3}h+n;lKnOl)s=IXhQ=QaGw`IYi>`Q`J& z_vo5+@uB7W*QJ*4&w+Q?*0Z^XV>suF*BM&j{VkV09vIe~wvKUcIr2~xlkVy@c6HXN z;Lny5*9DJ*$`3fKC-twOosE4>9W;-aL|&S6OdKwD)mF5f;n!r@0F*sbZ3Uj%jc>Nx z0C^gjO>P)AZO{DVsC0npOPUW!X3_CYk}>N41Zih^>2J=Ie4jfGY2C!^S4AIes}PMR zg7K~-yKkY7{sQgnZ5VRmx`W8BGlp}LEbg!uv1q6$ZuWqmDvG=8=`Bwdac?F26$ww@ zCwL8e1WS{b#G}N8)VJ+Ei5O+BfHr&@W?wRU?6lwV=FeGM;bPee(1EXNk1{t421eoOp&Dob%nhc5rM(kQL3 zZ&c?KAJyEQz8{ZEmM0A{3Ty0S&9Ue~<|KR{<~-mgCf+xjy%hzBTq-?$?6`;o%|k#|K@BiPo4)F)8$!ok(a*t z%aN?xrA$F)SM-9CGx60PCvMG zAavhX^KKB$nUsMHAjiFh@+~E2CY&Vc^e$PJ3@D9gQabGkJaq||BCHr#N4;`-Iae)S zD?K7QZ@xlwO77BV|DjL&k1riq_dc{IeAbY?Q48;mH7?7 zOlW?;GN1O#6z=`;+!K_24eeG+dF5(1wOMqpQ*eK8&JE~`OQ^eKC#}u4{@Z!lj5|d~ z+ictW)ceyu4b*enioDfrG_f@1mSbMAXKZ>{8xunL<;@U!vHo)pggy}7Hk z2kk}5Ny{T!d3-jWyZXgT;({GU*`YwCk(Xq?-7s0?`sw@rnBsq53SXsre=NNxc|>hQO*cRk9w$j#3(UL2L3K6hZ` zH}XrXEa4$j0h`yCpfdy9Udn^^s#7uchV!j^PJz)M-d=i@H8{t$d+AMicZr%9ma6;&DV$Ur{;g2{V{~w{oYkC zlBayR%wNK03}Q^oIb9rPP0lgnHSb$hXLxX-@h@Z#98sH4pFFd+$~=p4CSSBs7xaa( zySV!|WY%8K?~}N>L3P)>8-BeYzuVr7DEH2UbJ(Yq70*cI#h4o>=Z3f++l_)-K;B_nNXxtbXtsq1vwKVNfdWPTR%@P|qxI>Eg#`b=0dq_~;^D-&XXgx+%r^2PxsVKDd&=e%-=5)FD1O*A7TsxY_WJcA2PyKUji$x}PQfoqX45uq zk@85E%qESi^cVF8A};UD|3X@$VZZOl8%j5>PekP-p-*hyJ#t3p_&!8kv<|`k2-i8n zF9yx*)k;0j{0csFAH|n5s4yg!JDYXK{9Q@ryvPfFCd1z>p3|^*gx~Z=hFbwnqi~`J z;^M!#U#$Q+MJJVNzb$wH%If0XoD)4bmS1LocCxtT($mP6+J?SWb&+I?dq7W9)^L9y zfm|nw=!Y9s)*-Jeg~7CmB4#_XGXuezL89DLxpP z45W}lHz1kxqb-lX{nfjjgBnS_9Ik?x@G-mHP zX&&;^h?k1f_c-*Qfb2~2`Bv(Bqw9~Dy$w@}SKG4gNlRyBb8jF~h@J}U4TkcPGvhAh z9Y~UvGS}HOEoo^2mZmR3CwD#+Z?HIZJ`QC+PFy4TJm%K{yb6nVYZ~6e;FW^+2Wfa! z7EiX6KiB_^;=x@9?rxq%mKWPB?iwGLvhOAyHm zy@s^gl@^+{XItq;{UW4$FP?ooNm|lqKey7jX=V95s~~@D=wj{d7S2UJP6lVw+d8$| zIE_K3{%N$9L+cVt>viN+4z0^Atz9-Je(k4O%w8qsN4|5& zzrxa_J>k&%G5Pw&)1>{5lPpc_8Fr-)FS0a6ZMuI*OZQ$hqH0`lzl71T6G=qHE zL+egZp9~I+d`NxL@4F)-XOHlEb!24Z^a$=_?@#@_BXo~f%%BI~T|7yPf z70*?l$NAx(Xrx@#UElfn=Ymd`&e!**qKQ05={fb@^oZ{B(bOlJsDGC7QoW$_JE~h6 zo$JuCGof)KG``H(&i$XEDU6Td*QDbf4(of$tP{cTl4yM3ZDd5>;}sFE@v+i|ZDIce z-_3^cf9N~eFt(wqdD3ZYvyvlDJorj5?CxXS!?p-~;j+-g?*+q?m>W&_DdXclHf4f) zkTTfU<>mt?`1SKU$uE_fH_-pRc>^c;p83R2=YcnGAfbE4Pmw?INBJfBor)faPhw2C z47@`H)CUyv*EAoRa=VtSq!E+K%^n*K@C;Kd2-HSezr^W-;2V8xR za3N3i)yX{7?$3f_ z#51MsXABc8zUK{$JR_d>!@se9H&Q`A+Qu);uaRFnzn%P|{2t;LAav` zQH{O73OdfAJlB0T&&@x8o!RHvk#kw=Ot(9O==2Macg|Op-R4e4@8UO$a(;MNZIF#E zb6WK59vQhFyL%WK*pq_n3a59r&WE~ycGR~PN}t6${v!0vGx721`)qoBgKYE>xDz#p ziUlLXny1MYhZcO>l_7MVclPtZ$luy|mbII<#G$9~%6HpMQMI36SJgAdc`s>sE>NB- zTji$N-oYsY>@(KcFuv_QF!CRIPf>TxF&86?^6OD1-ypL`i|>4-AIY1!Gj+cn|8&4D zl)j{lF&}lnEmGTz;f3?To0W!x&E~pk@hT3FyXvi%;G&LvN5bostN_9KlK+8=A`P1u!Qy=)Q=bt=nDHt%!OYd3?%i`X){5CFma`vkBEJO_#^U zrLDofewDOG&y)5~-zRM)Y2&1glh&+FrIp+JK518zwvM!Y=SlnMxoMw2C7Nwrmy(YA zxrz^}o^jURkFqYK@rrhnAA>nZh4v-nKTG=|=K;+>k=c)nhssB1z9}tX8xFCiz#8>* z*1I)_Tc`FTpRdF+;(79Kun%%b?M0iLeS&+lj~SZ;-0N5;YM(mhqc68U`m1A%PbY%2 zPaR=Bk9~}0tr2}1nBzDrXtMzK&*U6rJ@6Ovj)nZZ_ZB`q!Wz@erxH=d_0c}ccTLAu zBSTt$oGl#Xt8~H@o}XUn7%Po^0Pgg(bXwQQXHVp-@TgGu+7HQ|QL}ad?!@Fp$JVI~ z>LmR&lQ3^z^hL)$N}XmEqXXgL1Z4LT(ofSm|Kfp>Z?eYEx=BTe!un~0H2K^~KhnP1 zn|6=9{+HMb_mZ#KS1aEaKC`<>WBLYVW-;ESuJroX_3B^fLFVL}Kj!05K5L|AO?WBg zXl^ba*%cb6;AsYDz8sQ{exxkSSt=oH<4sy~#+T-3uf1q4LN4{KMm}Z#gf)#jmf9oR(*wqCc!xYXgMG6rNZZW-MtS&F0gJ^W?pFujwnnh?7{@z+Rb6s+aM}L9g*I zS-gGp34Id;4>$h=`)r}*6K6Cq2O~{9xZUV-kFL#stuXokds1qigvVM_WuL2)pIErv z?myVfw+6F~?$Uar{0+3ph1k^Y9yiMQa&eg91RtF5Z9sws7N!;l3rsFvLBk5M_OPS-`H2AV{T&8==qJz#6=ntR9}zR zBX6-Li2l1wXa8&bEs8T9(dJs?(z@@(@Zv?)6IoyBJwH|>8q)H6Na=LfwZ2_fd)&u& z>%ZdNmhl_P*hw3`0dLJc9KzGL?Jv$GpLp&Kj3L>2+IDzT?Iqv3zIDGZp0nETTWMvE zuY>geS*07w*nKwIJD{3>u9O3`&f5<$FARrZ|GRt)Lc&)Yumb8({q1MdMfHWTADgLA$)axYtuOt zdG%Posj_P2rd4aaH;jgN6KV>6kBVLEr!%~|r6bY~>lC)$MwoE7G1BSQ)YrGVwasmv z^>xI3GO{DGsJpAFdC|&_j>xVJO`TmP#qy@srY?LxrI+7q-XnFw=6!=n(Hv>rzG!pJ zC+lmwuD$$L!nY6$_oz7h?%}uR$D#-lR zHg?q2@91=Dn(s8v&bHb+>$^HR^|15Kt(}qWWbNU#cdzQEX0`3z8zVa%NBLGZ-BWJ@ z!SLTrB=7A_?IwQwyN_QN>52%}Q#hSnk=i@`NYa~kKQZsMZ5^g8Jr&$i-_q8xYb=5H zK9-=pqph~Sv$MX_qKv*vjw{AFCw#0pr@FPfS$yAK z-xcZV>To*kv$?J9&hB={iPVZ5$LXk#)TseLHGg^+aCb*jmv~)EfPj`eX)fMvd-2}d zCd3X1+Ch9rix=Nf-x^W-`*|uq#n@+ibGO&j4V`cl5o_pdYHetveIi|rwQa2pWNH3t z+ge(hh(~;Fhw;*Np$ml2-Q>yPcKd9C97P~BO|<~6mVi!VLiiC+ES*~WY_ZSoPOpD- z?(*_)HK`q^sjk_iyE`H(c<;DN52v%Op=&*GXIEQuJ=&+Et>m-`p*_<@M`J3-=a3Q0e-wslHN_c4bVF}(a`AUSD8jDbfVj8QM0Bv z>f6~=H~L1s8Y3O5Kno4ku{P4(OrO?YOXQR1ysKVm(N0HqYim>McBiwszP??6{e%Cg zwmRpYww9VEGVW>=hdUil`p}zW>Z!7;gM?NyHr|aqBFJ_1owXfJV?&5S)gcJ)YHCGV z?9fuv(H5zzjaY4nT-A5AL^|(u8k!^9RfCqUZbMN^J*Ctt-v(9gMmo*ikzJ0{*w)## z$@B=1@Vd5^NK@-rNP9<9OQd7h>Q>tho%QsBy0MTQ^&J{5oJdD)qjG3L#F|>`)n95G zH`MQ_S7Y{n{6upeXKk$eifa?3+srqnDmiash6!*+N2-!zSc^eCx__` zEcr@*2ft}Y{bsb7SCRGzqg+}5N~pf2y=yJfX%Jv@q-IM!YRSW|?e6GUqcB4a{jIgK zUJP#Q?lM3J{Ef7BdV%0HwXW%4_)z?oPV(s3=?QAb&I%N_pDX=tCwOhb^!_?_uI}(8 z$A8}pi;*&m(Xn$aEU9<8Y<^wi^6MIxU)Q+&x^|wMU)Ro6ZOzS1YC}^3?~#sEQKNq19W3w!NcGYFhfwbgE`VFs+-b-y8kB%BzOc-tH;Ft}cX5={lO)=-%Fo zc{k&aM8y2n-tFnncbgZ|8kM^`X)Yn6yN#frSItxUcTAd~e^+N!dQh9`QuM_*L!Q>&?($(zhV767`nGd(690wHolvo3%4mF&Nu+GD@sl zG5_Apk4^PmTab2J;q6wzbksN0O6Q_~O;V$rfbMQWAKa~RtIH77)X-|Q(0TJ+)z;dI z1t&ez+*TWDu4wD9YTSEYX_X`SYP|2NA4Blo#}GQvL+Rs0M}2KQdSEoDtG0c8YmLn1 zDq|V)&M=l1U}}N>X>L9TkN5N9k-k!0!8SWzHhUSoyPmf+VrCe9EDSsRJDWCFZ(3Qk z{^m8+H?FCwSXo)=CD(WvscEjSbMJ2IYIIB93k`mF3DVo!4mfFzYeTS*jodV~En2gA zZQAU@7Rm#=hv|yn%IC_FpUb;5*0@vCt-;Z=rfC02hnX9p+f1Ktz^+yQNvG47LRt36 z%T|g|G4+&YF!T*jZb# zM#0Xytrh0E-a~iRZ`k0yZ}#xkZ#J*aO*W!pvxiWz-pin3%jUJhsJLZ|LHyX(^(JBE znj6i8r1Ik)J(X3PO+i&#R(j7h9=%nSRo;8m`c2B9s%rCAJ-2T0>bJFW%a!K6a?4^p zZ?0NtYI@81O{>=NzHL>7!QZyFQqvn}PUo^Y-OJnt#xaD0L9V_-{l*Q?>718G{G!IT zmik3?ZQa{j7Rij*QD0rt-PBySsIj}Qv#oW}-EAFrcD6@q>+Ni|v%}77t2Oyrhy~&O zl`YDQSyfTJwz7K5=FL@?y9-wPBu@yH+bW~qS_YC1FSR?j>2Cwr_+0a zcUuz*c*h;C#+}kRotIkLAkE0Lq?*H-vFPg86+4^su>2mY`SGGdF#)| zGxqztavzItiL{f%z2bVCaOD}3+zEZ$d;0%xTIyc4dI3(qrKMdhmwT|{2w%S*-Qa~^ zVPJ)??(Q&_-pa1VW&xYqyXqCPs=nDgE3jdkx?9|e4rveM(7v0_F!o-$<#N{q`SD8( z_9(vMO^}V(yP?6y7j60*d-npit=Vkkc3Zt6)46e-H~ww3&*r8YGo`=6OO77sLX#sl zUMSJm%|kRD`t!;y)fFqNB-H#Z^d8P_b2{&E>zZZ$nr6Mu^4BDB+_G|usqdOCTQ;l5uU$!p z~bnBOOhh3p>@)9{bLTFy;QPG(s4kVw6IY z+Hovp&Ur{O7+yP}bgDP3udJ%B+`Q_hHC6tg1V(o&6YslQozA;GlcTn-qpgK--;Vdj zW9Hu)#|dw3^ZK-Jk9D@x7|SeT?X#xNwvQ}bTJF^D@B(U^yk|>iU7LC+^R*`2D^6p( z7rtYseKMdB?A+tMI=3}+R%?EC$7nD0y7=asghl%?ajKT`sBXu&xWnyc-oM?ovo04A zT{fp~9(ap(;NpwawJhrHYH6on-(Fo*-&MN^6Rxd!$HH_!fvg(MnSFzLgX-;WXlrY) zVIJT(Yq}ciJ1E-_AvzlFs%!O&Z)#7cV4jQX&sF>w9+IyaoJu)YbJ={-;!7{T&g*KX zsB`0Mb}5H6y*Z};JbJvE(QQ4x*lfLI3mdCF+f5n!^tb*uQ&{}>!HzUHMet3H<$n$V zqI;o1xou9}9qG0F@6+R#FrF`?ipLvK|GRuqvh(p}lx{y?pW64~gU!#Uapgm_xV-T*wpDZbhnz> zlkuy!wsm>F^`^0f2MlYsOPKA=kuEJTIL0f1y(8C@t0XuA(7h}PxVxmSwt9Nr-CXG! zR6_*+ZrXTbl`P{qSJk-+n^U)NPTibZz4Kr1Ze3*8oX#>6%XlQDw7)rv>z2(aUu;|3 z;2RDRwoMV|{YQG{Stgh6I`7#L@g&S|e}7zB!}7%q3|;HitTyqj!<@zdPgr~h5W1RP@^&8h11YrHG+OWBj>U+<$hz%J3Wf+^~7;CQ-I^(@mQ;-?GWMZPR9V?S_>%R^H(%+Syv+J#W~u zdFAR=Wa_;-#!dm=uz7RE4U}Vpor=xOY&M(!CTP=UESvQk)@-TtFt%*nw2AV4bmp5Y zx2Oor_l@f-SB-|R+^}Ke)(utb{Q&clR=#H!Y+8d!ux886>sPI*tX@koju{uN(^zfo zkC$^g=hVr5_y7F%@zzt2i(M@>ZOu)!7(vGQuk{h()?hf?>0-xQKR7+F1K(bKM_QQh z@C#vQvgDx`{yOTncVj+{+8bVIzvM{e`>ZGsl@?V__);CoCnw^Ht^zY8@c9}wSc;+=) zqiL$ayW{J<3cIdRQleCjg9D{wm%Ag<++8ngX&$pJqc$RLYj;bHZ~Y)wO?C3BIhD}o z!%9D2|M;V<^QI)cqyDaLTD8-iSAW+$7Yn~5LIZor-qrud(a)^1tF5-J*(cxeygT%F zyRL#~*<@8YZoR_yA>U~IofYH!{~O1x4{RK_eo$%G6}F69Z}44%tE``MjrFUpv3}MY zEq}M#C-XZkh>g~_%C09=jPs*zvi+jUx>hT!-<5h9r%k1|CgS)WvNf$c3Aa&vamP$J}NYdH(p8fpj{B!sMTYJjCt3|T4wX8|Gvb%(VrSk++M)aJ{g;w{xH=c2IUd{b^ ziPx{{n(9n%YSF5S8)@C;%1weic*YBvcz7nB9^1kaPZNH+F*KjPMeW{#=Av$Iv3im0 z8`eC{LObSB&EjRQr-My_nnxQF)8oZD3{Q)VN4ceQyXl=Qn)q!q77s*xX-9o~^RCPN z=(O}z)n+cO!Eu?3D+t4_%&pq6{<=Ar?JRS*Zd$)hkk6;Fe5D{-tmTMuE3RU@q)=f->F zv_y7#HL`?_R^Jh0Edw{MzhSZKt#`YTW-Sx$l6Ld>ZtUhrhiBA4Qd&CZq@!Xvs{hjB z+q*j(LGX}#yC^OG90p+N)kj)fCaaQ*F&4D8)z``~jj}Z!{O!%vn%*{TSGMkoQGZ9? z{Q2`eOK_Qs!PeA*Pl^>x?cun)sSX!4T7B`AdDuOh)>K;CTpV7tdBfI?o6{7|s6{v=0nBGi`W>G7b=tR^V4i3nVrtMnQq`5+p1iDQACdej zD>tq-=~#_zuVxInO%o+KIPZ|jPG@9j@6=2QSB?s|^QKZWak^Zs)z;9E=5XD#b;AZ1 z&#>t&=OUYOym^v@*UtLRgP10+>GW)@@1RoKUCn+}tlQkSy-8jYtK(Q5^)mCS;t9{F zfAx<;rhNb1yztL|UoqNqycp9iILQ|AQ~sVejd`x;XH@q%$8YG#o;Df5J(I%Ar(%1D zSqrYPbFK<+BT6-$$80gE&_aDj+b%z#qOInWqmyN_sL)g{EkLwXVziVGYtHJYf;1#-9_3UvnaCAlS<^@y!)%T{=2^$h5B1h?;@{y)(>mA0B6QLx{GWU zi)_+GJMpxW#?Xsx1D$2~lJ7y?8^XNyGPSKvbLV>aIHe+93Nop-smk2DBiejtax%-Z z%BtJ?4bA+erM1gn`De|8m0Ic}f1m1D-PMLeVs!sSr^gAfNUKl+ieI6}66r1gKl zzZqZnf3v$eO;=sBRC(|89<I#h1kxN`k>KSftt8|yFIt8Fr;!{+NfeJtjgJFEQxN!jA( zHjmN$2I|uiElDEXeRN;i`2A~k+6$i7zx{n|o|?gbX7|6{-BD{cbtylUq^F-&@BV%| zzvub;>`*3V-<{ot=X5l5GQVP}zIw-ElMnnwC5;A*?sr4v)BW52{y2ZXoUPaBK01FN z-spb5v2v~&UycI2^*?+AcHPhRXK6h>btraxj<-lhwybkzZEL;WrOACjA|JlOLz{3{a32g4MAfG+JKegd8;GbCdNnmql z9ykYq|JH^d0Uoq)0{E{j{1Wg>7Cr_10}BrWf6u~afd9h6XMqzQJRt|ze6ybEOeh3? z-iEut-?nfW@DU4N1N^5JUJd*W3s(St&BC_>AGB~I@G}Xga^P|cuLHiq!d1ZYEgS}(XW?ex5)1DHo^9bhz?WD!27IxFp9C(l z@Il~d7Cr(z#li{T3oZN-@FWYL0ycNqWjdL|z~(!4;4{FP7UwLm`M@>P3FMRyyz{mf z9w-F zs}|k|{Pz~_12%WoL1#bk-`MaMfRh$J3H&1q4*~zBg;T)axA5!0CoKFX@OL~oD*$}l z!ui0*EIbR?oMoNqWR(Jc%Z4ujHfL569s>Ro8@>VfkcGDaf7QZuzy~bc4*ax*?*)!q z_#xmgS$Hq-7c3kHe!{|sfcIMXDDWc|J^}nk7ES{HfrVcMe#pY7f$z8Q8^E9T;GhG% z+rpE8&7F0bPOu1gmklog-eKW#;7$uK2X43UI^Y%yR{?+0!eQX;7H$Tvv+z#fh=un6 zf5O5s;M*+xB=9y19|YcN;UmCXESvz|Y~h!HH(2--@Oldm1FyC48Q@hGJ_{W3;OrdW z>nvOdyv)Kb@YNPB172d`Yk;q`@M_?N7OntZVBy<=OD)_8JjcRaz{M7h0$*z3hk<8V zcpvZ#3-_UJ1e|B#6mYhMUk46Y_)Xvm9-I>>A9(v63+DsB zW#L)CZ(6t%_}3O*0{klrhk*ah!W)2Jx9~RL|7GDi;9pp{9r))Kz85%U;fH|#!NPli zU$Jl;`0p%y2zbcCM}dEA;S<1rW#J_74=wyE@JS1w27b}PZvcPSgL56=0Siw8e!;>; zz<*}p65!`7Tn_wA3oi%mx9~dPuUohZ_*n~wfxlwmX5c;x?*!g&;XS}#wr~viixz$o zc%Ow20zYQqBfvctP5}S0g?*0{@@(-akIhs>&a~GbxbL zAEdO<(iS?j1yV?p%;ZNWEow@d(n8vXCSVX`n$Ap;p_9xoKa!LdNNbTm3lu@^Dr!}9 z>xx*Gt;Et=jDFCe|(<@(wz6b z=bn4-x#yny^g+<=LLUabM(CG7Unlf2(ANt6 z3(zZsJ_&j`(~~BEe!I{WpqB|f7j#(YO3)2L*MklT-3+=$=r+(*LU(~)By zXL_=!{l=+32t66}DWPY9{;kjpLI0P~wV;13^wpqG2)zpQzYE<7`rm}!0QzS_Cqcg^ z^f2gu5_$*dp9sAh^vgm&4*ICj`#}Gl&`*K>fzXFQe^2NaK))dLQPAHN`Zdts7WxF} zXN5im`ViAo%0Yi!=oz5DCUgMwSB0(u{glvQ&|egK1?bNU-46P*Lf;B{pU{1vKP7Yy z^e2QK0sS$dcY%If=slqSOz0;-e?aK{pdS_bAn4sf9|rv((e%T==6?^rCmVAwomrfM z->>2K1pGXPpR;gf+DZJzNrm}8#qYDhasa<4;in??hu(H z)pu!B#W>;Aj)79pD#~9RD z<@r<9D}emQlJC@ajN*(JG#UMjE9Y|1lzpslmtzd70%6p@^g~J;E1dK&Ryg^+vBI@X zO^*QV#Shh?^x2Dml6EvZ5Jusp7BQ6o($OFL zkdGVd`Tr_>tg`&Chn4v9c4Ro`e?3z#15X2<20RUT8t^pWX~5HfrvXm`o(4P(cpC6D z;Az0qfTsaZ1D*yv4R{*xG~j8#(}1S|PXnF?JPmjn@HF6Q;E&co$vgf(I=z>`(}1S| zPXnF?JPmjn@HF6Qz|(-I0Z#*-20RUT8t^pWX~5HfrvXm`o(4P(cpC6D;Az0qfTsaZ z1D*yv4R{*(lW2hMLZFK^#=5)VPm;l(T8MMz!1+Cn{K6d%6U-leDLi!l165Sw?7c^X z~ z!nX>ZCO9Vee8GK!r&}!lKtA31RCs_dC;$+^7nWe$4dp(Fr+Z-v5Aa0=00MY+3C2AU zGrwXcTvSWpXe^Xx=0S%CnA)#!mxQ$Md?#LTbqQ`V=DjuujZOMq2mBlb2)@N>4+K&C z?WXK=l@yQ6NT0)wK7mP}?*%4(%>pKU?RNAFO#1yOu+=Xx>GzAq+-KWS@;eCm3lZ+f zKMaw!{U!cI#0OOT-xE!b)bCZu+XL7p{J%Bk{?~xhjD3@gKVi#{FxZpteBfr#^bo!X zcojp71Hg1g2R#&j1#lNbi>rat3O4``D||KZh{7$vqY7UKyj$TLfT{fSP<~y&do5xd z0p7205AXqn`+*NBoCAgq?L+dm03TI&JMb}u?*~4v@NVFf3V+b}Z!cH)qrkHi{uFSf z!cPL%D*R>Ou)<#hUZwCifx8qw47@?%?*aEI{6pYjg?|h@s_<*TdlddT@IHlq1$;o^ z-vS?YF|5Xa`!R*j0Y0hlRO8%hkqeh&DA!p{SrRQLzRpA=}@??=Gp zD*hO7g~C4ro~7`A00$KQ4REExr+{l+T!yQ+lVOF=1#VV&8t^KGX92e>JP)`_;md(H zD7+ZBPvLstVTG3gk0^W%@TkJ8f%hof4!lp{cLMKM_%`4}3deyDE1U#AqHq@YsKR#w zA5(anF%KL9&auBPgS{kAsQ3>9pH%ph#@}DA@MnQ%DGYzpU#ajjz+r`-1zx2v?4!R+ z;TM7X6n+_aSm9TVe?XTH{v{>RWKU(k2Ch*2ZvY2eJOTEQQstX430ReH!gOF&z6o=H zRrw|?09NIja22pB--J4pFRk)h20Ws03-E4*uLs_%a0l>yg>L~qq;M4Yu)>>wk0_i4 zKC18*;NuFv2l_mz@J_^6DEuh!EQLP|T&eIUfom21EO4{JUj}Yh_!;0Xg`Wl9pz!m+ zeG0#b@{KC|GVpGNUj^Q)@XvwwEBtHVLkhnEeAvZjl>saLoHYsfn2Mhcd|crIH2&$z_kj$3LIAW=fKSh{~EYm;WvOcxcKZcV5b1c|LjS?BPxD6`tzv5bAb0K zyZ~6~@9e99mA=ld13skqmjNq%8O-nRn7ivP35pD9=P%fPb~eg?Q! z;b(!H6@DJLOW_xR(+a-~Jgo4mzy}omIq*@1e+_(0;WvO)`Ohgc{(OZSf6gS}N`+ zeVmg8KCI%m03TEMJ-{av-U)nC;YU%P3WYxmJWJtELZ3SQXMuJ4FGHTNQ-43_8Q^l2 z{#jrx|9RkA75^e|v%)U}w=4WA@CJo{4xCo_4fHpPpUd-`a_pIml6+aOmIr{hVx86} z@gd_|PWuxt3C4WC_Yg2WD1Uhy@NtF~uQ&carH^u~ANy9Rc+A)Oh82zh?^pPC;6n;y z{@UbyQf; zKD57(->oqA7xH@)4gl{}82bzPeF|fLA-`W?>@VaGD2)Au{2_%~fDbE-{e}Dyg|WYo zKdLb7BY#X`>@VbxD~$bx{0W7zzmPwvF!mP)1(N;I{=#6nipT!KV1>fiUl^RFF!mP) z0}5k*VX#tR>@N(~DvbSw!LY*EUl?pw82x*2m5VXH`L5q17~|VHZvYfXS13v8H^3O~CocNDRTG9L5g@RG~2JX-L(#9QHI6Q1P&*p-P2ePeZEyls^5B2BR;YOR->q67@V{GC{e1AhTZa`t z{O{Ji3d0|4J)$uD!CeAve((o()v9>-gS$2;41aLfZiV3w?mD0_{J~wv6^1{!yIf)T zgS&P4;ScWabK}V$+`U)fbAXlp{8NFIeA?f=`=sKZYy9^Jr26<50IU4ZU1EH9Qu;1# z|8v(H-?qKLj|)y3-(4>Oi+!BC&G;U89C%pbA4C(QJ^U*Kf7DHZ=kW>ksZZBtd8o($6CY1VcYme@saW^`8_pWnbt7ruiWG8_Wmpfxhj7 z^rVk_Y88e)?rByS{r8@Bh2g*N*`P4|_dR_I!++m1tT6odJ);UkzxR+n=%M_f-+T62 zWbvd{ls5)U-!Y={Lf?-Z0T%s`ejg$IIr_R8{N#@(3qSN}_2IIhO)5<0 zTzzgUM?5_!5Bb+^6$~wgf87>P82)uzrNZ#9+g2$I|GG`-i~Q@hE)@^|x^08P@UPqY z6o!A@mR1=4blZr+Xpe2X6^1{x{f&aC{P3sS_N#dK(`|TZATS`Kizg* zVffQ+Cl!W2-7e7P2YmzCbo+?H@Tc2%D-3_SeUHNMr`z`_41c=)fQ!*<{o4;K41c=) zn8NU<+fOJAf4cpo!tkf>5lH%@{`-FF@ARPmPP*6l9^U}Eo&5v#=l353R{m_H3z#12 zKj^fi6*1+4n_`=4+z`A4fCr$1x;{6T6T zSx-;;H^fu<9r?e5{D6xmmxH#CJ3rgESAxV}?xXsNekWgOe4m*BJcG+m<=aR4Q{~%7 z`V&m$v+@K_z7*-VBK{z!pIi^xKAivLR^$8p9t0ecc(l)Zo&#P8{{;O_?gkzPUd5Q~ zY^ir)B`l z{Cn~*5#I+~&hb<53Tgl2z`HrWDHtEW^%C$AiJy=1P`sq4`S1=ZFFmO5lp5pvt6zYY z{K$XrAo=tlp616p(hMzz|K36Mqle<*zjur>v>5(-$8Lq;zjy3W82)?50fphecN|g} z{(Hw^h2g((D{P(?;3d4WjyGmjB?|a)7hX1~|%fM&0C<*4|0Cdl!pDG>ex|(L_zolyUm^Ci7WP;LEcP^|3-)su zSp3J7e(*mAJX!ef0^Y0egGhfXu#^5n#`m3JV8@<6V|-6j{}=x;<;%wRmz1CQt10L& zKO}ry-wMXJ>Ay3D@ z1Naw;e=X8${BGkrv={PsOZu$wy;uc)@efn)Grq5P0*ij8ehl?rLGj#Q$v-{qva^in!%D(gprDyq5vEKeV=~wha(Iw* zz?B@2s`;LM0{`sd^c5GNJ&1oRW18PTP2~~!6_pq-UIGpXKh~QEUsre~@RPvO-zsi| zz06SYG2nWIv#{SBu#~T2E7BhVcGB-eedhwx_>1IjFSH7A^SxC7#(J4G5W{oh{CYXA5ndzy~v(^MDc>DJ#Bu1r#&NS)qdLp0SQBX zG@p2&R$2y!~?4QipJyh_+JJca_BGzWoxj+W{pOf4^Y#j^ zH)T&(B3|l${xZbx2M$Pli}C&T0OU;&`PUiWzZ^!qjBn>-f9+D_;(|}7s2o3*K2&oA%9Yr$R9MmldxZ3 zmEdj0_djIcVqeqm$9P2L5qZ@AAJ_{_kM#cs_Azw&{{#CKM*n|++LIpQNB@7|1Vf9_ z|91+s82x`|g^EZ2-%0hShti|}?`&siG5Y_`E*DRKKk9oF*s1@gpbxZX0e=DYIi>JH z0`i-e*PBn%7GpE@E1={Rv7PVUOMjD=k)(X`yPRQ zY5fTMntl@Tz)pK$+pp}Y*WL6prl7y0kIlFO{3ld=$V|9k6yoq7$)E9d zl!wMsDIbk5uaf@6-_2-)eDFK*GcX_d8QR~Ozs}eIdwogbNnSt7dra}?jsN_uz%Q}B zX6%5yJ`Q}VV2rP?qI^El=Zue`KT>(0l=#mD54_htxQ1brg8qpu4>#`oW7U*qtVk9O4} zo*wicnlJ1^ynP5`JlfT)Fvg=@s}#m~w2Smd5AkC>+SSF-V(dTc+MqD@A9g{X_91@k zKkOP+_&VTy3S<9a*I|X>FLs?&82b+o>hfa$;lXAVkNt-SS1FABhX-|evH$R(F7I~W z4T>N8#}D=?yc;;};tR08zXj#M0_Rd^$CSm6Y)vL`>rqlf!cJoc|1 z-lH)3>%)5$z884E!q~rh_<+LLzk2wH!q~rh_^86zzk2wX!kFJYd|YAdUp;(6;jaLn zR2chLyDJoa4tSQru}r*xw_g!1SR1lzkX@4?~MT z3A|6?&jKG%82;>$Lkd3wd_>`AfsZK+d$aFHDTwlW)%YK6R`Kvpk9H~iYv2tEzX7cD zHQ^THf8Pl=enJ%S0!jXaO~4f@9{PPWpzs#pu)?U%`;Q|X`9-#eAQX+Lh~QSj4)`qO^g&f^R%hCS{)sc;PAtw0-(`S&iRFIs=^ znx*&$fddL-{=KWx#TS0q_^Sx+lJft#@zK@Y???TKLFRiGV!raOdf-vvKVtmX zg@IQIe#Q7V>;QgA@V~*{4*&-kV}9$ua0Rd<@At-EL-ru^^_dgV9#sBv=Er=K+fVps zUWop%7xD6be&zz>ZzO#kVg8xRjDIQB?|@+Fd+9OsKWUGd8xUt7p0CY>{(7i=>4ANW z8NZvO$BjRB=J?)DH=gX_(X?P{Z6#;aaiUa8+> zi0_hkvIE$=&d>h+aX{iRf5+bs`+Lcs7)k$eq^J2V$v+?Rzd$rSqMzp&VFS(*Gk;*r zze2wgZUr;x>-CcO-xuRqXB)GV4)b~|$K6nvTSwf+L}VZrUjXU{V(6pZse zn<`0v5B_Mv~S;`oaS=jpio7oBH($;sfalK6{3+ehND z-+%UgXyb8-UtJQ9^1TTA^*QpfpV>n?lJZ}aDd8VBzMHNF|89}@5YBs}{$_^Yzcljq z_h{Uy*uR=tk{<7OnyLPM!v8a4{yX57Z}$1d_YY4XUgXcl`MHmxKllR7KYJzO?8Eh& zy`}`i|6KhF!leAO6D9F?lwj;X3?4(6=x_G>jqf(JuP-P0S=*vClHWn1=@EP_qXPcx z68yI~-$><=_MiQa*#D>kenI5Ff%EBGfhRMbbGGrf!yd{+pK~rLmN$odfqgjtIW^b{ ze;obpNlAaR^#6Ls)8ARbztQ;K`2xZY3V#-^@+5Gj;7`KUpnd$J|2f|_zL%bYK87X! z$Jp8*1(yCY=LGg=Yk_A;JocZ~Bi`&~Jh#MN=i>d`a2w)9-*Xp(wh#F6%nd{Togm63 z{Tl2?lg^I|juIC=T>rV~PYV|UJ|*#cY@{3iG4$7Zz*>oi|L^z(>enV1=i@$#_BJ~N z|IGOI><1QmoBKaF&kBC0ei!5Y`v_$%<-a&!e2dM&tX)VPNTR7Z>ak@pvwN zmocAOh4+yn|Kja782@m6E`Fc{zrO^3+?cOJA7{NJ`Qf}r(=K4q*TpFBw`!5*368%6 zeejhL*FG)@7t6ck?IpO?n3It2KPl-q!9I?FN9^O0KP%ziYka-P-*gH;=6g}tlTZ5J zC4W=GkN2C~uSUG+=Mucn9i;Z&CF%dmm|yQh{#}gcmH4xH@UIsm-Y4amx7PUXIEwU= z-@K^t+4Jbq-{#$Ie6J59ewN6?eCCz_@IJwx0c{`F|GY23pOgNiedbYH+K1z37xwFg z{|DG&*b0WLSze$V{e|=~SMa6AH<@Hec>}G+S5NZ$Bp&{!X|9TY!ua-;0Z`z2y8^YMOwOv?8Z^UueA^W9Vi zv5)z0H~veJ{_J6izrpx2hY%kY+=Kbr2;wIT-hw#$0OOfNy0Z`KXa0R97~}8FufgAr zNcxXJ-%0RD|DKQW_>viVZ=M-dENMDqW}AwIsF2^@hzbA2LvOIAI^Wl zGUNMXGeV?)E`Wc2FaRv}vEY83PlZ48S4euS#~ZFj{<{T#4*v5M@Jsm?JO|o7BL8{V z*GUA73jgno@2WQV2eHS6wZbm`X5kWJp4ox?M4t<9D~ZQ`eTGC!ehcq0z8|lGzNCE? zme|X}50<3=7~Xf04y61Gzfuza4de5lfIPAHh48;Cpg*6q$7QoIU+6@dyP%_ z04(~y>|OBJTY>8(zQ0)hWjL?#*{2Y;OXBatd2I9_XFR?P`x%u;@00pnhV~wK0{AuI z|3AjpM*2G_7~}Ul$`Rkj`0@(l%Tk|^_Pe~=_?}DyOZv;NHoog#1D5h#9>@8-TY;VQ zL!j+LN;c;5lKyx(%Go ze_2fRm;5T>FI%X*PqF;UYmE7PAN+@uw-V!f=4!-mkoXbfk3he^8G=jvQ{|)hd#K&u zFPHddfn&hZzLnSyYJ35BF2^rA2mNCfaJ}F#X!~&e7QF-K=erOf?X{>A^RrzFLw~DD zzLaOthiqc}Bk7+g!JozXeCXS;zeV3DiKnvJN7BD!e3MULeIotgN>u&BB=aDb_e$8` zJ%nYvyYh0I82@nkD{=m>=M>;%;fH?tk@y=*Fvf>tufZQo5PpoO4I|(Y`@XWIe_#2L zlJpo49(oR8DV^L(#Qy>K7_ivGRT#hSiUFsY|Ef#iZ}+3pQl6{O zzn(gRc#(HiNqwg8K%9NJeiJ`mjIX-B1h*UCe6+7)Pge~a^B1tc2}bfqdtyprob|_5 z@K^Vvd_M7)SN#<8!=qr3_P^@4#yq3xs*f4}@(F;QA|L&?GYl;4QHA~d>Juox z)Nj&nC@npbzNCLw{R>>@jBf zFV-hy|I&Vo@4(;Fk$sAO7T=3k9qn%U7Jt~7H=c6+!Q#KheBuf4ACU4K1#KTL|6-iC z`l!{(G{{BZioIN$TsC_<#Z)k$N%J%aijm-0M@{*C%N<5@Me7xfn>9`pN- zTJV<(e__2O<-^P3?<3y-0>{^2eRAhPq!)izbCvPcz5;ub`qr#N*B(K<__LZ#DF3a% z;%{s20c{_aU-MoJb<|$9BL4#tZ3334`I3W${~5F|>0jzw^Vb;qpLEBQnv(J1g2H+N z^6}JQ{g^okBF6dEPPf7Mhvm;&U5smI!#=M@*aqgG_((}S940@UzBXulAA&s@>7V7F zE{Sg~!G-mkq`wv8$t>`QzG_S6leN3?_gxzh-z??-B>Y=Bu(V(8SB-goKjsr75`WzI zyB~Aq1wrz|`33R5>uu0~nUps;7x(eK296m>kF|AhehL2~m`WS`m-x$twl5Hm$h!^W zPapC>!ubdL@qYRRM2r4{JB;s(hk?ak1abZ-@Hp&G+9L@6_mO(UKPKrhzn_c#=$H9e z5c{J&#}S{DcsS3aM^OI#j6-;T(t7~$6VQJq851h$Z=uD;*H?>pvER_!u%4R?{EDQ< z_#4;_d`d9(Gx|s$hXilMepndgk^DmsBhEft|Ii1F|18w6Oy)~`OJiis(`6Ju+_S$SZ@(~yTmUw=HDUz?1h386iE-u ztHb)8NBW zW-shj^wluK`0A+-h<+MYV83k?Sn7AquQ|0-{sycs?|2Gf(q0XHCGjcDr#caq=JGd; zl*I4C-`BzZ%m~LX`cz5$$1om|Oi4ebWPZ|s_TF;@@uI(m?_$3EBm(A3lq&&0RisdbtYE3_wXUS-x;AWv>*I;_&b>2jsn(7 z`hURRZ&d=P1;0+b^hkNI-^~x>rZTKY(+H9Ln{a-88t_@7ucmkjf71AG8%CJuy9x7? zzi)Q!`NDS>@h1}-vx(mB%;IdiI}=@;O(nZCiEMQ?Wulo}qB?5^yOa5Nc5zpCb(Dg# zxqMF#$VeoXiu5K^8@rQ{ST2>xM!NIErYFu3H~zTiwwaiI~*J+vCw(buftV6)HRuXQECCpO7EG5iR!YrkUr8KdWCYI8~Qkqyw6H94gDd@da&L)=9)FgJ8JW)l><35pR1#fpPs#zC>;pcrycEIBBq928p)iZKVpnuF4{g3`Bw z(z$}tyMofag3`Z&(!qk#!-CSqg3`x=(&2;BZJ>x0tmgVOJV((!}R z^Mle+g3?oh(p7@eSAx=6g3?=p(p`emUxLzMg6J{SA40X^mg(9TNKviG7E}zC+FsP#6Q){zA?u z;0y!KIN%Hf&Pd=41!B)3vF8wmNLzog=aATQNbETz_8by>4v9U7#GXU2=Lkl;Y+^W) z%WWQ@(K=H!LZ)+fBqROZNetKh@mNt*Jd;Uf%E zngknCTQ=97iwt!qH=)jiqp5)b%-X;nNhY#|D9(mt$KpNR`D8BA+ntLKb#Hcsq*Iv! zd(R!Qfk+~43&csG$bQJ|$wqRU)3#PpxS_sOB%kX~3q%%uscdfJW?TMTG#!cNGnq&n z<=lwEf@>3F6;f_XI)WPw>GqkX83iKfz<*`P>- zNX!qwD-mmmQfCc`ESN2<-5MY&E9}(y3(B+oK)Nusgt4w6l_o7jvO}i5^M%d@9 zcqY!_E$KXmZ_IQLMEg)~tTD2z|3ZR%0%NF^N+Qv4(LNPd7m5ssw02nc>EgNv+%n}8 zU{4AY%E(xfcj$c6XdKRpR!tFVmqMnojmb!_2(i_-y^!?d)ZKDO0+$0#k;|l{G`hyr zEsN5|?%hm@cY{yLN zgy9uj%b?aftx;^j9OXC#Q>wJ_jxI@p^_C^g%GFo{SE4n?p2C`XO9q3trPgq{7<6Lv zEEFAPP?X%7J#y58N>P1K+Gt;BItZ$&S?KD4pwq-W zYqHHmt*IN*_Is5j;eu9dq$&V2ql03^@1cygsGY>fvp;PUZOr#j+9*7G6dJ9@x&RRK z3;LDL=WO2i4ZqF#I=KxcV!1xc)Sb-^Vf5u_Xo@CawqOJCVVlRML^3J)Wcw05xoRvH zAf1BYKzeES1~8toB^gSj<0h4i*$O67g?#gAc+9wE9EPXnVN5hcQe~58Sfsz)Bt!O6^TdtFm!P}9EBk!g-O#;Cc&At5Sm&Q_@baVHBWoIKJ8EEDq zV#`J|DVltuu_N4k)mU3uJ&SHJI%jNirSdt>SL%X!$xx&xDXo&u#0NRwLg7dXjrq1< zneJ>HUJm84!ZCZLU`JD_o}Nf1(c6bctfO#8owhN9k)c#3W)j)RP#^S#nN!rtw7Pao zv1ce25k{&OtD9yCB+fNV$@h+Yf^BePcXX4Ju1Nc~XqXdVgo#^2B2^nIXEIK62nfDW64AzIZP9>$T04(lE!RA_eS~!GmE01#s{&Z8FYB4fU>*F3zI^>rTJ+B zvrSB|sZS?UCXtHpJd-B+CLe>}btl{4F~ZJFJYhC=23*X>@wQ(LU_L!q7vb3~c1w9& zk$wU7!$ri0dBCGW^kif4K}1QMTz2Q zij}4HVmzYesZ@GOLRsjQ5^8HOU_zjsRoN-8Q~G48JJvneYp3**mrYLkD5#0cKy{1^ zV>okWsU*8!ay`|w)(|yzx&2`xNj-)cZkv>eHGl{6If;+K3!a@v73>XR=TXznlKfLci zv>VH2u8Wm%E0>-{vBm=iXjsgBhCUb6_-Ei+g zZ|8VtE;mj-9abi4xi+3#Pg2|LxaNeC@4>hb%XANoSNV3dJH2vmQqQ zMT(Z1MpoRscKMpsE#nohptO}YtXMl96X}I!iZrb%RK)7ln!DSzxwzD<$`O&r;+_v* z2R~(9n5vo63Ao3SsiilYYEmhSqah^1E8=21;ON5E1!g0+=V{KO7yNb^o6p4iu_{Ya zN${J~$)1Js6G&){WC(6AHH6V+pckX+b!%5g)(y0wt4l)4(Aq;`&Q5X%d$J@NVKu$P8+3Q(2X60vuRAka*hEPtHSA@?DbP= zjGHW)*rF-y0_yD+YdYzy)3Z!Ek{Yn{gYhcjRGgY(Ih2U;gxVUDGsiIju^W?oOZ*F> zRfMw8k_{wiU$#aH2{P$uBuz6=t`Kc8+17We%)y&5J%G>5I$J{=N~NGpBWx`4fW!Kc z?W1vOyAnpf9KIKW5_@A5Y5=BUEesYSB-}F7XAsk2HKT zHjmf1)Dc5xFin_uOEQ7^r)%Cl&^ac0@mznlcRUNV-USvS6&C~8HI{^C-+EC!^i+fbjhzKp({-KMGdAuDT$pcwWW;-tSd_`O;8!6i5qn5y1Y%CGR zshf2Uw!~CgnCuO9cq+DY%{D(gBOQm>7^&xjhP$m@sH0_+61SKH&B|Pkqc@qj2@PWCP%XU%<|vzG>Fzfb_Vqp zs)(H#%s4PGp!augq**~EIfU6W?TAK`18{kmz-0zf)XjLCdc4M6AJ3-pI9}04d)Wo+ zwH*tFqU;eB9;aa3SjxBa?lj!)ozAp~{GGK&x6j!u$h2A4g$`@8@BTb zV>^X0Vr!{%dG9q@F8g#{F2YkNk0K=UL=_R!cv z84RfOuE{k^*(%Q3CDNHprBFDQ)Di7pA0JH68yAs={CMT(6x%A2wywxlr6!KL9Zg^o zgguAx8Wx?erD#>Cde)oOy(lepVKP_zKVDv>E81doOmG-)R0dO64sywDWvrz*MW_1G z9+tItyUw*MMblF>8?oug^76ct8_W(!{5Tb$a&&;dP>^x>#&L?)O2$c2Xu@{d$HMl7 z7zNibkHbY&{X%0wS?s4ND3OZhl1?kqDi|AQV8C8Hr=||3W-nG#MI(i?E_LM>RHO66 zyTtq%S8jz$pn+G@;U^kvxP5JpKFw1Wm4aFVv*PiLzzT1}OHXu?HhK#wwacTMU~9k@ zG#5n`>=Lw^=J4Z*(gQ*}cD52(>MPj}?emqxrq@QoBIAP13|Yle{oRQHyTlu(U5nOO zD0zz4) zVDW~xW@HgEMRdfDQvl|Fr%grW#aca@#}+HLEmc8!&RBhPkCk?!fx@lsv7}>r7?BIh zpyGGWB3}0)cOgAaVT-H}3kq@;WF)k_Flinmxzs2LzxB4p3`7nm)f2<}b-2!C68mW5 zXgLewW1^c&Gh=tJ~kuAfYP+38K;*tnC@q=vq~FFc0wzv zbmlInxkG0m9ls;rjl(Ljq&0m`g{hiey>Va~C3RP>DvVl>hhUl8kEiSo9_#EWjE>@I zF8L>QT!h;GOsa53yHsy4_E%+M+lLV+BCnw$5geRI#u9a6LJ)|~lkBlO>=LFHUuT+t zxO+`wIaX)OwmX+fm`MBjbuFzcZd~7rgVt-WUw&6xbtfZcRYh-DnJ+{8F4-A7Ps!yzxN1_w~47Xc%_@_&czb3aW}M-YKVd8ZpEXe1$n31`dA@N+<)Yb{Q<`xaNSmPUeLY-=aZ(lKAoV`2gBFdMR-syt zJWIg|2BjyvsmnFA=f}>xH4XE9YaWs86K6bVgPzq-&1c^O(3yk6CalwbJfF>UC-8O> zy*!O&nxu0(HG7gX_3aL4`U+xg-Z?|*fWI8|A0z zyd9`Gl3wM~z5=@^TWPy;CKeTjdfJJcBS;d{q^M*Ig1p0NvqNe^PEs7L%RG)AZj?O^ zJ#MOAi`KS#k#G@qGqR8o8Hp8dkJ)kNB|Vd2choK{rFd}JQTy^CGRQ7lRJPGMy*^Gc zSKx3$(Xu%br#_%+tu_@^k$CceQ9zv_<}M_2IVm}6W9_Q6O77U@?tCgcFH%Q;-<_Bv z%bD4vi4WsM);QH^N$0Tx5_QHi=TvX;d3b8e(&>w>8utM@*9#LJCx_xq!7lLKOC0O4^7H)JsiE765kNo_1JFcXnx@BR>#$XDYL)qc4>XGzOZQYHGtZ!SK2G zyV=SGix9i6BhXMC4qO`_pi>`#mGO<4Jl1~!{HaXsn~1o!rDbWL^4hgGE((NjN~}5* zz~9+4;cw3B1C^OL&b(#gi^dcI*>yF+5Xupt{W4TDLj;cR2O6tu1MPGaHW0)gkJW}2 z*M`nDUPgrm^i<~=gJ%q$XE@!p|G(xL+%e?;x+{7j#u}27F^t!#p4<@rw1o#`Op`Ds z-iQN}iCiL{4J<~yy=WoOhGl=CHHIDN3`_wd_~Kx79sZh?A0K}Cad*QYeowht0`Y5Q zy-S0K*cKeaKa=R<54k_=Vnx40rCmEhJp9}>;!wtXP|?r3w69Fj&5GWo=%b4My-WKm z6|M61XI1!vir%N_@49rEU(uH-dbOgJ%(DBo8|Nu|MA1*Xv@xG>Sn%7W%U&IuXTo`I z_=I;TdWE8Mir%Z}zg6`Aj1=-c>spsSJF4iHUHY8+Tw0g&oS(Qd%O|+B=J`|6wG63amzFDr;7fAOP@OzY2`V$1N5Z~&ZWExcXNG0IB-S& zh)Vkr@Vs64zXW=P(1$^{3jGt%*9rYP=(S8wngm+PKWRSbb_s6+eWTFrpl=hp4|GK6 z?VtyQ{t)Pt&|d~UB=q+{-zD@fK;O;uGR4!e?aI zK#MI+r#6yj29>{`!Hge`IKk$E_aQvb@PaS7;TOUNeA_tu!vA)|XVxHG`q#{LDja(D z?PmU&Us2)zh44KbK5MocJ}Zjwk4gA@RQPugF7`9)-$8$dc`hmg{RN@tfEN3?s222h zBzz_47leK{Xt9BdU=O|@O8A4Ie=PK;K>tMOgP{LW=De=9z(+Y_%KSeAeKY4a z|MQ^VCG>NkZxNdMyZDFs{|Wjw4qtE<=!nqhQzkBS5Okl=t3k`NUpTI(Efft3QwZM;MEl^ME0$B^tegUlo zu)e;G`ku2Epm1j`K(x0OfD*j5fK`J1=MyfeeAIaB0&gwA>hjhCtOsu`z%-(M_H?@AW@n;X9HtP#8% zJ6*R6=P8~rcrF-&r%Ul;#|YoK z(3~}jbmQT%q+I~4A$cZl}ZJ5YkR-myxs|G2iT?RGrcTko*uy!8(2!CUXJ9=!Dq>%m*^ zupYei4(q{N@30=c^$zP{ym^JU-eLU|uXh%jvSU~y9LJpgg=SMmXPU4^Snxxc|0hBJ zJb)c(djb=4g=u6<|W9s^u2mF%wWP1%d4K-s?s=D;*Q=1^@f zZmhPqK2+O3E3M9?mlg&hHaK{7vL~HD~KbHk+ zQt4a`X$+SEr>g5~YdTsWq-JAcpr*Q7foL?acz9hM{)zU6n*xj9*)Ous%hz@S*sKDJS0@G_WHrQEVnt_bS7&6!x;4vJuYKDU z^KGlG!>2*lb+oO%X8sl69J?kcXD(HfNu_ZA3NCZ!szG8hABzVTBZpML{eEdG5I}x( zd1Xy+e4xgS03Q{2IE{~T7w&6Ee5M9>q1531cKc&=$YTCOSsUS|Df#3n{_1{duClf& zxae&e`)gTkE&VyJJV5xKpYtp;^w|T;A7cK{qGh$q@P)%=_@LK7Z@`gO_tvE42k;lr z1MyfPUA;=@6al|ciaMtZOPst;OWg2BBrYm#qnj|Oa&^gNwQlZ;l1f`yr z7BcZMN^Z7-B$v-Ig&+wFH9(ZTm4(ej+8uHAh&8cP9=FwTl-uZGin40a@owV=8;Jp~ z2N$gj7pfdY17^ec^Z(>hYl&60Rdu0dxFM`pa9xN3+=QxFP7^jtxg6O#f2T#3ELvs@ z=KvgapA_UrQy>eT056Esld*TmL;{p zrBIoh^-WDngSr|wwqfYwatA}uja9h4V+t3*;rofK9rW*Pun_}4?$cUIZGaAaC3-_> z5%*NO{YApjPpPZo`lv`Qk56Bur3W|GJHhsYPfl=CBX?|E%7=?oaJdX;2!9Y?yADJ1 zwH;`QmF+DpOb4r0)O`!xa-ZrI&d*nUxm?n{ql%|8w!kQStqbj2Nv@$ zsaoD9Lc>*UtJjd!NK4!Dj*iw2=-1H^-T1+Ug$K$8Lv$-nR=Y1d`jdqfbik^iISnoe zDTK0SmW}I7oDMOVp-%iJ-6pni7#H`wIiKqs(A9~ZW?eEhsmbPWBg@9p&_p&RF%giZ zv2ZdqJ@}3eF3iPep0fBFWvNgw;4>`r-A#(ahc+TK{|GkF1cZK}3ueQ2eC8dNlx+&|#CM6}HGkDNt;ZB|~FxYSXB10eC$T*>BNrcudGD$a=dM;nR zEnl$FDPSXI(^$VuvH?Up0xvW46-!$)SiB<-Hv>C)*Hdw6Bw19fbbMbDdLK(`WJ6=B zvmduKJCXQs8a@?;j5{ks)<mpIKEFs zl>n6DmX?5@W+m+DM) zK<#*-Gcg@4Ee}tDZw)$Wf&~Ll7x7vz)kNk46Nx48EjO|sk}h2f5j_KiK&lfWiM>}# zr#f+Xwm5?8g|gr#wt^I@7PwI_x=Bhr60+pRv<8L+zr!xAh+unRGd{WJCJ9;p+*B1p z^+*>q1;$7E>=>rFq?X{apR1E9hPa9-96nMb){0_|Q_Q-xBvRos}|r0O0jRIw*p z5+n6Q$$PT6$x0`ZHneq3xp~)-#Znni4V#OKlB%LuPDUz{nwQf#S*b{;`c|mx?P1ad z4FqVqfB@7zeobWM^0tmvOm41;bgsX#6?4mFW@9QvpKx^4Q77s^0(=WDrZOXSh^s1& zAZ@Ux;%@>KL^<|My|Fl|-c<+g0do@6JB_{wBX!n(gu4(WdVrFWNysXMiwf#d;e0sK zg9#xj+a%*8O?QCnQTc2*lE=VAuAirm5gMl~l%cvXIwgyGUA-uz9`!HeP;V!p7 zpo6!b!zSE2nzNHt?vnMQC>k9Kou+|(9QQCx$71;U3bQwen!t`vX~v7=*c~8MfA{UU zb=FDZx`Y12fC?u&frenNxP7s}O&!G!n)Z&!LjP_MRlvQbFr|_i5&Ap#6bQlB$W;xb zn^<=GrnXZUscwT!Kp(>5VISpaLu0M%k zNnw`CreB&J&Bttcm!MT(`X%M1=*D_xK>M6tA$SRnMKif`!6nP2aCRoUZ0xL4L%6a} zgx7_oH!qXfZfQYiKiXzQoY-mN8F8`lrB#8 z5vqxYOpGJ;s$r)RJcu9^*Z9if7IkXk;ll}b$GIjNG40SrQVRCdL<6P`&JW1GIi%p- z0SBYpxP~6P`7*(;<lbk zy)ahts>=!HYCt*nr;d zZ0}I&JMralPEHOYoVybrc^SZTAUlLDDZQ_Rm{`_+ou*`asdys{rFJ%0a5Wz6pin%t z7KSH$&knlhU@kNdq6oJy@Zg21CNf$sGkqD7V)cj!F<&%oQLe-?rk2Lq2clg$E0g!+ za{W~OC02WNjk$hS9~mrrMT9^jMRi6{AMV7KFy4(MHhi>4!g!OG!ctCB8r!KY`Xih1 z&2!-kHrn?#2pn<~V-#^X-M|p0L!3O3MLS4(8afb)t^9kDFC9h$GtCV*|fw%&#tj{~uZU~ONGbV!a*nZXG_CA^Uuf&_#` z22#01kJFB}bvPXV4x~iwtQ!t@td@#FR*UA)f+9U|dvseQ47-7LYp$f<&_@py6Kg#- zm7*jxMkF>;C$x!B=_~DMf>seLiqPkC?FZdyZefj8Olb^LD0mTk9IL-Oy9pjHgn5wl zl5pcaSe&`R>}hQ!ILl@Q^oP7Z0RTE_(5^W3nKr3b542^Fg9bOP(D zIwY{ZYK2e@Rb4_gR&@%sr0Rwi789;oB~(*Y2UFN!ULjPls!J$jA{1WVITfp~YLN=T z88lYiYSt|8imX|VVy$hBtXa3Bb!puaY~xUT;bj)Gf)U0kHiAPY zI7EUyAB$G6?ZmE+C0DksTi%KHi5B3MVdrYR)}r`24#ExS^+K&%)85wFWg{DkgIGvo zl`RxyXWv;Zr4o&2YcR2HeD#F4@9nV^dc%WI*eAYF$2*&K{078MSZ=&wwOxSFxe?hj zq?t*F3gw=Nz#DZacSLx)6^fNSES8>N)uA*h+70E7m2O@<*})F0S)oFCvJ*sC>{OvV z*TLqhv0tiig%qZAD^^=iPyPV)z_ceD?o0Ick?+B7Cp%kw70SWR;IU#gIyihE)!yzR z;uor$55tF8IXnO)?J0(k-QBWpgbLr+TDp?>P~7~|cA+*hg?SVn_pFX?G4Fg2THkqr zReYjmjKe`Rr4I0fm~5+%&^zBliwIVScfQ9v-{YO{q0bN6<38T`9=o9N&i8odd+f;{ z?|cu<9C$M4o$rxdCrqi_Gc0zBj>$Lz-NP$9$Hz<-q3)>_p5$XafKYjbjrSWo$;Z^6 zPRy4gI6t9Ek%c5=} zFps>7_RjYdPGHE<7VmtId+x$J-y^RX++#}K`5sJ9z4JYVlRUf__RjY>Z{KL;;+^mD z&i9Dp#4#}Me2;g&ht3Lk=X<>KJvblbo$sNOBKo+QcfN4$xQoeGgqHNOyaA*Y`NLhcwV>UtSG**Y|kW_wd~&c!B3#-$T7ZPDy#! z_t2>a`**5#-$>mT<6YlF=Rt5FMBVA)UEkwf-(xQaaW2=vOR2YhxekV5eG!&-eUEp2 z51oOCc-Qw7pP2Ek?}^ai2Ycws{%QLX%;eRdV|&;4lpZDWuJ7@#@2OqpUEkwf-{W21 zWA6)b4hfxpbBy!nOLTn5yS~S{UIj;Yz3Y4M4$ir{$-BPCyS}H!yS~S}zQ?=1hjxp- z>wDDoJ;ig1Tr6?g$1mj57>U$)e>p$c9g&arL~t>nrE&TLw?)xyNwV#FdNz?yz9)`e zJ%B${MVHCq_N0`(2-m)mKrrr>LNJ6R<0yvkHdHm>&b3JKX9MbRt*m{&hd&y3^wDVV z@3U$#J?Ru*%MC{Un{zrAia`0J^E&>}h!q3baa^)Jkn6EWw&+HCx%{G?ziwmV!|6;s zo2A>HoFLrh9JlAX@G6CBZ9jVBM0%&YywhFY=`Q}NoA+_HGhFZJo$m5J&enksk$E3y zv!8AAKF+4k>!0QvywhFY=`MTiFdbIGWzlwJR=B_3`#76-x{JR@;GOPL-){3xcX=OY z!#0QdUK;sMzU&BJeDgle=6#&43Lg%Uv*O;z+4#bGxp$(GZe~PZ!Cx_YA7{hPCJvB$ zA7|sw@zEJA+?WsJ@IKCl`S=(gN3)+AAd~Sv&Za&EMjwC~_ak5w>3mnp`#4+4u}5?@ z{^X+faW;Ij&Ap`1`#2kY#od0X#9qMXeVolZ-Q|6pjlS+hUsLlw&gOlb&HFf;_i;Aw z<7{+J$NMzz^Vtg1VL?5Ln+}}jkHofJ?2hOwbmc-F7%9noLfgj>K$CQ0^kMZNj zOgRedJj6r#yA406E6IB@ZT$E#X1~Sw2M_U4-u3vAd_Na3e*BnK6y`im`Far`e81^5 ze*AEHhmYjZGk_n5?^f{L3hcN9N9a7 z$u{`0d^Zz)0h0a_zbRj`=Uwc`X1M%D8I}BR!Jv(H~Bcyxhv3&mz7=0d= literal 0 HcmV?d00001 diff --git a/lib/sigar-bin/libsigar-sparc64-solaris.so b/lib/sigar-bin/libsigar-sparc64-solaris.so new file mode 100644 index 0000000000000000000000000000000000000000..6c4fe809c5330d272b434adad2ef05729194842a GIT binary patch literal 261896 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 z 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

    false
    trace"true" if repair is traced.false
    jobThreadsNumber of threads to use to run repair job.1
    (full())'."); + validateNotFullIndex(target); + validateIsValuesIndexIfTargetColumnNotCollection(cd, target); + validateTargetColumnIsMapIfIndexInvolvesKeys(isMap, target); } if (cd.getIndexType() != null) { - boolean previousIsKeys = cd.hasIndexOption(SecondaryIndex.INDEX_KEYS_OPTION_NAME); - if (isMap && target.isCollectionKeys != previousIsKeys) + IndexTarget.TargetType prevType = IndexTarget.TargetType.fromColumnDefinition(cd); + if (isMap && target.type != prevType) { - String msg = "Cannot create index on %s %s, an index on %s %s already exists and indexing " - + "a map on both keys and values at the same time is not currently supported"; + String msg = "Cannot create index on %s(%s): an index on %s(%s) already exists and indexing " + + "a map on more than one dimension at the same time is not currently supported"; throw new InvalidRequestException(String.format(msg, - target.column, target.isCollectionKeys ? "keys" : "values", - target.column, previousIsKeys ? "keys" : "values")); + target.type, target.column, + prevType, target.column)); } if (ifNotExists) @@ -135,6 +129,35 @@ else if (isFrozenCollection) throw new InvalidRequestException(String.format("Cannot create secondary index on partition key column %s", target.column)); } + private void validateForFrozenCollection(IndexTarget target) throws InvalidRequestException + { + if (target.type != IndexTarget.TargetType.FULL) + throw new InvalidRequestException(String.format("Cannot create index on %s of frozen column %s", target.type, target.column)); + } + + private void validateNotFullIndex(IndexTarget target) throws InvalidRequestException + { + if (target.type == IndexTarget.TargetType.FULL) + throw new InvalidRequestException("full() indexes can only be created on frozen collections"); + } + + private void validateIsValuesIndexIfTargetColumnNotCollection(ColumnDefinition cd, IndexTarget target) throws InvalidRequestException + { + if (!cd.type.isCollection() && target.type != IndexTarget.TargetType.VALUES) + throw new InvalidRequestException(String.format("Cannot create index on %s of column %s; only non-frozen collections support %s indexes", + target.type, target.column, target.type)); + } + + private void validateTargetColumnIsMapIfIndexInvolvesKeys(boolean isMap, IndexTarget target) throws InvalidRequestException + { + if (target.type == IndexTarget.TargetType.KEYS || target.type == IndexTarget.TargetType.KEYS_AND_VALUES) + { + if (!isMap) + throw new InvalidRequestException(String.format("Cannot create index on %s of column %s with non-map type", + target.type, target.column)); + } + } + public boolean announceMigration(boolean isLocalOnly) throws RequestValidationException { CFMetaData cfm = Schema.instance.getCFMetaData(keyspace(), columnFamily()).copy(); @@ -156,8 +179,7 @@ else if (cfm.comparator.isCompound()) // to also index map keys, so we record that this is the values we index to make our // lives easier then. if (cd.type.isCollection() && cd.type.isMultiCell()) - options = ImmutableMap.of(target.isCollectionKeys ? SecondaryIndex.INDEX_KEYS_OPTION_NAME - : SecondaryIndex.INDEX_VALUES_OPTION_NAME, ""); + options = ImmutableMap.of(target.type.indexOption(), ""); cd.setIndexType(IndexType.COMPOSITES, options); } else diff --git a/src/java/org/apache/cassandra/cql3/statements/IndexTarget.java b/src/java/org/apache/cassandra/cql3/statements/IndexTarget.java index eeee90757be9..d6023882bd03 100644 --- a/src/java/org/apache/cassandra/cql3/statements/IndexTarget.java +++ b/src/java/org/apache/cassandra/cql3/statements/IndexTarget.java @@ -17,53 +17,98 @@ */ package org.apache.cassandra.cql3.statements; +import java.util.Map; + import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.ColumnDefinition; import org.apache.cassandra.cql3.ColumnIdentifier; +import org.apache.cassandra.db.index.SecondaryIndex; public class IndexTarget { public final ColumnIdentifier column; - public final boolean isCollectionKeys; - public final boolean isFullCollection; + public final TargetType type; - private IndexTarget(ColumnIdentifier column, boolean isCollectionKeys, boolean isFullCollection) + private IndexTarget(ColumnIdentifier column, TargetType type) { this.column = column; - this.isCollectionKeys = isCollectionKeys; - this.isFullCollection = isFullCollection; + this.type = type; } public static class Raw { private final ColumnIdentifier.Raw column; - private final boolean isCollectionKeys; - private final boolean isFullCollection; + private final TargetType type; - private Raw(ColumnIdentifier.Raw column, boolean isCollectionKeys, boolean isFullCollection) + private Raw(ColumnIdentifier.Raw column, TargetType type) { this.column = column; - this.isCollectionKeys = isCollectionKeys; - this.isFullCollection = isFullCollection; + this.type = type; } public static Raw valuesOf(ColumnIdentifier.Raw c) { - return new Raw(c, false, false); + return new Raw(c, TargetType.VALUES); } public static Raw keysOf(ColumnIdentifier.Raw c) { - return new Raw(c, true, false); + return new Raw(c, TargetType.KEYS); + } + + public static Raw keysAndValuesOf(ColumnIdentifier.Raw c) + { + return new Raw(c, TargetType.KEYS_AND_VALUES); } public static Raw fullCollection(ColumnIdentifier.Raw c) { - return new Raw(c, false, true); + return new Raw(c, TargetType.FULL); } public IndexTarget prepare(CFMetaData cfm) { - return new IndexTarget(column.prepare(cfm), isCollectionKeys, isFullCollection); + return new IndexTarget(column.prepare(cfm), type); + } + } + + public static enum TargetType + { + VALUES, KEYS, KEYS_AND_VALUES, FULL; + + public String toString() + { + switch (this) + { + case KEYS: return "keys"; + case KEYS_AND_VALUES: return "entries"; + case FULL: return "full"; + default: return "values"; + } + } + + public String indexOption() + { + switch (this) + { + case KEYS: return SecondaryIndex.INDEX_KEYS_OPTION_NAME; + case KEYS_AND_VALUES: return SecondaryIndex.INDEX_ENTRIES_OPTION_NAME; + case VALUES: return SecondaryIndex.INDEX_VALUES_OPTION_NAME; + default: throw new AssertionError(); + } + } + + public static TargetType fromColumnDefinition(ColumnDefinition cd) + { + Map options = cd.getIndexOptions(); + if (options.containsKey(SecondaryIndex.INDEX_KEYS_OPTION_NAME)) + return KEYS; + else if (options.containsKey(SecondaryIndex.INDEX_ENTRIES_OPTION_NAME)) + return KEYS_AND_VALUES; + else if (cd.type.isCollection() && !cd.type.isMultiCell()) + return FULL; + else + return VALUES; } } } diff --git a/src/java/org/apache/cassandra/db/filter/ExtendedFilter.java b/src/java/org/apache/cassandra/db/filter/ExtendedFilter.java index 6f2760a85f31..2ae22b8f26c6 100644 --- a/src/java/org/apache/cassandra/db/filter/ExtendedFilter.java +++ b/src/java/org/apache/cassandra/db/filter/ExtendedFilter.java @@ -403,23 +403,21 @@ private static boolean collectionSatisfies(ColumnDefinition def, ColumnFamily da return false; } - switch (type.kind) + assert type.kind == CollectionType.Kind.MAP; + if (expr.isContainsKey()) + return data.getColumn(data.getComparator().create(prefix, def, expr.value)) != null; + + Iterator iter = data.iterator(new ColumnSlice[]{ data.getComparator().create(prefix, def).slice() }); + ByteBuffer key = CompositeType.extractComponent(expr.value, 0); + ByteBuffer value = CompositeType.extractComponent(expr.value, 1); + while (iter.hasNext()) { - case LIST: - assert collectionElement != null; - return type.valueComparator().compare(data.getColumn(data.getComparator().create(prefix, def, collectionElement)).value(), expr.value) == 0; - case SET: - return data.getColumn(data.getComparator().create(prefix, def, expr.value)) != null; - case MAP: - if (expr.isContainsKey()) - { - return data.getColumn(data.getComparator().create(prefix, def, expr.value)) != null; - } - - assert collectionElement != null; - return type.valueComparator().compare(data.getColumn(data.getComparator().create(prefix, def, collectionElement)).value(), expr.value) == 0; + Cell next = iter.next(); + if (type.nameComparator().compare(next.name().collectionElement(), key) == 0 && + type.valueComparator().compare(next.value(), value) == 0) + return true; } - throw new AssertionError(); + return false; } private ByteBuffer extractDataValue(ColumnDefinition def, ByteBuffer rowKey, ColumnFamily data, Composite prefix) diff --git a/src/java/org/apache/cassandra/db/index/SecondaryIndex.java b/src/java/org/apache/cassandra/db/index/SecondaryIndex.java index 2df7f91c546c..c1036a6d0685 100644 --- a/src/java/org/apache/cassandra/db/index/SecondaryIndex.java +++ b/src/java/org/apache/cassandra/db/index/SecondaryIndex.java @@ -75,6 +75,11 @@ public abstract class SecondaryIndex */ public static final String INDEX_VALUES_OPTION_NAME = "index_values"; + /** + * The name of the option used to specify that the index is on the collection (map) entries. + */ + public static final String INDEX_ENTRIES_OPTION_NAME = "index_keys_and_values"; + public static final AbstractType keyComparator = StorageService.getPartitioner().preservesOrder() ? BytesType.instance : new LocalByPartionerType(StorageService.getPartitioner()); diff --git a/src/java/org/apache/cassandra/db/index/composites/CompositesIndex.java b/src/java/org/apache/cassandra/db/index/composites/CompositesIndex.java index ec965fd85b94..e88d45656067 100644 --- a/src/java/org/apache/cassandra/db/index/composites/CompositesIndex.java +++ b/src/java/org/apache/cassandra/db/index/composites/CompositesIndex.java @@ -67,9 +67,12 @@ public static CompositesIndex create(ColumnDefinition cfDef) case SET: return new CompositesIndexOnCollectionKey(); case MAP: - return cfDef.hasIndexOption(SecondaryIndex.INDEX_KEYS_OPTION_NAME) - ? new CompositesIndexOnCollectionKey() - : new CompositesIndexOnCollectionValue(); + if (cfDef.hasIndexOption(SecondaryIndex.INDEX_KEYS_OPTION_NAME)) + return new CompositesIndexOnCollectionKey(); + else if (cfDef.hasIndexOption(SecondaryIndex.INDEX_ENTRIES_OPTION_NAME)) + return new CompositesIndexOnCollectionKeyAndValue(); + else + return new CompositesIndexOnCollectionValue(); } } @@ -99,9 +102,12 @@ public static CellNameType getIndexComparator(CFMetaData baseMetadata, ColumnDef case SET: return CompositesIndexOnCollectionKey.buildIndexComparator(baseMetadata, cfDef); case MAP: - return cfDef.hasIndexOption(SecondaryIndex.INDEX_KEYS_OPTION_NAME) - ? CompositesIndexOnCollectionKey.buildIndexComparator(baseMetadata, cfDef) - : CompositesIndexOnCollectionValue.buildIndexComparator(baseMetadata, cfDef); + if (cfDef.hasIndexOption(SecondaryIndex.INDEX_KEYS_OPTION_NAME)) + return CompositesIndexOnCollectionKey.buildIndexComparator(baseMetadata, cfDef); + else if (cfDef.hasIndexOption(SecondaryIndex.INDEX_ENTRIES_OPTION_NAME)) + return CompositesIndexOnCollectionKeyAndValue.buildIndexComparator(baseMetadata, cfDef); + else + return CompositesIndexOnCollectionValue.buildIndexComparator(baseMetadata, cfDef); } } @@ -162,6 +168,7 @@ public void validateOptions() throws ConfigurationException { options.remove(SecondaryIndex.INDEX_VALUES_OPTION_NAME); options.remove(SecondaryIndex.INDEX_KEYS_OPTION_NAME); + options.remove(SecondaryIndex.INDEX_ENTRIES_OPTION_NAME); } if (!options.isEmpty()) diff --git a/src/java/org/apache/cassandra/db/index/composites/CompositesIndexIncludingCollectionKey.java b/src/java/org/apache/cassandra/db/index/composites/CompositesIndexIncludingCollectionKey.java new file mode 100644 index 000000000000..402ea0575709 --- /dev/null +++ b/src/java/org/apache/cassandra/db/index/composites/CompositesIndexIncludingCollectionKey.java @@ -0,0 +1,89 @@ +/* + * 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.db.index.composites; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.List; + +import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.ColumnDefinition; +import org.apache.cassandra.db.*; +import org.apache.cassandra.db.composites.CBuilder; +import org.apache.cassandra.db.composites.CellName; +import org.apache.cassandra.db.composites.CellNameType; +import org.apache.cassandra.db.composites.Composite; +import org.apache.cassandra.db.composites.CompoundDenseCellNameType; +import org.apache.cassandra.db.index.SecondaryIndex; +import org.apache.cassandra.db.marshal.*; + +/** + * Common superclass for indexes that capture collection keys, including + * indexes on such keys themselves. + * + * A cell indexed by this index will have the general form: + * ck_0 ... ck_n c_name [col_elt] : v + * where ck_i are the cluster keys, c_name the CQL3 column name, col_elt the + * collection element that we want to index (which may or may not be there depending + * on whether c_name is the collection we're indexing), and v the cell value. + * + * Such a cell is indexed if c_name is the indexed collection (in which case we are guaranteed to have + * col_elt). The index entry can be viewed in the following way: + * - the row key is determined by subclasses of this type. + * - the cell name will be 'rk ck_0 ... ck_n' where rk is the row key of the initial cell. + */ +public abstract class CompositesIndexIncludingCollectionKey extends CompositesIndex +{ + public static CellNameType buildIndexComparator(CFMetaData baseMetadata, ColumnDefinition columnDef) + { + int count = 1 + baseMetadata.clusteringColumns().size(); // row key + clustering prefix + List> types = new ArrayList>(count); + types.add(SecondaryIndex.keyComparator); + for (int i = 0; i < count - 1; i++) + types.add(baseMetadata.comparator.subtype(i)); + return new CompoundDenseCellNameType(types); + } + + protected Composite makeIndexColumnPrefix(ByteBuffer rowKey, Composite cellName) + { + int count = 1 + baseCfs.metadata.clusteringColumns().size(); + CBuilder builder = getIndexComparator().builder(); + builder.add(rowKey); + for (int i = 0; i < Math.min(cellName.size(), count - 1); i++) + builder.add(cellName.get(i)); + return builder.build(); + } + + public IndexedEntry decodeEntry(DecoratedKey indexedValue, Cell indexEntry) + { + int count = 1 + baseCfs.metadata.clusteringColumns().size(); + CBuilder builder = baseCfs.getComparator().builder(); + for (int i = 0; i < count - 1; i++) + builder.add(indexEntry.name().get(i + 1)); + return new IndexedEntry(indexedValue, indexEntry.name(), indexEntry.timestamp(), indexEntry.name().get(0), builder.build()); + } + + @Override + public boolean indexes(CellName name) + { + // We index if the CQL3 column name is the one of the collection we index + AbstractType comp = baseCfs.metadata.getColumnDefinitionComparator(columnDef); + return name.size() > columnDef.position() + && comp.compare(name.get(columnDef.position()), columnDef.name.bytes) == 0; + } +} diff --git a/src/java/org/apache/cassandra/db/index/composites/CompositesIndexOnCollectionKey.java b/src/java/org/apache/cassandra/db/index/composites/CompositesIndexOnCollectionKey.java index 81982bb9cd93..1e40710b6868 100644 --- a/src/java/org/apache/cassandra/db/index/composites/CompositesIndexOnCollectionKey.java +++ b/src/java/org/apache/cassandra/db/index/composites/CompositesIndexOnCollectionKey.java @@ -18,47 +18,20 @@ package org.apache.cassandra.db.index.composites; import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.List; -import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.config.ColumnDefinition; import org.apache.cassandra.cql3.Operator; import org.apache.cassandra.db.*; -import org.apache.cassandra.db.composites.CBuilder; import org.apache.cassandra.db.composites.CellName; -import org.apache.cassandra.db.composites.CellNameType; -import org.apache.cassandra.db.composites.Composite; -import org.apache.cassandra.db.composites.CompoundDenseCellNameType; -import org.apache.cassandra.db.index.SecondaryIndex; import org.apache.cassandra.db.marshal.*; /** * Index on the collection element of the cell name of a collection. * - * A cell indexed by this index will have the general form: - * ck_0 ... ck_n c_name [col_elt] : v - * where ck_i are the cluster keys, c_name the CQL3 column name, col_elt the - * collection element that we want to index (which may or may not be there depending - * on whether c_name is the collection we're indexing) and v the cell value. - * - * Such a cell is indexed if c_name is the indexed collection (in which case we are guaranteed to have - * col_elt). The index entry will be: - * - row key will be col_elt value (getIndexedValue()). - * - cell name will be 'rk ck_0 ... ck_n' where rk is the row key of the initial cell. + * The row keys for this index are given by the collection element for + * indexed columns. */ -public class CompositesIndexOnCollectionKey extends CompositesIndex +public class CompositesIndexOnCollectionKey extends CompositesIndexIncludingCollectionKey { - public static CellNameType buildIndexComparator(CFMetaData baseMetadata, ColumnDefinition columnDef) - { - int count = 1 + baseMetadata.clusteringColumns().size(); // row key + clustering prefix - List> types = new ArrayList>(count); - types.add(SecondaryIndex.keyComparator); - for (int i = 0; i < count - 1; i++) - types.add(baseMetadata.comparator.subtype(i)); - return new CompoundDenseCellNameType(types); - } - @Override protected AbstractType getIndexKeyComparator() { @@ -70,25 +43,6 @@ protected ByteBuffer getIndexedValue(ByteBuffer rowKey, Cell cell) return cell.name().get(columnDef.position() + 1); } - protected Composite makeIndexColumnPrefix(ByteBuffer rowKey, Composite cellName) - { - int count = 1 + baseCfs.metadata.clusteringColumns().size(); - CBuilder builder = getIndexComparator().builder(); - builder.add(rowKey); - for (int i = 0; i < Math.min(cellName.size(), count - 1); i++) - builder.add(cellName.get(i)); - return builder.build(); - } - - public IndexedEntry decodeEntry(DecoratedKey indexedValue, Cell indexEntry) - { - int count = 1 + baseCfs.metadata.clusteringColumns().size(); - CBuilder builder = baseCfs.getComparator().builder(); - for (int i = 0; i < count - 1; i++) - builder.add(indexEntry.name().get(i + 1)); - return new IndexedEntry(indexedValue, indexEntry.name(), indexEntry.timestamp(), indexEntry.name().get(0), builder.build()); - } - @Override public boolean supportsOperator(Operator operator) { @@ -96,15 +50,6 @@ public boolean supportsOperator(Operator operator) operator == Operator.CONTAINS && columnDef.type instanceof SetType; } - @Override - public boolean indexes(CellName name) - { - // We index if the CQL3 column name is the one of the collection we index - AbstractType comp = baseCfs.metadata.getColumnDefinitionComparator(columnDef); - return name.size() > columnDef.position() - && comp.compare(name.get(columnDef.position()), columnDef.name.bytes) == 0; - } - public boolean isStale(IndexedEntry entry, ColumnFamily data, long now) { CellName name = data.getComparator().create(entry.indexedEntryPrefix, columnDef, entry.indexValue.getKey()); diff --git a/src/java/org/apache/cassandra/db/index/composites/CompositesIndexOnCollectionKeyAndValue.java b/src/java/org/apache/cassandra/db/index/composites/CompositesIndexOnCollectionKeyAndValue.java new file mode 100644 index 000000000000..e18ea4eef850 --- /dev/null +++ b/src/java/org/apache/cassandra/db/index/composites/CompositesIndexOnCollectionKeyAndValue.java @@ -0,0 +1,87 @@ +/* + * 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.db.index.composites; + +import java.nio.ByteBuffer; + +import org.apache.cassandra.db.*; +import org.apache.cassandra.db.composites.CellName; +import org.apache.cassandra.db.marshal.*; + +/** + * Index on the element and value of cells participating in a collection. + * + * The row keys for this index are a composite of the collection element + * and value of indexed columns. + */ +public class CompositesIndexOnCollectionKeyAndValue extends CompositesIndexIncludingCollectionKey +{ + @Override + protected AbstractType getIndexKeyComparator() + { + CollectionType colType = (CollectionType)columnDef.type; + return CompositeType.getInstance(colType.nameComparator(), colType.valueComparator()); + } + + @Override + protected ByteBuffer getIndexedValue(ByteBuffer rowKey, Cell cell) + { + final ByteBuffer key = cell.name().get(columnDef.position() + 1); + final ByteBuffer value = cell.value(); + return CompositeType.build(key, value); + } + + @Override + public boolean isStale(IndexedEntry entry, ColumnFamily data, long now) + { + Cell cell = extractTargetCell(entry, data); + if (cellIsDead(cell, now)) + return true; + ByteBuffer indexCollectionValue = extractCollectionValue(entry); + ByteBuffer targetCollectionValue = cell.value(); + AbstractType valueComparator = ((CollectionType)columnDef.type).valueComparator(); + return valueComparator.compare(indexCollectionValue, targetCollectionValue) != 0; + } + + private Cell extractTargetCell(IndexedEntry entry, ColumnFamily data) + { + ByteBuffer collectionKey = extractCollectionKey(entry); + CellName name = data.getComparator().create(entry.indexedEntryPrefix, columnDef, collectionKey); + return data.getColumn(name); + } + + private ByteBuffer extractCollectionKey(IndexedEntry entry) + { + return extractIndexKeyComponent(entry, 0); + } + + private ByteBuffer extractIndexKeyComponent(IndexedEntry entry, int component) + { + return ((CompositeType)getIndexKeyComparator()).extractComponent(entry.indexValue.getKey(), component); + } + + private ByteBuffer extractCollectionValue(IndexedEntry entry) + { + return extractIndexKeyComponent(entry, 1); + } + + private boolean cellIsDead(Cell cell, long now) + { + return cell == null || !cell.isLive(now); + } +} diff --git a/test/unit/org/apache/cassandra/cql3/SecondaryIndexOnMapEntriesTest.java b/test/unit/org/apache/cassandra/cql3/SecondaryIndexOnMapEntriesTest.java new file mode 100644 index 000000000000..fa40e0a19037 --- /dev/null +++ b/test/unit/org/apache/cassandra/cql3/SecondaryIndexOnMapEntriesTest.java @@ -0,0 +1,338 @@ +/* + * 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.cql3; + +import org.apache.cassandra.exceptions.InvalidRequestException; +import org.apache.commons.lang3.StringUtils; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +public class SecondaryIndexOnMapEntriesTest extends CQLTester +{ + @Test + public void testShouldNotCreateIndexOnFrozenMaps() throws Throwable + { + createTable("CREATE TABLE %s (k TEXT PRIMARY KEY, v FROZEN>)"); + assertIndexInvalidForColumn("v"); + } + + @Test + public void testShouldNotCreateIndexOnNonMapTypes() throws Throwable + { + createTable("CREATE TABLE %s (k TEXT PRIMARY KEY, i INT, t TEXT, b BLOB, s SET, l LIST, tu TUPLE)"); + assertIndexInvalidForColumn("i"); + assertIndexInvalidForColumn("t"); + assertIndexInvalidForColumn("b"); + assertIndexInvalidForColumn("s"); + assertIndexInvalidForColumn("l"); + assertIndexInvalidForColumn("tu"); + } + + @Test + public void testShouldValidateMapKeyAndValueTypes() throws Throwable + { + createSimpleTableAndIndex(); + + String query = "SELECT * FROM %s WHERE v[?] = ?"; + Object validKey = "valid key"; + Object invalidKey = 31415; + Object validValue = 31415; + Object invalidValue = "invalid value"; + assertInvalid(query, invalidKey, invalidValue); + assertInvalid(query, invalidKey, validValue); + assertInvalid(query, validKey, invalidValue); + assertReturnsNoRows(query, validKey, validValue); + } + + @Test + public void testShouldFindRowsMatchingSingleEqualityRestriction() throws Throwable + { + createSimpleTableAndIndex(); + Object[] foo = insertIntoSimpleTable("foo", map("a", 1, + "c", 3)); + Object[] bar = insertIntoSimpleTable("bar", map("a", 1, + "b", 2)); + Object[] baz = insertIntoSimpleTable("baz", map("b", 2, + "c", 5, + "d", 4)); + Object[] qux = insertIntoSimpleTable("qux", map("b", 2, + "d", 4)); + + assertRowsForConditions(entry("a", 1), bar, foo); + assertRowsForConditions(entry("b", 2), bar, baz, qux); + assertRowsForConditions(entry("c", 3), foo); + assertRowsForConditions(entry("c", 5), baz); + assertRowsForConditions(entry("d", 4), baz, qux); + } + + @Test + public void testRequireFilteringDirectiveIfMultipleRestrictionsSpecified() throws Throwable + { + createSimpleTableAndIndex(); + String baseQuery = "SELECT * FROM %s WHERE v['foo'] = 31415 AND v['baz'] = 31416"; + assertInvalid(baseQuery); + assertReturnsNoRows(baseQuery + " ALLOW FILTERING"); + } + + @Test + public void testShouldFindRowsMatchingMultipleEqualityRestrictions() throws Throwable + { + createSimpleTableAndIndex(); + + Object[] foo = insertIntoSimpleTable("foo", map("k1", 1)); + Object[] bar = insertIntoSimpleTable("bar", map("k1", 1, + "k2", 2)); + Object[] baz = insertIntoSimpleTable("baz", map("k2", 2, + "k3", 3)); + Object[] qux = insertIntoSimpleTable("qux", map("k2", 2, + "k3", 3, + "k4", 4)); + + assertRowsForConditions(entry("k1", 1), + bar, foo); + assertRowsForConditions(entry("k1", 1).entry("k2", 2), + bar); + assertNoRowsForConditions(entry("k1", 1).entry("k2", 2).entry("k3", 3)); + assertRowsForConditions(entry("k2", 2).entry("k3", 3), + baz, qux); + assertRowsForConditions(entry("k2", 2).entry("k3", 3).entry("k4", 4), + qux); + assertRowsForConditions(entry("k3", 3).entry("k4", 4), + qux); + assertNoRowsForConditions(entry("k3", 3).entry("k4", 4).entry("k5", 5)); + } + + @Test + public void testShouldFindRowsMatchingEqualityAndContainsRestrictions() throws Throwable + { + createSimpleTableAndIndex(); + + Object[] foo = insertIntoSimpleTable("foo", map("common", 31415, + "k1", 1, + "k2", 2, + "k3", 3)); + Object[] bar = insertIntoSimpleTable("bar", map("common", 31415, + "k3", 3, + "k4", 4, + "k5", 5)); + Object[] baz = insertIntoSimpleTable("baz", map("common", 31415, + "k5", 5, + "k6", 6, + "k7", 7)); + + assertRowsForConditions(entry("common", 31415), + bar, baz, foo); + assertRowsForConditions(entry("common", 31415).key("k1"), + foo); + assertRowsForConditions(entry("common", 31415).key("k2"), + foo); + assertRowsForConditions(entry("common", 31415).key("k3"), + bar, foo); + assertRowsForConditions(entry("common", 31415).key("k3").value(2), + foo); + assertRowsForConditions(entry("common", 31415).key("k3").value(3), + bar, foo); + assertRowsForConditions(entry("common", 31415).key("k3").value(4), + bar); + assertRowsForConditions(entry("common", 31415).key("k3").key("k5"), + bar); + assertRowsForConditions(entry("common", 31415).key("k5"), + bar, baz); + assertRowsForConditions(entry("common", 31415).key("k5").value(4), + bar); + assertRowsForConditions(entry("common", 31415).key("k5").value(5), + bar, baz); + assertRowsForConditions(entry("common", 31415).key("k5").value(6), + baz); + assertNoRowsForConditions(entry("common", 31415).key("k5").value(8)); + } + + @Test + public void testShouldNotAcceptUnsupportedRelationsOnEntries() throws Throwable + { + createSimpleTableAndIndex(); + assertInvalidRelation("< 31415"); + assertInvalidRelation("<= 31415"); + assertInvalidRelation("> 31415"); + assertInvalidRelation(">= 31415"); + assertInvalidRelation("IN (31415, 31416, 31417)"); + assertInvalidRelation("CONTAINS 31415"); + assertInvalidRelation("CONTAINS KEY 'foo'"); + } + + @Test + public void testShouldRecognizeAlteredOrDeletedMapEntries() throws Throwable + { + createSimpleTableAndIndex(); + Object[] foo = insertIntoSimpleTable("foo", map("common", 31415, + "target", 8192)); + Object[] bar = insertIntoSimpleTable("bar", map("common", 31415, + "target", 8192)); + Object[] baz = insertIntoSimpleTable("baz", map("common", 31415, + "target", 8192)); + + assertRowsForConditions(entry("target", 8192), + bar, baz, foo); + baz = updateMapInSimpleTable(baz, "target", 4096); + assertRowsForConditions(entry("target", 8192), + bar, foo); + bar = updateMapInSimpleTable(bar, "target", null); + assertRowsForConditions(entry("target", 8192), + foo); + execute("DELETE FROM %s WHERE k = 'foo'"); + assertNoRowsForConditions(entry("target", 8192)); + assertRowsForConditions(entry("common", 31415), + bar, baz); + assertRowsForConditions(entry("target", 4096), + baz); + } + + @Test + public void testShouldRejectQueriesForNullEntries() throws Throwable + { + createSimpleTableAndIndex(); + assertInvalid("SELECT * FROM %s WHERE v['somekey'] = null"); + } + + @Test + public void testShouldTreatQueriesAgainstFrozenMapIndexesAsInvalid() throws Throwable + { + createTable("CREATE TABLE %s (k TEXT PRIMARY KEY, v FROZEN>)"); + createIndex("CREATE INDEX ON %s(FULL(V))"); + + try + { + execute("SELECT * FROM %s WHERE v['somekey'] = 'somevalue'"); + fail("Expected index query to fail"); + } + catch (InvalidRequestException e) + { + String expectedMessage = "Map-entry equality predicates on frozen map column v are not supported"; + assertTrue("Expected error message to contain '" + expectedMessage + "' but got '" + + e.getMessage() + "'", e.getMessage().contains(expectedMessage)); + } + } + + private void assertIndexInvalidForColumn(String colname) throws Throwable + { + String query = String.format("CREATE INDEX ON %%s(ENTRIES(%s))", colname); + assertInvalid(query); + } + + private void assertReturnsNoRows(String query, Object... params) throws Throwable + { + assertRows(execute(query, params)); + } + + private void createSimpleTableAndIndex() throws Throwable + { + createTable("CREATE TABLE %s (k TEXT PRIMARY KEY, v MAP)"); + createIndex("CREATE INDEX ON %s(ENTRIES(v))"); + } + + private Object[] insertIntoSimpleTable(String key, Object value) throws Throwable + { + String query = "INSERT INTO %s (k, v) VALUES (?, ?)"; + execute(query, key, value); + return row(key, value); + } + + private void assertRowsForConditions(IndexWhereClause whereClause, Object[]... rows) throws Throwable + { + assertRows(execute("SELECT * FROM %s WHERE " + whereClause.text(), whereClause.params()), rows); + } + + private void assertNoRowsForConditions(IndexWhereClause whereClause) throws Throwable + { + assertRowsForConditions(whereClause); + } + + private void assertInvalidRelation(String rel) throws Throwable + { + String query = "SELECT * FROM %s WHERE v " + rel; + assertInvalid(query); + } + + private Object[] updateMapInSimpleTable(Object[] row, String mapKey, Integer mapValue) throws Throwable + { + execute("UPDATE %s SET v[?] = ? WHERE k = ?", mapKey, mapValue, row[0]); + UntypedResultSet rawResults = execute("SELECT * FROM %s WHERE k = ?", row[0]); + Map value = (Map)row[1]; + if (mapValue == null) + { + value.remove(mapKey); + } + else + { + value.put(mapKey, mapValue); + } + return row; + } + + private IndexWhereClause entry(Object key, Object value) + { + return (new IndexWhereClause()).entry(key, value); + } + + private static final class IndexWhereClause + { + private final List preds = new ArrayList<>(); + private final List params = new ArrayList<>(); + + public IndexWhereClause entry(Object key, Object value) + { + preds.add("v[?] = ?"); + params.add(key); + params.add(value); + return this; + } + + public IndexWhereClause key(Object key) + { + preds.add("v CONTAINS KEY ?"); + params.add(key); + return this; + } + + public IndexWhereClause value(Object value) + { + preds.add("v CONTAINS ?"); + params.add(value); + return this; + } + + public String text() + { + if (preds.size() == 1) + return preds.get(0); + return StringUtils.join(preds, " AND ") + " ALLOW FILTERING"; + } + + public Object[] params() + { + return params.toArray(); + } + } +} From 382834d4e49dbd305bb299ce911592838a5e1e3e Mon Sep 17 00:00:00 2001 From: Sylvain Lebresne Date: Fri, 19 Dec 2014 13:43:00 +0100 Subject: [PATCH 221/557] Fix build --- .../org/apache/cassandra/io/sstable/CQLSSTableWriter.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java b/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java index 1ae3293214b5..ec590f31b288 100644 --- a/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java +++ b/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java @@ -77,12 +77,6 @@ */ public class CQLSSTableWriter implements Closeable { - static - { - // The CQLSSTableWriter must always be used in client mode. - Config.setClientMode(true); - } - private final AbstractSSTableSimpleWriter writer; private final UpdateStatement insert; private final List boundNames; From c0e3f66d60a77abec11afc8464abbcc7680139a1 Mon Sep 17 00:00:00 2001 From: Aleksey Yeschenko Date: Fri, 19 Dec 2014 22:08:41 +0300 Subject: [PATCH 222/557] Bring consistency to TraceKeyspace --- .../apache/cassandra/db/SystemKeyspace.java | 3 +- .../cassandra/service/StorageService.java | 2 +- .../cassandra/tracing/TraceKeyspace.java | 65 +++++++++---------- .../apache/cassandra/tracing/TraceState.java | 2 +- .../org/apache/cassandra/tracing/Tracing.java | 5 +- 5 files changed, 37 insertions(+), 40 deletions(-) diff --git a/src/java/org/apache/cassandra/db/SystemKeyspace.java b/src/java/org/apache/cassandra/db/SystemKeyspace.java index 503dd7f0e4dc..f492c395c5b6 100644 --- a/src/java/org/apache/cassandra/db/SystemKeyspace.java +++ b/src/java/org/apache/cassandra/db/SystemKeyspace.java @@ -214,7 +214,8 @@ public final class SystemKeyspace private static CFMetaData compile(String name, String description, String schema) { - return CFMetaData.compile(String.format(schema, name), NAME).comment(description); + return CFMetaData.compile(String.format(schema, name), NAME) + .comment(description); } public static KSMetaData definition() diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index 4d176e648c15..391f8903a362 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -2641,7 +2641,7 @@ public void runMayThrow() throws Exception throw new Exception("no tracestate"); String format = "select event_id, source, activity from %s.%s where session_id = ? and event_id > ? and event_id < ?;"; - String query = String.format(format, TraceKeyspace.NAME, TraceKeyspace.EVENTS_TABLE); + String query = String.format(format, TraceKeyspace.NAME, TraceKeyspace.EVENTS); SelectStatement statement = (SelectStatement) QueryProcessor.parseStatement(query).prepare().statement; ByteBuffer sessionIdBytes = ByteBufferUtil.bytes(sessionId); diff --git a/src/java/org/apache/cassandra/tracing/TraceKeyspace.java b/src/java/org/apache/cassandra/tracing/TraceKeyspace.java index 72a7c47f98fe..8c13a81ceba0 100644 --- a/src/java/org/apache/cassandra/tracing/TraceKeyspace.java +++ b/src/java/org/apache/cassandra/tracing/TraceKeyspace.java @@ -39,13 +39,12 @@ public final class TraceKeyspace { public static final String NAME = "system_traces"; - public static final String SESSIONS_TABLE = "sessions"; - public static final String EVENTS_TABLE = "events"; + public static final String SESSIONS = "sessions"; + public static final String EVENTS = "events"; - private static final int DAY = (int) TimeUnit.DAYS.toSeconds(1); - - private static final CFMetaData SessionsTable = - compile(SESSIONS_TABLE, "tracing sessions", + private static final CFMetaData Sessions = + compile(SESSIONS, + "tracing sessions", "CREATE TABLE %s (" + "session_id uuid," + "command text," @@ -54,11 +53,11 @@ public final class TraceKeyspace + "parameters map," + "request text," + "started_at timestamp," - + "PRIMARY KEY ((session_id)))") - .defaultTimeToLive(DAY); + + "PRIMARY KEY ((session_id)))"); - private static final CFMetaData EventsTable = - compile(EVENTS_TABLE, "tracing events", + private static final CFMetaData Events = + compile(EVENTS, + "tracing events", "CREATE TABLE %s (" + "session_id uuid," + "event_id timeuuid," @@ -66,61 +65,59 @@ public final class TraceKeyspace + "source inet," + "source_elapsed int," + "thread text," - + "PRIMARY KEY ((session_id), event_id))") - .defaultTimeToLive(DAY); + + "PRIMARY KEY ((session_id), event_id))"); - private static CFMetaData compile(String table, String comment, String cql) + private static CFMetaData compile(String name, String description, String schema) { - return CFMetaData.compile(String.format(cql, table), NAME).comment(comment); + return CFMetaData.compile(String.format(schema, name), NAME) + .comment(description) + .defaultTimeToLive((int) TimeUnit.DAYS.toSeconds(1)); } public static KSMetaData definition() { - List tables = Arrays.asList(SessionsTable, EventsTable); + List tables = Arrays.asList(Sessions, Events); return new KSMetaData(NAME, SimpleStrategy.class, ImmutableMap.of("replication_factor", "2"), true, tables); } - static Mutation toStopSessionMutation(ByteBuffer sessionId, int elapsed, int ttl) + static Mutation makeStartSessionMutation(ByteBuffer sessionId, Map parameters, String request, long startedAt, String command, int ttl) { Mutation mutation = new Mutation(NAME, sessionId); - ColumnFamily cells = mutation.addOrGet(SessionsTable); + ColumnFamily cells = mutation.addOrGet(TraceKeyspace.Sessions); - ttl = ttl == DAY ? 0 : ttl; CFRowAdder adder = new CFRowAdder(cells, cells.metadata().comparator.builder().build(), FBUtilities.timestampMicros(), ttl); - adder.add("duration", elapsed); + adder.add("coordinator", FBUtilities.getBroadcastAddress()) + .add("request", request) + .add("started_at", new Date(startedAt)) + .add("command", command); + for (Map.Entry entry : parameters.entrySet()) + adder.addMapEntry("parameters", entry.getKey(), entry.getValue()); return mutation; } - static Mutation toStartSessionMutation(ByteBuffer sessionId, Map parameters, String request, long startedAt, String command, int ttl) + static Mutation makeStopSessionMutation(ByteBuffer sessionId, int elapsed, int ttl) { Mutation mutation = new Mutation(NAME, sessionId); - ColumnFamily cells = mutation.addOrGet(TraceKeyspace.SessionsTable); + ColumnFamily cells = mutation.addOrGet(Sessions); - ttl = ttl == DAY ? 0 : ttl; CFRowAdder adder = new CFRowAdder(cells, cells.metadata().comparator.builder().build(), FBUtilities.timestampMicros(), ttl); - adder.add("coordinator", FBUtilities.getBroadcastAddress()); - for (Map.Entry entry : parameters.entrySet()) - adder.addMapEntry("parameters", entry.getKey(), entry.getValue()); - adder.add("request", request); - adder.add("started_at", new Date(startedAt)); - adder.add("command", command); + adder.add("duration", elapsed); return mutation; } - static Mutation toEventMutation(ByteBuffer sessionId, String message, int elapsed, String threadName, int ttl) + static Mutation makeEventMutation(ByteBuffer sessionId, String message, int elapsed, String threadName, int ttl) { Mutation mutation = new Mutation(NAME, sessionId); - ColumnFamily cells = mutation.addOrGet(EventsTable); + ColumnFamily cells = mutation.addOrGet(Events); - ttl = ttl == DAY ? 0 : ttl; CFRowAdder adder = new CFRowAdder(cells, cells.metadata().comparator.make(UUIDGen.getTimeUUID()), FBUtilities.timestampMicros(), ttl); - adder.add("activity", message); - adder.add("source", FBUtilities.getBroadcastAddress()); + adder.add("activity", message) + .add("source", FBUtilities.getBroadcastAddress()) + .add("thread", threadName); if (elapsed >= 0) adder.add("source_elapsed", elapsed); - adder.add("thread", threadName); return mutation; } diff --git a/src/java/org/apache/cassandra/tracing/TraceState.java b/src/java/org/apache/cassandra/tracing/TraceState.java index f7d2741c5835..c67ad3eec9d2 100644 --- a/src/java/org/apache/cassandra/tracing/TraceState.java +++ b/src/java/org/apache/cassandra/tracing/TraceState.java @@ -172,7 +172,7 @@ public static void trace(final ByteBuffer sessionId, final String message, final { public void runMayThrow() { - Tracing.mutateWithCatch(TraceKeyspace.toEventMutation(sessionId, message, elapsed, threadName, ttl)); + Tracing.mutateWithCatch(TraceKeyspace.makeEventMutation(sessionId, message, elapsed, threadName, ttl)); } }); } diff --git a/src/java/org/apache/cassandra/tracing/Tracing.java b/src/java/org/apache/cassandra/tracing/Tracing.java index 5e769572519f..d0f496e12a50 100644 --- a/src/java/org/apache/cassandra/tracing/Tracing.java +++ b/src/java/org/apache/cassandra/tracing/Tracing.java @@ -53,7 +53,6 @@ public class Tracing { public static final String TRACE_HEADER = "TraceSession"; public static final String TRACE_TYPE = "TraceType"; - public static final String TRACE_TTL = "TraceTTL"; public enum TraceType { @@ -173,7 +172,7 @@ public void stopSession() { public void run() { - mutateWithCatch(TraceKeyspace.toStopSessionMutation(sessionId, elapsed, ttl)); + mutateWithCatch(TraceKeyspace.makeStopSessionMutation(sessionId, elapsed, ttl)); } }); @@ -212,7 +211,7 @@ public TraceState begin(final String request, final Map paramete { public void run() { - mutateWithCatch(TraceKeyspace.toStartSessionMutation(sessionId, parameters, request, startedAt, command, ttl)); + mutateWithCatch(TraceKeyspace.makeStartSessionMutation(sessionId, parameters, request, startedAt, command, ttl)); } }); From bf599fb5b062cbcc652da78b7d699e7a01b949ad Mon Sep 17 00:00:00 2001 From: Aleksey Yeschenko Date: Fri, 19 Dec 2014 22:19:29 +0300 Subject: [PATCH 223/557] More Tracing OCD --- src/java/org/apache/cassandra/config/Config.java | 6 ++++-- src/java/org/apache/cassandra/tracing/TraceKeyspace.java | 9 ++------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/java/org/apache/cassandra/config/Config.java b/src/java/org/apache/cassandra/config/Config.java index 8c3021d42804..52a8073b19d9 100644 --- a/src/java/org/apache/cassandra/config/Config.java +++ b/src/java/org/apache/cassandra/config/Config.java @@ -19,8 +19,10 @@ import java.io.IOException; import java.io.StringReader; +import java.sql.Time; import java.util.List; import java.util.Set; +import java.util.concurrent.TimeUnit; import com.google.common.collect.Sets; import org.supercsv.io.CsvListReader; @@ -215,8 +217,8 @@ public class Config .surroundingSpacesNeedQuotes(true).build(); // TTL for different types of trace events. - public Integer tracetype_query_ttl = 60 * 60 * 24; - public Integer tracetype_repair_ttl = 60 * 60 * 24 * 7; + public int tracetype_query_ttl = (int) TimeUnit.DAYS.toSeconds(1); + public int tracetype_repair_ttl = (int) TimeUnit.DAYS.toSeconds(7); public static boolean getOutboundBindAny() { diff --git a/src/java/org/apache/cassandra/tracing/TraceKeyspace.java b/src/java/org/apache/cassandra/tracing/TraceKeyspace.java index 8c13a81ceba0..392eb421e048 100644 --- a/src/java/org/apache/cassandra/tracing/TraceKeyspace.java +++ b/src/java/org/apache/cassandra/tracing/TraceKeyspace.java @@ -18,11 +18,7 @@ package org.apache.cassandra.tracing; import java.nio.ByteBuffer; -import java.util.Arrays; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; +import java.util.*; import com.google.common.collect.ImmutableMap; @@ -70,8 +66,7 @@ public final class TraceKeyspace private static CFMetaData compile(String name, String description, String schema) { return CFMetaData.compile(String.format(schema, name), NAME) - .comment(description) - .defaultTimeToLive((int) TimeUnit.DAYS.toSeconds(1)); + .comment(description); } public static KSMetaData definition() From b5a232b04eb61fef4d722dae67147f686e07b503 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Thu, 25 Dec 2014 15:30:33 -0500 Subject: [PATCH 224/557] truth in advertising define parm types based on what is actually needed for the method to function --- src/java/org/apache/cassandra/cql3/Cql.g | 6 +++--- .../apache/cassandra/cql3/statements/GrantStatement.java | 4 ++-- .../cassandra/cql3/statements/ListPermissionsStatement.java | 4 ++-- .../cql3/statements/PermissionAlteringStatement.java | 4 ++-- .../apache/cassandra/cql3/statements/RevokeStatement.java | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/java/org/apache/cassandra/cql3/Cql.g b/src/java/org/apache/cassandra/cql3/Cql.g index 2a6e6d02c32d..cfe274eeb7d3 100644 --- a/src/java/org/apache/cassandra/cql3/Cql.g +++ b/src/java/org/apache/cassandra/cql3/Cql.g @@ -810,7 +810,7 @@ grantStatement returns [GrantStatement stmt] resource K_TO username - { $stmt = new GrantStatement($permissionOrAll.perms, $resource.res, $username.text); } + { $stmt = new GrantStatement($permissionOrAll.perms, (DataResource) $resource.res, $username.text); } ; /** @@ -823,7 +823,7 @@ revokeStatement returns [RevokeStatement stmt] resource K_FROM username - { $stmt = new RevokeStatement($permissionOrAll.perms, $resource.res, $username.text); } + { $stmt = new RevokeStatement($permissionOrAll.perms, (DataResource) $resource.res, $username.text); } ; listPermissionsStatement returns [ListPermissionsStatement stmt] @@ -837,7 +837,7 @@ listPermissionsStatement returns [ListPermissionsStatement stmt] ( K_ON resource { resource = $resource.res; } )? ( K_OF username { username = $username.text; } )? ( K_NORECURSIVE { recursive = false; } )? - { $stmt = new ListPermissionsStatement($permissionOrAll.perms, resource, username, recursive); } + { $stmt = new ListPermissionsStatement($permissionOrAll.perms, (DataResource) resource, username, recursive); } ; permission returns [Permission perm] diff --git a/src/java/org/apache/cassandra/cql3/statements/GrantStatement.java b/src/java/org/apache/cassandra/cql3/statements/GrantStatement.java index 67b651cecab4..aabde5dcd0b5 100644 --- a/src/java/org/apache/cassandra/cql3/statements/GrantStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/GrantStatement.java @@ -20,7 +20,7 @@ import java.util.Set; -import org.apache.cassandra.auth.IResource; +import org.apache.cassandra.auth.DataResource; import org.apache.cassandra.auth.Permission; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.exceptions.RequestExecutionException; @@ -30,7 +30,7 @@ public class GrantStatement extends PermissionAlteringStatement { - public GrantStatement(Set permissions, IResource resource, String username) + public GrantStatement(Set permissions, DataResource resource, String username) { super(permissions, resource, username); } diff --git a/src/java/org/apache/cassandra/cql3/statements/ListPermissionsStatement.java b/src/java/org/apache/cassandra/cql3/statements/ListPermissionsStatement.java index d8db871a963f..eaae2c6e0c23 100644 --- a/src/java/org/apache/cassandra/cql3/statements/ListPermissionsStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/ListPermissionsStatement.java @@ -52,10 +52,10 @@ public class ListPermissionsStatement extends AuthorizationStatement private final String username; private final boolean recursive; - public ListPermissionsStatement(Set permissions, IResource resource, String username, boolean recursive) + public ListPermissionsStatement(Set permissions, DataResource resource, String username, boolean recursive) { this.permissions = permissions; - this.resource = (DataResource) resource; + this.resource = resource; this.username = username; this.recursive = recursive; } diff --git a/src/java/org/apache/cassandra/cql3/statements/PermissionAlteringStatement.java b/src/java/org/apache/cassandra/cql3/statements/PermissionAlteringStatement.java index 5f3b70c35dd1..8784930bb21a 100644 --- a/src/java/org/apache/cassandra/cql3/statements/PermissionAlteringStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/PermissionAlteringStatement.java @@ -34,10 +34,10 @@ public abstract class PermissionAlteringStatement extends AuthorizationStatement protected DataResource resource; protected final String username; - protected PermissionAlteringStatement(Set permissions, IResource resource, String username) + protected PermissionAlteringStatement(Set permissions, DataResource resource, String username) { this.permissions = permissions; - this.resource = (DataResource) resource; + this.resource = resource; this.username = username; } diff --git a/src/java/org/apache/cassandra/cql3/statements/RevokeStatement.java b/src/java/org/apache/cassandra/cql3/statements/RevokeStatement.java index e81a3856514e..6f8ccd1cc070 100644 --- a/src/java/org/apache/cassandra/cql3/statements/RevokeStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/RevokeStatement.java @@ -20,7 +20,7 @@ import java.util.Set; -import org.apache.cassandra.auth.IResource; +import org.apache.cassandra.auth.DataResource; import org.apache.cassandra.auth.Permission; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.exceptions.RequestExecutionException; @@ -30,7 +30,7 @@ public class RevokeStatement extends PermissionAlteringStatement { - public RevokeStatement(Set permissions, IResource resource, String username) + public RevokeStatement(Set permissions, DataResource resource, String username) { super(permissions, resource, username); } From cfee3da908c685dad3103a497dd70eb9a884df3d Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Sat, 27 Dec 2014 21:09:26 -0500 Subject: [PATCH 225/557] simplify: --- examples/hadoop_cql3_word_count/src/WordCount.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/examples/hadoop_cql3_word_count/src/WordCount.java b/examples/hadoop_cql3_word_count/src/WordCount.java index 6a2f84624639..3702a2bd2c03 100644 --- a/examples/hadoop_cql3_word_count/src/WordCount.java +++ b/examples/hadoop_cql3_word_count/src/WordCount.java @@ -37,12 +37,10 @@ import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; -import org.apache.hadoop.mapreduce.Mapper.Context; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.util.Tool; import org.apache.hadoop.util.ToolRunner; import com.datastax.driver.core.Row; -import java.nio.charset.CharacterCodingException; /** * This counts the occurrences of words in ColumnFamily @@ -122,7 +120,7 @@ protected void setup(org.apache.hadoop.mapreduce.Mapper.Context context) public void map(Long key, Row row, Context context) throws IOException, InterruptedException { String value = row.getString("line"); - logger.debug("read {}:{}={} from {}", new Object[] {key, "line", value, context.getInputSplit()}); + logger.debug("read {}:{}={} from {}", key, "line", value, context.getInputSplit()); StringTokenizer itr = new StringTokenizer(value); while (itr.hasMoreTokens()) { From dcc3bb054167eb5f408cea79935855780fd56285 Mon Sep 17 00:00:00 2001 From: Robert Stupp Date: Tue, 30 Dec 2014 12:25:17 -0600 Subject: [PATCH 226/557] Schema change events/results for UDFs and aggregates Patch by Robert Stupp; reviewed by Tyler Hobbs for CASSANDRA-7708 --- CHANGES.txt | 7 +- doc/native_protocol_v4.spec | 33 ++++--- src/java/org/apache/cassandra/auth/Auth.java | 58 +---------- .../apache/cassandra/cql3/QueryProcessor.java | 24 ++--- .../cassandra/cql3/functions/Functions.java | 20 +--- .../cassandra/cql3/functions/UDHelper.java | 23 +---- .../statements/CreateAggregateStatement.java | 14 ++- .../statements/CreateFunctionStatement.java | 13 ++- .../statements/DropAggregateStatement.java | 8 +- .../statements/DropFunctionStatement.java | 8 +- .../cassandra/db/marshal/AbstractType.java | 9 ++ .../cassandra/schema/LegacySchemaTables.java | 43 +++++++-- ...onListener.java => MigrationListener.java} | 81 ++++++++++++---- .../cassandra/service/MigrationManager.java | 49 +++++----- .../org/apache/cassandra/transport/Event.java | 96 ++++++++++++++++--- .../apache/cassandra/transport/Server.java | 28 ++++-- .../cassandra/cql3/AggregationTest.java | 62 +++++++++++- .../org/apache/cassandra/cql3/CQLTester.java | 43 +++++++-- .../org/apache/cassandra/cql3/UFTest.java | 46 ++++++++- .../cassandra/transport/SerDeserTest.java | 14 +++ 20 files changed, 461 insertions(+), 218 deletions(-) rename src/java/org/apache/cassandra/service/{IMigrationListener.java => MigrationListener.java} (67%) diff --git a/CHANGES.txt b/CHANGES.txt index 146869315b6b..ac63fb3d3c6f 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -10,7 +10,8 @@ * Fix aggregate fn results on empty selection, result column name, and cqlsh parsing (CASSANDRA-8229) * Mark sstables as repaired after full repair (CASSANDRA-7586) - * Extend Descriptor to include a format value and refactor reader/writer apis (CASSANDRA-7443) + * Extend Descriptor to include a format value and refactor reader/writer + APIs (CASSANDRA-7443) * Integrate JMH for microbenchmarks (CASSANDRA-8151) * Keep sstable levels when bootstrapping (CASSANDRA-7460) * Add Sigar library and perform basic OS settings check on startup (CASSANDRA-7838) @@ -22,8 +23,8 @@ * Improve compaction logging (CASSANDRA-7818) * Remove YamlFileNetworkTopologySnitch (CASSANDRA-7917) * Do anticompaction in groups (CASSANDRA-6851) - * Support pure user-defined functions (CASSANDRA-7395, 7526, 7562, 7740, 7781, 7929, - 7924, 7812, 8063, 7813) + * Support user-defined functions (CASSANDRA-7395, 7526, 7562, 7740, 7781, 7929, + 7924, 7812, 8063, 7813, 7708) * Permit configurable timestamps with cassandra-stress (CASSANDRA-7416) * Move sstable RandomAccessReader to nio2, which allows using the FILE_SHARE_DELETE flag on Windows (CASSANDRA-4050) diff --git a/doc/native_protocol_v4.spec b/doc/native_protocol_v4.spec index 02aac3b834fb..3764e91bd3a8 100644 --- a/doc/native_protocol_v4.spec +++ b/doc/native_protocol_v4.spec @@ -669,18 +669,25 @@ Table of Contents the rest of the message will be where: - is a [string] representing the type of changed involved. It will be one of "CREATED", "UPDATED" or "DROPPED". - - is a [string] that can be one of "KEYSPACE", "TABLE" or "TYPE" - and describes what has been modified ("TYPE" stands for modifications - related to user types). - - depends on the preceding . If is - "KEYSPACE", then will be a single [string] representing the - keyspace changed. Otherwise, if is "TABLE" or "TYPE", then - will be 2 [string]: the first one will be the keyspace - containing the affected object, and the second one will be the name - of said affected object (so either the table name or the user type - name). - - All EVENT message have a streamId of -1 (Section 2.3). + - is a [string] that can be one of "KEYSPACE", "TABLE", "TYPE", + "FUNCTION" or "AGGREGATE" and describes what has been modified + ("TYPE" stands for modifications related to user types, "FUNCTION" + for modifications related to user defined functions, "AGGREGATE" + for modifications related to user defined aggregates). + - depends on the preceding : + - If is "KEYSPACE", then will be a single [string] + representing the keyspace changed. + - If is "TABLE" or "TYPE", then + will be 2 [string]: the first one will be the keyspace + containing the affected object, and the second one will be the name + of said affected object (either the table, user type, function, or + aggregate name). + - If is "FUNCTION" or "AGGREGATE", multiple arguments follow: + - [string] keyspace containing the user defined function / aggregate + - [string] the function/aggregate name + - [string list] one string for each argument type (as CQL type) + + All EVENT messages have a streamId of -1 (Section 2.3). Please note that "NEW_NODE" and "UP" events are sent based on internal Gossip communication and as such may be sent a short delay before the binary @@ -896,4 +903,6 @@ Table of Contents 10. Changes from v3 + * The format of "SCHEMA_CHANGE" events (Section 4.2.6) (and implicitly "Schema_change" results (Section 4.2.5.5)) + has been modified, and now includes changes related to user defined functions and user defined aggregates. diff --git a/src/java/org/apache/cassandra/auth/Auth.java b/src/java/org/apache/cassandra/auth/Auth.java index cdcfa0e8317e..0c3b0fecb015 100644 --- a/src/java/org/apache/cassandra/auth/Auth.java +++ b/src/java/org/apache/cassandra/auth/Auth.java @@ -185,7 +185,7 @@ public static void setup() DatabaseDescriptor.getAuthorizer().setup(); // register a custom MigrationListener for permissions cleanup after dropped keyspaces/cfs. - MigrationManager.instance.register(new MigrationListener()); + MigrationManager.instance.register(new AuthMigrationListener()); // the delay is here to give the node some time to see its peers - to reduce // "Skipped default superuser setup: some nodes were not ready" log spam. @@ -318,9 +318,9 @@ private static UntypedResultSet selectUser(String username) } /** - * IMigrationListener implementation that cleans up permissions on dropped resources. + * MigrationListener implementation that cleans up permissions on dropped resources. */ - public static class MigrationListener implements IMigrationListener + public static class AuthMigrationListener extends MigrationListener { public void onDropKeyspace(String ksName) { @@ -331,57 +331,5 @@ public void onDropColumnFamily(String ksName, String cfName) { DatabaseDescriptor.getAuthorizer().revokeAll(DataResource.columnFamily(ksName, cfName)); } - - public void onDropUserType(String ksName, String userType) - { - } - - public void onDropFunction(String ksName, String functionName) - { - } - - public void onDropAggregate(String ksName, String aggregateName) - { - } - - public void onCreateKeyspace(String ksName) - { - } - - public void onCreateColumnFamily(String ksName, String cfName) - { - } - - public void onCreateUserType(String ksName, String userType) - { - } - - public void onCreateFunction(String ksName, String functionName) - { - } - - public void onCreateAggregate(String ksName, String aggregateName) - { - } - - public void onUpdateKeyspace(String ksName) - { - } - - public void onUpdateColumnFamily(String ksName, String cfName) - { - } - - public void onUpdateUserType(String ksName, String userType) - { - } - - public void onUpdateFunction(String ksName, String functionName) - { - } - - public void onUpdateAggregate(String ksName, String aggregateName) - { - } } } diff --git a/src/java/org/apache/cassandra/cql3/QueryProcessor.java b/src/java/org/apache/cassandra/cql3/QueryProcessor.java index ae099724bf5b..8531d32574c7 100644 --- a/src/java/org/apache/cassandra/cql3/QueryProcessor.java +++ b/src/java/org/apache/cassandra/cql3/QueryProcessor.java @@ -31,6 +31,7 @@ import com.googlecode.concurrentlinkedhashmap.EvictionListener; import org.antlr.runtime.*; +import org.apache.cassandra.service.MigrationListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -50,7 +51,6 @@ import org.apache.cassandra.exceptions.SyntaxException; import org.apache.cassandra.metrics.CQLMetrics; import org.apache.cassandra.service.ClientState; -import org.apache.cassandra.service.IMigrationListener; import org.apache.cassandra.service.MigrationManager; import org.apache.cassandra.service.QueryState; import org.apache.cassandra.service.pager.QueryPager; @@ -560,7 +560,7 @@ private static long measure(Object key) return meter.measureDeep(key); } - private static class MigrationSubscriber implements IMigrationListener + private static class MigrationSubscriber extends MigrationListener { private void removeInvalidPreparedStatements(String ksName, String cfName) { @@ -602,10 +602,7 @@ else if (statement instanceof SelectStatement) return ksName.equals(statementKsName) && (cfName == null || cfName.equals(statementCfName)); } - public void onCreateKeyspace(String ksName) { } - public void onCreateColumnFamily(String ksName, String cfName) { } - public void onCreateUserType(String ksName, String typeName) { } - public void onCreateFunction(String ksName, String functionName) { + public void onCreateFunction(String ksName, String functionName, List> argTypes) { if (Functions.getOverloadCount(new FunctionName(ksName, functionName)) > 1) { // in case there are other overloads, we have to remove all overloads since argument type @@ -614,7 +611,7 @@ public void onCreateFunction(String ksName, String functionName) { removeInvalidPreparedStatementsForFunction(thriftPreparedStatements.values().iterator(), ksName, functionName); } } - public void onCreateAggregate(String ksName, String aggregateName) { + public void onCreateAggregate(String ksName, String aggregateName, List> argTypes) { if (Functions.getOverloadCount(new FunctionName(ksName, aggregateName)) > 1) { // in case there are other overloads, we have to remove all overloads since argument type @@ -624,12 +621,6 @@ public void onCreateAggregate(String ksName, String aggregateName) { } } - public void onUpdateKeyspace(String ksName) { } - public void onUpdateColumnFamily(String ksName, String cfName) { } - public void onUpdateUserType(String ksName, String typeName) { } - public void onUpdateFunction(String ksName, String functionName) { } - public void onUpdateAggregate(String ksName, String aggregateName) { } - public void onDropKeyspace(String ksName) { removeInvalidPreparedStatements(ksName, null); @@ -640,18 +631,17 @@ public void onDropColumnFamily(String ksName, String cfName) removeInvalidPreparedStatements(ksName, cfName); } - public void onDropUserType(String ksName, String typeName) { } - public void onDropFunction(String ksName, String functionName) { + public void onDropFunction(String ksName, String functionName, List> argTypes) { removeInvalidPreparedStatementsForFunction(preparedStatements.values().iterator(), ksName, functionName); removeInvalidPreparedStatementsForFunction(thriftPreparedStatements.values().iterator(), ksName, functionName); } - public void onDropAggregate(String ksName, String aggregateName) + public void onDropAggregate(String ksName, String aggregateName, List> argTypes) { removeInvalidPreparedStatementsForFunction(preparedStatements.values().iterator(), ksName, aggregateName); removeInvalidPreparedStatementsForFunction(thriftPreparedStatements.values().iterator(), ksName, aggregateName); } - private void removeInvalidPreparedStatementsForFunction(Iterator iterator, + private static void removeInvalidPreparedStatementsForFunction(Iterator iterator, String ksName, String functionName) { while (iterator.hasNext()) diff --git a/src/java/org/apache/cassandra/cql3/functions/Functions.java b/src/java/org/apache/cassandra/cql3/functions/Functions.java index b55ebc5e9236..09e360b01b96 100644 --- a/src/java/org/apache/cassandra/cql3/functions/Functions.java +++ b/src/java/org/apache/cassandra/cql3/functions/Functions.java @@ -27,7 +27,7 @@ import org.apache.cassandra.cql3.*; import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.exceptions.InvalidRequestException; -import org.apache.cassandra.service.IMigrationListener; +import org.apache.cassandra.service.MigrationListener; import org.apache.cassandra.service.MigrationManager; public abstract class Functions @@ -302,28 +302,12 @@ public static boolean typeEquals(List> t1, List> return true; } - private static class FunctionsMigrationListener implements IMigrationListener + private static class FunctionsMigrationListener extends MigrationListener { - public void onCreateKeyspace(String ksName) { } - public void onCreateColumnFamily(String ksName, String cfName) { } - public void onCreateUserType(String ksName, String typeName) { } - public void onCreateFunction(String ksName, String functionName) { } - public void onCreateAggregate(String ksName, String aggregateName) { } - - public void onUpdateKeyspace(String ksName) { } - public void onUpdateColumnFamily(String ksName, String cfName) { } public void onUpdateUserType(String ksName, String typeName) { for (Function function : all()) if (function instanceof UDFunction) ((UDFunction)function).userTypeUpdated(ksName, typeName); } - public void onUpdateFunction(String ksName, String functionName) { } - public void onUpdateAggregate(String ksName, String aggregateName) { } - - public void onDropKeyspace(String ksName) { } - public void onDropColumnFamily(String ksName, String cfName) { } - public void onDropUserType(String ksName, String typeName) { } - public void onDropFunction(String ksName, String functionName) { } - public void onDropAggregate(String ksName, String aggregateName) { } } } diff --git a/src/java/org/apache/cassandra/cql3/functions/UDHelper.java b/src/java/org/apache/cassandra/cql3/functions/UDHelper.java index 0738cbe68d3b..f4b38095391d 100644 --- a/src/java/org/apache/cassandra/cql3/functions/UDHelper.java +++ b/src/java/org/apache/cassandra/cql3/functions/UDHelper.java @@ -21,8 +21,6 @@ import java.lang.invoke.MethodHandles; import java.lang.reflect.Method; import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; import java.util.*; import org.slf4j.Logger; @@ -30,9 +28,7 @@ import com.datastax.driver.core.DataType; import org.apache.cassandra.cql3.*; -import org.apache.cassandra.db.marshal.AbstractType; -import org.apache.cassandra.db.marshal.UTF8Type; -import org.apache.cassandra.utils.FBUtilities; +import org.apache.cassandra.db.marshal.*; /** * Helper class for User Defined Functions + Aggregates. @@ -66,7 +62,7 @@ public final class UDHelper */ public static Class[] javaTypes(DataType[] dataTypes) { - Class paramTypes[] = new Class[dataTypes.length]; + Class[] paramTypes = new Class[dataTypes.length]; for (int i = 0; i < paramTypes.length; i++) paramTypes[i] = dataTypes[i].asJavaClass(); return paramTypes; @@ -107,19 +103,4 @@ public static DataType driverType(AbstractType abstractType) throw new RuntimeException("cannot parse driver type " + cqlType.getType().toString(), e); } } - - // We allow method overloads, so a function is not uniquely identified by its name only, but - // also by its argument types. To distinguish overloads of given function name in the schema - // we use a "signature" which is just a SHA-1 of it's argument types (we could replace that by - // using a "signature" UDT that would be comprised of the function name and argument types, - // which we could then use as clustering column. But as we haven't yet used UDT in system tables, - // We'll leave that decision to #6717). - public static ByteBuffer calculateSignature(AbstractFunction fun) - { - MessageDigest digest = FBUtilities.newMessageDigest("SHA-1"); - digest.update(UTF8Type.instance.decompose(fun.name().name)); - for (AbstractType type : fun.argTypes()) - digest.update(UTF8Type.instance.decompose(type.asCQL3Type().toString())); - return ByteBuffer.wrap(digest.digest()); - } } diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateAggregateStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateAggregateStatement.java index 9816e5848ce5..e135ffee3dd7 100644 --- a/src/java/org/apache/cassandra/cql3/statements/CreateAggregateStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/CreateAggregateStatement.java @@ -47,13 +47,16 @@ public final class CreateAggregateStatement extends SchemaAlteringStatement private final boolean orReplace; private final boolean ifNotExists; private FunctionName functionName; - private String stateFunc; - private String finalFunc; + private final String stateFunc; + private final String finalFunc; private final CQL3Type.Raw stateTypeRaw; private final List argRawTypes; private final Term.Raw ival; + private UDAggregate udAggregate; + private boolean replaced; + public CreateAggregateStatement(FunctionName functionName, List argRawTypes, String stateFunc, @@ -102,7 +105,9 @@ public void validate(ClientState state) throws InvalidRequestException public Event.SchemaChange changeEvent() { - return null; + return new Event.SchemaChange(replaced ? Event.SchemaChange.Change.UPDATED : Event.SchemaChange.Change.CREATED, + Event.SchemaChange.Target.AGGREGATE, + udAggregate.name().keyspace, udAggregate.name().name, AbstractType.asCQLTypeStringList(udAggregate.argTypes())); } public boolean announceMigration(boolean isLocalOnly) throws RequestValidationException @@ -164,10 +169,11 @@ public boolean announceMigration(boolean isLocalOnly) throws RequestValidationEx initcond = ival.prepare(functionName.keyspace, receiver).bindAndGet(QueryOptions.DEFAULT); } - UDAggregate udAggregate = new UDAggregate(functionName, argTypes, returnType, + udAggregate = new UDAggregate(functionName, argTypes, returnType, fState, fFinal, initcond); + replaced = old != null; MigrationManager.announceNewAggregate(udAggregate, isLocalOnly); diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java index dbdecf91f22f..c49f80c0a9f1 100644 --- a/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java @@ -51,6 +51,9 @@ public final class CreateFunctionStatement extends SchemaAlteringStatement private final List argRawTypes; private final CQL3Type.Raw rawReturnType; + private UDFunction udFunction; + private boolean replaced; + public CreateFunctionStatement(FunctionName functionName, String language, String body, @@ -101,7 +104,9 @@ public void validate(ClientState state) throws InvalidRequestException public Event.SchemaChange changeEvent() { - return null; + return new Event.SchemaChange(replaced ? Event.SchemaChange.Change.UPDATED : Event.SchemaChange.Change.CREATED, + Event.SchemaChange.Target.FUNCTION, + udFunction.name().keyspace, udFunction.name().name, AbstractType.asCQLTypeStringList(udFunction.argTypes())); } public boolean announceMigration(boolean isLocalOnly) throws RequestValidationException @@ -131,7 +136,11 @@ public boolean announceMigration(boolean isLocalOnly) throws RequestValidationEx functionName, returnType.asCQL3Type(), old.returnType().asCQL3Type())); } - MigrationManager.announceNewFunction(UDFunction.create(functionName, argNames, argTypes, returnType, language, body, deterministic), isLocalOnly); + this.udFunction = UDFunction.create(functionName, argNames, argTypes, returnType, language, body, deterministic); + this.replaced = old != null; + + MigrationManager.announceNewFunction(udFunction, isLocalOnly); + return true; } diff --git a/src/java/org/apache/cassandra/cql3/statements/DropAggregateStatement.java b/src/java/org/apache/cassandra/cql3/statements/DropAggregateStatement.java index 118f89d3ee86..97ec19617c99 100644 --- a/src/java/org/apache/cassandra/cql3/statements/DropAggregateStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/DropAggregateStatement.java @@ -42,6 +42,8 @@ public final class DropAggregateStatement extends SchemaAlteringStatement private final List argRawTypes; private final boolean argsPresent; + private Function old; + public DropAggregateStatement(FunctionName functionName, List argRawTypes, boolean argsPresent, @@ -77,7 +79,8 @@ public void validate(ClientState state) throws RequestValidationException public Event.SchemaChange changeEvent() { - return null; + return new Event.SchemaChange(Event.SchemaChange.Change.DROPPED, Event.SchemaChange.Target.AGGREGATE, + old.name().keyspace, old.name().name, AbstractType.asCQLTypeStringList(old.argTypes())); } public boolean announceMigration(boolean isLocalOnly) throws RequestValidationException @@ -130,7 +133,10 @@ public boolean announceMigration(boolean isLocalOnly) throws RequestValidationEx throw new InvalidRequestException(String.format("Cannot drop aggregate '%s' because it is a " + "native (built-in) function", functionName)); + this.old = old; + MigrationManager.announceAggregateDrop((UDAggregate)old, isLocalOnly); + return true; } } diff --git a/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java b/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java index 394aca0f3011..083db4519468 100644 --- a/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java @@ -42,6 +42,8 @@ public final class DropFunctionStatement extends SchemaAlteringStatement private final List argRawTypes; private final boolean argsPresent; + private Function old; + public DropFunctionStatement(FunctionName functionName, List argRawTypes, boolean argsPresent, @@ -81,7 +83,8 @@ public void validate(ClientState state) @Override public Event.SchemaChange changeEvent() { - return null; + return new Event.SchemaChange(Event.SchemaChange.Change.DROPPED, Event.SchemaChange.Target.FUNCTION, + old.name().keyspace, old.name().name, AbstractType.asCQLTypeStringList(old.argTypes())); } @Override @@ -135,7 +138,10 @@ public boolean announceMigration(boolean isLocalOnly) throws RequestValidationEx if (!references.isEmpty()) throw new InvalidRequestException(String.format("Function '%s' still referenced by %s", functionName, references)); + this.old = old; + MigrationManager.announceFunctionDrop((UDFunction) old, isLocalOnly); + return true; } diff --git a/src/java/org/apache/cassandra/db/marshal/AbstractType.java b/src/java/org/apache/cassandra/db/marshal/AbstractType.java index 85b6dc7cecb3..d3711df86204 100644 --- a/src/java/org/apache/cassandra/db/marshal/AbstractType.java +++ b/src/java/org/apache/cassandra/db/marshal/AbstractType.java @@ -18,6 +18,7 @@ package org.apache.cassandra.db.marshal; import java.nio.ByteBuffer; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; @@ -63,6 +64,14 @@ public int compare(ByteBuffer o1, ByteBuffer o2) }; } + public static List asCQLTypeStringList(List> abstractTypes) + { + List r = new ArrayList<>(abstractTypes.size()); + for (AbstractType abstractType : abstractTypes) + r.add(abstractType.asCQL3Type().toString()); + return r; + } + public T compose(ByteBuffer bytes) { return getSerializer().deserialize(bytes); diff --git a/src/java/org/apache/cassandra/schema/LegacySchemaTables.java b/src/java/org/apache/cassandra/schema/LegacySchemaTables.java index 047698c2b341..4d068631406e 100644 --- a/src/java/org/apache/cassandra/schema/LegacySchemaTables.java +++ b/src/java/org/apache/cassandra/schema/LegacySchemaTables.java @@ -157,7 +157,7 @@ public class LegacySchemaTables "CREATE TABLE %s (" + "keyspace_name text," + "function_name text," - + "signature blob," + + "signature frozen>," + "argument_names list," + "argument_types list," + "body text," @@ -172,7 +172,7 @@ public class LegacySchemaTables "CREATE TABLE %s (" + "keyspace_name text," + "aggregate_name text," - + "signature blob," + + "signature frozen>," + "argument_types list," + "final_func text," + "initcond blob," @@ -1293,7 +1293,7 @@ public static Mutation makeCreateFunctionMutation(KSMetaData keyspace, UDFunctio private static void addFunctionToSchemaMutation(UDFunction function, long timestamp, Mutation mutation) { ColumnFamily cells = mutation.addOrGet(Functions); - Composite prefix = Functions.comparator.make(function.name().name, UDHelper.calculateSignature(function)); + Composite prefix = Functions.comparator.make(function.name().name, functionSignatureWithTypes(function)); CFRowAdder adder = new CFRowAdder(cells, prefix, timestamp); adder.resetCollection("argument_names"); @@ -1319,7 +1319,7 @@ public static Mutation makeDropFunctionMutation(KSMetaData keyspace, UDFunction ColumnFamily cells = mutation.addOrGet(Functions); int ldt = (int) (System.currentTimeMillis() / 1000); - Composite prefix = Functions.comparator.make(function.name().name, UDHelper.calculateSignature(function)); + Composite prefix = Functions.comparator.make(function.name().name, functionSignatureWithTypes(function)); cells.addAtom(new RangeTombstone(prefix, prefix.end(), timestamp, ldt)); return mutation; @@ -1332,7 +1332,7 @@ private static Map createFunctionsFromFunctionsPartition for (UntypedResultSet.Row row : QueryProcessor.resultify(query, partition)) { UDFunction function = createFunctionFromFunctionRow(row); - functions.put(UDHelper.calculateSignature(function), function); + functions.put(functionSignatureWithNameAndTypes(function), function); } return functions; } @@ -1385,7 +1385,7 @@ public static Mutation makeCreateAggregateMutation(KSMetaData keyspace, UDAggreg private static void addAggregateToSchemaMutation(UDAggregate aggregate, long timestamp, Mutation mutation) { ColumnFamily cells = mutation.addOrGet(Aggregates); - Composite prefix = Aggregates.comparator.make(aggregate.name().name, UDHelper.calculateSignature(aggregate)); + Composite prefix = Aggregates.comparator.make(aggregate.name().name, functionSignatureWithTypes(aggregate)); CFRowAdder adder = new CFRowAdder(cells, prefix, timestamp); adder.resetCollection("argument_types"); @@ -1409,7 +1409,7 @@ private static Map createAggregatesFromAggregatesPartit for (UntypedResultSet.Row row : QueryProcessor.resultify(query, partition)) { UDAggregate aggregate = createAggregateFromAggregateRow(row); - aggregates.put(UDHelper.calculateSignature(aggregate), aggregate); + aggregates.put(functionSignatureWithNameAndTypes(aggregate), aggregate); } return aggregates; } @@ -1459,7 +1459,7 @@ public static Mutation makeDropAggregateMutation(KSMetaData keyspace, UDAggregat ColumnFamily cells = mutation.addOrGet(Aggregates); int ldt = (int) (System.currentTimeMillis() / 1000); - Composite prefix = Aggregates.comparator.make(aggregate.name().name, UDHelper.calculateSignature(aggregate)); + Composite prefix = Aggregates.comparator.make(aggregate.name().name, functionSignatureWithTypes(aggregate)); cells.addAtom(new RangeTombstone(prefix, prefix.end(), timestamp, ldt)); return mutation; @@ -1477,4 +1477,31 @@ private static AbstractType parseType(String str) throw new RuntimeException(e); } } + + // We allow method overloads, so a function is not uniquely identified by its name only, but + // also by its argument types. To distinguish overloads of given function name in the schema + // we use a "signature" which is just a list of it's CQL argument types (we could replace that by + // using a "signature" UDT that would be comprised of the function name and argument types, + // which we could then use as clustering column. But as we haven't yet used UDT in system tables, + // We'll leave that decision to #6717). + public static ByteBuffer functionSignatureWithTypes(AbstractFunction fun) + { + ListType list = ListType.getInstance(UTF8Type.instance, false); + List strList = new ArrayList<>(fun.argTypes().size()); + for (AbstractType argType : fun.argTypes()) + strList.add(argType.asCQL3Type().toString()); + return list.decompose(strList); + } + + public static ByteBuffer functionSignatureWithNameAndTypes(AbstractFunction fun) + { + ListType list = ListType.getInstance(UTF8Type.instance, false); + List strList = new ArrayList<>(fun.argTypes().size() + 2); + strList.add(fun.name().keyspace); + strList.add(fun.name().name); + for (AbstractType argType : fun.argTypes()) + strList.add(argType.asCQL3Type().toString()); + return list.decompose(strList); + } + } diff --git a/src/java/org/apache/cassandra/service/IMigrationListener.java b/src/java/org/apache/cassandra/service/MigrationListener.java similarity index 67% rename from src/java/org/apache/cassandra/service/IMigrationListener.java rename to src/java/org/apache/cassandra/service/MigrationListener.java index faaffb9ea9c6..2b728d94451d 100644 --- a/src/java/org/apache/cassandra/service/IMigrationListener.java +++ b/src/java/org/apache/cassandra/service/MigrationListener.java @@ -17,24 +17,69 @@ */ package org.apache.cassandra.service; -public interface IMigrationListener +import java.util.List; + +import org.apache.cassandra.db.marshal.AbstractType; + +public abstract class MigrationListener { - public void onCreateKeyspace(String ksName); - public void onCreateColumnFamily(String ksName, String cfName); - public void onCreateUserType(String ksName, String typeName); - public void onCreateFunction(String ksName, String functionName); - public void onCreateAggregate(String ksName, String aggregateName); - - public void onUpdateKeyspace(String ksName); - public void onUpdateColumnFamily(String ksName, String cfName); - public void onUpdateUserType(String ksName, String typeName); - public void onUpdateFunction(String ksName, String functionName); - public void onUpdateAggregate(String ksName, String aggregateName); - - public void onDropKeyspace(String ksName); - public void onDropColumnFamily(String ksName, String cfName); - public void onDropUserType(String ksName, String typeName); - public void onDropFunction(String ksName, String functionName); - public void onDropAggregate(String ksName, String aggregateName); + public void onCreateKeyspace(String ksName) + { + } + + public void onCreateColumnFamily(String ksName, String cfName) + { + } + + public void onCreateUserType(String ksName, String typeName) + { + } + + public void onCreateFunction(String ksName, String functionName, List> argTypes) + { + } + + public void onCreateAggregate(String ksName, String aggregateName, List> argTypes) + { + } + + public void onUpdateKeyspace(String ksName) + { + } + + public void onUpdateColumnFamily(String ksName, String cfName) + { + } + + public void onUpdateUserType(String ksName, String typeName) + { + } + + public void onUpdateFunction(String ksName, String functionName, List> argTypes) + { + } + + public void onUpdateAggregate(String ksName, String aggregateName, List> argTypes) + { + } + + public void onDropKeyspace(String ksName) + { + } + + public void onDropColumnFamily(String ksName, String cfName) + { + } + + public void onDropUserType(String ksName, String typeName) + { + } + + public void onDropFunction(String ksName, String functionName, List> argTypes) + { + } + public void onDropAggregate(String ksName, String aggregateName, List> argTypes) + { + } } diff --git a/src/java/org/apache/cassandra/service/MigrationManager.java b/src/java/org/apache/cassandra/service/MigrationManager.java index fe325599a5d8..ef1adc6b2bef 100644 --- a/src/java/org/apache/cassandra/service/MigrationManager.java +++ b/src/java/org/apache/cassandra/service/MigrationManager.java @@ -63,16 +63,16 @@ public class MigrationManager public static final int MIGRATION_DELAY_IN_MS = 60000; - private final List listeners = new CopyOnWriteArrayList<>(); + private final List listeners = new CopyOnWriteArrayList<>(); private MigrationManager() {} - public void register(IMigrationListener listener) + public void register(MigrationListener listener) { listeners.add(listener); } - public void unregister(IMigrationListener listener) + public void unregister(MigrationListener listener) { listeners.remove(listener); } @@ -160,92 +160,93 @@ public static boolean isReadyForBootstrap() public void notifyCreateKeyspace(KSMetaData ksm) { - for (IMigrationListener listener : listeners) + for (MigrationListener listener : listeners) listener.onCreateKeyspace(ksm.name); } public void notifyCreateColumnFamily(CFMetaData cfm) { - for (IMigrationListener listener : listeners) + for (MigrationListener listener : listeners) listener.onCreateColumnFamily(cfm.ksName, cfm.cfName); } public void notifyCreateUserType(UserType ut) { - for (IMigrationListener listener : listeners) + for (MigrationListener listener : listeners) listener.onCreateUserType(ut.keyspace, ut.getNameAsString()); } public void notifyCreateFunction(UDFunction udf) { - for (IMigrationListener listener : listeners) - listener.onCreateFunction(udf.name().keyspace, udf.name().name); + for (MigrationListener listener : listeners) + listener.onCreateFunction(udf.name().keyspace, udf.name().name, udf.argTypes()); } + public void notifyCreateAggregate(UDAggregate udf) { - for (IMigrationListener listener : listeners) - listener.onCreateAggregate(udf.name().keyspace, udf.name().name); + for (MigrationListener listener : listeners) + listener.onCreateAggregate(udf.name().keyspace, udf.name().name, udf.argTypes()); } public void notifyUpdateKeyspace(KSMetaData ksm) { - for (IMigrationListener listener : listeners) + for (MigrationListener listener : listeners) listener.onUpdateKeyspace(ksm.name); } public void notifyUpdateColumnFamily(CFMetaData cfm) { - for (IMigrationListener listener : listeners) + for (MigrationListener listener : listeners) listener.onUpdateColumnFamily(cfm.ksName, cfm.cfName); } public void notifyUpdateUserType(UserType ut) { - for (IMigrationListener listener : listeners) + for (MigrationListener listener : listeners) listener.onUpdateUserType(ut.keyspace, ut.getNameAsString()); } public void notifyUpdateFunction(UDFunction udf) { - for (IMigrationListener listener : listeners) - listener.onUpdateFunction(udf.name().keyspace, udf.name().name); + for (MigrationListener listener : listeners) + listener.onUpdateFunction(udf.name().keyspace, udf.name().name, udf.argTypes()); } public void notifyUpdateAggregate(UDAggregate udf) { - for (IMigrationListener listener : listeners) - listener.onUpdateAggregate(udf.name().keyspace, udf.name().name); + for (MigrationListener listener : listeners) + listener.onUpdateAggregate(udf.name().keyspace, udf.name().name, udf.argTypes()); } public void notifyDropKeyspace(KSMetaData ksm) { - for (IMigrationListener listener : listeners) + for (MigrationListener listener : listeners) listener.onDropKeyspace(ksm.name); } public void notifyDropColumnFamily(CFMetaData cfm) { - for (IMigrationListener listener : listeners) + for (MigrationListener listener : listeners) listener.onDropColumnFamily(cfm.ksName, cfm.cfName); } public void notifyDropUserType(UserType ut) { - for (IMigrationListener listener : listeners) + for (MigrationListener listener : listeners) listener.onDropUserType(ut.keyspace, ut.getNameAsString()); } public void notifyDropFunction(UDFunction udf) { - for (IMigrationListener listener : listeners) - listener.onDropFunction(udf.name().keyspace, udf.name().name); + for (MigrationListener listener : listeners) + listener.onDropFunction(udf.name().keyspace, udf.name().name, udf.argTypes()); } public void notifyDropAggregate(UDAggregate udf) { - for (IMigrationListener listener : listeners) - listener.onDropAggregate(udf.name().keyspace, udf.name().name); + for (MigrationListener listener : listeners) + listener.onDropAggregate(udf.name().keyspace, udf.name().name, udf.argTypes()); } public static void announceNewKeyspace(KSMetaData ksm) throws ConfigurationException diff --git a/src/java/org/apache/cassandra/transport/Event.java b/src/java/org/apache/cassandra/transport/Event.java index 99625996877e..5e9c6b715d16 100644 --- a/src/java/org/apache/cassandra/transport/Event.java +++ b/src/java/org/apache/cassandra/transport/Event.java @@ -19,6 +19,8 @@ import java.net.InetAddress; import java.net.InetSocketAddress; +import java.util.Iterator; +import java.util.List; import com.google.common.base.Objects; import io.netty.buffer.ByteBuf; @@ -204,22 +206,29 @@ public boolean equals(Object other) public static class SchemaChange extends Event { public enum Change { CREATED, UPDATED, DROPPED } - public enum Target { KEYSPACE, TABLE, TYPE } + public enum Target { KEYSPACE, TABLE, TYPE, FUNCTION, AGGREGATE } public final Change change; public final Target target; public final String keyspace; - public final String tableOrTypeOrFunction; + public final String name; + public final List argTypes; - public SchemaChange(Change change, Target target, String keyspace, String tableOrTypeOrFunction) + public SchemaChange(Change change, Target target, String keyspace, String name, List argTypes) { super(Type.SCHEMA_CHANGE); this.change = change; this.target = target; this.keyspace = keyspace; - this.tableOrTypeOrFunction = tableOrTypeOrFunction; + this.name = name; if (target != Target.KEYSPACE) - assert this.tableOrTypeOrFunction != null : "Table or type should be set for non-keyspace schema change events"; + assert this.name != null : "Table, type, function or aggregate name should be set for non-keyspace schema change events"; + this.argTypes = argTypes; + } + + public SchemaChange(Change change, Target target, String keyspace, String name) + { + this(change, target, keyspace, name, null); } public SchemaChange(Change change, String keyspace) @@ -236,7 +245,11 @@ public static SchemaChange deserializeEvent(ByteBuf cb, int version) Target target = CBUtil.readEnumValue(Target.class, cb); String keyspace = CBUtil.readString(cb); String tableOrType = target == Target.KEYSPACE ? null : CBUtil.readString(cb); - return new SchemaChange(change, target, keyspace, tableOrType); + List argTypes = null; + if (target == Target.FUNCTION || target == Target.AGGREGATE) + argTypes = CBUtil.readStringList(cb); + + return new SchemaChange(change, target, keyspace, tableOrType, argTypes); } else { @@ -248,13 +261,36 @@ public static SchemaChange deserializeEvent(ByteBuf cb, int version) public void serializeEvent(ByteBuf dest, int version) { + if (target == Target.FUNCTION || target == Target.AGGREGATE) + { + if (version >= 4) + { + // available since protocol version 4 + CBUtil.writeEnumValue(change, dest); + CBUtil.writeEnumValue(target, dest); + CBUtil.writeString(keyspace, dest); + CBUtil.writeString(name, dest); + CBUtil.writeStringList(argTypes, dest); + } + else + { + // not available in protocol versions < 4 - just say the keyspace was updated. + CBUtil.writeEnumValue(Change.UPDATED, dest); + if (version >= 3) + CBUtil.writeEnumValue(Target.KEYSPACE, dest); + CBUtil.writeString(keyspace, dest); + CBUtil.writeString("", dest); + } + return; + } + if (version >= 3) { CBUtil.writeEnumValue(change, dest); CBUtil.writeEnumValue(target, dest); CBUtil.writeString(keyspace, dest); if (target != Target.KEYSPACE) - CBUtil.writeString(tableOrTypeOrFunction, dest); + CBUtil.writeString(name, dest); } else { @@ -270,13 +306,30 @@ public void serializeEvent(ByteBuf dest, int version) { CBUtil.writeEnumValue(change, dest); CBUtil.writeString(keyspace, dest); - CBUtil.writeString(target == Target.KEYSPACE ? "" : tableOrTypeOrFunction, dest); + CBUtil.writeString(target == Target.KEYSPACE ? "" : name, dest); } } } public int eventSerializedSize(int version) { + if (target == Target.FUNCTION || target == Target.AGGREGATE) + { + if (version >= 4) + return CBUtil.sizeOfEnumValue(change) + + CBUtil.sizeOfEnumValue(target) + + CBUtil.sizeOfString(keyspace) + + CBUtil.sizeOfString(name) + + CBUtil.sizeOfStringList(argTypes); + if (version >= 3) + return CBUtil.sizeOfEnumValue(Change.UPDATED) + + CBUtil.sizeOfEnumValue(Target.KEYSPACE) + + CBUtil.sizeOfString(keyspace); + return CBUtil.sizeOfEnumValue(Change.UPDATED) + + CBUtil.sizeOfString(keyspace) + + CBUtil.sizeOfString(""); + } + if (version >= 3) { int size = CBUtil.sizeOfEnumValue(change) @@ -284,7 +337,7 @@ public int eventSerializedSize(int version) + CBUtil.sizeOfString(keyspace); if (target != Target.KEYSPACE) - size += CBUtil.sizeOfString(tableOrTypeOrFunction); + size += CBUtil.sizeOfString(name); return size; } @@ -298,20 +351,36 @@ public int eventSerializedSize(int version) } return CBUtil.sizeOfEnumValue(change) + CBUtil.sizeOfString(keyspace) - + CBUtil.sizeOfString(target == Target.KEYSPACE ? "" : tableOrTypeOrFunction); + + CBUtil.sizeOfString(target == Target.KEYSPACE ? "" : name); } } @Override public String toString() { - return change + " " + target + " " + keyspace + (tableOrTypeOrFunction == null ? "" : "." + tableOrTypeOrFunction); + StringBuilder sb = new StringBuilder().append(change) + .append(' ').append(target) + .append(' ').append(keyspace); + if (name != null) + sb.append('.').append(name); + if (argTypes != null) + { + sb.append(" ("); + for (Iterator iter = argTypes.iterator(); iter.hasNext(); ) + { + sb.append(iter.next()); + if (iter.hasNext()) + sb.append(','); + } + sb.append(')'); + } + return sb.toString(); } @Override public int hashCode() { - return Objects.hashCode(change, target, keyspace, tableOrTypeOrFunction); + return Objects.hashCode(change, target, keyspace, name, argTypes); } @Override @@ -324,7 +393,8 @@ public boolean equals(Object other) return Objects.equal(change, scc.change) && Objects.equal(target, scc.target) && Objects.equal(keyspace, scc.keyspace) - && Objects.equal(tableOrTypeOrFunction, scc.tableOrTypeOrFunction); + && Objects.equal(name, scc.name) + && Objects.equal(argTypes, scc.argTypes); } } } diff --git a/src/java/org/apache/cassandra/transport/Server.java b/src/java/org/apache/cassandra/transport/Server.java index 5202a9451ae9..147d7292ba84 100644 --- a/src/java/org/apache/cassandra/transport/Server.java +++ b/src/java/org/apache/cassandra/transport/Server.java @@ -22,6 +22,7 @@ import java.net.InetSocketAddress; import java.net.UnknownHostException; import java.util.EnumMap; +import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.atomic.AtomicBoolean; import javax.net.ssl.SSLContext; @@ -44,6 +45,7 @@ import org.apache.cassandra.auth.ISaslAwareAuthenticator; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.config.EncryptionOptions; +import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.metrics.ClientMetrics; import org.apache.cassandra.security.SSLFactory; import org.apache.cassandra.service.*; @@ -330,7 +332,7 @@ protected void initChannel(Channel channel) throws Exception } } - private static class EventNotifier implements IEndpointLifecycleSubscriber, IMigrationListener + private static class EventNotifier extends MigrationListener implements IEndpointLifecycleSubscriber { private final Server server; private static final InetAddress bindAll; @@ -410,12 +412,16 @@ public void onCreateUserType(String ksName, String typeName) server.connectionTracker.send(new Event.SchemaChange(Event.SchemaChange.Change.CREATED, Event.SchemaChange.Target.TYPE, ksName, typeName)); } - public void onCreateFunction(String ksName, String functionName) + public void onCreateFunction(String ksName, String functionName, List> argTypes) { + server.connectionTracker.send(new Event.SchemaChange(Event.SchemaChange.Change.CREATED, Event.SchemaChange.Target.FUNCTION, + ksName, functionName, AbstractType.asCQLTypeStringList(argTypes))); } - public void onCreateAggregate(String ksName, String aggregateName) + public void onCreateAggregate(String ksName, String aggregateName, List> argTypes) { + server.connectionTracker.send(new Event.SchemaChange(Event.SchemaChange.Change.CREATED, Event.SchemaChange.Target.AGGREGATE, + ksName, aggregateName, AbstractType.asCQLTypeStringList(argTypes))); } public void onUpdateKeyspace(String ksName) @@ -433,12 +439,16 @@ public void onUpdateUserType(String ksName, String typeName) server.connectionTracker.send(new Event.SchemaChange(Event.SchemaChange.Change.UPDATED, Event.SchemaChange.Target.TYPE, ksName, typeName)); } - public void onUpdateFunction(String ksName, String functionName) + public void onUpdateFunction(String ksName, String functionName, List> argTypes) { + server.connectionTracker.send(new Event.SchemaChange(Event.SchemaChange.Change.UPDATED, Event.SchemaChange.Target.FUNCTION, + ksName, functionName, AbstractType.asCQLTypeStringList(argTypes))); } - public void onUpdateAggregate(String ksName, String aggregateName) + public void onUpdateAggregate(String ksName, String aggregateName, List> argTypes) { + server.connectionTracker.send(new Event.SchemaChange(Event.SchemaChange.Change.UPDATED, Event.SchemaChange.Target.AGGREGATE, + ksName, aggregateName, AbstractType.asCQLTypeStringList(argTypes))); } public void onDropKeyspace(String ksName) @@ -456,12 +466,16 @@ public void onDropUserType(String ksName, String typeName) server.connectionTracker.send(new Event.SchemaChange(Event.SchemaChange.Change.DROPPED, Event.SchemaChange.Target.TYPE, ksName, typeName)); } - public void onDropFunction(String ksName, String functionName) + public void onDropFunction(String ksName, String functionName, List> argTypes) { + server.connectionTracker.send(new Event.SchemaChange(Event.SchemaChange.Change.DROPPED, Event.SchemaChange.Target.FUNCTION, + ksName, functionName, AbstractType.asCQLTypeStringList(argTypes))); } - public void onDropAggregate(String ksName, String aggregateName) + public void onDropAggregate(String ksName, String aggregateName, List> argTypes) { + server.connectionTracker.send(new Event.SchemaChange(Event.SchemaChange.Change.DROPPED, Event.SchemaChange.Target.AGGREGATE, + ksName, aggregateName, AbstractType.asCQLTypeStringList(argTypes))); } } } diff --git a/test/unit/org/apache/cassandra/cql3/AggregationTest.java b/test/unit/org/apache/cassandra/cql3/AggregationTest.java index 940e87f63a80..1ddd1f18f47c 100644 --- a/test/unit/org/apache/cassandra/cql3/AggregationTest.java +++ b/test/unit/org/apache/cassandra/cql3/AggregationTest.java @@ -28,6 +28,7 @@ import org.junit.Test; import org.apache.cassandra.service.ClientState; +import org.apache.cassandra.transport.Event; import org.apache.cassandra.transport.messages.ResultMessage; public class AggregationTest extends CQLTester @@ -41,7 +42,7 @@ public void testFunctions() throws Throwable assertColumnNames(execute("SELECT COUNT(*) FROM %s"), "count"); assertRows(execute("SELECT COUNT(*) FROM %s"), row(0L)); assertColumnNames(execute("SELECT max(b), min(b), sum(b), avg(b) , max(c), sum(c), avg(c), sum(d), avg(d) FROM %s"), - "system.max(b)", "system.min(b)", "system.sum(b)", "system.avg(b)" , "system.max(c)", "system.sum(c)", "system.avg(c)", "system.sum(d)", "system.avg(d)"); + "system.max(b)", "system.min(b)", "system.sum(b)", "system.avg(b)", "system.max(c)", "system.sum(c)", "system.avg(c)", "system.sum(d)", "system.avg(d)"); assertRows(execute("SELECT max(b), min(b), sum(b), avg(b) , max(c), sum(c), avg(c), sum(d), avg(d) FROM %s"), row(null, null, 0, 0, null, 0.0, 0.0, new BigDecimal("0"), new BigDecimal("0"))); @@ -133,7 +134,7 @@ public void testNestedFunctions() throws Throwable } @Test - public void testDropStatements() throws Throwable + public void testSchemaChange() throws Throwable { String f = createFunction(KEYSPACE, "double, double", @@ -141,13 +142,66 @@ public void testDropStatements() throws Throwable "RETURNS double " + "LANGUAGE javascript " + "AS '\"string\";';"); + createFunctionOverload(f, + "double, double", + "CREATE OR REPLACE FUNCTION %s(state int, val int) " + + "RETURNS int " + + "LANGUAGE javascript " + + "AS '\"string\";';"); + + String a = createAggregate(KEYSPACE, + "double", + "CREATE OR REPLACE AGGREGATE %s(double) " + + "SFUNC " + shortFunctionName(f) + " " + + "STYPE double"); + + assertLastSchemaChange(Event.SchemaChange.Change.CREATED, Event.SchemaChange.Target.AGGREGATE, + KEYSPACE, parseFunctionName(a).name, + "double"); + + schemaChange("CREATE OR REPLACE AGGREGATE " + a + "(double) " + + "SFUNC " + shortFunctionName(f) + " " + + "STYPE double"); + + assertLastSchemaChange(Event.SchemaChange.Change.UPDATED, Event.SchemaChange.Target.AGGREGATE, + KEYSPACE, parseFunctionName(a).name, + "double"); + + createAggregateOverload(a, + "int", + "CREATE OR REPLACE AGGREGATE %s(int) " + + "SFUNC " + shortFunctionName(f) + " " + + "STYPE int"); + + assertLastSchemaChange(Event.SchemaChange.Change.CREATED, Event.SchemaChange.Target.AGGREGATE, + KEYSPACE, parseFunctionName(a).name, + "int"); + + schemaChange("DROP AGGREGATE " + a + "(double)"); + + assertLastSchemaChange(Event.SchemaChange.Change.DROPPED, Event.SchemaChange.Target.AGGREGATE, + KEYSPACE, parseFunctionName(a).name, + "double"); + } + + @Test + public void testDropStatements() throws Throwable + { + String f = createFunction(KEYSPACE, "double, double", - "CREATE OR REPLACE FUNCTION %s(state int, val int) " + - "RETURNS int " + + "CREATE OR REPLACE FUNCTION %s(state double, val double) " + + "RETURNS double " + "LANGUAGE javascript " + "AS '\"string\";';"); + createFunctionOverload(f, + "double, double", + "CREATE OR REPLACE FUNCTION %s(state int, val int) " + + "RETURNS int " + + "LANGUAGE javascript " + + "AS '\"string\";';"); + // DROP AGGREGATE must not succeed against a scalar assertInvalid("DROP AGGREGATE " + f); assertInvalid("DROP AGGREGATE " + f + "(double, double)"); diff --git a/test/unit/org/apache/cassandra/cql3/CQLTester.java b/test/unit/org/apache/cassandra/cql3/CQLTester.java index 36fe957f6613..5611ac620c7a 100644 --- a/test/unit/org/apache/cassandra/cql3/CQLTester.java +++ b/test/unit/org/apache/cassandra/cql3/CQLTester.java @@ -42,21 +42,25 @@ import com.datastax.driver.core.*; import com.datastax.driver.core.ResultSet; +import com.datastax.driver.core.Row; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.concurrent.ScheduledExecutors; import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.Schema; import org.apache.cassandra.cql3.functions.FunctionName; -import org.apache.cassandra.db.Directories; -import org.apache.cassandra.db.Keyspace; -import org.apache.cassandra.db.SystemKeyspace; +import org.apache.cassandra.cql3.statements.ParsedStatement; +import org.apache.cassandra.db.*; import org.apache.cassandra.db.marshal.*; import org.apache.cassandra.db.marshal.TupleType; import org.apache.cassandra.exceptions.*; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.serializers.TypeSerializer; +import org.apache.cassandra.service.ClientState; +import org.apache.cassandra.service.QueryState; import org.apache.cassandra.service.StorageService; +import org.apache.cassandra.transport.Event; import org.apache.cassandra.transport.Server; +import org.apache.cassandra.transport.messages.ResultMessage; /** * Base class for CQL tests. @@ -94,6 +98,8 @@ public abstract class CQLTester } } + public static ResultMessage lastSchemaChangeResult; + private List tables = new ArrayList<>(); private List types = new ArrayList<>(); private List functions = new ArrayList<>(); @@ -327,7 +333,7 @@ protected void createFunctionOverload(String functionName, String argTypes, Stri String fullQuery = String.format(query, functionName); functions.add(functionName + '(' + argTypes + ')'); logger.info(fullQuery); - execute(fullQuery); + schemaChange(fullQuery); } protected String createAggregate(String keyspace, String argTypes, String query) throws Throwable @@ -342,7 +348,7 @@ protected void createAggregateOverload(String aggregateName, String argTypes, St String fullQuery = String.format(query, aggregateName); aggregates.add(aggregateName + '(' + argTypes + ')'); logger.info(fullQuery); - execute(fullQuery); + schemaChange(fullQuery); } protected void createTable(String query) @@ -426,12 +432,33 @@ protected void dropIndex(String query) throws Throwable schemaChange(fullQuery); } - private static void schemaChange(String query) + protected void assertLastSchemaChange(Event.SchemaChange.Change change, Event.SchemaChange.Target target, + String keyspace, String name, + String... argTypes) + { + Assert.assertTrue(lastSchemaChangeResult instanceof ResultMessage.SchemaChange); + ResultMessage.SchemaChange schemaChange = (ResultMessage.SchemaChange) lastSchemaChangeResult; + Assert.assertSame(change, schemaChange.change.change); + Assert.assertSame(target, schemaChange.change.target); + Assert.assertEquals(keyspace, schemaChange.change.keyspace); + Assert.assertEquals(name, schemaChange.change.name); + Assert.assertEquals(argTypes != null ? Arrays.asList(argTypes) : null, schemaChange.change.argTypes); + } + + protected static void schemaChange(String query) { try { - // executeOnceInternal don't work for schema changes - QueryProcessor.executeOnceInternal(query); + ClientState state = ClientState.forInternalCalls(); + state.setKeyspace(SystemKeyspace.NAME); + QueryState queryState = new QueryState(state); + + ParsedStatement.Prepared prepared = QueryProcessor.parseStatement(query, queryState); + prepared.statement.validate(state); + + QueryOptions options = QueryOptions.forInternalCalls(Collections.emptyList()); + + lastSchemaChangeResult = prepared.statement.executeInternal(queryState, options); } catch (Exception e) { diff --git a/test/unit/org/apache/cassandra/cql3/UFTest.java b/test/unit/org/apache/cassandra/cql3/UFTest.java index fa28126777b9..ea1b2da09c7c 100644 --- a/test/unit/org/apache/cassandra/cql3/UFTest.java +++ b/test/unit/org/apache/cassandra/cql3/UFTest.java @@ -29,12 +29,54 @@ import org.apache.cassandra.cql3.functions.Functions; import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.service.ClientState; +import org.apache.cassandra.transport.Event; import org.apache.cassandra.transport.Server; import org.apache.cassandra.transport.messages.ResultMessage; public class UFTest extends CQLTester { + @Test + public void testSchemaChange() throws Throwable + { + String f = createFunction(KEYSPACE, + "double, double", + "CREATE OR REPLACE FUNCTION %s(state double, val double) " + + "RETURNS double " + + "LANGUAGE javascript " + + "AS '\"string\";';"); + + assertLastSchemaChange(Event.SchemaChange.Change.CREATED, Event.SchemaChange.Target.FUNCTION, + KEYSPACE, parseFunctionName(f).name, + "double", "double"); + + createFunctionOverload(f, + "double, double", + "CREATE OR REPLACE FUNCTION %s(state int, val int) " + + "RETURNS int " + + "LANGUAGE javascript " + + "AS '\"string\";';"); + + assertLastSchemaChange(Event.SchemaChange.Change.CREATED, Event.SchemaChange.Target.FUNCTION, + KEYSPACE, parseFunctionName(f).name, + "int", "int"); + + schemaChange("CREATE OR REPLACE FUNCTION " + f + "(state int, val int) " + + "RETURNS int " + + "LANGUAGE javascript " + + "AS '\"string\";';"); + + assertLastSchemaChange(Event.SchemaChange.Change.UPDATED, Event.SchemaChange.Target.FUNCTION, + KEYSPACE, parseFunctionName(f).name, + "int", "int"); + + schemaChange("DROP FUNCTION " + f + "(double, double)"); + + assertLastSchemaChange(Event.SchemaChange.Change.DROPPED, Event.SchemaChange.Target.FUNCTION, + KEYSPACE, parseFunctionName(f).name, + "double", "double"); + } + @Test public void testFunctionDropOnKeyspaceDrop() throws Throwable { @@ -245,7 +287,7 @@ public void testFunctionOverloading() throws Throwable // single-int-overload must still work assertRows(execute("SELECT v FROM %s WHERE k = " + fOverload + "((int)?)", 3), row(1)); // overloaded has just one overload now - so the following DROP FUNCTION is not ambigious (CASSANDRA-7812) - execute("DROP FUNCTION " + fOverload + ""); + execute("DROP FUNCTION " + fOverload); } @Test @@ -360,7 +402,7 @@ public void testJavaFunctionArgumentTypeMismatch() throws Throwable createTable("CREATE TABLE %s (key int primary key, val bigint)"); String fName = createFunction(KEYSPACE, "double", - "CREATE OR REPLACE FUNCTION " + KEYSPACE + ".jft(val double)" + + "CREATE OR REPLACE FUNCTION %s(val double)" + "RETURNS double LANGUAGE JAVA " + "AS 'return val;';"); diff --git a/test/unit/org/apache/cassandra/transport/SerDeserTest.java b/test/unit/org/apache/cassandra/transport/SerDeserTest.java index 649f7a2973cd..39bd58b138e2 100644 --- a/test/unit/org/apache/cassandra/transport/SerDeserTest.java +++ b/test/unit/org/apache/cassandra/transport/SerDeserTest.java @@ -94,6 +94,7 @@ public void eventSerDeserTest() throws Exception { eventSerDeserTest(2); eventSerDeserTest(3); + eventSerDeserTest(4); } public void eventSerDeserTest(int version) throws Exception @@ -122,6 +123,19 @@ public void eventSerDeserTest(int version) throws Exception events.add(new SchemaChange(SchemaChange.Change.DROPPED, SchemaChange.Target.TYPE, "ks", "type")); } + if (version >= 4) + { + List moreTypes = Arrays.asList("text", "bigint"); + + events.add(new SchemaChange(SchemaChange.Change.CREATED, SchemaChange.Target.FUNCTION, "ks", "func", Collections.emptyList())); + events.add(new SchemaChange(SchemaChange.Change.UPDATED, SchemaChange.Target.FUNCTION, "ks", "func", moreTypes)); + events.add(new SchemaChange(SchemaChange.Change.DROPPED, SchemaChange.Target.FUNCTION, "ks", "func", moreTypes)); + + events.add(new SchemaChange(SchemaChange.Change.CREATED, SchemaChange.Target.AGGREGATE, "ks", "aggr", Collections.emptyList())); + events.add(new SchemaChange(SchemaChange.Change.UPDATED, SchemaChange.Target.AGGREGATE, "ks", "aggr", moreTypes)); + events.add(new SchemaChange(SchemaChange.Change.DROPPED, SchemaChange.Target.AGGREGATE, "ks", "aggr", moreTypes)); + } + for (Event ev : events) { ByteBuf buf = Unpooled.buffer(ev.serializedSize(version)); From 493859bf617ac80f560d02ad6d471aefd6a0ef91 Mon Sep 17 00:00:00 2001 From: blerer Date: Wed, 7 Jan 2015 14:05:38 -0600 Subject: [PATCH 227/557] Allow mixing token and partition key restrictions Patch by Benjamin Lerer; reviewed by Tyler Hobbs for CASSANDRA-7016 --- CHANGES.txt | 1 + .../apache/cassandra/cql3/TokenRelation.java | 4 +- .../AbstractPrimaryKeyRestrictions.java | 12 + .../restrictions/MultiColumnRestriction.java | 4 +- .../SingleColumnPrimaryKeyRestrictions.java | 16 +- .../restrictions/StatementRestrictions.java | 5 +- .../cql3/restrictions/TokenFilter.java | 237 ++++++++++++++++++ .../cql3/restrictions/TokenRestriction.java | 57 +++-- .../cql3/SelectWithTokenFunctionTest.java | 139 +++++++++- 9 files changed, 439 insertions(+), 36 deletions(-) create mode 100644 src/java/org/apache/cassandra/cql3/restrictions/TokenFilter.java diff --git a/CHANGES.txt b/CHANGES.txt index 8ccc0149124a..9f946a35177c 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0 + * Allow mixing token and partition key restrictions (CASSANDRA-7016) * Support index key/value entries on map collections (CASSANDRA-8473) * Modernize schema tables (CASSANDRA-8261) * Support for user-defined aggregation functions (CASSANDRA-8053) diff --git a/src/java/org/apache/cassandra/cql3/TokenRelation.java b/src/java/org/apache/cassandra/cql3/TokenRelation.java index d1bd265148b7..5896fae130b0 100644 --- a/src/java/org/apache/cassandra/cql3/TokenRelation.java +++ b/src/java/org/apache/cassandra/cql3/TokenRelation.java @@ -69,7 +69,7 @@ protected Restriction newEQRestriction(CFMetaData cfm, VariableSpecifications bo { List columnDefs = getColumnDefinitions(cfm); Term term = toTerm(toReceivers(cfm, columnDefs), value, cfm.ksName, boundNames); - return new TokenRestriction.EQ(columnDefs, term); + return new TokenRestriction.EQ(cfm.getKeyValidatorAsCType(), columnDefs, term); } @Override @@ -86,7 +86,7 @@ protected Restriction newSliceRestriction(CFMetaData cfm, { List columnDefs = getColumnDefinitions(cfm); Term term = toTerm(toReceivers(cfm, columnDefs), value, cfm.ksName, boundNames); - return new TokenRestriction.Slice(columnDefs, bound, inclusive, term); + return new TokenRestriction.Slice(cfm.getKeyValidatorAsCType(), columnDefs, bound, inclusive, term); } @Override diff --git a/src/java/org/apache/cassandra/cql3/restrictions/AbstractPrimaryKeyRestrictions.java b/src/java/org/apache/cassandra/cql3/restrictions/AbstractPrimaryKeyRestrictions.java index f137a776f518..01076033e443 100644 --- a/src/java/org/apache/cassandra/cql3/restrictions/AbstractPrimaryKeyRestrictions.java +++ b/src/java/org/apache/cassandra/cql3/restrictions/AbstractPrimaryKeyRestrictions.java @@ -17,11 +17,23 @@ */ package org.apache.cassandra.cql3.restrictions; +import org.apache.cassandra.db.composites.CType; + /** * Base class for PrimaryKeyRestrictions. */ abstract class AbstractPrimaryKeyRestrictions extends AbstractRestriction implements PrimaryKeyRestrictions { + /** + * The composite type. + */ + protected final CType ctype; + + public AbstractPrimaryKeyRestrictions(CType ctype) + { + this.ctype = ctype; + } + @Override public final boolean isEmpty() { diff --git a/src/java/org/apache/cassandra/cql3/restrictions/MultiColumnRestriction.java b/src/java/org/apache/cassandra/cql3/restrictions/MultiColumnRestriction.java index e3b3c4cfda6c..2d6deebe7c21 100644 --- a/src/java/org/apache/cassandra/cql3/restrictions/MultiColumnRestriction.java +++ b/src/java/org/apache/cassandra/cql3/restrictions/MultiColumnRestriction.java @@ -43,8 +43,6 @@ public abstract class MultiColumnRestriction extends AbstractPrimaryKeyRestrictions { - protected final CType ctype; - /** * The columns to which the restriction apply. */ @@ -52,7 +50,7 @@ public abstract class MultiColumnRestriction extends AbstractPrimaryKeyRestricti public MultiColumnRestriction(CType ctype, List columnDefs) { - this.ctype = ctype; + super(ctype); this.columnDefs = columnDefs; } diff --git a/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnPrimaryKeyRestrictions.java b/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnPrimaryKeyRestrictions.java index 5c8386e44461..d2a3885094c3 100644 --- a/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnPrimaryKeyRestrictions.java +++ b/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnPrimaryKeyRestrictions.java @@ -42,11 +42,6 @@ */ final class SingleColumnPrimaryKeyRestrictions extends AbstractPrimaryKeyRestrictions { - /** - * The composite type. - */ - private final CType ctype; - /** * The restrictions. */ @@ -74,7 +69,7 @@ final class SingleColumnPrimaryKeyRestrictions extends AbstractPrimaryKeyRestric public SingleColumnPrimaryKeyRestrictions(CType ctype) { - this.ctype = ctype; + super(ctype); this.restrictions = new SingleColumnRestrictions(); this.eq = true; } @@ -82,8 +77,8 @@ public SingleColumnPrimaryKeyRestrictions(CType ctype) private SingleColumnPrimaryKeyRestrictions(SingleColumnPrimaryKeyRestrictions primaryKeyRestrictions, SingleColumnRestriction restriction) throws InvalidRequestException { + super(primaryKeyRestrictions.ctype); this.restrictions = primaryKeyRestrictions.restrictions.addRestriction(restriction); - this.ctype = primaryKeyRestrictions.ctype; if (!primaryKeyRestrictions.isEmpty()) { @@ -166,9 +161,10 @@ public PrimaryKeyRestrictions mergeWith(Restriction restriction) throws InvalidR if (restriction.isOnToken()) { - checkTrue(isEmpty(), "Columns \"%s\" cannot be restricted by both a normal relation and a token relation", - ((TokenRestriction) restriction).getColumnNamesAsString()); - return (PrimaryKeyRestrictions) restriction; + if (isEmpty()) + return (PrimaryKeyRestrictions) restriction; + + return new TokenFilter(this, (TokenRestriction) restriction); } return new SingleColumnPrimaryKeyRestrictions(this, (SingleColumnRestriction) restriction); diff --git a/src/java/org/apache/cassandra/cql3/restrictions/StatementRestrictions.java b/src/java/org/apache/cassandra/cql3/restrictions/StatementRestrictions.java index 60c7465b5456..598478c4a649 100644 --- a/src/java/org/apache/cassandra/cql3/restrictions/StatementRestrictions.java +++ b/src/java/org/apache/cassandra/cql3/restrictions/StatementRestrictions.java @@ -259,10 +259,9 @@ private void processPartitionKeyRestrictions(boolean hasQueriableIndex) throws I // If a component of the partition key is restricted by a relation, all preceding // components must have a EQ. Only the last partition key component can be in IN relation. if (partitionKeyRestrictions.isOnToken()) - { isKeyRange = true; - } - else if (hasPartitionKeyUnrestrictedComponents()) + + if (hasPartitionKeyUnrestrictedComponents()) { if (!partitionKeyRestrictions.isEmpty()) { diff --git a/src/java/org/apache/cassandra/cql3/restrictions/TokenFilter.java b/src/java/org/apache/cassandra/cql3/restrictions/TokenFilter.java new file mode 100644 index 000000000000..4b5383b67244 --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/restrictions/TokenFilter.java @@ -0,0 +1,237 @@ +/* + * 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.cql3.restrictions; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.List; + +import com.google.common.collect.BoundType; +import com.google.common.collect.ImmutableRangeSet; +import com.google.common.collect.Range; +import com.google.common.collect.RangeSet; + +import org.apache.cassandra.cql3.QueryOptions; +import org.apache.cassandra.cql3.statements.Bound; +import org.apache.cassandra.db.composites.Composite; +import org.apache.cassandra.dht.IPartitioner; +import org.apache.cassandra.dht.Token; +import org.apache.cassandra.exceptions.InvalidRequestException; +import org.apache.cassandra.service.StorageService; + +import static org.apache.cassandra.cql3.statements.Bound.END; +import static org.apache.cassandra.cql3.statements.Bound.START; + +/** + * Restriction decorator used to merge non-token restriction and token restriction on partition keys. + */ +final class TokenFilter extends ForwardingPrimaryKeyRestrictions +{ + /** + * The decorated restriction + */ + private PrimaryKeyRestrictions restrictions; + + /** + * The restriction on the token + */ + private TokenRestriction tokenRestriction; + + /** + * The partitioner + */ + private static final IPartitioner partitioner = StorageService.getPartitioner(); + + @Override + protected PrimaryKeyRestrictions getDelegate() + { + return restrictions; + } + + @Override + public boolean isOnToken() + { + // if all partition key columns have non-token restrictions, we can simply use the token range to filter + // those restrictions and then ignore the token range + return restrictions.size() < tokenRestriction.size(); + } + + public TokenFilter(PrimaryKeyRestrictions restrictions, TokenRestriction tokenRestriction) + { + this.restrictions = restrictions; + this.tokenRestriction = tokenRestriction; + } + + @Override + public List values(QueryOptions options) throws InvalidRequestException + { + return filter(restrictions.values(options), options); + } + + @Override + public List valuesAsComposites(QueryOptions options) throws InvalidRequestException + { + throw new UnsupportedOperationException(); + } + + @Override + public PrimaryKeyRestrictions mergeWith(Restriction restriction) throws InvalidRequestException + { + if (restriction.isOnToken()) + return new TokenFilter(restrictions, (TokenRestriction) tokenRestriction.mergeWith(restriction)); + + return new TokenFilter(super.mergeWith(restriction), tokenRestriction); + } + + @Override + public boolean isInclusive(Bound bound) + { + return tokenRestriction.isInclusive(bound); + } + + @Override + public boolean hasBound(Bound b) + { + return tokenRestriction.hasBound(b); + } + + @Override + public List bounds(Bound bound, QueryOptions options) throws InvalidRequestException + { + return tokenRestriction.bounds(bound, options); + } + + @Override + public List boundsAsComposites(Bound bound, QueryOptions options) throws InvalidRequestException + { + return tokenRestriction.boundsAsComposites(bound, options); + } + + /** + * Filter the values returned by the restriction. + * + * @param values the values returned by the decorated restriction + * @param options the query options + * @return the values matching the token restriction + * @throws InvalidRequestException if the request is invalid + */ + private List filter(List values, QueryOptions options) throws InvalidRequestException + { + RangeSet rangeSet = tokenRestriction.isSlice() ? toRangeSet(tokenRestriction, options) + : toRangeSet(tokenRestriction.values(options)); + + return filterWithRangeSet(rangeSet, values); + } + + /** + * Filter out the values for which the tokens are not included within the specified range. + * + * @param tokens the tokens range + * @param values the restricted values + * @return the values for which the tokens are not included within the specified range. + */ + private static List filterWithRangeSet(RangeSet tokens, List values) + { + List remaining = new ArrayList<>(); + + for (ByteBuffer value : values) + { + Token token = partitioner.getToken(value); + + if (!tokens.contains(token)) + continue; + + remaining.add(value); + } + return remaining; + } + + /** + * Converts the specified list into a range set. + * + * @param buffers the token restriction values + * @return the range set corresponding to the specified list + */ + private static RangeSet toRangeSet(List buffers) + { + ImmutableRangeSet.Builder builder = ImmutableRangeSet.builder(); + + for (ByteBuffer buffer : buffers) + builder.add(Range.singleton(deserializeToken(buffer))); + + return builder.build(); + } + + /** + * Converts the specified slice into a range set. + * + * @param slice the slice to convert + * @param options the query option + * @return the range set corresponding to the specified slice + * @throws InvalidRequestException if the request is invalid + */ + private static RangeSet toRangeSet(TokenRestriction slice, QueryOptions options) throws InvalidRequestException + { + if (slice.hasBound(START)) + { + Token start = deserializeToken(slice.bounds(START, options).get(0)); + + BoundType startBoundType = toBoundType(slice.isInclusive(START)); + BoundType endBoundType = toBoundType(slice.isInclusive(END)); + + if (slice.hasBound(END)) + { + Token end = deserializeToken(slice.bounds(END, options).get(0)); + + if (start.equals(end) && (BoundType.OPEN == startBoundType || BoundType.OPEN == endBoundType)) + return ImmutableRangeSet.of(); + + if (start.compareTo(end) <= 0) + return ImmutableRangeSet.of(Range.range(start, + startBoundType, + end, + endBoundType)); + + return ImmutableRangeSet. builder() + .add(Range.upTo(end, endBoundType)) + .add(Range.downTo(start, startBoundType)) + .build(); + } + return ImmutableRangeSet.of(Range.downTo(start, + startBoundType)); + } + Token end = deserializeToken(slice.bounds(END, options).get(0)); + return ImmutableRangeSet.of(Range.upTo(end, toBoundType(slice.isInclusive(END)))); + } + + /** + * Deserializes the token corresponding to the specified buffer. + * + * @param buffer the buffer + * @return the token corresponding to the specified buffer + */ + private static Token deserializeToken(ByteBuffer buffer) + { + return partitioner.getTokenFactory().fromByteArray(buffer); + } + + private static BoundType toBoundType(boolean inclusive) + { + return inclusive ? BoundType.CLOSED : BoundType.OPEN; + } +} diff --git a/src/java/org/apache/cassandra/cql3/restrictions/TokenRestriction.java b/src/java/org/apache/cassandra/cql3/restrictions/TokenRestriction.java index 85d614eded49..8d63feaba1e6 100644 --- a/src/java/org/apache/cassandra/cql3/restrictions/TokenRestriction.java +++ b/src/java/org/apache/cassandra/cql3/restrictions/TokenRestriction.java @@ -29,6 +29,7 @@ import org.apache.cassandra.cql3.Term; import org.apache.cassandra.cql3.statements.Bound; import org.apache.cassandra.db.IndexExpression; +import org.apache.cassandra.db.composites.CType; import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.db.index.SecondaryIndexManager; import org.apache.cassandra.exceptions.InvalidRequestException; @@ -48,10 +49,12 @@ public abstract class TokenRestriction extends AbstractPrimaryKeyRestrictions /** * Creates a new TokenRestriction that apply to the specified columns. * + * @param ctype the composite type * @param columnDefs the definition of the columns to which apply the token restriction */ - public TokenRestriction(List columnDefs) + public TokenRestriction(CType ctype, List columnDefs) { + super(ctype); this.columnDefs = columnDefs; } @@ -101,13 +104,43 @@ protected final String getColumnNamesAsString() return Joiner.on(", ").join(ColumnDefinition.toIdentifiers(columnDefs)); } + @Override + public final PrimaryKeyRestrictions mergeWith(Restriction otherRestriction) throws InvalidRequestException + { + if (!otherRestriction.isOnToken()) + return new TokenFilter(toPrimaryKeyRestriction(otherRestriction), this); + + return doMergeWith((TokenRestriction) otherRestriction); + } + + /** + * Merges this restriction with the specified TokenRestriction. + * @param otherRestriction the TokenRestriction to merge with. + */ + protected abstract PrimaryKeyRestrictions doMergeWith(TokenRestriction otherRestriction) throws InvalidRequestException; + + /** + * Converts the specified restriction into a PrimaryKeyRestrictions. + * + * @param restriction the restriction to convert + * @return a PrimaryKeyRestrictions + * @throws InvalidRequestException if a problem occurs while converting the restriction + */ + private PrimaryKeyRestrictions toPrimaryKeyRestriction(Restriction restriction) throws InvalidRequestException + { + if (restriction instanceof PrimaryKeyRestrictions) + return (PrimaryKeyRestrictions) restriction; + + return new SingleColumnPrimaryKeyRestrictions(ctype).mergeWith(restriction); + } + public static final class EQ extends TokenRestriction { private final Term value; - public EQ(List columnDefs, Term value) + public EQ(CType ctype, List columnDefs, Term value) { - super(columnDefs); + super(ctype, columnDefs); this.value = value; } @@ -124,7 +157,7 @@ public boolean usesFunction(String ksName, String functionName) } @Override - public PrimaryKeyRestrictions mergeWith(Restriction restriction) throws InvalidRequestException + protected PrimaryKeyRestrictions doMergeWith(TokenRestriction otherRestriction) throws InvalidRequestException { throw invalidRequest("%s cannot be restricted by more than one relation if it includes an Equal", Joiner.on(", ").join(ColumnDefinition.toIdentifiers(columnDefs))); @@ -141,9 +174,9 @@ public static class Slice extends TokenRestriction { private final TermSlice slice; - public Slice(List columnDefs, Bound bound, boolean inclusive, Term term) + public Slice(CType ctype, List columnDefs, Bound bound, boolean inclusive, Term term) { - super(columnDefs); + super(ctype, columnDefs); slice = TermSlice.newInstance(bound, inclusive, term); } @@ -185,13 +218,9 @@ public boolean isInclusive(Bound b) } @Override - public PrimaryKeyRestrictions mergeWith(Restriction otherRestriction) + protected PrimaryKeyRestrictions doMergeWith(TokenRestriction otherRestriction) throws InvalidRequestException { - if (!otherRestriction.isOnToken()) - throw invalidRequest("Columns \"%s\" cannot be restricted by both a normal relation and a token relation", - getColumnNamesAsString()); - if (!otherRestriction.isSlice()) throw invalidRequest("Columns \"%s\" cannot be restricted by both an equality and an inequality relation", getColumnNamesAsString()); @@ -206,7 +235,7 @@ public PrimaryKeyRestrictions mergeWith(Restriction otherRestriction) throw invalidRequest("More than one restriction was found for the end bound on %s", getColumnNamesAsString()); - return new Slice(columnDefs, slice.merge(otherSlice.slice)); + return new Slice(ctype, columnDefs, slice.merge(otherSlice.slice)); } @Override @@ -215,9 +244,9 @@ public String toString() return String.format("SLICE%s", slice); } - private Slice(List columnDefs, TermSlice slice) + private Slice(CType ctype, List columnDefs, TermSlice slice) { - super(columnDefs); + super(ctype, columnDefs); this.slice = slice; } } diff --git a/test/unit/org/apache/cassandra/cql3/SelectWithTokenFunctionTest.java b/test/unit/org/apache/cassandra/cql3/SelectWithTokenFunctionTest.java index 39b62e37c175..a365c09a3e6f 100644 --- a/test/unit/org/apache/cassandra/cql3/SelectWithTokenFunctionTest.java +++ b/test/unit/org/apache/cassandra/cql3/SelectWithTokenFunctionTest.java @@ -17,6 +17,8 @@ */ package org.apache.cassandra.cql3; +import java.util.Arrays; + import org.junit.Test; public class SelectWithTokenFunctionTest extends CQLTester @@ -30,10 +32,6 @@ public void testTokenFunctionWithSingleColumnPartitionKey() throws Throwable assertRows(execute("SELECT * FROM %s WHERE token(a) >= token(?)", 0), row(0, "a")); assertRows(execute("SELECT * FROM %s WHERE token(a) >= token(?) and token(a) < token(?)", 0, 1), row(0, "a")); assertInvalid("SELECT * FROM %s WHERE token(a) > token(?)", "a"); - assertInvalidMessage("Columns \"a\" cannot be restricted by both a normal relation and a token relation", - "SELECT * FROM %s WHERE token(a) > token(?) AND a = ?", 1, 1); - assertInvalidMessage("Columns \"a\" cannot be restricted by both a normal relation and a token relation", - "SELECT * FROM %s WHERE a = ? and token(a) > token(?)", 1, 1); assertInvalidMessage("The token() function must contains only partition key components", "SELECT * FROM %s WHERE token(a, b) >= token(?, ?)", "b", 0); assertInvalidMessage("More than one restriction was found for the start bound on a", @@ -88,4 +86,137 @@ public void testTokenFunctionWithMultiColumnPartitionKey() throws Throwable assertInvalidMessage("The token() function must be applied to all partition key components or none of them", "SELECT * FROM %s WHERE token(a) > token(?, ?) and token(b) > token(?, ?)", 0, "a", 0, "a"); } + + @Test + public void testSingleColumnPartitionKeyWithTokenNonTokenRestrictionsMix() throws Throwable + { + createTable("CREATE TABLE %s (a int primary key, b int)"); + + execute("INSERT INTO %s (a, b) VALUES (0, 0);"); + execute("INSERT INTO %s (a, b) VALUES (1, 1);"); + execute("INSERT INTO %s (a, b) VALUES (2, 2);"); + execute("INSERT INTO %s (a, b) VALUES (3, 3);"); + execute("INSERT INTO %s (a, b) VALUES (4, 4);"); + assertRows(execute("SELECT * FROM %s WHERE a IN (?, ?);", 1, 3), + row(1, 1), + row(3, 3)); + assertRows(execute("SELECT * FROM %s WHERE token(a)> token(?) and token(a) <= token(?);", 1, 3), + row(2, 2), + row(3, 3)); + assertRows(execute("SELECT * FROM %s WHERE token(a)= token(2);"), + row(2, 2)); + assertRows(execute("SELECT * FROM %s WHERE token(a) > token(?) AND token(a) <= token(?) AND a IN (?, ?);", + 1, 3, 1, 3), + row(3, 3)); + assertRows(execute("SELECT * FROM %s WHERE token(a) < token(?) AND token(a) >= token(?) AND a IN (?, ?);", + 1, 3, 1, 3), + row(3, 3)); + assertInvalidMessage("Only EQ and IN relation are supported on the partition key (unless you use the token() function)", + "SELECT * FROM %s WHERE token(a) > token(?) AND token(a) <= token(?) AND a > ?;", 1, 3, 1); + + assertRows(execute("SELECT * FROM %s WHERE token(a) > token(?) AND token(a) <= token(?) AND a IN ?;", + 1, 3, Arrays.asList(1, 3)), + row(3, 3)); + assertRows(execute("SELECT * FROM %s WHERE token(a) > token(?) AND a = ?;", 1, 3), + row(3, 3)); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND token(a) > token(?);", 3, 1), + row(3, 3)); + assertEmpty(execute("SELECT * FROM %s WHERE token(a) > token(?) AND a = ?;", 3, 1)); + assertEmpty(execute("SELECT * FROM %s WHERE a = ? AND token(a) > token(?);", 1, 3)); + assertRows(execute("SELECT * FROM %s WHERE token(a) > token(?) AND a IN (?, ?);", 2, 1, 3), + row(3, 3)); + assertRows(execute("SELECT * FROM %s WHERE token(a) > token(?) AND token(a) < token(?) AND a IN (?, ?) ;", 2, 5, 1, 3), + row(3, 3)); + assertRows(execute("SELECT * FROM %s WHERE a IN (?, ?) AND token(a) > token(?) AND token(a) < token(?);", 1, 3, 2, 5), + row(3, 3)); + assertRows(execute("SELECT * FROM %s WHERE token(a) > token(?) AND a IN (?, ?) AND token(a) < token(?);", 2, 1, 3, 5), + row(3, 3)); + assertEmpty(execute("SELECT * FROM %s WHERE a IN (?, ?) AND token(a) > token(?);", 1, 3, 3)); + assertRows(execute("SELECT * FROM %s WHERE token(a) <= token(?) AND a = ?;", 2, 2), + row(2, 2)); + assertEmpty(execute("SELECT * FROM %s WHERE token(a) <= token(?) AND a = ?;", 2, 3)); + assertEmpty(execute("SELECT * FROM %s WHERE token(a) = token(?) AND a = ?;", 2, 3)); + assertRows(execute("SELECT * FROM %s WHERE token(a) >= token(?) AND token(a) <= token(?) AND a = ?;", 2, 2, 2), + row(2, 2)); + assertEmpty(execute("SELECT * FROM %s WHERE token(a) >= token(?) AND token(a) < token(?) AND a = ?;", 2, 2, 2)); + assertEmpty(execute("SELECT * FROM %s WHERE token(a) > token(?) AND token(a) <= token(?) AND a = ?;", 2, 2, 2)); + assertEmpty(execute("SELECT * FROM %s WHERE token(a) > token(?) AND token(a) < token(?) AND a = ?;", 2, 2, 2)); + } + + @Test + public void testMultiColumnPartitionKeyWithTokenNonTokenRestrictionsMix() throws Throwable + { + createTable("CREATE TABLE %s (a int, b int, c int, primary key((a, b)))"); + + execute("INSERT INTO %s (a, b, c) VALUES (0, 0, 0);"); + execute("INSERT INTO %s (a, b, c) VALUES (0, 1, 1);"); + execute("INSERT INTO %s (a, b, c) VALUES (0, 2, 2);"); + execute("INSERT INTO %s (a, b, c) VALUES (1, 0, 3);"); + execute("INSERT INTO %s (a, b, c) VALUES (1, 1, 4);"); + + assertRows(execute("SELECT * FROM %s WHERE token(a, b) > token(?, ?);", 0, 0), + row(0, 1, 1), + row(0, 2, 2), + row(1, 0, 3), + row(1, 1, 4)); + + assertRows(execute("SELECT * FROM %s WHERE token(a, b) > token(?, ?) AND a = ? AND b IN (?, ?);", + 0, 0, 1, 0, 1), + row(1, 0, 3), + row(1, 1, 4)); + + assertRows(execute("SELECT * FROM %s WHERE a = ? AND token(a, b) > token(?, ?) AND b IN (?, ?);", + 1, 0, 0, 0, 1), + row(1, 0, 3), + row(1, 1, 4)); + + assertRows(execute("SELECT * FROM %s WHERE b IN (?, ?) AND token(a, b) > token(?, ?) AND a = ?;", + 0, 1, 0, 0, 1), + row(1, 0, 3), + row(1, 1, 4)); + + assertEmpty(execute("SELECT * FROM %s WHERE b IN (?, ?) AND token(a, b) > token(?, ?) AND token(a, b) < token(?, ?) AND a = ?;", + 0, 1, 0, 0, 0, 0, 1)); + + assertEmpty(execute("SELECT * FROM %s WHERE b IN (?, ?) AND token(a, b) > token(?, ?) AND token(a, b) <= token(?, ?) AND a = ?;", + 0, 1, 0, 0, 0, 0, 1)); + + assertEmpty(execute("SELECT * FROM %s WHERE b IN (?, ?) AND token(a, b) >= token(?, ?) AND token(a, b) < token(?, ?) AND a = ?;", + 0, 1, 0, 0, 0, 0, 1)); + + assertEmpty(execute("SELECT * FROM %s WHERE b IN (?, ?) AND token(a, b) = token(?, ?) AND a = ?;", + 0, 1, 0, 0, 1)); + + assertInvalidMessage("Partition key parts: b must be restricted as other parts are", + "SELECT * FROM %s WHERE token(a, b) > token(?, ?) AND a = ?;", 0, 0, 1); + } + + @Test + public void testMultiColumnPartitionKeyWithIndexAndTokenNonTokenRestrictionsMix() throws Throwable + { + createTable("CREATE TABLE %s (a int, b int, c int, primary key((a, b)))"); + createIndex("CREATE INDEX ON %s(b)"); + createIndex("CREATE INDEX ON %s(c)"); + + execute("INSERT INTO %s (a, b, c) VALUES (0, 0, 0);"); + execute("INSERT INTO %s (a, b, c) VALUES (0, 1, 1);"); + execute("INSERT INTO %s (a, b, c) VALUES (0, 2, 2);"); + execute("INSERT INTO %s (a, b, c) VALUES (1, 0, 3);"); + execute("INSERT INTO %s (a, b, c) VALUES (1, 1, 4);"); + + assertRows(execute("SELECT * FROM %s WHERE b = ?;", 1), + row(0, 1, 1), + row(1, 1, 4)); + + assertRows(execute("SELECT * FROM %s WHERE token(a, b) > token(?, ?) AND b = ?;", 0, 0, 1), + row(0, 1, 1), + row(1, 1, 4)); + + assertRows(execute("SELECT * FROM %s WHERE b = ? AND token(a, b) > token(?, ?);", 1, 0, 0), + row(0, 1, 1), + row(1, 1, 4)); + + assertRows(execute("SELECT * FROM %s WHERE b = ? AND token(a, b) > token(?, ?) and c = ? ALLOW FILTERING;", 1, 0, 0, 4), + row(1, 1, 4)); + } } From 028fd2950195479b90d21ee1bd795cf1a9c661e7 Mon Sep 17 00:00:00 2001 From: Tyler Hobbs Date: Thu, 8 Jan 2015 11:27:09 -0600 Subject: [PATCH 228/557] Fix create index statement unit tests on trunk Patch by Benjamin Lerer; reviewed by Tyler Hobbs as a follow-up for CASSANDRA-8365 --- .../org/apache/cassandra/cql3/CreateIndexStatementTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/org/apache/cassandra/cql3/CreateIndexStatementTest.java b/test/unit/org/apache/cassandra/cql3/CreateIndexStatementTest.java index 18e1be530da3..847466ecbfe4 100644 --- a/test/unit/org/apache/cassandra/cql3/CreateIndexStatementTest.java +++ b/test/unit/org/apache/cassandra/cql3/CreateIndexStatementTest.java @@ -79,7 +79,7 @@ private void testCreateAndDropIndex(String indexName, boolean addKeyspaceOnDrop) else { execute("USE " + KEYSPACE); - dropIndex("DROP INDEX " + indexName); + execute("DROP INDEX " + indexName); } assertInvalidMessage("No secondary indexes on the restricted columns support the provided operators", From 2b4029a763173af31633274844a4a3de1f73fa99 Mon Sep 17 00:00:00 2001 From: Joshua McKenzie Date: Thu, 8 Jan 2015 11:49:09 -0600 Subject: [PATCH 229/557] Switch CommitLogSegment from RandomAccessFile to nio Patch by jmckenzie; reviewed by belliottsmith for CASSANDRA-8308 --- CHANGES.txt | 1 + .../db/commitlog/CommitLogSegment.java | 42 ++++++++++++------- .../org/apache/cassandra/utils/CLibrary.java | 21 +++++++++- .../org/apache/cassandra/SchemaLoader.java | 11 ++++- 4 files changed, 57 insertions(+), 18 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 9f946a35177c..71ccc5823a5a 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0 + * Switch CommitLogSegment from RandomAccessFile to nio (CASSANDRA-8308) * Allow mixing token and partition key restrictions (CASSANDRA-7016) * Support index key/value entries on map collections (CASSANDRA-8473) * Modernize schema tables (CASSANDRA-8261) diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java b/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java index 185f57a03b5e..3383f1e2cd78 100644 --- a/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java +++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java @@ -23,6 +23,7 @@ import java.nio.ByteBuffer; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; +import java.nio.file.StandardOpenOption; import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; @@ -104,7 +105,7 @@ public class CommitLogSegment public final long id; private final File logFile; - private final RandomAccessFile logFileAccessor; + private final FileChannel channel; private final int fd; private final MappedByteBuffer buffer; @@ -134,7 +135,6 @@ static long getNextId() id = getNextId(); descriptor = new CommitLogDescriptor(id); logFile = new File(DatabaseDescriptor.getCommitLogLocation(), descriptor.fileName()); - boolean isCreating = true; try { @@ -147,25 +147,37 @@ static long getNextId() logger.debug("Re-using discarded CommitLog segment for {} from {}", id, filePath); if (!oldFile.renameTo(logFile)) throw new IOException("Rename from " + filePath + " to " + id + " failed"); - isCreating = false; + } + else + { + logger.debug("Creating new CommitLog segment: " + logFile); } } - // Open the initial the segment file - logFileAccessor = new RandomAccessFile(logFile, "rw"); + // Extend or truncate the file size to the standard segment size as we may have restarted after a segment + // size configuration change, leaving "incorrectly" sized segments on disk. + // NOTE: while we're using RAF to allow extension of file on disk w/out sparse, we need to avoid using RAF + // for grabbing the FileChannel due to FILE_SHARE_DELETE flag bug on windows. + // See: https://bugs.openjdk.java.net/browse/JDK-6357433 and CASSANDRA-8308 + if (logFile.length() != DatabaseDescriptor.getCommitLogSegmentSize()) + { + try (RandomAccessFile raf = new RandomAccessFile(logFile, "rw")) + { + raf.setLength(DatabaseDescriptor.getCommitLogSegmentSize()); + } + catch (IOException e) + { + throw new FSWriteError(e, logFile); + } + } - if (isCreating) - logger.debug("Creating new commit log segment {}", logFile.getPath()); + channel = FileChannel.open(logFile.toPath(), StandardOpenOption.WRITE, StandardOpenOption.READ); - // Map the segment, extending or truncating it to the standard segment size. - // (We may have restarted after a segment size configuration change, leaving "incorrectly" - // sized segments on disk.) - logFileAccessor.setLength(DatabaseDescriptor.getCommitLogSegmentSize()); - fd = CLibrary.getfd(logFileAccessor.getFD()); + fd = CLibrary.getfd(channel); + buffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, DatabaseDescriptor.getCommitLogSegmentSize()); - buffer = logFileAccessor.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, DatabaseDescriptor.getCommitLogSegmentSize()); - // write the header CommitLogDescriptor.writeHeader(buffer, descriptor); + // mark the initial sync marker as uninitialised buffer.putInt(CommitLogDescriptor.HEADER_SIZE, 0); buffer.putLong(CommitLogDescriptor.HEADER_SIZE + 4, 0); @@ -415,7 +427,7 @@ void close() { if (FileUtils.isCleanerAvailable()) FileUtils.clean(buffer); - logFileAccessor.close(); + channel.close(); } catch (IOException e) { diff --git a/src/java/org/apache/cassandra/utils/CLibrary.java b/src/java/org/apache/cassandra/utils/CLibrary.java index b2595f6f0bd0..4dbd904fb032 100644 --- a/src/java/org/apache/cassandra/utils/CLibrary.java +++ b/src/java/org/apache/cassandra/utils/CLibrary.java @@ -20,6 +20,7 @@ import java.io.FileDescriptor; import java.io.RandomAccessFile; import java.lang.reflect.Field; +import java.nio.channels.FileChannel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -276,6 +277,24 @@ public static void tryCloseFD(int fd) } } + public static int getfd(FileChannel channel) + { + Field field = FBUtilities.getProtectedField(channel.getClass(), "fd"); + + if (field == null) + return -1; + + try + { + return getfd((FileDescriptor)field.get(channel)); + } + catch (IllegalArgumentException|IllegalAccessException e) + { + logger.warn("Unable to read fd field from FileChannel"); + } + return -1; + } + /** * Get system file descriptor from FileDescriptor object. * @param descriptor - FileDescriptor objec to get fd from @@ -295,7 +314,7 @@ public static int getfd(FileDescriptor descriptor) catch (Exception e) { JVMStabilityInspector.inspectThrowable(e); - logger.warn("unable to read fd field from FileDescriptor"); + logger.warn("Unable to read fd field from FileDescriptor"); } return -1; diff --git a/test/unit/org/apache/cassandra/SchemaLoader.java b/test/unit/org/apache/cassandra/SchemaLoader.java index 2fcfd55a93d8..2be4cc075f54 100644 --- a/test/unit/org/apache/cassandra/SchemaLoader.java +++ b/test/unit/org/apache/cassandra/SchemaLoader.java @@ -419,6 +419,7 @@ public static CFMetaData jdbcSparseCFMD(String ksName, String cfName, AbstractTy public static void cleanupAndLeaveDirs() { + CommitLog.instance.resetUnsafe(); // unmap CLS before attempting to delete or Windows complains mkdirs(); cleanup(); mkdirs(); @@ -434,7 +435,11 @@ public static void cleanup() File dir = new File(dirName); if (!dir.exists()) throw new RuntimeException("No such directory: " + dir.getAbsolutePath()); - FileUtils.deleteRecursive(dir); + + // Leave the folder around as Windows will complain about directory deletion w/handles open to children files + String[] children = dir.list(); + for (String child : children) + FileUtils.deleteRecursive(new File(dir, child)); } cleanupSavedCaches(); @@ -445,7 +450,9 @@ public static void cleanup() File dir = new File(dirName); if (!dir.exists()) throw new RuntimeException("No such directory: " + dir.getAbsolutePath()); - FileUtils.deleteRecursive(dir); + String[] children = dir.list(); + for (String child : children) + FileUtils.deleteRecursive(new File(dir, child)); } } From 39a2410add2c435ea9b221ebcb73cbca9c0892d0 Mon Sep 17 00:00:00 2001 From: Joshua McKenzie Date: Thu, 8 Jan 2015 11:52:57 -0600 Subject: [PATCH 230/557] ninja - correct comment in CommitLogSegment --- .../org/apache/cassandra/db/commitlog/CommitLogSegment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java b/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java index 3383f1e2cd78..6b408640381e 100644 --- a/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java +++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java @@ -156,7 +156,7 @@ static long getNextId() // Extend or truncate the file size to the standard segment size as we may have restarted after a segment // size configuration change, leaving "incorrectly" sized segments on disk. - // NOTE: while we're using RAF to allow extension of file on disk w/out sparse, we need to avoid using RAF + // NOTE: while we're using RAF to easily adjust file size, we need to avoid using RAF // for grabbing the FileChannel due to FILE_SHARE_DELETE flag bug on windows. // See: https://bugs.openjdk.java.net/browse/JDK-6357433 and CASSANDRA-8308 if (logFile.length() != DatabaseDescriptor.getCommitLogSegmentSize()) From a289e71bd883bce6b78169b64c95cd6c2e1a8853 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Fri, 9 Jan 2015 00:33:25 -0500 Subject: [PATCH 231/557] use parameterized logging --- .../org/apache/cassandra/db/commitlog/CommitLogSegment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java b/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java index 6b408640381e..e98d3d2261d8 100644 --- a/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java +++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java @@ -150,7 +150,7 @@ static long getNextId() } else { - logger.debug("Creating new CommitLog segment: " + logFile); + logger.debug("Creating new CommitLog segment: {}", logFile); } } From c6525da86eb1ac668206553336056f90e7bfcdaa Mon Sep 17 00:00:00 2001 From: Christian Spriegel Date: Fri, 9 Jan 2015 13:30:22 -0600 Subject: [PATCH 232/557] Add ReadFailureException, better TombstoneOE logging Patch by Christian Spriegel; reviewed by Tyler Hobbs for CASSANDRA-7886 --- CHANGES.txt | 3 + doc/native_protocol_v4.spec | 17 +++- .../apache/cassandra/db/ReadVerbHandler.java | 17 +--- .../cassandra/db/RowIteratorFactory.java | 21 ++-- .../cassandra/db/filter/ExtendedFilter.java | 10 +- .../cassandra/db/filter/SliceQueryFilter.java | 46 +++++---- .../TombstoneOverwhelmingException.java | 42 ++++++++ .../cassandra/exceptions/ExceptionCode.java | 1 + .../exceptions/ReadFailureException.java | 31 ++++++ .../exceptions/RequestFailureException.java | 37 +++++++ .../metrics/ClientRequestMetrics.java | 4 + .../cassandra/net/MessageDeliveryTask.java | 6 +- .../service/AbstractReadExecutor.java | 9 +- .../service/RangeSliceVerbHandler.java | 24 ++--- .../cassandra/service/ReadCallback.java | 37 ++++++- .../cassandra/service/StorageProxy.java | 98 +++++++++++++------ .../cassandra/thrift/CassandraServer.java | 24 ++--- .../cassandra/thrift/ThriftConversion.java | 10 +- .../apache/cassandra/transport/Server.java | 1 + .../transport/messages/ErrorMessage.java | 75 ++++++++++---- 20 files changed, 374 insertions(+), 139 deletions(-) create mode 100644 src/java/org/apache/cassandra/exceptions/ReadFailureException.java create mode 100644 src/java/org/apache/cassandra/exceptions/RequestFailureException.java diff --git a/CHANGES.txt b/CHANGES.txt index 0c91632e9d32..fc9ec7fccad4 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,7 @@ 3.0 + * Add ReadFailureException to native protocol, respond + immediately when replicas encounter errors while handling + a read request (CASSANDRA-7886) * Switch CommitLogSegment from RandomAccessFile to nio (CASSANDRA-8308) * Allow mixing token and partition key restrictions (CASSANDRA-7016) * Support index key/value entries on map collections (CASSANDRA-8473) diff --git a/doc/native_protocol_v4.spec b/doc/native_protocol_v4.spec index 3764e91bd3a8..0806944f3fbc 100644 --- a/doc/native_protocol_v4.spec +++ b/doc/native_protocol_v4.spec @@ -880,7 +880,21 @@ Table of Contents is a single byte. If its value is 0, it means the replica that was asked for data has not responded. Otherwise, the value is != 0. - + 0x1300 Read_failure: A non-timeout exception during a read request. The rest + of the ERROR message body will be + + where: + is the [consistency] level of the query having triggered + the exception. + is an [int] representing the number of nodes having + answered the request. + is the number of replicas whose response is + required to achieve . + is an [int] representing the number of nodes that + experience a failure while executing the request. + is a single byte. If its value is 0, it means + the replica that was asked for data had not + responded. Otherwise, the value is != 0. 0x2000 Syntax_error: The submitted query has a syntax error. 0x2100 Unauthorized: The logged user doesn't have the right to perform the query. @@ -905,4 +919,5 @@ Table of Contents * The format of "SCHEMA_CHANGE" events (Section 4.2.6) (and implicitly "Schema_change" results (Section 4.2.5.5)) has been modified, and now includes changes related to user defined functions and user defined aggregates. + * Read_failure error code was added. diff --git a/src/java/org/apache/cassandra/db/ReadVerbHandler.java b/src/java/org/apache/cassandra/db/ReadVerbHandler.java index 35082e68b4bd..8c167ed73e90 100644 --- a/src/java/org/apache/cassandra/db/ReadVerbHandler.java +++ b/src/java/org/apache/cassandra/db/ReadVerbHandler.java @@ -17,10 +17,6 @@ */ package org.apache.cassandra.db; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.apache.cassandra.db.filter.TombstoneOverwhelmingException; import org.apache.cassandra.net.IVerbHandler; import org.apache.cassandra.net.MessageIn; import org.apache.cassandra.net.MessageOut; @@ -30,8 +26,6 @@ public class ReadVerbHandler implements IVerbHandler { - private static final Logger logger = LoggerFactory.getLogger( ReadVerbHandler.class ); - public void doVerb(MessageIn message, int id) { if (StorageService.instance.isBootstrapMode()) @@ -41,16 +35,7 @@ public void doVerb(MessageIn message, int id) ReadCommand command = message.payload; Keyspace keyspace = Keyspace.open(command.ksName); - Row row; - try - { - row = command.getRow(keyspace); - } - catch (TombstoneOverwhelmingException e) - { - // error already logged. Drop the request - return; - } + Row row = command.getRow(keyspace); MessageOut reply = new MessageOut(MessagingService.Verb.REQUEST_RESPONSE, getResponse(command, row), diff --git a/src/java/org/apache/cassandra/db/RowIteratorFactory.java b/src/java/org/apache/cassandra/db/RowIteratorFactory.java index 6ac74ae4c871..ef514ea749d7 100644 --- a/src/java/org/apache/cassandra/db/RowIteratorFactory.java +++ b/src/java/org/apache/cassandra/db/RowIteratorFactory.java @@ -26,6 +26,7 @@ import org.apache.cassandra.db.columniterator.OnDiskAtomIterator; import org.apache.cassandra.db.filter.QueryFilter; import org.apache.cassandra.db.filter.IDiskAtomFilter; +import org.apache.cassandra.db.filter.TombstoneOverwhelmingException; import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.utils.CloseableIterator; import org.apache.cassandra.utils.MergeIterator; @@ -93,15 +94,23 @@ protected Row getReduced() ColumnFamily cached = cfs.getRawCachedRow(key); IDiskAtomFilter filter = range.columnFilter(key.getKey()); - if (cached == null || !cfs.isFilterFullyCoveredBy(filter, cached, now)) + try { - // not cached: collate - QueryFilter.collateOnDiskAtom(returnCF, colIters, filter, gcBefore, now); + if (cached == null || !cfs.isFilterFullyCoveredBy(filter, cached, now)) + { + // not cached: collate + QueryFilter.collateOnDiskAtom(returnCF, colIters, filter, gcBefore, now); + } + else + { + QueryFilter keyFilter = new QueryFilter(key, cfs.name, filter, now); + returnCF = cfs.filterColumnFamily(cached, keyFilter); + } } - else + catch(TombstoneOverwhelmingException e) { - QueryFilter keyFilter = new QueryFilter(key, cfs.name, filter, now); - returnCF = cfs.filterColumnFamily(cached, keyFilter); + e.setKey(key); + throw e; } Row rv = new Row(key, returnCF); diff --git a/src/java/org/apache/cassandra/db/filter/ExtendedFilter.java b/src/java/org/apache/cassandra/db/filter/ExtendedFilter.java index da9a1d71b39a..fc2ff9313194 100644 --- a/src/java/org/apache/cassandra/db/filter/ExtendedFilter.java +++ b/src/java/org/apache/cassandra/db/filter/ExtendedFilter.java @@ -304,7 +304,15 @@ public ColumnFamily prune(DecoratedKey rowKey, ColumnFamily data) ColumnFamily pruned = data.cloneMeShallow(); IDiskAtomFilter filter = dataRange.columnFilter(rowKey.getKey()); Iterator iter = filter.getColumnIterator(data); - filter.collectReducedColumns(pruned, QueryFilter.gatherTombstones(pruned, iter), cfs.gcBefore(timestamp), timestamp); + try + { + filter.collectReducedColumns(pruned, QueryFilter.gatherTombstones(pruned, iter), cfs.gcBefore(timestamp), timestamp); + } + catch (TombstoneOverwhelmingException e) + { + e.setKey(rowKey); + throw e; + } return pruned; } diff --git a/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java b/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java index 6e8fde6489e1..453191ec42b3 100644 --- a/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java +++ b/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java @@ -38,6 +38,7 @@ import org.apache.cassandra.io.IVersionedSerializer; import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.io.util.FileDataInput; +import org.apache.cassandra.service.StorageService; import org.apache.cassandra.tracing.Tracing; public class SliceQueryFilter implements IDiskAtomFilter @@ -213,34 +214,41 @@ public void collectReducedColumns(ColumnFamily container, Iterator reduced if (respectTombstoneThresholds() && columnCounter.ignored() > DatabaseDescriptor.getTombstoneFailureThreshold()) { - Tracing.trace("Scanned over {} tombstones; query aborted (see tombstone_failure_threshold)", DatabaseDescriptor.getTombstoneFailureThreshold()); - logger.error("Scanned over {} tombstones in {}.{}; query aborted (see tombstone_failure_threshold)", - DatabaseDescriptor.getTombstoneFailureThreshold(), container.metadata().ksName, container.metadata().cfName); - throw new TombstoneOverwhelmingException(); + Tracing.trace("Scanned over {} tombstones; query aborted (see tombstone_failure_threshold); slices={}", + DatabaseDescriptor.getTombstoneFailureThreshold(), getSlicesInfo(container)); + throw new TombstoneOverwhelmingException(columnCounter.ignored(), count, container.metadata().ksName, container.metadata().cfName, + container.getComparator().getString(cell.name()), getSlicesInfo(container), container.deletionInfo().toString()); } container.maybeAppendColumn(cell, tester, gcBefore); } - Tracing.trace("Read {} live and {} tombstoned cells", columnCounter.live(), columnCounter.ignored()); - if (respectTombstoneThresholds() && columnCounter.ignored() > DatabaseDescriptor.getTombstoneWarnThreshold()) + boolean warnTombstones = respectTombstoneThresholds() && columnCounter.ignored() > DatabaseDescriptor.getTombstoneWarnThreshold(); + if (warnTombstones) { - StringBuilder sb = new StringBuilder(); - CellNameType type = container.metadata().comparator; - for (ColumnSlice sl : slices) - { - assert sl != null; + logger.warn("Read {} live and {} tombstoned cells in {}.{} (see tombstone_warn_threshold). {} columns were requested, slices={}, delInfo={}", + columnCounter.live(), columnCounter.ignored(), container.metadata().ksName, container.metadata().cfName, count, + getSlicesInfo(container), container.deletionInfo()); + } + Tracing.trace("Read {} live and {} tombstoned cells{}", + new Object[]{ columnCounter.live(), columnCounter.ignored(), (warnTombstones ? " (see tombstone_warn_threshold)" : "") }); + } - sb.append('['); - sb.append(type.getString(sl.start)); - sb.append('-'); - sb.append(type.getString(sl.finish)); - sb.append(']'); - } + private String getSlicesInfo(ColumnFamily container) + { + StringBuilder sb = new StringBuilder(); + CellNameType type = container.metadata().comparator; + for (ColumnSlice sl : slices) + { + assert sl != null; - logger.warn("Read {} live and {} tombstoned cells in {}.{} (see tombstone_warn_threshold). {} columns was requested, slices={}, delInfo={}", - columnCounter.live(), columnCounter.ignored(), container.metadata().ksName, container.metadata().cfName, count, sb, container.deletionInfo()); + sb.append('['); + sb.append(type.getString(sl.start)); + sb.append('-'); + sb.append(type.getString(sl.finish)); + sb.append(']'); } + return sb.toString(); } protected boolean respectTombstoneThresholds() diff --git a/src/java/org/apache/cassandra/db/filter/TombstoneOverwhelmingException.java b/src/java/org/apache/cassandra/db/filter/TombstoneOverwhelmingException.java index 6a6b0f6b6559..04d440d9cdcd 100644 --- a/src/java/org/apache/cassandra/db/filter/TombstoneOverwhelmingException.java +++ b/src/java/org/apache/cassandra/db/filter/TombstoneOverwhelmingException.java @@ -18,6 +18,48 @@ */ package org.apache.cassandra.db.filter; +import org.apache.cassandra.db.DecoratedKey; + + public class TombstoneOverwhelmingException extends RuntimeException { + private final int numTombstones; + private final int numRequested; + private final String ksName; + private final String cfName; + private final String lastCellName; + private final String slicesInfo; + private final String deletionInfo; + private String partitionKey = null; + + public TombstoneOverwhelmingException(int numTombstones, int numRequested, String ksName, String cfName, + String lastCellName, String slicesInfo, String deletionInfo) + { + this.numTombstones = numTombstones; + this.numRequested = numRequested; + this.ksName = ksName; + this.cfName = cfName; + this.lastCellName = lastCellName; + this.slicesInfo = slicesInfo; + this.deletionInfo = deletionInfo; + } + + public void setKey(DecoratedKey key) + { + if(key != null) + this.partitionKey = key.toString(); + } + + public String getLocalizedMessage() + { + return getMessage(); + } + + public String getMessage() + { + return String.format( + "Scanned over %d tombstones in %s.%s; %d columns were requested; query aborted " + + "(see tombstone_failure_threshold); partitionKey=%s; lastCell=%s; delInfo=%s; slices=%s", + numTombstones, ksName, cfName, numRequested, partitionKey, lastCellName, deletionInfo, slicesInfo); + } } diff --git a/src/java/org/apache/cassandra/exceptions/ExceptionCode.java b/src/java/org/apache/cassandra/exceptions/ExceptionCode.java index ce082a79c05c..7fcb2d24c408 100644 --- a/src/java/org/apache/cassandra/exceptions/ExceptionCode.java +++ b/src/java/org/apache/cassandra/exceptions/ExceptionCode.java @@ -39,6 +39,7 @@ public enum ExceptionCode TRUNCATE_ERROR (0x1003), WRITE_TIMEOUT (0x1100), READ_TIMEOUT (0x1200), + READ_FAILURE (0x1300), // 2xx: problem validating the request SYNTAX_ERROR (0x2000), diff --git a/src/java/org/apache/cassandra/exceptions/ReadFailureException.java b/src/java/org/apache/cassandra/exceptions/ReadFailureException.java new file mode 100644 index 000000000000..91cf580f941d --- /dev/null +++ b/src/java/org/apache/cassandra/exceptions/ReadFailureException.java @@ -0,0 +1,31 @@ +/* + * 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.exceptions; + +import org.apache.cassandra.db.ConsistencyLevel; + +public class ReadFailureException extends RequestFailureException +{ + public final boolean dataPresent; + + public ReadFailureException(ConsistencyLevel consistency, int received, int failures, int blockFor, boolean dataPresent) + { + super(ExceptionCode.READ_FAILURE, consistency, received, failures, blockFor); + this.dataPresent = dataPresent; + } +} diff --git a/src/java/org/apache/cassandra/exceptions/RequestFailureException.java b/src/java/org/apache/cassandra/exceptions/RequestFailureException.java new file mode 100644 index 000000000000..1ff44d993552 --- /dev/null +++ b/src/java/org/apache/cassandra/exceptions/RequestFailureException.java @@ -0,0 +1,37 @@ +/* + * 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.exceptions; + +import org.apache.cassandra.db.ConsistencyLevel; + +public class RequestFailureException extends RequestExecutionException +{ + public final ConsistencyLevel consistency; + public final int received; + public final int failures; + public final int blockFor; + + protected RequestFailureException(ExceptionCode code, ConsistencyLevel consistency, int received, int failures, int blockFor) + { + super(code, String.format("Operation failed - received %d responses and %d failures.", received, failures)); + this.consistency = consistency; + this.received = received; + this.failures = failures; + this.blockFor = blockFor; + } +} diff --git a/src/java/org/apache/cassandra/metrics/ClientRequestMetrics.java b/src/java/org/apache/cassandra/metrics/ClientRequestMetrics.java index 1ac3482903b0..68a2d2194448 100644 --- a/src/java/org/apache/cassandra/metrics/ClientRequestMetrics.java +++ b/src/java/org/apache/cassandra/metrics/ClientRequestMetrics.java @@ -32,9 +32,11 @@ public class ClientRequestMetrics extends LatencyMetrics @Deprecated public static final Counter writeTimeouts = Metrics.newCounter(DefaultNameFactory.createMetricName("ClientRequestMetrics", "WriteTimeouts", null)); @Deprecated public static final Counter readUnavailables = Metrics.newCounter(DefaultNameFactory.createMetricName("ClientRequestMetrics", "ReadUnavailables", null)); @Deprecated public static final Counter writeUnavailables = Metrics.newCounter(DefaultNameFactory.createMetricName("ClientRequestMetrics", "WriteUnavailables", null)); + @Deprecated public static final Counter readFailures = Metrics.newCounter(DefaultNameFactory.createMetricName("ClientRequestMetrics", "ReadFailures", null)); public final Meter timeouts; public final Meter unavailables; + public final Meter failures; public ClientRequestMetrics(String scope) { @@ -42,6 +44,7 @@ public ClientRequestMetrics(String scope) timeouts = Metrics.newMeter(factory.createMetricName("Timeouts"), "timeouts", TimeUnit.SECONDS); unavailables = Metrics.newMeter(factory.createMetricName("Unavailables"), "unavailables", TimeUnit.SECONDS); + failures = Metrics.newMeter(factory.createMetricName("Failures"), "failures", TimeUnit.SECONDS); } public void release() @@ -49,5 +52,6 @@ public void release() super.release(); Metrics.defaultRegistry().removeMetric(factory.createMetricName("Timeouts")); Metrics.defaultRegistry().removeMetric(factory.createMetricName("Unavailables")); + Metrics.defaultRegistry().removeMetric(factory.createMetricName("Failures")); } } diff --git a/src/java/org/apache/cassandra/net/MessageDeliveryTask.java b/src/java/org/apache/cassandra/net/MessageDeliveryTask.java index 982f17e5c80d..da12d7ad6539 100644 --- a/src/java/org/apache/cassandra/net/MessageDeliveryTask.java +++ b/src/java/org/apache/cassandra/net/MessageDeliveryTask.java @@ -19,6 +19,7 @@ import java.util.EnumSet; +import org.apache.cassandra.db.filter.TombstoneOverwhelmingException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -70,7 +71,10 @@ public void run() MessagingService.instance().sendReply(response, id, message.from); } - throw t; + if (t instanceof TombstoneOverwhelmingException) + logger.error(t.getMessage()); + else + throw t; } if (GOSSIP_VERBS.contains(message.verb)) Gossiper.instance.setLastProcessedMessageAt(constructionTime); diff --git a/src/java/org/apache/cassandra/service/AbstractReadExecutor.java b/src/java/org/apache/cassandra/service/AbstractReadExecutor.java index 061a01b964c6..d76a2ccffc15 100644 --- a/src/java/org/apache/cassandra/service/AbstractReadExecutor.java +++ b/src/java/org/apache/cassandra/service/AbstractReadExecutor.java @@ -37,6 +37,7 @@ import org.apache.cassandra.db.ReadResponse; import org.apache.cassandra.db.Row; import org.apache.cassandra.db.Keyspace; +import org.apache.cassandra.exceptions.ReadFailureException; import org.apache.cassandra.exceptions.ReadTimeoutException; import org.apache.cassandra.exceptions.UnavailableException; import org.apache.cassandra.metrics.ReadRepairMetrics; @@ -87,7 +88,7 @@ protected void makeDataRequests(Iterable endpoints) else { logger.trace("reading data from {}", endpoint); - MessagingService.instance().sendRR(command.createMessage(), endpoint, handler); + MessagingService.instance().sendRRWithFailure(command.createMessage(), endpoint, handler); } } if (readLocal) @@ -112,7 +113,7 @@ protected void makeDigestRequests(Iterable endpoints) else { logger.trace("reading digest from {}", endpoint); - MessagingService.instance().sendRR(message, endpoint, handler); + MessagingService.instance().sendRRWithFailure(message, endpoint, handler); } } } @@ -139,7 +140,7 @@ protected void makeDigestRequests(Iterable endpoints) * wait for an answer. Blocks until success or timeout, so it is caller's * responsibility to call maybeTryAdditionalReplicas first. */ - public Row get() throws ReadTimeoutException, DigestMismatchException + public Row get() throws ReadFailureException, ReadTimeoutException, DigestMismatchException { return handler.get(); } @@ -280,7 +281,7 @@ public void maybeTryAdditionalReplicas() InetAddress extraReplica = Iterables.getLast(targetReplicas); logger.trace("speculating read retry on {}", extraReplica); - MessagingService.instance().sendRR(retryCommand.createMessage(), extraReplica, handler); + MessagingService.instance().sendRRWithFailure(retryCommand.createMessage(), extraReplica, handler); speculated = true; cfs.metric.speculativeRetries.inc(); diff --git a/src/java/org/apache/cassandra/service/RangeSliceVerbHandler.java b/src/java/org/apache/cassandra/service/RangeSliceVerbHandler.java index f1fd1f9dbf9c..0f3726cd6750 100644 --- a/src/java/org/apache/cassandra/service/RangeSliceVerbHandler.java +++ b/src/java/org/apache/cassandra/service/RangeSliceVerbHandler.java @@ -19,7 +19,6 @@ import org.apache.cassandra.db.AbstractRangeCommand; import org.apache.cassandra.db.RangeSliceReply; -import org.apache.cassandra.db.filter.TombstoneOverwhelmingException; import org.apache.cassandra.net.IVerbHandler; import org.apache.cassandra.net.MessageIn; import org.apache.cassandra.net.MessagingService; @@ -29,24 +28,13 @@ public class RangeSliceVerbHandler implements IVerbHandler { public void doVerb(MessageIn message, int id) { - try + if (StorageService.instance.isBootstrapMode()) { - if (StorageService.instance.isBootstrapMode()) - { - /* Don't service reads! */ - throw new RuntimeException("Cannot service reads while bootstrapping!"); - } - RangeSliceReply reply = new RangeSliceReply(message.payload.executeLocally()); - Tracing.trace("Enqueuing response to {}", message.from); - MessagingService.instance().sendReply(reply.createMessage(), id, message.from); - } - catch (TombstoneOverwhelmingException e) - { - // error already logged. Drop the request - } - catch (Exception ex) - { - throw new RuntimeException(ex); + /* Don't service reads! */ + throw new RuntimeException("Cannot service reads while bootstrapping!"); } + RangeSliceReply reply = new RangeSliceReply(message.payload.executeLocally()); + Tracing.trace("Enqueuing response to {}", message.from); + MessagingService.instance().sendReply(reply.createMessage(), id, message.from); } } diff --git a/src/java/org/apache/cassandra/service/ReadCallback.java b/src/java/org/apache/cassandra/service/ReadCallback.java index 51e1818d645a..937156857f86 100644 --- a/src/java/org/apache/cassandra/service/ReadCallback.java +++ b/src/java/org/apache/cassandra/service/ReadCallback.java @@ -32,10 +32,13 @@ import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.ReadCommand; import org.apache.cassandra.db.Keyspace; +import org.apache.cassandra.exceptions.ReadFailureException; import org.apache.cassandra.exceptions.ReadTimeoutException; +import org.apache.cassandra.exceptions.RequestExecutionException; import org.apache.cassandra.exceptions.UnavailableException; import org.apache.cassandra.metrics.ReadRepairMetrics; import org.apache.cassandra.net.IAsyncCallback; +import org.apache.cassandra.net.IAsyncCallbackWithFailure; import org.apache.cassandra.net.MessageIn; import org.apache.cassandra.net.MessageOut; import org.apache.cassandra.net.MessagingService; @@ -43,7 +46,7 @@ import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.concurrent.SimpleCondition; -public class ReadCallback implements IAsyncCallback +public class ReadCallback implements IAsyncCallbackWithFailure { protected static final Logger logger = LoggerFactory.getLogger( ReadCallback.class ); @@ -57,6 +60,10 @@ public class ReadCallback implements IAsyncCallback recievedUpdater = AtomicIntegerFieldUpdater.newUpdater(ReadCallback.class, "received"); private volatile int received = 0; + private static final AtomicIntegerFieldUpdater failuresUpdater + = AtomicIntegerFieldUpdater.newUpdater(ReadCallback.class, "failures"); + private volatile int failures = 0; + private final Keyspace keyspace; // TODO push this into ConsistencyLevel? /** @@ -95,7 +102,7 @@ public boolean await(long timePastStart, TimeUnit unit) } } - public TResolved get() throws ReadTimeoutException, DigestMismatchException + public TResolved get() throws ReadFailureException, ReadTimeoutException, DigestMismatchException { if (!await(command.getTimeout(), TimeUnit.MILLISECONDS)) { @@ -107,13 +114,22 @@ public TResolved get() throws ReadTimeoutException, DigestMismatchException throw ex; } + if (blockfor + failures > endpoints.size()) + { + ReadFailureException ex = new ReadFailureException(consistencyLevel, received, failures, blockfor, resolver.isDataPresent()); + + if (logger.isDebugEnabled()) + logger.debug("Read failure: {}", ex.toString()); + throw ex; + } + return blockfor == 1 ? resolver.getData() : resolver.resolve(); } public void response(MessageIn message) { resolver.preprocess(message); - int n = waitingFor(message) + int n = waitingFor(message.from) ? recievedUpdater.incrementAndGet(this) : received; if (n >= blockfor && resolver.isDataPresent()) @@ -129,10 +145,10 @@ public void response(MessageIn message) /** * @return true if the message counts towards the blockfor threshold */ - private boolean waitingFor(MessageIn message) + private boolean waitingFor(InetAddress from) { return consistencyLevel.isDatacenterLocal() - ? DatabaseDescriptor.getLocalDataCenter().equals(DatabaseDescriptor.getEndpointSnitch().getDatacenter(message.from)) + ? DatabaseDescriptor.getLocalDataCenter().equals(DatabaseDescriptor.getEndpointSnitch().getDatacenter(from)) : true; } @@ -194,4 +210,15 @@ public void run() } } } + + @Override + public void onFailure(InetAddress from) + { + int n = waitingFor(from) + ? failuresUpdater.incrementAndGet(this) + : failures; + + if (blockfor + n > endpoints.size()) + condition.signalAll(); + } } diff --git a/src/java/org/apache/cassandra/service/StorageProxy.java b/src/java/org/apache/cassandra/service/StorageProxy.java index 378b3f05af04..f00db76a5f70 100644 --- a/src/java/org/apache/cassandra/service/StorageProxy.java +++ b/src/java/org/apache/cassandra/service/StorageProxy.java @@ -42,7 +42,7 @@ import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.config.Schema; import org.apache.cassandra.db.*; -import org.apache.cassandra.db.Keyspace; +import org.apache.cassandra.db.filter.TombstoneOverwhelmingException; import org.apache.cassandra.db.index.SecondaryIndex; import org.apache.cassandra.db.index.SecondaryIndexSearcher; import org.apache.cassandra.db.marshal.UUIDType; @@ -203,7 +203,7 @@ public static ColumnFamily cas(String keyspaceName, ConsistencyLevel consistencyForPaxos, ConsistencyLevel consistencyForCommit, ClientState state) - throws UnavailableException, IsBootstrappingException, ReadTimeoutException, WriteTimeoutException, InvalidRequestException + throws UnavailableException, IsBootstrappingException, ReadFailureException, ReadTimeoutException, WriteTimeoutException, InvalidRequestException { final long start = System.nanoTime(); int contentions = 0; @@ -1164,7 +1164,7 @@ private static boolean systemKeyspaceQuery(List cmds) } public static List read(List commands, ConsistencyLevel consistencyLevel) - throws UnavailableException, IsBootstrappingException, ReadTimeoutException, InvalidRequestException + throws UnavailableException, IsBootstrappingException, ReadFailureException, ReadTimeoutException, InvalidRequestException { // When using serial CL, the ClientState should be provided assert !consistencyLevel.isSerialConsistency(); @@ -1176,7 +1176,7 @@ public static List read(List commands, ConsistencyLevel consis * a specific set of column names from a given column family. */ public static List read(List commands, ConsistencyLevel consistencyLevel, ClientState state) - throws UnavailableException, IsBootstrappingException, ReadTimeoutException, InvalidRequestException + throws UnavailableException, IsBootstrappingException, ReadFailureException, ReadTimeoutException, InvalidRequestException { if (StorageService.instance.isBootstrapMode() && !systemKeyspaceQuery(commands)) { @@ -1191,7 +1191,7 @@ public static List read(List commands, ConsistencyLevel consis } private static List readWithPaxos(List commands, ConsistencyLevel consistencyLevel, ClientState state) - throws InvalidRequestException, UnavailableException, ReadTimeoutException + throws InvalidRequestException, UnavailableException, ReadFailureException, ReadTimeoutException { assert state != null; @@ -1241,6 +1241,13 @@ private static List readWithPaxos(List commands, ConsistencyLe casReadMetrics.timeouts.mark(); throw e; } + catch (ReadFailureException e) + { + readMetrics.failures.mark(); + ClientRequestMetrics.readFailures.inc(); + casReadMetrics.failures.mark(); + throw e; + } finally { long latency = System.nanoTime() - start; @@ -1255,7 +1262,7 @@ private static List readWithPaxos(List commands, ConsistencyLe } private static List readRegular(List commands, ConsistencyLevel consistencyLevel) - throws UnavailableException, ReadTimeoutException + throws UnavailableException, ReadFailureException, ReadTimeoutException { long start = System.nanoTime(); List rows = null; @@ -1276,6 +1283,12 @@ private static List readRegular(List commands, ConsistencyLeve ClientRequestMetrics.readTimeouts.inc(); throw e; } + catch (ReadFailureException e) + { + readMetrics.failures.mark(); + ClientRequestMetrics.readFailures.inc(); + throw e; + } finally { long latency = System.nanoTime() - start; @@ -1300,7 +1313,7 @@ private static List readRegular(List commands, ConsistencyLeve * 5. else carry out read repair by getting data from all the nodes. */ private static List fetchRows(List initialCommands, ConsistencyLevel consistencyLevel) - throws UnavailableException, ReadTimeoutException + throws UnavailableException, ReadFailureException, ReadTimeoutException { List rows = new ArrayList<>(initialCommands.size()); // (avoid allocating a new list in the common case of nothing-to-retry) @@ -1345,7 +1358,7 @@ private static List fetchRows(List initialCommands, Consistenc if (logger.isDebugEnabled()) logger.debug("Read: {} ms.", TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - exec.handler.start)); } - catch (ReadTimeoutException ex) + catch (ReadTimeoutException|ReadFailureException ex) { int blockFor = consistencyLevel.blockFor(Keyspace.open(exec.command.getKeyspace())); int responseCount = exec.handler.getReceivedCount(); @@ -1353,14 +1366,15 @@ private static List fetchRows(List initialCommands, Consistenc ? exec.resolver.isDataPresent() ? " (including data)" : " (only digests)" : ""; + boolean isTimeout = ex instanceof ReadTimeoutException; if (Tracing.isTracing()) { - Tracing.trace("Timed out; received {} of {} responses{}", - new Object[]{ responseCount, blockFor, gotData }); + Tracing.trace("{}; received {} of {} responses{}", + new Object[]{(isTimeout ? "Timed out" : "Failed"), responseCount, blockFor, gotData }); } else if (logger.isDebugEnabled()) { - logger.debug("Read timeout; received {} of {} responses{}", responseCount, blockFor, gotData); + logger.debug("Read {}; received {} of {} responses{}", (isTimeout ? "timeout" : "failure"), responseCount, blockFor, gotData); } throw ex; } @@ -1391,7 +1405,7 @@ else if (logger.isDebugEnabled()) for (InetAddress endpoint : exec.getContactedReplicas()) { Tracing.trace("Enqueuing full data read to {}", endpoint); - MessagingService.instance().sendRR(message, endpoint, repairHandler); + MessagingService.instance().sendRRWithFailure(message, endpoint, repairHandler); } } } @@ -1482,11 +1496,22 @@ static class LocalReadRunnable extends DroppableRunnable protected void runMayThrow() { - Keyspace keyspace = Keyspace.open(command.ksName); - Row r = command.getRow(keyspace); - ReadResponse result = ReadVerbHandler.getResponse(command, r); - MessagingService.instance().addLatency(FBUtilities.getBroadcastAddress(), TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start)); - handler.response(result); + try + { + Keyspace keyspace = Keyspace.open(command.ksName); + Row r = command.getRow(keyspace); + ReadResponse result = ReadVerbHandler.getResponse(command, r); + MessagingService.instance().addLatency(FBUtilities.getBroadcastAddress(), TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start)); + handler.response(result); + } + catch (Throwable t) + { + handler.onFailure(FBUtilities.getBroadcastAddress()); + if (t instanceof TombstoneOverwhelmingException) + logger.error(t.getMessage()); + else + throw t; + } } } @@ -1505,9 +1530,20 @@ static class LocalRangeSliceRunnable extends DroppableRunnable protected void runMayThrow() { - RangeSliceReply result = new RangeSliceReply(command.executeLocally()); - MessagingService.instance().addLatency(FBUtilities.getBroadcastAddress(), TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start)); - handler.response(result); + try + { + RangeSliceReply result = new RangeSliceReply(command.executeLocally()); + MessagingService.instance().addLatency(FBUtilities.getBroadcastAddress(), TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start)); + handler.response(result); + } + catch (Throwable t) + { + handler.onFailure(FBUtilities.getBroadcastAddress()); + if (t instanceof TombstoneOverwhelmingException) + logger.error(t.getMessage()); + else + throw t; + } } } @@ -1591,7 +1627,7 @@ private static float calculateResultRowsUsingEstimatedKeys(ColumnFamilyStore cfs } public static List getRangeSlice(AbstractRangeCommand command, ConsistencyLevel consistency_level) - throws UnavailableException, ReadTimeoutException + throws UnavailableException, ReadFailureException, ReadTimeoutException { Tracing.trace("Computing ranges to query"); long startTime = System.nanoTime(); @@ -1705,7 +1741,7 @@ public static List getRangeSlice(AbstractRangeCommand command, ConsistencyL for (InetAddress endpoint : filteredEndpoints) { Tracing.trace("Enqueuing request to {}", endpoint); - MessagingService.instance().sendRR(message, endpoint, handler); + MessagingService.instance().sendRRWithFailure(message, endpoint, handler); } } scanHandlers.add(Pair.create(nodeCmd, handler)); @@ -1729,24 +1765,25 @@ public static List getRangeSlice(AbstractRangeCommand command, ConsistencyL } repairResponses.addAll(resolver.repairResults); } - catch (ReadTimeoutException ex) + catch (ReadTimeoutException|ReadFailureException ex) { - // we timed out waiting for responses + // we timed out or failed waiting for responses int blockFor = consistency_level.blockFor(keyspace); int responseCount = resolver.responses.size(); String gotData = responseCount > 0 ? resolver.isDataPresent() ? " (including data)" : " (only digests)" : ""; + boolean isTimeout = ex instanceof ReadTimeoutException; if (Tracing.isTracing()) { - Tracing.trace("Timed out; received {} of {} responses{} for range {} of {}", - new Object[]{ responseCount, blockFor, gotData, i, ranges.size() }); + Tracing.trace("{}; received {} of {} responses{} for range {} of {}", + new Object[]{(isTimeout ? "Timed out" : "Failed"), responseCount, blockFor, gotData, i, ranges.size() }); } else if (logger.isDebugEnabled()) { - logger.debug("Range slice timeout; received {} of {} responses{} for range {} of {}", - responseCount, blockFor, gotData, i, ranges.size()); + logger.debug("Range slice {}; received {} of {} responses{} for range {} of {}", + (isTimeout ? "timeout" : "failure"), responseCount, blockFor, gotData, i, ranges.size()); } throw ex; } @@ -2135,7 +2172,7 @@ private static boolean isAnyStorageHostDown() { return !Gossiper.instance.getUnreachableTokenOwners().isEmpty(); } - + public interface WritePerformer { public void apply(IMutation mutation, @@ -2169,7 +2206,8 @@ public final void run() try { runMayThrow(); - } catch (Exception e) + } + catch (Exception e) { throw new RuntimeException(e); } diff --git a/src/java/org/apache/cassandra/thrift/CassandraServer.java b/src/java/org/apache/cassandra/thrift/CassandraServer.java index dd461f3c5633..7d8904934832 100644 --- a/src/java/org/apache/cassandra/thrift/CassandraServer.java +++ b/src/java/org/apache/cassandra/thrift/CassandraServer.java @@ -1202,13 +1202,9 @@ public List get_range_slices(ColumnParent column_parent, SlicePredicat { throw ThriftConversion.toThrift(e); } - catch (ReadTimeoutException e) - { - throw ThriftConversion.toThrift(e); - } - catch (org.apache.cassandra.exceptions.UnavailableException e) + catch (RequestExecutionException e) { - throw ThriftConversion.toThrift(e); + throw ThriftConversion.rethrow(e); } finally { @@ -1288,13 +1284,9 @@ public List get_paged_slice(String column_family, KeyRange range, Byte { throw ThriftConversion.toThrift(e); } - catch (ReadTimeoutException e) - { - throw ThriftConversion.toThrift(e); - } - catch (org.apache.cassandra.exceptions.UnavailableException e) + catch (RequestExecutionException e) { - throw ThriftConversion.toThrift(e); + throw ThriftConversion.rethrow(e); } finally { @@ -1364,13 +1356,9 @@ public List get_indexed_slices(ColumnParent column_parent, IndexClause { throw ThriftConversion.toThrift(e); } - catch (ReadTimeoutException e) - { - throw ThriftConversion.toThrift(e); - } - catch (org.apache.cassandra.exceptions.UnavailableException e) + catch (RequestExecutionException e) { - throw ThriftConversion.toThrift(e); + throw ThriftConversion.rethrow(e); } finally { diff --git a/src/java/org/apache/cassandra/thrift/ThriftConversion.java b/src/java/org/apache/cassandra/thrift/ThriftConversion.java index d408767a6d9b..066ddb866fc3 100644 --- a/src/java/org/apache/cassandra/thrift/ThriftConversion.java +++ b/src/java/org/apache/cassandra/thrift/ThriftConversion.java @@ -90,7 +90,9 @@ public static ConsistencyLevel toThrift(org.apache.cassandra.db.ConsistencyLevel // for methods that have a return value. public static RuntimeException rethrow(RequestExecutionException e) throws UnavailableException, TimedOutException { - if (e instanceof RequestTimeoutException) + if (e instanceof RequestFailureException) + throw toThrift((RequestFailureException)e); + else if (e instanceof RequestTimeoutException) throw toThrift((RequestTimeoutException)e); else throw new UnavailableException(); @@ -128,6 +130,12 @@ else if (wte.writeType == WriteType.CAS) return toe; } + // Thrift does not support RequestFailureExceptions, so we translate them into timeouts + public static TimedOutException toThrift(RequestFailureException e) + { + return new TimedOutException(); + } + public static List indexExpressionsFromThrift(List exprs) { if (exprs == null) diff --git a/src/java/org/apache/cassandra/transport/Server.java b/src/java/org/apache/cassandra/transport/Server.java index d1fc74470eff..99601a6ce382 100644 --- a/src/java/org/apache/cassandra/transport/Server.java +++ b/src/java/org/apache/cassandra/transport/Server.java @@ -68,6 +68,7 @@ public class Server implements CassandraDaemon.Server public static final int VERSION_2 = 2; public static final int VERSION_3 = 3; + public static final int VERSION_4 = 4; public static final int CURRENT_VERSION = VERSION_3; private final ConnectionTracker connectionTracker = new ConnectionTracker(); diff --git a/src/java/org/apache/cassandra/transport/messages/ErrorMessage.java b/src/java/org/apache/cassandra/transport/messages/ErrorMessage.java index 7e4a3a97d261..3097c5b7b1fd 100644 --- a/src/java/org/apache/cassandra/transport/messages/ErrorMessage.java +++ b/src/java/org/apache/cassandra/transport/messages/ErrorMessage.java @@ -26,10 +26,7 @@ import org.apache.cassandra.db.ConsistencyLevel; import org.apache.cassandra.db.WriteType; import org.apache.cassandra.exceptions.*; -import org.apache.cassandra.transport.CBUtil; -import org.apache.cassandra.transport.Message; -import org.apache.cassandra.transport.ProtocolException; -import org.apache.cassandra.transport.ServerError; +import org.apache.cassandra.transport.*; import org.apache.cassandra.utils.MD5Digest; /** @@ -75,6 +72,16 @@ public ErrorMessage decode(ByteBuf body, int version) case TRUNCATE_ERROR: te = new TruncateException(msg); break; + case READ_FAILURE: + { + ConsistencyLevel cl = CBUtil.readConsistencyLevel(body); + int received = body.readInt(); + int blockFor = body.readInt(); + int failure = body.readInt(); + byte dataPresent = body.readByte(); + te = new ReadFailureException(cl, received, failure, blockFor, dataPresent != 0); + } + break; case WRITE_TIMEOUT: case READ_TIMEOUT: ConsistencyLevel cl = CBUtil.readConsistencyLevel(body); @@ -123,21 +130,33 @@ public ErrorMessage decode(ByteBuf body, int version) public void encode(ErrorMessage msg, ByteBuf dest, int version) { - dest.writeInt(msg.error.code().value); - CBUtil.writeString(msg.error.getMessage(), dest); + final TransportException err = getBackwardsCompatibleException(msg, version); + dest.writeInt(err.code().value); + CBUtil.writeString(err.getMessage(), dest); - switch (msg.error.code()) + switch (err.code()) { case UNAVAILABLE: - UnavailableException ue = (UnavailableException)msg.error; + UnavailableException ue = (UnavailableException)err; CBUtil.writeConsistencyLevel(ue.consistency, dest); dest.writeInt(ue.required); dest.writeInt(ue.alive); break; + case READ_FAILURE: + { + RequestFailureException rfe = (RequestFailureException)err; + + CBUtil.writeConsistencyLevel(rfe.consistency, dest); + dest.writeInt(rfe.received); + dest.writeInt(rfe.blockFor); + dest.writeInt(rfe.failures); + dest.writeByte((byte)(((ReadFailureException)rfe).dataPresent ? 1 : 0)); + } + break; case WRITE_TIMEOUT: case READ_TIMEOUT: - RequestTimeoutException rte = (RequestTimeoutException)msg.error; - boolean isWrite = msg.error.code() == ExceptionCode.WRITE_TIMEOUT; + RequestTimeoutException rte = (RequestTimeoutException)err; + boolean isWrite = err.code() == ExceptionCode.WRITE_TIMEOUT; CBUtil.writeConsistencyLevel(rte.consistency, dest); dest.writeInt(rte.received); @@ -148,11 +167,11 @@ public void encode(ErrorMessage msg, ByteBuf dest, int version) dest.writeByte((byte)(((ReadTimeoutException)rte).dataPresent ? 1 : 0)); break; case UNPREPARED: - PreparedQueryNotFoundException pqnfe = (PreparedQueryNotFoundException)msg.error; + PreparedQueryNotFoundException pqnfe = (PreparedQueryNotFoundException)err; CBUtil.writeBytes(pqnfe.id.bytes, dest); break; case ALREADY_EXISTS: - AlreadyExistsException aee = (AlreadyExistsException)msg.error; + AlreadyExistsException aee = (AlreadyExistsException)err; CBUtil.writeString(aee.ksName, dest); CBUtil.writeString(aee.cfName, dest); break; @@ -161,26 +180,33 @@ public void encode(ErrorMessage msg, ByteBuf dest, int version) public int encodedSize(ErrorMessage msg, int version) { - int size = 4 + CBUtil.sizeOfString(msg.error.getMessage()); - switch (msg.error.code()) + final TransportException err = getBackwardsCompatibleException(msg, version); + int size = 4 + CBUtil.sizeOfString(err.getMessage()); + switch (err.code()) { case UNAVAILABLE: - UnavailableException ue = (UnavailableException)msg.error; + UnavailableException ue = (UnavailableException)err; size += CBUtil.sizeOfConsistencyLevel(ue.consistency) + 8; break; + case READ_FAILURE: + { + ReadFailureException rfe = (ReadFailureException)err; + size += CBUtil.sizeOfConsistencyLevel(rfe.consistency) + 4 + 4 + 4 + 1; + } + break; case WRITE_TIMEOUT: case READ_TIMEOUT: - RequestTimeoutException rte = (RequestTimeoutException)msg.error; - boolean isWrite = msg.error.code() == ExceptionCode.WRITE_TIMEOUT; + RequestTimeoutException rte = (RequestTimeoutException)err; + boolean isWrite = err.code() == ExceptionCode.WRITE_TIMEOUT; size += CBUtil.sizeOfConsistencyLevel(rte.consistency) + 8; size += isWrite ? CBUtil.sizeOfString(((WriteTimeoutException)rte).writeType.toString()) : 1; break; case UNPREPARED: - PreparedQueryNotFoundException pqnfe = (PreparedQueryNotFoundException)msg.error; + PreparedQueryNotFoundException pqnfe = (PreparedQueryNotFoundException)err; size += CBUtil.sizeOfBytes(pqnfe.id.bytes); break; case ALREADY_EXISTS: - AlreadyExistsException aee = (AlreadyExistsException)msg.error; + AlreadyExistsException aee = (AlreadyExistsException)err; size += CBUtil.sizeOfString(aee.ksName); size += CBUtil.sizeOfString(aee.cfName); break; @@ -189,6 +215,17 @@ public int encodedSize(ErrorMessage msg, int version) } }; + private static TransportException getBackwardsCompatibleException(ErrorMessage msg, int version) + { + if (msg.error.code() == ExceptionCode.READ_FAILURE && version < Server.VERSION_4) + { + ReadFailureException rfe = (ReadFailureException) msg.error; + return new ReadTimeoutException(rfe.consistency, rfe.received, rfe.blockFor, rfe.dataPresent); + } + + return msg.error; + } + // We need to figure error codes out (#3979) public final TransportException error; From f6d0f436b39f78f2b4fee5e84190a53259ff677b Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Mon, 12 Jan 2015 11:57:23 -0600 Subject: [PATCH 233/557] fix errant CPIF references --- examples/hadoop_cql3_word_count/src/WordCount.java | 3 +-- examples/hadoop_cql3_word_count/src/WordCountCounters.java | 3 +-- src/java/org/apache/cassandra/hadoop/pig/CqlStorage.java | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/examples/hadoop_cql3_word_count/src/WordCount.java b/examples/hadoop_cql3_word_count/src/WordCount.java index 519a98f1d46a..6a2f84624639 100644 --- a/examples/hadoop_cql3_word_count/src/WordCount.java +++ b/examples/hadoop_cql3_word_count/src/WordCount.java @@ -26,7 +26,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.cassandra.hadoop.cql3.CqlPagingInputFormat; import org.apache.cassandra.hadoop.cql3.CqlInputFormat; import org.apache.cassandra.hadoop.ConfigHelper; import org.apache.cassandra.utils.ByteBufferUtil; @@ -247,7 +246,7 @@ public int run(String[] args) throws Exception else { job.setMapperClass(TokenizerMapper.class); - job.setInputFormatClass(CqlPagingInputFormat.class); + job.setInputFormatClass(CqlInputFormat.class); ConfigHelper.setInputRpcPort(job.getConfiguration(), "9160"); } diff --git a/examples/hadoop_cql3_word_count/src/WordCountCounters.java b/examples/hadoop_cql3_word_count/src/WordCountCounters.java index 74de9abf81d9..150d18d07dfe 100644 --- a/examples/hadoop_cql3_word_count/src/WordCountCounters.java +++ b/examples/hadoop_cql3_word_count/src/WordCountCounters.java @@ -25,7 +25,6 @@ import org.slf4j.LoggerFactory; import org.apache.cassandra.hadoop.cql3.CqlConfigHelper; -import org.apache.cassandra.hadoop.cql3.CqlPagingInputFormat; import org.apache.cassandra.hadoop.cql3.CqlInputFormat; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configured; @@ -156,7 +155,7 @@ public int run(String[] args) throws Exception else { job.setMapperClass(SumMapper.class); - job.setInputFormatClass(CqlPagingInputFormat.class); + job.setInputFormatClass(CqlInputFormat.class); ConfigHelper.setInputRpcPort(job.getConfiguration(), "9160"); } diff --git a/src/java/org/apache/cassandra/hadoop/pig/CqlStorage.java b/src/java/org/apache/cassandra/hadoop/pig/CqlStorage.java index 2ba4dbf6261c..08926fac4316 100644 --- a/src/java/org/apache/cassandra/hadoop/pig/CqlStorage.java +++ b/src/java/org/apache/cassandra/hadoop/pig/CqlStorage.java @@ -76,7 +76,7 @@ public CqlStorage(int pageSize) { super(); this.pageSize = pageSize; - DEFAULT_INPUT_FORMAT = "org.apache.cassandra.hadoop.cql3.CqlPagingInputFormat"; + DEFAULT_INPUT_FORMAT = "org.apache.cassandra.hadoop.cql3.CqlInputFormat"; DEFAULT_OUTPUT_FORMAT = "org.apache.cassandra.hadoop.cql3.CqlOutputFormat"; } From b8dd3bd75f61c20350db37b784a667636fb6a24d Mon Sep 17 00:00:00 2001 From: Marcus Eriksson Date: Thu, 8 Jan 2015 08:35:44 +0100 Subject: [PATCH 234/557] Group for anticompaction by the compaction strategy we have. Patch by marcuse; reviewed by yukim for CASSANDRA-8578 --- CHANGES.txt | 1 + .../cassandra/db/compaction/WrappingCompactionStrategy.java | 5 +++++ .../db/compaction/LeveledCompactionStrategyTest.java | 6 +++--- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index b1f5465b7969..7b0e3980b413 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0 + * Group sstables for anticompaction correctly (CASSANDRA-8578) * Add ReadFailureException to native protocol, respond immediately when replicas encounter errors while handling a read request (CASSANDRA-7886) diff --git a/src/java/org/apache/cassandra/db/compaction/WrappingCompactionStrategy.java b/src/java/org/apache/cassandra/db/compaction/WrappingCompactionStrategy.java index 55095a710e64..9d83a47fc62f 100644 --- a/src/java/org/apache/cassandra/db/compaction/WrappingCompactionStrategy.java +++ b/src/java/org/apache/cassandra/db/compaction/WrappingCompactionStrategy.java @@ -358,6 +358,11 @@ public synchronized ScannerList getScanners(Collection sstables, return new ScannerList(scanners); } + public Collection> groupSSTablesForAntiCompaction(Collection sstablesToGroup) + { + return unrepaired.groupSSTablesForAntiCompaction(sstablesToGroup); + } + public List getWrappedStrategies() { return Arrays.asList(repaired, unrepaired); diff --git a/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java b/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java index 1eca4e69d22c..6ea8168fb672 100644 --- a/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java @@ -121,10 +121,10 @@ public void testGrouperLevels() throws Exception{ } waitForLeveling(cfs); - LeveledCompactionStrategy strategy = (LeveledCompactionStrategy) cfs.getCompactionStrategy(); + WrappingCompactionStrategy strategy = (WrappingCompactionStrategy) cfs.getCompactionStrategy(); // Checking we're not completely bad at math - assert strategy.getLevelSize(1) > 0; - assert strategy.getLevelSize(2) > 0; + assert strategy.getSSTableCountPerLevel()[1] > 0; + assert strategy.getSSTableCountPerLevel()[2] > 0; Collection> groupedSSTables = cfs.getCompactionStrategy().groupSSTablesForAntiCompaction(cfs.getSSTables()); for (Collection sstableGroup : groupedSSTables) From 2fc9f3292a7e7164662ad50617fe76a21e697395 Mon Sep 17 00:00:00 2001 From: Joshua McKenzie Date: Wed, 14 Jan 2015 11:34:58 -0600 Subject: [PATCH 235/557] Fix SSTableRewriterTest on Windows Patch by jmckenzie; reviewed by marcuse for CASSANDRA-8598 --- .../cassandra/io/sstable/SSTableRewriterTest.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableRewriterTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableRewriterTest.java index afad97953fcf..3703d5448fd4 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableRewriterTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableRewriterTest.java @@ -214,21 +214,27 @@ public void testFileRemoval() throws InterruptedException for (int i = 0; i < 100; i++) cf.addColumn(Util.cellname(i), ByteBuffer.allocate(1000), 1); File dir = cfs.directories.getDirectoryForNewSSTables(); + SSTableWriter writer = getWriter(cfs, dir); for (int i = 0; i < 500; i++) writer.append(StorageService.getPartitioner().decorateKey(ByteBufferUtil.bytes(i)), cf); SSTableReader s = writer.openEarly(1000); assertFileCounts(dir.list(), 2, 3); + for (int i = 500; i < 1000; i++) writer.append(StorageService.getPartitioner().decorateKey(ByteBufferUtil.bytes(i)), cf); SSTableReader s2 = writer.openEarly(1000); + assertTrue(s != s2); assertFileCounts(dir.list(), 2, 3); - s.markObsolete(); + + s.setReplacedBy(s2); + s2.markObsolete(); s.releaseReference(); - Thread.sleep(1000); - assertFileCounts(dir.list(), 0, 3); + s2.releaseReference(); + writer.abort(false); + Thread.sleep(1000); int datafiles = assertFileCounts(dir.list(), 0, 0); assertEquals(datafiles, 0); From 879b694d346e6442c9508d8d8a48e6e71fbcd25b Mon Sep 17 00:00:00 2001 From: Sam Tunnicliffe Date: Wed, 14 Jan 2015 22:48:39 +0300 Subject: [PATCH 236/557] Introduce role based access control patch by Sam Tunnicliffe; reviewed by Aleksey Yeschenko for CASSANDRA-7653 --- CHANGES.txt | 1 + NEWS.txt | 21 + bin/cqlsh | 36 +- conf/cassandra.yaml | 20 + pylib/cqlshlib/cql3handling.py | 62 +- pylib/cqlshlib/helptopics.py | 66 +- .../cassandra/auth/AllowAllAuthenticator.java | 44 +- src/java/org/apache/cassandra/auth/Auth.java | 298 --------- .../apache/cassandra/auth/AuthKeyspace.java | 90 +++ ...icator.java => AuthMigrationListener.java} | 28 +- .../cassandra/auth/AuthenticatedUser.java | 115 +++- .../cassandra/auth/CassandraAuthorizer.java | 405 ++++++++---- .../cassandra/auth/CassandraRoleManager.java | 586 ++++++++++++++++++ .../apache/cassandra/auth/DataResource.java | 58 +- .../apache/cassandra/auth/IAuthenticator.java | 142 ++--- .../apache/cassandra/auth/IAuthorizer.java | 39 +- .../apache/cassandra/auth/IRoleManager.java | 200 ++++++ .../cassandra/auth/LegacyAuthenticator.java | 94 --- .../cassandra/auth/LegacyAuthorizer.java | 114 ---- .../cassandra/auth/PasswordAuthenticator.java | 255 +++----- .../cassandra/auth/PermissionDetails.java | 16 +- .../org/apache/cassandra/config/Config.java | 7 +- .../cassandra/config/DatabaseDescriptor.java | 20 +- src/java/org/apache/cassandra/cql3/Cql.g | 179 +++++- .../org/apache/cassandra/cql3/RoleName.java | 41 ++ .../{UserOptions.java => RoleOptions.java} | 18 +- ...Statement.java => AlterRoleStatement.java} | 54 +- .../statements/AuthorizationStatement.java | 4 +- ...tatement.java => CreateRoleStatement.java} | 59 +- ...rStatement.java => DropRoleStatement.java} | 34 +- .../cql3/statements/GrantRoleStatement.java | 39 ++ .../cql3/statements/GrantStatement.java | 22 +- .../statements/ListPermissionsStatement.java | 42 +- .../cql3/statements/ListRolesStatement.java | 118 ++++ .../cql3/statements/ListUsersStatement.java | 52 +- .../PermissionAlteringStatement.java | 16 +- .../cql3/statements/RevokeRoleStatement.java | 40 ++ .../cql3/statements/RevokeStatement.java | 22 +- .../statements/RoleManagementStatement.java | 54 ++ .../hadoop/AbstractBulkRecordWriter.java | 25 +- .../AbstractColumnFamilyInputFormat.java | 28 +- .../AbstractColumnFamilyOutputFormat.java | 9 +- .../hadoop/pig/AbstractCassandraStorage.java | 33 +- .../apache/cassandra/service/ClientState.java | 50 +- .../cassandra/service/StorageService.java | 71 ++- .../cassandra/thrift/CassandraServer.java | 28 +- .../apache/cassandra/tools/BulkLoader.java | 20 +- .../apache/cassandra/transport/Client.java | 15 +- .../apache/cassandra/transport/Server.java | 30 +- .../cassandra/transport/ServerConnection.java | 20 +- .../transport/messages/AuthResponse.java | 25 +- .../messages/CredentialsMessage.java | 10 +- .../apache/cassandra/utils/FBUtilities.java | 24 +- 53 files changed, 2528 insertions(+), 1371 deletions(-) delete mode 100644 src/java/org/apache/cassandra/auth/Auth.java create mode 100644 src/java/org/apache/cassandra/auth/AuthKeyspace.java rename src/java/org/apache/cassandra/auth/{ISaslAwareAuthenticator.java => AuthMigrationListener.java} (50%) create mode 100644 src/java/org/apache/cassandra/auth/CassandraRoleManager.java create mode 100644 src/java/org/apache/cassandra/auth/IRoleManager.java delete mode 100644 src/java/org/apache/cassandra/auth/LegacyAuthenticator.java delete mode 100644 src/java/org/apache/cassandra/auth/LegacyAuthorizer.java create mode 100644 src/java/org/apache/cassandra/cql3/RoleName.java rename src/java/org/apache/cassandra/cql3/{UserOptions.java => RoleOptions.java} (74%) rename src/java/org/apache/cassandra/cql3/statements/{AlterUserStatement.java => AlterRoleStatement.java} (56%) rename src/java/org/apache/cassandra/cql3/statements/{CreateUserStatement.java => CreateRoleStatement.java} (54%) rename src/java/org/apache/cassandra/cql3/statements/{DropUserStatement.java => DropRoleStatement.java} (62%) create mode 100644 src/java/org/apache/cassandra/cql3/statements/GrantRoleStatement.java create mode 100644 src/java/org/apache/cassandra/cql3/statements/ListRolesStatement.java create mode 100644 src/java/org/apache/cassandra/cql3/statements/RevokeRoleStatement.java create mode 100644 src/java/org/apache/cassandra/cql3/statements/RoleManagementStatement.java diff --git a/CHANGES.txt b/CHANGES.txt index d80eeaf16856..30a741e718e4 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0 + * Add role based access control (CASSANDRA-7653) * Group sstables for anticompaction correctly (CASSANDRA-8578) * Add ReadFailureException to native protocol, respond immediately when replicas encounter errors while handling diff --git a/NEWS.txt b/NEWS.txt index 8d8ebdcf3db5..b9c41734bae1 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -18,6 +18,14 @@ using the provided 'sstableupgrade' tool. New features ------------ + - Authentication & Authorization APIs have been updated to introduce + roles. Roles and Permissions granted to them are inherited, supporting + role based access control. The role concept supercedes that of users + and CQL constructs such as CREATE USER are deprecated but retained for + compatibility. The requirement to explicitly create Roles in Cassandra + even when auth is handled by an external system has been removed, so + authentication & authorization can be delegated to such systems in their + entirety. - SSTable file name is changed. Now you don't have Keyspace/CF name in file name. Also, secondary index has its own directory under parent's directory. @@ -25,6 +33,18 @@ New features Upgrading --------- + - IAuthenticator been updated to remove responsibility for user/role + maintenance and is now solely responsible for validating credentials, + This is primarily done via SASL, though an optional method exists for + systems which need support for the Thrift login() method. + - IRoleManager interface has been added which takes over the maintenance + functions from IAuthenticator. IAuthorizer is mainly unchanged. Auth data + in systems using the stock internal implementations PasswordAuthenticator + & CassandraAuthorizer will be automatically converted during upgrade, + with minimal operator intervention required. Custom implementations will + require modification, though these can be used in conjunction with the + stock CassandraRoleManager so providing an IRoleManager implementation + should not usually be necessary. - Fat client support has been removed since we have push notifications to clients - cassandra-cli has been removed. Please use cqlsh instead. - YamlFileNetworkTopologySnitch has been removed; switch to @@ -37,6 +57,7 @@ Upgrading in the normal order and not anymore in the order in which the column values were specified in the IN restriction. + 2.1.2 ===== diff --git a/bin/cqlsh b/bin/cqlsh index 363a4f64dec0..427dcac17dcf 100755 --- a/bin/cqlsh +++ b/bin/cqlsh @@ -108,7 +108,7 @@ except ImportError, e: from cassandra.cluster import Cluster, PagedResult from cassandra.query import SimpleStatement, ordered_dict_factory from cassandra.policies import WhiteListRoundRobinPolicy -from cassandra.metadata import protect_name, protect_names, protect_value +from cassandra.metadata import protect_name, protect_names, protect_value, KeyspaceMetadata, TableMetadata, ColumnMetadata from cassandra.auth import PlainTextAuthProvider # cqlsh should run correctly when run out of a Cassandra source tree, @@ -751,9 +751,31 @@ class Shell(cmd.Cmd): ksmeta = self.get_keyspace_meta(ksname) if tablename not in ksmeta.tables: - raise ColumnFamilyNotFound("Column family %r not found" % tablename) - - return ksmeta.tables[tablename] + if ksname == 'system_auth' and tablename in ['roles','role_permissions']: + self.get_fake_auth_table_meta(ksname, tablename) + else: + raise ColumnFamilyNotFound("Column family %r not found" % tablename) + else: + return ksmeta.tables[tablename] + + def get_fake_auth_table_meta(self, ksname, tablename): + # may be using external auth implementation so internal tables + # aren't actually defined in schema. In this case, we'll fake + # them up + if tablename == 'roles': + ks_meta = KeyspaceMetadata(ksname, True, None, None) + table_meta = TableMetadata(ks_meta, 'roles') + table_meta.columns['role'] = ColumnMetadata(table_meta, 'role', cassandra.cqltypes.UTF8Type) + table_meta.columns['is_superuser'] = ColumnMetadata(table_meta, 'is_superuser', cassandra.cqltypes.BooleanType) + table_meta.columns['can_login'] = ColumnMetadata(table_meta, 'can_login', cassandra.cqltypes.BooleanType) + elif tablename == 'role_permissions': + ks_meta = KeyspaceMetadata(ksname, True, None, None) + table_meta = TableMetadata(ks_meta, 'role_permissions') + table_meta.columns['role'] = ColumnMetadata(table_meta, 'role', cassandra.cqltypes.UTF8Type) + table_meta.columns['resource'] = ColumnMetadata(table_meta, 'resource', cassandra.cqltypes.UTF8Type) + table_meta.columns['permission'] = ColumnMetadata(table_meta, 'permission', cassandra.cqltypes.UTF8Type) + else: + raise ColumnFamilyNotFoundException("Column family %r not found" % tablename) def get_usertypes_meta(self): data = self.session.execute("select * from system.schema_usertypes") @@ -1006,10 +1028,10 @@ class Shell(cmd.Cmd): if statement.query_string[:6].lower() == 'select': self.print_result(rows, self.parse_for_table_meta(statement.query_string)) - elif statement.query_string.lower().startswith("list users"): - self.print_result(rows, self.get_table_meta('system_auth','users')) + elif statement.query_string.lower().startswith("list users") or statement.query_string.lower().startswith("list roles"): + self.print_result(rows, self.get_table_meta('system_auth','roles')) elif statement.query_string.lower().startswith("list"): - self.print_result(rows, self.get_table_meta('system_auth','permissions')) + self.print_result(rows, self.get_table_meta('system_auth','role_permissions')) elif rows: # CAS INSERT/UPDATE self.writeresult("") diff --git a/conf/cassandra.yaml b/conf/cassandra.yaml index ca2ca1bb0909..24bab099d502 100644 --- a/conf/cassandra.yaml +++ b/conf/cassandra.yaml @@ -62,6 +62,7 @@ batchlog_replay_throttle_in_kb: 1024 # - PasswordAuthenticator relies on username/password pairs to authenticate # users. It keeps usernames and hashed passwords in system_auth.credentials table. # Please increase system_auth keyspace replication factor if you use this authenticator. +# If using PasswordAuthenticator, CassandraRoleManager must also be used (see below) authenticator: AllowAllAuthenticator # Authorization backend, implementing IAuthorizer; used to limit access/provide permissions @@ -73,6 +74,25 @@ authenticator: AllowAllAuthenticator # increase system_auth keyspace replication factor if you use this authorizer. authorizer: AllowAllAuthorizer +# Part of the Authentication & Authorization backend, implementing IRoleManager; used +# to maintain grants and memberships between roles. +# Out of the box, Cassandra provides org.apache.cassandra.auth.CassandraRoleManager, +# which stores role information in the system_auth keyspace. Most functions of the +# IRoleManager require an authenticated login, so unless the configured IAuthenticator +# actually implements authentication, most of this functionality will be unavailable. +# +# - CassandraRoleManager stores role data in the system_auth keyspace. Please +# increase system_auth keyspace replication factor if you use this role manager. +role_manager: CassandraRoleManager + +# Validity period for roles cache (fetching permissions can be an +# expensive operation depending on the authorizer). Granted roles are cached for +# authenticated sessions in AuthenticatedUser and after the period specified +# here, become eligible for (async) reload. +# Defaults to 2000, set to 0 to disable. +# Will be disabled automatically for AllowAllAuthenticator. +roles_validity_in_ms: 2000 + # Validity period for permissions cache (fetching permissions can be an # expensive operation depending on the authorizer, CassandraAuthorizer is # one example). Defaults to 2000, set to 0 to disable. diff --git a/pylib/cqlshlib/cql3handling.py b/pylib/cqlshlib/cql3handling.py index a376c33736e5..552f5c1ebeba 100644 --- a/pylib/cqlshlib/cql3handling.py +++ b/pylib/cqlshlib/cql3handling.py @@ -254,10 +254,16 @@ def dequote_value(cqlword): | | | + | + | + | + | ; ::= + | | + | | ; @@ -1169,14 +1175,49 @@ def alter_type_field_completer(ctxt, cass): ''' syntax_rules += r''' - ::= "GRANT" "ON" "TO" + ::= + | + | + ; + + ::= "CREATE" "ROLE" + ( "WITH" ("AND" )*)? + ( "SUPERUSER" | "NOSUPERUSER" )? + ( "LOGIN" | "NOLOGIN" )? + ; + + ::= "ALTER" "ROLE" + ( "WITH" ("AND" )*)? + ( "SUPERUSER" | "NOSUPERUSER" )? + ( "LOGIN" | "NOLOGIN" )? + ; + ::= "PASSWORD" + | "OPTIONS" + ; + + ::= "DROP" "ROLE" + ; + + ::= "GRANT" "TO" + ; + + ::= "REVOKE" "FROM" + ; + + ::= "LIST" "ROLES" + ( "OF" )? "NORECURSIVE"? + ; +''' + +syntax_rules += r''' + ::= "GRANT" "ON" "TO" ; - ::= "REVOKE" "ON" "FROM" + ::= "REVOKE" "ON" "FROM" ; ::= "LIST" - ( "ON" )? ( "OF" )? "NORECURSIVE"? + ( "ON" )? ( "OF" )? "NORECURSIVE"? ; ::= "AUTHORIZE" @@ -1214,11 +1255,24 @@ def maybe_quote(name): session = cass.session return [maybe_quote(row.values()[0].replace("'", "''")) for row in session.execute("LIST USERS")] +@completer_for('rolename', 'role') +def rolename_completer(ctxt, cass): + def maybe_quote(name): + if CqlRuleSet.is_valid_cql3_name(name): + return name + return "'%s'" % name + + # disable completion for CREATE ROLE. + if ctxt.matched[0][0] == 'K_CREATE': + return [Hint('')] + + session = cass.session + return [maybe_quote(row[0].replace("'", "''")) for row in session.execute("LIST ROLES")] + syntax_rules += r''' ::= "CREATE" "TRIGGER" ( "IF" "NOT" "EXISTS" )? "ON" cf= "USING" class= ; - ::= "DROP" "TRIGGER" ( "IF" "EXISTS" )? triggername= "ON" cf= ; diff --git a/pylib/cqlshlib/helptopics.py b/pylib/cqlshlib/helptopics.py index cbc6597f3acb..c4f65b0f6688 100644 --- a/pylib/cqlshlib/helptopics.py +++ b/pylib/cqlshlib/helptopics.py @@ -666,7 +666,9 @@ def help_alter_drop(self): def help_create(self): super(CQL3HelpTopics, self).help_create() - print " HELP CREATE_USER;\n" + print """ HELP CREATE_USER; + HELP CREATE_ROLE; + """ def help_alter(self): print """ @@ -702,8 +704,10 @@ def help_alter_rename(self): """ def help_drop(self): - super(CQL3HelpTopics, self).help_drop() - print " HELP DROP_USER;\n" + super(CQL3HelpTopics, self).help_create() + print """ HELP DROP_USER; + HELP DROP_ROLE; + """ def help_list(self): print """ @@ -758,10 +762,10 @@ def help_grant(self): ON ALL KEYSPACES | KEYSPACE | [TABLE] [.]
    - TO + TO [ROLE | USER ] Grant the specified permission (or all permissions) on a resource - to a user. + to a role or user. To be able to grant a permission on some resource you have to have that permission yourself and also AUTHORIZE permission on it, @@ -776,10 +780,10 @@ def help_revoke(self): ON ALL KEYSPACES | KEYSPACE | [TABLE] [.]
    - FROM + FROM [ROLE | USER ] Revokes the specified permission (or all permissions) on a resource - from a user. + from a role or user. To be able to revoke a permission on some resource you have to have that permission yourself and also AUTHORIZE permission on it, @@ -794,12 +798,13 @@ def help_list_permissions(self): [ON ALL KEYSPACES | KEYSPACE | [TABLE] [.]
    ] - [OF ] + [OF [ROLE | USER ] [NORECURSIVE] Omitting ON part will list permissions on ALL KEYSPACES, every keyspace and table. - Omitting OF part will list permissions of all users. + Omitting OF [ROLE | USER ] part will list permissions + of all roles and users. Omitting NORECURSIVE specifier will list permissions of the resource and all its parents (table, table's keyspace and ALL KEYSPACES). @@ -818,3 +823,46 @@ def help_permissions(self): MODIFY: required for INSERT, DELETE, UPDATE, TRUNCATE SELECT: required for SELECT """ + + def help_create_role(self): + print """ + CREATE ROLE ; + + CREATE ROLE creates a new Cassandra role. + Only superusers can issue CREATE ROLE requests. + To create a superuser account use SUPERUSER option (NOSUPERUSER is the default). + """ + + def help_drop_role(self): + print """ + DROP ROLE ; + + DROP ROLE removes an existing role. You have to be logged in as a superuser + to issue a DROP ROLE statement. + """ + + def help_list_roles(self): + print """ + LIST ROLES [OF [ROLE | USER ] [NORECURSIVE]]; + + Only superusers can use the OF clause to list the roles granted to a role or user. + If a superuser omits the OF clause then all the created roles will be listed. + If a non-superuser calls LIST ROLES then the roles granted to that user are listed. + If NORECURSIVE is provided then only directly granted roles are listed. + """ + + def help_grant_role(self): + print """ + GRANT ROLE TO [ROLE | USER ] + + Grant the specified role to another role or user. You have to be logged + in as superuser to issue a GRANT ROLE statement. + """ + + def help_revoke_role(self): + print """ + REVOKE ROLE FROM [ROLE | USER ] + + Revoke the specified role from another role or user. You have to be logged + in as superuser to issue a REVOKE ROLE statement. + """ diff --git a/src/java/org/apache/cassandra/auth/AllowAllAuthenticator.java b/src/java/org/apache/cassandra/auth/AllowAllAuthenticator.java index def604501380..bc00c3e72c81 100644 --- a/src/java/org/apache/cassandra/auth/AllowAllAuthenticator.java +++ b/src/java/org/apache/cassandra/auth/AllowAllAuthenticator.java @@ -23,55 +23,55 @@ import org.apache.cassandra.exceptions.AuthenticationException; import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.exceptions.InvalidRequestException; public class AllowAllAuthenticator implements IAuthenticator { + private static final SaslNegotiator AUTHENTICATOR_INSTANCE = new Negotiator(); + public boolean requireAuthentication() { return false; } - public Set
    ", keyspace, columnFamily); + case TABLE: + return String.format("
    ", keyspace, table); } throw new AssertionError(); } @@ -239,12 +239,12 @@ public boolean equals(Object o) return Objects.equal(level, ds.level) && Objects.equal(keyspace, ds.keyspace) - && Objects.equal(columnFamily, ds.columnFamily); + && Objects.equal(table, ds.table); } @Override public int hashCode() { - return Objects.hashCode(level, keyspace, columnFamily); + return Objects.hashCode(level, keyspace, table); } } diff --git a/src/java/org/apache/cassandra/auth/IAuthenticator.java b/src/java/org/apache/cassandra/auth/IAuthenticator.java index 608649078ee6..24792f63b668 100644 --- a/src/java/org/apache/cassandra/auth/IAuthenticator.java +++ b/src/java/org/apache/cassandra/auth/IAuthenticator.java @@ -22,103 +22,107 @@ import org.apache.cassandra.exceptions.AuthenticationException; import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.exceptions.RequestExecutionException; -import org.apache.cassandra.exceptions.RequestValidationException; public interface IAuthenticator { - static final String USERNAME_KEY = "username"; - static final String PASSWORD_KEY = "password"; - - /** - * Supported CREATE USER/ALTER USER options. - * Currently only PASSWORD is available. - */ - enum Option - { - PASSWORD - } - /** * Whether or not the authenticator requires explicit login. * If false will instantiate user with AuthenticatedUser.ANONYMOUS_USER. */ boolean requireAuthentication(); - /** - * Set of options supported by CREATE USER and ALTER USER queries. - * Should never return null - always return an empty set instead. - */ - Set
    , we need to correct the resource. resource = maybeCorrectResource(resource, state); if (!resource.exists()) - throw new InvalidRequestException(String.format("%s doesn't exist", resource)); + throw new InvalidRequestException(String.format("Resource %s doesn't exist", resource)); } public void checkAccess(ClientState state) throws UnauthorizedException diff --git a/src/java/org/apache/cassandra/cql3/statements/RevokeRoleStatement.java b/src/java/org/apache/cassandra/cql3/statements/RevokeRoleStatement.java new file mode 100644 index 000000000000..98c2b4e867f6 --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/statements/RevokeRoleStatement.java @@ -0,0 +1,40 @@ +/* + * 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.cql3.statements; + +import org.apache.cassandra.config.DatabaseDescriptor; +import org.apache.cassandra.cql3.RoleName; +import org.apache.cassandra.exceptions.RequestExecutionException; +import org.apache.cassandra.exceptions.RequestValidationException; +import org.apache.cassandra.service.ClientState; +import org.apache.cassandra.transport.messages.ResultMessage; + +public class RevokeRoleStatement extends RoleManagementStatement +{ + public RevokeRoleStatement(RoleName name, RoleName grantee) + { + super(name, grantee); + } + + public ResultMessage execute(ClientState state) throws RequestValidationException, RequestExecutionException + { + DatabaseDescriptor.getRoleManager().revokeRole(state.getUser(), role, grantee); + return null; + } + +} diff --git a/src/java/org/apache/cassandra/cql3/statements/RevokeStatement.java b/src/java/org/apache/cassandra/cql3/statements/RevokeStatement.java index 6f8ccd1cc070..7ce52599bfa7 100644 --- a/src/java/org/apache/cassandra/cql3/statements/RevokeStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/RevokeStatement.java @@ -1,4 +1,4 @@ -/** +/* * 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 @@ -7,14 +7,13 @@ * "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 + * 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. + * 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.cql3.statements; @@ -23,6 +22,7 @@ import org.apache.cassandra.auth.DataResource; import org.apache.cassandra.auth.Permission; import org.apache.cassandra.config.DatabaseDescriptor; +import org.apache.cassandra.cql3.RoleName; import org.apache.cassandra.exceptions.RequestExecutionException; import org.apache.cassandra.exceptions.RequestValidationException; import org.apache.cassandra.service.ClientState; @@ -30,14 +30,14 @@ public class RevokeStatement extends PermissionAlteringStatement { - public RevokeStatement(Set permissions, DataResource resource, String username) + public RevokeStatement(Set permissions, DataResource resource, RoleName grantee) { - super(permissions, resource, username); + super(permissions, resource, grantee); } public ResultMessage execute(ClientState state) throws RequestValidationException, RequestExecutionException { - DatabaseDescriptor.getAuthorizer().revoke(state.getUser(), permissions, resource, username); + DatabaseDescriptor.getAuthorizer().revoke(state.getUser(), permissions, resource, grantee); return null; } } diff --git a/src/java/org/apache/cassandra/cql3/statements/RoleManagementStatement.java b/src/java/org/apache/cassandra/cql3/statements/RoleManagementStatement.java new file mode 100644 index 000000000000..d67b42ce7746 --- /dev/null +++ b/src/java/org/apache/cassandra/cql3/statements/RoleManagementStatement.java @@ -0,0 +1,54 @@ +/* + * 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.cql3.statements; + +import org.apache.cassandra.config.DatabaseDescriptor; +import org.apache.cassandra.cql3.RoleName; +import org.apache.cassandra.exceptions.InvalidRequestException; +import org.apache.cassandra.exceptions.RequestValidationException; +import org.apache.cassandra.exceptions.UnauthorizedException; +import org.apache.cassandra.service.ClientState; + +public abstract class RoleManagementStatement extends AuthorizationStatement +{ + protected final String role; + protected final String grantee; + + public RoleManagementStatement(RoleName name, RoleName grantee) + { + this.role = name.getName(); + this.grantee = grantee.getName(); + } + + public void checkAccess(ClientState state) throws UnauthorizedException, InvalidRequestException + { + if (!state.getUser().isSuper()) + throw new UnauthorizedException("Only superusers are allowed to perform role management queries"); + } + + public void validate(ClientState state) throws RequestValidationException + { + state.ensureNotAnonymous(); + + if (!DatabaseDescriptor.getRoleManager().isExistingRole(role)) + throw new InvalidRequestException(String.format("%s doesn't exist", role)); + + if (!DatabaseDescriptor.getRoleManager().isExistingRole(grantee)) + throw new InvalidRequestException(String.format("%s doesn't exist", grantee)); + } +} diff --git a/src/java/org/apache/cassandra/hadoop/AbstractBulkRecordWriter.java b/src/java/org/apache/cassandra/hadoop/AbstractBulkRecordWriter.java index 136c8dc2fef2..5ba0a9696e04 100644 --- a/src/java/org/apache/cassandra/hadoop/AbstractBulkRecordWriter.java +++ b/src/java/org/apache/cassandra/hadoop/AbstractBulkRecordWriter.java @@ -21,18 +21,13 @@ import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import org.apache.cassandra.auth.IAuthenticator; +import java.util.*; +import java.util.concurrent.*; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.cassandra.auth.PasswordAuthenticator; import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.Config; import org.apache.cassandra.config.DatabaseDescriptor; @@ -46,8 +41,6 @@ import org.apache.hadoop.mapreduce.RecordWriter; import org.apache.hadoop.mapreduce.TaskAttemptContext; import org.apache.hadoop.util.Progressable; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public abstract class AbstractBulkRecordWriter extends RecordWriter implements org.apache.hadoop.mapred.RecordWriter @@ -191,8 +184,8 @@ public void init(String keyspace) if (username != null) { Map creds = new HashMap(); - creds.put(IAuthenticator.USERNAME_KEY, username); - creds.put(IAuthenticator.PASSWORD_KEY, password); + creds.put(PasswordAuthenticator.USERNAME_KEY, username); + creds.put(PasswordAuthenticator.PASSWORD_KEY, password); AuthenticationRequest authRequest = new AuthenticationRequest(creds); client.login(authRequest); } diff --git a/src/java/org/apache/cassandra/hadoop/AbstractColumnFamilyInputFormat.java b/src/java/org/apache/cassandra/hadoop/AbstractColumnFamilyInputFormat.java index f4ad40f7d320..6fe2239e3c5f 100644 --- a/src/java/org/apache/cassandra/hadoop/AbstractColumnFamilyInputFormat.java +++ b/src/java/org/apache/cassandra/hadoop/AbstractColumnFamilyInputFormat.java @@ -20,36 +20,22 @@ import java.io.IOException; import java.net.InetAddress; import java.util.*; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Future; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.*; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.cassandra.auth.IAuthenticator; +import org.apache.cassandra.auth.PasswordAuthenticator; import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; -import org.apache.cassandra.thrift.AuthenticationRequest; -import org.apache.cassandra.thrift.Cassandra; -import org.apache.cassandra.thrift.CfSplit; -import org.apache.cassandra.thrift.InvalidRequestException; -import org.apache.cassandra.thrift.KeyRange; -import org.apache.cassandra.thrift.TokenRange; -import org.apache.commons.lang3.StringUtils; +import org.apache.cassandra.thrift.*; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.mapred.JobConf; -import org.apache.hadoop.mapreduce.InputFormat; -import org.apache.hadoop.mapreduce.InputSplit; -import org.apache.hadoop.mapreduce.JobContext; -import org.apache.hadoop.mapreduce.TaskAttemptContext; -import org.apache.hadoop.mapreduce.TaskAttemptID; +import org.apache.hadoop.mapreduce.*; import org.apache.thrift.TApplicationException; import org.apache.thrift.TException; import org.apache.thrift.protocol.TBinaryProtocol; @@ -106,8 +92,8 @@ public static Cassandra.Client createAuthenticatedClient(String location, int po if ((ConfigHelper.getInputKeyspaceUserName(conf) != null) && (ConfigHelper.getInputKeyspacePassword(conf) != null)) { Map creds = new HashMap(); - creds.put(IAuthenticator.USERNAME_KEY, ConfigHelper.getInputKeyspaceUserName(conf)); - creds.put(IAuthenticator.PASSWORD_KEY, ConfigHelper.getInputKeyspacePassword(conf)); + creds.put(PasswordAuthenticator.USERNAME_KEY, ConfigHelper.getInputKeyspaceUserName(conf)); + creds.put(PasswordAuthenticator.PASSWORD_KEY, ConfigHelper.getInputKeyspacePassword(conf)); AuthenticationRequest authRequest = new AuthenticationRequest(creds); client.login(authRequest); } diff --git a/src/java/org/apache/cassandra/hadoop/AbstractColumnFamilyOutputFormat.java b/src/java/org/apache/cassandra/hadoop/AbstractColumnFamilyOutputFormat.java index f574641a711d..03d00456f430 100644 --- a/src/java/org/apache/cassandra/hadoop/AbstractColumnFamilyOutputFormat.java +++ b/src/java/org/apache/cassandra/hadoop/AbstractColumnFamilyOutputFormat.java @@ -25,8 +25,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.cassandra.auth.IAuthenticator; -import org.apache.cassandra.thrift.*; +import org.apache.cassandra.auth.PasswordAuthenticator; +import org.apache.cassandra.thrift.AuthenticationRequest; +import org.apache.cassandra.thrift.Cassandra; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.mapreduce.*; import org.apache.thrift.protocol.TBinaryProtocol; @@ -134,8 +135,8 @@ public static Cassandra.Client createAuthenticatedClient(String host, int port, public static void login(String user, String password, Cassandra.Client client) throws Exception { Map creds = new HashMap(); - creds.put(IAuthenticator.USERNAME_KEY, user); - creds.put(IAuthenticator.PASSWORD_KEY, password); + creds.put(PasswordAuthenticator.USERNAME_KEY, user); + creds.put(PasswordAuthenticator.PASSWORD_KEY, password); AuthenticationRequest authRequest = new AuthenticationRequest(creds); client.login(authRequest); } diff --git a/src/java/org/apache/cassandra/hadoop/pig/AbstractCassandraStorage.java b/src/java/org/apache/cassandra/hadoop/pig/AbstractCassandraStorage.java index 0ffd4429e3fa..447c8cea007c 100644 --- a/src/java/org/apache/cassandra/hadoop/pig/AbstractCassandraStorage.java +++ b/src/java/org/apache/cassandra/hadoop/pig/AbstractCassandraStorage.java @@ -25,27 +25,28 @@ import java.nio.charset.CharacterCodingException; import java.util.*; -import org.apache.cassandra.db.Cell; -import org.apache.cassandra.schema.LegacySchemaTables; -import org.apache.cassandra.db.SystemKeyspace; -import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.exceptions.SyntaxException; -import org.apache.cassandra.auth.IAuthenticator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.cassandra.auth.PasswordAuthenticator; import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.ColumnDefinition; +import org.apache.cassandra.db.Cell; +import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.db.marshal.*; import org.apache.cassandra.db.marshal.AbstractCompositeType.CompositeComponent; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.apache.cassandra.exceptions.SyntaxException; +import org.apache.cassandra.hadoop.ConfigHelper; +import org.apache.cassandra.schema.LegacySchemaTables; import org.apache.cassandra.serializers.CollectionSerializer; -import org.apache.cassandra.hadoop.*; import org.apache.cassandra.thrift.*; -import org.apache.cassandra.utils.ByteBufferUtil; -import org.apache.cassandra.utils.FBUtilities; -import org.apache.cassandra.utils.Hex; -import org.apache.cassandra.utils.UUIDGen; - +import org.apache.cassandra.utils.*; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; -import org.apache.hadoop.mapreduce.*; +import org.apache.hadoop.mapreduce.InputFormat; +import org.apache.hadoop.mapreduce.Job; +import org.apache.hadoop.mapreduce.OutputFormat; import org.apache.pig.*; import org.apache.pig.backend.executionengine.ExecException; import org.apache.pig.data.*; @@ -54,8 +55,6 @@ import org.apache.thrift.TException; import org.apache.thrift.TSerializer; import org.apache.thrift.protocol.TBinaryProtocol; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * A LoadStoreFunc for retrieving data from and storing data to Cassandra @@ -505,8 +504,8 @@ protected void initSchema(String signature) throws IOException if (username != null && password != null) { Map credentials = new HashMap(2); - credentials.put(IAuthenticator.USERNAME_KEY, username); - credentials.put(IAuthenticator.PASSWORD_KEY, password); + credentials.put(PasswordAuthenticator.USERNAME_KEY, username); + credentials.put(PasswordAuthenticator.PASSWORD_KEY, password); try { diff --git a/src/java/org/apache/cassandra/service/ClientState.java b/src/java/org/apache/cassandra/service/ClientState.java index 36f8326c7c80..21d10f9e1765 100644 --- a/src/java/org/apache/cassandra/service/ClientState.java +++ b/src/java/org/apache/cassandra/service/ClientState.java @@ -18,11 +18,12 @@ package org.apache.cassandra.service; import java.net.SocketAddress; -import java.util.*; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; import java.util.concurrent.atomic.AtomicLong; import com.google.common.collect.Iterables; -import com.google.common.collect.Sets; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -31,13 +32,13 @@ import org.apache.cassandra.config.Schema; import org.apache.cassandra.cql3.QueryHandler; import org.apache.cassandra.cql3.QueryProcessor; -import org.apache.cassandra.schema.LegacySchemaTables; import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.exceptions.AuthenticationException; import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.exceptions.UnauthorizedException; -import org.apache.cassandra.tracing.TraceKeyspace; +import org.apache.cassandra.schema.LegacySchemaTables; import org.apache.cassandra.thrift.ThriftValidation; +import org.apache.cassandra.tracing.TraceKeyspace; import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.JVMStabilityInspector; import org.apache.cassandra.utils.SemanticVersion; @@ -52,16 +53,27 @@ public class ClientState private static final Set READABLE_SYSTEM_RESOURCES = new HashSet<>(); private static final Set PROTECTED_AUTH_RESOURCES = new HashSet<>(); - + private static final Set ALTERABLE_SYSTEM_KEYSPACES = new HashSet<>(); + private static final Set DROPPABLE_SYSTEM_TABLES = new HashSet<>(); static { // We want these system cfs to be always readable to authenticated users since many tools rely on them // (nodetool, cqlsh, bulkloader, etc.) for (String cf : Iterables.concat(Arrays.asList(SystemKeyspace.LOCAL, SystemKeyspace.PEERS), LegacySchemaTables.ALL)) - READABLE_SYSTEM_RESOURCES.add(DataResource.columnFamily(SystemKeyspace.NAME, cf)); + READABLE_SYSTEM_RESOURCES.add(DataResource.table(SystemKeyspace.NAME, cf)); PROTECTED_AUTH_RESOURCES.addAll(DatabaseDescriptor.getAuthenticator().protectedResources()); PROTECTED_AUTH_RESOURCES.addAll(DatabaseDescriptor.getAuthorizer().protectedResources()); + PROTECTED_AUTH_RESOURCES.addAll(DatabaseDescriptor.getRoleManager().protectedResources()); + + // allow users with sufficient privileges to alter KS level options on AUTH_KS and + // TRACING_KS, and also to drop legacy tables (users, credentials, permissions) from + // AUTH_KS + ALTERABLE_SYSTEM_KEYSPACES.add(AuthKeyspace.NAME); + ALTERABLE_SYSTEM_KEYSPACES.add(TraceKeyspace.NAME); + DROPPABLE_SYSTEM_TABLES.add(DataResource.table(AuthKeyspace.NAME, PasswordAuthenticator.LEGACY_CREDENTIALS_TABLE)); + DROPPABLE_SYSTEM_TABLES.add(DataResource.table(AuthKeyspace.NAME, CassandraRoleManager.LEGACY_USERS_TABLE)); + DROPPABLE_SYSTEM_TABLES.add(DataResource.table(AuthKeyspace.NAME, CassandraAuthorizer.USER_PERMISSIONS)); } // Current user for the session @@ -200,10 +212,13 @@ public void setKeyspace(String ks) throws InvalidRequestException */ public void login(AuthenticatedUser user) throws AuthenticationException { - if (!user.isAnonymous() && !Auth.isExistingUser(user.getName())) - throw new AuthenticationException(String.format("User %s doesn't exist - create it with CREATE USER query first", - user.getName())); - this.user = user; + // Login privilege is not inherited via granted roles, so just + // verify that the role with the credentials that were actually + // supplied has it + if (user.isAnonymous() || DatabaseDescriptor.getRoleManager().canLogin(user.getName())) + this.user = user; + else + throw new AuthenticationException(String.format("%s is not permitted to log in", user.getName())); } public void hasAllKeyspacesAccess(Permission perm) throws UnauthorizedException @@ -223,7 +238,7 @@ public void hasColumnFamilyAccess(String keyspace, String columnFamily, Permissi throws UnauthorizedException, InvalidRequestException { ThriftValidation.validateColumnFamily(keyspace, columnFamily); - hasAccess(keyspace, perm, DataResource.columnFamily(keyspace, columnFamily)); + hasAccess(keyspace, perm, DataResource.table(keyspace, columnFamily)); } private void hasAccess(String keyspace, Permission perm, DataResource resource) @@ -264,10 +279,15 @@ private void preventSystemKSSchemaModification(String keyspace, DataResource res if (SystemKeyspace.NAME.equalsIgnoreCase(keyspace)) throw new UnauthorizedException(keyspace + " keyspace is not user-modifiable."); - // we want to allow altering AUTH_KS and TRACING_KS. - Set allowAlter = Sets.newHashSet(Auth.AUTH_KS, TraceKeyspace.NAME); - if (allowAlter.contains(keyspace.toLowerCase()) && !(resource.isKeyspaceLevel() && (perm == Permission.ALTER))) + // allow users with sufficient privileges to alter KS level options on AUTH_KS and + // TRACING_KS, and also to drop legacy tables (users, credentials, permissions) from + // AUTH_KS + if (ALTERABLE_SYSTEM_KEYSPACES.contains(resource.getKeyspace().toLowerCase()) + && ((perm == Permission.ALTER && !resource.isKeyspaceLevel()) + || (perm == Permission.DROP && !DROPPABLE_SYSTEM_TABLES.contains(resource)))) + { throw new UnauthorizedException(String.format("Cannot %s %s", perm, resource)); + } } public void validateLogin() throws UnauthorizedException @@ -307,6 +327,6 @@ public static SemanticVersion[] getCQLSupportedVersion() private Set authorize(IResource resource) { - return Auth.getPermissions(user, resource); + return AuthenticatedUser.getPermissions(user, resource); } } diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index 4740cd3ffb8b..bb3e88294c3d 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -17,10 +17,7 @@ */ package org.apache.cassandra.service; -import java.io.ByteArrayInputStream; -import java.io.DataInputStream; -import java.io.File; -import java.io.IOException; +import java.io.*; import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.UnknownHostException; @@ -29,20 +26,10 @@ import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; - -import javax.management.JMX; -import javax.management.MBeanServer; -import javax.management.Notification; -import javax.management.NotificationBroadcasterSupport; -import javax.management.ObjectName; +import javax.management.*; import javax.management.openmbean.TabularData; import javax.management.openmbean.TabularDataSupport; -import ch.qos.logback.classic.LoggerContext; -import ch.qos.logback.classic.jmx.JMXConfiguratorMBean; -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.core.Appender; - import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Predicate; import com.google.common.collect.*; @@ -52,12 +39,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.cassandra.auth.Auth; +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.jmx.JMXConfiguratorMBean; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.Appender; +import org.apache.cassandra.auth.AuthKeyspace; +import org.apache.cassandra.auth.AuthMigrationListener; import org.apache.cassandra.concurrent.*; import org.apache.cassandra.config.*; -import org.apache.cassandra.cql3.UntypedResultSet; import org.apache.cassandra.cql3.QueryOptions; import org.apache.cassandra.cql3.QueryProcessor; +import org.apache.cassandra.cql3.UntypedResultSet; import org.apache.cassandra.cql3.statements.SelectStatement; import org.apache.cassandra.db.*; import org.apache.cassandra.db.commitlog.CommitLog; @@ -74,15 +66,9 @@ import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.locator.*; import org.apache.cassandra.metrics.StorageMetrics; -import org.apache.cassandra.net.AsyncOneResponse; -import org.apache.cassandra.net.MessageOut; -import org.apache.cassandra.net.MessagingService; -import org.apache.cassandra.net.ResponseVerbHandler; -import org.apache.cassandra.repair.RepairMessageVerbHandler; -import org.apache.cassandra.repair.RepairSessionResult; +import org.apache.cassandra.net.*; +import org.apache.cassandra.repair.*; import org.apache.cassandra.repair.messages.RepairOption; -import org.apache.cassandra.repair.RepairSession; -import org.apache.cassandra.repair.RepairParallelism; import org.apache.cassandra.service.paxos.CommitVerbHandler; import org.apache.cassandra.service.paxos.PrepareVerbHandler; import org.apache.cassandra.service.paxos.ProposeVerbHandler; @@ -843,7 +829,7 @@ private void joinTokenRing(int delay) throws ConfigurationException Gossiper.instance.replacedEndpoint(existing); assert tokenMetadata.sortedTokens().size() > 0; - Auth.setup(); + doAuthSetup(); } else { @@ -882,10 +868,41 @@ else if (isSurveyMode) logger.info("Leaving write survey mode and joining ring at operator request"); assert tokenMetadata.sortedTokens().size() > 0; - Auth.setup(); + doAuthSetup(); } } + private void doAuthSetup() + { + try + { + // if we don't have system_auth keyspace at this point, then create it manually + // otherwise, create any necessary tables as we may be upgrading in which case + // the ks exists with the only the legacy tables defined + if (Schema.instance.getKSMetaData(AuthKeyspace.NAME) == null) + { + MigrationManager.announceNewKeyspace(AuthKeyspace.definition(), 0, false); + } + else + { + for (Map.Entry table : AuthKeyspace.definition().cfMetaData().entrySet()) + { + if (Schema.instance.getCFMetaData(AuthKeyspace.NAME, table.getKey()) == null) + MigrationManager.announceNewColumnFamily(table.getValue()); + } + } + } + catch (Exception e) + { + throw new AssertionError(e); // shouldn't ever happen. + } + + DatabaseDescriptor.getRoleManager().setup(); + DatabaseDescriptor.getAuthenticator().setup(); + DatabaseDescriptor.getAuthorizer().setup(); + MigrationManager.instance.register(new AuthMigrationListener()); + } + public boolean isJoined() { return joined; diff --git a/src/java/org/apache/cassandra/thrift/CassandraServer.java b/src/java/org/apache/cassandra/thrift/CassandraServer.java index 7d8904934832..c0de59f31191 100644 --- a/src/java/org/apache/cassandra/thrift/CassandraServer.java +++ b/src/java/org/apache/cassandra/thrift/CassandraServer.java @@ -29,43 +29,30 @@ import com.google.common.base.Function; import com.google.common.base.Joiner; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSortedSet; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; +import com.google.common.collect.*; import com.google.common.primitives.Longs; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.cassandra.auth.AuthenticatedUser; import org.apache.cassandra.auth.Permission; -import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.config.DatabaseDescriptor; -import org.apache.cassandra.config.KSMetaData; -import org.apache.cassandra.config.Schema; +import org.apache.cassandra.config.*; import org.apache.cassandra.cql3.QueryOptions; import org.apache.cassandra.cql3.statements.ParsedStatement; import org.apache.cassandra.db.*; import org.apache.cassandra.db.composites.*; import org.apache.cassandra.db.context.CounterContext; import org.apache.cassandra.db.filter.ColumnSlice; -import org.apache.cassandra.db.filter.IDiskAtomFilter; -import org.apache.cassandra.db.filter.NamesQueryFilter; -import org.apache.cassandra.db.filter.SliceQueryFilter; +import org.apache.cassandra.db.filter.*; import org.apache.cassandra.db.marshal.TimeUUIDType; import org.apache.cassandra.dht.*; +import org.apache.cassandra.dht.Range; import org.apache.cassandra.exceptions.*; import org.apache.cassandra.io.util.DataOutputBuffer; import org.apache.cassandra.locator.DynamicEndpointSnitch; import org.apache.cassandra.metrics.ClientMetrics; import org.apache.cassandra.scheduler.IRequestScheduler; import org.apache.cassandra.serializers.MarshalException; -import org.apache.cassandra.service.CASRequest; -import org.apache.cassandra.service.ClientState; -import org.apache.cassandra.service.MigrationManager; -import org.apache.cassandra.service.StorageProxy; -import org.apache.cassandra.service.StorageService; +import org.apache.cassandra.service.*; import org.apache.cassandra.service.pager.QueryPagers; import org.apache.cassandra.tracing.Tracing; import org.apache.cassandra.utils.ByteBufferUtil; @@ -1472,12 +1459,11 @@ public List describe_splits_ex(String cfName, String start_token, Strin } } - public void login(AuthenticationRequest auth_request) throws AuthenticationException, AuthorizationException, TException + public void login(AuthenticationRequest auth_request) throws TException { try { - AuthenticatedUser user = DatabaseDescriptor.getAuthenticator().authenticate(auth_request.getCredentials()); - state().login(user); + state().login(DatabaseDescriptor.getAuthenticator().legacyAuthenticate(auth_request.getCredentials())); } catch (org.apache.cassandra.exceptions.AuthenticationException e) { diff --git a/src/java/org/apache/cassandra/tools/BulkLoader.java b/src/java/org/apache/cassandra/tools/BulkLoader.java index a720e1226491..f89acfb5d091 100644 --- a/src/java/org/apache/cassandra/tools/BulkLoader.java +++ b/src/java/org/apache/cassandra/tools/BulkLoader.java @@ -18,33 +18,33 @@ package org.apache.cassandra.tools; import java.io.File; -import java.net.*; +import java.net.InetAddress; +import java.net.MalformedURLException; +import java.net.UnknownHostException; import java.util.*; import com.google.common.base.Joiner; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; - import org.apache.commons.cli.*; -import org.apache.thrift.protocol.TBinaryProtocol; -import org.apache.thrift.protocol.TProtocol; -import org.apache.thrift.transport.TTransport; - -import org.apache.cassandra.auth.IAuthenticator; +import org.apache.cassandra.auth.PasswordAuthenticator; import org.apache.cassandra.config.*; -import org.apache.cassandra.schema.LegacySchemaTables; import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.db.marshal.UTF8Type; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.sstable.SSTableLoader; +import org.apache.cassandra.schema.LegacySchemaTables; import org.apache.cassandra.streaming.*; import org.apache.cassandra.thrift.*; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.JVMStabilityInspector; import org.apache.cassandra.utils.OutputHandler; +import org.apache.thrift.protocol.TBinaryProtocol; +import org.apache.thrift.protocol.TProtocol; +import org.apache.thrift.transport.TTransport; public class BulkLoader { @@ -359,8 +359,8 @@ private static Cassandra.Client createThriftClient(String host, int port, String if (user != null && passwd != null) { Map credentials = new HashMap<>(); - credentials.put(IAuthenticator.USERNAME_KEY, user); - credentials.put(IAuthenticator.PASSWORD_KEY, passwd); + credentials.put(PasswordAuthenticator.USERNAME_KEY, user); + credentials.put(PasswordAuthenticator.PASSWORD_KEY, passwd); AuthenticationRequest authenticationRequest = new AuthenticationRequest(credentials); client.login(authenticationRequest); } diff --git a/src/java/org/apache/cassandra/transport/Client.java b/src/java/org/apache/cassandra/transport/Client.java index c7c3103953fb..571a7ce8bcba 100644 --- a/src/java/org/apache/cassandra/transport/Client.java +++ b/src/java/org/apache/cassandra/transport/Client.java @@ -22,16 +22,11 @@ import java.io.InputStreamReader; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; import com.google.common.base.Splitter; -import org.apache.cassandra.auth.IAuthenticator; +import org.apache.cassandra.auth.PasswordAuthenticator; import org.apache.cassandra.cql3.QueryOptions; import org.apache.cassandra.db.ConsistencyLevel; import org.apache.cassandra.db.marshal.Int32Type; @@ -179,7 +174,7 @@ else if (msgType.equals("CREDENTIALS")) else if (msgType.equals("AUTHENTICATE")) { Map credentials = readCredentials(iter); - if(!credentials.containsKey(IAuthenticator.USERNAME_KEY) || !credentials.containsKey(IAuthenticator.PASSWORD_KEY)) + if(!credentials.containsKey(PasswordAuthenticator.USERNAME_KEY) || !credentials.containsKey(PasswordAuthenticator.PASSWORD_KEY)) { System.err.println("[ERROR] Authentication requires both 'username' and 'password'"); return null; @@ -221,8 +216,8 @@ private Map readCredentials(Iterator iter) private byte[] encodeCredentialsForSasl(Map credentials) { - byte[] username = credentials.get(IAuthenticator.USERNAME_KEY).getBytes(StandardCharsets.UTF_8); - byte[] password = credentials.get(IAuthenticator.PASSWORD_KEY).getBytes(StandardCharsets.UTF_8); + byte[] username = credentials.get(PasswordAuthenticator.USERNAME_KEY).getBytes(StandardCharsets.UTF_8); + byte[] password = credentials.get(PasswordAuthenticator.PASSWORD_KEY).getBytes(StandardCharsets.UTF_8); byte[] initialResponse = new byte[username.length + password.length + 2]; initialResponse[0] = 0; System.arraycopy(username, 0, initialResponse, 1, username.length); diff --git a/src/java/org/apache/cassandra/transport/Server.java b/src/java/org/apache/cassandra/transport/Server.java index 99601a6ce382..8830479222d4 100644 --- a/src/java/org/apache/cassandra/transport/Server.java +++ b/src/java/org/apache/cassandra/transport/Server.java @@ -28,21 +28,24 @@ import javax.net.ssl.SSLContext; import javax.net.ssl.SSLEngine; -import io.netty.channel.epoll.Epoll; -import io.netty.channel.epoll.EpollEventLoopGroup; -import io.netty.channel.epoll.EpollServerSocketChannel; -import io.netty.util.Version; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.*; +import io.netty.channel.epoll.Epoll; +import io.netty.channel.epoll.EpollEventLoopGroup; +import io.netty.channel.epoll.EpollServerSocketChannel; +import io.netty.channel.group.ChannelGroup; +import io.netty.channel.group.DefaultChannelGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.ssl.SslHandler; +import io.netty.util.Version; import io.netty.util.concurrent.EventExecutor; import io.netty.util.concurrent.GlobalEventExecutor; import io.netty.util.internal.logging.InternalLoggerFactory; import io.netty.util.internal.logging.Slf4JLoggerFactory; -import org.apache.cassandra.auth.IAuthenticator; -import org.apache.cassandra.auth.ISaslAwareAuthenticator; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.config.EncryptionOptions; import org.apache.cassandra.db.marshal.AbstractType; @@ -50,11 +53,6 @@ import org.apache.cassandra.security.SSLFactory; import org.apache.cassandra.service.*; import org.apache.cassandra.transport.messages.EventMessage; -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.*; -import io.netty.channel.group.ChannelGroup; -import io.netty.channel.group.DefaultChannelGroup; -import io.netty.handler.ssl.SslHandler; public class Server implements CassandraDaemon.Server { @@ -132,16 +130,6 @@ public boolean isRunning() private void run() { - // Check that a SaslAuthenticator can be provided by the configured - // IAuthenticator. If not, don't start the server. - IAuthenticator authenticator = DatabaseDescriptor.getAuthenticator(); - if (authenticator.requireAuthentication() && !(authenticator instanceof ISaslAwareAuthenticator)) - { - logger.error("Not starting native transport as the configured IAuthenticator is not capable of SASL authentication"); - isRunning.compareAndSet(true, false); - return; - } - // Configure the server. eventExecutorGroup = new RequestThreadPoolExecutor(); diff --git a/src/java/org/apache/cassandra/transport/ServerConnection.java b/src/java/org/apache/cassandra/transport/ServerConnection.java index b28866f85aef..24eb6437a3e5 100644 --- a/src/java/org/apache/cassandra/transport/ServerConnection.java +++ b/src/java/org/apache/cassandra/transport/ServerConnection.java @@ -20,21 +20,17 @@ import java.util.concurrent.ConcurrentMap; import io.netty.channel.Channel; - import org.apache.cassandra.auth.IAuthenticator; -import org.apache.cassandra.auth.ISaslAwareAuthenticator; -import org.apache.cassandra.auth.ISaslAwareAuthenticator.SaslAuthenticator; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.service.ClientState; import org.apache.cassandra.service.QueryState; - import org.cliffc.high_scale_lib.NonBlockingHashMap; public class ServerConnection extends Connection { private enum State { UNINITIALIZED, AUTHENTICATION, READY } - private volatile SaslAuthenticator saslAuthenticator; + private volatile IAuthenticator.SaslNegotiator saslNegotiator; private final ClientState clientState; private volatile State state; @@ -104,7 +100,7 @@ else if (responseType == Message.Type.READY) { state = State.READY; // we won't use the authenticator again, null it so that it can be GC'd - saslAuthenticator = null; + saslNegotiator = null; } break; case READY: @@ -114,14 +110,10 @@ else if (responseType == Message.Type.READY) } } - public SaslAuthenticator getAuthenticator() + public IAuthenticator.SaslNegotiator getSaslNegotiator() { - if (saslAuthenticator == null) - { - IAuthenticator authenticator = DatabaseDescriptor.getAuthenticator(); - assert authenticator instanceof ISaslAwareAuthenticator : "Configured IAuthenticator does not support SASL authentication"; - saslAuthenticator = ((ISaslAwareAuthenticator)authenticator).newAuthenticator(); - } - return saslAuthenticator; + if (saslNegotiator == null) + saslNegotiator = DatabaseDescriptor.getAuthenticator().newSaslNegotiator(); + return saslNegotiator; } } diff --git a/src/java/org/apache/cassandra/transport/messages/AuthResponse.java b/src/java/org/apache/cassandra/transport/messages/AuthResponse.java index 3f3f7745a02f..cb67476dd88b 100644 --- a/src/java/org/apache/cassandra/transport/messages/AuthResponse.java +++ b/src/java/org/apache/cassandra/transport/messages/AuthResponse.java @@ -17,18 +17,14 @@ */ package org.apache.cassandra.transport.messages; +import java.nio.ByteBuffer; + +import io.netty.buffer.ByteBuf; import org.apache.cassandra.auth.AuthenticatedUser; -import org.apache.cassandra.auth.ISaslAwareAuthenticator.SaslAuthenticator; +import org.apache.cassandra.auth.IAuthenticator; import org.apache.cassandra.exceptions.AuthenticationException; import org.apache.cassandra.service.QueryState; -import org.apache.cassandra.transport.CBUtil; -import org.apache.cassandra.transport.Message; -import org.apache.cassandra.transport.ProtocolException; -import org.apache.cassandra.transport.ServerConnection; - -import io.netty.buffer.ByteBuf; - -import java.nio.ByteBuffer; +import org.apache.cassandra.transport.*; /** * A SASL token message sent from client to server. Some SASL @@ -61,11 +57,12 @@ public int encodedSize(AuthResponse response, int version) } }; - private byte[] token; + private final byte[] token; public AuthResponse(byte[] token) { super(Message.Type.AUTH_RESPONSE); + assert token != null; this.token = token; } @@ -74,11 +71,11 @@ public Response execute(QueryState queryState) { try { - SaslAuthenticator authenticator = ((ServerConnection) connection).getAuthenticator(); - byte[] challenge = authenticator.evaluateResponse(token == null ? new byte[0] : token); - if (authenticator.isComplete()) + IAuthenticator.SaslNegotiator negotiator = ((ServerConnection) connection).getSaslNegotiator(); + byte[] challenge = negotiator.evaluateResponse(token); + if (negotiator.isComplete()) { - AuthenticatedUser user = authenticator.getAuthenticatedUser(); + AuthenticatedUser user = negotiator.getAuthenticatedUser(); queryState.getClientState().login(user); // authentication is complete, send a ready message to the client return new AuthSuccess(challenge); diff --git a/src/java/org/apache/cassandra/transport/messages/CredentialsMessage.java b/src/java/org/apache/cassandra/transport/messages/CredentialsMessage.java index eb39e30b7505..aad4232f6582 100644 --- a/src/java/org/apache/cassandra/transport/messages/CredentialsMessage.java +++ b/src/java/org/apache/cassandra/transport/messages/CredentialsMessage.java @@ -20,15 +20,14 @@ import java.util.HashMap; import java.util.Map; +import io.netty.buffer.ByteBuf; import org.apache.cassandra.auth.AuthenticatedUser; import org.apache.cassandra.config.DatabaseDescriptor; -import org.apache.cassandra.transport.ProtocolException; -import io.netty.buffer.ByteBuf; - import org.apache.cassandra.exceptions.AuthenticationException; import org.apache.cassandra.service.QueryState; import org.apache.cassandra.transport.CBUtil; import org.apache.cassandra.transport.Message; +import org.apache.cassandra.transport.ProtocolException; /** * Message to indicate that the server is ready to receive requests. @@ -75,14 +74,15 @@ public Message.Response execute(QueryState state) { try { - AuthenticatedUser user = DatabaseDescriptor.getAuthenticator().authenticate(credentials); + AuthenticatedUser user = DatabaseDescriptor.getAuthenticator().legacyAuthenticate(credentials); state.getClientState().login(user); - return new ReadyMessage(); } catch (AuthenticationException e) { return ErrorMessage.fromException(e); } + + return new ReadyMessage(); } @Override diff --git a/src/java/org/apache/cassandra/utils/FBUtilities.java b/src/java/org/apache/cassandra/utils/FBUtilities.java index 8077df8e5e19..0462e5e68bcd 100644 --- a/src/java/org/apache/cassandra/utils/FBUtilities.java +++ b/src/java/org/apache/cassandra/utils/FBUtilities.java @@ -20,19 +20,12 @@ import java.io.*; import java.lang.reflect.Field; import java.math.BigInteger; -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.net.SocketException; -import java.net.URL; -import java.net.UnknownHostException; +import java.net.*; import java.nio.ByteBuffer; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.*; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; +import java.util.concurrent.*; import java.util.zip.Checksum; import com.google.common.base.Joiner; @@ -43,6 +36,7 @@ import org.apache.cassandra.auth.IAuthenticator; import org.apache.cassandra.auth.IAuthorizer; +import org.apache.cassandra.auth.IRoleManager; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.DecoratedKey; import org.apache.cassandra.dht.IPartitioner; @@ -54,10 +48,7 @@ import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.io.util.IAllocator; import org.apache.cassandra.net.AsyncOneResponse; -import org.apache.thrift.TBase; -import org.apache.thrift.TDeserializer; -import org.apache.thrift.TException; -import org.apache.thrift.TSerializer; +import org.apache.thrift.*; import org.codehaus.jackson.JsonFactory; import org.codehaus.jackson.map.ObjectMapper; @@ -439,6 +430,13 @@ public static IAuthenticator newAuthenticator(String className) throws Configura return FBUtilities.construct(className, "authenticator"); } + public static IRoleManager newRoleManager(String className) throws ConfigurationException + { + if (!className.contains(".")) + className = "org.apache.cassandra.auth." + className; + return FBUtilities.construct(className, "role manager"); + } + /** * @return The Class for the given name. * @param classname Fully qualified classname. From e245ba7af9801696db733fa3f88aa37135b5ae36 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Wed, 14 Jan 2015 17:33:33 -0600 Subject: [PATCH 237/557] rm CqlStorage --- NEWS.txt | 1 + .../cassandra/hadoop/pig/CqlStorage.java | 41 ------------------- 2 files changed, 1 insertion(+), 41 deletions(-) delete mode 100644 src/java/org/apache/cassandra/hadoop/pig/CqlStorage.java diff --git a/NEWS.txt b/NEWS.txt index b9c41734bae1..e37e85f2ee7d 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -33,6 +33,7 @@ New features Upgrading --------- + - Pig's CqlStorage has been removed, use CqlNativeStorage instead - IAuthenticator been updated to remove responsibility for user/role maintenance and is now solely responsible for validating credentials, This is primarily done via SASL, though an optional method exists for diff --git a/src/java/org/apache/cassandra/hadoop/pig/CqlStorage.java b/src/java/org/apache/cassandra/hadoop/pig/CqlStorage.java deleted file mode 100644 index c7277fa1ae40..000000000000 --- a/src/java/org/apache/cassandra/hadoop/pig/CqlStorage.java +++ /dev/null @@ -1,41 +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.hadoop.pig; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -/** - * @deprecated use CqlNativeStorage instead. CqlStorage will be removed. - */ -public class CqlStorage extends CqlNativeStorage -{ - private static final Logger logger = LoggerFactory.getLogger(CqlNativeStorage.class); - - public CqlStorage() - { - this(1000); - logger.warn("CqlStorage is deprecated and will be removed in the next release, use CqlNativeStorage instead."); - } - - /** @param pageSize limit number of CQL rows to fetch in a thrift request */ - public CqlStorage(int pageSize) - { - super(pageSize); - } -} - From 3dd9c38a14ae593591d46279e2f99a032288bd65 Mon Sep 17 00:00:00 2001 From: T Jake Luciani Date: Mon, 8 Dec 2014 15:18:07 -0500 Subject: [PATCH 238/557] DirectByteBuffer compatible LZ4 methods Patch by Branimir Lambov; reviewed by tjake for CASSANDRA-7039 --- CHANGES.txt | 1 + build.xml | 2 +- lib/licenses/{lz4-1.2.0.txt => lz4-1.3.0.txt} | 0 lib/lz4-1.2.0.jar | Bin 165505 -> 0 bytes lib/lz4-1.3.0.jar | Bin 0 -> 277311 bytes 5 files changed, 2 insertions(+), 1 deletion(-) rename lib/licenses/{lz4-1.2.0.txt => lz4-1.3.0.txt} (100%) delete mode 100644 lib/lz4-1.2.0.jar create mode 100644 lib/lz4-1.3.0.jar diff --git a/CHANGES.txt b/CHANGES.txt index 37630e6a7082..27b511a8e5f2 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0 + * DirectByteBuffer compatible LZ4 methods (CASSANDRA-7039) * Add role based access control (CASSANDRA-7653) * Group sstables for anticompaction correctly (CASSANDRA-8578) * Add ReadFailureException to native protocol, respond diff --git a/build.xml b/build.xml index 06c79e02af09..baf6a77e7030 100644 --- a/build.xml +++ b/build.xml @@ -317,7 +317,7 @@ - + diff --git a/lib/licenses/lz4-1.2.0.txt b/lib/licenses/lz4-1.3.0.txt similarity index 100% rename from lib/licenses/lz4-1.2.0.txt rename to lib/licenses/lz4-1.3.0.txt diff --git a/lib/lz4-1.2.0.jar b/lib/lz4-1.2.0.jar deleted file mode 100644 index 9cdebd24f10a06b851c23a742276c5d1679fd8f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165505 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∾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%0AF;zj^k^wy>PxK|> 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 z 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

    (6wW4ypKp&+p@Wnq5uB>@AlI9& z=;k_B13uN*x2E{u3d*9bNy)8A!6?m5yBtzz!~LVh`Y5@%OJ^>V#m4)c6({>XLj%(# z@@m;QOxQ>#W#suqDbOHKe|4y9(R9U}dwv|%U0KcQ0;6BMu{PiCB%^purTUmzx+5d{ zdnvDWnVNHD5t}sas%naj_uO_JQbnV{RHKZUKY^R%+=6;|MRtY+R!9d{j~a7j^JOFE zynMuO54#$}CQsuaR4NxMrlsh^Z{;tM_o{`4>x|Ewg}x@z4l`f+-f}q*dI(d{1wYYX z@na6YFiSJt;pIjOl&gQwe2f?hN?#ho5*^HUpWQV%py^tf$axrvsWe3^Jz-Hii9Q`f z@4WU$B|3HBz_-V9_}K$A5cmxa0S<~=kUN6OmtCBj^jf3f_FF8H9{dyGjfuZd;L+3f zS-bRhZGj*{g#!5Ox4kW(SHB!@aV}wKhI(8!R^ev{>E_$HqQR~%qPV@>ymO&V2dpp< zwNcQRS$h~I+bmp24O#}E@NPfMTCR4y&ixkkVu{+8a+k^7{628a zo`#n>E;^tMmmH5+eg+e_Y=Hdv1N|`bf$dkXwM|5 zErUXg78S?O$!RUa!fXC6k9F zxGnl?84RECP&+I)(U57(rcxxIv85@yKr9)plC`FJebHcvQkgjbjyo~d7`>eisM|k zi+9TtU#`aI754>JyW$*DyrAGD zE7v8b1E6_yzif<#xyF|qb%Ub0$~eR^(jq^rr!f!P(AGy$g6vS-%y#1vSZDPJBE1LPj_B(?e(OR~$F~K}1+k?`v{WKK<;>$@i#pK6 z>D(yz*|R1>7gZOaABNkCs1iWFEZ1zo&ti}wHoXWO%+B8jR#wzH`%8xSCE64-vw-or ztSrxSApM&2yp~}_&=sS#V4Z?otmDMglnm4F`=d*Spu2`j6tPY9m=T~jbqI72AZHs@ zmQgTcQl?Nh{at4R5JiLxTw+#79Wjwk+tsNtk;;E+u>(aB%emV1^tCNp8+1*0Cp>sl zgQK>a*p7J>(jtI<80_S_t@M3qMkSv_1%eW=Zn~!HtfHsda>E(zYS+hjY6_x>8%TT+)lo?rsF+a1Rgo=J2@b}!#&@n`TOt%Ya8KOmnv@y*Q8PmS`AFYDNo7>epBBc{E#Z&&rBBY9GGZ zueCa3yF=aiT{6X`@oYaUz`ZT=S08CsA$?&huEtm?C5;K?&thtp$v(0h3Mm;im6VM5 z0vw~AxmMAVg_Mf;1x#(DvhAZZKk-bqxd zY!!2Cjr-eKxsbQe>-sx^vi+0VvUlvAOV@cvPy%BrLot^;uf8D6*f`QLjz;wU#{I#@kENAWEjrqrS5

    a}_=PnIH(pR{o|X)# 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 z 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

    M>>s@RO%W6GsD1%P1+-2hNTD*(ZX0SSxD2L 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 Date: Fri, 16 Jan 2015 09:37:06 -0500 Subject: [PATCH 239/557] Support direct buffer decompression for reads Patch by tjake; reviewed by Branimir Lambov for CASSANDRA-8464 --- CHANGES.txt | 1 + conf/cassandra-env.sh | 1 + .../CompressedRandomAccessReader.java | 179 ++++++++++++++++-- .../io/compress/CompressionMetadata.java | 11 +- .../io/compress/DeflateCompressor.java | 17 ++ .../cassandra/io/compress/ICompressor.java | 12 ++ .../cassandra/io/compress/LZ4Compressor.java | 43 ++++- .../io/compress/SnappyCompressor.java | 13 ++ .../cassandra/io/sstable/format/Version.java | 2 - .../io/sstable/format/big/BigFormat.java | 20 +- .../apache/cassandra/io/util/FileUtils.java | 5 +- .../io/util/MmappedSegmentedFile.java | 1 + .../cassandra/io/util/RandomAccessReader.java | 16 +- .../compress/CompressedInputStream.java | 15 +- .../compress/CompressedStreamReader.java | 2 +- .../apache/cassandra/utils/FBUtilities.java | 67 +++++++ .../CompressedRandomAccessReaderTest.java | 6 +- ...ompressorTest.java => CompressorTest.java} | 69 ++++++- .../compress/CompressedInputStreamTest.java | 2 +- 19 files changed, 400 insertions(+), 82 deletions(-) rename test/unit/org/apache/cassandra/io/compress/{LZ4CompressorTest.java => CompressorTest.java} (55%) diff --git a/CHANGES.txt b/CHANGES.txt index 27b511a8e5f2..79181e164fff 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0 + * Support direct buffer decompression for reads (CASSANDRA-8464) * DirectByteBuffer compatible LZ4 methods (CASSANDRA-7039) * Add role based access control (CASSANDRA-7653) * Group sstables for anticompaction correctly (CASSANDRA-8578) diff --git a/conf/cassandra-env.sh b/conf/cassandra-env.sh index 58605ca2e7e0..f9641ed0f91d 100644 --- a/conf/cassandra-env.sh +++ b/conf/cassandra-env.sh @@ -251,6 +251,7 @@ fi # uncomment to have Cassandra JVM log internal method compilation (developers only) # JVM_OPTS="$JVM_OPTS -XX:+UnlockDiagnosticVMOptions -XX:+LogCompilation" +# JVM_OPTS="$JVM_OPTS -XX:+UnlockCommercialFeatures -XX:+FlightRecorder" # Prefer binding to IPv4 network intefaces (when net.ipv6.bindv6only=1). See # http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6342561 (short version: diff --git a/src/java/org/apache/cassandra/io/compress/CompressedRandomAccessReader.java b/src/java/org/apache/cassandra/io/compress/CompressedRandomAccessReader.java index dca5ade2846f..57abba92c132 100644 --- a/src/java/org/apache/cassandra/io/compress/CompressedRandomAccessReader.java +++ b/src/java/org/apache/cassandra/io/compress/CompressedRandomAccessReader.java @@ -19,14 +19,22 @@ import java.io.*; import java.nio.ByteBuffer; +import java.nio.MappedByteBuffer; +import java.nio.channels.FileChannel; +import java.util.Map; +import java.util.TreeMap; import java.util.concurrent.ThreadLocalRandom; import java.util.zip.Adler32; -import java.util.zip.CRC32; -import java.util.zip.Checksum; + +import com.google.common.primitives.Ints; + +import org.apache.cassandra.config.Config; +import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.io.FSReadError; import org.apache.cassandra.io.sstable.CorruptSSTableException; import org.apache.cassandra.io.util.CompressedPoolingSegmentedFile; +import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.io.util.PoolingSegmentedFile; import org.apache.cassandra.io.util.RandomAccessReader; import org.apache.cassandra.utils.FBUtilities; @@ -37,6 +45,8 @@ */ public class CompressedRandomAccessReader extends RandomAccessReader { + private static final boolean useMmap = DatabaseDescriptor.getDiskAccessMode() == Config.DiskAccessMode.mmap; + public static CompressedRandomAccessReader open(String path, CompressionMetadata metadata, CompressedPoolingSegmentedFile owner) { try @@ -61,33 +71,96 @@ public static CompressedRandomAccessReader open(String dataFilePath, Compression } } + private TreeMap chunkSegments; + private int MAX_SEGMENT_SIZE = Integer.MAX_VALUE; + private final CompressionMetadata metadata; // we read the raw compressed bytes into this buffer, then move the uncompressed ones into super.buffer. private ByteBuffer compressed; // re-use single crc object - private final Checksum checksum; + private final Adler32 checksum; // raw checksum bytes - private final ByteBuffer checksumBytes = ByteBuffer.wrap(new byte[4]); + private ByteBuffer checksumBytes; protected CompressedRandomAccessReader(String dataFilePath, CompressionMetadata metadata, PoolingSegmentedFile owner) throws FileNotFoundException { - super(new File(dataFilePath), metadata.chunkLength(), owner); + super(new File(dataFilePath), metadata.chunkLength(), metadata.compressor().useDirectOutputByteBuffers(), owner); this.metadata = metadata; - checksum = metadata.hasPostCompressionAdlerChecksums ? new Adler32() : new CRC32(); - compressed = ByteBuffer.wrap(new byte[metadata.compressor().initialCompressedBufferLength(metadata.chunkLength())]); + checksum = new Adler32(); + + if (!useMmap) + { + compressed = ByteBuffer.wrap(new byte[metadata.compressor().initialCompressedBufferLength(metadata.chunkLength())]); + checksumBytes = ByteBuffer.wrap(new byte[4]); + } + else + { + try + { + createMappedSegments(); + } + catch (IOException e) + { + throw new IOError(e); + } + } + } + + private void createMappedSegments() throws IOException + { + chunkSegments = new TreeMap<>(); + long offset = 0; + long lastSegmentOffset = 0; + long segmentSize = 0; + + while (offset < metadata.dataLength) + { + CompressionMetadata.Chunk chunk = metadata.chunkFor(offset); + + //Reached a new mmap boundary + if (segmentSize + chunk.length + 4 > MAX_SEGMENT_SIZE) + { + chunkSegments.put(lastSegmentOffset, channel.map(FileChannel.MapMode.READ_ONLY, lastSegmentOffset, segmentSize)); + lastSegmentOffset += segmentSize; + segmentSize = 0; + } + + segmentSize += chunk.length + 4; //checksum + offset += metadata.chunkLength(); + } + + if (segmentSize > 0) + chunkSegments.put(lastSegmentOffset, channel.map(FileChannel.MapMode.READ_ONLY, lastSegmentOffset, segmentSize)); } - protected ByteBuffer allocateBuffer(int bufferSize) + protected ByteBuffer allocateBuffer(int bufferSize, boolean useDirect) { assert Integer.bitCount(bufferSize) == 1; - return ByteBuffer.allocate(bufferSize); + return useMmap && useDirect + ? ByteBuffer.allocateDirect(bufferSize) + : ByteBuffer.allocate(bufferSize); } @Override - protected void reBuffer() + public void deallocate() + { + super.deallocate(); + + if (chunkSegments != null) + { + for (Map.Entry entry : chunkSegments.entrySet()) + { + FileUtils.clean(entry.getValue()); + } + } + + chunkSegments = null; + } + + private void reBufferStandard() { try { @@ -126,14 +199,7 @@ protected void reBuffer() if (metadata.parameters.getCrcCheckChance() > ThreadLocalRandom.current().nextDouble()) { - if (metadata.hasPostCompressionAdlerChecksums) - { - checksum.update(compressed.array(), 0, chunk.length); - } - else - { - checksum.update(buffer.array(), 0, decompressedBytes); - } + checksum.update(compressed.array(), 0, chunk.length); if (checksum(chunk) != (int) checksum.getValue()) throw new CorruptBlockException(getPath(), chunk); @@ -156,6 +222,81 @@ protected void reBuffer() } } + private void reBufferMmap() + { + try + { + long position = current(); + assert position < metadata.dataLength; + + CompressionMetadata.Chunk chunk = metadata.chunkFor(position); + + Map.Entry entry = chunkSegments.floorEntry(chunk.offset); + long segmentOffset = entry.getKey(); + int chunkOffset = Ints.checkedCast(chunk.offset - segmentOffset); + MappedByteBuffer compressedChunk = entry.getValue(); + + compressedChunk.position(chunkOffset); + compressedChunk.limit(chunkOffset + chunk.length); + compressedChunk.mark(); + + buffer.clear(); + int decompressedBytes; + try + { + decompressedBytes = metadata.compressor().uncompress(compressedChunk, buffer); + buffer.limit(decompressedBytes); + } + catch (IOException e) + { + throw new CorruptBlockException(getPath(), chunk); + } + finally + { + compressedChunk.limit(compressedChunk.capacity()); + } + + if (metadata.parameters.getCrcCheckChance() > ThreadLocalRandom.current().nextDouble()) + { + compressedChunk.reset(); + compressedChunk.limit(chunkOffset + chunk.length); + + FBUtilities.directCheckSum(checksum, compressedChunk); + + compressedChunk.limit(compressedChunk.capacity()); + + + if (compressedChunk.getInt() != (int) checksum.getValue()) + throw new CorruptBlockException(getPath(), chunk); + + // reset checksum object back to the original (blank) state + checksum.reset(); + } + + // buffer offset is always aligned + bufferOffset = position & ~(buffer.capacity() - 1); + buffer.position((int) (position - bufferOffset)); + } + catch (CorruptBlockException e) + { + throw new CorruptSSTableException(e, getPath()); + } + + } + + @Override + protected void reBuffer() + { + if (useMmap) + { + reBufferMmap(); + } + else + { + reBufferStandard(); + } + } + private int checksum(CompressionMetadata.Chunk chunk) throws IOException { assert channel.position() == chunk.offset + chunk.length; @@ -167,7 +308,7 @@ private int checksum(CompressionMetadata.Chunk chunk) throws IOException public int getTotalBufferSize() { - return super.getTotalBufferSize() + compressed.capacity(); + return super.getTotalBufferSize() + (useMmap ? 0 : compressed.capacity()); } @Override diff --git a/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java b/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java index 57d7cbe087e8..6139a5cab816 100644 --- a/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java +++ b/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java @@ -62,7 +62,6 @@ public class CompressionMetadata { public final long dataLength; public final long compressedFileLength; - public final boolean hasPostCompressionAdlerChecksums; private final Memory chunkOffsets; private final long chunkOffsetsSize; public final String indexFilePath; @@ -82,14 +81,13 @@ public class CompressionMetadata public static CompressionMetadata create(String dataFilePath) { Descriptor desc = Descriptor.fromFilename(dataFilePath); - return new CompressionMetadata(desc.filenameFor(Component.COMPRESSION_INFO), new File(dataFilePath).length(), desc.version.hasPostCompressionAdlerChecksums()); + return new CompressionMetadata(desc.filenameFor(Component.COMPRESSION_INFO), new File(dataFilePath).length()); } @VisibleForTesting - CompressionMetadata(String indexFilePath, long compressedLength, boolean hasPostCompressionAdlerChecksums) + CompressionMetadata(String indexFilePath, long compressedLength) { this.indexFilePath = indexFilePath; - this.hasPostCompressionAdlerChecksums = hasPostCompressionAdlerChecksums; DataInputStream stream; try @@ -137,13 +135,12 @@ public static CompressionMetadata create(String dataFilePath) this.chunkOffsetsSize = chunkOffsets.size(); } - private CompressionMetadata(String filePath, CompressionParameters parameters, RefCountedMemory offsets, long offsetsSize, long dataLength, long compressedLength, boolean hasPostCompressionAdlerChecksums) + private CompressionMetadata(String filePath, CompressionParameters parameters, RefCountedMemory offsets, long offsetsSize, long dataLength, long compressedLength) { this.indexFilePath = filePath; this.parameters = parameters; this.dataLength = dataLength; this.compressedFileLength = compressedLength; - this.hasPostCompressionAdlerChecksums = hasPostCompressionAdlerChecksums; this.chunkOffsets = offsets; offsets.reference(); this.chunkOffsetsSize = offsetsSize; @@ -342,7 +339,7 @@ public CompressionMetadata open(long dataLength, long compressedLength, SSTableW default: throw new AssertionError(); } - return new CompressionMetadata(filePath, parameters, offsets, count * 8L, dataLength, compressedLength, latestVersion.hasPostCompressionAdlerChecksums()); + return new CompressionMetadata(filePath, parameters, offsets, count * 8L, dataLength, compressedLength); } /** diff --git a/src/java/org/apache/cassandra/io/compress/DeflateCompressor.java b/src/java/org/apache/cassandra/io/compress/DeflateCompressor.java index 125a08f2e7f0..546b506304ad 100644 --- a/src/java/org/apache/cassandra/io/compress/DeflateCompressor.java +++ b/src/java/org/apache/cassandra/io/compress/DeflateCompressor.java @@ -17,7 +17,10 @@ */ package org.apache.cassandra.io.compress; +import org.apache.cassandra.utils.ByteBufferUtil; + import java.io.IOException; +import java.nio.ByteBuffer; import java.util.Collections; import java.util.Map; import java.util.Set; @@ -113,4 +116,18 @@ public int uncompress(byte[] input, int inputOffset, int inputLength, byte[] out throw new IOException(e); } } + + public int uncompress(ByteBuffer input_, ByteBuffer output) throws IOException + { + if (!output.hasArray()) + throw new IllegalArgumentException("DeflateCompressor doesn't work with direct byte buffers"); + + byte[] input = ByteBufferUtil.getArray(input_); + return uncompress(input, 0, input.length, output.array(), output.arrayOffset() + output.position()); + } + + public boolean useDirectOutputByteBuffers() + { + return false; + } } diff --git a/src/java/org/apache/cassandra/io/compress/ICompressor.java b/src/java/org/apache/cassandra/io/compress/ICompressor.java index be76bc551cb9..81d1425d6fba 100644 --- a/src/java/org/apache/cassandra/io/compress/ICompressor.java +++ b/src/java/org/apache/cassandra/io/compress/ICompressor.java @@ -18,6 +18,7 @@ package org.apache.cassandra.io.compress; import java.io.IOException; +import java.nio.ByteBuffer; import java.util.Set; public interface ICompressor @@ -28,6 +29,17 @@ public interface ICompressor public int uncompress(byte[] input, int inputOffset, int inputLength, byte[] output, int outputOffset) throws IOException; + /** + * Decompression for DirectByteBuffers + */ + public int uncompress(ByteBuffer input, ByteBuffer output) throws IOException; + + /** + * Notifies user if this compressor will wants/requires a direct byte buffers to + * decompress direct byteBuffers + */ + public boolean useDirectOutputByteBuffers(); + public Set supportedOptions(); /** diff --git a/src/java/org/apache/cassandra/io/compress/LZ4Compressor.java b/src/java/org/apache/cassandra/io/compress/LZ4Compressor.java index 0cf36c11ba53..f458cb6e32e5 100644 --- a/src/java/org/apache/cassandra/io/compress/LZ4Compressor.java +++ b/src/java/org/apache/cassandra/io/compress/LZ4Compressor.java @@ -18,6 +18,7 @@ package org.apache.cassandra.io.compress; import java.io.IOException; +import java.nio.ByteBuffer; import java.util.Arrays; import java.util.HashSet; import java.util.Map; @@ -25,10 +26,10 @@ import net.jpountz.lz4.LZ4Exception; import net.jpountz.lz4.LZ4Factory; +import org.apache.cassandra.utils.FastByteOperations; public class LZ4Compressor implements ICompressor { - private static final int INTEGER_BYTES = 4; private static final LZ4Compressor instance = new LZ4Compressor(); @@ -38,13 +39,13 @@ public static LZ4Compressor create(Map args) } private final net.jpountz.lz4.LZ4Compressor compressor; - private final net.jpountz.lz4.LZ4Decompressor decompressor; + private final net.jpountz.lz4.LZ4FastDecompressor decompressor; private LZ4Compressor() { final LZ4Factory lz4Factory = LZ4Factory.fastestInstance(); compressor = lz4Factory.fastCompressor(); - decompressor = lz4Factory.decompressor(); + decompressor = lz4Factory.fastDecompressor(); } public int initialCompressedBufferLength(int chunkLength) @@ -97,8 +98,42 @@ public int uncompress(byte[] input, int inputOffset, int inputLength, byte[] out return decompressedLength; } + public int uncompress(ByteBuffer input, ByteBuffer output) throws IOException + { + int pos = input.position(); + final int decompressedLength = (input.get(pos) & 0xFF) + | ((input.get(pos + 1) & 0xFF) << 8) + | ((input.get(pos + 2) & 0xFF) << 16) + | ((input.get(pos + 3) & 0xFF) << 24); + + int inputLength = input.remaining() - INTEGER_BYTES; + + final int compressedLength; + try + { + compressedLength = decompressor.decompress(input, input.position() + INTEGER_BYTES, output, output.position(), decompressedLength); + } + catch (LZ4Exception e) + { + throw new IOException(e); + } + + if (compressedLength != inputLength) + { + throw new IOException("Compressed lengths mismatch: "+compressedLength+" vs "+inputLength); + } + + return decompressedLength; + } + + @Override + public boolean useDirectOutputByteBuffers() + { + return false; + } + public Set supportedOptions() { - return new HashSet(Arrays.asList(CompressionParameters.CRC_CHECK_CHANCE)); + return new HashSet<>(Arrays.asList(CompressionParameters.CRC_CHECK_CHANCE)); } } diff --git a/src/java/org/apache/cassandra/io/compress/SnappyCompressor.java b/src/java/org/apache/cassandra/io/compress/SnappyCompressor.java index 3583201c280a..f5a2062c7606 100644 --- a/src/java/org/apache/cassandra/io/compress/SnappyCompressor.java +++ b/src/java/org/apache/cassandra/io/compress/SnappyCompressor.java @@ -18,10 +18,12 @@ package org.apache.cassandra.io.compress; import java.io.IOException; +import java.nio.ByteBuffer; import java.util.Collections; import java.util.Map; import java.util.Set; +import org.apache.cassandra.utils.ByteBufferUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xerial.snappy.Snappy; @@ -95,4 +97,15 @@ public int uncompress(byte[] input, int inputOffset, int inputLength, byte[] out { return Snappy.rawUncompress(input, inputOffset, inputLength, output, outputOffset); } + + public int uncompress(ByteBuffer input, ByteBuffer output) throws IOException + { + return Snappy.uncompress(input, output); + } + + @Override + public boolean useDirectOutputByteBuffers() + { + return true; + } } diff --git a/src/java/org/apache/cassandra/io/sstable/format/Version.java b/src/java/org/apache/cassandra/io/sstable/format/Version.java index 5da0cb835a24..faaa89e2106f 100644 --- a/src/java/org/apache/cassandra/io/sstable/format/Version.java +++ b/src/java/org/apache/cassandra/io/sstable/format/Version.java @@ -40,8 +40,6 @@ protected Version(SSTableFormat format, String version) public abstract boolean isLatestVersion(); - public abstract boolean hasPostCompressionAdlerChecksums(); - public abstract boolean hasSamplingLevel(); public abstract boolean hasNewStatsFile(); diff --git a/src/java/org/apache/cassandra/io/sstable/format/big/BigFormat.java b/src/java/org/apache/cassandra/io/sstable/format/big/BigFormat.java index eb43968cef98..e1a5622422d2 100644 --- a/src/java/org/apache/cassandra/io/sstable/format/big/BigFormat.java +++ b/src/java/org/apache/cassandra/io/sstable/format/big/BigFormat.java @@ -126,16 +126,8 @@ public SSTableReader open(Descriptor descriptor, Set components, CFMe static class BigVersion extends Version { public static final String current_version = "la"; - public static final String earliest_supported_version = "ja"; - - // ja (2.0.0): super columns are serialized as composites (note that there is no real format change, - // this is mostly a marker to know if we should expect super columns or not. We do need - // a major version bump however, because we should not allow streaming of super columns - // into this new format) - // tracks max local deletiontime in sstable metadata - // records bloom_filter_fp_chance in metadata component - // remove data size and column count from data file (CASSANDRA-4180) - // tracks max/min column values (according to comparator) + public static final String earliest_supported_version = "jb"; + // jb (2.0.1): switch from crc32 to adler32 for compression checksums // checksum the compressed data // ka (2.1.0): new Statistics.db file format @@ -145,7 +137,6 @@ static class BigVersion extends Version // la (3.0.0): new file name format private final boolean isLatestVersion; - private final boolean hasPostCompressionAdlerChecksums; private final boolean hasSamplingLevel; private final boolean newStatsFile; private final boolean hasAllAdlerChecksums; @@ -158,7 +149,6 @@ public BigVersion(String version) super(instance,version); isLatestVersion = version.compareTo(current_version) == 0; - hasPostCompressionAdlerChecksums = version.compareTo("jb") >= 0; hasSamplingLevel = version.compareTo("ka") >= 0; newStatsFile = version.compareTo("ka") >= 0; hasAllAdlerChecksums = version.compareTo("ka") >= 0; @@ -173,12 +163,6 @@ public boolean isLatestVersion() return isLatestVersion; } - @Override - public boolean hasPostCompressionAdlerChecksums() - { - return hasPostCompressionAdlerChecksums; - } - @Override public boolean hasSamplingLevel() { diff --git a/src/java/org/apache/cassandra/io/util/FileUtils.java b/src/java/org/apache/cassandra/io/util/FileUtils.java index 080caa557c19..837cc6a53b3d 100644 --- a/src/java/org/apache/cassandra/io/util/FileUtils.java +++ b/src/java/org/apache/cassandra/io/util/FileUtils.java @@ -278,9 +278,10 @@ public static boolean isCleanerAvailable() return canCleanDirectBuffers; } - public static void clean(MappedByteBuffer buffer) + public static void clean(ByteBuffer buffer) { - ((DirectBuffer) buffer).cleaner().clean(); + if (isCleanerAvailable() && buffer.isDirect()) + ((DirectBuffer)buffer).cleaner().clean(); } public static void createDirectory(String directory) diff --git a/src/java/org/apache/cassandra/io/util/MmappedSegmentedFile.java b/src/java/org/apache/cassandra/io/util/MmappedSegmentedFile.java index bf120a34767b..6f2def0a4668 100644 --- a/src/java/org/apache/cassandra/io/util/MmappedSegmentedFile.java +++ b/src/java/org/apache/cassandra/io/util/MmappedSegmentedFile.java @@ -30,6 +30,7 @@ import org.apache.cassandra.io.FSReadError; import org.apache.cassandra.io.sstable.format.SSTableWriter; import org.apache.cassandra.utils.JVMStabilityInspector; +import sun.nio.ch.DirectBuffer; public class MmappedSegmentedFile extends SegmentedFile { diff --git a/src/java/org/apache/cassandra/io/util/RandomAccessReader.java b/src/java/org/apache/cassandra/io/util/RandomAccessReader.java index 58205d827c6e..6bff3784c2be 100644 --- a/src/java/org/apache/cassandra/io/util/RandomAccessReader.java +++ b/src/java/org/apache/cassandra/io/util/RandomAccessReader.java @@ -52,6 +52,11 @@ public class RandomAccessReader extends AbstractDataInput implements FileDataInp protected final PoolingSegmentedFile owner; protected RandomAccessReader(File file, int bufferSize, PoolingSegmentedFile owner) throws FileNotFoundException + { + this(file, bufferSize, false, owner); + } + + protected RandomAccessReader(File file, int bufferSize, boolean useDirectBuffer, PoolingSegmentedFile owner) throws FileNotFoundException { this.owner = owner; @@ -79,13 +84,16 @@ protected RandomAccessReader(File file, int bufferSize, PoolingSegmentedFile own { throw new FSReadError(e, filePath); } - buffer = allocateBuffer(bufferSize); + buffer = allocateBuffer(bufferSize, useDirectBuffer); buffer.limit(0); } - protected ByteBuffer allocateBuffer(int bufferSize) + protected ByteBuffer allocateBuffer(int bufferSize, boolean useDirectBuffer) { - return ByteBuffer.allocate((int) Math.min(fileLength, bufferSize)); + int size = (int) Math.min(fileLength, bufferSize); + return useDirectBuffer + ? ByteBuffer.allocate(size) + : ByteBuffer.allocateDirect(size); } public static RandomAccessReader open(File file, PoolingSegmentedFile owner) @@ -239,6 +247,8 @@ public void close() public void deallocate() { bufferOffset += buffer.position(); + FileUtils.clean(buffer); + buffer = null; // makes sure we don't use this after it's ostensibly closed try diff --git a/src/java/org/apache/cassandra/streaming/compress/CompressedInputStream.java b/src/java/org/apache/cassandra/streaming/compress/CompressedInputStream.java index 449546fd3686..54f6edae190c 100644 --- a/src/java/org/apache/cassandra/streaming/compress/CompressedInputStream.java +++ b/src/java/org/apache/cassandra/streaming/compress/CompressedInputStream.java @@ -62,17 +62,15 @@ public class CompressedInputStream extends InputStream private static final byte[] POISON_PILL = new byte[0]; private long totalCompressedBytesRead; - private final boolean hasPostCompressionAdlerChecksums; /** * @param source Input source to read compressed data from * @param info Compression info */ - public CompressedInputStream(InputStream source, CompressionInfo info, boolean hasPostCompressionAdlerChecksums) + public CompressedInputStream(InputStream source, CompressionInfo info) { this.info = info; - this.checksum = hasPostCompressionAdlerChecksums ? new Adler32() : new CRC32(); - this.hasPostCompressionAdlerChecksums = hasPostCompressionAdlerChecksums; + this.checksum = new Adler32(); this.buffer = new byte[info.parameters.chunkLength()]; // buffer is limited to store up to 1024 chunks this.dataBuffer = new ArrayBlockingQueue(Math.min(info.chunks.length, 1024)); @@ -117,14 +115,7 @@ private void decompress(byte[] compressed) throws IOException // validate crc randomly if (info.parameters.getCrcCheckChance() > ThreadLocalRandom.current().nextDouble()) { - if (hasPostCompressionAdlerChecksums) - { - checksum.update(compressed, 0, compressed.length - checksumBytes.length); - } - else - { - checksum.update(buffer, 0, validBufferBytes); - } + checksum.update(compressed, 0, compressed.length - checksumBytes.length); System.arraycopy(compressed, compressed.length - checksumBytes.length, checksumBytes, 0, checksumBytes.length); if (Ints.fromByteArray(checksumBytes) != (int) checksum.getValue()) diff --git a/src/java/org/apache/cassandra/streaming/compress/CompressedStreamReader.java b/src/java/org/apache/cassandra/streaming/compress/CompressedStreamReader.java index 0595e0cbe2ce..46f7d4f4dd8c 100644 --- a/src/java/org/apache/cassandra/streaming/compress/CompressedStreamReader.java +++ b/src/java/org/apache/cassandra/streaming/compress/CompressedStreamReader.java @@ -76,7 +76,7 @@ public SSTableWriter read(ReadableByteChannel channel) throws IOException SSTableWriter writer = createWriter(cfs, totalSize, repairedAt, format); - CompressedInputStream cis = new CompressedInputStream(Channels.newInputStream(channel), compressionInfo, inputVersion.hasPostCompressionAdlerChecksums()); + CompressedInputStream cis = new CompressedInputStream(Channels.newInputStream(channel), compressionInfo); BytesReadTracker in = new BytesReadTracker(new DataInputStream(cis)); try { diff --git a/src/java/org/apache/cassandra/utils/FBUtilities.java b/src/java/org/apache/cassandra/utils/FBUtilities.java index 0462e5e68bcd..c9024ecbef28 100644 --- a/src/java/org/apache/cassandra/utils/FBUtilities.java +++ b/src/java/org/apache/cassandra/utils/FBUtilities.java @@ -19,6 +19,8 @@ import java.io.*; import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.math.BigInteger; import java.net.*; import java.nio.ByteBuffer; @@ -26,10 +28,12 @@ import java.security.NoSuchAlgorithmException; import java.util.*; import java.util.concurrent.*; +import java.util.zip.Adler32; import java.util.zip.Checksum; import com.google.common.base.Joiner; import com.google.common.collect.AbstractIterator; +import com.google.common.primitives.Ints; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -44,6 +48,8 @@ import org.apache.cassandra.dht.Token; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.IVersionedSerializer; +import org.apache.cassandra.io.compress.CompressedRandomAccessReader; +import org.apache.cassandra.io.compress.CompressionParameters; import org.apache.cassandra.io.util.DataOutputBuffer; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.io.util.IAllocator; @@ -634,6 +640,67 @@ public static void updateChecksumInt(Checksum checksum, int v) checksum.update((v >>> 0) & 0xFF); } + private static Method directUpdate; + static + { + try + { + directUpdate = Adler32.class.getDeclaredMethod("update", new Class[]{ByteBuffer.class}); + directUpdate.setAccessible(true); + } catch (NoSuchMethodException e) + { + logger.warn("JVM doesn't support Adler32 byte buffer access"); + directUpdate = null; + } + } + + private static final ThreadLocal localDigestBuffer = new ThreadLocal() + { + @Override + protected byte[] initialValue() + { + return new byte[CompressionParameters.DEFAULT_CHUNK_LENGTH]; + } + }; + + //Java 7 has this method but it's private till Java 8. Thanks JDK! + public static boolean supportsDirectChecksum() + { + return directUpdate != null; + } + + public static void directCheckSum(Adler32 checksum, ByteBuffer bb) + { + if (directUpdate != null) + { + try + { + directUpdate.invoke(checksum, bb); + return; + } catch (IllegalAccessException e) + { + directUpdate = null; + logger.warn("JVM doesn't support Adler32 byte buffer access"); + } + catch (InvocationTargetException e) + { + throw new RuntimeException(e); + } + } + + //Fallback + byte[] buffer = localDigestBuffer.get(); + + int remaining; + while ((remaining = bb.remaining()) > 0) + { + remaining = Math.min(remaining, buffer.length); + ByteBufferUtil.arrayCopy(bb, bb.position(), buffer, 0, remaining); + bb.position(bb.position() + remaining); + checksum.update(buffer, 0, remaining); + } + } + public static long abs(long index) { long negbit = index >> 63; diff --git a/test/unit/org/apache/cassandra/io/compress/CompressedRandomAccessReaderTest.java b/test/unit/org/apache/cassandra/io/compress/CompressedRandomAccessReaderTest.java index 900abd825052..58bf5cb93788 100644 --- a/test/unit/org/apache/cassandra/io/compress/CompressedRandomAccessReaderTest.java +++ b/test/unit/org/apache/cassandra/io/compress/CompressedRandomAccessReaderTest.java @@ -80,7 +80,7 @@ public void test6791() throws IOException, ConfigurationException writer.write("x".getBytes()); writer.close(); - CompressedRandomAccessReader reader = CompressedRandomAccessReader.open(filename, new CompressionMetadata(filename + ".metadata", f.length(), true)); + CompressedRandomAccessReader reader = CompressedRandomAccessReader.open(filename, new CompressionMetadata(filename + ".metadata", f.length())); String res = reader.readLine(); assertEquals(res, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); assertEquals(40, res.length()); @@ -123,7 +123,7 @@ private void testResetAndTruncate(File f, boolean compressed, int junkSize) thro assert f.exists(); RandomAccessReader reader = compressed - ? CompressedRandomAccessReader.open(filename, new CompressionMetadata(filename + ".metadata", f.length(), true)) + ? CompressedRandomAccessReader.open(filename, new CompressionMetadata(filename + ".metadata", f.length())) : RandomAccessReader.open(f); String expected = "The quick brown fox jumps over the lazy dog"; assertEquals(expected.length(), reader.length()); @@ -160,7 +160,7 @@ public void testDataCorruptionDetection() throws IOException writer.close(); // open compression metadata and get chunk information - CompressionMetadata meta = new CompressionMetadata(metadata.getPath(), file.length(), true); + CompressionMetadata meta = new CompressionMetadata(metadata.getPath(), file.length()); CompressionMetadata.Chunk chunk = meta.chunkFor(0); RandomAccessReader reader = CompressedRandomAccessReader.open(file.getPath(), meta); diff --git a/test/unit/org/apache/cassandra/io/compress/LZ4CompressorTest.java b/test/unit/org/apache/cassandra/io/compress/CompressorTest.java similarity index 55% rename from test/unit/org/apache/cassandra/io/compress/LZ4CompressorTest.java rename to test/unit/org/apache/cassandra/io/compress/CompressorTest.java index 56ffdf1135fa..04396e054244 100644 --- a/test/unit/org/apache/cassandra/io/compress/LZ4CompressorTest.java +++ b/test/unit/org/apache/cassandra/io/compress/CompressorTest.java @@ -17,30 +17,48 @@ */ package org.apache.cassandra.io.compress; -import java.io.IOException; -import java.io.UnsupportedEncodingException; +import java.io.*; +import java.nio.ByteBuffer; +import java.nio.MappedByteBuffer; import java.util.Arrays; import java.util.Collections; import java.util.Random; +import com.google.common.io.Files; import org.apache.cassandra.io.compress.ICompressor.WrappedArray; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.*; -public class LZ4CompressorTest +public class CompressorTest { + ICompressor compressor; - LZ4Compressor compressor; + ICompressor[] compressors = new ICompressor[] { + LZ4Compressor.create(Collections.emptyMap()), + DeflateCompressor.create(Collections.emptyMap()), + SnappyCompressor.create(Collections.emptyMap()) + }; - @Before - public void setUp() + + @Test + public void testAllCompressors() throws IOException { - compressor = LZ4Compressor.create(Collections.emptyMap()); + for (ICompressor compressor : compressors) + { + this.compressor = compressor; + + testEmptyArray(); + testLongArray(); + testShortArray(); + testMappedFile(); + } } + public void test(byte[] data, int off, int len) throws IOException { final int outOffset = 3; @@ -61,19 +79,16 @@ public void test(byte[] data) throws IOException test(data, 0, data.length); } - @Test public void testEmptyArray() throws IOException { test(new byte[0]); } - @Test public void testShortArray() throws UnsupportedEncodingException, IOException { test("Cassandra".getBytes("UTF-8"), 1, 7); } - @Test public void testLongArray() throws UnsupportedEncodingException, IOException { byte[] data = new byte[1 << 20]; @@ -81,4 +96,38 @@ public void testLongArray() throws UnsupportedEncodingException, IOException new Random(0).nextBytes(data); test(data, 13, 1 << 19); } + + public void testMappedFile() throws IOException + { + byte[] data = new byte[1 << 20]; + new Random().nextBytes(data); + + //create a temp file + File temp = File.createTempFile("tempfile", ".tmp"); + temp.deleteOnExit(); + + //Prepend some random bytes to the output and compress + final int outOffset = 3; + final WrappedArray out = new WrappedArray(new byte[outOffset + compressor.initialCompressedBufferLength(data.length)]); + new Random().nextBytes(out.buffer); + final int compressedLength = compressor.compress(data, 0, data.length, out, outOffset); + Files.write(out.buffer, temp); + + MappedByteBuffer mappedData = Files.map(temp); + mappedData.position(outOffset); + mappedData.limit(compressedLength+outOffset); + + + ByteBuffer result = compressor.useDirectOutputByteBuffers() + ? ByteBuffer.allocateDirect(data.length + 100) + : ByteBuffer.allocate(data.length + 100); + + int length = compressor.uncompress(mappedData, result); + + Assert.assertEquals(data.length, length); + for (int i = 0; i < length; i++) + { + Assert.assertEquals("Decompression mismatch at byte "+i, data[i], result.get()); + } + } } diff --git a/test/unit/org/apache/cassandra/streaming/compress/CompressedInputStreamTest.java b/test/unit/org/apache/cassandra/streaming/compress/CompressedInputStreamTest.java index 42a83a08356c..128ec3cbb380 100644 --- a/test/unit/org/apache/cassandra/streaming/compress/CompressedInputStreamTest.java +++ b/test/unit/org/apache/cassandra/streaming/compress/CompressedInputStreamTest.java @@ -111,7 +111,7 @@ private void testCompressedReadWith(long[] valuesToCheck, boolean testTruncate) // read buffer using CompressedInputStream CompressionInfo info = new CompressionInfo(chunks, param); - CompressedInputStream input = new CompressedInputStream(new ByteArrayInputStream(toRead), info, true); + CompressedInputStream input = new CompressedInputStream(new ByteArrayInputStream(toRead), info); DataInputStream in = new DataInputStream(input); for (int i = 0; i < sections.size(); i++) From 17624248efc316de125d1bc3c6be4f0cb4e174a2 Mon Sep 17 00:00:00 2001 From: Robert Stupp Date: Mon, 19 Jan 2015 09:22:51 +0100 Subject: [PATCH 240/557] Make CassandraException unchecked, extend RuntimeException Patch by Robert Stupp, reviewed by Sylvain Lebresne for CASSANDRA-8560 --- CHANGES.txt | 1 + .../cassandra/auth/CassandraAuthorizer.java | 17 +- .../cassandra/auth/PasswordAuthenticator.java | 25 +-- .../apache/cassandra/client/RingCache.java | 2 +- .../apache/cassandra/config/CFMetaData.java | 28 +-- .../apache/cassandra/cql3/QueryProcessor.java | 117 ++++-------- .../org/apache/cassandra/cql3/TypeCast.java | 21 +-- .../cassandra/cql3/UntypedResultSet.java | 16 +- .../cql3/statements/CreateTableStatement.java | 19 +- .../statements/SchemaAlteringStatement.java | 17 +- .../cql3/statements/TruncateStatement.java | 10 +- .../db/index/SecondaryIndexManager.java | 11 +- .../db/marshal/DynamicCompositeType.java | 22 +-- .../exceptions/CassandraException.java | 2 +- .../apache/cassandra/hadoop/ConfigHelper.java | 24 +-- .../hadoop/pig/AbstractCassandraStorage.java | 4 - .../io/compress/CompressionParameters.java | 9 +- .../locator/AbstractReplicationStrategy.java | 24 +-- .../cassandra/schema/LegacySchemaTables.java | 178 ++++++++---------- .../org/apache/cassandra/tracing/Tracing.java | 5 - .../org/apache/cassandra/cql3/CQLTester.java | 73 ++----- .../cql3/ThriftCompatibilityTest.java | 13 +- 22 files changed, 187 insertions(+), 451 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index f5a10eedf876..41bdba99aed9 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0 + * Make CassandraException unchecked, extend RuntimeException (CASSANDRA-8560) * Support direct buffer decompression for reads (CASSANDRA-8464) * DirectByteBuffer compatible LZ4 methods (CASSANDRA-7039) * Add role based access control (CASSANDRA-7653) diff --git a/src/java/org/apache/cassandra/auth/CassandraAuthorizer.java b/src/java/org/apache/cassandra/auth/CassandraAuthorizer.java index 6239bc4da340..1d672b348329 100644 --- a/src/java/org/apache/cassandra/auth/CassandraAuthorizer.java +++ b/src/java/org/apache/cassandra/auth/CassandraAuthorizer.java @@ -369,18 +369,11 @@ public void run() private SelectStatement prepare(String entityname, String permissionsTable) { - try - { - String query = String.format("SELECT permissions FROM %s.%s WHERE %s = ? AND resource = ?", - AuthKeyspace.NAME, - permissionsTable, - entityname); - return (SelectStatement) QueryProcessor.getStatement(query, ClientState.forInternalCalls()).statement; - } - catch (RequestValidationException e) - { - throw new AssertionError(e); - } + String query = String.format("SELECT permissions FROM %s.%s WHERE %s = ? AND resource = ?", + AuthKeyspace.NAME, + permissionsTable, + entityname); + return (SelectStatement) QueryProcessor.getStatement(query, ClientState.forInternalCalls()).statement; } /** diff --git a/src/java/org/apache/cassandra/auth/PasswordAuthenticator.java b/src/java/org/apache/cassandra/auth/PasswordAuthenticator.java index 14a6ecfe8125..2ab231625c60 100644 --- a/src/java/org/apache/cassandra/auth/PasswordAuthenticator.java +++ b/src/java/org/apache/cassandra/auth/PasswordAuthenticator.java @@ -140,18 +140,10 @@ public SaslNegotiator newSaslNegotiator() private AuthenticatedUser doAuthenticate(String username, String password, SelectStatement authenticationStatement) throws RequestExecutionException, AuthenticationException { - UntypedResultSet result; - try - { - ResultMessage.Rows rows = authenticationStatement.execute(QueryState.forInternalCalls(), - QueryOptions.forInternalCalls(consistencyForRole(username), - Lists.newArrayList(ByteBufferUtil.bytes(username)))); - result = UntypedResultSet.create(rows.result); - } - catch (RequestValidationException e) - { - throw new AssertionError(e); // not supposed to happen - } + ResultMessage.Rows rows = authenticationStatement.execute(QueryState.forInternalCalls(), + QueryOptions.forInternalCalls(consistencyForRole(username), + Lists.newArrayList(ByteBufferUtil.bytes(username)))); + UntypedResultSet result = UntypedResultSet.create(rows.result); if ((result.isEmpty() || !result.one().has(SALTED_HASH)) || !BCrypt.checkpw(password, result.one().getString(SALTED_HASH))) throw new AuthenticationException("Username and/or password are incorrect"); @@ -161,14 +153,7 @@ private AuthenticatedUser doAuthenticate(String username, String password, Selec private SelectStatement prepare(String query) { - try - { - return (SelectStatement) QueryProcessor.getStatement(query, ClientState.forInternalCalls()).statement; - } - catch (RequestValidationException e) - { - throw new AssertionError(e); - } + return (SelectStatement) QueryProcessor.getStatement(query, ClientState.forInternalCalls()).statement; } private class PlainTextSaslAuthenticator implements SaslNegotiator diff --git a/src/java/org/apache/cassandra/client/RingCache.java b/src/java/org/apache/cassandra/client/RingCache.java index 5865cd01f111..1a9ff0b4f75d 100644 --- a/src/java/org/apache/cassandra/client/RingCache.java +++ b/src/java/org/apache/cassandra/client/RingCache.java @@ -88,7 +88,7 @@ public void refreshEndpointMap() } } } - catch (InvalidRequestException | IOException e) + catch (IOException e) { throw new RuntimeException(e); } diff --git a/src/java/org/apache/cassandra/config/CFMetaData.java b/src/java/org/apache/cassandra/config/CFMetaData.java index cb176f28800e..138acac0a789 100644 --- a/src/java/org/apache/cassandra/config/CFMetaData.java +++ b/src/java/org/apache/cassandra/config/CFMetaData.java @@ -291,19 +291,12 @@ public Map getTriggers() public static CFMetaData compile(String cql, String keyspace) { - try - { - CFStatement parsed = (CFStatement)QueryProcessor.parseStatement(cql); - parsed.prepareKeyspace(keyspace); - CreateTableStatement statement = (CreateTableStatement) parsed.prepare().statement; - CFMetaData cfm = newSystemMetadata(keyspace, statement.columnFamily(), "", statement.comparator); - statement.applyPropertiesTo(cfm); - return cfm.rebuild(); - } - catch (RequestValidationException e) - { - throw new RuntimeException(e); - } + CFStatement parsed = (CFStatement)QueryProcessor.parseStatement(cql); + parsed.prepareKeyspace(keyspace); + CreateTableStatement statement = (CreateTableStatement) parsed.prepare().statement; + CFMetaData cfm = newSystemMetadata(keyspace, statement.columnFamily(), "", statement.comparator); + statement.applyPropertiesTo(cfm); + return cfm.rebuild(); } /** @@ -730,14 +723,7 @@ public AbstractType getValueValidator(CellName cellName) */ public boolean reload() { - try - { - return apply(LegacySchemaTables.createTableFromName(ksName, cfName)); - } - catch (ConfigurationException e) - { - throw new RuntimeException(e); - } + return apply(LegacySchemaTables.createTableFromName(ksName, cfName)); } /** diff --git a/src/java/org/apache/cassandra/cql3/QueryProcessor.java b/src/java/org/apache/cassandra/cql3/QueryProcessor.java index f746a85c69ed..3821e995315e 100644 --- a/src/java/org/apache/cassandra/cql3/QueryProcessor.java +++ b/src/java/org/apache/cassandra/cql3/QueryProcessor.java @@ -31,6 +31,7 @@ import com.googlecode.concurrentlinkedhashmap.EvictionListener; import org.antlr.runtime.*; +import org.apache.cassandra.exceptions.CassandraException; import org.apache.cassandra.service.MigrationListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -73,7 +74,7 @@ public class QueryProcessor implements QueryHandler private static final MemoryMeter meter = new MemoryMeter().withGuessing(MemoryMeter.Guess.FALLBACK_BEST).ignoreKnownSingletons(); private static final long MAX_CACHE_PREPARED_MEMORY = Runtime.getRuntime().maxMemory() / 256; - private static EntryWeigher cqlMemoryUsageWeigher = new EntryWeigher() + private static final EntryWeigher cqlMemoryUsageWeigher = new EntryWeigher() { @Override public int weightOf(MD5Digest key, ParsedStatement.Prepared value) @@ -82,7 +83,7 @@ public int weightOf(MD5Digest key, ParsedStatement.Prepared value) } }; - private static EntryWeigher thriftMemoryUsageWeigher = new EntryWeigher() + private static final EntryWeigher thriftMemoryUsageWeigher = new EntryWeigher() { @Override public int weightOf(Integer key, ParsedStatement.Prepared value) @@ -159,14 +160,7 @@ private static enum InternalStateInstance InternalStateInstance() { ClientState state = ClientState.forInternalCalls(); - try - { - state.setKeyspace(SystemKeyspace.NAME); - } - catch (InvalidRequestException e) - { - throw new RuntimeException(); - } + state.setKeyspace(SystemKeyspace.NAME); this.queryState = new QueryState(state); } } @@ -268,18 +262,11 @@ public static ParsedStatement.Prepared parseStatement(String queryStr, QueryStat public static UntypedResultSet process(String query, ConsistencyLevel cl) throws RequestExecutionException { - try - { - ResultMessage result = instance.process(query, QueryState.forInternalCalls(), QueryOptions.forInternalCalls(cl, Collections.emptyList())); - if (result instanceof ResultMessage.Rows) - return UntypedResultSet.create(((ResultMessage.Rows)result).result); - else - return null; - } - catch (RequestValidationException e) - { - throw new RuntimeException(e); - } + ResultMessage result = instance.process(query, QueryState.forInternalCalls(), QueryOptions.forInternalCalls(cl, Collections.emptyList())); + if (result instanceof ResultMessage.Rows) + return UntypedResultSet.create(((ResultMessage.Rows)result).result); + else + return null; } private static QueryOptions makeInternalOptions(ParsedStatement.Prepared prepared, Object[] values) @@ -312,41 +299,23 @@ private static ParsedStatement.Prepared prepareInternal(String query) throws Req public static UntypedResultSet executeInternal(String query, Object... values) { - try - { - ParsedStatement.Prepared prepared = prepareInternal(query); - ResultMessage result = prepared.statement.executeInternal(internalQueryState(), makeInternalOptions(prepared, values)); - if (result instanceof ResultMessage.Rows) - return UntypedResultSet.create(((ResultMessage.Rows)result).result); - else - return null; - } - catch (RequestExecutionException e) - { - throw new RuntimeException(e); - } - catch (RequestValidationException e) - { - throw new RuntimeException("Error validating " + query, e); - } + ParsedStatement.Prepared prepared = prepareInternal(query); + ResultMessage result = prepared.statement.executeInternal(internalQueryState(), makeInternalOptions(prepared, values)); + if (result instanceof ResultMessage.Rows) + return UntypedResultSet.create(((ResultMessage.Rows)result).result); + else + return null; } public static UntypedResultSet executeInternalWithPaging(String query, int pageSize, Object... values) { - try - { - ParsedStatement.Prepared prepared = prepareInternal(query); - if (!(prepared.statement instanceof SelectStatement)) - throw new IllegalArgumentException("Only SELECTs can be paged"); + ParsedStatement.Prepared prepared = prepareInternal(query); + if (!(prepared.statement instanceof SelectStatement)) + throw new IllegalArgumentException("Only SELECTs can be paged"); - SelectStatement select = (SelectStatement)prepared.statement; - QueryPager pager = QueryPagers.localPager(select.getPageableCommand(makeInternalOptions(prepared, values))); - return UntypedResultSet.create(select, pager, pageSize); - } - catch (RequestValidationException e) - { - throw new RuntimeException("Error validating query" + e); - } + SelectStatement select = (SelectStatement)prepared.statement; + QueryPager pager = QueryPagers.localPager(select.getPageableCommand(makeInternalOptions(prepared, values))); + return UntypedResultSet.create(select, pager, pageSize); } /** @@ -355,24 +324,13 @@ public static UntypedResultSet executeInternalWithPaging(String query, int pageS */ public static UntypedResultSet executeOnceInternal(String query, Object... values) { - try - { - ParsedStatement.Prepared prepared = parseStatement(query, internalQueryState()); - prepared.statement.validate(internalQueryState().getClientState()); - ResultMessage result = prepared.statement.executeInternal(internalQueryState(), makeInternalOptions(prepared, values)); - if (result instanceof ResultMessage.Rows) - return UntypedResultSet.create(((ResultMessage.Rows)result).result); - else - return null; - } - catch (RequestExecutionException e) - { - throw new RuntimeException(e); - } - catch (RequestValidationException e) - { - throw new RuntimeException("Error validating query " + query, e); - } + ParsedStatement.Prepared prepared = parseStatement(query, internalQueryState()); + prepared.statement.validate(internalQueryState().getClientState()); + ResultMessage result = prepared.statement.executeInternal(internalQueryState(), makeInternalOptions(prepared, values)); + if (result instanceof ResultMessage.Rows) + return UntypedResultSet.create(((ResultMessage.Rows)result).result); + else + return null; } public static UntypedResultSet resultify(String query, Row row) @@ -382,27 +340,18 @@ public static UntypedResultSet resultify(String query, Row row) public static UntypedResultSet resultify(String query, List rows) { - try - { - SelectStatement ss = (SelectStatement) getStatement(query, null).statement; - ResultSet cqlRows = ss.process(rows); - return UntypedResultSet.create(cqlRows); - } - catch (RequestValidationException e) - { - throw new AssertionError(e); - } + SelectStatement ss = (SelectStatement) getStatement(query, null).statement; + ResultSet cqlRows = ss.process(rows); + return UntypedResultSet.create(cqlRows); } public ResultMessage.Prepared prepare(String queryString, QueryState queryState) - throws RequestValidationException { ClientState cState = queryState.getClientState(); return prepare(queryString, cState, cState instanceof ThriftClientState); } public static ResultMessage.Prepared prepare(String queryString, ClientState clientState, boolean forThrift) - throws RequestValidationException { ResultMessage.Prepared existing = getStoredPreparedStatement(queryString, clientState.getRawKeyspace(), forThrift); if (existing != null) @@ -541,6 +490,10 @@ public static ParsedStatement parseStatement(String queryStr) throws SyntaxExcep return statement; } + catch (CassandraException ce) + { + throw ce; + } catch (RuntimeException re) { logger.error(String.format("The statement: [%s] could not be parsed.", queryStr), re); diff --git a/src/java/org/apache/cassandra/cql3/TypeCast.java b/src/java/org/apache/cassandra/cql3/TypeCast.java index 10b040e5862f..561a1585f9f2 100644 --- a/src/java/org/apache/cassandra/cql3/TypeCast.java +++ b/src/java/org/apache/cassandra/cql3/TypeCast.java @@ -49,20 +49,13 @@ private ColumnSpecification castedSpecOf(String keyspace, ColumnSpecification re public AssignmentTestable.TestResult testAssignment(String keyspace, ColumnSpecification receiver) { - try - { - AbstractType castedType = type.prepare(keyspace).getType(); - if (receiver.type.equals(castedType)) - return AssignmentTestable.TestResult.EXACT_MATCH; - else if (receiver.type.isValueCompatibleWith(castedType)) - return AssignmentTestable.TestResult.WEAKLY_ASSIGNABLE; - else - return AssignmentTestable.TestResult.NOT_ASSIGNABLE; - } - catch (InvalidRequestException e) - { - throw new AssertionError(); - } + AbstractType castedType = type.prepare(keyspace).getType(); + if (receiver.type.equals(castedType)) + return AssignmentTestable.TestResult.EXACT_MATCH; + else if (receiver.type.isValueCompatibleWith(castedType)) + return AssignmentTestable.TestResult.WEAKLY_ASSIGNABLE; + else + return AssignmentTestable.TestResult.NOT_ASSIGNABLE; } @Override diff --git a/src/java/org/apache/cassandra/cql3/UntypedResultSet.java b/src/java/org/apache/cassandra/cql3/UntypedResultSet.java index 9d5a5f19f51c..64fd60d7128d 100644 --- a/src/java/org/apache/cassandra/cql3/UntypedResultSet.java +++ b/src/java/org/apache/cassandra/cql3/UntypedResultSet.java @@ -175,17 +175,13 @@ public Iterator iterator() protected Row computeNext() { - try { - while (currentPage == null || !currentPage.hasNext()) - { - if (pager.isExhausted()) - return endOfData(); - currentPage = select.process(pager.fetchPage(pageSize)).rows.iterator(); - } - return new Row(metadata, currentPage.next()); - } catch (RequestValidationException | RequestExecutionException e) { - throw new RuntimeException(e); + while (currentPage == null || !currentPage.hasNext()) + { + if (pager.isExhausted()) + return endOfData(); + currentPage = select.process(pager.fetchPage(pageSize)).rows.iterator(); } + return new Row(metadata, currentPage.next()); } }; } diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateTableStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateTableStatement.java index c8c24743e43d..6b32c9523f90 100644 --- a/src/java/org/apache/cassandra/cql3/statements/CreateTableStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/CreateTableStatement.java @@ -65,19 +65,12 @@ public CreateTableStatement(CFName name, CFPropDefs properties, boolean ifNotExi this.ifNotExists = ifNotExists; this.staticColumns = staticColumns; - try - { - if (!this.properties.hasProperty(CFPropDefs.KW_COMPRESSION) && CFMetaData.DEFAULT_COMPRESSOR != null) - this.properties.addProperty(CFPropDefs.KW_COMPRESSION, - new HashMap() - {{ - put(CompressionParameters.SSTABLE_COMPRESSION, CFMetaData.DEFAULT_COMPRESSOR); - }}); - } - catch (SyntaxException e) - { - throw new AssertionError(e); - } + if (!this.properties.hasProperty(CFPropDefs.KW_COMPRESSION) && CFMetaData.DEFAULT_COMPRESSOR != null) + this.properties.addProperty(CFPropDefs.KW_COMPRESSION, + new HashMap() + {{ + put(CompressionParameters.SSTABLE_COMPRESSION, CFMetaData.DEFAULT_COMPRESSOR); + }}); } public void checkAccess(ClientState state) throws UnauthorizedException, InvalidRequestException diff --git a/src/java/org/apache/cassandra/cql3/statements/SchemaAlteringStatement.java b/src/java/org/apache/cassandra/cql3/statements/SchemaAlteringStatement.java index 018d24400e18..b0d67ac94749 100644 --- a/src/java/org/apache/cassandra/cql3/statements/SchemaAlteringStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/SchemaAlteringStatement.java @@ -87,18 +87,11 @@ public ResultMessage execute(QueryState state, QueryOptions options) throws Requ public ResultMessage executeInternal(QueryState state, QueryOptions options) { - try - { - boolean didChangeSchema = announceMigration(true); - if (!didChangeSchema) - return new ResultMessage.Void(); + boolean didChangeSchema = announceMigration(true); + if (!didChangeSchema) + return new ResultMessage.Void(); - Event.SchemaChange ce = changeEvent(); - return ce == null ? new ResultMessage.Void() : new ResultMessage.SchemaChange(ce); - } - catch (RequestValidationException e) - { - throw new RuntimeException(e); - } + Event.SchemaChange ce = changeEvent(); + return ce == null ? new ResultMessage.Void() : new ResultMessage.SchemaChange(ce); } } diff --git a/src/java/org/apache/cassandra/cql3/statements/TruncateStatement.java b/src/java/org/apache/cassandra/cql3/statements/TruncateStatement.java index ef1c4a4d55c1..16c531c1f2ae 100644 --- a/src/java/org/apache/cassandra/cql3/statements/TruncateStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/TruncateStatement.java @@ -62,15 +62,7 @@ public ResultMessage execute(QueryState state, QueryOptions options) throws Inva { StorageProxy.truncateBlocking(keyspace(), columnFamily()); } - catch (UnavailableException e) - { - throw new TruncateException(e); - } - catch (TimeoutException e) - { - throw new TruncateException(e); - } - catch (IOException e) + catch (UnavailableException | TimeoutException | IOException e) { throw new TruncateException(e); } diff --git a/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java b/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java index 10a7ce39b3ed..12cff792b4b2 100644 --- a/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java +++ b/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java @@ -50,7 +50,6 @@ import org.apache.cassandra.db.compaction.CompactionManager; import org.apache.cassandra.db.composites.CellName; import org.apache.cassandra.db.filter.ExtendedFilter; -import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.io.sstable.ReducingKeyIterator; import org.apache.cassandra.io.sstable.format.SSTableReader; @@ -274,15 +273,7 @@ public synchronized Future addIndexedColumn(ColumnDefinition cdef) assert cdef.getIndexType() != null; - SecondaryIndex index; - try - { - index = SecondaryIndex.createInstance(baseCfs, cdef); - } - catch (ConfigurationException e) - { - throw new RuntimeException(e); - } + SecondaryIndex index = SecondaryIndex.createInstance(baseCfs, cdef); // Keep a single instance of the index per-cf for row level indexes // since we want all columns to be under the index diff --git a/src/java/org/apache/cassandra/db/marshal/DynamicCompositeType.java b/src/java/org/apache/cassandra/db/marshal/DynamicCompositeType.java index d3b0b9007efa..c4514d720271 100644 --- a/src/java/org/apache/cassandra/db/marshal/DynamicCompositeType.java +++ b/src/java/org/apache/cassandra/db/marshal/DynamicCompositeType.java @@ -105,14 +105,6 @@ private AbstractType getComparator(ByteBuffer bb) { throw new RuntimeException(e); } - catch (ConfigurationException e) - { - throw new RuntimeException(e); - } - catch (SyntaxException e) - { - throw new RuntimeException(e); - } } protected AbstractType getComparator(int i, ByteBuffer bb) @@ -180,14 +172,6 @@ protected AbstractType getAndAppendComparator(int i, ByteBuffer bb, StringBui { throw new RuntimeException(e); } - catch (ConfigurationException e) - { - throw new RuntimeException(e); - } - catch (SyntaxException e) - { - throw new RuntimeException(e); - } } protected ParsedComparator parseComparator(int i, String part) @@ -304,11 +288,7 @@ private class DynamicParsedComparator implements ParsedComparator } type = t; } - catch (SyntaxException e) - { - throw new IllegalArgumentException(e); - } - catch (ConfigurationException e) + catch (SyntaxException | ConfigurationException e) { throw new IllegalArgumentException(e); } diff --git a/src/java/org/apache/cassandra/exceptions/CassandraException.java b/src/java/org/apache/cassandra/exceptions/CassandraException.java index aaa8055ef17f..58521df7ed09 100644 --- a/src/java/org/apache/cassandra/exceptions/CassandraException.java +++ b/src/java/org/apache/cassandra/exceptions/CassandraException.java @@ -17,7 +17,7 @@ */ package org.apache.cassandra.exceptions; -public abstract class CassandraException extends Exception implements TransportException +public abstract class CassandraException extends RuntimeException implements TransportException { private final ExceptionCode code; diff --git a/src/java/org/apache/cassandra/hadoop/ConfigHelper.java b/src/java/org/apache/cassandra/hadoop/ConfigHelper.java index 6b3c9c5c70a6..69504b109475 100644 --- a/src/java/org/apache/cassandra/hadoop/ConfigHelper.java +++ b/src/java/org/apache/cassandra/hadoop/ConfigHelper.java @@ -417,14 +417,7 @@ public static void setInputPartitioner(Configuration conf, String classname) public static IPartitioner getInputPartitioner(Configuration conf) { - try - { - return FBUtilities.newPartitioner(conf.get(INPUT_PARTITIONER_CONFIG)); - } - catch (ConfigurationException e) - { - throw new RuntimeException(e); - } + return FBUtilities.newPartitioner(conf.get(INPUT_PARTITIONER_CONFIG)); } public static int getOutputRpcPort(Configuration conf) @@ -454,14 +447,7 @@ public static void setOutputPartitioner(Configuration conf, String classname) public static IPartitioner getOutputPartitioner(Configuration conf) { - try - { - return FBUtilities.newPartitioner(conf.get(OUTPUT_PARTITIONER_CONFIG)); - } - catch (ConfigurationException e) - { - throw new RuntimeException(e); - } + return FBUtilities.newPartitioner(conf.get(OUTPUT_PARTITIONER_CONFIG)); } public static String getOutputCompressionClass(Configuration conf) @@ -507,11 +493,7 @@ public static CompressionParameters getOutputCompressionParamaters(Configuration options.put(CompressionParameters.SSTABLE_COMPRESSION, getOutputCompressionClass(conf)); options.put(CompressionParameters.CHUNK_LENGTH_KB, getOutputCompressionChunkLength(conf)); - try { - return CompressionParameters.create(options); - } catch (ConfigurationException e) { - throw new RuntimeException(e); - } + return CompressionParameters.create(options); } public static boolean getOutputLocalDCOnly(Configuration conf) diff --git a/src/java/org/apache/cassandra/hadoop/pig/AbstractCassandraStorage.java b/src/java/org/apache/cassandra/hadoop/pig/AbstractCassandraStorage.java index 447c8cea007c..45f16f2113b6 100644 --- a/src/java/org/apache/cassandra/hadoop/pig/AbstractCassandraStorage.java +++ b/src/java/org/apache/cassandra/hadoop/pig/AbstractCassandraStorage.java @@ -516,10 +516,6 @@ protected void initSchema(String signature) throws IOException logger.error("Authentication exception: invalid username and/or password"); throw new IOException(e); } - catch (AuthorizationException e) - { - throw new AssertionError(e); // never actually throws AuthorizationException. - } } // compose the CfDef for the columfamily diff --git a/src/java/org/apache/cassandra/io/compress/CompressionParameters.java b/src/java/org/apache/cassandra/io/compress/CompressionParameters.java index 0bc29169ad3a..88ca396637ea 100644 --- a/src/java/org/apache/cassandra/io/compress/CompressionParameters.java +++ b/src/java/org/apache/cassandra/io/compress/CompressionParameters.java @@ -93,14 +93,7 @@ public CompressionParameters(ICompressor sstableCompressor, Integer chunkLength, public CompressionParameters copy() { - try - { - return new CompressionParameters(sstableCompressor, chunkLength, new HashMap<>(otherOptions)); - } - catch (ConfigurationException e) - { - throw new AssertionError(e); // can't happen at this point. - } + return new CompressionParameters(sstableCompressor, chunkLength, new HashMap<>(otherOptions)); } public void setLiveMetadata(final CFMetaData liveMetadata) diff --git a/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java b/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java index 754a96b1ffd2..059f21a623df 100644 --- a/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java +++ b/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java @@ -251,28 +251,20 @@ public static AbstractReplicationStrategy createReplicationStrategy(String keysp IEndpointSnitch snitch, Map strategyOptions) { + AbstractReplicationStrategy strategy = createInternal(keyspaceName, strategyClass, tokenMetadata, snitch, strategyOptions); + + // Because we used to not properly validate unrecognized options, we only log a warning if we find one. try { - AbstractReplicationStrategy strategy = createInternal(keyspaceName, strategyClass, tokenMetadata, snitch, strategyOptions); - - // Because we used to not properly validate unrecognized options, we only log a warning if we find one. - try - { - strategy.validateExpectedOptions(); - } - catch (ConfigurationException e) - { - logger.warn("Ignoring {}", e.getMessage()); - } - - strategy.validateOptions(); - return strategy; + strategy.validateExpectedOptions(); } catch (ConfigurationException e) { - // If that happens at this point, there is nothing we can do about it. - throw new RuntimeException(e); + logger.warn("Ignoring {}", e.getMessage()); } + + strategy.validateOptions(); + return strategy; } public static void validateReplicationStrategy(String keyspaceName, diff --git a/src/java/org/apache/cassandra/schema/LegacySchemaTables.java b/src/java/org/apache/cassandra/schema/LegacySchemaTables.java index 4d068631406e..51040a176de7 100644 --- a/src/java/org/apache/cassandra/schema/LegacySchemaTables.java +++ b/src/java/org/apache/cassandra/schema/LegacySchemaTables.java @@ -47,7 +47,6 @@ import org.apache.cassandra.dht.Token; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.InvalidRequestException; -import org.apache.cassandra.exceptions.SyntaxException; import org.apache.cassandra.io.compress.CompressionParameters; import org.apache.cassandra.locator.AbstractReplicationStrategy; import org.apache.cassandra.service.StorageService; @@ -752,17 +751,10 @@ private static KSMetaData createKeyspaceFromSchemaPartition(Row partition) { String query = String.format("SELECT * FROM %s.%s", SystemKeyspace.NAME, KEYSPACES); UntypedResultSet.Row row = QueryProcessor.resultify(query, partition).one(); - try - { - return new KSMetaData(row.getString("keyspace_name"), - AbstractReplicationStrategy.getClass(row.getString("strategy_class")), - fromJsonMap(row.getString("strategy_options")), - row.getBoolean("durable_writes")); - } - catch (ConfigurationException e) - { - throw new RuntimeException(e); - } + return new KSMetaData(row.getString("keyspace_name"), + AbstractReplicationStrategy.getClass(row.getString("strategy_class")), + fromJsonMap(row.getString("strategy_options")), + row.getBoolean("durable_writes")); } /* @@ -1040,15 +1032,8 @@ private static CFMetaData createTableFromTableRow(UntypedResultSet.Row result) CFMetaData cfm = createTableFromTableRowAndColumnsPartition(result, serializedColumns); Row serializedTriggers = readSchemaPartitionForTable(TRIGGERS, ksName, cfName); - try - { - for (TriggerDefinition trigger : createTriggersFromTriggersPartition(serializedTriggers)) - cfm.addTriggerDefinition(trigger); - } - catch (InvalidRequestException e) - { - throw new RuntimeException(e); - } + for (TriggerDefinition trigger : createTriggersFromTriggersPartition(serializedTriggers)) + cfm.addTriggerDefinition(trigger); return cfm; } @@ -1056,80 +1041,73 @@ private static CFMetaData createTableFromTableRow(UntypedResultSet.Row result) public static CFMetaData createTableFromTableRowAndColumnRows(UntypedResultSet.Row result, UntypedResultSet serializedColumnDefinitions) { - try - { - String ksName = result.getString("keyspace_name"); - String cfName = result.getString("columnfamily_name"); - - AbstractType rawComparator = TypeParser.parse(result.getString("comparator")); - AbstractType subComparator = result.has("subcomparator") ? TypeParser.parse(result.getString("subcomparator")) : null; - ColumnFamilyType cfType = ColumnFamilyType.valueOf(result.getString("type")); - - AbstractType fullRawComparator = CFMetaData.makeRawAbstractType(rawComparator, subComparator); - - List columnDefs = createColumnsFromColumnRows(serializedColumnDefinitions, - ksName, - cfName, - fullRawComparator, - cfType == ColumnFamilyType.Super); - - boolean isDense = result.has("is_dense") - ? result.getBoolean("is_dense") - : CFMetaData.calculateIsDense(fullRawComparator, columnDefs); - - CellNameType comparator = CellNames.fromAbstractType(fullRawComparator, isDense); - - // if we are upgrading, we use id generated from names initially - UUID cfId = result.has("cf_id") - ? result.getUUID("cf_id") - : CFMetaData.generateLegacyCfId(ksName, cfName); - - CFMetaData cfm = new CFMetaData(ksName, cfName, cfType, comparator, cfId); - cfm.isDense(isDense); - - cfm.readRepairChance(result.getDouble("read_repair_chance")); - cfm.dcLocalReadRepairChance(result.getDouble("local_read_repair_chance")); - cfm.gcGraceSeconds(result.getInt("gc_grace_seconds")); - cfm.defaultValidator(TypeParser.parse(result.getString("default_validator"))); - cfm.keyValidator(TypeParser.parse(result.getString("key_validator"))); - cfm.minCompactionThreshold(result.getInt("min_compaction_threshold")); - cfm.maxCompactionThreshold(result.getInt("max_compaction_threshold")); - if (result.has("comment")) - cfm.comment(result.getString("comment")); - if (result.has("memtable_flush_period_in_ms")) - cfm.memtableFlushPeriod(result.getInt("memtable_flush_period_in_ms")); - cfm.caching(CachingOptions.fromString(result.getString("caching"))); - if (result.has("default_time_to_live")) - cfm.defaultTimeToLive(result.getInt("default_time_to_live")); - if (result.has("speculative_retry")) - cfm.speculativeRetry(CFMetaData.SpeculativeRetry.fromString(result.getString("speculative_retry"))); - cfm.compactionStrategyClass(CFMetaData.createCompactionStrategy(result.getString("compaction_strategy_class"))); - cfm.compressionParameters(CompressionParameters.create(fromJsonMap(result.getString("compression_parameters")))); - cfm.compactionStrategyOptions(fromJsonMap(result.getString("compaction_strategy_options"))); - - if (result.has("min_index_interval")) - cfm.minIndexInterval(result.getInt("min_index_interval")); - - if (result.has("max_index_interval")) - cfm.maxIndexInterval(result.getInt("max_index_interval")); - - if (result.has("bloom_filter_fp_chance")) - cfm.bloomFilterFpChance(result.getDouble("bloom_filter_fp_chance")); - else - cfm.bloomFilterFpChance(cfm.getBloomFilterFpChance()); - - if (result.has("dropped_columns")) - cfm.droppedColumns(convertDroppedColumns(result.getMap("dropped_columns", UTF8Type.instance, LongType.instance))); - - for (ColumnDefinition cd : columnDefs) - cfm.addOrReplaceColumnDefinition(cd); - - return cfm.rebuild(); - } - catch (SyntaxException | ConfigurationException e) - { - throw new RuntimeException(e); - } + String ksName = result.getString("keyspace_name"); + String cfName = result.getString("columnfamily_name"); + + AbstractType rawComparator = TypeParser.parse(result.getString("comparator")); + AbstractType subComparator = result.has("subcomparator") ? TypeParser.parse(result.getString("subcomparator")) : null; + ColumnFamilyType cfType = ColumnFamilyType.valueOf(result.getString("type")); + + AbstractType fullRawComparator = CFMetaData.makeRawAbstractType(rawComparator, subComparator); + + List columnDefs = createColumnsFromColumnRows(serializedColumnDefinitions, + ksName, + cfName, + fullRawComparator, + cfType == ColumnFamilyType.Super); + + boolean isDense = result.has("is_dense") + ? result.getBoolean("is_dense") + : CFMetaData.calculateIsDense(fullRawComparator, columnDefs); + + CellNameType comparator = CellNames.fromAbstractType(fullRawComparator, isDense); + + // if we are upgrading, we use id generated from names initially + UUID cfId = result.has("cf_id") + ? result.getUUID("cf_id") + : CFMetaData.generateLegacyCfId(ksName, cfName); + + CFMetaData cfm = new CFMetaData(ksName, cfName, cfType, comparator, cfId); + cfm.isDense(isDense); + + cfm.readRepairChance(result.getDouble("read_repair_chance")); + cfm.dcLocalReadRepairChance(result.getDouble("local_read_repair_chance")); + cfm.gcGraceSeconds(result.getInt("gc_grace_seconds")); + cfm.defaultValidator(TypeParser.parse(result.getString("default_validator"))); + cfm.keyValidator(TypeParser.parse(result.getString("key_validator"))); + cfm.minCompactionThreshold(result.getInt("min_compaction_threshold")); + cfm.maxCompactionThreshold(result.getInt("max_compaction_threshold")); + if (result.has("comment")) + cfm.comment(result.getString("comment")); + if (result.has("memtable_flush_period_in_ms")) + cfm.memtableFlushPeriod(result.getInt("memtable_flush_period_in_ms")); + cfm.caching(CachingOptions.fromString(result.getString("caching"))); + if (result.has("default_time_to_live")) + cfm.defaultTimeToLive(result.getInt("default_time_to_live")); + if (result.has("speculative_retry")) + cfm.speculativeRetry(CFMetaData.SpeculativeRetry.fromString(result.getString("speculative_retry"))); + cfm.compactionStrategyClass(CFMetaData.createCompactionStrategy(result.getString("compaction_strategy_class"))); + cfm.compressionParameters(CompressionParameters.create(fromJsonMap(result.getString("compression_parameters")))); + cfm.compactionStrategyOptions(fromJsonMap(result.getString("compaction_strategy_options"))); + + if (result.has("min_index_interval")) + cfm.minIndexInterval(result.getInt("min_index_interval")); + + if (result.has("max_index_interval")) + cfm.maxIndexInterval(result.getInt("max_index_interval")); + + if (result.has("bloom_filter_fp_chance")) + cfm.bloomFilterFpChance(result.getDouble("bloom_filter_fp_chance")); + else + cfm.bloomFilterFpChance(cfm.getBloomFilterFpChance()); + + if (result.has("dropped_columns")) + cfm.droppedColumns(convertDroppedColumns(result.getMap("dropped_columns", UTF8Type.instance, LongType.instance))); + + for (ColumnDefinition cd : columnDefs) + cfm.addOrReplaceColumnDefinition(cd); + + return cfm.rebuild(); } private static Map convertDroppedColumns(Map raw) @@ -1467,15 +1445,7 @@ public static Mutation makeDropAggregateMutation(KSMetaData keyspace, UDAggregat private static AbstractType parseType(String str) { - try - { - return TypeParser.parse(str); - } - catch (SyntaxException | ConfigurationException e) - { - // We only use this when reading the schema where we shouldn't get an error - throw new RuntimeException(e); - } + return TypeParser.parse(str); } // We allow method overloads, so a function is not uniquely identified by its name only, but diff --git a/src/java/org/apache/cassandra/tracing/Tracing.java b/src/java/org/apache/cassandra/tracing/Tracing.java index d0f496e12a50..930f0248e546 100644 --- a/src/java/org/apache/cassandra/tracing/Tracing.java +++ b/src/java/org/apache/cassandra/tracing/Tracing.java @@ -308,11 +308,6 @@ static void mutateWithCatch(Mutation mutation) { StorageProxy.mutate(Arrays.asList(mutation), ConsistencyLevel.ANY); } - catch (UnavailableException | WriteTimeoutException e) - { - // should never happen; ANY does not throw UAE or WTE - throw new AssertionError(e); - } catch (OverloadedException e) { logger.warn("Too many nodes are overloaded to save trace events"); diff --git a/test/unit/org/apache/cassandra/cql3/CQLTester.java b/test/unit/org/apache/cassandra/cql3/CQLTester.java index 5611ac620c7a..b01ca9e72494 100644 --- a/test/unit/org/apache/cassandra/cql3/CQLTester.java +++ b/test/unit/org/apache/cassandra/cql3/CQLTester.java @@ -366,14 +366,7 @@ protected void createTableMayThrow(String query) throws Throwable tables.add(currentTable); String fullQuery = formatQuery(query); logger.info(fullQuery); - try - { - QueryProcessor.executeOnceInternal(fullQuery); - } - catch (RuntimeException ex) - { - throw ex.getCause(); - } + QueryProcessor.executeOnceInternal(fullQuery); } protected void alterTable(String query) @@ -387,14 +380,7 @@ protected void alterTableMayThrow(String query) throws Throwable { String fullQuery = formatQuery(query); logger.info(fullQuery); - try - { - QueryProcessor.executeOnceInternal(fullQuery); - } - catch (RuntimeException ex) - { - throw ex.getCause(); - } + QueryProcessor.executeOnceInternal(fullQuery); } protected void dropTable(String query) @@ -415,14 +401,7 @@ protected void createIndexMayThrow(String query) throws Throwable { String fullQuery = formatQuery(query); logger.info(fullQuery); - try - { - QueryProcessor.executeOnceInternal(fullQuery); - } - catch (RuntimeException ex) - { - throw ex.getCause(); - } + QueryProcessor.executeOnceInternal(fullQuery); } protected void dropIndex(String query) throws Throwable @@ -486,32 +465,23 @@ private String formatQuery(String query) protected UntypedResultSet execute(String query, Object... values) throws Throwable { - try - { - query = formatQuery(query); + query = formatQuery(query); - UntypedResultSet rs; - if (usePrepared) - { - logger.info("Executing: {} with values {}", query, formatAllValues(values)); - rs = QueryProcessor.executeOnceInternal(query, transformValues(values)); - } - else - { - query = replaceValues(query, values); - logger.info("Executing: {}", query); - rs = QueryProcessor.executeOnceInternal(query); - } - if (rs != null) - logger.info("Got {} rows", rs.size()); - return rs; + UntypedResultSet rs; + if (usePrepared) + { + logger.info("Executing: {} with values {}", query, formatAllValues(values)); + rs = QueryProcessor.executeOnceInternal(query, transformValues(values)); } - catch (RuntimeException e) + else { - Throwable cause = e.getCause() != null ? e.getCause() : e; - logger.info("Got error: {}", cause.getMessage() == null ? cause.toString() : cause.getMessage()); - throw cause; + query = replaceValues(query, values); + logger.info("Executing: {}", query); + rs = QueryProcessor.executeOnceInternal(query); } + if (rs != null) + logger.info("Got {} rows", rs.size()); + return rs; } protected void assertRowsNet(int protocolVersion, ResultSet result, Object[]... rows) @@ -660,16 +630,7 @@ protected void assertInvalidMessage(String errorMessage, String query, Object... { try { - try - { - execute(query, values); - } - catch (RuntimeException e) - { - Throwable cause = e.getCause(); - if (cause instanceof InvalidRequestException) - throw cause; - } + execute(query, values); String q = USE_PREPARED_VALUES ? query + " (values: " + formatAllValues(values) + ")" : replaceValues(query, values); diff --git a/test/unit/org/apache/cassandra/cql3/ThriftCompatibilityTest.java b/test/unit/org/apache/cassandra/cql3/ThriftCompatibilityTest.java index 88ee6881bff9..3125b28fffba 100644 --- a/test/unit/org/apache/cassandra/cql3/ThriftCompatibilityTest.java +++ b/test/unit/org/apache/cassandra/cql3/ThriftCompatibilityTest.java @@ -41,18 +41,9 @@ public static void defineSchema() throws Exception .addColumnDefinition(integerColumn("thriftcompat", "JdbcInteger"))); } - private static UntypedResultSet execute(String query) throws Throwable + private static UntypedResultSet execute(String query) { - try - { - return QueryProcessor.executeInternal(String.format(query)); - } - catch (RuntimeException exc) - { - if (exc.getCause() != null) - throw exc.getCause(); - throw exc; - } + return QueryProcessor.executeInternal(String.format(query)); } /** Test For CASSANDRA-8178 */ From d314c07a1fd621362d7b6bb80d7f551943018d44 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Mon, 19 Jan 2015 09:35:21 -0500 Subject: [PATCH 241/557] use constants --- .../org/apache/cassandra/serializers/CollectionSerializer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/cassandra/serializers/CollectionSerializer.java b/src/java/org/apache/cassandra/serializers/CollectionSerializer.java index 29ae2fd8f24e..c747bfd2e138 100644 --- a/src/java/org/apache/cassandra/serializers/CollectionSerializer.java +++ b/src/java/org/apache/cassandra/serializers/CollectionSerializer.java @@ -94,7 +94,7 @@ protected static int sizeOfCollectionSize(int elements, int version) protected static void writeValue(ByteBuffer output, ByteBuffer value, int version) { - if (version >= 3) + if (version >= Server.VERSION_3) { if (value == null) { From dfd78d0e90b9995872b00f6f33afc180f2b7cba1 Mon Sep 17 00:00:00 2001 From: Robert Stupp Date: Wed, 21 Jan 2015 20:50:35 +0100 Subject: [PATCH 242/557] Serializing Row cache alternative, fully off heap Patch by Robert Stupp, reviewed by Ariel Weisberg for CASSANDRA-7438 --- CHANGES.txt | 1 + NOTICE.txt | 5 + build.xml | 3 +- conf/cassandra.yaml | 22 +- lib/licenses/ohc-0.2.1.txt | 201 +++++++++++++ lib/ohc-core-0.3.1.jar | Bin 0 -> 143623 bytes lib/ohc-core-j8-0.3.1.jar | Bin 0 -> 5026 bytes .../cassandra/cache/AutoSavingCache.java | 42 ++- .../apache/cassandra/cache/CacheProvider.java | 23 ++ .../cache/ConcurrentLinkedHashCache.java | 12 +- .../org/apache/cassandra/cache/ICache.java | 6 +- .../cassandra/cache/InstrumentingCache.java | 24 +- .../cassandra/cache/NopCacheProvider.java | 93 ++++++ .../apache/cassandra/cache/OHCProvider.java | 274 ++++++++++++++++++ .../apache/cassandra/cache/RowCacheKey.java | 6 + .../cassandra/cache/SerializingCache.java | 10 +- .../cache/SerializingCacheProvider.java | 7 +- .../org/apache/cassandra/config/Config.java | 1 + .../cassandra/config/DatabaseDescriptor.java | 15 +- .../config/YamlConfigurationLoader.java | 2 +- .../cassandra/db/ColumnFamilyStore.java | 12 +- .../cassandra/service/CacheService.java | 23 +- test/conf/cassandra.yaml | 2 + .../org/apache/cassandra/db/KeyCacheTest.java | 9 +- .../org/apache/cassandra/db/RowCacheTest.java | 14 +- 25 files changed, 731 insertions(+), 76 deletions(-) create mode 100644 lib/licenses/ohc-0.2.1.txt create mode 100644 lib/ohc-core-0.3.1.jar create mode 100644 lib/ohc-core-j8-0.3.1.jar create mode 100644 src/java/org/apache/cassandra/cache/CacheProvider.java create mode 100644 src/java/org/apache/cassandra/cache/NopCacheProvider.java create mode 100644 src/java/org/apache/cassandra/cache/OHCProvider.java diff --git a/CHANGES.txt b/CHANGES.txt index cc6478e3f1be..99a5d51f840c 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0 + * Serializing Row cache alternative, fully off heap (CASSANDRA-7438) * Duplicate rows returned when in clause has repeated values (CASSANDRA-6707) * Make CassandraException unchecked, extend RuntimeException (CASSANDRA-8560) * Support direct buffer decompression for reads (CASSANDRA-8464) diff --git a/NOTICE.txt b/NOTICE.txt index 2fe15f5f61b6..43d45141beb2 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -66,3 +66,8 @@ Javassist SIGAR http://sigar.hyperic.com/ + +OHC +(https://github.com/snazy/ohc) +Java Off-Heap-Cache, licensed under APLv2 +Copyright 2014-2015 Robert Stupp, Germany. diff --git a/build.xml b/build.xml index baf6a77e7030..fccd0092999a 100644 --- a/build.xml +++ b/build.xml @@ -375,6 +375,7 @@ + @@ -424,10 +425,10 @@ + - J-yz%TzN9jS|=hS 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­gFJdNKM?aDJ%`S}JMLab4 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 saveTask; protected final CacheService.CacheType cacheType; - private CacheSerializer cacheLoader; + private final CacheSerializer cacheLoader; private static final String CURRENT_VERSION = "b"; private static volatile IStreamFactory streamFactory = new IStreamFactory() @@ -177,16 +177,24 @@ public Future submitWrite(int keysToSave) public class Writer extends CompactionInfo.Holder { - private final Set keys; + private final Iterator keyIterator; private final CompactionInfo info; private long keysWritten; + private final long keysEstimate; protected Writer(int keysToSave) { - if (keysToSave >= getKeySet().size()) - keys = getKeySet(); + int size = size(); + if (keysToSave >= size || keysToSave == 0) + { + keyIterator = keyIterator(); + keysEstimate = size; + } else - keys = hotKeySet(keysToSave); + { + keyIterator = hotKeyIterator(keysToSave); + keysEstimate = keysToSave; + } OperationType type; if (cacheType == CacheService.CacheType.KEY_CACHE) @@ -201,7 +209,7 @@ else if (cacheType == CacheService.CacheType.COUNTER_CACHE) info = new CompactionInfo(CFMetaData.denseCFMetaData(SystemKeyspace.NAME, cacheType.toString(), BytesType.instance), type, 0, - keys.size(), + keysEstimate, "keys"); } @@ -213,7 +221,8 @@ public CacheService.CacheType cacheType() public CompactionInfo getCompactionInfo() { // keyset can change in size, thus total can too - return info.forProgress(keysWritten, Math.max(keysWritten, keys.size())); + // TODO need to check for this one... was: info.forProgress(keysWritten, Math.max(keysWritten, keys.size())); + return info.forProgress(keysWritten, Math.max(keysWritten, keysEstimate)); } public void saveCache() @@ -221,7 +230,7 @@ public void saveCache() logger.debug("Deleting old {} files.", cacheType); deleteOldCacheFiles(); - if (keys.isEmpty()) + if (!keyIterator.hasNext()) { logger.debug("Skipping {} save, cache is empty.", cacheType); return; @@ -235,8 +244,9 @@ public void saveCache() try { - for (K key : keys) + while (keyIterator.hasNext()) { + K key = keyIterator.next(); UUID cfId = key.getCFId(); if (!Schema.instance.hasCF(key.getCFId())) continue; // the table has been dropped. @@ -270,10 +280,22 @@ public void saveCache() } keysWritten++; + if (keysWritten >= keysEstimate) + break; } } finally { + if (keyIterator instanceof Closeable) + try + { + ((Closeable)keyIterator).close(); + } + catch (IOException ignored) + { + // not thrown (by OHC) + } + for (OutputStream writer : streams.values()) FileUtils.closeQuietly(writer); } @@ -290,7 +312,7 @@ public void saveCache() logger.error("Unable to rename {} to {}", tmpFile, cacheFile); } - logger.info("Saved {} ({} items) in {} ms", cacheType, keys.size(), TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start)); + logger.info("Saved {} ({} items) in {} ms", cacheType, keysWritten, TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start)); } private File tempCacheFile(UUID cfId) diff --git a/src/java/org/apache/cassandra/cache/CacheProvider.java b/src/java/org/apache/cassandra/cache/CacheProvider.java new file mode 100644 index 000000000000..6a97be3f3bd4 --- /dev/null +++ b/src/java/org/apache/cassandra/cache/CacheProvider.java @@ -0,0 +1,23 @@ +/* + * 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.cache; + +public interface CacheProvider +{ + ICache create(); +} diff --git a/src/java/org/apache/cassandra/cache/ConcurrentLinkedHashCache.java b/src/java/org/apache/cassandra/cache/ConcurrentLinkedHashCache.java index 81824477b7d3..bb14055fcae2 100644 --- a/src/java/org/apache/cassandra/cache/ConcurrentLinkedHashCache.java +++ b/src/java/org/apache/cassandra/cache/ConcurrentLinkedHashCache.java @@ -17,7 +17,7 @@ */ package org.apache.cassandra.cache; -import java.util.Set; +import java.util.Iterator; import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap; import com.googlecode.concurrentlinkedhashmap.EntryWeigher; @@ -45,7 +45,7 @@ public static Concurr .concurrencyLevel(DEFAULT_CONCURENCY_LEVEL) .build(); - return new ConcurrentLinkedHashCache(map); + return new ConcurrentLinkedHashCache<>(map); } public static ConcurrentLinkedHashCache create(long weightedCapacity) @@ -116,14 +116,14 @@ public void remove(K key) map.remove(key); } - public Set keySet() + public Iterator keyIterator() { - return map.keySet(); + return map.keySet().iterator(); } - public Set hotKeySet(int n) + public Iterator hotKeyIterator(int n) { - return map.descendingKeySetWithLimit(n); + return map.descendingKeySetWithLimit(n).iterator(); } public boolean containsKey(K key) diff --git a/src/java/org/apache/cassandra/cache/ICache.java b/src/java/org/apache/cassandra/cache/ICache.java index 22dbb16a1e5e..37b55cd0e736 100644 --- a/src/java/org/apache/cassandra/cache/ICache.java +++ b/src/java/org/apache/cassandra/cache/ICache.java @@ -17,7 +17,7 @@ */ package org.apache.cassandra.cache; -import java.util.Set; +import java.util.Iterator; /** * This is similar to the Map interface, but requires maintaining a given capacity @@ -46,9 +46,9 @@ public interface ICache public void clear(); - public Set keySet(); + public Iterator keyIterator(); - public Set hotKeySet(int n); + public Iterator hotKeyIterator(int n); public boolean containsKey(K key); } diff --git a/src/java/org/apache/cassandra/cache/InstrumentingCache.java b/src/java/org/apache/cassandra/cache/InstrumentingCache.java index 311b37337945..c8728fd243cd 100644 --- a/src/java/org/apache/cassandra/cache/InstrumentingCache.java +++ b/src/java/org/apache/cassandra/cache/InstrumentingCache.java @@ -17,7 +17,7 @@ */ package org.apache.cassandra.cache; -import java.util.Set; +import java.util.Iterator; import org.apache.cassandra.metrics.CacheMetrics; @@ -26,7 +26,6 @@ */ public class InstrumentingCache { - private volatile boolean capacitySetManually; private final ICache map; private final String type; @@ -78,20 +77,9 @@ public long getCapacity() return map.capacity(); } - public boolean isCapacitySetManually() - { - return capacitySetManually; - } - - public void updateCapacity(long capacity) - { - map.setCapacity(capacity); - } - public void setCapacity(long capacity) { - updateCapacity(capacity); - capacitySetManually = true; + map.setCapacity(capacity); } public int size() @@ -110,14 +98,14 @@ public void clear() metrics = new CacheMetrics(type, map); } - public Set getKeySet() + public Iterator keyIterator() { - return map.keySet(); + return map.keyIterator(); } - public Set hotKeySet(int n) + public Iterator hotKeyIterator(int n) { - return map.hotKeySet(n); + return map.hotKeyIterator(n); } public boolean containsKey(K key) diff --git a/src/java/org/apache/cassandra/cache/NopCacheProvider.java b/src/java/org/apache/cassandra/cache/NopCacheProvider.java new file mode 100644 index 000000000000..20f837a50663 --- /dev/null +++ b/src/java/org/apache/cassandra/cache/NopCacheProvider.java @@ -0,0 +1,93 @@ +/* + * 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.cache; + +import java.util.Collections; +import java.util.Iterator; + +public class NopCacheProvider implements CacheProvider +{ + public ICache create() + { + return new NopCache(); + } + + private static class NopCache implements ICache + { + public long capacity() + { + return 0; + } + + public void setCapacity(long capacity) + { + } + + public void put(RowCacheKey key, IRowCacheEntry value) + { + } + + public boolean putIfAbsent(RowCacheKey key, IRowCacheEntry value) + { + return false; + } + + public boolean replace(RowCacheKey key, IRowCacheEntry old, IRowCacheEntry value) + { + return false; + } + + public IRowCacheEntry get(RowCacheKey key) + { + return null; + } + + public void remove(RowCacheKey key) + { + } + + public int size() + { + return 0; + } + + public long weightedSize() + { + return 0; + } + + public void clear() + { + } + + public Iterator hotKeyIterator(int n) + { + return Collections.emptyIterator(); + } + + public Iterator keyIterator() + { + return Collections.emptyIterator(); + } + + public boolean containsKey(RowCacheKey key) + { + return false; + } + } +} diff --git a/src/java/org/apache/cassandra/cache/OHCProvider.java b/src/java/org/apache/cassandra/cache/OHCProvider.java new file mode 100644 index 000000000000..365ca41bb584 --- /dev/null +++ b/src/java/org/apache/cassandra/cache/OHCProvider.java @@ -0,0 +1,274 @@ +/* + * 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.cache; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.Iterator; +import java.util.UUID; + +import org.apache.cassandra.config.DatabaseDescriptor; +import org.apache.cassandra.db.ColumnFamily; +import org.apache.cassandra.db.TypeSizes; +import org.apache.cassandra.io.util.DataOutputPlus; +import org.apache.cassandra.io.util.Memory; +import org.apache.cassandra.net.MessagingService; +import org.caffinitas.ohc.OHCache; +import org.caffinitas.ohc.OHCacheBuilder; + +public class OHCProvider implements CacheProvider +{ + public ICache create() + { + OHCacheBuilder builder = OHCacheBuilder.newBuilder(); + builder.capacity(DatabaseDescriptor.getRowCacheSizeInMB() * 1024 * 1024) + .keySerializer(new KeySerializer()) + .valueSerializer(new ValueSerializer()) + .throwOOME(true); + + return new OHCacheAdapter(builder.build()); + } + + private static class OHCacheAdapter implements ICache + { + private final OHCache ohCache; + + public OHCacheAdapter(OHCache ohCache) + { + this.ohCache = ohCache; + } + + public long capacity() + { + return ohCache.capacity(); + } + + public void setCapacity(long capacity) + { + ohCache.setCapacity(capacity); + } + + public void put(RowCacheKey key, IRowCacheEntry value) + { + ohCache.put(key, value); + } + + public boolean putIfAbsent(RowCacheKey key, IRowCacheEntry value) + { + return ohCache.putIfAbsent(key, value); + } + + public boolean replace(RowCacheKey key, IRowCacheEntry old, IRowCacheEntry value) + { + return ohCache.addOrReplace(key, old, value); + } + + public IRowCacheEntry get(RowCacheKey key) + { + return ohCache.get(key); + } + + public void remove(RowCacheKey key) + { + ohCache.remove(key); + } + + public int size() + { + return (int) ohCache.size(); + } + + public long weightedSize() + { + return ohCache.size(); + } + + public void clear() + { + ohCache.clear(); + } + + public Iterator hotKeyIterator(int n) + { + return ohCache.hotKeyIterator(n); + } + + public Iterator keyIterator() + { + return ohCache.keyIterator(); + } + + public boolean containsKey(RowCacheKey key) + { + return ohCache.containsKey(key); + } + } + + private static class KeySerializer implements org.caffinitas.ohc.CacheSerializer + { + public void serialize(RowCacheKey rowCacheKey, DataOutput dataOutput) throws IOException + { + dataOutput.writeLong(rowCacheKey.cfId.getMostSignificantBits()); + dataOutput.writeLong(rowCacheKey.cfId.getLeastSignificantBits()); + dataOutput.writeInt(rowCacheKey.key.length); + dataOutput.write(rowCacheKey.key); + } + + public RowCacheKey deserialize(DataInput dataInput) throws IOException + { + long msb = dataInput.readLong(); + long lsb = dataInput.readLong(); + byte[] key = new byte[dataInput.readInt()]; + dataInput.readFully(key); + return new RowCacheKey(new UUID(msb, lsb), key); + } + + public int serializedSize(RowCacheKey rowCacheKey) + { + return 20 + rowCacheKey.key.length; + } + } + + private static class ValueSerializer implements org.caffinitas.ohc.CacheSerializer + { + public void serialize(IRowCacheEntry entry, DataOutput out) throws IOException + { + assert entry != null; // unlike CFS we don't support nulls, since there is no need for that in the cache + boolean isSentinel = entry instanceof RowCacheSentinel; + out.writeBoolean(isSentinel); + if (isSentinel) + out.writeLong(((RowCacheSentinel) entry).sentinelId); + else + ColumnFamily.serializer.serialize((ColumnFamily) entry, new DataOutputPlusAdapter(out), MessagingService.current_version); + } + + public IRowCacheEntry deserialize(DataInput in) throws IOException + { + boolean isSentinel = in.readBoolean(); + if (isSentinel) + return new RowCacheSentinel(in.readLong()); + return ColumnFamily.serializer.deserialize(in, MessagingService.current_version); + } + + public int serializedSize(IRowCacheEntry entry) + { + TypeSizes typeSizes = TypeSizes.NATIVE; + int size = typeSizes.sizeof(true); + if (entry instanceof RowCacheSentinel) + size += typeSizes.sizeof(((RowCacheSentinel) entry).sentinelId); + else + size += ColumnFamily.serializer.serializedSize((ColumnFamily) entry, typeSizes, MessagingService.current_version); + return size; + } + } + + static class DataOutputPlusAdapter implements DataOutputPlus + { + private final DataOutput out; + + public void write(byte[] b) throws IOException + { + out.write(b); + } + + public void write(byte[] b, int off, int len) throws IOException + { + out.write(b, off, len); + } + + public void write(int b) throws IOException + { + out.write(b); + } + + public void writeBoolean(boolean v) throws IOException + { + out.writeBoolean(v); + } + + public void writeByte(int v) throws IOException + { + out.writeByte(v); + } + + public void writeBytes(String s) throws IOException + { + out.writeBytes(s); + } + + public void writeChar(int v) throws IOException + { + out.writeChar(v); + } + + public void writeChars(String s) throws IOException + { + out.writeChars(s); + } + + public void writeDouble(double v) throws IOException + { + out.writeDouble(v); + } + + public void writeFloat(float v) throws IOException + { + out.writeFloat(v); + } + + public void writeInt(int v) throws IOException + { + out.writeInt(v); + } + + public void writeLong(long v) throws IOException + { + out.writeLong(v); + } + + public void writeShort(int v) throws IOException + { + out.writeShort(v); + } + + public void writeUTF(String s) throws IOException + { + out.writeUTF(s); + } + + public DataOutputPlusAdapter(DataOutput out) + { + this.out = out; + } + + public void write(ByteBuffer buffer) throws IOException + { + if (buffer.hasArray()) + out.write(buffer.array(), buffer.arrayOffset(), buffer.remaining()); + else + throw new UnsupportedOperationException("IMPLEMENT ME"); + } + + public void write(Memory memory) throws IOException + { + throw new UnsupportedOperationException("IMPLEMENT ME"); + } + } +} diff --git a/src/java/org/apache/cassandra/cache/RowCacheKey.java b/src/java/org/apache/cassandra/cache/RowCacheKey.java index af2d4d4ee141..ccb85d85e0b9 100644 --- a/src/java/org/apache/cassandra/cache/RowCacheKey.java +++ b/src/java/org/apache/cassandra/cache/RowCacheKey.java @@ -33,6 +33,12 @@ public class RowCacheKey implements CacheKey, Comparable private static final long EMPTY_SIZE = ObjectSizes.measure(new RowCacheKey(null, ByteBufferUtil.EMPTY_BYTE_BUFFER)); + public RowCacheKey(UUID cfId, byte[] key) + { + this.cfId = cfId; + this.key = key; + } + public RowCacheKey(UUID cfId, DecoratedKey key) { this(cfId, key.getKey()); diff --git a/src/java/org/apache/cassandra/cache/SerializingCache.java b/src/java/org/apache/cassandra/cache/SerializingCache.java index ca65fccd3bcd..911b5007d291 100644 --- a/src/java/org/apache/cassandra/cache/SerializingCache.java +++ b/src/java/org/apache/cassandra/cache/SerializingCache.java @@ -18,7 +18,7 @@ package org.apache.cassandra.cache; import java.io.IOException; -import java.util.Set; +import java.util.Iterator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -264,14 +264,14 @@ public void remove(K key) mem.unreference(); } - public Set keySet() + public Iterator keyIterator() { - return map.keySet(); + return map.keySet().iterator(); } - public Set hotKeySet(int n) + public Iterator hotKeyIterator(int n) { - return map.descendingKeySetWithLimit(n); + return map.descendingKeySetWithLimit(n).iterator(); } public boolean containsKey(K key) diff --git a/src/java/org/apache/cassandra/cache/SerializingCacheProvider.java b/src/java/org/apache/cassandra/cache/SerializingCacheProvider.java index a0588726109f..f540322917c9 100644 --- a/src/java/org/apache/cassandra/cache/SerializingCacheProvider.java +++ b/src/java/org/apache/cassandra/cache/SerializingCacheProvider.java @@ -20,17 +20,18 @@ import java.io.DataInput; import java.io.IOException; +import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.ColumnFamily; import org.apache.cassandra.db.TypeSizes; import org.apache.cassandra.io.ISerializer; import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.net.MessagingService; -public class SerializingCacheProvider +public class SerializingCacheProvider implements CacheProvider { - public ICache create(long capacity) + public ICache create() { - return SerializingCache.create(capacity, new RowCacheSerializer()); + return SerializingCache.create(DatabaseDescriptor.getRowCacheSizeInMB() * 1024 * 1024, new RowCacheSerializer()); } // Package protected for tests diff --git a/src/java/org/apache/cassandra/config/Config.java b/src/java/org/apache/cassandra/config/Config.java index 33d2bb2644c7..f42c980850df 100644 --- a/src/java/org/apache/cassandra/config/Config.java +++ b/src/java/org/apache/cassandra/config/Config.java @@ -192,6 +192,7 @@ public class Config public volatile int key_cache_save_period = 14400; public volatile int key_cache_keys_to_save = Integer.MAX_VALUE; + public String row_cache_class_name = "org.apache.cassandra.cache.OHCProvider"; public long row_cache_size_in_mb = 0; public volatile int row_cache_save_period = 0; public volatile int row_cache_keys_to_save = Integer.MAX_VALUE; diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java index 6d626da361cc..8cc2da46c904 100644 --- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java +++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java @@ -1423,6 +1423,11 @@ public static void setKeyCacheKeysToSave(int keyCacheKeysToSave) conf.key_cache_keys_to_save = keyCacheKeysToSave; } + public static String getRowCacheClassName() + { + return conf.row_cache_class_name; + } + public static long getRowCacheSizeInMB() { return conf.row_cache_size_in_mb; @@ -1448,6 +1453,11 @@ public static long getCounterCacheSizeInMB() return counterCacheSizeInMB; } + public static void setRowCacheKeysToSave(int rowCacheKeysToSave) + { + conf.row_cache_keys_to_save = rowCacheKeysToSave; + } + public static int getCounterCacheSavePeriod() { return conf.counter_cache_save_period; @@ -1473,11 +1483,6 @@ public static IAllocator getoffHeapMemoryAllocator() return memoryAllocator; } - public static void setRowCacheKeysToSave(int rowCacheKeysToSave) - { - conf.row_cache_keys_to_save = rowCacheKeysToSave; - } - public static int getStreamingSocketTimeout() { return conf.streaming_socket_timeout_in_ms; diff --git a/src/java/org/apache/cassandra/config/YamlConfigurationLoader.java b/src/java/org/apache/cassandra/config/YamlConfigurationLoader.java index 50991f239217..82c8151ffa13 100644 --- a/src/java/org/apache/cassandra/config/YamlConfigurationLoader.java +++ b/src/java/org/apache/cassandra/config/YamlConfigurationLoader.java @@ -102,7 +102,7 @@ public Config loadConfig(URL url) throws ConfigurationException } logConfig(configBytes); - + org.yaml.snakeyaml.constructor.Constructor constructor = new org.yaml.snakeyaml.constructor.Constructor(Config.class); TypeDescription seedDesc = new TypeDescription(SeedProviderDef.class); seedDesc.putMapPropertyType("parameters", String.class, String.class); diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java index 002238c93b69..c2ee0aca4db1 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java @@ -1961,19 +1961,23 @@ public void cleanupCache() { Collection> ranges = StorageService.instance.getLocalRanges(keyspace.getName()); - for (RowCacheKey key : CacheService.instance.rowCache.getKeySet()) + for (Iterator keyIter = CacheService.instance.rowCache.keyIterator(); + keyIter.hasNext(); ) { + RowCacheKey key = keyIter.next(); DecoratedKey dk = partitioner.decorateKey(ByteBuffer.wrap(key.key)); - if (key.cfId == metadata.cfId && !Range.isInRanges(dk.getToken(), ranges)) + if (key.cfId.equals(metadata.cfId) && !Range.isInRanges(dk.getToken(), ranges)) invalidateCachedRow(dk); } if (metadata.isCounter()) { - for (CounterCacheKey key : CacheService.instance.counterCache.getKeySet()) + for (Iterator keyIter = CacheService.instance.counterCache.keyIterator(); + keyIter.hasNext(); ) { + CounterCacheKey key = keyIter.next(); DecoratedKey dk = partitioner.decorateKey(ByteBuffer.wrap(key.partitionKey)); - if (key.cfId == metadata.cfId && !Range.isInRanges(dk.getToken(), ranges)) + if (key.cfId.equals(metadata.cfId) && !Range.isInRanges(dk.getToken(), ranges)) CacheService.instance.counterCache.remove(key); } } diff --git a/src/java/org/apache/cassandra/service/CacheService.java b/src/java/org/apache/cassandra/service/CacheService.java index 2ffd954d4218..fb8153c2f540 100644 --- a/src/java/org/apache/cassandra/service/CacheService.java +++ b/src/java/org/apache/cassandra/service/CacheService.java @@ -33,6 +33,7 @@ import javax.management.ObjectName; import com.google.common.util.concurrent.Futures; + import org.apache.cassandra.io.sstable.format.SSTableReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -132,10 +133,22 @@ private AutoSavingCache initRowCache() { logger.info("Initializing row cache with capacity of {} MBs", DatabaseDescriptor.getRowCacheSizeInMB()); - long rowCacheInMemoryCapacity = DatabaseDescriptor.getRowCacheSizeInMB() * 1024 * 1024; + CacheProvider cacheProvider; + String cacheProviderClassName = DatabaseDescriptor.getRowCacheSizeInMB() > 0 + ? DatabaseDescriptor.getRowCacheClassName() : "org.apache.cassandra.cache.NopCacheProvider"; + try + { + Class> cacheProviderClass = + (Class>) Class.forName(cacheProviderClassName); + cacheProvider = cacheProviderClass.newInstance(); + } + catch (Exception e) + { + throw new RuntimeException("Cannot find configured row cache provider class " + DatabaseDescriptor.getRowCacheClassName()); + } // cache object - ICache rc = new SerializingCacheProvider().create(rowCacheInMemoryCapacity); + ICache rc = cacheProvider.create(); AutoSavingCache rowCache = new AutoSavingCache<>(rc, CacheType.ROW_CACHE, new RowCacheSerializer()); int rowCacheKeysToSave = DatabaseDescriptor.getRowCacheKeysToSave(); @@ -285,7 +298,7 @@ public void invalidateKeyCache() public void invalidateKeyCacheForCf(UUID cfId) { - Iterator keyCacheIterator = keyCache.getKeySet().iterator(); + Iterator keyCacheIterator = keyCache.keyIterator(); while (keyCacheIterator.hasNext()) { KeyCacheKey key = keyCacheIterator.next(); @@ -301,7 +314,7 @@ public void invalidateRowCache() public void invalidateRowCacheForCf(UUID cfId) { - Iterator rowCacheIterator = rowCache.getKeySet().iterator(); + Iterator rowCacheIterator = rowCache.keyIterator(); while (rowCacheIterator.hasNext()) { RowCacheKey rowCacheKey = rowCacheIterator.next(); @@ -312,7 +325,7 @@ public void invalidateRowCacheForCf(UUID cfId) public void invalidateCounterCacheForCf(UUID cfId) { - Iterator counterCacheIterator = counterCache.getKeySet().iterator(); + Iterator counterCacheIterator = counterCache.keyIterator(); while (counterCacheIterator.hasNext()) { CounterCacheKey counterCacheKey = counterCacheIterator.next(); diff --git a/test/conf/cassandra.yaml b/test/conf/cassandra.yaml index ec988e299ff6..307ca8cf10a5 100644 --- a/test/conf/cassandra.yaml +++ b/test/conf/cassandra.yaml @@ -36,3 +36,5 @@ server_encryption_options: incremental_backups: true concurrent_compactors: 4 compaction_throughput_mb_per_sec: 0 +row_cache_class_name: org.apache.cassandra.cache.OHCProvider +row_cache_size_in_mb: 16 diff --git a/test/unit/org/apache/cassandra/db/KeyCacheTest.java b/test/unit/org/apache/cassandra/db/KeyCacheTest.java index e31b4398cd7d..c370e4f8d13e 100644 --- a/test/unit/org/apache/cassandra/db/KeyCacheTest.java +++ b/test/unit/org/apache/cassandra/db/KeyCacheTest.java @@ -18,6 +18,7 @@ package org.apache.cassandra.db; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.concurrent.ExecutionException; @@ -88,8 +89,10 @@ public void testKeyCacheLoad() throws Exception // really? our caches don't implement the map interface? (hence no .addAll) Map savedMap = new HashMap(); - for (KeyCacheKey k : CacheService.instance.keyCache.getKeySet()) + for (Iterator iter = CacheService.instance.keyCache.keyIterator(); + iter.hasNext();) { + KeyCacheKey k = iter.next(); if (k.desc.ksname.equals(KEYSPACE1) && k.desc.cfname.equals(COLUMN_FAMILY2)) savedMap.put(k, CacheService.instance.keyCache.get(k)); } @@ -207,8 +210,10 @@ public void testKeyCache() throws ExecutionException, InterruptedException private void assertKeyCacheSize(int expected, String keyspace, String columnFamily) { int size = 0; - for (KeyCacheKey k : CacheService.instance.keyCache.getKeySet()) + for (Iterator iter = CacheService.instance.keyCache.keyIterator(); + iter.hasNext();) { + KeyCacheKey k = iter.next(); if (k.desc.ksname.equals(keyspace) && k.desc.cfname.equals(columnFamily)) size++; } diff --git a/test/unit/org/apache/cassandra/db/RowCacheTest.java b/test/unit/org/apache/cassandra/db/RowCacheTest.java index 7d5799a7cd4e..3d5617fabb8a 100644 --- a/test/unit/org/apache/cassandra/db/RowCacheTest.java +++ b/test/unit/org/apache/cassandra/db/RowCacheTest.java @@ -156,9 +156,9 @@ public void testRowCacheCleanup() throws Exception rowCacheLoad(100, Integer.MAX_VALUE, 1000); ColumnFamilyStore store = Keyspace.open(KEYSPACE_CACHED).getColumnFamilyStore(CF_CACHED); - assertEquals(CacheService.instance.rowCache.getKeySet().size(), 100); + assertEquals(CacheService.instance.rowCache.size(), 100); store.cleanupCache(); - assertEquals(CacheService.instance.rowCache.getKeySet().size(), 100); + assertEquals(CacheService.instance.rowCache.size(), 100); TokenMetadata tmd = StorageService.instance.getTokenMetadata(); byte[] tk1, tk2; tk1 = "key1000".getBytes(); @@ -166,7 +166,7 @@ public void testRowCacheCleanup() throws Exception tmd.updateNormalToken(new BytesToken(tk1), InetAddress.getByName("127.0.0.1")); tmd.updateNormalToken(new BytesToken(tk2), InetAddress.getByName("127.0.0.2")); store.cleanupCache(); - assertEquals(CacheService.instance.rowCache.getKeySet().size(), 50); + assertEquals(50, CacheService.instance.rowCache.size()); CacheService.instance.setRowCacheCapacityInMB(0); } @@ -259,19 +259,19 @@ public void rowCacheLoad(int totalKeys, int keysToSave, int offset) throws Excep // empty the cache CacheService.instance.invalidateRowCache(); - assert CacheService.instance.rowCache.size() == 0; + assertEquals(0, CacheService.instance.rowCache.size()); // insert data and fill the cache SchemaLoader.insertData(KEYSPACE_CACHED, CF_CACHED, offset, totalKeys); SchemaLoader.readData(KEYSPACE_CACHED, CF_CACHED, offset, totalKeys); - assert CacheService.instance.rowCache.size() == totalKeys; + assertEquals(totalKeys, CacheService.instance.rowCache.size()); // force the cache to disk CacheService.instance.rowCache.submitWrite(keysToSave).get(); // empty the cache again to make sure values came from disk CacheService.instance.invalidateRowCache(); - assert CacheService.instance.rowCache.size() == 0; - assert CacheService.instance.rowCache.loadSaved(store) == (keysToSave == Integer.MAX_VALUE ? totalKeys : keysToSave); + assertEquals(0, CacheService.instance.rowCache.size()); + assertEquals(keysToSave == Integer.MAX_VALUE ? totalKeys : keysToSave, CacheService.instance.rowCache.loadSaved(store)); } } From 39108df7c8e0ffae3b39ad4adfefcd18f38667f7 Mon Sep 17 00:00:00 2001 From: Robert Stupp Date: Wed, 21 Jan 2015 22:10:40 +0100 Subject: [PATCH 243/557] ninja - fix flappy unit tests in UFTest that require native protocol server socket --- test/unit/org/apache/cassandra/cql3/CQLTester.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/test/unit/org/apache/cassandra/cql3/CQLTester.java b/test/unit/org/apache/cassandra/cql3/CQLTester.java index b01ca9e72494..efda70433019 100644 --- a/test/unit/org/apache/cassandra/cql3/CQLTester.java +++ b/test/unit/org/apache/cassandra/cql3/CQLTester.java @@ -18,7 +18,6 @@ package org.apache.cassandra.cql3; import java.io.File; -import java.io.IOException; import java.math.BigDecimal; import java.math.BigInteger; import java.net.InetAddress; @@ -89,10 +88,13 @@ public abstract class CQLTester try { - ServerSocket serverSocket = new ServerSocket(0); - nativePort = serverSocket.getLocalPort(); + try (ServerSocket serverSocket = new ServerSocket(0)) + { + nativePort = serverSocket.getLocalPort(); + } + Thread.sleep(250); } - catch (IOException e) + catch (Exception e) { throw new RuntimeException(e); } From 222ea958352dc191a3684e23e526c2289c24582d Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Wed, 21 Jan 2015 21:40:21 -0500 Subject: [PATCH 244/557] minor javadoc fixes --- build.xml | 1 - src/java/org/apache/cassandra/auth/IAuthorizer.java | 4 ++-- .../apache/cassandra/cql3/MultiColumnRelation.java | 4 ++++ src/java/org/apache/cassandra/cql3/Tuples.java | 4 ++++ .../cassandra/cql3/statements/RequestValidations.java | 6 ++---- .../org/apache/cassandra/db/AbstractNativeCell.java | 4 ++++ .../org/apache/cassandra/db/AtomicBTreeColumns.java | 3 ++- .../cassandra/db/compaction/CompactionManager.java | 6 ++++-- .../org/apache/cassandra/gms/IFailureDetector.java | 4 ++-- src/java/org/apache/cassandra/gms/VersionedValue.java | 8 ++++++-- .../cassandra/hadoop/cql3/CqlBulkRecordWriter.java | 1 + .../apache/cassandra/hadoop/cql3/CqlRecordReader.java | 8 ++++++-- .../org/apache/cassandra/io/sstable/Component.java | 2 ++ .../cassandra/io/util/FastByteArrayOutputStream.java | 2 +- .../apache/cassandra/locator/CloudstackSnitch.java | 2 ++ .../cassandra/locator/NetworkTopologyStrategy.java | 6 ++++-- .../apache/cassandra/locator/PropertyFileSnitch.java | 3 ++- .../org/apache/cassandra/service/StorageProxy.java | 7 +++++-- .../org/apache/cassandra/tools/SSTableExport.java | 1 - .../org/apache/cassandra/tools/SSTableImport.java | 1 - .../cassandra/tools/SSTableRepairedAtSetter.java | 3 ++- .../apache/cassandra/utils/concurrent/OpOrder.java | 2 ++ .../org/apache/cassandra/utils/obs/OpenBitSet.java | 11 ++++++++--- 23 files changed, 65 insertions(+), 28 deletions(-) diff --git a/build.xml b/build.xml index fccd0092999a..353eefd8e45a 100644 --- a/build.xml +++ b/build.xml @@ -447,7 +447,6 @@ artifactId="cassandra-parent" version="${version}"/> - diff --git a/src/java/org/apache/cassandra/auth/IAuthorizer.java b/src/java/org/apache/cassandra/auth/IAuthorizer.java index 7e3240ac8e0f..0aaebcfb078c 100644 --- a/src/java/org/apache/cassandra/auth/IAuthorizer.java +++ b/src/java/org/apache/cassandra/auth/IAuthorizer.java @@ -48,8 +48,8 @@ public interface IAuthorizer * * @param performer User who grants the permissions. * @param permissions Set of permissions to grant. - * @param to Name of the role to which the permissions are to be granted. * @param resource Resource on which to grant the permissions. + * @param grantee name of the role to which the permissions are to be granted. * * @throws RequestValidationException * @throws RequestExecutionException @@ -80,7 +80,7 @@ void revoke(AuthenticatedUser performer, Set permissions, IResource * matching ones. * @param resource The resource on which permissions are requested. Can be null, in which case permissions on all * resources should be returned. - * @param of The name of the role whose permissions are requested. Can be null, in which case permissions of every + * @param grantee The name of the role whose permissions are requested. Can be null, in which case permissions of every * role should be returned. * * @return All of the matching permission that the requesting user is authorized to know about. diff --git a/src/java/org/apache/cassandra/cql3/MultiColumnRelation.java b/src/java/org/apache/cassandra/cql3/MultiColumnRelation.java index d754968332e4..7e7a90126d2d 100644 --- a/src/java/org/apache/cassandra/cql3/MultiColumnRelation.java +++ b/src/java/org/apache/cassandra/cql3/MultiColumnRelation.java @@ -36,10 +36,12 @@ /** * A relation using the tuple notation, which typically affects multiple columns. * Examples: + * {@code * - SELECT ... WHERE (a, b, c) > (1, 'a', 10) * - SELECT ... WHERE (a, b, c) IN ((1, 2, 3), (4, 5, 6)) * - SELECT ... WHERE (a, b) < ? * - SELECT ... WHERE (a, b) IN ? + * } */ public class MultiColumnRelation extends Relation { @@ -65,7 +67,9 @@ private MultiColumnRelation(List entities, Operator relati /** * Creates a multi-column EQ, LT, LTE, GT, or GTE relation. + * {@code * For example: "SELECT ... WHERE (a, b) > (0, 1)" + * } * @param entities the columns on the LHS of the relation * @param relationType the relation operator * @param valuesOrMarker a Tuples.Literal instance or a Tuples.Raw marker diff --git a/src/java/org/apache/cassandra/cql3/Tuples.java b/src/java/org/apache/cassandra/cql3/Tuples.java index a66c534988bd..ca436a11dce4 100644 --- a/src/java/org/apache/cassandra/cql3/Tuples.java +++ b/src/java/org/apache/cassandra/cql3/Tuples.java @@ -277,7 +277,9 @@ public List> getSplitValues() /** * A raw placeholder for a tuple of values for different multiple columns, each of which may have a different type. + * {@code * For example, "SELECT ... WHERE (col1, col2) > ?". + * } */ public static class Raw extends AbstractMarker.Raw implements Term.MultiColumnRaw { @@ -363,7 +365,9 @@ public AbstractMarker prepare(String keyspace, ColumnSpecification receiver) } /** + * {@code * Represents a marker for a single tuple, like "SELECT ... WHERE (a, b, c) > ?" + * } */ public static class Marker extends AbstractMarker { diff --git a/src/java/org/apache/cassandra/cql3/statements/RequestValidations.java b/src/java/org/apache/cassandra/cql3/statements/RequestValidations.java index ce15e159ef0b..c822325df38c 100644 --- a/src/java/org/apache/cassandra/cql3/statements/RequestValidations.java +++ b/src/java/org/apache/cassandra/cql3/statements/RequestValidations.java @@ -35,8 +35,7 @@ public final class RequestValidations * be thrown. * * @param expression the expression to test - * @param messageTemplate the error message - * @param messageArgs the message arguments + * @param message the error message * @throws InvalidRequestException if the specified expression is false. */ public static void checkTrue(boolean expression, String message) throws InvalidRequestException @@ -66,8 +65,7 @@ public static void checkTrue(boolean expression, * Checks that the specified list does not contains duplicates. * * @param list the list to test - * @param messageTemplate the template used to build the error message - * @param messageArgs the message arguments + * @param message the error message * @throws InvalidRequestException if the specified list contains duplicates. */ public static void checkContainsNoDuplicates(List list, String message) throws InvalidRequestException diff --git a/src/java/org/apache/cassandra/db/AbstractNativeCell.java b/src/java/org/apache/cassandra/db/AbstractNativeCell.java index e01d860e69b6..207a972b4caf 100644 --- a/src/java/org/apache/cassandra/db/AbstractNativeCell.java +++ b/src/java/org/apache/cassandra/db/AbstractNativeCell.java @@ -37,6 +37,8 @@ /** + *
    + * {@code
      * Packs a CellName AND a Cell into one off-heap representation.
      * Layout is:
      *
    @@ -55,6 +57,8 @@
      * name extra:  lowest 2 bits indicate the clustering size delta (i.e. how many name items are NOT part of the clustering key)
      *              the next 2 bits indicate the CellNameType
      *              the next bit indicates if the column is a static or clustered/dynamic column
    + * }
    + * 
    */ public abstract class AbstractNativeCell extends AbstractCell implements CellName { diff --git a/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java b/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java index 0f083e3746e4..0b1a58c5fecd 100644 --- a/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java +++ b/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java @@ -55,8 +55,9 @@ * isolated (in the sense of ACID). Typically a addAll is guaranteed that no * other thread can see the state where only parts but not all columns have * been added. - *

    + *

    * WARNING: removing element through getSortedColumns().iterator() is *not* supported + *

    */ public class AtomicBTreeColumns extends ColumnFamily { diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java index 1e06f5e38cd9..7b45dd351dff 100644 --- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java +++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java @@ -85,8 +85,9 @@ import org.apache.cassandra.utils.*; /** + *

    * A singleton which manages a private executor of ongoing compactions. - *

    + *

    * Scheduling for compaction is accomplished by swapping sstables to be compacted into * a set via DataTracker. New scheduling attempts will ignore currently compacting * sstables. @@ -411,7 +412,8 @@ public void runMayThrow() throws Exception * @param cfs * @param ranges Ranges that the repair was carried out on * @param validatedForRepair SSTables containing the repaired ranges. Should be referenced before passing them. - * @throws InterruptedException, ExecutionException, IOException + * @throws InterruptedException + * @throws IOException */ public void performAnticompaction(ColumnFamilyStore cfs, Collection> ranges, diff --git a/src/java/org/apache/cassandra/gms/IFailureDetector.java b/src/java/org/apache/cassandra/gms/IFailureDetector.java index 92338e9e89a3..a860c7cc3a85 100644 --- a/src/java/org/apache/cassandra/gms/IFailureDetector.java +++ b/src/java/org/apache/cassandra/gms/IFailureDetector.java @@ -41,7 +41,7 @@ public interface IFailureDetector * This method is invoked by any entity wanting to interrogate the status of an endpoint. * In our case it would be the Gossiper. The Failure Detector will then calculate Phi and * deem an endpoint as suspicious or alive as explained in the Hayashibara paper. - *

    + * * param ep endpoint for which we interpret the inter arrival times. */ public void interpret(InetAddress ep); @@ -50,7 +50,7 @@ public interface IFailureDetector * This method is invoked by the receiver of the heartbeat. In our case it would be * the Gossiper. Gossiper inform the Failure Detector on receipt of a heartbeat. The * FailureDetector will then sample the arrival time as explained in the paper. - *

    + * * param ep endpoint being reported. */ public void report(InetAddress ep); diff --git a/src/java/org/apache/cassandra/gms/VersionedValue.java b/src/java/org/apache/cassandra/gms/VersionedValue.java index a779982bd21a..e8cf748d8e8f 100644 --- a/src/java/org/apache/cassandra/gms/VersionedValue.java +++ b/src/java/org/apache/cassandra/gms/VersionedValue.java @@ -43,11 +43,15 @@ * application wants to make available to the rest of the nodes in the cluster. * Whenever a piece of state needs to be disseminated to the rest of cluster wrap * the state in an instance of ApplicationState and add it to the Gossiper. - *

    + *

    * e.g. if we want to disseminate load information for node A do the following: - *

    + *

    + *
    + * {@code
      * ApplicationState loadState = new ApplicationState();
      * Gossiper.instance.addApplicationState("LOAD STATE", loadState);
    + * }
    + * 
    */ public class VersionedValue implements Comparable diff --git a/src/java/org/apache/cassandra/hadoop/cql3/CqlBulkRecordWriter.java b/src/java/org/apache/cassandra/hadoop/cql3/CqlBulkRecordWriter.java index ebae7a4f94cb..60cd5118c138 100644 --- a/src/java/org/apache/cassandra/hadoop/cql3/CqlBulkRecordWriter.java +++ b/src/java/org/apache/cassandra/hadoop/cql3/CqlBulkRecordWriter.java @@ -136,6 +136,7 @@ public void onSuccess(StreamState finalState) } /** + *

    * The column values must correspond to the order in which * they appear in the insert stored procedure. * diff --git a/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordReader.java b/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordReader.java index be257c838933..affae5ab53b4 100644 --- a/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordReader.java +++ b/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordReader.java @@ -57,15 +57,19 @@ import org.apache.hadoop.mapreduce.TaskAttemptContext; /** + *

    * CqlRecordReader reads the rows return from the CQL query * It uses CQL auto-paging. - *

    + *

    + *

    * Return a Long as a local CQL row key starts from 0; - *

    + *

    + * {@code * Row as C* java driver CQL result set row * 1) select clause must include partition key columns (to calculate the progress based on the actual CF row processed) * 2) where clause must include token(partition_key1, ... , partition_keyn) > ? and * token(partition_key1, ... , partition_keyn) <= ? (in the right order) + * } */ public class CqlRecordReader extends RecordReader implements org.apache.hadoop.mapred.RecordReader, AutoCloseable diff --git a/src/java/org/apache/cassandra/io/sstable/Component.java b/src/java/org/apache/cassandra/io/sstable/Component.java index 3eacd0796de5..7f6cc7984f91 100644 --- a/src/java/org/apache/cassandra/io/sstable/Component.java +++ b/src/java/org/apache/cassandra/io/sstable/Component.java @@ -111,7 +111,9 @@ public String name() } /** + * {@code * Filename of the form "/-[tmp-][-]-", + * } * @return A Descriptor for the SSTable, and a Component for this particular file. * TODO move descriptor into Component field */ diff --git a/src/java/org/apache/cassandra/io/util/FastByteArrayOutputStream.java b/src/java/org/apache/cassandra/io/util/FastByteArrayOutputStream.java index c831508a162c..0e509b3ea5c8 100644 --- a/src/java/org/apache/cassandra/io/util/FastByteArrayOutputStream.java +++ b/src/java/org/apache/cassandra/io/util/FastByteArrayOutputStream.java @@ -72,7 +72,7 @@ public FastByteArrayOutputStream() { * initial size for the underlying byte array, must be * non-negative. * @throws IllegalArgumentException - * if {@code size} < 0. + * if {@code size < 0}. */ public FastByteArrayOutputStream(int size) { if (size >= 0) { diff --git a/src/java/org/apache/cassandra/locator/CloudstackSnitch.java b/src/java/org/apache/cassandra/locator/CloudstackSnitch.java index 4771f6bb705b..afcd083b9690 100644 --- a/src/java/org/apache/cassandra/locator/CloudstackSnitch.java +++ b/src/java/org/apache/cassandra/locator/CloudstackSnitch.java @@ -44,9 +44,11 @@ import org.apache.cassandra.utils.JVMStabilityInspector; /** + * {@code * A snitch that assumes a Cloudstack Zone follows the typical convention * -- and uses the country/location * tuple as a datacenter and the availability zone as a rack + * } */ public class CloudstackSnitch extends AbstractNetworkTopologySnitch diff --git a/src/java/org/apache/cassandra/locator/NetworkTopologyStrategy.java b/src/java/org/apache/cassandra/locator/NetworkTopologyStrategy.java index 5e5ecb78ba94..b0d540cb180c 100644 --- a/src/java/org/apache/cassandra/locator/NetworkTopologyStrategy.java +++ b/src/java/org/apache/cassandra/locator/NetworkTopologyStrategy.java @@ -32,15 +32,17 @@ import com.google.common.collect.Multimap; /** + *

    * This Replication Strategy takes a property file that gives the intended * replication factor in each datacenter. The sum total of the datacenter * replication factor values should be equal to the keyspace replication * factor. - *

    + *

    + *

    * So for example, if the keyspace replication factor is 6, the * datacenter replication factors could be 3, 2, and 1 - so 3 replicas in * one datacenter, 2 in another, and 1 in another - totalling 6. - *

    + *

    * This class also caches the Endpoints and invalidates the cache if there is a * change in the number of tokens. */ diff --git a/src/java/org/apache/cassandra/locator/PropertyFileSnitch.java b/src/java/org/apache/cassandra/locator/PropertyFileSnitch.java index a8b26d8d5092..247eb0086409 100644 --- a/src/java/org/apache/cassandra/locator/PropertyFileSnitch.java +++ b/src/java/org/apache/cassandra/locator/PropertyFileSnitch.java @@ -37,8 +37,9 @@ import org.apache.commons.lang3.StringUtils; /** + *

    * Used to determine if two IP's are in the same datacenter or on the same rack. - *

    + *

    * Based on a properties file in the following format: * * 10.0.0.13=DC1:RAC2 diff --git a/src/java/org/apache/cassandra/service/StorageProxy.java b/src/java/org/apache/cassandra/service/StorageProxy.java index 39b21e7e1b23..cf9990b635dc 100644 --- a/src/java/org/apache/cassandra/service/StorageProxy.java +++ b/src/java/org/apache/cassandra/service/StorageProxy.java @@ -831,13 +831,16 @@ private static Collection getBatchlogEndpoints(String localDataCent * is not available. * * Note about hints: - * + *
    +     * {@code
          * | Hinted Handoff | Consist. Level |
          * | on             |       >=1      | --> wait for hints. We DO NOT notify the handler with handler.response() for hints;
          * | on             |       ANY      | --> wait for hints. Responses count towards consistency.
          * | off            |       >=1      | --> DO NOT fire hints. And DO NOT wait for them to complete.
          * | off            |       ANY      | --> DO NOT fire hints. And DO NOT wait for them to complete.
    -     *
    +     * }
    +     * 
    + * * @throws OverloadedException if the hints cannot be written/enqueued */ public static void sendToHintedEndpoints(final Mutation mutation, diff --git a/src/java/org/apache/cassandra/tools/SSTableExport.java b/src/java/org/apache/cassandra/tools/SSTableExport.java index 64dc2d84c7da..76bfa3b1587f 100644 --- a/src/java/org/apache/cassandra/tools/SSTableExport.java +++ b/src/java/org/apache/cassandra/tools/SSTableExport.java @@ -387,7 +387,6 @@ public static void export(Descriptor desc, String[] excludes, CFMetaData metadat * export the contents of the SSTable to JSON. * * @param args command lines arguments - * @throws IOException on failure to open/read/write files or output streams * @throws ConfigurationException on configuration failure (wrong params given) */ public static void main(String[] args) throws ConfigurationException diff --git a/src/java/org/apache/cassandra/tools/SSTableImport.java b/src/java/org/apache/cassandra/tools/SSTableImport.java index f51610bc8c49..ee6bf591d1f6 100644 --- a/src/java/org/apache/cassandra/tools/SSTableImport.java +++ b/src/java/org/apache/cassandra/tools/SSTableImport.java @@ -459,7 +459,6 @@ private JsonParser getParser(String fileName) throws IOException * using an optional command line argument, or supplied on standard in. * * @param args command line arguments - * @throws IOException on failure to open/read/write files or output streams * @throws ParseException on failure to parse JSON input * @throws ConfigurationException on configuration error. */ diff --git a/src/java/org/apache/cassandra/tools/SSTableRepairedAtSetter.java b/src/java/org/apache/cassandra/tools/SSTableRepairedAtSetter.java index 233318969c37..2ddb632e3f4f 100644 --- a/src/java/org/apache/cassandra/tools/SSTableRepairedAtSetter.java +++ b/src/java/org/apache/cassandra/tools/SSTableRepairedAtSetter.java @@ -36,8 +36,9 @@ * * If you know you ran repair 2 weeks ago, you can do something like * + * {@code * sstablerepairset --is-repaired -f <(find /var/lib/cassandra/data/.../ -iname "*Data.db*" -mtime +14) - * + * } */ public class SSTableRepairedAtSetter { diff --git a/src/java/org/apache/cassandra/utils/concurrent/OpOrder.java b/src/java/org/apache/cassandra/utils/concurrent/OpOrder.java index 5cebf4413d1e..b80fe99e50a3 100644 --- a/src/java/org/apache/cassandra/utils/concurrent/OpOrder.java +++ b/src/java/org/apache/cassandra/utils/concurrent/OpOrder.java @@ -30,6 +30,7 @@ * *

    The typical usage is something like: *

    + * {@code
          public final class ExampleShared
          {
             final OpOrder order = new OpOrder();
    @@ -73,6 +74,7 @@ public void produce()
                 }
             }
         }
    + * }
      * 
    */ public class OpOrder diff --git a/src/java/org/apache/cassandra/utils/obs/OpenBitSet.java b/src/java/org/apache/cassandra/utils/obs/OpenBitSet.java index 7edf06f8ccf7..e793f6cb60b1 100644 --- a/src/java/org/apache/cassandra/utils/obs/OpenBitSet.java +++ b/src/java/org/apache/cassandra/utils/obs/OpenBitSet.java @@ -25,25 +25,30 @@ import org.apache.cassandra.db.TypeSizes; /** + *

    * An "open" BitSet implementation that allows direct access to the arrays of words * storing the bits. Derived from Lucene's OpenBitSet, but with a paged backing array * (see bits delaration, below). - *

    + *

    + *

    * Unlike java.util.bitset, the fact that bits are packed into an array of longs * is part of the interface. This allows efficient implementation of other algorithms * by someone other than the author. It also allows one to efficiently implement * alternate serialization or interchange formats. - *

    + *

    + *

    * OpenBitSet is faster than java.util.BitSet in most operations * and *much* faster at calculating cardinality of sets and results of set operations. * It can also handle sets of larger cardinality (up to 64 * 2**32-1) - *

    + *

    + *

    * The goals of OpenBitSet are the fastest implementation possible, and * maximum code reuse. Extra safety and encapsulation * may always be built on top, but if that's built in, the cost can never be removed (and * hence people re-implement their own version in order to get better performance). * If you want a "safe", totally encapsulated (and slower and limited) BitSet * class, use java.util.BitSet. + *

    */ public class OpenBitSet implements IBitSet From b5721b5120d07895a7ece90064bb7d68004c89b7 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Wed, 21 Jan 2015 22:07:56 -0500 Subject: [PATCH 245/557] fix ohc license version --- lib/licenses/{ohc-0.2.1.txt => ohc-0.3.1.txt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename lib/licenses/{ohc-0.2.1.txt => ohc-0.3.1.txt} (100%) diff --git a/lib/licenses/ohc-0.2.1.txt b/lib/licenses/ohc-0.3.1.txt similarity index 100% rename from lib/licenses/ohc-0.2.1.txt rename to lib/licenses/ohc-0.3.1.txt From 35783b9567aecb834bc639230c4b5554e151face Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Wed, 21 Jan 2015 22:26:54 -0500 Subject: [PATCH 246/557] add Robert as developer --- build.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/build.xml b/build.xml index 353eefd8e45a..b52ca574d572 100644 --- a/build.xml +++ b/build.xml @@ -401,6 +401,7 @@ + From 9fcb409f509c2d24914b9bc6f4124b5c526360bc Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Thu, 22 Jan 2015 00:27:40 -0500 Subject: [PATCH 247/557] only fetch the bound end type if the slice has an end bound --- .../org/apache/cassandra/cql3/restrictions/TokenFilter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/cassandra/cql3/restrictions/TokenFilter.java b/src/java/org/apache/cassandra/cql3/restrictions/TokenFilter.java index 4b5383b67244..bd04610afeb6 100644 --- a/src/java/org/apache/cassandra/cql3/restrictions/TokenFilter.java +++ b/src/java/org/apache/cassandra/cql3/restrictions/TokenFilter.java @@ -192,10 +192,10 @@ private static RangeSet toRangeSet(TokenRestriction slice, QueryOptions o Token start = deserializeToken(slice.bounds(START, options).get(0)); BoundType startBoundType = toBoundType(slice.isInclusive(START)); - BoundType endBoundType = toBoundType(slice.isInclusive(END)); if (slice.hasBound(END)) { + BoundType endBoundType = toBoundType(slice.isInclusive(END)); Token end = deserializeToken(slice.bounds(END, options).get(0)); if (start.equals(end) && (BoundType.OPEN == startBoundType || BoundType.OPEN == endBoundType)) From d4b23b0598132382e3b6dfb6d3bde5fec76db9e0 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Thu, 22 Jan 2015 21:40:32 -0500 Subject: [PATCH 248/557] remove use of commons-logging in favor of jcl-over-slf4j --- build.xml | 11 +++++++---- lib/jcl-over-slf4j-1.7.2.jar | Bin 0 -> 16457 bytes lib/licenses/jcl-over-slf4j-1.7.2.txt | 20 ++++++++++++++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 lib/jcl-over-slf4j-1.7.2.jar create mode 100644 lib/licenses/jcl-over-slf4j-1.7.2.txt diff --git a/build.xml b/build.xml index b52ca574d572..9bd565f62d74 100644 --- a/build.xml +++ b/build.xml @@ -330,6 +330,7 @@ + @@ -341,15 +342,16 @@ - - + + + - + @@ -417,7 +419,6 @@ artifactId="cassandra-parent" version="${version}"/> - @@ -475,6 +476,7 @@ + @@ -520,6 +522,7 @@ + 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 literal 0 HcmV?d00001 diff --git a/lib/licenses/jcl-over-slf4j-1.7.2.txt b/lib/licenses/jcl-over-slf4j-1.7.2.txt new file mode 100644 index 000000000000..dbfc76934318 --- /dev/null +++ b/lib/licenses/jcl-over-slf4j-1.7.2.txt @@ -0,0 +1,20 @@ +Copyright (c) 2004-2008 QOS.ch +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. From feda54f04911373d6b6148dadbd843894767548c Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Fri, 23 Jan 2015 16:33:59 -0600 Subject: [PATCH 249/557] fix ArrayIndexOutOfBoundsException in nodetool cfhistograms Patch by Benjamin Lerer, reviewed by jbellis for CASSANDRA-8514 --- CHANGES.txt | 1 + .../org/apache/cassandra/tools/NodeTool.java | 74 ++++++++++++------- 2 files changed, 47 insertions(+), 28 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index cdcb5ccacc3f..5bfb29c5721b 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0 + * Fix ArrayIndexOutOfBoundsException in nodetool cfhistograms (CASSANDRA-8514) * Serializing Row cache alternative, fully off heap (CASSANDRA-7438) * Duplicate rows returned when in clause has repeated values (CASSANDRA-6707) * Make CassandraException unchecked, extend RuntimeException (CASSANDRA-8560) diff --git a/src/java/org/apache/cassandra/tools/NodeTool.java b/src/java/org/apache/cassandra/tools/NodeTool.java index 24772d70929e..b67dff90cd5d 100644 --- a/src/java/org/apache/cassandra/tools/NodeTool.java +++ b/src/java/org/apache/cassandra/tools/NodeTool.java @@ -31,7 +31,9 @@ import com.google.common.base.Joiner; import com.google.common.base.Throwables; + import com.google.common.collect.*; + import com.yammer.metrics.reporting.JmxReporter; import io.airlift.command.*; @@ -44,7 +46,9 @@ import org.apache.cassandra.db.compaction.OperationType; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.locator.EndpointSnitchInfoMBean; + import org.apache.cassandra.metrics.ColumnFamilyMetrics.Sampler; + import org.apache.cassandra.net.MessagingServiceMBean; import org.apache.cassandra.repair.messages.RepairOption; import org.apache.cassandra.repair.RepairParallelism; @@ -64,6 +68,7 @@ import static java.lang.Integer.parseInt; import static java.lang.String.format; import static org.apache.commons.lang3.ArrayUtils.EMPTY_STRING_ARRAY; +import static org.apache.commons.lang3.ArrayUtils.isEmpty; import static org.apache.commons.lang3.StringUtils.*; public class NodeTool @@ -1023,46 +1028,59 @@ public void execute(NodeProbe probe) long[] estimatedRowSize = (long[]) probe.getColumnFamilyMetric(keyspace, cfname, "EstimatedRowSizeHistogram"); long[] estimatedColumnCount = (long[]) probe.getColumnFamilyMetric(keyspace, cfname, "EstimatedColumnCountHistogram"); - long[] rowSizeBucketOffsets = new EstimatedHistogram(estimatedRowSize.length).getBucketOffsets(); - long[] columnCountBucketOffsets = new EstimatedHistogram(estimatedColumnCount.length).getBucketOffsets(); - EstimatedHistogram rowSizeHist = new EstimatedHistogram(rowSizeBucketOffsets, estimatedRowSize); - EstimatedHistogram columnCountHist = new EstimatedHistogram(columnCountBucketOffsets, estimatedColumnCount); - // build arrays to store percentile values double[] estimatedRowSizePercentiles = new double[7]; double[] estimatedColumnCountPercentiles = new double[7]; double[] offsetPercentiles = new double[]{0.5, 0.75, 0.95, 0.98, 0.99}; - if (rowSizeHist.isOverflowed()) + if (isEmpty(estimatedRowSize) || isEmpty(estimatedColumnCount)) { - System.err.println(String.format("Row sizes are larger than %s, unable to calculate percentiles", rowSizeBucketOffsets[rowSizeBucketOffsets.length - 1])); - for (int i = 0; i < offsetPercentiles.length; i++) - estimatedRowSizePercentiles[i] = Double.NaN; - } - else - { - for (int i = 0; i < offsetPercentiles.length; i++) - estimatedRowSizePercentiles[i] = rowSizeHist.percentile(offsetPercentiles[i]); - } + System.err.println("No SSTables exists, unable to calculate 'Partition Size' and 'Cell Count' percentiles"); - if (columnCountHist.isOverflowed()) - { - System.err.println(String.format("Column counts are larger than %s, unable to calculate percentiles", columnCountBucketOffsets[columnCountBucketOffsets.length - 1])); - for (int i = 0; i < estimatedColumnCountPercentiles.length; i++) + for (int i = 0; i < 7; i++) + { + estimatedRowSizePercentiles[i] = Double.NaN; estimatedColumnCountPercentiles[i] = Double.NaN; + } } else { - for (int i = 0; i < offsetPercentiles.length; i++) - estimatedColumnCountPercentiles[i] = columnCountHist.percentile(offsetPercentiles[i]); - } + long[] rowSizeBucketOffsets = new EstimatedHistogram(estimatedRowSize.length).getBucketOffsets(); + long[] columnCountBucketOffsets = new EstimatedHistogram(estimatedColumnCount.length).getBucketOffsets(); + EstimatedHistogram rowSizeHist = new EstimatedHistogram(rowSizeBucketOffsets, estimatedRowSize); + EstimatedHistogram columnCountHist = new EstimatedHistogram(columnCountBucketOffsets, estimatedColumnCount); - // min value - estimatedRowSizePercentiles[5] = rowSizeHist.min(); - estimatedColumnCountPercentiles[5] = columnCountHist.min(); - // max value - estimatedRowSizePercentiles[6] = rowSizeHist.max(); - estimatedColumnCountPercentiles[6] = columnCountHist.max(); + if (rowSizeHist.isOverflowed()) + { + System.err.println(String.format("Row sizes are larger than %s, unable to calculate percentiles", rowSizeBucketOffsets[rowSizeBucketOffsets.length - 1])); + for (int i = 0; i < offsetPercentiles.length; i++) + estimatedRowSizePercentiles[i] = Double.NaN; + } + else + { + for (int i = 0; i < offsetPercentiles.length; i++) + estimatedRowSizePercentiles[i] = rowSizeHist.percentile(offsetPercentiles[i]); + } + + if (columnCountHist.isOverflowed()) + { + System.err.println(String.format("Column counts are larger than %s, unable to calculate percentiles", columnCountBucketOffsets[columnCountBucketOffsets.length - 1])); + for (int i = 0; i < estimatedColumnCountPercentiles.length; i++) + estimatedColumnCountPercentiles[i] = Double.NaN; + } + else + { + for (int i = 0; i < offsetPercentiles.length; i++) + estimatedColumnCountPercentiles[i] = columnCountHist.percentile(offsetPercentiles[i]); + } + + // min value + estimatedRowSizePercentiles[5] = rowSizeHist.min(); + estimatedColumnCountPercentiles[5] = columnCountHist.min(); + // max value + estimatedRowSizePercentiles[6] = rowSizeHist.max(); + estimatedColumnCountPercentiles[6] = columnCountHist.max(); + } String[] percentiles = new String[]{"50%", "75%", "95%", "98%", "99%", "Min", "Max"}; double[] readLatency = probe.metricPercentilesAsArray((JmxReporter.HistogramMBean) probe.getColumnFamilyMetric(keyspace, cfname, "ReadLatency")); From 1e865ed6b2b54bb26506a3dd5fa52f799174d9db Mon Sep 17 00:00:00 2001 From: Robert Stupp Date: Sun, 25 Jan 2015 12:33:13 +0100 Subject: [PATCH 250/557] ninja - fix output of swap-disabled (was accidentally reverted) --- src/java/org/apache/cassandra/utils/SigarLibrary.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/cassandra/utils/SigarLibrary.java b/src/java/org/apache/cassandra/utils/SigarLibrary.java index fb3d3ae40222..bcd40212ad5f 100644 --- a/src/java/org/apache/cassandra/utils/SigarLibrary.java +++ b/src/java/org/apache/cassandra/utils/SigarLibrary.java @@ -165,7 +165,7 @@ public void warnIfRunningInDegradedMode() if (swapEnabled || !goodAddressSpace || !goodFileLimits || !goodProcNumber) { logger.warn("Cassandra server running in degraded mode. Is swap disabled? : {}, Address space adequate? : {}, " + - " nofile limit adequate? : {}, nproc limit adequate? : {} ", swapEnabled, goodAddressSpace, + " nofile limit adequate? : {}, nproc limit adequate? : {} ", !swapEnabled, goodAddressSpace, goodFileLimits, goodProcNumber ); } else From b30cdd9a7e1178014ae90c01795e680b3041c0b7 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Sun, 25 Jan 2015 22:03:22 -0500 Subject: [PATCH 251/557] import cleanups --- src/java/org/apache/cassandra/client/RingCache.java | 1 - src/java/org/apache/cassandra/cql3/ResultSet.java | 1 - src/java/org/apache/cassandra/cql3/UntypedResultSet.java | 1 - src/java/org/apache/cassandra/cql3/functions/Function.java | 1 - src/java/org/apache/cassandra/cql3/functions/UDHelper.java | 1 - .../cql3/restrictions/SingleColumnRestriction.java | 3 --- .../cassandra/cql3/statements/CreateIndexStatement.java | 1 - src/java/org/apache/cassandra/db/AbstractCell.java | 1 - src/java/org/apache/cassandra/db/AtomDeserializer.java | 1 - src/java/org/apache/cassandra/db/CollationController.java | 2 -- .../org/apache/cassandra/db/ColumnFamilySerializer.java | 1 - src/java/org/apache/cassandra/db/ConsistencyLevel.java | 1 - src/java/org/apache/cassandra/db/Directories.java | 1 - src/java/org/apache/cassandra/db/OnDiskAtom.java | 1 - src/java/org/apache/cassandra/db/RangeTombstone.java | 1 - .../cassandra/db/compaction/AbstractCompactedRow.java | 1 - .../org/apache/cassandra/db/compaction/CompactionTask.java | 1 - .../apache/cassandra/db/compaction/LeveledManifest.java | 1 - src/java/org/apache/cassandra/db/compaction/Upgrader.java | 1 - .../org/apache/cassandra/db/composites/AbstractCType.java | 2 -- src/java/org/apache/cassandra/db/composites/CType.java | 1 - .../org/apache/cassandra/db/filter/SliceQueryFilter.java | 1 - .../apache/cassandra/db/index/SecondaryIndexSearcher.java | 2 -- src/java/org/apache/cassandra/dht/ExcludingBounds.java | 1 - .../apache/cassandra/hadoop/ColumnFamilyOutputFormat.java | 1 - src/java/org/apache/cassandra/hadoop/ConfigHelper.java | 1 - src/java/org/apache/cassandra/io/ISSTableSerializer.java | 1 - .../org/apache/cassandra/io/compress/LZ4Compressor.java | 1 - .../org/apache/cassandra/io/compress/SnappyCompressor.java | 1 - src/java/org/apache/cassandra/io/sstable/Descriptor.java | 1 - src/java/org/apache/cassandra/io/sstable/IndexHelper.java | 2 -- .../org/apache/cassandra/io/sstable/SSTableLoader.java | 1 - .../cassandra/io/sstable/SSTableSimpleUnsortedWriter.java | 3 --- .../cassandra/io/sstable/format/big/BigTableReader.java | 1 - .../cassandra/io/sstable/format/big/BigTableWriter.java | 4 ---- .../cassandra/io/sstable/metadata/CompactionMetadata.java | 1 - .../io/sstable/metadata/IMetadataComponentSerializer.java | 1 - .../cassandra/io/sstable/metadata/StatsMetadata.java | 1 - .../cassandra/io/sstable/metadata/ValidationMetadata.java | 1 - src/java/org/apache/cassandra/io/util/FileDataInput.java | 1 - src/java/org/apache/cassandra/io/util/FileUtils.java | 1 - .../org/apache/cassandra/io/util/MmappedSegmentedFile.java | 1 - .../apache/cassandra/repair/RepairMessageVerbHandler.java | 1 - src/java/org/apache/cassandra/repair/RepairSession.java | 1 - src/java/org/apache/cassandra/service/QueryState.java | 1 - src/java/org/apache/cassandra/service/ReadCallback.java | 2 -- .../apache/cassandra/service/pager/SliceQueryPager.java | 1 - src/java/org/apache/cassandra/streaming/StreamReader.java | 1 - .../org/apache/cassandra/streaming/StreamReceiveTask.java | 2 -- .../streaming/compress/CompressedInputStream.java | 2 -- src/java/org/apache/cassandra/tools/NodeProbe.java | 7 ------- src/java/org/apache/cassandra/tracing/Tracing.java | 2 -- .../apache/cassandra/transport/messages/ResultMessage.java | 1 - src/java/org/apache/cassandra/utils/FBUtilities.java | 2 -- src/java/org/apache/cassandra/utils/MurmurHash.java | 2 -- .../cassandra/concurrent/LongSharedExecutorPoolTest.java | 2 -- test/long/org/apache/cassandra/cql3/CorruptionTest.java | 1 - test/pig/org/apache/pig/test/MiniCluster.java | 1 - test/unit/org/apache/cassandra/SchemaLoader.java | 1 - test/unit/org/apache/cassandra/config/KSMetaDataTest.java | 1 - test/unit/org/apache/cassandra/cql3/BatchTests.java | 1 - test/unit/org/apache/cassandra/cql3/DeleteTest.java | 3 --- .../cassandra/cql3/SecondaryIndexOnMapEntriesTest.java | 1 - test/unit/org/apache/cassandra/cql3/TypeTest.java | 2 -- test/unit/org/apache/cassandra/db/CommitLogTest.java | 1 - test/unit/org/apache/cassandra/db/CounterCellTest.java | 1 - .../apache/cassandra/db/SecondaryIndexCellSizeTest.java | 1 - test/unit/org/apache/cassandra/gms/SerializationsTest.java | 1 - .../org/apache/cassandra/io/compress/CompressorTest.java | 1 - .../cassandra/io/util/BufferedRandomAccessFileTest.java | 1 - .../org/apache/cassandra/locator/CloudstackSnitchTest.java | 4 ---- .../apache/cassandra/locator/GoogleCloudSnitchTest.java | 4 ---- test/unit/org/apache/cassandra/repair/ValidatorTest.java | 1 - .../org/apache/cassandra/service/SerializationsTest.java | 1 - .../apache/cassandra/streaming/StreamTransferTaskTest.java | 1 - test/unit/org/apache/cassandra/utils/BloomFilterTest.java | 1 - .../org/apache/cassandra/utils/ByteBufferUtilTest.java | 3 --- .../apache/cassandra/utils/JVMStabilityInspectorTest.java | 5 ----- test/unit/org/apache/cassandra/utils/MerkleTreeTest.java | 1 - .../org/apache/cassandra/utils/SerializationsTest.java | 1 - .../org/apache/cassandra/utils/StreamingHistogramTest.java | 2 -- test/unit/org/apache/cassandra/utils/TopKSamplerTest.java | 2 -- .../src/org/apache/cassandra/stress/StressMetrics.java | 1 - .../cassandra/stress/generate/PartitionIterator.java | 1 - .../stress/operations/SampledOpDistributionFactory.java | 1 - .../stress/operations/predefined/CqlOperation.java | 1 - 86 files changed, 127 deletions(-) diff --git a/src/java/org/apache/cassandra/client/RingCache.java b/src/java/org/apache/cassandra/client/RingCache.java index 1a9ff0b4f75d..094cf4fb3adf 100644 --- a/src/java/org/apache/cassandra/client/RingCache.java +++ b/src/java/org/apache/cassandra/client/RingCache.java @@ -28,7 +28,6 @@ import org.apache.cassandra.dht.Token; import org.apache.cassandra.hadoop.ConfigHelper; import org.apache.cassandra.thrift.Cassandra; -import org.apache.cassandra.thrift.InvalidRequestException; import org.apache.cassandra.thrift.TokenRange; import org.apache.hadoop.conf.Configuration; import org.apache.thrift.TException; diff --git a/src/java/org/apache/cassandra/cql3/ResultSet.java b/src/java/org/apache/cassandra/cql3/ResultSet.java index c8c38698fbf5..75a9c8e004c7 100644 --- a/src/java/org/apache/cassandra/cql3/ResultSet.java +++ b/src/java/org/apache/cassandra/cql3/ResultSet.java @@ -24,7 +24,6 @@ import org.apache.cassandra.transport.*; import org.apache.cassandra.db.marshal.AbstractType; -import org.apache.cassandra.db.marshal.LongType; import org.apache.cassandra.db.marshal.ReversedType; import org.apache.cassandra.thrift.Column; import org.apache.cassandra.thrift.CqlMetadata; diff --git a/src/java/org/apache/cassandra/cql3/UntypedResultSet.java b/src/java/org/apache/cassandra/cql3/UntypedResultSet.java index 64fd60d7128d..657d536875b2 100644 --- a/src/java/org/apache/cassandra/cql3/UntypedResultSet.java +++ b/src/java/org/apache/cassandra/cql3/UntypedResultSet.java @@ -26,7 +26,6 @@ import org.apache.cassandra.cql3.statements.SelectStatement; import org.apache.cassandra.db.marshal.*; -import org.apache.cassandra.exceptions.*; import org.apache.cassandra.service.pager.QueryPager; /** a utility for doing internal cql-based queries */ diff --git a/src/java/org/apache/cassandra/cql3/functions/Function.java b/src/java/org/apache/cassandra/cql3/functions/Function.java index 4d2b99351bc1..1b7952a51193 100644 --- a/src/java/org/apache/cassandra/cql3/functions/Function.java +++ b/src/java/org/apache/cassandra/cql3/functions/Function.java @@ -21,7 +21,6 @@ import org.apache.cassandra.db.marshal.AbstractType; -import org.apache.cassandra.exceptions.InvalidRequestException; import org.github.jamm.Unmetered; @Unmetered diff --git a/src/java/org/apache/cassandra/cql3/functions/UDHelper.java b/src/java/org/apache/cassandra/cql3/functions/UDHelper.java index f4b38095391d..af62c5a5732c 100644 --- a/src/java/org/apache/cassandra/cql3/functions/UDHelper.java +++ b/src/java/org/apache/cassandra/cql3/functions/UDHelper.java @@ -20,7 +20,6 @@ import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.reflect.Method; -import java.nio.ByteBuffer; import java.util.*; import org.slf4j.Logger; diff --git a/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestriction.java b/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestriction.java index 44a9e6847534..4acd34b035bf 100644 --- a/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestriction.java +++ b/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestriction.java @@ -19,10 +19,7 @@ import java.nio.ByteBuffer; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; -import java.util.Deque; -import java.util.LinkedList; import java.util.List; import org.apache.cassandra.config.ColumnDefinition; diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateIndexStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateIndexStatement.java index 4ae31d6c2027..c940660eb5ff 100644 --- a/src/java/org/apache/cassandra/cql3/statements/CreateIndexStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/CreateIndexStatement.java @@ -29,7 +29,6 @@ import org.apache.cassandra.config.ColumnDefinition; import org.apache.cassandra.config.IndexType; import org.apache.cassandra.config.Schema; -import org.apache.cassandra.db.index.SecondaryIndex; import org.apache.cassandra.db.marshal.MapType; import org.apache.cassandra.exceptions.*; import org.apache.cassandra.cql3.*; diff --git a/src/java/org/apache/cassandra/db/AbstractCell.java b/src/java/org/apache/cassandra/db/AbstractCell.java index de861263a756..814b8c6d58df 100644 --- a/src/java/org/apache/cassandra/db/AbstractCell.java +++ b/src/java/org/apache/cassandra/db/AbstractCell.java @@ -30,7 +30,6 @@ import org.apache.cassandra.db.composites.CellNameType; import org.apache.cassandra.db.context.CounterContext; import org.apache.cassandra.db.marshal.AbstractType; -import org.apache.cassandra.io.sstable.Descriptor; import org.apache.cassandra.io.sstable.format.Version; import org.apache.cassandra.serializers.MarshalException; import org.apache.cassandra.utils.FBUtilities; diff --git a/src/java/org/apache/cassandra/db/AtomDeserializer.java b/src/java/org/apache/cassandra/db/AtomDeserializer.java index c71321ce92f8..74f1946347f7 100644 --- a/src/java/org/apache/cassandra/db/AtomDeserializer.java +++ b/src/java/org/apache/cassandra/db/AtomDeserializer.java @@ -23,7 +23,6 @@ import org.apache.cassandra.db.composites.CellName; import org.apache.cassandra.db.composites.CellNameType; import org.apache.cassandra.db.composites.Composite; -import org.apache.cassandra.io.sstable.Descriptor; import org.apache.cassandra.io.sstable.format.Version; /** diff --git a/src/java/org/apache/cassandra/db/CollationController.java b/src/java/org/apache/cassandra/db/CollationController.java index e7bbd3ed6a58..d266351bccd7 100644 --- a/src/java/org/apache/cassandra/db/CollationController.java +++ b/src/java/org/apache/cassandra/db/CollationController.java @@ -28,11 +28,9 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Iterators; -import net.nicoulaj.compilecommand.annotations.Inline; import org.apache.cassandra.concurrent.Stage; import org.apache.cassandra.concurrent.StageManager; import org.apache.cassandra.db.columniterator.OnDiskAtomIterator; -import org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy; import org.apache.cassandra.db.composites.CellName; import org.apache.cassandra.db.filter.NamesQueryFilter; import org.apache.cassandra.db.filter.QueryFilter; diff --git a/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java b/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java index 29866d612438..928c21f13471 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java @@ -24,7 +24,6 @@ import org.apache.cassandra.config.Schema; import org.apache.cassandra.io.ISSTableSerializer; import org.apache.cassandra.io.IVersionedSerializer; -import org.apache.cassandra.io.sstable.Descriptor; import org.apache.cassandra.io.sstable.format.Version; import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.net.MessagingService; diff --git a/src/java/org/apache/cassandra/db/ConsistencyLevel.java b/src/java/org/apache/cassandra/db/ConsistencyLevel.java index 18a469f13abf..d49d66aee525 100644 --- a/src/java/org/apache/cassandra/db/ConsistencyLevel.java +++ b/src/java/org/apache/cassandra/db/ConsistencyLevel.java @@ -25,7 +25,6 @@ import java.util.Map; import com.google.common.collect.Iterables; -import net.nicoulaj.compilecommand.annotations.Inline; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/java/org/apache/cassandra/db/Directories.java b/src/java/org/apache/cassandra/db/Directories.java index fa9b3206e783..324664746833 100644 --- a/src/java/org/apache/cassandra/db/Directories.java +++ b/src/java/org/apache/cassandra/db/Directories.java @@ -48,7 +48,6 @@ import org.apache.cassandra.io.FSWriteError; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.io.sstable.*; -import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.Pair; diff --git a/src/java/org/apache/cassandra/db/OnDiskAtom.java b/src/java/org/apache/cassandra/db/OnDiskAtom.java index f97ca425b630..f5eddb94764b 100644 --- a/src/java/org/apache/cassandra/db/OnDiskAtom.java +++ b/src/java/org/apache/cassandra/db/OnDiskAtom.java @@ -25,7 +25,6 @@ import org.apache.cassandra.db.composites.CellNameType; import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.io.ISSTableSerializer; -import org.apache.cassandra.io.sstable.Descriptor; import org.apache.cassandra.io.sstable.format.Version; import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.serializers.MarshalException; diff --git a/src/java/org/apache/cassandra/db/RangeTombstone.java b/src/java/org/apache/cassandra/db/RangeTombstone.java index 4a0037b2224c..c69ea8c9b4c7 100644 --- a/src/java/org/apache/cassandra/db/RangeTombstone.java +++ b/src/java/org/apache/cassandra/db/RangeTombstone.java @@ -26,7 +26,6 @@ import org.apache.cassandra.db.composites.CType; import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.io.ISSTableSerializer; -import org.apache.cassandra.io.sstable.Descriptor; import org.apache.cassandra.io.sstable.format.Version; import org.apache.cassandra.io.util.DataOutputBuffer; import org.apache.cassandra.io.util.DataOutputPlus; diff --git a/src/java/org/apache/cassandra/db/compaction/AbstractCompactedRow.java b/src/java/org/apache/cassandra/db/compaction/AbstractCompactedRow.java index f88fe92adf9f..16b5fac82789 100644 --- a/src/java/org/apache/cassandra/db/compaction/AbstractCompactedRow.java +++ b/src/java/org/apache/cassandra/db/compaction/AbstractCompactedRow.java @@ -24,7 +24,6 @@ import org.apache.cassandra.db.DecoratedKey; import org.apache.cassandra.db.RowIndexEntry; import org.apache.cassandra.io.sstable.ColumnStats; -import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.io.util.SequentialWriter; /** diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionTask.java b/src/java/org/apache/cassandra/db/compaction/CompactionTask.java index dfbdc229468d..08897b37c34a 100644 --- a/src/java/org/apache/cassandra/db/compaction/CompactionTask.java +++ b/src/java/org/apache/cassandra/db/compaction/CompactionTask.java @@ -18,7 +18,6 @@ package org.apache.cassandra.db.compaction; import java.io.File; -import java.io.IOException; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; diff --git a/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java b/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java index cbc65f4b2d5f..94bb8021d0ba 100644 --- a/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java +++ b/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java @@ -38,7 +38,6 @@ import org.apache.cassandra.dht.Bounds; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; -import org.apache.cassandra.io.sstable.*; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.Pair; diff --git a/src/java/org/apache/cassandra/db/compaction/Upgrader.java b/src/java/org/apache/cassandra/db/compaction/Upgrader.java index 52739de06b56..7badd306f6d8 100644 --- a/src/java/org/apache/cassandra/db/compaction/Upgrader.java +++ b/src/java/org/apache/cassandra/db/compaction/Upgrader.java @@ -30,7 +30,6 @@ import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.io.sstable.format.SSTableWriter; import org.apache.cassandra.io.sstable.metadata.MetadataCollector; -import org.apache.cassandra.utils.CloseableIterator; import org.apache.cassandra.utils.OutputHandler; public class Upgrader diff --git a/src/java/org/apache/cassandra/db/composites/AbstractCType.java b/src/java/org/apache/cassandra/db/composites/AbstractCType.java index 1df73feef49d..a982280e7885 100644 --- a/src/java/org/apache/cassandra/db/composites/AbstractCType.java +++ b/src/java/org/apache/cassandra/db/composites/AbstractCType.java @@ -26,13 +26,11 @@ import org.apache.cassandra.db.DeletionInfo; import org.apache.cassandra.db.NativeCell; import org.apache.cassandra.db.RangeTombstone; -import org.apache.cassandra.db.RowIndexEntry; import org.apache.cassandra.db.TypeSizes; import org.apache.cassandra.db.filter.ColumnSlice; import org.apache.cassandra.db.filter.SliceQueryFilter; import org.apache.cassandra.db.marshal.AbstractCompositeType; import org.apache.cassandra.db.marshal.AbstractType; -import org.apache.cassandra.io.ISerializer; import org.apache.cassandra.io.IVersionedSerializer; import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.utils.ByteBufferUtil; diff --git a/src/java/org/apache/cassandra/db/composites/CType.java b/src/java/org/apache/cassandra/db/composites/CType.java index 3844342f242a..7f703138c832 100644 --- a/src/java/org/apache/cassandra/db/composites/CType.java +++ b/src/java/org/apache/cassandra/db/composites/CType.java @@ -24,7 +24,6 @@ import org.apache.cassandra.db.DeletionInfo; import org.apache.cassandra.db.RangeTombstone; -import org.apache.cassandra.db.RowIndexEntry; import org.apache.cassandra.db.filter.ColumnSlice; import org.apache.cassandra.db.filter.SliceQueryFilter; import org.apache.cassandra.db.marshal.AbstractType; diff --git a/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java b/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java index 453191ec42b3..f984f9696a5b 100644 --- a/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java +++ b/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java @@ -38,7 +38,6 @@ import org.apache.cassandra.io.IVersionedSerializer; import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.io.util.FileDataInput; -import org.apache.cassandra.service.StorageService; import org.apache.cassandra.tracing.Tracing; public class SliceQueryFilter implements IDiskAtomFilter diff --git a/src/java/org/apache/cassandra/db/index/SecondaryIndexSearcher.java b/src/java/org/apache/cassandra/db/index/SecondaryIndexSearcher.java index 93e064357f40..b9ccd8e7812e 100644 --- a/src/java/org/apache/cassandra/db/index/SecondaryIndexSearcher.java +++ b/src/java/org/apache/cassandra/db/index/SecondaryIndexSearcher.java @@ -18,14 +18,12 @@ package org.apache.cassandra.db.index; import java.nio.ByteBuffer; -import java.nio.charset.CharacterCodingException; import java.util.*; import org.apache.cassandra.db.*; import org.apache.cassandra.db.filter.ExtendedFilter; import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.tracing.Tracing; -import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; public abstract class SecondaryIndexSearcher diff --git a/src/java/org/apache/cassandra/dht/ExcludingBounds.java b/src/java/org/apache/cassandra/dht/ExcludingBounds.java index f4f313d75ff1..8a89d14efd21 100644 --- a/src/java/org/apache/cassandra/dht/ExcludingBounds.java +++ b/src/java/org/apache/cassandra/dht/ExcludingBounds.java @@ -21,7 +21,6 @@ import java.util.List; import org.apache.cassandra.db.RowPosition; -import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.Pair; /** diff --git a/src/java/org/apache/cassandra/hadoop/ColumnFamilyOutputFormat.java b/src/java/org/apache/cassandra/hadoop/ColumnFamilyOutputFormat.java index c5489c6adda1..2990bf345959 100644 --- a/src/java/org/apache/cassandra/hadoop/ColumnFamilyOutputFormat.java +++ b/src/java/org/apache/cassandra/hadoop/ColumnFamilyOutputFormat.java @@ -18,7 +18,6 @@ package org.apache.cassandra.hadoop; -import java.io.IOException; import java.nio.ByteBuffer; import java.util.List; import org.apache.cassandra.thrift.*; diff --git a/src/java/org/apache/cassandra/hadoop/ConfigHelper.java b/src/java/org/apache/cassandra/hadoop/ConfigHelper.java index 69504b109475..b956e237e5aa 100644 --- a/src/java/org/apache/cassandra/hadoop/ConfigHelper.java +++ b/src/java/org/apache/cassandra/hadoop/ConfigHelper.java @@ -26,7 +26,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.io.compress.CompressionParameters; import org.apache.cassandra.thrift.*; diff --git a/src/java/org/apache/cassandra/io/ISSTableSerializer.java b/src/java/org/apache/cassandra/io/ISSTableSerializer.java index 28346627f77a..96a38acbfaf8 100644 --- a/src/java/org/apache/cassandra/io/ISSTableSerializer.java +++ b/src/java/org/apache/cassandra/io/ISSTableSerializer.java @@ -20,7 +20,6 @@ import java.io.DataInput; import java.io.IOException; -import org.apache.cassandra.io.sstable.Descriptor; import org.apache.cassandra.io.sstable.format.Version; import org.apache.cassandra.io.util.DataOutputPlus; diff --git a/src/java/org/apache/cassandra/io/compress/LZ4Compressor.java b/src/java/org/apache/cassandra/io/compress/LZ4Compressor.java index f458cb6e32e5..f32f2663204f 100644 --- a/src/java/org/apache/cassandra/io/compress/LZ4Compressor.java +++ b/src/java/org/apache/cassandra/io/compress/LZ4Compressor.java @@ -26,7 +26,6 @@ import net.jpountz.lz4.LZ4Exception; import net.jpountz.lz4.LZ4Factory; -import org.apache.cassandra.utils.FastByteOperations; public class LZ4Compressor implements ICompressor { diff --git a/src/java/org/apache/cassandra/io/compress/SnappyCompressor.java b/src/java/org/apache/cassandra/io/compress/SnappyCompressor.java index f5a2062c7606..0094042c37fb 100644 --- a/src/java/org/apache/cassandra/io/compress/SnappyCompressor.java +++ b/src/java/org/apache/cassandra/io/compress/SnappyCompressor.java @@ -23,7 +23,6 @@ import java.util.Map; import java.util.Set; -import org.apache.cassandra.utils.ByteBufferUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xerial.snappy.Snappy; diff --git a/src/java/org/apache/cassandra/io/sstable/Descriptor.java b/src/java/org/apache/cassandra/io/sstable/Descriptor.java index 03522c32abf0..9f259fe0605c 100644 --- a/src/java/org/apache/cassandra/io/sstable/Descriptor.java +++ b/src/java/org/apache/cassandra/io/sstable/Descriptor.java @@ -33,7 +33,6 @@ import org.apache.cassandra.io.sstable.metadata.LegacyMetadataSerializer; import org.apache.cassandra.io.sstable.metadata.MetadataSerializer; import org.apache.cassandra.utils.Pair; -import org.apache.commons.lang.StringUtils; import static org.apache.cassandra.io.sstable.Component.separator; diff --git a/src/java/org/apache/cassandra/io/sstable/IndexHelper.java b/src/java/org/apache/cassandra/io/sstable/IndexHelper.java index 4518e2391e5d..3d304c5360d6 100644 --- a/src/java/org/apache/cassandra/io/sstable/IndexHelper.java +++ b/src/java/org/apache/cassandra/io/sstable/IndexHelper.java @@ -18,7 +18,6 @@ package org.apache.cassandra.io.sstable; import java.io.*; -import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -29,7 +28,6 @@ import org.apache.cassandra.io.ISerializer; import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.io.util.FileDataInput; -import org.apache.cassandra.io.util.FileMark; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.utils.*; diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableLoader.java b/src/java/org/apache/cassandra/io/sstable/SSTableLoader.java index 2a1b66f46e75..99f69b8070b7 100644 --- a/src/java/org/apache/cassandra/io/sstable/SSTableLoader.java +++ b/src/java/org/apache/cassandra/io/sstable/SSTableLoader.java @@ -27,7 +27,6 @@ import com.google.common.collect.Multimap; import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.config.Config; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.dht.Range; diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java b/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java index 4c2e409a0685..ff75e0d57d06 100644 --- a/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java +++ b/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java @@ -27,7 +27,6 @@ import com.google.common.base.Throwables; import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.ArrayBackedSortedColumns; import org.apache.cassandra.db.Cell; import org.apache.cassandra.db.ColumnFamily; @@ -36,9 +35,7 @@ import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.io.compress.CompressionParameters; -import org.apache.cassandra.io.sstable.format.SSTableFormat; import org.apache.cassandra.io.sstable.format.SSTableWriter; -import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.utils.JVMStabilityInspector; /** diff --git a/src/java/org/apache/cassandra/io/sstable/format/big/BigTableReader.java b/src/java/org/apache/cassandra/io/sstable/format/big/BigTableReader.java index fc346d1c2d2d..4fcbc3162dcf 100644 --- a/src/java/org/apache/cassandra/io/sstable/format/big/BigTableReader.java +++ b/src/java/org/apache/cassandra/io/sstable/format/big/BigTableReader.java @@ -40,7 +40,6 @@ import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.tracing.Tracing; import org.apache.cassandra.utils.ByteBufferUtil; -import org.apache.cassandra.utils.Pair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/java/org/apache/cassandra/io/sstable/format/big/BigTableWriter.java b/src/java/org/apache/cassandra/io/sstable/format/big/BigTableWriter.java index 868ee9fb0c89..8b9a88fccd08 100644 --- a/src/java/org/apache/cassandra/io/sstable/format/big/BigTableWriter.java +++ b/src/java/org/apache/cassandra/io/sstable/format/big/BigTableWriter.java @@ -17,7 +17,6 @@ */ package org.apache.cassandra.io.sstable.format.big; -import java.io.Closeable; import java.io.DataInput; import java.io.File; import java.io.FileOutputStream; @@ -34,7 +33,6 @@ import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.io.sstable.format.SSTableWriter; import org.apache.cassandra.io.sstable.format.Version; -import org.apache.cassandra.io.util.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -54,8 +52,6 @@ import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.io.util.SegmentedFile; import org.apache.cassandra.io.util.SequentialWriter; -import org.apache.cassandra.service.ActiveRepairService; -import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.FilterFactory; diff --git a/src/java/org/apache/cassandra/io/sstable/metadata/CompactionMetadata.java b/src/java/org/apache/cassandra/io/sstable/metadata/CompactionMetadata.java index dd879c459ef6..ed1f327afdf7 100644 --- a/src/java/org/apache/cassandra/io/sstable/metadata/CompactionMetadata.java +++ b/src/java/org/apache/cassandra/io/sstable/metadata/CompactionMetadata.java @@ -26,7 +26,6 @@ import com.clearspring.analytics.stream.cardinality.ICardinality; import org.apache.cassandra.db.TypeSizes; -import org.apache.cassandra.io.sstable.Descriptor; import org.apache.cassandra.io.sstable.format.Version; import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.utils.ByteBufferUtil; diff --git a/src/java/org/apache/cassandra/io/sstable/metadata/IMetadataComponentSerializer.java b/src/java/org/apache/cassandra/io/sstable/metadata/IMetadataComponentSerializer.java index 018d4a028099..dc8fbdf53d37 100644 --- a/src/java/org/apache/cassandra/io/sstable/metadata/IMetadataComponentSerializer.java +++ b/src/java/org/apache/cassandra/io/sstable/metadata/IMetadataComponentSerializer.java @@ -20,7 +20,6 @@ import java.io.DataInput; import java.io.IOException; -import org.apache.cassandra.io.sstable.Descriptor; import org.apache.cassandra.io.sstable.format.Version; import org.apache.cassandra.io.util.DataOutputPlus; diff --git a/src/java/org/apache/cassandra/io/sstable/metadata/StatsMetadata.java b/src/java/org/apache/cassandra/io/sstable/metadata/StatsMetadata.java index a501518ab4f5..f2eb1af1f8ee 100644 --- a/src/java/org/apache/cassandra/io/sstable/metadata/StatsMetadata.java +++ b/src/java/org/apache/cassandra/io/sstable/metadata/StatsMetadata.java @@ -29,7 +29,6 @@ import org.apache.cassandra.db.TypeSizes; import org.apache.cassandra.db.commitlog.ReplayPosition; -import org.apache.cassandra.io.sstable.Descriptor; import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.EstimatedHistogram; diff --git a/src/java/org/apache/cassandra/io/sstable/metadata/ValidationMetadata.java b/src/java/org/apache/cassandra/io/sstable/metadata/ValidationMetadata.java index aed682028a49..603732b40103 100644 --- a/src/java/org/apache/cassandra/io/sstable/metadata/ValidationMetadata.java +++ b/src/java/org/apache/cassandra/io/sstable/metadata/ValidationMetadata.java @@ -21,7 +21,6 @@ import java.io.IOException; import org.apache.cassandra.db.TypeSizes; -import org.apache.cassandra.io.sstable.Descriptor; import org.apache.cassandra.io.sstable.format.Version; import org.apache.cassandra.io.util.DataOutputPlus; diff --git a/src/java/org/apache/cassandra/io/util/FileDataInput.java b/src/java/org/apache/cassandra/io/util/FileDataInput.java index 55809ad1bf3c..d94075c4fc30 100644 --- a/src/java/org/apache/cassandra/io/util/FileDataInput.java +++ b/src/java/org/apache/cassandra/io/util/FileDataInput.java @@ -20,7 +20,6 @@ import java.io.Closeable; import java.io.DataInput; import java.io.IOException; -import java.io.InputStream; import java.nio.ByteBuffer; public interface FileDataInput extends DataInput, Closeable diff --git a/src/java/org/apache/cassandra/io/util/FileUtils.java b/src/java/org/apache/cassandra/io/util/FileUtils.java index 837cc6a53b3d..ef9d23b68560 100644 --- a/src/java/org/apache/cassandra/io/util/FileUtils.java +++ b/src/java/org/apache/cassandra/io/util/FileUtils.java @@ -19,7 +19,6 @@ import java.io.*; import java.nio.ByteBuffer; -import java.nio.MappedByteBuffer; import java.nio.file.AtomicMoveNotSupportedException; import java.nio.file.Files; import java.nio.file.Path; diff --git a/src/java/org/apache/cassandra/io/util/MmappedSegmentedFile.java b/src/java/org/apache/cassandra/io/util/MmappedSegmentedFile.java index 6f2def0a4668..bf120a34767b 100644 --- a/src/java/org/apache/cassandra/io/util/MmappedSegmentedFile.java +++ b/src/java/org/apache/cassandra/io/util/MmappedSegmentedFile.java @@ -30,7 +30,6 @@ import org.apache.cassandra.io.FSReadError; import org.apache.cassandra.io.sstable.format.SSTableWriter; import org.apache.cassandra.utils.JVMStabilityInspector; -import sun.nio.ch.DirectBuffer; public class MmappedSegmentedFile extends SegmentedFile { diff --git a/src/java/org/apache/cassandra/repair/RepairMessageVerbHandler.java b/src/java/org/apache/cassandra/repair/RepairMessageVerbHandler.java index be685cded54d..847f667017fc 100644 --- a/src/java/org/apache/cassandra/repair/RepairMessageVerbHandler.java +++ b/src/java/org/apache/cassandra/repair/RepairMessageVerbHandler.java @@ -18,7 +18,6 @@ package org.apache.cassandra.repair; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Set; diff --git a/src/java/org/apache/cassandra/repair/RepairSession.java b/src/java/org/apache/cassandra/repair/RepairSession.java index 9a8f645a304f..98da14f7458c 100644 --- a/src/java/org/apache/cassandra/repair/RepairSession.java +++ b/src/java/org/apache/cassandra/repair/RepairSession.java @@ -22,7 +22,6 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicBoolean; import com.google.common.collect.Lists; diff --git a/src/java/org/apache/cassandra/service/QueryState.java b/src/java/org/apache/cassandra/service/QueryState.java index 9a709ff44a8b..e5c21f40c510 100644 --- a/src/java/org/apache/cassandra/service/QueryState.java +++ b/src/java/org/apache/cassandra/service/QueryState.java @@ -21,7 +21,6 @@ import java.util.concurrent.ThreadLocalRandom; import org.apache.cassandra.tracing.Tracing; -import org.apache.cassandra.utils.FBUtilities; /** * Represents the state related to a given query. diff --git a/src/java/org/apache/cassandra/service/ReadCallback.java b/src/java/org/apache/cassandra/service/ReadCallback.java index 937156857f86..40ccf86332af 100644 --- a/src/java/org/apache/cassandra/service/ReadCallback.java +++ b/src/java/org/apache/cassandra/service/ReadCallback.java @@ -34,10 +34,8 @@ import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.exceptions.ReadFailureException; import org.apache.cassandra.exceptions.ReadTimeoutException; -import org.apache.cassandra.exceptions.RequestExecutionException; import org.apache.cassandra.exceptions.UnavailableException; import org.apache.cassandra.metrics.ReadRepairMetrics; -import org.apache.cassandra.net.IAsyncCallback; import org.apache.cassandra.net.IAsyncCallbackWithFailure; import org.apache.cassandra.net.MessageIn; import org.apache.cassandra.net.MessageOut; diff --git a/src/java/org/apache/cassandra/service/pager/SliceQueryPager.java b/src/java/org/apache/cassandra/service/pager/SliceQueryPager.java index 05c05b16b661..745beee5c496 100644 --- a/src/java/org/apache/cassandra/service/pager/SliceQueryPager.java +++ b/src/java/org/apache/cassandra/service/pager/SliceQueryPager.java @@ -22,7 +22,6 @@ import java.util.List; import org.apache.cassandra.db.*; -import org.apache.cassandra.db.composites.CellName; import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.db.filter.SliceQueryFilter; import org.apache.cassandra.exceptions.RequestValidationException; diff --git a/src/java/org/apache/cassandra/streaming/StreamReader.java b/src/java/org/apache/cassandra/streaming/StreamReader.java index 6144afb9a903..0f3ebb3765ee 100644 --- a/src/java/org/apache/cassandra/streaming/StreamReader.java +++ b/src/java/org/apache/cassandra/streaming/StreamReader.java @@ -27,7 +27,6 @@ import org.apache.cassandra.io.sstable.format.SSTableFormat; import org.apache.cassandra.io.sstable.format.SSTableWriter; import org.apache.cassandra.io.sstable.format.Version; -import org.apache.cassandra.io.util.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/java/org/apache/cassandra/streaming/StreamReceiveTask.java b/src/java/org/apache/cassandra/streaming/StreamReceiveTask.java index 0efcc93ec95e..d0187863bdfa 100644 --- a/src/java/org/apache/cassandra/streaming/StreamReceiveTask.java +++ b/src/java/org/apache/cassandra/streaming/StreamReceiveTask.java @@ -33,8 +33,6 @@ import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.io.sstable.format.SSTableWriter; -import org.apache.cassandra.service.StorageService; -import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.Pair; /** diff --git a/src/java/org/apache/cassandra/streaming/compress/CompressedInputStream.java b/src/java/org/apache/cassandra/streaming/compress/CompressedInputStream.java index 54f6edae190c..872afcd0a727 100644 --- a/src/java/org/apache/cassandra/streaming/compress/CompressedInputStream.java +++ b/src/java/org/apache/cassandra/streaming/compress/CompressedInputStream.java @@ -25,14 +25,12 @@ import java.util.concurrent.BlockingQueue; import java.util.concurrent.ThreadLocalRandom; import java.util.zip.Adler32; -import java.util.zip.CRC32; import java.util.zip.Checksum; import com.google.common.collect.Iterators; import com.google.common.primitives.Ints; import org.apache.cassandra.io.compress.CompressionMetadata; -import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.WrappedRunnable; /** diff --git a/src/java/org/apache/cassandra/tools/NodeProbe.java b/src/java/org/apache/cassandra/tools/NodeProbe.java index a6ab0916ec1c..8aa5992051ad 100644 --- a/src/java/org/apache/cassandra/tools/NodeProbe.java +++ b/src/java/org/apache/cassandra/tools/NodeProbe.java @@ -25,14 +25,11 @@ import java.lang.management.RuntimeMXBean; import java.net.InetAddress; import java.net.UnknownHostException; -import java.text.SimpleDateFormat; import java.util.*; import java.util.Map.Entry; import java.util.concurrent.*; -import java.util.concurrent.locks.Condition; import javax.management.*; import javax.management.openmbean.CompositeData; -import javax.management.remote.JMXConnectionNotification; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; @@ -42,7 +39,6 @@ import com.google.common.collect.*; import com.google.common.util.concurrent.Uninterruptibles; -import com.google.common.util.concurrent.AbstractFuture; import com.yammer.metrics.reporting.JmxReporter; import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutorMBean; import org.apache.cassandra.db.ColumnFamilyStoreMBean; @@ -58,13 +54,10 @@ import org.apache.cassandra.metrics.ColumnFamilyMetrics.Sampler; import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.net.MessagingServiceMBean; -import org.apache.cassandra.repair.RepairParallelism; import org.apache.cassandra.service.*; import org.apache.cassandra.streaming.StreamState; import org.apache.cassandra.streaming.StreamManagerMBean; import org.apache.cassandra.streaming.management.StreamStateCompositeData; -import org.apache.cassandra.utils.concurrent.SimpleCondition; -import org.apache.cassandra.utils.JVMStabilityInspector; /** * JMX client operations for Cassandra. diff --git a/src/java/org/apache/cassandra/tracing/Tracing.java b/src/java/org/apache/cassandra/tracing/Tracing.java index 930f0248e546..12a943e71621 100644 --- a/src/java/org/apache/cassandra/tracing/Tracing.java +++ b/src/java/org/apache/cassandra/tracing/Tracing.java @@ -36,8 +36,6 @@ import org.apache.cassandra.db.*; import org.apache.cassandra.db.marshal.TimeUUIDType; import org.apache.cassandra.exceptions.OverloadedException; -import org.apache.cassandra.exceptions.UnavailableException; -import org.apache.cassandra.exceptions.WriteTimeoutException; import org.apache.cassandra.net.MessageIn; import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.service.StorageProxy; diff --git a/src/java/org/apache/cassandra/transport/messages/ResultMessage.java b/src/java/org/apache/cassandra/transport/messages/ResultMessage.java index 723beed0a9a8..f9d3a13638ef 100644 --- a/src/java/org/apache/cassandra/transport/messages/ResultMessage.java +++ b/src/java/org/apache/cassandra/transport/messages/ResultMessage.java @@ -26,7 +26,6 @@ import org.apache.cassandra.cql3.ResultSet; import org.apache.cassandra.cql3.statements.SelectStatement; import org.apache.cassandra.cql3.statements.ParsedStatement; -import org.apache.cassandra.service.pager.PagingState; import org.apache.cassandra.transport.*; import org.apache.cassandra.thrift.CqlPreparedResult; import org.apache.cassandra.thrift.CqlResult; diff --git a/src/java/org/apache/cassandra/utils/FBUtilities.java b/src/java/org/apache/cassandra/utils/FBUtilities.java index c9024ecbef28..64e4987e4d46 100644 --- a/src/java/org/apache/cassandra/utils/FBUtilities.java +++ b/src/java/org/apache/cassandra/utils/FBUtilities.java @@ -33,7 +33,6 @@ import com.google.common.base.Joiner; import com.google.common.collect.AbstractIterator; -import com.google.common.primitives.Ints; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -48,7 +47,6 @@ import org.apache.cassandra.dht.Token; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.IVersionedSerializer; -import org.apache.cassandra.io.compress.CompressedRandomAccessReader; import org.apache.cassandra.io.compress.CompressionParameters; import org.apache.cassandra.io.util.DataOutputBuffer; import org.apache.cassandra.io.util.FileUtils; diff --git a/src/java/org/apache/cassandra/utils/MurmurHash.java b/src/java/org/apache/cassandra/utils/MurmurHash.java index 8d17ea93537a..9dcde6df3928 100644 --- a/src/java/org/apache/cassandra/utils/MurmurHash.java +++ b/src/java/org/apache/cassandra/utils/MurmurHash.java @@ -17,8 +17,6 @@ */ package org.apache.cassandra.utils; -import net.nicoulaj.compilecommand.annotations.Inline; - import java.nio.ByteBuffer; /** diff --git a/test/long/org/apache/cassandra/concurrent/LongSharedExecutorPoolTest.java b/test/long/org/apache/cassandra/concurrent/LongSharedExecutorPoolTest.java index 0fd53bb293f8..b44c234f06e6 100644 --- a/test/long/org/apache/cassandra/concurrent/LongSharedExecutorPoolTest.java +++ b/test/long/org/apache/cassandra/concurrent/LongSharedExecutorPoolTest.java @@ -17,9 +17,7 @@ */ package org.apache.cassandra.concurrent; -import java.util.ArrayList; import java.util.BitSet; -import java.util.List; import java.util.TreeSet; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; diff --git a/test/long/org/apache/cassandra/cql3/CorruptionTest.java b/test/long/org/apache/cassandra/cql3/CorruptionTest.java index 1a42112ecbd0..43cf5e04053e 100644 --- a/test/long/org/apache/cassandra/cql3/CorruptionTest.java +++ b/test/long/org/apache/cassandra/cql3/CorruptionTest.java @@ -28,7 +28,6 @@ import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; -import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; diff --git a/test/pig/org/apache/pig/test/MiniCluster.java b/test/pig/org/apache/pig/test/MiniCluster.java index aa03861af8c4..95acb849e6f5 100644 --- a/test/pig/org/apache/pig/test/MiniCluster.java +++ b/test/pig/org/apache/pig/test/MiniCluster.java @@ -21,7 +21,6 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; -import java.util.Locale; import org.apache.cassandra.utils.FBUtilities; import org.apache.hadoop.conf.Configuration; diff --git a/test/unit/org/apache/cassandra/SchemaLoader.java b/test/unit/org/apache/cassandra/SchemaLoader.java index 2be4cc075f54..f7b10a2403b6 100644 --- a/test/unit/org/apache/cassandra/SchemaLoader.java +++ b/test/unit/org/apache/cassandra/SchemaLoader.java @@ -21,7 +21,6 @@ import java.nio.ByteBuffer; import java.util.*; -import org.junit.AfterClass; import org.junit.BeforeClass; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/test/unit/org/apache/cassandra/config/KSMetaDataTest.java b/test/unit/org/apache/cassandra/config/KSMetaDataTest.java index 3d90bef4fb0e..39be9136d1c6 100644 --- a/test/unit/org/apache/cassandra/config/KSMetaDataTest.java +++ b/test/unit/org/apache/cassandra/config/KSMetaDataTest.java @@ -19,7 +19,6 @@ package org.apache.cassandra.config; -import java.util.Collections; import java.util.HashMap; import java.util.Map; diff --git a/test/unit/org/apache/cassandra/cql3/BatchTests.java b/test/unit/org/apache/cassandra/cql3/BatchTests.java index 490523376298..95fe6127a4c3 100644 --- a/test/unit/org/apache/cassandra/cql3/BatchTests.java +++ b/test/unit/org/apache/cassandra/cql3/BatchTests.java @@ -29,7 +29,6 @@ import org.junit.Test; import java.io.IOException; -import java.util.concurrent.TimeUnit; public class BatchTests { diff --git a/test/unit/org/apache/cassandra/cql3/DeleteTest.java b/test/unit/org/apache/cassandra/cql3/DeleteTest.java index c8aa660015e1..812d729f5bc6 100644 --- a/test/unit/org/apache/cassandra/cql3/DeleteTest.java +++ b/test/unit/org/apache/cassandra/cql3/DeleteTest.java @@ -25,15 +25,12 @@ import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.config.Schema; -import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.service.EmbeddedCassandraService; import org.junit.Assert; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; -import java.io.IOException; - public class DeleteTest extends SchemaLoader { private static EmbeddedCassandraService cassandra; diff --git a/test/unit/org/apache/cassandra/cql3/SecondaryIndexOnMapEntriesTest.java b/test/unit/org/apache/cassandra/cql3/SecondaryIndexOnMapEntriesTest.java index fa40e0a19037..e502f6aaa657 100644 --- a/test/unit/org/apache/cassandra/cql3/SecondaryIndexOnMapEntriesTest.java +++ b/test/unit/org/apache/cassandra/cql3/SecondaryIndexOnMapEntriesTest.java @@ -25,7 +25,6 @@ import java.util.List; import java.util.Map; -import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; diff --git a/test/unit/org/apache/cassandra/cql3/TypeTest.java b/test/unit/org/apache/cassandra/cql3/TypeTest.java index ec82d41b977c..7e12f9f956d6 100644 --- a/test/unit/org/apache/cassandra/cql3/TypeTest.java +++ b/test/unit/org/apache/cassandra/cql3/TypeTest.java @@ -17,10 +17,8 @@ */ package org.apache.cassandra.cql3; -import org.apache.cassandra.exceptions.ConfigurationException; import org.junit.Test; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; public class TypeTest extends CQLTester diff --git a/test/unit/org/apache/cassandra/db/CommitLogTest.java b/test/unit/org/apache/cassandra/db/CommitLogTest.java index 33795f16dc40..528cbdb9b5f2 100644 --- a/test/unit/org/apache/cassandra/db/CommitLogTest.java +++ b/test/unit/org/apache/cassandra/db/CommitLogTest.java @@ -44,7 +44,6 @@ import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.db.composites.CellNameType; import org.apache.cassandra.db.filter.NamesQueryFilter; -import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.gms.Gossiper; import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.service.StorageService; diff --git a/test/unit/org/apache/cassandra/db/CounterCellTest.java b/test/unit/org/apache/cassandra/db/CounterCellTest.java index 6b4c6367acfd..8d75b9ac3aa8 100644 --- a/test/unit/org/apache/cassandra/db/CounterCellTest.java +++ b/test/unit/org/apache/cassandra/db/CounterCellTest.java @@ -29,7 +29,6 @@ import org.junit.Assert; import org.junit.Test; -import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; import org.apache.cassandra.db.composites.CellNameType; import org.apache.cassandra.db.composites.SimpleDenseCellNameType; diff --git a/test/unit/org/apache/cassandra/db/SecondaryIndexCellSizeTest.java b/test/unit/org/apache/cassandra/db/SecondaryIndexCellSizeTest.java index 08dcf2460baa..1abd158441d1 100644 --- a/test/unit/org/apache/cassandra/db/SecondaryIndexCellSizeTest.java +++ b/test/unit/org/apache/cassandra/db/SecondaryIndexCellSizeTest.java @@ -31,7 +31,6 @@ import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.concurrent.OpOrder; -import org.apache.cassandra.utils.memory.MemtableAllocator; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; diff --git a/test/unit/org/apache/cassandra/gms/SerializationsTest.java b/test/unit/org/apache/cassandra/gms/SerializationsTest.java index 6317a98c9e2d..a773ccf7a22c 100644 --- a/test/unit/org/apache/cassandra/gms/SerializationsTest.java +++ b/test/unit/org/apache/cassandra/gms/SerializationsTest.java @@ -26,7 +26,6 @@ import org.junit.Test; import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.IOException; import java.net.InetAddress; import java.util.ArrayList; diff --git a/test/unit/org/apache/cassandra/io/compress/CompressorTest.java b/test/unit/org/apache/cassandra/io/compress/CompressorTest.java index 04396e054244..5df0b29cd734 100644 --- a/test/unit/org/apache/cassandra/io/compress/CompressorTest.java +++ b/test/unit/org/apache/cassandra/io/compress/CompressorTest.java @@ -28,7 +28,6 @@ import org.apache.cassandra.io.compress.ICompressor.WrappedArray; import org.junit.Assert; -import org.junit.Before; import org.junit.Test; import static org.junit.Assert.*; diff --git a/test/unit/org/apache/cassandra/io/util/BufferedRandomAccessFileTest.java b/test/unit/org/apache/cassandra/io/util/BufferedRandomAccessFileTest.java index 79931605ec03..f14bf753d103 100644 --- a/test/unit/org/apache/cassandra/io/util/BufferedRandomAccessFileTest.java +++ b/test/unit/org/apache/cassandra/io/util/BufferedRandomAccessFileTest.java @@ -33,7 +33,6 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; import static org.apache.cassandra.Util.expectEOF; import static org.apache.cassandra.Util.expectException; diff --git a/test/unit/org/apache/cassandra/locator/CloudstackSnitchTest.java b/test/unit/org/apache/cassandra/locator/CloudstackSnitchTest.java index 714520e211c9..d9a4ef1d0c0e 100644 --- a/test/unit/org/apache/cassandra/locator/CloudstackSnitchTest.java +++ b/test/unit/org/apache/cassandra/locator/CloudstackSnitchTest.java @@ -19,11 +19,9 @@ import java.io.IOException; import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.Map; import org.junit.AfterClass; -import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; @@ -32,8 +30,6 @@ import org.apache.cassandra.gms.ApplicationState; import org.apache.cassandra.gms.Gossiper; import org.apache.cassandra.gms.VersionedValue; -import org.apache.cassandra.net.MessagingService; -import org.apache.cassandra.net.OutboundTcpConnectionPool; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.db.Keyspace; diff --git a/test/unit/org/apache/cassandra/locator/GoogleCloudSnitchTest.java b/test/unit/org/apache/cassandra/locator/GoogleCloudSnitchTest.java index 70080a8a21e5..54ea722b2f11 100644 --- a/test/unit/org/apache/cassandra/locator/GoogleCloudSnitchTest.java +++ b/test/unit/org/apache/cassandra/locator/GoogleCloudSnitchTest.java @@ -23,11 +23,9 @@ import java.io.IOException; import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.Map; import org.junit.AfterClass; -import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; @@ -37,8 +35,6 @@ import org.apache.cassandra.gms.ApplicationState; import org.apache.cassandra.gms.Gossiper; import org.apache.cassandra.gms.VersionedValue; -import org.apache.cassandra.net.MessagingService; -import org.apache.cassandra.net.OutboundTcpConnectionPool; import org.apache.cassandra.service.StorageService; import static org.junit.Assert.assertEquals; diff --git a/test/unit/org/apache/cassandra/repair/ValidatorTest.java b/test/unit/org/apache/cassandra/repair/ValidatorTest.java index 74d1ad36b459..615167c0a6a5 100644 --- a/test/unit/org/apache/cassandra/repair/ValidatorTest.java +++ b/test/unit/org/apache/cassandra/repair/ValidatorTest.java @@ -39,7 +39,6 @@ import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; import org.apache.cassandra.io.sstable.ColumnStats; -import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.locator.SimpleStrategy; import org.apache.cassandra.net.MessageIn; import org.apache.cassandra.net.MessageOut; diff --git a/test/unit/org/apache/cassandra/service/SerializationsTest.java b/test/unit/org/apache/cassandra/service/SerializationsTest.java index 35e598a93764..6f42667a14f3 100644 --- a/test/unit/org/apache/cassandra/service/SerializationsTest.java +++ b/test/unit/org/apache/cassandra/service/SerializationsTest.java @@ -19,7 +19,6 @@ package org.apache.cassandra.service; import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.IOException; import java.net.InetAddress; import java.util.Collections; diff --git a/test/unit/org/apache/cassandra/streaming/StreamTransferTaskTest.java b/test/unit/org/apache/cassandra/streaming/StreamTransferTaskTest.java index d3685d9b5ac3..0c1c9ae084ce 100644 --- a/test/unit/org/apache/cassandra/streaming/StreamTransferTaskTest.java +++ b/test/unit/org/apache/cassandra/streaming/StreamTransferTaskTest.java @@ -22,7 +22,6 @@ import java.util.List; import java.util.concurrent.CancellationException; import java.util.concurrent.Future; -import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import org.apache.cassandra.io.sstable.format.SSTableReader; diff --git a/test/unit/org/apache/cassandra/utils/BloomFilterTest.java b/test/unit/org/apache/cassandra/utils/BloomFilterTest.java index 4180a8cc5df6..bc886f4850b5 100644 --- a/test/unit/org/apache/cassandra/utils/BloomFilterTest.java +++ b/test/unit/org/apache/cassandra/utils/BloomFilterTest.java @@ -20,7 +20,6 @@ import java.io.ByteArrayInputStream; import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; diff --git a/test/unit/org/apache/cassandra/utils/ByteBufferUtilTest.java b/test/unit/org/apache/cassandra/utils/ByteBufferUtilTest.java index 44cb20d7c9f3..2cbac92b71a6 100644 --- a/test/unit/org/apache/cassandra/utils/ByteBufferUtilTest.java +++ b/test/unit/org/apache/cassandra/utils/ByteBufferUtilTest.java @@ -23,9 +23,7 @@ import java.io.IOException; import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.nio.ByteBuffer; import java.nio.charset.CharacterCodingException; import java.util.Arrays; @@ -33,7 +31,6 @@ import org.junit.Test; import org.apache.cassandra.io.util.DataOutputBuffer; -import org.apache.cassandra.io.util.FastByteArrayOutputStream; public class ByteBufferUtilTest { diff --git a/test/unit/org/apache/cassandra/utils/JVMStabilityInspectorTest.java b/test/unit/org/apache/cassandra/utils/JVMStabilityInspectorTest.java index ff8188fa4d65..2ecbee45c546 100644 --- a/test/unit/org/apache/cassandra/utils/JVMStabilityInspectorTest.java +++ b/test/unit/org/apache/cassandra/utils/JVMStabilityInspectorTest.java @@ -22,14 +22,9 @@ import org.apache.cassandra.io.FSReadError; import org.junit.Test; -import java.io.File; -import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; -import java.net.ServerSocket; -import java.net.Socket; import java.net.SocketException; -import java.util.ArrayList; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; diff --git a/test/unit/org/apache/cassandra/utils/MerkleTreeTest.java b/test/unit/org/apache/cassandra/utils/MerkleTreeTest.java index a9e051e96220..8d6e272ae391 100644 --- a/test/unit/org/apache/cassandra/utils/MerkleTreeTest.java +++ b/test/unit/org/apache/cassandra/utils/MerkleTreeTest.java @@ -23,7 +23,6 @@ import com.google.common.collect.AbstractIterator; import com.google.common.io.ByteArrayDataInput; -import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; import org.junit.Before; diff --git a/test/unit/org/apache/cassandra/utils/SerializationsTest.java b/test/unit/org/apache/cassandra/utils/SerializationsTest.java index 976a3eb15a6f..46fa017b4f18 100644 --- a/test/unit/org/apache/cassandra/utils/SerializationsTest.java +++ b/test/unit/org/apache/cassandra/utils/SerializationsTest.java @@ -25,7 +25,6 @@ import org.junit.Test; import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.IOException; public class SerializationsTest extends AbstractSerializationsTester diff --git a/test/unit/org/apache/cassandra/utils/StreamingHistogramTest.java b/test/unit/org/apache/cassandra/utils/StreamingHistogramTest.java index 13828ebcb302..0e9b90b0f81c 100644 --- a/test/unit/org/apache/cassandra/utils/StreamingHistogramTest.java +++ b/test/unit/org/apache/cassandra/utils/StreamingHistogramTest.java @@ -20,9 +20,7 @@ import org.junit.Test; import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.io.DataInputStream; -import java.io.DataOutputStream; import java.util.*; import org.apache.cassandra.io.util.DataOutputBuffer; diff --git a/test/unit/org/apache/cassandra/utils/TopKSamplerTest.java b/test/unit/org/apache/cassandra/utils/TopKSamplerTest.java index dc3b91cb2516..3b8b37d8317a 100644 --- a/test/unit/org/apache/cassandra/utils/TopKSamplerTest.java +++ b/test/unit/org/apache/cassandra/utils/TopKSamplerTest.java @@ -7,8 +7,6 @@ import junit.framework.Assert; -import org.apache.cassandra.concurrent.Stage; -import org.apache.cassandra.concurrent.StageManager; import org.apache.cassandra.utils.TopKSampler.SamplerResult; import org.junit.Test; diff --git a/tools/stress/src/org/apache/cassandra/stress/StressMetrics.java b/tools/stress/src/org/apache/cassandra/stress/StressMetrics.java index 7ab883738a7e..12bdc3e925bf 100644 --- a/tools/stress/src/org/apache/cassandra/stress/StressMetrics.java +++ b/tools/stress/src/org/apache/cassandra/stress/StressMetrics.java @@ -28,7 +28,6 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.ThreadFactory; -import com.google.common.util.concurrent.Uninterruptibles; import org.apache.commons.lang3.time.DurationFormatUtils; import org.apache.cassandra.concurrent.NamedThreadFactory; import org.apache.cassandra.stress.settings.StressSettings; diff --git a/tools/stress/src/org/apache/cassandra/stress/generate/PartitionIterator.java b/tools/stress/src/org/apache/cassandra/stress/generate/PartitionIterator.java index 0466edb1250d..3a8693d3730b 100644 --- a/tools/stress/src/org/apache/cassandra/stress/generate/PartitionIterator.java +++ b/tools/stress/src/org/apache/cassandra/stress/generate/PartitionIterator.java @@ -38,7 +38,6 @@ import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.db.marshal.BytesType; -import org.apache.cassandra.stress.Operation; import org.apache.cassandra.stress.generate.values.Generator; // a partition is re-used to reduce garbage generation, as is its internal RowIterator diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/SampledOpDistributionFactory.java b/tools/stress/src/org/apache/cassandra/stress/operations/SampledOpDistributionFactory.java index 9713e93d5353..9e1a5e8e415b 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/SampledOpDistributionFactory.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/SampledOpDistributionFactory.java @@ -32,7 +32,6 @@ import org.apache.cassandra.stress.Operation; import org.apache.cassandra.stress.generate.DistributionFactory; import org.apache.cassandra.stress.generate.PartitionGenerator; -import org.apache.cassandra.stress.generate.SeedManager; import org.apache.cassandra.stress.util.Timer; public abstract class SampledOpDistributionFactory implements OpDistributionFactory diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/predefined/CqlOperation.java b/tools/stress/src/org/apache/cassandra/stress/operations/predefined/CqlOperation.java index 61769157e945..afdc0b189081 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/predefined/CqlOperation.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/predefined/CqlOperation.java @@ -33,7 +33,6 @@ import org.apache.cassandra.stress.generate.SeedManager; import org.apache.cassandra.stress.settings.Command; import org.apache.cassandra.stress.settings.ConnectionStyle; -import org.apache.cassandra.stress.settings.CqlVersion; import org.apache.cassandra.stress.settings.StressSettings; import org.apache.cassandra.stress.util.JavaDriverClient; import org.apache.cassandra.stress.util.ThriftClient; From c87b6a30f21a6d7cfcebd2e1399dfb6069f402fa Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Sun, 25 Jan 2015 22:38:49 -0500 Subject: [PATCH 252/557] dead throws clause cleanup --- .../db/compaction/CompactionManager.java | 2 +- .../io/sstable/format/SSTableReader.java | 2 +- .../LongSharedExecutorPoolTest.java | 6 +- .../cassandra/db/LongFlushMemtableTest.java | 2 +- .../db/compaction/LongCompactionsTest.java | 4 +- .../cassandra/pig/CqlRecordReaderTest.java | 3 +- .../cassandra/pig/CqlTableDataTypeTest.java | 11 ++-- .../apache/cassandra/pig/CqlTableTest.java | 24 ++++---- .../pig/ThriftColumnFamilyDataTypeTest.java | 6 +- .../cassandra/pig/ThriftColumnFamilyTest.java | 34 ++++-------- .../cql3/NonNativeTimestampTest.java | 2 +- .../cassandra/db/ColumnFamilyStoreTest.java | 2 +- .../apache/cassandra/db/CommitLogTest.java | 4 +- .../cassandra/db/RangeTombstoneTest.java | 4 +- .../db/compaction/AntiCompactionTest.java | 12 ++-- .../db/compaction/CompactionsPurgeTest.java | 4 +- .../db/compaction/CompactionsTest.java | 4 +- .../db/compaction/OneCompactionTest.java | 6 +- .../db/index/PerRowSecondaryIndexTest.java | 2 +- .../io/sstable/SSTableReaderTest.java | 10 ++-- .../thrift/ThriftValidationTest.java | 2 +- .../cassandra/tools/SSTableExportTest.java | 2 +- .../cassandra/tools/SSTableImportTest.java | 2 +- .../apache/cassandra/utils/BitSetTest.java | 55 +++++++++++-------- .../utils/JVMStabilityInspectorTest.java | 2 +- 25 files changed, 99 insertions(+), 108 deletions(-) diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java index 7b45dd351dff..06fabba0b578 100644 --- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java +++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java @@ -471,7 +471,7 @@ else if (!sstableRange.intersects(r)) logger.info(String.format("Completed anticompaction successfully")); } - public void performMaximal(final ColumnFamilyStore cfStore) throws InterruptedException, ExecutionException + public void performMaximal(final ColumnFamilyStore cfStore) { FBUtilities.waitOnFutures(submitMaximal(cfStore, getDefaultGcBefore(cfStore))); } diff --git a/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java b/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java index 482d0cc4b023..1546ce82b67d 100644 --- a/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java +++ b/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java @@ -1017,7 +1017,7 @@ public double getEffectiveIndexInterval() return indexSummary.getEffectiveIndexInterval(); } - public void releaseSummary() throws IOException + public void releaseSummary() { indexSummary.close(); indexSummary = null; diff --git a/test/long/org/apache/cassandra/concurrent/LongSharedExecutorPoolTest.java b/test/long/org/apache/cassandra/concurrent/LongSharedExecutorPoolTest.java index b44c234f06e6..34532615999c 100644 --- a/test/long/org/apache/cassandra/concurrent/LongSharedExecutorPoolTest.java +++ b/test/long/org/apache/cassandra/concurrent/LongSharedExecutorPoolTest.java @@ -97,12 +97,12 @@ public int compareTo(Batch that) } @Test - public void testPromptnessOfExecution() throws InterruptedException, ExecutionException, TimeoutException + public void testPromptnessOfExecution() throws InterruptedException, ExecutionException { testPromptnessOfExecution(TimeUnit.MINUTES.toNanos(2L), 0.5f); } - private void testPromptnessOfExecution(long intervalNanos, float loadIncrement) throws InterruptedException, ExecutionException, TimeoutException + private void testPromptnessOfExecution(long intervalNanos, float loadIncrement) throws InterruptedException, ExecutionException { final int executorCount = 4; int threadCount = 8; @@ -217,7 +217,7 @@ private void testPromptnessOfExecution(long intervalNanos, float loadIncrement) } } - public static void main(String[] args) throws InterruptedException, ExecutionException, TimeoutException + public static void main(String[] args) throws InterruptedException, ExecutionException { // do longer test new LongSharedExecutorPoolTest().testPromptnessOfExecution(TimeUnit.MINUTES.toNanos(10L), 0.1f); diff --git a/test/long/org/apache/cassandra/db/LongFlushMemtableTest.java b/test/long/org/apache/cassandra/db/LongFlushMemtableTest.java index 211f72f5c88b..fd23f330afc5 100644 --- a/test/long/org/apache/cassandra/db/LongFlushMemtableTest.java +++ b/test/long/org/apache/cassandra/db/LongFlushMemtableTest.java @@ -51,7 +51,7 @@ public static void defineSchema() throws ConfigurationException } @Test - public void testFlushMemtables() throws IOException, ConfigurationException + public void testFlushMemtables() throws ConfigurationException { Keyspace keyspace = Keyspace.open(KEYSPACE1); for (int i = 0; i < 100; i++) diff --git a/test/long/org/apache/cassandra/db/compaction/LongCompactionsTest.java b/test/long/org/apache/cassandra/db/compaction/LongCompactionsTest.java index 28ec9759fa33..f16d094be161 100644 --- a/test/long/org/apache/cassandra/db/compaction/LongCompactionsTest.java +++ b/test/long/org/apache/cassandra/db/compaction/LongCompactionsTest.java @@ -127,7 +127,7 @@ protected void testCompaction(int sstableCount, int rowsPerSSTable, int colsPerR } @Test - public void testStandardColumnCompactions() throws IOException, ExecutionException, InterruptedException + public void testStandardColumnCompactions() { // this test does enough rows to force multiple block indexes to be used Keyspace keyspace = Keyspace.open(KEYSPACE1); @@ -168,7 +168,7 @@ public void testStandardColumnCompactions() throws IOException, ExecutionExcepti cfs.truncateBlocking(); } - private void forceCompactions(ColumnFamilyStore cfs) throws ExecutionException, InterruptedException + private void forceCompactions(ColumnFamilyStore cfs) { // re-enable compaction with thresholds low enough to force a few rounds cfs.setCompactionThresholds(2, 4); diff --git a/test/pig/org/apache/cassandra/pig/CqlRecordReaderTest.java b/test/pig/org/apache/cassandra/pig/CqlRecordReaderTest.java index a51950b90053..b2a74b6a5772 100644 --- a/test/pig/org/apache/cassandra/pig/CqlRecordReaderTest.java +++ b/test/pig/org/apache/cassandra/pig/CqlRecordReaderTest.java @@ -57,8 +57,7 @@ public class CqlRecordReaderTest extends PigTestBase }; @BeforeClass - public static void setup() throws IOException, InterruptedException, ConfigurationException, - TException, ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException + public static void setup() throws IOException, ConfigurationException, TException { startCassandra(); executeCQLStatements(statements); diff --git a/test/pig/org/apache/cassandra/pig/CqlTableDataTypeTest.java b/test/pig/org/apache/cassandra/pig/CqlTableDataTypeTest.java index 98e170b225ea..ca01901747eb 100644 --- a/test/pig/org/apache/cassandra/pig/CqlTableDataTypeTest.java +++ b/test/pig/org/apache/cassandra/pig/CqlTableDataTypeTest.java @@ -201,8 +201,7 @@ public class CqlTableDataTypeTest extends PigTestBase }; @BeforeClass - public static void setup() throws IOException, InterruptedException, ConfigurationException, TException, - ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException + public static void setup() throws IOException, ConfigurationException, TException { startCassandra(); executeCQLStatements(statements); @@ -210,7 +209,7 @@ public static void setup() throws IOException, InterruptedException, Configurati } @Test - public void testCqlNativeStorageRegularType() throws TException, IOException + public void testCqlNativeStorageRegularType() throws IOException { //input_cql=select * from cqltable where token(key) > ? and token(key) <= ? cqlTableTest("rows = LOAD 'cql://cql3ks/cqltable?" + defaultParameters + nativeParameters + "&input_cql=select%20*%20from%20cqltable%20where%20token(key)%20%3E%20%3F%20and%20token(key)%20%3C%3D%20%3F' USING CqlNativeStorage();"); @@ -280,7 +279,7 @@ private void counterTableTest(String initialQuery) throws IOException } @Test - public void testCqlNativeStorageSetType() throws TException, IOException + public void testCqlNativeStorageSetType() throws IOException { //input_cql=select * from settable where token(key) > ? and token(key) <= ? settableTest("set_rows = LOAD 'cql://cql3ks/settable?" + defaultParameters + nativeParameters + "&input_cql=select%20*%20from%20settable%20where%20token(key)%20%3E%20%3F%20and%20token(key)%20%3C%3D%20%3F' USING CqlNativeStorage();"); @@ -346,7 +345,7 @@ private void settableTest(String initialQuery) throws IOException } @Test - public void testCqlNativeStorageListType() throws TException, IOException + public void testCqlNativeStorageListType() throws IOException { //input_cql=select * from listtable where token(key) > ? and token(key) <= ? listtableTest("list_rows = LOAD 'cql://cql3ks/listtable?" + defaultParameters + nativeParameters + "&input_cql=select%20*%20from%20listtable%20where%20token(key)%20%3E%20%3F%20and%20token(key)%20%3C%3D%20%3F' USING CqlNativeStorage();"); @@ -412,7 +411,7 @@ private void listtableTest(String initialQuery) throws IOException } @Test - public void testCqlNativeStorageMapType() throws TException, IOException + public void testCqlNativeStorageMapType() throws IOException { //input_cql=select * from maptable where token(key) > ? and token(key) <= ? maptableTest("map_rows = LOAD 'cql://cql3ks/maptable?" + defaultParameters + nativeParameters + "&input_cql=select%20*%20from%20maptable%20where%20token(key)%20%3E%20%3F%20and%20token(key)%20%3C%3D%20%3F' USING CqlNativeStorage();"); diff --git a/test/pig/org/apache/cassandra/pig/CqlTableTest.java b/test/pig/org/apache/cassandra/pig/CqlTableTest.java index ecfeb63bf7c3..26f9f68e006d 100644 --- a/test/pig/org/apache/cassandra/pig/CqlTableTest.java +++ b/test/pig/org/apache/cassandra/pig/CqlTableTest.java @@ -73,8 +73,7 @@ public class CqlTableTest extends PigTestBase }; @BeforeClass - public static void setup() throws IOException, InterruptedException, ConfigurationException, TException, ClassNotFoundException, - NoSuchFieldException, IllegalAccessException, InstantiationException + public static void setup() throws IOException, ConfigurationException, TException { startCassandra(); executeCQLStatements(statements); @@ -82,7 +81,7 @@ public static void setup() throws IOException, InterruptedException, Configurati } @Test - public void testCqlNativeStorageSchema() throws TException, IOException + public void testCqlNativeStorageSchema() throws IOException { //input_cql=select * from cqltable where token(key1) > ? and token(key1) <= ? cqlTableSchemaTest("rows = LOAD 'cql://cql3ks/cqltable?" + defaultParameters + nativeParameters + "&input_cql=select%20*%20from%20cqltable%20where%20token(key1)%20%3E%20%3F%20and%20token(key1)%20%3C%3D%20%3F' USING CqlNativeStorage();"); @@ -127,13 +126,13 @@ private void cqlTableSchemaTest(String initialQuery) throws IOException } @Test - public void testCqlNativeStorageSingleKeyTable() throws TException, IOException + public void testCqlNativeStorageSingleKeyTable() throws IOException { //input_cql=select * from moredata where token(x) > ? and token(x) <= ? - SingleKeyTableTest("moretestvalues= LOAD 'cql://cql3ks/moredata?" + defaultParameters + nativeParameters + "&input_cql=select%20*%20from%20moredata%20where%20token(x)%20%3E%20%3F%20and%20token(x)%20%3C%3D%20%3F' USING CqlNativeStorage();"); + singleKeyTableTest("moretestvalues= LOAD 'cql://cql3ks/moredata?" + defaultParameters + nativeParameters + "&input_cql=select%20*%20from%20moredata%20where%20token(x)%20%3E%20%3F%20and%20token(x)%20%3C%3D%20%3F' USING CqlNativeStorage();"); } - private void SingleKeyTableTest(String initialQuery) throws TException, IOException + private void singleKeyTableTest(String initialQuery) throws IOException { pig.setBatchOn(); pig.registerQuery(initialQuery); @@ -156,13 +155,13 @@ private void SingleKeyTableTest(String initialQuery) throws TException, IOExcept } @Test - public void testCqlNativeStorageCompositeKeyTable() throws TException, IOException + public void testCqlNativeStorageCompositeKeyTable() throws IOException { //input_cql=select * from compmore where token(id) > ? and token(id) <= ? - CompositeKeyTableTest("moredata= LOAD 'cql://cql3ks/compmore?" + defaultParameters + nativeParameters + "&input_cql=select%20*%20from%20compmore%20where%20token(id)%20%3E%20%3F%20and%20token(id)%20%3C%3D%20%3F' USING CqlNativeStorage();"); + compositeKeyTableTest("moredata= LOAD 'cql://cql3ks/compmore?" + defaultParameters + nativeParameters + "&input_cql=select%20*%20from%20compmore%20where%20token(id)%20%3E%20%3F%20and%20token(id)%20%3C%3D%20%3F' USING CqlNativeStorage();"); } - private void CompositeKeyTableTest(String initialQuery) throws TException, IOException + private void compositeKeyTableTest(String initialQuery) throws IOException { pig.setBatchOn(); pig.registerQuery(initialQuery); @@ -191,13 +190,13 @@ private void CompositeKeyTableTest(String initialQuery) throws TException, IOExc } @Test - public void testCqlNativeStorageCollectionColumnTable() throws TException, IOException + public void testCqlNativeStorageCollectionColumnTable() throws IOException { //input_cql=select * from collectiontable where token(m) > ? and token(m) <= ? CollectionColumnTableTest("collectiontable= LOAD 'cql://cql3ks/collectiontable?" + defaultParameters + nativeParameters + "&input_cql=select%20*%20from%20collectiontable%20where%20token(m)%20%3E%20%3F%20and%20token(m)%20%3C%3D%20%3F' USING CqlNativeStorage();"); } - private void CollectionColumnTableTest(String initialQuery) throws TException, IOException + private void CollectionColumnTableTest(String initialQuery) throws IOException { pig.setBatchOn(); pig.registerQuery(initialQuery); @@ -230,8 +229,7 @@ private void CollectionColumnTableTest(String initialQuery) throws TException, I } @Test - public void testCassandraStorageSchema() throws IOException, ClassNotFoundException, TException, NoSuchFieldException, - IllegalAccessException, InstantiationException + public void testCassandraStorageSchema() throws IOException { //results: (key1,{((111,),),((111,column1),100),((111,column2),10.1)}) pig.registerQuery("rows = LOAD 'cassandra://cql3ks/cqltable?" + defaultParameters + "' USING CassandraStorage();"); diff --git a/test/pig/org/apache/cassandra/pig/ThriftColumnFamilyDataTypeTest.java b/test/pig/org/apache/cassandra/pig/ThriftColumnFamilyDataTypeTest.java index 2ffd5242617c..3ddb94eef04c 100644 --- a/test/pig/org/apache/cassandra/pig/ThriftColumnFamilyDataTypeTest.java +++ b/test/pig/org/apache/cassandra/pig/ThriftColumnFamilyDataTypeTest.java @@ -69,8 +69,7 @@ public class ThriftColumnFamilyDataTypeTest extends PigTestBase }; @BeforeClass - public static void setup() throws IOException, InterruptedException, ConfigurationException, TException, - ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException + public static void setup() throws IOException, ConfigurationException, TException { startCassandra(); executeCQLStatements(statements); @@ -78,8 +77,7 @@ public static void setup() throws IOException, InterruptedException, Configurati } @Test - public void testCassandraStorageDataType() throws IOException, ClassNotFoundException, TException, - NoSuchFieldException, IllegalAccessException, InstantiationException + public void testCassandraStorageDataType() throws IOException { pig.registerQuery("rows = LOAD 'cassandra://thrift_ks/some_app?" + defaultParameters + "' USING CassandraStorage();"); Tuple t = pig.openIterator("rows").next(); diff --git a/test/pig/org/apache/cassandra/pig/ThriftColumnFamilyTest.java b/test/pig/org/apache/cassandra/pig/ThriftColumnFamilyTest.java index 167668ca76a2..60d04d33cdc3 100644 --- a/test/pig/org/apache/cassandra/pig/ThriftColumnFamilyTest.java +++ b/test/pig/org/apache/cassandra/pig/ThriftColumnFamilyTest.java @@ -171,8 +171,7 @@ public class ThriftColumnFamilyTest extends PigTestBase }; @BeforeClass - public static void setup() throws IOException, InterruptedException, ConfigurationException, TException, - ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException + public static void setup() throws IOException, ConfigurationException, TException { startCassandra(); executeCQLStatements(statements); @@ -180,8 +179,7 @@ public static void setup() throws IOException, InterruptedException, Configurati } @Test - public void testCqlNativeStorage() throws IOException, ClassNotFoundException, TException, NoSuchFieldException, - IllegalAccessException, InstantiationException + public void testCqlNativeStorage() throws IOException { //regular thrift column families //input_cql=select * from "some_app" where token(key) > ? and token(key) <= ? @@ -302,8 +300,7 @@ else if ("punch".equals(t.get(0)) && "bruce".equals(t.get(1)) && "lee".equals(t. } @Test - public void testCassandraStorageSchema() throws IOException, ClassNotFoundException, TException, NoSuchFieldException, - IllegalAccessException, InstantiationException + public void testCassandraStorageSchema() throws IOException { //results: (qux,(atomic_weight,0.660161815846869),(created,1335890877),(name,User Qux),(percent,64.7), //(rating,2),(score,12000),(vote_type,dislike)) @@ -342,8 +339,7 @@ public void testCassandraStorageSchema() throws IOException, ClassNotFoundExcept } @Test - public void testCassandraStorageFullCopy() throws IOException, ClassNotFoundException, TException, NoSuchFieldException, - IllegalAccessException, InstantiationException + public void testCassandraStorageFullCopy() throws IOException, TException { pig.setBatchOn(); pig.registerQuery("rows = LOAD 'cassandra://thrift_ks/some_app?" + defaultParameters + "' USING CassandraStorage();"); @@ -356,13 +352,12 @@ public void testCassandraStorageFullCopy() throws IOException, ClassNotFoundExce } @Test - public void testCassandraStorageSigleTupleCopy() throws IOException, ClassNotFoundException, TException, - NoSuchFieldException, IllegalAccessException, InstantiationException + public void testCassandraStorageSingleTupleCopy() throws IOException, TException { executeCQLStatements(deleteCopyOfSomeAppTableData); pig.setBatchOn(); pig.registerQuery("rows = LOAD 'cassandra://thrift_ks/some_app?" + defaultParameters + "' USING CassandraStorage();"); - //sigle tuple + //single tuple pig.registerQuery("onecol = FOREACH rows GENERATE key, percent;"); pig.registerQuery("STORE onecol INTO 'cassandra://thrift_ks/copy_of_some_app?" + defaultParameters + "' USING CassandraStorage();"); pig.executeBatch(); @@ -391,8 +386,7 @@ public void testCassandraStorageSigleTupleCopy() throws IOException, ClassNotFou } @Test - public void testCassandraStorageBagOnlyCopy() throws IOException, ClassNotFoundException, TException, - NoSuchFieldException, IllegalAccessException, InstantiationException + public void testCassandraStorageBagOnlyCopy() throws IOException, TException { executeCQLStatements(deleteCopyOfSomeAppTableData); pig.setBatchOn(); @@ -435,8 +429,7 @@ public void testCassandraStorageBagOnlyCopy() throws IOException, ClassNotFoundE } @Test - public void testCassandraStorageFilter() throws IOException, ClassNotFoundException, TException, NoSuchFieldException, - IllegalAccessException, InstantiationException + public void testCassandraStorageFilter() throws IOException, TException { executeCQLStatements(deleteCopyOfSomeAppTableData); pig.setBatchOn(); @@ -503,7 +496,7 @@ public void testCassandraStorageFilter() throws IOException, ClassNotFoundExcept } @Test - public void testCassandraStorageJoin() throws IOException, ClassNotFoundException, TException, IllegalAccessException, InstantiationException + public void testCassandraStorageJoin() throws IOException { //test key types with a join pig.registerQuery("U8 = load 'cassandra://thrift_ks/u8?" + defaultParameters + "' using CassandraStorage();"); @@ -555,8 +548,7 @@ public void testCassandraStorageJoin() throws IOException, ClassNotFoundExceptio } @Test - public void testCassandraStorageCounterCF() throws IOException, ClassNotFoundException, TException, NoSuchFieldException, - IllegalAccessException, InstantiationException + public void testCassandraStorageCounterCF() throws IOException { //Test counter column family support pig.registerQuery("CC = load 'cassandra://thrift_ks/cc?" + defaultParameters + "' using CassandraStorage();"); @@ -568,8 +560,7 @@ public void testCassandraStorageCounterCF() throws IOException, ClassNotFoundExc } @Test - public void testCassandraStorageCompositeColumnCF() throws IOException, ClassNotFoundException, TException, - NoSuchFieldException, IllegalAccessException, InstantiationException + public void testCassandraStorageCompositeColumnCF() throws IOException { //Test CompositeType pig.registerQuery("compo = load 'cassandra://thrift_ks/compo?" + defaultParameters + "' using CassandraStorage();"); @@ -636,8 +627,7 @@ else if ((Long) inner.get(0) == 6L && (Long) inner.get(1) == 30L) } @Test - public void testCassandraStorageCompositeKeyCF() throws IOException, ClassNotFoundException, TException, - NoSuchFieldException, IllegalAccessException, InstantiationException + public void testCassandraStorageCompositeKeyCF() throws IOException { //Test CompositeKey pig.registerQuery("compokeys = load 'cassandra://thrift_ks/compo_key?" + defaultParameters + "' using CassandraStorage();"); diff --git a/test/unit/org/apache/cassandra/cql3/NonNativeTimestampTest.java b/test/unit/org/apache/cassandra/cql3/NonNativeTimestampTest.java index 8e3fbeda325b..80c5e3b33c1a 100644 --- a/test/unit/org/apache/cassandra/cql3/NonNativeTimestampTest.java +++ b/test/unit/org/apache/cassandra/cql3/NonNativeTimestampTest.java @@ -50,7 +50,7 @@ public static void setup() throws Exception } @Test - public void setServerTimestampForNonCqlNativeStatements() throws RequestValidationException, RequestExecutionException, CharacterCodingException, UnsupportedEncodingException + public void setServerTimestampForNonCqlNativeStatements() throws RequestValidationException, RequestExecutionException { String createKsCQL = "CREATE KEYSPACE non_native_ts_test" + " WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };"; diff --git a/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java b/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java index 479bb1617ee0..7c086f78bace 100644 --- a/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java +++ b/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java @@ -131,7 +131,7 @@ public class ColumnFamilyStoreTest } @BeforeClass - public static void defineSchema() throws ConfigurationException, IOException, TException + public static void defineSchema() throws ConfigurationException { SchemaLoader.prepareServer(); SchemaLoader.createKeyspace(KEYSPACE1, diff --git a/test/unit/org/apache/cassandra/db/CommitLogTest.java b/test/unit/org/apache/cassandra/db/CommitLogTest.java index 528cbdb9b5f2..22f1fba59dff 100644 --- a/test/unit/org/apache/cassandra/db/CommitLogTest.java +++ b/test/unit/org/apache/cassandra/db/CommitLogTest.java @@ -343,7 +343,7 @@ public void testCommitFailurePolicy_die() } @Test - public void testTruncateWithoutSnapshot() throws ExecutionException, InterruptedException + public void testTruncateWithoutSnapshot() { CommitLog.instance.resetUnsafe(); boolean prev = DatabaseDescriptor.isAutoSnapshot(); @@ -372,7 +372,7 @@ public void testTruncateWithoutSnapshot() throws ExecutionException, Interrupte } @Test - public void testTruncateWithoutSnapshotNonDurable() throws ExecutionException, InterruptedException + public void testTruncateWithoutSnapshotNonDurable() { CommitLog.instance.resetUnsafe(); boolean prevAutoSnapshot = DatabaseDescriptor.isAutoSnapshot(); diff --git a/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java b/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java index fd37ee3c6c9d..a051c2c7c4cd 100644 --- a/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java +++ b/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java @@ -333,7 +333,7 @@ private void assertTimes(StatsMetadata metadata, long min, long max, int localDe } @Test - public void test7810() throws ExecutionException, InterruptedException, IOException + public void test7810() throws ExecutionException, InterruptedException { Keyspace ks = Keyspace.open(KSNAME); ColumnFamilyStore cfs = ks.getColumnFamilyStore(CFNAME); @@ -381,7 +381,7 @@ public void test7808_1() throws ExecutionException, InterruptedException } @Test - public void test7808_2() throws ExecutionException, InterruptedException, IOException + public void test7808_2() throws ExecutionException, InterruptedException { Keyspace ks = Keyspace.open(KSNAME); ColumnFamilyStore cfs = ks.getColumnFamilyStore(CFNAME); diff --git a/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java b/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java index 63a49dee5324..6ec56c7c8b28 100644 --- a/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java @@ -127,7 +127,7 @@ public void antiCompactOne() throws Exception } @Test - public void antiCompactionSizeTest() throws ExecutionException, InterruptedException, IOException + public void antiCompactionSizeTest() throws InterruptedException, IOException { Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF); @@ -180,16 +180,16 @@ public void generateSStable(ColumnFamilyStore store, String Suffix) } @Test - public void antiCompactTenSTC() throws InterruptedException, ExecutionException, IOException{ + public void antiCompactTenSTC() throws InterruptedException, IOException{ antiCompactTen("SizeTieredCompactionStrategy"); } @Test - public void antiCompactTenLC() throws InterruptedException, ExecutionException, IOException{ + public void antiCompactTenLC() throws InterruptedException, IOException{ antiCompactTen("LeveledCompactionStrategy"); } - public void antiCompactTen(String compactionStrategy) throws InterruptedException, ExecutionException, IOException + public void antiCompactTen(String compactionStrategy) throws InterruptedException, IOException { Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore(CF); @@ -240,7 +240,7 @@ public void antiCompactTen(String compactionStrategy) throws InterruptedExceptio assertEquals(nonRepairedKeys, 60); } @Test - public void shouldMutateRepairedAt() throws InterruptedException, ExecutionException, IOException + public void shouldMutateRepairedAt() throws InterruptedException, IOException { ColumnFamilyStore store = prepareColumnFamilyStore(); Collection sstables = store.getUnrepairedSSTables(); @@ -259,7 +259,7 @@ public void shouldMutateRepairedAt() throws InterruptedException, ExecutionExcep @Test - public void shouldSkipAntiCompactionForNonIntersectingRange() throws InterruptedException, ExecutionException, IOException + public void shouldSkipAntiCompactionForNonIntersectingRange() throws InterruptedException, IOException { Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore(CF); diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java index 4b5aa795e387..6db01d708e4f 100644 --- a/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java @@ -90,7 +90,7 @@ public static void defineSchema() throws ConfigurationException } @Test - public void testMajorCompactionPurge() throws ExecutionException, InterruptedException + public void testMajorCompactionPurge() { CompactionManager.instance.disableAutoCompaction(); @@ -362,7 +362,7 @@ public void testCompactionPurgeTombstonedRow() throws ExecutionException, Interr } @Test - public void testRowTombstoneObservedBeforePurging() throws InterruptedException, ExecutionException + public void testRowTombstoneObservedBeforePurging() { String keyspace = "cql_keyspace"; String table = "table1"; diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java index a6ee3f90ebbd..0016261725fa 100644 --- a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java @@ -160,7 +160,7 @@ public void testSingleSSTableCompactionWithLeveledCompaction() throws Exception } @Test - public void testSuperColumnTombstones() throws ExecutionException, InterruptedException + public void testSuperColumnTombstones() { Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore("Super1"); @@ -378,7 +378,7 @@ public void testUserDefinedCompaction() throws Exception } @Test - public void testRangeTombstones() throws IOException, ExecutionException, InterruptedException + public void testRangeTombstones() { Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore("Standard2"); diff --git a/test/unit/org/apache/cassandra/db/compaction/OneCompactionTest.java b/test/unit/org/apache/cassandra/db/compaction/OneCompactionTest.java index 216c9cfbaa52..a2c4191db668 100644 --- a/test/unit/org/apache/cassandra/db/compaction/OneCompactionTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/OneCompactionTest.java @@ -59,7 +59,7 @@ public static void defineSchema() throws ConfigurationException SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD2)); } - private void testCompaction(String columnFamilyName, int insertsPerTable) throws ExecutionException, InterruptedException + private void testCompaction(String columnFamilyName, int insertsPerTable) { CompactionManager.instance.disableAutoCompaction(); @@ -81,13 +81,13 @@ private void testCompaction(String columnFamilyName, int insertsPerTable) throws } @Test - public void testCompaction1() throws ExecutionException, InterruptedException + public void testCompaction1() { testCompaction("Standard1", 1); } @Test - public void testCompaction2() throws ExecutionException, InterruptedException + public void testCompaction2() { testCompaction("Standard2", 2); } diff --git a/test/unit/org/apache/cassandra/db/index/PerRowSecondaryIndexTest.java b/test/unit/org/apache/cassandra/db/index/PerRowSecondaryIndexTest.java index b2cc1a4e25d5..a415634d1e1a 100644 --- a/test/unit/org/apache/cassandra/db/index/PerRowSecondaryIndexTest.java +++ b/test/unit/org/apache/cassandra/db/index/PerRowSecondaryIndexTest.java @@ -144,7 +144,7 @@ public void testRowDelete() } @Test - public void testInvalidSearch() throws IOException + public void testInvalidSearch() { Mutation rm; rm = new Mutation(KEYSPACE1, ByteBufferUtil.bytes("k4")); diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java index 0a29255327cc..25f906fb79b5 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java @@ -107,7 +107,7 @@ public static void defineSchema() throws Exception } @Test - public void testGetPositionsForRanges() throws ExecutionException, InterruptedException + public void testGetPositionsForRanges() { Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore("Standard2"); @@ -146,7 +146,7 @@ public void testGetPositionsForRanges() throws ExecutionException, InterruptedEx } @Test - public void testSpannedIndexPositions() throws IOException, ExecutionException, InterruptedException + public void testSpannedIndexPositions() throws IOException { MmappedSegmentedFile.MAX_SEGMENT_SIZE = 40; // each index entry is ~11 bytes, so this will generate lots of segments @@ -238,7 +238,7 @@ public void testReadRateTracking() } @Test - public void testGetPositionsForRangesWithKeyCache() throws ExecutionException, InterruptedException + public void testGetPositionsForRangesWithKeyCache() { Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore("Standard2"); @@ -286,7 +286,7 @@ public void testPersistentStatisticsWithSecondaryIndex() // check if opening and querying works assertIndexQueryWorks(store); } - public void testGetPositionsKeyCacheStats() throws IOException, ExecutionException, InterruptedException + public void testGetPositionsKeyCacheStats() { Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore("Standard2"); @@ -407,7 +407,7 @@ public void testGetScannerForNoIntersectingRanges() } @Test - public void testGetPositionsForRangesFromTableOpenedForBulkLoading() throws IOException, ExecutionException, InterruptedException + public void testGetPositionsForRangesFromTableOpenedForBulkLoading() throws IOException { Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore("Standard2"); diff --git a/test/unit/org/apache/cassandra/thrift/ThriftValidationTest.java b/test/unit/org/apache/cassandra/thrift/ThriftValidationTest.java index 708c29a4521f..747b522f3243 100644 --- a/test/unit/org/apache/cassandra/thrift/ThriftValidationTest.java +++ b/test/unit/org/apache/cassandra/thrift/ThriftValidationTest.java @@ -48,7 +48,7 @@ public class ThriftValidationTest public static final String CF_STANDARDLONG3 = "StandardLong3"; @BeforeClass - public static void defineSchema() throws ConfigurationException, IOException, TException + public static void defineSchema() throws ConfigurationException { SchemaLoader.prepareServer(); SchemaLoader.createKeyspace(KEYSPACE1, diff --git a/test/unit/org/apache/cassandra/tools/SSTableExportTest.java b/test/unit/org/apache/cassandra/tools/SSTableExportTest.java index 8e3f5cacb8f2..3b041105603f 100644 --- a/test/unit/org/apache/cassandra/tools/SSTableExportTest.java +++ b/test/unit/org/apache/cassandra/tools/SSTableExportTest.java @@ -74,7 +74,7 @@ public class SSTableExportTest public static final String CF_VALSWITHQUOTES = "ValuesWithQuotes"; @BeforeClass - public static void defineSchema() throws ConfigurationException, IOException, TException + public static void defineSchema() throws ConfigurationException { SchemaLoader.prepareServer(); SchemaLoader.createKeyspace(KEYSPACE1, diff --git a/test/unit/org/apache/cassandra/tools/SSTableImportTest.java b/test/unit/org/apache/cassandra/tools/SSTableImportTest.java index eb5fb28fbbda..3e64b3843fb2 100644 --- a/test/unit/org/apache/cassandra/tools/SSTableImportTest.java +++ b/test/unit/org/apache/cassandra/tools/SSTableImportTest.java @@ -71,7 +71,7 @@ public class SSTableImportTest public static final String CQL_TABLE = "table1"; @BeforeClass - public static void defineSchema() throws ConfigurationException, IOException, TException + public static void defineSchema() throws ConfigurationException { SchemaLoader.prepareServer(); SchemaLoader.createKeyspace(KEYSPACE1, diff --git a/test/unit/org/apache/cassandra/utils/BitSetTest.java b/test/unit/org/apache/cassandra/utils/BitSetTest.java index 59bc5e42d013..2f1e7c6ba3b2 100644 --- a/test/unit/org/apache/cassandra/utils/BitSetTest.java +++ b/test/unit/org/apache/cassandra/utils/BitSetTest.java @@ -70,15 +70,19 @@ public void compareBitSets() @Test public void testOffHeapSerialization() throws IOException { - OffHeapBitSet bs = new OffHeapBitSet(100000); - populateAndReserialize(bs); + try (OffHeapBitSet bs = new OffHeapBitSet(100000)) + { + populateAndReserialize(bs); + } } @Test public void testOffHeapCompatibility() throws IOException { - OpenBitSet bs = new OpenBitSet(100000); - populateAndReserialize(bs); + try (OpenBitSet bs = new OpenBitSet(100000)) + { + populateAndReserialize(bs); + } } private void populateAndReserialize(IBitSet bs) throws IOException @@ -90,8 +94,10 @@ private void populateAndReserialize(IBitSet bs) throws IOException DataOutputBuffer out = new DataOutputBuffer(); bs.serialize(out); DataInputStream in = new DataInputStream(new ByteArrayInputStream(out.getData())); - OffHeapBitSet newbs = OffHeapBitSet.deserialize(in); - compare(bs, newbs); + try (OffHeapBitSet newbs = OffHeapBitSet.deserialize(in)) + { + compare(bs, newbs); + } } private void compare(IBitSet bs, IBitSet newbs) @@ -102,25 +108,26 @@ private void compare(IBitSet bs, IBitSet newbs) } @Test - public void testBitClear() throws IOException + public void testBitClear() { int size = Integer.MAX_VALUE / 4000; - OffHeapBitSet bitset = new OffHeapBitSet(size); - List randomBits = Lists.newArrayList(); - for (int i = 0; i < 10; i++) - randomBits.add(random.nextInt(size)); - - for (long randomBit : randomBits) - bitset.set(randomBit); - - for (long randomBit : randomBits) - Assert.assertEquals(true, bitset.get(randomBit)); - - for (long randomBit : randomBits) - bitset.clear(randomBit); - - for (long randomBit : randomBits) - Assert.assertEquals(false, bitset.get(randomBit)); - bitset.close(); + try (OffHeapBitSet bitset = new OffHeapBitSet(size)) + { + List randomBits = Lists.newArrayList(); + for (int i = 0; i < 10; i++) + randomBits.add(random.nextInt(size)); + + for (long randomBit : randomBits) + bitset.set(randomBit); + + for (long randomBit : randomBits) + Assert.assertEquals(true, bitset.get(randomBit)); + + for (long randomBit : randomBits) + bitset.clear(randomBit); + + for (long randomBit : randomBits) + Assert.assertEquals(false, bitset.get(randomBit)); + } } } diff --git a/test/unit/org/apache/cassandra/utils/JVMStabilityInspectorTest.java b/test/unit/org/apache/cassandra/utils/JVMStabilityInspectorTest.java index 2ecbee45c546..f58824436785 100644 --- a/test/unit/org/apache/cassandra/utils/JVMStabilityInspectorTest.java +++ b/test/unit/org/apache/cassandra/utils/JVMStabilityInspectorTest.java @@ -68,7 +68,7 @@ public void testKill() throws Exception } @Test - public void fileHandleTest() throws FileNotFoundException + public void fileHandleTest() { KillerForTests killerForTests = new KillerForTests(); JVMStabilityInspector.Killer originalKiller = JVMStabilityInspector.replaceKiller(killerForTests); From 2e22bc9aa6d5c0e6ca90acfa8e7923390e69b033 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Sun, 25 Jan 2015 22:57:27 -0500 Subject: [PATCH 253/557] cleanup test:close OffHeapBitSets, use junit --- .../cassandra/utils/SerializationsTest.java | 46 +++++++++++-------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/test/unit/org/apache/cassandra/utils/SerializationsTest.java b/test/unit/org/apache/cassandra/utils/SerializationsTest.java index 46fa017b4f18..d5b45d12f159 100644 --- a/test/unit/org/apache/cassandra/utils/SerializationsTest.java +++ b/test/unit/org/apache/cassandra/utils/SerializationsTest.java @@ -22,6 +22,7 @@ import org.apache.cassandra.io.util.DataOutputStreamAndChannel; import org.apache.cassandra.service.StorageService; +import org.junit.Assert; import org.junit.Test; import java.io.DataInputStream; @@ -32,12 +33,15 @@ public class SerializationsTest extends AbstractSerializationsTester private void testBloomFilterWrite(boolean offheap) throws IOException { - IFilter bf = FilterFactory.getFilter(1000000, 0.0001, offheap); - for (int i = 0; i < 100; i++) - bf.add(StorageService.getPartitioner().getTokenFactory().toByteArray(StorageService.getPartitioner().getRandomToken())); - DataOutputStreamAndChannel out = getOutput("utils.BloomFilter.bin"); - FilterFactory.serialize(bf, out); - out.close(); + try (IFilter bf = FilterFactory.getFilter(1000000, 0.0001, offheap)) + { + for (int i = 0; i < 100; i++) + bf.add(StorageService.getPartitioner().getTokenFactory().toByteArray(StorageService.getPartitioner().getRandomToken())); + try (DataOutputStreamAndChannel out = getOutput("utils.BloomFilter.bin")) + { + FilterFactory.serialize(bf, out); + } + } } @Test @@ -46,9 +50,11 @@ public void testBloomFilterReadMURMUR3() throws IOException if (EXECUTE_WRITES) testBloomFilterWrite(true); - DataInputStream in = getInput("utils.BloomFilter.bin"); - assert FilterFactory.deserialize(in, true) != null; - in.close(); + try (DataInputStream in = getInput("utils.BloomFilter.bin"); + IFilter filter = FilterFactory.deserialize(in, true)) + { + Assert.assertNotNull(filter); + } } private void testEstimatedHistogramWrite() throws IOException @@ -65,11 +71,12 @@ private void testEstimatedHistogramWrite() throws IOException data[offsets.length] = 100000; EstimatedHistogram hist2 = new EstimatedHistogram(offsets, data); - DataOutputStreamAndChannel out = getOutput("utils.EstimatedHistogram.bin"); - EstimatedHistogram.serializer.serialize(hist0, out); - EstimatedHistogram.serializer.serialize(hist1, out); - EstimatedHistogram.serializer.serialize(hist2, out); - out.close(); + try (DataOutputStreamAndChannel out = getOutput("utils.EstimatedHistogram.bin")) + { + EstimatedHistogram.serializer.serialize(hist0, out); + EstimatedHistogram.serializer.serialize(hist1, out); + EstimatedHistogram.serializer.serialize(hist2, out); + } } @Test @@ -78,10 +85,11 @@ public void testEstimatedHistogramRead() throws IOException if (EXECUTE_WRITES) testEstimatedHistogramWrite(); - DataInputStream in = getInput("utils.EstimatedHistogram.bin"); - assert EstimatedHistogram.serializer.deserialize(in) != null; - assert EstimatedHistogram.serializer.deserialize(in) != null; - assert EstimatedHistogram.serializer.deserialize(in) != null; - in.close(); + try (DataInputStream in = getInput("utils.EstimatedHistogram.bin")) + { + Assert.assertNotNull(EstimatedHistogram.serializer.deserialize(in)); + Assert.assertNotNull(EstimatedHistogram.serializer.deserialize(in)); + Assert.assertNotNull(EstimatedHistogram.serializer.deserialize(in)); + } } } From 7fb99d93ff32a9e972d9f359705e123e6b72e0f6 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Tue, 27 Jan 2015 02:05:04 -0500 Subject: [PATCH 254/557] trunk is using 1.0.5.2 of snappy-java --- build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.xml b/build.xml index 9bd565f62d74..12c877ae3a80 100644 --- a/build.xml +++ b/build.xml @@ -316,7 +316,7 @@ - + From 6068daea866bffd9fcc20f81219a21631dbf9bf0 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Tue, 27 Jan 2015 02:28:04 -0500 Subject: [PATCH 255/557] using commons-lang3, not commons-lang --- .../org/apache/cassandra/cql3/CreateIndexStatementTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/org/apache/cassandra/cql3/CreateIndexStatementTest.java b/test/unit/org/apache/cassandra/cql3/CreateIndexStatementTest.java index 847466ecbfe4..1e2e08433dd5 100644 --- a/test/unit/org/apache/cassandra/cql3/CreateIndexStatementTest.java +++ b/test/unit/org/apache/cassandra/cql3/CreateIndexStatementTest.java @@ -19,7 +19,7 @@ import java.util.Locale; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.junit.Test; From 02367e78b573925a864ab8f94ba0a69950ca74f5 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Tue, 27 Jan 2015 20:35:18 -0500 Subject: [PATCH 256/557] remove dead code --- test/unit/org/apache/cassandra/Util.java | 37 ------------------------ 1 file changed, 37 deletions(-) diff --git a/test/unit/org/apache/cassandra/Util.java b/test/unit/org/apache/cassandra/Util.java index cdb7ac6b913f..24e334a2a14b 100644 --- a/test/unit/org/apache/cassandra/Util.java +++ b/test/unit/org/apache/cassandra/Util.java @@ -211,27 +211,6 @@ public static ColumnFamily getColumnFamily(Keyspace keyspace, DecoratedKey key, return cfStore.getColumnFamily(QueryFilter.getIdentityFilter(key, cfName, System.currentTimeMillis())); } - public static byte[] concatByteArrays(byte[] first, byte[]... remaining) - { - int length = first.length; - for (byte[] array : remaining) - { - length += array.length; - } - - byte[] result = new byte[length]; - System.arraycopy(first, 0, result, 0, first.length); - int offset = first.length; - - for (byte[] array : remaining) - { - System.arraycopy(array, 0, result, offset, array.length); - offset += array.length; - } - - return result; - } - public static boolean equalsCounterId(CounterId n, ByteBuffer context, int offset) { return CounterId.wrap(context, context.position() + offset).equals(n); @@ -313,22 +292,6 @@ public static void expectException(Callable callable, Class exception) assert thrown : exception.getName() + " not received"; } - public static ByteBuffer serializeForSSTable(ColumnFamily cf) - { - try - { - DataOutputBuffer out = new DataOutputBuffer(); - DeletionTime.serializer.serialize(cf.deletionInfo().getTopLevelDeletion(), out); - out.writeInt(cf.getColumnCount()); - new ColumnIndex.Builder(cf, ByteBufferUtil.EMPTY_BYTE_BUFFER, out).build(cf); - return ByteBuffer.wrap(out.toByteArray()); - } - catch (IOException e) - { - throw new RuntimeException(e); - } - } - public static QueryFilter namesQueryFilter(ColumnFamilyStore cfs, DecoratedKey key) { SortedSet s = new TreeSet(cfs.getComparator()); From 2b028b2b248e945d28a73537db9e41643138bcd7 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Tue, 27 Jan 2015 21:48:24 -0500 Subject: [PATCH 257/557] javadoc --- src/java/org/apache/cassandra/sink/SinkManager.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/java/org/apache/cassandra/sink/SinkManager.java b/src/java/org/apache/cassandra/sink/SinkManager.java index 9b422dceec81..303c1072806f 100644 --- a/src/java/org/apache/cassandra/sink/SinkManager.java +++ b/src/java/org/apache/cassandra/sink/SinkManager.java @@ -25,6 +25,10 @@ import org.apache.cassandra.net.MessageIn; import org.apache.cassandra.net.MessageOut; +/** + * a class used only for testing to avoid sending/receiving data from a junit test. + * needs to be in the source tree as MessagingService calls it directly. + */ public class SinkManager { private static final Set messageSinks = new CopyOnWriteArraySet<>(); From 8896a70b015102c212d0a27ed1f4e1f0fabe85c4 Mon Sep 17 00:00:00 2001 From: T Jake Luciani Date: Mon, 5 Jan 2015 09:34:08 -0500 Subject: [PATCH 258/557] Upgrade metrics library and remove depricated metrics Patch by tjake; reviewed by aleksey for CASSANDRA-5657 --- CHANGES.txt | 1 + build.xml | 4 +- ...-core-2.2.0.txt => metrics-core-3.1.0.txt} | 0 lib/metrics-core-2.2.0.jar | Bin 82123 -> 0 bytes lib/metrics-core-3.1.0.jar | Bin 0 -> 111908 bytes ...JMXEnabledScheduledThreadPoolExecutor.java | 4 +- .../JMXEnabledSharedExecutorPool.java | 113 --- .../JMXEnabledThreadPoolExecutor.java | 21 +- .../JMXEnabledThreadPoolExecutorMBean.java | 19 +- .../cassandra/concurrent/SEPExecutor.java | 32 +- .../concurrent/SharedExecutorPool.java | 9 + .../apache/cassandra/concurrent/Stage.java | 16 + .../cassandra/concurrent/StageManager.java | 2 +- .../cassandra/db/ColumnFamilyStore.java | 176 +--- .../cassandra/db/ColumnFamilyStoreMBean.java | 234 ------ .../cassandra/db/HintedHandOffManager.java | 2 +- .../cassandra/db/commitlog/CommitLog.java | 20 - .../db/commitlog/CommitLogMBean.java | 21 - .../db/compaction/CompactionInfo.java | 3 +- .../db/compaction/CompactionManager.java | 8 +- .../db/compaction/CompactionManagerMBean.java | 28 - .../cassandra/db/filter/ExtendedFilter.java | 2 +- .../org/apache/cassandra/gms/Gossiper.java | 2 +- .../locator/DynamicEndpointSnitch.java | 18 +- .../metrics/CASClientRequestMetrics.java | 20 +- .../apache/cassandra/metrics/CQLMetrics.java | 30 +- .../cassandra/metrics/CacheMetrics.java | 59 +- .../metrics/CassandraMetricsRegistry.java | 791 ++++++++++++++++++ .../ClearableHistogram.java} | 35 +- .../cassandra/metrics/ClientMetrics.java | 13 +- .../metrics/ClientRequestMetrics.java | 26 +- .../metrics/ColumnFamilyMetrics.java | 157 ++-- .../cassandra/metrics/CommitLogMetrics.java | 23 +- .../cassandra/metrics/CompactionMetrics.java | 22 +- .../cassandra/metrics/ConnectionMetrics.java | 66 +- .../cassandra/metrics/DefaultNameFactory.java | 7 +- .../metrics/DroppedMessageMetrics.java | 21 +- .../metrics/EstimatedHistogramReservoir.java | 105 +++ .../cassandra/metrics/FileCacheMetrics.java | 32 +- .../metrics/HintedHandoffMetrics.java | 15 +- .../cassandra/metrics/KeyspaceMetrics.java | 62 +- .../cassandra/metrics/LatencyMetrics.java | 44 +- .../cassandra/metrics/MetricNameFactory.java | 3 +- .../cassandra/metrics/ReadRepairMetrics.java | 14 +- .../cassandra/metrics/RestorableMeter.java | 10 +- .../apache/cassandra/metrics/SEPMetrics.java | 55 +- .../cassandra/metrics/StorageMetrics.java | 13 +- .../cassandra/metrics/StreamingMetrics.java | 16 +- .../metrics/ThreadPoolMetricNameFactory.java | 6 +- .../cassandra/metrics/ThreadPoolMetrics.java | 74 +- .../cassandra/net/MessagingService.java | 30 +- .../cassandra/net/MessagingServiceMBean.java | 15 - .../net/OutboundTcpConnectionPool.java | 6 +- .../scheduler/RoundRobinScheduler.java | 2 - .../cassandra/scheduler/WeightedQueue.java | 43 +- .../scheduler/WeightedQueueMBean.java | 32 - .../cassandra/service/CacheService.java | 67 +- .../cassandra/service/CacheServiceMBean.java | 86 -- .../cassandra/service/CassandraDaemon.java | 7 +- .../cassandra/service/LoadBroadcaster.java | 3 +- .../cassandra/service/StorageProxy.java | 102 +-- .../cassandra/service/StorageProxyMBean.java | 48 -- .../cassandra/service/StorageService.java | 21 +- .../service/StorageServiceMBean.java | 10 - .../cassandra/thrift/CassandraServer.java | 2 +- .../org/apache/cassandra/tools/NodeProbe.java | 109 +-- .../org/apache/cassandra/tools/NodeTool.java | 56 +- .../transport/RequestThreadPoolExecutor.java | 6 +- .../apache/cassandra/utils/StatusLogger.java | 40 +- .../cassandra/utils/concurrent/WaitQueue.java | 10 +- .../LongSharedExecutorPoolTest.java | 2 +- .../cassandra/db/LongFlushMemtableTest.java | 2 +- .../apache/cassandra/utils/LongBTreeTest.java | 15 +- .../cassandra/db/ColumnFamilyMetricTest.java | 12 +- .../cassandra/db/ColumnFamilyStoreTest.java | 5 +- .../org/apache/cassandra/db/KeyspaceTest.java | 17 +- .../org/apache/cassandra/db/RowCacheTest.java | 20 +- .../db/compaction/AntiCompactionTest.java | 4 +- .../io/sstable/SSTableReaderTest.java | 2 +- .../io/sstable/SSTableRewriterTest.java | 16 +- .../cassandra/metrics/CQLMetricsTest.java | 32 +- .../cassandra/metrics/LatencyMetricsTest.java | 2 +- 82 files changed, 1532 insertions(+), 1746 deletions(-) rename lib/licenses/{metrics-core-2.2.0.txt => metrics-core-3.1.0.txt} (100%) delete mode 100644 lib/metrics-core-2.2.0.jar create mode 100644 lib/metrics-core-3.1.0.jar delete mode 100644 src/java/org/apache/cassandra/concurrent/JMXEnabledSharedExecutorPool.java create mode 100644 src/java/org/apache/cassandra/metrics/CassandraMetricsRegistry.java rename src/java/org/apache/cassandra/{concurrent/IExecutorMBean.java => metrics/ClearableHistogram.java} (55%) create mode 100644 src/java/org/apache/cassandra/metrics/EstimatedHistogramReservoir.java delete mode 100644 src/java/org/apache/cassandra/scheduler/WeightedQueueMBean.java diff --git a/CHANGES.txt b/CHANGES.txt index 36b081b87524..16e7c7d824f8 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0 + * Upgrade Metrics library and remove depricated metrics (CASSANDRA-5657) * Serializing Row cache alternative, fully off heap (CASSANDRA-7438) * Duplicate rows returned when in clause has repeated values (CASSANDRA-6707) * Make CassandraException unchecked, extend RuntimeException (CASSANDRA-8560) diff --git a/build.xml b/build.xml index ce9a60334421..0d96f4cd31d3 100644 --- a/build.xml +++ b/build.xml @@ -368,7 +368,7 @@ - + @@ -483,7 +483,7 @@ - + diff --git a/lib/licenses/metrics-core-2.2.0.txt b/lib/licenses/metrics-core-3.1.0.txt similarity index 100% rename from lib/licenses/metrics-core-2.2.0.txt rename to lib/licenses/metrics-core-3.1.0.txt diff --git a/lib/metrics-core-2.2.0.jar b/lib/metrics-core-2.2.0.jar deleted file mode 100644 index 0f6d1cb0ecbd37f673bc87e109cacc535e23350a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82123 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 diff --git a/lib/metrics-core-3.1.0.jar b/lib/metrics-core-3.1.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..564ffb778e3d7e112d71e3d343d802173330476f GIT binary patch literal 111908 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%0D~a-0OIXjJB8IjNWCRsE@|OS#rP-W9DAI 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

    ({LWoEOR37RKl3=4 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 RU<3Y<04%IM2w07P{XgQPcD(=q literal 0 HcmV?d00001 diff --git a/src/java/org/apache/cassandra/concurrent/JMXEnabledScheduledThreadPoolExecutor.java b/src/java/org/apache/cassandra/concurrent/JMXEnabledScheduledThreadPoolExecutor.java index 64d926777022..50c9591f734d 100644 --- a/src/java/org/apache/cassandra/concurrent/JMXEnabledScheduledThreadPoolExecutor.java +++ b/src/java/org/apache/cassandra/concurrent/JMXEnabledScheduledThreadPoolExecutor.java @@ -107,12 +107,12 @@ public long getPendingTasks() public int getTotalBlockedTasks() { - return (int) metrics.totalBlocked.count(); + return (int) metrics.totalBlocked.getCount(); } public int getCurrentlyBlockedTasks() { - return (int) metrics.currentBlocked.count(); + return (int) metrics.currentBlocked.getCount(); } public int getCoreThreads() diff --git a/src/java/org/apache/cassandra/concurrent/JMXEnabledSharedExecutorPool.java b/src/java/org/apache/cassandra/concurrent/JMXEnabledSharedExecutorPool.java deleted file mode 100644 index 54bb7722618f..000000000000 --- a/src/java/org/apache/cassandra/concurrent/JMXEnabledSharedExecutorPool.java +++ /dev/null @@ -1,113 +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.concurrent; - -import java.lang.management.ManagementFactory; -import javax.management.MBeanServer; -import javax.management.ObjectName; - -import org.apache.cassandra.metrics.SEPMetrics; - -public class JMXEnabledSharedExecutorPool extends SharedExecutorPool -{ - - public static final JMXEnabledSharedExecutorPool SHARED = new JMXEnabledSharedExecutorPool("SharedPool"); - - public JMXEnabledSharedExecutorPool(String poolName) - { - super(poolName); - } - - public interface JMXEnabledSEPExecutorMBean extends JMXEnabledThreadPoolExecutorMBean - { - } - - public class JMXEnabledSEPExecutor extends SEPExecutor implements JMXEnabledSEPExecutorMBean - { - - private final SEPMetrics metrics; - private final String mbeanName; - - public JMXEnabledSEPExecutor(int poolSize, int maxQueuedLength, String name, String jmxPath) - { - super(JMXEnabledSharedExecutorPool.this, poolSize, maxQueuedLength); - metrics = new SEPMetrics(this, jmxPath, name); - - MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); - mbeanName = "org.apache.cassandra." + jmxPath + ":type=" + name; - - try - { - mbs.registerMBean(this, new ObjectName(mbeanName)); - } - catch (Exception e) - { - throw new RuntimeException(e); - } - } - - private void unregisterMBean() - { - try - { - ManagementFactory.getPlatformMBeanServer().unregisterMBean(new ObjectName(mbeanName)); - } - catch (Exception e) - { - throw new RuntimeException(e); - } - - // release metrics - metrics.release(); - } - - @Override - public synchronized void shutdown() - { - // synchronized, because there is no way to access super.mainLock, which would be - // the preferred way to make this threadsafe - if (!isShutdown()) - { - unregisterMBean(); - } - super.shutdown(); - } - - public int getCoreThreads() - { - return 0; - } - - public void setCoreThreads(int number) - { - throw new UnsupportedOperationException(); - } - - public void setMaximumThreads(int number) - { - throw new UnsupportedOperationException(); - } - } - - public TracingAwareExecutorService newExecutor(int maxConcurrency, int maxQueuedTasks, String name, String jmxPath) - { - JMXEnabledSEPExecutor executor = new JMXEnabledSEPExecutor(maxConcurrency, maxQueuedTasks, name, jmxPath); - executors.add(executor); - return executor; - } -} diff --git a/src/java/org/apache/cassandra/concurrent/JMXEnabledThreadPoolExecutor.java b/src/java/org/apache/cassandra/concurrent/JMXEnabledThreadPoolExecutor.java index 3f60df163bae..2b8670155c4f 100644 --- a/src/java/org/apache/cassandra/concurrent/JMXEnabledThreadPoolExecutor.java +++ b/src/java/org/apache/cassandra/concurrent/JMXEnabledThreadPoolExecutor.java @@ -36,7 +36,7 @@ public class JMXEnabledThreadPoolExecutor extends DebuggableThreadPoolExecutor implements JMXEnabledThreadPoolExecutorMBean { private final String mbeanName; - private final ThreadPoolMetrics metrics; + public final ThreadPoolMetrics metrics; public JMXEnabledThreadPoolExecutor(String threadPoolName) { @@ -132,30 +132,17 @@ public synchronized List shutdownNow() return super.shutdownNow(); } - /** - * Get the number of completed tasks - */ - public long getCompletedTasks() - { - return getCompletedTaskCount(); - } - /** - * Get the number of tasks waiting to be executed - */ - public long getPendingTasks() - { - return getTaskCount() - getCompletedTaskCount(); - } + public int getTotalBlockedTasks() { - return (int) metrics.totalBlocked.count(); + return (int) metrics.totalBlocked.getCount(); } public int getCurrentlyBlockedTasks() { - return (int) metrics.currentBlocked.count(); + return (int) metrics.currentBlocked.getCount(); } public int getCoreThreads() diff --git a/src/java/org/apache/cassandra/concurrent/JMXEnabledThreadPoolExecutorMBean.java b/src/java/org/apache/cassandra/concurrent/JMXEnabledThreadPoolExecutorMBean.java index ed2a2ac48680..fb964aec130f 100644 --- a/src/java/org/apache/cassandra/concurrent/JMXEnabledThreadPoolExecutorMBean.java +++ b/src/java/org/apache/cassandra/concurrent/JMXEnabledThreadPoolExecutorMBean.java @@ -17,24 +17,9 @@ */ package org.apache.cassandra.concurrent; -/** - * @see org.apache.cassandra.metrics.ThreadPoolMetrics - */ -@Deprecated -public interface JMXEnabledThreadPoolExecutorMBean extends IExecutorMBean -{ - /** - * Get the number of tasks that had blocked before being accepted (or - * rejected). - */ - public int getTotalBlockedTasks(); - - /** - * Get the number of tasks currently blocked, waiting to be accepted by - * the executor (because all threads are busy and the backing queue is full). - */ - public int getCurrentlyBlockedTasks(); +public interface JMXEnabledThreadPoolExecutorMBean +{ /** * Returns core pool size of thread pool. */ diff --git a/src/java/org/apache/cassandra/concurrent/SEPExecutor.java b/src/java/org/apache/cassandra/concurrent/SEPExecutor.java index f6d1940fee3d..d9a0fa8a20e0 100644 --- a/src/java/org/apache/cassandra/concurrent/SEPExecutor.java +++ b/src/java/org/apache/cassandra/concurrent/SEPExecutor.java @@ -24,6 +24,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; +import org.apache.cassandra.metrics.SEPMetrics; import org.apache.cassandra.utils.concurrent.SimpleCondition; import org.apache.cassandra.utils.concurrent.WaitQueue; @@ -35,6 +36,7 @@ public class SEPExecutor extends AbstractTracingAwareExecutorService public final int maxWorkers; private final int maxTasksQueued; + private final SEPMetrics metrics; // stores both a set of work permits and task permits: // bottom 32 bits are number of queued tasks, in the range [0..maxTasksQueued] (initially 0) @@ -43,8 +45,6 @@ public class SEPExecutor extends AbstractTracingAwareExecutorService // producers wait on this when there is no room on the queue private final WaitQueue hasRoom = new WaitQueue(); - private final AtomicLong totalBlocked = new AtomicLong(); - private final AtomicInteger currentlyBlocked = new AtomicInteger(); private final AtomicLong completedTasks = new AtomicLong(); volatile boolean shuttingDown = false; @@ -53,12 +53,13 @@ public class SEPExecutor extends AbstractTracingAwareExecutorService // TODO: see if other queue implementations might improve throughput protected final ConcurrentLinkedQueue> tasks = new ConcurrentLinkedQueue<>(); - SEPExecutor(SharedExecutorPool pool, int maxWorkers, int maxTasksQueued) + SEPExecutor(SharedExecutorPool pool, int maxWorkers, int maxTasksQueued, String jmxPath, String name) { this.pool = pool; this.maxWorkers = maxWorkers; this.maxTasksQueued = maxTasksQueued; this.permits.set(combine(0, maxWorkers)); + this.metrics = new SEPMetrics(this, jmxPath, name); } protected void onCompletion() @@ -116,10 +117,11 @@ else if (taskPermits >= maxTasksQueued) // if we're blocking, we might as well directly schedule a worker if we aren't already at max if (takeWorkPermit(true)) pool.schedule(new Work(this)); - totalBlocked.incrementAndGet(); - currentlyBlocked.incrementAndGet(); + + metrics.totalBlocked.inc(); + metrics.currentBlocked.inc(); s.awaitUninterruptibly(); - currentlyBlocked.decrementAndGet(); + metrics.currentBlocked.dec(); } else // don't propagate our signal when we cancel, just cancel s.cancel(); @@ -207,6 +209,9 @@ public synchronized void shutdown() pool.executors.remove(this); if (getActiveCount() == 0) shutdown.signalAll(); + + // release metrics + metrics.release(); } public synchronized List shutdownNow() @@ -249,21 +254,6 @@ public int getActiveCount() return maxWorkers - workPermits(permits.get()); } - public int getTotalBlockedTasks() - { - return (int) totalBlocked.get(); - } - - public int getMaximumThreads() - { - return maxWorkers; - } - - public int getCurrentlyBlockedTasks() - { - return currentlyBlocked.get(); - } - private static int taskPermits(long both) { return (int) both; diff --git a/src/java/org/apache/cassandra/concurrent/SharedExecutorPool.java b/src/java/org/apache/cassandra/concurrent/SharedExecutorPool.java index fb3ff13ba79d..8c18c44c6984 100644 --- a/src/java/org/apache/cassandra/concurrent/SharedExecutorPool.java +++ b/src/java/org/apache/cassandra/concurrent/SharedExecutorPool.java @@ -54,6 +54,8 @@ public class SharedExecutorPool { + public static final SharedExecutorPool SHARED = new SharedExecutorPool("SharedPool"); + // the name assigned to workers in the pool, and the id suffix final String poolName; final AtomicLong workerId = new AtomicLong(); @@ -100,4 +102,11 @@ void maybeStartSpinningWorker() if (current == 0 && spinningCount.compareAndSet(0, 1)) schedule(Work.SPINNING); } + + public TracingAwareExecutorService newExecutor(int maxConcurrency, int maxQueuedTasks, String jmxPath, String name) + { + SEPExecutor executor = new SEPExecutor(this, maxConcurrency, maxQueuedTasks, jmxPath, name); + executors.add(executor); + return executor; + } } diff --git a/src/java/org/apache/cassandra/concurrent/Stage.java b/src/java/org/apache/cassandra/concurrent/Stage.java index 6192cabad2e5..4e3700f08ccf 100644 --- a/src/java/org/apache/cassandra/concurrent/Stage.java +++ b/src/java/org/apache/cassandra/concurrent/Stage.java @@ -17,6 +17,11 @@ */ package org.apache.cassandra.concurrent; +import java.util.Arrays; + +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; + public enum Stage { READ, @@ -31,6 +36,17 @@ public enum Stage INTERNAL_RESPONSE, READ_REPAIR; + public static Iterable jmxEnabledStages() + { + return Iterables.filter(Arrays.asList(values()), new Predicate() + { + public boolean apply(Stage stage) + { + return stage != TRACING; + } + }); + } + public String getJmxType() { switch (this) diff --git a/src/java/org/apache/cassandra/concurrent/StageManager.java b/src/java/org/apache/cassandra/concurrent/StageManager.java index 303f65823569..4f03fd5f58bb 100644 --- a/src/java/org/apache/cassandra/concurrent/StageManager.java +++ b/src/java/org/apache/cassandra/concurrent/StageManager.java @@ -89,7 +89,7 @@ private static JMXEnabledThreadPoolExecutor multiThreadedStage(Stage stage, int private static TracingAwareExecutorService multiThreadedLowSignalStage(Stage stage, int numThreads) { - return JMXEnabledSharedExecutorPool.SHARED.newExecutor(numThreads, Integer.MAX_VALUE, stage.getJmxName(), stage.getJmxType()); + return SharedExecutorPool.SHARED.newExecutor(numThreads, Integer.MAX_VALUE, stage.getJmxType(), stage.getJmxName()); } /** diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java index 9824e4a4aa00..15aef945211f 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java @@ -365,7 +365,6 @@ public void run() { case PERCENTILE: // get percentile in nanos - assert metric.coordinatorReadLatency.durationUnit() == TimeUnit.MICROSECONDS; sampleLatencyNanos = (long) (metric.coordinatorReadLatency.getSnapshot().getValue(retryPolicy.value) * 1000d); break; case CUSTOM: @@ -425,25 +424,6 @@ void unregisterMBean() throws MalformedObjectNameException, InstanceNotFoundExce metric.release(); } - public long getMinRowSize() - { - return metric.minRowSize.value(); - } - - public long getMaxRowSize() - { - return metric.maxRowSize.value(); - } - - public long getMeanRowSize() - { - return metric.meanRowSize.value(); - } - - public int getMeanColumns() - { - return data.getMeanColumns(); - } public static ColumnFamilyStore createColumnFamilyStore(Keyspace keyspace, String columnFamily, boolean loadSSTables) { @@ -1426,20 +1406,8 @@ public boolean isValid() return valid; } - public long getMemtableColumnsCount() - { - return metric.memtableColumnsCount.value(); - } - public long getMemtableDataSize() - { - return metric.memtableOnHeapSize.value(); - } - public int getMemtableSwitchCount() - { - return (int) metric.memtableSwitchCount.count(); - } /** * Package protected for access from the CompactionManager. @@ -1459,71 +1427,6 @@ public Set getUncompactingSSTables() return data.getUncompactingSSTables(); } - public long[] getRecentSSTablesPerReadHistogram() - { - return metric.recentSSTablesPerRead.getBuckets(true); - } - - public long[] getSSTablesPerReadHistogram() - { - return metric.sstablesPerRead.getBuckets(false); - } - - public long getReadCount() - { - return metric.readLatency.latency.count(); - } - - public double getRecentReadLatencyMicros() - { - return metric.readLatency.getRecentLatency(); - } - - public long[] getLifetimeReadLatencyHistogramMicros() - { - return metric.readLatency.totalLatencyHistogram.getBuckets(false); - } - - public long[] getRecentReadLatencyHistogramMicros() - { - return metric.readLatency.recentLatencyHistogram.getBuckets(true); - } - - public long getTotalReadLatencyMicros() - { - return metric.readLatency.totalLatency.count(); - } - - public int getPendingTasks() - { - return (int) metric.pendingFlushes.count(); - } - - public long getWriteCount() - { - return metric.writeLatency.latency.count(); - } - - public long getTotalWriteLatencyMicros() - { - return metric.writeLatency.totalLatency.count(); - } - - public double getRecentWriteLatencyMicros() - { - return metric.writeLatency.getRecentLatency(); - } - - public long[] getLifetimeWriteLatencyHistogramMicros() - { - return metric.writeLatency.totalLatencyHistogram.getBuckets(false); - } - - public long[] getRecentWriteLatencyHistogramMicros() - { - return metric.writeLatency.recentLatencyHistogram.getBuckets(true); - } - public ColumnFamily getColumnFamily(DecoratedKey key, Composite start, Composite finish, @@ -2328,19 +2231,9 @@ public Map> getSnapshotDetails() return directories.getSnapshotDetails(); } - public long getTotalDiskSpaceUsed() + public boolean hasUnreclaimedSpace() { - return metric.totalDiskSpaceUsed.count(); - } - - public long getLiveDiskSpaceUsed() - { - return metric.liveDiskSpaceUsed.count(); - } - - public int getLiveSSTableCount() - { - return metric.liveSSTableCount.value(); + return metric.liveDiskSpaceUsed.getCount() < metric.totalDiskSpaceUsed.getCount(); } /** @@ -2613,45 +2506,6 @@ public Iterable call() throws Exception return runWithCompactionsDisabled(callable, false); } - public long getBloomFilterFalsePositives() - { - return metric.bloomFilterFalsePositives.value(); - } - - public long getRecentBloomFilterFalsePositives() - { - return metric.recentBloomFilterFalsePositives.value(); - } - - public double getBloomFilterFalseRatio() - { - return metric.bloomFilterFalseRatio.value(); - } - - public double getRecentBloomFilterFalseRatio() - { - return metric.recentBloomFilterFalseRatio.value(); - } - - public long getBloomFilterDiskSpaceUsed() - { - return metric.bloomFilterDiskSpaceUsed.value(); - } - - public long getBloomFilterOffHeapMemoryUsed() - { - return metric.bloomFilterOffHeapMemoryUsed.value(); - } - - public long getIndexSummaryOffHeapMemoryUsed() - { - return metric.indexSummaryOffHeapMemoryUsed.value(); - } - - public long getCompressionMetadataOffHeapMemoryUsed() - { - return metric.compressionMetadataOffHeapMemoryUsed.value(); - } @Override public String toString() @@ -2748,38 +2602,18 @@ private void validateCompactionThresholds(int minThreshold, int maxThreshold) "is deprecated, set the compaction strategy option 'enabled' to 'false' instead or use the nodetool command 'disableautocompaction'."); } - public double getTombstonesPerSlice() - { - return metric.tombstoneScannedHistogram.cf.getSnapshot().getMedian(); - } + // End JMX get/set. - public double getLiveCellsPerSlice() + public int getMeanColumns() { - return metric.liveScannedHistogram.cf.getSnapshot().getMedian(); + return data.getMeanColumns(); } - // End JMX get/set. - public long estimateKeys() { return data.estimatedKeys(); } - public long[] getEstimatedRowSizeHistogram() - { - return metric.estimatedRowSizeHistogram.value(); - } - - public long[] getEstimatedColumnCountHistogram() - { - return metric.estimatedColumnCountHistogram.value(); - } - - public double getCompressionRatio() - { - return metric.compressionRatio.value(); - } - /** true if this CFS contains secondary index data */ public boolean isIndex() { diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java b/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java index d08212594836..1aad5c3b3dbd 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java @@ -34,222 +34,11 @@ public interface ColumnFamilyStoreMBean */ public String getColumnFamilyName(); - /** - * Returns the total amount of data stored in the memtable, including - * column related overhead. - * - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#memtableOnHeapSize - * @return The size in bytes. - * @deprecated - */ - @Deprecated - public long getMemtableDataSize(); - - /** - * Returns the total number of columns present in the memtable. - * - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#memtableColumnsCount - * @return The number of columns. - */ - @Deprecated - public long getMemtableColumnsCount(); - - /** - * Returns the number of times that a flush has resulted in the - * memtable being switched out. - * - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#memtableSwitchCount - * @return the number of memtable switches - */ - @Deprecated - public int getMemtableSwitchCount(); - - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#recentSSTablesPerRead - * @return a histogram of the number of sstable data files accessed per read: reading this property resets it - */ - @Deprecated - public long[] getRecentSSTablesPerReadHistogram(); - - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#sstablesPerReadHistogram - * @return a histogram of the number of sstable data files accessed per read - */ - @Deprecated - public long[] getSSTablesPerReadHistogram(); - - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#readLatency - * @return the number of read operations on this column family - */ - @Deprecated - public long getReadCount(); - - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#readLatency - * @return total read latency (divide by getReadCount() for average) - */ - @Deprecated - public long getTotalReadLatencyMicros(); - - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#readLatency - * @return an array representing the latency histogram - */ - @Deprecated - public long[] getLifetimeReadLatencyHistogramMicros(); - - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#readLatency - * @return an array representing the latency histogram - */ - @Deprecated - public long[] getRecentReadLatencyHistogramMicros(); - - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#readLatency - * @return average latency per read operation since the last call - */ - @Deprecated - public double getRecentReadLatencyMicros(); - - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#writeLatency - * @return the number of write operations on this column family - */ - @Deprecated - public long getWriteCount(); - - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#writeLatency - * @return total write latency (divide by getReadCount() for average) - */ - @Deprecated - public long getTotalWriteLatencyMicros(); - - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#writeLatency - * @return an array representing the latency histogram - */ - @Deprecated - public long[] getLifetimeWriteLatencyHistogramMicros(); - - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#writeLatency - * @return an array representing the latency histogram - */ - @Deprecated - public long[] getRecentWriteLatencyHistogramMicros(); - - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#writeLatency - * @return average latency per write operation since the last call - */ - @Deprecated - public double getRecentWriteLatencyMicros(); - - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#pendingFlushes - * @return the estimated number of tasks pending for this column family - */ - @Deprecated - public int getPendingTasks(); - - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#liveSSTableCount - * @return the number of SSTables on disk for this CF - */ - @Deprecated - public int getLiveSSTableCount(); - - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#liveDiskSpaceUsed - * @return disk space used by SSTables belonging to this CF - */ - @Deprecated - public long getLiveDiskSpaceUsed(); - - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#totalDiskSpaceUsed - * @return total disk space used by SSTables belonging to this CF, including obsolete ones waiting to be GC'd - */ - @Deprecated - public long getTotalDiskSpaceUsed(); - /** * force a major compaction of this column family */ public void forceMajorCompaction() throws ExecutionException, InterruptedException; - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#minRowSize - * @return the size of the smallest compacted row - */ - @Deprecated - public long getMinRowSize(); - - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#maxRowSize - * @return the size of the largest compacted row - */ - @Deprecated - public long getMaxRowSize(); - - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#meanRowSize - * @return the average row size across all the sstables - */ - @Deprecated - public long getMeanRowSize(); - - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#bloomFilterFalsePositives - */ - @Deprecated - public long getBloomFilterFalsePositives(); - - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#recentBloomFilterFalsePositives - */ - @Deprecated - public long getRecentBloomFilterFalsePositives(); - - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#bloomFilterFalseRatio - */ - @Deprecated - public double getBloomFilterFalseRatio(); - - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#recentBloomFilterFalseRatio - */ - @Deprecated - public double getRecentBloomFilterFalseRatio(); - - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#bloomFilterDiskSpaceUsed - */ - @Deprecated - public long getBloomFilterDiskSpaceUsed(); - - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#bloomFilterOffHeapMemoryUsed - */ - @Deprecated - public long getBloomFilterOffHeapMemoryUsed(); - - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#indexSummaryOffHeapMemoryUsed - */ - @Deprecated - public long getIndexSummaryOffHeapMemoryUsed(); - - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#compressionMetadataOffHeapMemoryUsed - */ - @Deprecated - public long getCompressionMetadataOffHeapMemoryUsed(); - /** * Gets the minimum number of sstables in queue before compaction kicks off */ @@ -304,31 +93,8 @@ public interface ColumnFamilyStoreMBean public boolean isAutoCompactionDisabled(); - /** Number of tombstoned cells retreived during the last slicequery */ - @Deprecated - public double getTombstonesPerSlice(); - - /** Number of live cells retreived during the last slicequery */ - @Deprecated - public double getLiveCellsPerSlice(); - public long estimateKeys(); - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#estimatedRowSizeHistogram - */ - @Deprecated - public long[] getEstimatedRowSizeHistogram(); - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#estimatedColumnCountHistogram - */ - @Deprecated - public long[] getEstimatedColumnCountHistogram(); - /** - * @see org.apache.cassandra.metrics.ColumnFamilyMetrics#compressionRatio - */ - @Deprecated - public double getCompressionRatio(); /** * Returns a list of the names of the built column indexes for current store diff --git a/src/java/org/apache/cassandra/db/HintedHandOffManager.java b/src/java/org/apache/cassandra/db/HintedHandOffManager.java index 2bc26aea41df..324943a9c116 100644 --- a/src/java/org/apache/cassandra/db/HintedHandOffManager.java +++ b/src/java/org/apache/cassandra/db/HintedHandOffManager.java @@ -482,7 +482,7 @@ private int calculatePageSize() if (meanColumnCount <= 0) return PAGE_SIZE; - int averageColumnSize = (int) (hintStore.getMeanRowSize() / meanColumnCount); + int averageColumnSize = (int) (hintStore.metric.meanRowSize.getValue() / meanColumnCount); if (averageColumnSize <= 0) return PAGE_SIZE; diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLog.java b/src/java/org/apache/cassandra/db/commitlog/CommitLog.java index 416b51de3cae..55b00222b499 100644 --- a/src/java/org/apache/cassandra/db/commitlog/CommitLog.java +++ b/src/java/org/apache/cassandra/db/commitlog/CommitLog.java @@ -291,26 +291,6 @@ public void discardCompletedSegments(final UUID cfId, final ReplayPosition conte } } - @Override - public long getCompletedTasks() - { - return metrics.completedTasks.value(); - } - - @Override - public long getPendingTasks() - { - return metrics.pendingTasks.value(); - } - - /** - * @return the total size occupied by commitlog segments expressed in bytes. (used by MBean) - */ - public long getTotalCommitlogSize() - { - return metrics.totalCommitLogSize.value(); - } - public List getActiveSegmentNames() { List segmentNames = new ArrayList<>(); diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogMBean.java b/src/java/org/apache/cassandra/db/commitlog/CommitLogMBean.java index 6c0d8d75ee9f..150ec206451e 100644 --- a/src/java/org/apache/cassandra/db/commitlog/CommitLogMBean.java +++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogMBean.java @@ -23,27 +23,6 @@ public interface CommitLogMBean { - /** - * Get the number of completed tasks - * @see org.apache.cassandra.metrics.CommitLogMetrics#completedTasks - */ - @Deprecated - public long getCompletedTasks(); - - /** - * Get the number of tasks waiting to be executed - * @see org.apache.cassandra.metrics.CommitLogMetrics#pendingTasks - */ - @Deprecated - public long getPendingTasks(); - - /** - * Get the current size used by all the commitlog segments. - * @see org.apache.cassandra.metrics.CommitLogMetrics#totalCommitLogSize - */ - @Deprecated - public long getTotalCommitlogSize(); - /** * Recover a single file. */ diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionInfo.java b/src/java/org/apache/cassandra/db/compaction/CompactionInfo.java index d086eef0b792..3ee3a685c331 100644 --- a/src/java/org/apache/cassandra/db/compaction/CompactionInfo.java +++ b/src/java/org/apache/cassandra/db/compaction/CompactionInfo.java @@ -23,6 +23,7 @@ import java.util.UUID; import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.metrics.StorageMetrics; import org.apache.cassandra.service.StorageService; /** Implements serializable to allow structured info to be returned via JMX. */ @@ -121,7 +122,7 @@ public static abstract class Holder { private volatile boolean stopRequested = false; public abstract CompactionInfo getCompactionInfo(); - double load = StorageService.instance.getLoad(); + double load = StorageMetrics.load.getCount(); double reportedSeverity = 0d; public void stop() diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java index 99945b6282c6..a1672a2ce082 100644 --- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java +++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java @@ -1369,22 +1369,22 @@ public TabularData getCompactionHistory() public long getTotalBytesCompacted() { - return metrics.bytesCompacted.count(); + return metrics.bytesCompacted.getCount(); } public long getTotalCompactionsCompleted() { - return metrics.totalCompactionsCompleted.count(); + return metrics.totalCompactionsCompleted.getCount(); } public int getPendingTasks() { - return metrics.pendingTasks.value(); + return metrics.pendingTasks.getValue(); } public long getCompletedTasks() { - return metrics.completedTasks.value(); + return metrics.completedTasks.getValue(); } private static class CleanupInfo extends CompactionInfo.Holder diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionManagerMBean.java b/src/java/org/apache/cassandra/db/compaction/CompactionManagerMBean.java index 6900b9f4da8e..9c361927afd8 100644 --- a/src/java/org/apache/cassandra/db/compaction/CompactionManagerMBean.java +++ b/src/java/org/apache/cassandra/db/compaction/CompactionManagerMBean.java @@ -32,34 +32,6 @@ public interface CompactionManagerMBean /** compaction history **/ public TabularData getCompactionHistory(); - /** - * @see org.apache.cassandra.metrics.CompactionMetrics#pendingTasks - * @return estimated number of compactions remaining to perform - */ - @Deprecated - public int getPendingTasks(); - - /** - * @see org.apache.cassandra.metrics.CompactionMetrics#completedTasks - * @return number of completed compactions since server [re]start - */ - @Deprecated - public long getCompletedTasks(); - - /** - * @see org.apache.cassandra.metrics.CompactionMetrics#bytesCompacted - * @return total number of bytes compacted since server [re]start - */ - @Deprecated - public long getTotalBytesCompacted(); - - /** - * @see org.apache.cassandra.metrics.CompactionMetrics#totalCompactionsCompleted - * @return total number of compactions since server [re]start - */ - @Deprecated - public long getTotalCompactionsCompleted(); - /** * Triggers the compaction of user specified sstables. * You can specify files from various keyspaces and columnfamilies. diff --git a/src/java/org/apache/cassandra/db/filter/ExtendedFilter.java b/src/java/org/apache/cassandra/db/filter/ExtendedFilter.java index fc2ff9313194..f908e8c36b10 100644 --- a/src/java/org/apache/cassandra/db/filter/ExtendedFilter.java +++ b/src/java/org/apache/cassandra/db/filter/ExtendedFilter.java @@ -214,7 +214,7 @@ private IDiskAtomFilter computeOptimizedFilter() { // if we have a high chance of getting all the columns in a single index slice (and it's not too costly), do that. // otherwise, the extraFilter (lazily created) will fetch by name the columns referenced by the additional expressions. - if (cfs.getMaxRowSize() < DatabaseDescriptor.getColumnIndexSize()) + if (cfs.metric.maxRowSize.getValue() < DatabaseDescriptor.getColumnIndexSize()) { logger.trace("Expanding slice filter to entire row to cover additional expressions"); return new SliceQueryFilter(ColumnSlice.ALL_COLUMNS_ARRAY, ((SliceQueryFilter)filter).reversed, Integer.MAX_VALUE); diff --git a/src/java/org/apache/cassandra/gms/Gossiper.java b/src/java/org/apache/cassandra/gms/Gossiper.java index 74b2c8e9b2bf..111536c5e227 100644 --- a/src/java/org/apache/cassandra/gms/Gossiper.java +++ b/src/java/org/apache/cassandra/gms/Gossiper.java @@ -673,7 +673,7 @@ private void doStatusCheck() long now = System.currentTimeMillis(); long nowNano = System.nanoTime(); - long pending = ((JMXEnabledThreadPoolExecutor) StageManager.getStage(Stage.GOSSIP)).getPendingTasks(); + long pending = ((JMXEnabledThreadPoolExecutor) StageManager.getStage(Stage.GOSSIP)).metrics.pendingTasks.getValue(); if (pending > 0 && lastProcessedMessageAt < now - 1000) { // if some new messages just arrived, give the executor some time to work on them diff --git a/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java b/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java index e4b714c4596b..9d71a673d002 100644 --- a/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java +++ b/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java @@ -24,6 +24,8 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; + +import com.codahale.metrics.ExponentiallyDecayingReservoir; import javax.management.MBeanServer; import javax.management.ObjectName; @@ -33,7 +35,6 @@ import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.FBUtilities; -import com.yammer.metrics.stats.ExponentiallyDecayingSample; /** * A dynamic snitch that sorts endpoints by latency with an adapted phi failure detector @@ -55,7 +56,7 @@ public class DynamicEndpointSnitch extends AbstractEndpointSnitch implements ILa private boolean registered = false; private final ConcurrentHashMap scores = new ConcurrentHashMap(); - private final ConcurrentHashMap samples = new ConcurrentHashMap(); + private final ConcurrentHashMap samples = new ConcurrentHashMap<>(); public final IEndpointSnitch subsnitch; @@ -217,10 +218,10 @@ public int compareEndpoints(InetAddress target, InetAddress a1, InetAddress a2) public void receiveTiming(InetAddress host, long latency) // this is cheap { - ExponentiallyDecayingSample sample = samples.get(host); + ExponentiallyDecayingReservoir sample = samples.get(host); if (sample == null) { - ExponentiallyDecayingSample maybeNewSample = new ExponentiallyDecayingSample(WINDOW_SIZE, ALPHA); + ExponentiallyDecayingReservoir maybeNewSample = new ExponentiallyDecayingReservoir(WINDOW_SIZE, ALPHA); sample = samples.putIfAbsent(host, maybeNewSample); if (sample == null) sample = maybeNewSample; @@ -244,14 +245,14 @@ private void updateScores() // this is expensive double maxLatency = 1; // We're going to weight the latency for each host against the worst one we see, to // arrive at sort of a 'badness percentage' for them. First, find the worst for each: - for (Map.Entry entry : samples.entrySet()) + for (Map.Entry entry : samples.entrySet()) { double mean = entry.getValue().getSnapshot().getMedian(); if (mean > maxLatency) maxLatency = mean; } // now make another pass to do the weighting based on the maximums we found before - for (Map.Entry entry: samples.entrySet()) + for (Map.Entry entry: samples.entrySet()) { double score = entry.getValue().getSnapshot().getMedian() / maxLatency; // finally, add the severity without any weighting, since hosts scale this relative to their own load and the size of the task causing the severity. @@ -265,8 +266,7 @@ private void updateScores() // this is expensive private void reset() { - for (ExponentiallyDecayingSample sample : samples.values()) - sample.clear(); + samples.clear(); } public Map getScores() @@ -295,7 +295,7 @@ public List dumpTimings(String hostname) throws UnknownHostException { InetAddress host = InetAddress.getByName(hostname); ArrayList timings = new ArrayList(); - ExponentiallyDecayingSample sample = samples.get(host); + ExponentiallyDecayingReservoir sample = samples.get(host); if (sample != null) { for (double time: sample.getSnapshot().getValues()) diff --git a/src/java/org/apache/cassandra/metrics/CASClientRequestMetrics.java b/src/java/org/apache/cassandra/metrics/CASClientRequestMetrics.java index 3210d4588fa2..e6f2b81cb766 100644 --- a/src/java/org/apache/cassandra/metrics/CASClientRequestMetrics.java +++ b/src/java/org/apache/cassandra/metrics/CASClientRequestMetrics.java @@ -18,12 +18,14 @@ */ package org.apache.cassandra.metrics; -import com.yammer.metrics.*; -import com.yammer.metrics.core.*; +import com.codahale.metrics.Counter; +import com.codahale.metrics.Histogram; + +import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics; + public class CASClientRequestMetrics extends ClientRequestMetrics { - public final Histogram contention; /* Used only for write */ public final Counter conditionNotMet; @@ -32,16 +34,16 @@ public class CASClientRequestMetrics extends ClientRequestMetrics public CASClientRequestMetrics(String scope) { super(scope); - contention = Metrics.newHistogram(factory.createMetricName("ContentionHistogram"), true); - conditionNotMet = Metrics.newCounter(factory.createMetricName("ConditionNotMet")); - unfinishedCommit = Metrics.newCounter(factory.createMetricName("UnfinishedCommit")); + contention = Metrics.histogram(factory.createMetricName("ContentionHistogram")); + conditionNotMet = Metrics.counter(factory.createMetricName("ConditionNotMet")); + unfinishedCommit = Metrics.counter(factory.createMetricName("UnfinishedCommit")); } public void release() { super.release(); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("ContentionHistogram")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("ConditionNotMet")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("UnfinishedCommit")); + Metrics.remove(factory.createMetricName("ContentionHistogram")); + Metrics.remove(factory.createMetricName("ConditionNotMet")); + Metrics.remove(factory.createMetricName("UnfinishedCommit")); } } diff --git a/src/java/org/apache/cassandra/metrics/CQLMetrics.java b/src/java/org/apache/cassandra/metrics/CQLMetrics.java index a7076ddc43df..1020e927db3f 100644 --- a/src/java/org/apache/cassandra/metrics/CQLMetrics.java +++ b/src/java/org/apache/cassandra/metrics/CQLMetrics.java @@ -17,11 +17,12 @@ */ package org.apache.cassandra.metrics; +import com.codahale.metrics.Counter; +import com.codahale.metrics.Gauge; +import com.codahale.metrics.RatioGauge; import org.apache.cassandra.cql3.QueryProcessor; -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.Counter; -import com.yammer.metrics.core.Gauge; -import com.yammer.metrics.util.RatioGauge; + +import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics; public class CQLMetrics { @@ -36,27 +37,32 @@ public class CQLMetrics public CQLMetrics() { - regularStatementsExecuted = Metrics.newCounter(factory.createMetricName("RegularStatementsExecuted")); - preparedStatementsExecuted = Metrics.newCounter(factory.createMetricName("PreparedStatementsExecuted")); - preparedStatementsEvicted = Metrics.newCounter(factory.createMetricName("PreparedStatementsEvicted")); + regularStatementsExecuted = Metrics.counter(factory.createMetricName("RegularStatementsExecuted")); + preparedStatementsExecuted = Metrics.counter(factory.createMetricName("PreparedStatementsExecuted")); + preparedStatementsEvicted = Metrics.counter(factory.createMetricName("PreparedStatementsEvicted")); - preparedStatementsCount = Metrics.newGauge(factory.createMetricName("PreparedStatementsCount"), new Gauge() + preparedStatementsCount = Metrics.register(factory.createMetricName("PreparedStatementsCount"), new Gauge() { - public Integer value() + public Integer getValue() { return QueryProcessor.preparedStatementsCount(); } }); - preparedStatementsRatio = Metrics.newGauge(factory.createMetricName("PreparedStatementsRatio"), new RatioGauge() + preparedStatementsRatio = Metrics.register(factory.createMetricName("PreparedStatementsRatio"), new RatioGauge() { + public Ratio getRatio() + { + return Ratio.of(getNumerator(), getDenominator()); + } + public double getNumerator() { - return preparedStatementsExecuted.count(); + return preparedStatementsExecuted.getCount(); } public double getDenominator() { - return regularStatementsExecuted.count() + preparedStatementsExecuted.count(); + return regularStatementsExecuted.getCount() + preparedStatementsExecuted.getCount(); } }); } diff --git a/src/java/org/apache/cassandra/metrics/CacheMetrics.java b/src/java/org/apache/cassandra/metrics/CacheMetrics.java index 9d5d78396ac1..8b00e1c4edeb 100644 --- a/src/java/org/apache/cassandra/metrics/CacheMetrics.java +++ b/src/java/org/apache/cassandra/metrics/CacheMetrics.java @@ -17,16 +17,15 @@ */ package org.apache.cassandra.metrics; -import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.Gauge; -import com.yammer.metrics.core.Meter; -import com.yammer.metrics.util.RatioGauge; - +import com.codahale.metrics.Gauge; +import com.codahale.metrics.Meter; +import com.codahale.metrics.RatioGauge; import org.apache.cassandra.cache.ICache; +import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics; + /** * Metrics for {@code ICache}. */ @@ -45,9 +44,6 @@ public class CacheMetrics /** Total number of cache entries */ public final Gauge entries; - private final AtomicLong lastRequests = new AtomicLong(0); - private final AtomicLong lastHits = new AtomicLong(0); - /** * Create metrics for given cache. * @@ -58,57 +54,36 @@ public CacheMetrics(String type, final ICache cache) { MetricNameFactory factory = new DefaultNameFactory("Cache", type); - capacity = Metrics.newGauge(factory.createMetricName("Capacity"), new Gauge() + capacity = Metrics.register(factory.createMetricName("Capacity"), new Gauge() { - public Long value() + public Long getValue() { return cache.capacity(); } }); - hits = Metrics.newMeter(factory.createMetricName("Hits"), "hits", TimeUnit.SECONDS); - requests = Metrics.newMeter(factory.createMetricName("Requests"), "requests", TimeUnit.SECONDS); - hitRate = Metrics.newGauge(factory.createMetricName("HitRate"), new RatioGauge() + hits = Metrics.meter(factory.createMetricName("Hits")); + requests = Metrics.meter(factory.createMetricName("Requests")); + hitRate = Metrics.register(factory.createMetricName("HitRate"), new RatioGauge() { - protected double getNumerator() - { - return hits.count(); - } - - protected double getDenominator() + @Override + public Ratio getRatio() { - return requests.count(); + return Ratio.of(hits.getCount(), requests.getCount()); } }); - size = Metrics.newGauge(factory.createMetricName("Size"), new Gauge() + size = Metrics.register(factory.createMetricName("Size"), new Gauge() { - public Long value() + public Long getValue() { return cache.weightedSize(); } }); - entries = Metrics.newGauge(factory.createMetricName("Entries"), new Gauge() + entries = Metrics.register(factory.createMetricName("Entries"), new Gauge() { - public Integer value() + public Integer getValue() { return cache.size(); } }); } - - // for backward compatibility - @Deprecated - public double getRecentHitRate() - { - long r = requests.count(); - long h = hits.count(); - try - { - return ((double)(h - lastHits.get())) / (r - lastRequests.get()); - } - finally - { - lastRequests.set(r); - lastHits.set(h); - } - } } diff --git a/src/java/org/apache/cassandra/metrics/CassandraMetricsRegistry.java b/src/java/org/apache/cassandra/metrics/CassandraMetricsRegistry.java new file mode 100644 index 000000000000..27eec895be5f --- /dev/null +++ b/src/java/org/apache/cassandra/metrics/CassandraMetricsRegistry.java @@ -0,0 +1,791 @@ +/* + * 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.metrics; + +import java.lang.management.ManagementFactory; +import java.lang.reflect.Method; +import java.util.Locale; +import java.util.concurrent.TimeUnit; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.codahale.metrics.*; +import javax.management.*; + +/** + * Makes integrating 3.0 metrics API with 2.0. + *

    + * The 3.0 API comes with poor JMX integration + */ +public class CassandraMetricsRegistry extends MetricRegistry +{ + protected static final Logger logger = LoggerFactory.getLogger(CassandraMetricsRegistry.class); + + public static final CassandraMetricsRegistry Metrics = new CassandraMetricsRegistry(); + private MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); + + private CassandraMetricsRegistry() + { + super(); + } + + public Counter counter(MetricName name) + { + Counter counter = counter(name.getMetricName()); + registerMBean(counter, name.getMBeanName()); + + return counter; + } + + public Meter meter(MetricName name) + { + Meter meter = meter(name.getMetricName()); + registerMBean(meter, name.getMBeanName()); + + return meter; + } + + public Histogram histogram(MetricName name) + { + Histogram histogram = register(name, new ClearableHistogram(new EstimatedHistogramReservoir())); + registerMBean(histogram, name.getMBeanName()); + + return histogram; + } + + public Timer timer(MetricName name) + { + Timer timer = register(name, new Timer(new EstimatedHistogramReservoir())); + registerMBean(timer, name.getMBeanName()); + + return timer; + } + + public T register(MetricName name, T metric) + { + try + { + register(name.getMetricName(), metric); + registerMBean(metric, name.getMBeanName()); + return metric; + } + catch (IllegalArgumentException e) + { + Metric existing = Metrics.getMetrics().get(name.getMetricName()); + return (T)existing; + } + } + + public boolean remove(MetricName name) + { + boolean removed = remove(name.getMetricName()); + + try + { + mBeanServer.unregisterMBean(name.getMBeanName()); + } catch (InstanceNotFoundException | MBeanRegistrationException e) + { + logger.debug("Unable to remove mbean"); + } + + return removed; + } + + private void registerMBean(Metric metric, ObjectName name) + { + AbstractBean mbean; + + if (metric instanceof Gauge) + { + mbean = new JmxGauge((Gauge) metric, name); + } else if (metric instanceof Counter) + { + mbean = new JmxCounter((Counter) metric, name); + } else if (metric instanceof Histogram) + { + mbean = new JmxHistogram((Histogram) metric, name); + } else if (metric instanceof Meter) + { + mbean = new JmxMeter((Meter) metric, name, TimeUnit.SECONDS); + } else if (metric instanceof Timer) + { + mbean = new JmxTimer((Timer) metric, name, TimeUnit.SECONDS, TimeUnit.MICROSECONDS); + } else + { + throw new IllegalArgumentException("Unknown metric type: " + metric.getClass()); + } + + try + { + mBeanServer.registerMBean(mbean, name); + } catch (InstanceAlreadyExistsException e) + { + logger.debug("Metric bean already exists", e); + } catch (MBeanRegistrationException e) + { + logger.debug("Unable to register metric bean", e); + } catch (NotCompliantMBeanException e) + { + logger.warn("Unable to register metric bean", e); + } + } + + public interface MetricMBean + { + ObjectName objectName(); + } + + private abstract static class AbstractBean implements MetricMBean + { + private final ObjectName objectName; + + AbstractBean(ObjectName objectName) + { + this.objectName = objectName; + } + + @Override + public ObjectName objectName() + { + return objectName; + } + } + + + public interface JmxGaugeMBean extends MetricMBean + { + Object getValue(); + } + + private static class JmxGauge extends AbstractBean implements JmxGaugeMBean + { + private final Gauge metric; + + private JmxGauge(Gauge metric, ObjectName objectName) + { + super(objectName); + this.metric = metric; + } + + @Override + public Object getValue() + { + return metric.getValue(); + } + } + + public interface JmxHistogramMBean extends MetricMBean + { + long getCount(); + + long getMin(); + + long getMax(); + + double getMean(); + + double getStdDev(); + + double get50thPercentile(); + + double get75thPercentile(); + + double get95thPercentile(); + + double get98thPercentile(); + + double get99thPercentile(); + + double get999thPercentile(); + + long[] values(); + } + + private static class JmxHistogram extends AbstractBean implements JmxHistogramMBean + { + private final Histogram metric; + + private JmxHistogram(Histogram metric, ObjectName objectName) + { + super(objectName); + this.metric = metric; + } + + @Override + public double get50thPercentile() + { + return metric.getSnapshot().getMedian(); + } + + @Override + public long getCount() + { + return metric.getCount(); + } + + @Override + public long getMin() + { + return metric.getSnapshot().getMin(); + } + + @Override + public long getMax() + { + return metric.getSnapshot().getMax(); + } + + @Override + public double getMean() + { + return metric.getSnapshot().getMean(); + } + + @Override + public double getStdDev() + { + return metric.getSnapshot().getStdDev(); + } + + @Override + public double get75thPercentile() + { + return metric.getSnapshot().get75thPercentile(); + } + + @Override + public double get95thPercentile() + { + return metric.getSnapshot().get95thPercentile(); + } + + @Override + public double get98thPercentile() + { + return metric.getSnapshot().get98thPercentile(); + } + + @Override + public double get99thPercentile() + { + return metric.getSnapshot().get99thPercentile(); + } + + @Override + public double get999thPercentile() + { + return metric.getSnapshot().get999thPercentile(); + } + + @Override + public long[] values() + { + return metric.getSnapshot().getValues(); + } + } + + public interface JmxCounterMBean extends MetricMBean + { + long getCount(); + } + + private static class JmxCounter extends AbstractBean implements JmxCounterMBean + { + private final Counter metric; + + private JmxCounter(Counter metric, ObjectName objectName) + { + super(objectName); + this.metric = metric; + } + + @Override + public long getCount() + { + return metric.getCount(); + } + } + + public interface JmxMeterMBean extends MetricMBean + { + long getCount(); + + double getMeanRate(); + + double getOneMinuteRate(); + + double getFiveMinuteRate(); + + double getFifteenMinuteRate(); + + String getRateUnit(); + } + + private static class JmxMeter extends AbstractBean implements JmxMeterMBean + { + private final Metered metric; + private final double rateFactor; + private final String rateUnit; + + private JmxMeter(Metered metric, ObjectName objectName, TimeUnit rateUnit) + { + super(objectName); + this.metric = metric; + this.rateFactor = rateUnit.toSeconds(1); + this.rateUnit = "events/" + calculateRateUnit(rateUnit); + } + + @Override + public long getCount() + { + return metric.getCount(); + } + + @Override + public double getMeanRate() + { + return metric.getMeanRate() * rateFactor; + } + + @Override + public double getOneMinuteRate() + { + return metric.getOneMinuteRate() * rateFactor; + } + + @Override + public double getFiveMinuteRate() + { + return metric.getFiveMinuteRate() * rateFactor; + } + + @Override + public double getFifteenMinuteRate() + { + return metric.getFifteenMinuteRate() * rateFactor; + } + + @Override + public String getRateUnit() + { + return rateUnit; + } + + private String calculateRateUnit(TimeUnit unit) + { + final String s = unit.toString().toLowerCase(Locale.US); + return s.substring(0, s.length() - 1); + } + } + + public interface JmxTimerMBean extends JmxMeterMBean + { + double getMin(); + + double getMax(); + + double getMean(); + + double getStdDev(); + + double get50thPercentile(); + + double get75thPercentile(); + + double get95thPercentile(); + + double get98thPercentile(); + + double get99thPercentile(); + + double get999thPercentile(); + + long[] values(); + + String getDurationUnit(); + } + + static class JmxTimer extends JmxMeter implements JmxTimerMBean + { + private final Timer metric; + private final double durationFactor; + private final String durationUnit; + + private JmxTimer(Timer metric, + ObjectName objectName, + TimeUnit rateUnit, + TimeUnit durationUnit) + { + super(metric, objectName, rateUnit); + this.metric = metric; + this.durationFactor = 1.0 / durationUnit.toNanos(1); + this.durationUnit = durationUnit.toString().toLowerCase(Locale.US); + } + + @Override + public double get50thPercentile() + { + return metric.getSnapshot().getMedian() * durationFactor; + } + + @Override + public double getMin() + { + return metric.getSnapshot().getMin() * durationFactor; + } + + @Override + public double getMax() + { + return metric.getSnapshot().getMax() * durationFactor; + } + + @Override + public double getMean() + { + return metric.getSnapshot().getMean() * durationFactor; + } + + @Override + public double getStdDev() + { + return metric.getSnapshot().getStdDev() * durationFactor; + } + + @Override + public double get75thPercentile() + { + return metric.getSnapshot().get75thPercentile() * durationFactor; + } + + @Override + public double get95thPercentile() + { + return metric.getSnapshot().get95thPercentile() * durationFactor; + } + + @Override + public double get98thPercentile() + { + return metric.getSnapshot().get98thPercentile() * durationFactor; + } + + @Override + public double get99thPercentile() + { + return metric.getSnapshot().get99thPercentile() * durationFactor; + } + + @Override + public double get999thPercentile() + { + return metric.getSnapshot().get999thPercentile() * durationFactor; + } + + @Override + public long[] values() + { + return metric.getSnapshot().getValues(); + } + + @Override + public String getDurationUnit() + { + return durationUnit; + } + } + + /** + * A value class encapsulating a metric's owning class and name. + */ + public static class MetricName implements Comparable + { + private final String group; + private final String type; + private final String name; + private final String scope; + private final String mBeanName; + + /** + * Creates a new {@link MetricName} without a scope. + * + * @param klass the {@link Class} to which the {@link Metric} belongs + * @param name the name of the {@link Metric} + */ + public MetricName(Class klass, String name) + { + this(klass, name, null); + } + + /** + * Creates a new {@link MetricName} without a scope. + * + * @param group the group to which the {@link Metric} belongs + * @param type the type to which the {@link Metric} belongs + * @param name the name of the {@link Metric} + */ + public MetricName(String group, String type, String name) + { + this(group, type, name, null); + } + + /** + * Creates a new {@link MetricName} without a scope. + * + * @param klass the {@link Class} to which the {@link Metric} belongs + * @param name the name of the {@link Metric} + * @param scope the scope of the {@link Metric} + */ + public MetricName(Class klass, String name, String scope) + { + this(klass.getPackage() == null ? "" : klass.getPackage().getName(), + klass.getSimpleName().replaceAll("\\$$", ""), + name, + scope); + } + + /** + * Creates a new {@link MetricName} without a scope. + * + * @param group the group to which the {@link Metric} belongs + * @param type the type to which the {@link Metric} belongs + * @param name the name of the {@link Metric} + * @param scope the scope of the {@link Metric} + */ + public MetricName(String group, String type, String name, String scope) + { + this(group, type, name, scope, createMBeanName(group, type, name, scope)); + } + + /** + * Creates a new {@link MetricName} without a scope. + * + * @param group the group to which the {@link Metric} belongs + * @param type the type to which the {@link Metric} belongs + * @param name the name of the {@link Metric} + * @param scope the scope of the {@link Metric} + * @param mBeanName the 'ObjectName', represented as a string, to use when registering the + * MBean. + */ + public MetricName(String group, String type, String name, String scope, String mBeanName) + { + if (group == null || type == null) + { + throw new IllegalArgumentException("Both group and type need to be specified"); + } + if (name == null) + { + throw new IllegalArgumentException("Name needs to be specified"); + } + this.group = group; + this.type = type; + this.name = name; + this.scope = scope; + this.mBeanName = mBeanName; + } + + /** + * Returns the group to which the {@link Metric} belongs. For class-based metrics, this will be + * the package name of the {@link Class} to which the {@link Metric} belongs. + * + * @return the group to which the {@link Metric} belongs + */ + public String getGroup() + { + return group; + } + + /** + * Returns the type to which the {@link Metric} belongs. For class-based metrics, this will be + * the simple class name of the {@link Class} to which the {@link Metric} belongs. + * + * @return the type to which the {@link Metric} belongs + */ + public String getType() + { + return type; + } + + /** + * Returns the name of the {@link Metric}. + * + * @return the name of the {@link Metric} + */ + public String getName() + { + return name; + } + + public String getMetricName() + { + return MetricRegistry.name(group, type, name, scope); + } + + /** + * Returns the scope of the {@link Metric}. + * + * @return the scope of the {@link Metric} + */ + public String getScope() + { + return scope; + } + + /** + * Returns {@code true} if the {@link Metric} has a scope, {@code false} otherwise. + * + * @return {@code true} if the {@link Metric} has a scope + */ + public boolean hasScope() + { + return scope != null; + } + + /** + * Returns the MBean name for the {@link Metric} identified by this metric name. + * + * @return the MBean name + */ + public ObjectName getMBeanName() + { + + String mname = mBeanName; + + if (mname == null) + mname = getMetricName(); + + try + { + + return new ObjectName(mname); + } catch (MalformedObjectNameException e) + { + try + { + return new ObjectName(ObjectName.quote(mname)); + } catch (MalformedObjectNameException e1) + { + throw new RuntimeException(e1); + } + } + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (o == null || getClass() != o.getClass()) + { + return false; + } + final MetricName that = (MetricName) o; + return mBeanName.equals(that.mBeanName); + } + + @Override + public int hashCode() + { + return mBeanName.hashCode(); + } + + @Override + public String toString() + { + return mBeanName; + } + + @Override + public int compareTo(MetricName o) + { + return mBeanName.compareTo(o.mBeanName); + } + + private static String createMBeanName(String group, String type, String name, String scope) + { + final StringBuilder nameBuilder = new StringBuilder(); + nameBuilder.append(ObjectName.quote(group)); + nameBuilder.append(":type="); + nameBuilder.append(ObjectName.quote(type)); + if (scope != null) + { + nameBuilder.append(",scope="); + nameBuilder.append(ObjectName.quote(scope)); + } + if (name.length() > 0) + { + nameBuilder.append(",name="); + nameBuilder.append(ObjectName.quote(name)); + } + return nameBuilder.toString(); + } + + /** + * If the group is empty, use the package name of the given class. Otherwise use group + * + * @param group The group to use by default + * @param klass The class being tracked + * @return a group for the metric + */ + public static String chooseGroup(String group, Class klass) + { + if (group == null || group.isEmpty()) + { + group = klass.getPackage() == null ? "" : klass.getPackage().getName(); + } + return group; + } + + /** + * If the type is empty, use the simple name of the given class. Otherwise use type + * + * @param type The type to use by default + * @param klass The class being tracked + * @return a type for the metric + */ + public static String chooseType(String type, Class klass) + { + if (type == null || type.isEmpty()) + { + type = klass.getSimpleName().replaceAll("\\$$", ""); + } + return type; + } + + /** + * If name is empty, use the name of the given method. Otherwise use name + * + * @param name The name to use by default + * @param method The method being tracked + * @return a name for the metric + */ + public static String chooseName(String name, Method method) + { + if (name == null || name.isEmpty()) + { + name = method.getName(); + } + return name; + } + } +} + + diff --git a/src/java/org/apache/cassandra/concurrent/IExecutorMBean.java b/src/java/org/apache/cassandra/metrics/ClearableHistogram.java similarity index 55% rename from src/java/org/apache/cassandra/concurrent/IExecutorMBean.java rename to src/java/org/apache/cassandra/metrics/ClearableHistogram.java index f085b9cdf19c..85f2fa99892c 100644 --- a/src/java/org/apache/cassandra/concurrent/IExecutorMBean.java +++ b/src/java/org/apache/cassandra/metrics/ClearableHistogram.java @@ -15,27 +15,34 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.cassandra.concurrent; +package org.apache.cassandra.metrics; + +import com.google.common.annotations.VisibleForTesting; + +import com.codahale.metrics.Histogram; /** - * @see org.apache.cassandra.metrics.ThreadPoolMetrics + * Adds ability to reset a histogram */ -@Deprecated -public interface IExecutorMBean +public class ClearableHistogram extends Histogram { - /** - * Get the current number of running tasks - */ - public int getActiveCount(); + private final EstimatedHistogramReservoir reservoirRef; /** - * Get the number of completed tasks + * Creates a new {@link com.codahale.metrics.Histogram} with the given reservoir. + * + * @param reservoir the reservoir to create a histogram from */ - public long getCompletedTasks(); + public ClearableHistogram(EstimatedHistogramReservoir reservoir) + { + super(reservoir); - /** - * Get the number of tasks waiting to be executed - */ - public long getPendingTasks(); + this.reservoirRef = reservoir; + } + @VisibleForTesting + public void clear() + { + reservoirRef.clear(); + } } diff --git a/src/java/org/apache/cassandra/metrics/ClientMetrics.java b/src/java/org/apache/cassandra/metrics/ClientMetrics.java index 59bc94dd013c..4a384ebc2f21 100644 --- a/src/java/org/apache/cassandra/metrics/ClientMetrics.java +++ b/src/java/org/apache/cassandra/metrics/ClientMetrics.java @@ -20,8 +20,10 @@ import java.util.concurrent.Callable; -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.Gauge; +import com.codahale.metrics.Gauge; + +import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics; + public class ClientMetrics { @@ -35,15 +37,14 @@ private ClientMetrics() public void addCounter(String name, final Callable provider) { - Metrics.newGauge(factory.createMetricName(name), new Gauge() + Metrics.register(factory.createMetricName(name), new Gauge() { - public Integer value() + public Integer getValue() { try { return provider.call(); - } - catch (Exception e) + } catch (Exception e) { throw new RuntimeException(e); } diff --git a/src/java/org/apache/cassandra/metrics/ClientRequestMetrics.java b/src/java/org/apache/cassandra/metrics/ClientRequestMetrics.java index 68a2d2194448..e3a6970f7ee7 100644 --- a/src/java/org/apache/cassandra/metrics/ClientRequestMetrics.java +++ b/src/java/org/apache/cassandra/metrics/ClientRequestMetrics.java @@ -20,20 +20,14 @@ */ package org.apache.cassandra.metrics; -import java.util.concurrent.TimeUnit; -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.Counter; -import com.yammer.metrics.core.Meter; +import com.codahale.metrics.Meter; + +import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics; + public class ClientRequestMetrics extends LatencyMetrics { - @Deprecated public static final Counter readTimeouts = Metrics.newCounter(DefaultNameFactory.createMetricName("ClientRequestMetrics", "ReadTimeouts", null)); - @Deprecated public static final Counter writeTimeouts = Metrics.newCounter(DefaultNameFactory.createMetricName("ClientRequestMetrics", "WriteTimeouts", null)); - @Deprecated public static final Counter readUnavailables = Metrics.newCounter(DefaultNameFactory.createMetricName("ClientRequestMetrics", "ReadUnavailables", null)); - @Deprecated public static final Counter writeUnavailables = Metrics.newCounter(DefaultNameFactory.createMetricName("ClientRequestMetrics", "WriteUnavailables", null)); - @Deprecated public static final Counter readFailures = Metrics.newCounter(DefaultNameFactory.createMetricName("ClientRequestMetrics", "ReadFailures", null)); - public final Meter timeouts; public final Meter unavailables; public final Meter failures; @@ -42,16 +36,16 @@ public ClientRequestMetrics(String scope) { super("ClientRequest", scope); - timeouts = Metrics.newMeter(factory.createMetricName("Timeouts"), "timeouts", TimeUnit.SECONDS); - unavailables = Metrics.newMeter(factory.createMetricName("Unavailables"), "unavailables", TimeUnit.SECONDS); - failures = Metrics.newMeter(factory.createMetricName("Failures"), "failures", TimeUnit.SECONDS); + timeouts = Metrics.meter(factory.createMetricName("Timeouts")); + unavailables = Metrics.meter(factory.createMetricName("Unavailables")); + failures = Metrics.meter(factory.createMetricName("Failures")); } public void release() { super.release(); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("Timeouts")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("Unavailables")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("Failures")); + Metrics.remove(factory.createMetricName("Timeouts")); + Metrics.remove(factory.createMetricName("Unavailables")); + Metrics.remove(factory.createMetricName("Failures")); } } diff --git a/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java b/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java index 07246cfef7c9..90b6b80fffc8 100644 --- a/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java +++ b/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java @@ -20,8 +20,9 @@ import java.nio.ByteBuffer; import java.util.*; import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.TimeUnit; +import com.codahale.metrics.*; +import com.codahale.metrics.Timer; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.io.sstable.format.SSTableReader; @@ -31,16 +32,16 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.*; -import com.yammer.metrics.core.Timer; -import com.yammer.metrics.util.RatioGauge; + +import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics; + /** * Metrics for {@link ColumnFamilyStore}. */ public class ColumnFamilyMetrics { + /** Total amount of data stored in the memtable that resides on-heap, including column related overhead and overwritten rows. */ public final Gauge memtableOnHeapSize; /** Total amount of data stored in the memtable that resides off-heap, including column related overhead and overwritten rows. */ @@ -130,17 +131,13 @@ public class ColumnFamilyMetrics public final Timer coordinatorScanLatency; /** Time spent waiting for free memtable space, either on- or off-heap */ - public final Timer waitingOnFreeMemtableSpace; + public final Histogram waitingOnFreeMemtableSpace; private final MetricNameFactory factory; - private static final MetricNameFactory globalNameFactory = new AllColumnFamilyMetricNameFactory();; + private static final MetricNameFactory globalNameFactory = new AllColumnFamilyMetricNameFactory(); public final Counter speculativeRetries; - // for backward compatibility - @Deprecated public final EstimatedHistogram sstablesPerRead = new EstimatedHistogram(35); - @Deprecated public final EstimatedHistogram recentSSTablesPerRead = new EstimatedHistogram(35); - public final static LatencyMetrics globalReadLatency = new LatencyMetrics(globalNameFactory, "Read"); public final static LatencyMetrics globalWriteLatency = new LatencyMetrics(globalNameFactory, "Write"); public final static LatencyMetrics globalRangeLatency = new LatencyMetrics(globalNameFactory, "Range"); @@ -213,35 +210,35 @@ public ColumnFamilyMetrics(final ColumnFamilyStore cfs) memtableColumnsCount = createColumnFamilyGauge("MemtableColumnsCount", new Gauge() { - public Long value() + public Long getValue() { return cfs.getDataTracker().getView().getCurrentMemtable().getOperations(); } }); memtableOnHeapSize = createColumnFamilyGauge("MemtableOnHeapSize", new Gauge() { - public Long value() + public Long getValue() { return cfs.getDataTracker().getView().getCurrentMemtable().getAllocator().onHeap().owns(); } }); memtableOffHeapSize = createColumnFamilyGauge("MemtableOffHeapSize", new Gauge() { - public Long value() + public Long getValue() { return cfs.getDataTracker().getView().getCurrentMemtable().getAllocator().offHeap().owns(); } }); memtableLiveDataSize = createColumnFamilyGauge("MemtableLiveDataSize", new Gauge() { - public Long value() + public Long getValue() { return cfs.getDataTracker().getView().getCurrentMemtable().getLiveDataSize(); } }); allMemtablesOnHeapSize = createColumnFamilyGauge("AllMemtablesHeapSize", new Gauge() { - public Long value() + public Long getValue() { long size = 0; for (ColumnFamilyStore cfs2 : cfs.concatWithIndexes()) @@ -251,7 +248,7 @@ public Long value() }); allMemtablesOffHeapSize = createColumnFamilyGauge("AllMemtablesOffHeapSize", new Gauge() { - public Long value() + public Long getValue() { long size = 0; for (ColumnFamilyStore cfs2 : cfs.concatWithIndexes()) @@ -261,7 +258,7 @@ public Long value() }); allMemtablesLiveDataSize = createColumnFamilyGauge("AllMemtablesLiveDataSize", new Gauge() { - public Long value() + public Long getValue() { long size = 0; for (ColumnFamilyStore cfs2 : cfs.concatWithIndexes()) @@ -270,9 +267,9 @@ public Long value() } }); memtableSwitchCount = createColumnFamilyCounter("MemtableSwitchCount"); - estimatedRowSizeHistogram = Metrics.newGauge(factory.createMetricName("EstimatedRowSizeHistogram"), new Gauge() + estimatedRowSizeHistogram = Metrics.register(factory.createMetricName("EstimatedRowSizeHistogram"), new Gauge() { - public long[] value() + public long[] getValue() { return combineHistograms(cfs.getSSTables(), new GetHistogram() { @@ -283,9 +280,9 @@ public EstimatedHistogram getHistogram(SSTableReader reader) }); } }); - estimatedColumnCountHistogram = Metrics.newGauge(factory.createMetricName("EstimatedColumnCountHistogram"), new Gauge() + estimatedColumnCountHistogram = Metrics.register(factory.createMetricName("EstimatedColumnCountHistogram"), new Gauge() { - public long[] value() + public long[] getValue() { return combineHistograms(cfs.getSSTables(), new GetHistogram() { @@ -299,7 +296,7 @@ public EstimatedHistogram getHistogram(SSTableReader reader) sstablesPerReadHistogram = createColumnFamilyHistogram("SSTablesPerReadHistogram", cfs.keyspace.metric.sstablesPerReadHistogram); compressionRatio = createColumnFamilyGauge("CompressionRatio", new Gauge() { - public Double value() + public Double getValue() { double sum = 0; int total = 0; @@ -315,7 +312,7 @@ public Double value() } }, new Gauge() // global gauge { - public Double value() + public Double getValue() { double sum = 0; int total = 0; @@ -339,14 +336,14 @@ public Double value() pendingFlushes = createColumnFamilyCounter("PendingFlushes"); pendingCompactions = createColumnFamilyGauge("PendingCompactions", new Gauge() { - public Integer value() + public Integer getValue() { return cfs.getCompactionStrategy().getEstimatedRemainingTasks(); } }); liveSSTableCount = createColumnFamilyGauge("LiveSSTableCount", new Gauge() { - public Integer value() + public Integer getValue() { return cfs.getDataTracker().getSSTables().size(); } @@ -355,7 +352,7 @@ public Integer value() totalDiskSpaceUsed = createColumnFamilyCounter("TotalDiskSpaceUsed"); minRowSize = createColumnFamilyGauge("MinRowSize", new Gauge() { - public Long value() + public Long getValue() { long min = 0; for (SSTableReader sstable : cfs.getSSTables()) @@ -367,19 +364,19 @@ public Long value() } }, new Gauge() // global gauge { - public Long value() + public Long getValue() { long min = Long.MAX_VALUE; for (Metric cfGauge : allColumnFamilyMetrics.get("MinRowSize")) { - min = Math.min(min, ((Gauge) cfGauge).value().longValue()); + min = Math.min(min, ((Gauge) cfGauge).getValue().longValue()); } return min; } }); maxRowSize = createColumnFamilyGauge("MaxRowSize", new Gauge() { - public Long value() + public Long getValue() { long max = 0; for (SSTableReader sstable : cfs.getSSTables()) @@ -391,19 +388,19 @@ public Long value() } }, new Gauge() // global gauge { - public Long value() + public Long getValue() { long max = 0; for (Metric cfGauge : allColumnFamilyMetrics.get("MaxRowSize")) { - max = Math.max(max, ((Gauge) cfGauge).value().longValue()); + max = Math.max(max, ((Gauge) cfGauge).getValue().longValue()); } return max; } }); meanRowSize = createColumnFamilyGauge("MeanRowSize", new Gauge() { - public Long value() + public Long getValue() { long sum = 0; long count = 0; @@ -417,7 +414,7 @@ public Long value() } }, new Gauge() // global gauge { - public Long value() + public Long getValue() { long sum = 0; long count = 0; @@ -435,7 +432,7 @@ public Long value() }); bloomFilterFalsePositives = createColumnFamilyGauge("BloomFilterFalsePositives", new Gauge() { - public Long value() + public Long getValue() { long count = 0L; for (SSTableReader sstable: cfs.getSSTables()) @@ -445,7 +442,7 @@ public Long value() }); recentBloomFilterFalsePositives = createColumnFamilyGauge("RecentBloomFilterFalsePositives", new Gauge() { - public Long value() + public Long getValue() { long count = 0L; for (SSTableReader sstable : cfs.getSSTables()) @@ -455,7 +452,7 @@ public Long value() }); bloomFilterFalseRatio = createColumnFamilyGauge("BloomFilterFalseRatio", new Gauge() { - public Double value() + public Double getValue() { long falseCount = 0L; long trueCount = 0L; @@ -470,7 +467,7 @@ public Double value() } }, new Gauge() // global gauge { - public Double value() + public Double getValue() { long falseCount = 0L; long trueCount = 0L; @@ -489,7 +486,7 @@ public Double value() }); recentBloomFilterFalseRatio = createColumnFamilyGauge("RecentBloomFilterFalseRatio", new Gauge() { - public Double value() + public Double getValue() { long falseCount = 0L; long trueCount = 0L; @@ -504,7 +501,7 @@ public Double value() } }, new Gauge() // global gauge { - public Double value() + public Double getValue() { long falseCount = 0L; long trueCount = 0L; @@ -523,7 +520,7 @@ public Double value() }); bloomFilterDiskSpaceUsed = createColumnFamilyGauge("BloomFilterDiskSpaceUsed", new Gauge() { - public Long value() + public Long getValue() { long total = 0; for (SSTableReader sst : cfs.getSSTables()) @@ -533,7 +530,7 @@ public Long value() }); bloomFilterOffHeapMemoryUsed = createColumnFamilyGauge("BloomFilterOffHeapMemoryUsed", new Gauge() { - public Long value() + public Long getValue() { long total = 0; for (SSTableReader sst : cfs.getSSTables()) @@ -543,7 +540,7 @@ public Long value() }); indexSummaryOffHeapMemoryUsed = createColumnFamilyGauge("IndexSummaryOffHeapMemoryUsed", new Gauge() { - public Long value() + public Long getValue() { long total = 0; for (SSTableReader sst : cfs.getSSTables()) @@ -553,7 +550,7 @@ public Long value() }); compressionMetadataOffHeapMemoryUsed = createColumnFamilyGauge("CompressionMetadataOffHeapMemoryUsed", new Gauge() { - public Long value() + public Long getValue() { long total = 0; for (SSTableReader sst : cfs.getSSTables()) @@ -562,8 +559,14 @@ public Long value() } }); speculativeRetries = createColumnFamilyCounter("SpeculativeRetries"); - keyCacheHitRate = Metrics.newGauge(factory.createMetricName("KeyCacheHitRate"), new RatioGauge() + keyCacheHitRate = Metrics.register(factory.createMetricName("KeyCacheHitRate"), new RatioGauge() { + @Override + public Ratio getRatio() + { + return Ratio.of(getNumerator(), getDenominator()); + } + protected double getNumerator() { long hits = 0L; @@ -583,13 +586,13 @@ protected double getDenominator() tombstoneScannedHistogram = createColumnFamilyHistogram("TombstoneScannedHistogram", cfs.keyspace.metric.tombstoneScannedHistogram); liveScannedHistogram = createColumnFamilyHistogram("LiveScannedHistogram", cfs.keyspace.metric.liveScannedHistogram); colUpdateTimeDeltaHistogram = createColumnFamilyHistogram("ColUpdateTimeDeltaHistogram", cfs.keyspace.metric.colUpdateTimeDeltaHistogram); - coordinatorReadLatency = Metrics.newTimer(factory.createMetricName("CoordinatorReadLatency"), TimeUnit.MICROSECONDS, TimeUnit.SECONDS); - coordinatorScanLatency = Metrics.newTimer(factory.createMetricName("CoordinatorScanLatency"), TimeUnit.MICROSECONDS, TimeUnit.SECONDS); - waitingOnFreeMemtableSpace = Metrics.newTimer(factory.createMetricName("WaitingOnFreeMemtableSpace"), TimeUnit.MICROSECONDS, TimeUnit.SECONDS); + coordinatorReadLatency = Metrics.timer(factory.createMetricName("CoordinatorReadLatency")); + coordinatorScanLatency = Metrics.timer(factory.createMetricName("CoordinatorScanLatency")); + waitingOnFreeMemtableSpace = Metrics.histogram(factory.createMetricName("WaitingOnFreeMemtableSpace")); trueSnapshotsSize = createColumnFamilyGauge("SnapshotsSize", new Gauge() { - public Long value() + public Long getValue() { return cfs.trueSnapshotsSize(); } @@ -606,8 +609,6 @@ public Long value() public void updateSSTableIterated(int count) { sstablesPerReadHistogram.update(count); - recentSSTablesPerRead.add(count); - sstablesPerRead.add(count); } /** @@ -617,18 +618,18 @@ public void release() { for(String name : all) { - allColumnFamilyMetrics.get(name).remove(Metrics.defaultRegistry().allMetrics().get(factory.createMetricName(name))); - Metrics.defaultRegistry().removeMetric(factory.createMetricName(name)); + allColumnFamilyMetrics.get(name).remove(Metrics.getMetrics().get(factory.createMetricName(name))); + Metrics.remove(factory.createMetricName(name)); } readLatency.release(); writeLatency.release(); rangeLatency.release(); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("EstimatedRowSizeHistogram")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("EstimatedColumnCountHistogram")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("KeyCacheHitRate")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("CoordinatorReadLatency")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("CoordinatorScanLatency")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("WaitingOnFreeMemtableSpace")); + Metrics.remove(factory.createMetricName("EstimatedRowSizeHistogram")); + Metrics.remove(factory.createMetricName("EstimatedColumnCountHistogram")); + Metrics.remove(factory.createMetricName("KeyCacheHitRate")); + Metrics.remove(factory.createMetricName("CoordinatorReadLatency")); + Metrics.remove(factory.createMetricName("CoordinatorScanLatency")); + Metrics.remove(factory.createMetricName("WaitingOnFreeMemtableSpace")); } @@ -640,12 +641,12 @@ protected Gauge createColumnFamilyGauge(final String name, { return createColumnFamilyGauge(name, gauge, new Gauge() { - public Long value() + public Long getValue() { long total = 0; for (Metric cfGauge : allColumnFamilyMetrics.get(name)) { - total = total + ((Gauge) cfGauge).value().longValue(); + total = total + ((Gauge) cfGauge).getValue().longValue(); } return total; } @@ -658,10 +659,10 @@ public Long value() */ protected Gauge createColumnFamilyGauge(String name, Gauge gauge, Gauge globalGauge) { - Gauge cfGauge = Metrics.newGauge(factory.createMetricName(name), gauge); + Gauge cfGauge = Metrics.register(factory.createMetricName(name), gauge); if (register(name, cfGauge)) { - Metrics.newGauge(globalNameFactory.createMetricName(name), globalGauge); + Metrics.register(globalNameFactory.createMetricName(name), globalGauge); } return cfGauge; } @@ -672,17 +673,17 @@ protected Gauge createColumnFamilyGauge(String name, Gauge gauge, Ga */ protected Counter createColumnFamilyCounter(final String name) { - Counter cfCounter = Metrics.newCounter(factory.createMetricName(name)); + Counter cfCounter = Metrics.counter(factory.createMetricName(name)); if (register(name, cfCounter)) { - Metrics.newGauge(globalNameFactory.createMetricName(name), new Gauge() + Metrics.register(globalNameFactory.createMetricName(name), new Gauge() { - public Long value() + public Long getValue() { long total = 0; for (Metric cfGauge : allColumnFamilyMetrics.get(name)) { - total += ((Counter) cfGauge).count(); + total += ((Counter) cfGauge).getCount(); } return total; } @@ -695,13 +696,13 @@ public Long value() * Create a histogram-like interface that will register both a CF, keyspace and global level * histogram and forward any updates to both */ - protected ColumnFamilyHistogram createColumnFamilyHistogram(String name, Histogram keyspaceHistogram) + protected ColumnFamilyHistogram createColumnFamilyHistogram(String name, Histogram keyspaceHistogram) { - Histogram cfHistogram = Metrics.newHistogram(factory.createMetricName(name), true); + Histogram cfHistogram = Metrics.histogram(factory.createMetricName(name)); register(name, cfHistogram); - return new ColumnFamilyHistogram(cfHistogram, keyspaceHistogram, Metrics.newHistogram(globalNameFactory.createMetricName(name), true)); + return new ColumnFamilyHistogram(cfHistogram, keyspaceHistogram, Metrics.histogram(globalNameFactory.createMetricName(name))); } - + /** * Registers a metric to be removed when unloading CF. * @return true if first time metric with that name has been registered @@ -718,13 +719,13 @@ public class ColumnFamilyHistogram { public final Histogram[] all; public final Histogram cf; - private ColumnFamilyHistogram(Histogram cf, Histogram keyspace, Histogram global) + private ColumnFamilyHistogram(Histogram cf, Histogram keyspace, Histogram global) { this.cf = cf; this.all = new Histogram[]{cf, keyspace, global}; } - - public void update(long i) + + public void update(long i) { for(Histogram histo : all) { @@ -746,7 +747,7 @@ class ColumnFamilyMetricNameFactory implements MetricNameFactory isIndex = cfs.isIndex(); } - public MetricName createMetricName(String metricName) + public CassandraMetricsRegistry.MetricName createMetricName(String metricName) { String groupName = ColumnFamilyMetrics.class.getPackage().getName(); String type = isIndex ? "IndexColumnFamily" : "ColumnFamily"; @@ -758,20 +759,20 @@ public MetricName createMetricName(String metricName) mbeanName.append(",scope=").append(columnFamilyName); mbeanName.append(",name=").append(metricName); - return new MetricName(groupName, type, metricName, keyspaceName + "." + columnFamilyName, mbeanName.toString()); + return new CassandraMetricsRegistry.MetricName(groupName, type, metricName, keyspaceName + "." + columnFamilyName, mbeanName.toString()); } } static class AllColumnFamilyMetricNameFactory implements MetricNameFactory { - public MetricName createMetricName(String metricName) + public CassandraMetricsRegistry.MetricName createMetricName(String metricName) { String groupName = ColumnFamilyMetrics.class.getPackage().getName(); StringBuilder mbeanName = new StringBuilder(); mbeanName.append(groupName).append(":"); mbeanName.append("type=ColumnFamily"); mbeanName.append(",name=").append(metricName); - return new MetricName(groupName, "ColumnFamily", metricName, "all", mbeanName.toString()); + return new CassandraMetricsRegistry.MetricName(groupName, "ColumnFamily", metricName, "all", mbeanName.toString()); } } diff --git a/src/java/org/apache/cassandra/metrics/CommitLogMetrics.java b/src/java/org/apache/cassandra/metrics/CommitLogMetrics.java index e9c0719970a9..670fa6bf3c64 100644 --- a/src/java/org/apache/cassandra/metrics/CommitLogMetrics.java +++ b/src/java/org/apache/cassandra/metrics/CommitLogMetrics.java @@ -17,14 +17,13 @@ */ package org.apache.cassandra.metrics; -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.Gauge; -import com.yammer.metrics.core.Timer; +import com.codahale.metrics.Gauge; +import com.codahale.metrics.Timer; import org.apache.cassandra.db.commitlog.AbstractCommitLogService; import org.apache.cassandra.db.commitlog.CommitLogSegmentManager; -import java.util.concurrent.TimeUnit; +import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics; /** * Metrics for commit log @@ -46,28 +45,28 @@ public class CommitLogMetrics public CommitLogMetrics(final AbstractCommitLogService service, final CommitLogSegmentManager allocator) { - completedTasks = Metrics.newGauge(factory.createMetricName("CompletedTasks"), new Gauge() + completedTasks = Metrics.register(factory.createMetricName("CompletedTasks"), new Gauge() { - public Long value() + public Long getValue() { return service.getCompletedTasks(); } }); - pendingTasks = Metrics.newGauge(factory.createMetricName("PendingTasks"), new Gauge() + pendingTasks = Metrics.register(factory.createMetricName("PendingTasks"), new Gauge() { - public Long value() + public Long getValue() { return service.getPendingTasks(); } }); - totalCommitLogSize = Metrics.newGauge(factory.createMetricName("TotalCommitLogSize"), new Gauge() + totalCommitLogSize = Metrics.register(factory.createMetricName("TotalCommitLogSize"), new Gauge() { - public Long value() + public Long getValue() { return allocator.bytesUsed(); } }); - waitingOnSegmentAllocation = Metrics.newTimer(factory.createMetricName("WaitingOnSegmentAllocation"), TimeUnit.MICROSECONDS, TimeUnit.SECONDS); - waitingOnCommit = Metrics.newTimer(factory.createMetricName("WaitingOnCommit"), TimeUnit.MICROSECONDS, TimeUnit.SECONDS); + waitingOnSegmentAllocation = Metrics.timer(factory.createMetricName("WaitingOnSegmentAllocation")); + waitingOnCommit = Metrics.timer(factory.createMetricName("WaitingOnCommit")); } } diff --git a/src/java/org/apache/cassandra/metrics/CompactionMetrics.java b/src/java/org/apache/cassandra/metrics/CompactionMetrics.java index b0151303316b..a62e3c4d2a71 100644 --- a/src/java/org/apache/cassandra/metrics/CompactionMetrics.java +++ b/src/java/org/apache/cassandra/metrics/CompactionMetrics.java @@ -19,12 +19,10 @@ import java.util.*; import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.Counter; -import com.yammer.metrics.core.Gauge; -import com.yammer.metrics.core.Meter; +import com.codahale.metrics.Counter; +import com.codahale.metrics.Gauge; +import com.codahale.metrics.Meter; import org.apache.cassandra.config.Schema; import org.apache.cassandra.db.ColumnFamilyStore; @@ -32,6 +30,8 @@ import org.apache.cassandra.db.compaction.CompactionInfo; import org.apache.cassandra.db.compaction.CompactionManager; +import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics; + /** * Metrics for compaction. */ @@ -53,9 +53,9 @@ public class CompactionMetrics implements CompactionManager.CompactionExecutorSt public CompactionMetrics(final ThreadPoolExecutor... collectors) { - pendingTasks = Metrics.newGauge(factory.createMetricName("PendingTasks"), new Gauge() + pendingTasks = Metrics.register(factory.createMetricName("PendingTasks"), new Gauge() { - public Integer value() + public Integer getValue() { int n = 0; for (String keyspaceName : Schema.instance.getKeyspaces()) @@ -68,9 +68,9 @@ public Integer value() return n; } }); - completedTasks = Metrics.newGauge(factory.createMetricName("CompletedTasks"), new Gauge() + completedTasks = Metrics.register(factory.createMetricName("CompletedTasks"), new Gauge() { - public Long value() + public Long getValue() { long completedTasks = 0; for (ThreadPoolExecutor collector : collectors) @@ -78,8 +78,8 @@ public Long value() return completedTasks; } }); - totalCompactionsCompleted = Metrics.newMeter(factory.createMetricName("TotalCompactionsCompleted"), "compaction completed", TimeUnit.SECONDS); - bytesCompacted = Metrics.newCounter(factory.createMetricName("BytesCompacted")); + totalCompactionsCompleted = Metrics.meter(factory.createMetricName("TotalCompactionsCompleted")); + bytesCompacted = Metrics.counter(factory.createMetricName("BytesCompacted")); } public void beginCompaction(CompactionInfo.Holder ci) diff --git a/src/java/org/apache/cassandra/metrics/ConnectionMetrics.java b/src/java/org/apache/cassandra/metrics/ConnectionMetrics.java index eaf29f842a4e..60020b3966b6 100644 --- a/src/java/org/apache/cassandra/metrics/ConnectionMetrics.java +++ b/src/java/org/apache/cassandra/metrics/ConnectionMetrics.java @@ -18,11 +18,12 @@ package org.apache.cassandra.metrics; import java.net.InetAddress; -import java.util.concurrent.TimeUnit; -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.Gauge; -import com.yammer.metrics.core.Meter; +import com.codahale.metrics.Gauge; +import com.codahale.metrics.Meter; + +import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics; + import org.apache.cassandra.net.OutboundTcpConnectionPool; @@ -34,8 +35,7 @@ public class ConnectionMetrics public static final String TYPE_NAME = "Connection"; /** Total number of timeouts happened on this node */ - public static final Meter totalTimeouts = Metrics.newMeter(DefaultNameFactory.createMetricName(TYPE_NAME, "TotalTimeouts", null), "total timeouts", TimeUnit.SECONDS); - private static long recentTimeouts; + public static final Meter totalTimeouts = Metrics.meter(DefaultNameFactory.createMetricName(TYPE_NAME, "TotalTimeouts", null)); public final String address; /** Pending tasks for Command(Mutations, Read etc) TCP Connections */ @@ -53,8 +53,6 @@ public class ConnectionMetrics private final MetricNameFactory factory; - private long recentTimeoutCount; - /** * Create metrics for given connection pool. * @@ -68,69 +66,51 @@ public ConnectionMetrics(InetAddress ip, final OutboundTcpConnectionPool connect factory = new DefaultNameFactory("Connection", address); - commandPendingTasks = Metrics.newGauge(factory.createMetricName("CommandPendingTasks"), new Gauge() + commandPendingTasks = Metrics.register(factory.createMetricName("CommandPendingTasks"), new Gauge() { - public Integer value() + public Integer getValue() { return connectionPool.cmdCon.getPendingMessages(); } }); - commandCompletedTasks = Metrics.newGauge(factory.createMetricName("CommandCompletedTasks"), new Gauge() + commandCompletedTasks = Metrics.register(factory.createMetricName("CommandCompletedTasks"), new Gauge() { - public Long value() + public Long getValue() { return connectionPool.cmdCon.getCompletedMesssages(); } }); - commandDroppedTasks = Metrics.newGauge(factory.createMetricName("CommandDroppedTasks"), new Gauge() + commandDroppedTasks = Metrics.register(factory.createMetricName("CommandDroppedTasks"), new Gauge() { - public Long value() + public Long getValue() { return connectionPool.cmdCon.getDroppedMessages(); } }); - responsePendingTasks = Metrics.newGauge(factory.createMetricName("ResponsePendingTasks"), new Gauge() + responsePendingTasks = Metrics.register(factory.createMetricName("ResponsePendingTasks"), new Gauge() { - public Integer value() + public Integer getValue() { return connectionPool.ackCon.getPendingMessages(); } }); - responseCompletedTasks = Metrics.newGauge(factory.createMetricName("ResponseCompletedTasks"), new Gauge() + responseCompletedTasks = Metrics.register(factory.createMetricName("ResponseCompletedTasks"), new Gauge() { - public Long value() + public Long getValue() { return connectionPool.ackCon.getCompletedMesssages(); } }); - timeouts = Metrics.newMeter(factory.createMetricName("Timeouts"), "timeouts", TimeUnit.SECONDS); + timeouts = Metrics.meter(factory.createMetricName("Timeouts")); } public void release() { - Metrics.defaultRegistry().removeMetric(factory.createMetricName("CommandPendingTasks")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("CommandCompletedTasks")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("CommandDroppedTasks")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("ResponsePendingTasks")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("ResponseCompletedTasks")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("Timeouts")); - } - - @Deprecated - public static long getRecentTotalTimeout() - { - long total = totalTimeouts.count(); - long recent = total - recentTimeouts; - recentTimeouts = total; - return recent; - } - - @Deprecated - public long getRecentTimeout() - { - long timeoutCount = timeouts.count(); - long recent = timeoutCount - recentTimeoutCount; - recentTimeoutCount = timeoutCount; - return recent; + Metrics.remove(factory.createMetricName("CommandPendingTasks")); + Metrics.remove(factory.createMetricName("CommandCompletedTasks")); + Metrics.remove(factory.createMetricName("CommandDroppedTasks")); + Metrics.remove(factory.createMetricName("ResponsePendingTasks")); + Metrics.remove(factory.createMetricName("ResponseCompletedTasks")); + Metrics.remove(factory.createMetricName("Timeouts")); } } diff --git a/src/java/org/apache/cassandra/metrics/DefaultNameFactory.java b/src/java/org/apache/cassandra/metrics/DefaultNameFactory.java index f7f23ee58dd7..db51906cfda4 100644 --- a/src/java/org/apache/cassandra/metrics/DefaultNameFactory.java +++ b/src/java/org/apache/cassandra/metrics/DefaultNameFactory.java @@ -17,7 +17,6 @@ */ package org.apache.cassandra.metrics; -import com.yammer.metrics.core.MetricName; /** * MetricNameFactory that generates default MetricName of metrics. @@ -40,14 +39,14 @@ public DefaultNameFactory(String type, String scope) this.scope = scope; } - public MetricName createMetricName(String metricName) + public CassandraMetricsRegistry.MetricName createMetricName(String metricName) { return createMetricName(type, metricName, scope); } - public static MetricName createMetricName(String type, String metricName, String scope) + public static CassandraMetricsRegistry.MetricName createMetricName(String type, String metricName, String scope) { - return new MetricName(GROUP_NAME, type, metricName, scope, createDefaultMBeanName(type, metricName, scope)); + return new CassandraMetricsRegistry.MetricName(GROUP_NAME, type, metricName, scope, createDefaultMBeanName(type, metricName, scope)); } protected static String createDefaultMBeanName(String type, String name, String scope) diff --git a/src/java/org/apache/cassandra/metrics/DroppedMessageMetrics.java b/src/java/org/apache/cassandra/metrics/DroppedMessageMetrics.java index f94ea04d6e0c..58c80fb6c279 100644 --- a/src/java/org/apache/cassandra/metrics/DroppedMessageMetrics.java +++ b/src/java/org/apache/cassandra/metrics/DroppedMessageMetrics.java @@ -17,13 +17,11 @@ */ package org.apache.cassandra.metrics; -import java.util.concurrent.TimeUnit; - -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.Meter; - +import com.codahale.metrics.Meter; import org.apache.cassandra.net.MessagingService; +import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics; + /** * Metrics for dropped messages by verb. */ @@ -32,20 +30,9 @@ public class DroppedMessageMetrics /** Number of dropped messages */ public final Meter dropped; - private long lastDropped = 0; - public DroppedMessageMetrics(MessagingService.Verb verb) { MetricNameFactory factory = new DefaultNameFactory("DroppedMessage", verb.toString()); - dropped = Metrics.newMeter(factory.createMetricName("Dropped"), "dropped", TimeUnit.SECONDS); - } - - @Deprecated - public int getRecentlyDropped() - { - long currentDropped = dropped.count(); - long recentlyDropped = currentDropped - lastDropped; - lastDropped = currentDropped; - return (int)recentlyDropped; + dropped = Metrics.meter(factory.createMetricName("Dropped")); } } diff --git a/src/java/org/apache/cassandra/metrics/EstimatedHistogramReservoir.java b/src/java/org/apache/cassandra/metrics/EstimatedHistogramReservoir.java new file mode 100644 index 000000000000..221f2e171a94 --- /dev/null +++ b/src/java/org/apache/cassandra/metrics/EstimatedHistogramReservoir.java @@ -0,0 +1,105 @@ +/* + * 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.metrics; + +import com.google.common.annotations.VisibleForTesting; + +import com.codahale.metrics.Reservoir; +import com.codahale.metrics.Snapshot; +import com.codahale.metrics.UniformSnapshot; +import org.apache.cassandra.utils.EstimatedHistogram; + +/** + * Allows our Histogram implementation to be used by the metrics library. + * + * Default buckets allows nanosecond timings. + */ +public class EstimatedHistogramReservoir implements Reservoir +{ + EstimatedHistogram histogram; + + public EstimatedHistogramReservoir() + { + this(128); + } + + public EstimatedHistogramReservoir(int numBuckets) + { + histogram = new EstimatedHistogram(numBuckets); + } + + @Override + public int size() + { + return histogram.getBucketOffsets().length + 1; + } + + @Override + public void update(long value) + { + histogram.add(value); + } + + @Override + public Snapshot getSnapshot() + { + return new HistogramSnapshot(histogram); + } + + @VisibleForTesting + public void clear() + { + histogram.getBuckets(true); + } + + class HistogramSnapshot extends UniformSnapshot + { + EstimatedHistogram histogram; + + public HistogramSnapshot(EstimatedHistogram histogram) + { + super(histogram.getBuckets(false)); + + this.histogram = histogram; + } + + @Override + public double getValue(double quantile) + { + return histogram.percentile(quantile); + } + + @Override + public long getMax() + { + return histogram.max(); + } + + @Override + public long getMin() + { + return histogram.min(); + } + + @Override + public double getMean() + { + return histogram.mean(); + } + } +} diff --git a/src/java/org/apache/cassandra/metrics/FileCacheMetrics.java b/src/java/org/apache/cassandra/metrics/FileCacheMetrics.java index 5f6bd20136f4..c240c0389bd7 100644 --- a/src/java/org/apache/cassandra/metrics/FileCacheMetrics.java +++ b/src/java/org/apache/cassandra/metrics/FileCacheMetrics.java @@ -17,14 +17,14 @@ */ package org.apache.cassandra.metrics; -import java.util.concurrent.TimeUnit; - -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.Gauge; -import com.yammer.metrics.core.Meter; -import com.yammer.metrics.util.RatioGauge; +import com.codahale.metrics.Gauge; +import com.codahale.metrics.Meter; +import com.codahale.metrics.RatioGauge; import org.apache.cassandra.service.FileCacheService; +import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics; + + public class FileCacheMetrics { private static final MetricNameFactory factory = new DefaultNameFactory("FileCache"); @@ -40,23 +40,19 @@ public class FileCacheMetrics public FileCacheMetrics() { - hits = Metrics.newMeter(factory.createMetricName("Hits"), "hits", TimeUnit.SECONDS); - requests = Metrics.newMeter(factory.createMetricName("Requests"), "requests", TimeUnit.SECONDS); - hitRate = Metrics.newGauge(factory.createMetricName("HitRate"), new RatioGauge() + hits = Metrics.meter(factory.createMetricName("Hits")); + requests = Metrics.meter(factory.createMetricName("Requests")); + hitRate = Metrics.register(factory.createMetricName("HitRate"), new RatioGauge() { - protected double getNumerator() - { - return hits.count(); - } - - protected double getDenominator() + @Override + public Ratio getRatio() { - return requests.count(); + return Ratio.of(hits.getCount(), requests.getCount()); } }); - size = Metrics.newGauge(factory.createMetricName("Size"), new Gauge() + size = Metrics.register(factory.createMetricName("Size"), new Gauge() { - public Long value() + public Long getValue() { return FileCacheService.instance.sizeInBytes(); } diff --git a/src/java/org/apache/cassandra/metrics/HintedHandoffMetrics.java b/src/java/org/apache/cassandra/metrics/HintedHandoffMetrics.java index d002e399ff60..fef8c1ffe409 100644 --- a/src/java/org/apache/cassandra/metrics/HintedHandoffMetrics.java +++ b/src/java/org/apache/cassandra/metrics/HintedHandoffMetrics.java @@ -20,6 +20,7 @@ import java.net.InetAddress; import java.util.Map.Entry; +import com.codahale.metrics.Counter; import org.apache.cassandra.db.HintedHandOffManager; import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.utils.UUIDGen; @@ -29,8 +30,8 @@ import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.Counter; + +import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics; /** * Metrics for {@link HintedHandOffManager}. @@ -39,7 +40,7 @@ public class HintedHandoffMetrics { private static final Logger logger = LoggerFactory.getLogger(HintedHandoffMetrics.class); - private final MetricNameFactory factory = new DefaultNameFactory("HintedHandOffManager"); + private static final MetricNameFactory factory = new DefaultNameFactory("HintedHandOffManager"); /** Total number of hints which are not stored, This is not a cache. */ private final LoadingCache notStored = CacheBuilder.newBuilder().build(new CacheLoader() @@ -55,7 +56,7 @@ public DifferencingCounter load(InetAddress address) { public Counter load(InetAddress address) { - return Metrics.newCounter(factory.createMetricName("Hints_created-" + address.getHostAddress())); + return Metrics.counter(factory.createMetricName("Hints_created-" + address.getHostAddress())); } }); @@ -88,12 +89,12 @@ public class DifferencingCounter public DifferencingCounter(InetAddress address) { - this.meter = Metrics.newCounter(factory.createMetricName("Hints_not_stored-" + address.getHostAddress())); + this.meter = Metrics.counter(factory.createMetricName("Hints_not_stored-" + address.getHostAddress())); } public long difference() { - long current = meter.count(); + long current = meter.getCount(); long difference = current - reported; this.reported = current; return difference; @@ -101,7 +102,7 @@ public long difference() public long count() { - return meter.count(); + return meter.getCount(); } public void mark() diff --git a/src/java/org/apache/cassandra/metrics/KeyspaceMetrics.java b/src/java/org/apache/cassandra/metrics/KeyspaceMetrics.java index fa6f33b277dd..0bac4212c625 100644 --- a/src/java/org/apache/cassandra/metrics/KeyspaceMetrics.java +++ b/src/java/org/apache/cassandra/metrics/KeyspaceMetrics.java @@ -19,13 +19,17 @@ import java.util.Set; +import com.codahale.metrics.Gauge; +import com.codahale.metrics.Histogram; +import com.codahale.metrics.MetricRegistry; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.Keyspace; import com.google.common.collect.Lists; import com.google.common.collect.Sets; -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.*; + +import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics; + /** * Metrics for {@link ColumnFamilyStore}. @@ -104,112 +108,112 @@ public KeyspaceMetrics(final Keyspace ks) { public Long getValue(ColumnFamilyMetrics metric) { - return metric.memtableColumnsCount.value(); + return metric.memtableColumnsCount.getValue(); } }); memtableLiveDataSize = createKeyspaceGauge("MemtableLiveDataSize", new MetricValue() { public Long getValue(ColumnFamilyMetrics metric) { - return metric.memtableLiveDataSize.value(); + return metric.memtableLiveDataSize.getValue(); } }); memtableOnHeapDataSize = createKeyspaceGauge("MemtableOnHeapDataSize", new MetricValue() { public Long getValue(ColumnFamilyMetrics metric) { - return metric.memtableOnHeapSize.value(); + return metric.memtableOnHeapSize.getValue(); } }); memtableOffHeapDataSize = createKeyspaceGauge("MemtableOffHeapDataSize", new MetricValue() { public Long getValue(ColumnFamilyMetrics metric) { - return metric.memtableOffHeapSize.value(); + return metric.memtableOffHeapSize.getValue(); } }); allMemtablesLiveDataSize = createKeyspaceGauge("AllMemtablesLiveDataSize", new MetricValue() { public Long getValue(ColumnFamilyMetrics metric) { - return metric.allMemtablesLiveDataSize.value(); + return metric.allMemtablesLiveDataSize.getValue(); } }); allMemtablesOnHeapDataSize = createKeyspaceGauge("AllMemtablesOnHeapDataSize", new MetricValue() { public Long getValue(ColumnFamilyMetrics metric) { - return metric.allMemtablesOnHeapSize.value(); + return metric.allMemtablesOnHeapSize.getValue(); } }); allMemtablesOffHeapDataSize = createKeyspaceGauge("AllMemtablesOffHeapDataSize", new MetricValue() { public Long getValue(ColumnFamilyMetrics metric) { - return metric.allMemtablesOffHeapSize.value(); + return metric.allMemtablesOffHeapSize.getValue(); } }); memtableSwitchCount = createKeyspaceGauge("MemtableSwitchCount", new MetricValue() { public Long getValue(ColumnFamilyMetrics metric) { - return metric.memtableSwitchCount.count(); + return metric.memtableSwitchCount.getCount(); } }); pendingCompactions = createKeyspaceGauge("PendingCompactions", new MetricValue() { public Long getValue(ColumnFamilyMetrics metric) { - return (long) metric.pendingCompactions.value(); + return (long) metric.pendingCompactions.getValue(); } }); pendingFlushes = createKeyspaceGauge("PendingFlushes", new MetricValue() { public Long getValue(ColumnFamilyMetrics metric) { - return (long) metric.pendingFlushes.count(); + return (long) metric.pendingFlushes.getCount(); } }); liveDiskSpaceUsed = createKeyspaceGauge("LiveDiskSpaceUsed", new MetricValue() { public Long getValue(ColumnFamilyMetrics metric) { - return metric.liveDiskSpaceUsed.count(); + return metric.liveDiskSpaceUsed.getCount(); } }); totalDiskSpaceUsed = createKeyspaceGauge("TotalDiskSpaceUsed", new MetricValue() { public Long getValue(ColumnFamilyMetrics metric) { - return metric.totalDiskSpaceUsed.count(); + return metric.totalDiskSpaceUsed.getCount(); } }); bloomFilterDiskSpaceUsed = createKeyspaceGauge("BloomFilterDiskSpaceUsed", new MetricValue() { public Long getValue(ColumnFamilyMetrics metric) { - return metric.bloomFilterDiskSpaceUsed.value(); + return metric.bloomFilterDiskSpaceUsed.getValue(); } }); bloomFilterOffHeapMemoryUsed = createKeyspaceGauge("BloomFilterOffHeapMemoryUsed", new MetricValue() { public Long getValue(ColumnFamilyMetrics metric) { - return metric.bloomFilterOffHeapMemoryUsed.value(); + return metric.bloomFilterOffHeapMemoryUsed.getValue(); } }); indexSummaryOffHeapMemoryUsed = createKeyspaceGauge("IndexSummaryOffHeapMemoryUsed", new MetricValue() { public Long getValue(ColumnFamilyMetrics metric) { - return metric.indexSummaryOffHeapMemoryUsed.value(); + return metric.indexSummaryOffHeapMemoryUsed.getValue(); } }); compressionMetadataOffHeapMemoryUsed = createKeyspaceGauge("CompressionMetadataOffHeapMemoryUsed", new MetricValue() { public Long getValue(ColumnFamilyMetrics metric) { - return metric.compressionMetadataOffHeapMemoryUsed.value(); + return metric.compressionMetadataOffHeapMemoryUsed.getValue(); } }); // latency metrics for ColumnFamilyMetrics to update @@ -217,10 +221,10 @@ public Long getValue(ColumnFamilyMetrics metric) writeLatency = new LatencyMetrics(factory, "Write"); rangeLatency = new LatencyMetrics(factory, "Range"); // create histograms for ColumnFamilyMetrics to replicate updates to - sstablesPerReadHistogram = Metrics.newHistogram(factory.createMetricName("SSTablesPerReadHistogram"), true); - tombstoneScannedHistogram = Metrics.newHistogram(factory.createMetricName("TombstoneScannedHistogram"), true); - liveScannedHistogram = Metrics.newHistogram(factory.createMetricName("LiveScannedHistogram"), true); - colUpdateTimeDeltaHistogram = Metrics.newHistogram(factory.createMetricName("ColUpdateTimeDeltaHistogram"), true); + sstablesPerReadHistogram = Metrics.histogram(factory.createMetricName("SSTablesPerReadHistogram")); + tombstoneScannedHistogram = Metrics.histogram(factory.createMetricName("TombstoneScannedHistogram")); + liveScannedHistogram = Metrics.histogram(factory.createMetricName("LiveScannedHistogram")); + colUpdateTimeDeltaHistogram = Metrics.histogram(factory.createMetricName("ColUpdateTimeDeltaHistogram")); // add manually since histograms do not use createKeyspaceGauge method allMetrics.addAll(Lists.newArrayList("SSTablesPerReadHistogram", "TombstoneScannedHistogram", "LiveScannedHistogram")); @@ -236,7 +240,7 @@ public void release() { for(String name : allMetrics) { - Metrics.defaultRegistry().removeMetric(factory.createMetricName(name)); + Metrics.remove(factory.createMetricName(name)); } // latency metrics contain multiple metrics internally and need to be released manually readLatency.release(); @@ -251,7 +255,7 @@ private interface MetricValue { /** * get value of a metric - * @param columnfamilymetrics of a column family in this keyspace + * @param metric of a column family in this keyspace * @return current value of a metric */ public Long getValue(ColumnFamilyMetrics metric); @@ -260,15 +264,15 @@ private interface MetricValue /** * Creates a gauge that will sum the current value of a metric for all column families in this keyspace * @param name - * @param MetricValue + * @param extractor * @return Gauge>Long> that computes sum of MetricValue.getValue() */ private Gauge createKeyspaceGauge(String name, final MetricValue extractor) { allMetrics.add(name); - return Metrics.newGauge(factory.createMetricName(name), new Gauge() + return Metrics.register(factory.createMetricName(name), new Gauge() { - public Long value() + public Long getValue() { long sum = 0; for (ColumnFamilyStore cf : keyspace.getColumnFamilyStores()) @@ -289,7 +293,7 @@ class KeyspaceMetricNameFactory implements MetricNameFactory this.keyspaceName = ks.getName(); } - public MetricName createMetricName(String metricName) + public CassandraMetricsRegistry.MetricName createMetricName(String metricName) { String groupName = ColumnFamilyMetrics.class.getPackage().getName(); @@ -299,7 +303,7 @@ public MetricName createMetricName(String metricName) mbeanName.append(",keyspace=").append(keyspaceName); mbeanName.append(",name=").append(metricName); - return new MetricName(groupName, "keyspace", metricName, keyspaceName, mbeanName.toString()); + return new CassandraMetricsRegistry.MetricName(groupName, "keyspace", metricName, keyspaceName, mbeanName.toString()); } } } diff --git a/src/java/org/apache/cassandra/metrics/LatencyMetrics.java b/src/java/org/apache/cassandra/metrics/LatencyMetrics.java index 149af917fb01..ced56a84f477 100644 --- a/src/java/org/apache/cassandra/metrics/LatencyMetrics.java +++ b/src/java/org/apache/cassandra/metrics/LatencyMetrics.java @@ -20,13 +20,14 @@ import java.util.List; import java.util.concurrent.TimeUnit; -import org.apache.cassandra.utils.EstimatedHistogram; +import com.codahale.metrics.Counter; +import com.codahale.metrics.Timer; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.Counter; -import com.yammer.metrics.core.Timer; + +import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics; + /** * Metrics about latencies @@ -44,11 +45,6 @@ public class LatencyMetrics protected final MetricNameFactory factory; protected final String namePrefix; - @Deprecated public final EstimatedHistogram totalLatencyHistogram = new EstimatedHistogram(); - @Deprecated public final EstimatedHistogram recentLatencyHistogram = new EstimatedHistogram(); - protected long lastLatency; - protected long lastOpCount; - /** * Create LatencyMetrics with given group, type, and scope. Name prefix for each metric will be empty. * @@ -83,8 +79,8 @@ public LatencyMetrics(MetricNameFactory factory, String namePrefix) this.factory = factory; this.namePrefix = namePrefix; - latency = Metrics.newTimer(factory.createMetricName(namePrefix + "Latency"), TimeUnit.MICROSECONDS, TimeUnit.SECONDS); - totalLatency = Metrics.newCounter(factory.createMetricName(namePrefix + "TotalLatency")); + latency = Metrics.timer(factory.createMetricName(namePrefix + "Latency")); + totalLatency = Metrics.counter(factory.createMetricName(namePrefix + "TotalLatency")); } /** @@ -106,9 +102,7 @@ public void addNano(long nanos) { // convert to microseconds. 1 millionth latency.update(nanos, TimeUnit.NANOSECONDS); - totalLatency.inc(nanos / 1000); - totalLatencyHistogram.add(nanos / 1000); - recentLatencyHistogram.add(nanos / 1000); + totalLatency.inc(nanos); for(LatencyMetrics parent : parents) { parent.addNano(nanos); @@ -117,25 +111,7 @@ public void addNano(long nanos) public void release() { - Metrics.defaultRegistry().removeMetric(factory.createMetricName(namePrefix + "Latency")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName(namePrefix + "TotalLatency")); - } - - @Deprecated - public synchronized double getRecentLatency() - { - long ops = latency.count(); - long n = totalLatency.count(); - if (ops == lastOpCount) - return 0; - try - { - return ((double) n - lastLatency) / (ops - lastOpCount); - } - finally - { - lastLatency = n; - lastOpCount = ops; - } + Metrics.remove(factory.createMetricName(namePrefix + "Latency")); + Metrics.remove(factory.createMetricName(namePrefix + "TotalLatency")); } } diff --git a/src/java/org/apache/cassandra/metrics/MetricNameFactory.java b/src/java/org/apache/cassandra/metrics/MetricNameFactory.java index 78f8b14d0e54..4e8f2b45acd1 100644 --- a/src/java/org/apache/cassandra/metrics/MetricNameFactory.java +++ b/src/java/org/apache/cassandra/metrics/MetricNameFactory.java @@ -17,7 +17,6 @@ */ package org.apache.cassandra.metrics; -import com.yammer.metrics.core.MetricName; public interface MetricNameFactory { @@ -27,5 +26,5 @@ public interface MetricNameFactory * @param metricName part of qualified name. * @return new String with given metric name. */ - MetricName createMetricName(String metricName); + CassandraMetricsRegistry.MetricName createMetricName(String metricName); } diff --git a/src/java/org/apache/cassandra/metrics/ReadRepairMetrics.java b/src/java/org/apache/cassandra/metrics/ReadRepairMetrics.java index f9b1a40ab7da..9ee1c6073cb6 100644 --- a/src/java/org/apache/cassandra/metrics/ReadRepairMetrics.java +++ b/src/java/org/apache/cassandra/metrics/ReadRepairMetrics.java @@ -17,10 +17,9 @@ */ package org.apache.cassandra.metrics; -import java.util.concurrent.TimeUnit; +import com.codahale.metrics.Meter; -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.Meter; +import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics; /** * Metrics related to Read Repair. @@ -29,10 +28,7 @@ public class ReadRepairMetrics { private static final MetricNameFactory factory = new DefaultNameFactory("ReadRepair"); - public static final Meter repairedBlocking = - Metrics.newMeter(factory.createMetricName("RepairedBlocking"), "RepairedBlocking", TimeUnit.SECONDS); - public static final Meter repairedBackground = - Metrics.newMeter(factory.createMetricName("RepairedBackground"), "RepairedBackground", TimeUnit.SECONDS); - public static final Meter attempted = - Metrics.newMeter(factory.createMetricName("Attempted"), "Attempted", TimeUnit.SECONDS); + public static final Meter repairedBlocking = Metrics.meter(factory.createMetricName("RepairedBlocking")); + public static final Meter repairedBackground = Metrics.meter(factory.createMetricName("RepairedBackground")); + public static final Meter attempted = Metrics.meter(factory.createMetricName("Attempted")); } diff --git a/src/java/org/apache/cassandra/metrics/RestorableMeter.java b/src/java/org/apache/cassandra/metrics/RestorableMeter.java index c421618059d3..b543665904a7 100644 --- a/src/java/org/apache/cassandra/metrics/RestorableMeter.java +++ b/src/java/org/apache/cassandra/metrics/RestorableMeter.java @@ -18,12 +18,12 @@ */ package org.apache.cassandra.metrics; -import com.yammer.metrics.core.Clock; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; import static java.lang.Math.exp; +import com.codahale.metrics.Clock; /** * A meter metric which measures mean throughput as well as fifteen-minute and two-hour @@ -52,7 +52,7 @@ public class RestorableMeter public RestorableMeter() { this.m15Rate = new RestorableEWMA(TimeUnit.MINUTES.toSeconds(15)); this.m120Rate = new RestorableEWMA(TimeUnit.MINUTES.toSeconds(120)); - this.startTime = this.clock.tick(); + this.startTime = this.clock.getTick(); this.lastTick = new AtomicLong(startTime); } @@ -64,7 +64,7 @@ public RestorableMeter() { public RestorableMeter(double lastM15Rate, double lastM120Rate) { this.m15Rate = new RestorableEWMA(lastM15Rate, TimeUnit.MINUTES.toSeconds(15)); this.m120Rate = new RestorableEWMA(lastM120Rate, TimeUnit.MINUTES.toSeconds(120)); - this.startTime = this.clock.tick(); + this.startTime = this.clock.getTick(); this.lastTick = new AtomicLong(startTime); } @@ -73,7 +73,7 @@ public RestorableMeter(double lastM15Rate, double lastM120Rate) { */ private void tickIfNecessary() { final long oldTick = lastTick.get(); - final long newTick = clock.tick(); + final long newTick = clock.getTick(); final long age = newTick - oldTick; if (age > TICK_INTERVAL) { final long newIntervalStartTick = newTick - age % TICK_INTERVAL; @@ -139,7 +139,7 @@ public double meanRate() { if (count() == 0) { return 0.0; } else { - final long elapsed = (clock.tick() - startTime); + final long elapsed = (clock.getTick() - startTime); return (count() / (double) elapsed) * NANOS_PER_SECOND; } } diff --git a/src/java/org/apache/cassandra/metrics/SEPMetrics.java b/src/java/org/apache/cassandra/metrics/SEPMetrics.java index 58fe9c5b91e7..35f02b493a41 100644 --- a/src/java/org/apache/cassandra/metrics/SEPMetrics.java +++ b/src/java/org/apache/cassandra/metrics/SEPMetrics.java @@ -17,22 +17,24 @@ */ package org.apache.cassandra.metrics; -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.Gauge; +import com.codahale.metrics.Counter; +import com.codahale.metrics.Gauge; import org.apache.cassandra.concurrent.SEPExecutor; +import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics; + public class SEPMetrics { /** Number of active tasks. */ public final Gauge activeTasks; /** Number of tasks that had blocked before being accepted (or rejected). */ - public final Gauge totalBlocked; + public final Counter totalBlocked; /** * Number of tasks currently blocked, waiting to be accepted by * the executor (because all threads are busy and the backing queue is full). */ - public final Gauge currentBlocked; + public final Counter currentBlocked; /** Number of completed tasks. */ public final Gauge completedTasks; /** Number of tasks waiting to be executed. */ @@ -52,44 +54,33 @@ public class SEPMetrics public SEPMetrics(final SEPExecutor executor, String path, String poolName) { this.factory = new ThreadPoolMetricNameFactory("ThreadPools", path, poolName); - activeTasks = Metrics.newGauge(factory.createMetricName("ActiveTasks"), new Gauge() + activeTasks = Metrics.register(factory.createMetricName("ActiveTasks"), new Gauge() { - public Integer value() + public Integer getValue() { return executor.getActiveCount(); } }); - pendingTasks = Metrics.newGauge(factory.createMetricName("PendingTasks"), new Gauge() + pendingTasks = Metrics.register(factory.createMetricName("PendingTasks"), new Gauge() { - public Long value() + public Long getValue() { return executor.getPendingTasks(); } }); - totalBlocked = Metrics.newGauge(factory.createMetricName("TotalBlockedTasks"), new Gauge() - { - public Integer value() - { - return executor.getTotalBlockedTasks(); - } - }); - currentBlocked = Metrics.newGauge(factory.createMetricName("CurrentlyBlockedTasks"), new Gauge() - { - public Long value() - { - return (long) executor.getCurrentlyBlockedTasks(); - } - }); - completedTasks = Metrics.newGauge(factory.createMetricName("CompletedTasks"), new Gauge() + totalBlocked = Metrics.counter(factory.createMetricName("TotalBlockedTasks")); + currentBlocked = Metrics.counter(factory.createMetricName("CurrentlyBlockedTasks")); + + completedTasks = Metrics.register(factory.createMetricName("CompletedTasks"), new Gauge() { - public Long value() + public Long getValue() { return executor.getCompletedTasks(); } }); - maxPoolSize = Metrics.newGauge(factory.createMetricName("MaxPoolSize"), new Gauge() + maxPoolSize = Metrics.register(factory.createMetricName("MaxPoolSize"), new Gauge() { - public Integer value() + public Integer getValue() { return executor.maxWorkers; } @@ -98,11 +89,11 @@ public Integer value() public void release() { - Metrics.defaultRegistry().removeMetric(factory.createMetricName("ActiveTasks")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("PendingTasks")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("CompletedTasks")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("TotalBlockedTasks")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("CurrentlyBlockedTasks")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("MaxPoolSize")); + Metrics.remove(factory.createMetricName("ActiveTasks")); + Metrics.remove(factory.createMetricName("PendingTasks")); + Metrics.remove(factory.createMetricName("CompletedTasks")); + Metrics.remove(factory.createMetricName("TotalBlockedTasks")); + Metrics.remove(factory.createMetricName("CurrentlyBlockedTasks")); + Metrics.remove(factory.createMetricName("MaxPoolSize")); } } diff --git a/src/java/org/apache/cassandra/metrics/StorageMetrics.java b/src/java/org/apache/cassandra/metrics/StorageMetrics.java index 8ee90bbcc88a..12196f70e832 100644 --- a/src/java/org/apache/cassandra/metrics/StorageMetrics.java +++ b/src/java/org/apache/cassandra/metrics/StorageMetrics.java @@ -17,8 +17,9 @@ */ package org.apache.cassandra.metrics; -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.Counter; +import com.codahale.metrics.Counter; + +import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics; /** * Metrics related to Storage. @@ -27,8 +28,8 @@ public class StorageMetrics { private static final MetricNameFactory factory = new DefaultNameFactory("Storage"); - public static final Counter load = Metrics.newCounter(factory.createMetricName("Load")); - public static final Counter exceptions = Metrics.newCounter(factory.createMetricName("Exceptions")); - public static final Counter totalHintsInProgress = Metrics.newCounter(factory.createMetricName("TotalHintsInProgress")); - public static final Counter totalHints = Metrics.newCounter(factory.createMetricName("TotalHints")); + public static final Counter load = Metrics.counter(factory.createMetricName("Load")); + public static final Counter exceptions = Metrics.counter(factory.createMetricName("Exceptions")); + public static final Counter totalHintsInProgress = Metrics.counter(factory.createMetricName("TotalHintsInProgress")); + public static final Counter totalHints = Metrics.counter(factory.createMetricName("TotalHints")); } diff --git a/src/java/org/apache/cassandra/metrics/StreamingMetrics.java b/src/java/org/apache/cassandra/metrics/StreamingMetrics.java index 51b4f8c972ab..d00513c4e0a1 100644 --- a/src/java/org/apache/cassandra/metrics/StreamingMetrics.java +++ b/src/java/org/apache/cassandra/metrics/StreamingMetrics.java @@ -20,10 +20,12 @@ import java.net.InetAddress; import java.util.concurrent.ConcurrentMap; -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.Counter; + +import com.codahale.metrics.Counter; import org.cliffc.high_scale_lib.NonBlockingHashMap; +import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics; + /** * Metrics for streaming. */ @@ -33,9 +35,9 @@ public class StreamingMetrics private static final ConcurrentMap instances = new NonBlockingHashMap(); - public static final Counter activeStreamsOutbound = Metrics.newCounter(DefaultNameFactory.createMetricName(TYPE_NAME, "ActiveOutboundStreams", null)); - public static final Counter totalIncomingBytes = Metrics.newCounter(DefaultNameFactory.createMetricName(TYPE_NAME, "TotalIncomingBytes", null)); - public static final Counter totalOutgoingBytes = Metrics.newCounter(DefaultNameFactory.createMetricName(TYPE_NAME, "TotalOutgoingBytes", null)); + public static final Counter activeStreamsOutbound = Metrics.counter(DefaultNameFactory.createMetricName(TYPE_NAME, "ActiveOutboundStreams", null)); + public static final Counter totalIncomingBytes = Metrics.counter(DefaultNameFactory.createMetricName(TYPE_NAME, "TotalIncomingBytes", null)); + public static final Counter totalOutgoingBytes = Metrics.counter(DefaultNameFactory.createMetricName(TYPE_NAME, "TotalOutgoingBytes", null)); public final Counter incomingBytes; public final Counter outgoingBytes; @@ -53,7 +55,7 @@ public static StreamingMetrics get(InetAddress ip) public StreamingMetrics(final InetAddress peer) { MetricNameFactory factory = new DefaultNameFactory("Streaming", peer.getHostAddress().replaceAll(":", ".")); - incomingBytes = Metrics.newCounter(factory.createMetricName("IncomingBytes")); - outgoingBytes= Metrics.newCounter(factory.createMetricName("OutgoingBytes")); + incomingBytes = Metrics.counter(factory.createMetricName("IncomingBytes")); + outgoingBytes= Metrics.counter(factory.createMetricName("OutgoingBytes")); } } diff --git a/src/java/org/apache/cassandra/metrics/ThreadPoolMetricNameFactory.java b/src/java/org/apache/cassandra/metrics/ThreadPoolMetricNameFactory.java index 4afc4d395aea..781010872c5f 100644 --- a/src/java/org/apache/cassandra/metrics/ThreadPoolMetricNameFactory.java +++ b/src/java/org/apache/cassandra/metrics/ThreadPoolMetricNameFactory.java @@ -17,8 +17,6 @@ */ package org.apache.cassandra.metrics; -import com.yammer.metrics.core.MetricName; - class ThreadPoolMetricNameFactory implements MetricNameFactory { private final String type; @@ -32,7 +30,7 @@ class ThreadPoolMetricNameFactory implements MetricNameFactory this.poolName = poolName; } - public MetricName createMetricName(String metricName) + public CassandraMetricsRegistry.MetricName createMetricName(String metricName) { String groupName = ThreadPoolMetrics.class.getPackage().getName(); StringBuilder mbeanName = new StringBuilder(); @@ -42,6 +40,6 @@ public MetricName createMetricName(String metricName) mbeanName.append(",scope=").append(poolName); mbeanName.append(",name=").append(metricName); - return new MetricName(groupName, type, metricName, path + "." + poolName, mbeanName.toString()); + return new CassandraMetricsRegistry.MetricName(groupName, type, metricName, path + "." + poolName, mbeanName.toString()); } } diff --git a/src/java/org/apache/cassandra/metrics/ThreadPoolMetrics.java b/src/java/org/apache/cassandra/metrics/ThreadPoolMetrics.java index a5e6dafbb3cf..992e676c7f93 100644 --- a/src/java/org/apache/cassandra/metrics/ThreadPoolMetrics.java +++ b/src/java/org/apache/cassandra/metrics/ThreadPoolMetrics.java @@ -19,8 +19,16 @@ import java.util.concurrent.ThreadPoolExecutor; -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.*; +import com.codahale.metrics.Counter; +import com.codahale.metrics.Gauge; +import com.codahale.metrics.JmxReporter; + +import javax.management.JMX; +import javax.management.MBeanServerConnection; +import javax.management.ObjectName; + +import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics; + /** * Metrics for {@link ThreadPoolExecutor}. @@ -56,32 +64,32 @@ public ThreadPoolMetrics(final ThreadPoolExecutor executor, String path, String { this.factory = new ThreadPoolMetricNameFactory("ThreadPools", path, poolName); - activeTasks = Metrics.newGauge(factory.createMetricName("ActiveTasks"), new Gauge() + activeTasks = Metrics.register(factory.createMetricName("ActiveTasks"), new Gauge() { - public Integer value() + public Integer getValue() { return executor.getActiveCount(); } }); - totalBlocked = Metrics.newCounter(factory.createMetricName("TotalBlockedTasks")); - currentBlocked = Metrics.newCounter(factory.createMetricName("CurrentlyBlockedTasks")); - completedTasks = Metrics.newGauge(factory.createMetricName("CompletedTasks"), new Gauge() + totalBlocked = Metrics.counter(factory.createMetricName("TotalBlockedTasks")); + currentBlocked = Metrics.counter(factory.createMetricName("CurrentlyBlockedTasks")); + completedTasks = Metrics.register(factory.createMetricName("CompletedTasks"), new Gauge() { - public Long value() + public Long getValue() { return executor.getCompletedTaskCount(); } }); - pendingTasks = Metrics.newGauge(factory.createMetricName("PendingTasks"), new Gauge() + pendingTasks = Metrics.register(factory.createMetricName("PendingTasks"), new Gauge() { - public Long value() + public Long getValue() { return executor.getTaskCount() - executor.getCompletedTaskCount(); } }); - maxPoolSize = Metrics.newGauge(factory.createMetricName("MaxPoolSize"), new Gauge() + maxPoolSize = Metrics.register(factory.createMetricName("MaxPoolSize"), new Gauge() { - public Integer value() + public Integer getValue() { return executor.getMaximumPoolSize(); } @@ -90,11 +98,41 @@ public Integer value() public void release() { - Metrics.defaultRegistry().removeMetric(factory.createMetricName("ActiveTasks")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("PendingTasks")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("CompletedTasks")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("TotalBlockedTasks")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("CurrentlyBlockedTasks")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("MaxPoolSize")); + Metrics.remove(factory.createMetricName("ActiveTasks")); + Metrics.remove(factory.createMetricName("PendingTasks")); + Metrics.remove(factory.createMetricName("CompletedTasks")); + Metrics.remove(factory.createMetricName("TotalBlockedTasks")); + Metrics.remove(factory.createMetricName("CurrentlyBlockedTasks")); + Metrics.remove(factory.createMetricName("MaxPoolSize")); } + + + public static Object getJmxMetric(MBeanServerConnection mbeanServerConn, String jmxPath, String poolName, String metricName) + { + String name = String.format("org.apache.cassandra.metrics:type=ThreadPools,path=%s,scope=%s,name=%s", jmxPath, poolName, metricName); + + try + { + ObjectName oName = new ObjectName(name); + + switch (metricName) + { + case "ActiveTasks": + case "PendingTasks": + case "CompletedTasks": + return JMX.newMBeanProxy(mbeanServerConn, oName, JmxReporter.JmxGaugeMBean.class).getValue(); + case "TotalBlockedTasks": + case "CurrentlyBlockedTasks": + return JMX.newMBeanProxy(mbeanServerConn, oName, JmxReporter.JmxCounterMBean.class).getCount(); + default: + throw new AssertionError("Unknown metric name " + metricName); + } + + } + catch (Throwable e) + { + throw new RuntimeException("Error reading: " + name, e); + } + } + } diff --git a/src/java/org/apache/cassandra/net/MessagingService.java b/src/java/org/apache/cassandra/net/MessagingService.java index 83ca384e3d4e..b33cf8157933 100644 --- a/src/java/org/apache/cassandra/net/MessagingService.java +++ b/src/java/org/apache/cassandra/net/MessagingService.java @@ -879,7 +879,7 @@ private void logDroppedMessages() boolean logTpstats = false; for (Map.Entry entry : droppedMessages.entrySet()) { - int dropped = (int) entry.getValue().dropped.count(); + int dropped = (int) entry.getValue().dropped.getCount(); Verb verb = entry.getKey(); int recent = dropped - lastDroppedInternal.get(verb); if (recent > 0) @@ -1018,26 +1018,14 @@ public Map getDroppedMessages() { Map map = new HashMap(droppedMessages.size()); for (Map.Entry entry : droppedMessages.entrySet()) - map.put(entry.getKey().toString(), (int) entry.getValue().dropped.count()); + map.put(entry.getKey().toString(), (int) entry.getValue().dropped.getCount()); return map; } - public Map getRecentlyDroppedMessages() - { - Map map = new HashMap(droppedMessages.size()); - for (Map.Entry entry : droppedMessages.entrySet()) - map.put(entry.getKey().toString(), entry.getValue().getRecentlyDropped()); - return map; - } public long getTotalTimeouts() { - return ConnectionMetrics.totalTimeouts.count(); - } - - public long getRecentTotalTimouts() - { - return ConnectionMetrics.getRecentTotalTimeout(); + return ConnectionMetrics.totalTimeouts.getCount(); } public Map getTimeoutsPerHost() @@ -1051,16 +1039,4 @@ public Map getTimeoutsPerHost() } return result; } - - public Map getRecentTimeoutsPerHost() - { - Map result = new HashMap(connectionManagers.size()); - for (Map.Entry entry: connectionManagers.entrySet()) - { - String ip = entry.getKey().getHostAddress(); - long recent = entry.getValue().getRecentTimeouts(); - result.put(ip, recent); - } - return result; - } } diff --git a/src/java/org/apache/cassandra/net/MessagingServiceMBean.java b/src/java/org/apache/cassandra/net/MessagingServiceMBean.java index ff39e238e5f3..1d00656638a4 100644 --- a/src/java/org/apache/cassandra/net/MessagingServiceMBean.java +++ b/src/java/org/apache/cassandra/net/MessagingServiceMBean.java @@ -58,11 +58,6 @@ public interface MessagingServiceMBean */ public Map getDroppedMessages(); - /** - * dropped message counts since last called - */ - public Map getRecentlyDroppedMessages(); - /** * Total number of timeouts happened on this node */ @@ -73,15 +68,5 @@ public interface MessagingServiceMBean */ public Map getTimeoutsPerHost(); - /** - * Number of timeouts since last check. - */ - public long getRecentTotalTimouts(); - - /** - * Number of timeouts since last check per host. - */ - public Map getRecentTimeoutsPerHost(); - public int getVersion(String address) throws UnknownHostException; } diff --git a/src/java/org/apache/cassandra/net/OutboundTcpConnectionPool.java b/src/java/org/apache/cassandra/net/OutboundTcpConnectionPool.java index 66a0362baff7..6395aea3f1a2 100644 --- a/src/java/org/apache/cassandra/net/OutboundTcpConnectionPool.java +++ b/src/java/org/apache/cassandra/net/OutboundTcpConnectionPool.java @@ -101,13 +101,9 @@ public void reset(InetAddress remoteEP) public long getTimeouts() { - return metrics.timeouts.count(); + return metrics.timeouts.getCount(); } - public long getRecentTimeouts() - { - return metrics.getRecentTimeout(); - } public void incrementTimeout() { diff --git a/src/java/org/apache/cassandra/scheduler/RoundRobinScheduler.java b/src/java/org/apache/cassandra/scheduler/RoundRobinScheduler.java index 296867240a86..1a18e613c849 100644 --- a/src/java/org/apache/cassandra/scheduler/RoundRobinScheduler.java +++ b/src/java/org/apache/cassandra/scheduler/RoundRobinScheduler.java @@ -145,8 +145,6 @@ private WeightedQueue getWeightedQueue(String id) weightedQueue = queues.putIfAbsent(id, maybenew); if (weightedQueue == null) { - // created new queue: register for monitoring - maybenew.register(); return maybenew; } diff --git a/src/java/org/apache/cassandra/scheduler/WeightedQueue.java b/src/java/org/apache/cassandra/scheduler/WeightedQueue.java index 6ab5215625f6..298938d1a7ab 100644 --- a/src/java/org/apache/cassandra/scheduler/WeightedQueue.java +++ b/src/java/org/apache/cassandra/scheduler/WeightedQueue.java @@ -26,7 +26,7 @@ import org.apache.cassandra.metrics.LatencyMetrics; -class WeightedQueue implements WeightedQueueMBean +class WeightedQueue { private final LatencyMetrics metric; @@ -41,20 +41,6 @@ public WeightedQueue(String key, int weight) this.metric = new LatencyMetrics("scheduler", "WeightedQueue", key); } - public void register() - { - // expose monitoring data - MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); - try - { - mbs.registerMBean(this, new ObjectName("org.apache.cassandra.scheduler:type=WeightedQueue,queue=" + key)); - } - catch (Exception e) - { - throw new RuntimeException(e); - } - } - public void put(Thread t, long timeoutMS) throws InterruptedException, TimeoutException { if (!queue.offer(new WeightedQueue.Entry(t), timeoutMS, TimeUnit.MILLISECONDS)) @@ -85,31 +71,4 @@ public Entry(Thread thread) this.thread = thread; } } - - /** MBean related methods */ - - public long getOperations() - { - return metric.latency.count(); - } - - public long getTotalLatencyMicros() - { - return metric.totalLatency.count(); - } - - public double getRecentLatencyMicros() - { - return metric.getRecentLatency(); - } - - public long[] getTotalLatencyHistogramMicros() - { - return metric.totalLatencyHistogram.getBuckets(false); - } - - public long[] getRecentLatencyHistogramMicros() - { - return metric.recentLatencyHistogram.getBuckets(true); - } } diff --git a/src/java/org/apache/cassandra/scheduler/WeightedQueueMBean.java b/src/java/org/apache/cassandra/scheduler/WeightedQueueMBean.java deleted file mode 100644 index d16d00735bc6..000000000000 --- a/src/java/org/apache/cassandra/scheduler/WeightedQueueMBean.java +++ /dev/null @@ -1,32 +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.scheduler; - -/** - * Exposes client request scheduling metrics for a particular scheduler queue. - * @see org.apache.cassandra.metrics.LatencyMetrics - */ -@Deprecated -public interface WeightedQueueMBean -{ - public long getOperations(); - public long getTotalLatencyMicros(); - public double getRecentLatencyMicros(); - public long[] getTotalLatencyHistogramMicros(); - public long[] getRecentLatencyHistogramMicros(); -} diff --git a/src/java/org/apache/cassandra/service/CacheService.java b/src/java/org/apache/cassandra/service/CacheService.java index fb8153c2f540..e9f853c9efac 100644 --- a/src/java/org/apache/cassandra/service/CacheService.java +++ b/src/java/org/apache/cassandra/service/CacheService.java @@ -180,35 +180,6 @@ private AutoSavingCache initCounterCache() return cache; } - public long getKeyCacheHits() - { - return keyCache.getMetrics().hits.count(); - } - - public long getRowCacheHits() - { - return rowCache.getMetrics().hits.count(); - } - - public long getKeyCacheRequests() - { - return keyCache.getMetrics().requests.count(); - } - - public long getRowCacheRequests() - { - return rowCache.getMetrics().requests.count(); - } - - public double getKeyCacheRecentHitRate() - { - return keyCache.getMetrics().getRecentHitRate(); - } - - public double getRowCacheRecentHitRate() - { - return rowCache.getMetrics().getRecentHitRate(); - } public int getRowCacheSavePeriodInSeconds() { @@ -339,15 +310,8 @@ public void invalidateCounterCache() counterCache.clear(); } - public long getRowCacheCapacityInBytes() - { - return rowCache.getMetrics().capacity.value(); - } - public long getRowCacheCapacityInMB() - { - return getRowCacheCapacityInBytes() / 1024 / 1024; - } + public void setRowCacheCapacityInMB(long capacity) { @@ -357,15 +321,6 @@ public void setRowCacheCapacityInMB(long capacity) rowCache.setCapacity(capacity * 1024 * 1024); } - public long getKeyCacheCapacityInBytes() - { - return keyCache.getMetrics().capacity.value(); - } - - public long getKeyCacheCapacityInMB() - { - return getKeyCacheCapacityInBytes() / 1024 / 1024; - } public void setKeyCacheCapacityInMB(long capacity) { @@ -383,26 +338,6 @@ public void setCounterCacheCapacityInMB(long capacity) counterCache.setCapacity(capacity * 1024 * 1024); } - public long getRowCacheSize() - { - return rowCache.getMetrics().size.value(); - } - - public long getRowCacheEntries() - { - return rowCache.size(); - } - - public long getKeyCacheSize() - { - return keyCache.getMetrics().size.value(); - } - - public long getKeyCacheEntries() - { - return keyCache.size(); - } - public void saveCaches() throws ExecutionException, InterruptedException { List> futures = new ArrayList<>(3); diff --git a/src/java/org/apache/cassandra/service/CacheServiceMBean.java b/src/java/org/apache/cassandra/service/CacheServiceMBean.java index 28e9d3b95836..8ac0694e8556 100644 --- a/src/java/org/apache/cassandra/service/CacheServiceMBean.java +++ b/src/java/org/apache/cassandra/service/CacheServiceMBean.java @@ -64,90 +64,4 @@ public interface CacheServiceMBean * @throws InterruptedException when a thread is waiting, sleeping, or otherwise occupied, and the thread is interrupted, either before or during the activity. */ public void saveCaches() throws ExecutionException, InterruptedException; - - // - // remaining methods are provided for backwards compatibility; modern clients should use CacheMetrics instead - // - - /** - * @see org.apache.cassandra.metrics.CacheMetrics#hits - */ - @Deprecated - public long getKeyCacheHits(); - - /** - * @see org.apache.cassandra.metrics.CacheMetrics#hits - */ - @Deprecated - public long getRowCacheHits(); - - /** - * @see org.apache.cassandra.metrics.CacheMetrics#requests - */ - @Deprecated - public long getKeyCacheRequests(); - - /** - * @see org.apache.cassandra.metrics.CacheMetrics#requests - */ - @Deprecated - public long getRowCacheRequests(); - - /** - * @see org.apache.cassandra.metrics.CacheMetrics#hitRate - */ - @Deprecated - public double getKeyCacheRecentHitRate(); - - /** - * @see org.apache.cassandra.metrics.CacheMetrics#hitRate - */ - @Deprecated - public double getRowCacheRecentHitRate(); - - /** - * @see org.apache.cassandra.metrics.CacheMetrics#capacity - */ - @Deprecated - public long getRowCacheCapacityInMB(); - /** - * @see org.apache.cassandra.metrics.CacheMetrics#capacity - */ - @Deprecated - public long getRowCacheCapacityInBytes(); - - /** - * @see org.apache.cassandra.metrics.CacheMetrics#capacity - */ - @Deprecated - public long getKeyCacheCapacityInMB(); - /** - * @see org.apache.cassandra.metrics.CacheMetrics#capacity - */ - @Deprecated - public long getKeyCacheCapacityInBytes(); - - /** - * @see org.apache.cassandra.metrics.CacheMetrics#size - */ - @Deprecated - public long getRowCacheSize(); - - /** - * @see org.apache.cassandra.metrics.CacheMetrics#entries - */ - @Deprecated - public long getRowCacheEntries(); - - /** - * @see org.apache.cassandra.metrics.CacheMetrics#size - */ - @Deprecated - public long getKeyCacheSize(); - - /** - * @see org.apache.cassandra.metrics.CacheMetrics#entries - */ - @Deprecated - public long getKeyCacheEntries(); } diff --git a/src/java/org/apache/cassandra/service/CassandraDaemon.java b/src/java/org/apache/cassandra/service/CassandraDaemon.java index 9a6c7d760bfe..0cfa1713e38d 100644 --- a/src/java/org/apache/cassandra/service/CassandraDaemon.java +++ b/src/java/org/apache/cassandra/service/CassandraDaemon.java @@ -58,6 +58,7 @@ import org.apache.cassandra.io.FSError; import org.apache.cassandra.io.sstable.CorruptSSTableException; import org.apache.cassandra.io.util.FileUtils; +import org.apache.cassandra.metrics.CassandraMetricsRegistry; import org.apache.cassandra.metrics.StorageMetrics; import org.apache.cassandra.thrift.ThriftServer; import org.apache.cassandra.tracing.Tracing; @@ -558,9 +559,9 @@ private void waitForGossipToSettle() while (numOkay < GOSSIP_SETTLE_POLL_SUCCESSES_REQUIRED) { Uninterruptibles.sleepUninterruptibly(GOSSIP_SETTLE_POLL_INTERVAL_MS, TimeUnit.MILLISECONDS); - long completed = gossipStage.getCompletedTasks(); - long active = gossipStage.getActiveCount(); - long pending = gossipStage.getPendingTasks(); + long completed = gossipStage.metrics.completedTasks.getValue(); + long active = gossipStage.metrics.activeTasks.getValue(); + long pending = gossipStage.metrics.pendingTasks.getValue(); totalPolls++; if (active == 0 && pending == 0) { diff --git a/src/java/org/apache/cassandra/service/LoadBroadcaster.java b/src/java/org/apache/cassandra/service/LoadBroadcaster.java index d12ffba8d91f..238daae3312f 100644 --- a/src/java/org/apache/cassandra/service/LoadBroadcaster.java +++ b/src/java/org/apache/cassandra/service/LoadBroadcaster.java @@ -23,6 +23,7 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.TimeUnit; +import org.apache.cassandra.metrics.StorageMetrics; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -89,7 +90,7 @@ public void run() if (logger.isDebugEnabled()) logger.debug("Disseminating load info ..."); Gossiper.instance.addLocalApplicationState(ApplicationState.LOAD, - StorageService.instance.valueFactory.load(StorageService.instance.getLoad())); + StorageService.instance.valueFactory.load(StorageMetrics.load.getCount())); } }; ScheduledExecutors.scheduledTasks.scheduleWithFixedDelay(runnable, 2 * Gossiper.intervalInMillis, BROADCAST_INTERVAL, TimeUnit.MILLISECONDS); diff --git a/src/java/org/apache/cassandra/service/StorageProxy.java b/src/java/org/apache/cassandra/service/StorageProxy.java index cf9990b635dc..f74e6017a10b 100644 --- a/src/java/org/apache/cassandra/service/StorageProxy.java +++ b/src/java/org/apache/cassandra/service/StorageProxy.java @@ -568,7 +568,6 @@ public static void mutate(Collection mutations, Consistency else { writeMetrics.timeouts.mark(); - ClientRequestMetrics.writeTimeouts.inc(); Tracing.trace("Write timeout; received {} of {} required replies", ex.received, ex.blockFor); throw ex; } @@ -576,13 +575,12 @@ public static void mutate(Collection mutations, Consistency catch (UnavailableException e) { writeMetrics.unavailables.mark(); - ClientRequestMetrics.writeUnavailables.inc(); Tracing.trace("Unavailable"); throw e; } catch (OverloadedException e) { - ClientRequestMetrics.writeUnavailables.inc(); + writeMetrics.unavailables.mark(); Tracing.trace("Overloaded"); throw e; } @@ -651,14 +649,12 @@ public static void mutateAtomically(Collection mutations, ConsistencyL catch (UnavailableException e) { writeMetrics.unavailables.mark(); - ClientRequestMetrics.writeUnavailables.inc(); Tracing.trace("Unavailable"); throw e; } catch (WriteTimeoutException e) { writeMetrics.timeouts.mark(); - ClientRequestMetrics.writeTimeouts.inc(); Tracing.trace("Write timeout; received {} of {} required replies", e.received, e.blockFor); throw e; } @@ -864,10 +860,10 @@ public static void sendToHintedEndpoints(final Mutation mutation, // The idea is that if we have over maxHintsInProgress hints in flight, this is probably due to // a small number of nodes causing problems, so we should avoid shutting down writes completely to // healthy nodes. Any node with no hintsInProgress is considered healthy. - if (StorageMetrics.totalHintsInProgress.count() > maxHintsInProgress + if (StorageMetrics.totalHintsInProgress.getCount() > maxHintsInProgress && (getHintsInProgressFor(destination).get() > 0 && shouldHint(destination))) { - throw new OverloadedException("Too many in flight hints: " + StorageMetrics.totalHintsInProgress.count()); + throw new OverloadedException("Too many in flight hints: " + StorageMetrics.totalHintsInProgress.getCount()); } if (FailureDetector.instance.isAlive(destination)) @@ -1184,7 +1180,6 @@ public static List read(List commands, ConsistencyLevel consis if (StorageService.instance.isBootstrapMode() && !systemKeyspaceQuery(commands)) { readMetrics.unavailables.mark(); - ClientRequestMetrics.readUnavailables.inc(); throw new IsBootstrappingException(); } @@ -1233,21 +1228,18 @@ private static List readWithPaxos(List commands, ConsistencyLe catch (UnavailableException e) { readMetrics.unavailables.mark(); - ClientRequestMetrics.readUnavailables.inc(); casReadMetrics.unavailables.mark(); throw e; } catch (ReadTimeoutException e) { readMetrics.timeouts.mark(); - ClientRequestMetrics.readTimeouts.inc(); casReadMetrics.timeouts.mark(); throw e; } catch (ReadFailureException e) { readMetrics.failures.mark(); - ClientRequestMetrics.readFailures.inc(); casReadMetrics.failures.mark(); throw e; } @@ -1277,19 +1269,16 @@ private static List readRegular(List commands, ConsistencyLeve catch (UnavailableException e) { readMetrics.unavailables.mark(); - ClientRequestMetrics.readUnavailables.inc(); throw e; } catch (ReadTimeoutException e) { readMetrics.timeouts.mark(); - ClientRequestMetrics.readTimeouts.inc(); throw e; } catch (ReadFailureException e) { readMetrics.failures.mark(); - ClientRequestMetrics.readFailures.inc(); throw e; } finally @@ -1989,81 +1978,6 @@ static > List> getRestrictedRanges(f return ranges; } - public long getReadOperations() - { - return readMetrics.latency.count(); - } - - public long getTotalReadLatencyMicros() - { - return readMetrics.totalLatency.count(); - } - - public double getRecentReadLatencyMicros() - { - return readMetrics.getRecentLatency(); - } - - public long[] getTotalReadLatencyHistogramMicros() - { - return readMetrics.totalLatencyHistogram.getBuckets(false); - } - - public long[] getRecentReadLatencyHistogramMicros() - { - return readMetrics.recentLatencyHistogram.getBuckets(true); - } - - public long getRangeOperations() - { - return rangeMetrics.latency.count(); - } - - public long getTotalRangeLatencyMicros() - { - return rangeMetrics.totalLatency.count(); - } - - public double getRecentRangeLatencyMicros() - { - return rangeMetrics.getRecentLatency(); - } - - public long[] getTotalRangeLatencyHistogramMicros() - { - return rangeMetrics.totalLatencyHistogram.getBuckets(false); - } - - public long[] getRecentRangeLatencyHistogramMicros() - { - return rangeMetrics.recentLatencyHistogram.getBuckets(true); - } - - public long getWriteOperations() - { - return writeMetrics.latency.count(); - } - - public long getTotalWriteLatencyMicros() - { - return writeMetrics.totalLatency.count(); - } - - public double getRecentWriteLatencyMicros() - { - return writeMetrics.getRecentLatency(); - } - - public long[] getTotalWriteLatencyHistogramMicros() - { - return writeMetrics.totalLatencyHistogram.getBuckets(false); - } - - public long[] getRecentWriteLatencyHistogramMicros() - { - return writeMetrics.recentLatencyHistogram.getBuckets(true); - } - public boolean getHintedHandoffEnabled() { return DatabaseDescriptor.hintedHandoffEnabled(); @@ -2291,7 +2205,7 @@ public void run() public long getTotalHints() { - return StorageMetrics.totalHints.count(); + return StorageMetrics.totalHints.getCount(); } public int getMaxHintsInProgress() @@ -2306,7 +2220,7 @@ public void setMaxHintsInProgress(int qs) public int getHintsInProgress() { - return (int) StorageMetrics.totalHintsInProgress.count(); + return (int) StorageMetrics.totalHintsInProgress.getCount(); } public void verifyNoHintsInProgress() @@ -2339,14 +2253,14 @@ public void verifyNoHintsInProgress() public long getReadRepairAttempted() { - return ReadRepairMetrics.attempted.count(); + return ReadRepairMetrics.attempted.getCount(); } public long getReadRepairRepairedBlocking() { - return ReadRepairMetrics.repairedBlocking.count(); + return ReadRepairMetrics.repairedBlocking.getCount(); } public long getReadRepairRepairedBackground() { - return ReadRepairMetrics.repairedBackground.count(); + return ReadRepairMetrics.repairedBackground.getCount(); } } diff --git a/src/java/org/apache/cassandra/service/StorageProxyMBean.java b/src/java/org/apache/cassandra/service/StorageProxyMBean.java index a04b66054995..55627be656d5 100644 --- a/src/java/org/apache/cassandra/service/StorageProxyMBean.java +++ b/src/java/org/apache/cassandra/service/StorageProxyMBean.java @@ -23,54 +23,6 @@ public interface StorageProxyMBean { - /** - * @see org.apache.cassandra.metrics.LatencyMetrics#lastOpCount - */ - @Deprecated - public long getReadOperations(); - /** - * @see org.apache.cassandra.metrics.LatencyMetrics#totalLatencyHistogram - */ - @Deprecated - public long getTotalReadLatencyMicros(); - /** - * @see org.apache.cassandra.metrics.LatencyMetrics#recentLatencyHistogram - */ - @Deprecated - public double getRecentReadLatencyMicros(); - /** - * @see org.apache.cassandra.metrics.LatencyMetrics#totalLatencyHistogram - */ - @Deprecated - public long[] getTotalReadLatencyHistogramMicros(); - /** - * @see org.apache.cassandra.metrics.LatencyMetrics#recentLatencyHistogram - */ - @Deprecated - public long[] getRecentReadLatencyHistogramMicros(); - - @Deprecated - public long getRangeOperations(); - @Deprecated - public long getTotalRangeLatencyMicros(); - @Deprecated - public double getRecentRangeLatencyMicros(); - @Deprecated - public long[] getTotalRangeLatencyHistogramMicros(); - @Deprecated - public long[] getRecentRangeLatencyHistogramMicros(); - - @Deprecated - public long getWriteOperations(); - @Deprecated - public long getTotalWriteLatencyMicros(); - @Deprecated - public double getRecentWriteLatencyMicros(); - @Deprecated - public long[] getTotalWriteLatencyHistogramMicros(); - @Deprecated - public long[] getRecentWriteLatencyHistogramMicros(); - public long getTotalHints(); public boolean getHintedHandoffEnabled(); public Set getHintedHandoffEnabledByDC(); diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index bb3e88294c3d..61bd938ee68d 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -2009,24 +2009,10 @@ public void onRestart(InetAddress endpoint, EndpointState state) onDead(endpoint, state); } - /** raw load value */ - public double getLoad() - { - double bytes = 0; - for (String keyspaceName : Schema.instance.getKeyspaces()) - { - Keyspace keyspace = Schema.instance.getKeyspaceInstance(keyspaceName); - if (keyspace == null) - continue; - for (ColumnFamilyStore cfs : keyspace.getColumnFamilyStores()) - bytes += cfs.getLiveDiskSpaceUsed(); - } - return bytes; - } public String getLoadString() { - return FileUtils.stringifyFileSize(getLoad()); + return FileUtils.stringifyFileSize(StorageMetrics.load.getCount()); } public Map getLoadMap() @@ -4113,11 +4099,6 @@ public CFMetaData getCFMetaData(String keyspace, String cfName) return loader.stream(); } - public int getExceptionCount() - { - return (int)StorageMetrics.exceptions.count(); - } - public void rescheduleFailedDeletions() { SSTableDeletingTask.rescheduleFailedTasks(); diff --git a/src/java/org/apache/cassandra/service/StorageServiceMBean.java b/src/java/org/apache/cassandra/service/StorageServiceMBean.java index 007ef31d2168..06ab56a8e1ad 100644 --- a/src/java/org/apache/cassandra/service/StorageServiceMBean.java +++ b/src/java/org/apache/cassandra/service/StorageServiceMBean.java @@ -161,13 +161,6 @@ public interface StorageServiceMBean extends NotificationEmitter /** Retrieve the mapping of endpoint to host ID */ public Map getHostIdMap(); - /** - * Numeric load value. - * @see org.apache.cassandra.metrics.StorageMetrics#load - */ - @Deprecated - public double getLoad(); - /** Human-readable load value */ public String getLoadString(); @@ -441,9 +434,6 @@ public interface StorageServiceMBean extends NotificationEmitter public void joinRing() throws IOException; public boolean isJoined(); - @Deprecated - public int getExceptionCount(); - public void setStreamThroughputMbPerSec(int value); public int getStreamThroughputMbPerSec(); diff --git a/src/java/org/apache/cassandra/thrift/CassandraServer.java b/src/java/org/apache/cassandra/thrift/CassandraServer.java index c0de59f31191..6546932d5af5 100644 --- a/src/java/org/apache/cassandra/thrift/CassandraServer.java +++ b/src/java/org/apache/cassandra/thrift/CassandraServer.java @@ -538,7 +538,7 @@ public int get_count(ByteBuffer key, ColumnParent column_parent, SlicePredicate // request by page if this is a large row if (cfs.getMeanColumns() > 0) { - int averageColumnSize = (int) (cfs.getMeanRowSize() / cfs.getMeanColumns()); + int averageColumnSize = (int) (cfs.metric.meanRowSize.getValue() / cfs.getMeanColumns()); pageSize = Math.min(COUNT_PAGE_SIZE, 4 * 1024 * 1024 / averageColumnSize); pageSize = Math.max(2, pageSize); logger.debug("average row column size is {}; using pageSize of {}", averageColumnSize, pageSize); diff --git a/src/java/org/apache/cassandra/tools/NodeProbe.java b/src/java/org/apache/cassandra/tools/NodeProbe.java index 8aa5992051ad..9e8945fe499b 100644 --- a/src/java/org/apache/cassandra/tools/NodeProbe.java +++ b/src/java/org/apache/cassandra/tools/NodeProbe.java @@ -27,7 +27,10 @@ import java.net.UnknownHostException; import java.util.*; import java.util.Map.Entry; -import java.util.concurrent.*; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + import javax.management.*; import javax.management.openmbean.CompositeData; import javax.management.remote.JMXConnector; @@ -39,8 +42,7 @@ import com.google.common.collect.*; import com.google.common.util.concurrent.Uninterruptibles; -import com.yammer.metrics.reporting.JmxReporter; -import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutorMBean; +import org.apache.cassandra.concurrent.Stage; import org.apache.cassandra.db.ColumnFamilyStoreMBean; import org.apache.cassandra.db.HintedHandOffManager; import org.apache.cassandra.db.HintedHandOffManagerMBean; @@ -51,7 +53,9 @@ import org.apache.cassandra.gms.Gossiper; import org.apache.cassandra.gms.GossiperMBean; import org.apache.cassandra.locator.EndpointSnitchInfoMBean; -import org.apache.cassandra.metrics.ColumnFamilyMetrics.Sampler; +import org.apache.cassandra.metrics.CassandraMetricsRegistry; +import org.apache.cassandra.metrics.StorageMetrics; +import org.apache.cassandra.metrics.ThreadPoolMetrics; import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.net.MessagingServiceMBean; import org.apache.cassandra.service.*; @@ -59,6 +63,8 @@ import org.apache.cassandra.streaming.StreamManagerMBean; import org.apache.cassandra.streaming.management.StreamStateCompositeData; +import org.apache.cassandra.metrics.ColumnFamilyMetrics.Sampler; + /** * JMX client operations for Cassandra. */ @@ -525,22 +531,6 @@ public void assassinateEndpoint(String address) throws UnknownHostException gossProxy.assassinateEndpoint(address); } - public Iterator> getThreadPoolMBeanProxies() - { - try - { - return new ThreadPoolProxyMBeanIterator(mbeanServerConn); - } - catch (MalformedObjectNameException e) - { - throw new RuntimeException("Invalid ObjectName? Please report this as a bug.", e); - } - catch (IOException e) - { - throw new RuntimeException("Could not retrieve list of stat mbeans.", e); - } - } - /** * Set the compaction threshold * @@ -879,7 +869,7 @@ public int getStreamThroughput() public int getExceptionCount() { - return ssProxy.getExceptionCount(); + return (int)StorageMetrics.exceptions.getCount(); } public Map getDroppedMessages() @@ -980,12 +970,12 @@ public Object getCacheMetric(String cacheType, String metricName) case "Size": return JMX.newMBeanProxy(mbeanServerConn, new ObjectName("org.apache.cassandra.metrics:type=Cache,scope=" + cacheType + ",name=" + metricName), - JmxReporter.GaugeMBean.class).getValue(); + CassandraMetricsRegistry.JmxGaugeMBean.class).getValue(); case "Requests": case "Hits": return JMX.newMBeanProxy(mbeanServerConn, new ObjectName("org.apache.cassandra.metrics:type=Cache,scope=" + cacheType + ",name=" + metricName), - JmxReporter.MeterMBean.class).getCount(); + CassandraMetricsRegistry.JmxMeterMBean.class).getCount(); default: throw new RuntimeException("Unknown cache metric name."); @@ -997,6 +987,11 @@ public Object getCacheMetric(String cacheType, String metricName) } } + public Object getThreadPoolMetric(Stage stage, String metricName) + { + return ThreadPoolMetrics.getJmxMetric(mbeanServerConn, stage.getJmxType(), stage.getJmxName(), metricName); + } + /** * Retrieve ColumnFamily metrics * @param ks Keyspace for which stats are to be displayed. @@ -1031,7 +1026,7 @@ public Object getColumnFamilyMetric(String ks, String cf, String metricName) case "RecentBloomFilterFalsePositives": case "RecentBloomFilterFalseRatio": case "SnapshotsSize": - return JMX.newMBeanProxy(mbeanServerConn, oName, JmxReporter.GaugeMBean.class).getValue(); + return JMX.newMBeanProxy(mbeanServerConn, oName, CassandraMetricsRegistry.JmxGaugeMBean.class).getValue(); case "LiveDiskSpaceUsed": case "MemtableSwitchCount": case "SpeculativeRetries": @@ -1039,16 +1034,16 @@ public Object getColumnFamilyMetric(String ks, String cf, String metricName) case "WriteTotalLatency": case "ReadTotalLatency": case "PendingFlushes": - return JMX.newMBeanProxy(mbeanServerConn, oName, JmxReporter.CounterMBean.class).getCount(); - case "ReadLatency": + return JMX.newMBeanProxy(mbeanServerConn, oName, CassandraMetricsRegistry.JmxCounterMBean.class).getCount(); case "CoordinatorReadLatency": case "CoordinatorScanLatency": + case "ReadLatency": case "WriteLatency": - return JMX.newMBeanProxy(mbeanServerConn, oName, JmxReporter.TimerMBean.class); + return JMX.newMBeanProxy(mbeanServerConn, oName, CassandraMetricsRegistry.JmxTimerMBean.class); case "LiveScannedHistogram": case "SSTablesPerReadHistogram": case "TombstoneScannedHistogram": - return JMX.newMBeanProxy(mbeanServerConn, oName, JmxReporter.HistogramMBean.class); + return JMX.newMBeanProxy(mbeanServerConn, oName, CassandraMetricsRegistry.JmxHistogramMBean.class); default: throw new RuntimeException("Unknown table metric."); } @@ -1063,13 +1058,13 @@ public Object getColumnFamilyMetric(String ks, String cf, String metricName) * Retrieve Proxy metrics * @param scope RangeSlice, Read or Write */ - public JmxReporter.TimerMBean getProxyMetric(String scope) + public CassandraMetricsRegistry.JmxTimerMBean getProxyMetric(String scope) { try { return JMX.newMBeanProxy(mbeanServerConn, new ObjectName("org.apache.cassandra.metrics:type=ClientRequest,scope=" + scope + ",name=Latency"), - JmxReporter.TimerMBean.class); + CassandraMetricsRegistry.JmxTimerMBean.class); } catch (MalformedObjectNameException e) { @@ -1090,16 +1085,16 @@ public Object getCompactionMetric(String metricName) case "BytesCompacted": return JMX.newMBeanProxy(mbeanServerConn, new ObjectName("org.apache.cassandra.metrics:type=Compaction,name=" + metricName), - JmxReporter.CounterMBean.class); + CassandraMetricsRegistry.JmxCounterMBean.class); case "CompletedTasks": case "PendingTasks": return JMX.newMBeanProxy(mbeanServerConn, new ObjectName("org.apache.cassandra.metrics:type=Compaction,name=" + metricName), - JmxReporter.GaugeMBean.class).getValue(); + CassandraMetricsRegistry.JmxGaugeMBean.class).getValue(); case "TotalCompactionsCompleted": return JMX.newMBeanProxy(mbeanServerConn, new ObjectName("org.apache.cassandra.metrics:type=Compaction,name=" + metricName), - JmxReporter.MeterMBean.class); + CassandraMetricsRegistry.JmxMeterMBean.class); default: throw new RuntimeException("Unknown compaction metric."); } @@ -1120,7 +1115,7 @@ public long getStorageMetric(String metricName) { return JMX.newMBeanProxy(mbeanServerConn, new ObjectName("org.apache.cassandra.metrics:type=Storage,name=" + metricName), - JmxReporter.CounterMBean.class).getCount(); + CassandraMetricsRegistry.JmxCounterMBean.class).getCount(); } catch (MalformedObjectNameException e) { @@ -1128,7 +1123,18 @@ public long getStorageMetric(String metricName) } } - public double[] metricPercentilesAsArray(JmxReporter.HistogramMBean metric) + public double[] metricPercentilesAsArray(CassandraMetricsRegistry.JmxHistogramMBean metric) + { + return new double[]{ metric.get50thPercentile(), + metric.get75thPercentile(), + metric.get95thPercentile(), + metric.get98thPercentile(), + metric.get99thPercentile(), + metric.getMin(), + metric.getMax()}; + } + + public double[] metricPercentilesAsArray(CassandraMetricsRegistry.JmxTimerMBean metric) { return new double[]{ metric.get50thPercentile(), metric.get75thPercentile(), @@ -1242,36 +1248,3 @@ public void remove() throw new UnsupportedOperationException(); } } - -class ThreadPoolProxyMBeanIterator implements Iterator> -{ - private final Iterator resIter; - private final MBeanServerConnection mbeanServerConn; - - public ThreadPoolProxyMBeanIterator(MBeanServerConnection mbeanServerConn) - throws MalformedObjectNameException, NullPointerException, IOException - { - Set requests = mbeanServerConn.queryNames(new ObjectName("org.apache.cassandra.request:type=*"), null); - Set internal = mbeanServerConn.queryNames(new ObjectName("org.apache.cassandra.internal:type=*"), null); - resIter = Iterables.concat(requests, internal).iterator(); - this.mbeanServerConn = mbeanServerConn; - } - - public boolean hasNext() - { - return resIter.hasNext(); - } - - public Map.Entry next() - { - ObjectName objectName = resIter.next(); - String poolName = objectName.getKeyProperty("type"); - JMXEnabledThreadPoolExecutorMBean threadPoolProxy = JMX.newMBeanProxy(mbeanServerConn, objectName, JMXEnabledThreadPoolExecutorMBean.class); - return new AbstractMap.SimpleImmutableEntry(poolName, threadPoolProxy); - } - - public void remove() - { - throw new UnsupportedOperationException(); - } -} diff --git a/src/java/org/apache/cassandra/tools/NodeTool.java b/src/java/org/apache/cassandra/tools/NodeTool.java index 18feac7b20b0..e99fd153176e 100644 --- a/src/java/org/apache/cassandra/tools/NodeTool.java +++ b/src/java/org/apache/cassandra/tools/NodeTool.java @@ -31,24 +31,22 @@ import com.google.common.base.Joiner; import com.google.common.base.Throwables; - import com.google.common.collect.*; -import com.yammer.metrics.reporting.JmxReporter; - import io.airlift.command.*; + +import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutorMBean; +import org.apache.cassandra.concurrent.Stage; import org.apache.cassandra.db.ColumnFamilyStoreMBean; import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.db.compaction.CompactionManagerMBean; import org.apache.cassandra.db.compaction.OperationType; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.locator.EndpointSnitchInfoMBean; - -import org.apache.cassandra.metrics.ColumnFamilyMetrics.Sampler; - +import org.apache.cassandra.metrics.CassandraMetricsRegistry; +import org.apache.cassandra.metrics.ColumnFamilyMetrics; import org.apache.cassandra.net.MessagingServiceMBean; import org.apache.cassandra.repair.messages.RepairOption; import org.apache.cassandra.repair.RepairParallelism; @@ -60,7 +58,7 @@ import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.JVMStabilityInspector; -import org.apache.commons.lang3.ArrayUtils; +import static org.apache.cassandra.metrics.ColumnFamilyMetrics.Sampler; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; import static com.google.common.base.Throwables.getStackTraceAsString; @@ -739,8 +737,8 @@ public void execute(NodeProbe probe) for (ColumnFamilyStoreMBean cfstore : columnFamilies) { String cfName = cfstore.getColumnFamilyName(); - long writeCount = ((JmxReporter.TimerMBean) probe.getColumnFamilyMetric(keyspaceName, cfName, "WriteLatency")).getCount(); - long readCount = ((JmxReporter.TimerMBean) probe.getColumnFamilyMetric(keyspaceName, cfName, "ReadLatency")).getCount(); + long writeCount = ((CassandraMetricsRegistry.JmxTimerMBean) probe.getColumnFamilyMetric(keyspaceName, cfName, "WriteLatency")).getCount(); + long readCount = ((CassandraMetricsRegistry.JmxTimerMBean) probe.getColumnFamilyMetric(keyspaceName, cfName, "ReadLatency")).getCount(); if (readCount > 0) { @@ -821,12 +819,12 @@ public void execute(NodeProbe probe) System.out.println("\t\tMemtable data size: " + format((Long) probe.getColumnFamilyMetric(keyspaceName, cfName, "MemtableLiveDataSize"), humanReadable)); System.out.println("\t\tMemtable off heap memory used: " + format(memtableOffHeapSize, humanReadable)); System.out.println("\t\tMemtable switch count: " + probe.getColumnFamilyMetric(keyspaceName, cfName, "MemtableSwitchCount")); - System.out.println("\t\tLocal read count: " + ((JmxReporter.TimerMBean) probe.getColumnFamilyMetric(keyspaceName, cfName, "ReadLatency")).getCount()); - double localReadLatency = ((JmxReporter.TimerMBean) probe.getColumnFamilyMetric(keyspaceName, cfName, "ReadLatency")).getMean() / 1000; + System.out.println("\t\tLocal read count: " + ((CassandraMetricsRegistry.JmxTimerMBean) probe.getColumnFamilyMetric(keyspaceName, cfName, "ReadLatency")).getCount()); + double localReadLatency = ((CassandraMetricsRegistry.JmxTimerMBean) probe.getColumnFamilyMetric(keyspaceName, cfName, "ReadLatency")).getMean() / 1000; double localRLatency = localReadLatency > 0 ? localReadLatency : Double.NaN; System.out.printf("\t\tLocal read latency: %01.3f ms%n", localRLatency); - System.out.println("\t\tLocal write count: " + ((JmxReporter.TimerMBean) probe.getColumnFamilyMetric(keyspaceName, cfName, "WriteLatency")).getCount()); - double localWriteLatency = ((JmxReporter.TimerMBean) probe.getColumnFamilyMetric(keyspaceName, cfName, "WriteLatency")).getMean() / 1000; + System.out.println("\t\tLocal write count: " + ((CassandraMetricsRegistry.JmxTimerMBean) probe.getColumnFamilyMetric(keyspaceName, cfName, "WriteLatency")).getCount()); + double localWriteLatency = ((CassandraMetricsRegistry.JmxTimerMBean) probe.getColumnFamilyMetric(keyspaceName, cfName, "WriteLatency")).getMean() / 1000; double localWLatency = localWriteLatency > 0 ? localWriteLatency : Double.NaN; System.out.printf("\t\tLocal write latency: %01.3f ms%n", localWLatency); System.out.println("\t\tPending flushes: " + probe.getColumnFamilyMetric(keyspaceName, cfName, "PendingFlushes")); @@ -840,10 +838,10 @@ public void execute(NodeProbe probe) System.out.println("\t\tCompacted partition minimum bytes: " + format((Long) probe.getColumnFamilyMetric(keyspaceName, cfName, "MinRowSize"), humanReadable)); System.out.println("\t\tCompacted partition maximum bytes: " + format((Long) probe.getColumnFamilyMetric(keyspaceName, cfName, "MaxRowSize"), humanReadable)); System.out.println("\t\tCompacted partition mean bytes: " + format((Long) probe.getColumnFamilyMetric(keyspaceName, cfName, "MeanRowSize"), humanReadable)); - JmxReporter.HistogramMBean histogram = (JmxReporter.HistogramMBean) probe.getColumnFamilyMetric(keyspaceName, cfName, "LiveScannedHistogram"); + CassandraMetricsRegistry.JmxHistogramMBean histogram = (CassandraMetricsRegistry.JmxHistogramMBean) probe.getColumnFamilyMetric(keyspaceName, cfName, "LiveScannedHistogram"); System.out.println("\t\tAverage live cells per slice (last five minutes): " + histogram.getMean()); System.out.println("\t\tMaximum live cells per slice (last five minutes): " + histogram.getMax()); - histogram = (JmxReporter.HistogramMBean) probe.getColumnFamilyMetric(keyspaceName, cfName, "TombstoneScannedHistogram"); + histogram = (CassandraMetricsRegistry.JmxHistogramMBean) probe.getColumnFamilyMetric(keyspaceName, cfName, "TombstoneScannedHistogram"); System.out.println("\t\tAverage tombstones per slice (last five minutes): " + histogram.getMean()); System.out.println("\t\tMaximum tombstones per slice (last five minutes): " + histogram.getMax()); @@ -945,7 +943,7 @@ public static class TopPartitions extends NodeToolCmd @Option(name = "-k", description = "Number of the top partitions to list (Default: 10)") private int topCount = 10; @Option(name = "-a", description = "Comma separated list of samplers to use (Default: all)") - private String samplers = join(Sampler.values(), ','); + private String samplers = join(ColumnFamilyMetrics.Sampler.values(), ','); @Override public void execute(NodeProbe probe) { @@ -1083,9 +1081,9 @@ public void execute(NodeProbe probe) } String[] percentiles = new String[]{"50%", "75%", "95%", "98%", "99%", "Min", "Max"}; - double[] readLatency = probe.metricPercentilesAsArray((JmxReporter.HistogramMBean) probe.getColumnFamilyMetric(keyspace, cfname, "ReadLatency")); - double[] writeLatency = probe.metricPercentilesAsArray((JmxReporter.TimerMBean) probe.getColumnFamilyMetric(keyspace, cfname, "WriteLatency")); - double[] sstablesPerRead = probe.metricPercentilesAsArray((JmxReporter.HistogramMBean) probe.getColumnFamilyMetric(keyspace, cfname, "SSTablesPerReadHistogram")); + double[] readLatency = probe.metricPercentilesAsArray((CassandraMetricsRegistry.JmxTimerMBean) probe.getColumnFamilyMetric(keyspace, cfname, "ReadLatency")); + double[] writeLatency = probe.metricPercentilesAsArray((CassandraMetricsRegistry.JmxTimerMBean) probe.getColumnFamilyMetric(keyspace, cfname, "WriteLatency")); + double[] sstablesPerRead = probe.metricPercentilesAsArray((CassandraMetricsRegistry.JmxHistogramMBean) probe.getColumnFamilyMetric(keyspace, cfname, "SSTablesPerReadHistogram")); System.out.println(format("%s/%s histograms", keyspace, cfname)); System.out.println(format("%-10s%10s%18s%18s%18s%18s", @@ -2565,19 +2563,15 @@ public void execute(NodeProbe probe) { System.out.printf("%-25s%10s%10s%15s%10s%18s%n", "Pool Name", "Active", "Pending", "Completed", "Blocked", "All time blocked"); - Iterator> threads = probe.getThreadPoolMBeanProxies(); - while (threads.hasNext()) + for (Stage stage : Stage.jmxEnabledStages()) { - Map.Entry thread = threads.next(); - String poolName = thread.getKey(); - JMXEnabledThreadPoolExecutorMBean threadPoolProxy = thread.getValue(); System.out.printf("%-25s%10s%10s%15s%10s%18s%n", - poolName, - threadPoolProxy.getActiveCount(), - threadPoolProxy.getPendingTasks(), - threadPoolProxy.getCompletedTasks(), - threadPoolProxy.getCurrentlyBlockedTasks(), - threadPoolProxy.getTotalBlockedTasks()); + stage.getJmxName(), + probe.getThreadPoolMetric(stage, "ActiveTasks"), + probe.getThreadPoolMetric(stage, "PendingTasks"), + probe.getThreadPoolMetric(stage, "CompletedTasks"), + probe.getThreadPoolMetric(stage, "CurrentlyBlockedTasks"), + probe.getThreadPoolMetric(stage, "TotalBlockedTasks")); } System.out.printf("%n%-20s%10s%n", "Message type", "Dropped"); diff --git a/src/java/org/apache/cassandra/transport/RequestThreadPoolExecutor.java b/src/java/org/apache/cassandra/transport/RequestThreadPoolExecutor.java index 9cac645948e0..4ecd6a77f2ba 100644 --- a/src/java/org/apache/cassandra/transport/RequestThreadPoolExecutor.java +++ b/src/java/org/apache/cassandra/transport/RequestThreadPoolExecutor.java @@ -26,7 +26,7 @@ import org.apache.cassandra.concurrent.TracingAwareExecutorService; import org.apache.cassandra.config.DatabaseDescriptor; -import static org.apache.cassandra.concurrent.JMXEnabledSharedExecutorPool.SHARED; +import static org.apache.cassandra.concurrent.SharedExecutorPool.SHARED; public class RequestThreadPoolExecutor extends AbstractEventExecutor { @@ -34,8 +34,8 @@ public class RequestThreadPoolExecutor extends AbstractEventExecutor private final static String THREAD_FACTORY_ID = "Native-Transport-Requests"; private final TracingAwareExecutorService wrapped = SHARED.newExecutor(DatabaseDescriptor.getNativeTransportMaxThreads(), MAX_QUEUED_REQUESTS, - THREAD_FACTORY_ID, - "transport"); + "transport", + THREAD_FACTORY_ID); public boolean isShuttingDown() { diff --git a/src/java/org/apache/cassandra/utils/StatusLogger.java b/src/java/org/apache/cassandra/utils/StatusLogger.java index acd923d2dcc3..a1d5e1811444 100644 --- a/src/java/org/apache/cassandra/utils/StatusLogger.java +++ b/src/java/org/apache/cassandra/utils/StatusLogger.java @@ -19,15 +19,14 @@ import java.lang.management.ManagementFactory; import java.util.Set; -import javax.management.JMX; -import javax.management.MBeanServer; -import javax.management.MalformedObjectNameException; -import javax.management.ObjectName; +import javax.management.*; import com.google.common.collect.Iterables; import org.apache.cassandra.cache.*; +import org.apache.cassandra.concurrent.Stage; +import org.apache.cassandra.metrics.ThreadPoolMetrics; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,34 +42,25 @@ public class StatusLogger { private static final Logger logger = LoggerFactory.getLogger(StatusLogger.class); + public static void log() { MBeanServer server = ManagementFactory.getPlatformMBeanServer(); // everything from o.a.c.concurrent logger.info(String.format("%-25s%10s%10s%15s%10s%18s", "Pool Name", "Active", "Pending", "Completed", "Blocked", "All Time Blocked")); - Set request, internal; - try - { - request = server.queryNames(new ObjectName("org.apache.cassandra.request:type=*"), null); - internal = server.queryNames(new ObjectName("org.apache.cassandra.internal:type=*"), null); - } - catch (MalformedObjectNameException e) - { - throw new RuntimeException(e); - } - for (ObjectName objectName : Iterables.concat(request, internal)) + + for (Stage stage : Stage.jmxEnabledStages()) { - String poolName = objectName.getKeyProperty("type"); - JMXEnabledThreadPoolExecutorMBean threadPoolProxy = JMX.newMBeanProxy(server, objectName, JMXEnabledThreadPoolExecutorMBean.class); - logger.info(String.format("%-25s%10s%10s%15s%10s%18s", - poolName, - threadPoolProxy.getActiveCount(), - threadPoolProxy.getPendingTasks(), - threadPoolProxy.getCompletedTasks(), - threadPoolProxy.getCurrentlyBlockedTasks(), - threadPoolProxy.getTotalBlockedTasks())); + System.out.printf("%-25s%10s%10s%15s%10s%18s%n", + stage.getJmxName(), + ThreadPoolMetrics.getJmxMetric(server, stage.getJmxType(), stage.getJmxName(), "ActiveTasks"), + ThreadPoolMetrics.getJmxMetric(server, stage.getJmxType(), stage.getJmxName(), "PendingTasks"), + ThreadPoolMetrics.getJmxMetric(server, stage.getJmxType(), stage.getJmxName(), "CompletedTasks"), + ThreadPoolMetrics.getJmxMetric(server, stage.getJmxType(), stage.getJmxName(), "CurrentlyBlockedTasks"), + ThreadPoolMetrics.getJmxMetric(server, stage.getJmxType(), stage.getJmxName(), "TotalBlockedTasks")); } + // one offs logger.info(String.format("%-25s%10s%10s", "CompactionManager", CompactionManager.instance.getActiveCompactions(), CompactionManager.instance.getPendingTasks())); @@ -114,7 +104,7 @@ public static void log() { logger.info(String.format("%-25s%20s", cfs.keyspace.getName() + "." + cfs.name, - cfs.getMemtableColumnsCount() + "," + cfs.getMemtableDataSize())); + cfs.metric.memtableColumnsCount.getValue() + "," + cfs.metric.memtableLiveDataSize.getValue())); } } } diff --git a/src/java/org/apache/cassandra/utils/concurrent/WaitQueue.java b/src/java/org/apache/cassandra/utils/concurrent/WaitQueue.java index df3d38d71cd7..be271b6dbd29 100644 --- a/src/java/org/apache/cassandra/utils/concurrent/WaitQueue.java +++ b/src/java/org/apache/cassandra/utils/concurrent/WaitQueue.java @@ -18,13 +18,13 @@ */ package org.apache.cassandra.utils.concurrent; -import com.yammer.metrics.core.TimerContext; - import java.util.Iterator; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; import java.util.concurrent.locks.LockSupport; +import com.codahale.metrics.Timer; + /** *

    A relatively easy to use utility for general purpose thread signalling.

    *

    Usage on a thread awaiting a state change using a WaitQueue q is:

    @@ -96,7 +96,7 @@ public Signal register() * or the waiting thread is interrupted. * @return */ - public Signal register(TimerContext context) + public Signal register(Timer.Context context) { assert context != null; RegisteredSignal signal = new TimedSignal(context); @@ -389,9 +389,9 @@ public void cancel() */ private final class TimedSignal extends RegisteredSignal { - private final TimerContext context; + private final Timer.Context context; - private TimedSignal(TimerContext context) + private TimedSignal(Timer.Context context) { this.context = context; } diff --git a/test/long/org/apache/cassandra/concurrent/LongSharedExecutorPoolTest.java b/test/long/org/apache/cassandra/concurrent/LongSharedExecutorPoolTest.java index 34532615999c..fe464c780439 100644 --- a/test/long/org/apache/cassandra/concurrent/LongSharedExecutorPoolTest.java +++ b/test/long/org/apache/cassandra/concurrent/LongSharedExecutorPoolTest.java @@ -116,7 +116,7 @@ private void testPromptnessOfExecution(long intervalNanos, float loadIncrement) final ExecutorService[] executors = new ExecutorService[executorCount]; for (int i = 0 ; i < executors.length ; i++) { - executors[i] = JMXEnabledSharedExecutorPool.SHARED.newExecutor(threadCount, maxQueued, "test" + i, "test" + i); + executors[i] = SharedExecutorPool.SHARED.newExecutor(threadCount, maxQueued, "test" + i, "test" + i); threadCounts[i] = threadCount; workCount[i] = new WeibullDistribution(2, maxQueued); threadCount *= 2; diff --git a/test/long/org/apache/cassandra/db/LongFlushMemtableTest.java b/test/long/org/apache/cassandra/db/LongFlushMemtableTest.java index fd23f330afc5..24993c82d2f0 100644 --- a/test/long/org/apache/cassandra/db/LongFlushMemtableTest.java +++ b/test/long/org/apache/cassandra/db/LongFlushMemtableTest.java @@ -78,7 +78,7 @@ public void testFlushMemtables() throws ConfigurationException for (ColumnFamilyStore cfs : ColumnFamilyStore.all()) { if (cfs.name.startsWith("_CF")) - flushes += cfs.getMemtableSwitchCount(); + flushes += cfs.metric.memtableSwitchCount.getCount(); } assert flushes > 0; } diff --git a/test/long/org/apache/cassandra/utils/LongBTreeTest.java b/test/long/org/apache/cassandra/utils/LongBTreeTest.java index eb7567150aa9..133c6c5621d6 100644 --- a/test/long/org/apache/cassandra/utils/LongBTreeTest.java +++ b/test/long/org/apache/cassandra/utils/LongBTreeTest.java @@ -46,10 +46,10 @@ import org.junit.Assert; import org.junit.Test; -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.Timer; -import com.yammer.metrics.core.TimerContext; -import com.yammer.metrics.stats.Snapshot; + +import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.Snapshot; +import com.codahale.metrics.Timer; import org.apache.cassandra.concurrent.NamedThreadFactory; import org.apache.cassandra.utils.btree.BTree; import org.apache.cassandra.utils.btree.BTreeSearchIterator; @@ -60,8 +60,9 @@ public class LongBTreeTest { - private static final Timer BTREE_TIMER = Metrics.newTimer(BTree.class, "BTREE", TimeUnit.NANOSECONDS, TimeUnit.NANOSECONDS); - private static final Timer TREE_TIMER = Metrics.newTimer(BTree.class, "TREE", TimeUnit.NANOSECONDS, TimeUnit.NANOSECONDS); + private static final MetricRegistry metrics = new MetricRegistry(); + private static final Timer BTREE_TIMER = metrics.timer(MetricRegistry.name(BTree.class, "BTREE")); + private static final Timer TREE_TIMER = metrics.timer(MetricRegistry.name(BTree.class, "TREE")); private static final ExecutorService MODIFY = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(), new NamedThreadFactory("MODIFY")); private static final ExecutorService COMPARE = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(), new NamedThreadFactory("COMPARE")); private static final RandomAbort SPORADIC_ABORT = new RandomAbort<>(new Random(), 0.0001f); @@ -236,7 +237,7 @@ public List> call() } mods -= c; } - TimerContext ctxt; + Timer.Context ctxt; ctxt = TREE_TIMER.time(); canon.putAll(buffer); ctxt.stop(); diff --git a/test/unit/org/apache/cassandra/db/ColumnFamilyMetricTest.java b/test/unit/org/apache/cassandra/db/ColumnFamilyMetricTest.java index f09eb9366c4f..45ed56ecd4a0 100644 --- a/test/unit/org/apache/cassandra/db/ColumnFamilyMetricTest.java +++ b/test/unit/org/apache/cassandra/db/ColumnFamilyMetricTest.java @@ -53,8 +53,8 @@ public void testSizeMetric() store.truncateBlocking(); - assertEquals(0, store.metric.liveDiskSpaceUsed.count()); - assertEquals(0, store.metric.totalDiskSpaceUsed.count()); + assertEquals(0, store.metric.liveDiskSpaceUsed.getCount()); + assertEquals(0, store.metric.totalDiskSpaceUsed.getCount()); for (int j = 0; j < 10; j++) { @@ -72,14 +72,14 @@ public void testSizeMetric() } // size metrics should show the sum of all SSTable sizes - assertEquals(size, store.metric.liveDiskSpaceUsed.count()); - assertEquals(size, store.metric.totalDiskSpaceUsed.count()); + assertEquals(size, store.metric.liveDiskSpaceUsed.getCount()); + assertEquals(size, store.metric.totalDiskSpaceUsed.getCount()); store.truncateBlocking(); // after truncate, size metrics should be down to 0 - assertEquals(0, store.metric.liveDiskSpaceUsed.count()); - assertEquals(0, store.metric.totalDiskSpaceUsed.count()); + assertEquals(0, store.metric.liveDiskSpaceUsed.getCount()); + assertEquals(0, store.metric.totalDiskSpaceUsed.getCount()); store.enableAutoCompaction(); } diff --git a/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java b/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java index 7c086f78bace..5679ba597584 100644 --- a/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java +++ b/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java @@ -81,6 +81,7 @@ import org.apache.cassandra.io.sstable.metadata.MetadataCollector; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.locator.SimpleStrategy; +import org.apache.cassandra.metrics.ClearableHistogram; import org.apache.cassandra.service.ActiveRepairService; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.thrift.SlicePredicate; @@ -178,9 +179,9 @@ public void testTimeSortedQuery() rm.applyUnsafe(); cfs.forceBlockingFlush(); - cfs.getRecentSSTablesPerReadHistogram(); // resets counts + ((ClearableHistogram)cfs.metric.sstablesPerReadHistogram.cf).clear(); // resets counts cfs.getColumnFamily(Util.namesQueryFilter(cfs, Util.dk("key1"), "Column1")); - assertEquals(1, cfs.getRecentSSTablesPerReadHistogram()[0]); + assertEquals(1, cfs.metric.sstablesPerReadHistogram.cf.getCount()); } @Test diff --git a/test/unit/org/apache/cassandra/db/KeyspaceTest.java b/test/unit/org/apache/cassandra/db/KeyspaceTest.java index 01038c42901d..4c97ea2c7675 100644 --- a/test/unit/org/apache/cassandra/db/KeyspaceTest.java +++ b/test/unit/org/apache/cassandra/db/KeyspaceTest.java @@ -45,6 +45,7 @@ import org.apache.cassandra.db.marshal.IntegerType; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.locator.SimpleStrategy; +import org.apache.cassandra.metrics.ClearableHistogram; import org.apache.cassandra.utils.WrappedRunnable; import static org.apache.cassandra.Util.column; import static org.apache.cassandra.Util.expiringColumn; @@ -481,18 +482,18 @@ public void testLimitSSTables() throws CharacterCodingException rm.applyUnsafe(); cfStore.forceBlockingFlush(); } - cfStore.metric.sstablesPerReadHistogram.cf.clear(); + ((ClearableHistogram)cfStore.metric.sstablesPerReadHistogram.cf).clear(); ColumnFamily cf = cfStore.getColumnFamily(key, Composites.EMPTY, cellname("col1499"), false, 1000, System.currentTimeMillis()); - assertEquals(cfStore.metric.sstablesPerReadHistogram.cf.max(), 5, 0.1); + assertEquals(cfStore.metric.sstablesPerReadHistogram.cf.getSnapshot().getMax(), 5, 0.1); int i = 0; for (Cell c : cf.getSortedColumns()) { assertEquals(ByteBufferUtil.string(c.name().toByteBuffer()), "col" + (1000 + i++)); } assertEquals(i, 500); - cfStore.metric.sstablesPerReadHistogram.cf.clear(); + ((ClearableHistogram)cfStore.metric.sstablesPerReadHistogram.cf).clear(); cf = cfStore.getColumnFamily(key, cellname("col1500"), cellname("col2000"), false, 1000, System.currentTimeMillis()); - assertEquals(cfStore.metric.sstablesPerReadHistogram.cf.max(), 5, 0.1); + assertEquals(cfStore.metric.sstablesPerReadHistogram.cf.getSnapshot().getMax(), 5, 0.1); for (Cell c : cf.getSortedColumns()) { @@ -501,9 +502,9 @@ public void testLimitSSTables() throws CharacterCodingException assertEquals(i, 1000); // reverse - cfStore.metric.sstablesPerReadHistogram.cf.clear(); + ((ClearableHistogram)cfStore.metric.sstablesPerReadHistogram.cf).clear(); cf = cfStore.getColumnFamily(key, cellname("col2000"), cellname("col1500"), true, 1000, System.currentTimeMillis()); - assertEquals(cfStore.metric.sstablesPerReadHistogram.cf.max(), 5, 0.1); + assertEquals(cfStore.metric.sstablesPerReadHistogram.cf.getSnapshot().getMax(), 5, 0.1); i = 500; for (Cell c : cf.getSortedColumns()) { @@ -550,13 +551,13 @@ public void testLimitSSTablesComposites() } Composite start = type.builder().add(ByteBufferUtil.bytes("a5")).add(ByteBufferUtil.bytes(85)).build(); Composite finish = type.builder().add(ByteBufferUtil.bytes("a5")).build().end(); - cfs.metric.sstablesPerReadHistogram.cf.clear(); + ((ClearableHistogram)cfs.metric.sstablesPerReadHistogram.cf).clear(); ColumnFamily cf = cfs.getColumnFamily(key, start, finish, false, 1000, System.currentTimeMillis()); int colCount = 0; for (Cell c : cf) colCount++; assertEquals(2, colCount); - assertEquals(2, cfs.metric.sstablesPerReadHistogram.cf.max(), 0.1); + assertEquals(2, cfs.metric.sstablesPerReadHistogram.cf.getSnapshot().getMax(), 0.1); } private void validateSliceLarge(ColumnFamilyStore cfStore) throws IOException diff --git a/test/unit/org/apache/cassandra/db/RowCacheTest.java b/test/unit/org/apache/cassandra/db/RowCacheTest.java index 3d5617fabb8a..a4b7514432b5 100644 --- a/test/unit/org/apache/cassandra/db/RowCacheTest.java +++ b/test/unit/org/apache/cassandra/db/RowCacheTest.java @@ -185,8 +185,8 @@ public void testRowCacheRange() Keyspace keyspace = Keyspace.open(KEYSPACE_CACHED); String cf = "CachedIntCF"; ColumnFamilyStore cachedStore = keyspace.getColumnFamilyStore(cf); - long startRowCacheHits = cachedStore.metric.rowCacheHit.count(); - long startRowCacheOutOfRange = cachedStore.metric.rowCacheHitOutOfRange.count(); + long startRowCacheHits = cachedStore.metric.rowCacheHit.getCount(); + long startRowCacheOutOfRange = cachedStore.metric.rowCacheHitOutOfRange.getCount(); // empty the row cache CacheService.instance.invalidateRowCache(); @@ -206,31 +206,31 @@ public void testRowCacheRange() Composites.EMPTY, Composites.EMPTY, false, 10, System.currentTimeMillis())); - assertEquals(startRowCacheHits, cachedStore.metric.rowCacheHit.count()); + assertEquals(startRowCacheHits, cachedStore.metric.rowCacheHit.getCount()); // do another query, limit is 20, which is < 100 that we cache, we should get a hit and it should be in range cachedStore.getColumnFamily(QueryFilter.getSliceFilter(dk, cf, Composites.EMPTY, Composites.EMPTY, false, 20, System.currentTimeMillis())); - assertEquals(++startRowCacheHits, cachedStore.metric.rowCacheHit.count()); - assertEquals(startRowCacheOutOfRange, cachedStore.metric.rowCacheHitOutOfRange.count()); + assertEquals(++startRowCacheHits, cachedStore.metric.rowCacheHit.getCount()); + assertEquals(startRowCacheOutOfRange, cachedStore.metric.rowCacheHitOutOfRange.getCount()); // get a slice from 95 to 105, 95->99 are in cache, we should not get a hit and then row cache is out of range cachedStore.getColumnFamily(QueryFilter.getSliceFilter(dk, cf, CellNames.simpleDense(ByteBufferUtil.bytes(95)), CellNames.simpleDense(ByteBufferUtil.bytes(105)), false, 10, System.currentTimeMillis())); - assertEquals(startRowCacheHits, cachedStore.metric.rowCacheHit.count()); - assertEquals(++startRowCacheOutOfRange, cachedStore.metric.rowCacheHitOutOfRange.count()); + assertEquals(startRowCacheHits, cachedStore.metric.rowCacheHit.getCount()); + assertEquals(++startRowCacheOutOfRange, cachedStore.metric.rowCacheHitOutOfRange.getCount()); // get a slice with limit > 100, we should get a hit out of range. cachedStore.getColumnFamily(QueryFilter.getSliceFilter(dk, cf, Composites.EMPTY, Composites.EMPTY, false, 101, System.currentTimeMillis())); - assertEquals(startRowCacheHits, cachedStore.metric.rowCacheHit.count()); - assertEquals(++startRowCacheOutOfRange, cachedStore.metric.rowCacheHitOutOfRange.count()); + assertEquals(startRowCacheHits, cachedStore.metric.rowCacheHit.getCount()); + assertEquals(++startRowCacheOutOfRange, cachedStore.metric.rowCacheHitOutOfRange.getCount()); CacheService.instance.invalidateRowCache(); @@ -240,7 +240,7 @@ public void testRowCacheRange() Composites.EMPTY, Composites.EMPTY, false, 105, System.currentTimeMillis())); - assertEquals(startRowCacheHits, cachedStore.metric.rowCacheHit.count()); + assertEquals(startRowCacheHits, cachedStore.metric.rowCacheHit.getCount()); // validate the stuff in cache; ColumnFamily cachedCf = (ColumnFamily)CacheService.instance.rowCache.get(rck); assertEquals(cachedCf.getColumnCount(), 100); diff --git a/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java b/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java index 018d6431ca9f..60c5e6994c0f 100644 --- a/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java @@ -143,8 +143,8 @@ public void antiCompactionSizeTest() throws InterruptedException, IOException long sum = 0; for (SSTableReader x : cfs.getSSTables()) sum += x.bytesOnDisk(); - assertEquals(sum, cfs.metric.liveDiskSpaceUsed.count()); - assertEquals(origSize, cfs.metric.liveDiskSpaceUsed.count(), 100000); + assertEquals(sum, cfs.metric.liveDiskSpaceUsed.getCount()); + assertEquals(origSize, cfs.metric.liveDiskSpaceUsed.getCount(), 100000); } diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java index 25f906fb79b5..8aa402a05ca4 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java @@ -200,7 +200,7 @@ public void testPersistentStatistics() store.forceBlockingFlush(); clearAndLoad(store); - assert store.getMaxRowSize() != 0; + assert store.metric.maxRowSize.getValue() != 0; } private void clearAndLoad(ColumnFamilyStore cfs) diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableRewriterTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableRewriterTest.java index 97625f4d06a5..c823215b205a 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableRewriterTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableRewriterTest.java @@ -250,7 +250,7 @@ public void testNumberOfFilesAndSizes() throws Exception SSTableReader s = writeFile(cfs, 1000); cfs.addSSTable(s); - long startStorageMetricsLoad = StorageMetrics.load.count(); + long startStorageMetricsLoad = StorageMetrics.load.getCount(); Set compacting = Sets.newHashSet(s); SSTableRewriter.overrideOpenInterval(10000000); SSTableRewriter rewriter = new SSTableRewriter(cfs, compacting, 1000, false); @@ -268,8 +268,8 @@ public void testNumberOfFilesAndSizes() throws Exception rewriter.switchWriter(getWriter(cfs, s.descriptor.directory)); files++; assertEquals(cfs.getSSTables().size(), files); // we have one original file plus the ones we have switched out. - assertEquals(s.bytesOnDisk(), cfs.metric.liveDiskSpaceUsed.count()); - assertEquals(s.bytesOnDisk(), cfs.metric.totalDiskSpaceUsed.count()); + assertEquals(s.bytesOnDisk(), cfs.metric.liveDiskSpaceUsed.getCount()); + assertEquals(s.bytesOnDisk(), cfs.metric.totalDiskSpaceUsed.getCount()); } } @@ -279,13 +279,13 @@ public void testNumberOfFilesAndSizes() throws Exception long sum = 0; for (SSTableReader x : cfs.getSSTables()) sum += x.bytesOnDisk(); - assertEquals(sum, cfs.metric.liveDiskSpaceUsed.count()); - assertEquals(startStorageMetricsLoad - s.bytesOnDisk() + sum, StorageMetrics.load.count()); + assertEquals(sum, cfs.metric.liveDiskSpaceUsed.getCount()); + assertEquals(startStorageMetricsLoad - s.bytesOnDisk() + sum, StorageMetrics.load.getCount()); assertEquals(files, sstables.size()); assertEquals(files, cfs.getSSTables().size()); Thread.sleep(1000); // tmplink and tmp files should be gone: - assertEquals(sum, cfs.metric.totalDiskSpaceUsed.count()); + assertEquals(sum, cfs.metric.totalDiskSpaceUsed.getCount()); assertFileCounts(s.descriptor.directory.list(), 0, 0); validateCFS(cfs); } @@ -340,7 +340,7 @@ public void testNumberOfFiles_abort() throws Exception SSTableReader s = writeFile(cfs, 1000); cfs.addSSTable(s); - long startSize = cfs.metric.liveDiskSpaceUsed.count(); + long startSize = cfs.metric.liveDiskSpaceUsed.getCount(); DecoratedKey origFirst = s.first; DecoratedKey origLast = s.last; Set compacting = Sets.newHashSet(s); @@ -365,7 +365,7 @@ public void testNumberOfFiles_abort() throws Exception } rewriter.abort(); Thread.sleep(1000); - assertEquals(startSize, cfs.metric.liveDiskSpaceUsed.count()); + assertEquals(startSize, cfs.metric.liveDiskSpaceUsed.getCount()); assertEquals(1, cfs.getSSTables().size()); assertFileCounts(s.descriptor.directory.list(), 0, 0); assertEquals(cfs.getSSTables().iterator().next().first, origFirst); diff --git a/test/unit/org/apache/cassandra/metrics/CQLMetricsTest.java b/test/unit/org/apache/cassandra/metrics/CQLMetricsTest.java index 88104a6e9882..a357d24d73b4 100644 --- a/test/unit/org/apache/cassandra/metrics/CQLMetricsTest.java +++ b/test/unit/org/apache/cassandra/metrics/CQLMetricsTest.java @@ -64,9 +64,9 @@ public static void setup() throws ConfigurationException, IOException @Test public void testPreparedStatementsCount() { - assertEquals(0, (int) QueryProcessor.metrics.preparedStatementsCount.value()); + assertEquals(0, (int) QueryProcessor.metrics.preparedStatementsCount.getValue()); metricsStatement = session.prepare("INSERT INTO junit.metricstest (id, val) VALUES (?, ?)"); - assertEquals(1, (int) QueryProcessor.metrics.preparedStatementsCount.value()); + assertEquals(1, (int) QueryProcessor.metrics.preparedStatementsCount.getValue()); } @Test @@ -74,14 +74,14 @@ public void testRegularStatementsExecuted() { clearMetrics(); - assertEquals(0, QueryProcessor.metrics.preparedStatementsExecuted.count()); - assertEquals(0, QueryProcessor.metrics.regularStatementsExecuted.count()); + assertEquals(0, QueryProcessor.metrics.preparedStatementsExecuted.getCount()); + assertEquals(0, QueryProcessor.metrics.regularStatementsExecuted.getCount()); for (int i = 0; i < 10; i++) session.execute(String.format("INSERT INTO junit.metricstest (id, val) VALUES (%d, '%s')", i, "val" + i)); - assertEquals(0, QueryProcessor.metrics.preparedStatementsExecuted.count()); - assertEquals(10, QueryProcessor.metrics.regularStatementsExecuted.count()); + assertEquals(0, QueryProcessor.metrics.preparedStatementsExecuted.getCount()); + assertEquals(10, QueryProcessor.metrics.regularStatementsExecuted.getCount()); } @Test @@ -89,14 +89,14 @@ public void testPreparedStatementsExecuted() { clearMetrics(); - assertEquals(0, QueryProcessor.metrics.preparedStatementsExecuted.count()); - assertEquals(0, QueryProcessor.metrics.regularStatementsExecuted.count()); + assertEquals(0, QueryProcessor.metrics.preparedStatementsExecuted.getCount()); + assertEquals(0, QueryProcessor.metrics.regularStatementsExecuted.getCount()); for (int i = 0; i < 10; i++) session.execute(metricsStatement.bind(i, "val" + i)); - assertEquals(10, QueryProcessor.metrics.preparedStatementsExecuted.count()); - assertEquals(0, QueryProcessor.metrics.regularStatementsExecuted.count()); + assertEquals(10, QueryProcessor.metrics.preparedStatementsExecuted.getCount()); + assertEquals(0, QueryProcessor.metrics.regularStatementsExecuted.getCount()); } @Test @@ -104,22 +104,22 @@ public void testPreparedStatementsRatio() { clearMetrics(); - assertEquals(Double.NaN, QueryProcessor.metrics.preparedStatementsRatio.value()); + assertEquals(Double.NaN, QueryProcessor.metrics.preparedStatementsRatio.getValue()); for (int i = 0; i < 10; i++) session.execute(metricsStatement.bind(i, "val" + i)); - assertEquals(1.0, QueryProcessor.metrics.preparedStatementsRatio.value()); + assertEquals(1.0, QueryProcessor.metrics.preparedStatementsRatio.getValue()); for (int i = 0; i < 10; i++) session.execute(String.format("INSERT INTO junit.metricstest (id, val) VALUES (%d, '%s')", i, "val" + i)); - assertEquals(0.5, QueryProcessor.metrics.preparedStatementsRatio.value()); + assertEquals(0.5, QueryProcessor.metrics.preparedStatementsRatio.getValue()); } private void clearMetrics() { - QueryProcessor.metrics.preparedStatementsExecuted.clear(); - QueryProcessor.metrics.regularStatementsExecuted.clear(); - QueryProcessor.metrics.preparedStatementsEvicted.clear(); + QueryProcessor.metrics.preparedStatementsExecuted.dec(QueryProcessor.metrics.preparedStatementsExecuted.getCount()); + QueryProcessor.metrics.regularStatementsExecuted.dec(QueryProcessor.metrics.regularStatementsExecuted.getCount()); + QueryProcessor.metrics.preparedStatementsEvicted.dec(QueryProcessor.metrics.preparedStatementsEvicted.getCount()); } } diff --git a/test/unit/org/apache/cassandra/metrics/LatencyMetricsTest.java b/test/unit/org/apache/cassandra/metrics/LatencyMetricsTest.java index e5f080416bc5..ae4b733842f2 100644 --- a/test/unit/org/apache/cassandra/metrics/LatencyMetricsTest.java +++ b/test/unit/org/apache/cassandra/metrics/LatencyMetricsTest.java @@ -43,7 +43,7 @@ public void run() for (int i = 0; i < 10000; i++) { - Double recent = l.getRecentLatency(); + Double recent = l.latency.getOneMinuteRate(); assertFalse(recent.equals(Double.POSITIVE_INFINITY)); } } From ca1b06500c54aed0c67659b5d9e697ae1ae050a4 Mon Sep 17 00:00:00 2001 From: Benedict Elliott Smith Date: Wed, 28 Jan 2015 17:54:11 +0000 Subject: [PATCH 259/557] ninja fix 7705 trunk merge --- .../cassandra/io/sstable/format/SSTableReader.java | 1 + .../apache/cassandra/service/ActiveRepairService.java | 9 +++------ 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java b/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java index 2073e50cdf8d..de65ca77468b 100644 --- a/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java +++ b/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java @@ -469,6 +469,7 @@ public static SSTableReader internalOpen(Descriptor desc, reader.ifile = ifile; reader.dfile = dfile; reader.indexSummary = isummary; + reader.tidy.setup(reader); return reader; } diff --git a/src/java/org/apache/cassandra/service/ActiveRepairService.java b/src/java/org/apache/cassandra/service/ActiveRepairService.java index 7c7b0b619076..fa9be8a0e0d3 100644 --- a/src/java/org/apache/cassandra/service/ActiveRepairService.java +++ b/src/java/org/apache/cassandra/service/ActiveRepairService.java @@ -25,6 +25,7 @@ import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicBoolean; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; @@ -431,13 +432,9 @@ public synchronized Refs getAndReferenceSSTables(UUID cfId) public synchronized Refs getAndReferenceSSTablesInRange(UUID cfId, Range range) { Refs sstables = getAndReferenceSSTables(cfId); - for (SSTableReader sstable : new ArrayList<>(sstables)) - { - if (new Bounds<>(sstable.first.getToken(), sstable.last.getToken()).intersects(Arrays.asList(range))) - sstables.add(sstable); - else + for (SSTableReader sstable : ImmutableList.copyOf(sstables)) + if (!new Bounds<>(sstable.first.getToken(), sstable.last.getToken()).intersects(Arrays.asList(range))) sstables.release(sstable); - } return sstables; } From 48a7e645d871bdb91e082f3ad3cdb61ba3f16199 Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Thu, 29 Jan 2015 01:48:36 -0500 Subject: [PATCH 260/557] the Metrics map is keyed by String, not MetricName --- src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java b/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java index 90b6b80fffc8..7b1be7438dd6 100644 --- a/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java +++ b/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java @@ -618,7 +618,7 @@ public void release() { for(String name : all) { - allColumnFamilyMetrics.get(name).remove(Metrics.getMetrics().get(factory.createMetricName(name))); + allColumnFamilyMetrics.get(name).remove(Metrics.getMetrics().get(factory.createMetricName(name).getMetricName())); Metrics.remove(factory.createMetricName(name)); } readLatency.release(); From 6d2f2767e8407b3a786f9fefaec7c50d8d7d2686 Mon Sep 17 00:00:00 2001 From: T Jake Luciani Date: Thu, 29 Jan 2015 11:00:41 -0500 Subject: [PATCH 261/557] TotalLatencyCount should be in micros not nanos Patch by tjake; reviewed by Mike Adamson for CASSANDRA-8702 --- src/java/org/apache/cassandra/metrics/LatencyMetrics.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/cassandra/metrics/LatencyMetrics.java b/src/java/org/apache/cassandra/metrics/LatencyMetrics.java index ced56a84f477..a2eef68b9696 100644 --- a/src/java/org/apache/cassandra/metrics/LatencyMetrics.java +++ b/src/java/org/apache/cassandra/metrics/LatencyMetrics.java @@ -102,7 +102,7 @@ public void addNano(long nanos) { // convert to microseconds. 1 millionth latency.update(nanos, TimeUnit.NANOSECONDS); - totalLatency.inc(nanos); + totalLatency.inc(nanos / 1000); for(LatencyMetrics parent : parents) { parent.addNano(nanos); From 806facc8ca87a8d1f6fa14056c68ac43dc5bde5c Mon Sep 17 00:00:00 2001 From: Branimir Lambov Date: Fri, 30 Jan 2015 00:46:44 +0300 Subject: [PATCH 262/557] Token serialization should accept partitioner explicitly patch by Branimir Lambov; reviewed by Aleksey Yeschenko for CASSANDRA-8268 --- CHANGES.txt | 3 +- .../cassandra/db/PagedRangeCommand.java | 3 +- .../cassandra/db/RangeSliceCommand.java | 3 +- .../org/apache/cassandra/db/RowPosition.java | 16 ++--- .../apache/cassandra/dht/AbstractBounds.java | 33 +++++----- .../dht/IPartitionerDependentSerializer.java | 61 +++++++++++++++++++ src/java/org/apache/cassandra/dht/Token.java | 19 +++--- .../cassandra/net/MessagingService.java | 14 +++++ .../cassandra/repair/RepairJobDesc.java | 3 +- .../messages/AnticompactionRequest.java | 10 ++- .../repair/messages/PrepareMessage.java | 8 ++- .../repair/messages/RepairMessage.java | 2 +- .../repair/messages/SyncRequest.java | 6 +- .../cassandra/streaming/StreamRequest.java | 14 +++-- .../apache/cassandra/utils/MerkleTree.java | 43 ++++++------- 15 files changed, 163 insertions(+), 75 deletions(-) create mode 100644 src/java/org/apache/cassandra/dht/IPartitionerDependentSerializer.java diff --git a/CHANGES.txt b/CHANGES.txt index 0cd0b4d7b102..a85a6e7995dd 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0 + * Avoid accessing partitioner through StorageProxy (CASSANDRA-8244, 8268) * Upgrade Metrics library and remove depricated metrics (CASSANDRA-5657) * Serializing Row cache alternative, fully off heap (CASSANDRA-7438) * Duplicate rows returned when in clause has repeated values (CASSANDRA-6707) @@ -137,8 +138,6 @@ * Force config client mode in CQLSSTableWriter (CASSANDRA-8281) * Fix sstableupgrade throws exception (CASSANDRA-8688) Merged from 2.0: -======= -2.0.13: * Fix SSTableSimpleUnsortedWriter ConcurrentModificationException (CASSANDRA-8619) * Round up time deltas lower than 1ms in BulkLoader (CASSANDRA-8645) * Add batch remove iterator to ABSC (CASSANDRA-8414, 8666) diff --git a/src/java/org/apache/cassandra/db/PagedRangeCommand.java b/src/java/org/apache/cassandra/db/PagedRangeCommand.java index 614f0f792675..ebedecfb0e3e 100644 --- a/src/java/org/apache/cassandra/db/PagedRangeCommand.java +++ b/src/java/org/apache/cassandra/db/PagedRangeCommand.java @@ -129,6 +129,7 @@ public void serialize(PagedRangeCommand cmd, DataOutputPlus out, int version) th out.writeUTF(cmd.columnFamily); out.writeLong(cmd.timestamp); + MessagingService.validatePartitioner(cmd.keyRange); AbstractBounds.serializer.serialize(cmd.keyRange, out, version); CFMetaData metadata = Schema.instance.getCFMetaData(cmd.keyspace, cmd.columnFamily); @@ -158,7 +159,7 @@ public PagedRangeCommand deserialize(DataInput in, int version) throws IOExcepti String columnFamily = in.readUTF(); long timestamp = in.readLong(); - AbstractBounds keyRange = AbstractBounds.serializer.deserialize(in, version).toRowBounds(); + AbstractBounds keyRange = AbstractBounds.serializer.deserialize(in, MessagingService.globalPartitioner(), version).toRowBounds(); CFMetaData metadata = Schema.instance.getCFMetaData(keyspace, columnFamily); diff --git a/src/java/org/apache/cassandra/db/RangeSliceCommand.java b/src/java/org/apache/cassandra/db/RangeSliceCommand.java index 4d2955b4eb93..600952490f9f 100644 --- a/src/java/org/apache/cassandra/db/RangeSliceCommand.java +++ b/src/java/org/apache/cassandra/db/RangeSliceCommand.java @@ -172,6 +172,7 @@ public void serialize(RangeSliceCommand sliceCommand, DataOutputPlus out, int ve expr.writeTo(out); } } + MessagingService.validatePartitioner(sliceCommand.keyRange); AbstractBounds.serializer.serialize(sliceCommand.keyRange, out, version); out.writeInt(sliceCommand.maxResults); out.writeBoolean(sliceCommand.countCQL3Rows); @@ -195,7 +196,7 @@ public RangeSliceCommand deserialize(DataInput in, int version) throws IOExcepti { rowFilter.add(IndexExpression.readFrom(in)); } - AbstractBounds range = AbstractBounds.serializer.deserialize(in, version).toRowBounds(); + AbstractBounds range = AbstractBounds.serializer.deserialize(in, MessagingService.globalPartitioner(), version).toRowBounds(); int maxResults = in.readInt(); boolean countCQL3Rows = in.readBoolean(); diff --git a/src/java/org/apache/cassandra/db/RowPosition.java b/src/java/org/apache/cassandra/db/RowPosition.java index 3bcd627a967a..3fa046597549 100644 --- a/src/java/org/apache/cassandra/db/RowPosition.java +++ b/src/java/org/apache/cassandra/db/RowPosition.java @@ -56,7 +56,7 @@ public static RowPosition get(ByteBuffer key, IPartitioner p) public Kind kind(); public boolean isMinimum(); - public static class RowPositionSerializer implements ISerializer + public static class RowPositionSerializer implements IPartitionerDependentSerializer { /* * We need to be able to serialize both Token.KeyBound and @@ -69,17 +69,17 @@ public static class RowPositionSerializer implements ISerializer * token is recreated on the other side). In the other cases, we then * serialize the token. */ - public void serialize(RowPosition pos, DataOutputPlus out) throws IOException + public void serialize(RowPosition pos, DataOutputPlus out, int version) throws IOException { Kind kind = pos.kind(); out.writeByte(kind.ordinal()); if (kind == Kind.ROW_KEY) ByteBufferUtil.writeWithShortLength(((DecoratedKey)pos).getKey(), out); else - Token.serializer.serialize(pos.getToken(), out); + Token.serializer.serialize(pos.getToken(), out, version); } - public RowPosition deserialize(DataInput in) throws IOException + public RowPosition deserialize(DataInput in, IPartitioner p, int version) throws IOException { Kind kind = Kind.fromOrdinal(in.readByte()); if (kind == Kind.ROW_KEY) @@ -89,23 +89,23 @@ public RowPosition deserialize(DataInput in) throws IOException } else { - Token t = Token.serializer.deserialize(in); + Token t = Token.serializer.deserialize(in, p, version); return kind == Kind.MIN_BOUND ? t.minKeyBound() : t.maxKeyBound(); } } - public long serializedSize(RowPosition pos, TypeSizes typeSizes) + public long serializedSize(RowPosition pos, int version) { Kind kind = pos.kind(); int size = 1; // 1 byte for enum if (kind == Kind.ROW_KEY) { int keySize = ((DecoratedKey)pos).getKey().remaining(); - size += typeSizes.sizeof((short) keySize) + keySize; + size += TypeSizes.NATIVE.sizeof((short) keySize) + keySize; } else { - size += Token.serializer.serializedSize(pos.getToken(), typeSizes); + size += Token.serializer.serializedSize(pos.getToken(), version); } return size; } diff --git a/src/java/org/apache/cassandra/dht/AbstractBounds.java b/src/java/org/apache/cassandra/dht/AbstractBounds.java index c7a35058eaa6..f045acfc0a9b 100644 --- a/src/java/org/apache/cassandra/dht/AbstractBounds.java +++ b/src/java/org/apache/cassandra/dht/AbstractBounds.java @@ -20,13 +20,12 @@ import java.io.DataInput; import java.io.IOException; import java.io.Serializable; -import java.util.*; +import java.util.List; import org.apache.cassandra.db.DecoratedKey; -import org.apache.cassandra.db.TypeSizes; import org.apache.cassandra.db.RowPosition; +import org.apache.cassandra.db.TypeSizes; import org.apache.cassandra.db.marshal.AbstractType; -import org.apache.cassandra.io.IVersionedSerializer; import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.utils.Pair; @@ -122,7 +121,7 @@ private String format(T value, AbstractType keyValidator) public abstract AbstractBounds withNewRight(T newRight); - public static class AbstractBoundsSerializer implements IVersionedSerializer> + public static class AbstractBoundsSerializer implements IPartitionerDependentSerializer> { public void serialize(AbstractBounds range, DataOutputPlus out, int version) throws IOException { @@ -133,13 +132,13 @@ public void serialize(AbstractBounds range, DataOutputPlus out, int version) out.writeInt(kindInt(range)); if (range.left instanceof Token) { - Token.serializer.serialize((Token) range.left, out); - Token.serializer.serialize((Token) range.right, out); + Token.serializer.serialize((Token) range.left, out, version); + Token.serializer.serialize((Token) range.right, out, version); } else { - RowPosition.serializer.serialize((RowPosition) range.left, out); - RowPosition.serializer.serialize((RowPosition) range.right, out); + RowPosition.serializer.serialize((RowPosition) range.left, out, version); + RowPosition.serializer.serialize((RowPosition) range.right, out, version); } } @@ -151,7 +150,7 @@ private int kindInt(AbstractBounds ab) return kind; } - public AbstractBounds deserialize(DataInput in, int version) throws IOException + public AbstractBounds deserialize(DataInput in, IPartitioner p, int version) throws IOException { int kind = in.readInt(); boolean isToken = kind >= 0; @@ -161,13 +160,13 @@ public AbstractBounds deserialize(DataInput in, int version) throws IOExcepti RingPosition left, right; if (isToken) { - left = Token.serializer.deserialize(in); - right = Token.serializer.deserialize(in); + left = Token.serializer.deserialize(in, p, version); + right = Token.serializer.deserialize(in, p, version); } else { - left = RowPosition.serializer.deserialize(in); - right = RowPosition.serializer.deserialize(in); + left = RowPosition.serializer.deserialize(in, p, version); + right = RowPosition.serializer.deserialize(in, p, version); } if (kind == Type.RANGE.ordinal()) @@ -180,13 +179,13 @@ public long serializedSize(AbstractBounds ab, int version) int size = TypeSizes.NATIVE.sizeof(kindInt(ab)); if (ab.left instanceof Token) { - size += Token.serializer.serializedSize((Token) ab.left, TypeSizes.NATIVE); - size += Token.serializer.serializedSize((Token) ab.right, TypeSizes.NATIVE); + size += Token.serializer.serializedSize((Token) ab.left, version); + size += Token.serializer.serializedSize((Token) ab.right, version); } else { - size += RowPosition.serializer.serializedSize((RowPosition) ab.left, TypeSizes.NATIVE); - size += RowPosition.serializer.serializedSize((RowPosition) ab.right, TypeSizes.NATIVE); + size += RowPosition.serializer.serializedSize((RowPosition) ab.left, version); + size += RowPosition.serializer.serializedSize((RowPosition) ab.right, version); } return size; } diff --git a/src/java/org/apache/cassandra/dht/IPartitionerDependentSerializer.java b/src/java/org/apache/cassandra/dht/IPartitionerDependentSerializer.java new file mode 100644 index 000000000000..3a9a76810b90 --- /dev/null +++ b/src/java/org/apache/cassandra/dht/IPartitionerDependentSerializer.java @@ -0,0 +1,61 @@ +/* + * 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.dht; + +import java.io.DataInput; +import java.io.IOException; + +import org.apache.cassandra.io.util.DataOutputPlus; + +/** + * Versioned serializer where the serialization depends on partitioner. + * + * On serialization the partitioner is given by the entity being serialized. To deserialize the partitioner used must + * be known to the calling method. + */ +public interface IPartitionerDependentSerializer +{ + /** + * Serialize the specified type into the specified DataOutputStream instance. + * + * @param t type that needs to be serialized + * @param out DataOutput into which serialization needs to happen. + * @param version protocol version + * @throws java.io.IOException if serialization fails + */ + public void serialize(T t, DataOutputPlus out, int version) throws IOException; + + /** + * Deserialize into the specified DataInputStream instance. + * @param in DataInput from which deserialization needs to happen. + * @param p Partitioner that will be used to construct tokens. Needs to match the partitioner that was used to + * serialize the token. + * @param version protocol version + * @return the type that was deserialized + * @throws IOException if deserialization fails + */ + public T deserialize(DataInput in, IPartitioner p, int version) throws IOException; + + /** + * Calculate serialized size of object without actually serializing. + * @param t object to calculate serialized size + * @param version protocol version + * @return serialized size of object t + */ + public long serializedSize(T t, int version); +} diff --git a/src/java/org/apache/cassandra/dht/Token.java b/src/java/org/apache/cassandra/dht/Token.java index 719fd46b0373..76918a7c4e73 100644 --- a/src/java/org/apache/cassandra/dht/Token.java +++ b/src/java/org/apache/cassandra/dht/Token.java @@ -22,12 +22,10 @@ import java.io.Serializable; import java.nio.ByteBuffer; -import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.cassandra.db.TypeSizes; import org.apache.cassandra.db.RowPosition; -import org.apache.cassandra.io.ISerializer; +import org.apache.cassandra.db.TypeSizes; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.util.DataOutputPlus; -import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.ByteBufferUtil; public abstract class Token implements RingPosition, Serializable @@ -46,27 +44,26 @@ public static abstract class TokenFactory public abstract void validate(String token) throws ConfigurationException; } - public static class TokenSerializer implements ISerializer + public static class TokenSerializer implements IPartitionerDependentSerializer { - public void serialize(Token token, DataOutputPlus out) throws IOException + public void serialize(Token token, DataOutputPlus out, int version) throws IOException { - IPartitioner p = StorageService.getPartitioner(); + IPartitioner p = token.getPartitioner(); ByteBuffer b = p.getTokenFactory().toByteArray(token); ByteBufferUtil.writeWithLength(b, out); } - public Token deserialize(DataInput in) throws IOException + public Token deserialize(DataInput in, IPartitioner p, int version) throws IOException { - IPartitioner p = StorageService.getPartitioner(); int size = in.readInt(); byte[] bytes = new byte[size]; in.readFully(bytes); return p.getTokenFactory().fromByteArray(ByteBuffer.wrap(bytes)); } - public long serializedSize(Token object, TypeSizes typeSizes) + public long serializedSize(Token object, int version) { - IPartitioner p = StorageService.getPartitioner(); + IPartitioner p = object.getPartitioner(); ByteBuffer b = p.getTokenFactory().toByteArray(object); return TypeSizes.NATIVE.sizeof(b.remaining()) + b.remaining(); } diff --git a/src/java/org/apache/cassandra/net/MessagingService.java b/src/java/org/apache/cassandra/net/MessagingService.java index b33cf8157933..c333b0410956 100644 --- a/src/java/org/apache/cassandra/net/MessagingService.java +++ b/src/java/org/apache/cassandra/net/MessagingService.java @@ -35,6 +35,7 @@ import com.google.common.collect.Lists; import org.cliffc.high_scale_lib.NonBlockingHashMap; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -45,7 +46,9 @@ import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.config.EncryptionOptions.ServerEncryptionOptions; import org.apache.cassandra.db.*; +import org.apache.cassandra.dht.AbstractBounds; import org.apache.cassandra.dht.BootStrapper; +import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.gms.EchoMessage; import org.apache.cassandra.gms.GossipDigestAck; @@ -1039,4 +1042,15 @@ public Map getTimeoutsPerHost() } return result; } + + public static IPartitioner globalPartitioner() + { + return DatabaseDescriptor.getPartitioner(); + } + + public static void validatePartitioner(AbstractBounds bounds) + { + if (globalPartitioner() != bounds.left.getPartitioner()) + throw new AssertionError(); + } } diff --git a/src/java/org/apache/cassandra/repair/RepairJobDesc.java b/src/java/org/apache/cassandra/repair/RepairJobDesc.java index 5ce596903610..c4a713d866a2 100644 --- a/src/java/org/apache/cassandra/repair/RepairJobDesc.java +++ b/src/java/org/apache/cassandra/repair/RepairJobDesc.java @@ -100,6 +100,7 @@ public void serialize(RepairJobDesc desc, DataOutputPlus out, int version) throw UUIDSerializer.serializer.serialize(desc.sessionId, out, version); out.writeUTF(desc.keyspace); out.writeUTF(desc.columnFamily); + MessagingService.validatePartitioner(desc.range); AbstractBounds.serializer.serialize(desc.range, out, version); } @@ -114,7 +115,7 @@ public RepairJobDesc deserialize(DataInput in, int version) throws IOException UUID sessionId = UUIDSerializer.serializer.deserialize(in, version); String keyspace = in.readUTF(); String columnFamily = in.readUTF(); - Range range = (Range)AbstractBounds.serializer.deserialize(in, version); + Range range = (Range)AbstractBounds.serializer.deserialize(in, MessagingService.globalPartitioner(), version).toTokenBounds(); return new RepairJobDesc(parentSessionId, sessionId, keyspace, columnFamily, range); } diff --git a/src/java/org/apache/cassandra/repair/messages/AnticompactionRequest.java b/src/java/org/apache/cassandra/repair/messages/AnticompactionRequest.java index 239ab0e7a9e9..455e5fbe07c3 100644 --- a/src/java/org/apache/cassandra/repair/messages/AnticompactionRequest.java +++ b/src/java/org/apache/cassandra/repair/messages/AnticompactionRequest.java @@ -27,6 +27,7 @@ import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; import org.apache.cassandra.io.util.DataOutputPlus; +import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.utils.UUIDSerializer; public class AnticompactionRequest extends RepairMessage @@ -51,8 +52,11 @@ public void serialize(AnticompactionRequest message, DataOutputPlus out, int ver { UUIDSerializer.serializer.serialize(message.parentRepairSession, out, version); out.writeInt(message.successfulRanges.size()); - for (Range r : message.successfulRanges) + for (Range r : message.successfulRanges) + { + MessagingService.validatePartitioner(r); Range.serializer.serialize(r, out, version); + } } public AnticompactionRequest deserialize(DataInput in, int version) throws IOException @@ -61,14 +65,14 @@ public AnticompactionRequest deserialize(DataInput in, int version) throws IOExc int rangeCount = in.readInt(); List> ranges = new ArrayList<>(rangeCount); for (int i = 0; i < rangeCount; i++) - ranges.add((Range) Range.serializer.deserialize(in, version).toTokenBounds()); + ranges.add((Range) Range.serializer.deserialize(in, MessagingService.globalPartitioner(), version).toTokenBounds()); return new AnticompactionRequest(parentRepairSession, ranges); } public long serializedSize(AnticompactionRequest message, int version) { long size = UUIDSerializer.serializer.serializedSize(message.parentRepairSession, version); - for (Range r : message.successfulRanges) + for (Range r : message.successfulRanges) size += Range.serializer.serializedSize(r, version); return size; } diff --git a/src/java/org/apache/cassandra/repair/messages/PrepareMessage.java b/src/java/org/apache/cassandra/repair/messages/PrepareMessage.java index 035ccc4f45b1..d63bf70936ac 100644 --- a/src/java/org/apache/cassandra/repair/messages/PrepareMessage.java +++ b/src/java/org/apache/cassandra/repair/messages/PrepareMessage.java @@ -28,6 +28,7 @@ import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; import org.apache.cassandra.io.util.DataOutputPlus; +import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.utils.UUIDSerializer; @@ -58,8 +59,11 @@ public void serialize(PrepareMessage message, DataOutputPlus out, int version) t UUIDSerializer.serializer.serialize(cfId, out, version); UUIDSerializer.serializer.serialize(message.parentRepairSession, out, version); out.writeInt(message.ranges.size()); - for (Range r : message.ranges) + for (Range r : message.ranges) + { + MessagingService.validatePartitioner(r); Range.serializer.serialize(r, out, version); + } out.writeBoolean(message.isIncremental); } @@ -73,7 +77,7 @@ public PrepareMessage deserialize(DataInput in, int version) throws IOException int rangeCount = in.readInt(); List> ranges = new ArrayList<>(rangeCount); for (int i = 0; i < rangeCount; i++) - ranges.add((Range) Range.serializer.deserialize(in, version).toTokenBounds()); + ranges.add((Range) Range.serializer.deserialize(in, MessagingService.globalPartitioner(), version).toTokenBounds()); boolean isIncremental = in.readBoolean(); return new PrepareMessage(parentRepairSession, cfIds, ranges, isIncremental); } diff --git a/src/java/org/apache/cassandra/repair/messages/RepairMessage.java b/src/java/org/apache/cassandra/repair/messages/RepairMessage.java index d500928ee12f..6af3bb3e62ae 100644 --- a/src/java/org/apache/cassandra/repair/messages/RepairMessage.java +++ b/src/java/org/apache/cassandra/repair/messages/RepairMessage.java @@ -81,7 +81,7 @@ public MessageOut createMessage() return new MessageOut<>(MessagingService.Verb.REPAIR_MESSAGE, this, RepairMessage.serializer); } - public static class RepairMessageSerializer implements IVersionedSerializer + public static class RepairMessageSerializer implements MessageSerializer { public void serialize(RepairMessage message, DataOutputPlus out, int version) throws IOException { diff --git a/src/java/org/apache/cassandra/repair/messages/SyncRequest.java b/src/java/org/apache/cassandra/repair/messages/SyncRequest.java index c4d0ab69062f..077132a23751 100644 --- a/src/java/org/apache/cassandra/repair/messages/SyncRequest.java +++ b/src/java/org/apache/cassandra/repair/messages/SyncRequest.java @@ -30,6 +30,7 @@ import org.apache.cassandra.dht.Token; import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.net.CompactEndpointSerializationHelper; +import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.repair.RepairJobDesc; /** @@ -66,7 +67,10 @@ public void serialize(SyncRequest message, DataOutputPlus out, int version) thro CompactEndpointSerializationHelper.serialize(message.dst, out); out.writeInt(message.ranges.size()); for (Range range : message.ranges) + { + MessagingService.validatePartitioner(range); AbstractBounds.serializer.serialize(range, out, version); + } } public SyncRequest deserialize(DataInput in, int version) throws IOException @@ -78,7 +82,7 @@ public SyncRequest deserialize(DataInput in, int version) throws IOException int rangesCount = in.readInt(); List> ranges = new ArrayList<>(rangesCount); for (int i = 0; i < rangesCount; ++i) - ranges.add((Range) AbstractBounds.serializer.deserialize(in, version).toTokenBounds()); + ranges.add((Range) AbstractBounds.serializer.deserialize(in, MessagingService.globalPartitioner(), version).toTokenBounds()); return new SyncRequest(desc, owner, src, dst, ranges); } diff --git a/src/java/org/apache/cassandra/streaming/StreamRequest.java b/src/java/org/apache/cassandra/streaming/StreamRequest.java index 9c5b974ee12b..0fe40cfb6545 100644 --- a/src/java/org/apache/cassandra/streaming/StreamRequest.java +++ b/src/java/org/apache/cassandra/streaming/StreamRequest.java @@ -29,6 +29,7 @@ import org.apache.cassandra.dht.Token; import org.apache.cassandra.io.IVersionedSerializer; import org.apache.cassandra.io.util.DataOutputPlus; +import org.apache.cassandra.net.MessagingService; public class StreamRequest { @@ -55,8 +56,9 @@ public void serialize(StreamRequest request, DataOutputPlus out, int version) th out.writeInt(request.ranges.size()); for (Range range : request.ranges) { - Token.serializer.serialize(range.left, out); - Token.serializer.serialize(range.right, out); + MessagingService.validatePartitioner(range); + Token.serializer.serialize(range.left, out, version); + Token.serializer.serialize(range.right, out, version); } out.writeInt(request.columnFamilies.size()); for (String cf : request.columnFamilies) @@ -71,8 +73,8 @@ public StreamRequest deserialize(DataInput in, int version) throws IOException List> ranges = new ArrayList<>(rangeCount); for (int i = 0; i < rangeCount; i++) { - Token left = Token.serializer.deserialize(in); - Token right = Token.serializer.deserialize(in); + Token left = Token.serializer.deserialize(in, MessagingService.globalPartitioner(), version); + Token right = Token.serializer.deserialize(in, MessagingService.globalPartitioner(), version); ranges.add(new Range<>(left, right)); } int cfCount = in.readInt(); @@ -89,8 +91,8 @@ public long serializedSize(StreamRequest request, int version) size += TypeSizes.NATIVE.sizeof(request.ranges.size()); for (Range range : request.ranges) { - size += Token.serializer.serializedSize(range.left, TypeSizes.NATIVE); - size += Token.serializer.serializedSize(range.right, TypeSizes.NATIVE); + size += Token.serializer.serializedSize(range.left, version); + size += Token.serializer.serializedSize(range.right, version); } size += TypeSizes.NATIVE.sizeof(request.columnFamilies.size()); for (String cf : request.columnFamilies) diff --git a/src/java/org/apache/cassandra/utils/MerkleTree.java b/src/java/org/apache/cassandra/utils/MerkleTree.java index 394b12a0ae69..4fec62df824d 100644 --- a/src/java/org/apache/cassandra/utils/MerkleTree.java +++ b/src/java/org/apache/cassandra/utils/MerkleTree.java @@ -28,6 +28,7 @@ import org.apache.cassandra.db.TypeSizes; import org.apache.cassandra.dht.IPartitioner; +import org.apache.cassandra.dht.IPartitionerDependentSerializer; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; import org.apache.cassandra.exceptions.ConfigurationException; @@ -85,8 +86,8 @@ public void serialize(MerkleTree mt, DataOutputPlus out, int version) throws IOE out.writeLong(mt.size); out.writeUTF(mt.partitioner.getClass().getCanonicalName()); // full range - Token.serializer.serialize(mt.fullRange.left, out); - Token.serializer.serialize(mt.fullRange.right, out); + Token.serializer.serialize(mt.fullRange.left, out, version); + Token.serializer.serialize(mt.fullRange.right, out, version); Hashable.serializer.serialize(mt.root, out, version); } @@ -106,13 +107,13 @@ public MerkleTree deserialize(DataInput in, int version) throws IOException } // full range - Token left = Token.serializer.deserialize(in); - Token right = Token.serializer.deserialize(in); + Token left = Token.serializer.deserialize(in, partitioner, version); + Token right = Token.serializer.deserialize(in, partitioner, version); Range fullRange = new Range<>(left, right); MerkleTree mt = new MerkleTree(partitioner, fullRange, hashdepth, maxsize); mt.size = size; - mt.root = Hashable.serializer.deserialize(in, version); + mt.root = Hashable.serializer.deserialize(in, partitioner, version); return mt; } @@ -124,8 +125,8 @@ public long serializedSize(MerkleTree mt, int version) + TypeSizes.NATIVE.sizeof(mt.partitioner.getClass().getCanonicalName()); // full range - size += Token.serializer.serializedSize(mt.fullRange.left, TypeSizes.NATIVE); - size += Token.serializer.serializedSize(mt.fullRange.right, TypeSizes.NATIVE); + size += Token.serializer.serializedSize(mt.fullRange.left, version); + size += Token.serializer.serializedSize(mt.fullRange.right, version); size += Hashable.serializer.serializedSize(mt.root, version); return size; @@ -811,7 +812,7 @@ public String toString() return buff.toString(); } - private static class InnerSerializer implements IVersionedSerializer + private static class InnerSerializer implements IPartitionerDependentSerializer { public void serialize(Inner inner, DataOutputPlus out, int version) throws IOException { @@ -822,20 +823,20 @@ public void serialize(Inner inner, DataOutputPlus out, int version) throws IOExc out.writeInt(inner.hash.length); out.write(inner.hash); } - Token.serializer.serialize(inner.token, out); + Token.serializer.serialize(inner.token, out, version); Hashable.serializer.serialize(inner.lchild, out, version); Hashable.serializer.serialize(inner.rchild, out, version); } - public Inner deserialize(DataInput in, int version) throws IOException + public Inner deserialize(DataInput in, IPartitioner p, int version) throws IOException { int hashLen = in.readInt(); byte[] hash = hashLen >= 0 ? new byte[hashLen] : null; if (hash != null) in.readFully(hash); - Token token = Token.serializer.deserialize(in); - Hashable lchild = Hashable.serializer.deserialize(in, version); - Hashable rchild = Hashable.serializer.deserialize(in, version); + Token token = Token.serializer.deserialize(in, p, version); + Hashable lchild = Hashable.serializer.deserialize(in, p, version); + Hashable rchild = Hashable.serializer.deserialize(in, p, version); return new Inner(token, lchild, rchild); } @@ -845,7 +846,7 @@ public long serializedSize(Inner inner, int version) ? TypeSizes.NATIVE.sizeof(-1) : TypeSizes.NATIVE.sizeof(inner.hash().length) + inner.hash().length; - size += Token.serializer.serializedSize(inner.token, TypeSizes.NATIVE) + size += Token.serializer.serializedSize(inner.token, version) + Hashable.serializer.serializedSize(inner.lchild, version) + Hashable.serializer.serializedSize(inner.rchild, version); return size; @@ -892,7 +893,7 @@ public String toString() return "#"; } - private static class LeafSerializer implements IVersionedSerializer + private static class LeafSerializer implements IPartitionerDependentSerializer { public void serialize(Leaf leaf, DataOutputPlus out, int version) throws IOException { @@ -907,7 +908,7 @@ public void serialize(Leaf leaf, DataOutputPlus out, int version) throws IOExcep } } - public Leaf deserialize(DataInput in, int version) throws IOException + public Leaf deserialize(DataInput in, IPartitioner p, int version) throws IOException { int hashLen = in.readInt(); byte[] hash = hashLen < 0 ? null : new byte[hashLen]; @@ -955,7 +956,7 @@ public String toString() static abstract class Hashable implements Serializable { private static final long serialVersionUID = 1L; - private static final IVersionedSerializer serializer = new HashableSerializer(); + private static final IPartitionerDependentSerializer serializer = new HashableSerializer(); protected byte[] hash; protected long sizeOfRange; @@ -1033,7 +1034,7 @@ public static String toString(byte[] hash) return "[" + Hex.bytesToHex(hash) + "]"; } - private static class HashableSerializer implements IVersionedSerializer + private static class HashableSerializer implements IPartitionerDependentSerializer { public void serialize(Hashable h, DataOutputPlus out, int version) throws IOException { @@ -1051,13 +1052,13 @@ else if (h instanceof Leaf) throw new IOException("Unexpected Hashable: " + h.getClass().getCanonicalName()); } - public Hashable deserialize(DataInput in, int version) throws IOException + public Hashable deserialize(DataInput in, IPartitioner p, int version) throws IOException { byte ident = in.readByte(); if (Inner.IDENT == ident) - return Inner.serializer.deserialize(in, version); + return Inner.serializer.deserialize(in, p, version); else if (Leaf.IDENT == ident) - return Leaf.serializer.deserialize(in, version); + return Leaf.serializer.deserialize(in, p, version); else throw new IOException("Unexpected Hashable: " + ident); } From 24a189ca6d2279f67ce88c28aeee5a2683ff8fbb Mon Sep 17 00:00:00 2001 From: Joshua McKenzie Date: Fri, 30 Jan 2015 11:52:17 -0600 Subject: [PATCH 263/557] Fix version check on CommitLogArchiver restore Patch by jmckenzie; reviewed by Sam Tunnicliffe for CASSANDRA-8293 --- .../org/apache/cassandra/db/commitlog/CommitLogArchiver.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogArchiver.java b/src/java/org/apache/cassandra/db/commitlog/CommitLogArchiver.java index 6cba60377300..26468d4a3a9a 100644 --- a/src/java/org/apache/cassandra/db/commitlog/CommitLogArchiver.java +++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogArchiver.java @@ -211,7 +211,7 @@ else if (fromHeader != null) descriptor = fromHeader; else descriptor = fromName; - if (descriptor.version > CommitLogDescriptor.VERSION_21) + if (descriptor.version > CommitLogDescriptor.VERSION_30) throw new IllegalStateException("Unsupported commit log version: " + descriptor.version); File toFile = new File(DatabaseDescriptor.getCommitLogLocation(), descriptor.fileName()); From 2e4ad069d552167d0fc06d39bc8d622573f14792 Mon Sep 17 00:00:00 2001 From: Benjamin Lerer Date: Fri, 30 Jan 2015 19:05:35 +0100 Subject: [PATCH 264/557] Generalize IN to compound partition keys patch by blerer; reviewed by beobal for CASSANDRA-7855 --- CHANGES.txt | 1 + .../cassandra/cql3/SingleColumnRelation.java | 20 +----------- .../cql3/SingleColumnRelationTest.java | 31 +++++++++++++++++-- 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index fd3510c4fdbe..c7c943489c39 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -33,6 +33,7 @@ * Remove cassandra-cli (CASSANDRA-7920) * Accept dollar quoted strings in CQL (CASSANDRA-7769) * Make assassinate a first class command (CASSANDRA-7935) + * Support IN clause on any partition key column (CASSANDRA-7855) * Support IN clause on any clustering column (CASSANDRA-4762) * Improve compaction logging (CASSANDRA-7818) * Remove YamlFileNetworkTopologySnitch (CASSANDRA-7917) diff --git a/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java b/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java index 3db1195c2b37..78b4d5ddb065 100644 --- a/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java +++ b/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java @@ -203,11 +203,6 @@ private List toReceivers(CFMetaData cfm, ColumnDe if (isIN()) { - // For partition keys we only support IN for the last name so far - checkFalse(columnDef.isPartitionKey() && !isLastPartitionKey(cfm, columnDef), - "Partition KEY part %s cannot be restricted by IN relation (only the last part of the partition key can)", - columnDef.name); - // We only allow IN on the row key and the clustering key so far, never on non-PK columns, and this even if // there's an index // Note: for backward compatibility reason, we conside a IN of 1 value the same as a EQ, so we let that @@ -262,7 +257,7 @@ else if (receiver.type.isMultiCell() && mapKey != null && isEQ()) return Collections.singletonList(receiver); } - private ColumnSpecification makeCollectionReceiver(ColumnSpecification receiver, boolean forKey) + private static ColumnSpecification makeCollectionReceiver(ColumnSpecification receiver, boolean forKey) { return ((CollectionType) receiver.type).makeCollectionReceiver(receiver, forKey); } @@ -277,19 +272,6 @@ private boolean isMapEntryEquality() return mapKey != null && isEQ(); } - /** - * Checks if the specified column is the last column of the partition key. - * - * @param cfm the column family meta data - * @param columnDef the column to check - * @return true if the specified column is the last column of the partition key, false - * otherwise. - */ - private static boolean isLastPartitionKey(CFMetaData cfm, ColumnDefinition columnDef) - { - return columnDef.position() == cfm.partitionKeyColumns().size() - 1; - } - private boolean canHaveOnlyOneValue() { return isEQ() || (isIN() && inValues != null && inValues.size() == 1); diff --git a/test/unit/org/apache/cassandra/cql3/SingleColumnRelationTest.java b/test/unit/org/apache/cassandra/cql3/SingleColumnRelationTest.java index f505a04d6481..4e4cc50d7f86 100644 --- a/test/unit/org/apache/cassandra/cql3/SingleColumnRelationTest.java +++ b/test/unit/org/apache/cassandra/cql3/SingleColumnRelationTest.java @@ -175,18 +175,43 @@ public void testPartitionKeyColumnRelations() throws Throwable execute("insert into %s (a, b, c, d) values (?, ?, ?, ?)", "first", 1, 1, 1); execute("insert into %s (a, b, c, d) values (?, ?, ?, ?)", "first", 2, 2, 2); execute("insert into %s (a, b, c, d) values (?, ?, ?, ?)", "first", 3, 3, 3); + execute("insert into %s (a, b, c, d) values (?, ?, ?, ?)", "first", 4, 4, 4); + execute("insert into %s (a, b, c, d) values (?, ?, ?, ?)", "second", 1, 1, 1); execute("insert into %s (a, b, c, d) values (?, ?, ?, ?)", "second", 4, 4, 4); - assertInvalidMessage("Partition KEY part a cannot be restricted by IN relation (only the last part of the partition key can)", + assertRows(execute("select * from %s where a = ? and b = ?", "first", 2), + row("first", 2, 2, 2)); + + assertRows(execute("select * from %s where a in (?, ?) and b in (?, ?)", "first", "second", 2, 3), + row("first", 2, 2, 2), + row("first", 3, 3, 3)); + + assertRows(execute("select * from %s where a in (?, ?) and b = ?", "first", "second", 4), + row("first", 4, 4, 4), + row("second", 4, 4, 4)); + + assertRows(execute("select * from %s where a = ? and b in (?, ?)", "first", 3, 4), + row("first", 3, 3, 3), + row("first", 4, 4, 4)); + + assertRows(execute("select * from %s where a in (?, ?) and b in (?, ?)", "first", "second", 1, 4), + row("first", 1, 1, 1), + row("first", 4, 4, 4), + row("second", 1, 1, 1), + row("second", 4, 4, 4)); + + assertInvalidMessage("Partition key parts: b must be restricted as other parts are", "select * from %s where a in (?, ?)", "first", "second"); - assertInvalidMessage("Partition KEY part a cannot be restricted by IN relation (only the last part of the partition key can)", - "select * from %s where a in (?, ?) and b in (?, ?)", "first", "second", 2, 3); assertInvalidMessage("Partition key parts: b must be restricted as other parts are", "select * from %s where a = ?", "first"); assertInvalidMessage("b cannot be restricted by more than one relation if it includes a IN", "select * from %s where a = ? AND b IN (?, ?) AND b = ?", "first", 2, 2, 3); assertInvalidMessage("b cannot be restricted by more than one relation if it includes an Equal", "select * from %s where a = ? AND b = ? AND b IN (?, ?)", "first", 2, 2, 3); + assertInvalidMessage("a cannot be restricted by more than one relation if it includes a IN", + "select * from %s where a IN (?, ?) AND a = ? AND b = ?", "first", "second", "first", 3); + assertInvalidMessage("a cannot be restricted by more than one relation if it includes an Equal", + "select * from %s where a = ? AND a IN (?, ?) AND b IN (?, ?)", "first", "second", "first", 2, 3); } @Test From 97d7d139f2b8d81355a3e0de33be7b9fa61fb075 Mon Sep 17 00:00:00 2001 From: Robert Stupp Date: Sat, 31 Jan 2015 18:47:02 +0100 Subject: [PATCH 265/557] row cache: remove annoying classpath from "jemalloc not found" message Patch by Robert Stupp; Reviewed by Aleksey Yeschenko --- build.xml | 2 +- lib/licenses/{ohc-0.3.1.txt => ohc-0.3.2.txt} | 0 ...{ohc-core-0.3.1.jar => ohc-core-0.3.2.jar} | Bin 143623 -> 148339 bytes lib/ohc-core-j8-0.3.1.jar | Bin 5026 -> 0 bytes lib/ohc-core-j8-0.3.2.jar | Bin 0 -> 5079 bytes 5 files changed, 1 insertion(+), 1 deletion(-) rename lib/licenses/{ohc-0.3.1.txt => ohc-0.3.2.txt} (100%) rename lib/{ohc-core-0.3.1.jar => ohc-core-0.3.2.jar} (52%) delete mode 100644 lib/ohc-core-j8-0.3.1.jar create mode 100644 lib/ohc-core-j8-0.3.2.jar diff --git a/build.xml b/build.xml index 5c09dad63af4..646169445a4d 100644 --- a/build.xml +++ b/build.xml @@ -377,7 +377,7 @@ - + diff --git a/lib/licenses/ohc-0.3.1.txt b/lib/licenses/ohc-0.3.2.txt similarity index 100% rename from lib/licenses/ohc-0.3.1.txt rename to lib/licenses/ohc-0.3.2.txt diff --git a/lib/ohc-core-0.3.1.jar b/lib/ohc-core-0.3.2.jar similarity index 52% rename from lib/ohc-core-0.3.1.jar rename to lib/ohc-core-0.3.2.jar index a6d2c9c2b354aa2686493ce9f1eb400b2b762771..c9ef6a13ac3ca6cfbe3b97dda886eb242db3c5eb 100644 GIT binary patch delta 63873 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

    oEnEPhwSBrW6wmee{>v{GrJk%=JAe@NC$o^w)n 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 ZhXop|0%XLOV3%O+Owgi)1R5CZ{{VGM62<@k diff --git a/lib/ohc-core-j8-0.3.1.jar b/lib/ohc-core-j8-0.3.1.jar deleted file mode 100644 index efe76821e53cb0bbca9000302907b6390daaed7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5026 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 Date: Tue, 3 Feb 2015 20:34:31 +0100 Subject: [PATCH 266/557] Post-fix TimeoutExceptions during unit tests Patch by Robert Stupp; Reviewed by Joshua McKenzie for CASSANDRA-8308 --- .../db/commitlog/CommitLogSegmentManager.java | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentManager.java b/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentManager.java index 3f7e79384f23..e184640c1a00 100644 --- a/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentManager.java +++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentManager.java @@ -93,10 +93,15 @@ public class CommitLogSegmentManager */ private volatile boolean createReserveSegments = false; - private final Thread managerThread; + private Thread managerThread; private volatile boolean run = true; public CommitLogSegmentManager() + { + start(); + } + + private void start() { // The run loop for the manager thread Runnable runnable = new WrappedRunnable() @@ -169,6 +174,8 @@ public void runMayThrow() throws Exception } }; + run = true; + managerThread = new Thread(runnable, "COMMIT-LOG-ALLOCATOR"); managerThread.start(); } @@ -453,9 +460,10 @@ private boolean isCapExceeded() private long unusedCapacity() { + long total = DatabaseDescriptor.getTotalCommitlogSpaceInMB() * 1024 * 1024; long currentSize = size.get(); - logger.debug("Total active commitlog segment space used is {}", currentSize); - return DatabaseDescriptor.getTotalCommitlogSpaceInMB() * 1024 * 1024 - currentSize; + logger.debug("Total active commitlog segment space used is {} out of {}", currentSize, total); + return total - currentSize; } /** @@ -518,6 +526,16 @@ public void resetUnsafe() while (!segmentManagementTasks.isEmpty()) Thread.yield(); + shutdown(); + try + { + awaitTermination(); + } + catch (InterruptedException e) + { + throw new RuntimeException(e); + } + for (CommitLogSegment segment : activeSegments) segment.close(); activeSegments.clear(); @@ -527,6 +545,14 @@ public void resetUnsafe() availableSegments.clear(); allocatingFrom = null; + + size.set(0L); + + logger.debug("Done with closing and clearing existing commit log segments."); + + start(); + + wakeManager(); } /** From 0fa19b7ce791701231f888902ad7d981c17cb9f4 Mon Sep 17 00:00:00 2001 From: Robert Stupp Date: Thu, 5 Feb 2015 08:19:47 +0100 Subject: [PATCH 267/557] Post-fix TimeoutExceptions during unit tests Patch by Robert Stupp; Reviewed by Joshua McKenzie for CASSANDRA-8308 --- .../db/commitlog/CommitLogSegmentManager.java | 15 +++++++++++++++ test/unit/org/apache/cassandra/SchemaLoader.java | 4 ++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentManager.java b/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentManager.java index e184640c1a00..a897f758d7b7 100644 --- a/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentManager.java +++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentManager.java @@ -520,6 +520,15 @@ else if (!flushes.containsKey(dirtyCFId)) * Resets all the segments, for testing purposes. DO NOT USE THIS OUTSIDE OF TESTS. */ public void resetUnsafe() + { + stopUnsafe(); + startUnsafe(); + } + + /** + * Stops CL, for testing purposes. DO NOT USE THIS OUTSIDE OF TESTS. + */ + public void stopUnsafe() { logger.debug("Closing and clearing existing commit log segments..."); @@ -549,7 +558,13 @@ public void resetUnsafe() size.set(0L); logger.debug("Done with closing and clearing existing commit log segments."); + } + /** + * Starts CL, for testing purposes. DO NOT USE THIS OUTSIDE OF TESTS. + */ + public void startUnsafe() + { start(); wakeManager(); diff --git a/test/unit/org/apache/cassandra/SchemaLoader.java b/test/unit/org/apache/cassandra/SchemaLoader.java index 60f470378286..98cabe25a40c 100644 --- a/test/unit/org/apache/cassandra/SchemaLoader.java +++ b/test/unit/org/apache/cassandra/SchemaLoader.java @@ -429,11 +429,11 @@ public static CFMetaData jdbcSparseCFMD(String ksName, String cfName, AbstractTy public static void cleanupAndLeaveDirs() { - CommitLog.instance.resetUnsafe(); // unmap CLS before attempting to delete or Windows complains + CommitLog.instance.allocator.stopUnsafe(); // unmap CLS before attempting to delete or Windows complains mkdirs(); cleanup(); mkdirs(); - CommitLog.instance.resetUnsafe(); // cleanup screws w/ CommitLog, this brings it back to safe state + CommitLog.instance.allocator.startUnsafe(); // cleanup screws w/ CommitLog, this brings it back to safe state } public static void cleanup() From 49f1a629d0c79c5aa7bda1b8aadbde343e52ecb6 Mon Sep 17 00:00:00 2001 From: Aleksey Yeschenko Date: Thu, 5 Feb 2015 16:34:21 +0300 Subject: [PATCH 268/557] Follow-up merge fix --- src/java/org/apache/cassandra/db/SizeEstimatesRecorder.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/cassandra/db/SizeEstimatesRecorder.java b/src/java/org/apache/cassandra/db/SizeEstimatesRecorder.java index dea5467ac523..1b30db31ac74 100644 --- a/src/java/org/apache/cassandra/db/SizeEstimatesRecorder.java +++ b/src/java/org/apache/cassandra/db/SizeEstimatesRecorder.java @@ -75,7 +75,10 @@ private void recordSizeEstimates(ColumnFamilyStore table, Collection sstables = null; Refs refs = null; while (refs == null) - refs = Refs.tryRef(table.viewFilter(range.toRowBounds()).apply(table.getDataTracker().getView())); + { + sstables = table.viewFilter(range.toRowBounds()).apply(table.getDataTracker().getView()); + refs = Refs.tryRef(sstables); + } long partitionsCount, meanPartitionSize; try From 217721ae95ce1a48d9cedbb8de8f3eb76c77d88c Mon Sep 17 00:00:00 2001 From: Sam Tunnicliffe Date: Tue, 3 Feb 2015 11:56:04 +0000 Subject: [PATCH 269/557] Add new Role management permissions patch by Sam Tunnicliffe; reviewed by Aleksey Yeschenko for CASSANDRA-8650 --- CHANGES.txt | 2 +- NEWS.txt | 4 + pylib/cqlshlib/cql3handling.py | 8 +- .../cassandra/auth/AllowAllAuthorizer.java | 10 +- .../cassandra/auth/AuthMigrationListener.java | 4 +- .../cassandra/auth/AuthenticatedUser.java | 38 ++-- .../cassandra/auth/CassandraAuthorizer.java | 92 +++++---- .../cassandra/auth/CassandraRoleManager.java | 90 +++++---- .../apache/cassandra/auth/DataResource.java | 32 ++- .../apache/cassandra/auth/IAuthorizer.java | 20 +- .../org/apache/cassandra/auth/IResource.java | 15 ++ .../apache/cassandra/auth/IRoleManager.java | 42 ++-- .../org/apache/cassandra/auth/Permission.java | 31 +-- .../org/apache/cassandra/auth/Resources.java | 17 ++ .../apache/cassandra/auth/RoleResource.java | 185 ++++++++++++++++++ src/java/org/apache/cassandra/cql3/Cql.g | 43 ++-- .../org/apache/cassandra/cql3/RoleName.java | 5 + .../cql3/statements/AlterRoleStatement.java | 21 +- .../statements/AuthenticationStatement.java | 41 +++- .../statements/AuthorizationStatement.java | 15 +- .../cql3/statements/CreateRoleStatement.java | 21 +- .../cql3/statements/DropRoleStatement.java | 28 +-- ...nt.java => GrantPermissionsStatement.java} | 6 +- .../statements/ListPermissionsStatement.java | 8 +- .../cql3/statements/ListRolesStatement.java | 30 +-- .../cql3/statements/ListUsersStatement.java | 7 +- ...va => PermissionsManagementStatement.java} | 15 +- ...t.java => RevokePermissionsStatement.java} | 6 +- .../cql3/statements/RevokeRoleStatement.java | 1 - .../statements/RoleManagementStatement.java | 21 +- .../apache/cassandra/service/ClientState.java | 2 +- 31 files changed, 623 insertions(+), 237 deletions(-) create mode 100644 src/java/org/apache/cassandra/auth/RoleResource.java rename src/java/org/apache/cassandra/cql3/statements/{GrantStatement.java => GrantPermissionsStatement.java} (87%) rename src/java/org/apache/cassandra/cql3/statements/{PermissionAlteringStatement.java => PermissionsManagementStatement.java} (84%) rename src/java/org/apache/cassandra/cql3/statements/{RevokeStatement.java => RevokePermissionsStatement.java} (87%) diff --git a/CHANGES.txt b/CHANGES.txt index 0aba61ac1810..c44d28470745 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0 + * Add role based access control (CASSANDRA-7653, 8650) * Avoid accessing partitioner through StorageProxy (CASSANDRA-8244, 8268) * Upgrade Metrics library and remove depricated metrics (CASSANDRA-5657) * Serializing Row cache alternative, fully off heap (CASSANDRA-7438) @@ -6,7 +7,6 @@ * Make CassandraException unchecked, extend RuntimeException (CASSANDRA-8560) * Support direct buffer decompression for reads (CASSANDRA-8464) * DirectByteBuffer compatible LZ4 methods (CASSANDRA-7039) - * Add role based access control (CASSANDRA-7653) * Group sstables for anticompaction correctly (CASSANDRA-8578) * Add ReadFailureException to native protocol, respond immediately when replicas encounter errors while handling diff --git a/NEWS.txt b/NEWS.txt index a4391b979dcd..00afc7e09796 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -26,6 +26,10 @@ New features even when auth is handled by an external system has been removed, so authentication & authorization can be delegated to such systems in their entirety. + - In addition to the above, Roles are also first class resources and can be the + subject of permissions. Users (roles) can now be granted permissions on other + roles, including CREATE, ALTER, DROP & AUTHORIZE, which removesthe need for + superuser privileges in order to perform user/role management operations. - SSTable file name is changed. Now you don't have Keyspace/CF name in file name. Also, secondary index has its own directory under parent's directory. diff --git a/pylib/cqlshlib/cql3handling.py b/pylib/cqlshlib/cql3handling.py index ae2d50ab186e..930f2688f953 100644 --- a/pylib/cqlshlib/cql3handling.py +++ b/pylib/cqlshlib/cql3handling.py @@ -1210,7 +1210,7 @@ def alter_type_field_completer(ctxt, cass): ''' syntax_rules += r''' - ::= "GRANT" "ON" "TO" + ::= "GRANT" "ON" "TO" ; ::= "REVOKE" "ON" "FROM" @@ -1226,6 +1226,7 @@ def alter_type_field_completer(ctxt, cass): | "DROP" | "SELECT" | "MODIFY" + | "DESCRIBE" ; ::= ( "PERMISSION"? ) @@ -1233,12 +1234,17 @@ def alter_type_field_completer(ctxt, cass): ; ::= + | ; ::= ( "ALL" "KEYSPACES" ) | ( "KEYSPACE" ) | ( "TABLE"? ) ; + + ::= ("ALL" "ROLES") + | ("ROLE" ) + ; ''' @completer_for('username', 'name') diff --git a/src/java/org/apache/cassandra/auth/AllowAllAuthorizer.java b/src/java/org/apache/cassandra/auth/AllowAllAuthorizer.java index 04b4b52dc3c7..7a60a147019b 100644 --- a/src/java/org/apache/cassandra/auth/AllowAllAuthorizer.java +++ b/src/java/org/apache/cassandra/auth/AllowAllAuthorizer.java @@ -29,27 +29,27 @@ public Set authorize(AuthenticatedUser user, IResource resource) return Permission.ALL; } - public void grant(AuthenticatedUser performer, Set permissions, IResource resource, String to) + public void grant(AuthenticatedUser performer, Set permissions, IResource resource, RoleResource to) throws InvalidRequestException { throw new InvalidRequestException("GRANT operation is not supported by AllowAllAuthorizer"); } - public void revoke(AuthenticatedUser performer, Set permissions, IResource resource, String from) + public void revoke(AuthenticatedUser performer, Set permissions, IResource resource, RoleResource from) throws InvalidRequestException { throw new InvalidRequestException("REVOKE operation is not supported by AllowAllAuthorizer"); } - public void revokeAll(String droppedUser) + public void revokeAllFrom(RoleResource droppedRole) { } - public void revokeAll(IResource droppedResource) + public void revokeAllOn(IResource droppedResource) { } - public Set list(AuthenticatedUser performer, Set permissions, IResource resource, String of) + public Set list(AuthenticatedUser performer, Set permissions, IResource resource, RoleResource of) throws InvalidRequestException { throw new InvalidRequestException("LIST PERMISSIONS operation is not supported by AllowAllAuthorizer"); diff --git a/src/java/org/apache/cassandra/auth/AuthMigrationListener.java b/src/java/org/apache/cassandra/auth/AuthMigrationListener.java index 1d609c46e14a..f990becb35ca 100644 --- a/src/java/org/apache/cassandra/auth/AuthMigrationListener.java +++ b/src/java/org/apache/cassandra/auth/AuthMigrationListener.java @@ -27,11 +27,11 @@ public class AuthMigrationListener extends MigrationListener { public void onDropKeyspace(String ksName) { - DatabaseDescriptor.getAuthorizer().revokeAll(DataResource.keyspace(ksName)); + DatabaseDescriptor.getAuthorizer().revokeAllOn(DataResource.keyspace(ksName)); } public void onDropColumnFamily(String ksName, String cfName) { - DatabaseDescriptor.getAuthorizer().revokeAll(DataResource.table(ksName, cfName)); + DatabaseDescriptor.getAuthorizer().revokeAllOn(DataResource.table(ksName, cfName)); } } diff --git a/src/java/org/apache/cassandra/auth/AuthenticatedUser.java b/src/java/org/apache/cassandra/auth/AuthenticatedUser.java index a4841f50efea..25d2ed4c18f3 100644 --- a/src/java/org/apache/cassandra/auth/AuthenticatedUser.java +++ b/src/java/org/apache/cassandra/auth/AuthenticatedUser.java @@ -49,7 +49,7 @@ public class AuthenticatedUser public static final AuthenticatedUser ANONYMOUS_USER = new AuthenticatedUser(ANONYMOUS_USERNAME); // User-level roles cache - private static final LoadingCache> rolesCache = initRolesCache(); + private static final LoadingCache> rolesCache = initRolesCache(); // User-level permissions cache. private static final PermissionsCache permissionsCache = new PermissionsCache(DatabaseDescriptor.getPermissionsValidity(), @@ -58,10 +58,13 @@ public class AuthenticatedUser DatabaseDescriptor.getAuthorizer()); private final String name; + // primary Role of the logged in user + private final RoleResource role; public AuthenticatedUser(String name) { this.name = name; + this.role = RoleResource.role(name); } public String getName() @@ -69,6 +72,11 @@ public String getName() return name; } + public RoleResource getPrimaryRole() + { + return role; + } + /** * Checks the user's superuser status. * Only a superuser is allowed to perform CREATE USER and DROP USER queries. @@ -83,7 +91,7 @@ public boolean isSuper() private boolean hasSuperuserRole() { IRoleManager roleManager = DatabaseDescriptor.getRoleManager(); - for (String role : getRoles()) + for (RoleResource role : getRoles()) if (roleManager.isSuper(role)) return true; return false; @@ -102,14 +110,14 @@ public boolean isAnonymous() * * @return a list of roles that have been granted to the user */ - public Set getRoles() + public Set getRoles() { if (rolesCache == null) - return loadRoles(name); + return loadRoles(role); try { - return rolesCache.get(name); + return rolesCache.get(role); } catch (Exception e) { @@ -122,11 +130,11 @@ public static Set getPermissions(AuthenticatedUser user, IResource r return permissionsCache.getPermissions(user, resource); } - private static Set loadRoles(String name) + private static Set loadRoles(RoleResource primary) { try { - return DatabaseDescriptor.getRoleManager().getRoles(name, true); + return DatabaseDescriptor.getRoleManager().getRoles(primary, true); } catch (RequestValidationException e) { @@ -138,7 +146,7 @@ private static Set loadRoles(String name) } } - private static LoadingCache> initRolesCache() + private static LoadingCache> initRolesCache() { if (DatabaseDescriptor.getAuthenticator() instanceof AllowAllAuthenticator) return null; @@ -149,20 +157,20 @@ private static LoadingCache> initRolesCache() return CacheBuilder.newBuilder() .refreshAfterWrite(validityPeriod, TimeUnit.MILLISECONDS) - .build(new CacheLoader>() + .build(new CacheLoader>() { - public Set load(String name) + public Set load(RoleResource primary) { - return loadRoles(name); + return loadRoles(primary); } - public ListenableFuture> reload(final String name, Set oldValue) + public ListenableFuture> reload(final RoleResource primary, Set oldValue) { - ListenableFutureTask> task = ListenableFutureTask.create(new Callable>() + ListenableFutureTask> task = ListenableFutureTask.create(new Callable>() { - public Set call() + public Set call() { - return loadRoles(name); + return loadRoles(primary); } }); ScheduledExecutors.optionalTasks.execute(task); diff --git a/src/java/org/apache/cassandra/auth/CassandraAuthorizer.java b/src/java/org/apache/cassandra/auth/CassandraAuthorizer.java index 1d672b348329..7911acc2a643 100644 --- a/src/java/org/apache/cassandra/auth/CassandraAuthorizer.java +++ b/src/java/org/apache/cassandra/auth/CassandraAuthorizer.java @@ -20,6 +20,7 @@ import java.util.*; import java.util.concurrent.TimeUnit; +import com.google.common.base.Predicate; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; @@ -37,6 +38,8 @@ import org.apache.cassandra.db.ConsistencyLevel; import org.apache.cassandra.db.marshal.UTF8Type; import org.apache.cassandra.exceptions.*; +import org.apache.cassandra.serializers.SetSerializer; +import org.apache.cassandra.serializers.UTF8Serializer; import org.apache.cassandra.service.ClientState; import org.apache.cassandra.service.QueryState; import org.apache.cassandra.transport.messages.ResultMessage; @@ -65,17 +68,18 @@ public class CassandraAuthorizer implements IAuthorizer public CassandraAuthorizer() { } + // Returns every permission on the resource granted to the user either directly // or indirectly via roles granted to the user. public Set authorize(AuthenticatedUser user, IResource resource) { if (user.isSuper()) - return Permission.ALL; + return resource.applicablePermissions(); Set permissions = EnumSet.noneOf(Permission.class); try { - for (String role: user.getRoles()) + for (RoleResource role: user.getRoles()) addPermissionsForRole(permissions, resource, role); } catch (RequestValidationException e) @@ -91,33 +95,33 @@ public Set authorize(AuthenticatedUser user, IResource resource) return permissions; } - public void grant(AuthenticatedUser performer, Set permissions, IResource resource, String grantee) + public void grant(AuthenticatedUser performer, Set permissions, IResource resource, RoleResource grantee) throws RequestValidationException, RequestExecutionException { modifyRolePermissions(permissions, resource, grantee, "+"); addLookupEntry(resource, grantee); } - public void revoke(AuthenticatedUser performer, Set permissions, IResource resource, String revokee) + public void revoke(AuthenticatedUser performer, Set permissions, IResource resource, RoleResource revokee) throws RequestValidationException, RequestExecutionException { modifyRolePermissions(permissions, resource, revokee, "-"); removeLookupEntry(resource, revokee); } - // Called prior to deleting the user with DROP USER query. + // Called when deleting a role with DROP ROLE query. // Internal hook, so no permission checks are needed here. // Executes a logged batch removing the granted premissions // for the role as well as the entries from the reverse index // table - public void revokeAll(String revokee) + public void revokeAllFrom(RoleResource revokee) { try { UntypedResultSet rows = process(String.format("SELECT resource FROM %s.%s WHERE role = '%s'", AuthKeyspace.NAME, AuthKeyspace.ROLE_PERMISSIONS, - escape(revokee))); + escape(revokee.getRoleName()))); List statements = new ArrayList<>(); for (UntypedResultSet.Row row : rows) @@ -127,7 +131,7 @@ public void revokeAll(String revokee) AuthKeyspace.NAME, AuthKeyspace.RESOURCE_ROLE_INDEX, escape(row.getString("resource")), - escape(revokee)), + escape(revokee.getRoleName())), ClientState.forInternalCalls()).statement); } @@ -135,21 +139,21 @@ public void revokeAll(String revokee) statements.add(QueryProcessor.getStatement(String.format("DELETE FROM %s.%s WHERE role = '%s'", AuthKeyspace.NAME, AuthKeyspace.ROLE_PERMISSIONS, - escape(revokee)), + escape(revokee.getRoleName())), ClientState.forInternalCalls()).statement); executeLoggedBatch(statements); } catch (RequestExecutionException | RequestValidationException e) { - logger.warn("CassandraAuthorizer failed to revoke all permissions of {}: {}", revokee, e); + logger.warn("CassandraAuthorizer failed to revoke all permissions of {}: {}", revokee.getRoleName(), e); } } // Called after a resource is removed (DROP KEYSPACE, DROP TABLE, etc.). // Execute a logged batch removing all the permissions for the resource // as well as the index table entry - public void revokeAll(IResource droppedResource) + public void revokeAllOn(IResource droppedResource) { try { @@ -198,11 +202,11 @@ private void executeLoggedBatch(List statements) } // Add every permission on the resource granted to the role - private void addPermissionsForRole(Set permissions, IResource resource, String rolename) + private void addPermissionsForRole(Set permissions, IResource resource, RoleResource role) throws RequestExecutionException, RequestValidationException { QueryOptions options = QueryOptions.forInternalCalls(ConsistencyLevel.LOCAL_ONE, - Lists.newArrayList(ByteBufferUtil.bytes(rolename), + Lists.newArrayList(ByteBufferUtil.bytes(role.getRoleName()), ByteBufferUtil.bytes(resource.getName()))); // If it exists, read from the legacy user permissions table to handle the case where the cluster @@ -223,7 +227,7 @@ private void addPermissionsForRole(Set permissions, IResource resour } // Adds or removes permissions from a role_permissions table (adds if op is "+", removes if op is "-") - private void modifyRolePermissions(Set permissions, IResource resource, String rolename, String op) + private void modifyRolePermissions(Set permissions, IResource resource, RoleResource role, String op) throws RequestExecutionException { process(String.format("UPDATE %s.%s SET permissions = permissions %s {%s} WHERE role = '%s' AND resource = '%s'", @@ -231,28 +235,28 @@ private void modifyRolePermissions(Set permissions, IResource resour AuthKeyspace.ROLE_PERMISSIONS, op, "'" + StringUtils.join(permissions, "','") + "'", - escape(rolename), + escape(role.getRoleName()), escape(resource.getName()))); } // Removes an entry from the inverted index table (from resource -> role with defined permissions) - private void removeLookupEntry(IResource resource, String rolename) throws RequestExecutionException + private void removeLookupEntry(IResource resource, RoleResource role) throws RequestExecutionException { process(String.format("DELETE FROM %s.%s WHERE resource = '%s' and role = '%s'", AuthKeyspace.NAME, AuthKeyspace.RESOURCE_ROLE_INDEX, escape(resource.getName()), - escape(rolename))); + escape(role.getRoleName()))); } // Adds an entry to the inverted index table (from resource -> role with defined permissions) - private void addLookupEntry(IResource resource, String rolename) throws RequestExecutionException + private void addLookupEntry(IResource resource, RoleResource role) throws RequestExecutionException { process(String.format("INSERT INTO %s.%s (resource, role) VALUES ('%s','%s')", AuthKeyspace.NAME, AuthKeyspace.RESOURCE_ROLE_INDEX, escape(resource.getName()), - escape(rolename))); + escape(role.getRoleName()))); } // 'of' can be null - in that case everyone's permissions have been requested. Otherwise only single user's. @@ -262,19 +266,19 @@ private void addLookupEntry(IResource resource, String rolename) throws RequestE public Set list(AuthenticatedUser performer, Set permissions, IResource resource, - String grantee) + RoleResource grantee) throws RequestValidationException, RequestExecutionException { - if (!performer.isSuper() && ! performer.getRoles().contains(grantee)) + if (!performer.isSuper() && !performer.getRoles().contains(grantee)) throw new UnauthorizedException(String.format("You are not authorized to view %s's permissions", - grantee == null ? "everyone" : grantee)); + grantee == null ? "everyone" : grantee.getRoleName())); if (null == grantee) return listPermissionsForRole(permissions, resource, grantee); - Set roles = DatabaseDescriptor.getRoleManager().getRoles(grantee, true); + Set roles = DatabaseDescriptor.getRoleManager().getRoles(grantee, true); Set details = new HashSet<>(); - for (String role : roles) + for (RoleResource role : roles) details.addAll(listPermissionsForRole(permissions, resource, role)); return details; @@ -282,7 +286,7 @@ public Set list(AuthenticatedUser performer, private Set listPermissionsForRole(Set permissions, IResource resource, - String rolename) + RoleResource role) throws RequestExecutionException { Set details = new HashSet<>(); @@ -290,7 +294,7 @@ private Set listPermissionsForRole(Set permission // where the cluster is being upgraded and so is running with mixed versions of the perms table boolean useLegacyTable = Schema.instance.getCFMetaData(AuthKeyspace.NAME, USER_PERMISSIONS) != null; String entityColumnName = useLegacyTable ? USERNAME : ROLE; - for (UntypedResultSet.Row row : process(buildListQuery(resource, rolename, useLegacyTable))) + for (UntypedResultSet.Row row : process(buildListQuery(resource, role, useLegacyTable))) { if (row.has(PERMISSIONS)) { @@ -299,7 +303,7 @@ private Set listPermissionsForRole(Set permission Permission permission = Permission.valueOf(p); if (permissions.contains(permission)) details.add(new PermissionDetails(row.getString(entityColumnName), - DataResource.fromName(row.getString(RESOURCE)), + Resources.fromName(row.getString(RESOURCE)), permission)); } } @@ -307,7 +311,7 @@ private Set listPermissionsForRole(Set permission return details; } - private String buildListQuery(IResource resource, String grantee, boolean useLegacyTable) + private String buildListQuery(IResource resource, RoleResource grantee, boolean useLegacyTable) { String tableName = useLegacyTable ? USER_PERMISSIONS : AuthKeyspace.ROLE_PERMISSIONS; String entityName = useLegacyTable ? USERNAME : ROLE; @@ -323,7 +327,7 @@ private String buildListQuery(IResource resource, String grantee, boolean useLeg if (grantee != null) { conditions.add(entityName + " = '%s'"); - vars.add(escape(grantee)); + vars.add(escape(grantee.getRoleName())); } String query = "SELECT " + entityName + ", resource, permissions FROM %s.%s"; @@ -405,15 +409,27 @@ private void convertLegacyData() UntypedResultSet permissions = process("SELECT * FROM system_auth.permissions"); for (UntypedResultSet.Row row : permissions) { - insertStatement.execute(QueryState.forInternalCalls(), - QueryOptions.forInternalCalls(ConsistencyLevel.ONE, - Lists.newArrayList(row.getBytes("username"), - row.getBytes("resource"), - row.getBytes("permissions")))); - indexStatement.execute(QueryState.forInternalCalls(), - QueryOptions.forInternalCalls(ConsistencyLevel.ONE, - Lists.newArrayList(row.getBytes("resource"), - row.getBytes("username")))); + final IResource resource = Resources.fromName(row.getString("resource")); + Predicate isApplicable = new Predicate() + { + public boolean apply(String s) + { + return resource.applicablePermissions().contains(Permission.valueOf(s)); + } + }; + SetSerializer serializer = SetSerializer.getInstance(UTF8Serializer.instance); + Set originalPerms = serializer.deserialize(row.getBytes("permissions")); + Set filteredPerms = ImmutableSet.copyOf(Iterables.filter(originalPerms, isApplicable)); + insertStatement.execute(QueryState.forInternalCalls(), + QueryOptions.forInternalCalls(ConsistencyLevel.ONE, + Lists.newArrayList(row.getBytes("username"), + row.getBytes("resource"), + serializer.serialize(filteredPerms)))); + + indexStatement.execute(QueryState.forInternalCalls(), + QueryOptions.forInternalCalls(ConsistencyLevel.ONE, + Lists.newArrayList(row.getBytes("resource"), + row.getBytes("username")))); } logger.info("Completed conversion of legacy permissions"); diff --git a/src/java/org/apache/cassandra/auth/CassandraRoleManager.java b/src/java/org/apache/cassandra/auth/CassandraRoleManager.java index 34feb2257bb4..6139e5d99e64 100644 --- a/src/java/org/apache/cassandra/auth/CassandraRoleManager.java +++ b/src/java/org/apache/cassandra/auth/CassandraRoleManager.java @@ -167,37 +167,37 @@ public Set

    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≶0pU&(Zy^sXFmD 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 z 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