urlyy opened a new issue, #2771: URL: https://github.com/apache/fory/issues/2771
### Search before asking - [x] I had searched in the [issues](https://github.com/apache/fory/issues) and found no similar issues. ### Version Latest ### Component(s) Java ### Minimal reproduce step ```java @Test public void testWriteMetaStringBytes() { MetaStringResolver writeResolver = new MetaStringResolver(); MetaStringResolver readResolver1 = new MetaStringResolver(); MetaStringResolver readResolver2 = new MetaStringResolver(); String str = "hello"; MetaString metaString = new MetaStringEncoder('.', '_').encode(str); // first write MemoryBuffer buffer = MemoryUtils.buffer(32); writeResolver.writeMetaStringBytes( buffer, writeResolver.getOrCreateMetaStringBytes(metaString)); String metaString1 = readResolver1.readMetaString(buffer); assertEquals(metaString1.hashCode(), str.hashCode()); assertEquals(metaString1.getBytes(), str.getBytes()); // second write to same peer, no error MemoryBuffer buffer2 = MemoryUtils.buffer(32); writeResolver.writeMetaStringBytes( buffer2, writeResolver.getOrCreateMetaStringBytes(metaString)); String metaString2 = readResolver1.readMetaString(buffer2); assertEquals(metaString2.hashCode(), str.hashCode()); assertEquals(metaString2.getBytes(), str.getBytes()); // write to another peer MemoryBuffer buffer3 = MemoryUtils.buffer(32); writeResolver.writeMetaStringBytes( buffer3, writeResolver.getOrCreateMetaStringBytes(metaString)); String metaString3 = readResolver2.readMetaString(buffer3);// !! here occurs error assertEquals(metaString3.hashCode(), str.hashCode()); assertEquals(metaString3.getBytes(), str.getBytes()); } ``` ### What did you expect to see? pass test ### What did you see instead? ``` java.lang.NullPointerException at org.apache.fory.collection.ForyObjectMap.place(ForyObjectMap.java:139) at org.apache.fory.collection.ForyObjectMap.get(ForyObjectMap.java:198) at org.apache.fory.resolver.MetaStringResolver.readMetaString(MetaStringResolver.java:131) at org.apache.fory.resolver.MetaStringResolverTest.testWriteMetaString2(MetaStringResolverTest.java:78) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:136) at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:658) at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:219) at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50) at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:923) at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:192) at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146) at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128) at java.util.ArrayList.forEach(ArrayList.java:1259) at org.testng.TestRunner.privateRun(TestRunner.java:808) at org.testng.TestRunner.run(TestRunner.java:603) at org.testng.SuiteRunner.runTest(SuiteRunner.java:429) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383) at org.testng.SuiteRunner.run(SuiteRunner.java:326) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249) at org.testng.TestNG.runSuitesLocally(TestNG.java:1169) at org.testng.TestNG.runSuites(TestNG.java:1092) at org.testng.TestNG.run(TestNG.java:1060) at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:65) at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:105) ``` ### Anything Else? Reason: When writing a same metastring, first write will write its data bytes, and cache locally. And receiver will read data bytes and cache it locally. When second write to same receiver, will only write a cache_index. The receiver will get the cache locally using the cache_index. But third time if write to another receiver , the new receiver will only get a cache_index but have no cache locally, and will get NPE. ### Are you willing to submit a PR? - [ ] I'm willing to submit a PR! -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected] --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
