use of org.apache.ignite.internal.processors.cache.StoredCacheData in project ignite by apache.
the class GridCacheDatabaseSharedManager method readCheckpointAndRestoreMemory.
/**
* {@inheritDoc}
*/
@Override
public void readCheckpointAndRestoreMemory(List<DynamicCacheDescriptor> cachesToStart) throws IgniteCheckedException {
assert !cctx.localNode().isClient();
checkpointReadLock();
try {
if (!F.isEmpty(cachesToStart)) {
for (DynamicCacheDescriptor desc : cachesToStart) {
if (CU.affinityNode(cctx.localNode(), desc.cacheConfiguration().getNodeFilter()))
storeMgr.initializeForCache(desc.groupDescriptor(), new StoredCacheData(desc.cacheConfiguration()));
}
}
CheckpointStatus status = readCheckpointStatus();
cctx.pageStore().initializeForMetastorage();
metaStorage = new MetaStorage(cctx, dataRegionMap.get(METASTORE_DATA_REGION_NAME), (DataRegionMetricsImpl) memMetricsMap.get(METASTORE_DATA_REGION_NAME));
WALPointer restore = restoreMemory(status);
// First, bring memory to the last consistent checkpoint state if needed.
// This method should return a pointer to the last valid record in the WAL.
cctx.wal().resumeLogging(restore);
WALPointer ptr = cctx.wal().log(new MemoryRecoveryRecord(U.currentTimeMillis()));
if (ptr != null) {
cctx.wal().fsync(ptr);
nodeStart(ptr);
}
metaStorage.init(this);
notifyMetastorageReadyForReadWrite();
} catch (StorageException e) {
throw new IgniteCheckedException(e);
} finally {
checkpointReadUnlock();
}
}
use of org.apache.ignite.internal.processors.cache.StoredCacheData in project ignite by apache.
the class FilePageStoreManager method readCacheConfigurations.
/**
* @param dir Cache (group) directory.
* @param ccfgs Cache configurations.
* @throws IgniteCheckedException If failed.
*/
public void readCacheConfigurations(File dir, Map<String, StoredCacheData> ccfgs) throws IgniteCheckedException {
if (dir.getName().startsWith(CACHE_DIR_PREFIX)) {
File conf = new File(dir, CACHE_DATA_FILENAME);
if (conf.exists() && conf.length() > 0) {
StoredCacheData cacheData = readCacheData(conf);
String cacheName = cacheData.config().getName();
if (!ccfgs.containsKey(cacheName))
ccfgs.put(cacheName, cacheData);
else {
U.warn(log, "Cache with name=" + cacheName + " is already registered, skipping config file " + dir.getName());
}
}
} else if (dir.getName().startsWith(CACHE_GRP_DIR_PREFIX))
readCacheGroupCaches(dir, ccfgs);
}
use of org.apache.ignite.internal.processors.cache.StoredCacheData in project ignite by apache.
the class FilePageStoreManager method readCacheConfigurations.
/**
* {@inheritDoc}
*/
@Override
public Map<String, StoredCacheData> readCacheConfigurations() throws IgniteCheckedException {
if (cctx.kernalContext().clientNode())
return Collections.emptyMap();
File[] files = storeWorkDir.listFiles();
if (files == null)
return Collections.emptyMap();
Map<String, StoredCacheData> ccfgs = new HashMap<>();
Arrays.sort(files);
for (File file : files) {
if (file.isDirectory())
readCacheConfigurations(file, ccfgs);
}
return ccfgs;
}
use of org.apache.ignite.internal.processors.cache.StoredCacheData in project ignite by apache.
the class SnapshotRestoreProcess method finishPrepare.
/**
* @param reqId Request ID.
* @param res Results.
* @param errs Errors.
*/
private void finishPrepare(UUID reqId, Map<UUID, SnapshotRestoreOperationResponse> res, Map<UUID, Exception> errs) {
if (ctx.clientNode())
return;
SnapshotRestoreContext opCtx0 = opCtx;
Exception failure = F.first(errs.values());
assert opCtx0 != null || failure != null : "Context has not been created on the node " + ctx.localNodeId();
if (opCtx0 == null || !reqId.equals(opCtx0.reqId)) {
finishProcess(reqId, failure);
return;
}
if (failure == null)
failure = checkNodeLeft(opCtx0.nodes(), res.keySet());
// Context has been created - should rollback changes cluster-wide.
if (failure != null) {
opCtx0.errHnd.accept(failure);
return;
}
Map<Integer, StoredCacheData> globalCfgs = new HashMap<>();
for (Map.Entry<UUID, SnapshotRestoreOperationResponse> e : res.entrySet()) {
if (e.getValue().ccfgs != null) {
for (StoredCacheData cacheData : e.getValue().ccfgs) {
globalCfgs.put(CU.cacheId(cacheData.config().getName()), cacheData);
opCtx0.dirs.add(((FilePageStoreManager) ctx.cache().context().pageStore()).cacheWorkDir(cacheData.config()));
}
}
opCtx0.metasPerNode.put(e.getKey(), new ArrayList<>(e.getValue().metas));
}
opCtx0.cfgs = globalCfgs;
if (U.isLocalNodeCoordinator(ctx.discovery()))
preloadProc.start(reqId, reqId);
}
use of org.apache.ignite.internal.processors.cache.StoredCacheData in project ignite by apache.
the class SnapshotRestoreProcess method prepareContext.
/**
* @param req Request to prepare cache group restore from the snapshot.
* @param metas Local snapshot metadatas.
* @return Snapshot restore operation context.
* @throws IgniteCheckedException If failed.
*/
private SnapshotRestoreContext prepareContext(SnapshotOperationRequest req, Collection<SnapshotMetadata> metas) throws IgniteCheckedException {
if (opCtx != null) {
throw new IgniteCheckedException(OP_REJECT_MSG + "The previous snapshot restore operation was not completed.");
}
GridCacheSharedContext<?, ?> cctx = ctx.cache().context();
// Collection of baseline nodes that must survive and additional discovery data required for the affinity calculation.
DiscoCache discoCache = ctx.discovery().discoCache();
if (!F.transform(discoCache.aliveBaselineNodes(), F.node2id()).containsAll(req.nodes()))
throw new IgniteCheckedException("Restore context cannot be inited since the required baseline nodes missed: " + discoCache);
DiscoCache discoCache0 = discoCache.copy(discoCache.version(), null);
if (F.isEmpty(metas))
return new SnapshotRestoreContext(req, discoCache0, Collections.emptyMap());
if (F.first(metas).pageSize() != cctx.database().pageSize()) {
throw new IgniteCheckedException("Incompatible memory page size " + "[snapshotPageSize=" + F.first(metas).pageSize() + ", local=" + cctx.database().pageSize() + ", snapshot=" + req.snapshotName() + ", nodeId=" + cctx.localNodeId() + ']');
}
Map<String, StoredCacheData> cfgsByName = new HashMap<>();
FilePageStoreManager pageStore = (FilePageStoreManager) cctx.pageStore();
// Metastorage can be restored only manually by directly copying files.
for (SnapshotMetadata meta : metas) {
for (File snpCacheDir : cctx.snapshotMgr().snapshotCacheDirectories(req.snapshotName(), meta.folderName(), name -> !METASTORAGE_CACHE_NAME.equals(name))) {
String grpName = FilePageStoreManager.cacheGroupName(snpCacheDir);
if (!F.isEmpty(req.groups()) && !req.groups().contains(grpName))
continue;
File cacheDir = pageStore.cacheWorkDir(snpCacheDir.getName().startsWith(CACHE_GRP_DIR_PREFIX), grpName);
if (cacheDir.exists()) {
if (!cacheDir.isDirectory()) {
throw new IgniteCheckedException("Unable to restore cache group, file with required directory " + "name already exists [group=" + grpName + ", file=" + cacheDir + ']');
}
if (cacheDir.list().length > 0) {
throw new IgniteCheckedException("Unable to restore cache group - directory is not empty. " + "Cache group should be destroyed manually before perform restore operation " + "[group=" + grpName + ", dir=" + cacheDir + ']');
}
if (!cacheDir.delete()) {
throw new IgniteCheckedException("Unable to remove empty cache directory " + "[group=" + grpName + ", dir=" + cacheDir + ']');
}
}
File tmpCacheDir = formatTmpDirName(cacheDir);
if (tmpCacheDir.exists()) {
throw new IgniteCheckedException("Unable to restore cache group, temp directory already exists " + "[group=" + grpName + ", dir=" + tmpCacheDir + ']');
}
pageStore.readCacheConfigurations(snpCacheDir, cfgsByName);
}
}
Map<Integer, StoredCacheData> cfgsById = cfgsByName.values().stream().collect(Collectors.toMap(v -> CU.cacheId(v.config().getName()), v -> v));
return new SnapshotRestoreContext(req, discoCache0, cfgsById);
}
Aggregations