You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by zs...@apache.org on 2021/10/12 07:06:58 UTC
[ignite] branch master updated: IGNITE-15714 Yardstick benchmark
for multi cache transaction operations - Fixes #9481.
This is an automated email from the ASF dual-hosted git repository.
zstan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/master by this push:
new 32c8a57 IGNITE-15714 Yardstick benchmark for multi cache transaction operations - Fixes #9481.
32c8a57 is described below
commit 32c8a57d29849773fda40445dcb90413e8b73cb5
Author: zstan <st...@gmail.com>
AuthorDate: Tue Oct 12 10:05:57 2021 +0300
IGNITE-15714 Yardstick benchmark for multi cache transaction operations - Fixes #9481.
Signed-off-by: zstan <st...@gmail.com>
---
.../benchmark-multicache-putall-tx.properties | 81 +++++++++++++++++++++
.../config/benchmark-multicache-tx.properties | 84 ++++++++++++++++++++++
.../ignite/yardstick/IgniteBenchmarkArguments.java | 11 +++
.../cache/IgniteCacheAbstractBenchmark.java | 14 +++-
.../yardstick/cache/IgnitePutAllBenchmark.java | 9 ++-
...java => IgnitePutAllMultiCacheTxBenchmark.java} | 53 +++++++-------
...rk.java => IgnitePutMultiCacheTxBenchmark.java} | 62 +++++++++++++---
.../yardstick/cache/IgnitePutTxBenchmark.java | 2 +-
.../load/IgniteCacheRandomOperationBenchmark.java | 2 +-
.../ignite/yardstick/cache/model/SampleValue.java | 2 +-
10 files changed, 274 insertions(+), 46 deletions(-)
diff --git a/modules/yardstick/config/benchmark-multicache-putall-tx.properties b/modules/yardstick/config/benchmark-multicache-putall-tx.properties
new file mode 100644
index 0000000..0c6b337
--- /dev/null
+++ b/modules/yardstick/config/benchmark-multicache-putall-tx.properties
@@ -0,0 +1,81 @@
+# 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.
+
+#
+# Contains benchmarks for TRANSACTIONAL cache.
+#
+
+# JVM options.
+JVM_OPTS=${JVM_OPTS}" -DIGNITE_QUIET=false"
+
+# Uncomment to enable concurrent garbage collection (GC) if you encounter long GC pauses.
+# JVM_OPTS=${JVM_OPTS}" \
+# -Xms6g \
+# -Xmx6g \
+# -Xloggc:./gc${now0}.log \
+# -XX:+PrintGCDetails \
+# -verbose:gc \
+# -XX:+UseParNewGC \
+# -XX:+UseConcMarkSweepGC \
+# "
+
+#Ignite version
+ver="RELEASE-"
+
+# List of default probes, comma separated.
+# Add DStatProbe or VmStatProbe if your OS supports it (e.g. if running on Linux).
+BENCHMARK_DEFAULT_PROBES=ThroughputLatencyProbe,PercentileProbe
+
+# Packages where the specified benchmark is searched by reflection mechanism, comma separated.
+BENCHMARK_PACKAGES=org.yardstickframework,org.apache.ignite.yardstick
+
+# Probe point writer class name.
+# BENCHMARK_WRITER=
+
+# Comma-separated list of the hosts to run BenchmarkServers on. 2 nodes on local host are enabled by default.
+SERVER_HOSTS=localhost,localhost
+
+# Comma-separated list of the hosts to run BenchmarkDrivers on. 1 node on local host is enabled by default.
+DRIVER_HOSTS=localhost
+
+# Remote username.
+# REMOTE_USER=
+
+# Number of nodes, used to wait for the specified number of nodes to start.
+nodesNum=$((`echo ${SERVER_HOSTS} | tr ',' '\n' | wc -l` + `echo ${DRIVER_HOSTS} | tr ',' '\n' | wc -l`))
+
+# Backups count.
+b=1
+
+# Warmup.
+w=10
+
+# Duration.
+d=30
+
+# Threads count.
+t=64
+
+# Sync mode.
+sm=PRIMARY_SYNC
+
+# Cache count.
+caches=3
+
+# Run configuration.
+# Note that each benchmark is set to run for 300 seconds (5 min) with warm-up set to 60 seconds (1 minute).
+CONFIGS="\
+-cfg ${SCRIPT_DIR}/../config/ignite-localhost-config.xml -nn ${nodesNum} -b ${b} -w ${w} -d ${d} -t ${t} -sm ${sm} -txc PESSIMISTIC -txi READ_COMMITTED -dn IgnitePutAllMultiCacheTxBenchmark -cc ${caches} -sn IgniteNode -ds ${ver}tx-putall-multicache${b}-backup,\
+"
diff --git a/modules/yardstick/config/benchmark-multicache-tx.properties b/modules/yardstick/config/benchmark-multicache-tx.properties
new file mode 100644
index 0000000..09286f8
--- /dev/null
+++ b/modules/yardstick/config/benchmark-multicache-tx.properties
@@ -0,0 +1,84 @@
+# 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.
+
+#
+# Contains benchmarks for TRANSACTIONAL cache.
+#
+
+# JVM options.
+JVM_OPTS=${JVM_OPTS}" -DIGNITE_QUIET=false"
+
+# Uncomment to enable concurrent garbage collection (GC) if you encounter long GC pauses.
+# JVM_OPTS=${JVM_OPTS}" \
+# -Xms6g \
+# -Xmx6g \
+# -Xloggc:./gc${now0}.log \
+# -XX:+PrintGCDetails \
+# -verbose:gc \
+# -XX:+UseParNewGC \
+# -XX:+UseConcMarkSweepGC \
+# "
+
+#Ignite version
+ver="RELEASE-"
+
+# List of default probes, comma separated.
+# Add DStatProbe or VmStatProbe if your OS supports it (e.g. if running on Linux).
+BENCHMARK_DEFAULT_PROBES=ThroughputLatencyProbe,PercentileProbe
+
+# Packages where the specified benchmark is searched by reflection mechanism, comma separated.
+BENCHMARK_PACKAGES=org.yardstickframework,org.apache.ignite.yardstick
+
+# Probe point writer class name.
+# BENCHMARK_WRITER=
+
+# Comma-separated list of the hosts to run BenchmarkServers on. 2 nodes on local host are enabled by default.
+SERVER_HOSTS=localhost,localhost
+
+# Comma-separated list of the hosts to run BenchmarkDrivers on. 1 node on local host is enabled by default.
+DRIVER_HOSTS=localhost
+
+# Remote username.
+# REMOTE_USER=
+
+# Number of nodes, used to wait for the specified number of nodes to start.
+nodesNum=$((`echo ${SERVER_HOSTS} | tr ',' '\n' | wc -l` + `echo ${DRIVER_HOSTS} | tr ',' '\n' | wc -l`))
+
+# Backups count.
+b=1
+
+# Warmup.
+w=10
+
+# Duration.
+d=30
+
+# Threads count.
+t=64
+
+# Sync mode.
+sm=PRIMARY_SYNC
+
+# Cache count.
+caches=3
+
+# Operations per cache.
+opPerCache=2
+
+# Run configuration.
+# Note that each benchmark is set to run for 300 seconds (5 min) with warm-up set to 60 seconds (1 minute).
+CONFIGS="\
+-cfg ${SCRIPT_DIR}/../config/ignite-localhost-config.xml -nn ${nodesNum} -b ${b} -w ${w} -d ${d} -t ${t} -sm ${sm} -dn IgnitePutMultiCacheTxBenchmark -cc ${caches} -opc ${opPerCache} -sn IgniteNode -ds ${ver}tx-put-multicache${b}-backup,\
+"
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/IgniteBenchmarkArguments.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/IgniteBenchmarkArguments.java
index ea9a84a..5f247ab 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/IgniteBenchmarkArguments.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/IgniteBenchmarkArguments.java
@@ -254,6 +254,10 @@ public class IgniteBenchmarkArguments {
private int cachesCnt = 1;
/** */
+ @Parameter(names = {"-opc", "--operationsPerCache"}, description = "Number of cache operations")
+ private int opsPerCache = 1;
+
+ /** */
@Parameter(names = {"-pds", "--persistentStore"}, description = "Persistent store flag")
private boolean persistentStoreEnabled;
@@ -818,6 +822,13 @@ public class IgniteBenchmarkArguments {
return sysProps;
}
+ /**
+ * @return Operations per cache.
+ */
+ public int opsPerCache() {
+ return opsPerCache;
+ }
+
/** {@inheritDoc} */
@Override public String toString() {
return GridToStringBuilder.toString(IgniteBenchmarkArguments.class, this);
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteCacheAbstractBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteCacheAbstractBenchmark.java
index a3720e1..5880822 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteCacheAbstractBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteCacheAbstractBenchmark.java
@@ -34,6 +34,7 @@ import org.apache.ignite.IgniteDataStreamer;
import org.apache.ignite.IgniteSemaphore;
import org.apache.ignite.cache.affinity.Affinity;
import org.apache.ignite.cluster.ClusterNode;
+import org.apache.ignite.cluster.ClusterState;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.internal.util.typedef.T2;
import org.apache.ignite.internal.util.typedef.internal.U;
@@ -107,7 +108,7 @@ public abstract class IgniteCacheAbstractBenchmark<K, V> extends IgniteAbstractB
@Override public void setUp(BenchmarkConfiguration cfg) throws Exception {
super.setUp(cfg);
- ignite().cluster().active(true);
+ ignite().cluster().state(ClusterState.ACTIVE);
cache = cache();
@@ -150,7 +151,7 @@ public abstract class IgniteCacheAbstractBenchmark<K, V> extends IgniteAbstractB
for (ClusterNode node : ignite().cluster().nodes())
parts.put(node,
- new T2<List<Integer>, List<Integer>>(new ArrayList<Integer>(), new ArrayList<Integer>()));
+ new T2<>(new ArrayList<>(), new ArrayList<>()));
U.sleep(5000);
@@ -237,7 +238,7 @@ public abstract class IgniteCacheAbstractBenchmark<K, V> extends IgniteAbstractB
* @throws Exception If failed.
*/
protected final void loadCachesData() throws Exception {
- List<IgniteCache> caches = testCaches != null ? testCaches : Collections.<IgniteCache>singletonList(cache);
+ List<IgniteCache> caches = testCaches != null ? testCaches : Collections.singletonList(cache);
if (caches.size() > 1) {
ExecutorService executor = Executors.newFixedThreadPool(10);
@@ -373,4 +374,11 @@ public abstract class IgniteCacheAbstractBenchmark<K, V> extends IgniteAbstractB
return rnd.nextInt(min, max);
}
}
+
+ /**
+ * @return Caches.
+ */
+ protected int cachesCnt() {
+ return caches;
+ }
}
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutAllBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutAllBenchmark.java
index dc21029..707e56c 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutAllBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutAllBenchmark.java
@@ -131,11 +131,16 @@ public class IgnitePutAllBenchmark extends IgniteCacheAbstractBenchmark<Integer,
}
}
+ putData(vals);
+
+ return true;
+ }
+
+ /** Put operations.*/
+ protected void putData(Map<Integer, Integer> vals) throws Exception {
IgniteCache<Integer, Object> cache = cacheForOperation();
cache.putAll(vals);
-
- return true;
}
/** {@inheritDoc} */
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutAllMultiCacheTxBenchmark.java
similarity index 53%
copy from modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxBenchmark.java
copy to modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutAllMultiCacheTxBenchmark.java
index 0a8a470..812fb93 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutAllMultiCacheTxBenchmark.java
@@ -2,11 +2,11 @@
* 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 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
+ * 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,
@@ -18,51 +18,50 @@
package org.apache.ignite.yardstick.cache;
import java.util.Map;
-import java.util.concurrent.Callable;
+import java.util.function.Consumer;
import org.apache.ignite.IgniteCache;
-import org.apache.ignite.IgniteSystemProperties;
import org.apache.ignite.IgniteTransactions;
+import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.yardstick.IgniteBenchmarkUtils;
-import org.apache.ignite.yardstick.cache.model.SampleValue;
import org.yardstickframework.BenchmarkConfiguration;
+import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL;
-/**
- * Ignite benchmark that performs transactional put operations.
- */
-public class IgnitePutTxBenchmark extends IgniteCacheAbstractBenchmark<Integer, Object> {
+/** Ignite benchmark that performs transactional putAll multi cache operations.*/
+public class IgnitePutAllMultiCacheTxBenchmark extends IgnitePutAllBenchmark {
/** */
- private IgniteTransactions txs;
+ private Consumer<Map<Integer, Integer>> cons;
/** */
- private Callable<Void> clo;
+ private IgniteTransactions txs;
/** {@inheritDoc} */
@Override public void setUp(BenchmarkConfiguration cfg) throws Exception {
super.setUp(cfg);
- if (!IgniteSystemProperties.getBoolean("SKIP_MAP_CHECK"))
- ignite().compute().broadcast(new WaitMapExchangeFinishCallable());
-
txs = ignite().transactions();
- clo = new Callable<Void>() {
- @Override public Void call() throws Exception {
- IgniteCache<Integer, Object> cache = cacheForOperation();
-
- int key = nextRandom(args.range());
+ if (cachesCnt() <= 1)
+ throw new IllegalArgumentException("Please configure --cachesCnt" +
+ " param, need to be more that 1.");
- cache.put(key, new SampleValue(key));
+ for (IgniteCache<?, ?> cache : testCaches) {
+ if (cache.getConfiguration(CacheConfiguration.class).getAtomicityMode() != TRANSACTIONAL)
+ throw new IllegalArgumentException("Only transactional caches need to be present.");
+ }
- return null;
- }
+ cons = (vals) -> {
+ for (IgniteCache cache : testCaches)
+ cache.putAll(vals);
};
}
- /** {@inheritDoc} */
- @Override public boolean test(Map<Object, Object> ctx) throws Exception {
- IgniteBenchmarkUtils.doInTransaction(txs, args.txConcurrency(), args.txIsolation(), clo);
-
- return true;
+ /** Put operations.*/
+ @Override protected void putData(Map<Integer, Integer> vals) throws Exception {
+ IgniteBenchmarkUtils.doInTransaction(txs, args.txConcurrency(), args.txIsolation(),
+ () -> {
+ cons.accept(vals);
+ return null;
+ });
}
/** {@inheritDoc} */
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutMultiCacheTxBenchmark.java
similarity index 54%
copy from modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxBenchmark.java
copy to modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutMultiCacheTxBenchmark.java
index 0a8a470..ef24b79 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutMultiCacheTxBenchmark.java
@@ -18,43 +18,61 @@
package org.apache.ignite.yardstick.cache;
import java.util.Map;
+import java.util.UUID;
import java.util.concurrent.Callable;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.IgniteSystemProperties;
import org.apache.ignite.IgniteTransactions;
+import org.apache.ignite.cache.query.annotations.QuerySqlField;
+import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.yardstick.IgniteBenchmarkUtils;
-import org.apache.ignite.yardstick.cache.model.SampleValue;
import org.yardstickframework.BenchmarkConfiguration;
+import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL;
-/**
- * Ignite benchmark that performs transactional put operations.
- */
-public class IgnitePutTxBenchmark extends IgniteCacheAbstractBenchmark<Integer, Object> {
+/** Multi cache transactional put benchmark. */
+public class IgnitePutMultiCacheTxBenchmark extends IgniteCacheAbstractBenchmark<Integer, Object> {
/** */
private IgniteTransactions txs;
/** */
private Callable<Void> clo;
+ /** Num of cache operations.*/
+ private int cacheOperations;
+
/** {@inheritDoc} */
@Override public void setUp(BenchmarkConfiguration cfg) throws Exception {
super.setUp(cfg);
+ if (cachesCnt() <= 1)
+ throw new IllegalArgumentException("Please configure --cachesCnt" +
+ " param, need to be more that 1.");
+
if (!IgniteSystemProperties.getBoolean("SKIP_MAP_CHECK"))
ignite().compute().broadcast(new WaitMapExchangeFinishCallable());
txs = ignite().transactions();
- clo = new Callable<Void>() {
- @Override public Void call() throws Exception {
- IgniteCache<Integer, Object> cache = cacheForOperation();
+ cacheOperations = args.opsPerCache();
- int key = nextRandom(args.range());
+ for (IgniteCache<?, ?> cache : testCaches) {
+ if (cache.getConfiguration(CacheConfiguration.class).getAtomicityMode() != TRANSACTIONAL)
+ throw new IllegalArgumentException("Only transactional caches need to be present.");
+ }
- cache.put(key, new SampleValue(key));
+ clo = () -> {
+ int key = nextRandom(args.range());
- return null;
+ int shift = 0;
+
+ for (int i = 0; i < cacheOperations; ++i) {
+ for (IgniteCache cache : testCaches) {
+ cache.put(key, new SampleValue(key + shift, UUID.randomUUID()));
+ ++shift;
+ }
}
+
+ return null;
};
}
@@ -69,4 +87,26 @@ public class IgnitePutTxBenchmark extends IgniteCacheAbstractBenchmark<Integer,
@Override protected IgniteCache<Integer, Object> cache() {
return ignite().cache("tx");
}
+
+ /** */
+ private static class SampleValue {
+ /** */
+ @QuerySqlField
+ private int id;
+
+ /** */
+ @QuerySqlField
+ private UUID uid;
+
+ /** */
+ private SampleValue() {
+ // No-op.
+ }
+
+ /** */
+ public SampleValue(int id, UUID uid) {
+ this.id = id;
+ this.uid = uid;
+ }
+ }
}
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxBenchmark.java
index 0a8a470..aed9c5c 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxBenchmark.java
@@ -46,7 +46,7 @@ public class IgnitePutTxBenchmark extends IgniteCacheAbstractBenchmark<Integer,
txs = ignite().transactions();
clo = new Callable<Void>() {
- @Override public Void call() throws Exception {
+ @Override public Void call() {
IgniteCache<Integer, Object> cache = cacheForOperation();
int key = nextRandom(args.range());
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/load/IgniteCacheRandomOperationBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/load/IgniteCacheRandomOperationBenchmark.java
index c4bd60f..acff2d3 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/load/IgniteCacheRandomOperationBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/load/IgniteCacheRandomOperationBenchmark.java
@@ -954,7 +954,7 @@ public class IgniteCacheRandomOperationBenchmark extends IgniteAbstractBenchmark
* @param cache Ignite cache.
* @throws Exception If failed.
*/
- private void doSqlQuery(IgniteCache<Object, Object> cache) throws Exception {
+ private void doSqlQuery(IgniteCache<Object, Object> cache) {
List<SqlCacheDescriptor> descriptors = cacheSqlDescriptors.get(cache.getName());
if (descriptors != null) {
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/model/SampleValue.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/model/SampleValue.java
index d48c281..d77384d 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/model/SampleValue.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/model/SampleValue.java
@@ -62,7 +62,7 @@ public class SampleValue implements Externalizable, Binarylizable {
}
/** {@inheritDoc} */
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ @Override public void readExternal(ObjectInput in) throws IOException {
id = in.readInt();
}