class IndexForceRebuildJob extends VisorJob<CacheIndexesForceRebuildCommandArg, IndexForceRebuildTaskRes> {
        /** */
        private static final long serialVersionUID = 0L;

        /**
         * Create job with specified argument.
         *
         * @param arg Job argument.
         * @param debug Flag indicating whether debug information should be printed into node log.
         */
        protected IndexForceRebuildJob(CacheIndexesForceRebuildCommandArg arg, boolean debug) {
            super(arg, debug);
        }

        /** {@inheritDoc} */
        @Override protected IndexForceRebuildTaskRes run(CacheIndexesForceRebuildCommandArg arg) throws IgniteException {<FILL_FUNCTION_BODY>}
    }

            assert (arg.cacheNames() == null) ^ (arg.groupNames() == null) :
                "Either cacheNames or cacheGroups must be specified.";

            Set<GridCacheContext> cachesToRebuild = new HashSet<>();
            Set<String> notFound = new HashSet<>();

            final GridCacheProcessor cacheProc = ignite.context().cache();

            if (arg.cacheNames() != null) {
                for (String cacheName : arg.cacheNames()) {
                    IgniteInternalCache cache = cacheProc.cache(cacheName);

                    if (cache != null)
                        cachesToRebuild.add(cache.context());
                    else
                        notFound.add(cacheName);
                }
            }
            else {
                for (String cacheGrpName : arg.groupNames()) {
                    CacheGroupContext grpCtx = cacheProc.cacheGroup(CU.cacheId(cacheGrpName));

                    if (grpCtx != null)
                        cachesToRebuild.addAll(grpCtx.caches());
                    else
                        notFound.add(cacheGrpName);
                }
            }

            Collection<GridCacheContext> cachesCtxWithRebuildingInProgress =
                ignite.context().cache().context().database().forceRebuildIndexes(cachesToRebuild);

            Set<IndexRebuildStatusInfoContainer> cachesWithRebuildingInProgress =
                cachesCtxWithRebuildingInProgress.stream()
                    .map(IndexRebuildStatusInfoContainer::new)
                    .collect(Collectors.toSet());

            Set<IndexRebuildStatusInfoContainer> cachesWithStartedRebuild =
                cachesToRebuild.stream()
                    .map(IndexRebuildStatusInfoContainer::new)
                    .filter(c -> !cachesWithRebuildingInProgress.contains(c))
                    .collect(Collectors.toSet());

            return new IndexForceRebuildTaskRes(
                cachesWithStartedRebuild,
                cachesWithRebuildingInProgress,
                notFound
            );
        
<methods>public non-sealed void <init>() ,public Map<? extends org.apache.ignite.compute.ComputeJob,org.apache.ignite.cluster.ClusterNode> map(List<org.apache.ignite.cluster.ClusterNode>, VisorTaskArgument<org.apache.ignite.internal.management.cache.CacheIndexesForceRebuildCommandArg>) ,public final Map<java.util.UUID,org.apache.ignite.internal.management.cache.IndexForceRebuildTaskRes> reduce(List<org.apache.ignite.compute.ComputeJobResult>) ,public org.apache.ignite.compute.ComputeJobResultPolicy result(org.apache.ignite.compute.ComputeJobResult, List<org.apache.ignite.compute.ComputeJobResult>) <variables>protected boolean debug,protected transient org.apache.ignite.internal.IgniteEx ignite,protected long start,protected org.apache.ignite.internal.management.cache.CacheIndexesForceRebuildCommandArg taskArg