.. 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.

Reporting bugs and contributing
===============================

If you encounter a problem with Cassandra, the first places to ask for help are the :ref:`user mailing list
<mailing-lists>` and the ``#cassandra`` :ref:`IRC channel <irc-channels>`.

If, after having asked for help, you suspect that you have found a bug in Cassandra, you should report it by opening a
ticket through the `Apache Cassandra JIRA <https://issues.apache.org/jira/browse/CASSANDRA>`__. Please provide as much
details as you can on your problem, and don't forget to indicate which version of Cassandra you are running and on which
environment.

If you would like to contribute, please check `the section on contributing
<https://wiki.apache.org/cassandra/HowToContribute>`__ on the Cassandra wiki. Please note that the source of this
documentation is part of the Cassandra git repository and hence contributions to the documentation should follow the
same path.
