Re: Ignite throws "Failed to resolve class name" Exception

2021-06-09 Thread Ilya Kasnacheev
Hello!

I can see a very similar issue filed:
https://issues.apache.org/jira/browse/IGNITE-14856

There are hopes that it gets addresses in 2.11

Regards,
-- 
Ilya Kasnacheev


чт, 3 июн. 2021 г. в 14:37, Aleksandr Shapkin :

> Hello!
>
> It seems that you are trying to deploy DTO using peer class loading,
> unfortunately, that's not possible. Peer class loading is mostly about task
> deployment, see
> https://ignite.apache.org/docs/latest/code-deployment/peer-class-loading
>
> To resolve this you need to have your CacheState deployed on all nodes
> before deserialization happens or to work with cache in raw binary format.
> https://ignite.apache.org/docs/latest/key-value-api/binary-objects
>
>
> > On 26 May 2021, at 18:27, tsipporah22  wrote:
> >
> > Hi Ilya,
> >
> > Sorry I get back to you late. I have key-value classes on the server
> node.
> > The peer class loading is enabled. I'm not getting this error
> consistently
> > so it's hard to reproduce. Below is the code snippet that throws the
> error:
> >
> > First I got CacheState object with tableName as the key:
> >
> > public class CacheState implements Serializable {
> >private static final long serialVersionUID = 1L;
> >
> >@QuerySqlField(index=true)
> >private String tableName;
> >
> >@QuerySqlField
> >private long updateVersion;
> >
> >
> >public CacheState() {
> >}
> >
> >public CacheState(String tableName) {
> >this.tableName = tableName;
> >}
> >
> >public String getTableName() {
> >return tableName;
> >}
> >
> >public void setTableName(String tableName) {
> >this.tableName = tableName;
> >}
> >
> >public long getUpdateVersion() {
> >return updateVersion;
> >}
> >
> >public void setUpdateVersion(long updateVersion) {
> >this.updateVersion = updateVersion;
> >}
> >
> >
> > And the error is thrown from this class:
> >
> > public class WindowOptimizer {
> >private final Ignite ignite;
> >
> >private IgniteCache cacheStates;
> >
> >public void init() {
> >if (cacheStates == null) {
> >cacheStates =
> > ignite.cache(CacheState.class.getSimpleName().toLowerCase());
> >}
> >}
> > }
> >
> >private IgniteFuture>
> > updateCacheState(IgniteCompute compute, BaselinePeriod period,
> >OffsetDateTime now, WindowOptimizerCfg cfg) {
> >
> >final IgniteFuture> future =
> > compute.broadcastAsync(updater);
> >future.listen(f -> {
> >
> >
> >CacheState cacheState = cacheStates.get(tableName);<---
> this
> > line throws Exception
> >
> >
> >})
> >}
> >
> >
> > Thanks,
> > tsipporah
> >
> >
> >
> >
> > --
> > Sent from: http://apache-ignite-users.70518.x6.nabble.com/
>
>


Re: Ignite throws "Failed to resolve class name" Exception

2021-06-03 Thread Aleksandr Shapkin
Hello!

It seems that you are trying to deploy DTO using peer class loading, 
unfortunately, that's not possible. Peer class loading is mostly about task 
deployment, see 
https://ignite.apache.org/docs/latest/code-deployment/peer-class-loading

To resolve this you need to have your CacheState deployed on all nodes before 
deserialization happens or to work with cache in raw binary format.
https://ignite.apache.org/docs/latest/key-value-api/binary-objects


> On 26 May 2021, at 18:27, tsipporah22  wrote:
> 
> Hi Ilya,
> 
> Sorry I get back to you late. I have key-value classes on the server node.
> The peer class loading is enabled. I'm not getting this error consistently
> so it's hard to reproduce. Below is the code snippet that throws the error:
> 
> First I got CacheState object with tableName as the key:
> 
> public class CacheState implements Serializable {
>private static final long serialVersionUID = 1L;
> 
>@QuerySqlField(index=true)
>private String tableName;
> 
>@QuerySqlField
>private long updateVersion;
> 
> 
>public CacheState() {
>}
> 
>public CacheState(String tableName) {
>this.tableName = tableName;
>}
> 
>public String getTableName() {
>return tableName;
>}
> 
>public void setTableName(String tableName) {
>this.tableName = tableName;
>}
> 
>public long getUpdateVersion() {
>return updateVersion;
>}
> 
>public void setUpdateVersion(long updateVersion) {
>this.updateVersion = updateVersion;
>}
> 
> 
> And the error is thrown from this class:
> 
> public class WindowOptimizer {
>private final Ignite ignite;
> 
>private IgniteCache cacheStates;
> 
>public void init() {
>if (cacheStates == null) {
>cacheStates =
> ignite.cache(CacheState.class.getSimpleName().toLowerCase());
>}
>}
> }
> 
>private IgniteFuture>
> updateCacheState(IgniteCompute compute, BaselinePeriod period,
>OffsetDateTime now, WindowOptimizerCfg cfg) {
> 
>final IgniteFuture> future =
> compute.broadcastAsync(updater);
>future.listen(f -> {
>
> 
>CacheState cacheState = cacheStates.get(tableName);<--- this
> line throws Exception
> 
>
>})
>}
> 
> 
> Thanks,
> tsipporah
> 
> 
> 
> 
> --
> Sent from: http://apache-ignite-users.70518.x6.nabble.com/



Re: Ignite throws "Failed to resolve class name" Exception

2021-05-26 Thread tsipporah22
Hi Ilya,

Sorry I get back to you late. I have key-value classes on the server node.
The peer class loading is enabled. I'm not getting this error consistently
so it's hard to reproduce. Below is the code snippet that throws the error:

First I got CacheState object with tableName as the key:

public class CacheState implements Serializable {
private static final long serialVersionUID = 1L;

@QuerySqlField(index=true)
private String tableName;

@QuerySqlField
private long updateVersion;


public CacheState() {
}

public CacheState(String tableName) {
this.tableName = tableName;
}

public String getTableName() {
return tableName;
}

public void setTableName(String tableName) {
this.tableName = tableName;
}

public long getUpdateVersion() {
return updateVersion;
}

public void setUpdateVersion(long updateVersion) {
this.updateVersion = updateVersion;
}


And the error is thrown from this class:

public class WindowOptimizer {
private final Ignite ignite;

private IgniteCache cacheStates;

public void init() {
if (cacheStates == null) {
cacheStates =
ignite.cache(CacheState.class.getSimpleName().toLowerCase());
}
}
}

private IgniteFuture>
updateCacheState(IgniteCompute compute, BaselinePeriod period,
OffsetDateTime now, WindowOptimizerCfg cfg) {

final IgniteFuture> future =
compute.broadcastAsync(updater);
future.listen(f -> {


CacheState cacheState = cacheStates.get(tableName);<--- this
line throws Exception


})
}


Thanks,
tsipporah




--
Sent from: http://apache-ignite-users.70518.x6.nabble.com/


Re: Ignite throws "Failed to resolve class name" Exception

2021-05-13 Thread Ilya Kasnacheev
Hello again!

I have also noticed that you are running lambdas on the server side. Is
peer class loading enabled? Do you have key value/type classes on the
server node?

Ignite will not peer load key-value classes currently, so you need to
explicitly deploy them on the server to be able to reference them in
server-running code.

Regards,
-- 
Ilya Kasnacheev


чт, 13 мая 2021 г. в 15:20, Ilya Kasnacheev :

> Hello!
>
> Can you share a sample of code which causes the issue, as well as cache
> configuration?
>
> Regards,
> --
> Ilya Kasnacheev
>
>
> пт, 7 мая 2021 г. в 21:04, tsipporah22 :
>
>> Hi experts,
>>
>> I'm running ignite server node in k8s and recently I upgraded ignite to
>> 2.10.0. Ignite is started with below command:
>> /opt/rta/os/jre/bin/java -XX:+AggressiveOpts
>> -Djava.net.preferIPv4Stack=true
>> -XX:+UseG1GC -XX:+DisableExplicitGC -Dfile.encoding=UTF-8
>> -DIGNITE_QUIET=false
>>
>> -DIGNITE_SUCCESS_FILE=/opt/rta/os/ignite/work/ignite_success_f0dac24c-d7aa-48bd-82d6-1492ab47e18f
>> -DIGNITE_HOME=/opt/rta/os/ignite
>> -DIGNITE_PROG_NAME=/opt/rta/os/ignite/bin/ignite.sh -cp
>>
>> /opt/rta/os/ignite/libs/*:/opt/rta/os/ignite/libs/ignite-control-utility/*:/opt/rta/os/ignite/libs/ignite-indexing/*:/opt/rta/os/ignite/libs/ignite-kubernetes/*:/opt/rta/os/ignite/libs/ignite-rest-http/*:/opt/rta/os/ignite/libs/ignite-spring/*:/opt/rta/os/ignite/libs/licenses/*:/opt/rta/os/ignite/libs/rta-windows/*
>> org.apache.ignite.startup.cmdline.CommandLineStartup
>> /opt/rta/os/ignite/config/ignite-config.xml
>>
>> From time to time I'm getting below exception that complain about "Failed
>> to
>> resolve class name":
>>
>> SEVERE: Failed to notify listener:
>>
>> com.rta.rtanalytics.baseline.common.compute.WindowOptimizer$$Lambda$918/1241362859@cd85226
>> javax.cache.CacheException: class
>> org.apache.ignite.IgniteCheckedException:
>> Failed to resolve class name [platformId=0, platform=Java,
>> typeId=-1052093315]
>> at
>>
>> org.apache.ignite.internal.processors.cache.GridCacheUtils.convertToCacheException(GridCacheUtils.java:1263)
>> at
>>
>> org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl.cacheException(IgniteCacheProxyImpl.java:2083)
>> at
>>
>> org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl.get(IgniteCacheProxyImpl.java:1110)
>> at
>>
>> org.apache.ignite.internal.processors.cache.GatewayProtectedCacheProxy.get(GatewayProtectedCacheProxy.java:676)
>> at
>>
>> com.rta.rtanalytics.baseline.common.compute.WindowOptimizer.lambda$updateCacheState$44eb080f$1(WindowOptimizer.java:177)
>> at
>>
>> org.apache.ignite.internal.util.future.IgniteFutureImpl$InternalFutureListener.apply(IgniteFutureImpl.java:214)
>> at
>>
>> org.apache.ignite.internal.util.future.IgniteFutureImpl$InternalFutureListener.apply(IgniteFutureImpl.java:179)
>> at
>>
>> org.apache.ignite.internal.util.future.GridFutureAdapter.notifyListener(GridFutureAdapter.java:399)
>> at
>>
>> org.apache.ignite.internal.util.future.GridFutureAdapter.unblock(GridFutureAdapter.java:347)
>> at
>>
>> org.apache.ignite.internal.util.future.GridFutureAdapter.unblockAll(GridFutureAdapter.java:335)
>> at
>>
>> org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:511)
>> at
>>
>> org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:490)
>> at
>>
>> org.apache.ignite.internal.processors.task.GridTaskWorker.finishTask(GridTaskWorker.java:1650)
>> at
>>
>> org.apache.ignite.internal.processors.task.GridTaskWorker.finishTask(GridTaskWorker.java:1618)
>> at
>>
>> org.apache.ignite.internal.processors.task.GridTaskWorker.reduce(GridTaskWorker.java:1193)
>> at
>>
>> org.apache.ignite.internal.processors.task.GridTaskWorker.onResponse(GridTaskWorker.java:975)
>> at
>>
>> org.apache.ignite.internal.processors.task.GridTaskProcessor.processJobExecuteResponse(GridTaskProcessor.java:1161)
>> at
>>
>> org.apache.ignite.internal.processors.job.GridJobWorker.finishJob(GridJobWorker.java:965)
>> at
>>
>> org.apache.ignite.internal.processors.job.GridJobWorker.finishJob(GridJobWorker.java:813)
>> at
>>
>> org.apache.ignite.internal.processors.job.GridJobWorker.execute0(GridJobWorker.java:662)
>> at
>>
>> org.apache.ignite.internal.processors.job.GridJobWorker.body(GridJobWorker.java:521)
>> at
>> org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:120)
>> at
>>
>> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>> at
>>
>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>> at java.lang.Thread.run(Thread.java:748)
>> Caused by: class org.apache.ignite.IgniteCheckedException: Failed to
>> resolve
>> class name [platformId=0, platform=Java, typeId=-1052093315]
>> at
>> 

Re: Ignite throws "Failed to resolve class name" Exception

2021-05-13 Thread Ilya Kasnacheev
Hello!

Can you share a sample of code which causes the issue, as well as cache
configuration?

Regards,
-- 
Ilya Kasnacheev


пт, 7 мая 2021 г. в 21:04, tsipporah22 :

> Hi experts,
>
> I'm running ignite server node in k8s and recently I upgraded ignite to
> 2.10.0. Ignite is started with below command:
> /opt/rta/os/jre/bin/java -XX:+AggressiveOpts
> -Djava.net.preferIPv4Stack=true
> -XX:+UseG1GC -XX:+DisableExplicitGC -Dfile.encoding=UTF-8
> -DIGNITE_QUIET=false
>
> -DIGNITE_SUCCESS_FILE=/opt/rta/os/ignite/work/ignite_success_f0dac24c-d7aa-48bd-82d6-1492ab47e18f
> -DIGNITE_HOME=/opt/rta/os/ignite
> -DIGNITE_PROG_NAME=/opt/rta/os/ignite/bin/ignite.sh -cp
>
> /opt/rta/os/ignite/libs/*:/opt/rta/os/ignite/libs/ignite-control-utility/*:/opt/rta/os/ignite/libs/ignite-indexing/*:/opt/rta/os/ignite/libs/ignite-kubernetes/*:/opt/rta/os/ignite/libs/ignite-rest-http/*:/opt/rta/os/ignite/libs/ignite-spring/*:/opt/rta/os/ignite/libs/licenses/*:/opt/rta/os/ignite/libs/rta-windows/*
> org.apache.ignite.startup.cmdline.CommandLineStartup
> /opt/rta/os/ignite/config/ignite-config.xml
>
> From time to time I'm getting below exception that complain about "Failed
> to
> resolve class name":
>
> SEVERE: Failed to notify listener:
>
> com.rta.rtanalytics.baseline.common.compute.WindowOptimizer$$Lambda$918/1241362859@cd85226
> javax.cache.CacheException: class org.apache.ignite.IgniteCheckedException:
> Failed to resolve class name [platformId=0, platform=Java,
> typeId=-1052093315]
> at
>
> org.apache.ignite.internal.processors.cache.GridCacheUtils.convertToCacheException(GridCacheUtils.java:1263)
> at
>
> org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl.cacheException(IgniteCacheProxyImpl.java:2083)
> at
>
> org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl.get(IgniteCacheProxyImpl.java:1110)
> at
>
> org.apache.ignite.internal.processors.cache.GatewayProtectedCacheProxy.get(GatewayProtectedCacheProxy.java:676)
> at
>
> com.rta.rtanalytics.baseline.common.compute.WindowOptimizer.lambda$updateCacheState$44eb080f$1(WindowOptimizer.java:177)
> at
>
> org.apache.ignite.internal.util.future.IgniteFutureImpl$InternalFutureListener.apply(IgniteFutureImpl.java:214)
> at
>
> org.apache.ignite.internal.util.future.IgniteFutureImpl$InternalFutureListener.apply(IgniteFutureImpl.java:179)
> at
>
> org.apache.ignite.internal.util.future.GridFutureAdapter.notifyListener(GridFutureAdapter.java:399)
> at
>
> org.apache.ignite.internal.util.future.GridFutureAdapter.unblock(GridFutureAdapter.java:347)
> at
>
> org.apache.ignite.internal.util.future.GridFutureAdapter.unblockAll(GridFutureAdapter.java:335)
> at
>
> org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:511)
> at
>
> org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:490)
> at
>
> org.apache.ignite.internal.processors.task.GridTaskWorker.finishTask(GridTaskWorker.java:1650)
> at
>
> org.apache.ignite.internal.processors.task.GridTaskWorker.finishTask(GridTaskWorker.java:1618)
> at
>
> org.apache.ignite.internal.processors.task.GridTaskWorker.reduce(GridTaskWorker.java:1193)
> at
>
> org.apache.ignite.internal.processors.task.GridTaskWorker.onResponse(GridTaskWorker.java:975)
> at
>
> org.apache.ignite.internal.processors.task.GridTaskProcessor.processJobExecuteResponse(GridTaskProcessor.java:1161)
> at
>
> org.apache.ignite.internal.processors.job.GridJobWorker.finishJob(GridJobWorker.java:965)
> at
>
> org.apache.ignite.internal.processors.job.GridJobWorker.finishJob(GridJobWorker.java:813)
> at
>
> org.apache.ignite.internal.processors.job.GridJobWorker.execute0(GridJobWorker.java:662)
> at
>
> org.apache.ignite.internal.processors.job.GridJobWorker.body(GridJobWorker.java:521)
> at
> org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:120)
> at
>
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
> at
>
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
> at java.lang.Thread.run(Thread.java:748)
> Caused by: class org.apache.ignite.IgniteCheckedException: Failed to
> resolve
> class name [platformId=0, platform=Java, typeId=-1052093315]
> at
> org.apache.ignite.internal.util.IgniteUtils.cast(IgniteUtils.java:7587)
> at
>
> org.apache.ignite.internal.util.future.GridFutureAdapter.resolve(GridFutureAdapter.java:260)
> at
>
> org.apache.ignite.internal.util.future.GridFutureAdapter.get0(GridFutureAdapter.java:172)
> at
>
> org.apache.ignite.internal.util.future.GridFutureAdapter.get(GridFutureAdapter.java:141)
> at
>
> org.apache.ignite.internal.processors.cache.GridCacheAdapter.get(GridCacheAdapter.java:4893)
> at
>
> 

Ignite throws "Failed to resolve class name" Exception

2021-05-07 Thread tsipporah22
Hi experts,

I'm running ignite server node in k8s and recently I upgraded ignite to
2.10.0. Ignite is started with below command:
/opt/rta/os/jre/bin/java -XX:+AggressiveOpts -Djava.net.preferIPv4Stack=true
-XX:+UseG1GC -XX:+DisableExplicitGC -Dfile.encoding=UTF-8
-DIGNITE_QUIET=false
-DIGNITE_SUCCESS_FILE=/opt/rta/os/ignite/work/ignite_success_f0dac24c-d7aa-48bd-82d6-1492ab47e18f
-DIGNITE_HOME=/opt/rta/os/ignite
-DIGNITE_PROG_NAME=/opt/rta/os/ignite/bin/ignite.sh -cp
/opt/rta/os/ignite/libs/*:/opt/rta/os/ignite/libs/ignite-control-utility/*:/opt/rta/os/ignite/libs/ignite-indexing/*:/opt/rta/os/ignite/libs/ignite-kubernetes/*:/opt/rta/os/ignite/libs/ignite-rest-http/*:/opt/rta/os/ignite/libs/ignite-spring/*:/opt/rta/os/ignite/libs/licenses/*:/opt/rta/os/ignite/libs/rta-windows/*
org.apache.ignite.startup.cmdline.CommandLineStartup
/opt/rta/os/ignite/config/ignite-config.xml

>From time to time I'm getting below exception that complain about "Failed to
resolve class name":

SEVERE: Failed to notify listener:
com.rta.rtanalytics.baseline.common.compute.WindowOptimizer$$Lambda$918/1241362859@cd85226
javax.cache.CacheException: class org.apache.ignite.IgniteCheckedException:
Failed to resolve class name [platformId=0, platform=Java,
typeId=-1052093315]
at
org.apache.ignite.internal.processors.cache.GridCacheUtils.convertToCacheException(GridCacheUtils.java:1263)
at
org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl.cacheException(IgniteCacheProxyImpl.java:2083)
at
org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl.get(IgniteCacheProxyImpl.java:1110)
at
org.apache.ignite.internal.processors.cache.GatewayProtectedCacheProxy.get(GatewayProtectedCacheProxy.java:676)
at
com.rta.rtanalytics.baseline.common.compute.WindowOptimizer.lambda$updateCacheState$44eb080f$1(WindowOptimizer.java:177)
at
org.apache.ignite.internal.util.future.IgniteFutureImpl$InternalFutureListener.apply(IgniteFutureImpl.java:214)
at
org.apache.ignite.internal.util.future.IgniteFutureImpl$InternalFutureListener.apply(IgniteFutureImpl.java:179)
at
org.apache.ignite.internal.util.future.GridFutureAdapter.notifyListener(GridFutureAdapter.java:399)
at
org.apache.ignite.internal.util.future.GridFutureAdapter.unblock(GridFutureAdapter.java:347)
at
org.apache.ignite.internal.util.future.GridFutureAdapter.unblockAll(GridFutureAdapter.java:335)
at
org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:511)
at
org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:490)
at
org.apache.ignite.internal.processors.task.GridTaskWorker.finishTask(GridTaskWorker.java:1650)
at
org.apache.ignite.internal.processors.task.GridTaskWorker.finishTask(GridTaskWorker.java:1618)
at
org.apache.ignite.internal.processors.task.GridTaskWorker.reduce(GridTaskWorker.java:1193)
at
org.apache.ignite.internal.processors.task.GridTaskWorker.onResponse(GridTaskWorker.java:975)
at
org.apache.ignite.internal.processors.task.GridTaskProcessor.processJobExecuteResponse(GridTaskProcessor.java:1161)
at
org.apache.ignite.internal.processors.job.GridJobWorker.finishJob(GridJobWorker.java:965)
at
org.apache.ignite.internal.processors.job.GridJobWorker.finishJob(GridJobWorker.java:813)
at
org.apache.ignite.internal.processors.job.GridJobWorker.execute0(GridJobWorker.java:662)
at
org.apache.ignite.internal.processors.job.GridJobWorker.body(GridJobWorker.java:521)
at
org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:120)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: class org.apache.ignite.IgniteCheckedException: Failed to resolve
class name [platformId=0, platform=Java, typeId=-1052093315]
at
org.apache.ignite.internal.util.IgniteUtils.cast(IgniteUtils.java:7587)
at
org.apache.ignite.internal.util.future.GridFutureAdapter.resolve(GridFutureAdapter.java:260)
at
org.apache.ignite.internal.util.future.GridFutureAdapter.get0(GridFutureAdapter.java:172)
at
org.apache.ignite.internal.util.future.GridFutureAdapter.get(GridFutureAdapter.java:141)
at
org.apache.ignite.internal.processors.cache.GridCacheAdapter.get(GridCacheAdapter.java:4893)
at
org.apache.ignite.internal.processors.cache.GridCacheAdapter.repairableGet(GridCacheAdapter.java:4852)
at
org.apache.ignite.internal.processors.cache.GridCacheAdapter.get(GridCacheAdapter.java:1470)
at
org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl.get(IgniteCacheProxyImpl.java:1107)
... 22 more
Caused by: class org.apache.ignite.binary.BinaryInvalidTypeException: Failed
to resolve class name