Hi Dmitry, Fair enough about the classloaders, but the stack trace looks like it comes from a server node. Why does the client classloader affects classloading on the server?
Regarding the logs from our project - here they are (with levels INFO and FINEST). I see two directions of research: 1) "Failed to deploy user message" errors under high load (many parallel requests); 2) Multiple deployments of a single class (repeated messages like "Class locally deployed: class [B,"), which happen even if there is no high load (e.g. while sequential processing of 10-40 similar requests). I've tried to reproduce the second issue in my test project, with no success to date. What may cause multiple re-deployments of a single class? Or is such behavior (seen in files sequential_redeployments*.log) normal? On Wed, May 17, 2017 at 1:04 PM, Dmitry Pavlov [via Apache Ignite Users] < ml+s70518n12967...@n6.nabble.com> wrote: > Hi Ilya, > > To my mind in this case it's not a problem of Peer Class Loading (PCL). > Please note if you disable PCL in Ignite Configuration, test will fail > anyway. > > In this test LocatorBiPredicate is taken by Jetty from the parent class > loader (test launcher class loader) and cast to IgnitePredicate can't > complete sucessfull because of different class loaders used. > > May I ask to to provide log and/or stacktrace of original deployment > problem in the project? Additionally you may enable debug log level for > deployment. > > Best Regards, > Dmitry Pavlov > > ср, 17 мая 2017 г. в 11:39, Ilya <[hidden email] > <http:///user/SendEmail.jtp?type=node&node=12967&i=0>>: > >> Hi Dmitry! >> >> Do I understand correct that GridDeploymentClassLoader is always on >> server used if peer classloading is enabled? >> >> I've did not reproduce the re-deployment issue, but maybe have found >> another, which is related to deployment. >> Here is the code: >> https://github.com/yakupov/IgniteDeploymentTest >> >> How to execute: >> 1) mvn package in the root; >> 2) execute JUnit test IgnitionRunner#testJetty (it's in the ITest module). >> >> The result is: >> SEVERE: Failed to process message >> [senderId=98138e20-8fe4-4750-8281-a92b2067fdcb, >> messageType=class o.a.i.i.processors.cache.query.GridCacheQueryRequest] >> java.lang.ClassCastException: LocatorBiPredicate cannot be cast to >> org.apache.ignite.lang.IgniteBiPredicate >> at org.apache.ignite.internal.processors.cache.query. >> GridCacheQueryRequest.finishUnmarshal(GridCacheQueryRequest.java:324) >> at org.apache.ignite.internal.processors.cache. >> GridCacheIoManager.unmarshall(GridCacheIoManager.java:1298) >> at org.apache.ignite.internal.processors.cache. >> GridCacheIoManager.onMessage0(GridCacheIoManager.java:364) >> at org.apache.ignite.internal.processors.cache.GridCacheIoManager. >> handleMessage(GridCacheIoManager.java:293) >> at org.apache.ignite.internal.processors.cache. >> GridCacheIoManager.access$000(GridCacheIoManager.java:95) >> at org.apache.ignite.internal.processors.cache.GridCacheIoManager$1. >> onMessage(GridCacheIoManager.java:238) >> at org.apache.ignite.internal.managers.communication. >> GridIoManager.invokeListener(GridIoManager.java:1222) >> at org.apache.ignite.internal.managers.communication.GridIoManager. >> processRegularMessage0(GridIoManager.java:850) >> at org.apache.ignite.internal.managers.communication. >> GridIoManager.access$2100(GridIoManager.java:108) >> at org.apache.ignite.internal.managers.communication. >> GridIoManager$7.run(GridIoManager.java:790) >> at org.apache.ignite.internal.util.StripedExecutor$Stripe. >> run(StripedExecutor.java:428) >> at java.lang.Thread.run(Thread.java:745) >> >> where >> import org.apache.ignite.lang.IgniteBiPredicate; >> public class LocatorBiPredicate implements IgniteBiPredicate<String, >> Locator> {...} >> >> >> On Tue, May 16, 2017 at 12:51 PM, Dmitry Pavlov [via Apache Ignite Users] >> <[hidden email] <http:///user/SendEmail.jtp?type=node&node=12961&i=0>> >> wrote: >> Hi Ilya, >> >> I supposed following: GridDeploymentClassLoader usage for loading message >> class on receiver side is mandatory condition for reproduction. But for now >> it is only hypothesis. >> >> In my test if all nodes have message payload class in its classpath there >> are no problems with messaging under high load (around 10^6 of messages in >> 32 threads). Same is true if application class loader is used in for >> loading message class (no WAR files & no Jetty). >> >> Could you please check class loaders used at sender(s) sides and on >> receiver side. Is GridDeploymentClassLoader used for loading message >> payload class at receiver? >> >> Sincerely, >> Dmitry Pavlov >> >> >> >> вт, 16 мая 2017 г. в 12:17, Ilya <[hidden email] > <http:///user/SendEmail.jtp?type=node&node=12881&i=0>>: > Hi Dmitry, > > Unfortunately, I've did not yet manage to reproduce this issue outside of > our project. > > What do you mean by "GridDeploymentClassLoader is used for loading class > on server"? How can server classloaders be configured? How does a remote > node choose, in which classloader to deploy the received class? > > My test configuration is as follows: > > - Web application that has a single cache and has two IgniteMessaging > local listeners; > - It's run from JUnit test code under Jetty; > - The three instances form a cluster; > - One client sends messages to one of the topics (to the random node) > using IgniteMessaging. > > All of these works on a single JVM. I suggest that Jetty servers might use > dedicated classloaders for each web-app. I've tried to launch client from > both test code and another web-app under Jetty, but that did not change > anything. > > In fact, the failing test on our production application is launched in the > same manner: two exploded web-apps (client and server), three instances of > server app and all of these is run under Jettys in a single VM... > > On Sun, May 14, 2017 at 2:22 PM, Dmitry Pavlov [via Apache Ignite Users] > <[hidden > email] <http:///user/SendEmail.jtp?type=node&node=12879&i=0>> wrote: > Hi, Ilya, > > I've tried to reproduce deployment problem in standalone project involving > Ingnite.start() in several WAR files. But this test is still passing. > > It is still possible deployment problem can be reprdoced only > when GridDeploymentClassLoader is used for loading class on server, and > several different Web App class loaders are enabled on clients. > > Do you have standalone reproducer you can share? > > Best Regards, > Dmitry Pavlov > > > > пт, 12 мая 2017 г. в 15:58, Ilya <[hidden email] > <http:///user/SendEmail.jtp?type=node&node=12831&i=0>>: > Hi all! > > The question was originally asked (but not answered) on SO: > http://stackoverflow.com/questions/43803402/how-does- > peer-classloading-work-in-apache-ignite > > In short, we have "Failed to deploy user message" exceptions under high > load > in our project. > > Here is an overview of our architecture: > - Distributed cache on three nodes, all nodes run on a single workstation > (in this test); > - Workers on each node; > - Messaging between workers is done using IgniteMessaging (topic has the > type of String and I've tried both byte[] and ByteBuffer as a message > class); > - Client connects to the cluster and triggers some business logic, that > causes cross-node messaging, scan queries and MR jobs (using > IgniteCompute::broadcast). All of these may performed concurrently. > > I've tried both SHARED and CONTINUOUS deployment mode, but the result > remains the same. > > I've noticed lots of similar messages in the logs: > /2017-05-05 13:31:28 INFO org.apache.ignite.logger.java.JavaLogger info > Removed undeployed class: GridDeployment [ts=1493980288578, > depMode=CONTINUOUS, clsLdr=WebAppClassLoader=MyApp@38815daa, > clsLdrId=36c3828db51-0d65e7d5-77bf-444d-9b8b-d18bde94ad13, userVer=0, > loc=true, sampleClsName=java.lang.String, pendingUndeploy=false, > undeployed=true, usage=0] > ... > 2017-05-05 13:31:29 INFO org.apache.ignite.logger.java.JavaLogger info > Removed undeployed class: GridDeployment [ts=1493980289125, > depMode=CONTINUOUS, clsLdr=WebAppClassLoader=MyApp@355f6680, > clsLdrId=1dd3828db51-1b20df7a-a98d-45a3-8ab6-e5d229945830, userVer=0, > loc=true, sampleClsName=java.lang.String, pendingUndeploy=false, > undeployed=true, usage=0] > .../ > > This happens when I use ByteBuffer as message type. In case of byte[], > class > B[ is being constantly re-deployed. > > ScanQuery predicate and IgniteCompute caller are also being constantly > re-deployed. > If we disable ScanQueries and IgniteCompute broadcasts - all is fine, there > are no re-deployments. > > For the further testing I've disabled MRs and kept ScanQueries. I've also > added some debug output to a fresh snapshot of Ignite 2.1.0. Messages > "Class > locally deployed: <my ScanQuery predicate>" usually come from the following > call stack: > /org.apache.ignite.internal.managers.deployment.GridDeploymentLocalStore. > recordDeploy(GridDeploymentLocalStore.java:404) > at > org.apache.ignite.internal.managers.deployment.GridDeploymentLocalStore. > deploy(GridDeploymentLocalStore.java:333) > at > org.apache.ignite.internal.managers.deployment.GridDeploymentLocalStore. > getDeployment(GridDeploymentLocalStore.java:201) > at > org.apache.ignite.internal.managers.deployment.GridDeploymentManager. > getLocalDeployment(GridDeploymentManager.java:383) > at > org.apache.ignite.internal.managers.deployment.GridDeploymentManager. > getDeployment(GridDeploymentManager.java:345) > at > org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager. > injectResources(GridCacheQueryManager.java:918) > at > org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager. > scanIterator(GridCacheQueryManager.java:826) > at > org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager. > executeQuery(GridCacheQueryManager.java:611) > at > org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager. > queryResult(GridCacheQueryManager.java:1593) > at > org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager. > runQuery(GridCacheQueryManager.java:1164) > at > org.apache.ignite.internal.processors.cache.query. > GridCacheDistributedQueryManager.processQueryRequest( > GridCacheDistributedQueryManager.java:231) > at > org.apache.ignite.internal.processors.cache.query. > GridCacheDistributedQueryManager$2.apply(GridCacheDistributedQueryManag > er.java:109) > at > org.apache.ignite.internal.processors.cache.query. > GridCacheDistributedQueryManager$2.apply(GridCacheDistributedQueryManag > er.java:107) > at > org.apache.ignite.internal.processors.cache.GridCacheIoManager. > processMessage(GridCacheIoManager.java:863) > at > org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0( > GridCacheIoManager.java:386) > at > org.apache.ignite.internal.processors.cache.GridCacheIoManager. > handleMessage(GridCacheIoManager.java:308) > at > org.apache.ignite.internal.processors.cache.GridCacheIoManager.access$000( > GridCacheIoManager.java:100) > at > org.apache.ignite.internal.processors.cache.GridCacheIoManager$1. > onMessage(GridCacheIoManager.java:253) > at > org.apache.ignite.internal.managers.communication. > GridIoManager.invokeListener(GridIoManager.java:1257) > at > org.apache.ignite.internal.managers.communication.GridIoManager. > processRegularMessage0(GridIoManager.java:885) > at > org.apache.ignite.internal.managers.communication. > GridIoManager.access$2100(GridIoManager.java:114) > at > org.apache.ignite.internal.managers.communication.GridIoManager$7.run( > GridIoManager.java:802) > at > java.util.concurrent.ThreadPoolExecutor.runWorker( > ThreadPoolExecutor.java:1142) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run( > ThreadPoolExecutor.java:617)/ > > Messages like "removed undeployed class" usually come from the > IgniteMessaging's call stack. > > I've analyzed the Ignite kernel a bit, and got a suspicion that undeploy is > being triggered for all classes in a classloader, when at least one class > that resides in that classloader was re-deployed in some other loader. > > It happens inside > org.apache.ignite.spi.deployment.local.LocalDeploymentSpi#register > > At first, we get a "Map of new resources added for registered class > loader" using LocalDeploymentSpi#addResource. > Then we "Remove resources for all class loaders except {@code > ignoreClsLdr}." using LocalDeploymentSpi#removeResources. Inside this > method, it looks like we add all loaders that contain the old version of > the > new resource to a "doomed" collection. > Finally, we iterate this collection and call onClassLoaderReleased for > each element. The latter action actually causes all the classes to be > undeployed (finally causing the "Removed undeployed class" messages). > > I don't understand this concept. Why are there multiple classloaders? Why > do > we undeploy the whole classloader in such cases? > > I'd be grateful, if someone could explain, how does peer classloading work > in Ignite "under the hood". > > P. S. I'm looking at the sources of a fresh snapshot of Ignite 2.1.0, but > the behavior is the same with the standard Ignite 1.9.0. > > P. P. S. Unfortunately, I've did not manage to reproduce this issue outside > of our project yet. > > > > > -- > View this message in context: http://apache-ignite-users. > 70518.x6.nabble.com/Understanding-the-mechanics- > of-peer-class-loading-tp12661.html > Sent from the Apache Ignite Users mailing list archive at Nabble.com. > > > ------------------------------ > If you reply to this email, your message will be added to the discussion > below: > http://apache-ignite-users.70518.x6.nabble.com/ > Understanding-the-mechanics-of-peer-class-loading-tp12661p12831.html > To unsubscribe from Understanding the mechanics of peer class loading, click > here. > NAML > <http://apache-ignite-users.70518.x6.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml> > > > ------------------------------ > View this message in context: Re: Understanding the mechanics of peer > class loading > <http://apache-ignite-users.70518.x6.nabble.com/Understanding-the-mechanics-of-peer-class-loading-tp12661p12879.html> > Sent from the Apache Ignite Users mailing list archive > <http://apache-ignite-users.70518.x6.nabble.com/> at Nabble.com. > > > ------------------------------ > If you reply to this email, your message will be added to the discussion > below: > http://apache-ignite-users.70518.x6.nabble.com/ > Understanding-the-mechanics-of-peer-class-loading-tp12661p12881.html > To unsubscribe from Understanding the mechanics of peer class loading, click > here. > NAML > <http://apache-ignite-users.70518.x6.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml> > > ------------------------------ > View this message in context: Re: Understanding the mechanics of peer > class loading > <http://apache-ignite-users.70518.x6.nabble.com/Understanding-the-mechanics-of-peer-class-loading-tp12661p12961.html> > Sent from the Apache Ignite Users mailing list archive > <http://apache-ignite-users.70518.x6.nabble.com/> at Nabble.com. > > > ------------------------------ > If you reply to this email, your message will be added to the discussion > below: > http://apache-ignite-users.70518.x6.nabble.com/ > Understanding-the-mechanics-of-peer-class-loading-tp12661p12967.html > To unsubscribe from Understanding the mechanics of peer class loading, click > here > <http://apache-ignite-users.70518.x6.nabble.com/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=12661&code=aXlha3Vwb3Y5M0BnbWFpbC5jb218MTI2NjF8LTQ4NzEwMDkzOQ==> > . > NAML > <http://apache-ignite-users.70518.x6.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml> > hce-ignition-logs.7z (1M) <http://apache-ignite-users.70518.x6.nabble.com/attachment/13007/0/hce-ignition-logs.7z> -- View this message in context: http://apache-ignite-users.70518.x6.nabble.com/Understanding-the-mechanics-of-peer-class-loading-tp12661p13007.html Sent from the Apache Ignite Users mailing list archive at Nabble.com.