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

Further details on how to contribute can be found at our :doc:`development/index` section. 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.
