PUT و multipart در RGW
در کتاب: فصل ۴
آزمایشگاه
PUT و multipart در RGW
یک کلید و اندازه بدهید و یک PUT ی S3 را از radosgw تا bucket index و data pool، همراه با شیءهای RADOS که میسازد، دنبال کنید.
۳شیء RADOS
.dir.MARKER.5shard ی bucket index
۱۰ MiBاندازهٔ شیء
ceph_str_hash_linux("photos/2026/11/img_0001.jpg") = 2668161921 → sid ^ ((sid & 0xff) << 24) → % 7877 % 11 = 5
- PUT کلاینت PUT /bucket/photos/2026/11/img_0001.jpg را با ۱۰ MiB داده میفرستد؛ RGWPutObj::execute آغاز میشود.
RGWPutObj::execute (rgw_op.cc) - احراز هویت امضای AWS (اینجا v4) بررسی و مجوزهای کاربر روی bucket ارزیابی میشود.
rgw::auth::s3::AWSAuthStrategy, AWSv4ComplSingle (rgw_auth_s3.cc) - stripeهای دُم همزمان با رسیدن بدنه، processor تعداد ۲ شیء دُم ۴ MiB در data pool مینویسد.
AtomicObjectProcessor::process, RadosWriter::process - آمادهسازی index rgw_bucket_prepare_op یک ورودی معلق برای photos/2026/11/img_0001.jpg روی shard ۵ از ۱۱ میگذارد تا اگر همین حالا crash رخ دهد ردی برای پاکسازی بماند.
RGWRados::Bucket::UpdateIndex::prepare, cls_rgw rgw_bucket_prepare_op - نوشتن head شیء head با یک write_full همراه ۴ MiB نخست، manifest و attributeها (ETag، ACL و content type) نوشته میشود.
RGWRados::Object::Write::_do_write_meta (write_full + xattrs) - تکمیل index rgw_bucket_complete_op ورودی معلق را به شیئی فهرستشده روی shard ۵ تبدیل میکند و برای همگامسازی به bucket index log میافزاید.
UpdateIndex::complete, rgw_bucket_complete_op (+ bilog) - 200 OK radosgw با 200 و ETag پاسخ میدهد؛ شیء حالا در فهرستها دیده میشود.
RGWPutObj_ObjStore_S3::send_response (rgw_rest_s3.cc)
شیءهای RADOS این بارگذاری
- MARKER_photos/2026/11/img_0001.jpg۴ MiB + xattrs
- MARKER__shadow_.RAND32_1۴ MiB
- MARKER__shadow_.RAND32_2۲ MiB
اندازههای پیشفرض: head تا ۴ MiB (rgw_max_chunk_size)، stripeها ۴ MiB (rgw_obj_stripe_size) و هر part دستکم ۵ MiB (rgw_multipart_min_part_size).
مطابق با:
src/rgw/rgw_op.cc :: RGWPutObj::execute, RGWCompleteMultipart::executeعملیات PUT و تکمیل multipartsrc/rgw/driver/rados/rgw_putobj_processor.cc :: AtomicObjectProcessor, MultipartObjectProcessorنوشتن head، stripeها و partهاsrc/rgw/driver/rados/rgw_rados.cc :: Object::Write::_do_write_meta, Bucket::UpdateIndex::prepare / completeنوشتن head و بهروزرسانی indexsrc/cls/rgw/cls_rgw.cc :: rgw_bucket_prepare_op, rgw_bucket_complete_opدو عملیات index روی OSDsrc/rgw/services/svc_bi_rados.h :: bucket_shard_index; src/common/ceph_hash.cc :: ceph_str_hash_linuxهر کلید به کدام shard ی bucket index میرودsrc/rgw/driver/rados/rgw_obj_manifest.cc :: RGWObjManifest (head, stripes, rgw_obj_stripe_size 4M)چیدمان شیء در RADOS