代码之家  ›  专栏  ›  技术社区  ›  rupweb

apache geode调试未知pdx类型=2140705

  •  1
  • rupweb  · 技术社区  · 8 年前

    如果我启动一个gfsh客户端并连接到geode。里面有很多数据 myRegion 检查一下然后我跑:

    query --query="select * from /myRegion"
    

    我得到的答复是:

    Result     : false
    startCount : 0
    endCount   : 20
    Message    : Unknown pdx type=2140705
    

    如何解决/调试这个问题?

    更新:geode服务器日志中的错误为:

    [info 2018/07/04 10:53:07.275 BST IsGeode <Function Execution Processor1> tid=0x48] Exception occurred:
    java.lang.IllegalStateException: Unknown pdx type=1318971
      at org.apache.geode.internal.InternalDataSerializer.readPdxSerializable(InternalDataSerializer.java:3042)
      at org.apache.geode.internal.InternalDataSerializer.basicReadObject(InternalDataSerializer.java:2859)
      at org.apache.geode.DataSerializer.readObject(DataSerializer.java:2961)
      at org.apache.geode.internal.util.BlobHelper.deserializeBlob(BlobHelper.java:90)
      at org.apache.geode.internal.cache.EntryEventImpl.deserialize(EntryEventImpl.java:1911)
      at org.apache.geode.internal.cache.EntryEventImpl.deserialize(EntryEventImpl.java:1904)
      at org.apache.geode.internal.cache.PreferBytesCachedDeserializable.getDeserializedValue(PreferBytesCachedDeserializable.java:73)
      at org.apache.geode.internal.cache.LocalRegion.getDeserialized(LocalRegion.java:1269)
      at org.apache.geode.internal.cache.LocalRegion$NonTXEntry.getValue(LocalRegion.java:8771)
      at org.apache.geode.internal.cache.EntriesSet$EntriesIterator.moveNext(EntriesSet.java:179)
      at org.apache.geode.internal.cache.EntriesSet$EntriesIterator.next(EntriesSet.java:134)
      at org.apache.geode.cache.query.internal.CompiledSelect.doNestedIterations(CompiledSelect.java:837)
      at org.apache.geode.cache.query.internal.CompiledSelect.doIterationEvaluate(CompiledSelect.java:699)
      at org.apache.geode.cache.query.internal.CompiledSelect.evaluate(CompiledSelect.java:423)
      at org.apache.geode.cache.query.internal.CompiledSelect.evaluate(CompiledSelect.java:53)
      at org.apache.geode.cache.query.internal.DefaultQuery.executeUsingContext(DefaultQuery.java:558)
      at org.apache.geode.cache.query.internal.DefaultQuery.execute(DefaultQuery.java:385)
      at org.apache.geode.cache.query.internal.DefaultQuery.execute(DefaultQuery.java:319)
      at org.apache.geode.management.internal.cli.functions.DataCommandFunction.select(DataCommandFunction.java:247)
      at org.apache.geode.management.internal.cli.functions.DataCommandFunction.select(DataCommandFunction.java:202)
      at org.apache.geode.management.internal.cli.functions.DataCommandFunction.execute(DataCommandFunction.java:147)
      at org.apache.geode.internal.cache.MemberFunctionStreamingMessage.process(MemberFunctionStreamingMessage.java:185)
      at org.apache.geode.distributed.internal.DistributionMessage.scheduleAction(DistributionMessage.java:374)
      at org.apache.geode.distributed.internal.DistributionMessage$1.run(DistributionMessage.java:440)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
      at org.apache.geode.distributed.internal.DistributionManager.runUntilShutdown(DistributionManager.java:662)
      at org.apache.geode.distributed.internal.DistributionManager$9$1.run(DistributionManager.java:1108)
      at java.lang.Thread.run(Thread.java:748)
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Randy May    8 年前

    从堆栈跟踪可以看出直接原因。

    pdx序列化流包含一个类型id,该id是对gemfire集群维护的类型元数据存储库的引用。在这种情况下,对象的序列化数据包含的typeid不在集群的元数据存储库中。

    所以问题变成了,“什么序列化了那个对象,为什么它使用了一个无效的类型id?”

    我以前见过这种情况的唯一方式是当集群完全重新启动并且pdx元数据消失时,这可能是因为它不是持久的,也可能是因为它被删除了(例如,通过清除定位器工作目录)。

    gemfire客户端缓存类型与其类型id之间的映射。这允许它们快速序列化对象,而无需不断从服务器上查找类型id。客户机连接可以在群集重新启动时保持。当客户端重新连接时,它不会刷新缓存的信息,并继续使用其缓存的类型ID写入对象。

    因此,失去集群重启的pdx元数据和未重启的客户端(如应用程序)的组合。服务器)是我以前见过这种情况的唯一方式。这符合你的设想吗?

    如果是这样,避免这种情况的最佳方法之一是持久化pdx元数据,而不删除它。

    推荐文章