stasis-bLSM/sherpa/LSMPersistentParentImpl.cc
sears 2eda51e176 partially working sherpa 1.10 backend with .so support
git-svn-id: svn+ssh://svn.corp.yahoo.com/yahoo/yrl/labs/pnuts/code/logstore@1150 8dad8b1f-cf64-0410-95b6-bcf113ffbcfe
2010-09-15 21:53:51 +00:00

135 lines
4.5 KiB
C++

#include "PersistentParent.h"
#include "LSMPersistentStoreImpl.h"
#include "TabletMetadata.h"
#include "tcpclient.h"
// XXX for getpid...
#include <sys/types.h>
#include <unistd.h>
#include <fstream>
#include <iostream>
class LSMPersistentParent : PersistentParent {
public:
LSMPersistentParent() : ordered(true), hashed(false) {
} // we ignore the ordered flag...
SuCode::ResponseCode install(const SectionConfig& config) {
ordered.filestr << "LSM install called" << std::endl;
return SuCode::SuOk;
}
SuCode::ResponseCode init(const SectionConfig& config) {
ordered.filestr << "LSM init called" << std::endl;
ordered.init(config);
hashed.init(config);
return SuCode::SuOk;
}
PersistentStore *getHashedStore() {
ordered.filestr << "LSM getHashedStore called" << std::endl;
return &hashed;
}
PersistentStore *getOrderedStore() {
ordered.filestr << "LSM getOrderedStore called" << std::endl;
return &ordered;
}
bool ping() {
ordered.filestr << "LSM ping called" << std::endl;
return true;
} // XXX call OP_DBG_NOOP
std::string getName() {
ordered.filestr << "LSM getName called" << std::endl;
return "logstore";
}
SuCode::ResponseCode getFreeSpaceBytes(double & freeSpaceBytes) {
ordered.filestr << "LSM getFreeSpaceBytes called" << std::endl;
freeSpaceBytes = 1024.0 *1024.0 * 1024.0; // XXX stub
return SuCode::SuOk;
}
SuCode::ResponseCode getDiskMaxBytes(double & diskMaxBytes) {
ordered.filestr << "LSM getDiskMaxBytes called" << std::endl;
diskMaxBytes = 10.0 * 1024.0 *1024.0 * 1024.0; // XXX stub
return SuCode::SuOk;
}
SuCode::ResponseCode cleanupTablet(uint64_t uniqId,
const std::string & tableName,
const std::string & tabletName) {
ordered.filestr << "LSM cleanupTablet called" << std::endl;
return SuCode::SuOk; // XXX stub
}
SuCode::ResponseCode getTabletMappingList(TabletList & tabletList) {
ordered.filestr << "LSM getTabletMappingList called" << std::endl;
std::string metadata_table = std::string("ydht_metadata_table");
std::string metadata_tablet = std::string("0");
std::string metadata_tabletEnd = std::string("1");
size_t startlen;
size_t endlen;
ordered.filestr << "getTabletMappingList C" << std::endl;
unsigned char * start_tup = ordered.my_strcat(metadata_table, metadata_tablet, "", &startlen);
unsigned char * end_tup = ordered.my_strcat(metadata_table, metadata_tabletEnd, "", &endlen);
ordered.filestr << "start tup = " << start_tup << std::endl;
ordered.filestr << "end tup = " << end_tup << std::endl;
datatuple * starttup = datatuple::create(start_tup, startlen);
datatuple * endtup = datatuple::create(end_tup, endlen);
free(start_tup);
free(end_tup);
ordered.filestr << "getTabletMappingList B conn = " << ordered.l_ << std::endl;
pid_t pid = getpid();
uint8_t rcode = logstore_client_op_returns_many(ordered.l_, OP_SCAN, starttup, endtup, 0); // 0 = no limit.
ordered.filestr << "getTabletMappingList A'" << std::endl;
datatuple::freetuple(starttup);
datatuple::freetuple(endtup);
datatuple * next;
ordered.filestr << "getTabletMappingList A" << std::endl;
ordered.filestr.flush();
TabletMetadata m;
if(rcode == LOGSTORE_RESPONSE_SENDING_TUPLES) {
while((next = logstore_client_next_tuple(ordered.l_))) {
ordered.metadata_buf(m, next->key(), next->keylen());
struct ydht_maptable_schema md;
md.uniq_id = 0;
md.tableName = m.table();
md.tabletName = m.tablet();
ordered.filestr << md.tableName << " : " << md.tabletName << std::endl;
tabletList.push_back(md);
datatuple::freetuple(next);
}
ordered.filestr << "getTabletMappingListreturns" << std::endl;
} else {
ordered.filestr << "error " << (int)rcode << " in getTabletMappingList." << std::endl;
return SuCode::PStoreUnexpectedError; // XXX should be "connection closed error" or something...
}
return SuCode::SuOk;
}
SuCode::ResponseCode getApproximateTableSize
(const std::string& tableId,
int64_t& tableSize, int64_t & rowCount) {
ordered.filestr << "LSM getApproximateTableSize called" << std::endl;
return ordered.getApproximateTableSize(tableId, tableSize, rowCount);
}
private:
LSMPersistentStoreImpl ordered;
LSMPersistentStoreImpl hashed;
};
extern "C" {
void * lsmsherpa_init();
}
static LSMPersistentParent pp;
void * lsmsherpa_init() {
return &pp;
}