---
title:  Checking Redundancy in Partitioned Regions
---

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

Under some circumstances, it can be important to verify that your partitioned region data is redundant and that upon member restart, redundancy has been recovered properly across partitioned region members.

Initiate an operation to report the current redundancy status of regions using one of the following:

-   `gfsh` command. Start `gfsh` and connect to the cluster. Then type the following command:

    ``` pre
    gfsh>status redundancy
    ```

    Optionally, you can specify regions to include or exclude from restoring redundancy. Type `help restore redundancy` or see [status redundancy](../../tools_modules/gfsh/command-pages/status.html#topic_status_redundancy) for more information.

-   API call:

    ``` pre
    ResourceManager manager = cache.getResourceManager();
    RestoreRedundancyResults currentStatus = manager.createRestoreRedundancyOperation().redundancyStatus();
    //These are some of the details we can get about the run from the API
    System.out.println("Status for all regions: " + currentStatus.getMessage());
    System.out.println("Number of regions with no redundant copies: " + currentStatus.getZeroRedundancyRegionResults().size();
    System.out.println("Status for region " + regionName + ": " + currentStatus.getRegionResult(regionName).getMessage();
    ```

If you have `start-recovery-delay=-1` configured for your partitioned region, you will need to trigger a restore redundancy operation on your region after you restart any members in your cluster in order to recover redundancy. See [Restoring Redundancy in Partitioned Regions](restoring_region_redundancy.html).

If you have `start-recovery-delay` set to a low number, you may need to wait extra time until the region has recovered redundancy.


