@@ -735,6 +735,34 @@ fio_fwrite(FILE* f, void const* buf, size_t size)
735735return fwrite (buf ,1 ,size ,f );
736736}
737737
738+ /*
739+ * Write buffer to descriptor by calling write(),
740+ * If size of written data is less than buffer size,
741+ * then try to write what is left.
742+ * We do this to get honest errno if there are some problems
743+ * with filesystem, since writing less than buffer size
744+ * is not considered an error.
745+ */
746+ static ssize_t
747+ durable_write (int fd ,const char * buf ,size_t size )
748+ {
749+ off_t current_pos = 0 ;
750+ size_t bytes_left = size ;
751+
752+ while (bytes_left > 0 )
753+ {
754+ int rc = write (fd ,buf + current_pos ,bytes_left );
755+
756+ if (rc <=0 )
757+ return rc ;
758+
759+ bytes_left -= rc ;
760+ current_pos += rc ;
761+ }
762+
763+ return size ;
764+ }
765+
738766/* Write data to the file synchronously */
739767ssize_t
740768fio_write (int fd ,void const * buf ,size_t size )
@@ -764,7 +792,7 @@ fio_write(int fd, void const* buf, size_t size)
764792}
765793else
766794{
767- return write (fd ,buf ,size );
795+ return durable_write (fd ,buf ,size );
768796}
769797}
770798
@@ -774,7 +802,7 @@ fio_write_impl(int fd, void const* buf, size_t size, int out)
774802int rc ;
775803fio_header hdr ;
776804
777- rc = write (fd ,buf ,size );
805+ rc = durable_write (fd ,buf ,size );
778806
779807hdr .arg = 0 ;
780808hdr .size = 0 ;
@@ -796,34 +824,6 @@ fio_fwrite_async(FILE* f, void const* buf, size_t size)
796824:fwrite (buf ,1 ,size ,f );
797825}
798826
799- /*
800- * Write buffer to descriptor by calling write(),
801- * If size of written data is less than buffer size,
802- * then try to write what is left.
803- * We do this to get honest errno if there are some problems
804- * with filesystem, since writing less than buffer size
805- * is not considered an error.
806- */
807- static ssize_t
808- durable_write (int fd ,const char * buf ,size_t size )
809- {
810- off_t current_pos = 0 ;
811- size_t bytes_left = size ;
812-
813- while (bytes_left > 0 )
814- {
815- int rc = write (fd ,buf + current_pos ,bytes_left );
816-
817- if (rc <=0 )
818- return rc ;
819-
820- bytes_left -= rc ;
821- current_pos += rc ;
822- }
823-
824- return size ;
825- }
826-
827827/* Write data to the file */
828828/* TODO: support async report error */
829829ssize_t
@@ -908,23 +908,22 @@ fio_fwrite_async_compressed(FILE* f, void const* buf, size_t size, int compress_
908908}
909909else
910910{
911- char uncompressed_buf [BLCKSZ ];
912911char * errormsg = NULL ;
913- int32 uncompressed_size = fio_decompress (uncompressed_buf ,buf ,size ,compress_alg ,& errormsg );
912+ char decompressed_buf [BLCKSZ ];
913+ int32 decompressed_size = fio_decompress (decompressed_buf ,buf ,size ,compress_alg ,& errormsg );
914914
915- if (uncompressed_size < 0 )
915+ if (decompressed_size < 0 )
916916elog (ERROR ,"%s" ,errormsg );
917917
918- return fwrite (uncompressed_buf ,1 ,uncompressed_size ,f );
918+ return fwrite (decompressed_buf ,1 ,decompressed_size ,f );
919919}
920920}
921921
922922static void
923923fio_write_compressed_impl (int fd ,void const * buf ,size_t size ,int compress_alg )
924924{
925- int rc ;
926- int32 uncompressed_size ;
927- char uncompressed_buf [BLCKSZ ];
925+ int32 decompressed_size ;
926+ char decompressed_buf [BLCKSZ ];
928927
929928/* If the previous command already have failed,
930929 * then there is no point in bashing a head against the wall
@@ -933,14 +932,12 @@ fio_write_compressed_impl(int fd, void const* buf, size_t size, int compress_alg
933932return ;
934933
935934/* decompress chunk */
936- uncompressed_size = fio_decompress (uncompressed_buf ,buf ,size ,compress_alg ,& async_errormsg );
935+ decompressed_size = fio_decompress (decompressed_buf ,buf ,size ,compress_alg ,& async_errormsg );
937936
938- if (uncompressed_size < 0 )
937+ if (decompressed_size < 0 )
939938return ;
940939
941- rc = write (fd ,uncompressed_buf ,uncompressed_size );
942-
943- if (rc <=0 )
940+ if (durable_write (fd ,decompressed_buf ,decompressed_size ) <=0 )
944941{
945942async_errormsg = pgut_malloc (ERRMSG_MAX_LEN );
946943snprintf (async_errormsg ,ERRMSG_MAX_LEN ,"%s" ,strerror (errno ));