# ignite-537 merge from sprint-3
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/347f3adb Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/347f3adb Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/347f3adb Branch: refs/heads/ignite-721 Commit: 347f3adba92ba9ca70f9509fc18105f3f5c0d743 Parents: eb85f06 60640de Author: sboikov <sboi...@gridgain.com> Authored: Fri Apr 10 15:10:20 2015 +0300 Committer: sboikov <sboi...@gridgain.com> Committed: Fri Apr 10 15:10:20 2015 +0300 ---------------------------------------------------------------------- assembly/release-hadoop.xml | 4 - bin/ignitevisorcmd.bat | 39 +-- .../examples/MessagingExamplesSelfTest.java | 2 +- .../java8/examples/BasicExamplesSelfTest.java | 3 + .../java8/examples/CacheExamplesSelfTest.java | 4 + .../examples/CheckpointExamplesSelfTest.java | 3 + .../examples/ClusterGroupExampleSelfTest.java | 3 +- .../examples/ContinuationExamplesSelfTest.java | 3 + .../ContinuousMapperExamplesSelfTest.java | 4 +- .../DeploymentExamplesMultiNodeSelfTest.java | 2 + .../examples/DeploymentExamplesSelfTest.java | 2 + .../HibernateL2CacheExampleSelfTest.java | 3 + .../java8/examples/IgfsExamplesSelfTest.java | 3 + .../examples/LifecycleExamplesSelfTest.java | 3 + .../MemcacheRestExamplesMultiNodeSelfTest.java | 2 + .../examples/MemcacheRestExamplesSelfTest.java | 2 + .../examples/MessagingExamplesSelfTest.java | 4 +- .../examples/MonteCarloExamplesSelfTest.java | 3 + .../examples/SpringBeanExamplesSelfTest.java | 3 + .../java8/examples/TaskExamplesSelfTest.java | 2 + .../client/ClientReconnectionSelfTest.java | 67 +++--- .../ignite/codegen/MessageCodeGenerator.java | 1 - modules/core/pom.xml | 2 +- .../java/org/apache/ignite/IgniteCache.java | 18 ++ .../java/org/apache/ignite/IgniteState.java | 2 +- .../configuration/CacheConfiguration.java | 69 +++--- .../configuration/IgniteConfiguration.java | 35 +-- .../internal/ComputeTaskInternalFuture.java | 2 +- .../ignite/internal/GridJobExecuteRequest.java | 10 +- .../ignite/internal/GridJobExecuteResponse.java | 4 +- .../apache/ignite/internal/GridTaskMessage.java | 30 --- .../ignite/internal/GridTaskSessionRequest.java | 6 +- .../org/apache/ignite/internal/IgnitionEx.java | 4 +- .../client/GridClientConfiguration.java | 14 +- .../GridClientConnectionManagerAdapter.java | 2 +- .../router/GridTcpRouterConfiguration.java | 6 +- .../internal/cluster/ClusterGroupAdapter.java | 150 ++++++++++-- .../internal/managers/GridManagerAdapter.java | 4 +- .../discovery/GridDiscoveryManager.java | 32 ++- .../eventstorage/GridEventStorageManager.java | 4 +- .../processors/cache/CacheMetricsImpl.java | 7 +- .../processors/cache/CacheMetricsSnapshot.java | 223 +++++++++++++++++- .../processors/cache/GridCacheAdapter.java | 12 +- .../processors/cache/GridCacheContext.java | 64 ++++- .../cache/GridCacheEvictionManager.java | 6 +- .../cache/GridCacheExplicitLockSpan.java | 2 +- .../processors/cache/GridCacheMapEntry.java | 6 +- .../processors/cache/GridCacheMvcc.java | 2 +- .../cache/GridCacheMvccCandidate.java | 50 +++- .../processors/cache/GridCacheMvccManager.java | 44 +++- .../processors/cache/GridCacheProcessor.java | 52 ++-- .../processors/cache/IgniteCacheProxy.java | 26 ++ .../distributed/GridDistributedCacheEntry.java | 12 +- .../distributed/dht/GridDhtCacheEntry.java | 36 ++- .../distributed/dht/GridDhtLockFuture.java | 15 +- .../dht/GridDhtTransactionalCacheAdapter.java | 14 +- .../distributed/dht/GridDhtTxFinishFuture.java | 22 +- .../cache/distributed/dht/GridDhtTxLocal.java | 2 + .../distributed/dht/GridDhtTxLocalAdapter.java | 30 ++- .../distributed/dht/GridDhtTxPrepareFuture.java | 28 ++- .../dht/atomic/GridDhtAtomicCache.java | 6 +- .../dht/colocated/GridDhtColocatedCache.java | 35 ++- .../colocated/GridDhtColocatedLockFuture.java | 46 +++- .../GridDhtPartitionsExchangeFuture.java | 39 ++- .../distributed/near/GridNearAtomicCache.java | 2 +- .../distributed/near/GridNearCacheEntry.java | 10 +- .../distributed/near/GridNearLockFuture.java | 13 +- .../near/GridNearTransactionalCache.java | 2 +- .../near/GridNearTxFinishFuture.java | 8 +- .../cache/distributed/near/GridNearTxLocal.java | 7 + .../near/GridNearTxPrepareFuture.java | 122 ++++++---- .../near/GridNearTxPrepareRequest.java | 64 +++-- .../local/atomic/GridLocalAtomicCache.java | 6 +- .../cache/query/GridCacheQueryAdapter.java | 2 +- .../continuous/CacheContinuousQueryManager.java | 2 +- .../cache/transactions/IgniteTxAdapter.java | 3 +- .../cache/transactions/IgniteTxHandler.java | 120 +++++++--- .../transactions/IgniteTxLocalAdapter.java | 82 ++++--- .../cache/transactions/IgniteTxManager.java | 7 + .../internal/processors/igfs/IgfsAsyncImpl.java | 4 +- .../ignite/internal/processors/igfs/IgfsEx.java | 4 +- .../processors/igfs/IgfsFileWorker.java | 180 -------------- .../processors/igfs/IgfsFileWorkerBatch.java | 225 +++++++----------- .../processors/igfs/IgfsFileWorkerTask.java | 32 --- .../internal/processors/igfs/IgfsImpl.java | 150 +++++++----- .../internal/processors/igfs/IgfsProcessor.java | 2 +- .../processors/rest/GridRestProcessor.java | 33 +-- .../security/GridSecurityProcessor.java | 13 +- .../processors/security/SecurityContext.java | 8 +- .../security/os/GridOsSecurityProcessor.java | 11 +- .../processors/task/GridTaskProcessor.java | 9 +- .../internal/util/future/GridFutureAdapter.java | 20 +- .../ignite/internal/util/worker/GridWorker.java | 6 +- .../visor/cache/VisorCacheClearTask.java | 3 + .../cache/VisorCacheQueryConfiguration.java | 9 - .../internal/visor/log/VisorLogSearchTask.java | 12 +- .../node/VisorNodeEventsCollectorTask.java | 3 + .../node/VisorSegmentationConfiguration.java | 4 +- .../internal/visor/util/VisorTaskUtils.java | 3 + .../plugin/security/AuthenticationContext.java | 12 +- .../security/GridSecurityCredentials.java | 184 --------------- .../GridSecurityCredentialsBasicProvider.java | 44 ---- .../GridSecurityCredentialsProvider.java | 44 ---- .../plugin/security/GridSecurityException.java | 58 ----- .../plugin/security/GridSecurityPermission.java | 69 ------ .../security/GridSecurityPermissionSet.java | 66 ------ .../plugin/security/GridSecuritySubject.java | 62 ----- .../security/GridSecuritySubjectType.java | 48 ---- .../plugin/security/SecurityCredentials.java | 191 +++++++++++++++ .../SecurityCredentialsBasicProvider.java | 44 ++++ .../security/SecurityCredentialsProvider.java | 44 ++++ .../plugin/security/SecurityException.java | 61 +++++ .../plugin/security/SecurityPermission.java | 69 ++++++ .../plugin/security/SecurityPermissionSet.java | 66 ++++++ .../ignite/plugin/security/SecuritySubject.java | 62 +++++ .../plugin/security/SecuritySubjectType.java | 48 ++++ .../segmentation/GridSegmentationPolicy.java | 47 ---- .../segmentation/GridSegmentationResolver.java | 64 ----- .../plugin/segmentation/SegmentationPolicy.java | 49 ++++ .../segmentation/SegmentationResolver.java | 65 +++++ .../org/apache/ignite/spi/IgniteSpiAdapter.java | 4 +- .../org/apache/ignite/spi/IgniteSpiContext.java | 4 +- .../spi/discovery/DiscoveryMetricsProvider.java | 10 + .../DiscoverySpiNodeAuthenticator.java | 2 +- .../discovery/tcp/TcpClientDiscoverySpi.java | 35 ++- .../spi/discovery/tcp/TcpDiscoverySpi.java | 57 ++++- .../tcp/internal/TcpDiscoveryNode.java | 76 +++++- .../messages/TcpDiscoveryHeartbeatMessage.java | 65 +++++ .../startup/cmdline/CommandLineStartup.java | 7 +- .../internal/GridLifecycleAwareSelfTest.java | 2 +- .../ignite/internal/GridProjectionSelfTest.java | 82 +++++++ .../ignite/internal/GridStartStopSelfTest.java | 8 +- .../CacheMetricsForClusterGroupSelfTest.java | 236 +++++++++++++++++++ .../cache/GridCacheBasicApiAbstractTest.java | 4 +- ...CacheOffHeapMultiThreadedUpdateSelfTest.java | 42 ++-- .../GridCacheOffHeapTieredAbstractSelfTest.java | 4 +- .../cache/GridCacheReloadSelfTest.java | 3 +- .../GridCacheReturnValueTransferSelfTest.java | 15 +- .../IgniteTxMultiThreadedAbstractTest.java | 5 +- ...GridCacheQueueMultiNodeAbstractSelfTest.java | 5 +- .../GridCacheSetAbstractSelfTest.java | 10 +- .../GridCacheSetFailoverAbstractSelfTest.java | 6 +- .../distributed/GridCacheEventAbstractTest.java | 16 +- .../GridCacheNodeFailureAbstractTest.java | 15 +- .../dht/IgniteCacheLockFailoverSelfTest.java | 156 ++++++++++++ .../dht/IgniteCacheMultiTxLockSelfTest.java | 219 +++++++++++++++++ ...licatedNearOnlyMultiNodeFullApiSelfTest.java | 2 +- .../continuous/GridEventConsumeSelfTest.java | 7 +- .../processors/igfs/IgfsAbstractSelfTest.java | 24 +- .../tostring/GridToStringBuilderSelfTest.java | 5 +- .../GridP2PMissedResourceCacheSizeSelfTest.java | 2 +- .../tcp/TcpClientDiscoverySelfTest.java | 5 +- .../testframework/GridSpiTestContext.java | 4 +- .../testframework/junits/GridAbstractTest.java | 6 +- .../junits/spi/GridSpiAbstractTest.java | 72 +----- .../IgniteCacheMetricsSelfTestSuite.java | 4 + .../ignite/testsuites/IgniteCacheTestSuite.java | 3 + .../IgniteSpiDiscoverySelfTestSuite.java | 2 + ...rrentLinkedHashMapMultiThreadedSelfTest.java | 4 +- .../HadoopDefaultMapReducePlannerSelfTest.java | 2 +- .../GridCacheAbstractFieldsQuerySelfTest.java | 10 +- .../processors/cache/GridCacheSwapSelfTest.java | 5 +- ...hePartitionedQueryMultiThreadedSelfTest.java | 2 +- .../cache/IgniteCacheQueryIndexSelfTest.java | 3 +- .../IgniteCachePartitionedQuerySelfTest.java | 5 +- .../IgniteCacheReplicatedQuerySelfTest.java | 18 +- .../processors/cache/GridCacheJtaSelfTest.java | 6 +- .../http/jetty/GridJettyRestHandler.java | 2 +- .../p2p/GridP2PUserVersionChangeSelfTest.java | 8 +- .../ignite/tools/classgen/ClassesGenerator.java | 2 +- .../ignite/visor/commands/VisorConsole.scala | 19 ++ 171 files changed, 3389 insertions(+), 1834 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/347f3adb/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpClientDiscoverySpi.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/347f3adb/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpi.java ---------------------------------------------------------------------- diff --cc modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpi.java index bc0fec5,4b43fec..7bd1a97 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpi.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpi.java @@@ -5302,310 -5186,11 +5324,319 @@@ public class TcpDiscoverySpi extends Tc } /** + * @param node Node created event. + * @return Class loader for custom event unmarshalling. + */ + @Nullable protected ClassLoader customMessageClassLoader(TcpDiscoveryNode node) { + assert ignite != null; + + if (!ignite.configuration().isPeerClassLoadingEnabled()) + return null; + + if (node.id().equals(getLocalNodeId())) + return locLdr; + + DiscoveryDeploymentClassLoader ldr = p2pLdrs.get(node.id()); + + if (ldr == null) + ldr = F.addIfAbsent(p2pLdrs, node.id(), new DiscoveryDeploymentClassLoader(node)); + + return ldr; + } + + /** + * @param joiningNode Joining node. + * @param nodeId Remote node provided data. + * @return Class loader for exchange data unmarshalling. + */ + @Nullable protected ClassLoader exchangeClassLoader(TcpDiscoveryNode joiningNode, UUID nodeId) { + assert joiningNode != null; + assert ignite != null; + + if (!ignite.configuration().isPeerClassLoadingEnabled()) + return null; + + if (nodeId.equals(getLocalNodeId())) + return locLdr; + + TcpDiscoveryNode node; + + if (joiningNode.id().equals(nodeId)) + node = joiningNode; + else { + node = ring.node(nodeId); + + if (node == null) { + if (log.isDebugEnabled()) + log.debug("Node provided exchange data left, will use local class loader " + + "for exchange data [nodeId=" + nodeId + ']'); + + return locLdr; + } + } + + if (node.isClient()) // Do not support loading from client nodes. + return locLdr; + + DiscoveryDeploymentClassLoader ldr = p2pLdrs.get(nodeId); + + if (ldr == null) + ldr = F.addIfAbsent(p2pLdrs, nodeId, new DiscoveryDeploymentClassLoader(node)); + + return ldr; + } + + /** + * @param nodeId Node ID. + * @return Marshalled exchange data. + * @throws IgniteSpiException If failed. + */ + private Map<Integer, byte[]> collectExchangeData(UUID nodeId) throws IgniteSpiException { + Map<Integer, Object> data = exchange.collect(nodeId); + + Map<Integer, byte[]> data0 = U.newHashMap(data.size()); + + for (Map.Entry<Integer, Object> entry : data.entrySet()) { + try { + byte[] bytes = marsh.marshal(entry.getValue()); + + data0.put(entry.getKey(), bytes); + } + catch (IgniteCheckedException e) { + U.error(log, "Failed to marshal discovery data " + + "[comp=" + entry.getKey() + ", data=" + entry.getValue() + ']', e); + + throw new IgniteSpiException("Failed to marshal discovery data.", e); + } + } + + return data0; + } + + /** + * + */ + private class DiscoveryDeploymentClassLoader extends ClassLoader { + /** */ + private final UUID nodeId; + + /** */ + private volatile TcpDiscoveryNode node; + + /** */ + private Socket sock; + + /** */ + private final ReadWriteLock lock = new ReentrantReadWriteLock(); + + /** + * @param node Node. + */ + public DiscoveryDeploymentClassLoader(TcpDiscoveryNode node) { + assert !node.isClient(); + assert !node.id().equals(getLocalNodeId()); + + this.node = node; + + nodeId = node.id(); + } + + /** + * @return Target node ID. + */ + UUID nodeId() { + return nodeId; + } + + /** + * Node left callback. + */ + void onNodeLeft() { + lock.writeLock().lock(); + + try { + if (sock != null) { + if (log.isDebugEnabled()) + log.debug("Closing deployment class loader connection on node left [node=" + nodeId + ']'); + + U.closeQuiet(sock); + + sock = null; + } + + node = null; + } + finally { + lock.writeLock().unlock(); + } + } + + /** + * Closes connection if there is no class loading in progress. + */ + void closeConnectionIfNotUsed() { + if (lock.writeLock().tryLock()) { + try { + if (sock != null) { + if (log.isDebugEnabled()) + log.debug("Closing idle deployment class loader connection [node=" + nodeId + ']'); + + U.closeQuiet(sock); + + sock = null; + } + } + finally { + lock.writeLock().unlock(); + } + } + } + + /** {@inheritDoc} */ + @Override protected Class<?> findClass(String name) throws ClassNotFoundException { + if (node == null) + throw new ClassNotFoundException("Failed to load class, peer node left " + + "[cls=" +name + ", node=" + nodeId + ']'); + + lock.readLock().lock(); + + try { + TcpDiscoveryGetClassResponse res = requestClass(name); + + if (res == null) + throw new ClassNotFoundException("Failed to load class, can not connect to peer node " + + "[cls=" + name + ", node=" + nodeId + ']'); + + if (res.error() != null) + throw new ClassNotFoundException(res.error()); + + assert res.classBytes() != null; + + return defineClass(name, res.classBytes(), 0, res.classBytes().length); + } + finally { + lock.readLock().unlock(); + } + } + + /** + * @param name Class name. + * @return Class response or {@code null} if failed to connect. + */ + @Nullable private synchronized TcpDiscoveryGetClassResponse requestClass(String name) { + TcpDiscoveryGetClassRequest msg = new TcpDiscoveryGetClassRequest(getLocalNodeId(), name); + + for (int i = 0; i < reconCnt; i++) { + if (sock == null) { + TcpDiscoveryNode node0 = node; + + if (node0 == null) + return null; // Node left. + + sock = connect(node0); + + if (sock == null) + break; + } + + try { + return request(sock, msg); + } + catch (IOException | IgniteCheckedException e) { + U.closeQuiet(sock); + + sock = null; + } + } + + node = null; // Consider node failed. + + p2pLdrs.remove(nodeId, this); + + return null; + } + + /** + * @param sock Socket. + * @param msg Message. + * @return Response. + * @throws IOException If request failed. + * @throws IgniteCheckedException If request failed. + */ + private TcpDiscoveryGetClassResponse request(Socket sock, TcpDiscoveryGetClassRequest msg) + throws IOException, IgniteCheckedException + { + long tstamp = U.currentTimeMillis(); + + writeToSocket(sock, msg); + + stats.onMessageSent(msg, U.currentTimeMillis() - tstamp); + + TcpDiscoveryGetClassResponse res = readMessage(sock, null, netTimeout); + + stats.onMessageReceived(res); + + return res; + } + + /** + * @param node Node. + * @return Socket or {@code null} if failed to connect. + */ + private Socket connect(TcpDiscoveryNode node) { + Socket sock = null; + + for (InetSocketAddress addr : getNodeAddresses(node, U.sameMacs(locNode, node))) { + sock = connect(addr); + + if (sock != null) + break; + } + + return sock; + } + + /** + * @param addr Address. + * @return Socket or {@code null} if failed to connect. + */ + private Socket connect(InetSocketAddress addr) { + TcpDiscoveryHandshakeRequest req = new TcpDiscoveryHandshakeRequest(getLocalNodeId()); + + for (int i = 0; i < reconCnt; i++) { + Socket sock = null; + + long tstamp = U.currentTimeMillis(); + + try { + sock = openSocket(addr); + + writeToSocket(sock, req); + + TcpDiscoveryHandshakeResponse res = readMessage(sock, null, netTimeout); + + if (!res.creatorNodeId().equals(nodeId)) + return null; + + stats.onClientSocketInitialized(U.currentTimeMillis() - tstamp); + + return sock; + } + catch (IOException | IgniteCheckedException e) { + U.closeQuiet(sock); + } + } + + return null; + } + } ++ ++ /** + * @param msg Message. + * @param nodeId Node ID. + */ + private static void removeMetrics(TcpDiscoveryHeartbeatMessage msg, UUID nodeId) { + msg.removeMetrics(nodeId); + msg.removeCacheMetrics(nodeId); + } } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/347f3adb/modules/core/src/test/java/org/apache/ignite/internal/processors/continuous/GridEventConsumeSelfTest.java ----------------------------------------------------------------------