From c91716edee8a80525cbdc8c0a846f33a70796985 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 8 Feb 2010 20:29:09 -0800 Subject: [PATCH] osd: store local osd magic, whoami, and other static bits outside of ObjectStore These values are immutable, and we also want to look at them prior to forking and 'mounting' the ObjectStore. Just keep them in separate files for simplicity. This avoids the double filestore startup cost paid on cosd startup. --- src/cosd.cc | 2 +- src/osd/OSD.cc | 105 +++++++++++++++++++++++++++++++++++--------- src/osd/OSD.h | 9 +++- src/osd/osd_types.h | 11 ++--- 4 files changed, 100 insertions(+), 27 deletions(-) diff --git a/src/cosd.cc b/src/cosd.cc index d04e538712164..8f0ec322647ab 100644 --- a/src/cosd.cc +++ b/src/cosd.cc @@ -113,7 +113,7 @@ int main(int argc, const char **argv) nstring magic; ceph_fsid_t fsid; int w; - int r = OSD::peek_super(g_conf.osd_data, g_conf.osd_journal, magic, fsid, w); + int r = OSD::peek_meta(g_conf.osd_data, magic, fsid, w); if (r < 0) { cerr << TEXT_RED << " ** " << TEXT_HAZARD << "ERROR: " << TEXT_RED << "unable to open OSD superblock on " << g_conf.osd_data << ": " << strerror_r(-r, buf, sizeof(buf)) << TEXT_NORMAL << std::endl; diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index c19f8be3f663f..6f126bfb452f9 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -150,10 +150,11 @@ int OSD::mkfs(const char *dev, const char *jdev, ceph_fsid_t fsid, int whoami) if (err < 0) return err; OSDSuperblock sb; - sb.magic = CEPH_OSD_ONDISK_MAGIC; sb.fsid = fsid; sb.whoami = whoami; + write_meta(dev, fsid, whoami); + // age? if (g_conf.osd_age_time != 0) { cout << "aging..." << std::endl; @@ -206,30 +207,94 @@ int OSD::mkfs(const char *dev, const char *jdev, ceph_fsid_t fsid, int whoami) return r; } -int OSD::peek_super(const char *dev, const char *journal, nstring& magic, ceph_fsid_t& fsid, int& whoami) + +int OSD::write_meta(const char *base, const char *file, const char *val, size_t vallen) { - ObjectStore *store = create_object_store(dev, journal); - if (!store) - return -ENODEV; - int err = store->mount(); - if (err < 0) - return err; + char fn[PATH_MAX]; + int fd; - OSDSuperblock sb; - bufferlist bl; - err = store->read(meta_coll, OSD_SUPERBLOCK_POBJECT, 0, 0, bl); - store->umount(); - delete store; + snprintf(fn, sizeof(fn), "%s/%s", base, file); + fd = ::open(fn, O_WRONLY|O_CREAT|O_TRUNC, 0644); + ::write(fd, val, vallen); + ::close(fd); - if (err < 0) - return -ENOENT; + return 0; +} - bufferlist::iterator p = bl.begin(); - ::decode(sb, p); +int OSD::read_meta(const char *base, const char *file, char *val, size_t vallen) +{ + char fn[PATH_MAX]; + int fd, len; + + snprintf(fn, sizeof(fn), "%s/%s", base, file); + fd = ::open(fn, O_RDONLY); + len = ::read(fd, val, vallen); + ::close(fd); + if (len > 0 && len < (int)vallen) + val[len] = 0; + return len; +} + +#define FSID_FORMAT "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-" \ + "%02x%02x%02x%02x%02x%02x" +#define PR_FSID(f) (f)->fsid[0], (f)->fsid[1], (f)->fsid[2], (f)->fsid[3], \ + (f)->fsid[4], (f)->fsid[5], (f)->fsid[6], (f)->fsid[7], \ + (f)->fsid[8], (f)->fsid[9], (f)->fsid[10], (f)->fsid[11], \ + (f)->fsid[12], (f)->fsid[13], (f)->fsid[14], (f)->fsid[15] + +int OSD::write_meta(const char *base, ceph_fsid_t& fsid, int whoami) +{ + char val[80]; + + snprintf(val, sizeof(val), "%s\n", CEPH_OSD_ONDISK_MAGIC); + write_meta(base, "magic", val, strlen(val)); + + snprintf(val, sizeof(val), "%d\n", whoami); + write_meta(base, "whoami", val, strlen(val)); + + snprintf(val, sizeof(val), FSID_FORMAT "\n", PR_FSID(&fsid)); + write_meta(base, "ceph_fsid", val, strlen(val)); + + return 0; +} - magic = sb.magic; - fsid = sb.fsid; - whoami = sb.whoami; +int OSD::peek_meta(const char *dev, nstring& magic, ceph_fsid_t& fsid, int& whoami) +{ + char val[80] = { 0 }; + + if (read_meta(dev, "magic", val, sizeof(val)) < 0) + return -errno; + int l = strlen(val); + if (l && val[l-1] == '\n') + val[l-1] = 0; + magic = val; + + if (read_meta(dev, "whoami", val, sizeof(val)) < 0) + return -errno; + whoami = atoi(val); + + if (read_meta(dev, "ceph_fsid", val, sizeof(val)) < 0) + return -errno; + + memset(&fsid, 0, sizeof(fsid)); + unsigned o = 0; + for (char *p = val; *p && p < (val+sizeof(val)) && o < 2*sizeof(fsid); p++) { + int digit = -1; + if (*p >= '0' && *p <= '9') + digit = *p - '0'; + else if (*p >= 'a' && *p <= 'f') + digit = *p - 'a' + 10; + else if (*p >= 'A' && *p <= 'F') + digit = *p - 'A' + 10; + + if (digit >= 0) { + if (o & 1) + fsid.fsid[o/2] = fsid.fsid[o/2] * 16 + digit; + else + fsid.fsid[o/2] = digit; + o++; + } + } return 0; } diff --git a/src/osd/OSD.h b/src/osd/OSD.h index da0820220dceb..8e67da269315f 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -853,7 +853,14 @@ protected: static int find_osd_dev(char *result, int whoami); static ObjectStore *create_object_store(const char *dev, const char *jdev); static int mkfs(const char *dev, const char *jdev, ceph_fsid_t fsid, int whoami); - static int peek_super(const char *dev, const char *journal, nstring& magic, ceph_fsid_t& fsid, int& whoami); + +private: + static int write_meta(const char *base, const char *file, const char *val, size_t vallen); + static int read_meta(const char *base, const char *file, char *val, size_t vallen); + static int write_meta(const char *base, ceph_fsid_t& fsid, int whoami); +public: + static int peek_meta(const char *dev, nstring& magic, ceph_fsid_t& fsid, int& whoami); + // startup/shutdown int init(); diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index f72235c0413fb..40024f2ac0f59 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -1025,7 +1025,6 @@ inline ostream& operator<<(ostream& out, ObjectExtent &ex) class OSDSuperblock { public: - nstring magic; ceph_fsid fsid; int32_t whoami; // my role in this fs. epoch_t current_epoch; // most recent epoch @@ -1046,10 +1045,9 @@ public: } void encode(bufferlist &bl) const { - __u8 v = 2; + __u8 v = 3; ::encode(v, bl); - ::encode(magic, bl); ::encode(fsid, bl); ::encode(whoami, bl); ::encode(current_epoch, bl); @@ -1064,7 +1062,10 @@ public: __u8 v; ::decode(v, bl); - ::decode(magic, bl); + if (v < 3) { + nstring magic; + ::decode(magic, bl); + } ::decode(fsid, bl); ::decode(whoami, bl); ::decode(current_epoch, bl); @@ -1083,7 +1084,7 @@ WRITE_CLASS_ENCODER(OSDSuperblock) inline ostream& operator<<(ostream& out, OSDSuperblock& sb) { - return out << "sb('" << sb.magic << "' fsid " << sb.fsid + return out << "sb(" << sb.fsid << " osd" << sb.whoami << " e" << sb.current_epoch << " [" << sb.oldest_map << "," << sb.newest_map << "]" -- 2.39.5