راهنمای جامع Ceph
Englishشروع کنید

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
clientradosgwauthindex pooldata pool۱. PUT۲. احراز هویت۳. stripeهای دُم۴. آماده‌سازی index۵. نوشتن head۶. تکمیل index۷. 200 OK
  1. PUT کلاینت PUT /bucket/photos/2026/11/img_0001.jpg را با ۱۰ MiB داده می‌فرستد؛ RGWPutObj::execute آغاز می‌شود. RGWPutObj::execute (rgw_op.cc)
  2. احراز هویت امضای AWS (این‌جا v4) بررسی و مجوزهای کاربر روی bucket ارزیابی می‌شود. rgw::auth::s3::AWSAuthStrategy, AWSv4ComplSingle (rgw_auth_s3.cc)
  3. stripeهای دُم هم‌زمان با رسیدن بدنه، processor تعداد ۲ شیء دُم ۴ MiB در data pool می‌نویسد. AtomicObjectProcessor::process, RadosWriter::process
  4. آماده‌سازی index rgw_bucket_prepare_op یک ورودی معلق برای photos/2026/11/img_0001.jpg روی shard ۵ از ۱۱ می‌گذارد تا اگر همین حالا crash رخ دهد ردی برای پاک‌سازی بماند. RGWRados::Bucket::UpdateIndex::prepare, cls_rgw rgw_bucket_prepare_op
  5. نوشتن head شیء head با یک write_full همراه ۴ MiB نخست، manifest و attributeها (ETag، ACL و content type) نوشته می‌شود. RGWRados::Object::Write::_do_write_meta (write_full + xattrs)
  6. تکمیل index rgw_bucket_complete_op ورودی معلق را به شیئی فهرست‌شده روی shard ۵ تبدیل می‌کند و برای همگام‌سازی به bucket index log می‌افزاید. UpdateIndex::complete, rgw_bucket_complete_op (+ bilog)
  7. 200 OK radosgw با 200 و ETag پاسخ می‌دهد؛ شیء حالا در فهرست‌ها دیده می‌شود. RGWPutObj_ObjStore_S3::send_response (rgw_rest_s3.cc)
شیءهای RADOS این بارگذاری
  1. MARKER_photos/2026/11/img_0001.jpg۴ MiB + xattrs
  2. MARKER__shadow_.RAND32_1۴ MiB
  3. 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 و تکمیل multipart
  • src/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 و به‌روزرسانی index
  • src/cls/rgw/cls_rgw.cc :: rgw_bucket_prepare_op, rgw_bucket_complete_op دو عملیات index روی OSD
  • src/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
تصویری ثابت از شبیه‌ساز؛ نسخهٔ تعاملی در آزمایشگاه نسخهٔ وب است. آزمایشگاه تعاملی: PUT و multipart در RGW