blob: 9003ac00257f1141500c2e4a9b090a6552383f84 [file] [log] [blame]
/*
* 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.
*/
package org.apache.ignite.internal.processors.cache.verify;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import javax.cache.Cache;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.cluster.ClusterGroup;
import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.internal.GridKernalContext;
import org.apache.ignite.internal.IgniteKernal;
import org.apache.ignite.internal.processors.cache.CacheGroupContext;
import org.apache.ignite.internal.processors.cache.DynamicCacheDescriptor;
import org.apache.ignite.internal.processors.cache.IgniteInternalCache;
import org.apache.ignite.internal.processors.datastructures.AtomicDataStructureValue;
import org.apache.ignite.internal.processors.datastructures.DataStructureType;
import org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor;
import org.apache.ignite.internal.processors.datastructures.GridCacheAtomicSequenceValue;
import org.apache.ignite.internal.processors.datastructures.GridCacheInternalKey;
import org.apache.ignite.internal.visor.verify.VisorViewCacheCmd;
import org.apache.ignite.lang.IgniteCallable;
import org.apache.ignite.resources.IgniteInstanceResource;
/**
* View cache closure.
*/
public class ViewCacheClosure implements IgniteCallable<List<CacheInfo>> {
/** */
private static final long serialVersionUID = 0L;
/** Regex. */
private String regex;
/** {@code true} to skip cache destroying. */
private VisorViewCacheCmd cmd;
@IgniteInstanceResource
private Ignite ignite;
/**
* @param regex Regex name for stopping caches.
* @param cmd Command.
*/
public ViewCacheClosure(String regex, VisorViewCacheCmd cmd) {
this.regex = regex;
this.cmd = cmd;
}
/** {@inheritDoc} */
@Override public List<CacheInfo> call() throws Exception {
Pattern compiled = Pattern.compile(regex);
List<CacheInfo> cacheInfo = new ArrayList<>();
IgniteKernal k = (IgniteKernal)ignite;
if (cmd == null)
cmd = VisorViewCacheCmd.CACHES;
switch (cmd) {
case SEQ:
collectSequences(k.context(), compiled, cacheInfo);
return cacheInfo;
case GROUPS:
Collection<CacheGroupContext> contexts = k.context().cache().cacheGroups();
for (CacheGroupContext context : contexts) {
if (!compiled.matcher(context.cacheOrGroupName()).find())
continue;
CacheInfo ci = new CacheInfo();
ci.setGrpName(context.cacheOrGroupName());
ci.setGrpId(context.groupId());
ci.setCachesCnt(context.caches().size());
ci.setPartitions(context.config().getAffinity().partitions());
ci.setBackupsCnt(context.config().getBackups());
ci.setAffinityClsName(context.config().getAffinity().getClass().getSimpleName());
ci.setMode(context.config().getCacheMode());
ci.setAtomicityMode(context.config().getAtomicityMode());
ci.setMapped(mapped(context.caches().iterator().next().name()));
cacheInfo.add(ci);
}
return cacheInfo;
default:
Map<String, DynamicCacheDescriptor> descMap = k.context().cache().cacheDescriptors();
for (Map.Entry<String, DynamicCacheDescriptor> entry : descMap.entrySet()) {
DynamicCacheDescriptor desc = entry.getValue();
if (!compiled.matcher(desc.cacheName()).find())
continue;
CacheInfo ci = new CacheInfo();
ci.setCacheName(desc.cacheName());
ci.setCacheId(desc.cacheId());
ci.setGrpName(desc.groupDescriptor().groupName());
ci.setGrpId(desc.groupDescriptor().groupId());
ci.setPartitions(desc.cacheConfiguration().getAffinity().partitions());
ci.setBackupsCnt(desc.cacheConfiguration().getBackups());
ci.setAffinityClsName(desc.cacheConfiguration().getAffinity().getClass().getSimpleName());
ci.setMode(desc.cacheConfiguration().getCacheMode());
ci.setAtomicityMode(desc.cacheConfiguration().getAtomicityMode());
ci.setMapped(mapped(desc.cacheName()));
cacheInfo.add(ci);
}
return cacheInfo;
}
}
/**
* @param cacheName Cache name.
*/
private int mapped(String cacheName) {
int mapped = 0;
ClusterGroup srvs = ignite.cluster().forServers();
Collection<ClusterNode> nodes = srvs.forDataNodes(cacheName).nodes();
for (ClusterNode node : nodes)
mapped += ignite.affinity(cacheName).primaryPartitions(node).length;
return mapped;
}
/**
* @param ctx Context.
* @param compiled Compiled pattern.
* @param cacheInfo Cache info.
*/
private void collectSequences(GridKernalContext ctx, Pattern compiled, List<CacheInfo> cacheInfo) throws IgniteCheckedException {
String dsCacheName = DataStructuresProcessor.ATOMICS_CACHE_NAME + "@default-ds-group";
IgniteInternalCache<GridCacheInternalKey, AtomicDataStructureValue> cache0 = ctx.cache().cache(dsCacheName);
final Iterator<Cache.Entry<GridCacheInternalKey, AtomicDataStructureValue>> iter = cache0.scanIterator(false, null);
while (iter.hasNext()) {
Cache.Entry<GridCacheInternalKey, AtomicDataStructureValue> entry = iter.next();
final AtomicDataStructureValue val = entry.getValue();
if (val.type() == DataStructureType.ATOMIC_SEQ) {
final String name = entry.getKey().name();
if (compiled.matcher(name).find()) {
CacheInfo ci = new CacheInfo();
ci.setSeqName(name);
ci.setSeqVal(((GridCacheAtomicSequenceValue)val).get());
cacheInfo.add(ci);
}
}
}
}
}