Rework cache flushing logic--this version should work much better.
[bluesky.git] / nfs3 / nfs3.c
index b0e5892..ec5c736 100644 (file)
@@ -328,6 +328,8 @@ void nfsproc3_read_3_svc(read3args *argp, RPCRequest *req)
     memset(&result, 0, sizeof(result));
     char buf[NFS_MAXSIZE];
 
+    bluesky_flushd_invoke_conditional(fs);
+
     BlueSkyInode *inode = lookup_fh(req, &argp->file);
     if (inode == NULL) {
         result.status = NFS3ERR_STALE;
@@ -372,6 +374,8 @@ void nfsproc3_write_3_svc(write3args *argp, RPCRequest *req)
     struct wcc_data wcc;
     memset(&wcc, 0, sizeof(wcc));
 
+    bluesky_flushd_invoke_conditional(fs);
+
     BlueSkyInode *inode = lookup_fh(req, &argp->file);
     if (inode == NULL) {
         result.status = NFS3ERR_STALE;
@@ -380,6 +384,21 @@ void nfsproc3_write_3_svc(write3args *argp, RPCRequest *req)
         return;
     }
 
+#if 0
+    /* FIXME: Hack to throttle writes when there is too much dirty data still
+     * to be written out. */
+    while (g_atomic_int_get(&fs->cache_dirty) > 4096
+           || g_atomic_int_get(&fs->cache_total) > 8192) {
+        g_print("Too many dirty pages (%d) or total pages (%d); throttling writes...\n",
+                g_atomic_int_get(&fs->cache_dirty),
+                g_atomic_int_get(&fs->cache_total));
+        struct timespec delay;
+        delay.tv_sec = 2;
+        delay.tv_nsec = 0;
+        nanosleep(&delay, NULL);
+    }
+#endif
+
     g_mutex_lock(inode->lock);
 
     encode_pre_wcc(&wcc, inode);
@@ -1115,7 +1134,7 @@ void nfsproc3_commit_3_svc(commit3args *argp, RPCRequest *req)
     g_mutex_lock(inode->lock);
     encode_pre_wcc(&result.commit3res_u.resok.file_wcc, inode);
 
-    bluesky_inode_do_sync(inode);
+    //bluesky_inode_do_sync(inode);
 
     result.commit3res_u.resok.file_wcc.after.present = TRUE;
     encode_fattr3(&result.commit3res_u.resok.file_wcc.after.post_op_attr_u.attributes, inode);