ceph 읽 기 쓰기 경로 소스 코드 분석 (2)
데이터 구조
MOSDOp
OSDOp
struct OSDOp {
ceph_osd_op op;
//
sobject_t soid;
//src oid, op ,
// rados_clone_range dest obj src obj
bufferlist indata, outdata;
// data
int32_t rval;
//
OSDOp() : rval(0) {
memset(&op, 0, sizeof(ceph_osd_op));
}
class MOSDOp : public Message {
object_t oid;
//
object_locator_t oloc;
pg_t pgid; //pg
public:
vector<OSDOp> ops;
// oid
private:
//
snapid_t snapid;
//snapid, CEPH_NOSNAP, head , snap_seq
snapid_t snap_seq;
// head ,
// snap , snap seq
vector<snapid_t> snaps;
// snap
uint64_t features;
osd_reqid_t reqid; // reqid explicitly set by sender
}
MOSDOp 은 기본 적 인 요청 을 봉인 했다.ops 에 여러 개의 OSDOp 작업 을 나 누 었 습 니 다.모든 OSDOp 작업 에 또 하나의 soid 가 있 습 니 다. 이 soid 와 MOSDOp 의 oid 는 어떤 관계 입 니까?
여기 서 MOSDOp 패 키 징 작업 은 모두 oid 와 관련 된 작업 입 니 다. 즉, 하나의 MOSDOp 은 같은 oid 에 대한 작업 만 패 키 징 합 니 다.하지만 radosclone_range 와 같은 동작 은 dest oid 가 있 고 src oid 가 있 으 면 src oid 는 OSDOp 의 soid 에 저 장 됩 니 다.
object_info_t
struct object_info_t {
hobject_t soid;
eversion_t version, prior_version;
version_t user_version;
osd_reqid_t last_reqid;
uint64_t size;
utime_t mtime;
utime_t local_mtime; // local mtime
// note: these are currently encoded into a total 16 bits; see
// encode()/decode() for the weirdness.
typedef enum {
FLAG_LOST = 1<<0,
FLAG_WHITEOUT = 1<<1, // object logically does not exist
FLAG_DIRTY = 1<<2,
// object has been modified since last flushed or undirtied
FLAG_OMAP = 1 << 3, // has (or may have) some/any omap data
FLAG_DATA_DIGEST = 1 << 4, // has data crc
FLAG_OMAP_DIGEST = 1 << 5, // has omap crc
FLAG_CACHE_PIN = 1 << 6, // pin the object in cache tier
// ...
FLAG_USES_TMAP = 1<<8, // deprecated; no longer used.
} flag_t;
flag_t flags;
......
vector<snapid_t> snaps; // [clone]
uint64_t truncate_seq, truncate_size;
map<pair<uint64_t, entity_name_t>, watch_info_t> watchers;
// opportunistic checksums; may or may not be present
__u32 data_digest; ///< data crc32c
__u32 omap_digest; ///< omap crc32c
}
object_info_t 를 대상 으로 하 는 속성, xattr 에 저장, key 는 OIATTR (""), value 는 objectinfo_t 의 decode 뒤의 값
ObjectState
struct ObjectState {
object_info_t oi;
bool exists;
//the stored object exists (i.e., we will remember the object_info_t)
ObjectState() : exists(false) {}
ObjectState(const object_info_t &oi_, bool exists_)
: oi(oi_), exists(exists_) {}
};
SnapSetContext 는 SnapSet 의 컨 텍스트 정 보 를 저장 합 니 다.스냅 셋 에 대한 내용 은 관련 글 소 개 를 참고 하면 된다.
struct SnapSetContext {
hobject_t oid; //
int ref; //
bool registered; // SnapSet Cache
SnapSet snapset; //SnapSet
bool exists; //snapset
SnapSetContext(const hobject_t& o) :
oid(o), ref(0), registered(false), exists(true) { }
};
대상 Object Context 는 대상 의 컨 텍스트 정 보 를 저장 합 니 다.
struct ObjectContext {
ObjectState obs;
//obs, object_infot_t,
SnapSetContext *ssc; // may be null
//
Context *destructor_callback;
private:
Mutex lock;
public:
Cond cond;
int unstable_writes, readers, writers_waiting, readers_waiting;
// ,
// ,
// set if writes for this object are blocked
//on another objects recovery
ObjectContextRef blocked_by; // object blocking our writes
set<ObjectContextRef> blocking; // objects whose writes we block
// any entity in obs.oi.watchers
//MUST be in either watchers or unconnected_watchers.
map<pair<uint64_t, entity_name_t>, WatchRef> watchers;
// attr cache
map<string, bufferlist> attr_cache;
list<OpRequestRef> waiters; ///< ops waiting on state change
int count; ///< number of readers or writers
State state:4; ///< rw state
/// if set, restart backfill when we can get a read lock
bool recovery_read_marker:1;
/// if set, requeue snaptrim on lock release
bool snaptrimmer_write_marker:1;
......
}
ReplicatedPG::get_object_context
함수 getobject_context 대상 의 object 가 져 오기context 정보.입력 매개 변 수 는:
ObjectContextRef
ReplicatedPG::get_object_context(const hobject_t& soid,
bool can_create,
map<string, bufferlist> *attrs)
soid 가 져 올 대상 bool cancreate 를 만 들 필요 가 있 는 지, 쓰기 동작 이 라면 * attrs 대상 의 속성 을 설정 합 니 다.
ReplicatedPG::get_snapset_context
snapset 가 져 오기context 이 함수 와 getobject_context 유사
ReplicatedPG::find_object_context
이 함수 찾기 대상 의 objectcontext, 이것 은 snapshot 에 관 한 지식 을 이해 해 야 합 니 다.snapseq 는 해당 하 는 clone 대상 을 정확하게 얻 은 후 해당 하 는 object 를 가 져 옵 니 다.context
int ReplicatedPG::find_object_context(
const hobject_t& oid,
ObjectContextRef *pobc, ObjectContext
bool can_create,
bool map_snapid_to_clone, snapid clone
hobject_t *pmissing ,
}
매개 변수 mapsnapid_to_clone, 이 snap 가 clone 대상, 즉 snap 대상 의 snap 에 직접 대응 할 수 있 는 지 를 말 합 니 다.id 는 SnapSet 의 clones 목록 에 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.