summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/architecture.rst185
-rw-r--r--doc/install/os-recommendations.rst23
-rw-r--r--doc/rados/configuration/filestore-config-ref.rst12
-rw-r--r--doc/rados/configuration/ms-ref.rst20
-rw-r--r--doc/rados/deployment/mkcephfs.rst23
-rw-r--r--doc/rados/operations/control.rst6
-rw-r--r--doc/radosgw/admin/adminops.rst1507
-rw-r--r--doc/radosgw/config.rst4
-rw-r--r--doc/radosgw/index.rst2
-rw-r--r--doc/radosgw/s3.rst2
-rw-r--r--doc/radosgw/s3/python.rst6
-rw-r--r--doc/radosgw/swift.rst74
-rw-r--r--doc/radosgw/swift/swift.rst (renamed from doc/radosgw/swift/index.rst)0
-rw-r--r--qa/run_xfstests.sh2
-rw-r--r--src/Makefile.am3
-rw-r--r--src/rgw/rgw_cache.h5
-rw-r--r--src/rgw/rgw_tools.cc19
17 files changed, 1748 insertions, 145 deletions
diff --git a/doc/architecture.rst b/doc/architecture.rst
index e944192ef7e..116ec4110f3 100644
--- a/doc/architecture.rst
+++ b/doc/architecture.rst
@@ -146,15 +146,30 @@ appropriate placement groups in the secondary and tertiary OSDs (as many OSDs as
additional replicas), and responds to the client once it has confirmed the
object was stored successfully.
-.. ditaa:: +--------+ Write +--------------+ Replica 1 +----------------+
- | Client |*-------------->| Primary OSD |*---------------->| Secondary OSD |
- | |<--------------*| |<----------------*| |
- +--------+ Write Ack +--------------+ Replica 1 Ack +----------------+
- ^ *
- | | Replica 2 +----------------+
- | +----------------------->| Tertiary OSD |
- +--------------------------*| |
- Replica 2 Ack +----------------+
+
+.. ditaa::
+ +----------+
+ | Client |
+ | |
+ +----------+
+ * ^
+ Write (1) | | Ack (6)
+ | |
+ v *
+ +-------------+
+ | Primary OSD |
+ | |
+ +-------------+
+ * ^ ^ *
+ Write (2) | | | | Write (3)
+ +------+ | | +------+
+ | +------+ +------+ |
+ | | Ack (4) Ack (5)| |
+ v * * v
+ +---------------+ +---------------+
+ | Secondary OSD | | Tertiary OSD |
+ | | | |
+ +---------------+ +---------------+
Since any network device has a limit to the number of concurrent connections it
@@ -222,82 +237,84 @@ of striping:
If you anticipate large images sizes, large S3 or Swift objects (video), or
-large CephFS files, you may see considerable read/write performance improvements
-by striping client data over mulitple objects within an object set. Significant
-write performance occurs when the client writes the stripe units to their
-corresponding objects simultaneously. Since objects get mapped to different
-placement groups and further mapped to different OSDs, each write occurs
-simultaneously at the maximum write speed. So the stripe count may serve as a
-proxy for the multiple of the performance improvement. Read performance is
-similarly affected. However, setting up connections between the client and the
-OSDs and the network latency also play a role in the overall performance.
+large CephFS directories, you may see considerable read/write performance
+improvements by striping client data over mulitple objects within an object set.
+Significant write performance occurs when the client writes the stripe units to
+their corresponding objects in parallel. Since objects get mapped to different
+placement groups and further mapped to different OSDs, each write occurs in
+parallel at the maximum write speed. A write to a single disk would be limited
+by the head movement (e.g. 6ms per seek) and bandwidth of that one device (e.g.
+100MB/s). By spreading that write over multiple objects (which map to different
+placement groups and OSDs) Ceph can reduce the number of seeks per drive and
+combine the throughput of multiple drives to achieve much faster write (or read)
+speeds.
In the following diagram, client data gets striped across an object set
(``object set 1`` in the following diagram) consisting of 4 objects, where the
-first stripe unit is ``stripe 0`` in ``object 0``, and the fourth stripe unit is
-``stripe 3`` in ``object 3``. After writing the fourth stripe, the client
-determines if the object set is full. If the object set is not full, the client
-begins writing a stripe to the first object again (``object 0`` in the following
-diagram). If the object set is full, the client creates a new object set
-(``object set 2`` in the following diagram), and begins writing to the first
-stripe (``stripe 4``) in the first object in the new object set (``object 4`` in
-the diagram below).
+first stripe unit is ``stripe unit 0`` in ``object 0``, and the fourth stripe
+unit is ``stripe unit 3`` in ``object 3``. After writing the fourth stripe, the
+client determines if the object set is full. If the object set is not full, the
+client begins writing a stripe to the first object again (``object 0`` in the
+following diagram). If the object set is full, the client creates a new object
+set (``object set 2`` in the following diagram), and begins writing to the first
+stripe (``stripe unit 16``) in the first object in the new object set (``object
+4`` in the diagram below).
.. ditaa::
- +---------------+
- | Client Data |
- | Format |
- | cCCC |
- +---------------+
- |
- +-----------------+--------+--------+-----------------+
- | | | | +--\
- v v v v |
- /-----------\ /-----------\ /-----------\ /-----------\ |
- | Begin cCCC| | Begin cCCC| | Begin cCCC| | Begin cCCC| |
- | Object 0 | | Object 1 | | Object 2 | | Object 3 | |
- +-----------+ +-----------+ +-----------+ +-----------+ |
- | stripe | | stripe | | stripe | | stripe | |
- | unit 0 | | unit 1 | | unit 2 | | unit 3 | |
- +-----------+ +-----------+ +-----------+ +-----------+ |
- | stripe | | stripe | | stripe | | stripe | +-\
- | unit 4 | | unit 5 | | unit 6 | | unit 7 | | Object
- +-----------+ +-----------+ +-----------+ +-----------+ +- Set
- | stripe | | stripe | | stripe | | stripe | | 1
- | unit 8 | | unit 9 | | unit 10 | | unit 11 | +-/
- +-----------+ +-----------+ +-----------+ +-----------+ |
- | stripe | | stripe | | stripe | | stripe | |
- | unit 12 | | unit 13 | | unit 14 | | unit 15 | |
- +-----------+ +-----------+ +-----------+ +-----------+ |
- | End cCCC | | End cCCC | | End cCCC | | End cCCC | |
- | Object 0 | | Object 1 | | Object 2 | | Object 3 | |
- \-----------/ \-----------/ \-----------/ \-----------/ |
- |
- +--/
+ +---------------+
+ | Client Data |
+ | Format |
+ | cCCC |
+ +---------------+
+ |
+ +-----------------+--------+--------+-----------------+
+ | | | | +--\
+ v v v v |
+ /-----------\ /-----------\ /-----------\ /-----------\ |
+ | Begin cCCC| | Begin cCCC| | Begin cCCC| | Begin cCCC| |
+ | Object 0 | | Object 1 | | Object 2 | | Object 3 | |
+ +-----------+ +-----------+ +-----------+ +-----------+ |
+ | stripe | | stripe | | stripe | | stripe | |
+ | unit 0 | | unit 1 | | unit 2 | | unit 3 | |
+ +-----------+ +-----------+ +-----------+ +-----------+ |
+ | stripe | | stripe | | stripe | | stripe | +-\
+ | unit 4 | | unit 5 | | unit 6 | | unit 7 | | Object
+ +-----------+ +-----------+ +-----------+ +-----------+ +- Set
+ | stripe | | stripe | | stripe | | stripe | | 1
+ | unit 8 | | unit 9 | | unit 10 | | unit 11 | +-/
+ +-----------+ +-----------+ +-----------+ +-----------+ |
+ | stripe | | stripe | | stripe | | stripe | |
+ | unit 12 | | unit 13 | | unit 14 | | unit 15 | |
+ +-----------+ +-----------+ +-----------+ +-----------+ |
+ | End cCCC | | End cCCC | | End cCCC | | End cCCC | |
+ | Object 0 | | Object 1 | | Object 2 | | Object 3 | |
+ \-----------/ \-----------/ \-----------/ \-----------/ |
+ |
+ +--/
- +--\
- |
- /-----------\ /-----------\ /-----------\ /-----------\ |
- | Begin cCCC| | Begin cCCC| | Begin cCCC| | Begin cCCC| |
- | Object 4 | | Object 5 | | Object 6 | | Object 7 | |
- +-----------+ +-----------+ +-----------+ +-----------+ |
- | stripe | | stripe | | stripe | | stripe | |
- | unit 15 | | unit 16 | | unit 17 | | unit 18 | |
- +-----------+ +-----------+ +-----------+ +-----------+ |
- | stripe | | stripe | | stripe | | stripe | +-\
- | unit 19 | | unit 20 | | unit 21 | | unit 22 | | Object
- +-----------+ +-----------+ +-----------+ +-----------+ +- Set
- | stripe | | stripe | | stripe | | stripe | | 2
- | unit 23 | | unit 24 | | unit 25 | | unit 26 | +-/
- +-----------+ +-----------+ +-----------+ +-----------+ |
- | stripe | | stripe | | stripe | | stripe | |
- | unit 27 | | unit 28 | | unit 29 | | unit 30 | |
- +-----------+ +-----------+ +-----------+ +-----------+ |
- | End cCCC | | End cCCC | | End cCCC | | End cCCC | |
- | Object 4 | | Object 5 | | Object 6 | | Object 7 | |
- \-----------/ \-----------/ \-----------/ \-----------/ |
- |
- +--/
+ +--\
+ |
+ /-----------\ /-----------\ /-----------\ /-----------\ |
+ | Begin cCCC| | Begin cCCC| | Begin cCCC| | Begin cCCC| |
+ | Object 4 | | Object 5 | | Object 6 | | Object 7 | |
+ +-----------+ +-----------+ +-----------+ +-----------+ |
+ | stripe | | stripe | | stripe | | stripe | |
+ | unit 16 | | unit 17 | | unit 18 | | unit 19 | |
+ +-----------+ +-----------+ +-----------+ +-----------+ |
+ | stripe | | stripe | | stripe | | stripe | +-\
+ | unit 20 | | unit 21 | | unit 22 | | unit 23 | | Object
+ +-----------+ +-----------+ +-----------+ +-----------+ +- Set
+ | stripe | | stripe | | stripe | | stripe | | 2
+ | unit 24 | | unit 25 | | unit 26 | | unit 27 | +-/
+ +-----------+ +-----------+ +-----------+ +-----------+ |
+ | stripe | | stripe | | stripe | | stripe | |
+ | unit 28 | | unit 29 | | unit 30 | | unit 31 | |
+ +-----------+ +-----------+ +-----------+ +-----------+ |
+ | End cCCC | | End cCCC | | End cCCC | | End cCCC | |
+ | Object 4 | | Object 5 | | Object 6 | | Object 7 | |
+ \-----------/ \-----------/ \-----------/ \-----------/ |
+ |
+ +--/
Three important variables determine how Ceph stripes data:
@@ -306,9 +323,9 @@ Three important variables determine how Ceph stripes data:
enough to accomodate many stripe units, and should be a multiple of
the stripe unit.
-- **Stripe Unit:** Stripes have a configurable unit size (e.g., 64kb).
+- **Stripe Width:** Stripes have a configurable unit size (e.g., 64kb).
The Ceph client divides the data it will write to objects into equally
- sized stripe units, except for the last stripe unit. A stripe unit,
+ sized stripe units, except for the last stripe unit. A stripe width,
should be a fraction of the Object Size so that an object may contain
many stripe units.
@@ -347,7 +364,11 @@ storage disk. See `How Ceph Scales`_ for details.
get mapped to placement groups in the same pool. So they use the same CRUSH
map and the same access controls.
-.. tip:: The objects Ceph stores in the Object Store are not striped.
+.. tip:: The objects Ceph stores in the Object Store are not striped. RGW, RBD
+ and CephFS automatically stripe their data over multiple RADOS objects.
+ Clients that write directly to the Object Store via ``librados`` must
+ peform the the striping (and parallel I/O) for themselves to obtain these
+ benefits.
Data Consistency
diff --git a/doc/install/os-recommendations.rst b/doc/install/os-recommendations.rst
index 52e9c2fff89..2f101dc4271 100644
--- a/doc/install/os-recommendations.rst
+++ b/doc/install/os-recommendations.rst
@@ -24,7 +24,8 @@ glibc
- **syncfs(2)**: For non-btrfs filesystems such as XFS and ext4 where
more than one ``ceph-osd`` daemon is used on a single server, Ceph
performs signficantly better with the ``syncfs(2)`` system call
- (added in kernel 2.6.39 and glibc 2.14).
+ (added in kernel 2.6.39 and glibc 2.14). New versions of Ceph (v0.55 and
+ later) do not depend on glibc support.
Platforms
@@ -49,12 +50,12 @@ Argonaut (0.48)
+----------+----------+--------------------+--------------+---------+------------+
| Ubuntu | 12.10 | Quantal Quetzal | linux-3.5.4 | 2 | B |
+----------+----------+--------------------+--------------+---------+------------+
-| Debian | 6.0 | Squeeze | linux-2.6.32 | 1, 2 | B |
+| Debian | 6.0 | Squeeze | linux-2.6.32 | 1, 2, 3 | B |
+----------+----------+--------------------+--------------+---------+------------+
-| Debian | 7.0 | Wheezy | linux-3.2.0 | 1, 2 | B |
+| Debian | 7.0 | Wheezy | linux-3.2.0 | 1, 2, 3 | B |
+----------+----------+--------------------+--------------+---------+------------+
-Bobtail (0.55)
+Bobtail (0.56)
--------------
+----------+----------+--------------------+--------------+---------+------------+
@@ -62,17 +63,17 @@ Bobtail (0.55)
+==========+==========+====================+==============+=========+============+
| Ubuntu | 11.04 | Natty Narwhal | linux-2.6.38 | 1, 2, 3 | B |
+----------+----------+--------------------+--------------+---------+------------+
-| Ubuntu | 11.10 | Oneric Ocelot | linux-3.0.0 | 1, 2, 3 | B |
+| Ubuntu | 11.10 | Oneric Ocelot | linux-3.0.0 | 1, 2 | B |
+----------+----------+--------------------+--------------+---------+------------+
| Ubuntu | 12.04 | Precise Pangolin | linux-3.2.0 | 1, 2 | B, I, C |
+----------+----------+--------------------+--------------+---------+------------+
| Ubuntu | 12.10 | Quantal Quetzal | linux-3.5.4 | 2 | B |
+----------+----------+--------------------+--------------+---------+------------+
-| Debian | 6.0 | Squeeze | linux-2.6.32 | 1, 2 | B |
+| Debian | 6.0 | Squeeze | linux-2.6.32 | 1, 2, 3 | B |
+----------+----------+--------------------+--------------+---------+------------+
| Debian | 7.0 | Wheezy | linux-3.2.0 | 1, 2 | B |
+----------+----------+--------------------+--------------+---------+------------+
-| CentOS | 6.3 | N/A | linux-2.6.32 | 1, 2, 3 | B, I |
+| CentOS | 6.3 | N/A | linux-2.6.32 | 1, 2 | B, I |
+----------+----------+--------------------+--------------+---------+------------+
| Fedora | 17.0 | Beefy Miracle | linux-3.3.4 | 1, 2 | B |
+----------+----------+--------------------+--------------+---------+------------+
@@ -93,10 +94,10 @@ Notes
for kernel client (kernel RBD or the Ceph file system). Upgrade to a
recommended kernel.
-- **3**: The installed version of ``glibc`` does not support the
- ``syncfs(2)`` system call. Putting multiple ``ceph-osd`` daemons
- using ``XFS`` or ``ext4`` on the same host will not perform as well as
- they could.
+- **3**: The default kernel or installed version of ``glibc`` does not
+ support the ``syncfs(2)`` system call. Putting multiple
+ ``ceph-osd`` daemons using ``XFS`` or ``ext4`` on the same host will
+ not perform as well as they could.
Testing
-------
diff --git a/doc/rados/configuration/filestore-config-ref.rst b/doc/rados/configuration/filestore-config-ref.rst
index e45c0f7a9fc..80aed8e81a4 100644
--- a/doc/rados/configuration/filestore-config-ref.rst
+++ b/doc/rados/configuration/filestore-config-ref.rst
@@ -205,7 +205,7 @@ Journal
``filestore journal parallel``
-:Description:
+:Description: Enables parallel journaling, default for btrfs.
:Type: Boolean
:Required: No
:Default: ``false``
@@ -213,7 +213,7 @@ Journal
``filestore journal writeahead``
-:Description:
+:Description: Enables writeahead journaling, default for xfs.
:Type: Boolean
:Required: No
:Default: ``false``
@@ -221,7 +221,7 @@ Journal
``filestore journal trailing``
-:Description:
+:Description: Deprecated, never use.
:Type: Boolean
:Required: No
:Default: ``false``
@@ -233,7 +233,7 @@ Misc
``filestore merge threshold``
-:Description:
+:Description: Min number of files in a subdir before merging into parent
:Type: Integer
:Required: No
:Default: ``10``
@@ -241,7 +241,7 @@ Misc
``filestore split multiple``
-:Description:
+:Description: filestore_split_multiple*filestore_merge_threshold*16 is the max files in a subdir before splitting into child directories.
:Type: Integer
:Required: No
:Default: ``2``
@@ -249,7 +249,7 @@ Misc
``filestore update to``
-:Description:
+:Description: Limits filestore auto upgrade to specified version.
:Type: Integer
:Required: No
:Default: ``1000``
diff --git a/doc/rados/configuration/ms-ref.rst b/doc/rados/configuration/ms-ref.rst
index d76f7f3bb25..d0b1b172d7f 100644
--- a/doc/rados/configuration/ms-ref.rst
+++ b/doc/rados/configuration/ms-ref.rst
@@ -5,7 +5,7 @@
``ms tcp nodelay``
-:Description:
+:Description: Disables nagle's algorithm on messenger tcp sessions.
:Type: Boolean
:Required: No
:Default: ``true``
@@ -13,7 +13,7 @@
``ms initial backoff``
-:Description:
+:Description: The initial time to wait before reconnecting on a fault.
:Type: Double
:Required: No
:Default: ``.2``
@@ -21,7 +21,7 @@
``ms max backoff``
-:Description:
+:Description: The maximum time to wait before reconnecting on a fault.
:Type: Double
:Required: No
:Default: ``15.0``
@@ -29,7 +29,7 @@
``ms nocrc``
-:Description:
+:Description: Disables crc on network messages. May increase performance if cpu limited.
:Type: Boolean
:Required: No
:Default: ``false``
@@ -37,7 +37,7 @@
``ms die on bad msg``
-:Description:
+:Description: Debug option; do not configure.
:Type: Boolean
:Required: No
:Default: ``false``
@@ -45,7 +45,7 @@
``ms dispatch throttle bytes``
-:Description:
+:Description: Throttles total size of messages waiting to be dispatched.
:Type: 64-bit Unsigned Integer
:Required: No
:Default: ``100 << 20``
@@ -53,7 +53,7 @@
``ms bind ipv6``
-:Description:
+:Description: Enable if you want your daemons to bind to IPv6 address instead of IPv4 ones. (Not required if you specify a daemon or cluster IP.)
:Type: Boolean
:Required: No
:Default: ``false``
@@ -61,7 +61,7 @@
``ms rwthread stack bytes``
-:Description:
+:Description: Debug option for stack size; do not configure.
:Type: 64-bit Unsigned Integer
:Required: No
:Default: ``1024 << 10``
@@ -69,7 +69,7 @@
``ms tcp read timeout``
-:Description:
+:Description: Controls how long (in seconds) the messenger will wait before closing an idle connection.
:Type: 64-bit Unsigned Integer
:Required: No
:Default: ``900``
@@ -77,7 +77,7 @@
``ms inject socket failures``
-:Description:
+:Description: Debug option; do not configure.
:Type: 64-bit Unsigned Integer
:Required: No
:Default: ``0``
diff --git a/doc/rados/deployment/mkcephfs.rst b/doc/rados/deployment/mkcephfs.rst
index a6531ec84d7..fc37c7b7922 100644
--- a/doc/rados/deployment/mkcephfs.rst
+++ b/doc/rados/deployment/mkcephfs.rst
@@ -19,7 +19,7 @@ Enter a password for the root user.
On the admin host, generate an ``ssh`` key without specifying a passphrase
and use the default locations. ::
- sudo -s
+ sudo -i
ssh-keygen
Generating public/private key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
@@ -27,14 +27,8 @@ and use the default locations. ::
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
-
-You may use RSA or DSA keys. Once you generate your keys, copy them to each
-OSD host. For example::
-
- ssh-copy-id root@myserver01
- ssh-copy-id root@myserver02
-Modify your ``~/.ssh/config`` file to login as ``root``, as follows::
+Modify your ``/root/.ssh/config`` file to login as ``root``, as follows::
Host myserver01
Hostname myserver01.fully-qualified-domain.com
@@ -43,6 +37,11 @@ Modify your ``~/.ssh/config`` file to login as ``root``, as follows::
Hostname myserver02.fully-qualified-domain.com
User root
+You may use RSA or DSA keys. Once you generate your keys, copy them to each
+OSD host. For example::
+
+ ssh-copy-id root@myserver01
+ ssh-copy-id root@myserver02
Copy Configuration File to All Hosts
====================================
@@ -55,9 +54,9 @@ if you are using ``mkcephfs`` to deploy Ceph.
::
- ssh myserver01 sudo tee /etc/ceph/ceph.conf < /etc/ceph/ceph.conf
- ssh myserver02 sudo tee /etc/ceph/ceph.conf < /etc/ceph/ceph.conf
- ssh myserver03 sudo tee /etc/ceph/ceph.conf < /etc/ceph/ceph.conf
+ sudo ssh myserver01 tee /etc/ceph/ceph.conf < /etc/ceph/ceph.conf
+ sudo ssh myserver02 tee /etc/ceph/ceph.conf < /etc/ceph/ceph.conf
+ sudo ssh myserver03 tee /etc/ceph/ceph.conf < /etc/ceph/ceph.conf
Create the Default Directories
@@ -115,7 +114,7 @@ root password. See `Authentication`_ when running with ``cephx`` enabled.
When you start or stop your cluster, you will not have to use ``sudo`` or
provide passwords. For example::
- service ceph -a start
+ sudo service ceph -a start
See `Operating a Cluster`_ for details.
diff --git a/doc/rados/operations/control.rst b/doc/rados/operations/control.rst
index 4a88955d3f4..ced336d376c 100644
--- a/doc/rados/operations/control.rst
+++ b/doc/rados/operations/control.rst
@@ -151,10 +151,10 @@ Mark an OSD as lost. This may result in permanent data loss. Use with caution. :
ceph osd lost [--yes-i-really-mean-it]
-Create a new OSD. If no ID is given, a new ID is automatically selected
-if possible. ::
+Create a new OSD. If no UUID is given, it will be set automatically when the OSD
+starts up. ::
- ceph osd create [{id}]
+ ceph osd create [{uuid}]
Remove the given OSD(s). ::
diff --git a/doc/radosgw/admin/adminops.rst b/doc/radosgw/admin/adminops.rst
index 211a8e21259..b90c8a93f86 100644
--- a/doc/radosgw/admin/adminops.rst
+++ b/doc/radosgw/admin/adminops.rst
@@ -67,17 +67,17 @@ If successful, the response contains the requested information.
``usage``
-:Description: A container for the usage information
+:Description: A container for the usage information.
:Type: Container
``entries``
-:Description: A container for the usage entries information
+:Description: A container for the usage entries information.
:Type: Container
``user``
-:Description: A container for the user data information
+:Description: A container for the user data information.
:Type: Container
``owner``
@@ -192,3 +192,1504 @@ Request Parameters
:Required: No
+Get User Info
+=============
+
+Get user information.
+
+Syntax
+~~~~~~
+
+::
+
+ GET /{admin}/user HTTP/1.1
+ Host: {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``uid``
+
+:Description: The user for which the information is requested.
+:Type: String
+:Required: Yes
+
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If successful, the response contains the user information.
+
+``user``
+
+:Description: A container for the user data information.
+:Type: Container
+
+``user_id``
+
+:Description: The user id.
+:Type: String
+
+``display_name``
+
+:Description: Display name for the user.
+:Type: String
+
+``suspended``
+
+:Description: True if the user is suspended.
+:Type: Boolean
+
+``max_buckets``
+
+:Description: The maximum number of buckets to be owned by the user.
+:Type: Integer
+
+``subusers``
+
+:Description: Subusers associated with this user account.
+:Type: Container
+
+``keys``
+
+:Description: S3 keys associated with this user account.
+:Type: Container
+
+``swift_keys``
+
+:Description: Swift keys associated with this user account.
+:Type: Container
+
+``caps``
+
+:Description: User capabilities.
+:Type: Container
+
+
+Create User
+===========
+
+Create a new user.
+
+Syntax
+~~~~~~
+
+::
+
+ PUT /{admin}/user HTTP/1.1
+ Host: {fqdn}
+
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``uid``
+
+:Description: The user ID to be created.
+:Type: String
+:Example ``foo_user``
+:Required: Yes
+
+``display-name``
+
+:Description: The display name of the user to be created.
+:Type: String
+:Example: ``foo user``
+:Required: Yes
+
+
+``email``
+
+:Description: The email address associated with the user.
+:Type: String
+:Example" ``foo@bar.com``
+:Required: No
+
+``key-type``
+
+:Description: Key type to be generated, options are: swift, s3 (default)
+:Type: String
+:Example: ``s3``
+:Required: No
+
+``secret``
+
+:Description: Specify secret key
+:Type: String
+:Example: ``0AbCDEFg1h2i34JklM5nop6QrSTUV+WxyzaBC7D8``
+:Required: No
+
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If successful, the response contains the user information.
+
+``user``
+
+:Description: A container for the user data information.
+:Type: Container
+
+``user_id``
+
+:Description: The user id.
+:Type: String
+
+``display_name``
+
+:Description: Display name for the user.
+:Type: String
+
+``suspended``
+
+:Description: True if the user is suspended.
+:Type: Boolean
+
+``max_buckets``
+
+:Description: The maximum number of buckets to be owned by the user.
+:Type: Integer
+
+``subusers``
+
+:Description: Subusers associated with this user account.
+:Type: Container
+
+``keys``
+
+:Description: S3 keys associated with this user account.
+:Type: Container
+
+``swift_keys``
+
+:Description: Swift keys associated with this user account.
+:Type: Container
+
+``caps``
+
+:Description: User capabilities.
+:Type: Container
+
+Modify User
+===========
+
+Modify a user.
+
+Syntax
+~~~~~~
+
+::
+
+ POST /{admin}/user HTTP/1.1
+ Host: {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``uid``
+
+:Description: The user ID to be modified.
+:Type: String
+:Example ``foo_user``
+:Required: No
+
+``display-name``
+
+:Description: The display name of the user to be modified.
+:Type: String
+:Example: ``foo user``
+:Required: No
+
+``email``
+
+:Description: The email address to be associated with the user.
+:Type: String
+:Example" ``foo@bar.com``
+:Required: No
+
+``gen-secret``
+
+:Description: Generate a new secret key.
+:Type: Boolean
+:Example: True
+:Required: No
+
+``key-type``
+
+:Description: Key type to be generated, options are: swift, s3 (default)
+:Type: String
+:Example: ``s3``
+:Required: No
+
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If successful, the response contains the user information.
+
+``user``
+
+:Description: A container for the user data information.
+:Type: Container
+
+``user_id``
+
+:Description: The user id.
+:Type: String
+
+``display_name``
+
+:Description: Display name for the user.
+:Type: String
+
+``suspended``
+
+:Description: True if the user is suspended.
+:Type: Boolean
+
+``max_buckets``
+
+:Description: The maximum number of buckets to be owned by the user.
+:Type: Integer
+
+``subusers``
+
+:Description: Subusers associated with this user account.
+:Type: Container
+
+``keys``
+
+:Description: S3 keys associated with this user account.
+:Type: Container
+
+``swift_keys``
+
+:Description: Swift keys associated with this user account.
+:Type: Container
+
+``caps``
+
+:Description: User capabilities.
+:Type: Container
+
+Remove User
+===========
+
+Remove an existing user.
+
+Syntax
+~~~~~~
+
+::
+
+ DELETE /{admin}/user HTTP/1.1
+ Host: {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``uid``
+
+:Description: The user ID to be removed.
+:Type: String
+:Example ``foo_user``
+:Required: Yes.
+
+``purge-data``
+
+:Description: When specified the buckets and objects belonging
+ to the user will also be removed.
+:Type: Boolean
+:Example: True
+:Required: No
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+TBD.
+
+Create Subuser
+==============
+
+Create a new subuser (primarily useful for clients using the Swift API)
+
+Syntax
+~~~~~~
+
+::
+
+ PUT /{admin}/user/?subuser
+ Host {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``uid``
+
+:Description: The user ID under which a subuser is to be created.
+:Type: String
+:Example ``foo_user``
+:Required: Yes
+
+
+``subuser``
+
+:Description: The subuser ID to be created
+:Type: String
+:Example: ``sub_foo``
+:Required: Yes
+
+``gen-secret``
+
+:Description: Generate a secret key for the subuser.
+:Type: Boolean
+:Example: True
+:Required: No
+
+``key-type``
+
+:Description: Key type to be generated, options are: swift, s3 (default)
+:Type: String
+:Example: ``swift``
+:Required: No
+
+``access``
+
+:Description: Set access permissions for sub-user, should be one
+ of read, write, readwrite, full
+:Type: String
+:Example: ``read``
+:Required: No
+
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If successful, the response contains the user information.
+
+``user``
+
+:Description: A container for the user data information.
+:Type: Container
+
+``user_id``
+
+:Description: The user id.
+:Type: String
+
+``display_name``
+
+:Description: Display name for the user.
+:Type: String
+
+``suspended``
+
+:Description: True if the user is suspended.
+:Type: Boolean
+
+``max_buckets``
+
+:Description: The maximum number of buckets to be owned by the user.
+:Type: Integer
+
+``subusers``
+
+:Description: Subusers associated with this user account.
+:Type: Container
+
+``keys``
+
+:Description: S3 keys associated with this user account.
+:Type: Container
+
+``swift_keys``
+
+:Description: Swift keys associated with this user account.
+:Type: Container
+
+``caps``
+
+:Description: User capabilities.
+:Type: Container
+
+Modify Subuser
+==============
+
+Modify an existing subuser
+
+Syntax
+~~~~~~
+
+::
+
+ POST /{admin}/user/?subuser
+ Host {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``uid``
+
+:Description: The user ID under which the subuser is to be modified.
+:Type: String
+:Example ``foo_user``
+:Required: Yes
+
+
+``subuser``
+
+:Description: The subuser ID to be modified.
+:Type: String
+:Example: ``sub_foo``
+:Required: Yes
+
+``gen-secret``
+
+:Description: Generate a new secret key for the subuser.
+:Type: Boolean
+:Example: True
+:Required: No
+
+``key-type``
+
+:Description: Key type to be generated, options are: swift, s3 (default)
+:Type: String
+:Example: ``s3``
+:Required: No
+
+``access``
+
+:Description: Set access permissions for sub-user, should be one
+ of read, write, readwrite, full
+:Type: String
+:Example: ``read``
+:Required: No
+
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If successful, the response contains the user information.
+
+``user``
+
+:Description: A container for the user data information.
+:Type: Container
+
+``user_id``
+
+:Description: The user id.
+:Type: String
+
+``display_name``
+
+:Description: Display name for the user.
+:Type: String
+
+``suspended``
+
+:Description: True if the user is suspended.
+:Type: Boolean
+
+``max_buckets``
+
+:Description: The maximum number of buckets to be owned by the user.
+:Type: Integer
+
+``subusers``
+
+:Description: Subusers associated with this user account.
+:Type: Container
+
+``keys``
+
+:Description: S3 keys associated with this user account.
+:Type: Container
+
+``swift_keys``
+
+:Description: Swift keys associated with this user account.
+:Type: Container
+
+``caps``
+
+:Description: User capabilities.
+:Type: Container
+
+Remove Subuser
+==============
+
+Remove an existing subuser
+
+Syntax
+~~~~~~
+
+::
+
+ DELETE /{admin}/subuser
+ Host {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``uid``
+
+:Description: The user ID under which the subuser is to be removed.
+:Type: String
+:Example ``foo_user``
+:Required: Yes
+
+
+``subuser``
+
+:Description: The subuser ID to be removed.
+:Type: String
+:Example: ``sub_foo``
+:Required: Yes
+
+``purge-keys``
+
+:Description: Remove keys belonging to the subuser.
+:Type: Boolean
+:Example: True
+:Required: No
+
+``purge-data``
+:Description: Remove data belonging to the subuser.
+:Type: Boolean
+:Example: True
+:Required: No
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If successful, the response contains the user information.
+
+``user``
+
+:Description: A container for the user data information.
+:Type: Container
+
+``user_id``
+
+:Description: The user id.
+:Type: String
+
+``display_name``
+
+:Description: Display name for the user.
+:Type: String
+
+``suspended``
+
+:Description: True if the user is suspended.
+:Type: Boolean
+
+``max_buckets``
+
+:Description: The maximum number of buckets to be owned by the user.
+:Type: Integer
+
+``subusers``
+
+:Description: Subusers associated with this user account.
+:Type: Container
+
+``keys``
+
+:Description: S3 keys associated with this user account.
+:Type: Container
+
+``swift_keys``
+
+:Description: Swift keys associated with this user account.
+:Type: Container
+
+``caps``
+
+:Description: User capabilities.
+:Type: Container
+
+Create Key
+==========
+
+Create a new key.
+
+Syntax
+~~~~~~
+
+::
+
+ PUT /{admin}/key
+ Host {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``uid``
+
+:Description: The user ID to receive the new key.
+:Type: String
+:Example ``foo_user``
+:Required: Yes
+
+``subuser``
+
+:Description: The subuser ID to receive the new key.
+:Type: String
+:Example: ``sub_foo``
+:Required: No
+
+``key-type``
+
+:Description: Key type to be generated, options are: swift, s3 (default).
+:Type: String
+:Example: ``s3``
+:Required: No
+
+``secret``
+
+:Description: Specify the secret key
+:Type: String
+:Example: ``0ab/CdeFGhij1klmnopqRSTUv1WxyZabcDEFgHij``
+:Required: No
+
+Remove Key
+==========
+
+Remove an existing key.
+
+Syntax
+~~~~~~
+
+::
+
+ DELETE /{admin}/key
+ Host {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``access-key``
+
+:Description: The S3 access key belonging to the S3 keypair to remove.
+:Type: String
+:Example: ``AB01C2D3EF45G6H7IJ8K``
+:Required: Yes
+
+``uid``
+
+:Description: The user to remove the key from.
+:Type: String
+:Example ``foo_user``
+:Required: No
+
+``subuser``
+
+:Description: The subuser to remove the key from.
+:Type: String
+:Example: ``sub_foo``
+:Required: No
+
+``key-type``
+
+:Description: Key type to be removed, options are: swift, s3.
+ NOTE: Required to remove swift key.
+:Type: String
+:Example: ``swift``
+:Required: No
+
+
+Get Bucket
+==========
+
+Get information for an existing bucket, if no request parameters are
+included lists buckets.
+
+Syntax
+~~~~~~
+
+::
+
+ GET /{admin}/bucket
+ Host {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``bucket``
+
+:Description: The bucket to return info on.
+:Type: String
+:Example: ``foo_bucket``
+:Required: Yes
+
+
+``list``
+
+:Description: Return list of buckets.
+:Type: Boolean
+:Example: True
+:Required: No
+
+``stats``
+
+:Description: Return bucket statistics.
+:Type: Boolean
+:Example: True
+:Required: No
+
+``check``
+
+:Description: Check bucket index.
+:Type: Boolean
+:Example: False
+:Required: No
+
+``fix``
+
+:Description: Also fix the bucket index when checking.
+:Type: Boolean
+:Example: False
+:Required: No
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If successful the request returns a buckets container containing
+the desired bucket information.
+
+``buckets``
+
+:Description: Contains a list of one or more bucket containers.
+:Type: Container
+
+``stats``
+
+:Description: Per bucket information.
+:Type: Container
+
+``bucket``
+
+:Description: The name of the bucket.
+:Type: String
+
+``pool``
+
+:Desciption: The pool the bucket is stored in.
+:Type: String
+
+``id``
+
+:Description: The unique bucket id.
+:Type: String
+
+``marker``
+
+:Description:
+:Type: String
+
+``owner``
+
+:Description: The user id of the bucket owner.
+:Type: String
+
+``usage``
+
+:Description: Storage usage information.
+:Type: Container
+
+Check Bucket Index
+==================
+
+Check the index of an existing bucket.
+
+Syntax
+~~~~~~
+
+::
+
+ GET /{admin}/bucket/?index
+ Host {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``bucket``
+
+:Description: The bucket to return info on.
+:Type: String
+:Example: ``foo_bucket``
+:Required: Yes
+
+``fix``
+
+:Description: Also fix the bucket index when checking.
+:Type: Boolean
+:Example: False
+:Required: No
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+TBD
+
+Remove Bucket
+=============
+
+Delete an existing bucket.
+
+Syntax
+~~~~~~
+
+::
+
+ DELETE /{admin}/bucket
+ Host {fqdn}
+
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``bucket``
+
+:Description: The bucket to remove.
+:Type: String
+:Example: ``foo_bucket``
+:Required: Yes
+
+``delete``
+
+:Description: Parameter specifying the bucket is to be removed.
+:Type: Boolean
+:Example: True
+:Required: Yes
+
+``purge-objects``
+
+:Description: Remove a buckets objects before deletion.
+:Type: Boolean
+:Example: True
+:Required: No
+
+
+Unlink Bucket
+=============
+
+Unlink a bucket from a specified user.
+
+Syntax
+~~~~~~
+
+::
+
+ DELETE /{admin}/bucket
+ Host {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``bucket``
+
+:Description: The bucket to unlink.
+:Type: String
+:Example: ``foo_bucket``
+:Required: Yes
+
+``unlink``
+
+:Description: Parameter specifying that the bucket is to
+ be unlinked, not removed.
+:Type: Boolean
+:Example: True
+:Required: Yes
+
+``uid``
+
+:Description: The user ID to unlink the bucket from.
+:Type: String
+:Example ``foo_user``
+:Required: Yes
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+TBD.
+
+Link Bucket
+===========
+
+Link a bucket to a specified user.
+
+Syntax
+~~~~~~
+
+::
+
+ PUT /{admin}/bucket
+ Host {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``bucket``
+
+:Description: The bucket to unlink.
+:Type: String
+:Example: ``foo_bucket``
+:Required: Yes
+
+``uid``
+
+:Description: The user ID to link the bucket to.
+:Type: String
+:Example ``foo_user``
+:Required: Yes
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+TBD.
+
+Get Object
+==========
+
+Get an existing object.
+
+Syntax
+~~~~~~
+
+::
+
+ GET /{admin}/object
+ Host {fqdn}
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``bucket``
+
+:Description: The bucket containing the object to be retrieved.
+:Type: String
+:Example: ``foo_bucket``
+:Required: Yes
+
+``object``
+
+:Description: The object to be retrieved.
+:Type: String
+:Example: ``foo.txt``
+:Required: Yes
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If successful, returns the desired object.
+
+``object``
+
+:Description: The desired object.
+:Type: Object
+
+Remove Object
+=============
+
+Remove an existing object.
+
+Syntax
+~~~~~~
+
+::
+
+ DELETE /{admin}/object
+ Host {fqdn}
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``bucket``
+
+:Description: The bucket containing the object to be removed.
+:Type: String
+:Example: ``foo_bucket``
+:Required: Yes
+
+``object``
+
+:Description: The object to remove.
+:Type: String
+:Example: ``foo.txt``
+:Required: Yes
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+TBD.
+
+Get Cluster Info
+================
+
+Get cluster information.
+
+Syntax
+~~~~~~
+
+::
+
+ GET /{admin}/cluster
+ Host {fqdn}
+
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If successful, returns cluster pool configuration.
+
+``cluster``
+
+:Description: Contains current cluster pool configuration.
+:Type: Container
+
+
+Add Placement Pool
+==================
+
+Make a pool available for data placement.
+
+Syntax
+~~~~~~
+
+::
+
+ PUT /{admin}/pool
+ Host {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``pool``
+
+:Description: The pool to be made available for data placement.
+:Type: String
+:Example: ``foo_pool``
+:Required: Yes
+
+``create``
+
+:Description: Creates the data pool if it does not exist.
+:Type: Boolean
+:Example: False
+:Required: No
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+TBD.
+
+Remove Placement Pool
+=====================
+
+Make a pool unavailable for data placement.
+
+Syntax
+~~~~~~
+
+::
+
+ DELETE /{admin}/pool
+ Host {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``pool``
+
+:Description: The existing pool to be made available for data placement.
+:Type: String
+:Example: ``foo_pool``
+:Required: Yes
+
+``destroy``
+
+:Description: Destroys the pool after removing it from the active set.
+:Type: Boolean
+:Example: False
+:Required: No
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+TBD.
+
+List Available Data Placement Pools
+===================================
+
+List current pools available for data placement.
+
+Syntax
+~~~~~~
+
+::
+
+ GET /{admin}/pool
+ Host {fqdn}
+
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If successful, returns a list of pools available for data placement.
+
+``pools``
+
+:Description: Contains currently available pools for data placement.
+:Type: Container
+
+Get Bucket or Object Policy
+===========================
+
+Read the policy of an object or bucket.
+
+Syntax
+~~~~~~
+
+::
+
+ GET /{admin}/policy
+ Host {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``bucket``
+
+:Description: The bucket to read the policy from.
+:Type: String
+:Example: ``foo_bucket``
+:Required: No
+
+``object``
+
+:Description: The object to read the policy from.
+:Type: String
+:Example: ``foo.txt``
+:Required: No
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If successful, returns the object or bucket policy
+
+``policy``
+
+:Description: Access control policy.
+:Type: Container
+
+Add A User Capability
+=====================
+
+Add an administrative capability to a specified user.
+
+Syntax
+~~~~~~
+
+::
+
+ PUT /{admin}/caps
+ Host {fqdn}
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``uid``
+
+:Description: The user ID to add an administrative capability to.
+:Type: String
+:Example ``foo_user``
+:Required: Yes
+
+``caps``
+
+:Description: The administrative capability to add to the user.
+:Type: String
+:Example: ``usage=read, write``
+:Required: Yes
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If successful, the response contains the user information.
+
+``user``
+
+:Description: A container for the user data information.
+:Type: Container
+
+``user_id``
+
+:Description: The user id.
+:Type: String
+
+``display_name``
+
+:Description: Display name for the user.
+:Type: String
+
+``suspended``
+
+:Description: True if the user is suspended.
+:Type: Boolean
+
+``max_buckets``
+
+:Description: The maximum number of buckets to be owned by the user.
+:Type: Integer
+
+``subusers``
+
+:Description: Subusers associated with this user account.
+:Type: Container
+
+``keys``
+
+:Description: S3 keys associated with this user account.
+:Type: Container
+
+``swift_keys``
+
+:Description: Swift keys associated with this user account.
+:Type: Container
+
+``caps``
+
+:Description: User capabilities.
+:Type: Container
+
+Remove A User Capability
+========================
+
+Remove an administrative capability from a specified user.
+
+Syntax
+~~~~~~
+
+::
+
+ DELETE /{admin}/caps
+ Host {fqdn}
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``uid``
+
+:Description: The user ID to remove an administrative capability from.
+:Type: String
+:Example ``foo_user``
+:Required: Yes
+
+``caps``
+
+:Description: The administrative capabilities to remove from the user.
+:Type: String
+:Example: ``usage=read, write``
+:Required: Yes
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If successful, the response contains the user information.
+
+``user``
+
+:Description: A container for the user data information.
+:Type: Container
+
+``user_id``
+
+:Description: The user id.
+:Type: String
+
+``display_name``
+
+:Description: Display name for the user.
+:Type: String
+
+``suspended``
+
+:Description: True if the user is suspended.
+:Type: Boolean
+
+``max_buckets``
+
+:Description: The maximum number of buckets to be owned by the user.
+:Type: Integer
+
+``subusers``
+
+:Description: Subusers associated with this user account.
+:Type: Container
+
+``keys``
+
+:Description: S3 keys associated with this user account.
+:Type: Container
+
+``swift_keys``
+
+:Description: Swift keys associated with this user account.
+:Type: Container
+
+``caps``
+
+:Description: User capabilities.
+:Type: Container
+
+
+List Expired Garbage Collection Items
+=====================================
+
+List objects scheduled for garbage collection.
+
+Syntax
+~~~~~~
+
+::
+
+ GET /{admin}/garbage
+ Host {fqdn}
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+None.
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If expired garbage collection items exist, a list of such objects
+will be returned.
+
+``garbage``
+
+:Description: Expired garbage collection items.
+:Type: Container
+
+``object``
+
+:Description: A container garbage collection object information.
+:Type: Container
+
+``name``
+
+:Description: The name of the object.
+:Type: String
+
+``expired``
+
+:Description: The date at which the object expired.
+:Type: String
+
+Manually Processes Garbage Collection Items
+===========================================
+
+List objects scheduled for garbage collection.
+
+Syntax
+~~~~~~
+
+::
+
+ DELETE /{admin}/garbage
+ Host {fqdn}
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+None.
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If expired garbage collection items exist, a list of removed objects
+will be returned.
+
+``garbage``
+
+:Description: Expired garbage collection items.
+:Type: Container
+
+``object``
+
+:Description: A container garbage collection object information.
+:Type: Container
+
+``name``
+
+:Description: The name of the object.
+:Type: String
+
+``expired``
+
+:Description: The date at which the object expired.
+:Type: String
+
+Show Log Objects
+================
+
+Show log objects
+
+Syntax
+~~~~~~
+
+::
+
+ GET /{admin}/log
+ Host {fqdn}
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``object``
+
+:Description: The log object to return.
+:Type: String:
+:Example: ``2012-10-11-09-4165.2-foo_bucket``
+:Required: No
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If no object is specified, returns the full list of log objects.
+
+``log-objects``
+
+:Description: A list of log objects.
+:Type: Container
+
+``object``
+
+:Description: The name of the log object.
+:Type: String
+
+``log``
+
+:Description: The contents of the log object.
+:Type: Container
diff --git a/doc/radosgw/config.rst b/doc/radosgw/config.rst
index 32ce66d0426..12cca0168a9 100644
--- a/doc/radosgw/config.rst
+++ b/doc/radosgw/config.rst
@@ -113,7 +113,7 @@ See `<IfModule> Directive`_ for additional details.
.. _<IfModule> Directive: http://httpd.apache.org/docs/2.2/mod/core.html#ifmodule
Finally, you should configure Apache to allow encoded slashes, provide paths for
-log files and to trun off server signatures. ::
+log files and to turn off server signatures. ::
<VirtualHost *:80>
...
@@ -171,7 +171,7 @@ Add to Ceph Keyring Entries
Once you have created a keyring and key for RADOS GW, add it as an entry in
the Ceph keyring. For example::
- ceph -k /etc/ceph/ceph.keyring auth add client.radosgw.gateway -i /etc/ceph/keyring.radosgw.gateway
+ sudo ceph -k /etc/ceph/ceph.keyring auth add client.radosgw.gateway -i /etc/ceph/keyring.radosgw.gateway
Restart Services and Start the RADOS Gateway
diff --git a/doc/radosgw/index.rst b/doc/radosgw/index.rst
index d9c2e3579bd..7f76c588c2d 100644
--- a/doc/radosgw/index.rst
+++ b/doc/radosgw/index.rst
@@ -40,7 +40,7 @@ one API and retrieve it with the other.
Config Reference <config-ref>
Purging Temp Data <purge-temp>
S3 API <s3>
- Swift API <swift/index>
+ Swift API <swift>
Admin API <admin/index>
troubleshooting
Manpage radosgw <../../man/8/radosgw>
diff --git a/doc/radosgw/s3.rst b/doc/radosgw/s3.rst
index 73b3a5eb54b..25e9d977d9a 100644
--- a/doc/radosgw/s3.rst
+++ b/doc/radosgw/s3.rst
@@ -66,7 +66,7 @@ The following table describes the support status for current Amazon S3 functiona
+---------------------------------+-----------------+----------------------------------------+
| **Get Object Info (HEAD)** | Supported | |
+---------------------------------+-----------------+----------------------------------------+
-| **POST Object** | Not Supported | |
+| **POST Object** | Supported | |
+---------------------------------+-----------------+----------------------------------------+
| **Copy Object** | Supported | |
+---------------------------------+-----------------+----------------------------------------+
diff --git a/doc/radosgw/s3/python.rst b/doc/radosgw/s3/python.rst
index 35261694538..c5a8432485a 100644
--- a/doc/radosgw/s3/python.rst
+++ b/doc/radosgw/s3/python.rst
@@ -32,9 +32,9 @@ This also prints out the bucket name and creation date of each bucket.
.. code-block:: python
for bucket in conn.get_all_buckets():
- print "{name}\t{created}".format(
- name = bucket.name,
- created = bucket.creation_date,
+ print "{name}\t{created}".format(
+ name = bucket.name,
+ created = bucket.creation_date,
)
The output will look something like this::
diff --git a/doc/radosgw/swift.rst b/doc/radosgw/swift.rst
new file mode 100644
index 00000000000..d3fbcd1ca03
--- /dev/null
+++ b/doc/radosgw/swift.rst
@@ -0,0 +1,74 @@
+===============
+RADOS Swift API
+===============
+
+Ceph supports a RESTful API that is compatible with the the basic data access model of the Swift API.
+
+API
+---
+
+.. toctree::
+ :maxdepth: 1
+
+ Common <swift/index>
+ Authentication <swift/auth>
+ Service Ops <swift/serviceops>
+ Container Ops <swift/containerops>
+ Object Ops <swift/objectops>
+ Tutorial <swift/tutorial>
+ Java <swift/java>
+ Python <swift/python>
+ Ruby <swift/ruby>
+
+
+Features Support
+----------------
+
+The following table describes the support status for current Swift functional features:
+
++---------------------------------+-----------------+----------------------------------------+
+| Feature | Status | Remarks |
++=================================+=================+========================================+
+| **Authentication** | Supported | |
++---------------------------------+-----------------+----------------------------------------+
+| **Get Account Metadata** | Supported | No custom metadata |
++---------------------------------+-----------------+----------------------------------------+
+| **Swift ACLs** | Supported | Supports a subset of Swift ACLs |
++---------------------------------+-----------------+----------------------------------------+
+| **List Containers** | Supported | |
++---------------------------------+-----------------+----------------------------------------+
+| **Delete Container** | Supported | |
++---------------------------------+-----------------+----------------------------------------+
+| **Create Container** | Supported | |
++---------------------------------+-----------------+----------------------------------------+
+| **Get Container Metadata** | Supported | |
++---------------------------------+-----------------+----------------------------------------+
+| **Update Container Metadata** | Supported | |
++---------------------------------+-----------------+----------------------------------------+
+| **Delete Container Metadata** | Supported | |
++---------------------------------+-----------------+----------------------------------------+
+| **List Objects** | Supported | |
++---------------------------------+-----------------+----------------------------------------+
+| **Static Website** | Not Supported | |
++---------------------------------+-----------------+----------------------------------------+
+| **Create Object** | Supported | |
++---------------------------------+-----------------+----------------------------------------+
+| **Create Large Object** | Supported | |
++---------------------------------+-----------------+----------------------------------------+
+| **Delete Object** | Supported | |
++---------------------------------+-----------------+----------------------------------------+
+| **Get Object** | Supported | |
++---------------------------------+-----------------+----------------------------------------+
+| **Copy Object** | Supported | |
++---------------------------------+-----------------+----------------------------------------+
+| **Get Object Metadata** | Supported | |
++---------------------------------+-----------------+----------------------------------------+
+| **Update Object Metadata** | Supported | |
++---------------------------------+-----------------+----------------------------------------+
+| **Expiring Objects** | Not Supported | |
++---------------------------------+-----------------+----------------------------------------+
+| **Object Versioning** | Not Supported | |
++---------------------------------+-----------------+----------------------------------------+
+| **CORS** | Not Supported | |
++---------------------------------+-----------------+----------------------------------------+
+
diff --git a/doc/radosgw/swift/index.rst b/doc/radosgw/swift/swift.rst
index 3b8531d7bd4..3b8531d7bd4 100644
--- a/doc/radosgw/swift/index.rst
+++ b/doc/radosgw/swift/swift.rst
diff --git a/qa/run_xfstests.sh b/qa/run_xfstests.sh
index 1eba38a248d..3bcd8b5a636 100644
--- a/qa/run_xfstests.sh
+++ b/qa/run_xfstests.sh
@@ -49,7 +49,7 @@ XFS_MKFS_OPTIONS="-l su=32k"
# until we can work through getting them all passing reliably.
TESTS="1-9 11-15 17 19-21 26-29 31-34 41 46-48 50-54 56 61 63-67 69-70 74-76"
TESTS="${TESTS} 78 79 84-89 91-92 100 103 105 108 110 116-121 124 126"
-TESTS="${TESTS} 129-135 137-141 164-167 179 182-184 186-190 192 194"
+TESTS="${TESTS} 129-135 137-141 164-167 182 184 186-190 192 194"
TESTS="${TESTS} 196 199 201 203 214-216 220-227 234 236-238 241 243-249"
TESTS="${TESTS} 253 257-259 261 262 269 273 275 277 278 280 285 286"
# 275 was the highest available test as of 4/10/12.
diff --git a/src/Makefile.am b/src/Makefile.am
index 64924d7bd50..7a9759f8fdf 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -227,10 +227,12 @@ bin_DEBUGPROGRAMS += smalliobench
smalliobenchfs_SOURCES = test/bench/small_io_bench_fs.cc test/bench/filestore_backend.cc test/bench/detailed_stat_collector.cc test/bench/bencher.cc
smalliobenchfs_LDADD = librados.la -lboost_program_options $(LIBOS_LDA) $(LIBGLOBAL_LDA)
+smalliobenchfs_CXXFLAGS = ${CRYPTO_CXXFLAGS} ${AM_CXXFLAGS}
bin_DEBUGPROGRAMS += smalliobenchfs
smalliobenchdumb_SOURCES = test/bench/small_io_bench_dumb.cc test/bench/dumb_backend.cc test/bench/detailed_stat_collector.cc test/bench/bencher.cc
smalliobenchdumb_LDADD = librados.la -lboost_program_options $(LIBOS_LDA) $(LIBGLOBAL_LDA)
+smalliobenchdumb_CXXFLAGS = ${CRYPTO_CXXFLAGS} ${AM_CXXFLAGS}
bin_DEBUGPROGRAMS += smalliobenchdumb
tpbench_SOURCES = test/bench/tp_bench.cc test/bench/detailed_stat_collector.cc
@@ -861,6 +863,7 @@ test_mon_workloadgen_SOURCES = \
osdc/Objecter.cc \
osdc/Striper.cc
test_mon_workloadgen_LDADD = $(LIBOS_LDA) $(LIBGLOBAL_LDA)
+test_mon_workloadgen_CXXFLAGS = ${CRYPTO_CXXFLAGS} ${AM_CXXFLAGS}
bin_DEBUGPROGRAMS += test_mon_workloadgen
test_rados_api_io_SOURCES = test/librados/io.cc test/librados/test.cc
diff --git a/src/rgw/rgw_cache.h b/src/rgw/rgw_cache.h
index fb6ca10692d..e4002f6af25 100644
--- a/src/rgw/rgw_cache.h
+++ b/src/rgw/rgw_cache.h
@@ -268,6 +268,11 @@ int RGWCache<T>::get_obj(void *ctx, void **handle, rgw_obj& obj, bufferlist& obl
return r;
}
+ if (obl.length() == end + 1) {
+ /* in this case, most likely object contains more data, we can't cache it */
+ return r;
+ }
+
bufferptr p(r);
bufferlist& bl = info.data;
bl.clear();
diff --git a/src/rgw/rgw_tools.cc b/src/rgw/rgw_tools.cc
index b6d9f284771..e83e49a0652 100644
--- a/src/rgw/rgw_tools.cc
+++ b/src/rgw/rgw_tools.cc
@@ -10,7 +10,7 @@
#define dout_subsys ceph_subsys_rgw
-#define READ_CHUNK_LEN (16 * 1024)
+#define READ_CHUNK_LEN (512 * 1024)
static map<string, string> ext_mime_map;
@@ -41,25 +41,24 @@ int rgw_get_obj(RGWRados *rgwstore, void *ctx, rgw_bucket& bucket, string& key,
bufferlist::iterator iter;
int request_len = READ_CHUNK_LEN;
rgw_obj obj(bucket, key);
- ret = rgwstore->prepare_get_obj(ctx, obj, NULL, NULL, pattrs, NULL,
+ do {
+ ret = rgwstore->prepare_get_obj(ctx, obj, NULL, NULL, pattrs, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, &handle, &err);
- if (ret < 0)
- return ret;
+ if (ret < 0)
+ return ret;
- do {
ret = rgwstore->get_obj(ctx, &handle, obj, bl, 0, request_len - 1);
+ rgwstore->finish_get_obj(&handle);
if (ret < 0)
- goto done;
+ return ret;
+
if (ret < request_len)
break;
bl.clear();
request_len *= 2;
} while (true);
- ret = 0;
-done:
- rgwstore->finish_get_obj(&handle);
- return ret;
+ return 0;
}
void parse_mime_map_line(const char *start, const char *end)