s3: Optimize the write cache for sequential writes
authorVolker Lendecke <vl@samba.org>
Wed, 7 Jul 2010 19:50:23 +0000 (21:50 +0200)
committerVolker Lendecke <vl@samba.org>
Fri, 9 Jul 2010 06:50:41 +0000 (08:50 +0200)
In case of the one-byte allocating writes we don't work work optimally because
we start the write cache at the current offset. This patch tries to avoid this
case.

source3/smbd/fileio.c

index 92b7d3ed9ea0a6ead0103ac28d2a9d784f985210..92757f7052e78631a356e51fc742c355646b796e 100644 (file)
@@ -796,6 +796,26 @@ n = %u, wcp->offset=%.0f, wcp->data_size=%u\n",
                        DO_PROFILE_INC(writecache_init_writes);
                }
 #endif
+
+               if ((wcp->data_size == 0)
+                   && (pos > wcp->file_size)
+                   && (pos + n <= wcp->file_size + wcp->alloc_size)) {
+                       /*
+                        * This is a write completely beyond the
+                        * current EOF, but within reach of the write
+                        * cache. We expect fill-up writes pretty
+                        * soon, so it does not make sense to start
+                        * the write cache at the current
+                        * offset. These fill-up writes would trigger
+                        * separate pwrites or even unnecessary cache
+                        * flushes because they overlap if this is a
+                        * one-byte allocating write.
+                        */
+                       wcp->offset = wcp->file_size;
+                       wcp->data_size = pos - wcp->file_size;
+                       memset(wcp->data, 0, wcp->data_size);
+               }
+
                memcpy(wcp->data+wcp->data_size, data, n);
                if (wcp->data_size == 0) {
                        wcp->offset = pos;