+ add_response_info(sock,
+ "QueueLength: %"PRIu64"\n", copy_queue_length);
+ add_response_info(sock,
+ "UpdatesReceived: %"PRIu64"\n", copy_updates_received);
+ add_response_info(sock,
+ "FlushesReceived: %"PRIu64"\n", copy_flush_received);
+ add_response_info(sock,
+ "UpdatesWritten: %"PRIu64"\n", copy_updates_written);
+ add_response_info(sock,
+ "DataSetsWritten: %"PRIu64"\n", copy_data_sets_written);
+ add_response_info(sock, "TreeNodesNumber: %"PRIu64"\n", tree_nodes_number);
+ add_response_info(sock, "TreeDepth: %"PRIu64"\n", tree_depth);
+ add_response_info(sock, "JournalBytes: %"PRIu64"\n", copy_journal_bytes);
+ add_response_info(sock, "JournalRotate: %"PRIu64"\n", copy_journal_rotate);
+
+ send_response(sock, RESP_OK, "Statistics follow\n");
+
+ return (0);
+} /* }}} int handle_request_stats */
+
+static int handle_request_flush (listen_socket_t *sock, /* {{{ */
+ char *buffer, size_t buffer_size)
+{
+ char *file, file_tmp[PATH_MAX];
+ int status;
+
+ status = buffer_get_field (&buffer, &buffer_size, &file);
+ if (status != 0)
+ {
+ return send_response(sock, RESP_ERR, "Usage: flush <filename>\n");
+ }
+ else
+ {
+ pthread_mutex_lock(&stats_lock);
+ stats_flush_received++;
+ pthread_mutex_unlock(&stats_lock);
+
+ get_abs_path(&file, file_tmp);
+ if (!check_file_access(file, sock)) return 0;
+
+ status = flush_file (file);
+ if (status == 0)
+ return send_response(sock, RESP_OK, "Successfully flushed %s.\n", file);
+ else if (status == ENOENT)
+ {
+ /* no file in our tree; see whether it exists at all */
+ struct stat statbuf;
+
+ memset(&statbuf, 0, sizeof(statbuf));
+ if (stat(file, &statbuf) == 0 && S_ISREG(statbuf.st_mode))
+ return send_response(sock, RESP_OK, "Nothing to flush: %s.\n", file);
+ else
+ return send_response(sock, RESP_ERR, "No such file: %s.\n", file);
+ }
+ else if (status < 0)
+ return send_response(sock, RESP_ERR, "Internal error.\n");
+ else
+ return send_response(sock, RESP_ERR, "Failed with status %i.\n", status);