Skip to content

Commit d99bcab

Browse files
committed
refactor meta string write/read
1 parent f40b80b commit d99bcab

11 files changed

Lines changed: 425 additions & 254 deletions

File tree

.idea/vcs.xml

Lines changed: 1 addition & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

java/fory-core/src/main/java/org/apache/fory/Fory.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
import org.apache.fory.context.MapRefReader;
3636
import org.apache.fory.context.MapRefWriter;
3737
import org.apache.fory.context.MetaContext;
38+
import org.apache.fory.context.MetaStringReader;
39+
import org.apache.fory.context.MetaStringWriter;
3840
import org.apache.fory.context.NoRefReader;
3941
import org.apache.fory.context.NoRefWriter;
4042
import org.apache.fory.context.ReadContext;
@@ -53,8 +55,6 @@
5355
import org.apache.fory.memory.MemoryUtils;
5456
import org.apache.fory.meta.MetaCompressor;
5557
import org.apache.fory.resolver.ClassResolver;
56-
import org.apache.fory.resolver.MetaStringReader;
57-
import org.apache.fory.resolver.MetaStringWriter;
5858
import org.apache.fory.resolver.SharedRegistry;
5959
import org.apache.fory.resolver.TypeInfo;
6060
import org.apache.fory.resolver.TypeResolver;
@@ -155,7 +155,10 @@ public Fory(ForyBuilder builder, ClassLoader classLoader, SharedRegistry sharedR
155155
stringSerializer = new StringSerializer(config);
156156
typeResolver = crossLanguage ? new XtypeResolver(this) : new ClassResolver(this);
157157
typeResolver.initialize();
158-
MetaStringWriter metaStringWriter = new MetaStringWriter(sharedRegistry);
158+
MetaStringWriter metaStringWriter =
159+
config.forVirtualThread()
160+
? new MetaStringWriter.MapStateMetaStringWriter(sharedRegistry)
161+
: new MetaStringWriter.FieldStateMetaStringWriter(sharedRegistry);
159162
MetaStringReader metaStringReader = new MetaStringReader(sharedRegistry);
160163
writeContext =
161164
new WriteContext(

java/fory-core/src/main/java/org/apache/fory/resolver/MetaStringReader.java renamed to java/fory-core/src/main/java/org/apache/fory/context/MetaStringReader.java

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@
1717
* under the License.
1818
*/
1919

20-
package org.apache.fory.resolver;
20+
package org.apache.fory.context;
2121

2222
import java.util.Arrays;
2323
import java.util.Objects;
24+
import org.apache.fory.annotation.Internal;
2425
import org.apache.fory.collection.LongLongByteMap;
2526
import org.apache.fory.collection.LongMap;
2627
import org.apache.fory.collection.ObjectMap;
@@ -29,11 +30,14 @@
2930
import org.apache.fory.meta.EncodedMetaString;
3031
import org.apache.fory.meta.Encoders;
3132
import org.apache.fory.meta.MetaStringDecoder;
33+
import org.apache.fory.resolver.MetaStringRef;
34+
import org.apache.fory.resolver.SharedRegistry;
3235
import org.apache.fory.util.MurmurHash3;
3336

3437
/** Read-side state for meta-string references. */
38+
@Internal
3539
public final class MetaStringReader {
36-
private static final int INITIAL_CAPACITY = 4;
40+
private static final int INITIAL_CAPACITY = 2;
3741
private static final float LOAD_FACTOR = 0.5f;
3842
private static final int SMALL_STRING_THRESHOLD = 16;
3943

@@ -56,7 +60,7 @@ public MetaStringReader(SharedRegistry sharedRegistry) {
5660

5761
public String readMetaString(MemoryBuffer buffer) {
5862
MetaStringRef metaStringRef = readMetaStringBytes(buffer);
59-
EncodedMetaString encodedMetaString = metaStringRef.encoded;
63+
EncodedMetaString encodedMetaString = metaStringRef.getEncoded();
6064
String str = metaString2StringMap.get(encodedMetaString);
6165
if (str == null) {
6266
str = metaStringRef.decode(Encoders.GENERIC_DECODER);
@@ -106,7 +110,7 @@ public MetaStringRef readMetaStringBytes(MemoryBuffer buffer) {
106110
return dynamicReadStringIds[len - 1];
107111
}
108112

109-
MetaStringRef readMetaStringBytes(MemoryBuffer buffer, MetaStringRef cache) {
113+
public MetaStringRef readMetaStringBytes(MemoryBuffer buffer, MetaStringRef cache) {
110114
int header = buffer.readVarUint32Small7();
111115
int len = header >>> 1;
112116
if ((header & 0b1) == 0) {
@@ -122,7 +126,7 @@ MetaStringRef readMetaStringBytes(MemoryBuffer buffer, MetaStringRef cache) {
122126

123127
private MetaStringRef readBigMetaStringBytes(MemoryBuffer buffer, MetaStringRef cache, int len) {
124128
long hashCode = buffer.readInt64();
125-
if (cache.encoded.hash == hashCode) {
129+
if (cache.getEncoded().hash == hashCode) {
126130
buffer.increaseReaderIndex(len);
127131
return cache;
128132
}
@@ -134,7 +138,7 @@ private MetaStringRef readBigMetaStringBytes(MemoryBuffer buffer, int len, long
134138
if (encodedMetaString == null) {
135139
EncodedMetaString newMetaString = new EncodedMetaString(buffer.readBytes(len), hashCode);
136140
MetaStringRef metaStringRef = sharedRegistry.getOrCreateMetaStringRef(newMetaString);
137-
hash2MetaStringMap.put(hashCode, metaStringRef.encoded);
141+
hash2MetaStringMap.put(hashCode, metaStringRef.getEncoded());
138142
return metaStringRef;
139143
}
140144
buffer.increaseReaderIndex(len);
@@ -175,7 +179,7 @@ private MetaStringRef readSmallMetaStringBytes(
175179
v1 = buffer.readInt64();
176180
v2 = buffer.readBytesAsInt64(len - 8);
177181
}
178-
EncodedMetaString cachedMetaString = cache.encoded;
182+
EncodedMetaString cachedMetaString = cache.getEncoded();
179183
if (cachedMetaString.first8Bytes == v1 && cachedMetaString.second8Bytes == v2) {
180184
return cache;
181185
}
@@ -195,23 +199,27 @@ private MetaStringRef createSmallMetaStringBytes(int len, byte encoding, long v1
195199
hashCode = (hashCode & 0xffffffffffffff00L) | encoding;
196200
EncodedMetaString encodedMetaString = new EncodedMetaString(Arrays.copyOf(data, len), hashCode);
197201
MetaStringRef metaStringRef = sharedRegistry.getOrCreateMetaStringRef(encodedMetaString);
198-
longLongMetaStringMap.put(v1, v2, encoding, metaStringRef.encoded);
202+
longLongMetaStringMap.put(v1, v2, encoding, metaStringRef.getEncoded());
199203
return metaStringRef;
200204
}
201205

202206
private void updateDynamicString(MetaStringRef metaStringRef) {
203207
short currentDynamicReadId = dynamicReadStringId++;
204208
MetaStringRef[] readStringIds = dynamicReadStringIds;
205209
if (readStringIds.length <= currentDynamicReadId) {
206-
readStringIds = growRead(currentDynamicReadId);
210+
readStringIds = dynamicReadStringIds = growRead(readStringIds, currentDynamicReadId);
207211
}
208212
readStringIds[currentDynamicReadId] = metaStringRef;
209213
}
210214

211-
private MetaStringRef[] growRead(int id) {
212-
MetaStringRef[] tmp = new MetaStringRef[id * 2];
213-
System.arraycopy(dynamicReadStringIds, 0, tmp, 0, dynamicReadStringIds.length);
214-
return dynamicReadStringIds = tmp;
215+
private MetaStringRef[] growRead(MetaStringRef[] current, int id) {
216+
int newLength = current.length;
217+
while (newLength <= id) {
218+
newLength <<= 1;
219+
}
220+
MetaStringRef[] expanded = new MetaStringRef[newLength];
221+
System.arraycopy(current, 0, expanded, 0, current.length);
222+
return expanded;
215223
}
216224

217225
public void reset() {

0 commit comments

Comments
 (0)