[Git][java-team/snappy-java][master] 5 commits: New upstream version 1.1.7.3

Emmanuel Bourg gitlab at salsa.debian.org
Sun Jan 26 18:47:32 GMT 2020



Emmanuel Bourg pushed to branch master at Debian Java Maintainers / snappy-java


Commits:
f959f782 by Emmanuel Bourg at 2020-01-26T19:41:44+01:00
New upstream version 1.1.7.3
- - - - -
615dfd54 by Emmanuel Bourg at 2020-01-26T19:41:48+01:00
Update upstream source from tag 'upstream/1.1.7.3'

Update to upstream version '1.1.7.3'
with Debian dir 2b97c7c800d0de95b63a806efa56eab9460c4c9c
- - - - -
c8c696a3 by Emmanuel Bourg at 2020-01-26T19:42:43+01:00
New upstream release (1.1.7.3)

- - - - -
5dca20c6 by Emmanuel Bourg at 2020-01-26T19:43:54+01:00
Standards-Version updated to 4.5.0

- - - - -
3a76efd5 by Emmanuel Bourg at 2020-01-26T19:47:11+01:00
Upload to unstable

- - - - -


7 changed files:

- Milestone.md
- README.md
- debian/changelog
- debian/control
- src/main/java/org/xerial/snappy/SnappyFramed.java
- src/main/java/org/xerial/snappy/SnappyOutputStream.java
- version.sbt


Changes:

=====================================
Milestone.md
=====================================
@@ -1,5 +1,8 @@
 Since version 1.1.0.x, Java 6 (1.6) or higher is required.
 
+## snappy-java-1.1.7.2 (2018-05-21)
+ * Fix for aarch64 endian issue
+
 ## snappy-java-1.1.7.1 (2017-12-07)
  * Fix for Android. No need to upgrade to this version if you are not using Android
 


=====================================
README.md
=====================================
@@ -1,4 +1,4 @@
-snappy-java [![Build Status](https://travis-ci.org/xerial/snappy-java.svg?branch=master)](https://travis-ci.org/xerial/snappy-java) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/org.xerial.snappy/snappy-java/badge.svg)](https://maven-badges.herokuapp.com/maven-central/org.xerial.snappy/snappy-java/) [![Javadoc](http://javadoc-badge.appspot.com/org.xerial.snappy/snappy-java.svg?label=javadoc)](http://javadoc-badge.appspot.com/org.xerial.snappy/snappy-java) [![Reference Status](https://www.versioneye.com/java/org.xerial.snappy:snappy-java/reference_badge.svg?style=flat-square)](https://www.versioneye.com/java/org.xerial.snappy:snappy-java/references)
+snappy-java [![Build Status](https://travis-ci.org/xerial/snappy-java.svg?branch=master)](https://travis-ci.org/xerial/snappy-java) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/org.xerial.snappy/snappy-java/badge.svg)](https://maven-badges.herokuapp.com/maven-central/org.xerial.snappy/snappy-java/) [![Javadoc](http://javadoc-badge.appspot.com/org.xerial.snappy/snappy-java.svg?label=javadoc)](http://javadoc-badge.appspot.com/org.xerial.snappy/snappy-java) 
 === 
 snappy-java is a Java port of the snappy
 <http://code.google.com/p/snappy/>, a fast C++ compresser/decompresser developed by Google.
@@ -83,9 +83,20 @@ Stream-based compressor/decompressor `SnappyOutputStream`/`SnappyInputStream` ar
  * See also [Javadoc API](https://oss.sonatype.org/service/local/repositories/releases/archive/org/xerial/snappy/snappy-java/1.1.3-M1/snappy-java-1.1.3-M1-javadoc.jar/!/index.html)
 
 #### Compatibility Notes
- * `SnappyOutputStream` and `SnappyInputStream` use `[magic header:16 bytes]([block size:int32][compressed data:byte array])*` format. You can read the result of `Snappy.compress` with `SnappyInputStream`, but you cannot read the compressed data generated by `SnappyOutputStream` with `Snappy.uncompress`. Here is the data format compatibility matrix:
+
+The original Snappy format definition did not define a file format. It later added
+a "framing" format to define a file format, but by this point major software was
+already using an industry standard instead -- represented in this library by the
+`SnappyOutputStream` and `SnappyInputStream` methods.
+
+For interoperability with other libraries, check that compatible formats are used.
+Note that not all libraries support all variants.
+
+ * `SnappyOutputStream` and `SnappyInputStream` use `[magic header:16 bytes]([block size:int32][compressed data:byte array])*` format. You can read the result of `Snappy.compress` with `SnappyInputStream`, but you cannot read the compressed data generated by `SnappyOutputStream` with `Snappy.uncompress`.
  * `SnappyHadoopCompatibleOutputStream` does not emit a file header but write out the current block size as a  preemble to each block
 
+#### Data format compatibility matrix:
+
 | Write\Read      | `Snappy.uncompress`   | `SnappyInputStream`  | `SnappyFramedInputStream` | `org.apache.hadoop.io.compress.SnappyCodec` |
 | --------------- |:-------------------:|:------------------:|:-----------------------:|:-------------------------------------------:|
 | `Snappy.compress` | ok | ok | x | x |


=====================================
debian/changelog
=====================================
@@ -1,3 +1,11 @@
+snappy-java (1.1.7.3-1) unstable; urgency=medium
+
+  * Team upload.
+  * New upstream release
+  * Standards-Version updated to 4.5.0
+
+ -- Emmanuel Bourg <ebourg at apache.org>  Sun, 26 Jan 2020 19:47:06 +0100
+
 snappy-java (1.1.7.2-1) unstable; urgency=medium
 
   * Team upload.


=====================================
debian/control
=====================================
@@ -10,7 +10,7 @@ Build-Depends:
  libmaven-bundle-plugin-java,
  libsnappy-dev,
  maven-debian-helper
-Standards-Version: 4.2.1
+Standards-Version: 4.5.0
 Vcs-Browser: https://salsa.debian.org/java-team/snappy-java
 Vcs-Git: https://salsa.debian.org/java-team/snappy-java.git
 Homepage: https://github.com/xerial/snappy-java


=====================================
src/main/java/org/xerial/snappy/SnappyFramed.java
=====================================
@@ -3,10 +3,22 @@
  */
 package org.xerial.snappy;
 
+import static java.lang.invoke.MethodHandles.constant;
+import static java.lang.invoke.MethodHandles.dropArguments;
+import static java.lang.invoke.MethodHandles.filterReturnValue;
+import static java.lang.invoke.MethodHandles.guardWithTest;
+import static java.lang.invoke.MethodHandles.lookup;
+import static java.lang.invoke.MethodType.methodType;
+
 import java.io.IOException;
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles.Lookup;
+import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.nio.ByteBuffer;
 import java.nio.channels.ReadableByteChannel;
+import java.security.AccessController;
+import java.security.PrivilegedExceptionAction;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -30,27 +42,76 @@ final class SnappyFramed
      * Sun specific mechanisms to clean up resources associated with direct byte buffers.
      */
     @SuppressWarnings("unchecked")
-    private static final Class<? extends ByteBuffer> SUN_DIRECT_BUFFER = (Class<? extends ByteBuffer>) lookupClassQuietly("sun.nio.ch.DirectBuffer");
-    private static final Method SUN_BUFFER_CLEANER;
-    private static final Method SUN_CLEANER_CLEAN;
+    static final Class<? extends ByteBuffer> DIRECT_BUFFER_CLAZZ = (Class<? extends ByteBuffer>) lookupClassQuietly("java.nio.DirectByteBuffer");
 
+    static final MethodHandle CLEAN_HANDLE;
+    
     static {
-        Method bufferCleaner = null;
-        Method cleanerClean = null;
+        // this approach is based off that used by apache lucene and documented here: https://issues.apache.org/jira/browse/LUCENE-6989
+        // and https://github.com/apache/lucene-solr/blob/7e03427fa14a024ce257babcb8362d2451941e21/lucene/core/src/java/org/apache/lucene/store/MMapDirectory.java
+        MethodHandle cleanHandle = null;
         try {
-            //operate under the assumption that if the sun direct buffer class exists,
-            //all of the sun classes exist
-            if (SUN_DIRECT_BUFFER != null) {
-                bufferCleaner = SUN_DIRECT_BUFFER.getMethod("cleaner", (Class[]) null);
-                Class<?> cleanClazz = lookupClassQuietly("sun.misc.Cleaner");
-                cleanerClean = cleanClazz.getMethod("clean", (Class[]) null);
-            }
-        }
-        catch (Throwable t) {
+            final PrivilegedExceptionAction<MethodHandle> action = new PrivilegedExceptionAction<MethodHandle>() {
+
+                @Override
+                public MethodHandle run() throws Exception {
+                    MethodHandle handle = null;
+                    if (DIRECT_BUFFER_CLAZZ != null) {
+                        final Lookup lookup = lookup();
+
+                        try {
+                            // sun.misc.Unsafe unmapping (Java 9+)
+                            final Class<?> unsafeClass = Class.forName("sun.misc.Unsafe");
+                            // first check if Unsafe has the right method, otherwise we can give up
+                            // without doing any security critical stuff:
+                            final MethodHandle unmapper = lookup.findVirtual(unsafeClass, "invokeCleaner", methodType(void.class, ByteBuffer.class));
+                            // fetch the unsafe instance and bind it to the virtual MH:
+                            final Field f = unsafeClass.getDeclaredField("theUnsafe");
+                            f.setAccessible(true);
+                            final Object theUnsafe = f.get(null);
+                            handle = unmapper.bindTo(theUnsafe);
+                        } catch (Exception e) {
+                            Logger.getLogger(SnappyFramed.class.getName()).log(Level.FINE, "unable to use java 9 Unsafe.invokeCleaner", e);
+                            
+                            // sun.misc.Cleaner unmapping (Java 8 and older)
+                            final Method m = DIRECT_BUFFER_CLAZZ.getMethod("cleaner");
+                            m.setAccessible(true);
+                            final MethodHandle directBufferCleanerMethod = lookup.unreflect(m);
+                            final Class<?> cleanerClass = directBufferCleanerMethod.type().returnType();
+
+                            /*
+                             * "Compile" a MethodHandle that basically is equivalent to the following code: 
+                             *  void unmapper(ByteBuffer byteBuffer) 
+                             *  { 
+                             *      sun.misc.Cleaner cleaner = ((java.nio.DirectByteBuffer) byteBuffer).cleaner(); 
+                             *      if (nonNull(cleaner)) 
+                             *      { 
+                             *          cleaner.clean(); 
+                             *      } 
+                             *      else 
+                             *      { 
+                             *          // the noop is needed because MethodHandles#guardWithTest always needs ELSE
+                             *          noop(cleaner);  
+                             *      } 
+                             *  }
+                             */
+                            final MethodHandle cleanMethod = lookup.findVirtual(cleanerClass, "clean", methodType(void.class));
+                            final MethodHandle nonNullTest = lookup.findStatic(SnappyFramed.class, "nonNull", methodType(boolean.class, Object.class)).asType(methodType(boolean.class, cleanerClass));
+                            final MethodHandle noop = dropArguments(constant(Void.class, null).asType(methodType(void.class)), 0, cleanerClass);
+                            handle = filterReturnValue(directBufferCleanerMethod, guardWithTest(nonNullTest, cleanMethod, noop)).asType(methodType(void.class, ByteBuffer.class));
+                        }
+                    }
+
+                    return handle;
+                }
+            };
+
+            cleanHandle = AccessController.doPrivileged(action);
+
+        } catch (Throwable t) {
             Logger.getLogger(SnappyFramed.class.getName()).log(Level.FINE, "Exception occurred attempting to lookup Sun specific DirectByteBuffer cleaner classes.", t);
         }
-        SUN_BUFFER_CLEANER = bufferCleaner;
-        SUN_CLEANER_CLEAN = cleanerClean;
+        CLEAN_HANDLE = cleanHandle;
     }
 
     /**
@@ -170,18 +231,34 @@ final class SnappyFramed
      *
      * @param buffer The {@code ByteBuffer} to release. Must not be {@code null}. Must be  {@link ByteBuffer#isDirect() direct}.
      */
-    static void releaseDirectByteBuffer(ByteBuffer buffer)
+    static void releaseDirectByteBuffer(final ByteBuffer buffer)
     {
         assert buffer != null && buffer.isDirect();
 
-        if (SUN_DIRECT_BUFFER != null && SUN_DIRECT_BUFFER.isAssignableFrom(buffer.getClass())) {
+        if (CLEAN_HANDLE != null && DIRECT_BUFFER_CLAZZ.isInstance(buffer)) {
             try {
-                Object cleaner = SUN_BUFFER_CLEANER.invoke(buffer, (Object[]) null);
-                SUN_CLEANER_CLEAN.invoke(cleaner, (Object[]) null);
-            }
-            catch (Throwable t) {
+                final PrivilegedExceptionAction<Void> pea = new PrivilegedExceptionAction<Void>() {
+                    @Override
+                    public Void run() throws Exception {
+                        try {
+                            CLEAN_HANDLE.invokeExact(buffer);
+                        } catch (Exception e) {
+                            throw e;
+                        } catch (Throwable t) {
+                            //this will be an error
+                            throw new RuntimeException(t);
+                        }
+                        return null;
+                    }
+                };
+                AccessController.doPrivileged(pea);
+            } catch (Throwable t) {
                 Logger.getLogger(SnappyFramed.class.getName()).log(Level.FINE, "Exception occurred attempting to clean up Sun specific DirectByteBuffer.", t);
             }
         }
     }
+
+    static boolean nonNull(Object o) {
+        return o != null;
+    }
 }


=====================================
src/main/java/org/xerial/snappy/SnappyOutputStream.java
=====================================
@@ -365,22 +365,18 @@ public class SnappyOutputStream
     protected void compressInput()
             throws IOException
     {
-        if (inputCursor <= 0) {
-            return; // no need to dump
-        }
-
         if (!headerWritten) {
             outputCursor = writeHeader();
             headerWritten = true;
         }
-
+        if (inputCursor <= 0) {
+            return; // no need to dump
+        }
         // Compress and dump the buffer content
         if (!hasSufficientOutputBufferFor(inputCursor)) {
             dumpOutput();
         }
-
         writeBlockPreemble();
-
         int compressedSize = Snappy.compress(inputBuffer, 0, inputCursor, outputBuffer, outputCursor + 4);
         // Write compressed data size
         writeInt(outputBuffer, outputCursor, compressedSize);


=====================================
version.sbt
=====================================
@@ -1 +1 @@
-version in ThisBuild := "1.1.7.2"
+version in ThisBuild := "1.1.7.3"



View it on GitLab: https://salsa.debian.org/java-team/snappy-java/compare/e0e148b10a599514c3ab637cc2b8b068bd532f01...3a76efd55a2b87a00e3aefff5196454ca49a2c09

-- 
View it on GitLab: https://salsa.debian.org/java-team/snappy-java/compare/e0e148b10a599514c3ab637cc2b8b068bd532f01...3a76efd55a2b87a00e3aefff5196454ca49a2c09
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-java-commits/attachments/20200126/ceaef73a/attachment.html>


More information about the pkg-java-commits mailing list