diff --git a/CHANGES.txt b/CHANGES.txt index 319be62c9d..e99df07233 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -17,6 +17,8 @@ * add estimated tasks to LeveledCompactionStrategy (CASSANDRA-3322) * avoid including compaction cache-warming in keycache stats (CASSANDRA-3325) * run compaction and hinted handoff threads at MIN_PRIORITY (CASSANDRA-3308) + * default hsha thrift server to cpu core count in rpc pool (CASSANDRA-3329) + * add bin\daemon to binary tarball for Windows service (CASSANDRA-3331) Fixes merged from 0.8 below: * Fix tool .bat files when CASSANDRA_HOME contains spaces (CASSANDRA-3258) * Force flush of status table when removing/updating token (CASSANDRA-3243) @@ -30,6 +32,7 @@ Fixes merged from 0.8 below: * Fix missing fields in CLI `show schema` output (CASSANDRA-3304) * Nodetool no longer leaks threads and closes JMX connections (CASSANDRA-3309) * fix truncate allowing data to be replayed post-restart (CASSANDRA-3297) + * Move SimpleAuthority and SimpleAuthenticator to examples (CASSANDRA-2922) 1.0.0-rc2 @@ -90,7 +93,7 @@ Fixes merged from 0.8 below: * don't bother persisting columns shadowed by a row tombstone (CASSANDRA-2589) * reset CF and SC deletion times after gc_grace (CASSANDRA-2317) * optimize away seek when compacting wide rows (CASSANDRA-2879) - * single-pass streaming (CASSANDRA-2677, 3003) + * single-pass streaming (CASSANDRA-2677, 2906, 2916, 3003) * use reference counting for deleting sstables instead of relying on GC (CASSANDRA-2521, 3179) * store hints as serialized mutations instead of pointers to data row @@ -103,7 +106,7 @@ Fixes merged from 0.8 below: (CASSANDRA-2953) * add paging to get_count (CASSANDRA-2894) * fix "short reads" in [multi]get (CASSANDRA-2643, 3157, 3192) - * add optional compression for sstables (CASSANDRA-47, 3001, 3128) + * add optional compression for sstables (CASSANDRA-47, 2994, 3001, 3128) * add scheduler JMX metrics (CASSANDRA-2962) * add block level checksum for compressed data (CASSANDRA-1717) * make column family backed column map pluggable and introduce unsynchronized @@ -155,6 +158,12 @@ Fixes merged from 0.8 below: * Reduce copies done for intra-host messages (CASSANDRA-1788, 3144) * support of compaction strategy option for stress.java (CASSANDRA-3204) * make memtable throughput and column count thresholds no-ops (CASSANDRA-2449) + * Return schema information along with the resultSet in CQL (CASSANDRA-2734) + * Add new DecimalType (CASSANDRA-2883) + * Fix assertion error in RowRepairResolver (CASSANDRA-3156) + * Reduce unnecessary high buffer sizes (CASSANDRA-3171) + * Pluggable compaction strategy (CASSANDRA-1610) + * Add new broadcast_address config option (CASSANDRA-2491) 0.8.6 diff --git a/NEWS.txt b/NEWS.txt index c88b7e3d89..571e739132 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -3,44 +3,55 @@ Upgrading --------- + - Upgrading from version 0.7.1+ or 0.8.2+ can be done with a rolling + restart, one node at a time. (0.8.0 or 0.8.1 are NOT network-compatible + with 1.0: upgrade to the most recent 0.8 release first.) + You do not need to bring down the whole cluster at once. + - After upgrading, run nodetool scrub against each node before running + repair, moving nodes, or adding new ones. - CQL inserts/updates now generate microsecond resolution timestamps by default, instead of millisecond. THIS MEANS A ROLLING UPGRADE COULD MIX milliseconds and microseconds, with clients talking to servers generating milliseconds unable to overwrite the larger microsecond - timestamps. If this is important for your application, you can either - perform a non-rolling upgrade to 1.0, or update your application first - to use explicit timestamps with the "USING timestamp=X" syntax. - - the BinaryMemtable bulk-load interface has been removed. Use the - sstableloader tool instead. - - the compaction_thread_priority setting has been removed from + timestamps. If you are using CQL and this is important for your + application, you can either perform a non-rolling upgrade to 1.0, or + update your application first to use explicit timestamps with the "USING + timestamp=X" syntax. + - The BinaryMemtable bulk-load interface has been removed (use the + sstableloader tool instead). + - The compaction_thread_priority setting has been removed from cassandra.yaml (use compaction_throughput_mb_per_sec to throttle - compaction instead) + compaction instead). - CQL types bytea and date were renamed to blob and timestamp, respectively, to conform with SQL norms. CQL type int is now a 4-byte int, not 8 (which is still available as bigint). - - Cassandra 1.0 uses arena allocation to reduce old generation fragmentation. - This means there is a minimum overhead of 1MB per ColumnFamily plus - 1MB per index. + - Cassandra 1.0 uses arena allocation to reduce old generation + fragmentation. This means there is a minimum overhead of 1MB + per ColumnFamily plus 1MB per index. + - The SimpleAuthenticator and SimpleAuthority classes have been moved to + the example directory (and are thus not available from the binary + distribution). They never provided actual security and in their current + state are only meant as examples. Features -------- - SSTable compression is supported through the 'compression_options' parameter when creating/updating a column family. For instance, you can - create a column family Cf using compression (using the Snappy library) + create a column family Cf using compression (through the Snappy library) in the CLI with: create column family Cf with compression_options={sstable_compression: SnappyCompressor} SSTable compression is not activated by default but can be activated or deactivated at any time. - Compressed SSTable blocks are checksummed to protect against bitrot - - New LevelDB-inspired compaction algorithm can be enabled by setting the - Columnfamily compaction_strategy=LeveledCompactionStrategy option. - Leveled compaction means you only need to keep a few MB of space free for + - New LevelDB-inspired compaction algorithm can be enabled by setting the + Columnfamily compaction_strategy=LeveledCompactionStrategy option. + Leveled compaction means you only need to keep a few MB of space free for compaction instead of (in the worst case) 50%. - - Ability to use multiple threads during a single compaction. See + - Ability to use multiple threads during a single compaction. See multithreaded_compaction in cassandra.yaml for more details. - Windows Service ("cassandra.bat install" to enable) - A dead node may be replaced in a single step by starting a new node - with -Dcassandra.replace_token=. More details can be found at + with -Dcassandra.replace_token=. More details can be found at http://wiki.apache.org/cassandra/Operations#Replacing_a_Dead_Node - It is now possible to repair only the first range returned by the partitioner for a node with `nodetool repair -pr`. It makes it @@ -63,14 +74,17 @@ Other - The old per-ColumnFamily memtable thresholds (memtable_throughput_in_mb, memtable_operations_in_millions, memtable_flush_after_mins) are ignored, in favor of the global - memtable_total_space_in_mb and commitlog_total_space_in_mb settings. + memtable_total_space_in_mb and commitlog_total_space_in_mb settings. This does not affect client compatibility -- the old options are - still allowed, but have no effect. These options may be removed + still allowed, but have no effect. These options may be removed entirely in a future release. - Backlogged compactions will begin five minutes after startup. The 0.8 behavior of never starting compaction until a flush happens is usually not what is desired, but a short grace period is useful to allow caches to warm up first. + - The deletion of compacted data files is not performed during Garbage + Collection anymore. This means compacted files will now be deleted + without delay. 0.8.5 diff --git a/README.txt b/README.txt index 9e9dfb5990..3aab0c5250 100644 --- a/README.txt +++ b/README.txt @@ -41,7 +41,7 @@ Now that we're ready, let's start it up! (Running the startup script with the -f argument will cause Cassandra to remain in the foreground and log to standard out. On windows, running it with the 'install' argument instead will install Cassandra as a -Windows Service.) +Windows Service, and 'uninstall' will remove it.) Now let's try to read and write some data using the command line client. diff --git a/bin/cassandra.bat b/bin/cassandra.bat index f857994680..095babb124 100644 --- a/bin/cassandra.bat +++ b/bin/cassandra.bat @@ -14,8 +14,11 @@ @REM See the License for the specific language governing permissions and @REM limitations under the License. +@echo off + set ARG=%1 set INSTALL="INSTALL" +set UNINSTALL="UNINSTALL" pushd %~dp0.. if NOT DEFINED CASSANDRA_HOME set CASSANDRA_HOME=%CD% @@ -60,7 +63,8 @@ goto :eof 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 -if /i "%ARG%" == "INSTALL" goto installService +if /i "%ARG%" == "INSTALL" goto doInstallOperation +if /i "%ARG%" == "UNINSTALL" goto doInstallOperation goto runDaemon @@ -69,7 +73,7 @@ echo Starting Cassandra Server "%JAVA_HOME%\bin\java" %JAVA_OPTS% %CASSANDRA_PARAMS% -cp %CASSANDRA_CLASSPATH% "%CASSANDRA_MAIN%" goto finally -:installService +:doInstallOperation set SERVICE_JVM="cassandra" rem location of Prunsrv set PATH_PRUNSRV=%CASSANDRA_HOME%\bin\daemon\ @@ -81,15 +85,17 @@ set JAVA_OPTS_DELM=%JAVA_OPTS: -=;-% rem Allow prunsrv to be overridden if "%PRUNSRV%" == "" set PRUNSRV=%PATH_PRUNSRV%prunsrv -rem Install the service echo trying to delete service if it has been created already -%PRUNSRV% //DS//%SERVICE_JVM% -echo Installing %SERVICE_JVM% -%PRUNSRV% //IS//%SERVICE_JVM% +"%PRUNSRV%" //DS//%SERVICE_JVM% +rem quit if we're just going to uninstall +if /i "%ARG%" == "UNINSTALL" goto finally +echo. +echo Installing %SERVICE_JVM%. If you get registry warnings, re-run as an Administrator +"%PRUNSRV%" //IS//%SERVICE_JVM% echo Setting the parameters for %SERVICE_JVM% rem set PR_CLASSPATH=%CASSANDRA_CLASSPATH% -%PRUNSRV% //US//%SERVICE_JVM% ^ +"%PRUNSRV%" //US//%SERVICE_JVM% ^ --Jvm=auto --StdOutput auto --StdError auto ^ --Classpath=%CASSANDRA_CLASSPATH% ^ --StartMode=jvm --StartClass=%CASSANDRA_MAIN% --StartMethod=main ^ diff --git a/bin/daemon/LICENSE.txt b/bin/daemon/LICENSE.txt new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/bin/daemon/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/bin/daemon/NOTICE.txt b/bin/daemon/NOTICE.txt new file mode 100644 index 0000000000..8dc87b0b9f --- /dev/null +++ b/bin/daemon/NOTICE.txt @@ -0,0 +1,5 @@ +Apache Commons Daemon +Copyright 1999-2011 The Apache Software Foundation + +This product includes software developed by +The Apache Software Foundation (http://www.apache.org/). diff --git a/bin/daemon/RELEASE-NOTES.txt b/bin/daemon/RELEASE-NOTES.txt new file mode 100644 index 0000000000..76f8a53766 --- /dev/null +++ b/bin/daemon/RELEASE-NOTES.txt @@ -0,0 +1,116 @@ +$Id: RELEASE-NOTES.txt 1153024 2011-08-02 04:27:12Z mturk $ + + Commons Daemon Package + Version 1.0.7 + Release Notes + + +INTRODUCTION: + +Commons Daemon is a set of utilities and Java support classes for running +Java applications as server processes. +Commonly known as 'daemon' processes in Unix terminology (hence the name), +on Windows they are called 'services'. + +This document contains the release notes for this version of the Commons +Daemon package, and highlights changes since the previous version. The +current release adds new features and bug fixes, and is being done now to +follow the release early/release often mentality. + + +Compatibility with 1.0.3 +------------------------ +Binary compatible - Yes + +Source compatible - Yes + +Semantic compatible - Yes + +Commons DAEMON 1.0.3 requires a minimum of JDK 1.3 + + +NEW FEATURES: + +* DAEMON-209: Add --LibraryPath to procrun for setting the + LoadLibrary search paths (1.0.6) +* DAEMON-208: Add -server and -client -jvm synonyms (1.0.6) +* DAEMON-205: Add support for building on ARM processors (1.0.6) +* DAEMON-204: Add DaemonSignal interface that allows catching SIGUSR2 + signals and creating custom callbacks (1.0.6) +* DAEMON-202: Allow JSVC_OPTS environment variable to be used in + the example Tomcat scripts (1.0.6) +* DAEMON-180: Add DaemonWrapper to allow running standard applications + as daemons. (1.0.4) +* DAEMON-179: Allow procrun to use java/lang/System as --ShutdownClass. (1.0.4) +* DAEMON-178: Allow jsvc umask to be configured at build time +* DAEMON-177: Allow fail during init with nicer message. (1.0.4) +* DAEMON-176: Create config.nice during configure step. (1.0.4) +* DAEMON-173: Allow --JavaHome=jdk and --JavaHome=jre options that + will guess default JavaHome from the registry. (1.0.4) +* DAEMON-160: Remove obsolete code; rename native/nt as native/windows (1.0.4) +* DAEMON-144: Drop sample dependency on Commons Collections ExtendedProperties (1.0.4) +* DAEMON-95: Support log rotation using SIGUSR1 (1.0.4) +* DAEMON-80: Syslog support for jsvc (1.0.4) + +* DAEMON-138: Add --PidFile option to allow storing running process id. (1.0.3) +* DAEMON-137: Add --LogJniMessages allowing to configure JNI verbose message + logging. By default those messages were always logged. (1.0.3) +* DAEMON-140: Add missing Java6 parameters -ea, da, -esa, -dsa, -showversion + and their long name synonyms. (1.0.3) +* DAEMON-142: Add option to display procrun version. (1.0.3) +* DAEMON-166: Add classpath .jar expansion. If the classpath + element ends with asterisk it will evaluate to all .jar files + found in the path. (1.0.3) + +* Add -wait and -stop parameters. (1.0.1). + The -wait parameter is experimental: that a is loop testing for a + file in /tmp and waiting n/10 seconds. + +* Allow to run as normal user for testing. (1.0.1). + +* Initial import to Commons, including the daemon Java API, and jsvc + for Unix and Windows NT/2K/XP, which allows running a Java program + as a native operating system daemon + +* Switch to JIRA bug tracking system. + +* Add sample ProcrunService Java application for use with Procrun Jvm/Java modes (1.0.3) + +BUG FIXES: + +1.0.7: DAEMON-211 + +1.0.6: DAEMON-186, DAEMON-193, DAEMON-194, DAEMON-206, DAEMON-185, DAEMON-200 + DAEMON-192 + +1.0.5: DAEMON-158, DAEMON-184, DAEMON-187, DAEMON-188, DAEMON-190 + +1.0.4: DAEMON-95, DAEMON-171, DAEMON-100, DAEMON-164, DAEMON-165, DAEMON-175, + DAEMON-177, DAEMON-150, DAEMON-163, DAEMON-182, DAEMON-181 + +1.0.3: DAEMON-108, DAEMON-128, DAEMON-139, DAEMON-143, DAEMON-148, + DAEMON-135, DAEMON-155, DAEMON-159, DAEMON-161, DAEMON-145, DAEMON-146, + DAEMON-167, DAEMON-168, DAEMON-154, DAEMON-149 + +1.0.2: DAEMON-16, DAEMON-31, DAEMON-40, DAEMON-45, DAEMON-49, DAEMON-60, + DAEMON-84, DAEMON-90, DAEMON-91, DAEMON-92, DAEMON-93, DAEMON-94, + DAEMON-96, DAEMON-97, DAEMON-98, DAEMON-102, DAEMON-105, DAEMON-106, + DAEMON-110, DAEMON-112, DAEMON-113, DAEMON-114, DAEMON-115, DAEMON-116, + DAEMON-117, DAEMON-118, DAEMON-119, DAEMON-120, DAEMON-121, DAEMON-123, + DAEMON-124, DAEMON-125, DAEMON-126, DAEMON-129, DAEMON-130, DAEMON-132, + DAEMON-133 + +1.0.1: 304310, 30177, 27523, 29465, 31614, 33580, 31613, 34851. + +Feedback +-------- +Open source works best when you give feedback: +http://commons.apache.org/daemon/ + +Please direct all bug reports to JIRA +https://issues.apache.org/jira/browse/DAEMON + +Or subscribe to the commons-user mailing list (prefix emails by [daemon]) +http://commons.apache.org/mail-lists.html + +The Commons-DAEMON Team \ No newline at end of file diff --git a/bin/daemon/prunmgr.exe b/bin/daemon/prunmgr.exe new file mode 100644 index 0000000000..6fd0f93183 Binary files /dev/null and b/bin/daemon/prunmgr.exe differ diff --git a/bin/daemon/prunsrv.exe b/bin/daemon/prunsrv.exe new file mode 100644 index 0000000000..cdd4aaa3ee Binary files /dev/null and b/bin/daemon/prunsrv.exe differ diff --git a/build.xml b/build.xml index 121f1049de..23f30b2788 100644 --- a/build.xml +++ b/build.xml @@ -42,6 +42,7 @@ + @@ -917,6 +918,8 @@ url=${svn.entry.url}?pathrev=${svn.entry.commit.revision} + + @@ -948,6 +951,7 @@ url=${svn.entry.url}?pathrev=${svn.entry.commit.revision} + diff --git a/conf/README.txt b/conf/README.txt index f160dd0ab9..c3fd98dc22 100644 --- a/conf/README.txt +++ b/conf/README.txt @@ -8,6 +8,4 @@ log4j-server.proprties: log4j configuration file for Cassandra server Optional configuration files ============================ -access.properties: used for authorization -passwd.properties: used for authentication cassandra-topology.properties: used by PropertyFileSnitch diff --git a/conf/cassandra.yaml b/conf/cassandra.yaml index a4abe46eae..bdd1ea88c1 100644 --- a/conf/cassandra.yaml +++ b/conf/cassandra.yaml @@ -193,35 +193,35 @@ rpc_port: 9160 # enable or disable keepalive on rpc connections rpc_keepalive: true -# Cassandra provides you with a variety of options for RPC Server -# sync -> Creates one thread per connection but with a configurable number of -# threads. This can be expensive in memory used for thread stack for -# a large enough number of clients. (Hence, connection pooling is -# very, very strongly recommended.) +# Cassandra provides three options for the RPC Server: +# +# sync -> One connection per thread in the rpc pool (see below). +# 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. +# Connection pooling is very, very strongly recommended. # # async -> Nonblocking server implementation with one thread to serve -# rpc connections. This is not recommended for high throughput use -# cases. +# rpc connections. This is not recommended for high throughput use +# cases. Async has been tested to be about 50% slower than sync +# or hsha and is deprecated: it will be removed in the next major release. # -# hsha -> half sync and half async implementation with configurable number -# of worker threads (For managing connections). IO Management is -# done by a set of threads currently equal to the number of -# processors in the system. The number of threads in the threadpool -# is configured via rpc_min_threads and rpc_max_threads. (Connection -# pooling is strongly recommended in this case too.) - +# hsha -> Stands for "half synchronous, half asynchronous." The rpc thread pool +# (see below) is used to manage requests, but the threads are multiplexed +# across the different clients. +# +# 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. rpc_server_type: sync # Uncomment rpc_min|max|thread to set request pool size. # You would primarily set max for the sync server to safeguard against # misbehaved clients; if you do hit the max, Cassandra will block until one -# disconnects before accepting more. The defaults are min of 16 and max +# disconnects before accepting more. The defaults for sync are min of 16 and max # unlimited. # -# For the Hsha server, you would set the max so that a fair amount of resources -# are provided to the other working threads on the server. +# For the Hsha server, the min and max both default to the number of CPU cores. # -# This configuration is not used for the async server. +# This configuration is ignored by the async server. # # rpc_min_threads: 16 # rpc_max_threads: 2048 diff --git a/examples/simple_authentication/README.txt b/examples/simple_authentication/README.txt new file mode 100644 index 0000000000..3de5092fd2 --- /dev/null +++ b/examples/simple_authentication/README.txt @@ -0,0 +1,14 @@ +The files in this directory provide a (simplistic) example of how to add +authentication and resource permissions to Cassandra by implementing the +org.apache.cassandra.auth.{IAuthenticator, IAuthority} interfaces. + +To try those examples, copy the two JAVA sources (in src/) into the main +cassandra sources directory and the two configuration files (in conf/) in the +main cassandra configuration directory. + +You can then set the authenticator and authority properties in cassandra.yaml +to use those classes. See the two configuration files access.properties and +passwd.properties to configure the authorized users and permissions. + +Please note that the code in this directory is for demonstration purposes. In +particular, it does not provide a high level of security. diff --git a/conf/access.properties b/examples/simple_authentication/conf/access.properties similarity index 100% rename from conf/access.properties rename to examples/simple_authentication/conf/access.properties diff --git a/conf/passwd.properties b/examples/simple_authentication/conf/passwd.properties similarity index 100% rename from conf/passwd.properties rename to examples/simple_authentication/conf/passwd.properties diff --git a/src/java/org/apache/cassandra/auth/SimpleAuthenticator.java b/examples/simple_authentication/src/org/apache/cassandra/auth/SimpleAuthenticator.java similarity index 100% rename from src/java/org/apache/cassandra/auth/SimpleAuthenticator.java rename to examples/simple_authentication/src/org/apache/cassandra/auth/SimpleAuthenticator.java diff --git a/src/java/org/apache/cassandra/auth/SimpleAuthority.java b/examples/simple_authentication/src/org/apache/cassandra/auth/SimpleAuthority.java similarity index 100% rename from src/java/org/apache/cassandra/auth/SimpleAuthority.java rename to examples/simple_authentication/src/org/apache/cassandra/auth/SimpleAuthority.java diff --git a/src/java/org/apache/cassandra/auth/IAuthenticator.java b/src/java/org/apache/cassandra/auth/IAuthenticator.java index c343256bc9..113a646754 100644 --- a/src/java/org/apache/cassandra/auth/IAuthenticator.java +++ b/src/java/org/apache/cassandra/auth/IAuthenticator.java @@ -27,6 +27,9 @@ import org.apache.cassandra.thrift.AuthenticationException; public interface IAuthenticator { + public static final String USERNAME_KEY = "username"; + public static final String PASSWORD_KEY = "password"; + /** * @return The user that a connection is initialized with, or 'null' if a user must call login(). */ diff --git a/src/java/org/apache/cassandra/cli/CliClient.java b/src/java/org/apache/cassandra/cli/CliClient.java index 56c793cb07..c755a1d96b 100644 --- a/src/java/org/apache/cassandra/cli/CliClient.java +++ b/src/java/org/apache/cassandra/cli/CliClient.java @@ -32,7 +32,7 @@ import com.google.common.base.Charsets; import com.google.common.base.Joiner; import org.antlr.runtime.tree.Tree; -import org.apache.cassandra.auth.SimpleAuthenticator; +import org.apache.cassandra.auth.IAuthenticator; import org.apache.cassandra.config.ConfigurationException; import org.apache.cassandra.db.ColumnFamilyStoreMBean; import org.apache.cassandra.db.compaction.CompactionInfo; @@ -1833,8 +1833,8 @@ public class CliClient { /* remove quotes */ password = password.replace("\'", ""); - credentials.put(SimpleAuthenticator.USERNAME_KEY, username); - credentials.put(SimpleAuthenticator.PASSWORD_KEY, password); + credentials.put(IAuthenticator.USERNAME_KEY, username); + credentials.put(IAuthenticator.PASSWORD_KEY, password); authRequest = new AuthenticationRequest(credentials); thriftClient.login(authRequest); } diff --git a/src/java/org/apache/cassandra/cli/CliMain.java b/src/java/org/apache/cassandra/cli/CliMain.java index a279d4585c..b12a19af83 100644 --- a/src/java/org/apache/cassandra/cli/CliMain.java +++ b/src/java/org/apache/cassandra/cli/CliMain.java @@ -27,7 +27,7 @@ import java.util.*; import jline.ConsoleReader; import jline.History; -import org.apache.cassandra.auth.SimpleAuthenticator; +import org.apache.cassandra.auth.IAuthenticator; import org.apache.cassandra.thrift.*; import org.apache.thrift.TException; import org.apache.thrift.protocol.TBinaryProtocol; @@ -95,8 +95,8 @@ public class CliMain { // Authenticate Map credentials = new HashMap(); - credentials.put(SimpleAuthenticator.USERNAME_KEY, sessionState.username); - credentials.put(SimpleAuthenticator.PASSWORD_KEY, sessionState.password); + credentials.put(IAuthenticator.USERNAME_KEY, sessionState.username); + credentials.put(IAuthenticator.PASSWORD_KEY, sessionState.password); AuthenticationRequest authRequest = new AuthenticationRequest(credentials); try { diff --git a/src/java/org/apache/cassandra/config/Config.java b/src/java/org/apache/cassandra/config/Config.java index 789ae4fd34..5570e99296 100644 --- a/src/java/org/apache/cassandra/config/Config.java +++ b/src/java/org/apache/cassandra/config/Config.java @@ -69,8 +69,8 @@ public class Config public Integer rpc_port = 9160; public String rpc_server_type = "sync"; public Boolean rpc_keepalive = true; - public Integer rpc_min_threads = 16; - public Integer rpc_max_threads = Integer.MAX_VALUE; + public Integer rpc_min_threads = null; + public Integer rpc_max_threads = null; public Integer rpc_send_buff_size_in_bytes; public Integer rpc_recv_buff_size_in_bytes; diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java index a36476ee06..e4c05f0f3d 100644 --- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java +++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java @@ -366,7 +366,15 @@ public class DatabaseDescriptor if (!CassandraDaemon.rpc_server_types.contains(conf.rpc_server_type.toLowerCase())) throw new ConfigurationException("Unknown rpc_server_type: " + conf.rpc_server_type); - + if (conf.rpc_min_threads == null) + conf.rpc_min_threads = conf.rpc_server_type.toLowerCase().equals("hsha") + ? Runtime.getRuntime().availableProcessors() + : 16; + if (conf.rpc_max_threads == null) + conf.rpc_max_threads = conf.rpc_server_type.toLowerCase().equals("hsha") + ? Runtime.getRuntime().availableProcessors() + : Integer.MAX_VALUE; + /* data file and commit log directories. they get created later, when they're needed. */ if (conf.commitlog_directory != null && conf.data_file_directories != null && conf.saved_caches_directory != null) { diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionTask.java b/src/java/org/apache/cassandra/db/compaction/CompactionTask.java index 4e305734cf..3936f49af3 100644 --- a/src/java/org/apache/cassandra/db/compaction/CompactionTask.java +++ b/src/java/org/apache/cassandra/db/compaction/CompactionTask.java @@ -39,7 +39,7 @@ import org.apache.cassandra.utils.CloseableIterator; public class CompactionTask extends AbstractCompactionTask { - private static final Logger logger = LoggerFactory.getLogger(CompactionTask.class); + protected static final Logger logger = LoggerFactory.getLogger(CompactionTask.class); protected String compactionFileLocation; protected final int gcBefore; protected boolean isUserDefined; @@ -70,20 +70,13 @@ public class CompactionTask extends AbstractCompactionTask assert sstables != null; Set toCompact = new HashSet(sstables); - if (!isUserDefined) + if (!isCompactionInteresting(toCompact)) + return 0; + + if (compactionFileLocation == null) + compactionFileLocation = cfs.table.getDataFileLocation(cfs.getExpectedCompactedFileSize(toCompact)); + if (partialCompactionsAcceptable()) { - if (!allowSingletonCompaction() && toCompact.size() < 2) - { - String msg = "Nothing to compact in " + cfs.getColumnFamilyName(); - if (cfs.getCompactionStrategy() instanceof SizeTieredCompactionStrategy) - msg += ". Use forceUserDefinedCompaction if you wish to force compaction of single sstables (e.g. for tombstone collection)"; - logger.info(msg); - return 0; - } - - if (compactionFileLocation == null) - compactionFileLocation = cfs.table.getDataFileLocation(cfs.getExpectedCompactedFileSize(toCompact)); - // If the compaction file path is null that means we have no space left for this compaction. // Try again w/o the largest one. if (compactionFileLocation == null) @@ -219,12 +212,17 @@ public class CompactionTask extends AbstractCompactionTask builder.append("]"); double mbps = dTime > 0 ? (double)endsize/(1024*1024)/((double)dTime/1000) : 0; - logger.info(String.format("Compacted to %s. %,d to %,d (~%d%% of original) bytes for %,d keys at %fMBPS. Time: %,dms.", + logger.info(String.format("Compacted to %s. %,d to %,d (~%d%% of original) bytes for %,d keys at %fMB/s. Time: %,dms.", builder.toString(), startsize, endsize, (int) (ratio * 100), totalkeysWritten, mbps, dTime)); logger.debug(String.format("CF Total Bytes Compacted: %,d", CompactionTask.addToTotalBytesCompacted(endsize))); return toCompact.size(); } + protected boolean partialCompactionsAcceptable() + { + return !isUserDefined; + } + //extensibility point for other strategies that may want to limit the upper bounds of the sstable segment size protected boolean newSSTableSegmentThresholdReached(SSTableWriter writer, long position) { @@ -232,11 +230,15 @@ public class CompactionTask extends AbstractCompactionTask } /** - * extend this if the overridden compaction strategy requires single files to be compacted to function properly - * @return boolean + * @return true if the proposed compaction is worth proceeding with. We allow leveled compaction to + * override this to allow "promoting" sstables from one level to another w/o rewriting them, if there is no overlapping. */ - protected boolean allowSingletonCompaction() + protected boolean isCompactionInteresting(Set toCompact) { + if (isUserDefined || toCompact.size() >= 2) + return true; + logger.info(String.format("Nothing to compact in %s. Use forceUserDefinedCompaction if you wish to force compaction of single sstables (e.g. for tombstone collection)", + cfs.getColumnFamilyName())); return false; } diff --git a/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java b/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java index f85d2a9649..a94a1deafa 100644 --- a/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java +++ b/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java @@ -43,7 +43,7 @@ public class LeveledCompactionStrategy extends AbstractCompactionStrategy implem { private static final Logger logger = LoggerFactory.getLogger(LeveledCompactionStrategy.class); - private LeveledManifest manifest; + private final LeveledManifest manifest; private final String SSTABLE_SIZE_OPTION = "sstable_size_in_mb"; private final int maxSSTableSizeInMB; private final AtomicReference task = new AtomicReference(); @@ -144,13 +144,11 @@ public class LeveledCompactionStrategy extends AbstractCompactionStrategy implem { SSTableAddedNotification flushedNotification = (SSTableAddedNotification) notification; manifest.add(flushedNotification.added); - manifest.logDistribution(); } else if (notification instanceof SSTableListChangedNotification) { SSTableListChangedNotification listChangedNotification = (SSTableListChangedNotification) notification; manifest.promote(listChangedNotification.removed, listChangedNotification.added); - manifest.logDistribution(); } } diff --git a/src/java/org/apache/cassandra/db/compaction/LeveledCompactionTask.java b/src/java/org/apache/cassandra/db/compaction/LeveledCompactionTask.java index abdb59f601..a986545dfb 100644 --- a/src/java/org/apache/cassandra/db/compaction/LeveledCompactionTask.java +++ b/src/java/org/apache/cassandra/db/compaction/LeveledCompactionTask.java @@ -21,11 +21,19 @@ package org.apache.cassandra.db.compaction; */ +import java.io.File; import java.io.IOException; import java.util.Collection; +import java.util.Set; import java.util.concurrent.CountDownLatch; +import com.google.common.collect.Iterables; + +import org.apache.commons.lang.StringUtils; + +import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.ColumnFamilyStore; +import org.apache.cassandra.db.Table; import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.io.sstable.SSTableWriter; @@ -61,8 +69,14 @@ public class LeveledCompactionTask extends CompactionTask } @Override - protected boolean allowSingletonCompaction() + protected boolean isCompactionInteresting(Set toCompact) { return true; } + + @Override + protected boolean partialCompactionsAcceptable() + { + return false; + } } diff --git a/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java b/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java index 73f41a103b..af75ae6c43 100644 --- a/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java +++ b/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java @@ -129,6 +129,7 @@ public class LeveledManifest public synchronized void add(SSTableReader reader) { + logDistribution(); logger.debug("Adding {} to L0", reader); add(reader, 0); serialize(); @@ -150,6 +151,7 @@ public class LeveledManifest public synchronized void promote(Iterable removed, Iterable added) { + logDistribution(); if (logger.isDebugEnabled()) logger.debug((Iterables.isEmpty(added) ? "Removing [" : "Replacing [") + toString(removed) + "]"); @@ -206,8 +208,6 @@ public class LeveledManifest public synchronized Collection getCompactionCandidates() { - logDistribution(); - // 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: @@ -257,7 +257,7 @@ public class LeveledManifest return generations.length > i ? generations[i].size() : 0; } - public void logDistribution() + private void logDistribution() { for (int i = 0; i < generations.length; i++) { diff --git a/src/java/org/apache/cassandra/hadoop/ColumnFamilyOutputFormat.java b/src/java/org/apache/cassandra/hadoop/ColumnFamilyOutputFormat.java index 2d8e3362ee..1c0bc665b6 100644 --- a/src/java/org/apache/cassandra/hadoop/ColumnFamilyOutputFormat.java +++ b/src/java/org/apache/cassandra/hadoop/ColumnFamilyOutputFormat.java @@ -30,7 +30,7 @@ import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.cassandra.auth.SimpleAuthenticator; +import org.apache.cassandra.auth.IAuthenticator; import org.apache.cassandra.thrift.*; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.mapreduce.*; @@ -154,8 +154,8 @@ public class ColumnFamilyOutputFormat extends OutputFormat creds = new HashMap(); - creds.put(SimpleAuthenticator.USERNAME_KEY, ConfigHelper.getOutputKeyspaceUserName(conf)); - creds.put(SimpleAuthenticator.PASSWORD_KEY, ConfigHelper.getOutputKeyspacePassword(conf)); + creds.put(IAuthenticator.USERNAME_KEY, ConfigHelper.getOutputKeyspaceUserName(conf)); + creds.put(IAuthenticator.PASSWORD_KEY, ConfigHelper.getOutputKeyspacePassword(conf)); AuthenticationRequest authRequest = new AuthenticationRequest(creds); client.login(authRequest); } diff --git a/src/java/org/apache/cassandra/hadoop/ColumnFamilyRecordReader.java b/src/java/org/apache/cassandra/hadoop/ColumnFamilyRecordReader.java index 330153a504..a294df0f8e 100644 --- a/src/java/org/apache/cassandra/hadoop/ColumnFamilyRecordReader.java +++ b/src/java/org/apache/cassandra/hadoop/ColumnFamilyRecordReader.java @@ -31,7 +31,7 @@ import java.util.*; import com.google.common.collect.AbstractIterator; -import org.apache.cassandra.auth.SimpleAuthenticator; +import org.apache.cassandra.auth.IAuthenticator; import org.apache.cassandra.config.ConfigurationException; import org.apache.cassandra.db.IColumn; import org.apache.cassandra.db.marshal.AbstractType; @@ -120,8 +120,8 @@ public class ColumnFamilyRecordReader extends RecordReader creds = new HashMap(); - creds.put(SimpleAuthenticator.USERNAME_KEY, ConfigHelper.getInputKeyspaceUserName(conf)); - creds.put(SimpleAuthenticator.PASSWORD_KEY, ConfigHelper.getInputKeyspacePassword(conf)); + creds.put(IAuthenticator.USERNAME_KEY, ConfigHelper.getInputKeyspaceUserName(conf)); + creds.put(IAuthenticator.PASSWORD_KEY, ConfigHelper.getInputKeyspacePassword(conf)); AuthenticationRequest authRequest = new AuthenticationRequest(creds); client.login(authRequest); } diff --git a/test/unit/org/apache/cassandra/auth/SimpleAuthorityTest.java b/test/unit/org/apache/cassandra/auth/SimpleAuthorityTest.java deleted file mode 100644 index cc1384c5d0..0000000000 --- a/test/unit/org/apache/cassandra/auth/SimpleAuthorityTest.java +++ /dev/null @@ -1,84 +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.auth; - -import java.util.Arrays; -import java.util.EnumSet; -import java.util.List; - -import org.junit.Test; -import static org.junit.Assert.assertEquals; - -public class SimpleAuthorityTest -{ - private final SimpleAuthority authority = new SimpleAuthority(); - - private final AuthenticatedUser USER1 = new AuthenticatedUser("user1"); - private final AuthenticatedUser USER2 = new AuthenticatedUser("user2"); - private final AuthenticatedUser USER3 = new AuthenticatedUser("user3"); - - private final List KEYSPACES_RESOURCE = Arrays.asList(Resources.ROOT, Resources.KEYSPACES); - private final List KEYSPACE1_RESOURCE = Arrays.asList(Resources.ROOT, Resources.KEYSPACES, "Keyspace1"); - private final List KEYSPACE2_RESOURCE = Arrays.asList(Resources.ROOT, Resources.KEYSPACES, "Keyspace2"); - private final List STANDARD1_RESOURCE = Arrays.asList(Resources.ROOT, - Resources.KEYSPACES, - "Keyspace1", - "Standard1"); - - @Test - public void testValidateConfiguration() throws Exception - { - authority.validateConfiguration(); - } - - @Test - public void testAuthorizeKeyspace() throws Exception - { - assertEquals(Permission.ALL, authority.authorize(USER1, KEYSPACE1_RESOURCE)); - assertEquals(Permission.ALL, authority.authorize(USER2, KEYSPACE1_RESOURCE)); - assertEquals(Permission.NONE, authority.authorize(USER3, KEYSPACE1_RESOURCE)); - - assertEquals("a keyspace not listed in the access file should be inaccessible", - Permission.NONE, - authority.authorize(USER1, KEYSPACE2_RESOURCE)); - } - - @Test - public void testAuthorizeKeyspaceList() throws Exception - { - assertEquals("user1 should be able to modify the keyspace list", - Permission.ALL, - authority.authorize(USER1, KEYSPACES_RESOURCE)); - assertEquals("user2 should only be able to read the keyspace list", - EnumSet.of(Permission.READ), - authority.authorize(USER2, KEYSPACES_RESOURCE)); - assertEquals("user3 should only be able to read the keyspace list", - EnumSet.of(Permission.READ), - authority.authorize(USER3, KEYSPACES_RESOURCE)); - } - - @Test - public void testAuthorizeColumnFamily() throws Exception - { - assertEquals(Permission.ALL, authority.authorize(USER1, STANDARD1_RESOURCE)); - assertEquals(EnumSet.of(Permission.READ), authority.authorize(USER2, STANDARD1_RESOURCE)); - assertEquals(Permission.NONE, authority.authorize(USER3, STANDARD1_RESOURCE)); - } -} diff --git a/tools/stress/bin/stress.bat b/tools/stress/bin/stress.bat index 139accde06..f7b04218d7 100644 --- a/tools/stress/bin/stress.bat +++ b/tools/stress/bin/stress.bat @@ -13,6 +13,8 @@ @REM See the License for the specific language governing permissions and @REM limitations under the License. +@echo off + if NOT DEFINED CASSANDRA_HOME set CASSANDRA_HOME=%CD%\..\.. if NOT DEFINED STRESS_HOME set STRESS_HOME=%CD%