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

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:`Slack room <slack>`.

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.
