From 63385d02e33b8efe2bd91b7c77dd5430b6db1aba Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 29 Apr 2010 10:43:24 -0700 Subject: [PATCH] mon: use (robust) buffer::list::write_fd() to write to disk --- src/common/buffer.cc | 14 ++++++++++---- src/include/buffer.h | 1 + src/mon/MonitorStore.cc | 15 +-------------- 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/src/common/buffer.cc b/src/common/buffer.cc index b6318c3f828b7..260f30229051a 100644 --- a/src/common/buffer.cc +++ b/src/common/buffer.cc @@ -80,6 +80,13 @@ int buffer::list::write_file(const char *fn, int mode) cerr << "can't write " << fn << ": " << strerror_r(errno, buf, sizeof(buf)) << std::endl; return -errno; } + int err = write_fd(fd); + ::close(fd); + return err; +} + +int buffer::list::write_fd(int fd) +{ for (std::list::const_iterator it = _buffers.begin(); it != _buffers.end(); it++) { @@ -87,18 +94,17 @@ int buffer::list::write_file(const char *fn, int mode) int left = it->length(); while (left > 0) { int r = ::write(fd, c, left); - if (r < 0) { - ::close(fd); + if (r < 0) return -errno; - } c += r; left -= r; } } - ::close(fd); return 0; } + + void buffer::list::hexdump(std::ostream &out) const { out.setf(std::ios::right); diff --git a/src/include/buffer.h b/src/include/buffer.h index 5aeb0a44c327f..08cde1e16837a 100644 --- a/src/include/buffer.h +++ b/src/include/buffer.h @@ -1137,6 +1137,7 @@ public: void hexdump(std::ostream &out) const; int read_file(const char *fn, bool silent=false); int write_file(const char *fn, int mode=0644); + int write_fd(int fd); __u32 crc32c(__u32 crc) { for (std::list::const_iterator it = _buffers.begin(); it != _buffers.end(); diff --git a/src/mon/MonitorStore.cc b/src/mon/MonitorStore.cc index 25132468f811b..f669d6ed3c2d2 100644 --- a/src/mon/MonitorStore.cc +++ b/src/mon/MonitorStore.cc @@ -261,20 +261,7 @@ int MonitorStore::write_bl_ss(bufferlist& bl, const char *a, const char *b, bool } assert(fd >= 0); - // write data - for (list::const_iterator it = bl.buffers().begin(); - it != bl.buffers().end(); - it++) { - int r = ::write(fd, it->c_str(), it->length()); - if (r != (int)it->length()) - derr(0) << "put_bl_ss ::write() returned " << r << " not " << it->length() << dendl; - if (r < 0) { - char buf[80]; - derr(0) << "put_bl_ss ::write() errored out, errno is " << strerror_r(errno, buf, sizeof(buf)) << dendl; - err = -errno; - break; - } - } + err = bl.write_fd(fd); if (sync && !err) ::fsync(fd); -- 2.39.5