X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=store.h;h=5d877c66c4a11619a4c8f403022d74856b1750e9;hb=d60ac6ffaac11851042a5978ac10f52293a50b50;hp=0bc21717dae7f9d63a2e5ba53beb6bf2415b80b6;hpb=25b6639fb1783e0061affa177e6d6d2131c457f5;p=cumulus.git diff --git a/store.h b/store.h index 0bc2171..5d877c6 100644 --- a/store.h +++ b/store.h @@ -22,6 +22,12 @@ * metadata. Currently implemented as map. */ typedef std::map dictionary; +/* In-memory representation of a UUID (Universally-Unique Identifier), which is + * used to name a segment. */ +struct uuid { + uint8_t bytes[16]; +}; + /* IOException will be thrown if an error occurs while reading or writing in * one of the I/O wrappers. Depending upon the context; this may be fatal or * not--typically, errors reading/writing the store will be serious, but errors @@ -61,6 +67,7 @@ public: void write_varint(uint64_t val); + void write_uuid(const struct uuid &u); void write_string(const std::string &s); void write_dictionary(const dictionary &d); @@ -139,10 +146,7 @@ private: std::string encode_u16(uint16_t val); std::string encode_u32(uint32_t val); std::string encode_u64(uint64_t val); - -struct uuid { - uint8_t bytes[16]; -}; +std::string encode_objref(const struct uuid &segment, uint32_t object); /* A class which is used to pack multiple objects into a single segment, with a * lookup table to quickly locate each object. Call new_object() to get an @@ -158,21 +162,29 @@ public: struct uuid get_uuid() const { return id; } // Start writing out a new object to this segment. - OutputStream *new_object(); + OutputStream *new_object(int *id, const char *type); void finish_object(); + // Determine size of segment data written out so far. + size_t get_size() const { return raw_out->get_pos(); } + // Utility functions for generating and formatting UUIDs for display. static struct uuid generate_uuid(); static std::string format_uuid(const struct uuid u); private: - typedef std::vector > object_table; + struct index_info { + int64_t offset; // File offset at which object starts + int64_t size; // Size of object in bytes + char type[4]; // Object type code + }; + + typedef std::vector object_table; ChecksumOutputStream *out; // Output stream with checksumming enabled OutputStream *raw_out; // Raw output stream, without checksumming struct uuid id; - int64_t object_start_offset; OutputStream *object_stream; object_table objects; @@ -193,4 +205,23 @@ private: std::string directory; }; +/* A SegmentPartitioner helps to divide objects up among a collection of + * segments to meet a rough size limit per segment. Like a SegmentWriter, only + * one object should be written at a time; however, multiple + * SegmentPartitioners can be created using the same base SegmentStore. */ +class SegmentPartitioner { +public: + explicit SegmentPartitioner(SegmentStore *s); + ~SegmentPartitioner(); + + OutputStream *new_object(struct uuid *uuid, int *id, const char *type); + +private: + size_t target_size; + + SegmentStore *store; + SegmentWriter *segment; + OutputStream *object; +}; + #endif // _LBS_STORE_H