fury icon indicating copy to clipboard operation
fury copied to clipboard

fory deserialize lock alltime

Open DaiKiQi opened this issue 2 months ago • 4 comments

Question

we use threadpool submit fory deserialize task but sometime it will lock,we dump thread : at java.util.zip.Inflater.inflateBytes(Native Method) at java.util.zip.Inflater.inflate(Inflater.java:259) - locked java.util.zip.ZStreamRef@60072934 at java.util.zip.Inflater.inflate(Inflater.java:280) at org.apache.fory.meta.DeflaterMetaCompressor.decompress(DeflaterMetaCompressor.java:51) at org.apache.fory.meta.ClassDefDecoder.decodeClassDefBuf(ClassDefDecoder.java:62) at org.apache.fory.meta.ClassDefDecoder.decodeClassDef(ClassDefDecoder.java:68) at org.apache.fory.meta.ClassDef.readClassDef(ClassDef.java:231) at org.apache.fory.resolver.ClassResolver.readClassDef(ClassResolver.java:1738) at org.apache.fory.resolver.ClassResolver.readClassDefs(ClassResolver.java:1730) at org.apache.fory.Fory.readClassDefs(Fory.java:1557) at org.apache.fory.Fory.deserialize(Fory.java:877) at org.apache.fory.Fory.deserialize(Fory.java:906) at org.apache.fory.Fory.deserialize(Fory.java:899)

DaiKiQi avatar Oct 23 '25 08:10 DaiKiQi

Is this a bug in java.util.zip.Inflater.inflate?

chaokunyang avatar Oct 23 '25 08:10 chaokunyang

The decomrpess in fory is pretty simple:

  @Override
  public byte[] decompress(byte[] input, int offset, int size) {
    Inflater inflater = new Inflater();
    inflater.setInput(input, offset, size);
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    byte[] buffer = new byte[128];
    try {
      while (!inflater.finished()) {
        int decompressedSize = inflater.inflate(buffer);
        outputStream.write(buffer, 0, decompressedSize);
      }
    } catch (DataFormatException e) {
      throw new RuntimeException(e);
    }
    return outputStream.toByteArray();
  }

I don't see any wrong usage issue here

chaokunyang avatar Oct 23 '25 08:10 chaokunyang

The decomrpess in fory is pretty simple:

@Override public byte[] decompress(byte[] input, int offset, int size) { Inflater inflater = new Inflater(); inflater.setInput(input, offset, size); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[128]; try { while (!inflater.finished()) { int decompressedSize = inflater.inflate(buffer); outputStream.write(buffer, 0, decompressedSize); } } catch (DataFormatException e) { throw new RuntimeException(e); } return outputStream.toByteArray(); } I don't see any wrong usage issue here

maybe can i avoid use this util to decompress?

DaiKiQi avatar Oct 23 '25 08:10 DaiKiQi

maybe error byte data can cause this bug,i fix it by check byte data correct

DaiKiQi avatar Oct 23 '25 11:10 DaiKiQi