@@ -250,14 +302,18 @@ FindStreamingStart(uint32 *tli)
                /*
                 * Check that the segment has the right size, if it's supposed 
to be
                 * completed.  For non-compressed segments just check the 
on-disk size
-                * and see if it matches a completed segment. For compressed 
segments,
-                * look at the last 4 bytes of the compressed file, which is 
where the
-                * uncompressed size is located for gz files with a size lower 
than
-                * 4GB, and then compare it to the size of a completed segment. 
The 4
-                * last bytes correspond to the ISIZE member according to
+                * and see if it matches a completed segment. For zlib 
compressed
+                * segments, look at the last 4 bytes of the compressed file, 
which is
+                * where the uncompressed size is located for gz files with a 
size lower
+                * than 4GB, and then compare it to the size of a completed 
segment.
+                * The 4 last bytes correspond to the ISIZE member according to
                 * http://www.zlib.org/rfc-gzip.html.
+                *
+                * For lz4 compressed segments read the header using the 
exposed API and
+                * compare the uncompressed file size, stored in
+                * LZ4F_frameInfo_t{.contentSize}, to that of a completed 
segment.
                 */
-               if (!ispartial && !iscompress)
+               if (!ispartial && wal_compression_method == COMPRESSION_NONE)
                {
                        struct stat statbuf;
                        char            fullpath[MAXPGPATH * 2];
@@ -276,7 +332,7 @@ FindStreamingStart(uint32 *tli)
                                continue;
                        }
                }
-               else if (!ispartial && iscompress)
+               else if (!ispartial && wal_compression_method == 
COMPRESSION_ZLIB)
                {
                        int                     fd;
                        char            buf[4];
@@ -322,6 +378,70 @@ FindStreamingStart(uint32 *tli)
                                continue;
                        }
                }
+               else if (!ispartial && compression_method == COMPRESSION_LZ4)
+               {
+#ifdef HAVE_LIBLZ4
+                       int                     fd;
+                       int                     r;
+                       size_t          consumed_len = LZ4F_HEADER_SIZE_MAX;
+                       char        buf[LZ4F_HEADER_SIZE_MAX];
+                       char            fullpath[MAXPGPATH * 2];
+                       LZ4F_frameInfo_t frame_info = { 0 };
+                       LZ4F_decompressionContext_t ctx = NULL;
+
+                       snprintf(fullpath, sizeof(fullpath), "%s/%s", basedir, 
dirent->d_name);
+
+                       fd = open(fullpath, O_RDONLY | PG_BINARY, 0);

Should close the fd before exit or abort.

Reply via email to