From da5ccf7ac14925f53eb3aa07f1670017fcd0130d Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Thu, 5 Sep 2013 13:15:18 -0700 Subject: [PATCH 001/150] doc: Added draft of configuration guide for federated gateways. Signed-off-by: John Wilkins --- doc/radosgw/federated-config.rst | 430 +++++++++++++++++++++++++++++++ 1 file changed, 430 insertions(+) create mode 100644 doc/radosgw/federated-config.rst diff --git a/doc/radosgw/federated-config.rst b/doc/radosgw/federated-config.rst new file mode 100644 index 0000000000000..2de46d4e68f25 --- /dev/null +++ b/doc/radosgw/federated-config.rst @@ -0,0 +1,430 @@ +================================ + Configuring Federated Gateways +================================ + +To deploy federated Ceph Object Gateways, you must have at least one :term:`Ceph +Storage Cluster` running. For each :term:`Ceph Node` that runs a :term:`Ceph +Object Gateway`, you must install Apache, FastCGI and the Ceph Object Gateway +daemon (``radosgw``). See `Install Apache, FastCGI and Gateway`_ for details. + +Introduction +============ + +Configuring a :term:`Ceph Object Store` service involves the scope and +configuration of the overall service, and configuring each gateway +instance to use the Ceph Storage Cluster. + +.. versionadded:: 0.67 + +Ceph Object Gateway v0.67 (Dumpling) and beyond supports regions and zones. + +- **Region**: A region represents a geographical area and contains one + or more zones. A cluster with multiple regions must specify a default region. + +- **Zone**: A zone is a logical grouping of one or more Ceph Object Gateway + instance(s). A region has a master zone that processes client requests. + **Note**: Replicating data between multiple zones in a region requires the + data synchronization agent of Ceph v0.69 and beyond. + +Small Ceph Object Storage clusters typically use the default region and zone. +You may skip configuring regions and zones for small clusters and proceed with +the `Simple Configuration`_ guide. + +A large, geographically distributed Ceph Object Storage service may define +multiple regions within the cluster and at least one zone within each region. +**Note:** You may create zones in Ceph v0.67, but they are not useful without +the data synchronization agent released in Ceph v0.69. If you plan to deploy a +geographically distributed service, create at least one zone and region first +so that you may associate individual Ceph Object Gateway instances with a zone +and region. + +Once you have addressed whether or not to configure regions and zones, you must +configure each instance of a :term:`Ceph Object Gateway` to use the Ceph +Storage Cluster as the data storage backend. + +Configuring Regions and Zones +============================= + +When you deploy a :term:`Ceph Object Store` service that spans geographical +locales, configuring Ceph Object Gateway regions and metadata synchronization +agents enables the service to maintain a global namespace for the cluster, even +though Ceph Object Gateway instances run in different geographic locales. + +.. versionadded:: 0.69 + +When you separate one or more Ceph Object Gateway instances within a region into +separate logical containers to maintain an extra copy (or copies) of the data, +configuring Ceph Object Gateway zones and data synchronization agents enables +the service to maintain one or more copy(ies) of the master zone's data. Extra +copies of the data are important for failover, backup and disaster recovery. + + +Default Region and Zone +----------------------- + +The Ceph Object Gateway can generate its own default gateway and zone. These +defaults are the master region and master zone for a cluster. When you configure +your cluster for regions and zones, you will be replacing (and likely deleting, +if it exists) the default region and zone. + +Create a Region +--------------- + +#. Create a region called ``region1``. + + Set ``is_master`` to ``true``. Copy the contents of the following example + to a text editor. Replace ``{fqdn}`` with the fully-qualified domain name + of the endpoint. Then, save the file to ``region.json``. It will specify a + master zone as ``region1-zone1`` and list it in the ``zones`` list. + See `Configuration Reference - Regions`_ for details.:: + + { "name": "region1", + "api_name": "reg1", + "is_master": "true", + "endpoints": [ + "http:\/\/{fqdn}:80\/"], + "master_zone": "region1-zone1", + "zones": [ + { "name": "region1-zone1", + "endpoints": [ + "http:\/\/{fqdn}:80\/"], + "log_meta": "false", + "log_data": "false"}], + "placement_targets": [], + "default_placement": ""} + + +#. To create ``region1``, execute:: + + sudo radosgw-admin region set --infile region.json + +#. Delete the default region. :: + + rados -p .rgw.root rm region_info.default + +#. Set the new region as the default region. :: + + radosgw-admin region default --rgw-region=region1 + +#. Update the region map. :: + + radosgw-admin regionmap update + + +Create a Zone User +------------------ + +You need to create a user before configuring the zone. :: + + sudo radosgw-admin user create --uid="region1-zone1" --display-name="Region-1 Zone-1" + +Copy the ``access_key`` and ``secret_key`` fields for your zone configuration. + + +Create a Zone +------------- + +#. Create a zone called ``region1-zone1``. + + Paste the contents of the ``access_key`` and ``secret_key`` fields from the + step of creating a zone user into the ``system_key`` field. This + configuration uses pool names prepended with the region name and zone name. + See `Configuration Reference - Pools`_ for details on gateway pools. + See `Configuration Reference - Zones`_ for details on zones. :: + + { "domain_root": ".region1-zone1.rgw", + "control_pool": ".region1-zone1.rgw.control", + "gc_pool": ".region1-zone1.rgw.gc", + "log_pool": ".region1-zone1.log", + "intent_log_pool": ".region1-zone1.intent-log", + "usage_log_pool": ".region1-zone1.usage", + "user_keys_pool": ".region1-zone1.users", + "user_email_pool": ".region1-zone1.users.email", + "user_swift_pool": ".region1-zone1.users.swift", + "user_uid_pool": ".region1-zone1.users.uid", + "system_key": { "access_key": "", "secret_key": ""} + } + + +#. To create ``region1-zone1``, execute:: + + sudo radosgw-admin zone set --rgw-zone=region1-zone1 --infile zone.json + + +#. Delete the default zone. :: + + rados -p .rgw.root rm zone_info.default + + +#. Update the region map. :: + + radosgw-admin regionmap update + + +Create Pools +============ + +If the username(s) and key(s) that provide your Ceph Object Gateway with access +to the Ceph Storage Cluster do not have write capability to the :term:`Ceph +Monitor`, you must create the pools manually. See `Configuration Reference - +Pools`_ for details on the default pools for gateways. See `Pools`_ for +details on creating pools. For each pool name: + +- ``.region1-zone1.rgw`` +- ``.region1-zone1.rgw.control`` +- ``.region1-zone1.rgw.gc`` +- ``.region1-zone1.log`` +- ``.region1-zone1.intent-log`` +- ``.region1-zone1.usage`` +- ``.region1-zone1.users`` +- ``.region1-zone1.users.email`` +- ``.region1-zone1.users.swift`` +- ``.region1-zone1.users.uid`` + +Execute one of the following:: + + rados mkpool {poolname} + ceph osd pool create {poolname} {pg-num} {pgp-num} + + +Configuring a Gateway Instance +============================== + +Before you configure a gateway instance, determine an ID for the instance. You +can name a Ceph Object Gateway instance anything you like. In large clusters +with regions and zones, it may help to add region and zone names into your +instance name. For example:: + + region1-zone1-instance1 + +When referring to your instance identifier in the Ceph configuration file, it +is prepended with ``client.radosgw.``. For example, an instance named +``region1-zone1-instance1`` will look like this:: + + [client.radosgw.region1-zone1-instance1] + +Similarly, the default data path for an instance named +``region1-zone1-instance1`` is prepended with ``{cluster}-radosgw.``. For +example:: + + /var/lib/ceph/radosgw/ceph-radosgw.region1-zone1-instance1 + + +Create a Data Directory +----------------------- + +Create a data directory on the node where you installed ``radosgw``. :: + + sudo mkdir -p /var/lib/ceph/radosgw/ceph-radosgw.region1-zone1-instance1 + + +Create a Storage Cluster User +----------------------------- + +When accessing the Ceph Storage Cluster, each instance of a Ceph Object Gateway +must provide the Ceph Storage Cluster with a user name and key. We recommend +setting up at least one user name and key for each zone. See `Cephx +Administration`_ for a discussion on adding keyrings and keys. + +#. Create a keyring for the Ceph Object Gateway. For example:: + + sudo ceph-authtool --create-keyring /etc/ceph/ceph.client.radosgw.region1-zone1.keyring + sudo chmod +r /etc/ceph/ceph.client.radosgw.region1-zone1.keyring + + +#. Generate a key so that the Ceph Object Gateway can provide a user name and + key to authenticate itself with the Ceph Storage Cluster. Then, add + capabilities to the key. See `Configuration Reference - Pools`_ for details + on the effect of write permissions for the monitor and creating pools. :: + + sudo ceph-authtool /etc/ceph/ceph.client.radosgw.region1-zone1.keyring -n client.radosgw.region1-zone1 --gen-key + sudo ceph-authtool -n client.radosgw.region1-zone1 --cap osd 'allow rwx' --cap mon 'allow rw' /etc/ceph/ceph.client.radosgw.region1-zone1.keyring + +#. Once you have created a keyring and key to enable the Ceph Object Gateway + with access to the Ceph Storage Cluster, add it as an entry to your Ceph + Storage Cluster. For example:: + + sudo ceph -k /etc/ceph/ceph.client.admin.keyring auth add client.radosgw.region1-zone1 -i /etc/ceph/ceph.client.radosgw.region1-zone1.keyring + + +Create a Gateway Configuration +------------------------------ + +Create an ``rgw.conf`` file under the ``/etc/apache2/sites-available`` directory +on the host(s) where you installed the Ceph Object Gateway daemon(s). See below +for an exemplary embodiment of a gateway configuration as discussed in the +following text. + +.. literalinclude:: rgw.conf + :language: ini + +#. Replace the ``{fqdn}`` entry with the fully-qualified domain name of the + server. + +#. Replace the ``{email.address}`` entry with the email address for the + server administrator. + +#. Add a ``ServerAlias`` if you wish to use S3-style subdomains + (of course you do). + + +Enable the Configuration +------------------------ + + +#. Enable the site for the gateway configuration (e.g., ``rgw.conf``). :: + + sudo a2ensite rgw.conf + +#. Disable the default site. :: + + sudo a2dissite default + +.. note:: Failure to disable the default site can lead to problems. + + +Add a FastCGI Script +-------------------- + +FastCGI requires a script for the S3-compatible interface. To create the +script, execute the following procedures on the server node. + +#. Go to the ``/var/www`` directory. :: + + cd /var/www + +#. Open an editor with the file name ``s3gw.fcgi``. :: + + sudo vim s3gw.fcgi + +#. Add a shell script with ``exec`` and the path to the gateway binary, + the path to the Ceph configuration file, and the user name (``-n``; + the same user name created in step 2 of `Create a Storage Cluster User`_. + Copy the following into the editor. :: + + #!/bin/sh + exec /usr/bin/radosgw -c /etc/ceph/ceph.conf -n client.radosgw.region1-zone1 + +#. Save the file. + +#. Change the permissions on the file so that it is executable. :: + + sudo chmod +x s3gw.fcgi + + +Add Configuration to Ceph Config +-------------------------------- + +Ceph Object Gateway instances read the `Ceph configuration file`_ (located at +``/etc/ceph/{cluster-name}.conf`` by default). The Ceph Object Gateway is a +client of the Ceph Storage Cluster, so you must place each instance under a +``[client]`` section that specifically refers to the ``radosgw`` daemon and the +instance ID. For example:: + + + [client.radosgw.region1-zone1-instance1] + + #Region Info + rgw region = region1 + rgw region root pool = .region1.rgw.root + + #Zone Info + rgw zone = region1-zone1 + rgw zone root pool = .region1-zone1.rgw.root + keyring = /etc/ceph/ceph.client.radosgw.region1-zone1.keyring + + #DNS Info for S3 Subdomains + rgw dns name = {hostname} + + #Ceph Node Info + rgw socket path = /tmp/$name.sock + host = {host-name} + + +Add the foregoing setting (replacing values in braces where appropriate) to the +master copy of the Ceph configuration file you keep with your admin node. Then, +use ``ceph-deploy`` to push a fresh copy the configuration file from your admin +node Ceph Nodes. :: + + ceph-deploy --overwrite-conf config push {host-name [host-name]...} + + + +Restart Services +================ + +Once you have redeployed your Ceph configuration files, we recommend restarting +your ``ceph`` service. + +For Ubuntu, use the following:: + + sudo restart ceph-all + +For Red Hat/CentOS, use the following:: + + sudo /etc/init.d/ceph restart + +To ensure that all components have reloaded their configurations, for each +gateway instance we recommend restarting the ``apache2`` service. For example:: + + sudo service apache2 restart + + +Start +===== + +Start up the ``radosgw`` service. When starting the service with other than +the default region and zone, you must specify them explicitly. :: + + sudo /etc/init.d/radosgw start --rgw-region={region} --rgw-zone={zone} + + +Activate Metadata Agent +======================= + +The metadata agent synchronizes metadata between two regions. The source region +is the master region for the cluster, and the destination region is the secondary +region that will receive metadata. + +To configure the synchronization agent, retrieve the following from the master +zone of the the source and destination regions: + +- Access Key +- Secret Key +- Hostname +- Port + +Specify these values in a configuration file (e.g., ``region-md-sync.conf``), +and include a ``log_file`` name and a an identifier for the ``daemon_id``. For +example: + +.. code-block:: ini + + src_access_key: {source-access-key} + src_secret_key: {source-secret-key} + src_host: {source-hostname} + src_port: {source-port} + src_zone: {source-zone} + dest_access_key: {destination-access-key} + dest_secret_key: {destination-secret-key} + dest_host: {destination-hostname} + dest_port: {destinatio-port} + dest_zone: {destination-zone} + log_file: {log.filename} + daemon_id: {daemon-id} + +To activate the metadata agent, execute the following:: + + radosgw-agent -c region-md-sync.conf + + + + +.. _Install Apache, FastCGI and Gateway: ../manual-install +.. _Cephx Administration: ../../rados/operations/authentication/#cephx-administration +.. _Ceph configuration file: ../../rados/configuration/ceph-conf +.. _Configuration Reference - Pools: ../config-ref#pools +.. _Configuration Reference - Regions: ../config-ref#regions +.. _Configuration Reference - Zones: ../config-ref#zones +.. _Pools: ../../rados/operations/pools +.. _Simple Configuration: ../config \ No newline at end of file From 258396d55606f0e14b833f61a391c6e8f1fb2338 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Thu, 5 Sep 2013 13:15:41 -0700 Subject: [PATCH 002/150] doc: Added entry for federated configuration to the index. Signed-off-by: John Wilkins --- doc/radosgw/index.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/radosgw/index.rst b/doc/radosgw/index.rst index 9f6274c232609..65831a6d326d0 100644 --- a/doc/radosgw/index.rst +++ b/doc/radosgw/index.rst @@ -37,7 +37,8 @@ you may write data with one API and retrieve it with the other. :maxdepth: 1 Manual Install - Configuration + Simple Configuration + Federated Configuration Config Reference Purging Temp Data S3 API From ae7912f500d9508d354137b0719ef3e181b634e3 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Mon, 16 Sep 2013 19:00:19 -0700 Subject: [PATCH 003/150] doc: Added conf example. Signed-off-by: John Wilkins --- doc/radosgw/rgw.conf | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 doc/radosgw/rgw.conf diff --git a/doc/radosgw/rgw.conf b/doc/radosgw/rgw.conf new file mode 100644 index 0000000000000..e1bee99863104 --- /dev/null +++ b/doc/radosgw/rgw.conf @@ -0,0 +1,30 @@ +FastCgiExternalServer /var/www/s3gw.fcgi -socket /tmp/radosgw.sock + + + + + ServerName {fqdn} + + + ServerAdmin {email.address} + DocumentRoot /var/www + RewriteEngine On + RewriteRule ^/([a-zA-Z0-9-_.]*)([/]?.*) /s3gw.fcgi?page=$1¶ms=$2&%{QUERY_STRING} [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L] + + + + Options +ExecCGI + AllowOverride All + SetHandler fastcgi-script + Order allow,deny + Allow from all + AuthBasicAuthoritative Off + + + + AllowEncodedSlashes On + ErrorLog /var/log/apache2/error.log + CustomLog /var/log/apache2/access.log combined + ServerSignature Off + + \ No newline at end of file From 5bb7417ab6b634c6c2a2a528f54812390b212e17 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Thu, 19 Sep 2013 16:03:17 -0700 Subject: [PATCH 004/150] doc: Added draft of region/zone diagram. Signed-off-by: John Wilkins --- doc/images/region-zone-sync.png | Bin 0 -> 89159 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/images/region-zone-sync.png diff --git a/doc/images/region-zone-sync.png b/doc/images/region-zone-sync.png new file mode 100644 index 0000000000000000000000000000000000000000..21f694e84d240e5c1129b935ceac2167ea0622c1 GIT binary patch literal 89159 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

H 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 Date: Thu, 19 Sep 2013 16:04:06 -0700 Subject: [PATCH 005/150] doc: Made some changes and incorporated a draft diagram. Signed-off-by: John Wilkins --- doc/radosgw/federated-config.rst | 69 ++++++++++++++------------------ 1 file changed, 29 insertions(+), 40 deletions(-) diff --git a/doc/radosgw/federated-config.rst b/doc/radosgw/federated-config.rst index 2de46d4e68f25..e1c584c505ebf 100644 --- a/doc/radosgw/federated-config.rst +++ b/doc/radosgw/federated-config.rst @@ -2,55 +2,25 @@ Configuring Federated Gateways ================================ -To deploy federated Ceph Object Gateways, you must have at least one :term:`Ceph -Storage Cluster` running. For each :term:`Ceph Node` that runs a :term:`Ceph -Object Gateway`, you must install Apache, FastCGI and the Ceph Object Gateway -daemon (``radosgw``). See `Install Apache, FastCGI and Gateway`_ for details. - -Introduction -============ - -Configuring a :term:`Ceph Object Store` service involves the scope and -configuration of the overall service, and configuring each gateway -instance to use the Ceph Storage Cluster. - -.. versionadded:: 0.67 +.. versionadded:: 0.69 -Ceph Object Gateway v0.67 (Dumpling) and beyond supports regions and zones. +In Ceph version 0.69 and beyond, you may configure Ceph Object Gateways in a +federated architecture, spanning multiple geographic regions (read affinity and +failover), and with multiple zones within a region (disaster recovery). - **Region**: A region represents a geographical area and contains one - or more zones. A cluster with multiple regions must specify a default region. + or more zones. A cluster with multiple regions must specify a master region. - **Zone**: A zone is a logical grouping of one or more Ceph Object Gateway - instance(s). A region has a master zone that processes client requests. - **Note**: Replicating data between multiple zones in a region requires the - data synchronization agent of Ceph v0.69 and beyond. - -Small Ceph Object Storage clusters typically use the default region and zone. -You may skip configuring regions and zones for small clusters and proceed with -the `Simple Configuration`_ guide. - -A large, geographically distributed Ceph Object Storage service may define -multiple regions within the cluster and at least one zone within each region. -**Note:** You may create zones in Ceph v0.67, but they are not useful without -the data synchronization agent released in Ceph v0.69. If you plan to deploy a -geographically distributed service, create at least one zone and region first -so that you may associate individual Ceph Object Gateway instances with a zone -and region. - -Once you have addressed whether or not to configure regions and zones, you must -configure each instance of a :term:`Ceph Object Gateway` to use the Ceph -Storage Cluster as the data storage backend. + instance(s). A region has a master zone that processes client requests. -Configuring Regions and Zones -============================= +.. image:: ../images/region-zone-sync.png When you deploy a :term:`Ceph Object Store` service that spans geographical locales, configuring Ceph Object Gateway regions and metadata synchronization -agents enables the service to maintain a global namespace for the cluster, even -though Ceph Object Gateway instances run in different geographic locales. - -.. versionadded:: 0.69 +agents enables the service to maintain a global namespace, even though Ceph +Object Gateway instances run in different geographic locales and potentially +on different Ceph Storage Clusters. When you separate one or more Ceph Object Gateway instances within a region into separate logical containers to maintain an extra copy (or copies) of the data, @@ -58,6 +28,24 @@ configuring Ceph Object Gateway zones and data synchronization agents enables the service to maintain one or more copy(ies) of the master zone's data. Extra copies of the data are important for failover, backup and disaster recovery. +You may deploy a single Ceph Storage Cluster with a federated architecture +if you have low latency network connections (this isn't recommended). You may +also deploy one Ceph Storage Cluster per region with a separate set of +pools for each zone (typical). You may also deploy a separate Ceph Storage +Cluster for each zone if your requirements and resources warrant this level +of redundancy. + +Once you configure regions and zones, you must configure each instance of a +:term:`Ceph Object Gateway` to use the Ceph Storage Cluster as the data storage +backend. + +Configuring Regions and Zones +============================= + +For each :term:`Ceph Node` that runs a :term:`Ceph +Object Gateway`, you must install Apache, FastCGI and the Ceph Object Gateway +daemon (``radosgw``). See `Install Apache, FastCGI and Gateway`_ for details. + Default Region and Zone ----------------------- @@ -67,6 +55,7 @@ defaults are the master region and master zone for a cluster. When you configure your cluster for regions and zones, you will be replacing (and likely deleting, if it exists) the default region and zone. + Create a Region --------------- From ed73e0aa44aa8f715aaaa05854ff1756227403ae Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Mon, 23 Sep 2013 14:16:53 -0700 Subject: [PATCH 006/150] doc: Adding context to the federated configuration guide. Signed-off-by: John Wilkins --- doc/radosgw/federated-config.rst | 141 +++++++++++++++++++------------ 1 file changed, 85 insertions(+), 56 deletions(-) diff --git a/doc/radosgw/federated-config.rst b/doc/radosgw/federated-config.rst index e1c584c505ebf..4349438187946 100644 --- a/doc/radosgw/federated-config.rst +++ b/doc/radosgw/federated-config.rst @@ -35,10 +35,28 @@ pools for each zone (typical). You may also deploy a separate Ceph Storage Cluster for each zone if your requirements and resources warrant this level of redundancy. + +Exemplary Cluster +================= + +For the purposes of this configuration guide, we provide an exemplary +procedure for setting up two regions and two zones within each region. +So the cluster will comprise four gateway instances. For naming purposes, +we will refer to them as follows: + +- Region 1: ``rg1`` +- Region 1, Zone 1: ``rg1-zn1`` +- Region 1, Zone 2: ``rg1-zn2`` +- Region 2: ``rg2`` +- Region 2, Zone 1: ``rg2-zn1`` +- Region 2, Zone 2: ``rg2-zn2`` + +To configure the exemplary cluster, you must configure regions and zones. Once you configure regions and zones, you must configure each instance of a :term:`Ceph Object Gateway` to use the Ceph Storage Cluster as the data storage backend. + Configuring Regions and Zones ============================= @@ -56,25 +74,25 @@ your cluster for regions and zones, you will be replacing (and likely deleting, if it exists) the default region and zone. -Create a Region ---------------- +Create Regions +-------------- -#. Create a region called ``region1``. +#. Create a region called ``rg1``. Set ``is_master`` to ``true``. Copy the contents of the following example to a text editor. Replace ``{fqdn}`` with the fully-qualified domain name of the endpoint. Then, save the file to ``region.json``. It will specify a - master zone as ``region1-zone1`` and list it in the ``zones`` list. + master zone as ``rg1-zn1`` and list it in the ``zones`` list. See `Configuration Reference - Regions`_ for details.:: - { "name": "region1", - "api_name": "reg1", + { "name": "rg1", + "api_name": "rg1", "is_master": "true", "endpoints": [ "http:\/\/{fqdn}:80\/"], - "master_zone": "region1-zone1", + "master_zone": "rg1-zn1", "zones": [ - { "name": "region1-zone1", + { "name": "rg1-zn1", "endpoints": [ "http:\/\/{fqdn}:80\/"], "log_meta": "false", @@ -83,37 +101,46 @@ Create a Region "default_placement": ""} -#. To create ``region1``, execute:: +#. To create ``rg1``, execute:: sudo radosgw-admin region set --infile region.json + Repeat the foregoing process to create region ``rg2``, but set + ``is_master`` to ``false`` and update the ``master_zone`` and + ``zones`` fields. + #. Delete the default region. :: rados -p .rgw.root rm region_info.default #. Set the new region as the default region. :: - radosgw-admin region default --rgw-region=region1 + radosgw-admin region default --rgw-region=r1 #. Update the region map. :: radosgw-admin regionmap update -Create a Zone User ------------------- -You need to create a user before configuring the zone. :: +Create Zone Users +----------------- + +Create zone users before configuring the zones. :: - sudo radosgw-admin user create --uid="region1-zone1" --display-name="Region-1 Zone-1" + sudo radosgw-admin user create --uid="rg1-zn1" --display-name="Region-1 Zone-1" + sudo radosgw-admin user create --uid="rg1-zn2" --display-name="Region-1 Zone-2" + sudo radosgw-admin user create --uid="rg2-zn1" --display-name="Region-2 Zone-1" + sudo radosgw-admin user create --uid="rg2-zn2" --display-name="Region-2 Zone-2" -Copy the ``access_key`` and ``secret_key`` fields for your zone configuration. +Copy the ``access_key`` and ``secret_key`` fields for each user. You will need them +to configure each zone. Create a Zone ------------- -#. Create a zone called ``region1-zone1``. +#. Create a zone called ``rg1-zn1``. Paste the contents of the ``access_key`` and ``secret_key`` fields from the step of creating a zone user into the ``system_key`` field. This @@ -121,24 +148,26 @@ Create a Zone See `Configuration Reference - Pools`_ for details on gateway pools. See `Configuration Reference - Zones`_ for details on zones. :: - { "domain_root": ".region1-zone1.rgw", - "control_pool": ".region1-zone1.rgw.control", - "gc_pool": ".region1-zone1.rgw.gc", - "log_pool": ".region1-zone1.log", - "intent_log_pool": ".region1-zone1.intent-log", - "usage_log_pool": ".region1-zone1.usage", - "user_keys_pool": ".region1-zone1.users", - "user_email_pool": ".region1-zone1.users.email", - "user_swift_pool": ".region1-zone1.users.swift", - "user_uid_pool": ".region1-zone1.users.uid", + { "domain_root": ".rg1-zn1.rgw", + "control_pool": ".rg1-zn1.rgw.control", + "gc_pool": ".rg1-zn1.rgw.gc", + "log_pool": ".rg1-zn1.log", + "intent_log_pool": ".rg1-zn1.intent-log", + "usage_log_pool": ".rg1-zn1.usage", + "user_keys_pool": ".rg1-zn1.users", + "user_email_pool": ".rg1-zn1.users.email", + "user_swift_pool": ".rg1-zn1.users.swift", + "user_uid_pool": ".rg1-zn1.users.uid", "system_key": { "access_key": "", "secret_key": ""} } -#. To create ``region1-zone1``, execute:: +#. To create ``r1-zn1``, execute:: - sudo radosgw-admin zone set --rgw-zone=region1-zone1 --infile zone.json + sudo radosgw-admin zone set --rgw-zone=rg1-zn1 --infile zone.json + Repeat the previous to steps to create zones ``rg1-zn2``, ``rg2-zn1``, + and ``rg2-zn2`` replacing ``rg*-zn*`` in the ``zone.json`` file. #. Delete the default zone. :: @@ -159,16 +188,16 @@ Monitor`, you must create the pools manually. See `Configuration Reference - Pools`_ for details on the default pools for gateways. See `Pools`_ for details on creating pools. For each pool name: -- ``.region1-zone1.rgw`` -- ``.region1-zone1.rgw.control`` -- ``.region1-zone1.rgw.gc`` -- ``.region1-zone1.log`` -- ``.region1-zone1.intent-log`` -- ``.region1-zone1.usage`` -- ``.region1-zone1.users`` -- ``.region1-zone1.users.email`` -- ``.region1-zone1.users.swift`` -- ``.region1-zone1.users.uid`` +- ``.rg1-zn1.rgw`` +- ``.rg1-zn1.rgw.control`` +- ``.rg1-zn1.rgw.gc`` +- ``.rg1-zn1.log`` +- ``.rg1-zn1.intent-log`` +- ``.rg1-zn1.usage`` +- ``.rg1-zn1.users`` +- ``.rg1-zn1.users.email`` +- ``.rg1-zn1.users.swift`` +- ``.rg1-zn1.users.uid`` Execute one of the following:: @@ -184,19 +213,19 @@ can name a Ceph Object Gateway instance anything you like. In large clusters with regions and zones, it may help to add region and zone names into your instance name. For example:: - region1-zone1-instance1 + rg1-zn1-instance1 When referring to your instance identifier in the Ceph configuration file, it is prepended with ``client.radosgw.``. For example, an instance named -``region1-zone1-instance1`` will look like this:: +``rg1-zn1-instance1`` will look like this:: - [client.radosgw.region1-zone1-instance1] + [client.radosgw.rg1-zn1-instance1] Similarly, the default data path for an instance named -``region1-zone1-instance1`` is prepended with ``{cluster}-radosgw.``. For +``rg1-zn1-instance1`` is prepended with ``{cluster}-radosgw.``. For example:: - /var/lib/ceph/radosgw/ceph-radosgw.region1-zone1-instance1 + /var/lib/ceph/radosgw/ceph-radosgw.rg1-zn1-instance1 Create a Data Directory @@ -204,7 +233,7 @@ Create a Data Directory Create a data directory on the node where you installed ``radosgw``. :: - sudo mkdir -p /var/lib/ceph/radosgw/ceph-radosgw.region1-zone1-instance1 + sudo mkdir -p /var/lib/ceph/radosgw/ceph-radosgw.rg1-zn1-instance1 Create a Storage Cluster User @@ -217,8 +246,8 @@ Administration`_ for a discussion on adding keyrings and keys. #. Create a keyring for the Ceph Object Gateway. For example:: - sudo ceph-authtool --create-keyring /etc/ceph/ceph.client.radosgw.region1-zone1.keyring - sudo chmod +r /etc/ceph/ceph.client.radosgw.region1-zone1.keyring + sudo ceph-authtool --create-keyring /etc/ceph/ceph.client.radosgw.rg1.keyring + sudo chmod +r /etc/ceph/ceph.client.radosgw.rg1.keyring #. Generate a key so that the Ceph Object Gateway can provide a user name and @@ -226,14 +255,14 @@ Administration`_ for a discussion on adding keyrings and keys. capabilities to the key. See `Configuration Reference - Pools`_ for details on the effect of write permissions for the monitor and creating pools. :: - sudo ceph-authtool /etc/ceph/ceph.client.radosgw.region1-zone1.keyring -n client.radosgw.region1-zone1 --gen-key - sudo ceph-authtool -n client.radosgw.region1-zone1 --cap osd 'allow rwx' --cap mon 'allow rw' /etc/ceph/ceph.client.radosgw.region1-zone1.keyring + sudo ceph-authtool /etc/ceph/ceph.client.radosgw.rg1.keyring -n client.radosgw.rg1-zn1 --gen-key + sudo ceph-authtool -n client.radosgw.rg1-zn1 --cap osd 'allow rwx' --cap mon 'allow rw' /etc/ceph/ceph.client.radosgw.rg1.keyring #. Once you have created a keyring and key to enable the Ceph Object Gateway with access to the Ceph Storage Cluster, add it as an entry to your Ceph Storage Cluster. For example:: - sudo ceph -k /etc/ceph/ceph.client.admin.keyring auth add client.radosgw.region1-zone1 -i /etc/ceph/ceph.client.radosgw.region1-zone1.keyring + sudo ceph -k /etc/ceph/ceph.client.admin.keyring auth add client.radosgw.rg1-zn1 -i /etc/ceph/ceph.client.radosgw.rg1.keyring Create a Gateway Configuration @@ -292,7 +321,7 @@ script, execute the following procedures on the server node. Copy the following into the editor. :: #!/bin/sh - exec /usr/bin/radosgw -c /etc/ceph/ceph.conf -n client.radosgw.region1-zone1 + exec /usr/bin/radosgw -c /etc/ceph/ceph.conf -n client.radosgw.rg1-zn1-instance1 #. Save the file. @@ -311,16 +340,16 @@ client of the Ceph Storage Cluster, so you must place each instance under a instance ID. For example:: - [client.radosgw.region1-zone1-instance1] + [client.radosgw.rg1-zn1-instance1] #Region Info - rgw region = region1 - rgw region root pool = .region1.rgw.root + rgw region = rg1 + rgw region root pool = .rg1.rgw.root #Zone Info - rgw zone = region1-zone1 - rgw zone root pool = .region1-zone1.rgw.root - keyring = /etc/ceph/ceph.client.radosgw.region1-zone1.keyring + rgw zone = rg1-zn1 + rgw zone root pool = .rg1-zn1.rgw.root + keyring = /etc/ceph/ceph.client.radosgw.rg1.keyring #DNS Info for S3 Subdomains rgw dns name = {hostname} From 5bebf1ac1de668b7c37a230971a27b4d24f60b79 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Tue, 1 Oct 2013 13:59:08 -0700 Subject: [PATCH 007/150] doc: Updated diagram. Signed-off-by: John Wilkins --- doc/images/region-zone-sync.png | Bin 89159 -> 84753 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/images/region-zone-sync.png b/doc/images/region-zone-sync.png index 21f694e84d240e5c1129b935ceac2167ea0622c1..4a3885a7e154926b2dcc7cf923b1c535899a4d34 100644 GIT binary patch literal 84753 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 G@jn2{ywW8A literal 89159 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

H zI)SQ;FH9MO^)5bqg7$sW_Bm`NqfCTaY`xmQ@$s1bz%uX(+6RaB@x$zuVw!QgM=FoC zi1+G3_gzqP&L57Ym`Qji=_Vn1Bq8JsSef@5xpT1>ja&AVUk>An+GV_C2hak6&(eAk z#K50$kWs-a3gag$i*W6xL_c&h2k&)yQ+-v3_K8Y`w;xT4)goHzo4&4Ez&eu9LeRc7 z;{LloW(AKml3EiQX4wBKfo>~6e_hXUs{}`KwcKAn_)&LsM@d^?U2X+7H{mL_n zJiBmvzpC9F0`Fq)S13Nrmh9Qvb1t5LnUFqW2+AoT!R4L3h_w3B{E;;;v~RUNF-q&O zN<1^v&3mxvKD|WDcTpK2@XM;p;5kOU>g^Tvh51W*gF+~9Z*xFQs&AeBh%`*464uL#u)2|w-Q z6`CzgN^)c=%QxU4FXwq{!|s}9;Ec!;E<=L%D5St9EvM)GE0^T)bL6V-41(yc)t!F_ge zR{v&AGH@tqW4{b63n53AXPzDACmg&CMN}!z^mtwy6uYHA%4@zU7UIUai(f2|0xOub z5+?b9cQo?k^AD@dTut^2JeFSpQJ4p!sr}8vLHGCOmR}eq8}*{x zayaTx&jC>b- zzxlSla+N`4Bg`+e&1l{p@2N$70NxagNf)pFtUZsiOXiz+vknj`uJ(s+5c7xxm)e8_ z;bNb+S^axQN-&NhVePV?N&c0;d5SHklijTiS-{|IShhK`?9gf&(g_q# z!|Mvlf&?T6XyaA?O0hA?ofH=fDMCTU&bAP8K)gsQcDDVNGNmASH;}zjO!lYh@9N&A z)C$|x1e0F_n&x7L7Jd~kxw+o6X9*I3hM{>ar?=#|K#YG7KN0+JAAF_gb^$?|suZi5 zKB@&8FVLm{fn4D2Lr%@mVopt65hd8+}%(>+pt3>AE+`>%{nODbstq0XtXGsS2+jPjGfh|(#H zMPZ4tC}=@N$uVdE*{I}dR?kF=U3B64Mt34BDBXYWk-URBcd7=1;lJt|48(>}`i0rv zEKZVtMfzlxFz+SHU%grWzZ!MZ9>jZivpry7oM zFKCyT{Ko|ND{Nl>N7!&#QGRD#DpD(s0-@suyyzjrQpuaHZMzNWyeLokyDycQJD9n6nvA_$8A3SDqLIau?*Mi0SXqvz23 ze};`wI*0_Ro7#VOX5I>zLbS3)lM47b8|pzL8UQ_Y3NcXz7RNm$#|KgQ2rzUZCkf~O zgx(IuNTS6|pX42Rw265_!RD|rzt@AP#~v+*J&*@==qCh}W84c;n7F+BpFG5%PMFKd zq=Huox)JA%H_N9WAf#6?GyFe$<|{_A#)Ot6KVJI$BNDSlXJpwmZj#kKm8v_Nl!zSA z_`Nb7>{$rvVKxOoLYy$KZ;&wW90kk6Z~xA_((RV;S4}ZvKvyYQ{&zvL<@%jfUgTZ;XRIkqxrB{wzNot2ZuH-=4qkMh2PRoAoQ`A0;siqgr!6D*<2(j` zgvJStFXQn+ehquBDDEhMg^lH++h-v!B8BezmO6`dH4xvBm=wJ!GxE3P8``|jq8=Rm zk2?o~Zv%|871cxF@cngLW-zV2>l}Dt^uVvk#g(daf2P=V1AOlQzOM*ngaKi$M%neP z@NbGcx%G7attC8-Db}QnzX*UVa|pD+H3SulNn&L=%WxC_&BPVnlHfAJjV8MW(8J=J=T!*f4nhZakSx}_@lI>JG3JX)qvO)Q*yKJ0mdBt zSBxQe{358x0OJH&ee7>p0lu4k>NrCn$cfs!&b*z#@X^=P8lRX<5K{y){iiYi@n7#J z{UWyUf3vvw^Z(5v1Y>xzDv`oK?uX*%K(zm@2>Vne8UT{VKrAzttYF6!T6TFAZb0QT z^MOqTs;~fw8AUha^C3jl=s!MT5=$rvL8BGb0PX#qYL;t*rH`=||Ft%3y>EjunM>jFDHdzsUZQS^SEXzL zdKP1^F?u6F#Z}cA{-3i&h{4Ri9w-L>cCta5V$2qA8_EJqUz=~Eb!4fG$azt{uchLCWzZFzC*Zw7==QjIZO+^Ux-+>P8g4WZP-$zGp6?bByK z>pzd1>!9Fey{f327kgsJFka^z>gG=vo?69Eu<-8SPj%zyg#MDLam~wptiQG$Z|2I| z>gLf|pLRy$%DX=R?nzox$U5tWfW%QdN~j}fR?p9^Ki<9maP(2(`O}8(+lM%}^!xc$ zIGtuM`vnP3uLn#%6$Qp&b#Z*dn!tj5+Qol4s2OCy0^j;;2(!BV84)(1IrDWCT)z9! zzb!f0XqzVJf<(E^kz%gbsI(79;;bFVX$MY!e(8WfG6k12$VCQrDk5JwKMok*auYrz z-2qS-?Y0h~_L?YR9HvrIaP|2>?8ZOWQE=`iEtz$M;*B0Ww;a^T^1t3}Z>^b|dr=nU z+=^35a}ll5#>H;!3ZiqpF}+3A<+Zkr%|*`b<1Qv0THW%=-7+b7VI!94Oz5G_g6Jzq zRq3jv=?NNkbs?a9{E>}(yjDCNk9bJZbzv^O&%o;~!1Ei?%0qJaqx|9ViH%1E@o^3g zvU%0TSZc&y><^Uw5wrIZSs+n}1#q7R~{25{);lV2~H_ z3iNEV2Wb-5m&fmh8L;zBi*j@!9$2$8cR%!H*_}K7a(kb>zSAO6XvFYwcb+L%hHybO z$bh*_&D9e-UqywO)#zCGpXF!YU$jzkyY9eFA8h6K3tA4%n3aigyc2+g!=$ul35L>( z@SD7Xg?XC+mg^siy8<7@?QTu{E#Bc7Q@KMc9NM0P@i!YUSFsK+?RBPl83Y_#$&*gn z;RC}xZr0ZHgG58AZWqpn01Mk}V~DSpou}Gl#grOlS!ao&QU$vQmE5sP&Ag?;$#5-) z=sGXYduJw7gb|BU2ai6cqCW?V-t~OiE+#m)EXNiRzi-?_o<+cwB#7sI){6R8z~Goa z7vcSRnECU2$Uh64hl}qS8JgqYqR0j%6}Zay^A+Vr_$`#r_M`=47*1V|`qvIgyw@%S zI;1R1&$WDme)+p1Hks&N`>zduRZLln@_CdPMt!sz%Th|ZF`<}ye)-SGlE6Vv9q;w5 zr`HFPC3lQ7+u)&J9q&MNZY0FN-#GVsZ|Gio4a1n~d`9<}$_}%5cBg2hF9Z{qhWdE$Z>>*?d%Eh=(>VTiJ7r5lHk12D!BP8Y7j4XX&mc@Hu#*HgyF zhr@2y`A{eBDvsVFQS=dyXWHJmkseW~tbdEo^v2G{Clz^}`MB@Bp$&QsuyQ-wRC6P zLGggD#!_(U{o3_wiScWlu9`yZvO9-`de>5|Jf>tD8QnSZGp!{{8D(w6W1?j61z#iD zip44!q-V<^)^xL-R5F4D82gA%d&>1c?+qdC`ikCA6T)`Px# z9&3fiM0`l(RL3YcEA4UcM`+_s!Md$O#;hX&K7R|c`%g9|IcS~Dab*>5692P(b-k2y zf+wrXaBz6{VP2ODa%Ub@mSs`l+1S)D@3XVUbQz;QHtIV!HwT>yu17uQE9T%(v9b6lLwKN;b1^U-OIv~WKY zhc1Ps-SyA{*%;y?yrt`Kq*aZ=2&3x}Ekr;dahzp_+?hvCCc?za5l2emgkOyay5PSA zl?qJI&OLIv^N5P$>BX)?q2$8FhUDzZE2lQZFZ62b%XO^N79TF_ot@lUpV$P4ZtK6z`)^@P;|C2RU_i7{48uyCF@DP3Tsw3tfq$^p=$TfMxWk)<&ojOFA zXP;4BO<&33l2eURW+d3B7rJ(M@@sIrLX^L8{|}9RpY$tbW&dF3IM;o4E&70Nm1MP= z(|e_cZLJuc;aC5uRVI%WtQ`E~d}ZJ%1x5k?oUK7y{rAW9fR$+e{h^vZU~-r!Da&OT zgDYN-2WnydJfZoKM=e@4^K%C*4jihQl*cxOLk=x`sPtf>!0f|HN>YOx3Ven=T_u^+ z9-`NnaJ63o^SFJdi9t~CxzmsL!AYzyb1vMfYRG3>1e5IBu78w>dK4Pg@Mgg3D!7>P z{@Gc|vV-jtB(L0I)yWnz5UFOWSACAf4y|W&Jm%w>nzTl(;LQdJazUbc# zgGGiOZ<={?f%8H-x?$e-ffFM%H#rQW9!z`}TF2GcvF<;i+lm$sB!7Pk-uJuE-{61% z-%NMC{cFc%qnl_4$<=<(?>nADKeOt6;ZF=RGbtgoig~x--=N>5^4&P@5*1|&x-9*E zb8vq4J6FwbbF$H=X00>#ANQSzbrWMyrGZ~VJjG)R(m;B7qpy60@je zEr%609Bs{hXmKXcuCNfNgVo?0&wQ^LFf0#FohX84YpY=`T%Nwrt+RXi>7((WWYgN3 zS#!%#)7Ivyyn=!>;XBmo=~KTiT?$$*7hA$M6NSH)+hTaptJfpv-)hfL^DViE0we#y z{6QG2dLyN|e8?S6SdM6QE6$!PO>@qYpf%vBY@7l({_~= zEK`YQqTrb-dD|75z?pz_r2e_VI{W2^>T!Ose|YWP%M^CAmC=Z-jdvhc-71+YW4%Uv zcE(17sE@krciEv9vsk~!8i=U(pFzHj{P(>8{Rjng`!fSWNdW;WGBUET6CZ=ReXZBB zj%Hc|hTtR@ndOhh&0^ww9EaVREyWQFpRIFl8P5*P*ug3y{ZM31Cv!K%#Kc(16C}rY z!3T%f4QfE8P2TocB0s-8pt!BygT5?*)y-VOcGh% zOwPZ%Z7t9!n3z1ulTUg^_+$KjRiSn(`$8?rWetu0@-UO^Hj;&fh0pwgeRJ}bPn_Ye z(}biXe5s|KOl0YuwbXkea}*u>h1U(sVWThlDWfOd zLq^TPUMD!{>8j+Q0QzMUU!0Izc+0Et=c!E8oLyCa5LCtbRhg?SDipfS_s)HH4N-?6 z{fl+lKFBC&-LAWS*eW4GSz+Ia+es(XIm|X$ZZnThN{=QAX!FIRe$tcTiqNTeoLWvS z`XN8Xa&>!K<_&Cdgeic*6nR3YQTo|SHu&!C__!F9r%##yS+P(HZOSMJ+Q(8lnCYKu zb}mx-_C5h5pLmz5`_Xg&hON?|Hy`#xZ`t!GwZ9BBgU@x2sS=|XO) zgpquJ`DEGo``rtFv=P?k#4RR^MSu3YNX^eDTah`#WAoEgcZjsxgi7^W zUe@$c(VZ?st_z{(E|@_BT6ojfqiHH1UpPqa_iL46UI zhj%%cciO)y#t!Qp@jXAsy$R6>AF~|B95r#UID9>fzTAd++_T}Y;M#czVxDbg<-Bmd z$CSiwWNx(H5!*4-=tnS^#-FQP@?dMGZV^4V(^5g~Z%zzgzuI>GeIHeS6-W^O^tO9} z8BM2^uoFK5?$vIu&z8e=i?O0-ENyo4No)jp4fE+Cl4=iGC2t%cEH8>1n$bJKio-^& zE{VGXk_R$t8UQu6V~rwIj3*jN5;%2mjEsyh+q1~c#5Uzn&UFVAnzU?d=!;Q+m{2H` zC+dt^7A=9_p3(UNKh`%I_Tj@@o5j@IU6B-bJlb2)WNNPWulKK6X>TibyW6vBaEIT_ z3O+ooSjD?Q9Ugn|)w_0kcU4s(xVU|mZzq+-)RwhbTs@A-5Q2XkR_bkX@f94dxKps@ zV_9;l;&Qwxpj&6vxA`a9?$V7dBg+OAi#*+!i8j0ni;GL`D-}l->ah*9Y7$Pe-E-gm z9b+%*zHe8ygF${!Q%k$MvR5KCymTiE=x&FL!%ef`^*zafRD$+*lCi2KF3gyVcUqi-HOu;T zKKqRi?inV`mA$O_{uVi&>5wt&x^*V^^s+G#{1Pn0}A;Dm2Dy@IvXW-BfCd>s{4cCqjlOzM14Q{R$keD*-P~J;e8WDo?c!Q_sH7; zEJ4(YS({8vz9pNNRmZu`*4ikK{A2{DFQh6D6F-z#uJmhM0P*|tyHub%Cd&-D8}R$P zjw#9;?e7mNeZjv?ulwX)cdK+zV-4X=&Q46rD}R3FmG5JT^ zrqi7q2Mz)5k^W(}DQ+;8w_6igym|5#v#PqSBB`8ouw^)0ChhK^c7yws-=pUswCQb5 zHZ@+N`uKW@}j81fN1o+3_Pdlpfd5P0){uWigU4LM<%h=9>8^$tY%! zK0B|>tI!@5@;{*TIr#-`vLLaUDjwQtL17_31s8|aQce9mhsYIilepeTW*T0UvoZRW z1F+Esgj#8oZ*$AWYz1B0bp=h}qQ~}Ez0h|=&q7?xS*dj2gEoDeG9hb4CX)Lcxf?F( z)FYzQzJ4_0s^97@FlH=haPdoLe)i3Yc(c#Rc7eOL8^~^l0J|x}8s~Llni4uViG1n=-xRPI(rGu6jm6xN z4>5FYS{zBu#b|e!cqEg~SJzK5;?8FQ4@T+e$0A2tvXK_i)|2(v z##f~JbSiG@`|-K#{5C=u+8)X<81q3Sodme`a(u*g(eB!FbzjsV6PDfJG*f zGGBS{L9^(IW@~u5yot$ey}I3h0*oJi?TTF9*!U0|OGbj6u;@y)%54@U9lmF~u#(4L zs7C}IsI@ssYC60i#HrtG7O-GaQEs#C4WKTABUb7L(eG?)rWkt34+(LP&gLpp;&h!P-GP0ut?gheX}nz=*&N@}*sseG{3D zOAQ+Dw;QiI$2VR<-9OK>1_=9R{nMof^EyCd?et)&F`l_qjoC0zY{4 zQKIdnX@&Mye|nqehtGZ>G3k;xk^$jRuW^xyp%;DE*2XaLM9U0lomUVFZNyjVDw6!& zNlg;>t(fJtjVho@ZDRR+&?W$1cIt;!lWkPNJlex{qq@#U$)7sT581=;M<%yLE42Ty z6}&E?K9qVF4R-~&(fsPH|!QUr04d*#Hq z!evxj7B9&ixEyq${#E}zO5enYf#JKx_jXX~oq)W6xO~_8_F@Yy-AQ*AZz6L`owZ}> zWv`B7v&j2>$JjgrGzx>6U@T!jP$H8>wy z)H0EPh% z2&+)NN+f_D9eJlfd3AR;tSpwS#&*)!V?e^ayHn(XFj++SQEcD7L^B{8InWRncEj2@ zxNY{vd=8PHkEDGY3B&lJ$aFc0A}Jj@670>s-#G2dXusr)CR5K9sDD> zU<%s1-F$1jhr}hJBZH&&%sRc&<(2{l6k`m0w43dy)Lf}Yi}YBq@K3e}2h#+>v3zpH zuroH8$BxNlbJy9$+0u@~l@%zFj;X0Iai7(#3=I7k`u-;x(2q@i%O->yZYHwpB%|s4 zuxIgw<6P8!9%IVpcW_o9yOFC0*KV0!UDX}}?khg1*!GnPqLt6@=dBBSf4sSH-_g-= z;ldc0JiEr*p+;v@Y1bCUiwht_`l8e7?(yyTy)OP>(OoL;%OHTcHRd!=EXS6o5juy| z7`8YKWSt#)+hekLF~K@kCPViP#;8bSOQ;&ADy6e1VXNt8w}kin(s_mjs%`|aQOaMe z6}D?R^isa}KwyO5*4JaT_;s|+rQ4AZcmz-r;@3=xUY$;>H(fNJU3y7R`3Ps;+MbcD zu-iKOn~Cpc{dpjD`jQ}BBc|OLT5}`lefUE4eMm`$C`M9BiX^ovgHC2Qdr5OQGUW0d zwx_o@w9ptksmxGzUUx4UI*HH=dOnr2#O=RcEEConEA(Q=OaQUD>cz71OgYp325lG%5s-)){X6Rnpc5$GyMt-g7sa2M>QvyrIPS-9wp} zz2mryBrr84Np`KY5%)F9--|HB?(hc@75g*5_JsUS#GDDpD6*VV8f!W{&8Hvwz`lT4 zlS}3?yTY;dbhaL4#KkMn)JSOVZ{5KfFeT z-c_PG{CPNxg;4?P9O#s3+_1fa12dyJY>AXh0U+a_&Fj8N7xN2^MW0ex-zD0=nSAaA ze_&#AdN^sDvv;)jMe4i~-22D2=%lrfY-|?b|Iv7GvRuuo$5FBaQWX?J&b*u0OaPOS~c`V5gLATX#?(=HeD^R4Sv zM$lz|0XA8D9RhC3jozMufM_acmA;v1jQ)qE!0G7hX8vHhQep(vpXpM8kXv^j0+*Sq zH8Y~1fMBY0-gp;{TfA7Ek{|tG8VT?GHpXtykVJiPk`JhFb91wHqYGUCo%j$k$8hLr zo)nv$oE(dn~;-ug=8{0SGeT<8<*`55jbJnX4 zywvtF1JT=nBK7t{fFgndfi+R2(O3H^1K0)tfoRW>_s(%~twxF~S~S7w!?%DeA3_HO zfZ}?gUGp8FmFQS+BiKWoDt~ZdZwBMT_AFpM{;t$9owK9C27Ymhc)(52x$D}(a=KM2 z!8DHi8`++p(^XZ(rKd+Zxw@XUk5D))G=>XsRmy8-L9S?8IL}qeP>8@~z z8(u3zp;`eRrxiBR?KkD*OiWgafK^`MU2sqsrw&EKSGVWYcf}HXRIjHF*#(x|Osv0s zvkX-7M(h_lEHK|d#Rk9+BD$%^NoH! zD#p*+@3tIzYFJxa`++wLsU-}|Iqkv8)S*z%tK+GS(L5qLk+(~cT&>UKdl6Xy%Kb?k z)>EZ)+p{&M2W!2rAPvr|_>bd1;FCP~ov%b==(8;_YS$vo^yrb*Wbu8aw5Raxy2Zyl zJQNUS^#bKQg=Eg${Cr)mclEx)V+AU*^1bD6I{u7*y917(G}&AFak<~kkaCd5V~Q{C zebjR_%{MG2oy=+QXTC{LJzw#MNd>p(o^cGVu!+$+JlSY{Sn~SqSss%s+lN)IlJhSx z$F{4NE#AlBk&*pJJ~ZOq)mQ#d=xq+YS~GZG;z@U@QQJ_VTFxJ^C>8NzN-zOLnq%u% zgC_TChxydUN~zPxle7I*ew*Q_@Ln8+R?^XV*veqhs|6P zmZKj848N-o^BM2K46~mH;TLOH{6uTNeakbMLV-+l$Frxo{3 zu*~vHa^IdEskTUZ+#mR8kxwuC%PHn8!YfFt}m{Lp`)GowD9oobf2+4 zQ=L{{;TE6MeDLG9$Vt$l9h|@c!*+`@VB4_R^=hMDm*|dU%Mdks>?$ipxuFi0egwVU zUC6K)OdYAQ)dKS%Xs@xID%2{Y9~trB>Ru>_bt7(b-`3TwwUfgHc&3Vlf`S4_qUq!& zu%qA(7X3+0Fv#KhV2&Gd^6mC)Vufk9%Sz|XBrc;NSq48dBa5qxW5sl#5odJo!Z0^AU*3A8=qB)Qqs~5ZpgcU4}x3c?p+|u#v0vh!FH3j z2cQob@JVTVK#f`j7(kfA$Qaf^r9S57{#cOZpZYTTfm&N@>l9OE3qrridA%@IURim) z<#fRmIa#vSpBx(;jMv=KBB!kUtGk;8<}m^Sk|N~%2$Pc_eZXN>d#8&5uG_N$-X~kV z2@rLwiSJZx=nFPbXe;11vV_m2q;T#$R{UZQt0iO<^4xm}l`l1Hkq7B<4)#=5U!NAF zR`caSzwha7=>Y?!avT6=}W zCz_s!3=i#EyA<_HBMtrdjwb&4h6d-Qc5G65F~VmRCLUaoUK^v#%IQKsz!T=`{jWqo z?y!LD5M1<)Z-0h_KY`Ub#ugN?Ec%_&<-Cl}c3S>N&o7nznr{{4$0Xvnt;0 z^PZlmspOscCO+eKtX9;HD3*zd2_XqdmlZ!R*hV`fxJ25D%WUwb&JjK1|S~_jO5%eI> zR@<(xxGbt>(Dhv=;B2^K{WgC(Nl8f@9Go501905qi8t62n|#FO zQ2;ldYxPS5XACO>Eem^|1EY*vjza_~oMAbIjZ)>PX} z+zJFIRgZpoj+?};gY#_pXNdJ=af;vShM~=P;g4Lo_|JTnq=JqMcn_aEiQsCxjJrae zf<&pYLnb`Yi~tG57;M~^0ExQK7YeE-v2MXT5;8s|2fl8M0HTudLRtp+{-7>(y6E}cGI^Q+E zy>Dxi1lcMh-&^mzs$F4n1Kg>7YHDgZEYp>bMaa%^I8Qo^wAi32Nx*jUcZI1e>JWsV ziIMSL1Qpw8TR;FPjF5y$YiK1ZW=!O7JE zAni;>bLBwiC{@)eEd>cgE94YNC+e=6^OB^QcOWE7+~?`A1d5&NiN-_FI9e&FsHnP1 z4Vns#+9ZMq$ks>m6i)r36WO$8k!~HKBq!YjBoAI3Z%%+c{AxQ@8sinzcjs_#&v>EP zi(R)myu6(ISJZuJ(E6|nlrt)?9Y9_Yw{MIUY|C=-iFh5D)wY~PKM<&NJi~3?|3woV z7G{}R`BC$$R7j!5x7(OR>-ofVc6O#(tj*(nx|3mDo-Q$HJ6-<9_n?;rD}mD>wbc*h zfB3y9NZjAoy9( zkzP$r?H)0{!+fLpV&#p`k^vGRIhZ&(V?d+9ndD0S{adv!i38P{6&dG>PkgUkbhlYL z2%lujM+yt4tg8Ega-%!~SGuGCF4Z6~= z&50rqF*4x9x(}qOXMSFwd8i|pE8?*;u(#a7bB{RXfG=&Z*svuP8yDZ{{JUqSR*|(_el@h!ASS@+sRg!5j*0$^wf64Y+Cy4Nrg3zvY@ z45SS)tRx%fcfVi+Wq0X8xCpD}`hkqK{-WdSmY`$6>O;0p@%%BFEL&;Py` zz-w#jyI2T(`L?ijj2x7gkF z!8EUnjRN7ff5<@!GXwZH?@yw*bEgAv*LdqIwVapxSEq~dsi~ zNy|wejy3Tla2aI+X2NaWM~Rgx=r}~c;M$C)pRfXPr zYIhHiho|s3aQz=AWP#D0^M1FK1;{=%?U$^k)Q9^o?(=0o+T0)~nt476Rbs zaRB-<@L1IZgst8Me(M-H)eW2o2s0)xK$?NPPz8l+Gg%DWXq6Z{=Jm~ORhH>EQjnNZ zA-7&Z?o0Rz8H=Z|v$IEm=9dQOuUe&<9O{6p<>(tNB4;!g}_!h%LUwpVt$oLVu0*7~DK)cDE19ZUtZ*>7GwapWu33tBhH}F1x z{v3~hfX`y!9+rF(yBx?}(2*@V!zu7?+`yik-I=Xn1MJ8GZRcmm&^t7m4ZMzZtSr;}XwYQ&BAVtZf(pW`wX2W$AdkvYJ$NT< zvP3h2%aArx^5IfbfXHU<9~NeTL>fWI+9$7bd&;~K2Zfwn-LiQ2c=wKnq=pt?i@kQJ(q9jyJ{SNE}Xe8!<1vzk9mC1Q8Yw8l!aeUn=IMTgi#|8r$a zGgJonbSAIM3ij@gAc7PLKkxi*&>lQjqXn^$=7vChMSx}mMnqiCi0+=%e`nhd*iBPQ zHlIlnOJdg9X-P9##d&I+%7aI2!T9_mJLB_9_vdTLYjp|=GxKIu6f=0AZasf?+nY5% zWgQD&A4{vjqc=y*Ihn(Hef|)&D&8AcvhtK~^vqu}%QkksMR>Pa5YZxxm~-9D032&+ zz-x2gv;KTN4cn3;l2JO8+iseh-gD_)zL(x|;kL(95u}HU)Z5V)qX6j6I~dTvS6Zs8 z`FGl`{o7M&4?(+o3_36nC4z&Cs5#eR=d-;x4sBQN?G;TDeiz*CTiX5y@mc&OHaDFB zk>|Dg{e>`Nq<8GRl}b8y?@`7Syv6Ak@vm4K0wMJZU!>mR%6h;BOSQf0ak{V)pFs28 zPa^%NK2Ia>a%6vP&9uz)Pt6c@-`lDhs!wkdJ0xCg+LfraTTuLxoo#J60pzQ)&(1Rh zU&nl$2}-K<7=BrS}RZVDJny5cN2yu`PpV`s}Wx9ehglctCKo@ydc7%C{pk=FtMYh zAX*{Mk3KsMVPW+Cp8?1m?lkQlEcomKnn8?D`k*t8S>c|54W;R?82E4inlB&#p7=OL zBCAY2v+2iD$Pny!w9H7dePlOD&tVx@7iIu;ny*e^SeLN2D;g}x%Vo0jt*T+qb9izC z&}zN?{lLTc1XyWQZ#;`&FF6G-FYi4*3&k-W5oCjhmxy&JuJKyWr$9cz!wipw-bM6@ zAm}q^`>_E7Zc_$R)t7swvEsi1v2o9SkogCObAu+55C1?jTyp-;4tTX#q{vV$=MI4d z);v`GK5}*fS=Khx+TwFQ#&Ave=<=vQ5)LG)ZR+T^*3y`3^!ad#g#Cl?z4=}Lo4{7XMemRjCEee4?GrG75Eb+l0lrIdJRt4&IiB=iX2dc=95|5hd%?rV3)^b0p{sx zW}~%(!)RpN=WS(I_tSZg!&Qds&n#KK2Zhg0X`6z@8wxpTU))zFv$S4TUO*!)B~9Dg z-^~dHNZ=H6aKN)8Ic+M2yQqx@0GCaD)E@v!;BRhU&DSqtrcb4%{{!>YK_*Fi>}p%) zW}fZ0En@RS6+H2*DLRb7|MT-80;Xry))4B!^qFcE6X&J15%*9VrVuMZ_`@g*@_KnE69d@Sa_Qi z8U6N`?eF_;B5ES8PF}!4a%j48r}x?7;pOE^dyi^t6tOwkveqp$L&eYm3$vCmiNSO4 zIlb@R^T$f*(<`)1@5S#ECzZHCSt&)bJ18=;EcCQ=`-THf_~-*JoyC$Sj?m1>`aglP z{kDgC9^CgV(1V(DZB&8NdjFik_ZoG1Ivfx)*_e0e7J5WvS!Lh!{Go(*zOydv%}^$nE+Hbj%r{#v>E!{l_WAFKS+5wDw5#}c^UJa=c5ecgT#1NtKnYyvF|3=G3Sr}P{S zi%(TA0^-^M*V2D(O8&TA7?B=i4`Vl~9q>}=6o>z@oH3EOGj-Em-gdBVw?3$8w>7O| z^;b>(ke0p|a{vmqNKRn~Ti+Dr4_;wB109o`lX22KNv=DJ1R+Hm2qje&yGT|fIT*3bbT?^ zlQqp#PnNB#hjgKsfjpvlv1U%8Lu)^;9KxRE_(_ud-h;|*g#@T8M;<;T@4`zg)2_dA zCHtEms2+e441kj@_gUPZ38VK8M`}k-V9gX% zLj!MT5lixXLj~f$#e>D!yeHLqeYGol)U4ZawLA;XoPS{!7Vi74#-Bo)#(rLe2q)~p z`{!*_tNS_`P7O85hQ6Pe6_QkqjD}6Sy09=x3m8dzJxsAqAhGub_=d}YKlv+`VHg8z z-NJH!S4sk-#r~qHv^1uuw7GKQ9+~)&>X_B#(0kh^0?~yk*GG?DbKjd=-S_l4afjj*cXzkq?(Xiop|}<+?(Xgs*R%S5=iK`Po<&G9ld)uynWWaQF4=f3S3gsU zexklod$hjQwV0@xVTY&XxoKzf9Q}J$lMmzr{pdkML6siYB|Ma*R2hL(*-4_3NTSl~ zYBxQ_a_az6b%H{k*oc@BJY_`F&_;t-r}fl)6;pmkBa5FP`ZskcoxH@>X(bCkCHe)> z_@CuPjNYa-sVe7R-KZEEL0j&C%ifk05WR;|Dn~5cg)FX(RD_jMC zVqo;lw`xWt?iej6o5$e+c->CTGig3R`*Rh|!b+97OO_GqYh(ik9e&Vbuk zxv=8U#CDq)b87gOTYn-0<5*}aON&CS-MhM}i-h<3J*mmLsF@Nr#Eh{-Nm&y%^sFI} zL$~+2F?~x_$RT+`ePur6#lKsKQ`yxY;Di$WU_B$&uh!7eMNRdgsgOqr%4@0QiROlm ziAQMvbD?)Y3ygzQq7VR-2ueqG)B&{UH}s&n);!B%>CwnAs}ivpR!i&Vz;Krq zT^|Qph-x*PZK1(@PE=B-D`Ive*#uRy3iq zP8wGP$U&_=d~>2<*$N;9Bj7Vupj#T+A?4&GLptaA#Cfx-n3km#olq<6xRlk9$GG`B z*TA{Bk@{-&k@U?)m9I9Xd2bZCT=mPYIsjZGJ75%8egGR$zaMe{1(~3PB;&Qx+&Wjv z!TQQw+VZtBV9Y1KWr(bBKMiS>+z9d1l8e*br6o_RH(!pA>r){IbZ2N_E*WY0>2R8)H6YD1Kac_pj zi%_(XXvnLM%3xL$T*Rp~$k@g}67s&p(4d$4)KxJzHe zGnX5yECw<4c(4iKzO*l~N3)wpC%W_kBY;?ZlTlB@L8)5$Ws zw!xFv6d~s^4vY@XMw=H>D+o@7=S6F|iy&)x6{#_GsVJo=u(?K=&c3|?z0$lb=1p4+WdSJKqBm^~Wwyx<0kW`p--+u-Fz3dg zEIt3lKemNWdn5-~+QYxKc9fZlnMZ}@ij}WzER#^y%Va8bgRH%OlOcTM?O>hPW@KN) z!posq##U8rz{0hTyOFDu2x+SmpIrtS*DV4@wqAQ9TCmtF3=}Ixu~Q4IONwOj>RY{hH`nSOc`; zTVs~#8bA#N*wPpumYHI>VT!z`Hx9A3Q}X@8Yv9YpxW*2 zCk;~DXbW8IMNmDlfdga9)<^TTtpQ+P7=)c%@@W!}3onjn^67`Ksx$Wxs;Gc4a0~8~ zC15qt+{Uc|s;E?@6(zR9;TK}RCMp5slf(EGKIBvKmQ2!3c>m+g*prR6MTh1fztWwS zoj8U@J~1iKxJdGE5(-fXvIR6w!CP1rd*e}Pxf|mJggyid^i(r_)#$70oN=fXtb3N> zhy}#z61>k5hpPg@LO^;MwtKEaV!m?XJeM34&ZLogPK)!J^?2?k8qBofv66y%{wxIF zx{rYdH!VZ;&$LGG8YqMLDLxGtnoU8%T&kU>UPZZaRhGmjO z9aths^PErzq@eLi-Kpk3(SXX0nDi`RVz~dCM`!;tph!|WqC1;{G(w|_$tA{_&{_ zL%40+ntR9vV;y!mOBgWMMqx^hLStXc_^#X>#WcM47L{@ny!<>3n|H`%5Wr@!9MFw0 zj2A-sK2EY%Ccu(n_0JG4QLfU)MyHn(eZe!zd|lZ79w0YQ;o# zq5n4w6ydTHg=1|6_wA@rF%1E8RuOD+YdtMvV%SXF9(UPV-Y04wpExE=x2BO4TxoUkk_)g(&7^YlmAdm0W|E=4J>WN6|WUZ~D+=aqQd5DOM z4fE9cC3FQ^ZI=VMgmgcDmNB=BDDzg4{^bq0h;-o>6Z8^wZ$>vS$=E*~bPy~1WwV(R zGMKRgXU60#fcUIR$x3j;n|7Me5|fk^JSYV%4v|7vb)l3$>Y}cCCTf)ROw?NF9@VHN zSHEg)qmdP>))H@ovEOJgPUTUExlWyE^npcFs(6?#}Fk~{nSS-wQV52gQP ztH0jE;ndm=b7A^xt<0ot?ifl zs=(_YWeR3-TWPHmwxwUyLdM)tj*L`)8F#mI{72U06b2-4rt%OWD<)RT`MR9L+P5mmnaXL(U#xsgl?W+7m? zY3J1KpE|H8l@8!u+R&FiUeeo9veBa86;u~Za_eMBiMt0w zi709tgmv~|(lOLjF2mMKhP4-N?(DO*v>+C-+dyYVmVMpNn|&1Wg3%6EJ*7`MeK!b78JqRn0*Y`4W6rIc8pVy$yZQ7HB+lqDxa=BFe>Mpj#?H^9AYDNnAX;Px zV+0(V7C2a`SV$`)U2xhEuO|#+2ixkmp5 zTs;*{9q&csCN(z}@MbL37C{I2C@TJGfQ8D{znziVTP_XS|GL5;&xOOsYM~UIP;wR@ zj4)Aq}>$kjLWZ|ri4 zoduM&eF1Z%1AmWG)3{bq7E5d_{Q-Zb=;x?)i*_Fb)9x39B?@kr$nQ?pQjnMxx}pyX z;ONzfLZV#bfDxGAT6R_HSA8as%b(HOC%wq4w0vs2|E3Dy4XX3(=+LGT|-f$I?<|mlVp@YRBP$Q z5%8VK9s*Y~{X^|A#tV!T;n`?!W?0lC(yQ~j#P@Mu0YxLtPYf>ZiOa|SoczaTH^*o&t>!d+aWVYG|akUVehTH;PCQGRo&C;n(3F1-tE_aVyC_$r%WK`(=FO{eC*6=11tgWP=b`hK}$9 z|D-4lt!CHlKJYG}I_qG&qTnUMYby#)+8YpJ_BeL#z~K&BPhFWA22=&9gWd8Y=|I#~ zc=#EPzXLK@t9Gcst;t;jBm`_D1hNTiaRD0%2wJHnKk}Jwnkm|Zhpf_uqu)gIv{ILu zp(m63B1CWZPeak&q8Go2)z~MuQcWqfpcco~uBU zOp-0I$#8o{Jahkt$xOygjDQzN;ow2#N$Ic)+`PfEPplQM*E{m>qf2D~n%f2I;cki@eeQ ziv{SG^BV9WyBJqM_OuG1k?zT*QN=0o4l{g0*bKg8pkz<$L zte!}8ns>^)Dg3)!_=3KfBk8(X@|R3T3a0tEf+@?C;uG!Lgs(q&egQi;!c2%EtM%z- zCk{N{CGc+9GGV5edyYckWa%Y5X-x*Tj(NjKRl&}#12$1NW|KEn3-MD)=iIqj1Lmy) zS$tul9kSH1h%%S7)v}G1WV7dYDGaluOw-MB(sF^xyW^g?RfZ9gSA@ixu5Qi;zv&miPnj^mXXt|UG~>PV~DGKlP+;_izyP8p3XxTu`|ItYV9xm#X|+s8O$YyUp$As z2?sNmL_B9KJ2Q7uSUC;H2QN}{T#UwYpxS;xFEW@b>9uN_!oD9KYGI7OHE-dgmieHe*5`MPWhLFfi%^AZSXh4fkOysjGasI2)l7#t3%Dk zv@P~=NvF_ZE#*vMq2I-nG2iR(1%DDL3a@arPmy!1>6l(YCy0ilF3(;P{sSSxLoHJx4_+5mBuOp$2WHrLUv3)k_?Wk$KLzUh?oym z5@;rW(nP!rpo&Jj^aqQh7AZ2;ftaWDfd)zk62h>7jqi{F;OGbF_lBPrpRHcLd)&FG zjqtVD3hMd1u;S_Rhrr4U?l?Ik?t(~q7wHn{R_c=mY`a9HG&x&~O4!cAN3Yznw2Zd? zeu|wckx$6-c^dx;wYQi1bGOkZlhcx#|MO>bjO6xv(l!oTF;RR0dniMioS4wdm<8Pf zJ8Pz%ClBiJRN?bn|E(?r)}@6w>&VMIBA*gd; zuJt#5Pecn@Yip*0ao&_3!@=5{j{EOj9_%86Q6ezRZF?r=uQ*<gEawu?+t378^e2Q4kyL6@1_A4?R1_`Gure0DE`y?G>iUJWd{USjd$H(etx|g(H%W9Dx=s&3A z0~z11o}j4Za>Sc&oFFWqAUUeF2NIW3uI~qPx{2`MY2l&>dxj(v7L_zdQpmhTm89s` zJa3Jbany5Hm$-2GUQu2{K!!K&2T-+#O$z`ifRhoYlc~VJrehxgfoYs)^m(?1Y8$B) z;V>-8oCpoWngWl7)U=Cxdz19E@=)t}&~>g3josmUHpKFVhKhdZTS?`!*d2`#D3;e1 zj8|56|NF_eK+D4w5Z?nJput3qOu%hV74>{2WPxaKleGY!!-g0l1dU{ONy2v!wDGH8 zSnmD0tBV={PIydo$mvFoRU$vQbL(KY;Un+uVT~6#I>(i5ZKy^ zw}16T>w^O*vd_}2@Ro2L!Ng7Ed^2``(DDz01qL`VSxH$(cCXq2E{a5Aaz5xQ2m2iR z>0)D8zfBp8^_YK$r{p&&li5VNN{#x&GW7{_3SRCG_z&Z0{rgQtMn=YQ{B8*Ag+>8j zlcD~wcI_8@JV24Ozd}Xmx<^44NKCnQL!2TA78?AW$Hp1f4HR$WeW<@`p;#ym0E>%0 zY!}3o2|A>n6LfU%49xd#E%&KBF_bcHM1A@clUt?H_96`zLnN=iAm?JWF0}#qnqd^u zxOuXXbDoy=;F?rte5Uz(B6X{h{^07f+bS10x!Q0RR(VlVGn|IPpTcl(x=JD@bTJtd zIZU+y2`dWHw~%-}@cCYu3@PpqPRJPqBIa|OM0`RcHF)b<1$FC@J?g>5kPUA2N#L_M zVDA*m?(Hn-nvOo*?g9~l{`{WkMYONm$iZ1`Ws-M|6$i2D+2i9NBKNI(-`$h@wb7A* z984>O&-Xc9lC^pM>TeHRYiw-XwWgowj@Hsx{}Pg43wLpfOWRSViCV}RUYEuJ(NTRQV|Iq1I;OA9x&%i1`wqFq!9tHV@g6t1 z=XOjLxV}=4$z$4XuY3WT%B@ZW1g{Qt?e>YbYf|1UZkbj%Wb(Aw`4ss5Sa=IJoo;-x z&tu~ggI(4{M4d0;b2;AQjGQ0v=st?uj_YH8ZjV;>xOqlvRhETaGd5&%a3~dY29FT_&$UNl-&XnAFE6t|xqXix5U^A%{rVng28}{}5_VzH=8Tu?i7A9J1 zUc{gt@-TDrKd3Fm^$h@1GqEK+>>8CblpiL|rHIwE|Bgl6 zA^2i}trp~w)96SxxQ|w`RcPi|)bwpF6P&#Bc_fN6zUrq9zvnbVGZ_$?kaaSjz;6H} zxz@^hRX>XFqmT6NcJ9vneqdYY*aznj3^D|gAPWmi8k(F)t`HGr>zk|_jw)~fYwdrt z-l1_nEghN0ja7urJ8w(=fwxUEpk@wB6gnB1#&fb$e%Z2wxfP59|@zdWay;h;u1vGw)!f8`~uX4xgQZG_uw<)WnYLDu;j!@eh+vF?8E;$ z7)8;bM{1eEYC%uDgFs?7;C^>Fe)zvHFtf;8{_J&O+ zl{>+wFGOsY2O`MHil;ql!@iK)1)_CrmaRxqMw0piCtkb#>1t!xs$u~;#=Q3x4*dQ3 zkM6~~AkorgRq?M5pFPVhze&oQE`Y6XhDR+awD?FH=V#~O!=yuP?PYAe_?&y-#AP$2 z?rQU_^t47CyWZFr)}8UzA0BG;pxKCu^Wr#4s4PP##|W^;qMIz2)OBFHYljo2&abR7 z<{5SWB+peq;(J~(5^9$e30t<8mEDYt?Tw-d7OHn?i?_xd#6iPM2uL+Yq8wXVrt#R40;u5fzv4}Q{%pqO5cIY)C~?a31+(Jb zM8T=QrU>^35Wa?_z)a8E2nw~d7*IWcT}|64X__3ZU`%)y%AYZ&zN z-Di(^MvwaoG(S%6Fs2H1-g-Rd{(8oMTadP0AE-1)6iz<-kLjnbKfLm9Y5F3ux=Y?i zY+hWvoHho3uZ=%COBVpB{{E9r5O;!6fY?xrHEe#P$<$#k14SzqV^tFDG83+PT2=jf z{_A+{R%Ghuw5ABW29K+f!uxYsFD1+jwMwY&E^ppjknkX#ec+hL^L;~2dHim6$KhI+ zpw>dAaepEmgcXAhU_O*HyBV3YA$NXb5mz`BG4@{ zl?s)Y%ad?HJ<{;jxO^^>H4Z8;m7yuq;=~nr{P+t9*0g#2jH#rw*y2EiShn`P%Zj_h z!9i7o{QX_i;Gj6Op<##;Y6Eb^*mJA0; zXxi52a~a1wd`MkHphxO!+jR*WCmlD1#)n5g%uWhIzG zEgK^+9?71My)s`Tf$a761SJY%9g^xYBWo5Df-z%S`!Ik^&X*Kv??Qk|aUVw?I}bUBvVLx~E|RDmHCpV)(L^DgsBVncbR* z)mc-SlDw2%7ejm^b6B0sYv^r6in;CYICa_u{}oKg$q84Z>!*KG4s=Qb7-GZ}Uhrq* z_1pIQn;EBzwG3~6r17qOLaR}Or3~9?1-%d@+`M48>8HD>A$Hcld6cM9LsMAbU^T45 z64eXb=y35sd*r0%c;;70BYv>wQ?bL}hH8w1)7;f!e2*0pkY`rmFdw&jYqyhoYI|UE z`)JtcY##Lz&}->`Ml~SDkY6SJq3s3dzN6jv{#~?BIP6Q_6C7g={HUXo4?rLUc9;yP zhHvq>7kkHV8l3lMJI`AEXr$t5)*H9at}bw$B-Z?tl6`R>2A33SJ5fikH^U+#Qb`XU zJs8Q-vpsZ^CrtS^8ZyDsgjT%Mt@xp9=EDKY92_{X2F|)OcFJTwF*8fi4+h}Oe5ywR zf?$pd?A}1Ens#*GRH{u?%*TSax2Hs1=D3xo_00;Sge~JLw%8j#s?~TX5M_kJt>crx zV9RA<+;V_Sj4MO2X6v;2ETP^G^`!_=q8dA=(?vVir#I0Hnu{%Jo9fDFH&w$Ivz|YA zeK~CS*tarlSBw(L?>Hw~61<>KtlOu!Olv+lYl#&l9{8Qf+-ws3uLTZH;JL`6;w`mM z1QN)_O0y#Mqta}x7|U%NoY}xuR7Ev-cIyNG@t-jQoOVx(Cl>Ng%NCi6l}Ntg9rO4Z z;e5K%J7t%q@kuz=s;$_dWti8gTw#O1>6R>a*iLn&5C$mXG}5S%EQ|%3a5;3|}K?nW-2+T0cIvGL)a{DX%&kj`1Smh8<(>ujAmG56jn6WuT!sa}5ggI7RZZ?Txl0r)bCbj`X#69Z!P_DMA$K85RzVN zK3HW%9F!XF_Qp|xMXFXP%H98r4;sFRyRhRyGlQr^bfKmJX-Q5b)T-#ifDSez1eZA(R zjLui63z@b|{%cy64_9+@cWkb2dtUIpFCLQsC) zF}59dBOxt!BZu^+2n^Xs@0yC`Gw^1(c1I@@nl%%zPm5XZ(B4cO;mN}}?}o2I@*5ij zBxiCY$Q}I4JelT<@8`a>1M6ld_LLu?8}yznR~Z)8IP%I}b4bUUHC%?WAA17k`qY@v zL?t_vKa{o6<#G^rO>3&}NmOv6sxNye)4knvFZR3>SbL+?^~kGPrO`|2iq4{u5et@n zTz={&%(5?PVh(+}8X4%P5$=avE-LW@Y(_Jag#$lseMQUGw z#bqeIl-`6TlaiHf^j^d;xOzkP+AYrB1!Niz{~JxSeWz@Y?8|s{9@Yo6XrdSXpf>-{ z#%0J+4VGLwZxfq6w`fsB4h`KCezyk0*gL0$t)HvL`&LxzPEJPis{$$R5a#ACqQR(e zA`*ODK6Y2l=g+>N7{H(I3rwW7Lw(3IK!@`J2-}iiNqQIZw`i{`q2z348xAWEi z>wuPy+2g}94?YS_0OB~x523Hl&cCZsbh1+&-2NgXb>Uf)pwvnD2yd-T&G+bYVaV8- zaLpuQ=n(h7$Ti z5=d{&fr{C-w6wI4d}l9_lJ0*9MZx_cz7J-W2XL8iYV12dKK@ZwR`!X8np%8d3-t5r zsi4y#k_>e*!Ffby9w&ZwjzpFfumw#%=-{^4INO z2J6INNeuVfb<}&{Kqv5Lv^?im%xUR zkrBFKI=be5_YOsS7f2Y30%xl}x|wPn)w3nGPgJb-)q^`>0CwbdT$+O%P9T8$uR2;p zQ0(jtm{{Ak5LXs!PaRt7>J#DYMKS`WP{5T)g?cV}s3g@zlnMhqfgy_xwt^6AGp$n} zI(UJ|`){(6d7he_YSp@fzpYmeljD0~59BGC*qi1IL-7X-k*`Iyi0I49ZDeKTS}}vb zrxqJ;&{i87zaLmXXmpt)_l2PJl9d)#cV=f9w{bfZqC)7Iz)4Dm^$)lYA7zMr1u_G@ z!HN8y_i?GQ-IYhmp)oPGxA@D8Nj-UEn}06uX$EONVgvWNm}YdZ*kSfV|1~Qp%mWe# z)g3I3W7_TQ`J;3Qc-UBHy0U%my+!=vUjm-b`CPP|ot-&rihKwTZcWUq%q!+d1^%p% zG3Hw}=QtB_C<3vwrqW%z6{?m5f+pBY8Uh|p7vqKYhTnggkc5RHdbRE%H_o@e4;zf< ze92CmDUOX#oZV-Yp{}-!dtdAQ>({l5x61jxXsxQM>b>2b?c2b}(9vy_emAhzG*=RB7DMMbD&~`cNIti} zYiQ}qU=m({%2*W(RhCbu4ZglfoExuxF@k#2#a>m`qLFnjtjGRcjZLfqtaTq*DSV7P zHy+EIieSpiH5ccmKdEijn3=2pyMXICT8HWMxXe^JsC#1(hUXm^Rm~7v?gs^T)wyoYK23yoni$e2sigH03p; zv+?r8{viZJIv=MKhA=ZO7$O!SC?U$_wTqw|6LNEIe!A9%_OrKuk9KcS)y73nK_NG)k5{JwSRf{OJPu9g=nFU z7M)I4*l~yFaE>oO18`X5PSXizz3YY#-2UwcY^1t|_DrJcUznrEL)9q3 zcVPq}>Wr`P)AP3h9w%kndf@N&V;A>=3zO(xG|b}}E7d4Ww9;`i&1ia+-(@d!f%j3I zfD`|oiygj_owSx za(rgI4`t8N;g*O-T`M-mkF%#J8Dh@#X;8+c8)G6YY0OV+UVeeJcdhS6Ld1N z!Dlii>H>8%>S&U+b5<0cK-;&`E~EVR_o!UHd{038?rnC!=jLmeo$8kp8{gz)zMT(M zCn^~|dNf!cFpCBmGpIQL2wopef8sXnU8HVP+Fl$Csw;Rf7_c}dB2++He>YIGiaeET+c7!`tYsrj8^TBSID=2i`ru@Oof{z{}(e+b!%@i^&`7 zd#l{P?|S!Ud9U`ARyd}{2A(2%0`kI-87eB2zvfNyCmT2M;-rPLI88#Ve?R0CSFfZi zQujbZog+2bNv@KG)G#EF)ofO|I}_~ge1$(uN$~#KlO}oTLX!P(TT^j;LGL9(H?BI3H9)q?VU|Q!#$33+|yhuM_y9S;Iwor6ycFm z2iPER1@ZsS!AqJPk zw4#IUvyXy?4*S^2ZT3dCV|?~H2_$ti(ZKOE=;nASkN__;#CpZ6(+f7O!{di#6w}v< z?4w0ZHiJd-yVEs!V`tDmUPy+8F=eL=8U!>j2X9-_I^bPhv7uIba>xW*ViE@MvO55?f~gkp%mL$>&P zW9|$_T0QZyv!}6s2+nIV*=|vUh$LXGl$7&yp(;M+n~hB{Ay&s=#f3KA#rQ=>M513M7;osvETnS1Bj?loGaKV* zxEzNZ-6t0_PnBqEF4ZTOMv>q51FrHa0y# zIr9JcD>B^e-T45tP)UI>Fce&0nEt<>sJn7mdLm<3`=Nk^^*?7mICZz;Kb*+_L;P#^ z!T%spwoYsM2>w~`nQ1%-@1hG3CC?f&N z671nh<{%RMWQF)y2valk6dt7Y5iVgTkq`Bhv~S#jK1nAV3R?~vDwKFmQ3b2T}?OINwkB!%;*NAADEMCYuVcz zek$aLopR8GDFrfv_M(Z;Jg78KvheFp?>329o1MS;-2 z=aU0EH7*vfR(7C>7SWK9){=72bKNPeYBrI^m9Q?mYP+|aOZ`!hN6;R+uDboJ0DS})jK zfQH@xEUrxoOKvRNI8PEsSkMGpsJPWgE8HlSf*d^7lU;b z>pDKnU)K7 zYSd^@@3wtFzmqziZNttNYUK2IOdDJAT41CrX)Wl%Y$GJyzB^un@Lc{v8DML=v}DK* zSVkC+>FMP1!^LFAXnDS-Z&HBV$ib@tgCgNNtI%g@3<(vjT=Q7yKx|%jwza_D6C@t~ z%Ub2wsCCiGc{|^BE{jm`LMHx9Y}oX#*1|gQYp0+}0%qbqlV$XRM11MsU-?eHH%Qj< zwheKG-|0l>zWiTnw#e&)4d8zSQ=P%Z13nQqxlI_|R6i2mjqr^#oR4`wrED&$wLDnj z8xythv@MdFJZ_+*Yyw0t8uOGx$qKg{@5+Q&#bn+Bs5Oy2e|mJ1ajD*C5*QnYVx<^;YN@ zP;f1#A|BNgv(n;+)0++mB@1fQE*IgI>ms#iYDZEb|aobUR`Ey?6S^ zdO*V3`7^IUC4XSKz&Ol4MB+=pzK&@;00}^?Vzs9$xFN!A^VkmYpM3@_f|+g0E)hzU z=<=2hd^?`_+DMrB>*n8>%|kfxOrcKgu4Y(90K<8iZ8yT1 z`FY3Qib4B@GO|8OCrjrBt>NW=BRT=>OD{Lqtle>tBl87U=74waS3n6vOmLJ%K87~- zwPCt3MP7eGDzNg~1L(%ZuG?2vWyi`CS>FRFct0Q)Xj*p3dJ0@)I>V!rj|f^9#cel_ zw!Kt>0OUKsSgvoy+p>HCkXi_7Xt!%YFulXiq{0Vf#pL~?Z?8_X889S@$_|AfPA-N% zjr2vJ6Vu!sSn3dIfm%Xkdc#l%Kv&rw-%mSS6N&fIF5asqxyNsuQZo~w5hVR2DefU{wMuipEZ1DB|)w1b#_Q9tL zJ^^8(tRX!u)gM5iD(`u`wmKPUd54yQ?2Z+F_jjB@8nc4{`sgu;@5%#L_t4)|?7g5M zyN7kprF)~FFL?dh+0}8tHY;yOB=;NYO;Afi_hmGh1}eNqmM7pd&eN9nPK)5}*puVF zJ_(3+wW^*9t4tjfa?oZLy#;z>9YJ@-9KIU>*%*TFdsN-QBb1-1unQW3s);0jyH>Nc z?NY1t^KW`7w+b!}2pJW3uK+jzSf@SE_nge~rHZ|kAAm2R%c}2&psFMAq!D;SVPLCG zaVZ+*p8E}=?9cmy^Y$~7V9W_+9%iI(#$!j% z$38D7-v-%V$&LZd2x=$PWu7#&D&@GDlmtVvpa-8_DBeFCH zV^-}~#KSS)iE@u4Vidb8_!53CJzuhYjNFDMcQ~ke&w#o`8=_HR6o)A7auIy$@3JI) zo_MQ-i@ZdERa}-!=q-gf=DCQbxicdXbQwHL2~B)p^wT`LbX!is6$qipkufKEcQOzN ztMCQ1;OsSbLz+Ew)&7L(3us{E3+16`Z~8;?6MS|>%jMh4%l!g2)v|PC*G9)q*dPN5 zQ7mDy!yzjp;&PaE$1O7LRKFxT##P~fZ(oAET6<__#~v=4VcuJK{tq>;xX`R>3E!&> zsX;iu!vmXVgn`hJ;S5TuYrelC7ltt)GlCo;g|99>&!bv4KLkAXid_8-U_OW*`oB5f zOm3=^XJ1-e8I=0KcX<`<4;&(jD*Wlx$tg0ZW02z;tjBr@SAC~=I;M7x5#-bwB^J0z z!3G?HSSOwh%<<)i(4k4y6>*xx5CNYXFAu95WOOlH2+{D7{JKZs&JM%o^*Xv}!=qQv z^L)%OERtZ+1oKqAhC5F?Pv^mmsjVZAr=cxdzk?IG$cwv|Y{8RE8sR(x29;F8jM8Vp z4S}=c$Lu5I^)f9Rdriihgj{mpf=SMK zL2#lDyvcI)*Xx|Ft%K~o85Hb(d9m$o22(gLtf8Nw?!d_x>3iPL(8xmJYHOt2?Wkj5ao~Io$ ze^Mgh{RAK>U&vFSKK8=H@UtVv{UD!zD*r4n;|Sw*@Y(N2BpF`@EZb+4&JK|U z7NZ_Z#u-7M&8JmoPC`O7OOMBUmaYe=pz*zLwy#i;nR;a^n8_hzP%|4Lr|b)qu8&E< zQ6QBiKnx_XfB0;1r|Np*yc{=u^R;2nSBn-c#pb~r<}IiG9oKO*Gn8d(1#fsaDg2$( z6FYzO=gpd4@aBT9&e-GZ4uj4L_#Xe^4#5;ZoS|>~l|kgvjl!dSj)2H-@fWdB(mHRS z(D%-Ki;JvW5__Nc%6ZohmEScwF4nAqC)e{ly&QD1pLVNX@Pp<#5JvBL2S-f2iBfhqVwy9%9U&Z(^G_^%TFZ;S_dL3bUC!-*51uDd3F=QA3h}?2&;2 zsQ<&(TSmpvbb-1!!QI{62X}Y(!QF#fa2wnuI01sY48g-daCb@236en25FjDR?Y!SP z_x`zS^;$F4T~%GxyZqU^Dn^bTf5CMs_BHVP&*`J0NILkx+b`mUiU|beau97RaY`*#E^0#CVtn;SK@( z{O5E5Il?sm_aZs5YW=js8nq3|7#~Xc$fo~%u*)}sfItca*a$IN(f^V&A@|>%SZc?i ze*s;vnIZrGNu}&OVEHcxa`dIkdG#y*CqIDe&p+2O9gvi@#EW%u+@jzAk~J6ef0CR8 z)BP{v4}41hZ^{_3tpAr_;6vf4gPH!nh?5Rkh7vGPMia>dfBpNQMachqY(ACqU(Sg& z@>r0IuKsU^>!kao2UQ8p2WiwPZmgL<5&OW#%IBIS@fU4PK~^L!i;z$Jt8Au^1635% zNv5jjcR1y-QSWKg;cAQyy%`C$K4DW<*PrN|4av2fa5nuqKr$pgBvKCpK1gti1)rAa zA{g7(Qq;xY&YT%O8KRa=)ApnJGGQ?P_r+-p6BrN==*PL5zH<3Em2ifv3s?4q}b?`eH7UDExp%C|ozdo`bs!joasj*P8cMD9v zM8Qv|$U`~*Ze!-;i$Af{!-XTZzcGIg*wfik-_i58y;Mq`o|Mp6m!jRY z)S(1$W||82CSo)c7i;0Zv^1(SHfeIQ+IV^AbC3Pds^8JRul0x_QAeYz)dAG5W;gt3 zUr3yGQG2|p3eZ)e`PP$r_f-utrg^Aj+}(OBzU0b~T@e4(RxKYbrD{o-Y*Mp&Wju!T z61;(uQpK!KLX1F3{3E_PB*K0Izoo6&Q(U0O2rDGa5BExYk)rC})Z?RWniaO9en==N zP0{}+n;MrQd^UBViM+V#`uUnTL-}48Oe>W7afiwg%Kmxr{7Z~4Hp}<0S!5HTR=3+( zcSHn5MBVQh_JS?@al4n@4%LfR3aO)t(u!(6KZjthCK)@R>8}?|6V|rjB5O2ZkJjOX0U{^etdqV?^UCTBGj6)3~llhvz$n2#6mlhR69G*HkR3=Cd;sT`XUBAKiYhomIg31hK6bVvfATBQ#3-4Gyg(Po?$S*ki zoh7rRpbAdEP2#tnyH9*47-%gYs$wVNl_1%rxApa-)rq{Q?;K)}J< zo16l9Y7C{*`4LvdrwmADHgL{gV3t=7>c&{Z#C*{;9L=|`54I0Vglf0P(iZC0(fO4f zbKlqjKe&tI*+;V#rm^rtTZ-=U>jJvMbcPm%)b{U2_DcN32{u16?LZB(pa$4W*fB%J zQJ5_|rmUn))z@I_45ydq8w*$59B$G+j`(gQ?}z-F@B5c7+Bw}jh!dhDnRoM7Mp-M+ zd5M^o!H-ea_&2{V5f!_6vDcyte3!V{S;cAbey9bHbo&@9(zs4Z#<61-YPj5lT-7sx zH-%B<3~#?k5u;+Wtvs%e^fG`e+;PfWJ=M~J6`=fYxXlkec=4VNY$>$8Pt=%W%8}X} zzC2vtKqRy!5Zbw@Xh$XUhp|Gk{Pc)*m@Xb(7-;Ot_`|)@iA*An!5~$*syPKkt z_=CUxp^j*N0v^o_8-c-w2cH z+B27r7%`$I7AY^;sSZq{3RNpKDX7?Eq)iYNYSbPImfV7^O+&r=Z+F1iFjs1a8)o1& zQl$QWgueH~^ql_mj@}U>epj_GOkyL@snd6W(u4j|7@&DzR3#0oVG|`YJFikadTtPH z+L?2%9ib9LWV25YsVfPIKYE&g#J;%(HC_AU7D5bByv#l1OJv4)OBWc8544RV@o<8g zcv}dP30j-izplA#(PXlwmg{eP4fyEWkRg>GA(ZM6pjoj=*+x_nz5{FvSH_9Es5hKk zYIQDisNI%_&3EwI$G5cWHq`4jbg5yPJjGG`qKqTM-$bS@^Kq#74y2OfMqO+{9i}y- zNYJQiTs`I=8(r5QcJu7(hEzQE;V2`JtG#BsQ0xt85`NR_5KmdQ|P<-GhggI zgKd(DRLNL1df4?zdw^u!hBIu}rDX#0W)Z(djWxC6;%cH|qLz6w7ME&x&<@AssXH-< zo3&H}4vW~`;v-tzya+nl!|_OvSE-iQyUS=&i9KJva>gx`hAr-<; zhsQ`;on@-Qt4)8o`&@}P9loP7q&eL3B*we=HmasYNjJoBFt$r&QoZ4B+00g%Qa^N6 z5L(8ba+djlzg*3pwM@QcJtb=lBGNYSy~4fs0SgdJ-{6KNtM}Hr zyA&tC`mR%)0anu@j95qMrM;Z~31WkQ#quHAA*_4|9^PmYPM~33k zOU2xe$#Q+-3URBK@QvqXJSktw3yBL?UrBw#moh7F zNah^{@YC(2viD(_;-0R70|z~MH$J)dyp<_Nfv{hHgJ?$grukiqRXXSdnUX?W{}M3! zQMZ0^-Kb$oVf^z=7v0Cv88y(;rugl&A!7a$V6`Ck@oiLnND8fBXUo!ibHgCvr$9RAHlpfXVC=`nufwjCGLb$)z zM^#Ec4}NlXtz`ey zTZJRaQw-BzeO-1J5oz5)u6MX0;Wr#=#uW z@Ef~AVkL81tMx6e;_BlxjCOpB7kYaC@3Bv~I!{XN4IEjT&^w|AoJlQ}(oA2lMu;F4 zepY`(?%u6L@Gn4gm4g%%6hnj9VbXHXs+AM5V@j&B z-MitWH?7R1Fa}L~ZkmoZjeYGVl*$|v{CMw9phV!Erqj4mJpFlztIMjb0DIBlVJ(fb zrNfbu$+y8&m8ZiKH_@fKu{%TcsL+^SZ;ii9$AP}Us3wqJD$!9VjA#AO3<=(l=4jbB zIRHQGoMwy1BPIQro?bzHmTl$89qGf^4u2!#poy>i{1`1UcIjeuJ5jK6cZ5QKM<<0@ zn`S3kGJQy<`c`<7OS}zx5x(5&;8cc1Gz}^jmw0nNShY=Ees;;zv`(je@PN$Jzu+N} zKVc~S+X;%hsB{g{+A1wAAdFi^iTo&PX>vYv<91Q5H!RvH-Zpk9J}3gRHaUk@`cmW0 z?o&Z2pFfzJyIrEu4=i# z%_MqgwTbCa!u;ED>LagpRc{~Keha3smV5aJt!D&WL1tt2F}d1b;Mpfi7k17@qDh?p z*Agy{ORP;6E?7vgxAPlzl5aGdD?Cq$gcrA*4 zV|m5@hu2~}R00)2fn8vR+@3OzDk(i=C-?^TE4tsq#X&J7;%$43GN>eOpY9FPiLt~C_yHqdWm0%&k+#Tij~@@_h^c6^Lf32zI_~#_ttyCI2X)2! zD>cr~^}Tk8T2)#SX7K8`(B{zhNF(WM|iX|7IZNyj@|WCaMlkk8(Jmk?jJ3j zJ>eI5e?K5MWEdtgT;yzPza87V63jY!{jr%`vlbtYDUE_7(cOG!v633<;EBoGg)zzG z>!?gj%~!H+fmAomy!>-)idhR3r`Sc1yl!1rUGR4HgGP6xq*z8X{n77fifI99W3*4s zUqXM^MiE<3K8J*bgZ;F08O_tzxhbxShV4q}=JvFR|BV6F;YE^{tw1_J@d;bM?EgkfmZ7ZUjOC(4 zp!)+CIr;;p=c;~WN>#M;>*^7Et!t#n$Z$22Cgns@O~V&kUWMi$^*Lv8sh|Kolcv2& z>0dh&f<6{=sG_6O0i?2Jczo;|m|x8-2j*DK%z8!~q;j<2%e0|9(g{02Hs+MkG@_)E zBPn<=^skW>$hF+;M`cfCY=Ov@7=Fr%T6?J{r@Z)8nD%Gq(%4qw1>4DhUT{WqvLFhX@NxC zmgq4PepH!KO3}i8OOnJ6!@9lWo5s%NO17vSfwo3Zww2#Y>+Z zf$peUqs`byN&xDh3&6 z-j#uy+0jIg%5(ido0j6ybLNF-LN5apEZQx4RCkB<$)H=}n_2CWhUqt#FhvWd$nCmP z`i>FKHY{z-l4k@@G2-GA9lVsQ6KCyMi(~LbTY_|oz7Jp8xm*)Htj7;jg{FV zd1>$7ZOKYXw(;xc^0U_Vru90xp65}e%B(l^fI5oj$09LV;%h%E4{6r~Nvz}pX`%X# zLOc7ySn&qY0wr%P_pN2(8vMnU42hDp_VeP@N{>jY$QuDj)xnD0*3&m&^t9)L5_Vd` zNbFtlF@QWM9d|(Ke5k>EP*j*}*{?*K-^0@l4_{qaEt!(@R2I`5UIXdlDlT6^%xN5kgUJv=GD+PCMOj* z`imoR-yO#Gkut!;YMp#UPs(bopf^ipfMgSdu6b6!+TSA{pRGg*&k2IDeF>2CQ3m!U z+|c&IDO7VI(BU#IFf)XYCZr@YILclbDP%5tyHHr}kdIKokDEpaap@F?LX4Y^OZ=;5}7KVUcnh?8?D*DgSNbNln z2_7Y}Ddp1|eb8!xS!ta?F+p?uFjYjc$y3<6HlkTThzMzB@Z_yCP(D&$tJY;(87arr zM&JDw?(N*O>2w(clc$W5nf4r|C-Ym=;gNmUcVWjQL-+7?o2nBZ2ooTMOqgzT!`D09 z28G2f+TkNB#JqUxhgG&M47tr^PS@+g-$L91D5HwY$B&jIg|y*~XtE2yNgnZ$J8!N^ z`ujQJ50z?dfAtqSC*sg~7zkdhy-%b9e-$X0v#m)vwFs8$#Co6l44a%>C_b$$$4_SBF|mPsUZUZ&9f1 zjy8;XL?wKTd2hX$jLk}?;ONB~vH@)4D78bH+yiCo%~(q-@# zZbGw8Lf?uZo`kk^esm`(CrWr8{Q>01fI1VzH!`}^F3{c2Gl<#k${BUHMfjazoNvSa zjk~s045_AmZzC)-b7PZX9Bb+tsTmuGYPO!L7Kw*Q8&0H+Xt{f)nnRX#jJicmxxwj5 zpyOp$Jo?%MdXx#b8x#;QY=2?Pf%!Toltpm>alY(a|YTgD(2wt(E_D& zeU0d)w@tG<73_H2*}(N4wg0QtEjPO$ z_^4!vf9{dCO^dg~{rIyVS4vcjVf%|;k(uQ_^#_eI1~e>?q$d!ej+CSrWY6qS=k=!N zXgUv2aMQkwyc>moFx?C~D2nk-zA*-tMr$|pk`n@*n%e@IY`YGMV7|%k2KQc$Yx6Lm z1b&XjfAPw!bB+Q_d(7UtSWOX2@mzzm9)(MBtRDqTj6gLuQri*fTmud&5SY`nGDrnW z@Dx`8OMzkqYO~XVBZRI5jq!+0ip5nvp%FB^SnCYacWmiA5dGKmMlrr~2E;OZXOqS_ z>!KIHh~T^=uD6FHnt73FHnqJ2)SPw$7J`YrNVN~d7l zMUoPh%9ulqr$cP#VB}7cX`?dh;M@^tF4P;!V@+)5LVo|yirF1bDs*YR99x>TNtpc? z+jvsi^g067i}ce#CyBVcnEvPrOfW^9@KrY^e{HVtA+}2J3RnP-j*7Sby#+>5)urL_ zN#ozIycJTlO1=@B1`A8rd}k{fGp-y2^S=GvDIT8-R*E%T0^P>NS`Sq8G(70DH)=@c zeStnj=PYkUf>QhIO3G(H*P@4zyj2MhSuS&e(Ws{gdd18gW9hISalsm}oyu5-72zg^ zqCO;{rc49OtqdDd0<#v!x+H5b7Q0gJvH1BBym05gn0YXt6C2nlY+>=B(B!uj)|oY$ zm^bk5I^d4$o>{hE>d8swl%4LD^g;`%d4b^NL94eABPxRRZ0?0CfRpI-_AMt zpMlCgiSX4xy;)P>`rmlQUAn|U5;}isHQau?NyI94%}jS4PhA^KCg)swz=cAB8^fJQ zg!BBDo+E*_iJH$wKn1sw{eGZy!yCdXY}&$}@t&vder=?;F$_3=wxc^YRgRw!V0c1B z)P&TTP7>~)c%A993$(ykTD4vEUBx)75~P~3hU`oN1v4XV_J9*a1{j+GEA7?WcEVas z9y(7D0eoEs$1dBVS@N(tBd5e+GeRh7m)&&oq{gR!Oy%5bi}~ww_M7g)KZNBUFV(2$ zap9zmHH0NE>d8gxJLONt^cvhmLczFLUyVN)wm$STV-fLy-LYRW zQB#C6tuSs2SOSy;;)d!~5Q~O8Ug)-i-{PD|B9lt7>gE);2NQ(2LPx+G>W3m75b^SY znKA80pXvc_^Yr9#C6Tx>&aas!3e|y?tw+-j2SNgc+D^V9&N@$c!b|Q#F&v$Gznw{u z-QZ9Y2_E)8mWs|qDuQm*3$70vQynue^Ie6_&9rI^3biQ)M!?Rm%T1f+(~^}4i7>vE zGl+w|Sd&c>=hF@ggW9qP=S>D!@5w~!%f##>y(YV1e^a_t$@<^#mC^6PHAu0}dCA_xc{O-;CFo>djmWGr&m^*#Ly$-dhOtU($=VRfVjj*R5Rd6-; zv&F}($$o3y z;;qVOjkPVjKm)vVI8Yey0GrXcclF($Mb6!)e`z;ad|nYU-@ z=CdQkT6^~)SeUy^_xrl%_uQ{|@hfM1nkoQYrL$kS=Pv6AJS3#FuyB8^bI!TH@>#uo zZN+VyoYIsxyCBs{f~O+cT#yF|riR`2AH;P*aU^8M2VgYXE(4BqGWK4PW~|`jC4CB` z429p=P<{6T%#1RuYGR^~*L8RAjHiC9oh@e+*6X*)C=Cu4SqI4Br6-~E^okcN)V50b zlZj3J{f-v3B1gnDub&tNrf34@0L|}6PDpa|FejSdT9KP2JeUetXDg@3q+j5wp>waB zcOGTYJTqp>gER+Y#IK?oKwj(N?y7rG$SXCiX7Ip@JKI{~Ctsp?tPvLphf}Or+ zhUu+KLBt=m*{L#a(jx*<31*J5vU4C5?P+n>mpZYfxWH6hrcpoJ=-?-odEcyVKKtR| zTZ8!biSMTFJ|*Oz)+i06E1ih% zZj#@SbN+O;rukk1=FS~LGk*fq_!uHhK2d`^u*;_V{syi~C%MjB{g-_?2O&TYVOCdd z^9#VE9Y#;6Hl=W&`kQ@Q-)oEDE>aOQ9KKNiO)^a1m>n(;C&=Wf*|Az!bLGIZNKmYX z4u8Rc`Som~{gxQ+v*!CaG07(N#Kwk%``b*$nyN|_vD~H#LyExEIdRx{cB+m2^n?qji$F_~z1|q`8n%9V&ZHFRtIGZ9* z!XCfbg^eELH^eIfuAfJWX8jJ75WRH1L9D#Flf_A}wzs*_2^fn5FR-c8S@DhSJQIY( zd$qYK0|HPkGCrJAIpys^@LW1yY~RjPcl-H>K$J2PTa?(;<>x$v=SBUOW`>K{fgx7U z2m5p~WuUF^mhdX3y1uSTit7@1JIk%akrFFirt(8{5s8J;J8!iASnw?sa{etr9Nj+n7*%iq={VHFs9%a{t;qy899K1!;7xvG`IlnJ`pre8z+2GC)D1>{T#$aS&GZ=#BI#uQS8H+ z4s?KrMrb-+7>ENn_d1eif))?p?%EsuJKP%5A&Vn)}>pW!eQoFb%Jy%${DIx#kK|U;KtfCh}`E4`C0IfJknkjtVO{ zz}}oAHHPi7WpM**5v!ZJBB4DW?>X%ej@bN74x}+_Oo?_d9IE%H_i#xL$s-T ziS^q77PIO;>7QzX>D9~1cHwWSIRPXmEMZBkEEN@w|Ni1qxpgYGsRQh@xZTvjU?#z8 z$TLWP^rc+p`KPOFd{x$q_q!>4-ez&affLLdPN9ghvf?$58J>sqhO*Vh@Se z(?_tO#10pGu%GA9ds3U7c1jr%tPh6i9U+9WTmCO5oojse0S0#cbkAkS<^|HlN*lb& zn9MEIC<9#p{52M6>pz6HOouu&O}NW1*~RT!{|s(&Dq~1uoH&8n7jb{R5J92o>3na& z10H0z2NeVtGmGQOG@;(}q7QNocI8V5`o%^sn<1?>fDFWOfg-|CM^i2c2A8s$mruHK zCpQ>jnp;Qjzf>MtMKq<*ZC`P5{Vd!BDxgd!o?MKwd7}A*CaXlKc18f@RuwAD6>5I z;BS}%+3z7rAoo6)8aWm!>|FG zHjpZszq?CcN-_6V=y7>(Y)h7+fchi;_rvloQ!2l7Ld|$S zBZc4)T!5Aa+E?}V8oO& zedN8rmC*W+y=F_{>MS05?`AsF+c7I4bqOkdFOqpkh5BGCPJPL z_ul`MP-$jh;&D2~{O7V|_W(O-R!Wcv_79KWID)Ij__3{N$;V}f224Af>Jo->?VjNS zzxYe0HM(7kC+>z6A2T2DzHT5!zf)noZi|wLb_M83Ox1N$dE~S0m7QWYLbP9>yt$Y1 zVxQc0S_|%7Q@M;(_um(tvFze)01l}9tqS;+Q542Nff{||efk(fusz-W2ty8uQ0h;x z#&~~DXIztig!=4e`Ja={sE%aX_iSa^!xH6sW~rC6CD{mVh@hcPna5my#KOU_u^Y`n zJ&iTz7~Pm2XydQGH*>bM7O^vOHp zZBvyM+Z-FeFu% z0n*K1qtvdwX(~sw0t59;7xxFkoiTbIZNxH4`4vqLjpDb5{3+j%$Aby}nTWg)^;f1jss}pSkuRLF zIDW0LueN>ns?r-}(kTdS?Tg7DNoIUfJ?rbQy$b;AYyg=-WNzw%cW%nC7Ga_ytuaMT zm>KD;#9v{JfQBJK*S04tq=lC4&!4LF-iM2P)Wt6B^yRlfE!=$cOfOL3Ew`c9nPlFh z8_-#1aIShns}E=Q(KfYQrR`uBGW79OQ{-?X{~KWo2Mb?cia0~@wEBc(+g@hWb|=MV zponIMb{*7X-l+!s8iaboXCVTg*+84_Fo%MjPNZJ$)3&>KA+TfCW?H_uEGwJg;}sr` zoiJLyxBd#_2OarI;yAX-IwU#zi-Cyroe;iNlq+f_+KCovRR_ylG<<@W-MCp%+{AT= zO*js=_+`psXTIJFPP5Vdo9G|Kt)XAFW0L zo;m*wtq?VB~^g4{*o){x!FyMuv&kycr(+B-hE%iVXHL;Xh{GR5=x_nzF5 zZ;3~(x?6+Qevq{u#Au4xi#-iZ zn(|?3#LQc!dcEB5@*6Y!;VAv=x*xMV)6xF`rRW$s2z=I*(>wKHXn*-qxjS*{MMim#!13a|D5mTU*Kc?PV zH6Ia6kt_`r!CN<;pxwe(icnQY33ekvbEA)&t6p{ga|`szSqOJQNp3kne!{LL;{zG` ztXj7t1aM#6Y;@dJK^C?i&P zvEp^1c5kmh^zLecwwVFuz45xMvVR{E59ZTdCqIbS^~HgneqatZfFu7v)?MdG+=^T& zUxU!(42fk7u2jAC2`wOG%*lS^9tR{O#!Dncnu{rK9_G`=iBD0&XHAN=)C%f6ujyZ4tWK3Bu24Ai{h=mlU!PRiec zo0Wtb_Z8DS`Fg0sFWz8`*cds%H1&yhKIwetX>5D_8RbGu5COq9g*C;5#tG`0qENjW zbE8aTz&r~-yo^N1($e73`35WwLKfY5lDNt=oNn|?E1FH>GRC20P6wbOEX?#w)|E$n z)3#<4JyrdXciY%PW2DTH-zRfI1YUw+uP%1QS#ugpHF62e{ zru^rvKQN4ouYE$dcS_?Uc}kIHgVf zy`+PMB9gZhe)+$;0Cd*0Py+ofawQQagr{%-VsN8mXP5ztsb^)(tP4a@=ns`DK;FI^u z>i_tpWW_;mbaE|BFRyhe3stEcJ*pRLBWyT!j*k|(d4jb$p)}}tsh{y#f-)8V1<7sZ z-QQh(dl3Tc5u)?fZPwP6*OG#^5 z{i$SuTrOoj%;Ge(n{rHBGah)ebqn6?-hlVT7+?^F?pWc1xPpQ?|I&1V61Ym@LY&?j z#VVDrTbm|NHx3r$+xhq^B6w@7&4Nh&?eTte(maos_2g>i`Aj@ zGhADK>VcKvPr6V7Ws|Z!0!?{3{JMFqy&7Q+4CM=n5NX&b|MKF8mMSwCqzv=gXeG%K zxY#Qzgbff05dzc6^G5OAvv$pHYr3+D^XgSXp1R}&bJf0fmBjDBZlN;UBEdHuS-Xu* zmS(A|8Pcl>81sww6{V+S9?(9TH|&^8B$eSg7fpO)o+2^l5-34%XT=H2H)G#MJyono zvT)zc>UkkmqVO%sHku~B+dUppEkO$L((2;`j{SMma>+gEiN|Wb?f20i!n@L0;2fS% zGVHDCYVe$d`gu0q9jP(%ZueWH0l-qzCHImtg$xpYmOSChU91lO+$uCnZ^hkIF?+ESwMf3O3y<8{&OSiB@e=s)Lq`iT}Rk^*QrOW zPoMUp|4MwSBZp%nc=1Z|dMue@75~#0F%~yNBU{@%93u2zL88Oh7_IFkvHT;w2A%LMfW@x-gftx0c1o{=+S}jFt_&yMW|fPq^75oF@j} zgZUIJ#+j;oo5AQyeN<}7DUhg}?t_8<;hi2N9Mpqi(wbtZ#)R*eMPqU*<)7Jfufw&! z+~oH)ipMMZ`>N+Q*aMWOsaSLV8=x9xl-MXz-rFb;&6-H_o}#$$syZ?UZGc1+8Xs`4 zWiyAvbMNXaaXosCvZ9P3-=ae$vrV|NE)*f~E?DGns6l)XB*8Krav31*ie*#EGKDgQq7`Oq1?Fz<7X){_9?W zrb(sM$C9k&fkH3yiy~_E>C`_q}2!(a&;uR13iIL?hlg>a(^D4 ziZWQAHxI3u^K(8R1oYGNzO@eHIznx+kSw{D3$Ad~v6mCICp3b^K ze6!#_f#daLHEm#g=u?TLefz{<1fG50bEvs1B`*B|xeaDXHpmZHPQVq8G>2@ka=%#dBxX8;^m>O8a(Wxc-~?(ZRbPgDM(yhsfu z05CS+H>9uEe~nOHk2Q1@UZ)4nUhgXsi5U@(j_DEewmlpkMK5M)3Idex{Jh|>59a%w zI5dAAD4>+jz@o0O9ENMq)-@Db7UJxKjeMif)(O~BXgeUBKISPLaXJ(M+!fHrt3#h) z#_+{0fI+q8n^*hV|Imvq+QdcAr?~uM=xcg48}<`y77DKZlvI*h^z}83w0o$4dfZgt zm!wkzO&OK+gpY%ue;OpTaXWzpfRby-Jolick2SY;^@LWnGseQK(rUdhaH%zw5m9>)F85OxvZi=AZbU+a7#c|ck6C?I)jk}gwK1-WXP>Mn!K3;|h0vU=a zWCyn7y>rct2`^c|KuTM_;Q;&=2;n9lo$GYqxJ}4Fgr$)0)~C%av$-7)kmO=`76D4H z85%E9Yq)PHmVxD-TMm&@uNHSHx1mYXmMu?kN@Np-4R|@Wn;r-V z!$A7PN~%-9^XrM7Vp2sMNrQ6V3A9rx5*`sqm21**#j+%-d4r**Znl z)GVB*b-q%(;FyYy70MG+Y4_`=jbfU|xs+<3<$-zb(c^f4>Jf`W_AJ4I<6&2xY};+t zz=wvkVgu(6vTu=3Wa)JnVx;^7w+4~f zJ{op~14~|lm8&&I9C9?I5Xhz{C)I$tgNVwki$MN;_#-!K0K18tUSfs7SR11=hb{EY zd;>LE9R$I_gya|4yK9O}w=McriSl~epdm3Kd7W&mytlkje80#*R*9C7niHrwU zTg_IDczAHB6y7Q=a%dcHdPYgr%(j=zIO>~bdAxb1%}^og?`B;!?=B(r=Hv39DNeUz zu3Qo~Kn13Nlr&hIp>C=Z^^r_#r{l`h|KBkejezE@bqBe!sA6P zlqUc#F5wMG(HZ~a62Tyr@icx*$Ug4 z+1Xkes7D;^mn$?H8=Jrwfuy9QDV!m6!p@`)9eIb~dlMq^B(vrdp)RpvH8>B6lRIbS zm|b>w4rnrn%NxCd(2XmyJn1;f`ZBWee+fCHu4FsXxii#hxd4 zYv@bP?+$)9+#c6*)-3;om6OR!Iy7LL^wXHR>6!dCOXe@ic0@bJ(Q>8K<_vp@PQ+2# zWHvD9_mc$M*Y{7M{sJmO4)Z(I5d9Bof)4c?a*U{b-sMEfS~Xpef6C;RCo2$RX!;*O zA7BhPD#R2*reX4%9zRWPd#uUNrE=a*zQn<;$MLmfi`nJco_;goMz5C{+`8CvrAsQP z^jKg58JuzF0Szv0%1aHevnlAHY{evhhd^K2UoR|E?CDI+tN+@9%MW7Jw3`-T=k@WZ z=7qTyVM|aVloMi=Iu{x!#to4aM0is@h3`UNHSOG*Vv;*+^2Vvk4Tam&xLb<#7rHaG zBn72OvEcJyGYFMUk*K;tPq^T%2J$~U#-RGayO#|XfSxwydtW=yaj!&g0Ax4)ej-#( z)6V{kWwoi-yZB2_8`yk?Q4);yeVzxf!7;Gwr5W?axeS-9^*YxFhpVdrMIjJ< zw^41P{6!Fo&0-K@Q=6uj2KQBUSq*o?O|UBg_fg+%Yuje zLVK7ybJ{j1d5~8SRx2hkWl$!LHiLOpO`C~{m{)IiD?bPh`-3qSh+tdxF$2q8w$L(` zd=h>-wrWiA%f5oD$%@TiYt$T9HX@6;&;OQs~`ZQUzCDai;l{V=h^zNh&_N2 z#4qQn5Lr*HqL{X}my!ZO0wxd`V6u3Ya`s?r;Yu0Y=4!GAj;>-~lGrIusWKCx+L~Ai z@pZ%;V-bX{AH6HQ>6nl}xIJ}paRXF+Vj9vS+x(iwAUM#M$~@?^2QEWQYUBrBtPX?T zL=10qZN%e5kmO^$O7cf~>50+M2yH272q5Ll)KV|c^hJ8<=E2{c>j>zi{uWxX>UYhU zw3;o!5x&S!IwH?%z|TEE0hF#v>;TKXDAp8n8g0Apj7f~-#S>Pu#n?0t(3|$RTGV_e zlB2sjd$#o(S1Ps4_dEVmi{qj_5bX7z_akCyqEs01xxgoCzbB4U{M2-r_02L8-?CQ_8i7gHCYAtgzD`GR z0qELC?k&Q(u%LYG0T;9hf!y`?QfC3%9W!vFXLVp=kx5Ne;D)a!?jfZE+PZsBBF@7$ zdk~iREASj)L>zia1hvxq{g%9pW&uS$ntew1%|CNn6#Wlllii{(%;!iL=(LD&FsnYu z1B0<6aoqQ3bV5q!#VUW3b&3gjiWS7l#=8_JLQZ72sZkU)%Pdi1v&pS%4!^3rKVe)^ zWyJVyj6eIz!Cx*H7XjeU{LP*IS;@5lZr@5vjU$-4yV7`DOeaPgrB;ZQV`L+V`$YfL zn`05n1qU>~a$9oW2(;D(tVczfUUI!#ehGlbvm1i-HZT7jAFtdWVqfTLAfUfIl`}@2 z^QiO%vsAoZ5)wi`CUV#&I07FsPeK6WQ)ilahl~QDi<7@J)4o0>TSTeGJivHE?e=Th zRMvd#n+!B5bQcFTUxhz1Mn^)9sE8q_R@c(IJMm_uCsf`l6SdbgbLW^dfk86u+ui(imHMO@jjNVxZ`dPAV~?5@|Di?yjCbj)!9I8ao?Mq)os9Ye_pN3KZ%f z&_F3aRWHxGkpRy0|3M>aR#E^O&A(*Rk{CtFD+DH*S*#{rz}Y1DH8(uT6Vl;^67vr-zo&HP9PnLlqrc3 zQuTB$T`&)G>7xJK&h)lRS@>|RZm)K6>(yW|F-N{{*F0_sZ;QqbVQ}xoV~Apz^S}RX z-^F~~+Iya{NW`iHxzlEjvm(AIU&s9}hR&H<;jr_Bq;6f@*|tpV4gf}!2hBgp|6)B` z&s!}qnzvRh_4B|eLGB>PKkG?jS9}F}^7KnioEqz~RK{}2oy@whpCe@Bh^>5+j7E~ z?Yu@B;Cm)5-yI)`^&PQQ>a5Am@L)g)NM7M_ z-l5l-XQ8|Od6Vl<=i3>@?!1p9Ui7$j%QE$@aaXOjZX5pNAepJo*G^32HbOHJSH@RU zSdgekdcAdB=46yeRku12^y8$vQH+jm;0xLokxFQ*4LT%gG0$N$Y956Y{S`Vf( zlLfAT-EhOW^1FicUV?;awhQsxRg^BqcbgVs5q&X=iGGh;>YftpD?@|Rr}yHTxO=ON z^lnSrSx`(Ktl{^y5tmc}5#5Qi@R?#=QUkDT`WBqMe`ifCo$|^tqLISU54^?MUr&cW z2zJ_G*#J@3>))pH6FtlQ5lym=PPAFSUIJ04-wqdOwKbBwC1KOTH+-v)dBM_ylmjDg z#5V|6>qWZ{JLh9Hj4XHbaID7t{Fo+@D9ZyNhBq*>~ERLju+LV|cdK2$U{?;Lb`6;Ox9QFlay7m&W({~X$ZDyQ|#v<7IfV1DY z`xFp@at4nBm!ukb4lH(Y#>#OB?Pp!iTJ^~V0U0%8*VR|oATBC)^HX+z+{{IIQ%uZm zL}Br?Fg^*Ap8BVNA;(sz#;>t+4Y8-aSM)i&&cs3xaCLP#V^3HLqvBP)6L(I0Ihjc9 z#dZ$V^W`-MVHDVmfjtxfUvoz&s*DmjB8Ke!lxPSKzxThHb|tCtz={aHp(R9dcRPyB zYdAZ*GQSdWsB9R(Vk1_qgMFP(i&9(llcuNbLvdgl-{;(pI_u|w-H9AO(i5_;G?7Se z+_|;`0a`B*Eq36FVM7N(ahPaUE*F^MuyZWGpF#J(x5rhRRci+!= z9(?8y{F&vX2Q_&;SBjFswcEotr2d|TvOiwcR*jtjZYmj8M&04S(pme56+E;vrSu*? z^!ghQdikXPY`&W->E_xO*mVa-y~nwvpy2jZw@Efp0eK1s`9__;pN2<9(&#UVjA8nj2h@p*#@D$kkDAC|A{ z5a|V_qc}n*EOoEyNA(2si(>E`C($5V$La(%k9JYaV1Oy+5|w7#XD_VIgXkmW-o!x$ zr>Z)~rD~2cncPg(6>9U1jc?SAzo`+7f2 zXh+z;u0?#t>B|tn;!iZ%$v*hghljfT&>da`$tEIK=Yi*pHXo+w4pB>`tCaASxGGB~ zoXwlxzR6oZpZ|X6ZE5I(K&xS!8VE!V1s(H~s^r>)`m?W8-ybI834STlsq+)$4S27T zv$(e;l-mu+gT+oU?^O&yIA6bleGNojojNt@GzFo51{Evo2c$`!-ZUeuG7lO)^Q})Q zl^Gxp#rmQ4mCb845-o0`{ClXi*{J8*VcWsj;<03*Mf*j1N+GW9VQ04A_KB*plY^6_1)Hi0YFV|q;aN0W%|1eQDlManUO~m1zd3Go5y+;dNgLfNp z_StUy!7BHuzmr+zBzDw1#FPdzns=jJ@qMSuVdcXa(>$96 z*}@6C?-uYT`kgdb>IYI56o!nUIA2j*f&(!$r=q4$R3sQOwn(aboEE{L0Aq8sAOwsf z_cJVi%7e8{eNAAEvW2^-WQb4N?6eJuOX2G7 z?DvM^LV`%}o<{J(a=sesV{k_OzlmU=56Qs)bo9HF;g*7x4PkWRaDJ0@;&QOFN*I=R zk-Ms~>iAf?_S6}J*A&R`X?DhQ-N5D)8t3bGenrf=hPgp0e3pC|j)Xo27j#5alcgpn zYX^MfN_<=}6a7@puCw;_^)#o$tC&#^rDgsg?(cvHfuRZEe;&$m8A;q>^!5DrF>GAnNv7TtTMawEa5HZ#^|g2E9k~ z4J0muA#r>R<@3}abpO?)dRw3NahR0|Vksy5I)k??rNniTQLvEx?rsyznHgLq%geU^T&Us&r2)D?~`VY8fz}=nzSl~Lfq!=vG2_pTFQbBz4*R=km zT;53wB5csS6a%BC(lGcewpWx!B9aWoocuzNWGW?w&YkPnH(erCQe}iVi90mEdp&67 zdldSSab&We!;*PNPrK?TYBxoKTj_J3OlbF+GGdFD5jRQF1#^w!OY0YR75*W0#OUoh z9v11w<*&Ipys;NGd5Vr1ZrLntf>>Z_weCZQ7ASnVUL42lKGCJ?StNL+4w0u@`QPB6 zG}>3>ZV#yE&tV_YY7s#d@Dh?V+Yeia_~!gKEHmh?(wiM^K-cA3Zac`R?6sS74 zUoT-`>ONifW&1nlm@-mr96Cbi(q37a-CW3u(Z=s>dS6OHI@0iSf^H&F2$T#bbo})r zeew4BSDq?UtpL;#Ml`#4M?Pl29IAm9D`EZs>$YTu z6c$62^YwzN+1PS~8)_+0yQ!M;cQMSGB6@!6zHQH$ zJFI~}UePyRX1u;KUkOl7~DI1$Wzjr8sA=aDjD1!wkJ zp0h86TY{A_-%Q2MmEV?7>xbwN@m`5V*#cB1WxuAfg(4S|rS=vy3y173qu7HmO$n0( zK3y`>v4&!Yp$QpR+73yu=kPCk_uV)vnd*-|W&m&l(lSl+@T3KkkDxazk{cyjqvJdJtlYh`!Z+ZOdc$3*f{ zy*ei@qwa3!2l^cD-p>BL_K4YiJi_ z&^{MI@-xe`vdvJd(h6Y1zQ$`RO5C8!<>G*^@YU{N6rjio&H6Ad?UP%$n&LVFJ`0=} z^k_+GGdQXd@yx5Y*m(v(u=-FjY2UUQ)gc5^BTuc2Dy2#6Oo;l?vSI>@<>xAA@ilFy zp_(6bKEoz-9?0|4T~+3VR#j&Kp$Ok>!knoqAl8Rt3_2FEt&Sm!@#fIHP4t!)WduZXIpO&Ma0jjcV8{7f3N| zn)J?ODQ1z$8IZnq&OjqVWRh9*hN?-qU$ZV(ek zO=A-Vze5{h-o!p#B0HfN%zxb`WD2IF`Jj}NhMmbJZR>csmE7{qCwHClcvX)cSJLT^ zvJ=^COA)<`HiX7TdBy$FCj0IRqQPsIxZnFJs$+7@DNm^Ecqo@yzmkHYO5=xf*NnVI zsJ=_vscQqG3GuV}jpM<|l_q~hb8$UpTkB3WI~+*P$n)))U3obSE`Hbx!&&dcrC4l&oPv6~or#*iSA0KzgF_J&CH zXP#Wo=iA(vWqd(T(ZvwkKdE>H>*o@wGD5_0mfR+$UTP~~3{Cv}+1(-4AUJDtZj=iq zCRyFn_%iJ0hjH3yTB|_8P3yju?-QEgO)$sLMRxE=wvji#=8A>iE7i7AlHey7!+O*o)NK2&3hXGJaho~8|_|<`vWHhRX=x?-{UnrRdk-Of)FNe;2 z@s5-)Wx1wCQ_4!!nHPkPQ&WQ^9TJ3cCZz0&utN1mWqe}|1CPAyyvQmE4VZveHbe8y z`IGQXb#VCXJLWs7_(VcDs6R>gWf#Q{%xvm3+@1|Sx7h7PRlEeW+#HSde|qtf>(uSI zc7^byhSj6&6kYDjeRZHl&+zSRFTd$vel~8}+Pm>PB#6c2(!I)~{BwOQ)Oht(e%o~3mZVer(2AE99` zhNr~r)ndG(4m>x-l2iFnv4xvl$zRu|!*V9`Cf0f8lNvIMR*23EtBY=YA)~JXM zQ)6vFKPzIdwO=dXxe#B5&jy7k+a%M)jxEgR9jbd*%A&vWmZY@?i2 zf3$W=k+=tcl_`_IUQJP+*E51QlF)&Q{A7nAC>66D9tN;*vF2SQ5o)(YvedBLZUns8 z_tEJ0*vykPyHP~$p5p9!J(!YW0s7d+3%A#^G(6^fwTxp(9;~ohvZ4KiXYg1D){JyB zqvtK@&0Ozca^g@uWJAT$hQ~N**=IflKxrrDe$(*MaSAg7ii$1(wbAsXS=2v)so6rm zDBRQlLk(=@!a9Lo&U(kv+l6e%(A+6_Tb&7l&Eo9OKcS=Od+CtkTwmK63jhO0;EJ6N zm0o@XL`Mp$k%*9ht?&CIga{5Qx2mdlvdWM14r7Sdo$FCY+weO%Bzuxin+7Xa9~?qP z=F5w%@uq8p>VaowYHtiZeS# zBU&w$cZr!NoVR8b%C3eMF4Ev2%E4d5J|eS;q#IY#Zen!Xx1G+ zBd?;D)G26S`fL)NCYC_h4wh(-xQ!yD^XqT4{=uxs(NA*E+$JUuQTz3~UUG1YRn|#S zSHX0cResDm4qGOM%UXZEO5L#lmUtwdP{KmqJgTVL8WYxxsMvN(`CUIr{y-d;!mj+K zZ@;1mCgBCk#L)VHm(v(~JC#>&Er)E}jG|ZMAPu5tO*z(bvdPS0ucG>*T6N!c`cn0#r1& z&_@tIBA>w{X{yNzkTGXaMBCFNcM{I0jcA=B1=cCyrtiq)I-v}_Sm{k9 zlG>J(SCW{sRQY#F^3r|Px~-pbzV@Ex*|2%!w#WHg1Lter*x|YQ=g5Q z)})jLE9^=JC-hS94~)4_jGy!|sm2Wv(_NG{6WwE3Dj{eOFvEx(lsMLn&F$9KcYk5% zvwhlA$Jc}ePUOoq5As9;ND~_&wBjO%A&V zNef9Eu8k^xmX66b8IeB-UMn&Yn#K3yE{rcP zKS4>oXs4KgA7?)!Qx3RuAT}T2AgLWr@6?PBZB3QJS6@LxvV&)XT-XwdmE+kBj3zaR zXTcELNT#fgTNl?Xq2epWZ^^gO9-Ck?fu)F%Z&{pHs7D8X^a=*!4OkycVsS`(Y+BbO z%c@+f!8VVW-0n>iV5$^01Zjkp$EM;~XA=W%>ILo`V%`N(%G(t&@JH0gpvP?Qq`fz1 z@}Fx(=3;W-?t7k&l{l6&Kzh$yfVgy?F|jTr6l`^(V!%d6E}x{3c}Cnh#}{{#MH0zT z{GQ#Tss7K8tWko?I%=2Hv=6Rqo-)B=PN1fJvm*%a?fyHmtLH5=%`q{5rnRAGeUpYT`mGP&kvk z%)C^!Wn}lo)`)N3yD_pZ^84Y&Kf_8F-h_bXj&c_In|yTz6@Skv4d#H4(VF10nq6D9 zpl2C;R8N&=w(rY+KvI#BHS7vQ1gaS}lIR>L*;w$z4q>~RVXyh=O#dN9WvmS~C~vG8 z-%@s%lbCf&-Q$R3?6Hl4(5!X3zaHdvc$iTs})Qnjr4OhjOYC+ z>xopAT#y_t^(568P5#*7w0`-L$ya(xafU^+?iL8f#+gb79z^h9b%Je?Ym+8_;CxoE zUbih}KcjW*2mU+o;JOu(t!M#)xu*Jf^JpcV5|>l4LhS%%p@uof?vl|Bw(9H;&dKKR z(_r)_jAVC|kLORk?h&MU+^HBSvpy%d%1tstw1){}!I?j?8FMn|>_5^D^3p*=d&3cc z^1K)y+xz%()rv(*=#TE7+(-z9Bm+LEN4iC}QxWwA<~acJbC0Jg{LX_UxlSMh&1um- z^2n8Ho100fTw8-v@;jJw?XwzVNQOBW(2@3q{^0i<1vk@<1?sxCm$vISGq8-D zSd-~!MXpv2mGe;w-!ytbu+3bW zv<+GJtQjCnD*`*nsE5n-39TRiy3Sa7FxfbXdeA%t){Ibcy+Klukr;LHryMjR^sN3E zHR}>hV3wcBVBTvHtQaPnRg>ptw#b*5_4T?VJA3*Jp~^o=lN}a}nrc}M5OYG*x*`oD z?un79sIvps4Opu^K_HoGoPbS;~sds*#2w&@;#)`Ez10c-()*TV^-F8l~k3DVAA3`VAN7 zxUdM~W9N*tvGnS1Y?59lL>u|AFc}@&%cmUMYJ$2EEMW>Vbt3*fi~JFJWo?5n*yFOB zz9IoJ^Sj|ev`PvfmJSlOe|eGyPKqZh8jga5;<9Q$HZAWkHS?wu@NYjF%&+l*s2ito znoSrRL{5!6eC`DLooVg|-bShY5n0=;%+X(VQ%dAhQG>&GN+QuLXXqtT!tDyb2Gwvk zA|LYdko#}zweDr2VsSMDM+R9ej(;}%@RKl}NK>lkJwr36M6!WABOPyFS!}a8Tq;1~ zHH%Pt_|_V1*gT13c-Fj8hk?;{R99Nr1Phn<{0>S8nnj`O3tV;l{GEMtk= zW&zD8C*F{~O?*|u zWUZ3;yiCc8t2^;95OUwV3r@@p$?J8C_?;mI1u!&A{oUX^SU2t4w5V*VY_&di4^;cK z0It?)&W>Jv%WpPBc2sOVDx&wHGNsciZo{@Og}`d@iSdYn!clfmmU5wXbzUIaBvWS* z|G>0|vYT(TBHk-qz&o_&m-Xy?EeSfTF^*1jPumY$P?N=}Rz4Ky$roymgccXqfXfpG zd8qM1Y%OblPNRJ2bV$67uXpQi7}?;2sCPz^DM%eq?hV{1lB9$&xsn5MKgu0pqueSs zpg@((7#HIc0kckAPBW({Tl24K`U;}Z-2)Je3oN+tIyHS~6N_I=zZcjqdKzQ=^keSQ zNk(xlM0gGct1iU!>tBtnHF{s(hYi&Nfvo0B6gUWI*8Hsi!NS(y1e|PvR+(MR*{=fkP0345@BZGJl zLN&1#DEz*cUSBZCNY6srRSrL8?&!SK&tOXw=Uup5R8Jp+o zvk{w#y>TP+EkCPT-wIv^YIoeN@;Ih-Ds86c#QgG=BYsLxiplrgoo0k@WWE_w+rTyP z4}go^hjIAvm*BvdXqX$euKKfh<1zEHMa~!RnqtMfps~c3 zY0NpViuJvDrJ>Shrbk zM=9gp7a@Z#2QWoe>XUCcWqpEsa_G^b86mAkaH~*c(#$rTw_I%$+23<4tplb7Y)H|x3-UL9z&(L0|0ru4q9QhCiB_;0Pm)=+k_^Ms zLGn?9w3w^{!!rcJf54nR!qM})`ot#;5ADa}2ZqjH8zl3OYA*!sG<`8`Q7-BWPxiK+ z3hVuwow|THqZ{X){?n4#-DUxtoEnj_HmA_>viH0X3yyDflj74(8Jta~$hQ8rQc&gQ zFJ~}nfASI;l$$jxTopEoq8h)`no(E#Ktp;ebIyB6+^%K13ILT9o^d8RBqnddIBeDEJn!#VoP!YJ9OZu7MN@aiuK7LlX z{=ADpDe-L42thR@XeFagTia3^+6m>3?;?PvdR~h&Fn^2gAw%u4W;gLG!iimD#kl3T zn>Z9$n~k+6VA-7+=55c%WLJ`A93Jg1I(ek`I9ZHIOVjz3&NAcHh#F0Wd*9C(-)Dn4 z>(cn$npd}ov!Q5rDLv5|QbjzR#^0Ht`MZq~sXhTtsopBgG`T;iq2S%w$e_8xcP^?D zFTD|AmN2Ra&7ePqa;D)k3UFmJqBN$`XdAP^eGj?sirM%dkCd|X#QeS1zKvPxI@PpM z_&1plIe+?%-p98h5S~je0Hftpkd#KF%*by;=2Cd~nFHM&W9yc|;j4O>JmMFDFV|x@ zhg+FG{mc>6W+0|Q=K6LwbcD9Q*Db3ly#*3(LHhRD5A&r53>{~*YLekF0QP4k>`ffz z4G%b2oR4$W?w|3zX7}@GguB_>V~C)JMjmR}X3P3=%LHijdxspr6;X*dZ7xhpGd_=_ zk}MI_K0kvvBno-IY!P0RejJcVVOG=)gYi7+_d2s_BQ{Qu#L9__#)0YMZTN$@QCEVE z!BhdrTnD5g0`BlYYv0uao5Rpkn3J;;Y^>%~pRY!QOHM?~Kzfhy^RW*DfOc*n!)~(@ zv$D)a{9&x>-Ldn{)Fizm=}$qiw<7B}Sz;P?-tpxbm(d9A^x9F<_g$KviCLIt17O*o z<8=SVuyFoXt-wWQd~vm{wypuEvT*lmj2*ys87D{jfp77a^VQ;*2v?&&+}js6zBQ^5 z1VskCB0FE_4BQ%h z|A-14`BFckT@zx!Uia5>IE9JFeeT>kXXf$q+hKf#>`z={B#wW}Hv4rtG_}DGlS^H0 zqfbiK$5G6@RX3Je5-ZW?DWLE0e6z>*l~-$?pMx`KGpi*$mRYx=D*0$r{ZNoS^l(xS z)>3tze~l+VMBl3KFMc`Wr&+7aoFj_f%PB)>97398p7Zk)soK8KC$Eq2nbMU-7k+lO z)?xG|hQIYw+f)Is@Af)sU~tWLPa-VmVB&+H%K>$xVY?6Q6HNql`_CZt;CH+LqR2hY(1%cVSX|i$^?cLM zcjnNRfg`-X)G;p-tqv1*U85YM4-ga}ht)}I>xMYCR5XGF?+Qhxs^1X`I68l%lY|4)2UDbqQkb(RN&#)=S0`tL`B@Kt-_LYdBHMUq?h0n^vO+ zQ``aExcg9xQ6ha39ZSs0cu=o$;*h219RsEm+xF&TJcQG&SZjTI(UOI_JO1;j)f?s{ z`j17DS1n8CAP%b1g^de8*VY-`^uOcBQ8FVvdfMA)R8BYc6aCp|Eq9)H6q0%|}W>{o+4} z;LVvZ>TZ*dQayI2)0d!H~f$SEIHmaq9}?EHD^Gwee`yF zFb9L3``I`Y>E=@K3V&IATS8}bZBt()zJ}XM^y+7;o3H>ryjwJhSR(%%KsBFyG}7?Y zAv{cqH8kD?R@2ptW~}2gX?y=&Pp(5ws(f}IjcV_?5!=3j2Sm6waksWpSesp%goczR(~Jh|rUctq{eo*3{S5i3{#BV5i7} zd0TNMg)wgU)TSZ-D47c*VQ1nknnD#UWi_9Sx6^?#iuH-N^XDb~nlTzazXpH56;U+{ zZV)9RmO*c**N^7v0>aL?X#Wil+`yUvIA5eeV4VU13;a94gyK?1JFtNk?%!gV>^nqF zo$%86&|ul%6S^Cy8odx!ez?2vZ1>yS=b@>niTWO`v|ewafNKY%-^%y*U`Wa2r07@) ziU_YW|IJ+|CGzgxk@ZZZ3z~@Utx1xAT{Eo+iAuYhu*s%2B`%MQN|a{TB0*ttIK&@w zf!E8$thF;+_GOmvHyq~Yhwq8JVxc49na*`r3*Am%UG`J?;C=mY`zNH7{Lp>LDR65L zD@mh}6n=6*>K!qwY96QXlD3gUKi^0s+Pbw0Vx|RLiPOPpa^PF=LB4w+=CH~*{2~Yd zbatdoHY(1Q3v4`+R5u+1?hGHZ-AOOV!nKFzg)hWp)jlt6XZ;9>+B)B3VH z4x@M)z?vYkIV?+UK2q3khcXp^67}0oPjkB9UN;WMP&6ahH1Sb(`+-j3d^qb}KUVE# zl5`lgF?$DPR_V?q0D40gW#UU@L6mIZaLw80w@+f{S~6!jA*98Qyk>*@{g_GK#7S97OPHk$eW!uw(+} zfUb?dXm+X=FznN^*+T0cbT!7jR)uL z3p@K0AAY#wmCZEqZz=wYXefXG)lX(hnnGR|XFtLh+a&UVjQEx09^Y|3AfXzz+kXIn z8Gyb3_Dz26?FhtEA^h7W?@$KSp@v>QLAg!g*o6fzCR()oH9NIBWpW4f3_r=$P1 z8}Zx@0J}cdjU+vUS6MX1hT4(2GMdzYJ7SxLwhk=t05`+y#X^J|qln0Ibm5DH);$^= zblJ2&6L_8cT-iTXUQ3hRBO={Q8r1+wv~wQ&n)hj~1Z7ji9Ub6egAkc#)=|>ZR2z0g zRP;nP>bIleZp0^_L%<3|)Hr^6^M*5Ff1&^}kw!{UwAu}0>*rXMK{X5Aldhdg$6Z06 zRd~9ffy3p%qZ&c$dMDxT$IT3H0clIpN&;}3lbsVR8MEVf=Nf03jakMwwxKVbEo6Vc zAV8M)BbHOGIjJ>%?pnR<*fD%O)6^sO7&;r1HPvtpoad}WtnOpo#e<5l4X2qb!1*wl zV_JM5X^~DxdVS=3{MnUF-emk5Ko2shUYm>5g&B#12}@~%sVEs(5qqO!8DJ^<@d(pE zUA-EE$zbBhWy&5Ld?XAf^bi-s=$>N97zHy_B$UzjJ!WxvR%e3g%3BeXpUej@TATLF zx93X+tU3~7*9S^8&UomKe-}!f8f~ifH(rc{z-@z3abjIQg|HdvIM69eGWpp40YW!R z4yvYyLYUY>2XvGHCy^Z4{FP!&YqEn-h_PM(SyHEmW10ij-)M&-T-3GV35`j7kR?9 zKSpk#94_5L_*d)XB}Qv0Eru+2&R82;G<~tV;RxG+C&v#H4eWnX@bZQ&LjGB=Y2xo~ zg-T{Sa9Y_{(2G|MWPP@^hX_Z`Q|A*8-8*R@Wzm^_s%#rWjyKh8iLh=Dz05R3F7Ju^ zY-?)Hc4p&-%VpzhB*v$h09hzi<6YWma@w*#1|p{aot9b z1iiu2#aJ4nmT=Vrw||l<)5paL#11H9lq)mmmVM|Bg0(MG*RPW%!ggf%sVKdtt%xbL zJxT!^s@a5qsoj4sSWc8)G>6vb6Gfz4$F`G(oascZlcX8ZhipqcsTr}3T&@<$Yk`Op z(~Q}ugbO!5<=XEmn}x2SET9MvB!`-uzPOgQ!;yjlmggDv1$>L8_wV+#-h3j1l&e{! zPg910R3;v=oZ_8yv zmf1(ST`Pq*+%(8jg9Ze-8t^J%`sDandPi)L8U1hye94L4l6*_2K>|jpfX=W(vrw~= zx}1o@KsyE%&ve5i?n+dO%|RKHYS9~w;Y`!VNQ~%g@ByqD3>7=h&{GiopcZiKLr~5^ z=Gpuc79Ve@$C!O57-dv7BM+^3!Pe8(f$n51%19GJ%05B&Jl~7F_g)rh`l&7IRfRH2 z%fD#XNsMdNa5XS)*uHDg~lnxN`CN)Vb62cKUdENij$t?TJ zNGe#fXgc8USY(0?pQ5xNd)Md8m`KgqiJ+C4pzq*i3mkG;*Qpsyy|lx6Qzc`EPnFQ+ zaDS3%OIRw5^?3Hpwhq=RzJu|U1x_M0PEc&yLv4{=YUpRvKijGm;n*T;w7M6aTov!0 zV_p(kaK^I&82S)_#@5vqA#;l$po9m^NpN+Qv=fYndU5|o4gqexdy5@P`g>ln^xVHp z@80!MN6^=&Ik}|ZB)h+~UMDRxK8Va~Se;OawGD+CR8s)Bt#}>Mm`fJD(z{&l3@>zs zS9dwQ40!43i~E8p0?|-0@%(|Wx-RUWE{w@zN!ZUGo@XAHHbtTV`~apC^ivTY7p$nA zo*9_MN!})1$2b-t--d_qB=c+k+PE7qBpwMjDM#XJ(LvIUQcg|wO4m*^mYDs%;6xd& zSBFKb$zgNz(`b>cV+-(!&j`T56Fq9bJzof~5#lYm3;HbvPudx^OU8b=Nl+h3kDVR} z*e`K*;eI>sV5>9^jKFWbGlwhrBg9|AJvWhd-n_NkqZmiZWEEGueziwpvh zD9TBSeU4kLbkn=6{1{4u$jik}?%^M@9{EQDzx06Cwj&g^8{r^zN5y`fR|LO{`36u! zV`$-)=A65B-u^R#_Sui_CIqz0-RCXG`^Pq7CaAVIbv5uDZ_WMmh|T4cFU-7P)+p+Q z$%GUsT-D+O-_vM-qb^MDWSeu$h|rp=XnW|=n%nO`RUjSy$b zUa({%tz=MCmY;&m062))v>xgS#Bx>PclWY*Ctra-w`bm4RA}1N$cn&Ywgdt6wnCjC z=@+p*UApYyHAQXL8Eir)4+wb*aDFqJi6F%YRW)MEAGaASYgZ(6EAymg4-NeZy_UA$ zf4$B2+xrE;<8gHq>6>%_(*~Rbbo=?hi1&Fwcee)_-vijfuk*V;f&?`)uEH6Io^w8; z)_NxdP!#>nv==R}&`xg)8&9jC@Nib)uuZQ|8{U}9i~<7EkVD*6Je)Z%8+*)cp@XYR z3I)^8v>N)pQ1gfx0wj~r>GiFSy_@cYZWv|BCLX_1Y%b<9Ze3aBE|tm=QATzZ6{ z$~If3khYN~Lj9RasM7$t-O1^%Ss%$nhdY&^`D4A{6sJd$(RIbucP2fYHr<_ZBrAKs zWQ?86Yz^B{z?H}IZ7C&Bsc2GgaVGg$iXZcHlFqDi*j|0ZXM$uYHd4f*${$>Jd8?-? zy5*v#PtuuVQQWCKOiY#VmmzEz%+Ws<#aoxk48h0{d%4AB=POBMdM2jaif)Tv z_*sN#-w&7Iil*fphI4aL1iv90ymX3!!L#{8r(t{pNkzwcBA}yBr7pn2!x@AE`n7$p zUy3E74_}1kNgeL0)>Uq+1e@zKk$@^7?>eeKk?}DT#}^$Hgy1mZZsJF5-rQTOtR(tz zS3fy3@Q3%8fsc!K>u`M9$(iZ*+wUCGK7#+?AD$%8QQ7=j(asP#M-m{157eKiRG;?# zUO?%9zU#^s0WA%a|FtW)E5i_*Ck)c6EqQ%1izaW_R(0(3cgFp!ezK5hm%RSFb;W*K zgGLyyz{%k9^n+Krw~L7<>HE;#!_1S39w4?4X?U(oInS5Bp|wqpo|^UdzfmV6(LwEV zT&%WW*m!g#Fp8}Lxup@ncQNS6+^wbTdl>ynDI)Bgp%&Rf&RVK50vj+e?|AtNDy#A| z%_esZ76CZ=LvaudbHJIN`UvE3n95?M-z0vM@Kc`4!*cgf{5li~;ni!I_*Yk_v+;s}z|tfJ zyh=coFI}Ifgcn6`(4kUdSgkO&6g>pe%);1WJPy<6&wO>%GpeeSjiXtkC$S zzyNSI*Je%GI|C!`Fn6uy2@X$8 zK$1990e&hvIn43vRy%y~v6{Fi*vsE6=t#+_-HLX7+MQZ>wj-a8u|Lzb`V0t!O;id& z{2fboQt`|(zw1EG+J8oWD*teh#(oIEVCd_v0TD8{QKSoLc@bKgS7vpcU_e2jxyNf- zFAXCmIKNg}zFnvz1XP^^7y}ScO1Hp@{aK zN@YIcbhG)wUimHzpTtgR*_(?}qFq8*=#@Mhvu720iR#HtU z9)vW4+!A0SHE;{vyH^{7os9cZY~LyRx{Rysvh?YUi7)Wilcw$!j6sy)e4}<7-(3z% zOtp9=RFDdd?e2l&w}p}dwuK5{&QVt+h3PG>afJlP_Wu$qJ!udFfByY;>=jr3dpMxs ze8GYh8z-UyD5%^z0Kmyfd z_@FeHUyg3@c?$BFuxyrjAJG6T8bbLVD8S?bb93wNFW%Ip{~wJW%8@!BVOX*60W;H( zWheia24S>+m3Zo6FK&@>?7*F^)dp7R2Q>?0GA&>jp1PzdJhZklGju)9r&iy2VZz3f z2C@xoacEzZu)P}1 z3o?U+2(fursu;y!jgA%->%l^@G3n`v+ZGN*+h2erACoX-G5ZAw%RWnBE@EV9uHX=d z+g`z&|MWx(@;ns(qY~8Yr+V~9-ip#s9tLQ#SbK2(-}hpABC20ge~CXQ!H;g!hMz{p z+xkMgptc5L_us+1fRUI~ie&zADo!r@Z3JYttU_}f&~1(l&S$hyYzxny=?$ODuVw>>Jk!j z^SlemfnfFD1&dFaA)=Kqg5L$F0_?|(`>!tuPc1;=4+`9?#lT=)-v?gg!a`m|KcIcZ z|L#fhCU{AAS^fhhCu84*3Xxh$+U4gBdEPkudfxv~B|7F`?H+S>&0prS9+wz%QN%Dm z^ol=Afe5PZyvFhT>JKh*+0q4ohkvt3s=M1?|1^rj!|2sqd{#*&YIaN;m0 z3ZTY+@Bd#sXLg1CzZ035{a>s9O<+DWqW1rJ*`F1PYVhAnL=)wIgYy5O*mwG;IL$fD z9gW+-)qyF#C3U5?##b|&FG~7-JUvd;Mu_%HO{PP?lFv`Mg<-BbVcLkh2>r4$+(;-6 zRmm-~))7OQS??vBxZ&yF@KsV_L@>MA`5uO--C6H5VFa39t?pVwyY{=ox(N?S-}fvv z7G>)ignLwEv_2v9EQ!E?VA_U>-s%`uTOaohCZIst4OQDisLfo@LdXvy< zk3MgyZNNx3s%LAP^e-*F$Woi_-+|;)ie~+-QA_kQ8y`{-xBUuDBbrwiXp+KAlp98% zK=#a5iN(GJ7F51y-<&J)0KfZu``5$K7I{_E!$@m4mD7(AShae{PPxZZseFjLg+QpF zm=L?(A$0rYol+gGH;I7xuU$Dv4=b-)#2(N%w@|qEUg(`^fwA=6+~p>Jdvb&_^&1)* z5>#sZ(u27`P65{vagSOUXUl-01DD&~C7h`tHtg%QZ?&BO#GGVF3BjGmukaw}8w%B} z<@?W%^n|wNSzH&J4Q{p%k8=wP8683Av`&H^MjpFUMUBa7@ z^q-`s2;7bvj4<69Z9I&Jkq?eKbdT}pt4)84W7O(idosKCBTU(UJ59P1!aO%scWv;Z zg33=$y7~#fI6gc&P5Q0Xe>vq)zdY1?{Rrb=7Es_sdKh$77%b4#-coQMsHYa^zgcg) z+E#s3S^kFDO^%>C+A|f2+1cT^xDX7gDY_3N!4>mDMimjPsk?q;Se1M|2L@O;p;tx) z^OByvR{%|t-kmjx<7!IDUiZ2iMw8VC)Lkh*Y?ij-_htPhs^>8qM6TAS4Hs#X1E zOVjDqZSZ?_$e=eq3iKQ2;SHu@K1>j`ART?LDJd^>p83hOC_;{2vTjv>Hb;zPM_RaWTg40vg#fNFahk5ciVJi zy z;3pp)-yM)uFTpAjTI%&ona5CAWG0#aH1lK$ru5ow#RB;R*>hOh!Qt*>RpaW7v|Q1_ zUSG9sG*CH;r{jT24kE9z%Psqm2~ANzqDUXPLA3w+)ck;<`Y?ukHIdZeRl+k8^C>3 zE4sQ2x@Fj$VcB^i4E_eHX?5r$+ZttnHuX<>HbLX~x`4c;3tOc)-sIff z-L0uiW&?1rKlD;6ucd#k{ihT*=4VNGN4anh8t|Ea~QIjd8HG4awni%CY|m z?Db?Yb^B~Ff#~8%E1JjIW`}R}p4tYC5ekCvSg!#M>ovsb8M|AM&+36P;0+!$`PhN# zY5z7!u$kd=98uHs4N7$4DHICivzfzWS?oSH#|1)_`0H-CjvoUZ&3*pp!Vs`9?}oP8 z9Do4DIq-$)(1{|==e+EWB-gY%7?gu1pe@tP4O(lqPMk)+he7NOR;uRgWNT?b>BhO{ zTv*fZLd_Batm!n2)h-Py479q$<0K4WuH--<(`wcjxbhR?3;UJzhfnRMSg>pyb}RLA zuuJQD-2_DiDIh%OH8wAU^Qg^Z z)Vk&OXUo9bw@si#n`i95?5yTlKMD9eC+2*J4{;^_zCZW~;%xvJPm4B?t6Hb&`n`I* zijz+g$1C38a#LX}j__io!Qz$e5eRjA% zhUqM)ZwRDsP+PgxHZ`v=UrY|oC%?X7WcmBPRSjO9ws_sJ1ZAL+WCdJtO)h5x`N(tE z+I@jRb%eleLOCt&HI8jP@8!k%!gu?ZWdVB(gff^1j`s>T_=-26W9tl}vz*H?o zR-}|E3Gee2@`#>}w2yigmd5Exwf#qLFtdDt>lr`G{+0;ZpZ9e}!9l5&v}v)T{OxA0 z%RGduv!(cYZ%^dM$_ltn*Od{6Z~>;5Km#3SFil%m*Y-X##S3+(Pql{j2Cnyu?ZUj4 z;bT+8+tSXilu^NBH-qj*xUhjBu9S99_a>^!bsA|OI{N)LhEG`xS#{L`+ilUcsao^) zznpI!UC7cNe$DAM0gL6N#wp1w60+YEFR30YlM3aS zjjinjR1X+b6AR)c<n8X`2iXsi!rLTz=A>9Qb({t|?5M=J7}!)Dj3(%HN+W@^oX z5E*rripT{CHpD{Z-msr~1u`gYEkTS97dFc&!Z$DR>@0gicB5T9W^)EFLoO|{5U5=T zQT2l2B1RB7L30)UHF*~L61Eeqp_2fOSfmwLLmAPd2ki(#)CRpQ9vWfVnj9>*s(^2q z^?C?Fl)rboCkIuK^&Xm`lSGYHwSc{5Y~s&`ZQBj>VDR>B;8995{VgM?s+4res=1q; z$g;NUEy7+0>#2>H2c~9z&VFw1oV^B%nGy%|)#!+A@cKDN=!-a2y3i02c?_?IQQw>% zLP%ThVQW$LHx-yGvF7Y}T00w?2t*bdLivpv_w+nLsFTN_qC1t+EFw z=ub?#X%=03v@7{8fQ+xE{5nkC|F5C7AV)(i%$u*#pGIe?gpb`34MXj8g6K@QWuB1eQq0`y8{r3@FozwHssGb5y;8tFscK=olDbsvI~~=OLS;~ z9;_-^2N`lTyc63&24p{%?{E{^GBoWEAkGz@t#<6s7wPMY*X)@6nsZr|Pba=S|w8>kPvt5DFyfI1I~eRy%1qVsEt9Qq7pvX2q9Sfl&1L~6=wXOc}PKz$#o zw;rYY4MNVprKSFxs^54FND){ulad%tu>eA~%c(s`2Utp?utqe1O7!Y15@}5;#MHS0 zs(k-)f9Y#dNO*8GI#ZAS0I3!c!>o<#$)t`Pe@k_74I=Wx>GYL4hiL&_;Pbx4QQxvK zu)hJC147=nU*9shiQYRm^kRkxgOFeE3=@gl!MqPMDCb5G)XfQ;U8lfcnnvHo!aNI1 z?Ow|>J=u`jP&H#_V;q})0_TD$~yHx?KH1owG1 zKrps2-h3{?B*)6utLG|X9mHuz`*LsR4l$}@B%zM(N^ZCdVfa7YUHMbe2^9ajN?@9p znV5Oz(Ij?wV34+CX4+_Cn~t`UVwZ%Vq)S?4Kvu3R)|RENHJRHjC0L<(AOfyOo~5OE z0E*~(q1cd^DEsZ-*!RPm_uHHI=6&90J~MCTNon!7a0Qj;cxA;JO*(EiHg1{frqFrc z&+!!MpAP5kWSuNxVT(hmo|cbz1Fs2p;z6YHtOx-?<2P{~eD+taI>#Nl-nPF!lZ|}e zjOkC$@1T*wB44k^8p{d67Uz{W9xc~OuO^juvUFcrs zM@>&}E|6mjqiUz+F!qUx5)m(=fNZTNlw+y+qpggF~m=GH&k@$pWfE;>$ zJM2nG$)K5oZ>W<*3HCQHEWwTt19|Au{M;X_0Xbj-%*aKTv(?WQ=LS|2n;N?UZgJb8 zrY}PXWIpls6kM?IOa+3>;S52DKiwaxLKvkBAuC4$B;>z()y`QjM zMFfRBSJW+W^nb^oD`Glo@*I?GtTzT>2!I>E>*8Ot_mW5sc;<6+F>CK2ys?wk11>)V z$Z;qg*F3U*tvtnT$L|Zo!^c-TqOUvgu)Al;m-Y}5!fn-KTR}C@Qbt?HNMOcW@(K*; zqjs?)3&EQ<=wsfLUxp}Vd=N2q)^q%p%DG0m!19#L#OA|Kjz{)@nm+$ek)NFhdYx>{ z1p$EygY746E$;urh51|NW09##61*pGg>hCFczC!;xwbF`NX&AoonOqZB&)9q3tAWQ zha7|a2NLnCt_RM-x12dAH39x$ZY^@e=d_Teb;sf^q)XQ9KzdFZltvIar!2QvJ-Bv7 zbkq3n7y!VFWX2Y4rhP|rqO^unk*o?ninh5hOHHEsHZk=-s4*OXrB3pUMYwQ5icGbg z`UB}Z= z9x&^E8(7Pz92cxR=(Os*;m*wb5_8)-Ak3PzD_$Yw Date: Tue, 1 Oct 2013 14:34:05 -0700 Subject: [PATCH 008/150] doc: Updated text for more specific region/zone example. Signed-off-by: John Wilkins --- doc/radosgw/federated-config.rst | 311 +++++++++++++++++++++---------- 1 file changed, 212 insertions(+), 99 deletions(-) diff --git a/doc/radosgw/federated-config.rst b/doc/radosgw/federated-config.rst index 4349438187946..13c30e583a110 100644 --- a/doc/radosgw/federated-config.rst +++ b/doc/radosgw/federated-config.rst @@ -2,31 +2,28 @@ Configuring Federated Gateways ================================ -.. versionadded:: 0.69 +.. versionadded:: 0.71 -In Ceph version 0.69 and beyond, you may configure Ceph Object Gateways in a -federated architecture, spanning multiple geographic regions (read affinity and -failover), and with multiple zones within a region (disaster recovery). +In Ceph version 0.71 and beyond, you may configure Ceph Object Gateways in a +federated architecture, with multiple regions, and with multiple zones for a +region. -- **Region**: A region represents a geographical area and contains one +- **Region**: A region represents a logical geographic area and contains one or more zones. A cluster with multiple regions must specify a master region. - **Zone**: A zone is a logical grouping of one or more Ceph Object Gateway instance(s). A region has a master zone that processes client requests. -.. image:: ../images/region-zone-sync.png - When you deploy a :term:`Ceph Object Store` service that spans geographical locales, configuring Ceph Object Gateway regions and metadata synchronization agents enables the service to maintain a global namespace, even though Ceph -Object Gateway instances run in different geographic locales and potentially -on different Ceph Storage Clusters. - -When you separate one or more Ceph Object Gateway instances within a region into -separate logical containers to maintain an extra copy (or copies) of the data, -configuring Ceph Object Gateway zones and data synchronization agents enables -the service to maintain one or more copy(ies) of the master zone's data. Extra -copies of the data are important for failover, backup and disaster recovery. +Object Gateway instances run in different geographic locales and potentially on +different Ceph Storage Clusters. When you separate one or more Ceph Object +Gateway instances within a region into separate logical containers to maintain +an extra copy (or copies) of the data, configuring Ceph Object Gateway zones and +data synchronization agents enables the service to maintain one or more +copy(ies) of the master zone's data. Extra copies of the data are important for +failover, backup and disaster recovery. You may deploy a single Ceph Storage Cluster with a federated architecture if you have low latency network connections (this isn't recommended). You may @@ -39,17 +36,37 @@ of redundancy. Exemplary Cluster ================= -For the purposes of this configuration guide, we provide an exemplary -procedure for setting up two regions and two zones within each region. -So the cluster will comprise four gateway instances. For naming purposes, -we will refer to them as follows: +For the purposes of this configuration guide, we provide an exemplary procedure +for setting up two regions and two zones for each region. So the cluster will +comprise four gateway instances--one per zone. A production cluster at the +petabyte scale and beyond would likely involve deploying more instances per +zone. + +Let's assume the first region represents New York and the second region +represents London. For naming purposes, we will refer to them by their standard +abbreviations: + +- New York: ``ny`` +- London: ``ldn`` + +Zones are logical containers for the gateway instances. The physical location of +the gateway instances is up to you, but disaster recovery is an important +consideration. A disaster can be as simple as a power failure or a network +failure. Yet, it can also involve a natural disaster or a significant political +or economic event. In such cases, it is prudent to maintain a secondary zone +outside of the geographic (not logical) region. + +Let's assume the master zone for each region is physically located in that +region, and the secondary zone is physically located in another region. For +continuity, our naming convention will use ``{region name}-{zone name}`` format, +but you can use any naming convention you prefer. -- Region 1: ``rg1`` -- Region 1, Zone 1: ``rg1-zn1`` -- Region 1, Zone 2: ``rg1-zn2`` -- Region 2: ``rg2`` -- Region 2, Zone 1: ``rg2-zn1`` -- Region 2, Zone 2: ``rg2-zn2`` +- New York Region, Master Zone: ``ny-ny`` +- New York Region, Secondary Zone: ``ny-ldn`` +- London Region, Master Zone: ``ldn-ldn`` +- London Region, Secondary Zone: ``ldn-ny`` + +.. image:: ../images/region-zone-sync.png To configure the exemplary cluster, you must configure regions and zones. Once you configure regions and zones, you must configure each instance of a @@ -77,22 +94,22 @@ if it exists) the default region and zone. Create Regions -------------- -#. Create a region called ``rg1``. +#. Create a region called ``ny``. Set ``is_master`` to ``true``. Copy the contents of the following example to a text editor. Replace ``{fqdn}`` with the fully-qualified domain name of the endpoint. Then, save the file to ``region.json``. It will specify a - master zone as ``rg1-zn1`` and list it in the ``zones`` list. + master zone as ``ny-ny`` and list it in the ``zones`` list. See `Configuration Reference - Regions`_ for details.:: - { "name": "rg1", - "api_name": "rg1", + { "name": "ny", + "api_name": "ny", "is_master": "true", "endpoints": [ "http:\/\/{fqdn}:80\/"], - "master_zone": "rg1-zn1", + "master_zone": "ny-ny", "zones": [ - { "name": "rg1-zn1", + { "name": "ny-ny", "endpoints": [ "http:\/\/{fqdn}:80\/"], "log_meta": "false", @@ -101,11 +118,11 @@ Create Regions "default_placement": ""} -#. To create ``rg1``, execute:: +#. To create ``ny``, execute:: sudo radosgw-admin region set --infile region.json - Repeat the foregoing process to create region ``rg2``, but set + Repeat the foregoing process to create region ``ldn``, but set ``is_master`` to ``false`` and update the ``master_zone`` and ``zones`` fields. @@ -128,10 +145,10 @@ Create Zone Users Create zone users before configuring the zones. :: - sudo radosgw-admin user create --uid="rg1-zn1" --display-name="Region-1 Zone-1" - sudo radosgw-admin user create --uid="rg1-zn2" --display-name="Region-1 Zone-2" - sudo radosgw-admin user create --uid="rg2-zn1" --display-name="Region-2 Zone-1" - sudo radosgw-admin user create --uid="rg2-zn2" --display-name="Region-2 Zone-2" + sudo radosgw-admin user create --uid="ny-ny" --display-name="Region-NY Zone-NY" + sudo radosgw-admin user create --uid="ny-ldn" --display-name="Region-NY Zone-LDN" + sudo radosgw-admin user create --uid="ldn-ny" --display-name="Region-LDN Zone-LDN" + sudo radosgw-admin user create --uid="ldn-ldn" --display-name="Region-LDN Zone-NY" Copy the ``access_key`` and ``secret_key`` fields for each user. You will need them to configure each zone. @@ -140,7 +157,7 @@ to configure each zone. Create a Zone ------------- -#. Create a zone called ``rg1-zn1``. +#. Create a zone called ``ny-ny``. Paste the contents of the ``access_key`` and ``secret_key`` fields from the step of creating a zone user into the ``system_key`` field. This @@ -148,26 +165,26 @@ Create a Zone See `Configuration Reference - Pools`_ for details on gateway pools. See `Configuration Reference - Zones`_ for details on zones. :: - { "domain_root": ".rg1-zn1.rgw", - "control_pool": ".rg1-zn1.rgw.control", - "gc_pool": ".rg1-zn1.rgw.gc", - "log_pool": ".rg1-zn1.log", - "intent_log_pool": ".rg1-zn1.intent-log", - "usage_log_pool": ".rg1-zn1.usage", - "user_keys_pool": ".rg1-zn1.users", - "user_email_pool": ".rg1-zn1.users.email", - "user_swift_pool": ".rg1-zn1.users.swift", - "user_uid_pool": ".rg1-zn1.users.uid", + { "domain_root": ".ny-ny.rgw", + "control_pool": ".ny-ny.rgw.control", + "gc_pool": ".ny-ny.rgw.gc", + "log_pool": ".ny-ny.log", + "intent_log_pool": ".ny-ny.intent-log", + "usage_log_pool": ".ny-ny.usage", + "user_keys_pool": ".ny-ny.users", + "user_email_pool": ".ny-ny.users.email", + "user_swift_pool": ".ny-ny.users.swift", + "user_uid_pool": ".ny-ny.users.uid", "system_key": { "access_key": "", "secret_key": ""} } -#. To create ``r1-zn1``, execute:: +#. To create ``ny-ny``, execute:: - sudo radosgw-admin zone set --rgw-zone=rg1-zn1 --infile zone.json + sudo radosgw-admin zone set --rgw-zone=ny-ny --infile zone.json - Repeat the previous to steps to create zones ``rg1-zn2``, ``rg2-zn1``, - and ``rg2-zn2`` replacing ``rg*-zn*`` in the ``zone.json`` file. + Repeat the previous to steps to create zones ``ny-ldn``, ``ldn-ny``, + and ``ldn-ldn`` (replacing ``ny-ny`` in the ``zone.json`` file). #. Delete the default zone. :: @@ -186,18 +203,36 @@ If the username(s) and key(s) that provide your Ceph Object Gateway with access to the Ceph Storage Cluster do not have write capability to the :term:`Ceph Monitor`, you must create the pools manually. See `Configuration Reference - Pools`_ for details on the default pools for gateways. See `Pools`_ for -details on creating pools. For each pool name: - -- ``.rg1-zn1.rgw`` -- ``.rg1-zn1.rgw.control`` -- ``.rg1-zn1.rgw.gc`` -- ``.rg1-zn1.log`` -- ``.rg1-zn1.intent-log`` -- ``.rg1-zn1.usage`` -- ``.rg1-zn1.users`` -- ``.rg1-zn1.users.email`` -- ``.rg1-zn1.users.swift`` -- ``.rg1-zn1.users.uid`` +details on creating pools. The default pools for a Ceph Object Gateway are: + +- ``.rgw`` +- ``.rgw.control`` +- ``.rgw.gc`` +- ``.log`` +- ``.intent-log`` +- ``.usage`` +- ``.users`` +- ``.users.email`` +- ``.users.swift`` +- ``.users.uid`` + +The `Exemplary Cluster`_ assumes that you will have a Ceph Storage Cluster for +each region, and that you will create pools for each zone that resides +**physically** in that region (e.g., ``ny-ny`` and ``ldn-ny`` in New York and +``ldn-ldn`` and ``ny-ldn`` in London). For each pool, prepend the name of the +zone name (e.g., ``.ny-ny``, ``.ny-ldn``, ``ldn-ldn``, ``ldn-ny``). For example: + +- ``.ny-ny.rgw`` +- ``.ny-ny.rgw.control`` +- ``.ny-ny.rgw.gc`` +- ``.ny-ny.log`` +- ``.ny-ny.intent-log`` +- ``.ny-ny.usage`` +- ``.ny-ny.users`` +- ``.ny-ny.users.email`` +- ``.ny-ny.users.swift`` +- ``.ny-ny.users.uid`` + Execute one of the following:: @@ -205,27 +240,35 @@ Execute one of the following:: ceph osd pool create {poolname} {pg-num} {pgp-num} -Configuring a Gateway Instance -============================== +.. tip:: When adding a large number of pools, it may take some time for your + cluster to return to a ``active + clean`` state. + + +Configuring Gateway Instances +============================= + +The `Exemplary Cluster`_ assumes that you will configure an instance for +each zone. In larger deployments, you may need to configure multiple instances +per zone to handle higher loads. -Before you configure a gateway instance, determine an ID for the instance. You +Before you configure a gateway instance, determine an ID for the instance. You can name a Ceph Object Gateway instance anything you like. In large clusters with regions and zones, it may help to add region and zone names into your instance name. For example:: - rg1-zn1-instance1 + ny-ny-instance1 When referring to your instance identifier in the Ceph configuration file, it is prepended with ``client.radosgw.``. For example, an instance named -``rg1-zn1-instance1`` will look like this:: +``ny-ny-instance1`` will look like this:: - [client.radosgw.rg1-zn1-instance1] + [client.radosgw.ny-ny-instance1] Similarly, the default data path for an instance named -``rg1-zn1-instance1`` is prepended with ``{cluster}-radosgw.``. For +``ny-ny-instance1`` is prepended with ``{cluster}-radosgw.``. For example:: - /var/lib/ceph/radosgw/ceph-radosgw.rg1-zn1-instance1 + /var/lib/ceph/radosgw/ceph-radosgw.ny-ny-instance1 Create a Data Directory @@ -233,7 +276,7 @@ Create a Data Directory Create a data directory on the node where you installed ``radosgw``. :: - sudo mkdir -p /var/lib/ceph/radosgw/ceph-radosgw.rg1-zn1-instance1 + sudo mkdir -p /var/lib/ceph/radosgw/ceph-radosgw.ny-ny-instance1 Create a Storage Cluster User @@ -246,8 +289,8 @@ Administration`_ for a discussion on adding keyrings and keys. #. Create a keyring for the Ceph Object Gateway. For example:: - sudo ceph-authtool --create-keyring /etc/ceph/ceph.client.radosgw.rg1.keyring - sudo chmod +r /etc/ceph/ceph.client.radosgw.rg1.keyring + sudo ceph-authtool --create-keyring /etc/ceph/ceph.client.radosgw.ny.keyring + sudo chmod +r /etc/ceph/ceph.client.radosgw.ny.keyring #. Generate a key so that the Ceph Object Gateway can provide a user name and @@ -255,14 +298,19 @@ Administration`_ for a discussion on adding keyrings and keys. capabilities to the key. See `Configuration Reference - Pools`_ for details on the effect of write permissions for the monitor and creating pools. :: - sudo ceph-authtool /etc/ceph/ceph.client.radosgw.rg1.keyring -n client.radosgw.rg1-zn1 --gen-key - sudo ceph-authtool -n client.radosgw.rg1-zn1 --cap osd 'allow rwx' --cap mon 'allow rw' /etc/ceph/ceph.client.radosgw.rg1.keyring + sudo ceph-authtool /etc/ceph/ceph.client.radosgw.ny.keyring -n client.radosgw.ny-ny --gen-key + sudo ceph-authtool /etc/ceph/ceph.client.radosgw.ny.keyring -n client.radosgw.ldn-ny --gen-key + sudo ceph-authtool -n client.radosgw.ny-ny --cap osd 'allow rwx' --cap mon 'allow rw' /etc/ceph/ceph.client.radosgw.ny.keyring + sudo ceph-authtool -n client.radosgw.ldn-ny --cap osd 'allow rwx' --cap mon 'allow rw' /etc/ceph/ceph.client.radosgw.ny.keyring + **Note:** You will need to generate a key for each zone that will access + the Ceph Storage Cluster (assuming 1 per region). + #. Once you have created a keyring and key to enable the Ceph Object Gateway with access to the Ceph Storage Cluster, add it as an entry to your Ceph Storage Cluster. For example:: - sudo ceph -k /etc/ceph/ceph.client.admin.keyring auth add client.radosgw.rg1-zn1 -i /etc/ceph/ceph.client.radosgw.rg1.keyring + sudo ceph -k /etc/ceph/ceph.client.admin.keyring auth add client.radosgw.ny-ny -i /etc/ceph/ceph.client.radosgw.ny.keyring Create a Gateway Configuration @@ -321,7 +369,7 @@ script, execute the following procedures on the server node. Copy the following into the editor. :: #!/bin/sh - exec /usr/bin/radosgw -c /etc/ceph/ceph.conf -n client.radosgw.rg1-zn1-instance1 + exec /usr/bin/radosgw -c /etc/ceph/ceph.conf -n client.radosgw.ny-ny-instance1 #. Save the file. @@ -340,16 +388,16 @@ client of the Ceph Storage Cluster, so you must place each instance under a instance ID. For example:: - [client.radosgw.rg1-zn1-instance1] + [client.radosgw.ny-ny-instance1] #Region Info - rgw region = rg1 - rgw region root pool = .rg1.rgw.root + rgw region = ny + rgw region root pool = .ny.rgw.root #Zone Info - rgw zone = rg1-zn1 - rgw zone root pool = .rg1-zn1.rgw.root - keyring = /etc/ceph/ceph.client.radosgw.rg1.keyring + rgw zone = ny-ny + rgw zone root pool = .ny-ny.rgw.root + keyring = /etc/ceph/ceph.client.radosgw.ny.keyring #DNS Info for S3 Subdomains rgw dns name = {hostname} @@ -388,8 +436,8 @@ gateway instance we recommend restarting the ``apache2`` service. For example:: sudo service apache2 restart -Start -===== +Start Gateways +============== Start up the ``radosgw`` service. When starting the service with other than the default region and zone, you must specify them explicitly. :: @@ -397,24 +445,28 @@ the default region and zone, you must specify them explicitly. :: sudo /etc/init.d/radosgw start --rgw-region={region} --rgw-zone={zone} -Activate Metadata Agent -======================= +Synchronize Metadata +==================== + +The metadata agent maintains a global namespace for the cluster. The master +zone of the master region is the source for all other instances in the cluster. -The metadata agent synchronizes metadata between two regions. The source region -is the master region for the cluster, and the destination region is the secondary -region that will receive metadata. -To configure the synchronization agent, retrieve the following from the master -zone of the the source and destination regions: +Configure an Agent +------------------ + +To configure the metadata synchronization agent, retrieve the following from all +zones: - Access Key - Secret Key - Hostname - Port -Specify these values in a configuration file (e.g., ``region-md-sync.conf``), -and include a ``log_file`` name and a an identifier for the ``daemon_id``. For -example: +You only need the hostname and port for a single instance (assuming all gateway +instances in a region/zone access the same Ceph Storage Cluster). Specify these +values in a configuration file (e.g., ``cluster-md-sync.conf``), and include a +``log_file`` name and an identifier for the ``daemon_id``. For example: .. code-block:: ini @@ -426,15 +478,76 @@ example: dest_access_key: {destination-access-key} dest_secret_key: {destination-secret-key} dest_host: {destination-hostname} - dest_port: {destinatio-port} + dest_port: {destination-port} dest_zone: {destination-zone} log_file: {log.filename} daemon_id: {daemon-id} -To activate the metadata agent, execute the following:: +The `Exemplary Cluster`_ assumes that ``ny-ny`` is the master region and zone, +so it is the source for ``ny-ldn``, ``ldn-ldn`` and ``ldn-ny``. + + +Activate an Agent +----------------- + +To activate the metadata synchronization agent, execute the following:: radosgw-agent -c region-md-sync.conf +You must have an agent for each source-destination pair. + + +Replicate Data +============== + +The data synchronization agent replicates the data of a master zone to a +secondary zone. The master zone of a region is the source for the secondary zone +of the region. + + +Configure an Agent +------------------ + +To configure the synchronization agent, retrieve the following from all zones: + +- Access Key +- Secret Key +- Hostname +- Port + +You only need the hostname and port for a single instance (assuming all gateway +instances in a region/zone access the same Ceph Storage Cluster). Specify these +values in a configuration file (e.g., ``cluster-data-sync.conf``), and include a +``log_file`` name and an identifier for the ``daemon_id``. For example: + +.. code-block:: ini + + src_access_key: {source-access-key} + src_secret_key: {source-secret-key} + src_host: {source-hostname} + src_port: {source-port} + src_zone: {source-zone} + dest_access_key: {destination-access-key} + dest_secret_key: {destination-secret-key} + dest_host: {destination-hostname} + dest_port: {destination-port} + dest_zone: {destination-zone} + log_file: {log.filename} + daemon_id: {daemon-id} + +The `Exemplary Cluster`_ assumes that ``ny-ny`` and ``ldn-ldn`` are the master +zones, so they are the source for ``ny-ldn`` and ``ldn-ldn`` respectively. + + +Activate an Agent +----------------- + +To activate the data synchronization agent, execute the following:: + + radosgw-agent -c region-data-sync.conf + +You must have an agent for each source-destination pair. + From 0d2a2c9c2293c5dcb92d15d7a4ae6bf78f55f793 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Tue, 1 Oct 2013 14:38:18 -0700 Subject: [PATCH 009/150] doc: Minor caps change. Signed-off-by: John Wilkins --- doc/images/region-zone-sync.png | Bin 84753 -> 84722 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/images/region-zone-sync.png b/doc/images/region-zone-sync.png index 4a3885a7e154926b2dcc7cf923b1c535899a4d34..7933aca1524c022a722033d5fb39dda5c64ad8a0 100644 GIT binary patch literal 84722 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 z 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 literal 84753 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 G@jn2{ywW8A From 482938af182bdba43f73bc3bef56878a886d2a3c Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Tue, 1 Oct 2013 15:36:00 -0700 Subject: [PATCH 010/150] doc: Fixed a few typos. Signed-off-by: John Wilkins --- doc/radosgw/federated-config.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/radosgw/federated-config.rst b/doc/radosgw/federated-config.rst index 13c30e583a110..6ba0f90d27b82 100644 --- a/doc/radosgw/federated-config.rst +++ b/doc/radosgw/federated-config.rst @@ -132,11 +132,11 @@ Create Regions #. Set the new region as the default region. :: - radosgw-admin region default --rgw-region=r1 + sudo radosgw-admin region default --rgw-region=ny #. Update the region map. :: - radosgw-admin regionmap update + sudo radosgw-admin regionmap update @@ -147,8 +147,8 @@ Create zone users before configuring the zones. :: sudo radosgw-admin user create --uid="ny-ny" --display-name="Region-NY Zone-NY" sudo radosgw-admin user create --uid="ny-ldn" --display-name="Region-NY Zone-LDN" - sudo radosgw-admin user create --uid="ldn-ny" --display-name="Region-LDN Zone-LDN" - sudo radosgw-admin user create --uid="ldn-ldn" --display-name="Region-LDN Zone-NY" + sudo radosgw-admin user create --uid="ldn-ldn" --display-name="Region-LDN Zone-LDN" + sudo radosgw-admin user create --uid="ldn-ny" --display-name="Region-LDN Zone-NY" Copy the ``access_key`` and ``secret_key`` fields for each user. You will need them to configure each zone. From 3257bb480f8e14293b222ceb716dd35f893df7f2 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Tue, 1 Oct 2013 16:25:11 -0700 Subject: [PATCH 011/150] doc: Incorporated some feedback. Signed-off-by: John Wilkins --- doc/radosgw/federated-config.rst | 46 ++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/doc/radosgw/federated-config.rst b/doc/radosgw/federated-config.rst index 6ba0f90d27b82..be5aa1b4864d3 100644 --- a/doc/radosgw/federated-config.rst +++ b/doc/radosgw/federated-config.rst @@ -77,9 +77,9 @@ backend. Configuring Regions and Zones ============================= -For each :term:`Ceph Node` that runs a :term:`Ceph -Object Gateway`, you must install Apache, FastCGI and the Ceph Object Gateway -daemon (``radosgw``). See `Install Apache, FastCGI and Gateway`_ for details. +For each :term:`Ceph Node` that runs a :term:`Ceph Object Gateway`, you must +install Apache, FastCGI and the Ceph Object Gateway daemon (``radosgw``). See +`Install Apache, FastCGI and Gateway`_ for details. Default Region and Zone @@ -94,12 +94,12 @@ if it exists) the default region and zone. Create Regions -------------- -#. Create a region called ``ny``. +#. Configure a region infile called ``region.json`` for the ``ny`` region. - Set ``is_master`` to ``true``. Copy the contents of the following example - to a text editor. Replace ``{fqdn}`` with the fully-qualified domain name - of the endpoint. Then, save the file to ``region.json``. It will specify a - master zone as ``ny-ny`` and list it in the ``zones`` list. + Copy the contents of the following example to a text editor. Set + ``is_master`` to ``true``. Replace ``{fqdn}`` with the fully-qualified + domain name of the endpoint. It will specify a master zone as ``ny-ny`` and + list it in the ``zones`` list along with the ``ny-ldn`` zone. See `Configuration Reference - Regions`_ for details.:: { "name": "ny", @@ -110,6 +110,11 @@ Create Regions "master_zone": "ny-ny", "zones": [ { "name": "ny-ny", + "endpoints": [ + "http:\/\/{fqdn}:80\/"], + "log_meta": "false", + "log_data": "false"}, + { "name": "ny-ldn", "endpoints": [ "http:\/\/{fqdn}:80\/"], "log_meta": "false", @@ -118,22 +123,25 @@ Create Regions "default_placement": ""} -#. To create ``ny``, execute:: +#. Create the ``ny`` region using the ``region.json`` infile you just + created. :: sudo radosgw-admin region set --infile region.json Repeat the foregoing process to create region ``ldn``, but set ``is_master`` to ``false`` and update the ``master_zone`` and - ``zones`` fields. + ``zones`` values. #. Delete the default region. :: rados -p .rgw.root rm region_info.default -#. Set the new region as the default region. :: +#. Set the ``ny`` region as the default region. :: sudo radosgw-admin region default --rgw-region=ny + Only one region can be the default region for a cluster. + #. Update the region map. :: sudo radosgw-admin regionmap update @@ -157,13 +165,15 @@ to configure each zone. Create a Zone ------------- -#. Create a zone called ``ny-ny``. +#. Configure a zone infile called ``zone.json`` for the ``ny-ny`` zone. + Copy the contents of the following example to a text editor. Paste the contents of the ``access_key`` and ``secret_key`` fields from the step of creating a zone user into the ``system_key`` field. This configuration uses pool names prepended with the region name and zone name. - See `Configuration Reference - Pools`_ for details on gateway pools. - See `Configuration Reference - Zones`_ for details on zones. :: + See `Configuration Reference - Pools`_ for additional details on gateway + pools. See `Configuration Reference - Zones`_ for additional details on + zones. :: { "domain_root": ".ny-ny.rgw", "control_pool": ".ny-ny.rgw.control", @@ -179,12 +189,14 @@ Create a Zone } -#. To create ``ny-ny``, execute:: +#. Create the ``ny-ny`` zone using the ``zone.json`` infile you just + created. :: sudo radosgw-admin zone set --rgw-zone=ny-ny --infile zone.json - Repeat the previous to steps to create zones ``ny-ldn``, ``ldn-ny``, - and ``ldn-ldn`` (replacing ``ny-ny`` in the ``zone.json`` file). + Repeat the previous two steps to create zones ``ny-ldn``, ``ldn-ldn``, + and ``ldn-ny`` (replacing ``ny-ny`` in the ``zone.json`` file). + #. Delete the default zone. :: From 29009b2ba718537769d24f195e98654e7050591f Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Wed, 2 Oct 2013 16:34:40 -0700 Subject: [PATCH 012/150] doc: Updated diagram for added clarity. Signed-off-by: John Wilkins --- doc/images/region-zone-sync.png | Bin 84722 -> 78497 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/images/region-zone-sync.png b/doc/images/region-zone-sync.png index 7933aca1524c022a722033d5fb39dda5c64ad8a0..de2d9c3ade06f689dd23a609d26641b8636bdb28 100644 GIT binary patch literal 78497 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 h|NjYQ{$JL?U-`(#1 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 z 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 From 0ce10460ad8ac7abc0a613ddd3a8866368e16980 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Thu, 3 Oct 2013 12:32:49 -0700 Subject: [PATCH 013/150] doc: Added clarifying comments. Signed-off-by: John Wilkins --- doc/radosgw/federated-config.rst | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/doc/radosgw/federated-config.rst b/doc/radosgw/federated-config.rst index be5aa1b4864d3..9a71cb351f3bb 100644 --- a/doc/radosgw/federated-config.rst +++ b/doc/radosgw/federated-config.rst @@ -51,7 +51,7 @@ abbreviations: Zones are logical containers for the gateway instances. The physical location of the gateway instances is up to you, but disaster recovery is an important -consideration. A disaster can be as simple as a power failure or a network +consideration. A disaster can be as simple as a power failure or a network failure. Yet, it can also involve a natural disaster or a significant political or economic event. In such cases, it is prudent to maintain a secondary zone outside of the geographic (not logical) region. @@ -90,6 +90,10 @@ defaults are the master region and master zone for a cluster. When you configure your cluster for regions and zones, you will be replacing (and likely deleting, if it exists) the default region and zone. +In the exemplary cluster, the New York region and New York zone (``ny-ny``) +are the master region and zone respectively. All other instances retrieve +their metadata from the master region and zone. + Create Regions -------------- @@ -114,7 +118,7 @@ Create Regions "http:\/\/{fqdn}:80\/"], "log_meta": "false", "log_data": "false"}, - { "name": "ny-ldn", + { "name": "ny-ldn", "endpoints": [ "http:\/\/{fqdn}:80\/"], "log_meta": "false", @@ -129,8 +133,9 @@ Create Regions sudo radosgw-admin region set --infile region.json Repeat the foregoing process to create region ``ldn``, but set - ``is_master`` to ``false`` and update the ``master_zone`` and - ``zones`` values. + ``is_master`` to ``false``. Update the ``master_zone`` so that it is + set to ``ldn-ldn``. Ensure that you have entries for ``ldn-ldn`` and + ``ldn-ny`` in the ``zones`` values. #. Delete the default region. :: From 4bb2a4bd4a56f9a6bf956be875537d4a829a5ce3 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Tue, 15 Oct 2013 13:35:37 -0700 Subject: [PATCH 014/150] doc: Updated to ensure that socket name isn't static. Signed-off-by: John Wilkins --- doc/radosgw/rgw.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/radosgw/rgw.conf b/doc/radosgw/rgw.conf index e1bee99863104..bb02720e3a6d9 100644 --- a/doc/radosgw/rgw.conf +++ b/doc/radosgw/rgw.conf @@ -1,4 +1,4 @@ -FastCgiExternalServer /var/www/s3gw.fcgi -socket /tmp/radosgw.sock +FastCgiExternalServer /var/www/s3gw.fcgi -socket /{path}/{socket-name}.sock From b422d4a1d5cbbb00e3cd0c40393c990e3dcf0edc Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Tue, 22 Oct 2013 13:20:59 -0700 Subject: [PATCH 015/150] doc: Removed old files. Consolidated contents into new IA. Signed-off-by: John Wilkins --- doc/install/build-packages.rst | 56 -------- doc/install/build-prerequisites.rst | 90 ------------- doc/install/building-ceph.rst | 29 ----- doc/install/contributing.rst | 8 -- doc/install/debian.rst | 150 --------------------- doc/install/git.rst | 50 ------- doc/install/libvirt-deb.rst | 43 ------- doc/install/libvirt-rpm.rst | 19 --- doc/install/qemu-deb.rst | 26 ---- doc/install/qemu-rpm.rst | 56 -------- doc/install/rpm.rst | 193 ---------------------------- 11 files changed, 720 deletions(-) delete mode 100644 doc/install/build-packages.rst delete mode 100644 doc/install/build-prerequisites.rst delete mode 100644 doc/install/building-ceph.rst delete mode 100644 doc/install/contributing.rst delete mode 100644 doc/install/debian.rst delete mode 100644 doc/install/git.rst delete mode 100644 doc/install/libvirt-deb.rst delete mode 100644 doc/install/libvirt-rpm.rst delete mode 100644 doc/install/qemu-deb.rst delete mode 100644 doc/install/qemu-rpm.rst delete mode 100644 doc/install/rpm.rst diff --git a/doc/install/build-packages.rst b/doc/install/build-packages.rst deleted file mode 100644 index 2e5662099d26c..0000000000000 --- a/doc/install/build-packages.rst +++ /dev/null @@ -1,56 +0,0 @@ -===================== - Build Ceph Packages -===================== - -To build packages, you must clone the `Ceph`_ repository. You can create -installation packages from the latest code using ``dpkg-buildpackage`` for -Debian/Ubuntu or ``rpmbuild`` for the RPM Package Manager. - -.. tip:: When building on a multi-core CPU, use the ``-j`` and the number of - cores * 2. For example, use ``-j4`` for a dual-core processor to accelerate - the build. - -Advanced Package Tool (APT) -=========================== - -To create ``.deb`` packages for Debian/Ubuntu, ensure that you have cloned the -`Ceph`_ repository, installed the `build prerequisites`_ and installed -``debhelper``:: - - sudo apt-get install debhelper - -Once you have installed debhelper, you can build the packages:: - - sudo dpkg-buildpackage - -For multi-processor CPUs use the ``-j`` option to accelerate the build. - -RPM Package Manager -=================== - -To create ``.rpm`` packages, ensure that you have cloned the `Ceph`_ repository, -installed the `build prerequisites`_ and installed ``rpm-build`` and -``rpmdevtools``:: - - yum install rpm-build rpmdevtools - -Once you have installed the tools, setup an RPM compilation environment:: - - rpmdev-setuptree - -Fetch the source tarball for the RPM compilation environment:: - - wget -P ~/rpmbuild/SOURCES/ http://ceph.com/download/ceph-.tar.gz - -Or from the EU mirror:: - - wget -P ~/rpmbuild/SOURCES/ http://eu.ceph.com/download/ceph-.tar.gz - -Build the RPM packages:: - - rpmbuild -tb ~/rpmbuild/SOURCES/ceph-.tar.gz - -For multi-processor CPUs use the ``-j`` option to accelerate the build. - -.. _build prerequisites: ../build-prerequisites -.. _Ceph: ../clone-source diff --git a/doc/install/build-prerequisites.rst b/doc/install/build-prerequisites.rst deleted file mode 100644 index bdb409729ba06..0000000000000 --- a/doc/install/build-prerequisites.rst +++ /dev/null @@ -1,90 +0,0 @@ -===================== - Build Prerequisites -===================== - -.. tip:: Check this section to see if there are specific prerequisites for your - Linux/Unix distribution. - -Before you can build Ceph source code, you need to install several libraries -and tools. Ceph provides ``autoconf`` and ``automake`` scripts to get you -started quickly. Ceph build scripts depend on the following: - -- ``autotools-dev`` -- ``autoconf`` -- ``automake`` -- ``cdbs`` -- ``gcc`` -- ``g++`` -- ``git`` -- ``libboost-dev`` -- ``libedit-dev`` -- ``libssl-dev`` -- ``libtool`` -- ``libfcgi`` -- ``libfcgi-dev`` -- ``libfuse-dev`` -- ``linux-kernel-headers`` -- ``libcrypto++-dev`` -- ``libcrypto++`` -- ``libexpat1-dev`` -- ``pkg-config`` -- ``libcurl4-gnutls-dev`` - -On Ubuntu, execute ``sudo apt-get install`` for each dependency that isn't -installed on your host. :: - - sudo apt-get install autotools-dev autoconf automake cdbs gcc g++ git libboost-dev libedit-dev libssl-dev libtool libfcgi libfcgi-dev libfuse-dev linux-kernel-headers libcrypto++-dev libcrypto++ libexpat1-dev - -On Debian/Squeeze, execute ``aptitude install`` for each dependency that isn't -installed on your host. :: - - aptitude install autotools-dev autoconf automake cdbs gcc g++ git libboost-dev libedit-dev libssl-dev libtool libfcgi libfcgi-dev libfuse-dev linux-kernel-headers libcrypto++-dev libcrypto++ libexpat1-dev pkg-config libcurl4-gnutls-dev - -On Debian/Wheezy, you may also need:: - - keyutils-dev libaio libboost-thread-dev - -.. note:: Some distributions that support Google's memory profiler tool may use - a different package name (e.g., ``libgoogle-perftools4``). - -Ubuntu -====== - -- ``uuid-dev`` -- ``libkeyutils-dev`` -- ``libgoogle-perftools-dev`` -- ``libatomic-ops-dev`` -- ``libaio-dev`` -- ``libgdata-common`` -- ``libgdata13`` -- ``libsnappy-dev`` -- ``libleveldb-dev`` - -Execute ``sudo apt-get install`` for each dependency that isn't installed on -your host. :: - - sudo apt-get install uuid-dev libkeyutils-dev libgoogle-perftools-dev libatomic-ops-dev libaio-dev libgdata-common libgdata13 libsnappy-dev libleveldb-dev - - -Debian -====== - -Alternatively, you may also install:: - - aptitude install fakeroot dpkg-dev - aptitude install debhelper cdbs libexpat1-dev libatomic-ops-dev - -openSUSE 11.2 (and later) -========================= - -- ``boost-devel`` -- ``gcc-c++`` -- ``libedit-devel`` -- ``libopenssl-devel`` -- ``fuse-devel`` (optional) - -Execute ``zypper install`` for each dependency that isn't installed on your -host. :: - - zypper install boost-devel gcc-c++ libedit-devel libopenssl-devel fuse-devel - diff --git a/doc/install/building-ceph.rst b/doc/install/building-ceph.rst deleted file mode 100644 index e8b4b3551b78a..0000000000000 --- a/doc/install/building-ceph.rst +++ /dev/null @@ -1,29 +0,0 @@ -=============== - Building Ceph -=============== - -Ceph provides ``automake`` and ``configure`` scripts to streamline the build -process. To build Ceph, navigate to your cloned Ceph repository and execute the -following:: - - cd ceph - ./autogen.sh - ./configure - make - -.. topic:: Hyperthreading - - You can use ``make -j`` to execute multiple jobs depending upon your system. For - example, ``make -j4`` for a dual core processor may build faster. - - -To install Ceph locally, you may also use:: - - sudo make install - -If you install Ceph locally, ``make`` will place the executables in -``usr/local/bin``. You may add the Ceph configuration file to the -``usr/local/bin`` directory to run an evaluation environment of Ceph from a -single directory. - -.. _Memory Profiling: ../../rados/operations/memory-profiling \ No newline at end of file diff --git a/doc/install/contributing.rst b/doc/install/contributing.rst deleted file mode 100644 index 87b5220b7744e..0000000000000 --- a/doc/install/contributing.rst +++ /dev/null @@ -1,8 +0,0 @@ -========================== - Contributing Source Code -========================== - -If you are making source contributions to the Ceph project, -you must be added to the `Ceph project`_ on github. - -.. _Ceph project: https://github.com/ceph \ No newline at end of file diff --git a/doc/install/debian.rst b/doc/install/debian.rst deleted file mode 100644 index c0c4dcb4205ef..0000000000000 --- a/doc/install/debian.rst +++ /dev/null @@ -1,150 +0,0 @@ -=================================== - Installing Debian/Ubuntu Packages -=================================== - -You may install stable release packages (for stable deployments), -development release packages (for the latest features), or development -testing packages (for development and QA only). Do not add multiple -package sources at the same time. - -Install Release Key -=================== - -Packages are cryptographically signed with the ``release.asc`` key. -Add our release key to your system's list of trusted keys to avoid a -security warning:: - - wget -q -O- 'https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc' | sudo apt-key add - - -Add Release Packages -==================== - - -Dumpling --------- - -Dumpling is the most recent major release of Ceph. These packages are -recommended for anyone deploying Ceph in a production environment. -Critical bug fixes are backported and point releases are made as -necessary. - -Add our package repository to your system's list of APT sources. -See `the dumpling Debian repository`_ for a complete list of Debian and Ubuntu releases -supported. :: - - echo deb http://ceph.com/debian-dumpling/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list - -For the European users there is also a mirror in the Netherlands at http://eu.ceph.com/ :: - - echo deb http://eu.ceph.com/debian-dumpling/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list - - - -Cuttlefish ----------- - -Cuttlefish is the previous major release of Ceph. These packages are -recommended for those who have already deployed bobtail in production and are -not yet ready to upgrade. - -Add our package repository to your system's list of APT sources. -See `the cuttlefish Debian repository`_ for a complete list of Debian and Ubuntu releases -supported. :: - - echo deb http://ceph.com/debian-cuttlefish/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list - -For the European users there is also a mirror in the Netherlands at http://eu.ceph.com/ :: - - echo deb http://eu.ceph.com/debian-cuttlefish/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list - - -Bobtail -------- - -Bobtail is the second major release of Ceph. These packages are -recommended for those who have already deployed bobtail in production and -are not yet ready to upgrade. - -Add our package repository to your system's list of APT sources. -See `the bobtail Debian repository`_ for a complete list of Debian and Ubuntu releases -supported. :: - - echo deb http://ceph.com/debian-bobtail/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list - -For the European users there is also a mirror in the Netherlands at http://eu.ceph.com/ :: - - echo deb http://eu.ceph.com/debian-bobtail/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list - -Argonaut --------- - -Argonaut is the first major release of Ceph. These packages are -recommended for those who have already deployed Argonaut in production -and are not yet ready to upgrade. - -Add our package repository to your system's list of APT sources. See -`the argonaut Debian repository`_ for a complete list of Debian and Ubuntu releases -supported. :: - - echo deb http://ceph.com/debian-argonaut/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list - -For the European users there is also a mirror in the Netherlands at http://eu.ceph.com/ :: - - echo deb http://eu.ceph.com/debian-argonaut/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list - - -Development Release Packages ----------------------------- - -Our development process generates a new release of Ceph every 3-4 -weeks. These packages are faster-moving than the stable releases, as -they get new features integrated quickly, while still undergoing -several weeks of QA prior to release. - -Add our package repository to your system's list of APT sources. See -`the testing Debian repository`_ for a complete list of Debian and Ubuntu releases -supported. :: - - echo deb http://ceph.com/debian-testing/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list - -For the European users there is also a mirror in the Netherlands at http://eu.ceph.com/ :: - - echo deb http://eu.ceph.com/debian-testing/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list - - -Development Testing Packages ----------------------------- - -We automatically build Debian and Ubuntu packages for current -development branches in the Ceph source code repository. These -packages are intended for developers and QA only. - -Packages are cryptographically signed with the ``autobuild.asc`` key. -Add our autobuild key to your system's list of trusted keys to avoid a -security warning:: - - wget -q -O- 'https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc' | sudo apt-key add - - -Add our package repository to your system's list of APT sources, but -replace ``{BRANCH}`` with the branch you'd like to use (e.g., chef-3, -wip-hack, master, stable). See `the gitbuilder page`_ for a complete -list of distributions we build. :: - - echo deb http://gitbuilder.ceph.com/ceph-deb-$(lsb_release -sc)-x86_64-basic/ref/{BRANCH} $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list - - -Installing Packages -=================== - -Once you have added either release or development packages to APT, -you should update APT's database and install Ceph:: - - sudo apt-get update && sudo apt-get install ceph - - -.. _the dumpling Debian repository: http://ceph.com/debian-dumpling/dists -.. _the cuttlefish Debian repository: http://ceph.com/debian-cuttlefish/dists -.. _the bobtail Debian repository: http://ceph.com/debian-bobtail/dists -.. _the argonaut Debian repository: http://ceph.com/debian-argonaut/dists -.. _the testing Debian repository: http://ceph.com/debian-testing/dists -.. _the gitbuilder page: http://gitbuilder.ceph.com diff --git a/doc/install/git.rst b/doc/install/git.rst deleted file mode 100644 index 2b56007941756..0000000000000 --- a/doc/install/git.rst +++ /dev/null @@ -1,50 +0,0 @@ -============ - Set Up Git -============ - -To clone the Ceph git repository, you must have ``git`` installed -on your local host. - -Install Git -=========== - -To install ``git``, execute:: - - sudo apt-get install git - -You must also have a ``github`` account. If you do not have a -``github`` account, go to `github.com`_ and register. -Follow the directions for setting up git at -`Set Up Git`_. - -.. _github.com: http://github.com -.. _Set Up Git: http://help.github.com/linux-set-up-git - -Generate SSH Keys -================= - -If you intend to commit code to Ceph or to clone using SSH (``git@github.com:ceph/ceph.git``), you must generate SSH keys for github. - -.. tip:: If you only intend to clone the repository, you may - use ``git clone --recursive https://github.com/ceph/ceph.git`` - without generating SSH keys. - -To generate SSH keys for ``github``, execute:: - - ssh-keygen - -Get the key to add to your ``github`` account (the following example -assumes you used the default file path):: - - cat .ssh/id_rsa.pub - -Copy the public key. - -Add the Key -=========== - -Go to your your ``github`` account, click on "Account Settings" (i.e., the -'tools' icon); then, click "SSH Keys" on the left side navbar. - -Click "Add SSH key" in the "SSH Keys" list, enter a name for the key, paste the -key you generated, and press the "Add key" button. \ No newline at end of file diff --git a/doc/install/libvirt-deb.rst b/doc/install/libvirt-deb.rst deleted file mode 100644 index 9365e46c747e3..0000000000000 --- a/doc/install/libvirt-deb.rst +++ /dev/null @@ -1,43 +0,0 @@ -==================== - Installing libvirt -==================== - - -Prerequisites -============= - -- `Install`_ and `configure`_ a Ceph Storage Cluster -- `Install and configure`_ QEMU/KVM - - -Installing ``libvirt`` on Ubuntu 12.04 Precise -============================================== - -``libvirt`` packages are incorporated into the Ubuntu 12.04 precise -distribution. To install ``libvirt`` on precise, execute the following:: - - sudo apt-get update && sudo apt-get install libvirt-bin - - -Installing ``libvirt`` on Earlier Versions of Ubuntu -==================================================== - -For Ubuntu distributions 11.10 oneiric and earlier, you must build ``libvirt`` -from source. Clone the ``libvirt`` repository, and use `AutoGen`_ to generate -the build. Then, execute ``make`` and ``make install`` to complete the -installation. For example:: - - git clone git://libvirt.org/libvirt.git - cd libvirt - ./autogen.sh - make - sudo make install - -See `libvirt Installation`_ for details. - - -.. _libvirt Installation: http://www.libvirt.org/compiling.html -.. _AutoGen: http://www.gnu.org/software/autogen/ -.. _Install: ../index -.. _configure: ../../rados/configuration -.. _Install and configure: ../../rbd/qemu-rbd diff --git a/doc/install/libvirt-rpm.rst b/doc/install/libvirt-rpm.rst deleted file mode 100644 index a94c6e8ae1270..0000000000000 --- a/doc/install/libvirt-rpm.rst +++ /dev/null @@ -1,19 +0,0 @@ -==================== - Installing libvirt -==================== - -To use ``libvirt`` with a Ceph Storage Cluster, you must -have a running Ceph Storage Cluster. You must also install QEMU. -See `Installing QEMU`_ for details. - - -``libvirt`` packages are incorporated into the recent CentOS/RHEL distributions. -To install ``libvirt``, execute the following:: - - sudo yum install libvirt - -See `libvirt Installation`_ for details. - - -.. _libvirt Installation: http://www.libvirt.org/compiling.html -.. _Installing QEMU: ../qemu-rpm \ No newline at end of file diff --git a/doc/install/qemu-deb.rst b/doc/install/qemu-deb.rst deleted file mode 100644 index 29abeafa3bc3d..0000000000000 --- a/doc/install/qemu-deb.rst +++ /dev/null @@ -1,26 +0,0 @@ -================= - Installing QEMU -================= - - - -Installing QEMU (12.04 Precise and later) -========================================= - -QEMU packages are incorporated into Ubuntu 12.04 Precise Pangolin and later -versions. To install QEMU, execute the following:: - - sudo apt-get install qemu - -Installing QEMU (11.10 Oneric and earlier) -========================================== - -For Ubuntu distributions 11.10 Oneiric and earlier, you must install -the 0.15 version of QEMU or later. To build QEMU from source, use the -following procedure:: - - cd {your-development-directory} - git clone git://git.qemu.org/qemu.git - cd qemu - ./configure --enable-rbd - make; make install diff --git a/doc/install/qemu-rpm.rst b/doc/install/qemu-rpm.rst deleted file mode 100644 index 67da2c3714c35..0000000000000 --- a/doc/install/qemu-rpm.rst +++ /dev/null @@ -1,56 +0,0 @@ -================= - Installing QEMU -================= - -To install QEMU with ``yum``, you must ensure that you have -``yum-plugin-priorities`` installed. See `Installing YUM Priorities`_ -for details. - -To install QEMU, execute the following: - -#. Create a ``/etc/yum.repos.d/ceph-qemu.conf`` file with the following - contents:: - - [ceph-qemu] - name=Ceph Packages for QEMU - baseurl=http://ceph.com/packages/ceph-extras/rpm/centos6.3/$basearch - enabled=1 - priority=2 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc - - [ceph-qemu-noarch] - name=Ceph QEMU noarch - baseurl=http://ceph.com/packages/ceph-extras/rpm/centos6.3/noarch - enabled=1 - priority=2 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc - - [ceph-qemu-source] - name=Ceph QEMU Sources - baseurl=http://ceph.com/packages/ceph-extras/rpm/centos6.3/SRPMS - enabled=1 - priority=2 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc - -#. Update your repositories. :: - - sudo yum update - -#. Install QEMU for Ceph. :: - - sudo yum install qemu-kvm qemu-kvm-tools qemu-img - -#. Install additional QEMU packages (optional):: - - sudo yum install qemu-guest-agent qemu-guest-agent-win32 - -See `QEMU and Block Devices`_ for usage. - -.. _QEMU and Block Devices: ../../rbd/qemu-rbd -.. _Installing YUM Priorities: ../yum-priorities \ No newline at end of file diff --git a/doc/install/rpm.rst b/doc/install/rpm.rst deleted file mode 100644 index 9e8cdcd003c44..0000000000000 --- a/doc/install/rpm.rst +++ /dev/null @@ -1,193 +0,0 @@ -======================== - Installing RPM Packages -======================== - -You may install stable release packages (for stable deployments), -development release packages (for the latest features), or development -testing packages (for development and QA only). Do not add multiple -package sources at the same time. - - -Install Release Key -=================== - -Packages are cryptographically signed with the ``release.asc`` key. Add our -release key to your system's list of trusted keys to avoid a security warning:: - - sudo rpm --import 'https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc' - - -Install Prerequisites -===================== - -Ceph may require additional additional third party libraries. -To add the EPEL repository, execute the following:: - - su -c 'rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm' - -Some releases of Ceph require the following packages: - -- snappy -- leveldb -- gdisk -- python-argparse -- gperftools-libs - -To install these packages, execute the following:: - - sudo yum install snappy leveldb gdisk python-argparse gperftools-libs - - -Add Release Packages -==================== - - -Dumpling --------- - -Dumpling is the most recent stable release of Ceph. These packages are -recommended for anyone deploying Ceph in a production environment. -Critical bug fixes are backported and point releases are made as necessary. - -Packages are currently built for the RHEL/CentOS6 (``el6``), Fedora 18 and 19 -(``f18`` and ``f19``), OpenSUSE 12.2 (``opensuse12.2``), and SLES (``sles11``) -platforms. The repository package installs the repository details on your local -system for use with ``yum`` or ``up2date``. - -For example, for CentOS 6 or other RHEL6 derivatives (``el6``):: - - su -c 'rpm -Uvh http://ceph.com/rpm-dumpling/el6/noarch/ceph-release-1-0.el6.noarch.rpm' - -You can download the RPMs directly from:: - - http://ceph.com/rpm-dumpling - - -Cuttlefish ----------- - -Cuttlefish is the previous recent major release of Ceph. These packages are -recommended for those who have already deployed bobtail in production and are -not yet ready to upgrade. - -Packages are currently built for the RHEL/CentOS6 (``el6``), Fedora 17 -(``f17``), OpenSUSE 12 (``opensuse12``), and SLES (``sles11``) -platforms. The repository package installs the repository details on -your local system for use with ``yum`` or ``up2date``. - -For example, for CentOS 6 or other RHEL6 derivatives (``el6``):: - - su -c 'rpm -Uvh http://ceph.com/rpm-cuttlefish/el6/noarch/ceph-release-1-0.el6.noarch.rpm' - -You can download the RPMs directly from:: - - http://ceph.com/rpm-cuttlefish - - -Bobtail -------- - -Bobtail is the second major release of Ceph. These packages are -recommended for those who have already deployed bobtail in production and -are not yet ready to upgrade. - -Packages are currently built for the RHEL/CentOS6 (``el6``), Fedora 17 -(``f17``), OpenSUSE 12 (``opensuse12``), and SLES (``sles11``) -platforms. The repository package installs the repository details on -your local system for use with ``yum`` or ``up2date``. - -Replace the``{DISTRO}`` below with the distro codename:: - - su -c 'rpm -Uvh http://ceph.com/rpm-bobtail/{DISTRO}/x86_64/ceph-release-1-0.el6.noarch.rpm' - -For example, for CentOS 6 or other RHEL6 derivatives (``el6``):: - - su -c 'rpm -Uvh http://ceph.com/rpm-bobtail/el6/x86_64/ceph-release-1-0.el6.noarch.rpm' - -You can download the RPMs directly from:: - - http://ceph.com/rpm-bobtail - - -Development Release Packages ----------------------------- - -Our development process generates a new release of Ceph every 3-4 weeks. These -packages are faster-moving than the stable releases. Development packages have -new features integrated quickly, while still undergoing several weeks of QA -prior to release. - -Packages are cryptographically signed with the ``release.asc`` key. Add our -release key to your system's list of trusted keys to avoid a security warning:: - - sudo rpm --import 'https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc' - -Packages are currently built for the CentOS-6 and Fedora 17 platforms. The -repository package installs the repository details on your local system for use -with ``yum`` or ``up2date``. - -For CentOS-6:: - - su -c 'rpm -Uvh http://ceph.com/rpms/el6/x86_64/ceph-release-1-0.el6.noarch.rpm' - -For Fedora 17:: - - su -c 'rpm -Uvh http://ceph.com/rpms/fc17/x86_64/ceph-release-1-0.fc17.noarch.rpm' - -You can download the RPMs directly from:: - - http://ceph.com/rpm-testing - - - -Adding Ceph to YUM -================== - -You may also add Ceph to the ``/etc/yum.repos.d`` directory. Create a -``ceph.repo`` file. In the example below, replace ``{ceph-stable}`` with -a stable release of Ceph (e.g., ``cuttlefish``, ``dumpling``, etc.) and -``{distro}`` with your Linux distribution (e.g., ``el6``, ``rhel6``, etc.). :: - - [ceph] - name=Ceph packages for $basearch - baseurl=http://ceph.com/rpm-{ceph-stable}/{distro}/$basearch - enabled=1 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc - - [ceph-noarch] - name=Ceph noarch packages - baseurl=http://ceph.com/rpm-{ceph-stable}/{distro}/noarch - enabled=1 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc - - [ceph-source] - name=Ceph source packages - baseurl=http://ceph.com/rpm-{ceph-stable}/{distro}/SRPMS - enabled=0 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc - - -Installing Ceph Deploy -====================== - -Once you have added either release or development packages, or added a -``ceph.repo`` file to ``/etc/yum.repos.d``, you can install ``ceph-deploy``. :: - - sudo yum install ceph-deploy python-pushy - - -Installing Ceph Packages -======================== - -Once you have added either release or development packages, or added a -``ceph.repo`` file to ``/etc/yum.repos.d``, you can install Ceph packages. :: - - sudo yum install ceph - -.. note:: You can also use ``ceph-deploy`` to install Ceph packages. From 06ec0f67079f906cbf3b09d91755d6a6e86351b0 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Tue, 22 Oct 2013 13:21:25 -0700 Subject: [PATCH 016/150] doc: Removed Calxeda reference since it is now the same as normal install. Signed-off-by: John Wilkins --- doc/install/calxeda.rst | 74 ----------------------------------------- 1 file changed, 74 deletions(-) delete mode 100644 doc/install/calxeda.rst diff --git a/doc/install/calxeda.rst b/doc/install/calxeda.rst deleted file mode 100644 index e7cb1697a4ea7..0000000000000 --- a/doc/install/calxeda.rst +++ /dev/null @@ -1,74 +0,0 @@ -======================= - Installing on Calxeda -======================= - -The Calxeda partnership with Inktank brings the Ceph Distributed Storage System -to Calxeda hardware. This document describes how to install Ceph development -packages on Calxeda hardware. - -Ceph on Calxeda uses Debian/Ubuntu Linux. At this time, gitbuilder builds -development packages for Calxeda on the Quantal Quetzal (i.e., 12.10) version of -Ubuntu. The installation process for Ceph on Calxeda is almost identical to the -process for installing Ceph packages on `Debian/Ubuntu`_. - - -Install Key -=========== - -Packages are cryptographically signed with the ``autobuild.asc`` key. Add the -Ceph autobuild key to your system's list of trusted keys to avoid a security -warning:: - - wget -q -O- 'https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc' | sudo apt-key add - - - -Add Package -=========== - -Add the Ceph package repository to your system's list of APT sources, but -replace ``{BRANCH}`` with the branch you'd like to use (e.g., ``master``, -``stable``, ``next``, ``wip-hack``). :: - - echo deb http://gitbuilder.ceph.com/ceph-deb-$(lsb_release -sc)-armv7l-basic/ref/{BRANCH} $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list - sudo apt-get update - - -Prerequisites -============= - -Ceph on Calxeda requires Google's memory profiling tools (``google-perftools``). -The Ceph repository should have a copy at -http://ceph.com/packages/google-perftools/debian. :: - - echo deb http://ceph.com/packages/google-perftools/debian $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/google-perftools.list - sudo apt-get update - sudo apt-get install google-perftools - - -Install Ceph -============ - -Once you have added development packages to APT and installed Google -memory profiling tools, you should update APT's database and install Ceph:: - - sudo apt-get update - sudo apt-get install ceph - -You may also use ceph-deploy to install Ceph, but you must add the key and -packages and install ``google-perftools`` first. - - -Ceph Object Storage Packages -============================ - -If you intend to run Ceph Object Storage on Calxeda hardware, you should add the -``apache2`` and ``fastcgi`` packages **before** installing Ceph Object Storage -components. :: - - echo deb http://gitbuilder.ceph.com/libapache-mod-fastcgi-deb-quantal-arm7l-basic | sudo tee /etc/apt/sources.list.d/fastcgi.list - echo deb http://gitbuilder.ceph.com/apache2-deb-$(lsb_release -sc)-arm7l-basic/ref/ master $(lsb_release -sc) | sudo tee /etc/apt/sources.list.d/apache2.list - -Once you have added these packages, you may install Ceph Object Storage on Calxeda -hardware. - -.. _Debian/Ubuntu: ../debian \ No newline at end of file From 8a36503879fd4577bb69dab594deac1055190654 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Tue, 22 Oct 2013 13:22:17 -0700 Subject: [PATCH 017/150] doc: Moved CPU Profiler docs to dev. Signed-off-by: John Wilkins --- doc/{install => dev}/cpu-profiler.rst | 0 doc/rados/troubleshooting/cpu-profiling.rst | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename doc/{install => dev}/cpu-profiler.rst (100%) diff --git a/doc/install/cpu-profiler.rst b/doc/dev/cpu-profiler.rst similarity index 100% rename from doc/install/cpu-profiler.rst rename to doc/dev/cpu-profiler.rst diff --git a/doc/rados/troubleshooting/cpu-profiling.rst b/doc/rados/troubleshooting/cpu-profiling.rst index e46c5cab5942e..159f7998dcb99 100644 --- a/doc/rados/troubleshooting/cpu-profiling.rst +++ b/doc/rados/troubleshooting/cpu-profiling.rst @@ -64,4 +64,4 @@ To reset ``oprofile``, execute the following command:: you do not commingle results from different tests. .. _oprofile: http://oprofile.sourceforge.net/about/ -.. _Installing Oprofile: ../../../install/cpu-profiler +.. _Installing Oprofile: ../../../dev/cpu-profiler From df9315cddc8990c4b2db0e1006f43cb752a03b80 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Tue, 22 Oct 2013 13:23:07 -0700 Subject: [PATCH 018/150] doc: Removed RGW from quick start, since it is not ceph-deploy enabled. Signed-off-by: John Wilkins --- doc/start/index.rst | 1 - doc/start/quick-rgw.rst | 351 ---------------------------------------- 2 files changed, 352 deletions(-) delete mode 100644 doc/start/quick-rgw.rst diff --git a/doc/start/index.rst b/doc/start/index.rst index 6e9277746d9b9..b1646e57b4bbd 100644 --- a/doc/start/index.rst +++ b/doc/start/index.rst @@ -38,7 +38,6 @@ Ceph Block Devices, the Ceph Filesystem, and Ceph Object Storage. Block Device Quick Start Filesystem Quick Start - Object Storage Quick Start .. raw:: html diff --git a/doc/start/quick-rgw.rst b/doc/start/quick-rgw.rst deleted file mode 100644 index 40cf7d4f4dca2..0000000000000 --- a/doc/start/quick-rgw.rst +++ /dev/null @@ -1,351 +0,0 @@ -============================ - Object Storage Quick Start -============================ - -To use this guide, you must have executed the procedures in the `Storage Cluster -Quick Start`_ guide first. Ensure your :term:`Ceph Storage Cluster` is in an -``active + clean`` state before working with the :term:`Ceph Object Storage`. - -.. note:: Ceph Object Storage is also referred to as RADOS Gateway. - - -Install Apache and FastCGI -========================== - -:term:`Ceph Object Storage` runs on Apache and FastCGI in conjunction with the -:term:`Ceph Storage Cluster`. Install Apache and FastCGI on the server node. Use -the following procedure: - -#. Install Apache and FastCGI on the server machine. :: - - sudo apt-get update && sudo apt-get install apache2 libapache2-mod-fastcgi - -#. Enable the URL rewrite modules for Apache and FastCGI. :: - - sudo a2enmod rewrite - sudo a2enmod fastcgi - -#. Add a line for the ``ServerName`` in the Apache configuration file - (e.g., ``/etc/apache2/httpd.conf`` or ``/etc/apache2/apache2.conf``). - Provide the fully qualified domain name of the server machine - (e.g., ``hostname -f``). :: - - ServerName {fqdn} - -#. Restart Apache so that the foregoing changes take effect. :: - - sudo service apache2 restart - - -Install Ceph Object Storage -=========================== - -Once you have installed and configured Apache and FastCGI, you may install -the Ceph Object Storage daemon (``radosgw``). :: - - sudo apt-get install radosgw - -For details on the preceding steps, see `Ceph Object Storage Manual Install`_. - - -Create a Data Directory -======================= - -Create a data directory on the server node for the instance of ``radosgw``. - -:: - - sudo mkdir -p /var/lib/ceph/radosgw/ceph-radosgw.gateway - - -Modify the Ceph Configuration File -================================== - -On the admin node, perform the following steps: - -#. Open the Ceph configuration file. :: - - vim ceph.conf - -#. Add the following settings to the Ceph configuration file:: - - [client.radosgw.gateway] - host = {host-name} - keyring = /etc/ceph/keyring.radosgw.gateway - rgw socket path = /tmp/radosgw.sock - log file = /var/log/ceph/radosgw.log - - #Add DNS hostname to enable S3 subdomain calls - rgw dns name = {hostname} - -#. Use ``ceph-deploy`` to push a copy the configuration file from the admin - node to the server node. :: - - ceph-deploy --overwrite-conf config push {hostname} - - -Create a Gateway Configuration File -=================================== - -The example configuration file will configure the gateway on the server node to -operate with the Apache FastCGI module, a rewrite rule for OpenStack Swift, and -paths for the log files. To add a configuration file for Ceph Object Storage, -we suggest copying the contents of the example file below to an editor. Then, -follow the steps below to modify it (on your server node). - -.. literalinclude:: rgw.conf - :language: ini - -#. Replace the ``{fqdn}`` entry with the fully-qualified domain name of the - server server. - -#. Replace the ``{email.address}`` entry with the email address for the - server administrator. - -#. Add a ``ServerAlias`` if you wish to use S3-style subdomains. - -#. Save the contents to the ``/etc/apache2/sites-available`` directory on - the server machine. - -#. Enable the site for ``rgw.conf``. :: - - sudo a2ensite rgw.conf - -#. Disable the default site. :: - - sudo a2dissite default - -See `Create rgw.conf`_ for additional details. - - -Add a FastCGI Script -==================== - -FastCGI requires a script for the S3-compatible interface. To create the -script, execute the following procedures on the server node. - -#. Go to the ``/var/www`` directory. :: - - cd /var/www - -#. Open an editor with the file name ``s3gw.fcgi``. :: - - sudo vim s3gw.fcgi - -#. Copy the following into the editor. :: - - #!/bin/sh - exec /usr/bin/radosgw -c /etc/ceph/ceph.conf -n client.radosgw.gateway - -#. Save the file. - -#. Change the permissions on the file so that it is executable. :: - - sudo chmod +x s3gw.fcgi - - -Generate a Keyring and Key -========================== - -Perform the following steps on the server machine. - -#. Ensure the server node is set up with administrator privileges. From - the admin node, execute the following:: - - ceph-deploy admin {hostname} - -#. Create a keyring for Ceph Object Storage. :: - - sudo ceph-authtool --create-keyring /etc/ceph/keyring.radosgw.gateway - sudo chmod +r /etc/ceph/keyring.radosgw.gateway - -#. Create a key for Ceph Object Storage to authenticate with the Ceph Storage - Cluster. :: - - sudo ceph-authtool /etc/ceph/keyring.radosgw.gateway -n client.radosgw.gateway --gen-key - sudo ceph-authtool -n client.radosgw.gateway --cap osd 'allow rwx' --cap mon 'allow rw' /etc/ceph/keyring.radosgw.gateway - -#. Add the key to the Ceph keyring. :: - - sudo ceph -k /etc/ceph/ceph.client.admin.keyring auth add client.radosgw.gateway -i /etc/ceph/keyring.radosgw.gateway - - -Enable SSL -========== - -Some REST clients use HTTPS by default. So you should consider enabling SSL -for Apache on the server machine. :: - - sudo a2enmod ssl - -Once you enable SSL, you should use a trusted SSL certificate. You can -generate a non-trusted SSL certificate using the following:: - - sudo mkdir /etc/apache2/ssl - sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt - -Then, restart Apache. :: - - service apache2 restart - - -Add Wildcard to DNS -=================== - -To use Ceph with S3-style subdomains (e.g., ``bucket-name.domain-name.com``), -you need to add a wildcard to the DNS record of the DNS server you use with the -``radosgw`` daemon. - -.. tip:: The address of the DNS must also be specified in the Ceph - configuration file with the ``rgw dns name = {hostname}`` setting. - -For ``dnsmasq``, consider addding the following ``address`` setting with a dot -(.) prepended to the host name:: - - address=/.{hostname-or-fqdn}/{host-ip-address} - address=/.ceph-node/192.168.0.1 - -For ``bind``, consider adding the a wildcard to the DNS record:: - - $TTL 604800 - @ IN SOA ceph-node. root.ceph-node. ( - 2 ; Serial - 604800 ; Refresh - 86400 ; Retry - 2419200 ; Expire - 604800 ) ; Negative Cache TTL - ; - @ IN NS ceph-node. - @ IN A 192.168.122.113 - * IN CNAME @ - -Restart your DNS server and ping your server with a subdomain to -ensure that your Ceph Object Store ``radosgw`` daemon can process -the subdomain requests. :: - - ping mybucket.{fqdn} - ping mybucket.ceph-node - - -Restart Services -================ - -To ensure that all components have reloaded their configurations, -we recommend restarting your ``ceph`` and ``apaches`` services. Then, -start up the ``radosgw`` service. For example:: - - sudo service ceph restart - sudo service apache2 restart - sudo /etc/init.d/radosgw start - - -Create a User -============= - -To use the Gateway, you must create a Gateway user. First, create a gateway user -for the S3-compatible interface; then, create a subuser for the -Swift-compatible interface. - -Gateway (S3) User ------------------ - -First, create a Gateway user for the S3-compatible interface. :: - - sudo radosgw-admin user create --uid="{username}" --display-name="{Display Name}" - -For example:: - - radosgw-admin user create --uid=johndoe --display-name="John Doe" --email=john@example.com - -.. code-block:: javascript - - { "user_id": "johndoe", - "rados_uid": 0, - "display_name": "John Doe", - "email": "john@example.com", - "suspended": 0, - "subusers": [], - "keys": [ - { "user": "johndoe", - "access_key": "QFAMEDSJP5DEKJO0DDXY", - "secret_key": "iaSFLDVvDdQt6lkNzHyW4fPLZugBAI1g17LO0+87"}], - "swift_keys": [] - } - -Creating a user creates an access_key and secret_key entry for use with any S3 -API-compatible client. - -.. important:: Check the key output. Sometimes radosgw-admin generates a key - with an escape (\) character, and some clients do not know how to handle - escape characters. Remedies include removing the escape character (\), - encapsulating the string in quotes, or simply regenerating the key and - ensuring that it does not have an escape character. - -Subuser -------- - -Next, create a subuser for the Swift-compatible interface. :: - - sudo radosgw-admin subuser create --uid=johndoe --subuser=johndoe:swift --access=full - -.. code-block:: javascript - - { "user_id": "johndoe", - "rados_uid": 0, - "display_name": "John Doe", - "email": "john@example.com", - "suspended": 0, - "subusers": [ - { "id": "johndoe:swift", - "permissions": "full-control"}], - "keys": [ - { "user": "johndoe", - "access_key": "QFAMEDSJP5DEKJO0DDXY", - "secret_key": "iaSFLDVvDdQt6lkNzHyW4fPLZugBAI1g17LO0+87"}], - "swift_keys": []} - -:: - - sudo radosgw-admin key create --subuser=johndoe:swift --key-type=swift --gen-secret - -.. code-block:: javascript - - { "user_id": "johndoe", - "rados_uid": 0, - "display_name": "John Doe", - "email": "john@example.com", - "suspended": 0, - "subusers": [ - { "id": "johndoe:swift", - "permissions": "full-control"}], - "keys": [ - { "user": "johndoe", - "access_key": "QFAMEDSJP5DEKJO0DDXY", - "secret_key": "iaSFLDVvDdQt6lkNzHyW4fPLZugBAI1g17LO0+87"}], - "swift_keys": [ - { "user": "johndoe:swift", - "secret_key": "E9T2rUZNu2gxUjcwUBO8n\/Ev4KX6\/GprEuH4qhu1"}]} - -This step enables you to use any Swift client to connect to and use RADOS -Gateway via the Swift-compatible API. - -RGW's ``user:subuser`` tuple maps to the ``tenant:user`` tuple expected by Swift. - -.. note:: RGW's Swift authentication service only supports - built-in Swift authentication (``-V 1.0``) at this point. See - `RGW Configuration`_ for Keystone integration details. - - -Summary -------- - -Once you have completed this Quick Start, you may use the Ceph Object Store -tutorials. See the `S3-compatible`_ and `Swift-compatible`_ APIs for details. - - -.. _Create rgw.conf: ../../radosgw/config/index.html#create-rgw-conf -.. _Storage Cluster Quick Start: ../quick-ceph-deploy -.. _Ceph Object Storage Manual Install: ../../radosgw/manual-install -.. _RGW Configuration: ../../radosgw/config -.. _S3-compatible: ../../radosgw/s3 -.. _Swift-compatible: ../../radosgw/swift From 6369d96c29c5b844cf119c39e05abc236f0dac8e Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Tue, 22 Oct 2013 13:24:11 -0700 Subject: [PATCH 019/150] doc: Updated Quick Block Device for kernel versions, and linked OS Recommendations. --- doc/start/quick-rbd.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/start/quick-rbd.rst b/doc/start/quick-rbd.rst index 9424457f8c2f0..1bd194f49a863 100644 --- a/doc/start/quick-rbd.rst +++ b/doc/start/quick-rbd.rst @@ -27,6 +27,12 @@ Storage Cluster nodes (unless you use a VM). See `FAQ`_ for details. Install Ceph ============ +#. Verify that you have an appropriate version of the Linux kernel. + See `OS Recommendations`_ for details. :: + + lsb_release -a + uname -r + #. On the admin node, use ``ceph-deploy`` to install Ceph on your ``ceph-client`` node. :: @@ -72,3 +78,4 @@ See `block devices`_ for additional details. .. _Storage Cluster Quick Start: ../quick-ceph-deploy .. _block devices: ../../rbd/rbd .. _FAQ: http://wiki.ceph.com/03FAQs/01General_FAQ#How_Can_I_Give_Ceph_a_Try.3F +.. _OS Recommendations: ../os-recommendations From 314fd2c80c25722e94e3d76d86b64802947c5a0b Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Tue, 22 Oct 2013 13:24:38 -0700 Subject: [PATCH 020/150] doc: Updated OS recommendations with an Emperor entry. Signed-off-by: John Wilkins --- doc/start/os-recommendations.rst | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/doc/start/os-recommendations.rst b/doc/start/os-recommendations.rst index d8b418fe1b0d3..3874d37db8119 100644 --- a/doc/start/os-recommendations.rst +++ b/doc/start/os-recommendations.rst @@ -37,6 +37,35 @@ specific distributions aside from the kernel and system initialization package (i.e., sysvinit, upstart, systemd). +Emperor (0.71) +-------------- + ++----------+----------+--------------------+--------------+---------+------------+ +| Distro | Release | Code Name | Kernel | Notes | Testing | ++==========+==========+====================+==============+=========+============+ +| 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 | ++----------+----------+--------------------+--------------+---------+------------+ +| Ubuntu | 13.04 | Raring Ringtail | linux-3.8.5 | | 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 | B, I | ++----------+----------+--------------------+--------------+---------+------------+ +| RHEL | 6.3 | | linux-2.6.32 | 1, 2 | B, I | ++----------+----------+--------------------+--------------+---------+------------+ +| Fedora | 18.0 | Spherical Cow | linux-3.6.0 | | B | ++----------+----------+--------------------+--------------+---------+------------+ +| Fedora | 19.0 | Schrödinger's Cat | linux-3.10.0 | | B | ++----------+----------+--------------------+--------------+---------+------------+ +| OpenSuse | 12.2 | N/A | linux-3.4.0 | 2 | B | ++----------+----------+--------------------+--------------+---------+------------+ + + + Dumpling (0.67) --------------- From 4e6a9a5b9ed0b6f20d79bed73c10228e33ae5e9a Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Tue, 22 Oct 2013 13:25:13 -0700 Subject: [PATCH 021/150] doc: Modified cloning source to include git steps. Consolidation. Signed-off-by: John Wilkins --- doc/install/clone-source.rst | 54 ++++++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/doc/install/clone-source.rst b/doc/install/clone-source.rst index ad7dce4e5b4f9..56ce52f04e543 100644 --- a/doc/install/clone-source.rst +++ b/doc/install/clone-source.rst @@ -2,9 +2,58 @@ Cloning the Ceph Source Code Repository ========================================= -To clone the source, you must install Git. See `Set Up Git`_ for details. +You may clone a Ceph branch of the Ceph source code by going to `github Ceph +Repository`_, selecting a branch (``master`` by default), and clicking the +**Download ZIP** button. -.. _Set Up Git: ../git +.. _github Ceph Repository: https://github.com/ceph/ceph + + +To clone the entire git repository, install and configure ``git``. + + +Install Git +=========== + +To install ``git``, execute:: + + sudo apt-get install git + +You must also have a ``github`` account. If you do not have a +``github`` account, go to `github.com`_ and register. +Follow the directions for setting up git at +`Set Up Git`_. + +.. _github.com: http://github.com +.. _Set Up Git: http://help.github.com/linux-set-up-git + + +Add SSH Keys (Optional) +======================= + +If you intend to commit code to Ceph or to clone using SSH +(``git@github.com:ceph/ceph.git``), you must generate SSH keys for github. + +.. tip:: If you only intend to clone the repository, you may + use ``git clone --recursive https://github.com/ceph/ceph.git`` + without generating SSH keys. + +To generate SSH keys for ``github``, execute:: + + ssh-keygen + +Get the key to add to your ``github`` account (the following example +assumes you used the default file path):: + + cat .ssh/id_rsa.pub + +Copy the public key. + +Go to your your ``github`` account, click on "Account Settings" (i.e., the +'tools' icon); then, click "SSH Keys" on the left side navbar. + +Click "Add SSH key" in the "SSH Keys" list, enter a name for the key, paste the +key you generated, and press the "Add key" button. Clone the Source @@ -43,5 +92,4 @@ development branch. You may choose other branches too. :: - git checkout master From dcbaec5e226e71fff99460782092e290936aedfd Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Tue, 22 Oct 2013 13:25:46 -0700 Subject: [PATCH 022/150] doc: Created new stepwise manual install section. Signed-off-by: John Wilkins --- doc/install/index.rst | 95 ++++++++++++++++++------------------------- 1 file changed, 39 insertions(+), 56 deletions(-) diff --git a/doc/install/index.rst b/doc/install/index.rst index 3be09c5d0dfa4..ca094683853b2 100644 --- a/doc/install/index.rst +++ b/doc/install/index.rst @@ -2,75 +2,58 @@ Installation (Manual) ======================= -.. raw:: html -

Advanced Package Tool (APT)

+Get Software +============ -If you are deploying a Ceph cluster on Debian or Ubuntu distributions, -use the instructions below to install packages manually. +There are several methods for getting Ceph software. The easiest and most common +method is to add Ceph repositories for use with package management tools such as +the Advanced Package Tool (APT) or Yellowdog Updater, Modified (YUM). You may +also retrieve pre-compiled packages from the Ceph repository. Finally, you can +retrieve tarballs or clone the Ceph source code repository and build Ceph +yourself. -.. toctree:: - :maxdepth: 2 - - Installing Debian/Ubuntu Packages - Installing on Calxeda Hardware - Installing QEMU - Installing libvirt - -.. raw:: html - -

Redhat Package Manager (RPM) / Yellowdog Updater, Modified (YUM)

- -If you are deploying a Ceph cluster on Red Hat(rhel6), CentOS (el6), Fedora -17-19 (f17-f19), OpenSUSE 12 (opensuse12), and SLES (sles11) distributions, use -the instructions below to install packages manually. .. toctree:: - :maxdepth: 2 + :maxdepth: 1 - Installing RPM Packages - Installing YUM Priorities - Installing QEMU - Installing libvirt + Add Repositories + Get Release Packages + Get Tarballs + Clone Source + Build Ceph -.. raw:: html -

Upgrading Ceph

- -If you are upgrading Ceph from a previous release, please read the the upgrade -documentation to ensure that you follow the proper upgrade sequence. +Install Software +================ -.. toctree:: - :maxdepth: 2 +Once you have the Ceph software (or added repositories), installing the software +is easy. To install packages on each :term:`Ceph Node` in your cluster. You may +use ``ceph-deploy`` to install Ceph for your storage cluster, or use package +management tools. You should install Yum Priorities for RHEL/CentOS and other +distributions that use Yum if you intend to install the Ceph Object Gateway or +QEMU. - Upgrading Ceph - +.. toctree:: + :maxdepth: 1 -.. raw:: html + Install ceph-deploy + Install Ceph Storage Cluster daemons + Install yum priorities + Install Apache/FastCGI + Install QEMU/KVM + Install libvirt + -

Building Ceph

+Upgrade Software +================ -You can build Ceph from source by downloading a release or cloning the ``ceph`` -repository at github. If you intend to build Ceph from source, please see the -build pre-requisites first. Making sure you have all the pre-requisites -will save you time. +As new versions of Ceph become available, you may upgrade your cluster to take +advantage of new functionality. Read the upgrade documentation before you +upgrade your cluster. Sometimes upgrading Ceph requires you to follow an upgrade +sequence. .. toctree:: - :maxdepth: 1 - - Prerequisites - Get a Tarball - Set Up Git - Clone the Source - Build the Source - Install CPU Profiler - Build a Package - Contributing Code - -See the `Development`_ section for additional development details. - -.. raw:: html + :maxdepth: 2 -
- -.. _Development: ../../dev \ No newline at end of file + Upgrading Ceph \ No newline at end of file From 90487e31bd586fa8fb97af093716882b53e06533 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Tue, 22 Oct 2013 13:26:08 -0700 Subject: [PATCH 023/150] doc: Added new guide for adding repositories. Signed-off-by: John Wilkins --- doc/install/add-repositories.rst | 386 +++++++++++++++++++++++++++++++ 1 file changed, 386 insertions(+) create mode 100644 doc/install/add-repositories.rst diff --git a/doc/install/add-repositories.rst b/doc/install/add-repositories.rst new file mode 100644 index 0000000000000..4e94e6a6c2805 --- /dev/null +++ b/doc/install/add-repositories.rst @@ -0,0 +1,386 @@ +================== + Add Repositories +================== + +Adding repositories is the easiest way to install Ceph, because package +management tools will handle the installation of dependencies for you +in most cases. + +Follow this guide to add repositories; then, proceed to the +`Install Ceph Object Storage`_. + + +Add Keys +======== + +Add a key to your system's list of trusted keys to avoid a security warning. For +stable releases (e.g., ``cuttlefish``, ``emperor``) and development releases +(``release-name-rc1``, ``release-name-rc2``), use the ``release.asc`` key. For +development testing packages, use the ``autobuild.asc`` key (developers and QA). + + +APT +--- + +To install the ``release.asc`` key, execute the following:: + + wget -q -O- 'https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc' | sudo apt-key add - + + +To install the ``autobuild.asc`` key, execute the following +(QA and developers only):: + + wget -q -O- 'https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc' | sudo apt-key add - + + +RPM +--- + +To install the ``release.asc`` key, execute the following:: + + sudo rpm --import 'https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc' + +To install the ``autobuild.asc`` key, execute the following +(QA and developers only):: + + sudo rpm --import 'https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc' + + +Add Ceph Release Repos +====================== + +Release repositories use the ``release.asc`` key to verify packages. +To install Ceph packages with the Advanced Package Tool (APT) or +Yellowdog Updater, Modified (YUM), you must add Ceph repositories. + +You may find releases for Debian/Ubuntu (installed with APT) at:: + + http://ceph.com/debian-{release-name} + +You may find releases for CentOS/RHEL and others (installed with YUM) at:: + + http://ceph.com/rpm-{release-name} + +The stable releases of Ceph include: + +- **Emperor:** Emperor is the most recent major release of Ceph. These packages + are recommended for anyone deploying Ceph in a production environment. + Critical bug fixes are backported and point releases are made as necessary. + +- **Dumpling:** Dumpling is the fourth major release of Ceph. These packages + are recommended for anyone deploying Ceph in a production environment. + Critical bug fixes are backported as necessary. + +- **Cuttlefish:** Cuttlefish is the third major release of Ceph. These packages + are recommended for those who have already deployed bobtail in production and + are not yet ready to upgrade. + +- **Bobtail:** Bobtail is the second major release of Ceph. These packages are + recommended for those who have already deployed bobtail in production and + are not yet ready to upgrade. + +- **Argonaut:** Argonaut is the first major release of Ceph. These packages + are recommended for those who have already deployed Argonaut in production + and are not yet ready to upgrade. + +.. tip:: For European users, there is also a mirror in the Netherlands at + http://eu.ceph.com/ :: + + +Debian Packages +--------------- + +Add a Ceph package repository to your system's list of APT sources. For newer +versions of Debian/Ubuntu, call ``lsb_release -sc`` on the command line to +get the short codename, and replace ``{codename}`` in the following command. :: + + sudo apt-add-repository 'deb http://ceph.com/debian-emperor/ {codename} main' + +For early Linux distributions, you may execute the following command:: + + echo deb http://ceph.com/debian-emperor/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list + +For earlier Ceph releases, replace ``{release-name}`` with the name with the +name of the Ceph release. You may call ``lsb_release -sc`` on the command line +to get the short codename, and replace ``{codename}`` in the following command. +:: + + sudo apt-add-repository 'deb http://ceph.com/debian-{release-name}/ {codename} main' + +For older Linux distributions, replace ``{release-name}`` with the name of the +release:: + + echo deb http://ceph.com/debian-{release-name}/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list + +Ceph on ARM processors requires Google's memory profiling tools (``google-perftools``). +The Ceph repository should have a copy at +http://ceph.com/packages/google-perftools/debian. :: + + echo deb http://ceph.com/packages/google-perftools/debian $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/google-perftools.list + + +For development release packages, add our package repository to your system's +list of APT sources. See `the testing Debian repository`_ for a complete list +of Debian and Ubuntu releases supported. :: + + echo deb http://ceph.com/debian-testing/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list + + +RPM Packages +------------ + +For stable releases, you may add a Ceph entry to the ``/etc/yum.repos.d`` +directory. Create a ``ceph.repo`` file. In the example below, replace +``{ceph-release}`` with a stable release of Ceph (e.g., ``dumpling``, +``emperor``, etc.) and ``{distro}`` with your Linux distribution (e.g., ``el6``, +``rhel6``, etc.). You may view http://ceph.com/rpm-{ceph-release}/ directory to +see which distributions Ceph supports. :: + + [ceph] + name=Ceph packages for $basearch + baseurl=http://ceph.com/rpm-{ceph-release}/{distro}/$basearch + enabled=1 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc + + [ceph-noarch] + name=Ceph noarch packages + baseurl=http://ceph.com/rpm-{ceph-release}/{distro}/noarch + enabled=1 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc + + [ceph-source] + name=Ceph source packages + baseurl=http://ceph.com/rpm-{ceph-release}/{distro}/SRPMS + enabled=0 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc + + +For development release packages, you may specify the repository +for development releases instead. :: + + [ceph] + name=Ceph packages for $basearch/$releasever + baseurl=http://ceph.com/rpm-testing/{distro}/$basearch + enabled=1 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc + + [ceph-noarch] + name=Ceph noarch packages + baseurl=http://ceph.com/rpm-testing/{distro}/noarch + enabled=1 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc + + [ceph-source] + name=Ceph source packages + baseurl=http://ceph.com/rpm-testing/{distro}/SRPMS + enabled=0 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc + + +For specific packages, you may retrieve them by specifically downloading the +release package by name. Our development process generates a new release of Ceph +every 3-4 weeks. These packages are faster-moving than the stable releases. +Development packages have new features integrated quickly, while still +undergoing several weeks of QA prior to release. + +The repository package installs the repository details on your local system for +use with ``yum`` or ``up2date``. Replace ``{distro}`` with your Linux distribution, +and ``{release}`` with the specific release of Ceph:: + + su -c 'rpm -Uvh http://ceph.com/rpms/{distro}/x86_64/ceph-{release}.el6.noarch.rpm' + +You can download the RPMs directly from:: + + http://ceph.com/rpm-testing + + +Add Ceph Development Repos +========================== + +Development repositories use the ``autobuild.asc`` key to verify packages. +If you are developing Ceph and need to deploy and test specific Ceph branches, +ensure that you remove stable repository entries first. + +Debian Packages +--------------- + +We automatically build Debian and Ubuntu packages for current +development branches in the Ceph source code repository. These +packages are intended for developers and QA only. + +Add our package repository to your system's list of APT sources, but +replace ``{BRANCH}`` with the branch you'd like to use (e.g., chef-3, +wip-hack, master, stable). See `the gitbuilder page`_ for a complete +list of distributions we build. :: + + echo deb http://gitbuilder.ceph.com/ceph-deb-$(lsb_release -sc)-x86_64-basic/ref/{BRANCH} $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list + + +RPM Packages +------------ + +For current development branches, you may add a Ceph entry to the +``/etc/yum.repos.d`` directory. Create a ``ceph.repo`` file. In the example +below, replace ``{distro}`` with your Linux distribution (e.g., ``centos6``, +``rhel6``, etc.), and ``{branch}`` with the name of the branch you want to +install. :: + + + [ceph-source] + name=Ceph source packages + baseurl=http://gitbuilder.ceph.com/ceph-rpm-{distro}-x86_64-basic/ref/{branch}/SRPMS + enabled=0 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc + + +You may view http://gitbuilder.ceph.com directory to see which distributions +Ceph supports. + + +Add Ceph Object Gateway Repos +============================= + +Ceph Object Gateway works with ordinary Apache and FastCGI libraries. However, +Ceph builds Apache and FastCGI packages that support 100-continue. To use the +Ceph Apache and FastCGI packages, add them to your repository. + + +Debian Packages +--------------- + +Add our Apache and FastCGI packages to your system's list of APT sources if you intend to +use 100-continue. :: + + echo deb http://gitbuilder.ceph.com/apache2-deb-$(lsb_release -sc)-x86_64-basic/ref/master $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph-apache.list + echo deb http://gitbuilder.ceph.com/libapache-mod-fastcgi-deb-$(lsb_release -sc)-x86_64-basic/ref/master $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph-fastcgi.list + + +RPM Packages +------------ + +You may add a Ceph entry to the ``/etc/yum.repos.d`` directory. Create a +``ceph-apache.repo`` file. In the example below, replace ``{distro}`` with your +Linux distribution (e.g., ``el6``, ``rhel6``, etc.). You may view +http://gitbuilder.ceph.com directory to see which distributions Ceph supports. +:: + + + [apache2-ceph-noarch] + name=Apache noarch packages for Ceph + baseurl=http://gitbuilder.ceph.com/apache2-rpm-{distro}-x86_64-basic/ref/master + enabled=1 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc + + [apache2-ceph-source] + name=Apache source packages for Ceph + baseurl=http://gitbuilder.ceph.com/apache2-rpm-{distro}-x86_64-basic/ref/master + enabled=0 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc + + +Repeat the forgoing process by creating a ``ceph-fastcgi.repo`` file. :: + + [fastcgi-ceph-basearch] + name=FastCGI basearch packages for Ceph + baseurl=http://gitbuilder.ceph.com/mod_fastcgi-rpm-{distro}-x86_64-basic/ref/master + enabled=1 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc + + [fastcgi-ceph-noarch] + name=FastCGI noarch packages for Ceph + baseurl=http://gitbuilder.ceph.com/mod_fastcgi-rpm-{distro}-x86_64-basic/ref/master + enabled=1 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc + + [fastcgi-ceph-source] + name=FastCGI source packages for Ceph + baseurl=http://gitbuilder.ceph.com/mod_fastcgi-rpm-{distro}-x86_64-basic/ref/master + enabled=0 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc + + +Add Ceph Extras +=============== + +Some Ceph deployments require additional Ceph packages. Ceph Extras contains +packages for ``curl``, ``leveldb``, ``ceph-deploy``, the SCSI target framework +and even some QEMU packages for RPMs. Add the Ceph Extras repository to ensure +you obtain these additional packages from the Ceph repository. + + +Debian Packages +--------------- + +Add our Ceph Extras package repository to your system's list of APT sources. :: + + echo deb http://ceph.com/packages/ceph-extras/debian $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph-extras.list + + +RPM Packages +------------ + +For RPM packages, add our package repository to your ``/etc/yum.repos.d`` repos (e.g., +``ceph-extras.repo``). Some Ceph packages (e.g., QEMU) must take priority over standard +packages, so you must ensure that you set ``priority=2``. :: + + [ceph-extras] + name=Ceph Extras Packages + baseurl=http://ceph.com/packages/ceph-extras/rpm/{distro}/$basearch + enabled=1 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc + + [ceph-extras-noarch] + name=Ceph Extras noarch + baseurl=http://ceph.com/packages/ceph-extras/rpm/{distro}/noarch + enabled=1 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc + + [ceph-extras-source] + name=Ceph Extras Sources + baseurl=http://ceph.com/packages/ceph-extras/rpm/c{distro}/SRPMS + enabled=1 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc + + + +.. _Install Ceph Object Storage: ../install-storage-cluster +.. _the testing Debian repository: http://ceph.com/debian-testing/dists +.. _the gitbuilder page: http://gitbuilder.ceph.com \ No newline at end of file From b88267b8391847407a82e612dd9182e54624945f Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Tue, 22 Oct 2013 13:26:30 -0700 Subject: [PATCH 024/150] doc: Added guide for getting packages. Still needs work. Signed-off-by: John Wilkins --- doc/install/get-packages.rst | 72 ++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 doc/install/get-packages.rst diff --git a/doc/install/get-packages.rst b/doc/install/get-packages.rst new file mode 100644 index 0000000000000..977aeeaee5d02 --- /dev/null +++ b/doc/install/get-packages.rst @@ -0,0 +1,72 @@ +============== + Get Packages +============== + +If you are attempting to install behind a firewall in an environment without internet +access, you must retrieve the packages (mirrored with all the necessary dependencies) +before attempting an install. + +Debian Packages +=============== + +Ceph requires additional additional third party libraries. + +- libaio1 +- libsnappy1 +- libcurl3 +- curl +- libgoogle-perftools4 +- google-perftools +- libleveldb1 + + +The repository package installs the repository details on your local system for +use with ``apt``. Replace ``{release}`` with the latest Ceph release. Replace +``{version}`` with the latest Ceph version number. Replace ``{distro}`` with +your Linux distribution codename. Replace ``{arch}`` with the CPU architecture. + +:: + + wget -q http://ceph.com/debian-{release}/pool/main/c/ceph/ceph_{version}{distro}_{arch}.deb + + +RPM Packages +============ + +Ceph requires additional additional third party libraries. +To add the EPEL repository, execute the following:: + + su -c 'rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm' + +Ceph requires the following packages: + +- snappy +- leveldb +- gdisk +- python-argparse +- gperftools-libs + + +Packages are currently built for the RHEL/CentOS6 (``el6``), Fedora 18 and 19 +(``f18`` and ``f19``), OpenSUSE 12.2 (``opensuse12.2``), and SLES (``sles11``) +platforms. The repository package installs the repository details on your local +system for use with ``yum`` or ``up2date``. Replace ``{distro}`` with your +distribution. :: + + su -c 'rpm -Uvh http://ceph.com/rpm-emperor/{distro}/noarch/ceph-{version}.{distro}.noarch.rpm' + +For example, for CentOS 6 (``el6``):: + + su -c 'rpm -Uvh http://ceph.com/rpm-emperor/el6/noarch/ceph-release-1-0.el6.noarch.rpm' + +You can download the RPMs directly from:: + + http://ceph.com/rpm-emperor + + +For earlier Ceph releases, replace ``{release-name}`` with the name +with the name of the Ceph release. You may call ``lsb_release -sc`` on the command +line to get the short codename. :: + + su -c 'rpm -Uvh http://ceph.com/rpm-{release-name}/{distro}/noarch/ceph-{version}.{distro}.noarch.rpm' + From 5a6412ef7cfb456d04023cc05bbda8007f35e818 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Tue, 22 Oct 2013 13:27:31 -0700 Subject: [PATCH 025/150] doc: Added a consolidated build document. Prerequisites, build, build packages. Signed-off-by: John Wilkins --- doc/install/build-ceph.rst | 176 +++++++++++++++++++++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 doc/install/build-ceph.rst diff --git a/doc/install/build-ceph.rst b/doc/install/build-ceph.rst new file mode 100644 index 0000000000000..d77d7f885098a --- /dev/null +++ b/doc/install/build-ceph.rst @@ -0,0 +1,176 @@ +============ + Build Ceph +============ + +You can get Ceph software by retrieving Ceph source code and building it yourself. +To build Ceph, you need to set up a development environment, compile Ceph, +and then either install in user space or build packages and install the packages. + +Build Prerequisites +=================== + + +.. tip:: Check this section to see if there are specific prerequisites for your + Linux/Unix distribution. + +Before you can build Ceph source code, you need to install several libraries +and tools. Ceph provides ``autoconf`` and ``automake`` scripts to get you +started quickly. Ceph build scripts depend on the following: + +- ``autotools-dev`` +- ``autoconf`` +- ``automake`` +- ``cdbs`` +- ``gcc`` +- ``g++`` +- ``git`` +- ``libboost-dev`` +- ``libedit-dev`` +- ``libssl-dev`` +- ``libtool`` +- ``libfcgi`` +- ``libfcgi-dev`` +- ``libfuse-dev`` +- ``linux-kernel-headers`` +- ``libcrypto++-dev`` +- ``libcrypto++`` +- ``libexpat1-dev`` +- ``pkg-config`` +- ``libcurl4-gnutls-dev`` + +On Ubuntu, execute ``sudo apt-get install`` for each dependency that isn't +installed on your host. :: + + sudo apt-get install autotools-dev autoconf automake cdbs gcc g++ git libboost-dev libedit-dev libssl-dev libtool libfcgi libfcgi-dev libfuse-dev linux-kernel-headers libcrypto++-dev libcrypto++ libexpat1-dev + +On Debian/Squeeze, execute ``aptitude install`` for each dependency that isn't +installed on your host. :: + + aptitude install autotools-dev autoconf automake cdbs gcc g++ git libboost-dev libedit-dev libssl-dev libtool libfcgi libfcgi-dev libfuse-dev linux-kernel-headers libcrypto++-dev libcrypto++ libexpat1-dev pkg-config libcurl4-gnutls-dev + +On Debian/Wheezy, you may also need:: + + keyutils-dev libaio libboost-thread-dev + +.. note:: Some distributions that support Google's memory profiler tool may use + a different package name (e.g., ``libgoogle-perftools4``). + +Ubuntu +------ + +- ``uuid-dev`` +- ``libkeyutils-dev`` +- ``libgoogle-perftools-dev`` +- ``libatomic-ops-dev`` +- ``libaio-dev`` +- ``libgdata-common`` +- ``libgdata13`` +- ``libsnappy-dev`` +- ``libleveldb-dev`` + +Execute ``sudo apt-get install`` for each dependency that isn't installed on +your host. :: + + sudo apt-get install uuid-dev libkeyutils-dev libgoogle-perftools-dev libatomic-ops-dev libaio-dev libgdata-common libgdata13 libsnappy-dev libleveldb-dev + + +Debian +------ + +Alternatively, you may also install:: + + aptitude install fakeroot dpkg-dev + aptitude install debhelper cdbs libexpat1-dev libatomic-ops-dev + +openSUSE 11.2 (and later) +------------------------- + +- ``boost-devel`` +- ``gcc-c++`` +- ``libedit-devel`` +- ``libopenssl-devel`` +- ``fuse-devel`` (optional) + +Execute ``zypper install`` for each dependency that isn't installed on your +host. :: + + zypper install boost-devel gcc-c++ libedit-devel libopenssl-devel fuse-devel + + + +Build Ceph +========== + +Ceph provides ``automake`` and ``configure`` scripts to streamline the build +process. To build Ceph, navigate to your cloned Ceph repository and execute the +following:: + + cd ceph + ./autogen.sh + ./configure + make + +.. topic:: Hyperthreading + + You can use ``make -j`` to execute multiple jobs depending upon your system. For + example, ``make -j4`` for a dual core processor may build faster. + +See `Installing a Build`_ to install a build in user space. + +Build Ceph Packages +=================== + +To build packages, you must clone the `Ceph`_ repository. You can create +installation packages from the latest code using ``dpkg-buildpackage`` for +Debian/Ubuntu or ``rpmbuild`` for the RPM Package Manager. + +.. tip:: When building on a multi-core CPU, use the ``-j`` and the number of + cores * 2. For example, use ``-j4`` for a dual-core processor to accelerate + the build. + + +Advanced Package Tool (APT) +--------------------------- + +To create ``.deb`` packages for Debian/Ubuntu, ensure that you have cloned the +`Ceph`_ repository, installed the `Build Prerequisites`_ and installed +``debhelper``:: + + sudo apt-get install debhelper + +Once you have installed debhelper, you can build the packages:: + + sudo dpkg-buildpackage + +For multi-processor CPUs use the ``-j`` option to accelerate the build. + + +RPM Package Manager +------------------- + +To create ``.rpm`` packages, ensure that you have cloned the `Ceph`_ repository, +installed the `Build Prerequisites`_ and installed ``rpm-build`` and +``rpmdevtools``:: + + yum install rpm-build rpmdevtools + +Once you have installed the tools, setup an RPM compilation environment:: + + rpmdev-setuptree + +Fetch the source tarball for the RPM compilation environment:: + + wget -P ~/rpmbuild/SOURCES/ http://ceph.com/download/ceph-.tar.gz + +Or from the EU mirror:: + + wget -P ~/rpmbuild/SOURCES/ http://eu.ceph.com/download/ceph-.tar.gz + +Build the RPM packages:: + + rpmbuild -tb ~/rpmbuild/SOURCES/ceph-.tar.gz + +For multi-processor CPUs use the ``-j`` option to accelerate the build. + +.. _Ceph: ../clone-source +.. _Installing a Build: ../install-storage-cluster#installing-a-build From 1bf413eb96700e700421786e44b1f63778a77d62 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Tue, 22 Oct 2013 13:27:59 -0700 Subject: [PATCH 026/150] doc: Added install for storage cluster. Signed-off-by: John Wilkins --- doc/install/install-storage-cluster.rst | 41 +++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 doc/install/install-storage-cluster.rst diff --git a/doc/install/install-storage-cluster.rst b/doc/install/install-storage-cluster.rst new file mode 100644 index 0000000000000..94cddf08b1dc9 --- /dev/null +++ b/doc/install/install-storage-cluster.rst @@ -0,0 +1,41 @@ +============================== + Install Ceph Storage Cluster +============================== + + +Installing with APT +=================== + +Once you have added either release or development packages to APT, you should +update APT's database and install Ceph:: + + sudo apt-get update && sudo apt-get install ceph ceph-mds + + + +Installing with RPM +=================== + +To install pre-requisite packages, execute the following:: + + sudo yum install snappy leveldb gdisk python-argparse gperftools-libs + +Once you have added either release or development packages, or added a +``ceph.repo`` file to ``/etc/yum.repos.d``, you can install Ceph packages. :: + + sudo yum install ceph + +.. note:: You can also use ``ceph-deploy`` to install Ceph packages. + + +Installing a Build +================== + +If you build Ceph from source code, you may install Ceph in user space +by executing the following:: + + sudo make install + +If you install Ceph locally, ``make`` will place the executables in +``usr/local/bin``. You may add the Ceph configuration file to the +``usr/local/bin`` directory to run Ceph from a single directory. \ No newline at end of file From df4adefb5cfa3567fe196d7e7a626f05e1e273de Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Tue, 22 Oct 2013 13:28:20 -0700 Subject: [PATCH 027/150] doc: Added install for Apache with 100-continue support. Signed-off-by: John Wilkins --- doc/install/install-apache.rst | 195 +++++++++++++++++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 doc/install/install-apache.rst diff --git a/doc/install/install-apache.rst b/doc/install/install-apache.rst new file mode 100644 index 0000000000000..642d876f776c7 --- /dev/null +++ b/doc/install/install-apache.rst @@ -0,0 +1,195 @@ +============================= + Installing Apache & FastCGI +============================= + +The :term:`Ceph Object Gateway` runs on Apache and FastCGI. The Ceph Object +Gateway also supports 100-continue. However, you must install Ceph builds +of Apache and FastCGI for 100-continue support. + + +Install w/out 100-Continue +========================== + +You may use standard Apache and FastCGI packages for your Ceph Object +Gateways. However, they will not provide 100-continue support. + +Debian Packages +--------------- + +To install Apache and FastCGI Debian packages, execute the following:: + + sudo apt-get install apache2 libapache2-mod-fastcgi + + +RPM Packages +------------ + +To install Apache and FastCGI RPMs, execute the following:: + + rpm -ivh fcgi-2.4.0-10.el6.x86_64.rpm + rpm -ivh mod_fastcgi-2.4.6-2.el6.rf.x86_64.rpm + + Or:: + + sudo yum install httpd mod_fastcgi + + +Install w/ 100-Continue +======================= + +The Ceph community provides a slightly optimized version of the ``apache2`` +and ``fastcgi`` packages. The material difference is that the Ceph packages are +optimized for the ``100-continue`` HTTP response, where the server determines +if it will accept the request by first evaluating the request header. See `RFC +2616, Section 8`_ for details on ``100-continue``. You can find the most recent +builds of Apache and FastCGI packages modified for Ceph at `gitbuilder.ceph.com`_. + + +Debian Packages +--------------- + +#. Add a ``ceph-apache.list`` file to your APT sources. :: + + echo deb http://gitbuilder.ceph.com/apache2-deb-$(lsb_release -sc)-x86_64-basic/ref/master $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph-apache.list + +#. Add a ``ceph-fastcgi.list`` file to your APT sources. :: + + echo deb http://gitbuilder.ceph.com/libapache-mod-fastcgi-deb-$(lsb_release -sc)-x86_64-basic/ref/master $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph-fastcgi.list + +#. Update your repository and install Apache and FastCGI:: + + sudo apt-get update && sudo apt-get install apache2 libapache2-mod-fastcgi + + +RPM Packages +------------ + +To install Apache with 100-continue, execute the following steps: + +#. Ensure you have ``yum-plugin-priorities`` installed and enabled. See + ``Installing YUM Priorities`_ for details. + +#. Add a ``ceph-apache.repo`` file to ``/etc/yum.repos.d``. Replace + ``{distro}`` with the name of your distribution (e.g., ``centos6``, + ``rhel6``, etc.) :: + + [apache2-ceph-noarch] + name=Apache noarch packages for Ceph + baseurl=http://gitbuilder.ceph.com/apache2-rpm-{distro}-x86_64-basic/ref/master + enabled=1 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc + + [apache2-ceph-source] + name=Apache source packages for Ceph + baseurl=http://gitbuilder.ceph.com/apache2-rpm-{distro}-x86_64-basic/ref/master + enabled=0 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc + + +#. Add a ``ceph-fastcgi.repo`` file to ``/etc/yum.repos.d``. Replace + ``{distro}`` with the name of your distribution (e.g., ``centos6``, + ``rhel6``, etc.) :: + + [fastcgi-ceph-basearch] + name=FastCGI basearch packages for Ceph + baseurl=http://gitbuilder.ceph.com/mod_fastcgi-rpm-centos6-x86_64-basic/ref/master + enabled=1 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc + + [fastcgi-ceph-noarch] + name=FastCGI noarch packages for Ceph + baseurl=http://gitbuilder.ceph.com/mod_fastcgi-rpm-centos6-x86_64-basic/ref/master + enabled=1 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc + + [fastcgi-ceph-source] + name=FastCGI source packages for Ceph + baseurl=http://gitbuilder.ceph.com/mod_fastcgi-rpm-centos6-x86_64-basic/ref/master + enabled=0 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc + + +#. Update your repo and install Apache and FastCGI. :: + + sudo yum update && sudo yum install httpd mod_fastcgi + + +Modify the Configuration +======================== + +To complete the installation, ensure that you have the rewrite module +enabled and FastCGI enabled. The steps differ slightly based upon the +type of package installation. + +Debian-based Packages +--------------------- + +#. Open the ``apache2.conf`` file. :: + + sudo vim /etc/apache2/apache2.conf + + +#. Add a line for the ``ServerName`` in the Apache configuration file. + Provide the fully qualified domain name of the server machine + (e.g., ``hostname -f``). :: + + ServerName {fqdn} + +#. Enable the URL rewrite modules for Apache and FastCGI. :: + + sudo a2enmod rewrite + sudo a2enmod fastcgi + + +#. Restart Apache so that the foregoing changes take effect. :: + + sudo service apache2 restart + + +RPM-based Packages +------------------ + + +#. Open the ``httpd.conf`` file. :: + + sudo vim /etc/httpd/conf/httpd.conf + +#. Uncomment ``#ServerName`` and add the name of your server. + Provide the fully qualified domain name of the server machine + (e.g., ``hostname -f``).:: + + ServerName {fgdn} + +#. Ensure that the Rewrite module is enabled. :: + + #if not present, add: + LoadModule rewrite_module modules/mod_rewrite.so + +#. Save the ``httpd.conf`` file. + +#. Ensure that the FastCGI module is enabled. The installer should + include an ``/etc/httpd/conf.d/fastcgi.conf`` file that loads the + FastCGI module. :: + + #if not present, add: + LoadModule fastcgi_module modules/mod_fastcgi.so + +#. Restart Apache so that the foregoing changes take effect.. :: + + etc/init.d/httpd restart + From fe6520b9e8ec3dbdbbd603fdf03dafacc424cefc Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Tue, 22 Oct 2013 13:28:37 -0700 Subject: [PATCH 028/150] doc: Added install for ceph-deploy. Signed-off-by: John Wilkins --- doc/install/install-ceph-deploy.rst | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 doc/install/install-ceph-deploy.rst diff --git a/doc/install/install-ceph-deploy.rst b/doc/install/install-ceph-deploy.rst new file mode 100644 index 0000000000000..cb2eb34f968a2 --- /dev/null +++ b/doc/install/install-ceph-deploy.rst @@ -0,0 +1,23 @@ +===================== + Install Ceph Deploy +===================== + +The ``ceph-deploy`` tool is a enables you to set up and tear down Ceph clusters +for development, testing and proof-of-concept projects. + + +APT +--- + +To install ``ceph-deploy`` with ``apt``, execute the following:: + + sudo apt-get update && sudo apt-get install ceph-deploy + + +RPM +--- + +To install ``ceph-deploy`` with ``yum``, execute the following:: + + sudo yum install ceph-deploy + From 6c88d405466501788ccdc6a4c0535d7f7d759576 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Tue, 22 Oct 2013 13:28:58 -0700 Subject: [PATCH 029/150] doc: Added install for QEMU. Signed-off-by: John Wilkins --- doc/install/install-qemu.rst | 85 ++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 doc/install/install-qemu.rst diff --git a/doc/install/install-qemu.rst b/doc/install/install-qemu.rst new file mode 100644 index 0000000000000..d47acb43b8943 --- /dev/null +++ b/doc/install/install-qemu.rst @@ -0,0 +1,85 @@ +============== + Install QEMU +============== + +QEMU KVM can interact with Ceph Block Devices via ``librbd``, which is an +important feature for using Ceph with cloud platforms. Once you install QEMU, +see `QEMU and Block Devices`_ for usage. + + +Debian Packages +=============== + +QEMU packages are incorporated into Ubuntu 12.04 Precise Pangolin and later +versions. To install QEMU, execute the following:: + + sudo apt-get install qemu + + +RPM Packages +============ + +To install QEMU with ``yum``, you must ensure that you have +``yum-plugin-priorities`` installed. See `Installing YUM Priorities`_ +for details. + +To install QEMU, execute the following: + +#. Create a ``/etc/yum.repos.d/ceph-qemu.conf`` file with the following + contents:: + + [ceph-qemu] + name=Ceph Packages for QEMU + baseurl=http://ceph.com/packages/ceph-extras/rpm/centos6.3/$basearch + enabled=1 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc + + [ceph-qemu-noarch] + name=Ceph QEMU noarch + baseurl=http://ceph.com/packages/ceph-extras/rpm/centos6.3/noarch + enabled=1 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc + + [ceph-qemu-source] + name=Ceph QEMU Sources + baseurl=http://ceph.com/packages/ceph-extras/rpm/centos6.3/SRPMS + enabled=1 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc + +#. Update your repositories. :: + + sudo yum update + +#. Install QEMU for Ceph. :: + + sudo yum install qemu-kvm qemu-kvm-tools qemu-img + +#. Install additional QEMU packages (optional):: + + sudo yum install qemu-guest-agent qemu-guest-agent-win32 + + + +Building QEMU +============= + +To build QEMU from source, use the following procedure:: + + cd {your-development-directory} + git clone git://git.qemu.org/qemu.git + cd qemu + ./configure --enable-rbd + make; make install + + +.. _QEMU and Block Devices: ../../rbd/qemu-rbd +.. _Installing YUM Priorities: ../yum-priorities \ No newline at end of file From 105fb61f87957095d20f315d4bb12aaab3487577 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Tue, 22 Oct 2013 13:29:13 -0700 Subject: [PATCH 030/150] doc: Added install for libvirt. Signed-off-by: John Wilkins --- doc/install/install-libvirt.rst | 51 +++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 doc/install/install-libvirt.rst diff --git a/doc/install/install-libvirt.rst b/doc/install/install-libvirt.rst new file mode 100644 index 0000000000000..7b17b0ea20037 --- /dev/null +++ b/doc/install/install-libvirt.rst @@ -0,0 +1,51 @@ +================= + Install libvirt +================= + +To use ``libvirt`` with Ceph, you must have a running Ceph Storage Cluster, and +you must have installed and configured `QEMU`_. + + +Debian Packages +=============== + +``libvirt`` packages are incorporated into Ubuntu 12.04 Precise Pangolin and +later versions of Ubuntu. To install ``libvirt`` on these distributions, +execute the following:: + + sudo apt-get update && sudo apt-get install libvirt-bin + + +RPM Packages +============ + +To use ``libvirt`` with a Ceph Storage Cluster, you must have a running Ceph +Storage Cluster and you must also install a version of QEMU with ``rbd`` format +support. See `QEMU`_ for details. + + +``libvirt`` packages are incorporated into the recent CentOS/RHEL distributions. +To install ``libvirt``, execute the following:: + + sudo yum install libvirt + + +Build ``libvirt`` +================= + +For Ubuntu distributions 11.10 oneiric and earlier, you must build ``libvirt`` +from source. Clone the ``libvirt`` repository, and use `AutoGen`_ to generate +the build. Then, execute ``make`` and ``make install`` to complete the +installation. For example:: + + git clone git://libvirt.org/libvirt.git + cd libvirt + ./autogen.sh + make + sudo make install + +See `libvirt Installation`_ for details. + +.. _libvirt Installation: http://www.libvirt.org/compiling.html +.. _AutoGen: http://www.gnu.org/software/autogen/ +.. _QEMU: ../install-qemu From 828537c8597260017d8ade1c5cee934e4859dc9b Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Tue, 22 Oct 2013 17:11:07 -0700 Subject: [PATCH 031/150] doc: Added ARM. Added Calxeda hardware example. fixes: #5608 Signed-off-by: John Wilkins --- doc/start/hardware-recommendations.rst | 105 +++++++++++++++++-------- 1 file changed, 71 insertions(+), 34 deletions(-) diff --git a/doc/start/hardware-recommendations.rst b/doc/start/hardware-recommendations.rst index 90d29e5e7e2c0..58d290aa56414 100644 --- a/doc/start/hardware-recommendations.rst +++ b/doc/start/hardware-recommendations.rst @@ -10,11 +10,7 @@ issues. Hardware planning should include distributing Ceph daemons and other processes that use Ceph across many hosts. Generally, we recommend running Ceph daemons of a specific type on a host configured for that type of daemon. We recommend using other hosts for processes that utilize your -data cluster (e.g., OpenStack, CloudStack, etc). - -`Inktank`_ provides excellent premium support for hardware planning. - -.. _Inktank: http://www.inktank.com +data cluster (e.g., OpenStack, CloudStack, etc). .. tip:: Check out the Ceph blog too. Articles like `Ceph Write Throughput 1`_, @@ -251,33 +247,39 @@ Minimum Hardware Recommendations Ceph can run on inexpensive commodity hardware. Small production clusters and development clusters can run successfully with modest hardware. -+--------------+----------------+------------------------------------+ -| Process | Criteria | Minimum Recommended | -+==============+================+====================================+ -| ``ceph-osd`` | Processor | 1x 64-bit AMD-64/i386 dual-core | -| +----------------+------------------------------------+ -| | RAM | 500 MB per daemon | -| +----------------+------------------------------------+ -| | Volume Storage | 1x Disk per daemon | -| +----------------+------------------------------------+ -| | Network | 2x 1GB Ethernet NICs | -+--------------+----------------+------------------------------------+ -| ``ceph-mon`` | Processor | 1x 64-bit AMD-64/i386 | -| +----------------+------------------------------------+ -| | RAM | 1 GB per daemon | -| +----------------+------------------------------------+ -| | Disk Space | 10 GB per daemon | -| +----------------+------------------------------------+ -| | Network | 2x 1GB Ethernet NICs | -+--------------+----------------+------------------------------------+ -| ``ceph-mds`` | Processor | 1x 64-bit AMD-64/i386 quad-core | -| +----------------+------------------------------------+ -| | RAM | 1 GB minimum per daemon | -| +----------------+------------------------------------+ -| | Disk Space | 1 MB per daemon | -| +----------------+------------------------------------+ -| | Network | 2x 1GB Ethernet NICs | -+--------------+----------------+------------------------------------+ ++--------------+----------------+--------------------------------------+ +| Process | Criteria | Minimum Recommended | ++==============+================+======================================+ +| ``ceph-osd`` | Processor | - 1x 64-bit AMD-64 | +| | | - 1x 32-bit ARM dual-core or better | +| | | - 1x i386 dual-core | +| +----------------+--------------------------------------+ +| | RAM | 500 MB per daemon | +| +----------------+--------------------------------------+ +| | Volume Storage | 1x Disk per daemon | +| +----------------+--------------------------------------+ +| | Network | 2x 1GB Ethernet NICs | ++--------------+----------------+--------------------------------------+ +| ``ceph-mon`` | Processor | - 1x 64-bit AMD-64/i386 | +| | | - 1x 32-bit ARM dual-core or better | +| | | - 1x i386 dual-core | +| +----------------+--------------------------------------+ +| | RAM | 1 GB per daemon | +| +----------------+--------------------------------------+ +| | Disk Space | 10 GB per daemon | +| +----------------+--------------------------------------+ +| | Network | 2x 1GB Ethernet NICs | ++--------------+----------------+--------------------------------------+ +| ``ceph-mds`` | Processor | - 1x 64-bit AMD-64 quad-core | +| | | - 1x 32-bit ARM quad-core | +| | | - 1x i386 quad-core | +| +----------------+--------------------------------------+ +| | RAM | 1 GB minimum per daemon | +| +----------------+--------------------------------------+ +| | Disk Space | 1 MB per daemon | +| +----------------+--------------------------------------+ +| | Network | 2x 1GB Ethernet NICs | ++--------------+----------------+--------------------------------------+ .. tip:: If you are running an OSD with a single disk, create a partition for your volume storage that is separate from the partition @@ -285,13 +287,16 @@ and development clusters can run successfully with modest hardware. OS and the volume storage. -Production Cluster Example -========================== +Production Cluster Examples +=========================== Production clusters for petabyte scale data storage may also use commodity hardware, but should have considerably more memory, processing power and data storage to account for heavy traffic loads. +Dell Example +------------ + A recent (2012) Ceph cluster project is using two fairly robust hardware configurations for Ceph OSDs, and a lighter configuration for monitors. @@ -326,6 +331,38 @@ configurations for Ceph OSDs, and a lighter configuration for monitors. +----------------+----------------+------------------------------------+ +Calxeda Example +--------------- + +A recent (2013) Ceph cluster project is using ARM hardware with low +power consumption and high storage density for for Ceph OSDs. + ++----------------+----------------+----------------------------------------+ +| Configuration | Criteria | Minimum Recommended | ++================+================+========================================+ +| SuperMicro | Processor Card | 3x Calxeda EnergyCard building blocks | +| SC 847 Chassis +----------------+----------------------------------------+ +| 4U | CPU | 4x ECX-1000 ARM 1.4 GHz SoC per card | +| +----------------+----------------------------------------+ +| | RAM | 4 GB per System-on-a-chip (SoC) | +| +----------------+----------------------------------------+ +| | Volume Storage | 36x 3TB Seagate Barracuda SATA | +| +----------------+----------------------------------------+ +| | Client Network | 1x 10GB Ethernet NICs | +| +----------------+----------------------------------------+ +| | OSD Network | 1x 10GB Ethernet NICs | +| +----------------+----------------------------------------+ +| | Mgmt. Network | 1x 1GB Ethernet NICs | ++----------------+----------------+----------------------------------------+ + +The project enables the deployment of 36 Ceph OSD Daemons, one for each +3TB drive. Each processor runs 3 Ceph OSD Daemons. Four processors per +card allows the 12 processors in with just four cards. This configuration +provides 108TB of storage (slightly less after full ratio settings) per +4U chassis. + + + .. _Ceph Write Throughput 1: http://ceph.com/community/ceph-performance-part-1-disk-controller-write-throughput/ .. _Ceph Write Throughput 2: http://ceph.com/community/ceph-performance-part-2-write-throughput-without-ssd-journals/ .. _Argonaut v. Bobtail Performance Preview: http://ceph.com/uncategorized/argonaut-vs-bobtail-performance-preview/ From 53486afa018a859d1c04c1aeaf7a2a697a9332da Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Tue, 22 Oct 2013 17:39:35 -0700 Subject: [PATCH 032/150] doc: Updated docs for OSD Daemon RAM requirements. fixes: 4423 Signed-off-by: John Wilkins --- doc/start/hardware-recommendations.rst | 105 +++++++++++++------------ 1 file changed, 55 insertions(+), 50 deletions(-) diff --git a/doc/start/hardware-recommendations.rst b/doc/start/hardware-recommendations.rst index 58d290aa56414..4af68ba8072de 100644 --- a/doc/start/hardware-recommendations.rst +++ b/doc/start/hardware-recommendations.rst @@ -41,9 +41,9 @@ RAM Metadata servers and monitors must be capable of serving their data quickly, so they should have plenty of RAM (e.g., 1GB of RAM per daemon instance). OSDs do -not require as much RAM for regular operations (e.g., 200MB of RAM per daemon -instance); however, during recovery they need significantly more RAM (e.g., -500MB-1GB). Generally, more RAM is better. +not require as much RAM for regular operations (e.g., 500MB of RAM per daemon +instance); however, during recovery they need significantly more RAM (e.g., ~1GB +per 1TB of storage per daemon). Generally, more RAM is better. Data Storage @@ -58,7 +58,7 @@ for production, but it has the ability to journal and write data simultaneously, whereas XFS and ext4 do not. .. important:: Since Ceph has to write all data to the journal before it can - send an ACK (for XFS and EXT4 at least), having the journals and OSD + send an ACK (for XFS and EXT4 at least), having the journal and OSD performance in balance is really important! @@ -74,7 +74,10 @@ example, a 1 terabyte hard disk priced at $75.00 has a cost of $0.07 per gigabyte (i.e., $75 / 1024 = 0.0732). By contrast, a 3 terabyte hard disk priced at $150.00 has a cost of $0.05 per gigabyte (i.e., $150 / 3072 = 0.0488). In the foregoing example, using the 1 terabyte disks would generally increase the cost -per gigabyte by 40%--rendering your cluster substantially less cost efficient. +per gigabyte by 40%--rendering your cluster substantially less cost efficient. +Also, the larger the storage drive capacity, the more memory per Ceph OSD Daemon +you will need, especially during rebalancing, backfilling and recovery. A +general rule of thumb is ~1GB of RAM for 1TB of storage space. .. tip:: Running multiple OSDs on a single disk--irrespective of partitions--is **NOT** a good idea. @@ -86,18 +89,18 @@ Storage drives are subject to limitations on seek time, access time, read and write times, as well as total throughput. These physical limitations affect overall system performance--especially during recovery. We recommend using a dedicated drive for the operating system and software, and one drive for each -OSD daemon you run on the host. Most "slow OSD" issues arise due to running an -operating system, multiple OSDs, and/or multiple journals on the same drive. +Ceph OSD Daemon you run on the host. Most "slow OSD" issues arise due to running +an operating system, multiple OSDs, and/or multiple journals on the same drive. Since the cost of troubleshooting performance issues on a small cluster likely exceeds the cost of the extra disk drives, you can accelerate your cluster design planning by avoiding the temptation to overtax the OSD storage drives. -You may run multiple OSDs per hard disk drive, but this will likely lead to -resource contention and diminish the overall throughput. You may store a journal -and object data on the same drive, but this may increase the time it takes to -journal a write and ACK to the client. Ceph must write to the journal before it -can ACK the write. The btrfs filesystem can write journal data and object data -simultaneously, whereas XFS and ext4 cannot. +You may run multiple Ceph OSD Daemons per hard disk drive, but this will likely +lead to resource contention and diminish the overall throughput. You may store a +journal and object data on the same drive, but this may increase the time it +takes to journal a write and ACK to the client. Ceph must write to the journal +before it can ACK the write. The btrfs filesystem can write journal data and +object data simultaneously, whereas XFS and ext4 cannot. Ceph best practices dictate that you should run operating systems, OSD data and OSD journals on separate drives. @@ -125,10 +128,10 @@ sequential write throughput when storing multiple journals for multiple OSDs. SSD in a test configuration to gauge performance. Since SSDs have no moving mechanical parts, it makes sense to use them in the -areas of Ceph that do not use a lot of storage space. Relatively inexpensive -SSDs may appeal to your sense of economy. Use caution. Acceptable IOPS are not -enough when selecting an SSD for use with Ceph. There are a few important -performance considerations for journals and SSDs: +areas of Ceph that do not use a lot of storage space (e.g., journals). +Relatively inexpensive SSDs may appeal to your sense of economy. Use caution. +Acceptable IOPS are not enough when selecting an SSD for use with Ceph. There +are a few important performance considerations for journals and SSDs: - **Write-intensive semantics:** Journaling involves write-intensive semantics, so you should ensure that the SSD you choose to deploy will perform equal to @@ -247,39 +250,41 @@ Minimum Hardware Recommendations Ceph can run on inexpensive commodity hardware. Small production clusters and development clusters can run successfully with modest hardware. -+--------------+----------------+--------------------------------------+ -| Process | Criteria | Minimum Recommended | -+==============+================+======================================+ -| ``ceph-osd`` | Processor | - 1x 64-bit AMD-64 | -| | | - 1x 32-bit ARM dual-core or better | -| | | - 1x i386 dual-core | -| +----------------+--------------------------------------+ -| | RAM | 500 MB per daemon | -| +----------------+--------------------------------------+ -| | Volume Storage | 1x Disk per daemon | -| +----------------+--------------------------------------+ -| | Network | 2x 1GB Ethernet NICs | -+--------------+----------------+--------------------------------------+ -| ``ceph-mon`` | Processor | - 1x 64-bit AMD-64/i386 | -| | | - 1x 32-bit ARM dual-core or better | -| | | - 1x i386 dual-core | -| +----------------+--------------------------------------+ -| | RAM | 1 GB per daemon | -| +----------------+--------------------------------------+ -| | Disk Space | 10 GB per daemon | -| +----------------+--------------------------------------+ -| | Network | 2x 1GB Ethernet NICs | -+--------------+----------------+--------------------------------------+ -| ``ceph-mds`` | Processor | - 1x 64-bit AMD-64 quad-core | -| | | - 1x 32-bit ARM quad-core | -| | | - 1x i386 quad-core | -| +----------------+--------------------------------------+ -| | RAM | 1 GB minimum per daemon | -| +----------------+--------------------------------------+ -| | Disk Space | 1 MB per daemon | -| +----------------+--------------------------------------+ -| | Network | 2x 1GB Ethernet NICs | -+--------------+----------------+--------------------------------------+ ++--------------+----------------+-----------------------------------------+ +| Process | Criteria | Minimum Recommended | ++==============+================+=========================================+ +| ``ceph-osd`` | Processor | - 1x 64-bit AMD-64 | +| | | - 1x 32-bit ARM dual-core or better | +| | | - 1x i386 dual-core | +| +----------------+-----------------------------------------+ +| | RAM | ~1GB for 1TB of storage per daemon | +| +----------------+-----------------------------------------+ +| | Volume Storage | 1x storage drive per daemon | +| +----------------+-----------------------------------------+ +| | Journal | 1x SSD partition per daemon (optional) | +| +----------------+-----------------------------------------+ +| | Network | 2x 1GB Ethernet NICs | ++--------------+----------------+-----------------------------------------+ +| ``ceph-mon`` | Processor | - 1x 64-bit AMD-64/i386 | +| | | - 1x 32-bit ARM dual-core or better | +| | | - 1x i386 dual-core | +| +----------------+-----------------------------------------+ +| | RAM | 1 GB per daemon | +| +----------------+-----------------------------------------+ +| | Disk Space | 10 GB per daemon | +| +----------------+-----------------------------------------+ +| | Network | 2x 1GB Ethernet NICs | ++--------------+----------------+-----------------------------------------+ +| ``ceph-mds`` | Processor | - 1x 64-bit AMD-64 quad-core | +| | | - 1x 32-bit ARM quad-core | +| | | - 1x i386 quad-core | +| +----------------+-----------------------------------------+ +| | RAM | 1 GB minimum per daemon | +| +----------------+-----------------------------------------+ +| | Disk Space | 1 MB per daemon | +| +----------------+-----------------------------------------+ +| | Network | 2x 1GB Ethernet NICs | ++--------------+----------------+-----------------------------------------+ .. tip:: If you are running an OSD with a single disk, create a partition for your volume storage that is separate from the partition From b8d54cdf23554e0d705dab81e449104a78a49f34 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Tue, 22 Oct 2013 18:12:46 -0700 Subject: [PATCH 033/150] doc: Fixed typo, clarified example. Signed-off-by: John Wilkins --- doc/start/hardware-recommendations.rst | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/doc/start/hardware-recommendations.rst b/doc/start/hardware-recommendations.rst index 4af68ba8072de..c589301a435c2 100644 --- a/doc/start/hardware-recommendations.rst +++ b/doc/start/hardware-recommendations.rst @@ -339,8 +339,8 @@ configurations for Ceph OSDs, and a lighter configuration for monitors. Calxeda Example --------------- -A recent (2013) Ceph cluster project is using ARM hardware with low -power consumption and high storage density for for Ceph OSDs. +A recent (2013) Ceph cluster project uses ARM hardware to obtain low +power consumption and high storage density. +----------------+----------------+----------------------------------------+ | Configuration | Criteria | Minimum Recommended | @@ -360,12 +360,17 @@ power consumption and high storage density for for Ceph OSDs. | | Mgmt. Network | 1x 1GB Ethernet NICs | +----------------+----------------+----------------------------------------+ -The project enables the deployment of 36 Ceph OSD Daemons, one for each -3TB drive. Each processor runs 3 Ceph OSD Daemons. Four processors per -card allows the 12 processors in with just four cards. This configuration -provides 108TB of storage (slightly less after full ratio settings) per -4U chassis. - +The chassis configuration enables the deployment of 36 Ceph OSD Daemons per +chassis, one for each 3TB drive. Each System-on-a-chip (SoC) processor runs 3 +Ceph OSD Daemons. Four SoC processors per card allows the 12 processors to run +36 Ceph OSD Daemons with capacity remaining for rebalancing, backfilling and +recovery. This configuration provides 108TB of storage (slightly less after full +ratio settings) per 4U chassis. Using a chassis exclusively for Ceph OSD Daemons +makes it easy to expand the cluster's storage capacity significantly with +relative ease. + +**Note:** the project uses Ceph for cold storage, so there are no SSDs +for journals. .. _Ceph Write Throughput 1: http://ceph.com/community/ceph-performance-part-1-disk-controller-write-throughput/ From bd507ef3fdc0ba45996e5c4270ede28a9ff2bbde Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Mon, 28 Oct 2013 17:46:06 -0700 Subject: [PATCH 034/150] doc: Updated with a verified installation procedure and latest usage. Signed-off-by: John Wilkins --- doc/radosgw/federated-config.rst | 877 ++++++++++++++++++------------- 1 file changed, 512 insertions(+), 365 deletions(-) diff --git a/doc/radosgw/federated-config.rst b/doc/radosgw/federated-config.rst index 9a71cb351f3bb..78ab3fbb30db0 100644 --- a/doc/radosgw/federated-config.rst +++ b/doc/radosgw/federated-config.rst @@ -2,18 +2,22 @@ Configuring Federated Gateways ================================ -.. versionadded:: 0.71 +.. versionadded:: 0.72 Emperor -In Ceph version 0.71 and beyond, you may configure Ceph Object Gateways in a -federated architecture, with multiple regions, and with multiple zones for a -region. +In Ceph version 0.72 Emperor and beyond, you may configure each :term:`Ceph +Object Gateway` to participate in a federated architecture, with multiple +regions, and with multiple zones for a region. -- **Region**: A region represents a logical geographic area and contains one +- **Region**: A region represents a *logical* geographic area and contains one or more zones. A cluster with multiple regions must specify a master region. -- **Zone**: A zone is a logical grouping of one or more Ceph Object Gateway +- **Zone**: A zone is a *logical* grouping of one or more Ceph Object Gateway instance(s). A region has a master zone that processes client requests. + +Background +---------- + When you deploy a :term:`Ceph Object Store` service that spans geographical locales, configuring Ceph Object Gateway regions and metadata synchronization agents enables the service to maintain a global namespace, even though Ceph @@ -25,421 +29,465 @@ data synchronization agents enables the service to maintain one or more copy(ies) of the master zone's data. Extra copies of the data are important for failover, backup and disaster recovery. -You may deploy a single Ceph Storage Cluster with a federated architecture -if you have low latency network connections (this isn't recommended). You may -also deploy one Ceph Storage Cluster per region with a separate set of -pools for each zone (typical). You may also deploy a separate Ceph Storage -Cluster for each zone if your requirements and resources warrant this level -of redundancy. +You may deploy a single Ceph Storage Cluster with a federated architecture if +you have low latency network connections (this isn't recommended). You may also +deploy one Ceph Storage Cluster per region with a separate set of pools for +each zone (typical). You may also deploy a separate Ceph Storage Cluster for +each zone if your requirements and resources warrant this level of redundancy. +About this Guide +---------------- -Exemplary Cluster -================= +In the following sections, we will demonstrate how to configure a federated +cluster in two logical steps: -For the purposes of this configuration guide, we provide an exemplary procedure -for setting up two regions and two zones for each region. So the cluster will -comprise four gateway instances--one per zone. A production cluster at the -petabyte scale and beyond would likely involve deploying more instances per -zone. +#. **Configure a Master Region:** This section of the guide describes how to + set up a region with multiple zones, and how to synchronize data between the + master zone and the secondary zone(s) within the master region. + +#. **Configure a Secondary Region:** This section of the guide describes how + to repeat the section on setting up a master region and multiple zones so + that you have two regions with intra-zone synchronization in each region. + Finally, you will learn how to set up a metadata synchronization agent so + that you can maintain a global namespace for the regions in your cluster. -Let's assume the first region represents New York and the second region -represents London. For naming purposes, we will refer to them by their standard -abbreviations: -- New York: ``ny`` -- London: ``ldn`` +Configure a Master Region +========================= -Zones are logical containers for the gateway instances. The physical location of -the gateway instances is up to you, but disaster recovery is an important -consideration. A disaster can be as simple as a power failure or a network -failure. Yet, it can also involve a natural disaster or a significant political -or economic event. In such cases, it is prudent to maintain a secondary zone -outside of the geographic (not logical) region. +This section provides an exemplary procedure for setting up a region, and two +zones within the region. The cluster will comprise two gateway daemon +instances--one per zone. This region will serve as the master region. -Let's assume the master zone for each region is physically located in that -region, and the secondary zone is physically located in another region. For -continuity, our naming convention will use ``{region name}-{zone name}`` format, -but you can use any naming convention you prefer. -- New York Region, Master Zone: ``ny-ny`` -- New York Region, Secondary Zone: ``ny-ldn`` -- London Region, Master Zone: ``ldn-ldn`` -- London Region, Secondary Zone: ``ldn-ny`` +Naming for the Master Region +---------------------------- -.. image:: ../images/region-zone-sync.png +Before configuring the cluster, defining region, zone and instance names will +help you manage your cluster. Let's assume the region represents the United +States, and we refer to it by its standard abbreviation. -To configure the exemplary cluster, you must configure regions and zones. -Once you configure regions and zones, you must configure each instance of a -:term:`Ceph Object Gateway` to use the Ceph Storage Cluster as the data storage -backend. +- United States: ``us`` +Let's assume the zones represent the Eastern and Western United States. For +continuity, our naming convention will use ``{region name}-{zone name}`` format, +but you can use any naming convention you prefer. -Configuring Regions and Zones -============================= +- United States, East Region: ``us-east`` +- United States, West Region: ``us-west`` -For each :term:`Ceph Node` that runs a :term:`Ceph Object Gateway`, you must -install Apache, FastCGI and the Ceph Object Gateway daemon (``radosgw``). See -`Install Apache, FastCGI and Gateway`_ for details. +Finally, let's assume that zones may have more than one Ceph Object Gateway +instance per zone. For continuity, our naming convention will use +``{region name}-{zone name}-{instance}`` format, but you can use any naming +convention you prefer. -Default Region and Zone ------------------------ +- United States Region, Master Zone, Instance 1: ``us-east-1`` +- United States Region, Secondary Zone, Instance 1: ``us-west-1`` -The Ceph Object Gateway can generate its own default gateway and zone. These -defaults are the master region and master zone for a cluster. When you configure -your cluster for regions and zones, you will be replacing (and likely deleting, -if it exists) the default region and zone. -In the exemplary cluster, the New York region and New York zone (``ny-ny``) -are the master region and zone respectively. All other instances retrieve -their metadata from the master region and zone. +Create Pools +------------ + +You may have a Ceph Storage Cluster for the entire region or a Ceph Storage +Cluster for each zone. + +For continuity, our naming convention will use ``{region name}-{zone name}`` +format prepended to the pool name, but you can use any naming convention you +prefer. For example: + + +- ``.us.rgw.root`` + +- ``.us-east.rgw.root`` +- ``.us-east.rgw.control`` +- ``.us-east.rgw.gc`` +- ``.us-east.log`` +- ``.us-east.intent-log`` +- ``.us-east.usage`` +- ``.us-east.users`` +- ``.us-east.users.email`` +- ``.us-east.users.swift`` +- ``.us-east.users.uid`` + +- ``.us-west.rgw.root`` +- ``.us-west.rgw.control`` +- ``.us-west.rgw.gc`` +- ``.us-west.log`` +- ``.us-west.intent-log`` +- ``.us-west.usage`` +- ``.us-west.users`` +- ``.us-west.users.email`` +- ``.us-west.users.swift`` +- ``.us-west.users.uid`` + +See `Configuration Reference - Pools`_ for details on the default pools for +gateways. See `Pools`_ for details on creating pools. Execute the following +to create a pool:: + ceph osd pool create {poolname} {pg-num} {pgp-num} -Create Regions --------------- -#. Configure a region infile called ``region.json`` for the ``ny`` region. +.. tip:: When adding a large number of pools, it may take some time for your + cluster to return to a ``active + clean`` state. - Copy the contents of the following example to a text editor. Set - ``is_master`` to ``true``. Replace ``{fqdn}`` with the fully-qualified - domain name of the endpoint. It will specify a master zone as ``ny-ny`` and - list it in the ``zones`` list along with the ``ny-ldn`` zone. - See `Configuration Reference - Regions`_ for details.:: +.. topic:: CRUSH Maps - { "name": "ny", - "api_name": "ny", - "is_master": "true", - "endpoints": [ - "http:\/\/{fqdn}:80\/"], - "master_zone": "ny-ny", - "zones": [ - { "name": "ny-ny", - "endpoints": [ - "http:\/\/{fqdn}:80\/"], - "log_meta": "false", - "log_data": "false"}, - { "name": "ny-ldn", - "endpoints": [ - "http:\/\/{fqdn}:80\/"], - "log_meta": "false", - "log_data": "false"}], - "placement_targets": [], - "default_placement": ""} + When deploying a Ceph Storage Cluster for the entire region, consider + using a CRUSH rule for the the zone such that you do NOT have overlapping + failure domains. See `CRUSH Map`_ for details. +When you have completed this step, execute the following to ensure that +you have created all of the foregoing pools:: -#. Create the ``ny`` region using the ``region.json`` infile you just - created. :: + rados lspools - sudo radosgw-admin region set --infile region.json - Repeat the foregoing process to create region ``ldn``, but set - ``is_master`` to ``false``. Update the ``master_zone`` so that it is - set to ``ldn-ldn``. Ensure that you have entries for ``ldn-ldn`` and - ``ldn-ny`` in the ``zones`` values. +Create a Keyring +---------------- -#. Delete the default region. :: +Each instance must have a user name and key to communicate with a Ceph Storage +Cluster. In the following steps, we use an admin node to create a keyring. +Then, we create a client user name and key for each instance. Next, we add the +keys to the Ceph Storage Cluster(s). Finally, we distribute the key ring to +each node containing an instance. - rados -p .rgw.root rm region_info.default +#. Create a keyring. :: + + sudo ceph-authtool --create-keyring /etc/ceph/ceph.client.radosgw.keyring + sudo chmod +r /etc/ceph/ceph.client.radosgw.keyring -#. Set the ``ny`` region as the default region. :: - sudo radosgw-admin region default --rgw-region=ny +#. Generate a Ceph Object Gateway user name and key for each instance. :: - Only one region can be the default region for a cluster. + sudo ceph-authtool /etc/ceph/ceph.client.radosgw.keyring -n client.radosgw.us-east-1 --gen-key + sudo ceph-authtool /etc/ceph/ceph.client.radosgw.keyring -n client.radosgw.us-west-1 --gen-key -#. Update the region map. :: - sudo radosgw-admin regionmap update +#. Add capabilities to each key. See `Configuration Reference - Pools`_ for details + on the effect of write permissions for the monitor and creating pools. :: + sudo ceph-authtool -n client.radosgw.us-east-1 --cap osd 'allow rwx' --cap mon 'allow rw' /etc/ceph/ceph.client.radosgw.keyring + sudo ceph-authtool -n client.radosgw.us-west-1 --cap osd 'allow rwx' --cap mon 'allow rw' /etc/ceph/ceph.client.radosgw.keyring -Create Zone Users ------------------ +#. Once you have created a keyring and key to enable the Ceph Object Gateway + with access to the Ceph Storage Cluster, add each key as an entry to your + Ceph Storage Cluster(s). For example:: -Create zone users before configuring the zones. :: + sudo ceph -k /etc/ceph/ceph.client.admin.keyring auth add client.radosgw.us-east-1 -i /etc/ceph/ceph.client.radosgw.keyring + sudo ceph -k /etc/ceph/ceph.client.admin.keyring auth add client.radosgw.us-west-1 -i /etc/ceph/ceph.client.radosgw.keyring - sudo radosgw-admin user create --uid="ny-ny" --display-name="Region-NY Zone-NY" - sudo radosgw-admin user create --uid="ny-ldn" --display-name="Region-NY Zone-LDN" - sudo radosgw-admin user create --uid="ldn-ldn" --display-name="Region-LDN Zone-LDN" - sudo radosgw-admin user create --uid="ldn-ny" --display-name="Region-LDN Zone-NY" -Copy the ``access_key`` and ``secret_key`` fields for each user. You will need them -to configure each zone. +Install Apache/FastCGI +---------------------- -Create a Zone -------------- +For each :term:`Ceph Node` that runs a :term:`Ceph Object Gateway` daemon +instance, you must install Apache, FastCGI, the Ceph Object Gateway daemon +(``radosgw``) and the Ceph Object Gateway Sync Agent (``radosgw-agent``). +See `Install Apache, FastCGI and Gateway`_ for details. -#. Configure a zone infile called ``zone.json`` for the ``ny-ny`` zone. - Copy the contents of the following example to a text editor. - Paste the contents of the ``access_key`` and ``secret_key`` fields from the - step of creating a zone user into the ``system_key`` field. This - configuration uses pool names prepended with the region name and zone name. - See `Configuration Reference - Pools`_ for additional details on gateway - pools. See `Configuration Reference - Zones`_ for additional details on - zones. :: - - { "domain_root": ".ny-ny.rgw", - "control_pool": ".ny-ny.rgw.control", - "gc_pool": ".ny-ny.rgw.gc", - "log_pool": ".ny-ny.log", - "intent_log_pool": ".ny-ny.intent-log", - "usage_log_pool": ".ny-ny.usage", - "user_keys_pool": ".ny-ny.users", - "user_email_pool": ".ny-ny.users.email", - "user_swift_pool": ".ny-ny.users.swift", - "user_uid_pool": ".ny-ny.users.uid", - "system_key": { "access_key": "", "secret_key": ""} - } +Create Data Directories +----------------------- +Create data directories for each daemon instance on their respective +hosts. :: -#. Create the ``ny-ny`` zone using the ``zone.json`` infile you just - created. :: + ssh {us-east-1} + sudo mkdir -p /var/lib/ceph/radosgw/ceph-radosgw.us-east-1 + + ssh {us-west-1} + sudo mkdir -p /var/lib/ceph/radosgw/ceph-radosgw.us-west-1 + - sudo radosgw-admin zone set --rgw-zone=ny-ny --infile zone.json +Create a Gateway Configuration +------------------------------ - Repeat the previous two steps to create zones ``ny-ldn``, ``ldn-ldn``, - and ``ldn-ny`` (replacing ``ny-ny`` in the ``zone.json`` file). +For each instance, create an Ceph Object Gateway configuration file under the +``/etc/apache2/sites-available`` directory on the host(s) where you installed +the Ceph Object Gateway daemon(s). See below for an exemplary embodiment of a +gateway configuration as discussed in the following text. +.. literalinclude:: rgw.conf + :language: ini -#. Delete the default zone. :: +#. Replace the ``/{path}/{socket-name}`` entry with path to the socket and + the socket name. For example, + ``/var/run/ceph/client.radosgw.us-east-1.sock``. Ensure that you use the + same path and socket name in your ``ceph.conf`` entry. - rados -p .rgw.root rm zone_info.default +#. Replace the ``{fqdn}`` entry with the fully-qualified domain name of the + server. + +#. Replace the ``{email.address}`` entry with the email address for the + server administrator. + +#. Add a ``ServerAlias`` if you wish to use S3-style subdomains + (of course you do). +#. Save the configuration to a file (e.g., ``rgw-us-east.conf``). -#. Update the region map. :: +Repeat the process for the secondary zone (e.g., ``rgw-us-west.conf``). - radosgw-admin regionmap update +Enable the Configuration +------------------------ -Create Pools -============ - -If the username(s) and key(s) that provide your Ceph Object Gateway with access -to the Ceph Storage Cluster do not have write capability to the :term:`Ceph -Monitor`, you must create the pools manually. See `Configuration Reference - -Pools`_ for details on the default pools for gateways. See `Pools`_ for -details on creating pools. The default pools for a Ceph Object Gateway are: - -- ``.rgw`` -- ``.rgw.control`` -- ``.rgw.gc`` -- ``.log`` -- ``.intent-log`` -- ``.usage`` -- ``.users`` -- ``.users.email`` -- ``.users.swift`` -- ``.users.uid`` - -The `Exemplary Cluster`_ assumes that you will have a Ceph Storage Cluster for -each region, and that you will create pools for each zone that resides -**physically** in that region (e.g., ``ny-ny`` and ``ldn-ny`` in New York and -``ldn-ldn`` and ``ny-ldn`` in London). For each pool, prepend the name of the -zone name (e.g., ``.ny-ny``, ``.ny-ldn``, ``ldn-ldn``, ``ldn-ny``). For example: - -- ``.ny-ny.rgw`` -- ``.ny-ny.rgw.control`` -- ``.ny-ny.rgw.gc`` -- ``.ny-ny.log`` -- ``.ny-ny.intent-log`` -- ``.ny-ny.usage`` -- ``.ny-ny.users`` -- ``.ny-ny.users.email`` -- ``.ny-ny.users.swift`` -- ``.ny-ny.users.uid`` - - -Execute one of the following:: - - rados mkpool {poolname} - ceph osd pool create {poolname} {pg-num} {pgp-num} +For each instance, enable the gateway configuration and disable the +default site. +#. Enable the site for the gateway configuration. :: -.. tip:: When adding a large number of pools, it may take some time for your - cluster to return to a ``active + clean`` state. + sudo a2ensite {rgw-conf-filename} +#. Disable the default site. :: -Configuring Gateway Instances -============================= + sudo a2dissite default -The `Exemplary Cluster`_ assumes that you will configure an instance for -each zone. In larger deployments, you may need to configure multiple instances -per zone to handle higher loads. +.. note:: Failure to disable the default site can lead to problems. -Before you configure a gateway instance, determine an ID for the instance. You -can name a Ceph Object Gateway instance anything you like. In large clusters -with regions and zones, it may help to add region and zone names into your -instance name. For example:: - ny-ny-instance1 +Add a FastCGI Script +-------------------- -When referring to your instance identifier in the Ceph configuration file, it -is prepended with ``client.radosgw.``. For example, an instance named -``ny-ny-instance1`` will look like this:: +FastCGI requires a script for each Ceph Object Gateway instance to +enable the S3-compatible interface. To create the script, execute +the following procedures. - [client.radosgw.ny-ny-instance1] -Similarly, the default data path for an instance named -``ny-ny-instance1`` is prepended with ``{cluster}-radosgw.``. For -example:: +#. Go to the ``/var/www`` directory. :: - /var/lib/ceph/radosgw/ceph-radosgw.ny-ny-instance1 - + cd /var/www -Create a Data Directory ------------------------ +#. Open an editor with the file name ``s3gw.fcgi``. **Note:** The configuration + file specifies this filename. :: -Create a data directory on the node where you installed ``radosgw``. :: - - sudo mkdir -p /var/lib/ceph/radosgw/ceph-radosgw.ny-ny-instance1 - + sudo vim s3gw.fcgi -Create a Storage Cluster User ------------------------------ +#. Add a shell script with ``exec`` and the path to the gateway binary, + the path to the Ceph configuration file, and the user name (``-n``; + the same user name created in step 2 of `Create a Keyring`_. + Copy the following into the editor. :: -When accessing the Ceph Storage Cluster, each instance of a Ceph Object Gateway -must provide the Ceph Storage Cluster with a user name and key. We recommend -setting up at least one user name and key for each zone. See `Cephx -Administration`_ for a discussion on adding keyrings and keys. + #!/bin/sh + exec /usr/bin/radosgw -c /etc/ceph/ceph.conf -n client.radosgw.{ID} -#. Create a keyring for the Ceph Object Gateway. For example:: + For example:: - sudo ceph-authtool --create-keyring /etc/ceph/ceph.client.radosgw.ny.keyring - sudo chmod +r /etc/ceph/ceph.client.radosgw.ny.keyring + #!/bin/sh + exec /usr/bin/radosgw -c /etc/ceph/ceph.conf -n client.radosgw.us-east-1 +#. Save the file. -#. Generate a key so that the Ceph Object Gateway can provide a user name and - key to authenticate itself with the Ceph Storage Cluster. Then, add - capabilities to the key. See `Configuration Reference - Pools`_ for details - on the effect of write permissions for the monitor and creating pools. :: +#. Change the permissions on the file so that it is executable. :: - sudo ceph-authtool /etc/ceph/ceph.client.radosgw.ny.keyring -n client.radosgw.ny-ny --gen-key - sudo ceph-authtool /etc/ceph/ceph.client.radosgw.ny.keyring -n client.radosgw.ldn-ny --gen-key - sudo ceph-authtool -n client.radosgw.ny-ny --cap osd 'allow rwx' --cap mon 'allow rw' /etc/ceph/ceph.client.radosgw.ny.keyring - sudo ceph-authtool -n client.radosgw.ldn-ny --cap osd 'allow rwx' --cap mon 'allow rw' /etc/ceph/ceph.client.radosgw.ny.keyring + sudo chmod +x s3gw.fcgi - **Note:** You will need to generate a key for each zone that will access - the Ceph Storage Cluster (assuming 1 per region). - -#. Once you have created a keyring and key to enable the Ceph Object Gateway - with access to the Ceph Storage Cluster, add it as an entry to your Ceph - Storage Cluster. For example:: - sudo ceph -k /etc/ceph/ceph.client.admin.keyring auth add client.radosgw.ny-ny -i /etc/ceph/ceph.client.radosgw.ny.keyring +Repeat the process for the secondary zone. + + +Add Instances to Ceph Config File +--------------------------------- + +On an admin node, add an entry for each instance in the Ceph configuration file +for your Ceph Storage Cluster(s). For example:: + + ... + [client.radosgw.us-east-1] + rgw region = us + rgw region root pool = .us.rgw.root + rgw zone = us-east + rgw zone root pool = .us-east.rgw.root + keyring = /etc/ceph/ceph.client.radosgw.keyring + rgw dns name = {hostname} + rgw socket path = /var/run/ceph/$name.sock + host = {host-name} + + [client.radosgw.us-west-1] + rgw region = us + rgw region root pool = .us.rgw.root + rgw zone = ny-queens + rgw zone root pool = .us-west.rgw.root + keyring = /etc/ceph/ceph.client.radosgw.keyring + rgw dns name = {hostname} + rgw socket path = /var/run/ceph/$name.sock + host = {host-name} -Create a Gateway Configuration ------------------------------- -Create an ``rgw.conf`` file under the ``/etc/apache2/sites-available`` directory -on the host(s) where you installed the Ceph Object Gateway daemon(s). See below -for an exemplary embodiment of a gateway configuration as discussed in the -following text. +Then, update each :term:`Ceph Node` with the updated Ceph configuration +file. For example:: -.. literalinclude:: rgw.conf - :language: ini + ceph-deploy --overwrite-conf config {node1} {node2} {nodex} -#. Replace the ``{fqdn}`` entry with the fully-qualified domain name of the - server. - -#. Replace the ``{email.address}`` entry with the email address for the - server administrator. - -#. Add a ``ServerAlias`` if you wish to use S3-style subdomains - (of course you do). +Create a Region +--------------- -Enable the Configuration ------------------------- +#. Configure a region infile called ``us.json`` for the ``us`` region. + Copy the contents of the following example to a text editor. Set + ``is_master`` to ``true``. Replace ``{fqdn}`` with the fully-qualified + domain name of the endpoint. It will specify a master zone as ``us-east`` + and list it in the ``zones`` list along with the ``us-west`` zone. + See `Configuration Reference - Regions`_ for details.:: -#. Enable the site for the gateway configuration (e.g., ``rgw.conf``). :: + { "name": "us", + "api_name": "us", + "is_master": "true", + "endpoints": [ + "http:\/\/{fqdn}:80\/"], + "master_zone": "us-east", + "zones": [ + { "name": "us-east", + "endpoints": [ + "http:\/\/{fqdn}:80\/"], + "log_meta": "false", + "log_data": "false"}, + { "name": "us-west", + "endpoints": [ + "http:\/\/{fqdn}:80\/"], + "log_meta": "false", + "log_data": "false"}], + "placement_targets": [], + "default_placement": ""} - sudo a2ensite rgw.conf -#. Disable the default site. :: +#. Create the ``us`` region using the ``us.json`` infile you just + created. :: - sudo a2dissite default + sudo radosgw-admin region set --infile us.json --name client.radosgw.us-east-1 -.. note:: Failure to disable the default site can lead to problems. +#. Delete the default region (if it exists). :: + rados -p .us.rgw.root rm region_info.default + +#. Set the ``us`` region as the default region. :: -Add a FastCGI Script --------------------- + sudo radosgw-admin region default --rgw-region=us --name client.radosgw.us-east-1 -FastCGI requires a script for the S3-compatible interface. To create the -script, execute the following procedures on the server node. + Only one region can be the default region for a cluster. -#. Go to the ``/var/www`` directory. :: +#. Update the region map. :: - cd /var/www + sudo radosgw-admin regionmap update --name client.radosgw.us-east-1 -#. Open an editor with the file name ``s3gw.fcgi``. :: - sudo vim s3gw.fcgi -#. Add a shell script with ``exec`` and the path to the gateway binary, - the path to the Ceph configuration file, and the user name (``-n``; - the same user name created in step 2 of `Create a Storage Cluster User`_. - Copy the following into the editor. :: +Create Zones +------------ - #!/bin/sh - exec /usr/bin/radosgw -c /etc/ceph/ceph.conf -n client.radosgw.ny-ny-instance1 +#. Configure a zone infile called ``us-east.json`` for the + ``us-east`` zone. -#. Save the file. + Copy the contents of the following example to a text editor. + This configuration uses pool names prepended with the region name and + zone name. See `Configuration Reference - Pools`_ for additional details on + gateway pools. See `Configuration Reference - Zones`_ for additional + details on zones. :: + + { "domain_root": ".us-east.rgw.root", + "control_pool": ".us-east.rgw.control", + "gc_pool": ".us-east.rgw.gc", + "log_pool": ".us-east.log", + "intent_log_pool": ".us-east.intent-log", + "usage_log_pool": ".us-east.usage", + "user_keys_pool": ".us-east.users", + "user_email_pool": ".us-east.users.email", + "user_swift_pool": ".us-east.users.swift", + "user_uid_pool": ".us-east.users.uid", + "system_key": { "access_key": "", "secret_key": ""} + } -#. Change the permissions on the file so that it is executable. :: - sudo chmod +x s3gw.fcgi +#. Add the ``us-east`` zone using the ``us-east.json`` infile you + just created in both the east and west pools by specifying their respective + user names (i.e., ``--name``). :: + sudo radosgw-admin zone set --rgw-zone=us-east --infile us-east.json --name client.radosgw.us-east-1 + sudo radosgw-admin zone set --rgw-zone=us-east --infile us-east.json --name client.radosgw.us-west-1 -Add Configuration to Ceph Config --------------------------------- + Repeat step 1 to create a zone infile for ``us-west``. Then add the zone + using the ``us-west.json`` infile in both the east and west pools by + specifying their respective user names (i.e., ``--name``). :: -Ceph Object Gateway instances read the `Ceph configuration file`_ (located at -``/etc/ceph/{cluster-name}.conf`` by default). The Ceph Object Gateway is a -client of the Ceph Storage Cluster, so you must place each instance under a -``[client]`` section that specifically refers to the ``radosgw`` daemon and the -instance ID. For example:: + sudo radosgw-admin zone set --rgw-zone=us-west --infile us-west.json --name client.radosgw.us-east-1 + sudo radosgw-admin zone set --rgw-zone=us-west --infile us-west.json --name client.radosgw.us-west-1 - [client.radosgw.ny-ny-instance1] - - #Region Info - rgw region = ny - rgw region root pool = .ny.rgw.root - - #Zone Info - rgw zone = ny-ny - rgw zone root pool = .ny-ny.rgw.root - keyring = /etc/ceph/ceph.client.radosgw.ny.keyring +#. Delete the default zone (if it exists). :: + + rados -p .rgw.root rm zone_info.default - #DNS Info for S3 Subdomains - rgw dns name = {hostname} - - #Ceph Node Info - rgw socket path = /tmp/$name.sock - host = {host-name} - -Add the foregoing setting (replacing values in braces where appropriate) to the -master copy of the Ceph configuration file you keep with your admin node. Then, -use ``ceph-deploy`` to push a fresh copy the configuration file from your admin -node Ceph Nodes. :: +#. Update the region map. :: + + sudo radosgw-admin regionmap update --name client.radosgw.us-east-1 - ceph-deploy --overwrite-conf config push {host-name [host-name]...} +Create Zone Users +----------------- + +Ceph Object Gateway stores zone users in the zone pools. So you must create zone +users after configuring the zones. Copy the ``access_key`` and ``secret_key`` +fields for each user so you can update your zone configuration once you complete +this step. :: + + sudo radosgw-admin user create --uid="us-east" --display-name="Region-US Zone-East" --name client.radosgw.us-east-1 --system + sudo radosgw-admin user create --uid="us-west" --display-name="Region-US Zone-West" --name client.radosgw.us-west-1 --system + + +Update Zone Configurations +-------------------------- + +You must update the zone configuration with zone users so that +the synchronization agents can authenticate with the zones. + +#. Open your ``us-east.json`` zone configuration file and paste the contents of + the ``access_key`` and ``secret_key`` fields from the step of creating + zone users into the ``system_key`` field of your zone configuration + infile. :: + + { "domain_root": ".us-east.rgw", + "control_pool": ".us-east.rgw.control", + "gc_pool": ".us-east.rgw.gc", + "log_pool": ".us-east.log", + "intent_log_pool": ".us-east.intent-log", + "usage_log_pool": ".us-east.usage", + "user_keys_pool": ".us-east.users", + "user_email_pool": ".us-east.users.email", + "user_swift_pool": ".us-east.users.swift", + "user_uid_pool": ".us-east.users.uid", + "system_key": { + "access_key": "{paste-access_key-here}", + "secret_key": "{paste-secret_key-here}" + }, + "placement_pools": [] + } + +#. Save the ``us-east.json`` file. Then, update your zone configuration. :: + + sudo radosgw-admin zone set --rgw-zone=us-east --infile us-east.json --name client.radosgw.us-east-1 + sudo radosgw-admin zone set --rgw-zone=us-east --infile us-east.json --name client.radosgw.us-west-1 + +#. Repeat step 1 to update the zone infile for ``us-west``. Then, update + your zone configuration. :: + + sudo radosgw-admin zone set --rgw-zone=us-west --infile us-west.json --name client.radosgw.us-east-1 + sudo radosgw-admin zone set --rgw-zone=us-west --infile us-west.json --name client.radosgw.us-west-1 + Restart Services -================ +---------------- Once you have redeployed your Ceph configuration files, we recommend restarting -your ``ceph`` service. +your Ceph Storage Cluster(s) and Apache instances. -For Ubuntu, use the following:: +For Ubuntu, use the following on each :term:`Ceph Node`:: sudo restart ceph-all @@ -451,39 +499,56 @@ To ensure that all components have reloaded their configurations, for each gateway instance we recommend restarting the ``apache2`` service. For example:: sudo service apache2 restart - -Start Gateways -============== -Start up the ``radosgw`` service. When starting the service with other than -the default region and zone, you must specify them explicitly. :: +Start Gateway Instances +----------------------- + +Start up the ``radosgw`` service. :: - sudo /etc/init.d/radosgw start --rgw-region={region} --rgw-zone={zone} + sudo /etc/init.d/radosgw start +If you are running multiple instances on the same host, you must specify the +user name. :: -Synchronize Metadata -==================== + sudo /etc/init.d/radosgw start --name client.radosgw.us-east-1 -The metadata agent maintains a global namespace for the cluster. The master -zone of the master region is the source for all other instances in the cluster. +Open a browser and check the endpoints for each zone. A simple HTTP request +to the domain name should return the following: -Configure an Agent ------------------- +.. code-block:: xml -To configure the metadata synchronization agent, retrieve the following from all -zones: + + + anonymous + + + + + +Replicate Data +-------------- + +The data synchronization agent replicates the data of a master zone to a +secondary zone. The master zone of a region is the source for the secondary zone +of the region. + + +To configure the synchronization agent, retrieve the following from each zone: + +- Zone Name - Access Key - Secret Key - Hostname - Port -You only need the hostname and port for a single instance (assuming all gateway -instances in a region/zone access the same Ceph Storage Cluster). Specify these -values in a configuration file (e.g., ``cluster-md-sync.conf``), and include a -``log_file`` name and an identifier for the ``daemon_id``. For example: +You only need the hostname and port for a single instance (assuming all +gateway instances in a region/zone access the same Ceph Storage Cluster). +Specify these values in a configuration file +(e.g., ``cluster-data-sync.conf``), and include a ``log_file`` name and an +identifier for the ``daemon_id``. For example: .. code-block:: ini @@ -500,74 +565,156 @@ values in a configuration file (e.g., ``cluster-md-sync.conf``), and include a log_file: {log.filename} daemon_id: {daemon-id} -The `Exemplary Cluster`_ assumes that ``ny-ny`` is the master region and zone, -so it is the source for ``ny-ldn``, ``ldn-ldn`` and ``ldn-ny``. +A concrete example may look like this: +.. code-block:: ini -Activate an Agent ------------------ + src_access_key: DG8RE354EFPZBICHIAF0 + src_secret_key: i3U0HiRP8CXaBWrcF8bbh6CbsxGYuPPwRkixfFSb + src_host: ceph-gateway-east + src_port: 80 + src_zone: us-east + dest_access_key: U60RFI6B08F32T2PD30G + dest_secret_key: W3HuUor7Gl1Ee93pA2pq2wFk1JMQ7hTrSDecYExl + dest_host: ceph-gateway-west + dest_port: 80 + dest_zone: us-west + log_file: /var/log/radosgw/radosgw-sync-us-east-west.log + daemon_id: rgw-east-2-west -To activate the metadata synchronization agent, execute the following:: - radosgw-agent -c region-md-sync.conf +To activate the data synchronization agent, open a terminal and +execute the following:: -You must have an agent for each source-destination pair. + radosgw-agent -c region-data-sync.conf +When the synchronization agent is running, you should see output +indicating that the agent is synchronizing shards of data. :: -Replicate Data -============== + INFO:radosgw_agent.sync:Starting incremental sync + INFO:radosgw_agent.worker:17910 is processing shard number 0 + INFO:radosgw_agent.worker:shard 0 has 0 entries after '' + INFO:radosgw_agent.worker:finished processing shard 0 + INFO:radosgw_agent.worker:17910 is processing shard number 1 + INFO:radosgw_agent.sync:1/64 shards processed + INFO:radosgw_agent.worker:shard 1 has 0 entries after '' + INFO:radosgw_agent.worker:finished processing shard 1 + INFO:radosgw_agent.sync:2/64 shards processed + ... -The data synchronization agent replicates the data of a master zone to a -secondary zone. The master zone of a region is the source for the secondary zone -of the region. +.. note:: You must have an agent for each source-destination pair. -Configure an Agent ------------------- +Configure a Secondary Region +============================ -To configure the synchronization agent, retrieve the following from all zones: +This section provides an exemplary procedure for setting up a cluster with +multiple regions. Configuring a cluster that spans regions requires maintaining +a global namespace, so that there are no namespace clashes among object names +stored across in different regions. -- Access Key -- Secret Key -- Hostname -- Port +This section extends the procedure in `Configure a Master Region`_, but +changes the region name and modifies a few procedures. See the following +sections for details. -You only need the hostname and port for a single instance (assuming all gateway -instances in a region/zone access the same Ceph Storage Cluster). Specify these -values in a configuration file (e.g., ``cluster-data-sync.conf``), and include a -``log_file`` name and an identifier for the ``daemon_id``. For example: -.. code-block:: ini +Naming for the Secondary Region +------------------------------- - src_access_key: {source-access-key} - src_secret_key: {source-secret-key} - src_host: {source-hostname} - src_port: {source-port} - src_zone: {source-zone} - dest_access_key: {destination-access-key} - dest_secret_key: {destination-secret-key} - dest_host: {destination-hostname} - dest_port: {destination-port} - dest_zone: {destination-zone} - log_file: {log.filename} - daemon_id: {daemon-id} +Before configuring the cluster, defining region, zone and instance names will +help you manage your cluster. Let's assume the region represents the European +Union, and we refer to it by its standard abbreviation. -The `Exemplary Cluster`_ assumes that ``ny-ny`` and ``ldn-ldn`` are the master -zones, so they are the source for ``ny-ldn`` and ``ldn-ldn`` respectively. +- European Union: ``eu`` +Let's assume the zones represent the Eastern and Western European Union. For +continuity, our naming convention will use ``{region name}-{zone name}`` +format, but you can use any naming convention you prefer. -Activate an Agent ------------------ +- European Union, East Region: ``eu-east`` +- European Union, West Region: ``eu-west`` -To activate the data synchronization agent, execute the following:: +Finally, let's assume that zones may have more than one Ceph Object Gateway +instance per zone. For continuity, our naming convention will use +``{region name}-{zone name}-{instance}`` format, but you can use any naming +convention you prefer. - radosgw-agent -c region-data-sync.conf +- European Union Region, Master Zone, Instance 1: ``eu-east-1`` +- European Union Region, Secondary Zone, Instance 1: ``eu-west-1`` + + +Configuring a Secondary Region +------------------------------ + +Repeat the exemplary procedure of `Configure a Master Region`_ +with the following differences: + +#. Use `Naming for the Secondary Region`_ in lieu of `Naming for + the Master Region`_. + +#. `Create Pools`_ using ``eu`` instead of ``us``. + +#. `Create a Keyring`_ and the corresponding keys using ``eu`` instead of + ``us``. You may use the same keyring if you desire, but ensure that you + create the keys on the Ceph Storage Cluster for that region (or region + and zone). + +#. `Install Apache/FastCGI`_. + +#. `Create Data Directories`_ using ``eu`` instead of ``us``. + +#. `Create a Gateway Configuration`_ using ``eu`` instead of ``us`` for + the socket names. + +#. `Enable the Configuration`_. + +#. `Add a FastCGI Script`_ using ``eu`` instead of ``us`` for the user names. + +#. `Add Instances to Ceph Config File`_ using ``eu`` instead of ``us`` for the + pool names. + +#. `Create a Region`_ using ``eu`` instead of ``us``. Set ``is_master`` to + ``false``. For consistency, create the master region in the secondary region + too. :: + + sudo radosgw-admin region set --infile us.json --name client.radosgw.eu-east-1 + +#. `Create Zones`_ using ``eu`` instead of ``us``. Ensure that you update the + user name (i.e., ``--name``) so that you create the zones in the correct + cluster. + +#. `Update Zone Configurations`_ using ``eu`` instead of ``us``. + +#. Create zones from master region in the secondary region. :: + + sudo radosgw-admin zone set --rgw-zone=us-east --infile us-east.json --name client.radosgw.eu-east-1 + sudo radosgw-admin zone set --rgw-zone=us-east --infile us-east.json --name client.radosgw.eu-west-1 + sudo radosgw-admin zone set --rgw-zone=us-west --infile us-west.json --name client.radosgw.eu-east-1 + sudo radosgw-admin zone set --rgw-zone=us-west --infile us-west.json --name client.radosgw.eu-west-1 + +#. Create zones from secondary region in the master region. :: + + sudo radosgw-admin zone set --rgw-zone=eu-east --infile eu-east.json --name client.radosgw.us-east-1 + sudo radosgw-admin zone set --rgw-zone=eu-east --infile eu-east.json --name client.radosgw.us-west-1 + sudo radosgw-admin zone set --rgw-zone=eu-west --infile eu-west.json --name client.radosgw.us-east-1 + sudo radosgw-admin zone set --rgw-zone=eu-west --infile eu-west.json --name client.radosgw.us-west-1 + +#. `Restart Services`_. + +#. `Start Gateway Instances`_. -You must have an agent for each source-destination pair. +#. `Replicate Data`_ by specifying the master zone of the master region as the + source zone and the master zone of the secondary region as the secondary + zone. When activating the ``radosgw-agent``, specify ``--metadata-only`` so + that it only copies metadata. +Once you have completed the foregoing procedure, you should have a cluster +consisting of a master region (``us``) and a secondary region (``eu``) where +there is a unified namespace between the two regions. +.. _CRUSH Map: ../../rados/operations/crush-map .. _Install Apache, FastCGI and Gateway: ../manual-install .. _Cephx Administration: ../../rados/operations/authentication/#cephx-administration .. _Ceph configuration file: ../../rados/configuration/ceph-conf From 6eded8a1297bdabbdb9afaefac63e9380a16905c Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Mon, 28 Oct 2013 18:03:28 -0700 Subject: [PATCH 035/150] doc: Fixes to normalize header hierarchy. Tweaked IA slightly. Signed-off-by: John Wilkins --- doc/radosgw/federated-config.rst | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/doc/radosgw/federated-config.rst b/doc/radosgw/federated-config.rst index 78ab3fbb30db0..2fdb242514702 100644 --- a/doc/radosgw/federated-config.rst +++ b/doc/radosgw/federated-config.rst @@ -16,7 +16,7 @@ regions, and with multiple zones for a region. Background ----------- +========== When you deploy a :term:`Ceph Object Store` service that spans geographical locales, configuring Ceph Object Gateway regions and metadata synchronization @@ -36,7 +36,7 @@ each zone (typical). You may also deploy a separate Ceph Storage Cluster for each zone if your requirements and resources warrant this level of redundancy. About this Guide ----------------- +================ In the following sections, we will demonstrate how to configure a federated cluster in two logical steps: @@ -703,10 +703,15 @@ with the following differences: #. `Start Gateway Instances`_. -#. `Replicate Data`_ by specifying the master zone of the master region as the - source zone and the master zone of the secondary region as the secondary - zone. When activating the ``radosgw-agent``, specify ``--metadata-only`` so - that it only copies metadata. +Replicate Metadata +------------------ + +`Replicate Data`_ by specifying the master zone of the master region as the +source zone and the master zone of the secondary region as the secondary +zone. When activating the ``radosgw-agent``, specify ``--metadata-only`` so +that it only copies metadata. For example:: + + radosgw-agent -c inter-region-data-sync.conf --metadata-only Once you have completed the foregoing procedure, you should have a cluster consisting of a master region (``us``) and a secondary region (``eu``) where From 46d897a377acb484043c4ef2104af096c32f7306 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Tue, 29 Oct 2013 12:01:42 -0700 Subject: [PATCH 036/150] doc: fix formatting. Signed-off-by: John Wilkins --- doc/install/install-apache.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/install/install-apache.rst b/doc/install/install-apache.rst index 642d876f776c7..d685a4021760e 100644 --- a/doc/install/install-apache.rst +++ b/doc/install/install-apache.rst @@ -27,16 +27,16 @@ RPM Packages To install Apache and FastCGI RPMs, execute the following:: rpm -ivh fcgi-2.4.0-10.el6.x86_64.rpm - rpm -ivh mod_fastcgi-2.4.6-2.el6.rf.x86_64.rpm + rpm -ivh mod_fastcgi-2.4.6-2.el6.rf.x86_64.rpm Or:: - - sudo yum install httpd mod_fastcgi + + sudo yum install httpd mod_fastcgi Install w/ 100-Continue ======================= - + The Ceph community provides a slightly optimized version of the ``apache2`` and ``fastcgi`` packages. The material difference is that the Ceph packages are optimized for the ``100-continue`` HTTP response, where the server determines From 60264f9f022f3a05ec3a3add27bfe64169766128 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Tue, 29 Oct 2013 12:24:37 -0700 Subject: [PATCH 037/150] doc: Fixed formatting. Fixed hyperlink. Signed-off-by: John Wilkins --- doc/install/install-apache.rst | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/doc/install/install-apache.rst b/doc/install/install-apache.rst index d685a4021760e..2af815ccb5db0 100644 --- a/doc/install/install-apache.rst +++ b/doc/install/install-apache.rst @@ -24,12 +24,12 @@ To install Apache and FastCGI Debian packages, execute the following:: RPM Packages ------------ -To install Apache and FastCGI RPMs, execute the following:: +To install Apache and FastCGI RPMs, execute the following:: rpm -ivh fcgi-2.4.0-10.el6.x86_64.rpm rpm -ivh mod_fastcgi-2.4.6-2.el6.rf.x86_64.rpm - Or:: +Or:: sudo yum install httpd mod_fastcgi @@ -67,7 +67,7 @@ RPM Packages To install Apache with 100-continue, execute the following steps: #. Ensure you have ``yum-plugin-priorities`` installed and enabled. See - ``Installing YUM Priorities`_ for details. + `Installing YUM Priorities`_ for details. #. Add a ``ceph-apache.repo`` file to ``/etc/yum.repos.d``. Replace ``{distro}`` with the name of your distribution (e.g., ``centos6``, @@ -193,3 +193,6 @@ RPM-based Packages etc/init.d/httpd restart +.. _RFC 2616, Section 8: http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html +.. _gitbuilder.ceph.com: http://gitbuilder.ceph.com +.. _Installing YUM Priorities: ../yum-priorities \ No newline at end of file From 1bdd37f6882492bc2c41ccb3111e3c8d39f5d10b Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Wed, 30 Oct 2013 15:16:47 -0700 Subject: [PATCH 038/150] doc: Removed doc. Consolidated with Get Packages. Signed-off-by: John Wilkins --- doc/install/add-repositories.rst | 386 ------------------------------- 1 file changed, 386 deletions(-) delete mode 100644 doc/install/add-repositories.rst diff --git a/doc/install/add-repositories.rst b/doc/install/add-repositories.rst deleted file mode 100644 index 4e94e6a6c2805..0000000000000 --- a/doc/install/add-repositories.rst +++ /dev/null @@ -1,386 +0,0 @@ -================== - Add Repositories -================== - -Adding repositories is the easiest way to install Ceph, because package -management tools will handle the installation of dependencies for you -in most cases. - -Follow this guide to add repositories; then, proceed to the -`Install Ceph Object Storage`_. - - -Add Keys -======== - -Add a key to your system's list of trusted keys to avoid a security warning. For -stable releases (e.g., ``cuttlefish``, ``emperor``) and development releases -(``release-name-rc1``, ``release-name-rc2``), use the ``release.asc`` key. For -development testing packages, use the ``autobuild.asc`` key (developers and QA). - - -APT ---- - -To install the ``release.asc`` key, execute the following:: - - wget -q -O- 'https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc' | sudo apt-key add - - - -To install the ``autobuild.asc`` key, execute the following -(QA and developers only):: - - wget -q -O- 'https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc' | sudo apt-key add - - - -RPM ---- - -To install the ``release.asc`` key, execute the following:: - - sudo rpm --import 'https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc' - -To install the ``autobuild.asc`` key, execute the following -(QA and developers only):: - - sudo rpm --import 'https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc' - - -Add Ceph Release Repos -====================== - -Release repositories use the ``release.asc`` key to verify packages. -To install Ceph packages with the Advanced Package Tool (APT) or -Yellowdog Updater, Modified (YUM), you must add Ceph repositories. - -You may find releases for Debian/Ubuntu (installed with APT) at:: - - http://ceph.com/debian-{release-name} - -You may find releases for CentOS/RHEL and others (installed with YUM) at:: - - http://ceph.com/rpm-{release-name} - -The stable releases of Ceph include: - -- **Emperor:** Emperor is the most recent major release of Ceph. These packages - are recommended for anyone deploying Ceph in a production environment. - Critical bug fixes are backported and point releases are made as necessary. - -- **Dumpling:** Dumpling is the fourth major release of Ceph. These packages - are recommended for anyone deploying Ceph in a production environment. - Critical bug fixes are backported as necessary. - -- **Cuttlefish:** Cuttlefish is the third major release of Ceph. These packages - are recommended for those who have already deployed bobtail in production and - are not yet ready to upgrade. - -- **Bobtail:** Bobtail is the second major release of Ceph. These packages are - recommended for those who have already deployed bobtail in production and - are not yet ready to upgrade. - -- **Argonaut:** Argonaut is the first major release of Ceph. These packages - are recommended for those who have already deployed Argonaut in production - and are not yet ready to upgrade. - -.. tip:: For European users, there is also a mirror in the Netherlands at - http://eu.ceph.com/ :: - - -Debian Packages ---------------- - -Add a Ceph package repository to your system's list of APT sources. For newer -versions of Debian/Ubuntu, call ``lsb_release -sc`` on the command line to -get the short codename, and replace ``{codename}`` in the following command. :: - - sudo apt-add-repository 'deb http://ceph.com/debian-emperor/ {codename} main' - -For early Linux distributions, you may execute the following command:: - - echo deb http://ceph.com/debian-emperor/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list - -For earlier Ceph releases, replace ``{release-name}`` with the name with the -name of the Ceph release. You may call ``lsb_release -sc`` on the command line -to get the short codename, and replace ``{codename}`` in the following command. -:: - - sudo apt-add-repository 'deb http://ceph.com/debian-{release-name}/ {codename} main' - -For older Linux distributions, replace ``{release-name}`` with the name of the -release:: - - echo deb http://ceph.com/debian-{release-name}/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list - -Ceph on ARM processors requires Google's memory profiling tools (``google-perftools``). -The Ceph repository should have a copy at -http://ceph.com/packages/google-perftools/debian. :: - - echo deb http://ceph.com/packages/google-perftools/debian $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/google-perftools.list - - -For development release packages, add our package repository to your system's -list of APT sources. See `the testing Debian repository`_ for a complete list -of Debian and Ubuntu releases supported. :: - - echo deb http://ceph.com/debian-testing/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list - - -RPM Packages ------------- - -For stable releases, you may add a Ceph entry to the ``/etc/yum.repos.d`` -directory. Create a ``ceph.repo`` file. In the example below, replace -``{ceph-release}`` with a stable release of Ceph (e.g., ``dumpling``, -``emperor``, etc.) and ``{distro}`` with your Linux distribution (e.g., ``el6``, -``rhel6``, etc.). You may view http://ceph.com/rpm-{ceph-release}/ directory to -see which distributions Ceph supports. :: - - [ceph] - name=Ceph packages for $basearch - baseurl=http://ceph.com/rpm-{ceph-release}/{distro}/$basearch - enabled=1 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc - - [ceph-noarch] - name=Ceph noarch packages - baseurl=http://ceph.com/rpm-{ceph-release}/{distro}/noarch - enabled=1 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc - - [ceph-source] - name=Ceph source packages - baseurl=http://ceph.com/rpm-{ceph-release}/{distro}/SRPMS - enabled=0 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc - - -For development release packages, you may specify the repository -for development releases instead. :: - - [ceph] - name=Ceph packages for $basearch/$releasever - baseurl=http://ceph.com/rpm-testing/{distro}/$basearch - enabled=1 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc - - [ceph-noarch] - name=Ceph noarch packages - baseurl=http://ceph.com/rpm-testing/{distro}/noarch - enabled=1 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc - - [ceph-source] - name=Ceph source packages - baseurl=http://ceph.com/rpm-testing/{distro}/SRPMS - enabled=0 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc - - -For specific packages, you may retrieve them by specifically downloading the -release package by name. Our development process generates a new release of Ceph -every 3-4 weeks. These packages are faster-moving than the stable releases. -Development packages have new features integrated quickly, while still -undergoing several weeks of QA prior to release. - -The repository package installs the repository details on your local system for -use with ``yum`` or ``up2date``. Replace ``{distro}`` with your Linux distribution, -and ``{release}`` with the specific release of Ceph:: - - su -c 'rpm -Uvh http://ceph.com/rpms/{distro}/x86_64/ceph-{release}.el6.noarch.rpm' - -You can download the RPMs directly from:: - - http://ceph.com/rpm-testing - - -Add Ceph Development Repos -========================== - -Development repositories use the ``autobuild.asc`` key to verify packages. -If you are developing Ceph and need to deploy and test specific Ceph branches, -ensure that you remove stable repository entries first. - -Debian Packages ---------------- - -We automatically build Debian and Ubuntu packages for current -development branches in the Ceph source code repository. These -packages are intended for developers and QA only. - -Add our package repository to your system's list of APT sources, but -replace ``{BRANCH}`` with the branch you'd like to use (e.g., chef-3, -wip-hack, master, stable). See `the gitbuilder page`_ for a complete -list of distributions we build. :: - - echo deb http://gitbuilder.ceph.com/ceph-deb-$(lsb_release -sc)-x86_64-basic/ref/{BRANCH} $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list - - -RPM Packages ------------- - -For current development branches, you may add a Ceph entry to the -``/etc/yum.repos.d`` directory. Create a ``ceph.repo`` file. In the example -below, replace ``{distro}`` with your Linux distribution (e.g., ``centos6``, -``rhel6``, etc.), and ``{branch}`` with the name of the branch you want to -install. :: - - - [ceph-source] - name=Ceph source packages - baseurl=http://gitbuilder.ceph.com/ceph-rpm-{distro}-x86_64-basic/ref/{branch}/SRPMS - enabled=0 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc - - -You may view http://gitbuilder.ceph.com directory to see which distributions -Ceph supports. - - -Add Ceph Object Gateway Repos -============================= - -Ceph Object Gateway works with ordinary Apache and FastCGI libraries. However, -Ceph builds Apache and FastCGI packages that support 100-continue. To use the -Ceph Apache and FastCGI packages, add them to your repository. - - -Debian Packages ---------------- - -Add our Apache and FastCGI packages to your system's list of APT sources if you intend to -use 100-continue. :: - - echo deb http://gitbuilder.ceph.com/apache2-deb-$(lsb_release -sc)-x86_64-basic/ref/master $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph-apache.list - echo deb http://gitbuilder.ceph.com/libapache-mod-fastcgi-deb-$(lsb_release -sc)-x86_64-basic/ref/master $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph-fastcgi.list - - -RPM Packages ------------- - -You may add a Ceph entry to the ``/etc/yum.repos.d`` directory. Create a -``ceph-apache.repo`` file. In the example below, replace ``{distro}`` with your -Linux distribution (e.g., ``el6``, ``rhel6``, etc.). You may view -http://gitbuilder.ceph.com directory to see which distributions Ceph supports. -:: - - - [apache2-ceph-noarch] - name=Apache noarch packages for Ceph - baseurl=http://gitbuilder.ceph.com/apache2-rpm-{distro}-x86_64-basic/ref/master - enabled=1 - priority=2 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc - - [apache2-ceph-source] - name=Apache source packages for Ceph - baseurl=http://gitbuilder.ceph.com/apache2-rpm-{distro}-x86_64-basic/ref/master - enabled=0 - priority=2 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc - - -Repeat the forgoing process by creating a ``ceph-fastcgi.repo`` file. :: - - [fastcgi-ceph-basearch] - name=FastCGI basearch packages for Ceph - baseurl=http://gitbuilder.ceph.com/mod_fastcgi-rpm-{distro}-x86_64-basic/ref/master - enabled=1 - priority=2 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc - - [fastcgi-ceph-noarch] - name=FastCGI noarch packages for Ceph - baseurl=http://gitbuilder.ceph.com/mod_fastcgi-rpm-{distro}-x86_64-basic/ref/master - enabled=1 - priority=2 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc - - [fastcgi-ceph-source] - name=FastCGI source packages for Ceph - baseurl=http://gitbuilder.ceph.com/mod_fastcgi-rpm-{distro}-x86_64-basic/ref/master - enabled=0 - priority=2 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc - - -Add Ceph Extras -=============== - -Some Ceph deployments require additional Ceph packages. Ceph Extras contains -packages for ``curl``, ``leveldb``, ``ceph-deploy``, the SCSI target framework -and even some QEMU packages for RPMs. Add the Ceph Extras repository to ensure -you obtain these additional packages from the Ceph repository. - - -Debian Packages ---------------- - -Add our Ceph Extras package repository to your system's list of APT sources. :: - - echo deb http://ceph.com/packages/ceph-extras/debian $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph-extras.list - - -RPM Packages ------------- - -For RPM packages, add our package repository to your ``/etc/yum.repos.d`` repos (e.g., -``ceph-extras.repo``). Some Ceph packages (e.g., QEMU) must take priority over standard -packages, so you must ensure that you set ``priority=2``. :: - - [ceph-extras] - name=Ceph Extras Packages - baseurl=http://ceph.com/packages/ceph-extras/rpm/{distro}/$basearch - enabled=1 - priority=2 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc - - [ceph-extras-noarch] - name=Ceph Extras noarch - baseurl=http://ceph.com/packages/ceph-extras/rpm/{distro}/noarch - enabled=1 - priority=2 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc - - [ceph-extras-source] - name=Ceph Extras Sources - baseurl=http://ceph.com/packages/ceph-extras/rpm/c{distro}/SRPMS - enabled=1 - priority=2 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc - - - -.. _Install Ceph Object Storage: ../install-storage-cluster -.. _the testing Debian repository: http://ceph.com/debian-testing/dists -.. _the gitbuilder page: http://gitbuilder.ceph.com \ No newline at end of file From 68caa1b58be6f45915bc7f7aae5b33143d5bbe22 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Wed, 30 Oct 2013 15:17:12 -0700 Subject: [PATCH 039/150] doc: Consolidated Add Repositories. Signed-off-by: John Wilkins --- doc/install/get-packages.rst | 447 ++++++++++++++++++++++++++++++++++- 1 file changed, 445 insertions(+), 2 deletions(-) diff --git a/doc/install/get-packages.rst b/doc/install/get-packages.rst index 977aeeaee5d02..df017d3d0b071 100644 --- a/doc/install/get-packages.rst +++ b/doc/install/get-packages.rst @@ -2,12 +2,449 @@ Get Packages ============== +To install Ceph and other enabling software, you need to retrieve packages from +the Ceph repository. Follow this guide to get packages; then, proceed to the +`Install Ceph Object Storage`_. + + +Getting Packages +================ + +There are two ways to get packages: + +- **Add Repositories:** Adding repositories is the easiest way to get packages, + because package management tools will retrieve the packages and all enabling + software for you in most cases. However, to use this approach, each + :term:`Ceph Node` in your cluster must have internet access. + +- **Download Packages Manually:** Retrieving packages to install Ceph provides + high security environments that do not allow a :term:`Ceph Node` to access + the internet to download packages. You may also download packages to mirror + the Ceph repository. This approach is not as convenient, but provides a means + of installing Ceph in high security environments (e.g., banking, health care, + etc.). + + +Requirements +============ + +All Ceph deployments require Ceph packages (except for development). You should +also add keys and recommended packages. + +- **Keys: (Recommended)** Whether you add repositories or download packages + manually, you should download keys to verify the packages. If you do not get + the keys, you may encounter security warnings. There are two keys: one for + releases (common) and one for development (programmers and QA only). Choose + the key that suits your needs. See `Add Keys`_ for details. + +- **Ceph Extras: (Recommended)** The Ceph Extras repository contains a number + of enabling packages such as ``ceph-deploy``, QEMU for CentOS/RHEL + distribution, and iSCSI among others. If you intend to use any of the + foregoing packages, you must add the Ceph Extras repository or download the + packages manually. See `Add Ceph Extras`_ for details. + +- **Ceph: (Required)** All Ceph deployments require Ceph release packages, + except for deployments that use development packages (development, QA, and + bleeding edge deployments only). See `Add Ceph`_ for details. + +- **Ceph Development: (Optional)** If you are developing for Ceph, testing Ceph + development builds, or if you want features from the bleeding edge of Ceph + development, you may get Ceph development packages. See + `Add Ceph Development`_ for details. + +- **Apache/FastCGI: (Optional)** If you are deploying a + :term:`Ceph Object Storage` service, you must install Apache and FastCGI. + Ceph provides Apache and FastCGI builds that are identical to those available + from Apache, but with 100-continue support. If you want to enable + :term:`Ceph Object Gateway` daemons with 100-continue support, you must + retrieve Apache/FastCGI packages from the Ceph repository. + See `Add Apache/FastCGI`_ for details. + + +If you intend to download packages manually, see Section `Download Packages`_. + + +Add Keys +======== + +Add a key to your system's list of trusted keys to avoid a security warning. For +major releases (e.g., ``cuttlefish``, ``emperor``) and development releases +(``release-name-rc1``, ``release-name-rc2``), use the ``release.asc`` key. For +development testing packages, use the ``autobuild.asc`` key (developers and QA). + + +APT +--- + +To install the ``release.asc`` key, execute the following:: + + wget -q -O- 'https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc' | sudo apt-key add - + + +To install the ``autobuild.asc`` key, execute the following +(QA and developers only):: + + wget -q -O- 'https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc' | sudo apt-key add - + + +RPM +--- + +To install the ``release.asc`` key, execute the following:: + + sudo rpm --import 'https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc' + +To install the ``autobuild.asc`` key, execute the following +(QA and developers only):: + + sudo rpm --import 'https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc' + + + +Add Ceph Extras +=============== + +Some Ceph deployments require additional Ceph packages. Ceph Extras contains +packages for ``curl``, ``leveldb``, ``ceph-deploy``, the SCSI target framework +and even some QEMU packages for RPMs. Add the Ceph Extras repository to ensure +you obtain these additional packages from the Ceph repository. + + +Debian Packages +--------------- + +Add our Ceph Extras package repository to your system's list of APT sources. :: + + echo deb http://ceph.com/packages/ceph-extras/debian $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph-extras.list + + +RPM Packages +------------ + +For RPM packages, add our package repository to your ``/etc/yum.repos.d`` repos (e.g., +``ceph-extras.repo``). Some Ceph packages (e.g., QEMU) must take priority over standard +packages, so you must ensure that you set ``priority=2``. :: + + [ceph-extras] + name=Ceph Extras Packages + baseurl=http://ceph.com/packages/ceph-extras/rpm/{distro}/$basearch + enabled=1 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc + + [ceph-extras-noarch] + name=Ceph Extras noarch + baseurl=http://ceph.com/packages/ceph-extras/rpm/{distro}/noarch + enabled=1 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc + + [ceph-extras-source] + name=Ceph Extras Sources + baseurl=http://ceph.com/packages/ceph-extras/rpm/c{distro}/SRPMS + enabled=1 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc + + +Add Ceph +======== + +Release repositories use the ``release.asc`` key to verify packages. +To install Ceph packages with the Advanced Package Tool (APT) or +Yellowdog Updater, Modified (YUM), you must add Ceph repositories. + +You may find releases for Debian/Ubuntu (installed with APT) at:: + + http://ceph.com/debian-{release-name} + +You may find releases for CentOS/RHEL and others (installed with YUM) at:: + + http://ceph.com/rpm-{release-name} + +The major releases of Ceph include: + +- **Emperor:** Emperor is the most recent major release of Ceph. These packages + are recommended for anyone deploying Ceph in a production environment. + Critical bug fixes are backported and point releases are made as necessary. + +- **Dumpling:** Dumpling is the fourth major release of Ceph. These packages + are recommended for anyone deploying Ceph in a production environment. + Critical bug fixes are backported as necessary. + +- **Cuttlefish:** Cuttlefish is the third major release of Ceph. These packages + are recommended for those who have already deployed bobtail in production and + are not yet ready to upgrade. + +- **Bobtail:** Bobtail is the second major release of Ceph. These packages are + recommended for those who have already deployed bobtail in production and + are not yet ready to upgrade. + +- **Argonaut:** Argonaut is the first major release of Ceph. These packages + are recommended for those who have already deployed Argonaut in production + and are not yet ready to upgrade. + +.. tip:: For European users, there is also a mirror in the Netherlands at: + http://eu.ceph.com/ + + +Debian Packages +--------------- + +Add a Ceph package repository to your system's list of APT sources. For newer +versions of Debian/Ubuntu, call ``lsb_release -sc`` on the command line to +get the short codename, and replace ``{codename}`` in the following command. :: + + sudo apt-add-repository 'deb http://ceph.com/debian-emperor/ {codename} main' + +For early Linux distributions, you may execute the following command:: + + echo deb http://ceph.com/debian-emperor/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list + +For earlier Ceph releases, replace ``{release-name}`` with the name with the +name of the Ceph release. You may call ``lsb_release -sc`` on the command line +to get the short codename, and replace ``{codename}`` in the following command. +:: + + sudo apt-add-repository 'deb http://ceph.com/debian-{release-name}/ {codename} main' + +For older Linux distributions, replace ``{release-name}`` with the name of the +release:: + + echo deb http://ceph.com/debian-{release-name}/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list + +Ceph on ARM processors requires Google's memory profiling tools (``google-perftools``). +The Ceph repository should have a copy at +http://ceph.com/packages/google-perftools/debian. :: + + echo deb http://ceph.com/packages/google-perftools/debian $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/google-perftools.list + + +For development release packages, add our package repository to your system's +list of APT sources. See `the testing Debian repository`_ for a complete list +of Debian and Ubuntu releases supported. :: + + echo deb http://ceph.com/debian-testing/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list + + +RPM Packages +------------ + +For major releases, you may add a Ceph entry to the ``/etc/yum.repos.d`` +directory. Create a ``ceph.repo`` file. In the example below, replace +``{ceph-release}`` with a major release of Ceph (e.g., ``dumpling``, +``emperor``, etc.) and ``{distro}`` with your Linux distribution (e.g., ``el6``, +``rhel6``, etc.). You may view http://ceph.com/rpm-{ceph-release}/ directory to +see which distributions Ceph supports. :: + + [ceph] + name=Ceph packages for $basearch + baseurl=http://ceph.com/rpm-{ceph-release}/{distro}/$basearch + enabled=1 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc + + [ceph-noarch] + name=Ceph noarch packages + baseurl=http://ceph.com/rpm-{ceph-release}/{distro}/noarch + enabled=1 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc + + [ceph-source] + name=Ceph source packages + baseurl=http://ceph.com/rpm-{ceph-release}/{distro}/SRPMS + enabled=0 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc + + +For development release packages, you may specify the repository +for development releases instead. :: + + [ceph] + name=Ceph packages for $basearch/$releasever + baseurl=http://ceph.com/rpm-testing/{distro}/$basearch + enabled=1 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc + + [ceph-noarch] + name=Ceph noarch packages + baseurl=http://ceph.com/rpm-testing/{distro}/noarch + enabled=1 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc + + [ceph-source] + name=Ceph source packages + baseurl=http://ceph.com/rpm-testing/{distro}/SRPMS + enabled=0 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc + + +For specific packages, you may retrieve them by specifically downloading the +release package by name. Our development process generates a new release of Ceph +every 3-4 weeks. These packages are faster-moving than the major releases. +Development packages have new features integrated quickly, while still +undergoing several weeks of QA prior to release. + +The repository package installs the repository details on your local system for +use with ``yum`` or ``up2date``. Replace ``{distro}`` with your Linux distribution, +and ``{release}`` with the specific release of Ceph:: + + su -c 'rpm -Uvh http://ceph.com/rpms/{distro}/x86_64/ceph-{release}.el6.noarch.rpm' + +You can download the RPMs directly from:: + + http://ceph.com/rpm-testing + + +Add Ceph Development +==================== + +Development repositories use the ``autobuild.asc`` key to verify packages. +If you are developing Ceph and need to deploy and test specific Ceph branches, +ensure that you remove repository entries for major releases first. + + +Debian Packages +--------------- + +We automatically build Debian and Ubuntu packages for current +development branches in the Ceph source code repository. These +packages are intended for developers and QA only. + +Add our package repository to your system's list of APT sources, but +replace ``{BRANCH}`` with the branch you'd like to use (e.g., chef-3, +wip-hack, master). See `the gitbuilder page`_ for a complete +list of distributions we build. :: + + echo deb http://gitbuilder.ceph.com/ceph-deb-$(lsb_release -sc)-x86_64-basic/ref/{BRANCH} $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list + + +RPM Packages +------------ + +For current development branches, you may add a Ceph entry to the +``/etc/yum.repos.d`` directory. Create a ``ceph.repo`` file. In the example +below, replace ``{distro}`` with your Linux distribution (e.g., ``centos6``, +``rhel6``, etc.), and ``{branch}`` with the name of the branch you want to +install. :: + + + [ceph-source] + name=Ceph source packages + baseurl=http://gitbuilder.ceph.com/ceph-rpm-{distro}-x86_64-basic/ref/{branch}/SRPMS + enabled=0 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc + + +You may view http://gitbuilder.ceph.com directory to see which distributions +Ceph supports. + + +Add Apache/FastCGI +================== + +Ceph Object Gateway works with ordinary Apache and FastCGI libraries. However, +Ceph builds Apache and FastCGI packages that support 100-continue. To use the +Ceph Apache and FastCGI packages, add them to your repository. + + +Debian Packages +--------------- + +Add our Apache and FastCGI packages to your system's list of APT sources if you intend to +use 100-continue. :: + + echo deb http://gitbuilder.ceph.com/apache2-deb-$(lsb_release -sc)-x86_64-basic/ref/master $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph-apache.list + echo deb http://gitbuilder.ceph.com/libapache-mod-fastcgi-deb-$(lsb_release -sc)-x86_64-basic/ref/master $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph-fastcgi.list + + +RPM Packages +------------ + +You may add a Ceph entry to the ``/etc/yum.repos.d`` directory. Create a +``ceph-apache.repo`` file. In the example below, replace ``{distro}`` with your +Linux distribution (e.g., ``el6``, ``rhel6``, etc.). You may view +http://gitbuilder.ceph.com directory to see which distributions Ceph supports. +:: + + + [apache2-ceph-noarch] + name=Apache noarch packages for Ceph + baseurl=http://gitbuilder.ceph.com/apache2-rpm-{distro}-x86_64-basic/ref/master + enabled=1 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc + + [apache2-ceph-source] + name=Apache source packages for Ceph + baseurl=http://gitbuilder.ceph.com/apache2-rpm-{distro}-x86_64-basic/ref/master + enabled=0 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc + + +Repeat the forgoing process by creating a ``ceph-fastcgi.repo`` file. :: + + [fastcgi-ceph-basearch] + name=FastCGI basearch packages for Ceph + baseurl=http://gitbuilder.ceph.com/mod_fastcgi-rpm-{distro}-x86_64-basic/ref/master + enabled=1 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc + + [fastcgi-ceph-noarch] + name=FastCGI noarch packages for Ceph + baseurl=http://gitbuilder.ceph.com/mod_fastcgi-rpm-{distro}-x86_64-basic/ref/master + enabled=1 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc + + [fastcgi-ceph-source] + name=FastCGI source packages for Ceph + baseurl=http://gitbuilder.ceph.com/mod_fastcgi-rpm-{distro}-x86_64-basic/ref/master + enabled=0 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc + + +Download Packages +================= + If you are attempting to install behind a firewall in an environment without internet access, you must retrieve the packages (mirrored with all the necessary dependencies) before attempting an install. Debian Packages -=============== +--------------- Ceph requires additional additional third party libraries. @@ -31,7 +468,7 @@ your Linux distribution codename. Replace ``{arch}`` with the CPU architecture. RPM Packages -============ +------------ Ceph requires additional additional third party libraries. To add the EPEL repository, execute the following:: @@ -70,3 +507,9 @@ line to get the short codename. :: su -c 'rpm -Uvh http://ceph.com/rpm-{release-name}/{distro}/noarch/ceph-{version}.{distro}.noarch.rpm' + + + +.. _Install Ceph Object Storage: ../install-storage-cluster +.. _the testing Debian repository: http://ceph.com/debian-testing/dists +.. _the gitbuilder page: http://gitbuilder.ceph.com \ No newline at end of file From 0f87f15ccb378cec4c843502d782376cb7cd3498 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Wed, 30 Oct 2013 15:17:49 -0700 Subject: [PATCH 040/150] doc: Removed. Consolidated into install-ceph-gateway. Signed-off-by: John Wilkins --- doc/install/install-apache.rst | 198 --------------------------------- 1 file changed, 198 deletions(-) delete mode 100644 doc/install/install-apache.rst diff --git a/doc/install/install-apache.rst b/doc/install/install-apache.rst deleted file mode 100644 index 2af815ccb5db0..0000000000000 --- a/doc/install/install-apache.rst +++ /dev/null @@ -1,198 +0,0 @@ -============================= - Installing Apache & FastCGI -============================= - -The :term:`Ceph Object Gateway` runs on Apache and FastCGI. The Ceph Object -Gateway also supports 100-continue. However, you must install Ceph builds -of Apache and FastCGI for 100-continue support. - - -Install w/out 100-Continue -========================== - -You may use standard Apache and FastCGI packages for your Ceph Object -Gateways. However, they will not provide 100-continue support. - -Debian Packages ---------------- - -To install Apache and FastCGI Debian packages, execute the following:: - - sudo apt-get install apache2 libapache2-mod-fastcgi - - -RPM Packages ------------- - -To install Apache and FastCGI RPMs, execute the following:: - - rpm -ivh fcgi-2.4.0-10.el6.x86_64.rpm - rpm -ivh mod_fastcgi-2.4.6-2.el6.rf.x86_64.rpm - -Or:: - - sudo yum install httpd mod_fastcgi - - -Install w/ 100-Continue -======================= - -The Ceph community provides a slightly optimized version of the ``apache2`` -and ``fastcgi`` packages. The material difference is that the Ceph packages are -optimized for the ``100-continue`` HTTP response, where the server determines -if it will accept the request by first evaluating the request header. See `RFC -2616, Section 8`_ for details on ``100-continue``. You can find the most recent -builds of Apache and FastCGI packages modified for Ceph at `gitbuilder.ceph.com`_. - - -Debian Packages ---------------- - -#. Add a ``ceph-apache.list`` file to your APT sources. :: - - echo deb http://gitbuilder.ceph.com/apache2-deb-$(lsb_release -sc)-x86_64-basic/ref/master $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph-apache.list - -#. Add a ``ceph-fastcgi.list`` file to your APT sources. :: - - echo deb http://gitbuilder.ceph.com/libapache-mod-fastcgi-deb-$(lsb_release -sc)-x86_64-basic/ref/master $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph-fastcgi.list - -#. Update your repository and install Apache and FastCGI:: - - sudo apt-get update && sudo apt-get install apache2 libapache2-mod-fastcgi - - -RPM Packages ------------- - -To install Apache with 100-continue, execute the following steps: - -#. Ensure you have ``yum-plugin-priorities`` installed and enabled. See - `Installing YUM Priorities`_ for details. - -#. Add a ``ceph-apache.repo`` file to ``/etc/yum.repos.d``. Replace - ``{distro}`` with the name of your distribution (e.g., ``centos6``, - ``rhel6``, etc.) :: - - [apache2-ceph-noarch] - name=Apache noarch packages for Ceph - baseurl=http://gitbuilder.ceph.com/apache2-rpm-{distro}-x86_64-basic/ref/master - enabled=1 - priority=2 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc - - [apache2-ceph-source] - name=Apache source packages for Ceph - baseurl=http://gitbuilder.ceph.com/apache2-rpm-{distro}-x86_64-basic/ref/master - enabled=0 - priority=2 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc - - -#. Add a ``ceph-fastcgi.repo`` file to ``/etc/yum.repos.d``. Replace - ``{distro}`` with the name of your distribution (e.g., ``centos6``, - ``rhel6``, etc.) :: - - [fastcgi-ceph-basearch] - name=FastCGI basearch packages for Ceph - baseurl=http://gitbuilder.ceph.com/mod_fastcgi-rpm-centos6-x86_64-basic/ref/master - enabled=1 - priority=2 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc - - [fastcgi-ceph-noarch] - name=FastCGI noarch packages for Ceph - baseurl=http://gitbuilder.ceph.com/mod_fastcgi-rpm-centos6-x86_64-basic/ref/master - enabled=1 - priority=2 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc - - [fastcgi-ceph-source] - name=FastCGI source packages for Ceph - baseurl=http://gitbuilder.ceph.com/mod_fastcgi-rpm-centos6-x86_64-basic/ref/master - enabled=0 - priority=2 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc - - -#. Update your repo and install Apache and FastCGI. :: - - sudo yum update && sudo yum install httpd mod_fastcgi - - -Modify the Configuration -======================== - -To complete the installation, ensure that you have the rewrite module -enabled and FastCGI enabled. The steps differ slightly based upon the -type of package installation. - -Debian-based Packages ---------------------- - -#. Open the ``apache2.conf`` file. :: - - sudo vim /etc/apache2/apache2.conf - - -#. Add a line for the ``ServerName`` in the Apache configuration file. - Provide the fully qualified domain name of the server machine - (e.g., ``hostname -f``). :: - - ServerName {fqdn} - -#. Enable the URL rewrite modules for Apache and FastCGI. :: - - sudo a2enmod rewrite - sudo a2enmod fastcgi - - -#. Restart Apache so that the foregoing changes take effect. :: - - sudo service apache2 restart - - -RPM-based Packages ------------------- - - -#. Open the ``httpd.conf`` file. :: - - sudo vim /etc/httpd/conf/httpd.conf - -#. Uncomment ``#ServerName`` and add the name of your server. - Provide the fully qualified domain name of the server machine - (e.g., ``hostname -f``).:: - - ServerName {fgdn} - -#. Ensure that the Rewrite module is enabled. :: - - #if not present, add: - LoadModule rewrite_module modules/mod_rewrite.so - -#. Save the ``httpd.conf`` file. - -#. Ensure that the FastCGI module is enabled. The installer should - include an ``/etc/httpd/conf.d/fastcgi.conf`` file that loads the - FastCGI module. :: - - #if not present, add: - LoadModule fastcgi_module modules/mod_fastcgi.so - -#. Restart Apache so that the foregoing changes take effect.. :: - - etc/init.d/httpd restart - -.. _RFC 2616, Section 8: http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html -.. _gitbuilder.ceph.com: http://gitbuilder.ceph.com -.. _Installing YUM Priorities: ../yum-priorities \ No newline at end of file From 7c4394dd0ecc9a8e7249c0b0ba596a0a3480663b Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Wed, 30 Oct 2013 15:18:57 -0700 Subject: [PATCH 041/150] doc: Consolidated install object gateway and install Apache/FastCGI Signed-off-by: John Wilkins --- doc/install/install-ceph-gateway.rst | 254 +++++++++++++++++++++++++++ 1 file changed, 254 insertions(+) create mode 100644 doc/install/install-ceph-gateway.rst diff --git a/doc/install/install-ceph-gateway.rst b/doc/install/install-ceph-gateway.rst new file mode 100644 index 0000000000000..bd41795136a54 --- /dev/null +++ b/doc/install/install-ceph-gateway.rst @@ -0,0 +1,254 @@ +============================= + Install Ceph Object Gateway +============================= + +The :term:`Ceph Object Gateway` daemon runs on Apache and FastCGI. + +To run a :term:`Ceph Object Storage` service, you must install Apache and +FastCGI. Then, you must install the Ceph Object Gateway daemon. The Ceph Object +Gateway supports 100-continue, but you must install Ceph builds of Apache and +FastCGI for 100-continue support. To install the Ceph Object Gateway, first +install and configure Apache and FastCGI. Then, install the Ceph Object Gateway +daemon. If you plan to run a Ceph Object Storage service with a federated +architecture (multiple regions and zones), you must also install the +synchronization agent. + + +Apache/FastCGI w/out 100-Continue +================================= + +You may use standard Apache and FastCGI packages for your Ceph Object +Gateways. However, they will not provide 100-continue support. + +Debian Packages +--------------- + +To install Apache and FastCGI Debian packages, execute the following:: + + sudo apt-get install apache2 libapache2-mod-fastcgi + + +RPM Packages +------------ + +To install Apache and FastCGI RPMs, execute the following:: + + rpm -ivh fcgi-2.4.0-10.el6.x86_64.rpm + rpm -ivh mod_fastcgi-2.4.6-2.el6.rf.x86_64.rpm + +Or:: + + sudo yum install httpd mod_fastcgi + + +Apache/FastCGI w/ 100-Continue +============================== + +The Ceph community provides a slightly optimized version of the ``apache2`` +and ``fastcgi`` packages. The material difference is that the Ceph packages are +optimized for the ``100-continue`` HTTP response, where the server determines +if it will accept the request by first evaluating the request header. See `RFC +2616, Section 8`_ for details on ``100-continue``. You can find the most recent +builds of Apache and FastCGI packages modified for Ceph at `gitbuilder.ceph.com`_. + + +Debian Packages +--------------- + +#. Add a ``ceph-apache.list`` file to your APT sources. :: + + echo deb http://gitbuilder.ceph.com/apache2-deb-$(lsb_release -sc)-x86_64-basic/ref/master $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph-apache.list + +#. Add a ``ceph-fastcgi.list`` file to your APT sources. :: + + echo deb http://gitbuilder.ceph.com/libapache-mod-fastcgi-deb-$(lsb_release -sc)-x86_64-basic/ref/master $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph-fastcgi.list + +#. Update your repository and install Apache and FastCGI:: + + sudo apt-get update && sudo apt-get install apache2 libapache2-mod-fastcgi + + +RPM Packages +------------ + +To install Apache with 100-continue, execute the following steps: + +#. Install ``yum-plugin-priorities``. :: + + sudo yum install yum-plugin-priorities + +#. Ensure ``/etc/yum/pluginconf.d/priorities.conf`` exists. + +#. Ensure ``priorities.conf`` enables the plugin. :: + + [main] + enabled = 1 + +#. Add a ``ceph-apache.repo`` file to ``/etc/yum.repos.d``. Replace + ``{distro}`` with the name of your distribution (e.g., ``centos6``, + ``rhel6``, etc.) :: + + [apache2-ceph-noarch] + name=Apache noarch packages for Ceph + baseurl=http://gitbuilder.ceph.com/apache2-rpm-{distro}-x86_64-basic/ref/master + enabled=1 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc + + [apache2-ceph-source] + name=Apache source packages for Ceph + baseurl=http://gitbuilder.ceph.com/apache2-rpm-{distro}-x86_64-basic/ref/master + enabled=0 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc + + +#. Add a ``ceph-fastcgi.repo`` file to ``/etc/yum.repos.d``. Replace + ``{distro}`` with the name of your distribution (e.g., ``centos6``, + ``rhel6``, etc.) :: + + [fastcgi-ceph-basearch] + name=FastCGI basearch packages for Ceph + baseurl=http://gitbuilder.ceph.com/mod_fastcgi-rpm-centos6-x86_64-basic/ref/master + enabled=1 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc + + [fastcgi-ceph-noarch] + name=FastCGI noarch packages for Ceph + baseurl=http://gitbuilder.ceph.com/mod_fastcgi-rpm-centos6-x86_64-basic/ref/master + enabled=1 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc + + [fastcgi-ceph-source] + name=FastCGI source packages for Ceph + baseurl=http://gitbuilder.ceph.com/mod_fastcgi-rpm-centos6-x86_64-basic/ref/master + enabled=0 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc + + +#. Update your repo and install Apache and FastCGI. :: + + sudo yum update && sudo yum install httpd mod_fastcgi + + +Configure Apache/FastCGI +======================== + +To complete the installation, ensure that you have the rewrite module +enabled and FastCGI enabled. The steps differ slightly based upon the +type of package installation. + +Debian-based Packages +--------------------- + +#. Open the ``apache2.conf`` file. :: + + sudo vim /etc/apache2/apache2.conf + + +#. Add a line for the ``ServerName`` in the Apache configuration file. + Provide the fully qualified domain name of the server machine + (e.g., ``hostname -f``). :: + + ServerName {fqdn} + +#. Enable the URL rewrite modules for Apache and FastCGI. :: + + sudo a2enmod rewrite + sudo a2enmod fastcgi + + +#. Restart Apache so that the foregoing changes take effect. :: + + sudo service apache2 restart + + +RPM-based Packages +------------------ + + +#. Open the ``httpd.conf`` file. :: + + sudo vim /etc/httpd/conf/httpd.conf + +#. Uncomment ``#ServerName`` and add the name of your server. + Provide the fully qualified domain name of the server machine + (e.g., ``hostname -f``).:: + + ServerName {fgdn} + +#. Ensure that the Rewrite module is enabled. :: + + #if not present, add: + LoadModule rewrite_module modules/mod_rewrite.so + +#. Save the ``httpd.conf`` file. + +#. Ensure that the FastCGI module is enabled. The installer should + include an ``/etc/httpd/conf.d/fastcgi.conf`` file that loads the + FastCGI module. :: + + #if not present, add: + LoadModule fastcgi_module modules/mod_fastcgi.so + +#. Restart Apache so that the foregoing changes take effect.. :: + + etc/init.d/httpd restart + +.. _RFC 2616, Section 8: http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html +.. _gitbuilder.ceph.com: http://gitbuilder.ceph.com +.. _Installing YUM Priorities: ../yum-priorities + + + + +Install Ceph Object Gateway +=========================== + +Ceph Object Storage services use the Ceph Object Gateway daemon (``radosgw``) +to enable the gateway. For federated architectures, the synchronization +agent (``radosgw-agent``) provides data and metadata synchronization between +zones and regions. + + +Debian Packages +--------------- + +To install the Ceph Object Gateway daemon, execute the +following:: + + sudo apt-get install radosgw + + +To install the Ceph Object Gateway synchronization agent, execute the +following:: + + sudo apt-get radosgw-agent + + +RPM Packages +------------ + +To install the Ceph Object Gateway daemon, execute the +following:: + + yum install ceph-radosgw + + +To install the Ceph Object Gateway synchronization agent, execute the +following:: + + yum install radosgw-agent \ No newline at end of file From fba056af8f5338e434b2465d1d82df47323bee85 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Wed, 30 Oct 2013 15:19:22 -0700 Subject: [PATCH 042/150] doc: Removed install libvirt. Consolidated to install-vm-cloud. Signed-off-by: John Wilkins --- doc/install/install-libvirt.rst | 51 --------------------------------- 1 file changed, 51 deletions(-) delete mode 100644 doc/install/install-libvirt.rst diff --git a/doc/install/install-libvirt.rst b/doc/install/install-libvirt.rst deleted file mode 100644 index 7b17b0ea20037..0000000000000 --- a/doc/install/install-libvirt.rst +++ /dev/null @@ -1,51 +0,0 @@ -================= - Install libvirt -================= - -To use ``libvirt`` with Ceph, you must have a running Ceph Storage Cluster, and -you must have installed and configured `QEMU`_. - - -Debian Packages -=============== - -``libvirt`` packages are incorporated into Ubuntu 12.04 Precise Pangolin and -later versions of Ubuntu. To install ``libvirt`` on these distributions, -execute the following:: - - sudo apt-get update && sudo apt-get install libvirt-bin - - -RPM Packages -============ - -To use ``libvirt`` with a Ceph Storage Cluster, you must have a running Ceph -Storage Cluster and you must also install a version of QEMU with ``rbd`` format -support. See `QEMU`_ for details. - - -``libvirt`` packages are incorporated into the recent CentOS/RHEL distributions. -To install ``libvirt``, execute the following:: - - sudo yum install libvirt - - -Build ``libvirt`` -================= - -For Ubuntu distributions 11.10 oneiric and earlier, you must build ``libvirt`` -from source. Clone the ``libvirt`` repository, and use `AutoGen`_ to generate -the build. Then, execute ``make`` and ``make install`` to complete the -installation. For example:: - - git clone git://libvirt.org/libvirt.git - cd libvirt - ./autogen.sh - make - sudo make install - -See `libvirt Installation`_ for details. - -.. _libvirt Installation: http://www.libvirt.org/compiling.html -.. _AutoGen: http://www.gnu.org/software/autogen/ -.. _QEMU: ../install-qemu From ea35f791e704d067f30ec7b3f55bad41bd97df0f Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Wed, 30 Oct 2013 15:19:45 -0700 Subject: [PATCH 043/150] doc: Removed install qemu. Consolidated to install-vm-cloud. Signed-off-by: John Wilkins --- doc/install/install-qemu.rst | 85 ------------------------------------ 1 file changed, 85 deletions(-) delete mode 100644 doc/install/install-qemu.rst diff --git a/doc/install/install-qemu.rst b/doc/install/install-qemu.rst deleted file mode 100644 index d47acb43b8943..0000000000000 --- a/doc/install/install-qemu.rst +++ /dev/null @@ -1,85 +0,0 @@ -============== - Install QEMU -============== - -QEMU KVM can interact with Ceph Block Devices via ``librbd``, which is an -important feature for using Ceph with cloud platforms. Once you install QEMU, -see `QEMU and Block Devices`_ for usage. - - -Debian Packages -=============== - -QEMU packages are incorporated into Ubuntu 12.04 Precise Pangolin and later -versions. To install QEMU, execute the following:: - - sudo apt-get install qemu - - -RPM Packages -============ - -To install QEMU with ``yum``, you must ensure that you have -``yum-plugin-priorities`` installed. See `Installing YUM Priorities`_ -for details. - -To install QEMU, execute the following: - -#. Create a ``/etc/yum.repos.d/ceph-qemu.conf`` file with the following - contents:: - - [ceph-qemu] - name=Ceph Packages for QEMU - baseurl=http://ceph.com/packages/ceph-extras/rpm/centos6.3/$basearch - enabled=1 - priority=2 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc - - [ceph-qemu-noarch] - name=Ceph QEMU noarch - baseurl=http://ceph.com/packages/ceph-extras/rpm/centos6.3/noarch - enabled=1 - priority=2 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc - - [ceph-qemu-source] - name=Ceph QEMU Sources - baseurl=http://ceph.com/packages/ceph-extras/rpm/centos6.3/SRPMS - enabled=1 - priority=2 - gpgcheck=1 - type=rpm-md - gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc - -#. Update your repositories. :: - - sudo yum update - -#. Install QEMU for Ceph. :: - - sudo yum install qemu-kvm qemu-kvm-tools qemu-img - -#. Install additional QEMU packages (optional):: - - sudo yum install qemu-guest-agent qemu-guest-agent-win32 - - - -Building QEMU -============= - -To build QEMU from source, use the following procedure:: - - cd {your-development-directory} - git clone git://git.qemu.org/qemu.git - cd qemu - ./configure --enable-rbd - make; make install - - -.. _QEMU and Block Devices: ../../rbd/qemu-rbd -.. _Installing YUM Priorities: ../yum-priorities \ No newline at end of file From f33b11827cfa997687d9fe930cbca417cf24fbab Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Wed, 30 Oct 2013 15:20:08 -0700 Subject: [PATCH 044/150] doc: Added consolidated install of VM/Cloud software. Signed-off-by: John Wilkins --- doc/install/install-vm-cloud.rst | 169 +++++++++++++++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 doc/install/install-vm-cloud.rst diff --git a/doc/install/install-vm-cloud.rst b/doc/install/install-vm-cloud.rst new file mode 100644 index 0000000000000..ac4cd92bfe04b --- /dev/null +++ b/doc/install/install-vm-cloud.rst @@ -0,0 +1,169 @@ +============================= + Install VM/Cloud Enablement +============================= + +If you intend to use Ceph Block Devices and the Ceph Storage Cluster as a +backend for Virtual Machines (VMs) or :term:`Cloud Platforms` the QEMU/KVM and +``libvirt`` packages are important for enabling VMs and cloud platforms. +Examples of VMs include: QEMU/KVM, XEN, VMWare, LXC, VirtualBox, etc. Examples +of Cloud Platforms include OpenStack, CloudStack, OpenNebula, etc. + + +.. ditaa:: +---------------------------------------------------+ + | libvirt | + +------------------------+--------------------------+ + | + | configures + v + +---------------------------------------------------+ + | QEMU | + +---------------------------------------------------+ + | librbd | + +------------------------+-+------------------------+ + | OSDs | | Monitors | + +------------------------+ +------------------------+ + + + +Install QEMU +============ + +QEMU KVM can interact with Ceph Block Devices via ``librbd``, which is an +important feature for using Ceph with cloud platforms. Once you install QEMU, +see `QEMU and Block Devices`_ for usage. + + +Debian Packages +--------------- + +QEMU packages are incorporated into Ubuntu 12.04 Precise Pangolin and later +versions. To install QEMU, execute the following:: + + sudo apt-get install qemu + + +RPM Packages +------------ + +To install QEMU, execute the following: + +#. Install ``yum-plugin-priorities``. :: + + sudo yum install yum-plugin-priorities + +#. Ensure ``/etc/yum/pluginconf.d/priorities.conf`` exists. + +#. Ensure ``priorities.conf`` enables the plugin. :: + + [main] + enabled = 1 + +#. Create a ``/etc/yum.repos.d/ceph-qemu.conf`` file with the following + contents:: + + [ceph-qemu] + name=Ceph Packages for QEMU + baseurl=http://ceph.com/packages/ceph-extras/rpm/centos6.3/$basearch + enabled=1 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc + + [ceph-qemu-noarch] + name=Ceph QEMU noarch + baseurl=http://ceph.com/packages/ceph-extras/rpm/centos6.3/noarch + enabled=1 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc + + [ceph-qemu-source] + name=Ceph QEMU Sources + baseurl=http://ceph.com/packages/ceph-extras/rpm/centos6.3/SRPMS + enabled=1 + priority=2 + gpgcheck=1 + type=rpm-md + gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc + +#. Update your repositories. :: + + sudo yum update + +#. Install QEMU for Ceph. :: + + sudo yum install qemu-kvm qemu-kvm-tools qemu-img + +#. Install additional QEMU packages (optional):: + + sudo yum install qemu-guest-agent qemu-guest-agent-win32 + + +Building QEMU +------------- + +To build QEMU from source, use the following procedure:: + + cd {your-development-directory} + git clone git://git.qemu.org/qemu.git + cd qemu + ./configure --enable-rbd + make; make install + + + +Install libvirt +=============== + +To use ``libvirt`` with Ceph, you must have a running Ceph Storage Cluster, and +you must have installed and configured QEMU. See `Using libvirt with Ceph Block +Device`_ for usage. + + +Debian Packages +--------------- + +``libvirt`` packages are incorporated into Ubuntu 12.04 Precise Pangolin and +later versions of Ubuntu. To install ``libvirt`` on these distributions, +execute the following:: + + sudo apt-get update && sudo apt-get install libvirt-bin + + +RPM Packages +------------ + +To use ``libvirt`` with a Ceph Storage Cluster, you must have a running Ceph +Storage Cluster and you must also install a version of QEMU with ``rbd`` format +support. See `QEMU`_ for details. + + +``libvirt`` packages are incorporated into the recent CentOS/RHEL distributions. +To install ``libvirt``, execute the following:: + + sudo yum install libvirt + + +Building ``libvirt`` +-------------------- + +To build ``libvirt`` from source, clone the ``libvirt`` repository and use +`AutoGen`_ to generate the build. Then, execute ``make`` and ``make install`` to +complete the installation. For example:: + + git clone git://libvirt.org/libvirt.git + cd libvirt + ./autogen.sh + make + sudo make install + +See `libvirt Installation`_ for details. + + + +.. _libvirt Installation: http://www.libvirt.org/compiling.html +.. _AutoGen: http://www.gnu.org/software/autogen/ +.. _QEMU and Block Devices: ../../rbd/qemu-rbd +.. _Using libvirt with Ceph Block Device: ../../rbd/libvirt \ No newline at end of file From 3bc6e520bf6ba131e02df9cb1074b9d1f5add835 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Wed, 30 Oct 2013 15:21:08 -0700 Subject: [PATCH 045/150] Removed add repositories, yum priorities, and consolidated index. Signed-off-by: John Wilkins --- doc/install/index.rst | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/doc/install/index.rst b/doc/install/index.rst index ca094683853b2..f28200398d952 100644 --- a/doc/install/index.rst +++ b/doc/install/index.rst @@ -7,18 +7,17 @@ Get Software ============ There are several methods for getting Ceph software. The easiest and most common -method is to add Ceph repositories for use with package management tools such as -the Advanced Package Tool (APT) or Yellowdog Updater, Modified (YUM). You may -also retrieve pre-compiled packages from the Ceph repository. Finally, you can -retrieve tarballs or clone the Ceph source code repository and build Ceph -yourself. +method is to `get packages`_ by adding repositories for use with package +management tools such as the Advanced Package Tool (APT) or Yellowdog Updater, +Modified (YUM). You may also retrieve pre-compiled packages from the Ceph +repository. Finally, you can retrieve tarballs or clone the Ceph source code +repository and build Ceph yourself. .. toctree:: :maxdepth: 1 - Add Repositories - Get Release Packages + Get Packages Get Tarballs Clone Source Build Ceph @@ -38,12 +37,9 @@ QEMU. :maxdepth: 1 Install ceph-deploy - Install Ceph Storage Cluster daemons - Install yum priorities - Install Apache/FastCGI - Install QEMU/KVM - Install libvirt - + Install Ceph Storage Cluster + Install Ceph Object Gateway + Install VM/Cloud Enablement Upgrade Software ================ @@ -56,4 +52,6 @@ sequence. .. toctree:: :maxdepth: 2 - Upgrading Ceph \ No newline at end of file + Upgrading Ceph + +.. _get packages: ../install/get-packages \ No newline at end of file From a62d7c0d57b739944a7f6041b39ac5822703f99e Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Wed, 30 Oct 2013 15:21:59 -0700 Subject: [PATCH 046/150] doc: Added note for ARM support in quantal and raring. Signed-off-by: John Wilkins --- doc/start/os-recommendations.rst | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/doc/start/os-recommendations.rst b/doc/start/os-recommendations.rst index 3874d37db8119..31d0943cfcb6c 100644 --- a/doc/start/os-recommendations.rst +++ b/doc/start/os-recommendations.rst @@ -45,9 +45,11 @@ Emperor (0.71) +==========+==========+====================+==============+=========+============+ | 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 | +| Ubuntu | 12.10 | Quantal Quetzal | linux-3.5.4 | 2, 4 | B | +----------+----------+--------------------+--------------+---------+------------+ -| Ubuntu | 13.04 | Raring Ringtail | linux-3.8.5 | | B | +| Ubuntu | 13.04 | Raring Ringtail | linux-3.8.5 | 4 | B | ++----------+----------+--------------------+--------------+---------+------------+ +| Ubuntu | 13.10 | Saucy Salamander | linux-3.11.2 | 4 | B | +----------+----------+--------------------+--------------+---------+------------+ | Debian | 6.0 | Squeeze | linux-2.6.32 | 1, 2, 3 | B | +----------+----------+--------------------+--------------+---------+------------+ @@ -187,6 +189,8 @@ Notes ``ceph-osd`` daemons using ``XFS`` or ``ext4`` on the same host will not perform as well as they could. +- **4**: Ceph provides ARM support for Quantal and Raring. Saucy support is + not supported yet, but support is coming soon. Testing ------- From 98603d43e43f22eb6f446bb6bd99f1e2776cb6b2 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Wed, 30 Oct 2013 15:22:31 -0700 Subject: [PATCH 047/150] doc: Changed install to ceph-deploy install. Signed-off-by: John Wilkins --- doc/start/quick-cephfs.rst | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/doc/start/quick-cephfs.rst b/doc/start/quick-cephfs.rst index 5449e5a6fe328..205298713c4d4 100644 --- a/doc/start/quick-cephfs.rst +++ b/doc/start/quick-cephfs.rst @@ -9,13 +9,21 @@ start on the Admin Host. Prerequisites ============= -Install ``ceph-common``. :: +#. Verify that you have an appropriate version of the Linux kernel. + See `OS Recommendations`_ for details. :: + + lsb_release -a + uname -r - sudo apt-get install ceph-common +#. On the admin node, use ``ceph-deploy`` to install Ceph on your + ``ceph-client`` node. :: -Ensure that the :term:`Ceph Storage Cluster` is running and in an ``active + -clean`` state. Also, ensure that you have at least one :term:`Ceph Metadata -Server` running. :: + ceph-deploy install ceph-client + + +#. Ensure that the :term:`Ceph Storage Cluster` is running and in an ``active + + clean`` state. Also, ensure that you have at least one :term:`Ceph Metadata + Server` running. :: ceph -s [-m {monitor-ip-address}] [-k {path/to/ceph.client.admin.keyring}] @@ -94,4 +102,5 @@ if you encounter trouble. .. _Storage Cluster Quick Start: ../quick-ceph-deploy .. _Ceph FS: ../../cephfs/ .. _FAQ: http://wiki.ceph.com/03FAQs/01General_FAQ#How_Can_I_Give_Ceph_a_Try.3F -.. _Troubleshooting: ../../cephfs/troubleshooting \ No newline at end of file +.. _Troubleshooting: ../../cephfs/troubleshooting +.. _OS Recommendations: ../os-recommendations From 16e25cd79d801e7cb7c40bedfab517c69074602b Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Wed, 30 Oct 2013 15:23:07 -0700 Subject: [PATCH 048/150] doc: Restored Object Store Quick Start entry for parallelism. Signed-off-by: John Wilkins --- doc/start/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/start/index.rst b/doc/start/index.rst index b1646e57b4bbd..f0e80b055ce07 100644 --- a/doc/start/index.rst +++ b/doc/start/index.rst @@ -38,7 +38,7 @@ Ceph Block Devices, the Ceph Filesystem, and Ceph Object Storage. Block Device Quick Start Filesystem Quick Start - + Object Storage Quick Start .. raw:: html From c254da5e3bd59d37a0b113e00bdc0327553e0d17 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Wed, 30 Oct 2013 15:23:45 -0700 Subject: [PATCH 049/150] doc: Added quick ceph object store with links to manual install and config. Signed-off-by: John Wilkins --- doc/start/quick-rgw.rst | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 doc/start/quick-rgw.rst diff --git a/doc/start/quick-rgw.rst b/doc/start/quick-rgw.rst new file mode 100644 index 0000000000000..1de018e0d5c25 --- /dev/null +++ b/doc/start/quick-rgw.rst @@ -0,0 +1,11 @@ +=========================== + Quick Ceph Object Storage +=========================== + +At this time, ``ceph-deploy`` does not provide a rapid installation for +:term:`Ceph Object Storage`. To install a :term:`Ceph Object Gateway`, +see `Install Ceph Object Gateway`_. To configure a Ceph Object Gateway, +see `Configuring Ceph Object Gateway`_. + +.. _Install Ceph Object Gateway: ../../install/install-ceph-gateway +.. _Configuring Ceph Object Gateway: ../../radosgw/config \ No newline at end of file From dd14013f5ab7acb69455a88752ea53f35a93b1ee Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Wed, 30 Oct 2013 15:26:01 -0700 Subject: [PATCH 050/150] doc: Removed install yum priorities. Duplicated where relevant. Signed-off-by: John Wilkins --- doc/install/yum-priorities.rst | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 doc/install/yum-priorities.rst diff --git a/doc/install/yum-priorities.rst b/doc/install/yum-priorities.rst deleted file mode 100644 index e4adb72b7dd5c..0000000000000 --- a/doc/install/yum-priorities.rst +++ /dev/null @@ -1,20 +0,0 @@ -=========================== - Installing YUM Priorities -=========================== - -Ceph builds packages for Apache and FastCGI (for 100-continue support) and -QEMU (for ``rbd`` support). You must set priorities in your ``.repo`` -files to ensure that ``yum`` installs the Ceph packages instead of the -standard packages. The ``priorities`` setting requires you to install -and enable ``yum-plugin-priorities``. - -#. Install ``yum-plugin-priorities``. :: - - sudo yum install yum-plugin-priorities - -#. Ensure ``/etc/yum/pluginconf.d/priorities.conf`` exists. :: - -#. Ensure ``priorities.conf`` enables the plugin. :: - - [main] - enabled = 1 From 29dfb790384444bb00e311b205f0b960b0ac7d02 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Thu, 31 Oct 2013 14:46:47 -0700 Subject: [PATCH 051/150] doc: Retitled document. Signed-off-by: John Wilkins --- doc/install/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/install/index.rst b/doc/install/index.rst index f28200398d952..b5cc90b12c455 100644 --- a/doc/install/index.rst +++ b/doc/install/index.rst @@ -39,7 +39,7 @@ QEMU. Install ceph-deploy Install Ceph Storage Cluster Install Ceph Object Gateway - Install VM/Cloud Enablement + Install Virtualization for Block Upgrade Software ================ From 5c9f32286d62603f3858803b2d63ad368e80f46b Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Thu, 31 Oct 2013 14:47:25 -0700 Subject: [PATCH 052/150] doc: Retitled document. Made example generic. Fixed link. Signed-off-by: John Wilkins --- doc/install/install-vm-cloud.rst | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/install/install-vm-cloud.rst b/doc/install/install-vm-cloud.rst index ac4cd92bfe04b..1c54814ddc0bd 100644 --- a/doc/install/install-vm-cloud.rst +++ b/doc/install/install-vm-cloud.rst @@ -1,6 +1,6 @@ -============================= - Install VM/Cloud Enablement -============================= +========================================= + Install Virtualization for Block Device +========================================= If you intend to use Ceph Block Devices and the Ceph Storage Cluster as a backend for Virtual Machines (VMs) or :term:`Cloud Platforms` the QEMU/KVM and @@ -22,7 +22,6 @@ of Cloud Platforms include OpenStack, CloudStack, OpenNebula, etc. +------------------------+-+------------------------+ | OSDs | | Monitors | +------------------------+ +------------------------+ - Install QEMU @@ -59,11 +58,12 @@ To install QEMU, execute the following: enabled = 1 #. Create a ``/etc/yum.repos.d/ceph-qemu.conf`` file with the following - contents:: + contents, and replace ``{distro}`` with your Linux distribution. Follow + the ``baseurl`` path below to see which distributions Ceph supports:: [ceph-qemu] name=Ceph Packages for QEMU - baseurl=http://ceph.com/packages/ceph-extras/rpm/centos6.3/$basearch + baseurl=http://ceph.com/packages/ceph-extras/rpm/{distro}/$basearch enabled=1 priority=2 gpgcheck=1 @@ -72,7 +72,7 @@ To install QEMU, execute the following: [ceph-qemu-noarch] name=Ceph QEMU noarch - baseurl=http://ceph.com/packages/ceph-extras/rpm/centos6.3/noarch + baseurl=http://ceph.com/packages/ceph-extras/rpm/{distro}/noarch enabled=1 priority=2 gpgcheck=1 @@ -81,7 +81,7 @@ To install QEMU, execute the following: [ceph-qemu-source] name=Ceph QEMU Sources - baseurl=http://ceph.com/packages/ceph-extras/rpm/centos6.3/SRPMS + baseurl=http://ceph.com/packages/ceph-extras/rpm/{distro}/SRPMS enabled=1 priority=2 gpgcheck=1 @@ -137,7 +137,7 @@ RPM Packages To use ``libvirt`` with a Ceph Storage Cluster, you must have a running Ceph Storage Cluster and you must also install a version of QEMU with ``rbd`` format -support. See `QEMU`_ for details. +support. See `Install QEMU`_ for details. ``libvirt`` packages are incorporated into the recent CentOS/RHEL distributions. From 698df0460607eb50a842fd8ffc50d86a8bc818f8 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Thu, 31 Oct 2013 14:47:49 -0700 Subject: [PATCH 053/150] doc: Removed references to OpenSuse and SLES. Signed-off-by: John Wilkins --- doc/start/quick-start-preflight.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/start/quick-start-preflight.rst b/doc/start/quick-start-preflight.rst index 77a54795f1948..eb4bf6e430497 100644 --- a/doc/start/quick-start-preflight.rst +++ b/doc/start/quick-start-preflight.rst @@ -118,8 +118,8 @@ For Debian and Ubuntu distributions, perform the following steps: Red Hat Package Manager (RPM) ----------------------------- -For Red Hat(rhel6), CentOS (el6), Fedora 17-19 (f17-f19), OpenSUSE 12 -(opensuse12), and SLES (sles11) perform the following steps: +For Red Hat(rhel6), CentOS (el6), and Fedora 17-19 (f17-f19) perform the +following steps: #. Add the package to your repository. Open a text editor and create a Yellowdog Updater, Modified (YUM) entry. Use the file path From d6a6cf5a0bcb1426c754b0bd5783a46c1c0ca387 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Thu, 31 Oct 2013 16:45:41 -0700 Subject: [PATCH 054/150] doc: Modified image. Signed-off-by: John Wilkins --- doc/images/region-zone-sync.png | Bin 78497 -> 69800 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/images/region-zone-sync.png b/doc/images/region-zone-sync.png index de2d9c3ade06f689dd23a609d26641b8636bdb28..adafd40cfbc2f6ec5da948385700fbf15fa9d830 100644 GIT binary patch literal 69800 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
Xf2VDw%YZ&$KKF2}qR7RMEPRv8oYa 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 A!~g&Q literal 78497 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 h|NjYQ{$JL?U-`(#1 Date: Thu, 31 Oct 2013 16:46:02 -0700 Subject: [PATCH 055/150] doc: Created new zone sync image. Signed-off-by: John Wilkins --- doc/images/zone-sync.png | Bin 0 -> 45234 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/images/zone-sync.png diff --git a/doc/images/zone-sync.png b/doc/images/zone-sync.png new file mode 100644 index 0000000000000000000000000000000000000000..6289feab4503b35f85407f718616351b363cafaf GIT binary patch literal 45234 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 M%c{uKN|}ZIFA9!@%>V!Z literal 0 HcmV?d00001 From ba153ea19a891bdaf802f1998d322d1ebdbc01ee Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Thu, 31 Oct 2013 16:46:34 -0700 Subject: [PATCH 056/150] doc: Incorporated feedback. Signed-off-by: John Wilkins --- doc/radosgw/federated-config.rst | 113 +++++++++++++++---------------- 1 file changed, 56 insertions(+), 57 deletions(-) diff --git a/doc/radosgw/federated-config.rst b/doc/radosgw/federated-config.rst index 2fdb242514702..69d1a968defe7 100644 --- a/doc/radosgw/federated-config.rst +++ b/doc/radosgw/federated-config.rst @@ -14,6 +14,9 @@ regions, and with multiple zones for a region. - **Zone**: A zone is a *logical* grouping of one or more Ceph Object Gateway instance(s). A region has a master zone that processes client requests. +.. important:: Only write objects to the master zone in a region. You may read + objects from secondary zones. Currently, the Gateway does not prevent you + from writing to a secondary zone, but DON'T DO IT. Background ========== @@ -41,15 +44,16 @@ About this Guide In the following sections, we will demonstrate how to configure a federated cluster in two logical steps: -#. **Configure a Master Region:** This section of the guide describes how to - set up a region with multiple zones, and how to synchronize data between the - master zone and the secondary zone(s) within the master region. - -#. **Configure a Secondary Region:** This section of the guide describes how - to repeat the section on setting up a master region and multiple zones so - that you have two regions with intra-zone synchronization in each region. - Finally, you will learn how to set up a metadata synchronization agent so - that you can maintain a global namespace for the regions in your cluster. +- **Configure a Master Region:** This section of the guide describes how to + set up a region with multiple zones, and how to synchronize data between the + master zone and the secondary zone(s) within the master region. + +- **Configure a Secondary Region:** This section of the guide describes how + to repeat the section on setting up a master region and multiple zones so + that you have two regions with intra-zone synchronization in each region. + Finally, you will learn how to set up a metadata synchronization agent so + that you can maintain a global namespace for the regions in your cluster. + Configure a Master Region @@ -59,6 +63,7 @@ This section provides an exemplary procedure for setting up a region, and two zones within the region. The cluster will comprise two gateway daemon instances--one per zone. This region will serve as the master region. +.. image:: ../images/zone-sync.png Naming for the Master Region ---------------------------- @@ -359,7 +364,7 @@ Create a Region #. Create the ``us`` region using the ``us.json`` infile you just created. :: - sudo radosgw-admin region set --infile us.json --name client.radosgw.us-east-1 + radosgw-admin region set --infile us.json --name client.radosgw.us-east-1 #. Delete the default region (if it exists). :: @@ -367,13 +372,13 @@ Create a Region #. Set the ``us`` region as the default region. :: - sudo radosgw-admin region default --rgw-region=us --name client.radosgw.us-east-1 + radosgw-admin region default --rgw-region=us --name client.radosgw.us-east-1 Only one region can be the default region for a cluster. #. Update the region map. :: - sudo radosgw-admin regionmap update --name client.radosgw.us-east-1 + radosgw-admin regionmap update --name client.radosgw.us-east-1 @@ -407,15 +412,15 @@ Create Zones just created in both the east and west pools by specifying their respective user names (i.e., ``--name``). :: - sudo radosgw-admin zone set --rgw-zone=us-east --infile us-east.json --name client.radosgw.us-east-1 - sudo radosgw-admin zone set --rgw-zone=us-east --infile us-east.json --name client.radosgw.us-west-1 + radosgw-admin zone set --rgw-zone=us-east --infile us-east.json --name client.radosgw.us-east-1 + radosgw-admin zone set --rgw-zone=us-east --infile us-east.json --name client.radosgw.us-west-1 Repeat step 1 to create a zone infile for ``us-west``. Then add the zone using the ``us-west.json`` infile in both the east and west pools by specifying their respective user names (i.e., ``--name``). :: - sudo radosgw-admin zone set --rgw-zone=us-west --infile us-west.json --name client.radosgw.us-east-1 - sudo radosgw-admin zone set --rgw-zone=us-west --infile us-west.json --name client.radosgw.us-west-1 + radosgw-admin zone set --rgw-zone=us-west --infile us-west.json --name client.radosgw.us-east-1 + radosgw-admin zone set --rgw-zone=us-west --infile us-west.json --name client.radosgw.us-west-1 #. Delete the default zone (if it exists). :: @@ -425,7 +430,7 @@ Create Zones #. Update the region map. :: - sudo radosgw-admin regionmap update --name client.radosgw.us-east-1 + radosgw-admin regionmap update --name client.radosgw.us-east-1 @@ -437,8 +442,8 @@ users after configuring the zones. Copy the ``access_key`` and ``secret_key`` fields for each user so you can update your zone configuration once you complete this step. :: - sudo radosgw-admin user create --uid="us-east" --display-name="Region-US Zone-East" --name client.radosgw.us-east-1 --system - sudo radosgw-admin user create --uid="us-west" --display-name="Region-US Zone-West" --name client.radosgw.us-west-1 --system + radosgw-admin user create --uid="us-east" --display-name="Region-US Zone-East" --name client.radosgw.us-east-1 --system + radosgw-admin user create --uid="us-west" --display-name="Region-US Zone-West" --name client.radosgw.us-west-1 --system Update Zone Configurations @@ -471,14 +476,14 @@ the synchronization agents can authenticate with the zones. #. Save the ``us-east.json`` file. Then, update your zone configuration. :: - sudo radosgw-admin zone set --rgw-zone=us-east --infile us-east.json --name client.radosgw.us-east-1 - sudo radosgw-admin zone set --rgw-zone=us-east --infile us-east.json --name client.radosgw.us-west-1 + radosgw-admin zone set --rgw-zone=us-east --infile us-east.json --name client.radosgw.us-east-1 + radosgw-admin zone set --rgw-zone=us-east --infile us-east.json --name client.radosgw.us-west-1 #. Repeat step 1 to update the zone infile for ``us-west``. Then, update your zone configuration. :: - sudo radosgw-admin zone set --rgw-zone=us-west --infile us-west.json --name client.radosgw.us-east-1 - sudo radosgw-admin zone set --rgw-zone=us-west --infile us-west.json --name client.radosgw.us-west-1 + radosgw-admin zone set --rgw-zone=us-west --infile us-west.json --name client.radosgw.us-east-1 + radosgw-admin zone set --rgw-zone=us-west --infile us-west.json --name client.radosgw.us-west-1 Restart Services @@ -533,37 +538,32 @@ Replicate Data The data synchronization agent replicates the data of a master zone to a secondary zone. The master zone of a region is the source for the secondary zone -of the region. +of the region and it gets selected automatically. +To configure the synchronization agent, retrieve the access key and secret for +the source and destination, and the destination URL and port. -To configure the synchronization agent, retrieve the following from each zone: - -- Zone Name -- Access Key -- Secret Key -- Hostname -- Port +You may use ``radosgw-admin zone list`` to get a list of zone names. You +may use ``radosgw-admin zone get`` to identify the key and secret for the +zone. You may refer to the gateway configuration file you created under +`Create a Gateway Configuration`_ to identify the port number. You only need the hostname and port for a single instance (assuming all gateway instances in a region/zone access the same Ceph Storage Cluster). Specify these values in a configuration file -(e.g., ``cluster-data-sync.conf``), and include a ``log_file`` name and an -identifier for the ``daemon_id``. For example: +(e.g., ``cluster-data-sync.conf``), and include a ``log_file`` name. + + +For example: .. code-block:: ini src_access_key: {source-access-key} src_secret_key: {source-secret-key} - src_host: {source-hostname} - src_port: {source-port} - src_zone: {source-zone} + destination: https://zone-name.fqdn.com:port dest_access_key: {destination-access-key} dest_secret_key: {destination-secret-key} - dest_host: {destination-hostname} - dest_port: {destination-port} - dest_zone: {destination-zone} log_file: {log.filename} - daemon_id: {daemon-id} A concrete example may look like this: @@ -571,17 +571,10 @@ A concrete example may look like this: src_access_key: DG8RE354EFPZBICHIAF0 src_secret_key: i3U0HiRP8CXaBWrcF8bbh6CbsxGYuPPwRkixfFSb - src_host: ceph-gateway-east - src_port: 80 - src_zone: us-east + destination: https://us-west.storage.net:80 dest_access_key: U60RFI6B08F32T2PD30G dest_secret_key: W3HuUor7Gl1Ee93pA2pq2wFk1JMQ7hTrSDecYExl - dest_host: ceph-gateway-west - dest_port: 80 - dest_zone: us-west log_file: /var/log/radosgw/radosgw-sync-us-east-west.log - daemon_id: rgw-east-2-west - To activate the data synchronization agent, open a terminal and execute the following:: @@ -613,6 +606,9 @@ multiple regions. Configuring a cluster that spans regions requires maintaining a global namespace, so that there are no namespace clashes among object names stored across in different regions. +.. image:: ../images/region-zone-sync.png + :align: center + This section extends the procedure in `Configure a Master Region`_, but changes the region name and modifies a few procedures. See the following sections for details. @@ -677,7 +673,7 @@ with the following differences: ``false``. For consistency, create the master region in the secondary region too. :: - sudo radosgw-admin region set --infile us.json --name client.radosgw.eu-east-1 + radosgw-admin region set --infile us.json --name client.radosgw.eu-east-1 #. `Create Zones`_ using ``eu`` instead of ``us``. Ensure that you update the user name (i.e., ``--name``) so that you create the zones in the correct @@ -687,17 +683,17 @@ with the following differences: #. Create zones from master region in the secondary region. :: - sudo radosgw-admin zone set --rgw-zone=us-east --infile us-east.json --name client.radosgw.eu-east-1 - sudo radosgw-admin zone set --rgw-zone=us-east --infile us-east.json --name client.radosgw.eu-west-1 - sudo radosgw-admin zone set --rgw-zone=us-west --infile us-west.json --name client.radosgw.eu-east-1 - sudo radosgw-admin zone set --rgw-zone=us-west --infile us-west.json --name client.radosgw.eu-west-1 + radosgw-admin zone set --rgw-zone=us-east --infile us-east.json --name client.radosgw.eu-east-1 + radosgw-admin zone set --rgw-zone=us-east --infile us-east.json --name client.radosgw.eu-west-1 + radosgw-admin zone set --rgw-zone=us-west --infile us-west.json --name client.radosgw.eu-east-1 + radosgw-admin zone set --rgw-zone=us-west --infile us-west.json --name client.radosgw.eu-west-1 #. Create zones from secondary region in the master region. :: - sudo radosgw-admin zone set --rgw-zone=eu-east --infile eu-east.json --name client.radosgw.us-east-1 - sudo radosgw-admin zone set --rgw-zone=eu-east --infile eu-east.json --name client.radosgw.us-west-1 - sudo radosgw-admin zone set --rgw-zone=eu-west --infile eu-west.json --name client.radosgw.us-east-1 - sudo radosgw-admin zone set --rgw-zone=eu-west --infile eu-west.json --name client.radosgw.us-west-1 + radosgw-admin zone set --rgw-zone=eu-east --infile eu-east.json --name client.radosgw.us-east-1 + radosgw-admin zone set --rgw-zone=eu-east --infile eu-east.json --name client.radosgw.us-west-1 + radosgw-admin zone set --rgw-zone=eu-west --infile eu-west.json --name client.radosgw.us-east-1 + radosgw-admin zone set --rgw-zone=eu-west --infile eu-west.json --name client.radosgw.us-west-1 #. `Restart Services`_. @@ -706,6 +702,9 @@ with the following differences: Replicate Metadata ------------------ +Metadata consists of gateway users and buckets, but not the objects within +the buckets. + `Replicate Data`_ by specifying the master zone of the master region as the source zone and the master zone of the secondary region as the secondary zone. When activating the ``radosgw-agent``, specify ``--metadata-only`` so From a8c3373dc3096a5640038e3527aa02a4ae830fd6 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Thu, 31 Oct 2013 16:46:58 -0700 Subject: [PATCH 057/150] doc: Updated rewrite rule. Signed-off-by: John Wilkins --- doc/radosgw/rgw.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/radosgw/rgw.conf b/doc/radosgw/rgw.conf index bb02720e3a6d9..7cc73070651d5 100644 --- a/doc/radosgw/rgw.conf +++ b/doc/radosgw/rgw.conf @@ -9,7 +9,7 @@ FastCgiExternalServer /var/www/s3gw.fcgi -socket /{path}/{socket-name}.sock ServerAdmin {email.address} DocumentRoot /var/www RewriteEngine On - RewriteRule ^/([a-zA-Z0-9-_.]*)([/]?.*) /s3gw.fcgi?page=$1¶ms=$2&%{QUERY_STRING} [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L] + RewriteRule ^/(.*) /s3gw.fcgi?%{QUERY_STRING}[E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L] From 4a41d3d24b86382938232afd5c07c65974c66720 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 30 Oct 2013 13:20:46 -0700 Subject: [PATCH 058/150] os/chain_listxattr: fix leak fix e22347df3854a5c5ebc6631c62d70447d67d722d added a bad goto; just free explicitly instead. Signed-off-by: Sage Weil Reviewed-by: Noah Watkins --- src/os/chain_xattr.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/os/chain_xattr.cc b/src/os/chain_xattr.cc index 52ae8dba868f9..8ca815689ed36 100644 --- a/src/os/chain_xattr.cc +++ b/src/os/chain_xattr.cc @@ -354,8 +354,10 @@ int chain_listxattr(const char *fn, char *names, size_t len) { return -ENOMEM; r = sys_listxattr(fn, full_buf, total_len); - if (r < 0) - goto done; + if (r < 0) { + free(full_buf); + return r; + } char *p = full_buf; const char *end = full_buf + r; From 99c5319c2c9f30ff8c261db5254723e581797198 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Tue, 29 Oct 2013 14:53:53 -0700 Subject: [PATCH 059/150] test/rados/list.cc: we might get some objects more than once Signed-off-by: Samuel Just Reviewed-by: Sage Weil --- src/test/librados/list.cc | 54 ++++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/src/test/librados/list.cc b/src/test/librados/list.cc index 1ea56c295a486..5adbe07beb9bb 100644 --- a/src/test/librados/list.cc +++ b/src/test/librados/list.cc @@ -1,3 +1,4 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- #include "include/rados/librados.h" #include "include/rados/librados.hpp" #include "test/librados/test.h" @@ -20,9 +21,12 @@ TEST(LibRadosList, ListObjects) { rados_list_ctx_t ctx; ASSERT_EQ(0, rados_objects_list_open(ioctx, &ctx)); const char *entry; - ASSERT_EQ(0, rados_objects_list_next(ctx, &entry, NULL)); - ASSERT_EQ(std::string(entry), "foo"); - ASSERT_EQ(-ENOENT, rados_objects_list_next(ctx, &entry, NULL)); + bool foundit = false; + while (rados_objects_list_next(ctx, &entry, NULL) != -ENOENT) { + foundit = true; + ASSERT_EQ(std::string(entry), "foo"); + } + ASSERT_TRUE(foundit); rados_objects_list_close(ctx); rados_ioctx_destroy(ioctx); ASSERT_EQ(0, destroy_one_pool(pool_name, &cluster)); @@ -40,10 +44,13 @@ TEST(LibRadosList, ListObjectsPP) { bl1.append(buf, sizeof(buf)); ASSERT_EQ((int)sizeof(buf), ioctx.write("foo", bl1, sizeof(buf), 0)); ObjectIterator iter(ioctx.objects_begin()); - ASSERT_EQ((iter == ioctx.objects_end()), false); - ASSERT_EQ((*iter).first, "foo"); - ++iter; - ASSERT_EQ(true, (iter == ioctx.objects_end())); + bool foundit = false; + while (iter != ioctx.objects_end()) { + foundit = true; + ASSERT_EQ((*iter).first, "foo"); + ++iter; + } + ASSERT_TRUE(foundit); ioctx.close(); ASSERT_EQ(0, destroy_one_pool_pp(pool_name, cluster)); } @@ -51,12 +58,18 @@ TEST(LibRadosList, ListObjectsPP) { static void check_list(std::set& myset, rados_list_ctx_t& ctx) { const char *entry; - while(!myset.empty()) { - ASSERT_EQ(0, rados_objects_list_next(ctx, &entry, NULL)); - ASSERT_TRUE(myset.end() != myset.find(std::string(entry))); + std::set orig_set(myset); + /** + * During splitting, we might see duplicate items. + * We assert that every object returned is in myset and that + * we don't hit ENOENT until we have hit every item in myset + * at least once. + */ + while (rados_objects_list_next(ctx, &entry, NULL) != -ENOENT) { + ASSERT_TRUE(orig_set.end() != orig_set.find(std::string(entry))); myset.erase(std::string(entry)); } - ASSERT_EQ(-ENOENT, rados_objects_list_next(ctx, &entry, NULL)); + ASSERT_TRUE(myset.empty()); } TEST(LibRadosList, ListObjectsNS) { @@ -117,18 +130,19 @@ TEST(LibRadosList, ListObjectsNS) { static void check_listpp(std::set& myset, IoCtx& ioctx) { ObjectIterator iter(ioctx.objects_begin()); - if (myset.empty()) { - ASSERT_EQ((iter == ioctx.objects_end()), true); - return; - } - - while(!myset.empty()) { - ASSERT_EQ((iter == ioctx.objects_end()), false); - ASSERT_TRUE(myset.end() != myset.find(std::string((*iter).first))); + std::set orig_set(myset); + /** + * During splitting, we might see duplicate items. + * We assert that every object returned is in myset and that + * we don't hit ENOENT until we have hit every item in myset + * at least once. + */ + while (iter != ioctx.objects_end()) { + ASSERT_TRUE(orig_set.end() != orig_set.find(std::string((*iter).first))); myset.erase(std::string((*iter).first)); ++iter; } - ASSERT_EQ((iter == ioctx.objects_end()), true); + ASSERT_TRUE(myset.empty()); } TEST(LibRadosList, ListObjectsPPNS) { From ca4c166b7e2ef33601016035cc8aefc85faf66e1 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Wed, 30 Oct 2013 16:12:19 -0700 Subject: [PATCH 060/150] test/osd/RadosModel.h: select and reserve roll_back_to atomically Signed-off-by: Samuel Just Reviewed-by: Sage Weil --- src/test/osd/RadosModel.h | 15 +++++++++++++-- src/test/osd/TestRados.cc | 8 ++------ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/test/osd/RadosModel.h b/src/test/osd/RadosModel.h index ac2f336f1101e..902d4b970c3df 100644 --- a/src/test/osd/RadosModel.h +++ b/src/test/osd/RadosModel.h @@ -1325,11 +1325,10 @@ class RollbackOp : public TestOp { RollbackOp(int n, RadosTestContext *context, const string &_oid, - int snap, TestOpStat *stat = 0) : TestOp(n, context, stat), oid(_oid), - roll_back_to(snap), done(false) + roll_back_to(-1), done(false) {} void _begin() @@ -1340,10 +1339,22 @@ class RollbackOp : public TestOp { context->state_lock.Unlock(); return; } + + if (context->snaps.empty()) { + context->kick(); + context->state_lock.Unlock(); + done = true; + return; + } + context->oid_in_use.insert(oid); context->oid_not_in_use.erase(oid); + + roll_back_to = rand_choose(context->snaps)->first; context->snaps_in_use.insert(roll_back_to); + cout << "rollback oid " << oid << " to " << roll_back_to << std::endl; + context->roll_back(oid, roll_back_to); uint64_t snap = context->snaps[roll_back_to]; diff --git a/src/test/osd/TestRados.cc b/src/test/osd/TestRados.cc index 842f9d2bca3e1..0c1d55c7777e6 100644 --- a/src/test/osd/TestRados.cc +++ b/src/test/osd/TestRados.cc @@ -123,14 +123,10 @@ class WeightedTestGenerator : public TestOpGenerator } case TEST_OP_ROLLBACK: - if (context.snaps.empty()) { - return NULL; - } { - int snap = rand_choose(context.snaps)->first; string oid = *(rand_choose(context.oid_not_in_use)); - cout << "rollback oid " << oid << " to " << snap << std::endl; - return new RollbackOp(m_op, &context, oid, snap); + cout << "rollback oid " << oid << std::endl; + return new RollbackOp(m_op, &context, oid); } case TEST_OP_SETATTR: From 353813b2e1a98901b876790c7c531f8a202c661d Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Wed, 30 Oct 2013 16:54:39 -0700 Subject: [PATCH 061/150] PGLog: remove obsolete assert in merge_log This assert assumes that if olog.head != log.head, olog contains a log entry at log.head, which may not be true since pg splitting might have left the log with arbitrary holes. Related: 0c2769d3321bff6e85ec57c85a08ee0b8e751bcb Signed-off-by: Samuel Just Reviewed-by: Sage Weil --- src/osd/PGLog.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/osd/PGLog.cc b/src/osd/PGLog.cc index 130a8e0778f71..526baecf1284a 100644 --- a/src/osd/PGLog.cc +++ b/src/osd/PGLog.cc @@ -422,8 +422,6 @@ void PGLog::merge_log(ObjectStore::Transaction& t, log.index(*to); dout(15) << *to << dendl; } - assert(to != olog.log.end() || - (olog.head == info.last_update)); // splice into our log. log.log.splice(log.log.begin(), From 4402898390a9d9c8cb296ea05ac7c75f2c32a528 Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Wed, 30 Oct 2013 16:34:29 -0700 Subject: [PATCH 062/150] prio-q: initialize cur iterator For new SubQueues `cur` is not intialized, so front/pop_front will freak out. I honestly I have no idea how this hasn't been seen, but it was being triggered frequently on OSX. Fixes: #6686 Signed-off-by: Noah Watkins Reviewed-by: Samuel Just --- src/common/PrioritizedQueue.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/PrioritizedQueue.h b/src/common/PrioritizedQueue.h index 6dcb519da400e..e663f277693ea 100644 --- a/src/common/PrioritizedQueue.h +++ b/src/common/PrioritizedQueue.h @@ -92,7 +92,7 @@ class PrioritizedQueue { SubQueue() : tokens(0), max_tokens(0), - size(0) {} + size(0), cur(q.begin()) {} void set_max_tokens(unsigned mt) { max_tokens = mt; } From 28e4271267976ab8405a24d015f2fb50a2f82c49 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Thu, 31 Oct 2013 13:19:32 -0700 Subject: [PATCH 063/150] sharedptr_registry.hpp: removed ptrs need to not blast contents See the included unit test update. Consider: 1) x = lookup_or_create(1, 1) 2) remove(1) 3) y = lookup_or_create(1, 2) 4) x.reset() 5) z = lookup(1) The bug is that z will be null since x.reset() caused the cleanup callback to remove y's key value from contents. To fix this, contents also records the pointer value for the weak_ptr. The removal callback only removes the key from contents if it matches the ptr in contents. This should work since the pointer passed to the removal callback must be unique up to that point since it has not yet been deleted. This allowed a pg removal -> pg recreation -> pg removal sequence to cause the second pg removal entry to be erroneously cleared by the first pg removal's destructor as it finally made its way through the removal queue. Fixes: #5951 Signed-off-by: Samuel Just Reviewed-by: Greg Farnum --- src/common/sharedptr_registry.hpp | 49 +++++++++++++-------- src/test/common/test_sharedptr_registry.cc | 51 ++++++++++++++++++---- 2 files changed, 75 insertions(+), 25 deletions(-) diff --git a/src/common/sharedptr_registry.hpp b/src/common/sharedptr_registry.hpp index 90043001ee7f8..9fe2fe6be1a10 100644 --- a/src/common/sharedptr_registry.hpp +++ b/src/common/sharedptr_registry.hpp @@ -33,7 +33,7 @@ class SharedPtrRegistry { private: Mutex lock; Cond cond; - map contents; + map > contents; class OnRemoval { SharedPtrRegistry *parent; @@ -44,8 +44,13 @@ class SharedPtrRegistry { void operator()(V *to_remove) { { Mutex::Locker l(parent->lock); - parent->contents.erase(key); - parent->cond.Signal(); + typename map >::iterator i = + parent->contents.find(key); + if (i != parent->contents.end() && + i->second.second == to_remove) { + parent->contents.erase(i); + parent->cond.Signal(); + } } delete to_remove; } @@ -68,9 +73,10 @@ class SharedPtrRegistry { { Mutex::Locker l(lock); VPtr next_val; - typename map::iterator i = contents.upper_bound(key); + typename map >::iterator i = + contents.upper_bound(key); while (i != contents.end() && - !(next_val = i->second.lock())) + !(next_val = i->second.first.lock())) ++i; if (i == contents.end()) return false; @@ -86,9 +92,10 @@ class SharedPtrRegistry { bool get_next(const K &key, pair *next) { VPtr next_val; Mutex::Locker l(lock); - typename map::iterator i = contents.upper_bound(key); + typename map >::iterator i = + contents.upper_bound(key); while (i != contents.end() && - !(next_val = i->second.lock())) + !(next_val = i->second.first.lock())) ++i; if (i == contents.end()) return false; @@ -101,8 +108,10 @@ class SharedPtrRegistry { Mutex::Locker l(lock); waiting++; while (1) { - if (contents.count(key)) { - VPtr retval = contents[key].lock(); + typename map >::iterator i = + contents.find(key); + if (i != contents.end()) { + VPtr retval = i->second.first.lock(); if (retval) { waiting--; return retval; @@ -120,8 +129,10 @@ class SharedPtrRegistry { Mutex::Locker l(lock); waiting++; while (1) { - if (contents.count(key)) { - VPtr retval = contents[key].lock(); + typename map >::iterator i = + contents.find(key); + if (i != contents.end()) { + VPtr retval = i->second.first.lock(); if (retval) { waiting--; return retval; @@ -131,8 +142,9 @@ class SharedPtrRegistry { } cond.Wait(lock); } - VPtr retval(new V(), OnRemoval(this, key)); - contents[key] = retval; + V *ptr = new V(); + VPtr retval(ptr, OnRemoval(this, key)); + contents.insert(make_pair(key, make_pair(retval, ptr))); waiting--; return retval; } @@ -148,8 +160,10 @@ class SharedPtrRegistry { Mutex::Locker l(lock); waiting++; while (1) { - if (contents.count(key)) { - VPtr retval = contents[key].lock(); + typename map >::iterator i = + contents.find(key); + if (i != contents.end()) { + VPtr retval = i->second.first.lock(); if (retval) { waiting--; return retval; @@ -159,8 +173,9 @@ class SharedPtrRegistry { } cond.Wait(lock); } - VPtr retval(new V(arg), OnRemoval(this, key)); - contents[key] = retval; + V *ptr = new V(arg); + VPtr retval(ptr, OnRemoval(this, key)); + contents.insert(make_pair(key, make_pair(retval, ptr))); waiting--; return retval; } diff --git a/src/test/common/test_sharedptr_registry.cc b/src/test/common/test_sharedptr_registry.cc index b1713a9bd9ff6..6121b6335b8d3 100644 --- a/src/test/common/test_sharedptr_registry.cc +++ b/src/test/common/test_sharedptr_registry.cc @@ -32,7 +32,9 @@ using namespace std::tr1; class SharedPtrRegistryTest : public SharedPtrRegistry { public: Mutex &get_lock() { return lock; } - map > &get_contents() { return contents; } + map, int*> > &get_contents() { + return contents; + } }; class SharedPtrRegistry_all : public ::testing::Test { @@ -125,9 +127,9 @@ TEST_F(SharedPtrRegistry_all, wait_lookup_or_create) { unsigned int key = 1; { shared_ptr ptr(new int); - registry.get_contents()[key] = ptr; + registry.get_contents()[key] = make_pair(ptr, ptr.get()); } - EXPECT_FALSE(registry.get_contents()[key].lock()); + EXPECT_FALSE(registry.get_contents()[key].first.lock()); Thread_wait t(registry, key, 0, Thread_wait::LOOKUP_OR_CREATE); t.create(); @@ -145,9 +147,9 @@ TEST_F(SharedPtrRegistry_all, wait_lookup_or_create) { int value = 3; { shared_ptr ptr(new int); - registry.get_contents()[key] = ptr; + registry.get_contents()[key] = make_pair(ptr, ptr.get()); } - EXPECT_FALSE(registry.get_contents()[key].lock()); + EXPECT_FALSE(registry.get_contents()[key].first.lock()); Thread_wait t(registry, key, value, Thread_wait::LOOKUP_OR_CREATE); t.create(); @@ -188,9 +190,9 @@ TEST_F(SharedPtrRegistry_all, wait_lookup) { int value = 2; { shared_ptr ptr(new int); - registry.get_contents()[key] = ptr; + registry.get_contents()[key] = make_pair(ptr, ptr.get()); } - EXPECT_FALSE(registry.get_contents()[key].lock()); + EXPECT_FALSE(registry.get_contents()[key].first.lock()); Thread_wait t(registry, key, value, Thread_wait::LOOKUP); t.create(); @@ -221,7 +223,7 @@ TEST_F(SharedPtrRegistry_all, get_next) { // entries with expired pointers are silentely ignored const unsigned int key_gone = 222; - registry.get_contents()[key_gone] = shared_ptr(); + registry.get_contents()[key_gone] = make_pair(shared_ptr(), (int*)0); const unsigned int key1 = 111; shared_ptr ptr1 = registry.lookup_or_create(key1); @@ -258,6 +260,39 @@ TEST_F(SharedPtrRegistry_all, get_next) { } } +TEST_F(SharedPtrRegistry_all, remove) { + { + SharedPtrRegistryTest registry; + const unsigned int key1 = 1; + shared_ptr ptr1 = registry.lookup_or_create(key1); + *ptr1 = 400; + registry.remove(key1); + + shared_ptr ptr2 = registry.lookup_or_create(key1); + *ptr2 = 500; + + ptr1 = shared_ptr(); + shared_ptr res = registry.lookup(key1); + assert(res); + assert(res == ptr2); + assert(*res == 500); + } + { + SharedPtrRegistryTest registry; + const unsigned int key1 = 1; + shared_ptr ptr1 = registry.lookup_or_create(key1, 400); + registry.remove(key1); + + shared_ptr ptr2 = registry.lookup_or_create(key1, 500); + + ptr1 = shared_ptr(); + shared_ptr res = registry.lookup(key1); + assert(res); + assert(res == ptr2); + assert(*res == 500); + } +} + class SharedPtrRegistry_destructor : public ::testing::Test { public: From 148023d3c634611e7f75e2ca9fd0f7047a2364cf Mon Sep 17 00:00:00 2001 From: Ray Lv Date: Tue, 29 Oct 2013 19:34:51 +0800 Subject: [PATCH 064/150] [rgw] Set initialized to true after populating table in hex_to_num() Reviewed-by: Yehuda Sadeh --- src/rgw/rgw_common.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/rgw/rgw_common.cc b/src/rgw/rgw_common.cc index cb87c18b93d71..e989fa3242cdc 100644 --- a/src/rgw/rgw_common.cc +++ b/src/rgw/rgw_common.cc @@ -663,6 +663,8 @@ static char hex_to_num(char c) table[i] = i - 'A' + 0xa; for (i = 'a'; i<='f'; i++) table[i] = i - 'a' + 0xa; + + initialized = true; } return table[(int)c]; } From 588ed60a8ec1d8db5e096fd8f7b762f2afcf7dd3 Mon Sep 17 00:00:00 2001 From: Ray Lv Date: Wed, 30 Oct 2013 11:40:54 +0800 Subject: [PATCH 065/150] Wrap hex_to_num table into class HexTable Reviewed-by: Yehuda Sadeh --- src/rgw/rgw_common.cc | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/rgw/rgw_common.cc b/src/rgw/rgw_common.cc index e989fa3242cdc..317dd8829e554 100644 --- a/src/rgw/rgw_common.cc +++ b/src/rgw/rgw_common.cc @@ -648,13 +648,12 @@ bool verify_object_permission(struct req_state *s, int perm) return verify_object_permission(s, s->bucket_acl, s->object_acl, perm); } -static char hex_to_num(char c) +class HexTable { - static char table[256]; - static bool initialized = false; - + char table[256]; - if (!initialized) { +public: + HexTable() { memset(table, -1, sizeof(table)); int i; for (i = '0'; i<='9'; i++) @@ -663,10 +662,17 @@ static char hex_to_num(char c) table[i] = i - 'A' + 0xa; for (i = 'a'; i<='f'; i++) table[i] = i - 'a' + 0xa; + } - initialized = true; + char to_num(char c) { + return table[(int)c]; } - return table[(int)c]; +}; + +static char hex_to_num(char c) +{ + static HexTable hex_table; + return hex_table.to_num(c); } bool url_decode(string& src_str, string& dest_str) From df3af6c05e9e199ab2b5a7abf694f2592440311a Mon Sep 17 00:00:00 2001 From: Wido den Hollander Date: Thu, 31 Oct 2013 12:42:27 +0100 Subject: [PATCH 066/150] docs: Fix a typo in RGW documentation --- ceph-object-corpus | 2 +- doc/radosgw/config-ref.rst | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ceph-object-corpus b/ceph-object-corpus index 84a153afa71c4..0655429f62bc3 160000 --- a/ceph-object-corpus +++ b/ceph-object-corpus @@ -1 +1 @@ -Subproject commit 84a153afa71c4468c7a3d78270af6415d0a1c3e7 +Subproject commit 0655429f62bc3366250496da3513abec15c34856 diff --git a/doc/radosgw/config-ref.rst b/doc/radosgw/config-ref.rst index ea650f0683abd..ce8c0a9114c42 100644 --- a/doc/radosgw/config-ref.rst +++ b/doc/radosgw/config-ref.rst @@ -511,7 +511,7 @@ Get a Zone To get the configuration of a zone, execute:: - sudo radosgw-admin zone [--rgw-zone=] + sudo radosgw-admin zone get [--rgw-zone=] The ``default`` zone looks like this: @@ -935,4 +935,4 @@ Keystone Settings .. _Architecture: ../../architecture#data-striping .. _Pool Configuration: ../../rados/configuration/pool-pg-config-ref/ -.. _Cluster Pools: ../../rados/operations/pools \ No newline at end of file +.. _Cluster Pools: ../../rados/operations/pools From f2622a4a127ead3b72069919fb6d723c33b58b6e Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 31 Oct 2013 08:12:24 -0700 Subject: [PATCH 067/150] ceph-object-corpus: revert accidental revert from 5df3024d7847950672169069b9dc8c8dcb876019 Signed-off-by: Sage Weil --- ceph-object-corpus | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ceph-object-corpus b/ceph-object-corpus index 0655429f62bc3..84a153afa71c4 160000 --- a/ceph-object-corpus +++ b/ceph-object-corpus @@ -1 +1 @@ -Subproject commit 0655429f62bc3366250496da3513abec15c34856 +Subproject commit 84a153afa71c4468c7a3d78270af6415d0a1c3e7 From 524aee6f95f9c397b7c8508934f3c0577f9df1dd Mon Sep 17 00:00:00 2001 From: David Moreau Simard Date: Fri, 1 Nov 2013 16:42:33 -0400 Subject: [PATCH 068/150] Really use the hostname, otherwise ambiguous "hostname" can return either the hostname or the fqdn depending on configuration. This refers to the issue http://tracker.ceph.com/issues/6706 Signed-off-by: David Moreau Simard Reviewed-by: Sage Weil --- src/init-radosgw | 2 +- src/init-radosgw.sysv | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/init-radosgw b/src/init-radosgw index 1468c4bcdfd90..ad8bcd12835b5 100644 --- a/src/init-radosgw +++ b/src/init-radosgw @@ -40,7 +40,7 @@ case "$1" in # mapped to this host? host=`ceph-conf -n $name host` - if [ "$host" != `hostname` ]; then + if [ "$host" != `hostname -s` ]; then continue fi diff --git a/src/init-radosgw.sysv b/src/init-radosgw.sysv index cba99aff18f34..43b321bd88ee9 100644 --- a/src/init-radosgw.sysv +++ b/src/init-radosgw.sysv @@ -43,7 +43,7 @@ case "$1" in # mapped to this host? host=`ceph-conf -n $name host` - if [ "$host" != `hostname` ]; then + if [ "$host" != `hostname -s` ]; then continue fi From b3b16501214bd830cf349efaf2f022553c5882d9 Mon Sep 17 00:00:00 2001 From: Christophe Courtaut Date: Thu, 31 Oct 2013 17:07:56 +0100 Subject: [PATCH 069/150] ceph: Fix compilation with GCC compiler Signed-off-by: Christophe Courtaut --- src/include/cephfs/libcephfs.h | 190 ++++++++++++++++---------------- src/libcephfs.cc | 194 ++++++++++++++++----------------- 2 files changed, 192 insertions(+), 192 deletions(-) diff --git a/src/include/cephfs/libcephfs.h b/src/include/cephfs/libcephfs.h index 2f69ba7a3b91a..f2ab2ae61e181 100644 --- a/src/include/cephfs/libcephfs.h +++ b/src/include/cephfs/libcephfs.h @@ -38,7 +38,7 @@ extern "C" { # error libceph: must define __USE_FILE_OFFSET64 or readdir results will be corrupted #endif -class ceph_mount_info; +struct ceph_mount_info; struct ceph_dir_result; class CephContext; @@ -82,7 +82,7 @@ const char *ceph_version(int *major, int *minor, int *patch); * pass in NULL, and the id will be the process id of the client. * @returns 0 on success, negative error code on failure */ -int ceph_create(class ceph_mount_info **cmount, const char * const id); +int ceph_create(struct ceph_mount_info **cmount, const char * const id); /** * Create a mount handle from a CephContext, which holds the configuration @@ -94,7 +94,7 @@ int ceph_create(class ceph_mount_info **cmount, const char * const id); * @param conf reuse this pre-existing CephContext config * @returns 0 on success, negative error code on failure */ -int ceph_create_with_context(class ceph_mount_info **cmount, class CephContext *conf); +int ceph_create_with_context(struct ceph_mount_info **cmount, class CephContext *conf); /** * Perform a mount using the path for the root of the mount. @@ -105,7 +105,7 @@ int ceph_create_with_context(class ceph_mount_info **cmount, class CephContext * * be "/". Passing in NULL is equivalent to "/". * @returns 0 on success, negative error code on failure */ -int ceph_mount(class ceph_mount_info *cmount, const char *root); +int ceph_mount(struct ceph_mount_info *cmount, const char *root); /** * Unmount a mount handle. @@ -113,7 +113,7 @@ int ceph_mount(class ceph_mount_info *cmount, const char *root); * @param cmount the mount handle * @return 0 on success, negative error code on failure */ -int ceph_unmount(class ceph_mount_info *cmount); +int ceph_unmount(struct ceph_mount_info *cmount); /** * Destroy the mount handle. @@ -124,7 +124,7 @@ int ceph_unmount(class ceph_mount_info *cmount); * @param cmount the mount handle * @return 0 on success, negative error code on failure. */ -int ceph_release(class ceph_mount_info *cmount); +int ceph_release(struct ceph_mount_info *cmount); /** * Deprecated. Unmount and destroy the ceph mount handle. This should be @@ -134,7 +134,7 @@ int ceph_release(class ceph_mount_info *cmount); * * @param cmount the mount handle to shutdown */ -void ceph_shutdown(class ceph_mount_info *cmount); +void ceph_shutdown(struct ceph_mount_info *cmount); /** * Extract the CephContext from the mount point handle. @@ -142,14 +142,14 @@ void ceph_shutdown(class ceph_mount_info *cmount); * @param cmount the ceph mount handle to get the context from. * @returns the CephContext associated with the mount handle. */ -class CephContext *ceph_get_mount_context(class ceph_mount_info *cmount); +class CephContext *ceph_get_mount_context(struct ceph_mount_info *cmount); /* * Check mount status. * * Return non-zero value if mounted. Otherwise, zero. */ -int ceph_is_mounted(class ceph_mount_info *cmount); +int ceph_is_mounted(struct ceph_mount_info *cmount); /** @} init */ @@ -167,7 +167,7 @@ int ceph_is_mounted(class ceph_mount_info *cmount); * @param path_list the configuration file path * @returns 0 on success, negative error code on failure */ -int ceph_conf_read_file(class ceph_mount_info *cmount, const char *path_list); +int ceph_conf_read_file(struct ceph_mount_info *cmount, const char *path_list); /** * Parse the command line arguments and load the configuration parameters. @@ -177,7 +177,7 @@ int ceph_conf_read_file(class ceph_mount_info *cmount, const char *path_list); * @param argv the argument list * @returns 0 on success, negative error code on failure */ -int ceph_conf_parse_argv(class ceph_mount_info *cmount, int argc, const char **argv); +int ceph_conf_parse_argv(struct ceph_mount_info *cmount, int argc, const char **argv); /** * Configure the cluster handle based on an environment variable @@ -194,7 +194,7 @@ int ceph_conf_parse_argv(class ceph_mount_info *cmount, int argc, const char **a * @param var name of the environment variable to read * @returns 0 on success, negative error code on failure */ -int ceph_conf_parse_env(class ceph_mount_info *cmount, const char *var); +int ceph_conf_parse_env(struct ceph_mount_info *cmount, const char *var); /** Sets a configuration value from a string. * @@ -204,7 +204,7 @@ int ceph_conf_parse_env(class ceph_mount_info *cmount, const char *var); * * @returns 0 on success, negative error code otherwise. */ -int ceph_conf_set(class ceph_mount_info *cmount, const char *option, const char *value); +int ceph_conf_set(struct ceph_mount_info *cmount, const char *option, const char *value); /** * Gets the configuration value as a string. @@ -215,7 +215,7 @@ int ceph_conf_set(class ceph_mount_info *cmount, const char *option, const char * @param len the length of the buffer. * @returns the size of the buffer filled in with the value, or negative error code on failure */ -int ceph_conf_get(class ceph_mount_info *cmount, const char *option, char *buf, size_t len); +int ceph_conf_get(struct ceph_mount_info *cmount, const char *option, char *buf, size_t len); /** @} config */ @@ -236,7 +236,7 @@ int ceph_conf_get(class ceph_mount_info *cmount, const char *option, char *buf, * @param stbuf the file system statistics filled in by this function. * @return 0 on success, negative error code otherwise. */ -int ceph_statfs(class ceph_mount_info *cmount, const char *path, struct statvfs *stbuf); +int ceph_statfs(struct ceph_mount_info *cmount, const char *path, struct statvfs *stbuf); /** * Synchronize all filesystem data to persistent media. @@ -244,7 +244,7 @@ int ceph_statfs(class ceph_mount_info *cmount, const char *path, struct statvfs * @param cmount the ceph mount handle to use for performing the sync_fs. * @returns 0 on success or negative error code on failure. */ -int ceph_sync_fs(class ceph_mount_info *cmount); +int ceph_sync_fs(struct ceph_mount_info *cmount); /** * Get the current working directory. @@ -252,7 +252,7 @@ int ceph_sync_fs(class ceph_mount_info *cmount); * @param cmount the ceph mount to get the current working directory for. * @returns the path to the current working directory */ -const char* ceph_getcwd(class ceph_mount_info *cmount); +const char* ceph_getcwd(struct ceph_mount_info *cmount); /** * Change the current working directory. @@ -261,7 +261,7 @@ const char* ceph_getcwd(class ceph_mount_info *cmount); * @param path the path to the working directory to change into. * @returns 0 on success, negative error code otherwise. */ -int ceph_chdir(class ceph_mount_info *cmount, const char *s); +int ceph_chdir(struct ceph_mount_info *cmount, const char *s); /** @} fsops */ @@ -281,7 +281,7 @@ int ceph_chdir(class ceph_mount_info *cmount, const char *s); * @param dirpp the directory result pointer structure to fill in. * @returns 0 on success or negative error code otherwise. */ -int ceph_opendir(class ceph_mount_info *cmount, const char *name, struct ceph_dir_result **dirpp); +int ceph_opendir(struct ceph_mount_info *cmount, const char *name, struct ceph_dir_result **dirpp); /** * Close the open directory. @@ -290,7 +290,7 @@ int ceph_opendir(class ceph_mount_info *cmount, const char *name, struct ceph_di * @param dirp the directory result pointer (set by ceph_opendir) to close * @returns 0 on success or negative error code on failure. */ -int ceph_closedir(class ceph_mount_info *cmount, struct ceph_dir_result *dirp); +int ceph_closedir(struct ceph_mount_info *cmount, struct ceph_dir_result *dirp); /** * Get the next entry in an open directory. @@ -302,7 +302,7 @@ int ceph_closedir(class ceph_mount_info *cmount, struct ceph_dir_result *dirp); * is empty. This pointer should not be freed by the caller, and is only safe to * access between return and the next call to ceph_readdir or ceph_closedir. */ -struct dirent * ceph_readdir(class ceph_mount_info *cmount, struct ceph_dir_result *dirp); +struct dirent * ceph_readdir(struct ceph_mount_info *cmount, struct ceph_dir_result *dirp); /** * A safe version of ceph_readdir, where the directory entry struct is allocated by the caller. @@ -314,7 +314,7 @@ struct dirent * ceph_readdir(class ceph_mount_info *cmount, struct ceph_dir_resu * @returns 1 if the next entry was filled in, 0 if the end of the directory stream was reached, * and a negative error code on failure. */ -int ceph_readdir_r(class ceph_mount_info *cmount, struct ceph_dir_result *dirp, struct dirent *de); +int ceph_readdir_r(struct ceph_mount_info *cmount, struct ceph_dir_result *dirp, struct dirent *de); /** * A safe version of ceph_readdir that also returns the file statistics (readdir+stat). @@ -328,7 +328,7 @@ int ceph_readdir_r(class ceph_mount_info *cmount, struct ceph_dir_result *dirp, * @returns 1 if the next entry was filled in, 0 if the end of the directory stream was reached, * and a negative error code on failure. */ -int ceph_readdirplus_r(class ceph_mount_info *cmount, struct ceph_dir_result *dirp, struct dirent *de, +int ceph_readdirplus_r(struct ceph_mount_info *cmount, struct ceph_dir_result *dirp, struct dirent *de, struct stat *st, int *stmask); /** @@ -342,7 +342,7 @@ int ceph_readdirplus_r(class ceph_mount_info *cmount, struct ceph_dir_result *di * @returns the length of the buffer that was filled in, will always be multiples of sizeof(struct dirent), or a * negative error code. If the buffer is not large enough for a single entry, -ERANGE is returned. */ -int ceph_getdents(class ceph_mount_info *cmount, struct ceph_dir_result *dirp, char *name, int buflen); +int ceph_getdents(struct ceph_mount_info *cmount, struct ceph_dir_result *dirp, char *name, int buflen); /** * Gets multiple directory names. @@ -355,7 +355,7 @@ int ceph_getdents(class ceph_mount_info *cmount, struct ceph_dir_result *dirp, c * @returns the length of the buffer filled in with entry names, or a negative error code on failure. * If the buffer isn't large enough for a single entry, -ERANGE is returned. */ -int ceph_getdnames(class ceph_mount_info *cmount, struct ceph_dir_result *dirp, char *name, int buflen); +int ceph_getdnames(struct ceph_mount_info *cmount, struct ceph_dir_result *dirp, char *name, int buflen); /** * Rewind the directory stream to the beginning of the directory. @@ -363,7 +363,7 @@ int ceph_getdnames(class ceph_mount_info *cmount, struct ceph_dir_result *dirp, * @param cmount the ceph mount handle to use for performing the rewinddir. * @param dirp the directory stream pointer to rewind. */ -void ceph_rewinddir(class ceph_mount_info *cmount, struct ceph_dir_result *dirp); +void ceph_rewinddir(struct ceph_mount_info *cmount, struct ceph_dir_result *dirp); /** * Get the current position of a directory stream. @@ -374,7 +374,7 @@ void ceph_rewinddir(class ceph_mount_info *cmount, struct ceph_dir_result *dirp) * by ceph_telldir do not have a particular order (cannot be compared with * inequality). */ -loff_t ceph_telldir(class ceph_mount_info *cmount, struct ceph_dir_result *dirp); +loff_t ceph_telldir(struct ceph_mount_info *cmount, struct ceph_dir_result *dirp); /** * Move the directory stream to a position specified by the given offset. @@ -385,7 +385,7 @@ loff_t ceph_telldir(class ceph_mount_info *cmount, struct ceph_dir_result *dirp) * a value returned by seekdir. Note that this value does not refer to the nth * entry in a directory, and can not be manipulated with plus or minus. */ -void ceph_seekdir(class ceph_mount_info *cmount, struct ceph_dir_result *dirp, loff_t offset); +void ceph_seekdir(struct ceph_mount_info *cmount, struct ceph_dir_result *dirp, loff_t offset); /** * Create a directory. @@ -396,7 +396,7 @@ void ceph_seekdir(class ceph_mount_info *cmount, struct ceph_dir_result *dirp, l * @param mode the permissions the directory should have once created. * @returns 0 on success or a negative return code on error. */ -int ceph_mkdir(class ceph_mount_info *cmount, const char *path, mode_t mode); +int ceph_mkdir(struct ceph_mount_info *cmount, const char *path, mode_t mode); /** * Create multiple directories at once. @@ -407,7 +407,7 @@ int ceph_mkdir(class ceph_mount_info *cmount, const char *path, mode_t mode); * @param mode the permissions the directory should have once created. * @returns 0 on success or a negative return code on error. */ -int ceph_mkdirs(class ceph_mount_info *cmount, const char *path, mode_t mode); +int ceph_mkdirs(struct ceph_mount_info *cmount, const char *path, mode_t mode); /** * Remove a directory. @@ -416,7 +416,7 @@ int ceph_mkdirs(class ceph_mount_info *cmount, const char *path, mode_t mode); * @param path the path of the directory to remove. * @returns 0 on success or a negative return code on error. */ -int ceph_rmdir(class ceph_mount_info *cmount, const char *path); +int ceph_rmdir(struct ceph_mount_info *cmount, const char *path); /** @} dir */ @@ -435,7 +435,7 @@ int ceph_rmdir(class ceph_mount_info *cmount, const char *path); * @param newname the path to the new file/directory to link from. * @returns 0 on success or a negative return code on error. */ -int ceph_link(class ceph_mount_info *cmount, const char *existing, const char *newname); +int ceph_link(struct ceph_mount_info *cmount, const char *existing, const char *newname); /** * Read a symbolic link. @@ -446,7 +446,7 @@ int ceph_link(class ceph_mount_info *cmount, const char *existing, const char *n * @param size the length of the buffer * @returns 0 on success or negative error code on failure */ -int ceph_readlink(class ceph_mount_info *cmount, const char *path, char *buf, loff_t size); +int ceph_readlink(struct ceph_mount_info *cmount, const char *path, char *buf, loff_t size); /** * Creates a symbolic link. @@ -456,7 +456,7 @@ int ceph_readlink(class ceph_mount_info *cmount, const char *path, char *buf, lo * @param newname the path to the new file/directory to link from. * @returns 0 on success or a negative return code on failure. */ -int ceph_symlink(class ceph_mount_info *cmount, const char *existing, const char *newname); +int ceph_symlink(struct ceph_mount_info *cmount, const char *existing, const char *newname); /** @} links */ @@ -475,7 +475,7 @@ int ceph_symlink(class ceph_mount_info *cmount, const char *existing, const char * @param path the path of the file or link to unlink. * @returns 0 on success or negative error code on failure. */ -int ceph_unlink(class ceph_mount_info *cmount, const char *path); +int ceph_unlink(struct ceph_mount_info *cmount, const char *path); /** * Rename a file or directory. @@ -485,7 +485,7 @@ int ceph_unlink(class ceph_mount_info *cmount, const char *path); * @param to the new name of the file or directory * @returns 0 on success or negative error code on failure. */ -int ceph_rename(class ceph_mount_info *cmount, const char *from, const char *to); +int ceph_rename(struct ceph_mount_info *cmount, const char *from, const char *to); /** * Get a file's statistics and attributes. @@ -495,7 +495,7 @@ int ceph_rename(class ceph_mount_info *cmount, const char *from, const char *to) * @param stbuf the stat struct that will be filled in with the file's statistics. * @returns 0 on success or negative error code on failure. */ -int ceph_stat(class ceph_mount_info *cmount, const char *path, struct stat *stbuf); +int ceph_stat(struct ceph_mount_info *cmount, const char *path, struct stat *stbuf); /** * Get a file's statistics and attributes, without following symlinks. @@ -505,7 +505,7 @@ int ceph_stat(class ceph_mount_info *cmount, const char *path, struct stat *stbu * @param stbuf the stat struct that will be filled in with the file's statistics. * @returns 0 on success or negative error code on failure. */ -int ceph_lstat(class ceph_mount_info *cmount, const char *path, struct stat *stbuf); +int ceph_lstat(struct ceph_mount_info *cmount, const char *path, struct stat *stbuf); /** * Set a file's attributes. @@ -516,7 +516,7 @@ int ceph_lstat(class ceph_mount_info *cmount, const char *path, struct stat *stb * @param mask a mask of all the stat values that have been set on the stat struct. * @returns 0 on success or negative error code on failure. */ -int ceph_setattr(class ceph_mount_info *cmount, const char *relpath, struct stat *attr, int mask); +int ceph_setattr(struct ceph_mount_info *cmount, const char *relpath, struct stat *attr, int mask); /** * Change the mode bits (permissions) of a file/directory. @@ -526,7 +526,7 @@ int ceph_setattr(class ceph_mount_info *cmount, const char *relpath, struct stat * @param mode the new permissions to set. * @returns 0 on success or a negative error code on failure. */ -int ceph_chmod(class ceph_mount_info *cmount, const char *path, mode_t mode); +int ceph_chmod(struct ceph_mount_info *cmount, const char *path, mode_t mode); /** * Change the mode bits (permissions) of an open file. @@ -536,7 +536,7 @@ int ceph_chmod(class ceph_mount_info *cmount, const char *path, mode_t mode); * @param mode the new permissions to set. * @returns 0 on success or a negative error code on failure. */ -int ceph_fchmod(class ceph_mount_info *cmount, int fd, mode_t mode); +int ceph_fchmod(struct ceph_mount_info *cmount, int fd, mode_t mode); /** * Change the ownership of a file/directory. @@ -547,7 +547,7 @@ int ceph_fchmod(class ceph_mount_info *cmount, int fd, mode_t mode); * @param gid the group id to set on the file/directory. * @returns 0 on success or negative error code on failure. */ -int ceph_chown(class ceph_mount_info *cmount, const char *path, int uid, int gid); +int ceph_chown(struct ceph_mount_info *cmount, const char *path, int uid, int gid); /** * Change the ownership of a file from an open file descriptor. @@ -558,7 +558,7 @@ int ceph_chown(class ceph_mount_info *cmount, const char *path, int uid, int gid * @param gid the group id to set on the file/directory. * @returns 0 on success or negative error code on failure. */ -int ceph_fchown(class ceph_mount_info *cmount, int fd, int uid, int gid); +int ceph_fchown(struct ceph_mount_info *cmount, int fd, int uid, int gid); /** * Change the ownership of a file/directory, don't follow symlinks. @@ -569,7 +569,7 @@ int ceph_fchown(class ceph_mount_info *cmount, int fd, int uid, int gid); * @param gid the group id to set on the file/directory. * @returns 0 on success or negative error code on failure. */ -int ceph_lchown(class ceph_mount_info *cmount, const char *path, int uid, int gid); +int ceph_lchown(struct ceph_mount_info *cmount, const char *path, int uid, int gid); /** * Change file/directory last access and modification times. @@ -579,7 +579,7 @@ int ceph_lchown(class ceph_mount_info *cmount, const char *path, int uid, int gi * @param buf holding the access and modification times to set on the file. * @returns 0 on success or negative error code on failure. */ -int ceph_utime(class ceph_mount_info *cmount, const char *path, struct utimbuf *buf); +int ceph_utime(struct ceph_mount_info *cmount, const char *path, struct utimbuf *buf); /** * Truncate the file to the given size. If this operation causes the @@ -590,7 +590,7 @@ int ceph_utime(class ceph_mount_info *cmount, const char *path, struct utimbuf * * @param size the new size of the file. * @returns 0 on success or a negative error code on failure. */ -int ceph_truncate(class ceph_mount_info *cmount, const char *path, loff_t size); +int ceph_truncate(struct ceph_mount_info *cmount, const char *path, loff_t size); /** * Make a block or character special file. @@ -604,7 +604,7 @@ int ceph_truncate(class ceph_mount_info *cmount, const char *path, loff_t size); * it is ignored. * @returns 0 on success or negative error code on failure. */ -int ceph_mknod(class ceph_mount_info *cmount, const char *path, mode_t mode, dev_t rdev); +int ceph_mknod(struct ceph_mount_info *cmount, const char *path, mode_t mode, dev_t rdev); /** * Create and/or open a file. * @@ -616,7 +616,7 @@ int ceph_mknod(class ceph_mount_info *cmount, const char *path, mode_t mode, dev * is specified in the flags. * @returns a non-negative file descriptor number on success or a negative error code on failure. */ -int ceph_open(class ceph_mount_info *cmount, const char *path, int flags, mode_t mode); +int ceph_open(struct ceph_mount_info *cmount, const char *path, int flags, mode_t mode); /** * Create and/or open a file with a specific file layout. @@ -633,7 +633,7 @@ int ceph_open(class ceph_mount_info *cmount, const char *path, int flags, mode_t * @param data_pool name of target data pool name (optional, NULL or empty string for default) * @returns a non-negative file descriptor number on success or a negative error code on failure. */ -int ceph_open_layout(class ceph_mount_info *cmount, const char *path, int flags, +int ceph_open_layout(struct ceph_mount_info *cmount, const char *path, int flags, mode_t mode, int stripe_unit, int stripe_count, int object_size, const char *data_pool); @@ -644,7 +644,7 @@ int ceph_open_layout(class ceph_mount_info *cmount, const char *path, int flags, * @param fd the file descriptor referring to the open file. * @returns 0 on success or a negative error code on failure. */ -int ceph_close(class ceph_mount_info *cmount, int fd); +int ceph_close(struct ceph_mount_info *cmount, int fd); /** * Reposition the open file stream based on the given offset. @@ -659,7 +659,7 @@ int ceph_close(class ceph_mount_info *cmount, int fd); * SEEK_END: the offset is set to the end of the file plus @ref offset bytes. * @returns 0 on success or a negative error code on failure. */ -loff_t ceph_lseek(class ceph_mount_info *cmount, int fd, loff_t offset, int whence); +loff_t ceph_lseek(struct ceph_mount_info *cmount, int fd, loff_t offset, int whence); /** * Read data from the file. * @@ -671,7 +671,7 @@ loff_t ceph_lseek(class ceph_mount_info *cmount, int fd, loff_t offset, int when * function reads from the current offset of the file descriptor. * @returns the number of bytes read into buf, or a negative error code on failure. */ -int ceph_read(class ceph_mount_info *cmount, int fd, char *buf, loff_t size, loff_t offset); +int ceph_read(struct ceph_mount_info *cmount, int fd, char *buf, loff_t size, loff_t offset); /** * Write data to a file. @@ -684,7 +684,7 @@ int ceph_read(class ceph_mount_info *cmount, int fd, char *buf, loff_t size, lof * function writes to the current offset of the file descriptor. * @returns the number of bytes written, or a negative error code */ -int ceph_write(class ceph_mount_info *cmount, int fd, const char *buf, loff_t size, +int ceph_write(struct ceph_mount_info *cmount, int fd, const char *buf, loff_t size, loff_t offset); /** @@ -695,7 +695,7 @@ int ceph_write(class ceph_mount_info *cmount, int fd, const char *buf, loff_t si * @param size the new size of the file * @returns 0 on success or a negative error code on failure. */ -int ceph_ftruncate(class ceph_mount_info *cmount, int fd, loff_t size); +int ceph_ftruncate(struct ceph_mount_info *cmount, int fd, loff_t size); /** * Synchronize an open file to persistent media. @@ -706,7 +706,7 @@ int ceph_ftruncate(class ceph_mount_info *cmount, int fd, loff_t size); * or just data (1). * @return 0 on success or a negative error code on failure. */ -int ceph_fsync(class ceph_mount_info *cmount, int fd, int syncdataonly); +int ceph_fsync(struct ceph_mount_info *cmount, int fd, int syncdataonly); /** * Preallocate or release disk space for the file for the byte range. @@ -735,7 +735,7 @@ int ceph_fallocate(struct ceph_mount_info *cmount, int fd, int mode, * function. * @returns 0 on success or a negative error code on failure */ -int ceph_fstat(class ceph_mount_info *cmount, int fd, struct stat *stbuf); +int ceph_fstat(struct ceph_mount_info *cmount, int fd, struct stat *stbuf); /** @} file */ @@ -756,7 +756,7 @@ int ceph_fstat(class ceph_mount_info *cmount, int fd, struct stat *stbuf); * @param size the size of the pre-allocated buffer * @returns the size of the value or a negative error code on failure. */ -int ceph_getxattr(class ceph_mount_info *cmount, const char *path, const char *name, +int ceph_getxattr(struct ceph_mount_info *cmount, const char *path, const char *name, void *value, size_t size); /** @@ -772,7 +772,7 @@ int ceph_getxattr(class ceph_mount_info *cmount, const char *path, const char *n * @param size the size of the pre-allocated buffer * @returns the size of the value or a negative error code on failure. */ -int ceph_lgetxattr(class ceph_mount_info *cmount, const char *path, const char *name, +int ceph_lgetxattr(struct ceph_mount_info *cmount, const char *path, const char *name, void *value, size_t size); /** @@ -784,7 +784,7 @@ int ceph_lgetxattr(class ceph_mount_info *cmount, const char *path, const char * * @param size the size of the list buffer. * @returns the size of the resulting list filled in. */ -int ceph_listxattr(class ceph_mount_info *cmount, const char *path, char *list, size_t size); +int ceph_listxattr(struct ceph_mount_info *cmount, const char *path, char *list, size_t size); /** * Get the list of extended attribute keys on a file, but do not follow symbolic links. @@ -795,7 +795,7 @@ int ceph_listxattr(class ceph_mount_info *cmount, const char *path, char *list, * @param size the size of the list buffer. * @returns the size of the resulting list filled in. */ -int ceph_llistxattr(class ceph_mount_info *cmount, const char *path, char *list, size_t size); +int ceph_llistxattr(struct ceph_mount_info *cmount, const char *path, char *list, size_t size); /** * Remove an extended attribute from a file. @@ -805,7 +805,7 @@ int ceph_llistxattr(class ceph_mount_info *cmount, const char *path, char *list, * @param name the name of the extended attribute to remove. * @returns 0 on success or a negative error code on failure. */ -int ceph_removexattr(class ceph_mount_info *cmount, const char *path, const char *name); +int ceph_removexattr(struct ceph_mount_info *cmount, const char *path, const char *name); /** * Remove the extended attribute from a file, do not follow symbolic links. @@ -815,7 +815,7 @@ int ceph_removexattr(class ceph_mount_info *cmount, const char *path, const char * @param name the name of the extended attribute to remove. * @returns 0 on success or a negative error code on failure. */ -int ceph_lremovexattr(class ceph_mount_info *cmount, const char *path, const char *name); +int ceph_lremovexattr(struct ceph_mount_info *cmount, const char *path, const char *name); /** * Set an extended attribute on a file. @@ -830,7 +830,7 @@ int ceph_lremovexattr(class ceph_mount_info *cmount, const char *path, const cha * CEPH_XATTR_REPLACE: replace the extended attribute, Must already exist. * @returns 0 on success or a negative error code on failure. */ -int ceph_setxattr(class ceph_mount_info *cmount, const char *path, const char *name, +int ceph_setxattr(struct ceph_mount_info *cmount, const char *path, const char *name, const void *value, size_t size, int flags); /** @@ -846,7 +846,7 @@ int ceph_setxattr(class ceph_mount_info *cmount, const char *path, const char *n * CEPH_XATTR_REPLACE: replace the extended attribute, Must already exist. * @returns 0 on success or a negative error code on failure. */ -int ceph_lsetxattr(class ceph_mount_info *cmount, const char *path, const char *name, +int ceph_lsetxattr(struct ceph_mount_info *cmount, const char *path, const char *name, const void *value, size_t size, int flags); /** @} xattr */ @@ -865,7 +865,7 @@ int ceph_lsetxattr(class ceph_mount_info *cmount, const char *path, const char * * @param fh the open file descriptor referring to the file to get the striping unit of. * @returns the striping unit of the file or a negative error code on failure. */ -int ceph_get_file_stripe_unit(class ceph_mount_info *cmount, int fh); +int ceph_get_file_stripe_unit(struct ceph_mount_info *cmount, int fh); /** * Get the file striping unit. @@ -874,7 +874,7 @@ int ceph_get_file_stripe_unit(class ceph_mount_info *cmount, int fh); * @param path the path of the file/directory get the striping unit of. * @returns the striping unit of the file or a negative error code on failure. */ -int ceph_get_path_stripe_unit(class ceph_mount_info *cmount, const char *path); +int ceph_get_path_stripe_unit(struct ceph_mount_info *cmount, const char *path); /** * Get the file striping count from an open file descriptor. @@ -883,7 +883,7 @@ int ceph_get_path_stripe_unit(class ceph_mount_info *cmount, const char *path); * @param fh the open file descriptor referring to the file to get the striping count of. * @returns the striping count of the file or a negative error code on failure. */ -int ceph_get_file_stripe_count(class ceph_mount_info *cmount, int fh); +int ceph_get_file_stripe_count(struct ceph_mount_info *cmount, int fh); /** * Get the file striping count. @@ -892,7 +892,7 @@ int ceph_get_file_stripe_count(class ceph_mount_info *cmount, int fh); * @param path the path of the file/directory get the striping count of. * @returns the striping count of the file or a negative error code on failure. */ -int ceph_get_path_stripe_count(class ceph_mount_info *cmount, const char *path); +int ceph_get_path_stripe_count(struct ceph_mount_info *cmount, const char *path); /** * Get the file object size from an open file descriptor. @@ -901,7 +901,7 @@ int ceph_get_path_stripe_count(class ceph_mount_info *cmount, const char *path); * @param fh the open file descriptor referring to the file to get the object size of. * @returns the object size of the file or a negative error code on failure. */ -int ceph_get_file_object_size(class ceph_mount_info *cmount, int fh); +int ceph_get_file_object_size(struct ceph_mount_info *cmount, int fh); /** * Get the file object size. @@ -910,7 +910,7 @@ int ceph_get_file_object_size(class ceph_mount_info *cmount, int fh); * @param path the path of the file/directory get the object size of. * @returns the object size of the file or a negative error code on failure. */ -int ceph_get_path_object_size(class ceph_mount_info *cmount, const char *path); +int ceph_get_path_object_size(struct ceph_mount_info *cmount, const char *path); /** * Get the file pool information from an open file descriptor. @@ -919,7 +919,7 @@ int ceph_get_path_object_size(class ceph_mount_info *cmount, const char *path); * @param fh the open file descriptor referring to the file to get the pool information of. * @returns the ceph pool id that the file is in */ -int ceph_get_file_pool(class ceph_mount_info *cmount, int fh); +int ceph_get_file_pool(struct ceph_mount_info *cmount, int fh); /** * Get the file pool information. @@ -928,7 +928,7 @@ int ceph_get_file_pool(class ceph_mount_info *cmount, int fh); * @param path the path of the file/directory get the pool information of. * @returns the ceph pool id that the file is in */ -int ceph_get_path_pool(class ceph_mount_info *cmount, const char *path); +int ceph_get_path_pool(struct ceph_mount_info *cmount, const char *path); /** * Get the name of the pool a opened file is stored in, @@ -942,7 +942,7 @@ int ceph_get_path_pool(class ceph_mount_info *cmount, const char *path); * @param buflen size of the buffer * @returns length in bytes of the pool name, or -ERANGE if the buffer is not large enough. */ -int ceph_get_file_pool_name(class ceph_mount_info *cmount, int fh, char *buf, size_t buflen); +int ceph_get_file_pool_name(struct ceph_mount_info *cmount, int fh, char *buf, size_t buflen); /** * get the name of a pool by id @@ -955,7 +955,7 @@ int ceph_get_file_pool_name(class ceph_mount_info *cmount, int fh, char *buf, si * @param buflen size of the buffer * @returns length in bytes of the pool name, or -ERANGE if the buffer is not large enough */ -int ceph_get_pool_name(class ceph_mount_info *cmount, int pool, char *buf, size_t buflen); +int ceph_get_pool_name(struct ceph_mount_info *cmount, int pool, char *buf, size_t buflen); /** * Get the name of the pool a file is stored in @@ -969,7 +969,7 @@ int ceph_get_pool_name(class ceph_mount_info *cmount, int pool, char *buf, size_ * @param buflen size of the buffer * @returns length in bytes of the pool name, or -ERANGE if the buffer is not large enough. */ -int ceph_get_path_pool_name(class ceph_mount_info *cmount, const char *path, char *buf, size_t buflen); +int ceph_get_path_pool_name(struct ceph_mount_info *cmount, const char *path, char *buf, size_t buflen); /** * Get the file layout from an open file descriptor. @@ -982,7 +982,7 @@ int ceph_get_path_pool_name(class ceph_mount_info *cmount, const char *path, cha * @param pg_pool where to store the ceph pool id that the file is in * @returns 0 on success or a negative error code on failure. */ -int ceph_get_file_layout(class ceph_mount_info *cmount, int fh, int *stripe_unit, int *stripe_count, int *object_size, int *pg_pool); +int ceph_get_file_layout(struct ceph_mount_info *cmount, int fh, int *stripe_unit, int *stripe_count, int *object_size, int *pg_pool); /** * Get the file layout. @@ -995,7 +995,7 @@ int ceph_get_file_layout(class ceph_mount_info *cmount, int fh, int *stripe_unit * @param pg_pool where to store the ceph pool id that the file is in * @returns 0 on success or a negative error code on failure. */ -int ceph_get_path_layout(class ceph_mount_info *cmount, const char *path, int *stripe_unit, int *stripe_count, int *object_size, int *pg_pool); +int ceph_get_path_layout(struct ceph_mount_info *cmount, const char *path, int *stripe_unit, int *stripe_count, int *object_size, int *pg_pool); /** * Get the file replication information from an open file descriptor. @@ -1004,7 +1004,7 @@ int ceph_get_path_layout(class ceph_mount_info *cmount, const char *path, int *s * @param fh the open file descriptor referring to the file to get the replication information of. * @returns the replication factor of the file. */ -int ceph_get_file_replication(class ceph_mount_info *cmount, int fh); +int ceph_get_file_replication(struct ceph_mount_info *cmount, int fh); /** * Get the file replication information. @@ -1013,7 +1013,7 @@ int ceph_get_file_replication(class ceph_mount_info *cmount, int fh); * @param path the path of the file/directory get the replication information of. * @returns the replication factor of the file. */ -int ceph_get_path_replication(class ceph_mount_info *cmount, const char *path); +int ceph_get_path_replication(struct ceph_mount_info *cmount, const char *path); /** * Get the id of the named pool. @@ -1022,7 +1022,7 @@ int ceph_get_path_replication(class ceph_mount_info *cmount, const char *path); * @param pool_name the name of the pool. * @returns the pool id, or a negative error code on failure. */ -int ceph_get_pool_id(class ceph_mount_info *cmount, const char *pool_name); +int ceph_get_pool_id(struct ceph_mount_info *cmount, const char *pool_name); /** * Get the pool replication factor. @@ -1031,7 +1031,7 @@ int ceph_get_pool_id(class ceph_mount_info *cmount, const char *pool_name); * @param pool_id the pool id to look up * @returns the replication factor, or a negative error code on failure. */ -int ceph_get_pool_replication(class ceph_mount_info *cmount, int pool_id); +int ceph_get_pool_replication(struct ceph_mount_info *cmount, int pool_id); /** * Get the OSD address where the primary copy of a file stripe is located. @@ -1045,7 +1045,7 @@ int ceph_get_pool_replication(class ceph_mount_info *cmount, int pool_id); * @returns the size of the addressed filled into the @ref addr parameter, or a negative * error code on failure. */ -int ceph_get_file_stripe_address(class ceph_mount_info *cmount, int fd, loff_t offset, +int ceph_get_file_stripe_address(struct ceph_mount_info *cmount, int fd, loff_t offset, struct sockaddr_storage *addr, int naddr); /** @@ -1061,7 +1061,7 @@ int ceph_get_file_stripe_address(class ceph_mount_info *cmount, int fd, loff_t o * @returns the number of items stored in the output array, or -ERANGE if the * array is not large enough. */ -int ceph_get_file_extent_osds(class ceph_mount_info *cmount, int fh, +int ceph_get_file_extent_osds(struct ceph_mount_info *cmount, int fh, loff_t offset, loff_t *length, int *osds, int nosds); /** @@ -1078,7 +1078,7 @@ int ceph_get_file_extent_osds(class ceph_mount_info *cmount, int fh, * @returns the amount of bytes written into the buffer, or -ERANGE if the * array is not large enough. */ -int ceph_get_osd_crush_location(class ceph_mount_info *cmount, +int ceph_get_osd_crush_location(struct ceph_mount_info *cmount, int osd, char *path, size_t len); /** @@ -1089,7 +1089,7 @@ int ceph_get_osd_crush_location(class ceph_mount_info *cmount, * @param addr the OSD network address. * @returns zero on success, other returns a negative error code. */ -int ceph_get_osd_addr(class ceph_mount_info *cmount, int osd, +int ceph_get_osd_addr(struct ceph_mount_info *cmount, int osd, struct sockaddr_storage *addr); /** @@ -1097,7 +1097,7 @@ int ceph_get_osd_addr(class ceph_mount_info *cmount, int osd, * @param cmount the ceph mount handle. * @returns the stripe unit granularity or a negative error code on failure. */ -int ceph_get_stripe_unit_granularity(class ceph_mount_info *cmount); +int ceph_get_stripe_unit_granularity(struct ceph_mount_info *cmount); /** @} filelayout */ @@ -1105,11 +1105,11 @@ int ceph_get_stripe_unit_granularity(class ceph_mount_info *cmount); * No longer available. Do not use. * These functions will return -EOPNOTSUPP. */ -int ceph_set_default_file_stripe_unit(class ceph_mount_info *cmount, int stripe); -int ceph_set_default_file_stripe_count(class ceph_mount_info *cmount, int count); -int ceph_set_default_object_size(class ceph_mount_info *cmount, int size); -int ceph_set_default_preferred_pg(class ceph_mount_info *cmount, int osd); -int ceph_set_default_file_replication(class ceph_mount_info *cmount, int replication); +int ceph_set_default_file_stripe_unit(struct ceph_mount_info *cmount, int stripe); +int ceph_set_default_file_stripe_count(struct ceph_mount_info *cmount, int count); +int ceph_set_default_object_size(struct ceph_mount_info *cmount, int size); +int ceph_set_default_preferred_pg(struct ceph_mount_info *cmount, int osd); +int ceph_set_default_file_replication(struct ceph_mount_info *cmount, int replication); /** * Read from local replicas when possible. @@ -1119,7 +1119,7 @@ int ceph_set_default_file_replication(class ceph_mount_info *cmount, int replica * for reads. * @returns 0 */ -int ceph_localize_reads(class ceph_mount_info *cmount, int val); +int ceph_localize_reads(struct ceph_mount_info *cmount, int val); /** * Get the osd id of the local osd (if any) @@ -1128,7 +1128,7 @@ int ceph_localize_reads(class ceph_mount_info *cmount, int val); * @returns the osd (if any) local to the node where this call is made, otherwise * -1 is returned. */ -int ceph_get_local_osd(class ceph_mount_info *cmount); +int ceph_get_local_osd(struct ceph_mount_info *cmount); /** @} default_filelayout */ @@ -1140,7 +1140,7 @@ int ceph_get_local_osd(class ceph_mount_info *cmount); * @returns the current capabilities issued to this client * for the open file */ -int ceph_debug_get_fd_caps(class ceph_mount_info *cmount, int fd); +int ceph_debug_get_fd_caps(struct ceph_mount_info *cmount, int fd); /** * Get the capabilities currently issued to the client. @@ -1150,7 +1150,7 @@ int ceph_debug_get_fd_caps(class ceph_mount_info *cmount, int fd); * @returns the current capabilities issued to this client * for the file */ -int ceph_debug_get_file_caps(class ceph_mount_info *cmount, const char *path); +int ceph_debug_get_file_caps(struct ceph_mount_info *cmount, const char *path); #ifdef __cplusplus } diff --git a/src/libcephfs.cc b/src/libcephfs.cc index cdd06f461e6a3..86f9763478122 100644 --- a/src/libcephfs.cc +++ b/src/libcephfs.cc @@ -31,7 +31,7 @@ #include "msg/Messenger.h" #include "include/assert.h" -class ceph_mount_info +struct ceph_mount_info { public: ceph_mount_info(uint64_t msgr_nonce_, CephContext *cct_) @@ -240,7 +240,7 @@ extern "C" const char *ceph_version(int *pmajor, int *pminor, int *ppatch) return VERSION; } -extern "C" int ceph_create_with_context(class ceph_mount_info **cmount, CephContext *cct) +extern "C" int ceph_create_with_context(struct ceph_mount_info **cmount, CephContext *cct) { uint64_t nonce = 0; @@ -249,11 +249,11 @@ extern "C" int ceph_create_with_context(class ceph_mount_info **cmount, CephCont nonce &= ~0xffff; nonce |= (uint64_t)getpid(); - *cmount = new class ceph_mount_info(nonce, cct); + *cmount = new struct ceph_mount_info(nonce, cct); return 0; } -extern "C" int ceph_create(class ceph_mount_info **cmount, const char * const id) +extern "C" int ceph_create(struct ceph_mount_info **cmount, const char * const id) { CephInitParameters iparams(CEPH_ENTITY_TYPE_CLIENT); if (id) { @@ -266,12 +266,12 @@ extern "C" int ceph_create(class ceph_mount_info **cmount, const char * const id return ceph_create_with_context(cmount, cct); } -extern "C" int ceph_unmount(class ceph_mount_info *cmount) +extern "C" int ceph_unmount(struct ceph_mount_info *cmount) { return cmount->unmount(); } -extern "C" int ceph_release(class ceph_mount_info *cmount) +extern "C" int ceph_release(struct ceph_mount_info *cmount) { if (cmount->is_mounted()) return -EISCONN; @@ -279,35 +279,35 @@ extern "C" int ceph_release(class ceph_mount_info *cmount) return 0; } -extern "C" void ceph_shutdown(class ceph_mount_info *cmount) +extern "C" void ceph_shutdown(struct ceph_mount_info *cmount) { cmount->shutdown(); delete cmount; } -extern "C" int ceph_conf_read_file(class ceph_mount_info *cmount, const char *path) +extern "C" int ceph_conf_read_file(struct ceph_mount_info *cmount, const char *path) { return cmount->conf_read_file(path); } -extern "C" int ceph_conf_parse_argv(class ceph_mount_info *cmount, int argc, +extern "C" int ceph_conf_parse_argv(struct ceph_mount_info *cmount, int argc, const char **argv) { return cmount->conf_parse_argv(argc, argv); } -extern "C" int ceph_conf_parse_env(class ceph_mount_info *cmount, const char *name) +extern "C" int ceph_conf_parse_env(struct ceph_mount_info *cmount, const char *name) { return cmount->conf_parse_env(name); } -extern "C" int ceph_conf_set(class ceph_mount_info *cmount, const char *option, +extern "C" int ceph_conf_set(struct ceph_mount_info *cmount, const char *option, const char *value) { return cmount->conf_set(option, value); } -extern "C" int ceph_conf_get(class ceph_mount_info *cmount, const char *option, +extern "C" int ceph_conf_get(struct ceph_mount_info *cmount, const char *option, char *buf, size_t len) { if (buf == NULL) { @@ -316,7 +316,7 @@ extern "C" int ceph_conf_get(class ceph_mount_info *cmount, const char *option, return cmount->conf_get(option, buf, len); } -extern "C" int ceph_mount(class ceph_mount_info *cmount, const char *root) +extern "C" int ceph_mount(struct ceph_mount_info *cmount, const char *root) { std::string mount_root; if (root) @@ -324,12 +324,12 @@ extern "C" int ceph_mount(class ceph_mount_info *cmount, const char *root) return cmount->mount(mount_root); } -extern "C" int ceph_is_mounted(class ceph_mount_info *cmount) +extern "C" int ceph_is_mounted(struct ceph_mount_info *cmount) { return cmount->is_mounted() ? 1 : 0; } -extern "C" int ceph_statfs(class ceph_mount_info *cmount, const char *path, +extern "C" int ceph_statfs(struct ceph_mount_info *cmount, const char *path, struct statvfs *stbuf) { if (!cmount->is_mounted()) @@ -337,26 +337,26 @@ extern "C" int ceph_statfs(class ceph_mount_info *cmount, const char *path, return cmount->get_client()->statfs(path, stbuf); } -extern "C" int ceph_get_local_osd(class ceph_mount_info *cmount) +extern "C" int ceph_get_local_osd(struct ceph_mount_info *cmount) { if (!cmount->is_mounted()) return -ENOTCONN; return cmount->get_client()->get_local_osd(); } -extern "C" const char* ceph_getcwd(class ceph_mount_info *cmount) +extern "C" const char* ceph_getcwd(struct ceph_mount_info *cmount) { return cmount->get_cwd(); } -extern "C" int ceph_chdir (class ceph_mount_info *cmount, const char *s) +extern "C" int ceph_chdir (struct ceph_mount_info *cmount, const char *s) { if (!cmount->is_mounted()) return -ENOTCONN; return cmount->get_client()->chdir(s); } -extern "C" int ceph_opendir(class ceph_mount_info *cmount, +extern "C" int ceph_opendir(struct ceph_mount_info *cmount, const char *name, struct ceph_dir_result **dirpp) { if (!cmount->is_mounted()) @@ -364,14 +364,14 @@ extern "C" int ceph_opendir(class ceph_mount_info *cmount, return cmount->get_client()->opendir(name, (dir_result_t **)dirpp); } -extern "C" int ceph_closedir(class ceph_mount_info *cmount, struct ceph_dir_result *dirp) +extern "C" int ceph_closedir(struct ceph_mount_info *cmount, struct ceph_dir_result *dirp) { if (!cmount->is_mounted()) return -ENOTCONN; return cmount->get_client()->closedir((dir_result_t*)dirp); } -extern "C" struct dirent * ceph_readdir(class ceph_mount_info *cmount, struct ceph_dir_result *dirp) +extern "C" struct dirent * ceph_readdir(struct ceph_mount_info *cmount, struct ceph_dir_result *dirp) { if (!cmount->is_mounted()) { /* Client::readdir also sets errno to signal errors. */ @@ -381,14 +381,14 @@ extern "C" struct dirent * ceph_readdir(class ceph_mount_info *cmount, struct ce return cmount->get_client()->readdir((dir_result_t*)dirp); } -extern "C" int ceph_readdir_r(class ceph_mount_info *cmount, struct ceph_dir_result *dirp, struct dirent *de) +extern "C" int ceph_readdir_r(struct ceph_mount_info *cmount, struct ceph_dir_result *dirp, struct dirent *de) { if (!cmount->is_mounted()) return -ENOTCONN; return cmount->get_client()->readdir_r((dir_result_t*)dirp, de); } -extern "C" int ceph_readdirplus_r(class ceph_mount_info *cmount, struct ceph_dir_result *dirp, +extern "C" int ceph_readdirplus_r(struct ceph_mount_info *cmount, struct ceph_dir_result *dirp, struct dirent *de, struct stat *st, int *stmask) { if (!cmount->is_mounted()) @@ -396,7 +396,7 @@ extern "C" int ceph_readdirplus_r(class ceph_mount_info *cmount, struct ceph_dir return cmount->get_client()->readdirplus_r((dir_result_t*)dirp, de, st, stmask); } -extern "C" int ceph_getdents(class ceph_mount_info *cmount, struct ceph_dir_result *dirp, +extern "C" int ceph_getdents(struct ceph_mount_info *cmount, struct ceph_dir_result *dirp, char *buf, int buflen) { if (!cmount->is_mounted()) @@ -404,7 +404,7 @@ extern "C" int ceph_getdents(class ceph_mount_info *cmount, struct ceph_dir_resu return cmount->get_client()->getdents((dir_result_t*)dirp, buf, buflen); } -extern "C" int ceph_getdnames(class ceph_mount_info *cmount, struct ceph_dir_result *dirp, +extern "C" int ceph_getdnames(struct ceph_mount_info *cmount, struct ceph_dir_result *dirp, char *buf, int buflen) { if (!cmount->is_mounted()) @@ -412,28 +412,28 @@ extern "C" int ceph_getdnames(class ceph_mount_info *cmount, struct ceph_dir_res return cmount->get_client()->getdnames((dir_result_t*)dirp, buf, buflen); } -extern "C" void ceph_rewinddir(class ceph_mount_info *cmount, struct ceph_dir_result *dirp) +extern "C" void ceph_rewinddir(struct ceph_mount_info *cmount, struct ceph_dir_result *dirp) { if (!cmount->is_mounted()) return; cmount->get_client()->rewinddir((dir_result_t*)dirp); } -extern "C" loff_t ceph_telldir(class ceph_mount_info *cmount, struct ceph_dir_result *dirp) +extern "C" loff_t ceph_telldir(struct ceph_mount_info *cmount, struct ceph_dir_result *dirp) { if (!cmount->is_mounted()) return -ENOTCONN; return cmount->get_client()->telldir((dir_result_t*)dirp); } -extern "C" void ceph_seekdir(class ceph_mount_info *cmount, struct ceph_dir_result *dirp, loff_t offset) +extern "C" void ceph_seekdir(struct ceph_mount_info *cmount, struct ceph_dir_result *dirp, loff_t offset) { if (!cmount->is_mounted()) return; cmount->get_client()->seekdir((dir_result_t*)dirp, offset); } -extern "C" int ceph_link (class ceph_mount_info *cmount, const char *existing, +extern "C" int ceph_link (struct ceph_mount_info *cmount, const char *existing, const char *newname) { if (!cmount->is_mounted()) @@ -441,14 +441,14 @@ extern "C" int ceph_link (class ceph_mount_info *cmount, const char *existing, return cmount->get_client()->link(existing, newname); } -extern "C" int ceph_unlink(class ceph_mount_info *cmount, const char *path) +extern "C" int ceph_unlink(struct ceph_mount_info *cmount, const char *path) { if (!cmount->is_mounted()) return -ENOTCONN; return cmount->get_client()->unlink(path); } -extern "C" int ceph_rename(class ceph_mount_info *cmount, const char *from, +extern "C" int ceph_rename(struct ceph_mount_info *cmount, const char *from, const char *to) { if (!cmount->is_mounted()) @@ -457,21 +457,21 @@ extern "C" int ceph_rename(class ceph_mount_info *cmount, const char *from, } // dirs -extern "C" int ceph_mkdir(class ceph_mount_info *cmount, const char *path, mode_t mode) +extern "C" int ceph_mkdir(struct ceph_mount_info *cmount, const char *path, mode_t mode) { if (!cmount->is_mounted()) return -ENOTCONN; return cmount->get_client()->mkdir(path, mode); } -extern "C" int ceph_mkdirs(class ceph_mount_info *cmount, const char *path, mode_t mode) +extern "C" int ceph_mkdirs(struct ceph_mount_info *cmount, const char *path, mode_t mode) { if (!cmount->is_mounted()) return -ENOTCONN; return cmount->get_client()->mkdirs(path, mode); } -extern "C" int ceph_rmdir(class ceph_mount_info *cmount, const char *path) +extern "C" int ceph_rmdir(struct ceph_mount_info *cmount, const char *path) { if (!cmount->is_mounted()) return -ENOTCONN; @@ -479,7 +479,7 @@ extern "C" int ceph_rmdir(class ceph_mount_info *cmount, const char *path) } // symlinks -extern "C" int ceph_readlink(class ceph_mount_info *cmount, const char *path, +extern "C" int ceph_readlink(struct ceph_mount_info *cmount, const char *path, char *buf, loff_t size) { if (!cmount->is_mounted()) @@ -487,7 +487,7 @@ extern "C" int ceph_readlink(class ceph_mount_info *cmount, const char *path, return cmount->get_client()->readlink(path, buf, size); } -extern "C" int ceph_symlink(class ceph_mount_info *cmount, const char *existing, +extern "C" int ceph_symlink(struct ceph_mount_info *cmount, const char *existing, const char *newname) { if (!cmount->is_mounted()) @@ -496,7 +496,7 @@ extern "C" int ceph_symlink(class ceph_mount_info *cmount, const char *existing, } // inode stuff -extern "C" int ceph_stat(class ceph_mount_info *cmount, const char *path, +extern "C" int ceph_stat(struct ceph_mount_info *cmount, const char *path, struct stat *stbuf) { if (!cmount->is_mounted()) @@ -504,7 +504,7 @@ extern "C" int ceph_stat(class ceph_mount_info *cmount, const char *path, return cmount->get_client()->stat(path, stbuf); } -extern "C" int ceph_lstat(class ceph_mount_info *cmount, const char *path, +extern "C" int ceph_lstat(struct ceph_mount_info *cmount, const char *path, struct stat *stbuf) { if (!cmount->is_mounted()) @@ -512,7 +512,7 @@ extern "C" int ceph_lstat(class ceph_mount_info *cmount, const char *path, return cmount->get_client()->lstat(path, stbuf); } -extern "C" int ceph_setattr(class ceph_mount_info *cmount, const char *relpath, +extern "C" int ceph_setattr(struct ceph_mount_info *cmount, const char *relpath, struct stat *attr, int mask) { if (!cmount->is_mounted()) @@ -521,56 +521,56 @@ extern "C" int ceph_setattr(class ceph_mount_info *cmount, const char *relpath, } // *xattr() calls supporting samba/vfs -extern "C" int ceph_getxattr(class ceph_mount_info *cmount, const char *path, const char *name, void *value, size_t size) +extern "C" int ceph_getxattr(struct ceph_mount_info *cmount, const char *path, const char *name, void *value, size_t size) { if (!cmount->is_mounted()) return -ENOTCONN; return cmount->get_client()->getxattr(path, name, value, size); } -extern "C" int ceph_lgetxattr(class ceph_mount_info *cmount, const char *path, const char *name, void *value, size_t size) +extern "C" int ceph_lgetxattr(struct ceph_mount_info *cmount, const char *path, const char *name, void *value, size_t size) { if (!cmount->is_mounted()) return -ENOTCONN; return cmount->get_client()->lgetxattr(path, name, value, size); } -extern "C" int ceph_listxattr(class ceph_mount_info *cmount, const char *path, char *list, size_t size) +extern "C" int ceph_listxattr(struct ceph_mount_info *cmount, const char *path, char *list, size_t size) { if (!cmount->is_mounted()) return -ENOTCONN; return cmount->get_client()->listxattr(path, list, size); } -extern "C" int ceph_llistxattr(class ceph_mount_info *cmount, const char *path, char *list, size_t size) +extern "C" int ceph_llistxattr(struct ceph_mount_info *cmount, const char *path, char *list, size_t size) { if (!cmount->is_mounted()) return -ENOTCONN; return cmount->get_client()->llistxattr(path, list, size); } -extern "C" int ceph_removexattr(class ceph_mount_info *cmount, const char *path, const char *name) +extern "C" int ceph_removexattr(struct ceph_mount_info *cmount, const char *path, const char *name) { if (!cmount->is_mounted()) return -ENOTCONN; return cmount->get_client()->removexattr(path, name); } -extern "C" int ceph_lremovexattr(class ceph_mount_info *cmount, const char *path, const char *name) +extern "C" int ceph_lremovexattr(struct ceph_mount_info *cmount, const char *path, const char *name) { if (!cmount->is_mounted()) return -ENOTCONN; return cmount->get_client()->lremovexattr(path, name); } -extern "C" int ceph_setxattr(class ceph_mount_info *cmount, const char *path, const char *name, const void *value, size_t size, int flags) +extern "C" int ceph_setxattr(struct ceph_mount_info *cmount, const char *path, const char *name, const void *value, size_t size, int flags) { if (!cmount->is_mounted()) return -ENOTCONN; return cmount->get_client()->setxattr(path, name, value, size, flags); } -extern "C" int ceph_lsetxattr(class ceph_mount_info *cmount, const char *path, const char *name, const void *value, size_t size, int flags) +extern "C" int ceph_lsetxattr(struct ceph_mount_info *cmount, const char *path, const char *name, const void *value, size_t size, int flags) { if (!cmount->is_mounted()) return -ENOTCONN; @@ -578,33 +578,33 @@ extern "C" int ceph_lsetxattr(class ceph_mount_info *cmount, const char *path, c } /* end xattr support */ -extern "C" int ceph_chmod(class ceph_mount_info *cmount, const char *path, mode_t mode) +extern "C" int ceph_chmod(struct ceph_mount_info *cmount, const char *path, mode_t mode) { if (!cmount->is_mounted()) return -ENOTCONN; return cmount->get_client()->chmod(path, mode); } -extern "C" int ceph_fchmod(class ceph_mount_info *cmount, int fd, mode_t mode) +extern "C" int ceph_fchmod(struct ceph_mount_info *cmount, int fd, mode_t mode) { if (!cmount->is_mounted()) return -ENOTCONN; return cmount->get_client()->fchmod(fd, mode); } -extern "C" int ceph_chown(class ceph_mount_info *cmount, const char *path, +extern "C" int ceph_chown(struct ceph_mount_info *cmount, const char *path, int uid, int gid) { if (!cmount->is_mounted()) return -ENOTCONN; return cmount->get_client()->chown(path, uid, gid); } -extern "C" int ceph_fchown(class ceph_mount_info *cmount, int fd, +extern "C" int ceph_fchown(struct ceph_mount_info *cmount, int fd, int uid, int gid) { if (!cmount->is_mounted()) return -ENOTCONN; return cmount->get_client()->fchown(fd, uid, gid); } -extern "C" int ceph_lchown(class ceph_mount_info *cmount, const char *path, +extern "C" int ceph_lchown(struct ceph_mount_info *cmount, const char *path, int uid, int gid) { if (!cmount->is_mounted()) @@ -613,7 +613,7 @@ extern "C" int ceph_lchown(class ceph_mount_info *cmount, const char *path, } -extern "C" int ceph_utime(class ceph_mount_info *cmount, const char *path, +extern "C" int ceph_utime(struct ceph_mount_info *cmount, const char *path, struct utimbuf *buf) { if (!cmount->is_mounted()) @@ -621,7 +621,7 @@ extern "C" int ceph_utime(class ceph_mount_info *cmount, const char *path, return cmount->get_client()->utime(path, buf); } -extern "C" int ceph_truncate(class ceph_mount_info *cmount, const char *path, +extern "C" int ceph_truncate(struct ceph_mount_info *cmount, const char *path, loff_t size) { if (!cmount->is_mounted()) @@ -630,7 +630,7 @@ extern "C" int ceph_truncate(class ceph_mount_info *cmount, const char *path, } // file ops -extern "C" int ceph_mknod(class ceph_mount_info *cmount, const char *path, +extern "C" int ceph_mknod(struct ceph_mount_info *cmount, const char *path, mode_t mode, dev_t rdev) { if (!cmount->is_mounted()) @@ -638,7 +638,7 @@ extern "C" int ceph_mknod(class ceph_mount_info *cmount, const char *path, return cmount->get_client()->mknod(path, mode, rdev); } -extern "C" int ceph_open(class ceph_mount_info *cmount, const char *path, +extern "C" int ceph_open(struct ceph_mount_info *cmount, const char *path, int flags, mode_t mode) { if (!cmount->is_mounted()) @@ -646,7 +646,7 @@ extern "C" int ceph_open(class ceph_mount_info *cmount, const char *path, return cmount->get_client()->open(path, flags, mode); } -extern "C" int ceph_open_layout(class ceph_mount_info *cmount, const char *path, int flags, +extern "C" int ceph_open_layout(struct ceph_mount_info *cmount, const char *path, int flags, mode_t mode, int stripe_unit, int stripe_count, int object_size, const char *data_pool) { if (!cmount->is_mounted()) @@ -655,14 +655,14 @@ extern "C" int ceph_open_layout(class ceph_mount_info *cmount, const char *path, stripe_count, object_size, data_pool); } -extern "C" int ceph_close(class ceph_mount_info *cmount, int fd) +extern "C" int ceph_close(struct ceph_mount_info *cmount, int fd) { if (!cmount->is_mounted()) return -ENOTCONN; return cmount->get_client()->close(fd); } -extern "C" loff_t ceph_lseek(class ceph_mount_info *cmount, int fd, +extern "C" loff_t ceph_lseek(struct ceph_mount_info *cmount, int fd, loff_t offset, int whence) { if (!cmount->is_mounted()) @@ -670,7 +670,7 @@ extern "C" loff_t ceph_lseek(class ceph_mount_info *cmount, int fd, return cmount->get_client()->lseek(fd, offset, whence); } -extern "C" int ceph_read(class ceph_mount_info *cmount, int fd, char *buf, +extern "C" int ceph_read(struct ceph_mount_info *cmount, int fd, char *buf, loff_t size, loff_t offset) { if (!cmount->is_mounted()) @@ -678,7 +678,7 @@ extern "C" int ceph_read(class ceph_mount_info *cmount, int fd, char *buf, return cmount->get_client()->read(fd, buf, size, offset); } -extern "C" int ceph_write(class ceph_mount_info *cmount, int fd, const char *buf, +extern "C" int ceph_write(struct ceph_mount_info *cmount, int fd, const char *buf, loff_t size, loff_t offset) { if (!cmount->is_mounted()) @@ -686,21 +686,21 @@ extern "C" int ceph_write(class ceph_mount_info *cmount, int fd, const char *buf return cmount->get_client()->write(fd, buf, size, offset); } -extern "C" int ceph_ftruncate(class ceph_mount_info *cmount, int fd, loff_t size) +extern "C" int ceph_ftruncate(struct ceph_mount_info *cmount, int fd, loff_t size) { if (!cmount->is_mounted()) return -ENOTCONN; return cmount->get_client()->ftruncate(fd, size); } -extern "C" int ceph_fsync(class ceph_mount_info *cmount, int fd, int syncdataonly) +extern "C" int ceph_fsync(struct ceph_mount_info *cmount, int fd, int syncdataonly) { if (!cmount->is_mounted()) return -ENOTCONN; return cmount->get_client()->fsync(fd, syncdataonly); } -extern "C" int ceph_fallocate(class ceph_mount_info *cmount, int fd, int mode, +extern "C" int ceph_fallocate(struct ceph_mount_info *cmount, int fd, int mode, loff_t offset, loff_t length) { if (!cmount->is_mounted()) @@ -708,14 +708,14 @@ extern "C" int ceph_fallocate(class ceph_mount_info *cmount, int fd, int mode, return cmount->get_client()->fallocate(fd, mode, offset, length); } -extern "C" int ceph_fstat(class ceph_mount_info *cmount, int fd, struct stat *stbuf) +extern "C" int ceph_fstat(struct ceph_mount_info *cmount, int fd, struct stat *stbuf) { if (!cmount->is_mounted()) return -ENOTCONN; return cmount->get_client()->fstat(fd, stbuf); } -extern "C" int ceph_sync_fs(class ceph_mount_info *cmount) +extern "C" int ceph_sync_fs(struct ceph_mount_info *cmount) { if (!cmount->is_mounted()) return -ENOTCONN; @@ -723,7 +723,7 @@ extern "C" int ceph_sync_fs(class ceph_mount_info *cmount) } -extern "C" int ceph_get_file_stripe_unit(class ceph_mount_info *cmount, int fh) +extern "C" int ceph_get_file_stripe_unit(struct ceph_mount_info *cmount, int fh) { struct ceph_file_layout l; int r; @@ -736,7 +736,7 @@ extern "C" int ceph_get_file_stripe_unit(class ceph_mount_info *cmount, int fh) return l.fl_stripe_unit; } -extern "C" int ceph_get_path_stripe_unit(class ceph_mount_info *cmount, const char *path) +extern "C" int ceph_get_path_stripe_unit(struct ceph_mount_info *cmount, const char *path) { struct ceph_file_layout l; int r; @@ -749,7 +749,7 @@ extern "C" int ceph_get_path_stripe_unit(class ceph_mount_info *cmount, const ch return l.fl_stripe_unit; } -extern "C" int ceph_get_file_stripe_count(class ceph_mount_info *cmount, int fh) +extern "C" int ceph_get_file_stripe_count(struct ceph_mount_info *cmount, int fh) { struct ceph_file_layout l; int r; @@ -762,7 +762,7 @@ extern "C" int ceph_get_file_stripe_count(class ceph_mount_info *cmount, int fh) return l.fl_stripe_count; } -extern "C" int ceph_get_path_stripe_count(class ceph_mount_info *cmount, const char *path) +extern "C" int ceph_get_path_stripe_count(struct ceph_mount_info *cmount, const char *path) { struct ceph_file_layout l; int r; @@ -775,7 +775,7 @@ extern "C" int ceph_get_path_stripe_count(class ceph_mount_info *cmount, const c return l.fl_stripe_count; } -extern "C" int ceph_get_file_object_size(class ceph_mount_info *cmount, int fh) +extern "C" int ceph_get_file_object_size(struct ceph_mount_info *cmount, int fh) { struct ceph_file_layout l; int r; @@ -788,7 +788,7 @@ extern "C" int ceph_get_file_object_size(class ceph_mount_info *cmount, int fh) return l.fl_object_size; } -extern "C" int ceph_get_path_object_size(class ceph_mount_info *cmount, const char *path) +extern "C" int ceph_get_path_object_size(struct ceph_mount_info *cmount, const char *path) { struct ceph_file_layout l; int r; @@ -801,7 +801,7 @@ extern "C" int ceph_get_path_object_size(class ceph_mount_info *cmount, const ch return l.fl_object_size; } -extern "C" int ceph_get_file_pool(class ceph_mount_info *cmount, int fh) +extern "C" int ceph_get_file_pool(struct ceph_mount_info *cmount, int fh) { struct ceph_file_layout l; int r; @@ -814,7 +814,7 @@ extern "C" int ceph_get_file_pool(class ceph_mount_info *cmount, int fh) return l.fl_pg_pool; } -extern "C" int ceph_get_path_pool(class ceph_mount_info *cmount, const char *path) +extern "C" int ceph_get_path_pool(struct ceph_mount_info *cmount, const char *path) { struct ceph_file_layout l; int r; @@ -827,7 +827,7 @@ extern "C" int ceph_get_path_pool(class ceph_mount_info *cmount, const char *pat return l.fl_pg_pool; } -extern "C" int ceph_get_file_pool_name(class ceph_mount_info *cmount, int fh, char *buf, size_t len) +extern "C" int ceph_get_file_pool_name(struct ceph_mount_info *cmount, int fh, char *buf, size_t len) { struct ceph_file_layout l; int r; @@ -846,7 +846,7 @@ extern "C" int ceph_get_file_pool_name(class ceph_mount_info *cmount, int fh, ch return name.length(); } -extern "C" int ceph_get_pool_name(class ceph_mount_info *cmount, int pool, char *buf, size_t len) +extern "C" int ceph_get_pool_name(struct ceph_mount_info *cmount, int pool, char *buf, size_t len) { if (!cmount->is_mounted()) return -ENOTCONN; @@ -859,7 +859,7 @@ extern "C" int ceph_get_pool_name(class ceph_mount_info *cmount, int pool, char return name.length(); } -extern "C" int ceph_get_path_pool_name(class ceph_mount_info *cmount, const char *path, char *buf, size_t len) +extern "C" int ceph_get_path_pool_name(struct ceph_mount_info *cmount, const char *path, char *buf, size_t len) { struct ceph_file_layout l; int r; @@ -878,7 +878,7 @@ extern "C" int ceph_get_path_pool_name(class ceph_mount_info *cmount, const char return name.length(); } -extern "C" int ceph_get_file_layout(class ceph_mount_info *cmount, int fh, int *stripe_unit, int *stripe_count, int *object_size, int *pg_pool) +extern "C" int ceph_get_file_layout(struct ceph_mount_info *cmount, int fh, int *stripe_unit, int *stripe_count, int *object_size, int *pg_pool) { struct ceph_file_layout l; int r; @@ -899,7 +899,7 @@ extern "C" int ceph_get_file_layout(class ceph_mount_info *cmount, int fh, int * return 0; } -extern "C" int ceph_get_path_layout(class ceph_mount_info *cmount, const char *path, int *stripe_unit, int *stripe_count, int *object_size, int *pg_pool) +extern "C" int ceph_get_path_layout(struct ceph_mount_info *cmount, const char *path, int *stripe_unit, int *stripe_count, int *object_size, int *pg_pool) { struct ceph_file_layout l; int r; @@ -920,7 +920,7 @@ extern "C" int ceph_get_path_layout(class ceph_mount_info *cmount, const char *p return 0; } -extern "C" int ceph_get_file_replication(class ceph_mount_info *cmount, int fh) +extern "C" int ceph_get_file_replication(struct ceph_mount_info *cmount, int fh) { struct ceph_file_layout l; int r; @@ -934,7 +934,7 @@ extern "C" int ceph_get_file_replication(class ceph_mount_info *cmount, int fh) return rep; } -extern "C" int ceph_get_path_replication(class ceph_mount_info *cmount, const char *path) +extern "C" int ceph_get_path_replication(struct ceph_mount_info *cmount, const char *path) { struct ceph_file_layout l; int r; @@ -948,40 +948,40 @@ extern "C" int ceph_get_path_replication(class ceph_mount_info *cmount, const ch return rep; } -extern "C" int ceph_set_default_file_stripe_unit(class ceph_mount_info *cmount, +extern "C" int ceph_set_default_file_stripe_unit(struct ceph_mount_info *cmount, int stripe) { // this option no longer exists return -EOPNOTSUPP; } -extern "C" int ceph_set_default_file_stripe_count(class ceph_mount_info *cmount, +extern "C" int ceph_set_default_file_stripe_count(struct ceph_mount_info *cmount, int count) { // this option no longer exists return -EOPNOTSUPP; } -extern "C" int ceph_set_default_object_size(class ceph_mount_info *cmount, int size) +extern "C" int ceph_set_default_object_size(struct ceph_mount_info *cmount, int size) { // this option no longer exists return -EOPNOTSUPP; } -extern "C" int ceph_set_default_file_replication(class ceph_mount_info *cmount, +extern "C" int ceph_set_default_file_replication(struct ceph_mount_info *cmount, int replication) { // this option no longer exists return -EOPNOTSUPP; } -extern "C" int ceph_set_default_preferred_pg(class ceph_mount_info *cmount, int osd) +extern "C" int ceph_set_default_preferred_pg(struct ceph_mount_info *cmount, int osd) { // this option no longer exists return -EOPNOTSUPP; } -extern "C" int ceph_get_file_extent_osds(class ceph_mount_info *cmount, int fh, +extern "C" int ceph_get_file_extent_osds(struct ceph_mount_info *cmount, int fh, loff_t offset, loff_t *length, int *osds, int nosds) { if (nosds < 0) @@ -1007,7 +1007,7 @@ extern "C" int ceph_get_file_extent_osds(class ceph_mount_info *cmount, int fh, return vosds.size(); } -extern "C" int ceph_get_osd_crush_location(class ceph_mount_info *cmount, +extern "C" int ceph_get_osd_crush_location(struct ceph_mount_info *cmount, int osd, char *path, size_t len) { if (!cmount->is_mounted()) @@ -1045,7 +1045,7 @@ extern "C" int ceph_get_osd_crush_location(class ceph_mount_info *cmount, return needed; } -extern "C" int ceph_get_osd_addr(class ceph_mount_info *cmount, int osd, +extern "C" int ceph_get_osd_addr(struct ceph_mount_info *cmount, int osd, struct sockaddr_storage *addr) { if (!cmount->is_mounted()) @@ -1064,7 +1064,7 @@ extern "C" int ceph_get_osd_addr(class ceph_mount_info *cmount, int osd, return 0; } -extern "C" int ceph_get_file_stripe_address(class ceph_mount_info *cmount, int fh, +extern "C" int ceph_get_file_stripe_address(struct ceph_mount_info *cmount, int fh, loff_t offset, struct sockaddr_storage *addr, int naddr) { vector address; @@ -1091,7 +1091,7 @@ extern "C" int ceph_get_file_stripe_address(class ceph_mount_info *cmount, int f return address.size(); } -extern "C" int ceph_localize_reads(class ceph_mount_info *cmount, int val) +extern "C" int ceph_localize_reads(struct ceph_mount_info *cmount, int val) { if (!cmount->is_mounted()) return -ENOTCONN; @@ -1102,33 +1102,33 @@ extern "C" int ceph_localize_reads(class ceph_mount_info *cmount, int val) return 0; } -extern "C" CephContext *ceph_get_mount_context(class ceph_mount_info *cmount) +extern "C" CephContext *ceph_get_mount_context(struct ceph_mount_info *cmount) { return cmount->get_ceph_context(); } -extern "C" int ceph_debug_get_fd_caps(class ceph_mount_info *cmount, int fd) +extern "C" int ceph_debug_get_fd_caps(struct ceph_mount_info *cmount, int fd) { if (!cmount->is_mounted()) return -ENOTCONN; return cmount->get_client()->get_caps_issued(fd); } -extern "C" int ceph_debug_get_file_caps(class ceph_mount_info *cmount, const char *path) +extern "C" int ceph_debug_get_file_caps(struct ceph_mount_info *cmount, const char *path) { if (!cmount->is_mounted()) return -ENOTCONN; return cmount->get_client()->get_caps_issued(path); } -extern "C" int ceph_get_stripe_unit_granularity(class ceph_mount_info *cmount) +extern "C" int ceph_get_stripe_unit_granularity(struct ceph_mount_info *cmount) { if (!cmount->is_mounted()) return -ENOTCONN; return CEPH_MIN_STRIPE_UNIT; } -extern "C" int ceph_get_pool_id(class ceph_mount_info *cmount, const char *pool_name) +extern "C" int ceph_get_pool_id(struct ceph_mount_info *cmount, const char *pool_name) { if (!cmount->is_mounted()) return -ENOTCONN; @@ -1145,7 +1145,7 @@ extern "C" int ceph_get_pool_id(class ceph_mount_info *cmount, const char *pool_ return (int)pool_id; } -extern "C" int ceph_get_pool_replication(class ceph_mount_info *cmount, int pool_id) +extern "C" int ceph_get_pool_replication(struct ceph_mount_info *cmount, int pool_id) { if (!cmount->is_mounted()) return -ENOTCONN; From 12238d0906ad0ba6306b00594dffba0191728200 Mon Sep 17 00:00:00 2001 From: Christophe Courtaut Date: Thu, 31 Oct 2013 17:43:35 +0100 Subject: [PATCH 070/150] libcephfs: Fix compilation for C compiler Use struct instead of class, even if it warns. Warnings are lower priority than compilation break. Signed-off-by: Christophe Courtaut --- src/include/cephfs/libcephfs.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/include/cephfs/libcephfs.h b/src/include/cephfs/libcephfs.h index f2ab2ae61e181..9b74f63c062d3 100644 --- a/src/include/cephfs/libcephfs.h +++ b/src/include/cephfs/libcephfs.h @@ -40,7 +40,7 @@ extern "C" { struct ceph_mount_info; struct ceph_dir_result; -class CephContext; +struct CephContext; /* setattr mask bits */ #ifndef CEPH_SETATTR_MODE @@ -94,7 +94,7 @@ int ceph_create(struct ceph_mount_info **cmount, const char * const id); * @param conf reuse this pre-existing CephContext config * @returns 0 on success, negative error code on failure */ -int ceph_create_with_context(struct ceph_mount_info **cmount, class CephContext *conf); +int ceph_create_with_context(struct ceph_mount_info **cmount, struct CephContext *conf); /** * Perform a mount using the path for the root of the mount. @@ -142,7 +142,7 @@ void ceph_shutdown(struct ceph_mount_info *cmount); * @param cmount the ceph mount handle to get the context from. * @returns the CephContext associated with the mount handle. */ -class CephContext *ceph_get_mount_context(struct ceph_mount_info *cmount); +struct CephContext *ceph_get_mount_context(struct ceph_mount_info *cmount); /* * Check mount status. From ffdd30efc870eafb1047f022b16d9680d88fcc78 Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Thu, 31 Oct 2013 09:20:51 -0700 Subject: [PATCH 071/150] test: add gcc compile test for installed headers libcephfs/librados headers should work with gcc. Signed-off-by: Noah Watkins --- src/test/Makefile.am | 3 +++ src/test/test_c_headers.c | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 src/test/test_c_headers.c diff --git a/src/test/Makefile.am b/src/test/Makefile.am index 0ef75ac87ea43..228a26e2bdac7 100644 --- a/src/test/Makefile.am +++ b/src/test/Makefile.am @@ -859,6 +859,9 @@ bin_DEBUGPROGRAMS += ceph_test_keyvaluedb_iterators ceph_test_cfuse_cache_invalidate_SOURCES = test/test_cfuse_cache_invalidate.cc bin_DEBUGPROGRAMS += ceph_test_cfuse_cache_invalidate +ceph_test_c_headers_SOURCES = test/test_c_headers.c +ceph_test_c_headers_LDADD = $(LIBRADOS) $(LIBCEPHFS) +bin_DEBUGPROGRAMS += ceph_test_c_headers noinst_HEADERS += \ test/osd/RadosModel.h \ diff --git a/src/test/test_c_headers.c b/src/test/test_c_headers.c new file mode 100644 index 0000000000000..0f41966acae22 --- /dev/null +++ b/src/test/test_c_headers.c @@ -0,0 +1,22 @@ +#include "include/cephfs/libcephfs.h" +#include "include/rados/librados.h" + +#ifdef __cplusplus +#error "test invalid: only use C mode" +#endif + +int main(int argc, char **argv) +{ + int ret; + (void)ret; // squash unused warning + + /* librados.h */ + rados_t cluster; + ret = rados_create(&cluster, NULL); + + /* libcephfs.h */ + struct ceph_mount_info *cmount; + ret = ceph_create(&cmount, NULL); + + return 0; +} From cd30e5fbb1d2d29b4fc0c2b13fa3b9b4493c24f0 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Fri, 1 Nov 2013 13:39:16 -0700 Subject: [PATCH 072/150] common/buffer.cc: fix rebuild_page_aligned typo Introduced: 66a9fbe2c7ba59b7cd034c17865adce3432cd2cb Fixes: #6003 Signed-off-by: Samuel Just --- src/common/buffer.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/buffer.cc b/src/common/buffer.cc index acdfee0885b5d..95c7acdb694a2 100644 --- a/src/common/buffer.cc +++ b/src/common/buffer.cc @@ -854,7 +854,7 @@ void buffer::list::rebuild_page_aligned() (!p->is_page_aligned() || !p->is_n_page_sized() || (offset & ~CEPH_PAGE_MASK))); - ptr nb(buffer::create_page_aligned(_len)); + ptr nb(buffer::create_page_aligned(unaligned._len)); unaligned.rebuild(nb); _buffers.insert(p, unaligned._buffers.front()); } From 306ec7142d699c26ce874b11dc02ccdb3cf296c7 Mon Sep 17 00:00:00 2001 From: Josh Durgin Date: Fri, 1 Nov 2013 16:12:52 -0700 Subject: [PATCH 073/150] rgw: don't turn 404 into 400 for the replicalog api 404 is not actually a problem to clients like radosgw-agent, but 400 implies something about the request was incorrect. Backport: dumpling Signed-off-by: Josh Durgin --- src/rgw/rgw_rest_replica_log.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/rgw/rgw_rest_replica_log.cc b/src/rgw/rgw_rest_replica_log.cc index 600a8edb78c5b..2543f32fba6e8 100644 --- a/src/rgw/rgw_rest_replica_log.cc +++ b/src/rgw/rgw_rest_replica_log.cc @@ -171,7 +171,9 @@ static int bucket_instance_to_bucket(RGWRados *store, string& bucket_instance, r int r = store->get_bucket_instance_info(NULL, bucket_instance, bucket_info, &mtime, NULL); if (r < 0) { - dout(5) << "could not get bucket instance info for bucket=" << bucket_instance << dendl; + dout(5) << "could not get bucket instance info for bucket=" << bucket_instance << ": " << cpp_strerror(r) << dendl; + if (r == -ENOENT) + return r; return -EINVAL; } From cc08a4ae3f15398d6255604f837d335aa91034c5 Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Wed, 30 Oct 2013 11:55:00 -0700 Subject: [PATCH 074/150] auth: remove unused private var [-Wunused-private-field] Signed-off-by: Noah Watkins --- src/auth/AuthAuthorizeHandler.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/auth/AuthAuthorizeHandler.h b/src/auth/AuthAuthorizeHandler.h index 10803d0d7a005..7b67876e44be3 100644 --- a/src/auth/AuthAuthorizeHandler.h +++ b/src/auth/AuthAuthorizeHandler.h @@ -41,12 +41,11 @@ struct AuthAuthorizeHandler { class AuthAuthorizeHandlerRegistry { Mutex m_lock; map m_authorizers; - CephContext *cct; AuthMethodList supported; public: AuthAuthorizeHandlerRegistry(CephContext *cct_, std::string methods) - : m_lock("AuthAuthorizeHandlerRegistry::m_lock"), cct(cct_), supported(cct_, methods) + : m_lock("AuthAuthorizeHandlerRegistry::m_lock"), supported(cct_, methods) {} ~AuthAuthorizeHandlerRegistry(); From cf29574203ce9a35e5aa145832bc9f1556d0f41a Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Wed, 30 Oct 2013 11:58:29 -0700 Subject: [PATCH 075/150] CrushTester: remove unused private var [-Wunused-private-field] Signed-off-by: Noah Watkins --- src/crush/CrushTester.h | 5 ++--- src/mon/OSDMonitor.cc | 2 +- src/tools/crushtool.cc | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/crush/CrushTester.h b/src/crush/CrushTester.h index 0cbab0fd98806..7a681e253dbff 100644 --- a/src/crush/CrushTester.h +++ b/src/crush/CrushTester.h @@ -12,7 +12,6 @@ class CrushTester { CrushWrapper& crush; ostream& err; - int verbose; map device_weight; int min_rule, max_rule; @@ -165,8 +164,8 @@ class CrushTester { void write_integer_indexed_scalar_data_string(vector &dst, int index, float scalar_data); public: - CrushTester(CrushWrapper& c, ostream& eo, int verbosity=0) - : crush(c), err(eo), verbose(verbosity), + CrushTester(CrushWrapper& c, ostream& eo) + : crush(c), err(eo), min_rule(-1), max_rule(-1), min_x(-1), max_x(-1), min_rep(-1), max_rep(-1), diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index d56953ba06991..c028af11e73a0 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -2923,7 +2923,7 @@ bool OSDMonitor::prepare_command(MMonCommand *m) // sanity check: test some inputs to make sure this map isn't totally broken dout(10) << " testing map" << dendl; stringstream ess; - CrushTester tester(crush, ess, 1); + CrushTester tester(crush, ess); tester.test(); dout(10) << " result " << ess.str() << dendl; diff --git a/src/tools/crushtool.cc b/src/tools/crushtool.cc index 03c83f2415673..caebf2d56207e 100644 --- a/src/tools/crushtool.cc +++ b/src/tools/crushtool.cc @@ -186,7 +186,7 @@ int main(int argc, const char **argv) CrushWrapper crush; - CrushTester tester(crush, cerr, 1); + CrushTester tester(crush, cerr); vector empty_args; // we use -c, don't confuse the generic arg parsing global_init(NULL, empty_args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, From 382149cc107270c965f086ab4917b80c21a5d1b5 Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Wed, 30 Oct 2013 11:58:53 -0700 Subject: [PATCH 076/150] OSD: remove unused private var [-Wunused-private-field] Signed-off-by: Noah Watkins --- src/osd/OSD.cc | 2 +- src/osd/OSD.h | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index eb5191f770e15..0baeb5717806c 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -900,7 +900,7 @@ OSD::OSD(CephContext *cct_, int id, Messenger *internal_messenger, Messenger *ex replay_queue_lock("OSD::replay_queue_lock"), snap_trim_wq(this, cct->_conf->osd_snap_trim_thread_timeout, &disk_tp), scrub_wq(this, cct->_conf->osd_scrub_thread_timeout, &disk_tp), - scrub_finalize_wq(this, cct->_conf->osd_scrub_finalize_thread_timeout, &op_tp), + scrub_finalize_wq(cct->_conf->osd_scrub_finalize_thread_timeout, &op_tp), rep_scrub_wq(this, cct->_conf->osd_scrub_thread_timeout, &disk_tp), remove_wq(store, cct->_conf->osd_remove_thread_timeout, &disk_tp), next_removal_seq(0), diff --git a/src/osd/OSD.h b/src/osd/OSD.h index f7559da3be53a..d08d5a566911d 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -1555,12 +1555,11 @@ class OSD : public Dispatcher, struct ScrubFinalizeWQ : public ThreadPool::WorkQueue { private: - OSD *osd; xlist scrub_finalize_queue; public: - ScrubFinalizeWQ(OSD *o, time_t ti, ThreadPool *tp) - : ThreadPool::WorkQueue("OSD::ScrubFinalizeWQ", ti, ti*10, tp), osd(o) {} + ScrubFinalizeWQ(time_t ti, ThreadPool *tp) + : ThreadPool::WorkQueue("OSD::ScrubFinalizeWQ", ti, ti*10, tp) {} bool _empty() { return scrub_finalize_queue.empty(); From 6efc2b54d5ce85fcb4b66237b051bcbb5072e6a3 Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Wed, 30 Oct 2013 07:50:03 -0700 Subject: [PATCH 077/150] fix -Wgnu-designator warnings Example: warning: use of GNU old-style field designator extension [-Wgnu-designator] Signed-off-by: Noah Watkins --- src/client/fuse_ll.cc | 84 +++++++++++++++++++++---------------------- src/common/config.cc | 14 ++++---- 2 files changed, 49 insertions(+), 49 deletions(-) diff --git a/src/client/fuse_ll.cc b/src/client/fuse_ll.cc index 88f727e454ee4..60cdf5a19152a 100644 --- a/src/client/fuse_ll.cc +++ b/src/client/fuse_ll.cc @@ -595,53 +595,53 @@ static void do_init(void *data, fuse_conn_info *bar) } const static struct fuse_lowlevel_ops fuse_ll_oper = { - init: do_init, - destroy: 0, - lookup: fuse_ll_lookup, - forget: fuse_ll_forget, - getattr: fuse_ll_getattr, - setattr: fuse_ll_setattr, - readlink: fuse_ll_readlink, - mknod: fuse_ll_mknod, - mkdir: fuse_ll_mkdir, - unlink: fuse_ll_unlink, - rmdir: fuse_ll_rmdir, - symlink: fuse_ll_symlink, - rename: fuse_ll_rename, - link: fuse_ll_link, - open: fuse_ll_open, - read: fuse_ll_read, - write: fuse_ll_write, - flush: fuse_ll_flush, - release: fuse_ll_release, - fsync: fuse_ll_fsync, - opendir: fuse_ll_opendir, - readdir: fuse_ll_readdir, - releasedir: fuse_ll_releasedir, - fsyncdir: 0, - statfs: fuse_ll_statfs, - setxattr: fuse_ll_setxattr, - getxattr: fuse_ll_getxattr, - listxattr: fuse_ll_listxattr, - removexattr: fuse_ll_removexattr, - access: 0, - create: fuse_ll_create, - getlk: 0, - setlk: 0, - bmap: 0, + .init = do_init, + .destroy = 0, + .lookup = fuse_ll_lookup, + .forget = fuse_ll_forget, + .getattr = fuse_ll_getattr, + .setattr = fuse_ll_setattr, + .readlink = fuse_ll_readlink, + .mknod = fuse_ll_mknod, + .mkdir = fuse_ll_mkdir, + .unlink = fuse_ll_unlink, + .rmdir = fuse_ll_rmdir, + .symlink = fuse_ll_symlink, + .rename = fuse_ll_rename, + .link = fuse_ll_link, + .open = fuse_ll_open, + .read = fuse_ll_read, + .write = fuse_ll_write, + .flush = fuse_ll_flush, + .release = fuse_ll_release, + .fsync = fuse_ll_fsync, + .opendir = fuse_ll_opendir, + .readdir = fuse_ll_readdir, + .releasedir = fuse_ll_releasedir, + .fsyncdir = 0, + .statfs = fuse_ll_statfs, + .setxattr = fuse_ll_setxattr, + .getxattr = fuse_ll_getxattr, + .listxattr = fuse_ll_listxattr, + .removexattr = fuse_ll_removexattr, + .access = 0, + .create = fuse_ll_create, + .getlk = 0, + .setlk = 0, + .bmap = 0, #if FUSE_VERSION >= FUSE_MAKE_VERSION(2, 8) #ifdef FUSE_IOCTL_COMPAT - ioctl: fuse_ll_ioctl, + .ioctl = fuse_ll_ioctl, #else - ioctl: 0, + .ioctl = 0, #endif - poll: 0, + .poll = 0, #if FUSE_VERSION > FUSE_MAKE_VERSION(2, 9) - write_buf: 0, - retrieve_reply: 0, - forget_multi: 0, - flock: 0, - fallocate: fuse_ll_fallocate + .write_buf = 0, + .retrieve_reply = 0, + .forget_multi = 0, + .flock = 0, + .fallocate = fuse_ll_fallocate #endif #endif }; diff --git a/src/common/config.cc b/src/common/config.cc index 5c64f4ec1517c..ddbb8b3c8c479 100644 --- a/src/common/config.cc +++ b/src/common/config.cc @@ -58,13 +58,13 @@ const char *CEPH_CONF_FILE_DEFAULT = "/etc/ceph/$cluster.conf, ~/.ceph/$cluster. // file layouts struct ceph_file_layout g_default_file_layout = { - fl_stripe_unit: init_le32(1<<22), - fl_stripe_count: init_le32(1), - fl_object_size: init_le32(1<<22), - fl_cas_hash: init_le32(0), - fl_object_stripe_unit: init_le32(0), - fl_unused: init_le32(-1), - fl_pg_pool : init_le32(-1), + .fl_stripe_unit = init_le32(1<<22), + .fl_stripe_count = init_le32(1), + .fl_object_size = init_le32(1<<22), + .fl_cas_hash = init_le32(0), + .fl_object_stripe_unit = init_le32(0), + .fl_unused = init_le32(-1), + .fl_pg_pool = init_le32(-1), }; #define _STR(x) #x From 5d0d0a9122fe8e4632e1137db170a425e072f581 Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Wed, 30 Oct 2013 07:51:43 -0700 Subject: [PATCH 078/150] fix -Wmismatched-tags warnings Example: warning: class 'ObjecterDispatcher' was previously declared as a struct [-Wmismatched-tags] Signed-off-by: Noah Watkins --- src/common/hobject.h | 2 +- src/osd/OSD.h | 2 +- src/osd/ReplicatedPG.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/common/hobject.h b/src/common/hobject.h index edaf04a301fd6..8e56d660e3af7 100644 --- a/src/common/hobject.h +++ b/src/common/hobject.h @@ -184,7 +184,7 @@ struct hobject_t { friend bool operator>=(const hobject_t&, const hobject_t&); friend bool operator==(const hobject_t&, const hobject_t&); friend bool operator!=(const hobject_t&, const hobject_t&); - friend class ghobject_t; + friend struct ghobject_t; }; WRITE_CLASS_ENCODER(hobject_t) diff --git a/src/osd/OSD.h b/src/osd/OSD.h index d08d5a566911d..29615558fefc0 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -440,7 +440,7 @@ class OSDService { bool force_new); ObjecterDispatcher(OSDService *o) : Dispatcher(cct), osd(o) {} } objecter_dispatcher; - friend class ObjecterDispatcher; + friend struct ObjecterDispatcher; // -- Watch -- diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h index d1779d113203c..6a16315fb7cc6 100644 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@ -928,7 +928,7 @@ class ReplicatedPG : public PG, public PGBackend::Listener { void cancel_copy(CopyOpRef cop, bool requeue); void cancel_copy_ops(bool requeue); - friend class C_Copyfrom; + friend struct C_Copyfrom; // -- scrub -- virtual void _scrub(ScrubMap& map); From 59a55fdaaf2c66aae7de151949ba46981da4696e Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Sat, 20 Jul 2013 18:41:40 -0700 Subject: [PATCH 079/150] pipe: use pipe2 feature test; check fcntl retval Signed-off-by: Noah Watkins --- configure.ac | 1 + src/common/pipe.c | 41 +++++++++++++++++++++++++++++------------ 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/configure.ac b/configure.ac index c344e7d6134b6..66d8f2161c990 100644 --- a/configure.ac +++ b/configure.ac @@ -538,6 +538,7 @@ AC_CHECK_FUNC([fallocate], AC_CHECK_HEADERS([sys/prctl.h]) AC_CHECK_FUNCS([prctl]) +AC_CHECK_FUNCS([pipe2]) # Checks for typedefs, structures, and compiler characteristics. #AC_HEADER_STDBOOL diff --git a/src/common/pipe.c b/src/common/pipe.c index 9c01b322f89dc..9ec9e36e586ba 100644 --- a/src/common/pipe.c +++ b/src/common/pipe.c @@ -11,6 +11,7 @@ * Foundation. See file COPYING. * */ +#include "acconfig.h" #include "common/pipe.h" @@ -20,24 +21,40 @@ int pipe_cloexec(int pipefd[2]) { -#if defined(O_CLOEXEC) && !defined(__FreeBSD__) int ret; + +#if defined(HAVE_PIPE2) && defined(O_CLOEXEC) ret = pipe2(pipefd, O_CLOEXEC); - if (ret) { - ret = -errno; - return ret; - } + if (ret == -1) + return -errno; return 0; #else - /* The old-fashioned, race-condition prone way that we have to fall back on if - * O_CLOEXEC does not exist. */ - int ret = pipe(pipefd); - if (ret) { + ret = pipe(pipefd); + if (ret == -1) + return -errno; + + /* + * The old-fashioned, race-condition prone way that we have to fall + * back on if O_CLOEXEC does not exist. + */ + ret = fcntl(pipefd[0], F_SETFD, FD_CLOEXEC); + if (ret == -1) { + ret = -errno; + goto out; + } + + ret = fcntl(pipefd[1], F_SETFD, FD_CLOEXEC); + if (ret == -1) { ret = -errno; - return ret; + goto out; } - fcntl(pipefd[0], F_SETFD, FD_CLOEXEC); - fcntl(pipefd[1], F_SETFD, FD_CLOEXEC); + return 0; + +out: + TEMP_FAILURE_RETRY(close(pipefd[0])); + TEMP_FAILURE_RETRY(close(pipefd[1])); + + return ret; #endif } From 9834ab9ab838d5164d518a96dbf4638950efe68f Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Fri, 1 Nov 2013 15:45:02 -0700 Subject: [PATCH 080/150] OSDMonitor: be a little nicer about letting users do pg splitting We were previously blocking pg splits whenever pg creations were in- progress, but we only really need to avoid splitting any pgs which are currently being created. Let the user set a different pg_num if there are no creating PGs on the pool in question. Fixes: #6673, take two Signed-off-by: Greg Farnum --- src/mon/OSDMonitor.cc | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index d56953ba06991..07775fce2bf9a 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -2781,10 +2781,15 @@ int OSDMonitor::prepare_command_pool_set(map &cmdmap, } if (n <= (int)p.get_pg_num()) { ss << "specified pg_num " << n << " <= current " << p.get_pg_num(); - } else if (!mon->pgmon()->pg_map.creating_pgs.empty()) { - ss << "currently creating pgs, wait"; - return -EAGAIN; } else { + for(set::iterator i = mon->pgmon()->pg_map.creating_pgs.begin(); + i != mon->pgmon()->pg_map.creating_pgs.end(); + ++i) { + if (i->m_pool == static_cast(pool)) { + ss << "currently creating pgs, wait"; + return -EAGAIN; + } + } p.set_pg_num(n); ss << "set pool " << pool << " pg_num to " << n; } @@ -2797,10 +2802,15 @@ int OSDMonitor::prepare_command_pool_set(map &cmdmap, ss << "specified pgp_num must > 0, but you set to " << n; } else if (n > (int)p.get_pg_num()) { ss << "specified pgp_num " << n << " > pg_num " << p.get_pg_num(); - } else if (!mon->pgmon()->pg_map.creating_pgs.empty()) { - ss << "still creating pgs, wait"; - return -EAGAIN; } else { + for(set::iterator i = mon->pgmon()->pg_map.creating_pgs.begin(); + i != mon->pgmon()->pg_map.creating_pgs.end(); + ++i) { + if (i->m_pool == static_cast(pool)) { + ss << "currently creating pgs, wait"; + return -EAGAIN; + } + } p.set_pgp_num(n); ss << "set pool " << pool << " pgp_num to " << n; } From 4032501eb60dd9de290113c04fa7daad272b96f9 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 31 Oct 2013 09:49:09 -0700 Subject: [PATCH 081/150] mon/OSDMonitor: refix warning mon/OSDMonitor.cc: In member function 'int OSDMonitor::_prepare_rename_pool(int64_t, std::string)': mon/OSDMonitor.cc:4370:55: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] Two fixes for this crossed paths in 0c186096bb9534165394046fd8dd914e1be44094 and 2181b4c94696432814fea828a7efa54586b324a4 Signed-off-by: Sage Weil --- src/mon/OSDMonitor.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index c46fa5215d4f6..6c4eff5fffbad 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -4367,7 +4367,7 @@ int OSDMonitor::_prepare_rename_pool(int64_t pool, string newname) for (map::iterator p = pending_inc.new_pool_names.begin(); p != pending_inc.new_pool_names.end(); ++p) { - if (p->second == newname && (uint64_t)p->first != pool) { + if (p->second == newname && p->first != pool) { return -EEXIST; } } From cbc15bfcac363ac9356c71464fafa42b730ccba5 Mon Sep 17 00:00:00 2001 From: Loic Dachary Date: Tue, 29 Oct 2013 15:36:31 +0100 Subject: [PATCH 082/150] doc: fix typo in openstack radosgw integration s/type-object store/type object-store/ Signed-off-by: Loic Dachary Reviewed-by: Josh Durgin --- doc/radosgw/config.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/radosgw/config.rst b/doc/radosgw/config.rst index caa3dac15e145..5cf437dc72d18 100644 --- a/doc/radosgw/config.rst +++ b/doc/radosgw/config.rst @@ -399,7 +399,7 @@ according to the ``rgw keystone accepted roles`` configurable. Keystone itself needs to be configured to point to the Ceph Object Gateway as an object-storage endpoint:: - keystone service-create --name swift --type-object store + keystone service-create --name swift --type object-store keystone endpoint-create --service-id --publicurl http://radosgw.example.com/swift/v1 \ --internalurl http://radosgw.example.com/swift/v1 --adminurl http://radosgw.example.com/swift/v1 From c3c962eb7d2fb5ceea829924af08f8a1471f7acf Mon Sep 17 00:00:00 2001 From: Loic Dachary Date: Tue, 29 Oct 2013 16:13:56 +0100 Subject: [PATCH 083/150] doc: radosgw workaround for OpenStack Horizon bug Signed-off-by: Loic Dachary Reviewed-by: Josh Durgin --- doc/radosgw/manual-install.rst | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/doc/radosgw/manual-install.rst b/doc/radosgw/manual-install.rst index 6b9b7e59d1f35..0d63855ab1e33 100644 --- a/doc/radosgw/manual-install.rst +++ b/doc/radosgw/manual-install.rst @@ -46,6 +46,17 @@ You may also clone Ceph's Apache and FastCGI git repositories:: rgw print continue = false +OpenStack Horizon support +------------------------- + +As of `OpenStack Grizzly +`_ the `Horizon +`_ dashboard `does not send +Content-Length `_ +which will trigger a ``411 Length Required`` error from +libapache2-mod-fastcgi when uploading an object. The recommended +workaround is to install the package from the ceph repositories as +instructed above. Apache Configuration ==================== From 1bb5aadbca80eb46d5393bb1ad68af3da025e157 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 1 Nov 2013 16:45:01 -0700 Subject: [PATCH 084/150] upstart: fix ceph-crush-location default Behave if it is not specified on ceph.conf. (init-ceph also falls back to the default.) Fixes: #6698 Signed-off-by: Sage Weil --- src/upstart/ceph-osd.conf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/upstart/ceph-osd.conf b/src/upstart/ceph-osd.conf index a2f659460da78..91ac22c5188c2 100644 --- a/src/upstart/ceph-osd.conf +++ b/src/upstart/ceph-osd.conf @@ -19,6 +19,9 @@ pre-start script if [ "${update:-1}" = "1" -o "{$update:-1}" = "true" ]; then # update location in crush hook="$(ceph-conf --cluster=${cluster:-ceph} --name=osd.$id --lookup osd_crush_location_hook || :)" + if [ -z "$hook" ]; then + hook="/usr/bin/ceph-crush-location" + fi location="$($hook --cluster ${cluster:-ceph} --id $id --type osd)" weight="$(ceph-conf --cluster=${cluster:-ceph} --name=osd.$id --lookup osd_crush_initial_weight || :)" defaultweight=`df /var/lib/ceph/osd/${cluster:-ceph}-$id/ | tail -1 | awk '{ d= $2/1073741824 ; r = sprintf("%.2f", d); print r }'` From 2db20d972125032d52c345d4fd16cdd3947471e0 Mon Sep 17 00:00:00 2001 From: Josh Durgin Date: Fri, 1 Nov 2013 18:41:02 -0700 Subject: [PATCH 085/150] qa: don't run racy xfstest 008 This test attempts to generate a random number of holes within a particular range, but may fail because hole placement is random. Signed-off-by: Josh Durgin --- qa/run_xfstests.sh | 5 ++++- qa/run_xfstests_qemu.sh | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/qa/run_xfstests.sh b/qa/run_xfstests.sh index f9c3e55a79d60..3f5e2eca9f507 100644 --- a/qa/run_xfstests.sh +++ b/qa/run_xfstests.sh @@ -48,7 +48,7 @@ XFS_MKFS_OPTIONS="-l su=32k" # Override the default test list with a list of tests known to pass # 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="1-7 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 182 184 187-190 192 194" TESTS="${TESTS} 196 199 201 203 214-216 220-227 234 236-238 241 243-249" @@ -59,6 +59,9 @@ TESTS="${TESTS} 253 257-259 261 262 269 273 275 277 278 280 285 286" ###### # Some explanation of why tests have been excluded above: # +# Test 008 was pulled because it contained a race condition leading to +# spurious failures. +# # Test 049 was pulled because it caused a kernel fault. # http://tracker.newdream.net/issues/2260 # Test 232 was pulled because it caused an XFS error diff --git a/qa/run_xfstests_qemu.sh b/qa/run_xfstests_qemu.sh index 919e46a4d59fc..9dcced7edab38 100644 --- a/qa/run_xfstests_qemu.sh +++ b/qa/run_xfstests_qemu.sh @@ -7,4 +7,4 @@ chmod +x run_xfstests.sh # tests excluded fail in the current testing vm regardless of whether # rbd is used -./run_xfstests.sh -c 1 -f xfs -t /dev/vdb -s /dev/vdc 1-17 19-26 28-49 51-61 63 66-67 69-79 83 85-105 108-110 112-135 137-170 174-191 193-204 206-217 220-227 230-231 233 235-241 243-249 251-262 264-278 281-286 288-289 +./run_xfstests.sh -c 1 -f xfs -t /dev/vdb -s /dev/vdc 1-7 9-17 19-26 28-49 51-61 63 66-67 69-79 83 85-105 108-110 112-135 137-170 174-191 193-204 206-217 220-227 230-231 233 235-241 243-249 251-262 264-278 281-286 288-289 From fb0f1986449b53908a6d17d4398270da64aa8f07 Mon Sep 17 00:00:00 2001 From: Josh Durgin Date: Fri, 1 Nov 2013 19:02:29 -0700 Subject: [PATCH 086/150] rbd: omit 'rw' option during map The ro and rw options were added in linux 3.7. To be compatible with older kernels, don't specify rw. The default will probably always be rw, so this should not present any problems in the future. Reported-by: nicolasc Signed-off-by: Josh Durgin --- src/rbd.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/rbd.cc b/src/rbd.cc index 147eb2c5138e9..41cd243735520 100644 --- a/src/rbd.cc +++ b/src/rbd.cc @@ -1643,12 +1643,12 @@ static int do_kernel_add(const char *poolname, const char *imgname, } if (read_only) - oss << " ro"; + oss << " ro,"; else - oss << " rw"; + oss << " "; const char *user = g_conf->name.get_id().c_str(); - oss << ",name=" << user; + oss << "name=" << user; char key_name[strlen(user) + strlen("client.") + 1]; snprintf(key_name, sizeof(key_name), "client.%s", user); From 09e159719b3c8867266d73cc83bdb4b6b52c1f38 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 1 Nov 2013 23:56:45 -0700 Subject: [PATCH 087/150] mon/PGMap: use const ref, not pass-by-value Signed-off-by: Sage Weil --- src/mon/PGMap.cc | 6 +++--- src/mon/PGMap.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/mon/PGMap.cc b/src/mon/PGMap.cc index ab4c885df4c02..2ba8402b34f60 100644 --- a/src/mon/PGMap.cc +++ b/src/mon/PGMap.cc @@ -787,7 +787,7 @@ void PGMap::print_osd_perf_stats(std::ostream *ss) const } void PGMap::recovery_summary(Formatter *f, ostream *out, - pool_stat_t delta_sum) const + const pool_stat_t& delta_sum) const { bool first = true; if (delta_sum.stats.sum.num_objects_degraded) { @@ -825,7 +825,7 @@ void PGMap::recovery_summary(Formatter *f, ostream *out, } void PGMap::recovery_rate_summary(Formatter *f, ostream *out, - pool_stat_t delta_sum, + const pool_stat_t& delta_sum, utime_t delta_stamp) const { // make non-negative; we can get negative values if osds send @@ -886,7 +886,7 @@ void PGMap::pool_recovery_summary(Formatter *f, ostream *out, } void PGMap::client_io_rate_summary(Formatter *f, ostream *out, - pool_stat_t delta_sum, + const pool_stat_t& delta_sum, utime_t delta_stamp) const { pool_stat_t pos_delta = delta_sum; diff --git a/src/mon/PGMap.h b/src/mon/PGMap.h index c8ce7fd973eba..8a931ecbcca67 100644 --- a/src/mon/PGMap.h +++ b/src/mon/PGMap.h @@ -244,12 +244,12 @@ class PGMap { void print_osd_perf_stats(std::ostream *ss) const; void recovery_summary(Formatter *f, ostream *out, - pool_stat_t delta_sum) const; + const pool_stat_t& delta_sum) const; void overall_recovery_summary(Formatter *f, ostream *out) const; void pool_recovery_summary(Formatter *f, ostream *out, uint64_t poolid) const; void recovery_rate_summary(Formatter *f, ostream *out, - pool_stat_t delta_sum, + const pool_stat_t& delta_sum, utime_t delta_stamp) const; void overall_recovery_rate_summary(Formatter *f, ostream *out) const; void pool_recovery_rate_summary(Formatter *f, ostream *out, @@ -259,7 +259,7 @@ class PGMap { * given @p delta_sum pool over a given @p delta_stamp period of time. */ void client_io_rate_summary(Formatter *f, ostream *out, - pool_stat_t delta_sum, + const pool_stat_t& delta_sum, utime_t delta_stamp) const; /** * Obtain a formatted/plain output for the overall client I/O, which is From c0bcdc37028d2582ef1a475ec957db509e4c2786 Mon Sep 17 00:00:00 2001 From: Xing Lin Date: Sat, 2 Nov 2013 19:24:22 -0600 Subject: [PATCH 088/150] osd/erasurecode: correct one variable name in jerasure_matrix_to_bitmatrix() When bitmatrix is NULL, this function returns NULL. Signed-off-by: Xing Lin Reviewed-by: Sage Weil --- src/osd/ErasureCodePluginJerasure/jerasure.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osd/ErasureCodePluginJerasure/jerasure.c b/src/osd/ErasureCodePluginJerasure/jerasure.c index 9efae02e5fb21..d5752a8ee517b 100755 --- a/src/osd/ErasureCodePluginJerasure/jerasure.c +++ b/src/osd/ErasureCodePluginJerasure/jerasure.c @@ -276,7 +276,7 @@ int *jerasure_matrix_to_bitmatrix(int k, int m, int w, int *matrix) int rowelts, rowindex, colindex, elt, i, j, l, x; bitmatrix = talloc(int, k*m*w*w); - if (matrix == NULL) { return NULL; } + if (bitmatrix == NULL) { return NULL; } rowelts = k * w; rowindex = 0; From 96f4607bb09da02fdb2e29164a29e95bb7917176 Mon Sep 17 00:00:00 2001 From: Xing Lin Date: Sun, 3 Nov 2013 00:05:58 -0600 Subject: [PATCH 089/150] test/libcephfs: free cmount after tests finishes unmount and release cmount at the end of tests Signed-off-by: Xing Lin Reviewed-by: Sage Weil --- src/test/libcephfs/readdir_r_cb.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/test/libcephfs/readdir_r_cb.cc b/src/test/libcephfs/readdir_r_cb.cc index 788260b3e0ffd..4a99f102da221 100644 --- a/src/test/libcephfs/readdir_r_cb.cc +++ b/src/test/libcephfs/readdir_r_cb.cc @@ -54,4 +54,8 @@ TEST(LibCephFS, ReaddirRCB) { ASSERT_LE(0, ceph_opendir(cmount, c_dir, &dirp)); ASSERT_EQ(5, ceph_getdnames(cmount, dirp, buf, 6)); ASSERT_EQ(4, ceph_getdnames(cmount, dirp, buf, 6)); + + // free cmount after finishing testing + ASSERT_EQ(0, ceph_unmount(cmount)); + ASSERT_EQ(0, ceph_release(cmount)); } From 41e052dc200ac0fd06785f006a24435101465852 Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Mon, 4 Nov 2013 06:18:45 -0800 Subject: [PATCH 090/150] Revert "fix -Wgnu-designator warnings" Struct initialization using dot notation as in C99, but that happens to not be valid C++, although apparently in C++11 it is valid. We'll need a way to keep clang from throwing warnings at this initialization style, either using some macros to detect the comiler environment, or perhaps moving struct initialization to a C file rather than C++. This reverts commit 6efc2b54d5ce85fcb4b66237b051bcbb5072e6a3. Signed-off-by: Noah Watkins --- src/client/fuse_ll.cc | 84 +++++++++++++++++++++---------------------- src/common/config.cc | 14 ++++---- 2 files changed, 49 insertions(+), 49 deletions(-) diff --git a/src/client/fuse_ll.cc b/src/client/fuse_ll.cc index 60cdf5a19152a..88f727e454ee4 100644 --- a/src/client/fuse_ll.cc +++ b/src/client/fuse_ll.cc @@ -595,53 +595,53 @@ static void do_init(void *data, fuse_conn_info *bar) } const static struct fuse_lowlevel_ops fuse_ll_oper = { - .init = do_init, - .destroy = 0, - .lookup = fuse_ll_lookup, - .forget = fuse_ll_forget, - .getattr = fuse_ll_getattr, - .setattr = fuse_ll_setattr, - .readlink = fuse_ll_readlink, - .mknod = fuse_ll_mknod, - .mkdir = fuse_ll_mkdir, - .unlink = fuse_ll_unlink, - .rmdir = fuse_ll_rmdir, - .symlink = fuse_ll_symlink, - .rename = fuse_ll_rename, - .link = fuse_ll_link, - .open = fuse_ll_open, - .read = fuse_ll_read, - .write = fuse_ll_write, - .flush = fuse_ll_flush, - .release = fuse_ll_release, - .fsync = fuse_ll_fsync, - .opendir = fuse_ll_opendir, - .readdir = fuse_ll_readdir, - .releasedir = fuse_ll_releasedir, - .fsyncdir = 0, - .statfs = fuse_ll_statfs, - .setxattr = fuse_ll_setxattr, - .getxattr = fuse_ll_getxattr, - .listxattr = fuse_ll_listxattr, - .removexattr = fuse_ll_removexattr, - .access = 0, - .create = fuse_ll_create, - .getlk = 0, - .setlk = 0, - .bmap = 0, + init: do_init, + destroy: 0, + lookup: fuse_ll_lookup, + forget: fuse_ll_forget, + getattr: fuse_ll_getattr, + setattr: fuse_ll_setattr, + readlink: fuse_ll_readlink, + mknod: fuse_ll_mknod, + mkdir: fuse_ll_mkdir, + unlink: fuse_ll_unlink, + rmdir: fuse_ll_rmdir, + symlink: fuse_ll_symlink, + rename: fuse_ll_rename, + link: fuse_ll_link, + open: fuse_ll_open, + read: fuse_ll_read, + write: fuse_ll_write, + flush: fuse_ll_flush, + release: fuse_ll_release, + fsync: fuse_ll_fsync, + opendir: fuse_ll_opendir, + readdir: fuse_ll_readdir, + releasedir: fuse_ll_releasedir, + fsyncdir: 0, + statfs: fuse_ll_statfs, + setxattr: fuse_ll_setxattr, + getxattr: fuse_ll_getxattr, + listxattr: fuse_ll_listxattr, + removexattr: fuse_ll_removexattr, + access: 0, + create: fuse_ll_create, + getlk: 0, + setlk: 0, + bmap: 0, #if FUSE_VERSION >= FUSE_MAKE_VERSION(2, 8) #ifdef FUSE_IOCTL_COMPAT - .ioctl = fuse_ll_ioctl, + ioctl: fuse_ll_ioctl, #else - .ioctl = 0, + ioctl: 0, #endif - .poll = 0, + poll: 0, #if FUSE_VERSION > FUSE_MAKE_VERSION(2, 9) - .write_buf = 0, - .retrieve_reply = 0, - .forget_multi = 0, - .flock = 0, - .fallocate = fuse_ll_fallocate + write_buf: 0, + retrieve_reply: 0, + forget_multi: 0, + flock: 0, + fallocate: fuse_ll_fallocate #endif #endif }; diff --git a/src/common/config.cc b/src/common/config.cc index ddbb8b3c8c479..5c64f4ec1517c 100644 --- a/src/common/config.cc +++ b/src/common/config.cc @@ -58,13 +58,13 @@ const char *CEPH_CONF_FILE_DEFAULT = "/etc/ceph/$cluster.conf, ~/.ceph/$cluster. // file layouts struct ceph_file_layout g_default_file_layout = { - .fl_stripe_unit = init_le32(1<<22), - .fl_stripe_count = init_le32(1), - .fl_object_size = init_le32(1<<22), - .fl_cas_hash = init_le32(0), - .fl_object_stripe_unit = init_le32(0), - .fl_unused = init_le32(-1), - .fl_pg_pool = init_le32(-1), + fl_stripe_unit: init_le32(1<<22), + fl_stripe_count: init_le32(1), + fl_object_size: init_le32(1<<22), + fl_cas_hash: init_le32(0), + fl_object_stripe_unit: init_le32(0), + fl_unused: init_le32(-1), + fl_pg_pool : init_le32(-1), }; #define _STR(x) #x From 75b4b47046ad40ca87cbd26cac3ce81e652099ae Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Mon, 4 Nov 2013 09:54:58 -0800 Subject: [PATCH 091/150] doc: Implemented changes suggested from feedback. Signed-off-by: John Wilkins --- doc/radosgw/federated-config.rst | 160 ++++++++++++++++--------------- 1 file changed, 83 insertions(+), 77 deletions(-) diff --git a/doc/radosgw/federated-config.rst b/doc/radosgw/federated-config.rst index 69d1a968defe7..67c5c89d2d3c0 100644 --- a/doc/radosgw/federated-config.rst +++ b/doc/radosgw/federated-config.rst @@ -63,7 +63,6 @@ This section provides an exemplary procedure for setting up a region, and two zones within the region. The cluster will comprise two gateway daemon instances--one per zone. This region will serve as the master region. -.. image:: ../images/zone-sync.png Naming for the Master Region ---------------------------- @@ -533,71 +532,6 @@ to the domain name should return the following: -Replicate Data --------------- - -The data synchronization agent replicates the data of a master zone to a -secondary zone. The master zone of a region is the source for the secondary zone -of the region and it gets selected automatically. - -To configure the synchronization agent, retrieve the access key and secret for -the source and destination, and the destination URL and port. - -You may use ``radosgw-admin zone list`` to get a list of zone names. You -may use ``radosgw-admin zone get`` to identify the key and secret for the -zone. You may refer to the gateway configuration file you created under -`Create a Gateway Configuration`_ to identify the port number. - -You only need the hostname and port for a single instance (assuming all -gateway instances in a region/zone access the same Ceph Storage Cluster). -Specify these values in a configuration file -(e.g., ``cluster-data-sync.conf``), and include a ``log_file`` name. - - -For example: - -.. code-block:: ini - - src_access_key: {source-access-key} - src_secret_key: {source-secret-key} - destination: https://zone-name.fqdn.com:port - dest_access_key: {destination-access-key} - dest_secret_key: {destination-secret-key} - log_file: {log.filename} - -A concrete example may look like this: - -.. code-block:: ini - - src_access_key: DG8RE354EFPZBICHIAF0 - src_secret_key: i3U0HiRP8CXaBWrcF8bbh6CbsxGYuPPwRkixfFSb - destination: https://us-west.storage.net:80 - dest_access_key: U60RFI6B08F32T2PD30G - dest_secret_key: W3HuUor7Gl1Ee93pA2pq2wFk1JMQ7hTrSDecYExl - log_file: /var/log/radosgw/radosgw-sync-us-east-west.log - -To activate the data synchronization agent, open a terminal and -execute the following:: - - radosgw-agent -c region-data-sync.conf - -When the synchronization agent is running, you should see output -indicating that the agent is synchronizing shards of data. :: - - INFO:radosgw_agent.sync:Starting incremental sync - INFO:radosgw_agent.worker:17910 is processing shard number 0 - INFO:radosgw_agent.worker:shard 0 has 0 entries after '' - INFO:radosgw_agent.worker:finished processing shard 0 - INFO:radosgw_agent.worker:17910 is processing shard number 1 - INFO:radosgw_agent.sync:1/64 shards processed - INFO:radosgw_agent.worker:shard 1 has 0 entries after '' - INFO:radosgw_agent.worker:finished processing shard 1 - INFO:radosgw_agent.sync:2/64 shards processed - ... - -.. note:: You must have an agent for each source-destination pair. - - Configure a Secondary Region ============================ @@ -606,9 +540,6 @@ multiple regions. Configuring a cluster that spans regions requires maintaining a global namespace, so that there are no namespace clashes among object names stored across in different regions. -.. image:: ../images/region-zone-sync.png - :align: center - This section extends the procedure in `Configure a Master Region`_, but changes the region name and modifies a few procedures. See the following sections for details. @@ -699,16 +630,91 @@ with the following differences: #. `Start Gateway Instances`_. -Replicate Metadata ------------------- -Metadata consists of gateway users and buckets, but not the objects within -the buckets. +Multi-Site Data Replication +=========================== + +The data synchronization agent replicates the data of a master zone to a +secondary zone. The master zone of a region is the source for the secondary zone +of the region and it gets selected automatically. + +.. image:: ../images/zone-sync.png + +To configure the synchronization agent, retrieve the access key and secret for +the source and destination, and the destination URL and port. + +You may use ``radosgw-admin zone list`` to get a list of zone names. You +may use ``radosgw-admin zone get`` to identify the key and secret for the +zone. You may refer to the gateway configuration file you created under +`Create a Gateway Configuration`_ to identify the port number. + +You only need the hostname and port for a single instance (assuming all +gateway instances in a region/zone access the same Ceph Storage Cluster). +Specify these values in a configuration file +(e.g., ``cluster-data-sync.conf``), and include a ``log_file`` name. + + +For example: + +.. code-block:: ini + + src_access_key: {source-access-key} + src_secret_key: {source-secret-key} + destination: https://zone-name.fqdn.com:port + dest_access_key: {destination-access-key} + dest_secret_key: {destination-secret-key} + log_file: {log.filename} + +A concrete example may look like this: + +.. code-block:: ini + + src_access_key: DG8RE354EFPZBICHIAF0 + src_secret_key: i3U0HiRP8CXaBWrcF8bbh6CbsxGYuPPwRkixfFSb + destination: https://us-west.storage.net:80 + dest_access_key: U60RFI6B08F32T2PD30G + dest_secret_key: W3HuUor7Gl1Ee93pA2pq2wFk1JMQ7hTrSDecYExl + log_file: /var/log/radosgw/radosgw-sync-us-east-west.log + +To activate the data synchronization agent, open a terminal and +execute the following:: + + radosgw-agent -c region-data-sync.conf + +When the synchronization agent is running, you should see output +indicating that the agent is synchronizing shards of data. :: + + INFO:radosgw_agent.sync:Starting incremental sync + INFO:radosgw_agent.worker:17910 is processing shard number 0 + INFO:radosgw_agent.worker:shard 0 has 0 entries after '' + INFO:radosgw_agent.worker:finished processing shard 0 + INFO:radosgw_agent.worker:17910 is processing shard number 1 + INFO:radosgw_agent.sync:1/64 shards processed + INFO:radosgw_agent.worker:shard 1 has 0 entries after '' + INFO:radosgw_agent.worker:finished processing shard 1 + INFO:radosgw_agent.sync:2/64 shards processed + ... + +.. note:: You must have an agent for each source-destination pair. + + +Inter-Region Metadata Replication +================================= + +The data synchronization agent replicates the metadata of master zone in the +master region to a master zone in a secondary region. Metadata consists of +gateway users and buckets, but not the objects within the buckets--ensuring a +unified namespace across the cluster. The master zone of the master region is +the source for the master zone of the secondary region and it gets selected +automatically. + +.. image:: ../images/region-zone-sync.png + :align: center -`Replicate Data`_ by specifying the master zone of the master region as the -source zone and the master zone of the secondary region as the secondary -zone. When activating the ``radosgw-agent``, specify ``--metadata-only`` so -that it only copies metadata. For example:: +Follow the same steps in `Multi-Site Data Replication`_ by specifying the master +zone of the master region as the source zone and the master zone of the +secondary region as the secondary zone. When activating the ``radosgw-agent``, +specify ``--metadata-only`` so that it only copies metadata. For example:: radosgw-agent -c inter-region-data-sync.conf --metadata-only From 268785ff0c0fb861f2db47c7eae933f6528193df Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Sat, 20 Jul 2013 18:41:39 -0700 Subject: [PATCH 092/150] blkdev: support blkdev size query on osx Support OSX, add checks for platform specific headers. Signed-off-by: Noah Watkins --- src/common/blkdev.cc | 66 +++++++++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 25 deletions(-) diff --git a/src/common/blkdev.cc b/src/common/blkdev.cc index b0dc0a54e9e2f..9c7240c0aac6c 100644 --- a/src/common/blkdev.cc +++ b/src/common/blkdev.cc @@ -1,40 +1,56 @@ -#include "include/int_types.h" - -#include -#include #include #include -#include -#include -#include - -#include "acconfig.h" -#include "include/compat.h" +#include +#include "include/int_types.h" -#if defined(__FreeBSD__) -#include -#endif +#ifdef __linux__ +#include int get_block_device_size(int fd, int64_t *psize) { - int ret = 0; - -#if defined(__FreeBSD__) - ret = ::ioctl(fd, DIOCGMEDIASIZE, psize); -#elif defined(__linux__) #ifdef BLKGETSIZE64 - // ioctl block device - ret = ::ioctl(fd, BLKGETSIZE64, psize); + int ret = ::ioctl(fd, BLKGETSIZE64, psize); #elif BLKGETSIZE - // hrm, try the 32 bit ioctl? unsigned long sectors = 0; - ret = ::ioctl(fd, BLKGETSIZE, §ors); + int ret = ::ioctl(fd, BLKGETSIZE, §ors); *psize = sectors * 512ULL; -#endif #else -#error "Compile error: we don't know how to get the size of a raw block device." -#endif /* !__FreeBSD__ */ +# error "Linux configuration error (get_block_device_size)" +#endif if (ret < 0) ret = -errno; return ret; } + +#elif defined(__APPLE__) +#include + +int get_block_device_size(int fd, int64_t *psize) +{ + unsigned long blocksize = 0; + int ret = ::ioctl(fd, DKIOCGETBLOCKSIZE, &blocksize); + if (!ret) { + unsigned long nblocks; + ret = ::ioctl(fd, DKIOCGETBLOCKCOUNT, &nblocks); + if (!ret) + *psize = (int64_t)nblocks * blocksize; + } + if (ret < 0) + ret = -errno; + return ret; +} + +#elif defined(__FreeBSD__) +#include + +int get_block_device_size(int fd, int64_t *psize) +{ + int ret = ::ioctl(fd, DIOCGMEDIASIZE, psize); + if (ret < 0) + ret = -errno; + return ret; +} + +#else +# error "Unable to query block device size: unsupported platform, please report." +#endif From 324dd54534e41598feb6169f33cfed85495fa91f Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Mon, 4 Nov 2013 08:28:23 -0800 Subject: [PATCH 093/150] test: test helper for get_block_device_size This is the start of a potential unit test for get_block_device_size. An actual unit test will probably need to be run as root, and either find a device, have one specified, or create one (e.g. ramdisk) in a platform agnostic way. In the mean time, this tool can be run by hand, or called for a bash script. Signed-off-by: Noah Watkins --- src/test/Makefile.am | 4 ++++ src/test/test_get_blkdev_size.cc | 35 ++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 src/test/test_get_blkdev_size.cc diff --git a/src/test/Makefile.am b/src/test/Makefile.am index 228a26e2bdac7..da9f33b3d42d2 100644 --- a/src/test/Makefile.am +++ b/src/test/Makefile.am @@ -863,6 +863,10 @@ ceph_test_c_headers_SOURCES = test/test_c_headers.c ceph_test_c_headers_LDADD = $(LIBRADOS) $(LIBCEPHFS) bin_DEBUGPROGRAMS += ceph_test_c_headers +ceph_test_get_blkdev_size_SOURCES = test/test_get_blkdev_size.cc +ceph_test_get_blkdev_size_LDADD = $(LIBCOMMON) +bin_DEBUGPROGRAMS += ceph_test_get_blkdev_size + noinst_HEADERS += \ test/osd/RadosModel.h \ test/osd/Object.h \ diff --git a/src/test/test_get_blkdev_size.cc b/src/test/test_get_blkdev_size.cc new file mode 100644 index 0000000000000..ba28f1cd62f10 --- /dev/null +++ b/src/test/test_get_blkdev_size.cc @@ -0,0 +1,35 @@ +#include +#include +#include +#include +#include +#include +#include +#include "common/blkdev.h" + +int main(int argc, char **argv) +{ + int fd, ret; + int64_t size; + + if (argc != 2) { + fprintf(stderr, "usage: %s \n", argv[0]); + return -1; + } + + fd = open(argv[1], O_RDONLY); + if (fd < 0) { + perror("open"); + return -1; + } + + ret = get_block_device_size(fd, &size); + if (ret < 0) { + fprintf(stderr, "get_block_device_size: %s\n", strerror(-ret)); + return -1; + } + + fprintf(stdout, "%" PRId64, size); + + return 0; +} From 545135f3e1c75318940caa2c82ac32a53fc4f957 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Sat, 2 Nov 2013 13:54:51 -0700 Subject: [PATCH 094/150] ReplicatedPG::recover_backfill: adjust last_backfill to HEAD if snapdir Otherwise, if last_backfill_started is a snapdir, we will fail to send a transaction for a client IO creating the head object and removing the snapdir object. The result will be that head will eventually be backfilled, but the snapdir object will erroneously not be removed. Fixes: #6685 Signed-off-by: Samuel Just Reviewed-by: Greg Farnum --- src/common/hobject.h | 5 +++++ src/osd/ReplicatedPG.cc | 11 +++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/common/hobject.h b/src/common/hobject.h index edaf04a301fd6..87a2b1e8f6fe4 100644 --- a/src/common/hobject.h +++ b/src/common/hobject.h @@ -86,6 +86,11 @@ struct hobject_t { return ret; } + /// @return true if object is snapdir + bool is_snapdir() const { + return snap == CEPH_SNAPDIR; + } + /// @return snapdir version of this hobject_t hobject_t get_snapdir() const { hobject_t ret(*this); diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index ba6b7ecca7175..48040b68a882d 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -8151,6 +8151,17 @@ int ReplicatedPG::recover_backfill( assert(i->first > new_last_backfill); new_last_backfill = i->first; } + + /* If last_backfill is snapdir, we know that head necessarily cannot exist, + * therefore it's safe to bump the snap up to NOSNAP. This is necessary + * since we need avoid having SNAPDIR backfilled and HEAD not backfilled + * since a transaction on HEAD might change SNAPDIR + */ + if (new_last_backfill.is_snapdir()) + new_last_backfill = new_last_backfill.get_head(); + if (last_backfill_started.is_snapdir()) + last_backfill_started = last_backfill_started.get_head(); + assert(!pending_backfill_updates.empty() || new_last_backfill == last_backfill_started); if (pending_backfill_updates.empty() && From 9ab513334c7ff9544bac07bd420c6d5d200cf535 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Sun, 3 Nov 2013 11:06:10 -0800 Subject: [PATCH 095/150] OSD: don't clear peering_wait_for_split in advance_map() I really don't know why I added this... Ops can be discarded from the waiting_for_pg queue if we aren't primary simply because there must have been an exchange of peering events before subops will be sent within a particular epoch. Thus, any events in the waiting_for_pg queue must be client ops which should only be seen by the primary. Peering events, on the other hand, should only be discarded if we are in a new interval, and that check might as well be performed in the peering wq. Fixes: #6681 Signed-off-by: Samuel Just Reviewed-by: Greg Farnum --- src/osd/OSD.cc | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index eb5191f770e15..0a2d057df169a 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -5441,22 +5441,6 @@ void OSD::advance_map(ObjectStore::Transaction& t, C_Contexts *tfin) waiting_for_pg.erase(p++); } } - map >::iterator q = - peering_wait_for_split.begin(); - while (q != peering_wait_for_split.end()) { - pg_t pgid = q->first; - - // am i still primary? - vector acting; - int nrep = osdmap->pg_to_acting_osds(pgid, acting); - int role = osdmap->calc_pg_role(whoami, acting, nrep); - if (role >= 0) { - ++q; // still me - } else { - dout(10) << " discarding waiting ops for " << pgid << dendl; - peering_wait_for_split.erase(q++); - } - } } void OSD::consume_map() From cd0d612e1abdf5c87082eeeccd4ca09dd14fd737 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Sun, 3 Nov 2013 21:02:36 -0800 Subject: [PATCH 096/150] OSD: allow project_pg_history to handle a missing map If we get a peering message for an old map we don't have, we can throwit out: the sending OSD will learn about the newer maps and update itself accordingly, and we don't have the information to know if the message is valid. This situation can only happen if the sender was down for a long enough time to create a map gap and its PGs have not yet advanced from their boot-up maps to the current ones, so we can rely on it Fixes: #6712 Signed-off-by: Samuel Just Reviewed-by: Greg Farnum --- src/osd/OSD.cc | 35 +++++++++++++++++++++++++---------- src/osd/OSD.h | 8 ++++++-- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 0a2d057df169a..1a60de6bdfe03 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -2201,9 +2201,10 @@ void OSD::handle_pg_peering_evt( int role = osdmap->calc_pg_role(whoami, acting, acting.size()); pg_history_t history = info.history; - project_pg_history(info.pgid, history, epoch, up, acting); + bool valid_history = project_pg_history( + info.pgid, history, epoch, up, acting); - if (epoch < history.same_interval_since) { + if (!valid_history || epoch < history.same_interval_since) { dout(10) << "get_or_create_pg " << info.pgid << " acting changed in " << history.same_interval_since << " (msg from " << epoch << ")" << dendl; return; @@ -2388,7 +2389,7 @@ void OSD::calc_priors_during(pg_t pgid, epoch_t start, epoch_t end, set& ps * Fill in the passed history so you know same_interval_since, same_up_since, * and same_primary_since. */ -void OSD::project_pg_history(pg_t pgid, pg_history_t& h, epoch_t from, +bool OSD::project_pg_history(pg_t pgid, pg_history_t& h, epoch_t from, const vector& currentup, const vector& currentacting) { @@ -2402,7 +2403,11 @@ void OSD::project_pg_history(pg_t pgid, pg_history_t& h, epoch_t from, e > from; e--) { // verify during intermediate epoch (e-1) - OSDMapRef oldmap = get_map(e-1); + OSDMapRef oldmap = service.try_get_map(e-1); + if (!oldmap) { + dout(15) << __func__ << ": found map gap, returning false" << dendl; + return false; + } assert(oldmap->have_pg_pool(pgid.pool())); vector up, acting; @@ -2452,6 +2457,7 @@ void OSD::project_pg_history(pg_t pgid, pg_history_t& h, epoch_t from, } dout(15) << "project_pg_history end " << h << dendl; + return true; } // ------------------------------------- @@ -5919,7 +5925,12 @@ void OSD::handle_pg_create(OpRequestRef op) utime_t now = ceph_clock_now(NULL); history.last_scrub_stamp = now; history.last_deep_scrub_stamp = now; - project_pg_history(pgid, history, created, up, acting); + bool valid_history = + project_pg_history(pgid, history, created, up, acting); + /* the pg creation message must have come from a mon and therefore + * cannot be on the other side of a map gap + */ + assert(valid_history); // register. creating_pgs[pgid].history = history; @@ -6531,9 +6542,11 @@ void OSD::handle_pg_query(OpRequestRef op) // same primary? pg_history_t history = it->second.history; - project_pg_history(pgid, history, it->second.epoch_sent, up, acting); + bool valid_history = + project_pg_history(pgid, history, it->second.epoch_sent, up, acting); - if (it->second.epoch_sent < history.same_interval_since) { + if (!valid_history || + it->second.epoch_sent < history.same_interval_since) { dout(10) << " pg " << pgid << " dne, and pg has changed in " << history.same_interval_since << " (msg from " << it->second.epoch_sent << ")" << dendl; @@ -6597,9 +6610,11 @@ void OSD::handle_pg_remove(OpRequestRef op) pg_history_t history = pg->info.history; vector up, acting; osdmap->pg_to_up_acting_osds(pgid, up, acting); - project_pg_history(pg->info.pgid, history, pg->get_osdmap()->get_epoch(), - up, acting); - if (history.same_interval_since <= m->get_epoch()) { + bool valid_history = + project_pg_history(pg->info.pgid, history, pg->get_osdmap()->get_epoch(), + up, acting); + if (valid_history && + history.same_interval_since <= m->get_epoch()) { assert(pg->get_primary() == m->get_source().num()); PGRef _pg(pg); _remove_pg(pg); diff --git a/src/osd/OSD.h b/src/osd/OSD.h index f7559da3be53a..b9fb6153b1ad0 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -1191,8 +1191,12 @@ class OSD : public Dispatcher, void build_past_intervals_parallel(); void calc_priors_during(pg_t pgid, epoch_t start, epoch_t end, set& pset); - void project_pg_history(pg_t pgid, pg_history_t& h, epoch_t from, - const vector& lastup, const vector& lastacting); + + /// project pg history from from to now + bool project_pg_history( + pg_t pgid, pg_history_t& h, epoch_t from, + const vector& lastup, const vector& lastacting + ); ///< @return false if there was a map gap between from and now void wake_pg_waiters(pg_t pgid) { if (waiting_for_pg.count(pgid)) { From 2bf8ff4b688dffa14da2bd79a98e47d021145317 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Mon, 4 Nov 2013 12:50:30 -0800 Subject: [PATCH 097/150] doc: Added DNS and SSL dialog. Signed-off-by: John Wilkins --- doc/install/install-ceph-gateway.rst | 105 ++++++++++++++++++++++++++- 1 file changed, 104 insertions(+), 1 deletion(-) diff --git a/doc/install/install-ceph-gateway.rst b/doc/install/install-ceph-gateway.rst index bd41795136a54..047885f73ed0c 100644 --- a/doc/install/install-ceph-gateway.rst +++ b/doc/install/install-ceph-gateway.rst @@ -213,7 +213,106 @@ RPM-based Packages .. _Installing YUM Priorities: ../yum-priorities +Enable SSL +========== +Some REST clients use HTTPS by default. So you should consider enabling SSL +for Apache. Use the following procedures to enable SSL. + +.. note:: You can use self-certified certificates. Some client + APIs check for a trusted certificate authority. You may need to obtain + a SSL certificate from a trusted authority to use those client APIs. + + +Debian Packages +--------------- + +To enable SSL for Debian/Ubuntu systems, execute the following steps: + +#. Ensure that you have installed the dependencies. :: + + sudo apt-get install openssl ssl-cert + +#. Enable the SSL module. :: + + sudo a2enmod ssl + +#. Generate a certificate. :: + + sudo mkdir /etc/apache2/ssl + sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt + +#. Restart Apache. :: + + service apache2 restart + + +See the `Ubuntu Server Guide`_ for additional details. + + +RPM Packages +------------ + +To enable SSL for RPM-based systems, execute the following steps: + +#. Ensure that you have installed the dependencies. :: + + sudo yum install mod_ssl openssl + +#. Ensure the SSL module is enabled. + +#. Generate a certificate and copy it the appropriate locations. :: + + openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt + cp ca.crt /etc/pki/tls/certs + cp ca.key /etc/pki/tls/private/ca.key + cp ca.csr /etc/pki/tls/private/ca.csr + +#. Restart Apache. :: + + /etc/init.d/httpd restart + +See `Setting up an SSL secured Webserver with CentOS`_ for additional details. + + + +Add Wildcard to DNS +=================== + +To use Ceph with S3-style subdomains (e.g., ``bucket-name.domain-name.com``), +you need to add a wildcard to the DNS record of the DNS server you use with the +``radosgw`` daemon. + +.. tip:: The address of the DNS must also be specified in the Ceph + configuration file with the ``rgw dns name = {hostname}`` setting. + +For ``dnsmasq``, consider addding the following ``address`` setting with a dot +(.) prepended to the host name:: + + address=/.{hostname-or-fqdn}/{host-ip-address} + address=/.ceph-node/192.168.0.1 + +For ``bind``, consider adding the a wildcard to the DNS record:: + + $TTL 604800 + @ IN SOA ceph-node. root.ceph-node. ( + 2 ; Serial + 604800 ; Refresh + 86400 ; Retry + 2419200 ; Expire + 604800 ) ; Negative Cache TTL + ; + @ IN NS ceph-node. + @ IN A 192.168.122.113 + * IN CNAME @ + +Restart your DNS server and ping your server with a subdomain to +ensure that your Ceph Object Store ``radosgw`` daemon can process +the subdomain requests. :: + + ping mybucket.{fqdn} + ping mybucket.ceph-node + Install Ceph Object Gateway =========================== @@ -251,4 +350,8 @@ following:: To install the Ceph Object Gateway synchronization agent, execute the following:: - yum install radosgw-agent \ No newline at end of file + yum install radosgw-agent + + +.. _Ubuntu Server Guide: https://help.ubuntu.com/12.04/serverguide/httpd.html +.. _Setting up an SSL secured Webserver with CentOS: http://wiki.centos.org/HowTos/Https From 330a6a769b2f104a420b1713a4b5b2e931308104 Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Sat, 20 Jul 2013 18:41:39 -0700 Subject: [PATCH 098/150] wbthrottle: use posix_fadvise if available Only adding information about data usage. This won't effect correctness. Signed-off-by: Noah Watkins --- configure.ac | 1 + src/os/WBThrottle.cc | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/configure.ac b/configure.ac index 66d8f2161c990..86a5eee45f6ce 100644 --- a/configure.ac +++ b/configure.ac @@ -539,6 +539,7 @@ AC_CHECK_FUNC([fallocate], AC_CHECK_HEADERS([sys/prctl.h]) AC_CHECK_FUNCS([prctl]) AC_CHECK_FUNCS([pipe2]) +AC_CHECK_FUNCS([posix_fadvise]) # Checks for typedefs, structures, and compiler characteristics. #AC_HEADER_STDBOOL diff --git a/src/os/WBThrottle.cc b/src/os/WBThrottle.cc index e02c17677bbde..9430c4fd3cde4 100644 --- a/src/os/WBThrottle.cc +++ b/src/os/WBThrottle.cc @@ -1,6 +1,8 @@ // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- // vim: ts=8 sw=2 smarttab +#include "acconfig.h" + #include "os/WBThrottle.h" #include "common/perf_counters.h" @@ -146,8 +148,10 @@ void *WBThrottle::entry() clearing = wb.get<0>(); lock.Unlock(); ::fdatasync(**wb.get<1>()); +#ifdef HAVE_POSIX_FADVISE if (wb.get<2>().nocache) posix_fadvise(**wb.get<1>(), 0, 0, POSIX_FADV_DONTNEED); +#endif lock.Lock(); clearing = ghobject_t(); cur_ios -= wb.get<2>().ios; From 6821a6e83ab2c68c895d807f0b2f6f00aa6667ac Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Sat, 20 Jul 2013 18:41:38 -0700 Subject: [PATCH 099/150] assert: use feature test for static_cast Signed-off-by: Noah Watkins --- configure.ac | 2 ++ m4/ax_cxx_static_cast.m4 | 43 ++++++++++++++++++++++++++++++++++++++++ src/include/assert.h | 2 +- 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 m4/ax_cxx_static_cast.m4 diff --git a/configure.ac b/configure.ac index 66d8f2161c990..641bc93fac366 100644 --- a/configure.ac +++ b/configure.ac @@ -113,6 +113,8 @@ AM_CONDITIONAL([ENABLE_FPU_NEON], [case $target_cpu in arm*) true;; *) false;; e AX_CHECK_COMPILE_FLAG([-fvar-tracking-assignments], [HAS_VTA_SUPPORT=1], [HAS_VTA_SUPPORT=0]) AM_CONDITIONAL(COMPILER_HAS_VTA, [test "$HAS_VTA_SUPPORT" = 1]) +AX_CXX_STATIC_CAST + # Checks for libraries. ACX_PTHREAD AC_CHECK_LIB([uuid], [uuid_parse], [true], AC_MSG_FAILURE([libuuid not found])) diff --git a/m4/ax_cxx_static_cast.m4 b/m4/ax_cxx_static_cast.m4 new file mode 100644 index 0000000000000..e09e6c46cb2da --- /dev/null +++ b/m4/ax_cxx_static_cast.m4 @@ -0,0 +1,43 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_cxx_static_cast.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CXX_STATIC_CAST +# +# DESCRIPTION +# +# If the compiler supports static_cast<>, define HAVE_STATIC_CAST. +# +# LICENSE +# +# Copyright (c) 2008 Todd Veldhuizen +# Copyright (c) 2008 Luc Maisonobe +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 6 + +AU_ALIAS([AC_CXX_STATIC_CAST], [AX_CXX_STATIC_CAST]) +AC_DEFUN([AX_CXX_STATIC_CAST], +[AC_CACHE_CHECK(whether the compiler supports static_cast<>, +ax_cv_cxx_static_cast, +[AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([#include +class Base { public : Base () {} virtual void f () = 0; }; +class Derived : public Base { public : Derived () {} virtual void f () {} }; +int g (Derived&) { return 0; }],[ +Derived d; Base& b = d; Derived& s = static_cast (b); return g (s);], + ax_cv_cxx_static_cast=yes, ax_cv_cxx_static_cast=no) + AC_LANG_RESTORE +]) +if test "$ax_cv_cxx_static_cast" = yes; then + AC_DEFINE(HAVE_STATIC_CAST,, + [define if the compiler supports static_cast<>]) +fi +]) diff --git a/src/include/assert.h b/src/include/assert.h index 38c0eeb44a1ea..15952e50b710d 100644 --- a/src/include/assert.h +++ b/src/include/assert.h @@ -27,7 +27,7 @@ struct FailedAssertion { #endif -#if defined __cplusplus && __GNUC_PREREQ (2,95) +#ifdef HAVE_STATIC_CAST # define __CEPH_ASSERT_VOID_CAST static_cast #else # define __CEPH_ASSERT_VOID_CAST (void) From d03924ca609becf6959022fdbbad7420edeb26c1 Mon Sep 17 00:00:00 2001 From: Danny Al-Gaaf Date: Mon, 4 Nov 2013 23:30:47 +0100 Subject: [PATCH 100/150] galois.c: fix compiler warning galois_create_split_w8_tables() takes no parameter, remove '8' passed to the function in one case. osd/ErasureCodePluginJerasure/galois.c: In function 'galois_w32_region_multiply': osd/ErasureCodePluginJerasure/galois.c:696:5: warning: call to function 'galois_create_split_w8_tables' without a real prototype [-Wunprototyped-calls] In file included from osd/ErasureCodePluginJerasure/galois.c:53:0: osd/ErasureCodePluginJerasure/galois.h:71:12: note: 'galois_create_split_w8_tables' was declared here Signed-off-by: Danny Al-Gaaf --- src/osd/ErasureCodePluginJerasure/galois.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osd/ErasureCodePluginJerasure/galois.c b/src/osd/ErasureCodePluginJerasure/galois.c index be8be59affa0c..0de6fbd334cfe 100755 --- a/src/osd/ErasureCodePluginJerasure/galois.c +++ b/src/osd/ErasureCodePluginJerasure/galois.c @@ -693,7 +693,7 @@ void galois_w32_region_multiply(char *region, /* Region to multiply */ nbytes /= sizeof(int); if (galois_split_w8[0]== NULL) { - if (galois_create_split_w8_tables(8) < 0) { + if (galois_create_split_w8_tables() < 0) { fprintf(stderr, "galois_32_region_multiply -- couldn't make split multiplication tables\n"); exit(1); } From 2aa6cde56d6f5d94d3724ceb0eaa6fbd8b00579c Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Mon, 4 Nov 2013 14:57:07 -0800 Subject: [PATCH 101/150] doc: Changed text for ceph-extras. Made it required. Mentioned newer versions. Signed-off-by: John Wilkins --- doc/install/get-packages.rst | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/doc/install/get-packages.rst b/doc/install/get-packages.rst index df017d3d0b071..0854253f3fbe2 100644 --- a/doc/install/get-packages.rst +++ b/doc/install/get-packages.rst @@ -37,11 +37,14 @@ also add keys and recommended packages. releases (common) and one for development (programmers and QA only). Choose the key that suits your needs. See `Add Keys`_ for details. -- **Ceph Extras: (Recommended)** The Ceph Extras repository contains a number - of enabling packages such as ``ceph-deploy``, QEMU for CentOS/RHEL - distribution, and iSCSI among others. If you intend to use any of the +- **Ceph Extras: (Required)** The Ceph Extras repository provides newer + Ceph-enabled versions of packages which are already provided in your Linux + distribution, but where newer versions are required to support Ceph. Examples + of newer versions of available packages include QEMU for CentOS/RHEL + distribution and iSCSI among others. If you intend to use any of the foregoing packages, you must add the Ceph Extras repository or download the - packages manually. See `Add Ceph Extras`_ for details. + packages manually. This repository also contains Ceph dependencies for those + who intend to install Ceph manually. See `Add Ceph Extras`_ for details. - **Ceph: (Required)** All Ceph deployments require Ceph release packages, except for deployments that use development packages (development, QA, and @@ -104,10 +107,12 @@ To install the ``autobuild.asc`` key, execute the following Add Ceph Extras =============== -Some Ceph deployments require additional Ceph packages. Ceph Extras contains -packages for ``curl``, ``leveldb``, ``ceph-deploy``, the SCSI target framework -and even some QEMU packages for RPMs. Add the Ceph Extras repository to ensure -you obtain these additional packages from the Ceph repository. +Some Ceph deployments require newer Ceph-enabled versions of packages that are +already available in your Linux distribution. For example, Ceph Extras contains +newer Ceph-enabled packages for the SCSI target framework and QEMU packages for +RPMs. The repository also contains ``curl``, ``leveldb`` and other Ceph +dependencies. Add the Ceph Extras repository to ensure you obtain these +additional packages from the Ceph repository. Debian Packages From 195e86134de5b46651677cfb6858d5708c28e93e Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Mon, 4 Nov 2013 14:57:41 -0800 Subject: [PATCH 102/150] doc: Mentioned that install procedure is for manual deployments, not ceph-deploy or others. Signed-off-by: John Wilkins --- doc/install/install-storage-cluster.rst | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/doc/install/install-storage-cluster.rst b/doc/install/install-storage-cluster.rst index 94cddf08b1dc9..873e3f4594a88 100644 --- a/doc/install/install-storage-cluster.rst +++ b/doc/install/install-storage-cluster.rst @@ -2,6 +2,14 @@ Install Ceph Storage Cluster ============================== +This guide describes installing Ceph packages manually. This procedure +is only for users who are not installing with a deployment tool such as +``ceph-deploy``, ``chef``, ``juju``, etc. + +.. tip:: You can also use ``ceph-deploy`` to install Ceph packages, which may + be more convenient since you can install ``ceph`` on multiple hosts with + a single command. + Installing with APT =================== @@ -11,8 +19,7 @@ update APT's database and install Ceph:: sudo apt-get update && sudo apt-get install ceph ceph-mds - - + Installing with RPM =================== @@ -25,9 +32,6 @@ Once you have added either release or development packages, or added a sudo yum install ceph -.. note:: You can also use ``ceph-deploy`` to install Ceph packages. - - Installing a Build ================== From 917dd716ae57f8a74d0054640acb90e81f0b2059 Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Mon, 4 Nov 2013 15:11:05 -0800 Subject: [PATCH 103/150] doc: Deleted old manual install doc. Signed-off-by: John Wilkins --- doc/radosgw/manual-install.rst | 132 --------------------------------- 1 file changed, 132 deletions(-) delete mode 100644 doc/radosgw/manual-install.rst diff --git a/doc/radosgw/manual-install.rst b/doc/radosgw/manual-install.rst deleted file mode 100644 index 6b9b7e59d1f35..0000000000000 --- a/doc/radosgw/manual-install.rst +++ /dev/null @@ -1,132 +0,0 @@ -===================================== - Install Apache, FastCGI and Gateway -===================================== - -Install Packages -================ - -To install Ceph Object Gateway, you must install Apache and FastCGI first. :: - - sudo apt-get update && sudo apt-get install apache2 libapache2-mod-fastcgi - - -100-Continue Support --------------------- - -The Ceph community provides a slightly optimized version of the ``apache2`` -and ``fastcgi`` packages. The material difference is that the Ceph packages are -optimized for the ``100-continue`` HTTP response, where the server determines -if it will accept the request by first evaluating the request header. See `RFC -2616, Section 8`_ for details on ``100-continue``. You can find the Apache and -FastCGI packages modified for Ceph here: - -- `Apache Oneiric`_ -- `Apache Precise`_ -- `Apache Quantal for ARM (Calxeda)`_ -- `FastCGI Oneric`_ -- `FastCGI Precise`_ -- `FastCGI Quantal for ARM (Calxeda)`_ - -You may also clone Ceph's Apache and FastCGI git repositories:: - - git clone --recursive https://github.com/ceph/mod_fastcgi.git - git clone --recursive https://github.com/ceph/apache2.git - -.. _Apache Oneiric: http://gitbuilder.ceph.com/apache2-deb-oneiric-x86_64-basic/ -.. _Apache Precise: http://gitbuilder.ceph.com/apache2-deb-precise-x86_64-basic/ -.. _Apache Quantal for ARM (Calxeda): http://gitbuilder.ceph.com/apache2-deb-quantal-arm7l-basic/ -.. _FastCGI Oneric: http://gitbuilder.ceph.com/libapache-mod-fastcgi-deb-oneiric-x86_64-basic/ -.. _FastCGI Precise: http://gitbuilder.ceph.com/libapache-mod-fastcgi-deb-precise-x86_64-basic/ -.. _FastCGI Quantal for ARM (Calxeda): http://gitbuilder.ceph.com/libapache-mod-fastcgi-deb-quantal-arm7l-basic/ -.. _RFC 2616, Section 8: http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html - -.. important:: If you do NOT use a modified fastcgi as described above, - you should disable 100-Continue support by adding the following to - your ``ceph.conf``:: - - rgw print continue = false - - -Apache Configuration -==================== - -Enable the URL rewrite modules for Apache and FastCGI. For example:: - - sudo a2enmod rewrite - sudo a2enmod fastcgi - -By default, the ``/etc/apache2/httpd.conf`` or ``/etc/apache2/apache2.conf`` -file is blank. Add a line for the ``ServerName`` and provide the fully -qualified domain name of the host where you will install the Ceph Object -Gateway. For example:: - - ServerName {fqdn} - -Restart Apache so that the foregoing changes take effect. :: - - sudo service apache2 restart - -Then, install Ceph Object Gateway and its sync agent. For example:: - - sudo apt-get install radosgw radosgw-agent - - -Enable SSL ----------- - -Some REST clients use HTTPS by default. So you should consider enabling SSL -for Apache on the server machine. :: - - sudo a2enmod ssl - -Once you enable SSL, you should generate an SSL certificate. :: - - sudo mkdir /etc/apache2/ssl - sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt - - -.. note:: The foregoing example uses self-certified certificates. Some client - APIs check for a trusted certificate authority. So you may need to obtain - a SSL certificate from a trusted authority to use those client APIs. - -Then, restart Apache. :: - - service apache2 restart - - -Add Wildcard to DNS -=================== - -To use Ceph with S3-style subdomains (e.g., ``bucket-name.domain-name.com``), -you need to add a wildcard to the DNS record of the DNS server you use with the -``radosgw`` daemon. - -.. tip:: The address of the DNS must also be specified in the Ceph - configuration file with the ``rgw dns name = {hostname}`` setting. - -For ``dnsmasq``, consider addding the following ``address`` setting with a dot -(.) prepended to the host name:: - - address=/.{hostname-or-fqdn}/{host-ip-address} - address=/.ceph-node/192.168.0.1 - -For ``bind``, consider adding the a wildcard to the DNS record:: - - $TTL 604800 - @ IN SOA ceph-node. root.ceph-node. ( - 2 ; Serial - 604800 ; Refresh - 86400 ; Retry - 2419200 ; Expire - 604800 ) ; Negative Cache TTL - ; - @ IN NS ceph-node. - @ IN A 192.168.122.113 - * IN CNAME @ - -Restart your DNS server and ping your server with a subdomain to -ensure that your Ceph Object Store ``radosgw`` daemon can process -the subdomain requests. :: - - ping mybucket.{fqdn} - ping mybucket.ceph-node From 2fcaa1fcb248f52c81e90818891ed525c63188fe Mon Sep 17 00:00:00 2001 From: John Wilkins Date: Mon, 4 Nov 2013 15:11:49 -0800 Subject: [PATCH 104/150] pdatedoc: Added index link to new install doc. Requires merge of wip-doc-install to work. Signed-off-by: John Wilkins --- doc/radosgw/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/radosgw/index.rst b/doc/radosgw/index.rst index 65831a6d326d0..d9be66b3d8f69 100644 --- a/doc/radosgw/index.rst +++ b/doc/radosgw/index.rst @@ -36,7 +36,7 @@ you may write data with one API and retrieve it with the other. .. toctree:: :maxdepth: 1 - Manual Install + Manual Install <../../install/install-ceph-gateway> Simple Configuration Federated Configuration Config Reference From 154ee0b0345482bdfdeb84b7d3b00dba71577d97 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Mon, 4 Nov 2013 11:25:31 -0800 Subject: [PATCH 105/150] FileStore::_collection_move_rename: handle missing dst dir on replay In case of a replay, a missing destination directory indicates that the destination object and directory have been removed by a later transaction. Thus, we need to remove the src object and return 0. Fixes: #6714 Signed-off-by: Samuel Just Reviewed-by: Greg Farnum --- src/os/FileStore.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/os/FileStore.cc b/src/os/FileStore.cc index ffac501aaf20d..89a55b393db7c 100644 --- a/src/os/FileStore.cc +++ b/src/os/FileStore.cc @@ -4273,6 +4273,14 @@ int FileStore::_collection_move_rename(coll_t oldcid, const ghobject_t& oldoid, int r = 0; int dstcmp, srccmp; + if (replaying) { + /* If the destination collection doesn't exist during replay, + * we need to delete the src object and continue on + */ + if (!collection_exists(c)) + goto out_rm_src; + } + dstcmp = _check_replay_guard(c, o, spos); if (dstcmp < 0) goto out_rm_src; From 00734ec7c194e5037d76f919e9e7fa3b444d587c Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Tue, 5 Nov 2013 08:06:05 -0800 Subject: [PATCH 106/150] autogen: set exit on error Signed-off-by: Noah Watkins --- autogen.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/autogen.sh b/autogen.sh index f90c49de20a3c..d233e0f85853f 100755 --- a/autogen.sh +++ b/autogen.sh @@ -1,5 +1,7 @@ #!/bin/sh +set -e + check_for_pkg_config() { which pkg-config >/dev/null && return From ea725d3a90f829e49c9812b8b121fa4d8323ce01 Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Sat, 20 Jul 2013 18:41:38 -0700 Subject: [PATCH 107/150] autogen.sh: use glibtoolize when available libtoolize is called glibtoolize on osx. Signed-off-by: Noah Watkins --- autogen.sh | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/autogen.sh b/autogen.sh index d233e0f85853f..83c0104450d20 100755 --- a/autogen.sh +++ b/autogen.sh @@ -13,10 +13,20 @@ check_for_pkg_config() { exit 1 } +if [ `which libtoolize` ]; then + LIBTOOLIZE=libtoolize +elif [ `which glibtoolize` ]; then + LIBTOOLIZE=glibtoolize +else + echo "Error: could not find libtoolize" + echo " Please install libtoolize or glibtoolize." + exit 1 +fi + rm -f config.cache aclocal -I m4 --install check_for_pkg_config -libtoolize --force --copy +$LIBTOOLIZE --force --copy autoconf autoheader automake -a --add-missing -Wall From 0c610918c4ebd6fc1376027cfe6425cfdcfa0245 Mon Sep 17 00:00:00 2001 From: David Moreau Simard Date: Tue, 5 Nov 2013 11:32:58 -0500 Subject: [PATCH 108/150] We should exit 1 if radosgw is not executable An exit 0 means everything went okay - we should exit 1 if there is a problem in starting radosgw. Signed-off-by: David Moreau Simard --- src/init-radosgw | 2 +- src/init-radosgw.sysv | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/init-radosgw b/src/init-radosgw index ad8bcd12835b5..85afc308406fc 100644 --- a/src/init-radosgw +++ b/src/init-radosgw @@ -20,7 +20,7 @@ DEFAULT_USER='www-data' RADOSGW=`which radosgw` if [ ! -x "$RADOSGW" ]; then - exit 0 + exit 1 fi case "$1" in diff --git a/src/init-radosgw.sysv b/src/init-radosgw.sysv index 43b321bd88ee9..70b19950aaa41 100644 --- a/src/init-radosgw.sysv +++ b/src/init-radosgw.sysv @@ -22,7 +22,7 @@ DEFAULT_USER='apache' RADOSGW=`which radosgw` if [ ! -x "$RADOSGW" ]; then - exit 0 + exit 1 fi case "$1" in From c4b0431b029e3c97f807f963d77cdf6d5e0d2a5e Mon Sep 17 00:00:00 2001 From: David Moreau Simard Date: Tue, 5 Nov 2013 11:40:31 -0500 Subject: [PATCH 109/150] Verify that radosgw started, return appropriate exit code Changed "/etc/init.d/radosgw status" into a function that now returns the appropriate exit code. We now also verify that radosgw actually started properly. Signed-off-by: David Moreau Simard --- src/init-radosgw | 19 +++++++++++++------ src/init-radosgw.sysv | 19 +++++++++++++------ 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/src/init-radosgw b/src/init-radosgw index 85afc308406fc..d3e2633e41c1e 100644 --- a/src/init-radosgw +++ b/src/init-radosgw @@ -12,6 +12,17 @@ PATH=/sbin:/bin:/usr/bin . /lib/lsb/init-functions +daemon_is_running() { + daemon=$1 + if pidof $daemon >/dev/null; then + echo "$daemon is running." + exit 0 + else + echo "$daemon is not running." + exit 1 + fi +} + # prefix for radosgw instances in ceph.conf PREFIX='client.radosgw.' @@ -58,6 +69,7 @@ case "$1" in echo "Starting $name..." start-stop-daemon --start -u $user -x $RADOSGW -- -n $name done + daemon_is_running $RADOSGW ;; reload) echo "Reloading $name..." @@ -71,12 +83,7 @@ case "$1" in start-stop-daemon --stop -x $RADOSGW --oknodo ;; status) - if pidof $RADOSGW >/dev/null; then - echo "$RADOSGW is running." - else - echo "$RADOSGW is not running." - exit 1 - fi + daemon_is_running $RADOSGW ;; *) echo "Usage: $0 start|stop|restart|force-reload|reload|status" >&2 diff --git a/src/init-radosgw.sysv b/src/init-radosgw.sysv index 70b19950aaa41..d3015b2842520 100644 --- a/src/init-radosgw.sysv +++ b/src/init-radosgw.sysv @@ -13,6 +13,17 @@ PATH=/sbin:/bin:/usr/bin #. /lib/lsb/init-functions . /etc/rc.d/init.d/functions +daemon_is_running() { + daemon=$1 + if pidof $daemon >/dev/null; then + echo "$daemon is running." + exit 0 + else + echo "$daemon is not running." + exit 1 + fi +} + # prefix for radosgw instances in ceph.conf PREFIX='client.radosgw.' @@ -62,6 +73,7 @@ case "$1" in daemon --user="$user" "$RADOSGW -n $name" echo "Starting $name..." done + daemon_is_running $RADOSGW ;; reload) #start-stop-daemon --signal HUP -x $RADOSGW --oknodo @@ -78,12 +90,7 @@ case "$1" in echo "Stopping radosgw instance(s)..." ;; status) - if pidof $RADOSGW >/dev/null; then - echo "$RADOSGW is running." - else - echo "$RADOSGW is not running." - exit 1 - fi + daemon_is_running $RADOSGW ;; *) echo "Usage: $0 start|stop|restart|force-reload|reload|status" >&2 From bbcddef877d737df54565c46778e55bd6de9a6df Mon Sep 17 00:00:00 2001 From: David Moreau Simard Date: Tue, 5 Nov 2013 12:02:47 -0500 Subject: [PATCH 110/150] Add a verbose argument and some verbosity This allows a user to use "-v|--verbose" to get some insight as to what could be preventing radosgw from starting properly. Signed-off-by: David Moreau Simard --- doc/radosgw/troubleshooting.rst | 8 ++++++++ src/init-radosgw | 14 ++++++++++++-- src/init-radosgw.sysv | 14 ++++++++++++-- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/doc/radosgw/troubleshooting.rst b/doc/radosgw/troubleshooting.rst index 9c63742cb9716..918d0a30a5fac 100644 --- a/doc/radosgw/troubleshooting.rst +++ b/doc/radosgw/troubleshooting.rst @@ -17,6 +17,14 @@ the startup script is trying to start the process as a ``www-data`` or ``apache`` user and an existing ``.asok`` is preventing the script from starting the daemon. +The radosgw init script (/etc/init.d/radosgw) also has a verbose argument that +can provide some insight as to what could be the issue: + + /etc/init.d/radosgw start -v + +or + + /etc/init.d radosgw start --verbose HTTP Request Errors =================== diff --git a/src/init-radosgw b/src/init-radosgw index d3e2633e41c1e..caa05cb5cc4d1 100644 --- a/src/init-radosgw +++ b/src/init-radosgw @@ -23,6 +23,13 @@ daemon_is_running() { fi } +VERBOSE=0 +for opt in $*; do + if [ "$opt" = "-v" ] || [ "$opt" = "--verbose" ]; then + VERBOSE=1 + fi +done + # prefix for radosgw instances in ceph.conf PREFIX='client.radosgw.' @@ -31,6 +38,7 @@ DEFAULT_USER='www-data' RADOSGW=`which radosgw` if [ ! -x "$RADOSGW" ]; then + [ $VERBOSE -eq 1 ] && echo "$RADOSGW could not start, it is not executable." exit 1 fi @@ -51,7 +59,9 @@ case "$1" in # mapped to this host? host=`ceph-conf -n $name host` - if [ "$host" != `hostname -s` ]; then + hostname=`hostname -s` + if [ "$host" != "$hostname" ]; then + [ $VERBOSE -eq 1 ] && echo "hostname $hostname could not be found in ceph.conf:[$name], not starting." continue fi @@ -86,7 +96,7 @@ case "$1" in daemon_is_running $RADOSGW ;; *) - echo "Usage: $0 start|stop|restart|force-reload|reload|status" >&2 + echo "Usage: $0 {start|stop|restart|force-reload|reload|status} [-v|--verbose]" >&2 exit 3 ;; esac diff --git a/src/init-radosgw.sysv b/src/init-radosgw.sysv index d3015b2842520..869cc18e7dae4 100644 --- a/src/init-radosgw.sysv +++ b/src/init-radosgw.sysv @@ -24,6 +24,13 @@ daemon_is_running() { fi } +VERBOSE=0 +for opt in $*; do + if [ "$opt" = "-v" ] || [ "$opt" = "--verbose" ]; then + VERBOSE=1 + fi +done + # prefix for radosgw instances in ceph.conf PREFIX='client.radosgw.' @@ -33,6 +40,7 @@ DEFAULT_USER='apache' RADOSGW=`which radosgw` if [ ! -x "$RADOSGW" ]; then + [ $VERBOSE -eq 1 ] && echo "$RADOSGW could not start, it is not executable." exit 1 fi @@ -54,7 +62,9 @@ case "$1" in # mapped to this host? host=`ceph-conf -n $name host` - if [ "$host" != `hostname -s` ]; then + hostname=`hostname -s` + if [ "$host" != "$hostname" ]; then + [ $VERBOSE -eq 1 ] && echo "hostname $hostname could not be found in ceph.conf:[$name], not starting." continue fi @@ -93,7 +103,7 @@ case "$1" in daemon_is_running $RADOSGW ;; *) - echo "Usage: $0 start|stop|restart|force-reload|reload|status" >&2 + echo "Usage: $0 {start|stop|restart|force-reload|reload|status} [-v|--verbose]" >&2 exit 3 ;; esac From 0209568c57d95da3a18a4f33c6c2ee299c28c266 Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Sat, 20 Jul 2013 18:41:39 -0700 Subject: [PATCH 111/150] utime: use to_timespec for conversion Signed-off-by: Noah Watkins --- src/include/utime.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/include/utime.h b/src/include/utime.h index e13460593062b..5bebc70a3422c 100644 --- a/src/include/utime.h +++ b/src/include/utime.h @@ -138,8 +138,9 @@ class utime_t { } void sleep() { - struct timespec ts = { (__time_t)tv.tv_sec, (long)tv.tv_nsec }; - nanosleep(&ts, &ts); + struct timespec ts; + to_timespec(&ts); + nanosleep(&ts, NULL); } // output From e71a2f0c8ffd122f01131575b20ac8ccf28cc273 Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Mon, 4 Nov 2013 12:42:57 -0800 Subject: [PATCH 112/150] auth: add missing header file for std::replace Signed-off-by: Noah Watkins --- src/auth/KeyRing.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/auth/KeyRing.cc b/src/auth/KeyRing.cc index 5a8b2288e6aa4..96e56cd487e21 100644 --- a/src/auth/KeyRing.cc +++ b/src/auth/KeyRing.cc @@ -16,6 +16,7 @@ #include #include #include +#include #include "auth/AuthMethodList.h" #include "auth/Crypto.h" From 01a5a838414073d36f20d302c40d612db34ececc Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Mon, 4 Nov 2013 13:12:41 -0800 Subject: [PATCH 113/150] mon: add missing header for std::find Signed-off-by: Noah Watkins --- src/mon/MonMap.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mon/MonMap.cc b/src/mon/MonMap.cc index 7012e0545cf07..cf481234befbc 100644 --- a/src/mon/MonMap.cc +++ b/src/mon/MonMap.cc @@ -1,6 +1,7 @@ #include "MonMap.h" +#include #include #include #include From a10345a55272047301463648d00bcf1d7f099484 Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Tue, 29 Oct 2013 11:50:10 -0700 Subject: [PATCH 114/150] auth: add missing header for list Signed-off-by: Noah Watkins --- src/auth/AuthMethodList.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/auth/AuthMethodList.cc b/src/auth/AuthMethodList.cc index 50d58bff4d496..0e507fbf43f90 100644 --- a/src/auth/AuthMethodList.cc +++ b/src/auth/AuthMethodList.cc @@ -12,6 +12,8 @@ * */ +#include + #include "common/Mutex.h" #include "common/config.h" #include "common/debug.h" From e9880cfc1e6e9c18573e594f97f8c67b193b2a3d Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Tue, 29 Oct 2013 11:50:24 -0700 Subject: [PATCH 115/150] crush: add mising header for count Signed-off-by: Noah Watkins --- src/crush/CrushTester.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/crush/CrushTester.cc b/src/crush/CrushTester.cc index 0a649d8c77c0c..b38386d017962 100644 --- a/src/crush/CrushTester.cc +++ b/src/crush/CrushTester.cc @@ -1,6 +1,7 @@ #include "CrushTester.h" +#include #include @@ -203,7 +204,7 @@ bool CrushTester::check_valid_placement(int ruleno, vector in, const vector // check that we don't have any duplicate id's for (vector::iterator it = included_devices.begin(); it != included_devices.end(); ++it) { - int num_copies = count(included_devices.begin(), included_devices.end(), (*it) ); + int num_copies = std::count(included_devices.begin(), included_devices.end(), (*it) ); if (num_copies > 1) { valid_placement = false; } From 5dc64193cc09536ac0db77ae224b7121d5c0c77a Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Sun, 4 Aug 2013 12:11:01 -0700 Subject: [PATCH 116/150] rgw: avoid sighandler_t in favor of sig_t Signed-off-by: Noah Watkins --- src/rgw/rgw_main.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rgw/rgw_main.cc b/src/rgw/rgw_main.cc index 5fbecf88cab0d..82568ff390924 100644 --- a/src/rgw/rgw_main.cc +++ b/src/rgw/rgw_main.cc @@ -65,7 +65,7 @@ using namespace std; -static sighandler_t sighandler_alrm; +static sig_t sighandler_alrm; class RGWProcess; From 81a3ea1bc03d50a2a5fd223c5ee44394bcf790b2 Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Sun, 4 Aug 2013 12:09:19 -0700 Subject: [PATCH 117/150] rgw: add compat file for name service macros Signed-off-by: Noah Watkins --- configure.ac | 1 + src/rgw/rgw_resolve.cc | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/configure.ac b/configure.ac index 9fc26e115ed3f..2ecd0928bb48f 100644 --- a/configure.ac +++ b/configure.ac @@ -538,6 +538,7 @@ AC_CHECK_FUNC([fallocate], []) +AC_CHECK_HEADERS([arpa/nameser_compat.h]) AC_CHECK_HEADERS([sys/prctl.h]) AC_CHECK_FUNCS([prctl]) AC_CHECK_FUNCS([pipe2]) diff --git a/src/rgw/rgw_resolve.cc b/src/rgw/rgw_resolve.cc index 9a8b14b2e0185..471ac3f167816 100644 --- a/src/rgw/rgw_resolve.cc +++ b/src/rgw/rgw_resolve.cc @@ -3,6 +3,12 @@ #include #include +#include "acconfig.h" + +#ifdef HAVE_ARPA_NAMESER_COMPAT_H +#include +#endif + #include "rgw_common.h" #include "rgw_resolve.h" From c22c84a88c22688b6044ab37f65a3fe40dfe1983 Mon Sep 17 00:00:00 2001 From: Dan Mick Date: Tue, 5 Nov 2013 16:11:10 -0800 Subject: [PATCH 118/150] osdmaptool: don't put progress on stdout If one requests JSON output, the progress message pollutes the output; don't do that, send it to stderr instead Signed-off-by: Dan Mick --- src/tools/osdmaptool.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/osdmaptool.cc b/src/tools/osdmaptool.cc index 2e55026076c32..edd31284c4d4f 100644 --- a/src/tools/osdmaptool.cc +++ b/src/tools/osdmaptool.cc @@ -156,7 +156,7 @@ int main(int argc, const char **argv) OSDMap osdmap; bufferlist bl; - cout << me << ": osdmap file '" << fn << "'" << std::endl; + cerr << me << ": osdmap file '" << fn << "'" << std::endl; int r = 0; struct stat st; From a3ccd29716af900be265b6f995eb4069b334c516 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Tue, 5 Nov 2013 15:40:29 -0800 Subject: [PATCH 119/150] RadosModel: use sharedptr_registry for snaps_in_use There might be two concurrent rollback ops each of which adds snap x to snaps_in_use. Between when the first completes and the second completes, snap x may be removed since the first would have removed snap x from snaps_in_use. Using sharedptr_registry here avoids this by ensuring that the snap won't be removed from snaps_in_use until all refs are gone. This patch also adds size() to sharedptr_registry. Fixes: #6719 Signed-off-by: Samuel Just Reviewed-by: David Zafman --- src/common/sharedptr_registry.hpp | 5 +++++ src/test/osd/RadosModel.h | 10 +++++++--- src/test/osd/TestRados.cc | 2 +- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/common/sharedptr_registry.hpp b/src/common/sharedptr_registry.hpp index 9fe2fe6be1a10..83396b8cc5f67 100644 --- a/src/common/sharedptr_registry.hpp +++ b/src/common/sharedptr_registry.hpp @@ -149,6 +149,11 @@ class SharedPtrRegistry { return retval; } + unsigned size() { + Mutex::Locker l(lock); + return contents.size(); + } + void remove(const K &key) { Mutex::Locker l(lock); contents.erase(key); diff --git a/src/test/osd/RadosModel.h b/src/test/osd/RadosModel.h index 902d4b970c3df..80bcf00a6d785 100644 --- a/src/test/osd/RadosModel.h +++ b/src/test/osd/RadosModel.h @@ -18,6 +18,7 @@ #include "Object.h" #include "TestOpStat.h" #include "test/librados/test.h" +#include "common/sharedptr_registry.hpp" #ifndef RADOSMODEL_H #define RADOSMODEL_H @@ -143,7 +144,7 @@ class RadosTestContext { map > pool_obj_cont; set oid_in_use; set oid_not_in_use; - set snaps_in_use; + SharedPtrRegistry snaps_in_use; int current_snap; string pool_name; librados::IoCtx io_ctx; @@ -1321,6 +1322,7 @@ class RollbackOp : public TestOp { bool done; librados::ObjectWriteOperation op; librados::AioCompletion *comp; + std::tr1::shared_ptr in_use; RollbackOp(int n, RadosTestContext *context, @@ -1351,7 +1353,9 @@ class RollbackOp : public TestOp { context->oid_not_in_use.erase(oid); roll_back_to = rand_choose(context->snaps)->first; - context->snaps_in_use.insert(roll_back_to); + in_use = context->snaps_in_use.lookup_or_create( + roll_back_to, + roll_back_to); cout << "rollback oid " << oid << " to " << roll_back_to << std::endl; @@ -1382,7 +1386,7 @@ class RollbackOp : public TestOp { context->update_object_version(oid, comp->get_version64()); context->oid_in_use.erase(oid); context->oid_not_in_use.insert(oid); - context->snaps_in_use.erase(roll_back_to); + in_use = std::tr1::shared_ptr(); context->kick(); } diff --git a/src/test/osd/TestRados.cc b/src/test/osd/TestRados.cc index 0c1d55c7777e6..20a4f8209cc55 100644 --- a/src/test/osd/TestRados.cc +++ b/src/test/osd/TestRados.cc @@ -116,7 +116,7 @@ class WeightedTestGenerator : public TestOpGenerator } while (true) { int snap = rand_choose(context.snaps)->first; - if (context.snaps_in_use.count(snap)) + if (context.snaps_in_use.lookup(snap)) continue; // in use; try again! cout << "snap_remove snap " << snap << std::endl; return new SnapRemoveOp(m_op, &context, snap, m_stats); From 2aaed996a4c6846377725daa959718205fdaf0f2 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 6 Nov 2013 08:06:09 -0800 Subject: [PATCH 120/150] Revert "doc: radosgw workaround for OpenStack Horizon bug" This reverts commit c3c962eb7d2fb5ceea829924af08f8a1471f7acf. --- doc/radosgw/manual-install.rst | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/doc/radosgw/manual-install.rst b/doc/radosgw/manual-install.rst index 0d63855ab1e33..6b9b7e59d1f35 100644 --- a/doc/radosgw/manual-install.rst +++ b/doc/radosgw/manual-install.rst @@ -46,17 +46,6 @@ You may also clone Ceph's Apache and FastCGI git repositories:: rgw print continue = false -OpenStack Horizon support -------------------------- - -As of `OpenStack Grizzly -`_ the `Horizon -`_ dashboard `does not send -Content-Length `_ -which will trigger a ``411 Length Required`` error from -libapache2-mod-fastcgi when uploading an object. The recommended -workaround is to install the package from the ceph repositories as -instructed above. Apache Configuration ==================== From 89d5396cabbb0f0ccc51e48d57422033bc50dec3 Mon Sep 17 00:00:00 2001 From: Xing Lin Date: Sat, 2 Nov 2013 19:13:42 -0600 Subject: [PATCH 121/150] osd/erasurecode: correct one variable name in jerasure_matrix_to_bitmatrix() When bitmatrix is NULL, this function returns NULL. Signed-off-by: Xing Lin --- src/osd/ErasureCodePluginJerasure/jerasure.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osd/ErasureCodePluginJerasure/jerasure.c b/src/osd/ErasureCodePluginJerasure/jerasure.c index 9efae02e5fb21..d5752a8ee517b 100755 --- a/src/osd/ErasureCodePluginJerasure/jerasure.c +++ b/src/osd/ErasureCodePluginJerasure/jerasure.c @@ -276,7 +276,7 @@ int *jerasure_matrix_to_bitmatrix(int k, int m, int w, int *matrix) int rowelts, rowindex, colindex, elt, i, j, l, x; bitmatrix = talloc(int, k*m*w*w); - if (matrix == NULL) { return NULL; } + if (bitmatrix == NULL) { return NULL; } rowelts = k * w; rowindex = 0; From bfd5b9034f84bdd7684f0d7b36c8ab03bc753651 Mon Sep 17 00:00:00 2001 From: Xing Lin Date: Sun, 3 Nov 2013 10:35:33 -0700 Subject: [PATCH 122/150] mon/MDSMonitor: remove unnecessary assignment epocharg is not initialized, so it does not make any difference to assign its value to epoch. Signed-off-by: Xing Lin --- src/mon/MDSMonitor.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/mon/MDSMonitor.cc b/src/mon/MDSMonitor.cc index b865c379d1a07..eb0f6e1d66790 100644 --- a/src/mon/MDSMonitor.cc +++ b/src/mon/MDSMonitor.cc @@ -573,7 +573,6 @@ bool MDSMonitor::preprocess_command(MMonCommand *m) string val; int64_t epocharg; epoch_t epoch; - epoch = epocharg; MDSMap *p = &mdsmap; if (cmd_getval(g_ceph_context, cmdmap, "epoch", epocharg)) { From c3d20f2ba888a52089922aeb2968dee00fd4e8c8 Mon Sep 17 00:00:00 2001 From: Xing Lin Date: Mon, 4 Nov 2013 22:03:08 -0700 Subject: [PATCH 123/150] osd/erasurecode: free allocated memory before return NULL free memory space pointed by row_ids and ind_to_row before return Signed-off-by: Xing Lin --- src/osd/ErasureCodePluginJerasure/jerasure.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/osd/ErasureCodePluginJerasure/jerasure.c b/src/osd/ErasureCodePluginJerasure/jerasure.c index d5752a8ee517b..e5df475001c1c 100755 --- a/src/osd/ErasureCodePluginJerasure/jerasure.c +++ b/src/osd/ErasureCodePluginJerasure/jerasure.c @@ -839,7 +839,11 @@ static int **jerasure_generate_decoding_schedule(int k, int m, int w, int *bitma row_ids = talloc(int, k+m); ind_to_row = talloc(int, k+m); - if (set_up_ids_for_scheduled_decoding(k, m, erasures, row_ids, ind_to_row) < 0) return NULL; + if (set_up_ids_for_scheduled_decoding(k, m, erasures, row_ids, ind_to_row) < 0) { + free(row_ids); + free(ind_to_row); + return NULL; + } /* Now, we're going to create one decoding matrix which is going to decode everything with one call. The hope is that the scheduler From 25b7349657547fa8638505c023ccabb0be8b9191 Mon Sep 17 00:00:00 2001 From: Xing Lin Date: Mon, 4 Nov 2013 22:25:42 -0700 Subject: [PATCH 124/150] osd/ErasureCodePlugin: close library before return on error close and free resources for library before return Signed-off-by: Xing Lin --- src/osd/ErasureCodePlugin.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/osd/ErasureCodePlugin.cc b/src/osd/ErasureCodePlugin.cc index d8b9ae0fbbd81..38ea56a174c25 100644 --- a/src/osd/ErasureCodePlugin.cc +++ b/src/osd/ErasureCodePlugin.cc @@ -112,6 +112,7 @@ int ErasureCodePluginRegistry::load(const std::string &plugin_name, if (r != 0) { derr << "erasure_code_init(" << plugin_name << "): " << strerror(-r) << dendl; + dlclose(library); return r; } } else { From f4648bc6fec89c870e0c47b38b2f13496742b10f Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Tue, 5 Nov 2013 17:47:48 -0800 Subject: [PATCH 125/150] PGLog::rewind_divergent_log: log may not contain newhead Due to split, there may be a hole at newhead. Fixes: #6722 Signed-off-by: Samuel Just Reviewed-by: David Zafman --- src/osd/PGLog.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osd/PGLog.cc b/src/osd/PGLog.cc index 526baecf1284a..9f6ca1f70c3bc 100644 --- a/src/osd/PGLog.cc +++ b/src/osd/PGLog.cc @@ -360,7 +360,7 @@ void PGLog::rewind_divergent_log(ObjectStore::Transaction& t, eversion_t newhead } --p; mark_dirty_from(p->version); - if (p->version == newhead) { + if (p->version <= newhead) { ++p; divergent.splice(divergent.begin(), log.log, p, log.log.end()); break; From c6826c1e8a301b2306530c6e5d0f4a3160c4e691 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Tue, 5 Nov 2013 21:48:53 -0800 Subject: [PATCH 126/150] PG: fix operator<<,log_wierdness log bound warning Split may cause holes such that head != tail and yet log.empty(). Fixes: #6722 Signed-off-by: Samuel Just Reviewed-by: David Zafman --- src/osd/PG.cc | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/src/osd/PG.cc b/src/osd/PG.cc index e92013abdc733..8207a675bce4a 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -2399,13 +2399,7 @@ void PG::log_weirdness() << " != info.last_update " << info.last_update << "\n"; - if (pg_log.get_log().empty()) { - // shoudl it be? - if (pg_log.get_head() != pg_log.get_tail()) - osd->clog.error() << info.pgid - << " log bound mismatch, empty but (" << pg_log.get_tail() << "," - << pg_log.get_head() << "]\n"; - } else { + if (!pg_log.get_log().empty()) { // sloppy check if ((pg_log.get_log().log.begin()->version <= pg_log.get_tail())) osd->clog.error() << info.pgid @@ -4679,19 +4673,11 @@ ostream& operator<<(ostream& out, const PG& pg) pg.pg_log.get_head() != pg.info.last_update) out << " (info mismatch, " << pg.pg_log.get_log() << ")"; - if (pg.pg_log.get_log().empty()) { - // shoudl it be? - if (pg.pg_log.get_head().version - pg.pg_log.get_tail().version != 0) { - out << " (log bound mismatch, empty)"; - } - } else { - if ((pg.pg_log.get_log().log.begin()->version <= pg.pg_log.get_tail()) || // sloppy check - (pg.pg_log.get_log().log.rbegin()->version != pg.pg_log.get_head() && - !(pg.pg_log.get_head() == pg.pg_log.get_tail()))) { + if (!pg.pg_log.get_log().empty()) { + if ((pg.pg_log.get_log().log.begin()->version <= pg.pg_log.get_tail())) { out << " (log bound mismatch, actual=[" << pg.pg_log.get_log().log.begin()->version << "," << pg.pg_log.get_log().log.rbegin()->version << "]"; - //out << "len=" << pg.log.log.size(); out << ")"; } } From 1d030d1ed92c27e33d4ed49eb292b65f69f88917 Mon Sep 17 00:00:00 2001 From: Alan Somers Date: Fri, 11 Oct 2013 13:45:47 -0700 Subject: [PATCH 127/150] test: Only build death tests on platforms that support them googletest does not support death tests on FreeBSD. I've submitted a patch upstream that trivially enables support, but in the meantime we can't compile death tests for Ceph on FreeBSD. https://groups.google.com/forum/#!topic/googletestframework/tjY6UjWgNOw Signed-off-by: Alan Somers --- src/test/ceph_crypto.cc | 2 ++ src/test/os/TestFlatIndex.cc | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/test/ceph_crypto.cc b/src/test/ceph_crypto.cc index 2c934fa848c3c..11d410182a4d6 100644 --- a/src/test/ceph_crypto.cc +++ b/src/test/ceph_crypto.cc @@ -135,6 +135,8 @@ void do_simple_crypto() { exit(0); } +#if GTEST_HAS_DEATH_TEST TEST_F(ForkDeathTest, MD5) { ASSERT_EXIT(do_simple_crypto(), ::testing::ExitedWithCode(0), "^$"); } +#endif //GTEST_HAS_DEATH_TEST diff --git a/src/test/os/TestFlatIndex.cc b/src/test/os/TestFlatIndex.cc index 53d2bbe63767c..1326bc663772e 100644 --- a/src/test/os/TestFlatIndex.cc +++ b/src/test/os/TestFlatIndex.cc @@ -41,6 +41,7 @@ TEST(FlatIndex, FlatIndex) { EXPECT_EQ(0, index.cleanup()); } +#ifdef GTEST_HAS_DEATH_TEST TEST(FlatIndex, collection) { coll_t collection("ABC"); const std::string base_path("PATH"); @@ -53,6 +54,7 @@ TEST(FlatIndex, collection) { vector ls; ASSERT_DEATH(index.collection_list_partial(hoid, 0, 0, 0, &ls, &hoid), "0"); } +#endif //GTEST_HAS_DEATH_TEST TEST(FlatIndex, created_unlink) { coll_t collection("ABC"); From ac044812d0b25964fbf81eb04b1291ae484d1a34 Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Sat, 20 Jul 2013 18:41:38 -0700 Subject: [PATCH 128/150] assert: choose function-var name on non-gnu Selects __PRETTY_FUNCTION__ or __func__. Linux assumes GNU, and chooses __PRETTY_FUNCTION__ if gcc/g++ versions are favorable. This also includes a fix in ax_c_var_func.m4: AC_TRY_COMPILE will wrap the test in main{}, and then GCC will complain about nested functions. Just use the original main{} body. diff --git a/m4/ax_c_var_func.m4 b/m4/ax_c_var_func.m4 index 0ad7d2b..8b57563 100644 --- a/m4/ax_c_var_func.m4 +++ b/m4/ax_c_var_func.m4 @@ -57,9 +57,9 @@ AC_DEFUN([AX_C_VAR_FUNC], [AC_REQUIRE([AC_PROG_CC]) AC_CACHE_CHECK(whether $CC recognizes __func__, ac_cv_c_var_func, AC_TRY_COMPILE(, -[int main() { +[ char *s = __func__; -}], +], AC_DEFINE(HAVE_FUNC,, [Define if the C complier supports __func__]) ac_cv_c_var_func=yes, ac_cv_c_var_func=no) ) Signed-off-by: Noah Watkins --- configure.ac | 2 ++ m4/ax_c_pretty_func.m4 | 18 ++++++++++++ m4/ax_c_var_func.m4 | 66 ++++++++++++++++++++++++++++++++++++++++++ src/include/assert.h | 43 ++++++++++++++++++--------- 4 files changed, 116 insertions(+), 13 deletions(-) create mode 100644 m4/ax_c_pretty_func.m4 create mode 100644 m4/ax_c_var_func.m4 diff --git a/configure.ac b/configure.ac index 2ecd0928bb48f..13d80856f0060 100644 --- a/configure.ac +++ b/configure.ac @@ -114,6 +114,8 @@ AX_CHECK_COMPILE_FLAG([-fvar-tracking-assignments], [HAS_VTA_SUPPORT=1], [HAS_VT AM_CONDITIONAL(COMPILER_HAS_VTA, [test "$HAS_VTA_SUPPORT" = 1]) AX_CXX_STATIC_CAST +AX_C_VAR_FUNC +AX_C_PRETTY_FUNC # Checks for libraries. ACX_PTHREAD diff --git a/m4/ax_c_pretty_func.m4 b/m4/ax_c_pretty_func.m4 new file mode 100644 index 0000000000000..ad76709c33a54 --- /dev/null +++ b/m4/ax_c_pretty_func.m4 @@ -0,0 +1,18 @@ +# +# Test for C compiler support of __PRETTY_FUNCTION__ +# +# - Adapted from ax_c_var_func (Noah Watkins) +# + +AU_ALIAS([AC_C_PRETTY_FUNC], [AX_C_PRETTY_FUNC]) +AC_DEFUN([AX_C_PRETTY_FUNC], +[AC_REQUIRE([AC_PROG_CC]) +AC_CACHE_CHECK(whether $CC recognizes __PRETTY_FUNCTION__, ac_cv_c_pretty_func, +AC_TRY_COMPILE(, +[ +char *s = __PRETTY_FUNCTION__; +], +AC_DEFINE(HAVE_PRETTY_FUNC,, +[Define if the C complier supports __PRETTY_FUNCTION__]) ac_cv_c_pretty_func=yes, +ac_cv_c_pretty_func=no) ) +])dnl diff --git a/m4/ax_c_var_func.m4 b/m4/ax_c_var_func.m4 new file mode 100644 index 0000000000000..8b57563621d8f --- /dev/null +++ b/m4/ax_c_var_func.m4 @@ -0,0 +1,66 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_c_var_func.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_C_VAR_FUNC +# +# DESCRIPTION +# +# This macro tests if the C complier supports the C9X standard __func__ +# indentifier. +# +# The new C9X standard for the C language stipulates that the identifier +# __func__ shall be implictly declared by the compiler as if, immediately +# following the opening brace of each function definition, the declaration +# +# static const char __func__[] = "function-name"; +# +# appeared, where function-name is the name of the function where the +# __func__ identifier is used. +# +# LICENSE +# +# Copyright (c) 2008 Christopher Currie +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 5 + +AU_ALIAS([AC_C_VAR_FUNC], [AX_C_VAR_FUNC]) +AC_DEFUN([AX_C_VAR_FUNC], +[AC_REQUIRE([AC_PROG_CC]) +AC_CACHE_CHECK(whether $CC recognizes __func__, ac_cv_c_var_func, +AC_TRY_COMPILE(, +[ +char *s = __func__; +], +AC_DEFINE(HAVE_FUNC,, +[Define if the C complier supports __func__]) ac_cv_c_var_func=yes, +ac_cv_c_var_func=no) ) +])dnl diff --git a/src/include/assert.h b/src/include/assert.h index 15952e50b710d..5ff41ba69d7a3 100644 --- a/src/include/assert.h +++ b/src/include/assert.h @@ -33,21 +33,38 @@ struct FailedAssertion { # define __CEPH_ASSERT_VOID_CAST (void) #endif -/* Version 2.4 and later of GCC define a magical variable `__PRETTY_FUNCTION__' - which contains the name of the function currently being defined. - This is broken in G++ before version 2.6. - C9x has a similar variable called __func__, but prefer the GCC one since - it demangles C++ function names. */ -# if defined __cplusplus ? __GNUC_PREREQ (2, 6) : __GNUC_PREREQ (2, 4) -# define __CEPH_ASSERT_FUNCTION __PRETTY_FUNCTION__ -# else -# if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L -# define __CEPH_ASSERT_FUNCTION __func__ -# else -# define __CEPH_ASSERT_FUNCTION ((__const char *) 0) -# endif +/* + * For GNU, test specific version features. Otherwise (e.g. LLVM) we'll use + * the defaults selected below. + */ +#ifdef __GNUC_PREREQ + +/* + * Version 2.4 and later of GCC define a magical variable + * `__PRETTY_FUNCTION__' which contains the name of the function currently + * being defined. This is broken in G++ before version 2.6. C9x has a + * similar variable called __func__, but prefer the GCC one since it demangles + * C++ function names. We define __CEPH_NO_PRETTY_FUNC if we want to avoid + * broken versions of G++. + */ +# if defined __cplusplus ? !__GNUC_PREREQ (2, 6) : !__GNUC_PREREQ (2, 4) +# define __CEPH_NO_PRETTY_FUNC # endif +#endif + +/* + * Select a function-name variable based on compiler tests, and any compiler + * specific overrides. + */ +#if defined(HAVE_PRETTY_FUNC) && !defined(__CEPH_NO_PRETTY_FUNC) +# define __CEPH_ASSERT_FUNCTION __PRETTY_FUNCTION__ +#elif defined(HAVE_FUNC) +# define __CEPH_ASSERT_FUNCTION __func__ +#else +# define __CEPH_ASSERT_FUNCTION ((__const char *) 0) +#endif + extern void register_assert_context(CephContext *cct); extern void __ceph_assert_fail(const char *assertion, const char *file, int line, const char *function) __attribute__ ((__noreturn__)); From c7a30b881151e08b37339bb025789921e7115288 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Wed, 6 Nov 2013 14:33:03 -0800 Subject: [PATCH 129/150] ReplicatedPG: don't skip missing if sentries is empty on pgls Formerly, if sentries is empty, we skip missing. In general, we need to continue adding items from missing until we get to next (returned from collection_list_partial) to avoid missing any objects. Fixes: #6633 Signed-off-by: Samuel Just Reviewed-by: David Zafman --- src/osd/ReplicatedPG.cc | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 48040b68a882d..19592a64cea71 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -655,19 +655,38 @@ void ReplicatedPG::do_pg_op(OpRequestRef op) map::const_iterator missing_iter = pg_log.get_missing().missing.lower_bound(current); vector::iterator ls_iter = sentries.begin(); + hobject_t _max = hobject_t::get_max(); while (1) { - if (ls_iter == sentries.end()) { - break; - } + const hobject_t &mcand = + missing_iter == pg_log.get_missing().missing.end() ? + _max : + missing_iter->first; + const hobject_t &lcand = + ls_iter == sentries.end() ? + _max : + *ls_iter; hobject_t candidate; - if (missing_iter == pg_log.get_missing().missing.end() || - *ls_iter < missing_iter->first) { - candidate = *(ls_iter++); + if (mcand == lcand) { + candidate = mcand; + if (!mcand.is_max()) { + ls_iter++; + missing_iter++; + } + } else if (mcand < lcand) { + candidate = mcand; + assert(!mcand.is_max()); + ++missing_iter; } else { - candidate = (missing_iter++)->first; + candidate = lcand; + assert(!lcand.is_max()); + ++ls_iter; } + if (candidate >= next) { + break; + } + if (response.entries.size() == list_size) { next = candidate; break; From 082e7c9eedeeb9a588b4ae9ec4d9cf1343e9704d Mon Sep 17 00:00:00 2001 From: Li Wang Date: Thu, 7 Nov 2013 10:44:30 +0800 Subject: [PATCH 130/150] Ceph: Fix memory leak in chain_flistxattr() Free allocated memory before return. Signed-off-by: Li Wang Reviewed-by: Sage Weil --- src/os/chain_xattr.cc | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/os/chain_xattr.cc b/src/os/chain_xattr.cc index 8ca815689ed36..c020c9db84398 100644 --- a/src/os/chain_xattr.cc +++ b/src/os/chain_xattr.cc @@ -388,6 +388,10 @@ int chain_listxattr(const char *fn, char *names, size_t len) { int chain_flistxattr(int fd, char *names, size_t len) { int r; + char *p; + const char * end; + char *dest; + char *dest_end; if (!len) return sys_flistxattr(fd, names, len) * 2; @@ -403,12 +407,12 @@ int chain_flistxattr(int fd, char *names, size_t len) { r = sys_flistxattr(fd, full_buf, total_len); if (r < 0) - return r; + goto done; - char *p = full_buf; - const char *end = full_buf + r; - char *dest = names; - char *dest_end = names + len; + p = full_buf; + end = full_buf + r; + dest = names; + dest_end = names + len; while (p < end) { char name[CHAIN_XATTR_MAX_NAME_LEN * 2 + 16]; From 1ee112fa2efcf743c3f0451d73386d3364b59f1a Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 6 Nov 2013 19:59:56 -0800 Subject: [PATCH 131/150] osdmaptool: fix cli tests From c22c84a88c22688b6044ab37f65a3fe40dfe1983. Signed-off-by: Sage Weil --- src/test/cli/osdmaptool/clobber.t | 3 +++ src/test/cli/osdmaptool/create-racks.t | 1 + 2 files changed, 4 insertions(+) diff --git a/src/test/cli/osdmaptool/clobber.t b/src/test/cli/osdmaptool/clobber.t index 9bbe4d4ceeb7f..bbec5f0de636a 100644 --- a/src/test/cli/osdmaptool/clobber.t +++ b/src/test/cli/osdmaptool/clobber.t @@ -3,6 +3,7 @@ osdmaptool: writing epoch 1 to myosdmap $ ORIG_FSID="$(osdmaptool --print myosdmap|grep ^fsid)" + osdmaptool: osdmap file 'myosdmap' $ osdmaptool --createsimple 3 myosdmap osdmaptool: osdmap file 'myosdmap' @@ -27,6 +28,7 @@ $ NEW_FSID="$(osdmaptool --print myosdmap|grep ^fsid)" + osdmaptool: osdmap file 'myosdmap' $ [ "$ORIG_FSID" = "$NEW_FSID" ] $ osdmaptool --createsimple 1 --clobber myosdmap @@ -49,6 +51,7 @@ $ NEW_FSID="$(osdmaptool --print myosdmap|grep ^fsid)" + osdmaptool: osdmap file 'myosdmap' #TODO --clobber should probably set new fsid, remove the [1] $ [ "$ORIG_FSID" != "$NEW_FSID" ] [1] diff --git a/src/test/cli/osdmaptool/create-racks.t b/src/test/cli/osdmaptool/create-racks.t index 92bc995a227c5..f686ef4c05131 100644 --- a/src/test/cli/osdmaptool/create-racks.t +++ b/src/test/cli/osdmaptool/create-racks.t @@ -1,4 +1,5 @@ $ osdmaptool --create-from-conf om -c $TESTDIR/ceph.conf.withracks > /dev/null + osdmaptool: osdmap file 'om' $ osdmaptool --test-map-pg 0.0 om osdmaptool: osdmap file 'om' parsed '0.0' -> 0.0 From d8f05024e7f8e7c864bb5030412f6d89f67a711f Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 6 Nov 2013 20:02:09 -0800 Subject: [PATCH 132/150] doc/release-notes: note crush update timeout on startup change Signed-off-by: Sage Weil --- doc/release-notes.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/release-notes.rst b/doc/release-notes.rst index 0095b8684e266..251a015788416 100644 --- a/doc/release-notes.rst +++ b/doc/release-notes.rst @@ -39,6 +39,12 @@ v0.69 Upgrading ~~~~~~~~~ +* The sysvinit /etc/init.d/ceph script will, by default, update the + CRUSH location of an OSD when it starts. Previously, if the + monitors were not available, this command would hang indefinitely. + Now, that step will time out after 10 seconds and the ceph-osd daemon + will not be started. + * Users of the librados C++ API should replace users of get_version() with get_version64() as the old method only returns a 32-bit value for a 64-bit field. The existing 32-bit get_version() method is now From 84fb1bf3eefe88c0f5f15034d69c171e6531bf76 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Tue, 5 Nov 2013 14:54:20 -0800 Subject: [PATCH 133/150] rgw: deny writes to a secondary zone by non-system users Fixes: #6678 We don't want to allow regular users to write to secondary zones, otherwise we'd end up with data inconsistencies. Reviewed-by: Josh Durgin Signed-off-by: Yehuda Sadeh --- src/rgw/rgw_op.cc | 5 +++++ src/rgw/rgw_rados.cc | 4 ++++ src/rgw/rgw_rados.h | 3 +++ 3 files changed, 12 insertions(+) diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index c750276596f83..bd73a239a4bf1 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -418,6 +418,11 @@ int RGWOp::verify_op_mask() return -EPERM; } + if (!s->system_request && (required_mask & RGW_OP_TYPE_MODIFY) && !store->zone.is_master) { + ldout(s->cct, 5) << "NOTICE: modify request to a non-master zone by a non-system user, permission denied" << dendl; + return -EPERM; + } + return 0; } diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 4d6f8ef45301a..55d4b92bcbdb0 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -362,6 +362,10 @@ int RGWZoneParams::init(CephContext *cct, RGWRados *store, RGWRegion& region) return -EIO; } + is_master = (name == region.master_zone) || (region.master_zone.empty() && name == "default"); + + ldout(cct, 2) << "zone " << name << " is " << (is_master ? "" : "NOT ") << "master" << dendl; + return 0; } diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 874492ffe692d..476572ce3f6c9 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -428,11 +428,14 @@ struct RGWZoneParams { rgw_bucket user_uid_pool; string name; + bool is_master; RGWAccessKey system_key; map placement_pools; + RGWZoneParams() : is_master(false) {} + static int get_pool_name(CephContext *cct, string *pool_name); void init_name(CephContext *cct, RGWRegion& region); int init(CephContext *cct, RGWRados *store, RGWRegion& region); From 5832e2603c7db5d40b433d0953408993a9b7c217 Mon Sep 17 00:00:00 2001 From: Gary Lowell Date: Thu, 7 Nov 2013 20:27:35 +0000 Subject: [PATCH 134/150] v0.72 --- configure.ac | 2 +- debian/changelog | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index c344e7d6134b6..58c5e1b94a634 100644 --- a/configure.ac +++ b/configure.ac @@ -8,7 +8,7 @@ AC_PREREQ(2.59) # VERSION define is not used by the code. It gets a version string # from 'git describe'; see src/ceph_ver.[ch] -AC_INIT([ceph], [0.72-rc1], [ceph-devel@vger.kernel.org]) +AC_INIT([ceph], [0.72], [ceph-devel@vger.kernel.org]) # Create release string. Used with VERSION for RPMs. RPM_RELEASE=0 diff --git a/debian/changelog b/debian/changelog index f6575c29a726c..dd2dbb95ce4f6 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +ceph (0.72-1) stable; urgency=low + + * New upstream release + + -- Gary Lowell Thu, 07 Nov 2013 20:25:18 +0000 + ceph (0.72-rc1-1) stable; urgency=low * New upstream release From 0803d607093a911d1fc4a19500493e2e9c4c7894 Mon Sep 17 00:00:00 2001 From: Danny Al-Gaaf Date: Tue, 5 Nov 2013 16:57:09 +0100 Subject: [PATCH 135/150] common/buffer.cc: prefer prefix ++operator for non-primitive types Prefer prefix ++operator for non-primitive types like iterators for performance reasons. Prefix ++/-- operators avoid creating a temporary copy. Signed-off-by: Danny Al-Gaaf --- src/common/buffer.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/buffer.cc b/src/common/buffer.cc index 95c7acdb694a2..819d767d006ff 100644 --- a/src/common/buffer.cc +++ b/src/common/buffer.cc @@ -1045,7 +1045,7 @@ void buffer::list::rebuild_page_aligned() return 0; // no buffers std::list::const_iterator iter = _buffers.begin(); - iter++; + ++iter; if (iter != _buffers.end()) rebuild(); From 555e71779513b89440edffc023e6d2258d4562d7 Mon Sep 17 00:00:00 2001 From: Danny Al-Gaaf Date: Tue, 5 Nov 2013 19:39:59 +0100 Subject: [PATCH 136/150] mon/OSDMonitor.cc: prefer prefix ++operator for non-primitive types Prefer prefix ++operator for non-primitive types like iterators for performance reasons. Prefix ++/-- operators avoid creating a temporary copy. Signed-off-by: Danny Al-Gaaf --- src/mon/OSDMonitor.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index f976e3101a8e3..f178bdf934540 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -2659,7 +2659,7 @@ int OSDMonitor::prepare_new_pool(string& name, uint64_t auid, int crush_rule, pi->auid = auid; for (vector::const_iterator i = properties.begin(); i != properties.end(); - i++) { + ++i) { size_t equal = i->find('='); if (equal == string::npos) pi->properties[*i] = string(); From a8e10d3d0a27436c6f1df2601678a8abcc4b79f5 Mon Sep 17 00:00:00 2001 From: Danny Al-Gaaf Date: Tue, 5 Nov 2013 19:40:47 +0100 Subject: [PATCH 137/150] os/ObjectStore.cc: prefer prefix ++operator for non-primitive types Prefer prefix ++operator for non-primitive types like iterators for performance reasons. Prefix ++/-- operators avoid creating a temporary copy. Signed-off-by: Danny Al-Gaaf --- src/os/ObjectStore.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/os/ObjectStore.cc b/src/os/ObjectStore.cc index 1a1bbcb0b67de..327c64167d5cf 100644 --- a/src/os/ObjectStore.cc +++ b/src/os/ObjectStore.cc @@ -504,7 +504,7 @@ int ObjectStore::collection_list(coll_t c, vector& o) int ret = collection_list(c, go); if (ret == 0) { o.reserve(go.size()); - for (vector::iterator i = go.begin(); i != go.end() ; i++) + for (vector::iterator i = go.begin(); i != go.end() ; ++i) o.push_back(i->hobj); } return ret; @@ -520,7 +520,7 @@ int ObjectStore::collection_list_partial(coll_t c, hobject_t start, if (ret == 0) { *next = gnext.hobj; ls->reserve(go.size()); - for (vector::iterator i = go.begin(); i != go.end() ; i++) + for (vector::iterator i = go.begin(); i != go.end() ; ++i) ls->push_back(i->hobj); } return ret; @@ -534,7 +534,7 @@ int ObjectStore::collection_list_range(coll_t c, hobject_t start, hobject_t end, int ret = collection_list_range(c, gstart, gend, seq, &go); if (ret == 0) { ls->reserve(go.size()); - for (vector::iterator i = go.begin(); i != go.end() ; i++) + for (vector::iterator i = go.begin(); i != go.end() ; ++i) ls->push_back(i->hobj); } return ret; From 23f7bfc2a9ad98dffea5564428b0b0233c49cf85 Mon Sep 17 00:00:00 2001 From: Danny Al-Gaaf Date: Tue, 5 Nov 2013 19:41:54 +0100 Subject: [PATCH 138/150] osd/ErasureCodePlugin.cc: prefer prefix ++operator for non-primitive types Prefer prefix ++operator for non-primitive types like iterators for performance reasons. Prefix ++/-- operators avoid creating a temporary copy. Signed-off-by: Danny Al-Gaaf --- src/osd/ErasureCodePlugin.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osd/ErasureCodePlugin.cc b/src/osd/ErasureCodePlugin.cc index 38ea56a174c25..5d0b6904e1ea2 100644 --- a/src/osd/ErasureCodePlugin.cc +++ b/src/osd/ErasureCodePlugin.cc @@ -45,7 +45,7 @@ ErasureCodePluginRegistry::~ErasureCodePluginRegistry() { for (std::map::iterator i = plugins.begin(); i != plugins.end(); - i++) { + ++i) { void *library = i->second->library; delete i->second; dlclose(library); From 6b5a96b1f1b2b88f1a57cd84f3de5ae70ed76409 Mon Sep 17 00:00:00 2001 From: Danny Al-Gaaf Date: Tue, 5 Nov 2013 19:42:29 +0100 Subject: [PATCH 139/150] ErasureCodeJerasure.cc: prefer prefix ++operator for non-primitive types Prefer prefix ++operator for non-primitive types like iterators for performance reasons. Prefix ++/-- operators avoid creating a temporary copy. Signed-off-by: Danny Al-Gaaf --- src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc b/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc index f2be1ed06e711..fe656e58ee00f 100644 --- a/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc +++ b/src/osd/ErasureCodePluginJerasure/ErasureCodeJerasure.cc @@ -54,7 +54,7 @@ int ErasureCodeJerasure::minimum_to_decode(const set &want_to_read, return -EIO; set::iterator i; unsigned j; - for (i = available_chunks.begin(), j = 0; j < (unsigned)k; i++, j++) + for (i = available_chunks.begin(), j = 0; j < (unsigned)k; ++i, j++) minimum->insert(*i); } return 0; @@ -67,7 +67,7 @@ int ErasureCodeJerasure::minimum_to_decode_with_cost(const set &want_to_rea set available_chunks; for (map::const_iterator i = available.begin(); i != available.end(); - i++) + ++i) available_chunks.insert(i->first); return minimum_to_decode(want_to_read, available_chunks, minimum); } From 36ae9eb3214acee1c43e8a560ab20647197b5a47 Mon Sep 17 00:00:00 2001 From: Danny Al-Gaaf Date: Tue, 5 Nov 2013 19:46:09 +0100 Subject: [PATCH 140/150] osd/osd_types.cc: use !p.tiers.empty() instead of size() Use empty() since it should be prefered as it has, following the standard, a constant time complexity regardless of the containter type. The same is not guaranteed for size(). Signed-off-by: Danny Al-Gaaf --- src/osd/osd_types.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index 05b83c4af21bd..0cb3c0c64897b 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -1062,7 +1062,7 @@ ostream& operator<<(ostream& out, const pg_pool_t& p) out << " max_bytes " << p.quota_max_bytes; if (p.quota_max_objects) out << " max_objects " << p.quota_max_objects; - if (p.tiers.size()) + if (!p.tiers.empty()) out << " tiers " << p.tiers; if (p.is_tier()) out << " tier_of " << p.tier_of; From d0cf2bfb3206d90123b448732bd243ce73631d0c Mon Sep 17 00:00:00 2001 From: Danny Al-Gaaf Date: Tue, 5 Nov 2013 19:51:14 +0100 Subject: [PATCH 141/150] ErasureCodeExample.h: prefer prefix ++operator for non-primitive types Prefer prefix ++operator for non-primitive types like iterators for performance reasons. Prefix ++/-- operators avoid creating a temporary copy. Signed-off-by: Danny Al-Gaaf --- src/test/osd/ErasureCodeExample.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/osd/ErasureCodeExample.h b/src/test/osd/ErasureCodeExample.h index 0fd55187559f4..07694ea409aae 100644 --- a/src/test/osd/ErasureCodeExample.h +++ b/src/test/osd/ErasureCodeExample.h @@ -76,7 +76,7 @@ class ErasureCodeExample : public ErasureCodeInterface { set available_chunks; for (map::const_iterator i = c2c.begin(); i != c2c.end(); - i++) + ++i) available_chunks.insert(i->first); return minimum_to_decode(want_to_read, available_chunks, minimum); } @@ -109,7 +109,7 @@ class ErasureCodeExample : public ErasureCodeInterface { const bufferptr ptr = out.buffers().front(); for (set::iterator j = want_to_encode.begin(); j != want_to_encode.end(); - j++) { + ++j) { bufferptr chunk(ptr, (*j) * chunk_length, chunk_length); (*encoded)[*j].push_front(chunk); } @@ -125,7 +125,7 @@ class ErasureCodeExample : public ErasureCodeInterface { unsigned chunk_length = (*chunks.begin()).second.length(); for (set::iterator i = want_to_read.begin(); i != want_to_read.end(); - i++) { + ++i) { if (chunks.find(*i) != chunks.end()) { // // If the chunk is available, just copy the bufferptr pointer @@ -146,7 +146,7 @@ class ErasureCodeExample : public ErasureCodeInterface { bufferptr chunk(chunk_length); map::const_iterator k = chunks.begin(); const char *a = k->second.buffers().front().c_str(); - k++; + ++k; const char *b = k->second.buffers().front().c_str(); for (unsigned j = 0; j < chunk_length; j++) { chunk[j] = a[j] ^ b[j]; From fbdfd87c95c42d46ff5e1ddf5c282fadbb8b7977 Mon Sep 17 00:00:00 2001 From: Danny Al-Gaaf Date: Tue, 5 Nov 2013 19:51:48 +0100 Subject: [PATCH 142/150] remove unused variable from Objecter::RequestStateHook::call() Signed-off-by: Danny Al-Gaaf --- src/osdc/Objecter.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index d2c574d982e1e..734df5e9e6900 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -2406,7 +2406,6 @@ Objecter::RequestStateHook::RequestStateHook(Objecter *objecter) : bool Objecter::RequestStateHook::call(std::string command, cmdmap_t& cmdmap, std::string format, bufferlist& out) { - stringstream ss; Formatter *f = new_formatter(format); m_objecter->client_lock.Lock(); m_objecter->dump_requests(f); From 548fc13c179b182b9feef7e434bcb3ce5adc6c89 Mon Sep 17 00:00:00 2001 From: Danny Al-Gaaf Date: Tue, 5 Nov 2013 21:32:42 +0100 Subject: [PATCH 143/150] rgw/rgw_http_client.cc: use static_cast<>() instead of C-Style cast Signed-off-by: Danny Al-Gaaf --- src/rgw/rgw_http_client.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rgw/rgw_http_client.cc b/src/rgw/rgw_http_client.cc index 314e80b9ef26c..1c6b6d4d71ba0 100644 --- a/src/rgw/rgw_http_client.cc +++ b/src/rgw/rgw_http_client.cc @@ -234,7 +234,7 @@ static int do_curl_wait(CephContext *cct, CURLM *handle) int RGWHTTPClient::process_request(void *handle, bool wait_for_data, bool *done) { - multi_req_data *req_data = (multi_req_data *)handle; + multi_req_data *req_data = static_cast(handle); int still_running; int mstatus; @@ -282,7 +282,7 @@ int RGWHTTPClient::complete_request(void *handle) do { ret = process_request(handle, true, &done); } while (!done && !ret); - multi_req_data *req_data = (multi_req_data *)handle; + multi_req_data *req_data = static_cast(handle); delete req_data; return ret; From 9226a97aa26079e8e111742dc25807777dea748c Mon Sep 17 00:00:00 2001 From: Danny Al-Gaaf Date: Tue, 5 Nov 2013 21:33:33 +0100 Subject: [PATCH 144/150] rgw/rgw_user.cc: use static_cast<>() instead of C-Style cast Signed-off-by: Danny Al-Gaaf --- src/rgw/rgw_user.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rgw/rgw_user.cc b/src/rgw/rgw_user.cc index dc529e3d48d4b..e4462ec11e05e 100644 --- a/src/rgw/rgw_user.cc +++ b/src/rgw/rgw_user.cc @@ -2358,7 +2358,7 @@ class RGWUserMetadataHandler : public RGWMetadataHandler { } int list_keys_next(void *handle, int max, list& keys, bool *truncated) { - list_keys_info *info = (list_keys_info *)handle; + list_keys_info *info = static_cast(handle); string no_filter; @@ -2387,7 +2387,7 @@ class RGWUserMetadataHandler : public RGWMetadataHandler { } void list_keys_complete(void *handle) { - list_keys_info *info = (list_keys_info *)handle; + list_keys_info *info = static_cast(handle); delete info; } }; From ace35f215460e1101bf0636c8c8b1ef117c5dd38 Mon Sep 17 00:00:00 2001 From: Danny Al-Gaaf Date: Tue, 5 Nov 2013 21:59:20 +0100 Subject: [PATCH 145/150] Client.cc: remove unused variable from Client::CommandHook::call() Signed-off-by: Danny Al-Gaaf --- src/client/Client.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 89de94ee6ea5b..11939c0a1531e 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -109,7 +109,6 @@ Client::CommandHook::CommandHook(Client *client) : bool Client::CommandHook::call(std::string command, cmdmap_t& cmdmap, std::string format, bufferlist& out) { - stringstream ss; Formatter *f = new_formatter(format); f->open_object_section("result"); m_client->client_lock.Lock(); From 6566dfb740e3e542e2356fb1c9217af94bdd656f Mon Sep 17 00:00:00 2001 From: Danny Al-Gaaf Date: Tue, 5 Nov 2013 22:00:33 +0100 Subject: [PATCH 146/150] osd/ReplicatedPG.cc: remove unused variable Signed-off-by: Danny Al-Gaaf --- src/osd/ReplicatedPG.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 500042d16e3a4..f8100b33a8a92 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -8110,7 +8110,6 @@ int ReplicatedPG::recover_backfill( } PGBackend::RecoveryHandle *h = pgbackend->open_recovery_op(); - map > pushes; for (map >::iterator i = to_push.begin(); From 0da5a019f55b66c71216c39e88b61ca9363940eb Mon Sep 17 00:00:00 2001 From: Danny Al-Gaaf Date: Tue, 5 Nov 2013 22:01:04 +0100 Subject: [PATCH 147/150] rgw: remove unused variables Signed-off-by: Danny Al-Gaaf --- src/rgw/rgw_quota.cc | 1 - src/rgw/rgw_rest_metadata.cc | 1 - 2 files changed, 2 deletions(-) diff --git a/src/rgw/rgw_quota.cc b/src/rgw/rgw_quota.cc index 66609ca723c28..89611f5858769 100644 --- a/src/rgw/rgw_quota.cc +++ b/src/rgw/rgw_quota.cc @@ -126,7 +126,6 @@ class AsyncRefreshHandler : public RGWGetBucketStats_CB { int AsyncRefreshHandler::init_fetch() { ldout(store->ctx(), 20) << "initiating async quota refresh for bucket=" << bucket << dendl; - map bucket_stats; int r = store->get_bucket_stats_async(bucket, this); if (r < 0) { ldout(store->ctx(), 0) << "could not get bucket info for bucket=" << bucket.name << dendl; diff --git a/src/rgw/rgw_rest_metadata.cc b/src/rgw/rgw_rest_metadata.cc index 5036235ebd2b6..afd5c7b6cc055 100644 --- a/src/rgw/rgw_rest_metadata.cc +++ b/src/rgw/rgw_rest_metadata.cc @@ -31,7 +31,6 @@ static inline void frame_metadata_key(req_state *s, string& out) { bool exists; string key = s->info.args.get("key", &exists); - string metadata_key; string section; if (!s->bucket_name_str.empty()) { section = s->bucket_name_str; From 91627f2d332fae35b421ff94fbf7451d33f35352 Mon Sep 17 00:00:00 2001 From: Danny Al-Gaaf Date: Tue, 5 Nov 2013 22:01:42 +0100 Subject: [PATCH 148/150] test_seek_read.c: remove unused variable 'off64_t so' Signed-off-by: Danny Al-Gaaf --- src/test/old/test_seek_read.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/old/test_seek_read.c b/src/test/old/test_seek_read.c index aedb32a2ae0b5..1ea3b750b455f 100644 --- a/src/test/old/test_seek_read.c +++ b/src/test/old/test_seek_read.c @@ -38,7 +38,7 @@ int main(int argc, char **argv) utime_t start = ceph_clock_now(g_ceph_context); for (int i=0; iargs_vec; cmd_getval(g_ceph_context, cmdmap, "args", args_vec); From 01f7b463d13fb244957e6defeae5b3523db2c3c1 Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Thu, 7 Nov 2013 15:38:58 -0800 Subject: [PATCH 150/150] client: use platform-specific stat time members Signed-off-by: Noah Watkins --- configure.ac | 11 +++ src/client/Client.cc | 45 +++++++------ src/include/Makefile.am | 3 +- src/include/stat.h | 145 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 181 insertions(+), 23 deletions(-) create mode 100644 src/include/stat.h diff --git a/configure.ac b/configure.ac index 13d80856f0060..d1aaa6a481472 100644 --- a/configure.ac +++ b/configure.ac @@ -539,6 +539,17 @@ AC_CHECK_FUNC([fallocate], [AC_DEFINE([CEPH_HAVE_FALLOCATE], [], [fallocate(2) is supported])], []) +# +# Test for time-related `struct stat` members. +# + +AC_CHECK_MEMBER([struct stat.st_mtim.tv_nsec], + [AC_DEFINE(HAVE_STAT_ST_MTIM_TV_NSEC, 1, + [Define if you have struct stat.st_mtim.tv_nsec])]) + +AC_CHECK_MEMBER([struct stat.st_mtimespec.tv_nsec], + [AC_DEFINE(HAVE_STAT_ST_MTIMESPEC_TV_NSEC, 1, + [Define if you have struct stat.st_mtimespec.tv_nsec])]) AC_CHECK_HEADERS([arpa/nameser_compat.h]) AC_CHECK_HEADERS([sys/prctl.h]) diff --git a/src/client/Client.cc b/src/client/Client.cc index 89de94ee6ea5b..a47f3e26b6b2a 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -84,6 +84,7 @@ using namespace std; #include "ObjecterWriteback.h" #include "include/assert.h" +#include "include/stat.h" #undef dout_prefix #define dout_prefix *_dout << "client." << whoami << " " @@ -4503,9 +4504,9 @@ int Client::_setattr(Inode *in, struct stat *attr, int mask, int uid, int gid, I if (in->caps_issued_mask(CEPH_CAP_FILE_EXCL)) { if (mask & (CEPH_SETATTR_MTIME|CEPH_SETATTR_ATIME)) { if (mask & CEPH_SETATTR_MTIME) - in->mtime = utime_t(attr->st_mtim.tv_sec, attr->st_mtim.tv_nsec); + in->mtime = utime_t(stat_get_mtime_sec(attr), stat_get_mtime_nsec(attr)); if (mask & CEPH_SETATTR_ATIME) - in->atime = utime_t(attr->st_atim.tv_sec, attr->st_atim.tv_nsec); + in->atime = utime_t(stat_get_atime_sec(attr), stat_get_atime_nsec(attr)); in->ctime = ceph_clock_now(cct); in->time_warp_seq++; mark_caps_dirty(in, CEPH_CAP_FILE_EXCL); @@ -4535,14 +4536,14 @@ int Client::_setattr(Inode *in, struct stat *attr, int mask, int uid, int gid, I req->inode_drop |= CEPH_CAP_AUTH_SHARED; } if (mask & CEPH_SETATTR_MTIME) { - req->head.args.setattr.mtime = - utime_t(attr->st_mtim.tv_sec, attr->st_mtim.tv_nsec); + utime_t mtime = utime_t(stat_get_mtime_sec(attr), stat_get_mtime_nsec(attr)); + req->head.args.setattr.mtime = mtime; req->inode_drop |= CEPH_CAP_AUTH_SHARED | CEPH_CAP_FILE_RD | CEPH_CAP_FILE_WR; } if (mask & CEPH_SETATTR_ATIME) { - req->head.args.setattr.atime = - utime_t(attr->st_atim.tv_sec, attr->st_atim.tv_nsec); + utime_t atime = utime_t(stat_get_atime_sec(attr), stat_get_atime_nsec(attr)); + req->head.args.setattr.atime = atime; req->inode_drop |= CEPH_CAP_FILE_CACHE | CEPH_CAP_FILE_RD | CEPH_CAP_FILE_WR; } @@ -4652,16 +4653,16 @@ int Client::fill_stat(Inode *in, struct stat *st, frag_info_t *dirstat, nest_inf st->st_uid = in->uid; st->st_gid = in->gid; if (in->ctime.sec() > in->mtime.sec()) { - st->st_ctim.tv_sec = in->ctime.sec(); - st->st_ctim.tv_nsec = in->ctime.nsec(); + stat_set_ctime_sec(st, in->ctime.sec()); + stat_set_ctime_nsec(st, in->ctime.nsec()); } else { - st->st_ctim.tv_sec = in->mtime.sec(); - st->st_ctim.tv_nsec = in->mtime.nsec(); + stat_set_ctime_sec(st, in->mtime.sec()); + stat_set_ctime_nsec(st, in->mtime.nsec()); } - st->st_atim.tv_sec = in->atime.sec(); - st->st_atim.tv_nsec = in->atime.nsec(); - st->st_mtim.tv_sec = in->mtime.sec(); - st->st_mtim.tv_nsec = in->mtime.nsec(); + stat_set_atime_sec(st, in->atime.sec()); + stat_set_atime_nsec(st, in->atime.nsec()); + stat_set_mtime_sec(st, in->mtime.sec()); + stat_set_mtime_nsec(st, in->mtime.nsec()); if (in->is_dir()) { //st->st_size = in->dirstat.size(); st->st_size = in->rstat.rbytes; @@ -4807,10 +4808,10 @@ int Client::utime(const char *relpath, struct utimbuf *buf) if (r < 0) return r; struct stat attr; - attr.st_mtim.tv_sec = buf->modtime; - attr.st_mtim.tv_nsec = 0; - attr.st_atim.tv_sec = buf->actime; - attr.st_atim.tv_nsec = 0; + stat_set_mtime_sec(&attr, buf->modtime); + stat_set_mtime_nsec(&attr, 0); + stat_set_atime_sec(&attr, buf->actime); + stat_set_atime_nsec(&attr, 0); return _setattr(in, &attr, CEPH_SETATTR_MTIME|CEPH_SETATTR_ATIME); } @@ -4828,10 +4829,10 @@ int Client::lutime(const char *relpath, struct utimbuf *buf) if (r < 0) return r; struct stat attr; - attr.st_mtim.tv_sec = buf->modtime; - attr.st_mtim.tv_nsec = 0; - attr.st_atim.tv_sec = buf->actime; - attr.st_atim.tv_nsec = 0; + stat_set_mtime_sec(&attr, buf->modtime); + stat_set_mtime_nsec(&attr, 0); + stat_set_atime_sec(&attr, buf->actime); + stat_set_atime_nsec(&attr, 0); return _setattr(in, &attr, CEPH_SETATTR_MTIME|CEPH_SETATTR_ATIME); } diff --git a/src/include/Makefile.am b/src/include/Makefile.am index 34976a6cc2990..6e076600e273c 100644 --- a/src/include/Makefile.am +++ b/src/include/Makefile.am @@ -78,4 +78,5 @@ noinst_HEADERS += \ include/rbd/features.h \ include/rbd/librbd.h \ include/rbd/librbd.hpp\ - include/util.h + include/util.h\ + include/stat.h diff --git a/src/include/stat.h b/src/include/stat.h new file mode 100644 index 0000000000000..19398758e210d --- /dev/null +++ b/src/include/stat.h @@ -0,0 +1,145 @@ +#ifndef CEPH_STAT_H +#define CEPH_STAT_H + +#include + +#include + +/* + * Access time-related `struct stat` members. + * + * Note that for each of the stat member get/set functions below, setting a + * high-res value (stat_set_*_nsec) on a platform without high-res support is + * a no-op. + */ + +#ifdef HAVE_STAT_ST_MTIM_TV_NSEC + +static inline uint32_t stat_get_mtime_nsec(struct stat *st) +{ + return st->st_mtim.tv_nsec; +} + +static inline void stat_set_mtime_nsec(struct stat *st, uint32_t nsec) +{ + st->st_mtim.tv_nsec = nsec; +} + +static inline uint32_t stat_get_atime_nsec(struct stat *st) +{ + return st->st_atim.tv_nsec; +} + +static inline void stat_set_atime_nsec(struct stat *st, uint32_t nsec) +{ + st->st_atim.tv_nsec = nsec; +} + +static inline uint32_t stat_get_ctime_nsec(struct stat *st) +{ + return st->st_ctim.tv_nsec; +} + +static inline void stat_set_ctime_nsec(struct stat *st, uint32_t nsec) +{ + st->st_ctim.tv_nsec = nsec; +} + +#elif defined(HAVE_STAT_ST_MTIMESPEC_TV_NSEC) + +static inline uint32_t stat_get_mtime_nsec(struct stat *st) +{ + return st->st_mtimespec.tv_nsec; +} + +static inline void stat_set_mtime_nsec(struct stat *st, uint32_t nsec) +{ + st->st_mtimespec.tv_nsec = nsec; +} + +static inline uint32_t stat_get_atime_nsec(struct stat *st) +{ + return st->st_atimespec.tv_nsec; +} + +static inline void stat_set_atime_nsec(struct stat *st, uint32_t nsec) +{ + st->st_atimespec.tv_nsec = nsec; +} + +static inline uint32_t stat_get_ctime_nsec(struct stat *st) +{ + return st->st_ctimespec.tv_nsec; +} + +static inline void stat_set_ctime_nsec(struct stat *st, uint32_t nsec) +{ + st->st_ctimespec.tv_nsec = nsec; +} + +#else + +static inline uint32_t stat_get_mtime_nsec(struct stat *st) +{ + return 0; +} + +static inline void stat_set_mtime_nsec(struct stat *st, uint32_t nsec) +{ +} + +static inline uint32_t stat_get_atime_nsec(struct stat *st) +{ + return 0; +} + +static inline void stat_set_atime_nsec(struct stat *st, uint32_t nsec) +{ +} + +static inline uint32_t stat_get_ctime_nsec(struct stat *st) +{ + return 0; +} + +static inline void stat_set_ctime_nsec(struct stat *st, uint32_t nsec) +{ +} + +#endif + +/* + * Access second-resolution `struct stat` members. + */ + +static inline uint32_t stat_get_mtime_sec(struct stat *st) +{ + return st->st_mtime; +} + +static inline void stat_set_mtime_sec(struct stat *st, uint32_t sec) +{ + st->st_mtime = sec; +} + +static inline uint32_t stat_get_atime_sec(struct stat *st) +{ + return st->st_atime; +} + +static inline void stat_set_atime_sec(struct stat *st, uint32_t sec) +{ + st->st_atime = sec; +} + +static inline uint32_t stat_get_ctime_sec(struct stat *st) +{ + return st->st_ctime; +} + +static inline void stat_set_ctime_sec(struct stat *st, uint32_t sec) +{ + st->st_ctime = sec; +} + +#endif