【问题标题】:Unexpected behavior of IgniteSet in Official example官方示例中 IgniteSet 的意外行为
【发布时间】:2018-03-02 19:12:36
【问题描述】:

添加一些调试代码后,我尝试在 集群(2 个节点)上运行 org.apache.ignite.examples.datastructures.IgniteSetExample。它的一些源代码如下:

CollectionConfiguration setCfg = new CollectionConfiguration();

setCfg.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
setCfg.setCacheMode(CacheMode.PARTITIONED);

// Initialize new set.
IgniteSet<String> set = ignite.set(setName, setCfg);

System.out.println("Set size before initializing: " + set.size()); //added by myslef

// Initialize set items.
for (int i = 0; i < 10; i++){
    set.add(Integer.toString(i));
    System.out.println("Set: " + Arrays.toString(set.toArray())); //added by myslef
}
System.out.println("Set size after initializing: " + set.size());

在我看来,添加数据后,点燃集的大小应该是 10,但我得到的数字大于 10,通常是 15。我发现添加了一些重复的数字集。日志在这里:

[19:53:16] Topology snapshot [ver=29, servers=2, clients=0, CPUs=8, heap=3.4GB]
Sep 21, 2017 7:53:16 PM org.apache.ignite.logger.java.JavaLogger info
Info: Topology snapshot [ver=29, servers=2, clients=0, CPUs=8, heap=3.4GB]

>>> Ignite set example started.
Set size before initializing: 0
Set: [0]
Set: [1, 1, 0]
Set: [2, 1, 2, 1, 0]
Set: [2, 1, 3, 2, 1, 0, 3]
Set: [2, 1, 3, 2, 1, 0, 4, 3]
Set: [2, 1, 3, 2, 1, 0, 5, 4, 3]
Set: [2, 1, 3, 2, 1, 0, 6, 5, 4, 3]
Set: [7, 2, 1, 3, 7, 2, 1, 0, 6, 5, 4, 3]
Set: [7, 2, 1, 3, 8, 7, 2, 1, 0, 6, 5, 4, 3]
Set: [7, 2, 1, 3, 9, 8, 7, 2, 1, 0, 6, 5, 4, 3]
Set size after initializing: 14

Sep 21, 2017 7:53:16 PM org.apache.ignite.logger.java.JavaLogger info
Info: Class locally deployed: class org.apache.ignite.examples.datastructures.IgniteSetExample$SetClosure
Sep 21, 2017 7:53:16 PM org.apache.ignite.logger.java.JavaLogger info
Info: Class locally deployed: class org.apache.ignite.configuration.CollectionConfiguration
Sep 21, 2017 7:53:16 PM org.apache.ignite.logger.java.JavaLogger info
Info: Class locally deployed: class org.apache.ignite.cache.CacheAtomicityMode
Sep 21, 2017 7:53:16 PM org.apache.ignite.logger.java.JavaLogger info
Info: Class locally deployed: class org.apache.ignite.cache.CacheMode
Set item has been added: 7aa983e1-c358-4876-b58f-4f3b7bfa65f3_0
Set item has been added: 7aa983e1-c358-4876-b58f-4f3b7bfa65f3_1
Set item has been added: 7aa983e1-c358-4876-b58f-4f3b7bfa65f3_2
Set item has been added: 7aa983e1-c358-4876-b58f-4f3b7bfa65f3_3
Set item has been added: 7aa983e1-c358-4876-b58f-4f3b7bfa65f3_4
Set size after writing [expected=20, actual=30]
Iterate over set.
Set item: 292c99a6-137b-433c-97d9-40ce0f8c0abc_1
Set item: 7aa983e1-c358-4876-b58f-4f3b7bfa65f3_3
Set item: 292c99a6-137b-433c-97d9-40ce0f8c0abc_3
Set item: 7
Set item: 292c99a6-137b-433c-97d9-40ce0f8c0abc_4
Set item: 2
Set item: 1
Set item: 7aa983e1-c358-4876-b58f-4f3b7bfa65f3_1
Set item: 3
Set item: 7aa983e1-c358-4876-b58f-4f3b7bfa65f3_2
Set item: 7aa983e1-c358-4876-b58f-4f3b7bfa65f3_3
Set item: 7aa983e1-c358-4876-b58f-4f3b7bfa65f3_4
Set item: 2
Set item: 1
Set item: 0
Set item: 6
Set item: 5
Set item: 7aa983e1-c358-4876-b58f-4f3b7bfa65f3_0
Set item: 4
Set item: 7aa983e1-c358-4876-b58f-4f3b7bfa65f3_1
Set item: 3
Set item: 7aa983e1-c358-4876-b58f-4f3b7bfa65f3_2
Set item: 292c99a6-137b-433c-97d9-40ce0f8c0abc_1
Set item: 9
Set item: 292c99a6-137b-433c-97d9-40ce0f8c0abc_2
Set item: 8
Set item: 292c99a6-137b-433c-97d9-40ce0f8c0abc_3
Set item: 7
Set item: 292c99a6-137b-433c-97d9-40ce0f8c0abc_4
Set item: 292c99a6-137b-433c-97d9-40ce0f8c0abc_0
Set size before clearing: 30
Set size after clearing: 0
Set was removed: true
Expected exception - Set has been removed from cache: GridCacheSetImpl [cache=GridDhtAtomicCache [defRes=org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$1@482d776b, near=null, super=GridDhtCacheAdapter [multiTxHolder=java.lang.ThreadLocal@186978a6, stopping=false, super=GridDistributedCacheAdapter [super=GridCacheAdapter [locMxBean=org.apache.ignite.internal.processors.cache.CacheLocalMetricsMXBeanImpl@631e06ab, clusterMxBean=org.apache.ignite.internal.processors.cache.CacheClusterMetricsMXBeanImpl@2a3591c5, aff=org.apache.ignite.internal.processors.cache.affinity.GridCacheAffinityImpl@34a75079, igfsDataCache=false, mongoDataCache=false, mongoMetaCache=false, igfsDataCacheSize=null, asyncOpsSem=java.util.concurrent.Semaphore@346a361[Permits = 500], name=datastructures_ATOMIC_PARTITIONED_0@default-ds-group, size=0]]]], name=03bbdb45-72ce-45aa-b75f-00b7b6134dc6, id=d55a844ae51-baeb6ba4-cb04-4d72-b0d8-188f21bc5ac5, collocated=false, hdrPart=961, rmvd=true, binaryMarsh=true, compute=org.apache.ignite.internal.IgniteComputeImpl@4052274f]
Sep 21, 2017 7:53:17 PM org.apache.ignite.logger.java.JavaLogger info
Info: Command protocol successfully stopped: TCP binary
Sep 21, 2017 7:53:17 PM org.apache.ignite.logger.java.JavaLogger info
Info: Stopped cache [cacheName=ignite-sys-cache]
Sep 21, 2017 7:53:17 PM org.apache.ignite.logger.java.JavaLogger info
Info: Stopped cache [cacheName=datastructures_TRANSACTIONAL_PARTITIONED_0@default-ds-group, group=default-ds-group]
Sep 21, 2017 7:53:17 PM org.apache.ignite.logger.java.JavaLogger info
Info: Stopped cache [cacheName=datastructures_ATOMIC_PARTITIONED_0@default-ds-group, group=default-ds-group]
Sep 21, 2017 7:53:17 PM org.apache.ignite.logger.java.JavaLogger info
Info: Stopped cache [cacheName=ignite-sys-atomic-cache@default-ds-group, group=default-ds-group]
Sep 21, 2017 7:53:17 PM org.apache.ignite.logger.java.JavaLogger info
Info: Removed undeployed class: GridDeployment [ts=1505994796165, depMode=SHARED, clsLdr=sun.misc.Launcher$AppClassLoader@73d16e93, clsLdrId=355a844ae51-7aa983e1-c358-4876-b58f-4f3b7bfa65f3, userVer=0, loc=true, sampleClsName=org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap, pendingUndeploy=false, undeployed=true, usage=0]
[19:53:17] Ignite node stopped OK [uptime=00:00:00:778]
Sep 21, 2017 7:53:17 PM org.apache.ignite.logger.java.JavaLogger info
Info: 

>>> +---------------------------------------------------------------------------------+
>>> Ignite ver. 2.1.0#20170721-sha1:a6ca5c8a97e9a4c9d73d40ce76d1504c14ba1940 stopped OK
>>> +---------------------------------------------------------------------------------+
>>> Grid uptime: 00:00:00:778


Ignite set example finished.

当且仅当我将 CollectionConfiguration 实例的 "collocated" 设置为 true 时,IgniteSet 的大小为 10,符合预期。但是根据官方文档,如果IgniteSet中有很多数据,那么建议配置“collocated”属性为“false”。那么这里有什么问题呢?

【问题讨论】:

  • 您是否更改了其他内容?没有你的改变会发生什么?因为即使您进行了更改,您的问题也不会重现。也许您以某种方式更改了缓存配置?
  • 好的,我设法重现了它。对我来说似乎是一个错误。考虑将其报告给 Apache JIRA:issues.apache.org
  • 我只添加了一些用于打印缓存大小信息的代码。没有任何改变,不包括那些印刷品。这个问题很容易在我同事的电脑上重现。
  • 我在这里创建了一个关于 Apache JIRA 的问题。 issues.apache.org/jira/browse/IGNITE-6474

标签: ignite


【解决方案1】:

您可以通过客户端模式使用 IgniteSet 倾倒您的数据,我已经测试过并且证明是正确的。像这样:Ignition.setClientMode(true);

【讨论】:

    【解决方案2】:

    看起来 IgniteSet 有一个错误。谢谢你的报告。

    现在您可以直接使用缓存而不是集合。相同的示例将如下所示:

    public class IgniteSetExample {
        static final Object DUMMY = new Object();
    
        public static void main(String[] args) throws Exception {
            Ignite ignite = Ignition.start("examples/config/example-ignite.xml");
    
            CacheConfiguration<String, Object> cacheCfg = new CacheConfiguration<>("setCache");
    
            cacheCfg.setAtomicityMode(TRANSACTIONAL);
            cacheCfg.setCacheMode(PARTITIONED);
    
            IgniteCache<String, Object> cache = ignite.getOrCreateCache(cacheCfg);
    
            System.out.println("Set size before init: " + cache.size());
    
            for (int i = 0; i < 10; i++) {
                cache.put(Integer.toString(i), DUMMY);
    
                System.out.println("Set elements: " + getKeys(cache));
            }
    
            System.out.println("Set size after init: " + cache.size());
        }
    
        static <T> List<T> getKeys(IgniteCache<T, ?> cache) {
            List<T> keys = new ArrayList<>(cache.size());
    
            for (Cache.Entry<T, ?> e : cache)
                keys.add(e.getKey());
    
            return keys;
        }
    }
    

    【讨论】:

      最近更新 更多