/* * 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.platform.utils; import java.lang.management.ManagementFactory; import java.net.InetSocketAddress; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.ServiceLoader; import java.util.Set; import javax.cache.configuration.Factory; import javax.cache.expiry.ExpiryPolicy; import org.apache.ignite.IgniteException; import org.apache.ignite.binary.BinaryBasicNameMapper; import org.apache.ignite.binary.BinaryRawReader; import org.apache.ignite.binary.BinaryRawWriter; import org.apache.ignite.cache.CacheAtomicityMode; import org.apache.ignite.cache.CacheMode; import org.apache.ignite.cache.CacheRebalanceMode; import org.apache.ignite.cache.CacheWriteSynchronizationMode; import org.apache.ignite.cache.PartitionLossPolicy; import org.apache.ignite.cache.QueryEntity; import org.apache.ignite.cache.QueryIndex; import org.apache.ignite.cache.QueryIndexType; import org.apache.ignite.cache.affinity.AffinityFunction; import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction; import org.apache.ignite.cache.eviction.EvictionPolicy; import org.apache.ignite.cache.eviction.fifo.FifoEvictionPolicy; import org.apache.ignite.cache.eviction.lru.LruEvictionPolicy; import org.apache.ignite.configuration.AtomicConfiguration; import org.apache.ignite.configuration.BinaryConfiguration; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.DataPageEvictionMode; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.configuration.MemoryConfiguration; import org.apache.ignite.configuration.MemoryPolicyConfiguration; import org.apache.ignite.configuration.NearCacheConfiguration; import org.apache.ignite.configuration.TransactionConfiguration; import org.apache.ignite.internal.binary.BinaryArrayIdentityResolver; import org.apache.ignite.internal.binary.BinaryIdentityResolver; import org.apache.ignite.internal.binary.BinaryRawReaderEx; import org.apache.ignite.internal.binary.BinaryRawWriterEx; import org.apache.ignite.internal.processors.platform.cache.affinity.PlatformAffinityFunction; import org.apache.ignite.internal.processors.platform.cache.expiry.PlatformExpiryPolicyFactory; import org.apache.ignite.internal.processors.platform.plugin.cache.PlatformCachePluginConfiguration; import org.apache.ignite.platform.dotnet.PlatformDotNetAffinityFunction; import org.apache.ignite.platform.dotnet.PlatformDotNetBinaryConfiguration; import org.apache.ignite.platform.dotnet.PlatformDotNetBinaryTypeConfiguration; import org.apache.ignite.platform.dotnet.PlatformDotNetCacheStoreFactoryNative; import org.apache.ignite.platform.dotnet.PlatformDotNetConfiguration; import org.apache.ignite.plugin.CachePluginConfiguration; import org.apache.ignite.plugin.platform.PlatformCachePluginConfigurationClosure; import org.apache.ignite.plugin.platform.PlatformCachePluginConfigurationClosureFactory; import org.apache.ignite.plugin.platform.PlatformPluginConfigurationClosure; import org.apache.ignite.plugin.platform.PlatformPluginConfigurationClosureFactory; import org.apache.ignite.spi.communication.CommunicationSpi; import org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi; import org.apache.ignite.spi.discovery.DiscoverySpi; import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi; import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder; import org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder; import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder; import org.apache.ignite.spi.eventstorage.EventStorageSpi; import org.apache.ignite.spi.eventstorage.NoopEventStorageSpi; import org.apache.ignite.spi.eventstorage.memory.MemoryEventStorageSpi; import org.apache.ignite.transactions.TransactionConcurrency; import org.apache.ignite.transactions.TransactionIsolation; /** * Configuration utils. */ @SuppressWarnings({"unchecked", "TypeMayBeWeakened"}) public class PlatformConfigurationUtils { /** * Write .Net configuration to the stream. * * @param writer Writer. * @param cfg Configuration. */ public static void writeDotNetConfiguration(BinaryRawWriterEx writer, PlatformDotNetConfiguration cfg) { // 1. Write assemblies. PlatformUtils.writeNullableCollection(writer, cfg.getAssemblies()); PlatformDotNetBinaryConfiguration binaryCfg = cfg.getBinaryConfiguration(); if (binaryCfg != null) { writer.writeBoolean(true); PlatformUtils.writeNullableCollection(writer, binaryCfg.getTypesConfiguration(), new PlatformWriterClosure<PlatformDotNetBinaryTypeConfiguration>() { @Override public void write(BinaryRawWriterEx writer, PlatformDotNetBinaryTypeConfiguration typ) { writer.writeString(typ.getTypeName()); writer.writeString(typ.getNameMapper()); writer.writeString(typ.getIdMapper()); writer.writeString(typ.getSerializer()); writer.writeString(typ.getAffinityKeyFieldName()); writer.writeObject(typ.getKeepDeserialized()); writer.writeBoolean(typ.isEnum()); } }); PlatformUtils.writeNullableCollection(writer, binaryCfg.getTypes()); writer.writeString(binaryCfg.getDefaultNameMapper()); writer.writeString(binaryCfg.getDefaultIdMapper()); writer.writeString(binaryCfg.getDefaultSerializer()); writer.writeBoolean(binaryCfg.isDefaultKeepDeserialized()); } else writer.writeBoolean(false); } /** * Reads cache configuration from a stream. * * @param in Stream. * @return Cache configuration. */ public static CacheConfiguration readCacheConfiguration(BinaryRawReaderEx in) { assert in != null; CacheConfiguration ccfg = new CacheConfiguration(); ccfg.setAtomicityMode(CacheAtomicityMode.fromOrdinal(in.readInt())); ccfg.setBackups(in.readInt()); ccfg.setCacheMode(CacheMode.fromOrdinal(in.readInt())); ccfg.setCopyOnRead(in.readBoolean()); ccfg.setEagerTtl(in.readBoolean()); ccfg.setInvalidate(in.readBoolean()); ccfg.setStoreKeepBinary(in.readBoolean()); ccfg.setLoadPreviousValue(in.readBoolean()); ccfg.setDefaultLockTimeout(in.readLong()); ccfg.setLongQueryWarningTimeout(in.readLong()); ccfg.setMaxConcurrentAsyncOperations(in.readInt()); ccfg.setName(in.readString()); ccfg.setReadFromBackup(in.readBoolean()); ccfg.setRebalanceBatchSize(in.readInt()); ccfg.setRebalanceDelay(in.readLong()); ccfg.setRebalanceMode(CacheRebalanceMode.fromOrdinal(in.readInt())); ccfg.setRebalanceThrottle(in.readLong()); ccfg.setRebalanceTimeout(in.readLong()); ccfg.setSqlEscapeAll(in.readBoolean()); ccfg.setWriteBehindBatchSize(in.readInt()); ccfg.setWriteBehindEnabled(in.readBoolean()); ccfg.setWriteBehindFlushFrequency(in.readLong()); ccfg.setWriteBehindFlushSize(in.readInt()); ccfg.setWriteBehindFlushThreadCount(in.readInt()); ccfg.setWriteBehindCoalescing(in.readBoolean()); ccfg.setWriteSynchronizationMode(CacheWriteSynchronizationMode.fromOrdinal(in.readInt())); ccfg.setReadThrough(in.readBoolean()); ccfg.setWriteThrough(in.readBoolean()); ccfg.setStatisticsEnabled(in.readBoolean()); String memoryPolicyName = in.readString(); if (memoryPolicyName != null) ccfg.setMemoryPolicyName(memoryPolicyName); ccfg.setPartitionLossPolicy(PartitionLossPolicy.fromOrdinal((byte)in.readInt())); Object storeFactory = in.readObjectDetached(); if (storeFactory != null) ccfg.setCacheStoreFactory(new PlatformDotNetCacheStoreFactoryNative(storeFactory)); int qryEntCnt = in.readInt(); if (qryEntCnt > 0) { Collection<QueryEntity> entities = new ArrayList<>(qryEntCnt); for (int i = 0; i < qryEntCnt; i++) entities.add(readQueryEntity(in)); ccfg.setQueryEntities(entities); } if (in.readBoolean()) ccfg.setNearConfiguration(readNearConfiguration(in)); ccfg.setEvictionPolicy(readEvictionPolicy(in)); if (ccfg.getEvictionPolicy() != null) ccfg.setOnheapCacheEnabled(true); ccfg.setAffinity(readAffinityFunction(in)); ccfg.setExpiryPolicyFactory(readExpiryPolicyFactory(in)); int pluginCnt = in.readInt(); if (pluginCnt > 0) { ArrayList<CachePluginConfiguration> plugins = new ArrayList<>(); for (int i = 0; i < pluginCnt; i++) { if (in.readBoolean()) { // Java cache plugin. readCachePluginConfiguration(ccfg, in); } else { // Platform cache plugin. plugins.add(new PlatformCachePluginConfiguration(in.readObjectDetached())); } } if (ccfg.getPluginConfigurations() != null) { Collections.addAll(plugins, ccfg.getPluginConfigurations()); } ccfg.setPluginConfigurations(plugins.toArray(new CachePluginConfiguration[plugins.size()])); } return ccfg; } /** * Reads the expiry policy factory. * * @param in Reader. * @return Expiry policy factory. */ private static Factory<? extends ExpiryPolicy> readExpiryPolicyFactory(BinaryRawReader in) { if (!in.readBoolean()) return null; return new PlatformExpiryPolicyFactory(in.readLong(), in.readLong(), in.readLong()); } /** * Writes the policy factory. * * @param out Writer. */ private static void writeExpiryPolicyFactory(BinaryRawWriter out, Factory<? extends ExpiryPolicy> factory) { if (!(factory instanceof PlatformExpiryPolicyFactory)) { out.writeBoolean(false); return; } out.writeBoolean(true); PlatformExpiryPolicyFactory f = (PlatformExpiryPolicyFactory)factory; out.writeLong(f.getCreate()); out.writeLong(f.getUpdate()); out.writeLong(f.getAccess()); } /** * Reads the near config. * * @param in Stream. * @return NearCacheConfiguration. */ public static NearCacheConfiguration readNearConfiguration(BinaryRawReader in) { NearCacheConfiguration cfg = new NearCacheConfiguration(); cfg.setNearStartSize(in.readInt()); cfg.setNearEvictionPolicy(readEvictionPolicy(in)); return cfg; } /** * Reads the eviction policy. * * @param in Stream. * @return Eviction policy. */ private static EvictionPolicy readEvictionPolicy(BinaryRawReader in) { byte plcTyp = in.readByte(); switch (plcTyp) { case 0: break; case 1: { FifoEvictionPolicy p = new FifoEvictionPolicy(); p.setBatchSize(in.readInt()); p.setMaxSize(in.readInt()); p.setMaxMemorySize(in.readLong()); return p; } case 2: { LruEvictionPolicy p = new LruEvictionPolicy(); p.setBatchSize(in.readInt()); p.setMaxSize(in.readInt()); p.setMaxMemorySize(in.readLong()); return p; } default: assert false; } return null; } /** * Reads the eviction policy. * * @param in Stream. * @return Affinity function. */ public static PlatformAffinityFunction readAffinityFunction(BinaryRawReaderEx in) { byte plcTyp = in.readByte(); if (plcTyp == 0) return null; int partitions = in.readInt(); boolean exclNeighbours = in.readBoolean(); byte overrideFlags = in.readByte(); Object userFunc = in.readObjectDetached(); AffinityFunction baseFunc = null; switch (plcTyp) { case 1: { throw new IllegalStateException("FairAffinityFunction"); } case 2: { RendezvousAffinityFunction f = new RendezvousAffinityFunction(); f.setPartitions(partitions); f.setExcludeNeighbors(exclNeighbours); baseFunc = f; break; } default: assert plcTyp == 3; } return new PlatformAffinityFunction(userFunc, partitions, overrideFlags, baseFunc); } /** * Reads the near config. * * @param out Stream. * @param cfg NearCacheConfiguration. */ @SuppressWarnings("TypeMayBeWeakened") private static void writeNearConfiguration(BinaryRawWriter out, NearCacheConfiguration cfg) { assert cfg != null; out.writeInt(cfg.getNearStartSize()); writeEvictionPolicy(out, cfg.getNearEvictionPolicy()); } /** * Writes the affinity functions. * * @param out Stream. * @param f Affinity. */ private static void writeAffinityFunction(BinaryRawWriter out, AffinityFunction f) { if (f instanceof PlatformDotNetAffinityFunction) f = ((PlatformDotNetAffinityFunction)f).getFunc(); if (f instanceof RendezvousAffinityFunction) { out.writeByte((byte) 2); RendezvousAffinityFunction f0 = (RendezvousAffinityFunction) f; out.writeInt(f0.getPartitions()); out.writeBoolean(f0.isExcludeNeighbors()); out.writeByte((byte) 0); // override flags out.writeObject(null); // user func } else if (f instanceof PlatformAffinityFunction) { PlatformAffinityFunction f0 = (PlatformAffinityFunction) f; AffinityFunction baseFunc = f0.getBaseFunc(); if (baseFunc instanceof RendezvousAffinityFunction) { out.writeByte((byte) 2); out.writeInt(f0.partitions()); out.writeBoolean(((RendezvousAffinityFunction) baseFunc).isExcludeNeighbors()); out.writeByte(f0.getOverrideFlags()); out.writeObject(f0.getUserFunc()); } else { out.writeByte((byte) 3); out.writeInt(f0.partitions()); out.writeBoolean(false); // exclude neighbors out.writeByte(f0.getOverrideFlags()); out.writeObject(f0.getUserFunc()); } } else { out.writeByte((byte) 0); } } /** * Writes the eviction policy. * @param out Stream. * @param p Policy. */ @SuppressWarnings("TypeMayBeWeakened") private static void writeEvictionPolicy(BinaryRawWriter out, EvictionPolicy p) { if (p instanceof FifoEvictionPolicy) { out.writeByte((byte)1); FifoEvictionPolicy p0 = (FifoEvictionPolicy)p; out.writeInt(p0.getBatchSize()); out.writeInt(p0.getMaxSize()); out.writeLong(p0.getMaxMemorySize()); } else if (p instanceof LruEvictionPolicy) { out.writeByte((byte)2); LruEvictionPolicy p0 = (LruEvictionPolicy)p; out.writeInt(p0.getBatchSize()); out.writeInt(p0.getMaxSize()); out.writeLong(p0.getMaxMemorySize()); } else { out.writeByte((byte)0); } } /** * Reads the query entity. * * @param in Stream. * @return QueryEntity. */ private static QueryEntity readQueryEntity(BinaryRawReader in) { QueryEntity res = new QueryEntity(); res.setKeyType(in.readString()); res.setValueType(in.readString()); res.setTableName(in.readString()); // Fields int cnt = in.readInt(); Set<String> keyFields = new HashSet<>(cnt); if (cnt > 0) { LinkedHashMap<String, String> fields = new LinkedHashMap<>(cnt); for (int i = 0; i < cnt; i++) { String fieldName = in.readString(); String fieldType = in.readString(); fields.put(fieldName, fieldType); if (in.readBoolean()) keyFields.add(fieldName); } res.setFields(fields); if (!keyFields.isEmpty()) res.setKeyFields(keyFields); } // Aliases cnt = in.readInt(); if (cnt > 0) { Map<String, String> aliases = new HashMap<>(cnt); for (int i = 0; i < cnt; i++) aliases.put(in.readString(), in.readString()); res.setAliases(aliases); } // Indexes cnt = in.readInt(); if (cnt > 0) { Collection<QueryIndex> indexes = new ArrayList<>(cnt); for (int i = 0; i < cnt; i++) indexes.add(readQueryIndex(in)); res.setIndexes(indexes); } res.setKeyFieldName(in.readString()); res.setValueFieldName(in.readString()); return res; } /** * Reads the query index. * * @param in Reader. * @return Query index. */ private static QueryIndex readQueryIndex(BinaryRawReader in) { QueryIndex res = new QueryIndex(); res.setName(in.readString()); res.setIndexType(QueryIndexType.values()[in.readByte()]); int cnt = in.readInt(); if (cnt > 0) { LinkedHashMap<String, Boolean> fields = new LinkedHashMap<>(cnt); for (int i = 0; i < cnt; i++) fields.put(in.readString(), !in.readBoolean()); res.setFields(fields); } return res; } /** * Reads Ignite configuration. * @param in Reader. * @param cfg Configuration. */ public static void readIgniteConfiguration(BinaryRawReaderEx in, IgniteConfiguration cfg) { if (in.readBoolean()) cfg.setClientMode(in.readBoolean()); int[] eventTypes = in.readIntArray(); if (eventTypes != null) cfg.setIncludeEventTypes(eventTypes); if (in.readBoolean()) cfg.setMetricsExpireTime(in.readLong()); if (in.readBoolean()) cfg.setMetricsHistorySize(in.readInt()); if (in.readBoolean()) cfg.setMetricsLogFrequency(in.readLong()); if (in.readBoolean()) cfg.setMetricsUpdateFrequency(in.readLong()); if (in.readBoolean()) cfg.setNetworkSendRetryCount(in.readInt()); if (in.readBoolean()) cfg.setNetworkSendRetryDelay(in.readLong()); if (in.readBoolean()) cfg.setNetworkTimeout(in.readLong()); String workDir = in.readString(); if (workDir != null) cfg.setWorkDirectory(workDir); String localHost = in.readString(); if (localHost != null) cfg.setLocalHost(localHost); if (in.readBoolean()) cfg.setDaemon(in.readBoolean()); if (in.readBoolean()) cfg.setLateAffinityAssignment(in.readBoolean()); if (in.readBoolean()) cfg.setFailureDetectionTimeout(in.readLong()); if (in.readBoolean()) cfg.setClientFailureDetectionTimeout(in.readLong()); readCacheConfigurations(in, cfg); readDiscoveryConfiguration(in, cfg); if (in.readBoolean()) { TcpCommunicationSpi comm = new TcpCommunicationSpi(); comm.setAckSendThreshold(in.readInt()); comm.setConnectTimeout(in.readLong()); comm.setDirectBuffer(in.readBoolean()); comm.setDirectSendBuffer(in.readBoolean()); comm.setIdleConnectionTimeout(in.readLong()); comm.setLocalAddress(in.readString()); comm.setLocalPort(in.readInt()); comm.setLocalPortRange(in.readInt()); comm.setMaxConnectTimeout(in.readLong()); comm.setMessageQueueLimit(in.readInt()); comm.setReconnectCount(in.readInt()); comm.setSelectorsCount(in.readInt()); comm.setSlowClientQueueLimit(in.readInt()); comm.setSocketReceiveBuffer(in.readInt()); comm.setSocketSendBuffer(in.readInt()); comm.setTcpNoDelay(in.readBoolean()); comm.setUnacknowledgedMessagesBufferSize(in.readInt()); cfg.setCommunicationSpi(comm); } if (in.readBoolean()) { // binary config is present if (cfg.getBinaryConfiguration() == null) cfg.setBinaryConfiguration(new BinaryConfiguration()); if (in.readBoolean()) // compact footer is set cfg.getBinaryConfiguration().setCompactFooter(in.readBoolean()); if (in.readBoolean()) { // Simple name mapper. cfg.getBinaryConfiguration().setNameMapper(new BinaryBasicNameMapper(true)); } } int attrCnt = in.readInt(); if (attrCnt > 0) { Map<String, Object> attrs = new HashMap<>(attrCnt); for (int i = 0; i < attrCnt; i++) attrs.put(in.readString(), in.readObject()); cfg.setUserAttributes(attrs); } if (in.readBoolean()) { AtomicConfiguration atomic = new AtomicConfiguration(); atomic.setAtomicSequenceReserveSize(in.readInt()); atomic.setBackups(in.readInt()); atomic.setCacheMode(CacheMode.fromOrdinal(in.readInt())); cfg.setAtomicConfiguration(atomic); } if (in.readBoolean()) { TransactionConfiguration tx = new TransactionConfiguration(); tx.setPessimisticTxLogSize(in.readInt()); tx.setDefaultTxConcurrency(TransactionConcurrency.fromOrdinal(in.readInt())); tx.setDefaultTxIsolation(TransactionIsolation.fromOrdinal(in.readInt())); tx.setDefaultTxTimeout(in.readLong()); tx.setPessimisticTxLogLinger(in.readInt()); cfg.setTransactionConfiguration(tx); } switch (in.readByte()) { case 1: cfg.setEventStorageSpi(new NoopEventStorageSpi()); break; case 2: cfg.setEventStorageSpi(new MemoryEventStorageSpi() .setExpireCount(in.readLong()) .setExpireAgeMs(in.readLong())); break; } if (in.readBoolean()) cfg.setMemoryConfiguration(readMemoryConfiguration(in)); readPluginConfiguration(cfg, in); } /** * Reads cache configurations from a stream and updates provided IgniteConfiguration. * * @param cfg IgniteConfiguration to update. * @param in Reader. */ private static void readCacheConfigurations(BinaryRawReaderEx in, IgniteConfiguration cfg) { int len = in.readInt(); if (len == 0) return; List<CacheConfiguration> caches = new ArrayList<>(); for (int i = 0; i < len; i++) caches.add(readCacheConfiguration(in)); CacheConfiguration[] oldCaches = cfg.getCacheConfiguration(); CacheConfiguration[] caches0 = caches.toArray(new CacheConfiguration[caches.size()]); if (oldCaches == null) cfg.setCacheConfiguration(caches0); else { CacheConfiguration[] mergedCaches = new CacheConfiguration[oldCaches.length + caches.size()]; System.arraycopy(oldCaches, 0, mergedCaches, 0, oldCaches.length); System.arraycopy(caches0, 0, mergedCaches, oldCaches.length, caches.size()); cfg.setCacheConfiguration(mergedCaches); } } /** * Reads discovery configuration from a stream and updates provided IgniteConfiguration. * * @param cfg IgniteConfiguration to update. * @param in Reader. */ private static void readDiscoveryConfiguration(BinaryRawReader in, IgniteConfiguration cfg) { boolean hasConfig = in.readBoolean(); if (!hasConfig) return; TcpDiscoverySpi disco = new TcpDiscoverySpi(); boolean hasIpFinder = in.readBoolean(); if (hasIpFinder) { byte ipFinderType = in.readByte(); int addrCount = in.readInt(); ArrayList<String> addrs = null; if (addrCount > 0) { addrs = new ArrayList<>(addrCount); for (int i = 0; i < addrCount; i++) addrs.add(in.readString()); } TcpDiscoveryVmIpFinder finder = null; if (ipFinderType == 1) { finder = new TcpDiscoveryVmIpFinder(); } else if (ipFinderType == 2) { TcpDiscoveryMulticastIpFinder finder0 = new TcpDiscoveryMulticastIpFinder(); finder0.setLocalAddress(in.readString()); finder0.setMulticastGroup(in.readString()); finder0.setMulticastPort(in.readInt()); finder0.setAddressRequestAttempts(in.readInt()); finder0.setResponseWaitTime(in.readInt()); boolean hasTtl = in.readBoolean(); if (hasTtl) finder0.setTimeToLive(in.readInt()); finder = finder0; } else { assert false; } finder.setAddresses(addrs); disco.setIpFinder(finder); } disco.setSocketTimeout(in.readLong()); disco.setAckTimeout(in.readLong()); disco.setMaxAckTimeout(in.readLong()); disco.setNetworkTimeout(in.readLong()); disco.setJoinTimeout(in.readLong()); disco.setForceServerMode(in.readBoolean()); disco.setClientReconnectDisabled(in.readBoolean()); disco.setLocalAddress(in.readString()); disco.setReconnectCount(in.readInt()); disco.setLocalPort(in.readInt()); disco.setLocalPortRange(in.readInt()); disco.setStatisticsPrintFrequency(in.readLong()); disco.setIpFinderCleanFrequency(in.readLong()); disco.setThreadPriority(in.readInt()); disco.setTopHistorySize(in.readInt()); cfg.setDiscoverySpi(disco); } /** * Writes cache configuration. * * @param writer Writer. * @param ccfg Configuration. */ public static void writeCacheConfiguration(BinaryRawWriter writer, CacheConfiguration ccfg) { assert writer != null; assert ccfg != null; writeEnumInt(writer, ccfg.getAtomicityMode(), CacheConfiguration.DFLT_CACHE_ATOMICITY_MODE); writer.writeInt(ccfg.getBackups()); writeEnumInt(writer, ccfg.getCacheMode(), CacheConfiguration.DFLT_CACHE_MODE); writer.writeBoolean(ccfg.isCopyOnRead()); writer.writeBoolean(ccfg.isEagerTtl()); writer.writeBoolean(ccfg.isInvalidate()); writer.writeBoolean(ccfg.isStoreKeepBinary()); writer.writeBoolean(ccfg.isLoadPreviousValue()); writer.writeLong(ccfg.getDefaultLockTimeout()); writer.writeLong(ccfg.getLongQueryWarningTimeout()); writer.writeInt(ccfg.getMaxConcurrentAsyncOperations()); writer.writeString(ccfg.getName()); writer.writeBoolean(ccfg.isReadFromBackup()); writer.writeInt(ccfg.getRebalanceBatchSize()); writer.writeLong(ccfg.getRebalanceDelay()); writeEnumInt(writer, ccfg.getRebalanceMode(), CacheConfiguration.DFLT_REBALANCE_MODE); writer.writeLong(ccfg.getRebalanceThrottle()); writer.writeLong(ccfg.getRebalanceTimeout()); writer.writeBoolean(ccfg.isSqlEscapeAll()); writer.writeInt(ccfg.getWriteBehindBatchSize()); writer.writeBoolean(ccfg.isWriteBehindEnabled()); writer.writeLong(ccfg.getWriteBehindFlushFrequency()); writer.writeInt(ccfg.getWriteBehindFlushSize()); writer.writeInt(ccfg.getWriteBehindFlushThreadCount()); writer.writeBoolean(ccfg.getWriteBehindCoalescing()); writeEnumInt(writer, ccfg.getWriteSynchronizationMode()); writer.writeBoolean(ccfg.isReadThrough()); writer.writeBoolean(ccfg.isWriteThrough()); writer.writeBoolean(ccfg.isStatisticsEnabled()); writer.writeString(ccfg.getMemoryPolicyName()); writer.writeInt(ccfg.getPartitionLossPolicy().ordinal()); if (ccfg.getCacheStoreFactory() instanceof PlatformDotNetCacheStoreFactoryNative) writer.writeObject(((PlatformDotNetCacheStoreFactoryNative)ccfg.getCacheStoreFactory()).getNativeFactory()); else writer.writeObject(null); Collection<QueryEntity> qryEntities = ccfg.getQueryEntities(); if (qryEntities != null) { writer.writeInt(qryEntities.size()); for (QueryEntity e : qryEntities) writeQueryEntity(writer, e); } else writer.writeInt(0); NearCacheConfiguration nearCfg = ccfg.getNearConfiguration(); if (nearCfg != null) { writer.writeBoolean(true); writeNearConfiguration(writer, nearCfg); } else writer.writeBoolean(false); writeEvictionPolicy(writer, ccfg.getEvictionPolicy()); writeAffinityFunction(writer, ccfg.getAffinity()); writeExpiryPolicyFactory(writer, ccfg.getExpiryPolicyFactory()); CachePluginConfiguration[] plugins = ccfg.getPluginConfigurations(); if (plugins != null) { int cnt = 0; for (CachePluginConfiguration cfg : plugins) { if (cfg instanceof PlatformCachePluginConfiguration) cnt++; } writer.writeInt(cnt); for (CachePluginConfiguration cfg : plugins) { if (cfg instanceof PlatformCachePluginConfiguration) writer.writeObject(((PlatformCachePluginConfiguration)cfg).nativeCfg()); } } } /** * Write query entity. * * @param writer Writer. * @param queryEntity Query entity. */ private static void writeQueryEntity(BinaryRawWriter writer, QueryEntity queryEntity) { assert queryEntity != null; writer.writeString(queryEntity.getKeyType()); writer.writeString(queryEntity.getValueType()); writer.writeString(queryEntity.getTableName()); // Fields LinkedHashMap<String, String> fields = queryEntity.getFields(); if (fields != null) { Set<String> keyFields = queryEntity.getKeyFields(); writer.writeInt(fields.size()); for (Map.Entry<String, String> field : fields.entrySet()) { writer.writeString(field.getKey()); writer.writeString(field.getValue()); writer.writeBoolean(keyFields != null && keyFields.contains(field.getKey())); } } else writer.writeInt(0); // Aliases Map<String, String> aliases = queryEntity.getAliases(); if (aliases != null) { writer.writeInt(aliases.size()); for (Map.Entry<String, String> alias : aliases.entrySet()) { writer.writeString(alias.getKey()); writer.writeString(alias.getValue()); } } else writer.writeInt(0); // Indexes Collection<QueryIndex> indexes = queryEntity.getIndexes(); if (indexes != null) { writer.writeInt(indexes.size()); for (QueryIndex index : indexes) writeQueryIndex(writer, index); } else writer.writeInt(0); writer.writeString(queryEntity.getKeyFieldName()); writer.writeString(queryEntity.getValueFieldName()); } /** * Writer query index. * * @param writer Writer. * @param index Index. */ private static void writeQueryIndex(BinaryRawWriter writer, QueryIndex index) { assert index != null; writer.writeString(index.getName()); writeEnumByte(writer, index.getIndexType()); LinkedHashMap<String, Boolean> fields = index.getFields(); if (fields != null) { writer.writeInt(fields.size()); for (Map.Entry<String, Boolean> field : fields.entrySet()) { writer.writeString(field.getKey()); writer.writeBoolean(!field.getValue()); } } else writer.writeInt(0); } /** * Writes Ignite configuration. * * @param w Writer. * @param cfg Configuration. */ public static void writeIgniteConfiguration(BinaryRawWriter w, IgniteConfiguration cfg) { assert w != null; assert cfg != null; w.writeBoolean(true); w.writeBoolean(cfg.isClientMode()); w.writeIntArray(cfg.getIncludeEventTypes()); w.writeBoolean(true); w.writeLong(cfg.getMetricsExpireTime()); w.writeBoolean(true); w.writeInt(cfg.getMetricsHistorySize()); w.writeBoolean(true); w.writeLong(cfg.getMetricsLogFrequency()); w.writeBoolean(true); w.writeLong(cfg.getMetricsUpdateFrequency()); w.writeBoolean(true); w.writeInt(cfg.getNetworkSendRetryCount()); w.writeBoolean(true); w.writeLong(cfg.getNetworkSendRetryDelay()); w.writeBoolean(true); w.writeLong(cfg.getNetworkTimeout()); w.writeString(cfg.getWorkDirectory()); w.writeString(cfg.getLocalHost()); w.writeBoolean(true); w.writeBoolean(cfg.isDaemon()); w.writeBoolean(true); w.writeBoolean(cfg.isLateAffinityAssignment()); w.writeBoolean(true); w.writeLong(cfg.getFailureDetectionTimeout()); w.writeBoolean(true); w.writeLong(cfg.getClientFailureDetectionTimeout()); CacheConfiguration[] cacheCfg = cfg.getCacheConfiguration(); if (cacheCfg != null) { w.writeInt(cacheCfg.length); for (CacheConfiguration ccfg : cacheCfg) writeCacheConfiguration(w, ccfg); } else w.writeInt(0); writeDiscoveryConfiguration(w, cfg.getDiscoverySpi()); CommunicationSpi comm = cfg.getCommunicationSpi(); if (comm instanceof TcpCommunicationSpi) { w.writeBoolean(true); TcpCommunicationSpi tcp = (TcpCommunicationSpi) comm; w.writeInt(tcp.getAckSendThreshold()); w.writeLong(tcp.getConnectTimeout()); w.writeBoolean(tcp.isDirectBuffer()); w.writeBoolean(tcp.isDirectSendBuffer()); w.writeLong(tcp.getIdleConnectionTimeout()); w.writeString(tcp.getLocalAddress()); w.writeInt(tcp.getLocalPort()); w.writeInt(tcp.getLocalPortRange()); w.writeLong(tcp.getMaxConnectTimeout()); w.writeInt(tcp.getMessageQueueLimit()); w.writeInt(tcp.getReconnectCount()); w.writeInt(tcp.getSelectorsCount()); w.writeInt(tcp.getSlowClientQueueLimit()); w.writeInt(tcp.getSocketReceiveBuffer()); w.writeInt(tcp.getSocketSendBuffer()); w.writeBoolean(tcp.isTcpNoDelay()); w.writeInt(tcp.getUnacknowledgedMessagesBufferSize()); } else w.writeBoolean(false); BinaryConfiguration bc = cfg.getBinaryConfiguration(); if (bc != null) { w.writeBoolean(true); // binary config exists w.writeBoolean(true); // compact footer is set w.writeBoolean(bc.isCompactFooter()); w.writeBoolean(bc.getNameMapper() instanceof BinaryBasicNameMapper && ((BinaryBasicNameMapper)(bc.getNameMapper())).isSimpleName()); } else w.writeBoolean(false); Map<String, ?> attrs = cfg.getUserAttributes(); if (attrs != null) { w.writeInt(attrs.size()); for (Map.Entry<String, ?> e : attrs.entrySet()) { w.writeString(e.getKey()); w.writeObject(e.getValue()); } } else w.writeInt(0); AtomicConfiguration atomic = cfg.getAtomicConfiguration(); if (atomic != null) { w.writeBoolean(true); w.writeInt(atomic.getAtomicSequenceReserveSize()); w.writeInt(atomic.getBackups()); writeEnumInt(w, atomic.getCacheMode(), AtomicConfiguration.DFLT_CACHE_MODE); } else w.writeBoolean(false); TransactionConfiguration tx = cfg.getTransactionConfiguration(); if (tx != null) { w.writeBoolean(true); w.writeInt(tx.getPessimisticTxLogSize()); writeEnumInt(w, tx.getDefaultTxConcurrency(), TransactionConfiguration.DFLT_TX_CONCURRENCY); writeEnumInt(w, tx.getDefaultTxIsolation(), TransactionConfiguration.DFLT_TX_ISOLATION); w.writeLong(tx.getDefaultTxTimeout()); w.writeInt(tx.getPessimisticTxLogLinger()); } else w.writeBoolean(false); EventStorageSpi evtStorageSpi = cfg.getEventStorageSpi(); if (evtStorageSpi == null) w.writeByte((byte) 0); else if (evtStorageSpi instanceof NoopEventStorageSpi) w.writeByte((byte) 1); else if (evtStorageSpi instanceof MemoryEventStorageSpi) { w.writeByte((byte) 2); w.writeLong(((MemoryEventStorageSpi)evtStorageSpi).getExpireCount()); w.writeLong(((MemoryEventStorageSpi)evtStorageSpi).getExpireAgeMs()); } writeMemoryConfiguration(w, cfg.getMemoryConfiguration()); w.writeString(cfg.getIgniteHome()); w.writeLong(ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getInit()); w.writeLong(ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getMax()); } /** * Writes discovery configuration. * * @param w Writer. * @param spi Disco. */ private static void writeDiscoveryConfiguration(BinaryRawWriter w, DiscoverySpi spi) { assert w != null; assert spi != null; if (!(spi instanceof TcpDiscoverySpi)) { w.writeBoolean(false); return; } w.writeBoolean(true); TcpDiscoverySpi tcp = (TcpDiscoverySpi)spi; TcpDiscoveryIpFinder finder = tcp.getIpFinder(); if (finder instanceof TcpDiscoveryVmIpFinder) { w.writeBoolean(true); boolean isMulticast = finder instanceof TcpDiscoveryMulticastIpFinder; w.writeByte((byte)(isMulticast ? 2 : 1)); Collection<InetSocketAddress> addrs = finder.getRegisteredAddresses(); w.writeInt(addrs.size()); for (InetSocketAddress a : addrs) w.writeString(a.toString()); if (isMulticast) { TcpDiscoveryMulticastIpFinder multiFinder = (TcpDiscoveryMulticastIpFinder) finder; w.writeString(multiFinder.getLocalAddress()); w.writeString(multiFinder.getMulticastGroup()); w.writeInt(multiFinder.getMulticastPort()); w.writeInt(multiFinder.getAddressRequestAttempts()); w.writeInt(multiFinder.getResponseWaitTime()); int ttl = multiFinder.getTimeToLive(); w.writeBoolean(ttl != -1); if (ttl != -1) w.writeInt(ttl); } } else w.writeBoolean(false); w.writeLong(tcp.getSocketTimeout()); w.writeLong(tcp.getAckTimeout()); w.writeLong(tcp.getMaxAckTimeout()); w.writeLong(tcp.getNetworkTimeout()); w.writeLong(tcp.getJoinTimeout()); w.writeBoolean(tcp.isForceServerMode()); w.writeBoolean(tcp.isClientReconnectDisabled()); w.writeString(tcp.getLocalAddress()); w.writeInt(tcp.getReconnectCount()); w.writeInt(tcp.getLocalPort()); w.writeInt(tcp.getLocalPortRange()); w.writeLong(tcp.getStatisticsPrintFrequency()); w.writeLong(tcp.getIpFinderCleanFrequency()); w.writeInt(tcp.getThreadPriority()); w.writeInt((int)tcp.getTopHistorySize()); } /** * Writes enum as byte. * * @param w Writer. * @param e Enum. */ private static void writeEnumByte(BinaryRawWriter w, Enum e) { w.writeByte(e == null ? 0 : (byte)e.ordinal()); } /** * Writes enum as int. * * @param w Writer. * @param e Enum. */ private static void writeEnumInt(BinaryRawWriter w, Enum e) { w.writeInt(e == null ? 0 : e.ordinal()); } /** * Writes enum as int. * * @param w Writer. * @param e Enum. */ private static void writeEnumInt(BinaryRawWriter w, Enum e, Enum def) { assert def != null; w.writeInt(e == null ? def.ordinal() : e.ordinal()); } /** * Reads resolver * * @param r Reader. * @return Resolver. */ private static BinaryIdentityResolver readBinaryIdentityResolver(BinaryRawReader r) { int type = r.readByte(); switch (type) { case 0: return null; case 1: return new BinaryArrayIdentityResolver(); default: assert false; return null; } } /** * Writes the resolver. * * @param w Writer. * @param resolver Resolver. */ private static void writeBinaryIdentityResolver(BinaryRawWriter w, BinaryIdentityResolver resolver) { if (resolver instanceof BinaryArrayIdentityResolver) w.writeByte((byte)1); else w.writeByte((byte)0); } /** * Reads the plugin configuration. * * @param cfg Ignite configuration to update. * @param in Reader. */ private static void readPluginConfiguration(IgniteConfiguration cfg, BinaryRawReader in) { int cnt = in.readInt(); if (cnt == 0) return; for (int i = 0; i < cnt; i++) { int plugCfgFactoryId = in.readInt(); PlatformPluginConfigurationClosure plugCfg = pluginConfiguration(plugCfgFactoryId); plugCfg.apply(cfg, in); } } /** * Create PlatformPluginConfigurationClosure for the given factory ID. * * @param factoryId Factory ID. * @return PlatformPluginConfigurationClosure. */ private static PlatformPluginConfigurationClosure pluginConfiguration(final int factoryId) { PlatformPluginConfigurationClosureFactory factory = AccessController.doPrivileged( new PrivilegedAction<PlatformPluginConfigurationClosureFactory>() { @Override public PlatformPluginConfigurationClosureFactory run() { for (PlatformPluginConfigurationClosureFactory factory : ServiceLoader.load(PlatformPluginConfigurationClosureFactory.class)) { if (factory.id() == factoryId) return factory; } return null; } }); if (factory == null) { throw new IgniteException("PlatformPluginConfigurationClosureFactory is not found " + "(did you put into the classpath?): " + factoryId); } return factory.create(); } /** * Reads the plugin configuration. * * @param cfg Ignite configuration to update. * @param in Reader. */ private static void readCachePluginConfiguration(CacheConfiguration cfg, BinaryRawReader in) { int plugCfgFactoryId = in.readInt(); PlatformCachePluginConfigurationClosure plugCfg = cachePluginConfiguration(plugCfgFactoryId); plugCfg.apply(cfg, in); } /** * Create PlatformCachePluginConfigurationClosure for the given factory ID. * * @param factoryId Factory ID. * @return PlatformCachePluginConfigurationClosure. */ private static PlatformCachePluginConfigurationClosure cachePluginConfiguration(final int factoryId) { PlatformCachePluginConfigurationClosureFactory factory = AccessController.doPrivileged( new PrivilegedAction<PlatformCachePluginConfigurationClosureFactory>() { @Override public PlatformCachePluginConfigurationClosureFactory run() { for (PlatformCachePluginConfigurationClosureFactory factory : ServiceLoader.load(PlatformCachePluginConfigurationClosureFactory.class)) { if (factory.id() == factoryId) return factory; } return null; } }); if (factory == null) { throw new IgniteException("PlatformPluginConfigurationClosureFactory is not found " + "(did you put into the classpath?): " + factoryId); } return factory.create(); } /** * Reads the memory configuration. * * @param in Reader * @return Config. */ private static MemoryConfiguration readMemoryConfiguration(BinaryRawReader in) { MemoryConfiguration res = new MemoryConfiguration(); res.setSystemCacheInitialSize(in.readLong()) .setSystemCacheMaxSize(in.readLong()) .setPageSize(in.readInt()) .setConcurrencyLevel(in.readInt()) .setDefaultMemoryPolicyName(in.readString()); int cnt = in.readInt(); if (cnt > 0) { MemoryPolicyConfiguration[] plcs = new MemoryPolicyConfiguration[cnt]; for (int i = 0; i < cnt; i++) { MemoryPolicyConfiguration cfg = new MemoryPolicyConfiguration(); cfg.setName(in.readString()) .setInitialSize(in.readLong()) .setMaxSize(in.readLong()) .setSwapFilePath(in.readString()) .setPageEvictionMode(DataPageEvictionMode.values()[in.readInt()]) .setEvictionThreshold(in.readDouble()) .setEmptyPagesPoolSize(in.readInt()); plcs[i] = cfg; } res.setMemoryPolicies(plcs); } return res; } /** * Writes the memory configuration. * * @param w Writer. * @param cfg Config. */ private static void writeMemoryConfiguration(BinaryRawWriter w, MemoryConfiguration cfg) { if (cfg == null) { w.writeBoolean(false); return; } w.writeBoolean(true); w.writeLong(cfg.getSystemCacheInitialSize()); w.writeLong(cfg.getSystemCacheMaxSize()); w.writeInt(cfg.getPageSize()); w.writeInt(cfg.getConcurrencyLevel()); w.writeString(cfg.getDefaultMemoryPolicyName()); MemoryPolicyConfiguration[] plcs = cfg.getMemoryPolicies(); if (plcs != null) { w.writeInt(plcs.length); for (MemoryPolicyConfiguration plc : plcs) { w.writeString(plc.getName()); w.writeLong(plc.getInitialSize()); w.writeLong(plc.getMaxSize()); w.writeString(plc.getSwapFilePath()); w.writeInt(plc.getPageEvictionMode().ordinal()); w.writeDouble(plc.getEvictionThreshold()); w.writeInt(plc.getEmptyPagesPoolSize()); } } else { w.writeInt(0); } } /** * Private constructor. */ private PlatformConfigurationUtils() { // No-op. } }