RGWUserInfo& uinfo, RGWObjVersionTracker *pobjv)
{
DBOpParams params = {};
- InitializeParams(dpp, "CreateUser", ¶ms);
+ InitializeParams(dpp, "RemoveUser", ¶ms);
int ret = 0;
RGWUserInfo orig_info;
params->op.obj.state.obj.key.name = obj_name;
params->op.obj.state.obj.key.instance = obj_instance;
params->op.obj.state.obj.key.ns = obj_ns;
+ params->op.obj.obj_id = obj_id;
if (multipart_part_str != "0.0") {
params->op.obj.is_multipart = true;
params->objectdata_table = store->getObjectDataTable(bucket);
params->op.bucket.info.bucket.name = bucket;
params->op.obj.state.obj = obj;
+ params->op.obj.obj_id = obj_id;
return ret;
}
return ret;
}
+ /* Verify if its valid obj */
+ if (!params.op.obj_data.size) {
+ ret = -ENOENT;
+ ldpp_dout(dpp, 0)<<"In GetObjectData failed err:(" <<ret<<")" << dendl;
+ return ret;
+ }
+
bufferlist& read_bl = params.op.obj_data.data;
unsigned copy_len;
}
s = ¶ms.op.obj.state;
+ /* XXX: For now use state->shadow_obj to store ObjectID string */
+ s->shadow_obj = params.op.obj.obj_id;
+
**state = *s;
if (follow_olh && params.op.obj.state.obj.key.instance.empty()) {
RGWObjState base_state;
RGWObjState *astate = &base_state;
+
+ /* XXX Read obj_id too */
int r = source->get_state(dpp, &astate, true);
if (r < 0)
return r;
}
state.obj = astate->obj;
+ source->obj_id = astate->shadow_obj;
if (params.target_obj) {
*params.target_obj = state.obj;
int part_num = (ofs / max_chunk_size);
/* XXX: Handle multipart_str */
raw_obj read_obj(store, source->get_bucket_info().bucket.name, astate->obj.key.name,
- astate->obj.key.instance, astate->obj.key.ns, "0.0", part_num);
+ astate->obj.key.instance, astate->obj.key.ns, source->obj_id, "0.0", part_num);
read_len = len;
/* read entire data. So pass offset as '0' & len as '-1' */
r = robj.read(dpp, 0, -1, bl);
- if (r < 0) {
+ if (r <= 0) {
return r;
}
}
/* XXX: Handle multipart_str */
raw_obj read_obj(store, get_bucket_info().bucket.name, astate->obj.key.name,
- astate->obj.key.instance, astate->obj.key.ns, "0.0", part_num);
+ astate->obj.key.instance, astate->obj.key.ns, obj_id, "0.0", part_num);
bool reading_from_head = (ofs < head_data_size);
r = cb(dpp, read_obj, ofs, read_len, reading_from_head, astate, arg);
{
DB *store = target->get_store();
- DBOpParams params = {};
int ret = -1;
/* XXX: handle assume_noent */
- store->InitializeParams(dpp, "GetObject", ¶ms);
- target->InitializeParamsfromObject(dpp, ¶ms);
- ret = store->ProcessOp(dpp, "GetObject", ¶ms);
-
- if (ret) {
- ldpp_dout(dpp, 0)<<"In GetObject failed err:(" <<ret<<")" << dendl;
- goto out;
- }
-
- /* pick one field check if object exists */
- if (params.op.obj.state.exists) {
- ldpp_dout(dpp, 0)<<"Object(bucket:" << target->bucket_info.bucket.name << ", Object:"<< target->obj.key.name << ") exists" << dendl;
-
- } else { /* create object entry in the object table */
- params.op.obj.storage_class = "STANDARD"; /* XXX: handle storage class */
- ret = store->ProcessOp(dpp, "PutObject", ¶ms);
-
- if (ret) {
- ldpp_dout(dpp, 0)<<"In PutObject failed err:(" <<ret<<")" << dendl;
- goto out;
- }
+ obj_state.obj = target->obj;
+
+ if (target->obj_id.empty()) {
+ // generate obj_id
+ char buf[33];
+ gen_rand_alphanumeric(store->ctx(), buf, sizeof(buf) - 1);
+ target->obj_id = target->obj.key.name + "." + buf;
}
-
- obj_state = params.op.obj.state;
+
ret = 0;
-out:
return ret;
}
/* XXX: Handle multipart_str */
raw_obj write_obj(store, target->get_bucket_info().bucket.name, obj_state.obj.key.name,
- obj_state.obj.key.instance, obj_state.obj.key.ns, mp_part_str, part_num);
+ obj_state.obj.key.instance, obj_state.obj.key.ns, target->obj_id, mp_part_str, part_num);
ldpp_dout(dpp, 20) << "dbstore->write obj-ofs=" << ofs << " write_len=" << len << dendl;
/* XXX: handle multipart */
params.op.query_str = "meta";
- ret = store->ProcessOp(dpp, "UpdateObject", ¶ms);
+ ret = store->ProcessOp(dpp, "PutObject", ¶ms);
if (ret) {
- ldpp_dout(dpp, 0)<<"In UpdateObject failed err:(" <<ret<<")" << dendl;
+ ldpp_dout(dpp, 0)<<"In PutObject failed err:(" <<ret<<")" << dendl;
goto out;
}
uint64_t head_size{0};
rgw_placement_rule head_placement_rule;
uint64_t max_head_size{0};
- std::string prefix;
+ std::string obj_id;
rgw_bucket_placement tail_placement; /* might be different than the original bucket,
as object might have been copied across pools */
std::map<uint64_t, RGWObjManifestRule> rules;
std::string obj_attrs = ":obj_attrs";
std::string head_size = ":head_size";
std::string max_head_size = ":max_head_size";
- std::string prefix = ":prefix";
+ std::string obj_id = ":obj_id";
std::string tail_instance = ":tail_instance";
std::string head_placement_rule_name = ":head_placement_rule_name";
std::string head_placement_storage_class = ":head_placement_storage_class";
ObjAttrs BLOB, \
HeadSize INTEGER, \
MaxHeadSize INTEGER, \
- Prefix std::string, \
- TailInstance std::string, \
- HeadPlacementRuleName std::string, \
- HeadPlacementRuleStorageClass String, \
- TailPlacementRuleName std::string, \
- TailPlacementStorageClass String, \
+ ObjID TEXT, \
+ TailInstance TEXT, \
+ HeadPlacementRuleName TEXT, \
+ HeadPlacementRuleStorageClass TEXT, \
+ TailPlacementRuleName TEXT, \
+ TailPlacementStorageClass TEXT, \
ManifestPartObjs BLOB, \
ManifestPartRules BLOB, \
Omap BLOB, \
ObjInstance TEXT, \
ObjNS TEXT, \
BucketName TEXT NOT NULL , \
+ ObjID String, \
MultipartPartStr TEXT, \
PartNum INTEGER NOT NULL, \
Offset INTEGER, \
Size INTEGER, \
Data BLOB, \
- PRIMARY KEY (ObjName, BucketName, ObjInstance, MultipartPartStr, PartNum), \
- FOREIGN KEY (BucketName, ObjName, ObjInstance) \
- REFERENCES '{}' (BucketName, ObjName, ObjInstance) ON DELETE CASCADE ON UPDATE CASCADE \n);";
+ PRIMARY KEY (ObjName, BucketName, ObjInstance, ObjID, MultipartPartStr, PartNum), \
+ FOREIGN KEY (BucketName) \
+ REFERENCES '{}' (BucketName) ON DELETE CASCADE ON UPDATE CASCADE \n);";
const std::string CreateQuotaTableQ =
"CREATE TABLE IF NOT EXISTS '{}' ( \
if (!type.compare("ObjectData"))
return fmt::format(CreateObjectDataTableQ.c_str(),
params->objectdata_table.c_str(),
- params->object_table.c_str());
+ params->bucket_table.c_str());
if (!type.compare("Quota"))
return fmt::format(CreateQuotaTableQ.c_str(),
params->quota_table.c_str());
AccountedSize, Mtime, Epoch, ObjTag, TailTag, WriteTag, FakeTag, \
ShadowObj, HasData, IsOLH, OLHTag, PGVer, ZoneShortID, \
ObjVersion, ObjVersionTag, ObjAttrs, HeadSize, MaxHeadSize, \
- Prefix, TailInstance, HeadPlacementRuleName, HeadPlacementRuleStorageClass, \
+ ObjID, TailInstance, HeadPlacementRuleName, HeadPlacementRuleStorageClass, \
TailPlacementRuleName, TailPlacementStorageClass, \
ManifestPartObjs, ManifestPartRules, Omap, IsMultipart, MPPartsList, HeadData ) \
VALUES ({}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, \
params.op.obj.pg_ver, params.op.obj.zone_short_id,
params.op.obj.obj_version, params.op.obj.obj_version_tag,
params.op.obj.obj_attrs, params.op.obj.head_size,
- params.op.obj.max_head_size, params.op.obj.prefix,
+ params.op.obj.max_head_size, params.op.obj.obj_id,
params.op.obj.tail_instance,
params.op.obj.head_placement_rule_name,
params.op.obj.head_placement_storage_class,
AccountedSize, Mtime, Epoch, ObjTag, TailTag, WriteTag, FakeTag, \
ShadowObj, HasData, IsOLH, OLHTag, PGVer, ZoneShortID, \
ObjVersion, ObjVersionTag, ObjAttrs, HeadSize, MaxHeadSize, \
- Prefix, TailInstance, HeadPlacementRuleName, HeadPlacementRuleStorageClass, \
+ ObjID, TailInstance, HeadPlacementRuleName, HeadPlacementRuleStorageClass, \
TailPlacementRuleName, TailPlacementStorageClass, \
ManifestPartObjs, ManifestPartRules, Omap, IsMultipart, MPPartsList, HeadData from '{}' \
where BucketName = {} and ObjName = {} and ObjInstance = {}";
AccountedSize, Mtime, Epoch, ObjTag, TailTag, WriteTag, FakeTag, \
ShadowObj, HasData, IsOLH, OLHTag, PGVer, ZoneShortID, \
ObjVersion, ObjVersionTag, ObjAttrs, HeadSize, MaxHeadSize, \
- Prefix, TailInstance, HeadPlacementRuleName, HeadPlacementRuleStorageClass, \
+ ObjID, TailInstance, HeadPlacementRuleName, HeadPlacementRuleStorageClass, \
TailPlacementRuleName, TailPlacementStorageClass, \
ManifestPartObjs, ManifestPartRules, Omap, IsMultipart, MPPartsList, HeadData from '{}' \
where BucketName = {} and ObjName > {} ORDER BY ObjName ASC LIMIT {}";
virtual ~ListBucketObjectsOp() {}
std::string Schema(DBOpPrepareParams ¶ms) {
- /* XXX: Include prefix, delim */
+ /* XXX: Include obj_id, delim */
return fmt::format(Query.c_str(),
params.object_table.c_str(),
params.op.bucket.bucket_name.c_str(),
Epoch = {}, ObjTag = {}, TailTag = {}, WriteTag = {}, FakeTag = {}, \
ShadowObj = {}, HasData = {}, IsOLH = {}, OLHTag = {}, PGVer = {}, \
ZoneShortID = {}, ObjVersion = {}, ObjVersionTag = {}, ObjAttrs = {}, \
- HeadSize = {}, MaxHeadSize = {}, Prefix = {}, TailInstance = {}, \
+ HeadSize = {}, MaxHeadSize = {}, ObjID = {}, TailInstance = {}, \
HeadPlacementRuleName = {}, HeadPlacementRuleStorageClass = {}, \
TailPlacementRuleName = {}, TailPlacementStorageClass = {}, \
ManifestPartObjs = {}, ManifestPartRules = {}, Omap = {}, \
params.op.obj.pg_ver, params.op.obj.zone_short_id,
params.op.obj.obj_version, params.op.obj.obj_version_tag,
params.op.obj.obj_attrs, params.op.obj.head_size,
- params.op.obj.max_head_size, params.op.obj.prefix,
+ params.op.obj.max_head_size, params.op.obj.obj_id,
params.op.obj.tail_instance,
params.op.obj.head_placement_rule_name,
params.op.obj.head_placement_storage_class,
private:
const std::string Query =
"INSERT OR REPLACE INTO '{}' \
- (ObjName, ObjInstance, ObjNS, BucketName, MultipartPartStr, PartNum, Offset, Size, Data) \
- VALUES ({}, {}, {}, {}, {}, {}, {}, {}, {})";
+ (ObjName, ObjInstance, ObjNS, BucketName, ObjID, MultipartPartStr, PartNum, Offset, Size, Data) \
+ VALUES ({}, {}, {}, {}, {}, {}, {}, {}, {}, {})";
public:
virtual ~PutObjectDataOp() {}
params.op.obj.obj_name, params.op.obj.obj_instance,
params.op.obj.obj_ns,
params.op.bucket.bucket_name.c_str(),
+ params.op.obj.obj_id,
params.op.obj_data.multipart_part_str.c_str(),
params.op.obj_data.part_num,
params.op.obj_data.offset.c_str(),
}
};
+/* XXX: Recheck if this is really needed */
class UpdateObjectDataOp: virtual public DBOp {
private:
const std::string Query =
private:
const std::string Query =
"SELECT \
- ObjName, ObjInstance, ObjNS, BucketName, MultipartPartStr, PartNum, Offset, Size, Data \
- from '{}' where BucketName = {} and ObjName = {} and ObjInstance = {} ORDER BY MultipartPartStr, PartNum";
+ ObjName, ObjInstance, ObjNS, BucketName, ObjID, MultipartPartStr, PartNum, Offset, Size, Data \
+ from '{}' where BucketName = {} and ObjName = {} and ObjInstance = {} and ObjID = {} ORDER BY MultipartPartStr, PartNum";
public:
virtual ~GetObjectDataOp() {}
params.objectdata_table.c_str(),
params.op.bucket.bucket_name.c_str(),
params.op.obj.obj_name.c_str(),
- params.op.obj.obj_instance.c_str());
+ params.op.obj.obj_instance.c_str(),
+ params.op.obj.obj_id.c_str());
}
};
class DeleteObjectDataOp: virtual public DBOp {
private:
const std::string Query =
- "DELETE from '{}' where BucketName = {} and ObjName = {} and ObjInstance = {}";
+ "DELETE from '{}' where BucketName = {} and ObjName = {} and ObjInstance = {} and ObjID = {}";
public:
virtual ~DeleteObjectDataOp() {}
params.objectdata_table.c_str(),
params.op.bucket.bucket_name.c_str(),
params.op.obj.obj_name.c_str(),
- params.op.obj.obj_instance.c_str());
+ params.op.obj.obj_instance.c_str(),
+ params.op.obj.obj_id.c_str());
}
};
// "<bucketname>_<objname>_<objinstance>_<multipart-part-str>_<partnum>"
const std::string raw_obj_oid = "{0}_{1}_{2}_{3}_{4}";
- inline std::string to_oid(const std::string& bucket, const std::string& obj_name, const std::string& obj_instance,
+ inline std::string to_oid(const std::string& bucket, const std::string& obj_name, const std::string& obj_instance, const std::string& obj_id,
std::string mp_str, uint64_t partnum) {
- std::string s = fmt::format(raw_obj_oid.c_str(), bucket, obj_name, obj_instance, mp_str, partnum);
+ std::string s = fmt::format(raw_obj_oid.c_str(), bucket, obj_name, obj_instance, obj_id, mp_str, partnum);
return s;
}
- inline int from_oid(const std::string& oid, std::string& bucket, std::string& obj_name,
+ inline int from_oid(const std::string& oid, std::string& bucket, std::string& obj_name, std::string& obj_id,
std::string& obj_instance,
std::string& mp_str, uint64_t& partnum) {
std::vector<std::string> result;
bucket = result[0];
obj_name = result[1];
obj_instance = result[2];
- mp_str = result[3];
- partnum = stoi(result[4]);
+ obj_id = result[3];
+ mp_str = result[4];
+ partnum = stoi(result[5]);
return 0;
}
std::string obj_name;
std::string obj_instance;
std::string obj_ns;
+ std::string obj_id;
std::string multipart_part_str;
uint64_t part_num;
}
raw_obj(DB* _db, std::string& _bname, std::string& _obj_name, std::string& _obj_instance,
- std::string& _obj_ns, std::string _mp_part_str, int _part_num) {
+ std::string& _obj_ns, std::string& _obj_id, std::string _mp_part_str, int _part_num) {
db = _db;
bucket_name = _bname;
obj_name = _obj_name;
obj_instance = _obj_instance;
obj_ns = _obj_ns;
+ obj_id = _obj_id;
multipart_part_str = _mp_part_str;
part_num = _part_num;
int r;
db = _db;
- r = db->from_oid(oid, bucket_name, obj_name, obj_instance, multipart_part_str,
+ r = db->from_oid(oid, bucket_name, obj_name, obj_instance, obj_id, multipart_part_str,
part_num);
if (r < 0) {
multipart_part_str = "0.0";
rgw_obj obj;
RGWObjState *state;
+ std::string obj_id;
bool versioning_disabled;
Object(DB *_store, const RGWBucketInfo& _bucket_info, const rgw_obj& _obj) : store(_store), bucket_info(_bucket_info), obj(_obj) {}
+ Object(DB *_store, const RGWBucketInfo& _bucket_info, const rgw_obj& _obj, const std::string& _obj_id) : store(_store), bucket_info(_bucket_info), obj(_obj), obj_id(_obj_id) {}
+
struct Read {
DB::Object *source;
ObjDataInstance,
ObjDataNS,
ObjDataBucketName,
+ ObjDataID,
MultipartPartStr,
PartNum,
Offset,
SQL_DECODE_BLOB_PARAM(dpp, stmt, ObjAttrs, op.obj.state.attrset, sdb);
op.obj.head_size = sqlite3_column_int(stmt, HeadSize);
op.obj.max_head_size = sqlite3_column_int(stmt, MaxHeadSize);
- op.obj.prefix = (const char*)sqlite3_column_text(stmt, Prefix);
+ op.obj.obj_id = (const char*)sqlite3_column_text(stmt, Prefix);
op.obj.tail_instance = (const char*)sqlite3_column_text(stmt, TailInstance);
op.obj.head_placement_rule.name = (const char*)sqlite3_column_text(stmt, HeadPlacementRuleName);
op.obj.head_placement_rule.storage_class = (const char*)sqlite3_column_text(stmt, HeadPlacementRuleStorageClass);
op.bucket.info.bucket.name = (const char*)sqlite3_column_text(stmt, ObjBucketName);
op.obj.state.obj.key.instance = (const char*)sqlite3_column_text(stmt, ObjInstance);
op.obj.state.obj.key.ns = (const char*)sqlite3_column_text(stmt, ObjNS);
+ op.obj.obj_id = (const char*)sqlite3_column_text(stmt, ObjDataID);
op.obj_data.part_num = sqlite3_column_int(stmt, PartNum);
op.obj_data.offset = sqlite3_column_int(stmt, Offset);
op.obj_data.size = sqlite3_column_int(stmt, ObjDataSize);
SQL_BIND_INDEX(dpp, stmt, index, p_params.op.obj.max_head_size.c_str(), sdb);
SQL_BIND_INT(dpp, stmt, index, params->op.obj.max_head_size, sdb);
- SQL_BIND_INDEX(dpp, stmt, index, p_params.op.obj.prefix.c_str(), sdb);
- SQL_BIND_TEXT(dpp, stmt, index, params->op.obj.prefix.c_str(), sdb);
+ SQL_BIND_INDEX(dpp, stmt, index, p_params.op.obj.obj_id.c_str(), sdb);
+ SQL_BIND_TEXT(dpp, stmt, index, params->op.obj.obj_id.c_str(), sdb);
SQL_BIND_INDEX(dpp, stmt, index, p_params.op.obj.tail_instance.c_str(), sdb);
SQL_BIND_TEXT(dpp, stmt, index, params->op.obj.tail_instance.c_str(), sdb);
SQL_BIND_INDEX(dpp, *stmt, index, p_params.op.obj.max_head_size.c_str(), sdb);
SQL_BIND_INT(dpp, *stmt, index, params->op.obj.max_head_size, sdb);
- SQL_BIND_INDEX(dpp, *stmt, index, p_params.op.obj.prefix.c_str(), sdb);
- SQL_BIND_TEXT(dpp, *stmt, index, params->op.obj.prefix.c_str(), sdb);
+ SQL_BIND_INDEX(dpp, *stmt, index, p_params.op.obj.obj_id.c_str(), sdb);
+ SQL_BIND_TEXT(dpp, *stmt, index, params->op.obj.obj_id.c_str(), sdb);
SQL_BIND_INDEX(dpp, *stmt, index, p_params.op.obj.tail_instance.c_str(), sdb);
SQL_BIND_TEXT(dpp, *stmt, index, params->op.obj.tail_instance.c_str(), sdb);
if (p_params.objectdata_table.empty()) {
p_params.objectdata_table = getObjectDataTable(bucket_name);
}
- params->bucket_table = p_params.bucket_table;
params->object_table = p_params.object_table;
params->objectdata_table = p_params.objectdata_table;
(void)createObjectDataTable(dpp, params);
SQL_BIND_TEXT(dpp, stmt, index, params->op.bucket.info.bucket.name.c_str(), sdb);
+ SQL_BIND_INDEX(dpp, stmt, index, p_params.op.obj.obj_id.c_str(), sdb);
+ SQL_BIND_TEXT(dpp, stmt, index, params->op.obj.obj_id.c_str(), sdb);
+
SQL_BIND_INDEX(dpp, stmt, index, p_params.op.obj_data.part_num.c_str(), sdb);
SQL_BIND_INT(dpp, stmt, index, params->op.obj_data.part_num, sdb);
SQL_BIND_INDEX(dpp, stmt, index, p_params.op.obj.obj_instance.c_str(), sdb);
SQL_BIND_TEXT(dpp, stmt, index, params->op.obj.state.obj.key.instance.c_str(), sdb);
+ SQL_BIND_INDEX(dpp, stmt, index, p_params.op.obj.obj_id.c_str(), sdb);
+ SQL_BIND_TEXT(dpp, stmt, index, params->op.obj.obj_id.c_str(), sdb);
+
out:
return rc;
}
SQL_BIND_INDEX(dpp, stmt, index, p_params.op.obj.obj_instance.c_str(), sdb);
SQL_BIND_TEXT(dpp, stmt, index, params->op.obj.state.obj.key.instance.c_str(), sdb);
+
+ SQL_BIND_INDEX(dpp, stmt, index, p_params.op.obj.obj_id.c_str(), sdb);
+ SQL_BIND_TEXT(dpp, stmt, index, params->op.obj.obj_id.c_str(), sdb);
+
out:
return rc;
}