[
https://issues.apache.org/jira/browse/GEODE-3063?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16286737#comment-16286737
]
ASF GitHub Bot commented on GEODE-3063:
---------------------------------------
karensmolermiller closed pull request #1105: GEODE-3063 partition resolver doc
revisions
URL: https://github.com/apache/geode/pull/1105
This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:
As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):
diff --git a/geode-book/master_middleman/source/subnavs/geode-subnav.erb
b/geode-book/master_middleman/source/subnavs/geode-subnav.erb
index b976f09ccc..0c672793bb 100644
--- a/geode-book/master_middleman/source/subnavs/geode-subnav.erb
+++ b/geode-book/master_middleman/source/subnavs/geode-subnav.erb
@@ -868,7 +868,10 @@ limitations under the License.
<a
href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/custom_partitioning_and_data_colocation.html">Understanding
Custom Partitioning and Data Colocation</a>
</li>
<li>
- <a
href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/using_custom_partition_resolvers.html">Custom-Partition
Your Region Data</a>
+ <a
href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/standard_custom_partitioning.html">Standard
Custom Partitioning</a>
+ </li>
+ <li>
+ <a
href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/fixed_custom_partitioning.html">Fixed
Custom Partitioning</a>
</li>
<li>
<a
href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/colocating_partitioned_region_data.html">Colocate
Data from Different Partitioned Regions</a>
diff --git
a/geode-docs/developing/partitioned_regions/colocating_partitioned_region_data.html.md.erb
b/geode-docs/developing/partitioned_regions/colocating_partitioned_region_data.html.md.erb
index 962c21ea83..db405d3814 100644
---
a/geode-docs/developing/partitioned_regions/colocating_partitioned_region_data.html.md.erb
+++
b/geode-docs/developing/partitioned_regions/colocating_partitioned_region_data.html.md.erb
@@ -19,27 +19,19 @@ See the License for the specific language governing
permissions and
limitations under the License.
-->
-By default, <%=vars.product_name%> allocates the data locations for a
partitioned region independent of the data locations for any other partitioned
region. You can change this policy for any group of partitioned regions, so
that cross-region, related data is all hosted by the same member. This
colocation speeds queries and other operations that access data from the
regions.
+By default, <%=vars.product_name%> allocates the data locations for a
partitioned region independent of the data locations for any other partitioned
region. You can change this policy for any group of partitioned regions, so
that cross-region, related data is all hosted by the same member.
+Colocation is required for some operations,
+and it increases performance for others by reducing the number of data
+accesses to entries that are hosted on other cluster members.
<a
id="colocating_partitioned_region_data__section_131EC040055E48A6B35E981B5C845A65"></a>
-**Note:**
-If you are colocating data between regions and custom partitioning the data in
the regions, all colocated regions must use partitioning mechanisms that return
the same routing object. The most common approach, though not the only one, is
for all colocated regions to use the same custom PartitionResolver. See
[Custom-Partition Your Region Data](using_custom_partition_resolvers.html).
Data colocation between partitioned regions generally improves the performance
of data-intensive operations. You can reduce network hops for iterative
operations on related data sets. Compute-heavy applications that are
data-intensive can significantly increase overall throughput. For example, a
query run on a patient's health records, insurance, and billing information is
more efficient if all data is grouped in a single member. Similarly, a
financial risk analytical application runs faster if all trades, risk
sensitivities, and reference data associated with a single instrument are
together.
-**Prerequisites**
-
-<a
id="colocating_partitioned_region_data__section_5A8D752F02834146A37D9430F1CA32DA"></a>
-
-- Understand how to configure and create your partitioned regions. See
[Understanding Partitioning](how_partitioning_works.html) and [Configuring
Partitioned
Regions](managing_partitioned_regions.html#configure_partitioned_regions).
-- (Optional) Understand how to custom-partition your data. See
[Custom-Partition Your Region Data](using_custom_partition_resolvers.html).
-- (Optional) If you want your colocated regions to be highly available,
understand how high availability for partitioned regions works. See
[Understanding High Availability for Partitioned
Regions](how_pr_ha_works.html#how_pr_ha_works).
-- (Optional) Understand how to persist your region data. See [Configure
Region Persistence and
Overflow](../storing_data_on_disk/storing_data_on_disk.html).
-
**Procedure**
1. Identify one region as the central region, with which data in the other
regions is explicitly colocated. If you use persistence for any of the regions,
you must persist the central region.
- 1. Create the central region before you create the others, either in the
cache.xml or your code. Regions in the XML are created before regions in the
code, so if you create any of your colocated regions in the XML, you must
create the central region in the XML before the others. <%=vars.product_name%>
will verify its existence when the others are created and return
`IllegalStateException` if the central region is not there. Do not add any
colocation specifications to this central region.
+ 1. Create the central region before you create the others, either in the
`cache.xml` or your code. Regions in the XML are created before regions in the
code, so if you create any of your colocated regions in the XML, you must
create the central region in the XML before the others. <%=vars.product_name%>
will verify its existence when the others are created and return
`IllegalStateException` if the central region is not there. Do not add any
colocation specifications to this central region.
2. For all other regions, in the region partition attributes, provide the
central region's name in the `colocated-with` attribute. Use one of these
methods:
- XML:
@@ -65,10 +57,13 @@ Data colocation between partitioned regions generally
improves the performance o
``` pre
PartitionAttributes attrs = ...
- Region trades = new
RegionFactory().setPartitionAttributes(attrs).create("trades");
+ Region trades = new RegionFactory().setPartitionAttributes(attrs)
+ .create("trades");
...
- attrs = new
PartitionAttributesFactory().setColocatedWith(trades.getFullPath()).create();
- Region trade_history = new
RegionFactory().setPartitionAttributes(attrs).create("trade_history");
+ attrs = new
PartitionAttributesFactory().setColocatedWith(trades.getFullPath())
+ .create();
+ Region trade_history = new
RegionFactory().setPartitionAttributes(attrs)
+ .create("trade_history");
```
- gfsh:
@@ -83,7 +78,7 @@ Data colocation between partitioned regions generally
improves the performance o
- `startup-recovery-delay`
- `total-num-buckets`
-3. If you custom partition your region data, provide the same custom resolver
to all colocated regions:
+3. If you custom partition your region data, specify the custom resolver for
all colocated regions. This example uses the same partition resolver for both
regions:
- XML:
``` pre
@@ -115,14 +110,18 @@ Data colocation between partitioned regions generally
improves the performance o
PartitionAttributes attrs =
new PartitionAttributesFactory()
.setPartitionResolver(resolver).create();
- Region trades = new
RegionFactory().setPartitionAttributes(attrs).create("trades");
+ Region trades = new RegionFactory().setPartitionAttributes(attrs)
+ .create("trades");
attrs = new PartitionAttributesFactory()
-
.setColocatedWith(trades.getFullPath()).setPartitionResolver(resolver).create();
- Region trade_history = new
RegionFactory().setPartitionAttributes(attrs).create("trade_history");
+
.setColocatedWith(trades.getFullPath()).setPartitionResolver(resolver)
+ .create();
+ Region trade_history = new
RegionFactory().setPartitionAttributes(attrs)
+ .create("trade_history");
```
- gfsh:
- You cannot specify a partition resolver using gfsh.
+ Specify a partition resolver as described in the configuration
+ section of [Custom-Partition Your Region
Data](using_custom_partition_resolvers.html).
4. If you want to persist data in the colocated regions, persist the central
region and then persist the other regions as needed. Use the same disk store
for all of the colocated regions that you persist.
diff --git
a/geode-docs/developing/partitioned_regions/custom_partitioning_and_data_colocation.html.md.erb
b/geode-docs/developing/partitioned_regions/custom_partitioning_and_data_colocation.html.md.erb
index 62e5cabf20..ebf8bb9637 100644
---
a/geode-docs/developing/partitioned_regions/custom_partitioning_and_data_colocation.html.md.erb
+++
b/geode-docs/developing/partitioned_regions/custom_partitioning_and_data_colocation.html.md.erb
@@ -23,32 +23,30 @@ Custom partitioning and data colocation can be used
separately or in conjunction
## <a
id="custom_partitioning_and_data_colocation__section_ABFEE9CB17AF44F1AE252AC10FB5E999"
class="no-quick-link"></a>Custom Partitioning
-Use custom partitioning to group like entries into region buckets within a
region. By default, <%=vars.product_name%> assigns new entries to buckets based
on the entry key contents. With custom partitioning, you can assign your
entries to buckets in whatever way you want.
+Use custom partitioning to group like entries into region buckets within a
region. By default, <%=vars.product_name%> assigns new entries to buckets based
on the entry key's hash code. With custom partitioning, you can assign your
entries to buckets in whatever way you want.
-You can generally get better performance if you use custom partitioning to
group similar data within a region. For example, a query run on all accounts
created in January runs faster if all January account data is hosted by a
single member. Grouping all data for a single customer can improve performance
of data operations that work on customer data. Data aware function execution
takes advantage of custom partitioning.
+You can generally get better performance if you use custom partitioning to
group similar data within a region. For example, a query run on all accounts
created in January runs faster if all January account data is hosted by a
single member. Grouping all data for a single customer can improve performance
of data operations that work on customer data. Data aware function execution
also takes advantage of custom partitioning.
-This figure shows a region with customer data that is grouped into buckets by
customer.
+With custom partitioning, you have two choices:
-<img src="../../images_svg/custom_partitioned.svg"
id="custom_partitioning_and_data_colocation__image_1D37D547D3244171BB9CADAEC88E7649"
class="image" />
-
-With custom partitioning, you have three choices:
-
-- **Default string-based partition resolver**. A default partition
-resolver at `org.apache.geode.cache.util.StringPrefixPartitionResolver`
-groups entries into buckets based on a string portion of the key.
-All keys must be strings, specified with a syntax that includes
-a '|' character that delimits the string.
-The substring that precedes the '|' delimiter within the key
-partitions the entry.
-- **Standard custom partitioning**. With standard partitioning, you group
entries into buckets, but you do not specify where the buckets reside.
<%=vars.product_name%> always keeps the entries in the buckets you have
specified, but may move the buckets around for load balancing.
-- **Fixed custom partitioning**. With fixed partitioning, you provide
standard partitioning plus you specify the exact member where each data entry
resides. You do this by assigning the data entry to a bucket and to a partition
and by naming specific members as primary and secondary hosts of each partition.
+- **Standard custom partitioning**. With standard custom partitioning, you
group entries into buckets, but you do not specify where the buckets reside.
<%=vars.product_name%> always keeps the entries in the buckets you have
specified, but may move the buckets around for load balancing.
+See [Standard Custom Partitioning](standard_custom_partitioning.html) for
+implementation and configuration details.
+- **Fixed custom partitioning**. With fixed custom partitioning,
+you specify the exact member where each region entry resides.
+You assign an entry to a partition and then to a bucket within
+that partition.
+You name specific members as primary and secondary hosts of each partition.
This gives you complete control over the locations of your primary and any
secondary buckets for the region. This can be useful when you want to store
specific data on specific physical machines or when you need to keep data close
to certain hardware elements.
Fixed partitioning has these requirements and caveats:
- - <%=vars.product_name%> cannot rebalance fixed partition region data
because it cannot move the buckets around among the host members. You must
carefully consider your expected data loads for the partitions you create.
- - With fixed partitioning, the region configuration is different between
host members. Each member identifies the named partitions it hosts, and whether
it is hosting the primary copy or a secondary copy. You then program fixed
partition resolver to return the partition id, so the entry is placed on the
right members. Only one member can be primary for a particular partition name
and that member cannot be the partition's secondary.
+ - <%=vars.product_name%> cannot rebalance fixed partition region data,
because it cannot move the buckets around among the host members. You must
carefully consider your expected data loads for the partitions you create.
+ - With fixed partitioning, the region configuration is different between
host members. Each member identifies the named partitions it hosts, and whether
it is hosting the primary copy or a secondary copy. You then program a
fixed-partition resolver to return the partition id, so the entry is placed on
the right members. Only one member can be primary for a particular partition
name, and that member cannot be the partition's secondary.
+
+ See [Fixed Custom Partitioning](fixed_custom_partitioning.html) for
+implementation and configuration details.
## <a
id="custom_partitioning_and_data_colocation__section_D2C66951FE38426F9C05050D2B9028D8"
class="no-quick-link"></a>Data Colocation Between Regions
@@ -63,3 +61,5 @@ This figure shows two regions with data colocation where the
data is partitioned
Data colocation requires the same data partitioning mechanism for all of the
colocated regions. You can use the default partitioning provided by
<%=vars.product_name%> or any of the custom partitioning strategies.
You must use the same high availability settings across your colocated regions.
+
+See [Colocate Data from Different Partitioned
Regions](colocating_partitioned_region_data.html) for implementation and
configuration details.
diff --git
a/geode-docs/developing/partitioned_regions/fixed_custom_partitioning.html.md.erb
b/geode-docs/developing/partitioned_regions/fixed_custom_partitioning.html.md.erb
new file mode 100644
index 0000000000..a5f85d8bf3
--- /dev/null
+++
b/geode-docs/developing/partitioned_regions/fixed_custom_partitioning.html.md.erb
@@ -0,0 +1,204 @@
+---
+title: Fixed Custom Partitioning
+---
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements. See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+By default, <%=vars.product_name%> partitions each data entry
+into a bucket using a hashing policy on the key.
+Additionally, the physical location of the key-value pair is
+abstracted away from the application.
+You can change these policies for a partitioned region
+by providing a fixed custom partition resolver that not only maps entries
+to a set of buckets called a partition,
+but also specifies which members host which data buckets.
+
+<a
id="custom_partition_region_data__section_CF05CE974C9C4AF78430DA55601D2158"></a>
+**Note:**
+If you are both colocating region data and custom partitioning,
+all colocated regions must use the same custom partitioning mechanism.
+See [Colocate Data from Different Partitioned
Regions](colocating_partitioned_region_data.html#colocating_partitioned_region_data).
+
+To custom-partition your region data, follow two steps:
+
+- implement the interface
+- configure the regions
+
+These steps differ based on which partition resolver is used.
+
+**Implementing Fixed Custom Partitioning**
+
+- Implement the `org.apache.geode.cache.FixedPartitionResolver`
+interface within one of the following locations,
+listed here in the search order used by <%=vars.product_name%>:
+ - **Custom class**. Specify this class as the partition resolver during
region creation.
+ - **Entry key**. For keys implemented as objects, define the interface
for the key's class.
+ - **Within the cache callback class**. Implement the interface
+within a cache callback's class. When using this implementation,
+any and all `Region` operations must be those that specify the callback
+as a parameter.
+
+- Implement the resolver's `getName`, `init`, and `close` methods.
+
+ A simple implementation of `getName` is
+
+ ``` pre
+ return getClass().getName();
+ ```
+
+ The `init` method does any initialization steps upon cache
+ start that relate to the partition resolver's task.
+
+ The `close` method accomplishes any clean up that must be accomplished
+ before a cache close completes. For example, `close` might close
+ files or connections that the partition resolver opened.
+
+- Implement the resolver's `getRoutingObject` method to return
+the routing object for each entry.
+A hash of that returned routing object determines the bucket
+within a partition.
+
+ This method can be empty for fixed partitioning where there is
+only one bucket per partition.
+That implementation assigns partitions to servers
+such that the application has full control of grouping entries
+on servers.
+
+ **Note:**
+ Only fields on the key should be used when creating the routing object. Do
not use the value or additional metadata for this purpose.
+
+- Implement the `getPartitionName` method
+to return the name of the partition for each entry,
+based on where you want the entries to reside.
+All entries within a partition will be on a single server.
+
+ This example places the data based on date, with a different partition
name for each quarter-year and a different routing object for each month.
+
+ ``` pre
+ /**
+ * Returns one of four different partition names
+ * (Q1, Q2, Q3, Q4) depending on the entry's date
+ */
+ class QuarterFixedPartitionResolver implements
+ FixedPartitionResolver<String, String> {
+
+ @Override
+ public String getPartitionName(EntryOperation<String, String> opDetails,
+ Set<String> targetPartitions) {
+
+ Date date = (Date)opDetails.getKey();
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(date);
+ int month = cal.get(Calendar.MONTH);
+ if (month >= 0 && month < 3) {
+ if (targetPartitions.contains("Q1")) return "Q1";
+ }
+ else if (month >= 3 && month < 6) {
+ if (targetPartitions.contains("Q2")) return "Q2";
+ }
+ else if (month >= 6 && month < 9) {
+ if (targetPartitions.contains("Q3")) return "Q3";
+ }
+ else if (month >= 9 && month < 12) {
+ if (targetPartitions.contains("Q4")) return "Q4";
+ }
+ return "Invalid Quarter";
+ }
+
+ @Override
+ public String getName() {
+ return "QuarterFixedPartitionResolver";
+ }
+
+ @Override
+ public Serializable getRoutingObject(EntryOperation<String, String>
opDetails) {
+ Date date = (Date)opDetails.getKey();
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(date);
+ int month = cal.get(Calendar.MONTH);
+ return month;
+ }
+
+ @Override
+ public void close() {
+ }
+ }
+ ```
+
+**Configuring Fixed Custom Partitioning**
+
+- Set the fixed-partition attributes for each member.
+
+ These attributes define the data stored for the region by the member and
must be different for different members. See
`org.apache.geode.cache.FixedPartitionAttributes` for definitions of the
attributes. Define each `partition-name` in your data-host members for the
region. For each partition name, in the member you want to host the primary
copy, define it with `is-primary` set to `true`. In every member you want to
host the secondary copy, define it with `is-primary` set to `false` (the
default). The number of secondaries must match the number of redundant copies
you have defined for the region. See [Configure High Availability for a
Partitioned Region](configuring_ha_for_pr.html).
+
+ **Note:**
+ Buckets for a partition are hosted only by the members that have defined
the partition name in their `FixedPartitionAttributes`.
+
+ These examples set the partition attributes for a member to be the primary
host for the "Q1" partition data and a secondary host for "Q3" partition data.
+ - XML:
+
+ ``` pre
+ <cache>
+ <region name="Trades">
+ <region-attributes>
+ <partition-attributes redundant-copies="1">
+ <partition-resolver>
+
<class-name>myPackage.QuarterFixedPartitionResolver</class-name>
+ </partition-resolver>
+ <fixed-partition-attributes partition-name="Q1"
is-primary="true"/>
+ <fixed-partition-attributes partition-name="Q3"
is-primary="false"
+ num-buckets="6"/>
+ </partition-attributes>
+ </region-attributes>
+ </region>
+ </cache>
+ ```
+ - Java:
+
+
+ ``` pre
+ FixedPartitionAttribute fpa1 = FixedPartitionAttributes
+ .createFixedPartition("Q1", true);
+ FixedPartitionAttribute fpa3 = FixedPartitionAttributes
+ .createFixedPartition("Q3", false, 6);
+
+ PartitionAttributesFactory paf = new PartitionAttributesFactory()
+ .setPartitionResolver(new QuarterFixedPartitionResolver())
+ .setTotalNumBuckets(12)
+ .setRedundantCopies(2)
+ .addFixedPartitionAttribute(fpa1)
+ .addFixedPartitionAttribute(fpa3);
+
+ Cache c = new CacheFactory().create();
+
+ Region r = c.createRegionFactory()
+ .setPartitionAttributes(paf.create())
+ .create("Trades");
+ ```
+ - gfsh:
+
+ You cannot specify a fixed partition resolver using gfsh.
+
+- If your colocated data is in a server system,
+add the class that implements the `FixedPartitionResolver` interface
+to the `CLASSPATH` of your Java clients.
+For Java single-hop access to work,
+the resolver class needs to have a zero-argument constructor,
+and the resolver class must not have any state;
+the `init` method is included in this restriction.
+
diff --git
a/geode-docs/developing/partitioned_regions/overview_custom_partitioning_and_data_colocation.html.md.erb
b/geode-docs/developing/partitioned_regions/overview_custom_partitioning_and_data_colocation.html.md.erb
index b2ebc08e8b..b5f809af57 100644
---
a/geode-docs/developing/partitioned_regions/overview_custom_partitioning_and_data_colocation.html.md.erb
+++
b/geode-docs/developing/partitioned_regions/overview_custom_partitioning_and_data_colocation.html.md.erb
@@ -25,12 +25,18 @@ You can customize how <%=vars.product_name_long%> groups
your partitioned region
Custom partitioning and data colocation can be used separately or in
conjunction with one another.
-- **[Custom-Partition Your Region
Data](using_custom_partition_resolvers.html)**
+- **[Standard Custom Partitioning](standard_custom_partitioning.html)**
- By default, <%=vars.product_name%> partitions each data entry into a
bucket using a hashing policy on the key. Additionally, the physical location
of the key-value pair is abstracted away from the application. You can change
these policies for a partitioned region. You can provide your own data
partitioning resolver and you can additionally specify which members host which
data buckets.
+ By default, <%=vars.product_name%> partitions each data entry into a
bucket using a hashing policy on the key. Additionally, the physical location
of the key-value pair is abstracted away from the application. You can change
these policies for a partitioned region by providing a standard partition
resolver that maps entries to a set of buckets called a partition.
-- **[Colocate Data from Different Partitioned
Regions](colocating_partitioned_region_data.html)**
+- **[Fixed Custom Partitioning](fixed_custom_partitioning.html)**
+
+ By default, <%=vars.product_name%> partitions each data entry into a
bucket using a hashing policy on the key. Additionally, the physical location
of the key-value pair is abstracted away from the application. You can change
these policies for a partitioned region by providing a fixed partition resolver
that not only maps entries to a set of buckets called a partition, but also
specifies which members host which data buckets.
- By default, <%=vars.product_name%> allocates the data locations for a
partitioned region independent of the data locations for any other partitioned
region. You can change this policy for any group of partitioned regions, so
that cross-region, related data is all hosted by the same member. This
colocation speeds queries and other operations that access data from the
regions.
+- **[Colocate Data from Different Partitioned
Regions](colocating_partitioned_region_data.html)**
+ By default, <%=vars.product_name%> allocates the data locations for a
partitioned region independent of the data locations for any other partitioned
region. You can change this policy for any group of partitioned regions, so
that cross-region, related data is all hosted by the same member.
+Colocation is required for some operations,
+and it increases performance for others by reducing the number of data
+accesses to entries that are hosted on other cluster members.
diff --git
a/geode-docs/developing/partitioned_regions/standard_custom_partitioning.html.md.erb
b/geode-docs/developing/partitioned_regions/standard_custom_partitioning.html.md.erb
new file mode 100644
index 0000000000..6b71b24ca4
--- /dev/null
+++
b/geode-docs/developing/partitioned_regions/standard_custom_partitioning.html.md.erb
@@ -0,0 +1,178 @@
+---
+title: Standard Custom Partitioning
+---
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements. See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+By default, <%=vars.product_name%> partitions each data entry
+into a bucket using a hashing policy on the key.
+Additionally, the physical location of the key-value pair
+is abstracted away from the application.
+You can change these policies for a partitioned region
+by providing a standard custom partition resolver that maps entries
+in a custom manner.
+
+<a
id="custom_partition_region_data__section_CF05CE974C9C4AF78430DA55601D2158"></a>
+**Note:**
+If you are both colocating region data and custom partitioning,
+all colocated regions must use the same custom partitioning mechanism.
+See [Colocate Data from Different Partitioned
Regions](colocating_partitioned_region_data.html#colocating_partitioned_region_data).
+
+To custom-partition your region data, follow two steps:
+
+- implement the interface
+- configure the regions
+
+**Implementing Standard Custom Partitioning**
+
+- Implement the `org.apache.geode.cache.PartitionResolver` interface
+in one of the following ways,
+listed here in the search order used by <%=vars.product_name%>:
+ - **Using a custom class**. Implement the `PartitionResolver` within
your class, and then specify your class as the partition
+resolver during region creation.
+ - **Using the key's class**. Have the entry key's class implement the
`PartitionResolver` interface.
+ - **Using the callback argument's class**. Have the class that
+implements your callback argument implement the `PartitionResolver`
+interface. When using this implementation,
+any and all `Region` operations must be those that specify the callback
+argument.
+
+- Implement the resolver's `getName`, `init`, and `close` methods.
+
+ A simple implementation of `getName` is
+
+ ``` pre
+ return getClass().getName();
+ ```
+
+ The `init` method does any initialization steps upon cache
+ start that relate to the partition resolver's task.
+ This method is only invoked when using a custom class that is
+ configured by `gfsh` or by XML (in a `cache.xml` file).
+
+ The `close` method accomplishes any clean up that must be accomplished
+ before a cache close completes. For example, `close` might close
+ files or connections that the partition resolver opened.
+
+- Implement the resolver's `getRoutingObject` method to return
+the routing object for each entry.
+A hash of that returned routing object determines the bucket.
+Therefore, `getRoutingObject` should return an object that,
+when run through its `hashCode`, directs grouped objects to the
+desired bucket.
+
+ **Note:**
+ Only the key, as returned by `getKey`, should be used by
+`getRoutingObject`. Do not use the value associated with the key or any
additional metadata in the implementation of `getRoutingObject`.
+Do not use `getOperation` or `getValue`.
+
+**Implementing the String Prefix Partition Resolver**
+
+<%=vars.product_name%> provides an implementation of a
+string-based partition resolver in
+`org.apache.geode.cache.util.StringPrefixPartitionResolver`.
+This resolver does not require any further implementation.
+It groups entries into buckets based on a portion of the key.
+All keys must be strings, and each key must include
+a '|' character, which delimits the string.
+The substring that precedes the '|' delimiter within the key
+will be returned by `getRoutingObject`.
+
+**Configuring the Partition Resolver Region Attribute**
+
+Configure the region so <%=vars.product_name%> finds your resolver
+for all region operations.
+
+- **Custom class**.
+Use one of these methods to specify the partition resolver region
+attribute:
+
+ **gfsh:**
+
+ Add the option `--partition-resolver` to the `gfsh create region` command,
specifying the package and class name of the standard custom partition resolver.
+
+ **gfsh for the String Prefix Partition Resolver:**
+
+ Add the option
`--partition-resolver=org.apache.geode.cache.util.StringPrefixPartitionResolver`
to the `gfsh create region` command.
+
+ **Java API:**
+
+ ``` pre
+ PartitionResolver resolver = new TradesPartitionResolver();
+ PartitionAttributes attrs =
+ new PartitionAttributesFactory()
+ .setPartitionResolver(resolver).create();
+
+ Cache c = new CacheFactory().create();
+
+ Region r = c.createRegionFactory()
+ .setPartitionAttributes(attrs)
+ .create("trades");
+ ```
+
+ **Java API for the String Prefix Partition Resolver:**
+
+ ``` pre
+ PartitionAttributes attrs =
+ new PartitionAttributesFactory()
+ .setPartitionResolver(new StringPrefixPartitionResolver()).create();
+
+ Cache c = new CacheFactory().create();
+
+ Region r = c.createRegionFactory()
+ .setPartitionAttributes(attrs)
+ .create("customers");
+ ```
+
+ **XML:**
+
+ ``` pre
+ <region name="trades">
+ <region-attributes>
+ <partition-attributes>
+ <partition-resolver>
+ <class-name>myPackage.TradesPartitionResolver
+ </class-name>
+ </partition-resolver>
+ <partition-attributes>
+ </region-attributes>
+ </region>
+ ```
+
+ **XML for the String Prefix Partition Resolver:**
+
+ ``` pre
+ <region name="customers">
+ <region-attributes>
+ <partition-attributes>
+ <partition-resolver>
+
<class-name>org.apache.geode.cache.util.StringPrefixPartitionResolver
+ </class-name>
+ </partition-resolver>
+ <partition-attributes>
+ </region-attributes>
+ </region>
+ ```
+
+- If your colocated data is in a server system,
+add the `PartitionResolver` implementation class to the `CLASSPATH`
+of your Java clients.
+For Java single-hop access to work,
+the resolver class needs to have a zero-argument constructor,
+and the resolver class must not have any state;
+the `init` method is included in this restriction.
diff --git
a/geode-docs/developing/partitioned_regions/using_custom_partition_resolvers.html.md.erb
b/geode-docs/developing/partitioned_regions/using_custom_partition_resolvers.html.md.erb
index 44b45d81c9..1255f48ab7 100644
---
a/geode-docs/developing/partitioned_regions/using_custom_partition_resolvers.html.md.erb
+++
b/geode-docs/developing/partitioned_regions/using_custom_partition_resolvers.html.md.erb
@@ -19,47 +19,67 @@ See the License for the specific language governing
permissions and
limitations under the License.
-->
-By default, <%=vars.product_name%> partitions each data entry into a bucket
using a hashing policy on the key. Additionally, the physical location of the
key-value pair is abstracted away from the application. You can change these
policies for a partitioned region. You can provide your own data partitioning
resolver and you can additionally specify which members host which data buckets.
+By default, <%=vars.product_name%> partitions each data entry into a bucket
using a hashing policy on the key.
+Additionally, the physical location of the key-value pair
+is abstracted away from the application.
+You can change these policies for a partitioned region by providing
+your own partition resolver.
+The partitioning can go further with a fixed-partition resolver
+that specifies which members host which data buckets.
<a
id="custom_partition_region_data__section_CF05CE974C9C4AF78430DA55601D2158"></a>
**Note:**
-If you are colocating data between regions and custom partitioning the data in
the regions, all colocated regions must use the same custom partitioning
mechanism. See [Colocate Data from Different Partitioned
Regions](colocating_partitioned_region_data.html#colocating_partitioned_region_data).
+If you are both colocating region data and custom partitioning,
+all colocated regions must use the same custom partitioning mechanism.
+See [Colocate Data from Different Partitioned
Regions](colocating_partitioned_region_data.html#colocating_partitioned_region_data).
-<a
id="custom_partition_region_data__section_1D7043815DF24308ABE4C78BFDFEE686"></a>
+To custom-partition your region data, follow two steps:
-For the default implementation of string-based partitioning, use
`org.apache.geode.cache.util.StringPrefixPartitionResolver`.
-For standard partitioning, use `org.apache.geode.cache.PartitionResolver`. To
implement fixed partitioning, use
`org.apache.geode.cache.FixedPartitionResolver`.
+- implement the interface
+- configure the regions
-<a
id="custom_partition_region_data__section_5A8D752F02834146A37D9430F1CA32DA"></a>
+These steps differ based on which partition resolver is used.
-**Prerequisites**
+**Implementing Standard Partitioning**
-- Create partitioned regions. See [Understanding
Partitioning](how_partitioning_works.html) and [Configuring Partitioned
Regions](managing_partitioned_regions.html#configure_partitioned_regions).
-- Decide whether to use the default implementation of the string-based
partitioning, standard custom partitioning, or fixed custom partitioning. See
[Understanding Custom Partitioning and Data
Colocation](custom_partitioning_and_data_colocation.html#custom_partitioning_and_data_colocation).
-- If you also want to colocate data from multiple regions, understand how to
colocate. See [Colocate Data from Different Partitioned
Regions](colocating_partitioned_region_data.html#colocating_partitioned_region_data).
+- Implement the `org.apache.geode.cache.PartitionResolver` interface
+within one of the following locations,
+listed here in the search order used by <%=vars.product_name%>:
+ - **Within a custom class**. Specify this class as the partition
+resolver during region creation.
+ - **Within the key's class**. For keys implemented as objects,
+define the interface within the key's class.
+ - **Within the cache callback class**. Implement the interface
+within a cache callback's class. When using this implementation,
+any and all `Region` operations must be those that specify the callback
+as a parameter.
-**Procedure**
+- Implement the resolver's `getName`, `init`, and `close` methods.
-1. If using `org.apache.geode.cache.PartitionResolver` (standard
partitioning) or `org.apache.geode.cache.FixedPartitionResolver` (fixed
partitioning), implement the standard partitioning resolver or the fixed
partitioning resolver in one of the following locations, listed here in the
search order used by <%=vars.product_name%>:
- - **Custom class**. You provide this class as the partition resolver to
the region creation.
- - **Entry key**. You use the implementing key object for every operation
on the region entries.
- - **Cache callback argument**. This implementation restricts you to
using methods that accept a cache callback argument to manage the region
entries. For a full list of the methods that take a callback argument, see the
`Region` Javadocs.
+ A simple implementation of `getName` is
- If using the default implementation of the string-based
-partition resolver,
`org.apache.geode.cache.util.StringPrefixPartitionResolver`,
-specify all keys with the required syntax.
-Keys are strings, and contain the '|' character as a delimiter.
-The substring that precedes the '|' delimiter will used in the hash
-function that partitions the entry.
-2. If you need the resolver's `getName` method, program that.
-3. If *not* using the default implementation of the string-based
-partition resolver,
-program the resolver's `getRoutingObject` method to return the routing object
for each entry, based on how you want to group the entries. Give the same
routing object to entries you want to group together. <%=vars.product_name%>
will place the entries in the same bucket.
+ ``` pre
+ return getClass().getName();
+ ```
+
+ The `init` method does any initialization steps upon cache
+ start that relate to the partition resolver's task.
+
+ The `close` method accomplishes any clean up that must be accomplished
+ before a cache close completes. For example, `close` might close
+ files or connections that the partition resolver opened.
+
+- Implement the resolver's `getRoutingObject` method to return
+the routing object for each entry.
+A hash of that returned routing object determines the bucket.
+Therefore, `getRoutingObject` should return an object that,
+when run through its `hashCode`, directs grouped objects to the
+desired bucket.
**Note:**
Only fields on the key should be used when creating the routing object. Do
not use the value or additional metadata for this purpose.
- For example, here is an implementation on a region key object that groups
the entries by month and year:
+ For example, here is an implementation on a region key object that groups
using the sum of a month and year:
``` pre
Public class TradeKey implements PartitionResolver
@@ -80,116 +100,120 @@ program the resolver's `getRoutingObject` method to
return the routing object fo
}
```
-4. For fixed partitioning only, program and configure additional fixed
partitioning pieces:
- 1. Set the fixed partition attributes for each member.
+**Implementing the String-Based Partition Resolver**
- These attributes define the data stored for the region by the member
and must be different for different members. See
`org.apache.geode.cache.FixedPartitionAttributes` for definitions of the
attributes. Define each `partition-name` in your data host members for the
region. For each partition name, in the member you want to host the primary
copy, define it with `is-primary` set to `true`. In every member you want to
host the secondary copy, define it with `is-primary` set to `false` (the
default). The number of secondaries must match the number of redundant copies
you have defined for the region. See [Configure High Availability for a
Partitioned Region](configuring_ha_for_pr.html).
+The implementation of a string-based partition resolver is in
+`org.apache.geode.cache.util.StringPrefixPartitionResolver`.
+It does not require any further implementation.
- **Note:**
- Buckets for a partition are hosted only by the members that have
defined the partition name in their `FixedPartitionAttributes`.
- These examples set the partition attributes for a member to be the
primary host for the "Q1" partition data and a secondary host for "Q3"
partition data.
- - XML:
+**Implementing Fixed Partitioning**
- ``` pre
- <cache>
- <region name="Trades">
- <region-attributes>
- <partition-attributes redundant-copies="1">
- <partition-resolver
name="QuarterFixedPartitionResolver">
-
<class-name>myPackage.QuarterFixedPartitionResolver</class-name>
- </partition-resolver>
- <fixed-partition-attributes partition-name="Q1"
is-primary="true"/>
- <fixed-partition-attributes partition-name="Q3"
is-primary="false" num-buckets="6"/>
- </partition-attributes>
- </region-attributes>
- </region>
- </cache>
- ```
- - Java:
+- Implement the `org.apache.geode.cache.FixedPartitionResolver`
+interface within one of the following locations,
+listed here in the search order used by <%=vars.product_name%>:
+ - **Custom class**. Specify this class as the partition resolver during
region creation.
+ - **Entry key**. For keys implemented as objects, define the interface
for the key's class.
+ - **Within the cache callback class**. Implement the interface
+within a cache callback's class. When using this implementation,
+any and all `Region` operations must be those that specify the callback
+as a parameter.
+- Implement the resolver's `getName`, `init`, and `close` methods.
- ``` pre
- FixedPartitionAttribute fpa1 =
FixedPartitionAttributes.createFixedPartition("Q1", true);
- FixedPartitionAttribute fpa3 =
FixedPartitionAttributes.createFixedPartition("Q3", false, 6);
+ A simple implementation of `getName` is
- PartitionAttributesFactory paf = new PartitionAttributesFactory()
- .setPartitionResolver(new QuarterFixedPartitionResolver())
- .setTotalNumBuckets(12)
- .setRedundantCopies(2)
- .addFixedPartitionAttribute(fpa1)
- .addFixedPartitionAttribute(fpa3);
+ ``` pre
+ return getClass().getName();
+ ```
- Cache c = new CacheFactory().create();
+ The `init` method does any initialization steps upon cache
+ start that relate to the partition resolver's task.
- Region r = c.createRegionFactory()
- .setPartitionAttributes(paf.create())
- .create("Trades");
- ```
- - gfsh:
+ The `close` method accomplishes any clean up that must be accomplished
+ before a cache close completes. For example, `close` might close
+ files or connections that the partition resolver opened.
- You cannot specify a partition resolver using gfsh.
+- Implement the resolver's `getRoutingObject` method to return
+the routing object for each entry.
+A hash of that returned routing object determines the bucket
+within a partition.
+
+ This method can be empty for fixed partitioning where there is
+only one bucket per partition.
+That implementation assigns partitions to servers
+such that the application has full control of grouping entries
+on servers.
- 2. Program the `FixedPartitionResolver` `getPartitionName` method to
return the name of the partition for each entry, based on where you want the
entries to reside. <%=vars.product_name%> uses `getPartitionName` and
`getRoutingObject` to determine where an entry is placed.
+ **Note:**
+ Only fields on the key should be used when creating the routing object. Do
not use the value or additional metadata for this purpose.
- **Note:**
- To group entries, assign every entry in the group the same routing
object and the same partition name.
+- Implement the `getPartitionName` method
+to return the name of the partition for each entry,
+based on where you want the entries to reside.
+All entries within a partition will be on a single server.
- This example places the data based on date, with a different partition
name for each quarter-year and a different routing object for each month.
+ This example places the data based on date, with a different partition
name for each quarter-year and a different routing object for each month.
- ``` pre
- /**
- * Returns one of four different partition names
- * (Q1, Q2, Q3, Q4) depending on the entry's date
- */
- class QuarterFixedPartitionResolver implements
- FixedPartitionResolver<String, String> {
-
- @Override
- public String getPartitionName(EntryOperation<String, String>
opDetails,
- Set<String> targetPartitions) {
-
- Date date = (Date)opDetails.getKey();
- Calendar cal = Calendar.getInstance();
- cal.setTime(date);
- int month = cal.get(Calendar.MONTH);
- if (month >= 0 && month < 3) {
- if (targetPartitions.contains("Q1")) return "Q1";
- }
- else if (month >= 3 && month < 6) {
- if (targetPartitions.contains("Q2")) return "Q2";
- }
- else if (month >= 6 && month < 9) {
- if (targetPartitions.contains("Q3")) return "Q3";
- }
- else if (month >= 9 && month < 12) {
- if (targetPartitions.contains("Q4")) return "Q4";
- }
- return "Invalid Quarter";
- }
-
- @Override
- public String getName() {
- return "QuarterFixedPartitionResolver";
- }
-
- @Override
- public Serializable getRoutingObject(EntryOperation<String, String>
opDetails) {
- Date date = (Date)opDetails.getKey();
- Calendar cal = Calendar.getInstance();
- cal.setTime(date);
- int month = cal.get(Calendar.MONTH);
- return month;
- }
-
- @Override
- public void close() {
- }
- }
- ```
+ ``` pre
+ /**
+ * Returns one of four different partition names
+ * (Q1, Q2, Q3, Q4) depending on the entry's date
+ */
+ class QuarterFixedPartitionResolver implements
+ FixedPartitionResolver<String, String> {
+
+ @Override
+ public String getPartitionName(EntryOperation<String, String> opDetails,
+ Set<String> targetPartitions) {
+
+ Date date = (Date)opDetails.getKey();
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(date);
+ int month = cal.get(Calendar.MONTH);
+ if (month >= 0 && month < 3) {
+ if (targetPartitions.contains("Q1")) return "Q1";
+ }
+ else if (month >= 3 && month < 6) {
+ if (targetPartitions.contains("Q2")) return "Q2";
+ }
+ else if (month >= 6 && month < 9) {
+ if (targetPartitions.contains("Q3")) return "Q3";
+ }
+ else if (month >= 9 && month < 12) {
+ if (targetPartitions.contains("Q4")) return "Q4";
+ }
+ return "Invalid Quarter";
+ }
+
+ @Override
+ public String getName() {
+ return "QuarterFixedPartitionResolver";
+ }
+
+ @Override
+ public Serializable getRoutingObject(EntryOperation<String, String>
opDetails) {
+ Date date = (Date)opDetails.getKey();
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(date);
+ int month = cal.get(Calendar.MONTH);
+ return month;
+ }
+
+ @Override
+ public void close() {
+ }
+ }
+ ```
+
+**Configuring Standard Partitioning**
-5. Configure or program the region so <%=vars.product_name%> finds your
resolver for every operation that you perform on the region's entries. How you
do this depends on where you chose to program your custom partitioning
implementation (step 1).
- - **Custom class**. Define the class for the region at creation. The
resolver will be used for every entry operation. Use one of these methods:
+- Configure the region so <%=vars.product_name%> finds your resolver
+for all region operations.
+How you do this depends on where you chose to implement
+your custom partitioning.
+ - **Custom class**. Define the class for the region at creation.
+Use one of these methods:
**XML:**
@@ -197,7 +221,7 @@ program the resolver's `getRoutingObject` method to return
the routing object fo
<region name="trades">
<region-attributes>
<partition-attributes>
- <partition-resolver name="TradesPartitionResolver">
+ <partition-resolver>
<class-name>myPackage.TradesPartitionResolver
</class-name>
</partition-resolver>
@@ -226,15 +250,25 @@ program the resolver's `getRoutingObject` method to
return the routing object fo
- **Entry key**. Use the key object with the resolver implementation for
every entry operation.
- **Cache callback argument**. Provide the argument to every call that
accesses an entry. This restricts you to calls that take a callback argument.
- If using the default implementation of the string-based partition
resolver, configure with one of:
+- If your colocated data is in a server system,
+add the `PartitionResolver` implementation class to the `CLASSPATH`
+of your Java clients.
+For Java single-hop access to work,
+the resolver class needs to have a zero-argument constructor,
+and the resolver class must not have any state;
+the `init` method is included in this restriction.
- **XML:**
+**Configuring the String-Based Partition Resolver**
+
+- Define the class for the region at creation. The resolver will be used for
every entry operation. Use one of these methods:
+ **XML:**
+
``` pre
<region name="customers">
<region-attributes>
<partition-attributes>
- <partition-resolver name="StringPrefixPartitionResolver">
+ <partition-resolver>
<class-name>org.apache.geode.cache.util.StringPrefixPartitionResolver
</class-name>
</partition-resolver>
@@ -243,21 +277,85 @@ program the resolver's `getRoutingObject` method to
return the routing object fo
</region>
```
**Java API:**
-
+
``` pre
PartitionAttributes attrs =
new PartitionAttributesFactory()
.setPartitionResolver("StringPrefixPartitionResolver").create();
-
+
Cache c = new CacheFactory().create();
-
+
Region r = c.createRegionFactory()
.setPartitionAttributes(attrs)
.create("customers");
```
**gfsh:**
-
+
Add the option
`--partition-resolver=org.apache.geode.cache.util.StringPrefixPartitionResolver`
to the `gfsh create region` command.
-6. If your colocated data is in a server system, add the `PartitionResolver`
implementation class to the `CLASSPATH` of your Java clients. The resolver is
used for single hop access to partitioned region data in the servers.
+- For colocated data, add the `StringPrefixPartitionResolver`
+implementation class to the `CLASSPATH` of your Java clients.
+The resolver will work with Java single-hop clients.
+
+**Configuring Fixed Partitioning**
+
+- Set the fixed-partition attributes for each member.
+
+ These attributes define the data stored for the region by the member and
must be different for different members. See
`org.apache.geode.cache.FixedPartitionAttributes` for definitions of the
attributes. Define each `partition-name` in your data-host members for the
region. For each partition name, in the member you want to host the primary
copy, define it with `is-primary` set to `true`. In every member you want to
host the secondary copy, define it with `is-primary` set to `false` (the
default). The number of secondaries must match the number of redundant copies
you have defined for the region. See [Configure High Availability for a
Partitioned Region](configuring_ha_for_pr.html).
+
+ **Note:**
+ Buckets for a partition are hosted only by the members that have defined
the partition name in their `FixedPartitionAttributes`.
+
+ These examples set the partition attributes for a member to be the primary
host for the "Q1" partition data and a secondary host for "Q3" partition data.
+ - XML:
+
+ ``` pre
+ <cache>
+ <region name="Trades">
+ <region-attributes>
+ <partition-attributes redundant-copies="1">
+ <partition-resolver>
+
<class-name>myPackage.QuarterFixedPartitionResolver</class-name>
+ </partition-resolver>
+ <fixed-partition-attributes partition-name="Q1"
is-primary="true"/>
+ <fixed-partition-attributes partition-name="Q3"
is-primary="false"
+ num-buckets="6"/>
+ </partition-attributes>
+ </region-attributes>
+ </region>
+ </cache>
+ ```
+ - Java:
+
+
+ ``` pre
+ FixedPartitionAttribute fpa1 = FixedPartitionAttributes
+ .createFixedPartition("Q1", true);
+ FixedPartitionAttribute fpa3 = FixedPartitionAttributes
+ .createFixedPartition("Q3", false, 6);
+
+ PartitionAttributesFactory paf = new PartitionAttributesFactory()
+ .setPartitionResolver(new QuarterFixedPartitionResolver())
+ .setTotalNumBuckets(12)
+ .setRedundantCopies(2)
+ .addFixedPartitionAttribute(fpa1)
+ .addFixedPartitionAttribute(fpa3);
+
+ Cache c = new CacheFactory().create();
+
+ Region r = c.createRegionFactory()
+ .setPartitionAttributes(paf.create())
+ .create("Trades");
+ ```
+ - gfsh:
+
+ You cannot specify a fixed partition resolver using gfsh.
+
+- If your colocated data is in a server system,
+add the class that implements the `FixedPartitionResolver` interface
+to the `CLASSPATH` of your Java clients.
+For Java single-hop access to work,
+the resolver class needs to have a zero-argument constructor,
+and the resolver class must not have any state;
+the `init` method is included in this restriction.
diff --git a/geode-docs/images_svg/custom_partitioned.svg
b/geode-docs/images_svg/custom_partitioned.svg
deleted file mode 100644
index e952a5c090..0000000000
--- a/geode-docs/images_svg/custom_partitioned.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg"
xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="102 228 392 186"
width="392pt" height="186pt"
xmlns:dc="http://purl.org/dc/elements/1.1/"><metadata> Produced by OmniGraffle
6.0.5 <dc:date>2015-04-07 10:07Z</dc:date></metadata><defs><filter id="Shadow"
filterUnits="userSpaceOnUse"><feGaussianBlur in="SourceAlpha" result="blur"
stdDeviation="1.308"/><feOffset in="blur" result="offset" dx="2.16"
dy="2.16"/><feFlood flood-color="#4f4f4f" flood-opacity=".30000001"
result="flood"/><feComposite in="flood" in2="offset"
operator="in"/></filter><filter id="Shadow_2"
filterUnits="userSpaceOnUse"><feGaussianBlur in="SourceAlpha" result="blur"
stdDeviation="1.308"/><feOffset in="blur" result="offset" dx="2.16"
dy="2.16"/><feFlood flood-color="white" flood-opacity=".30000001"
result="flood"/><feComposite in="flood" in2="offset"
operator="in"/></filter><radialGradient cx="0" cy="0" r="1" id="Gradient"
gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#7ca8c4"
stop-opacity=".65"/><stop offset="1" stop-color="#a8c6d9"
stop-opacity=".65"/></radialGradient><radialGradient id="Obj_Gradient"
xl:href="#Gradient" gradientTransform="translate(268.875 396)
scale(162.99823)"/><font-face font-family="Helvetica" font-size="14"
units-per-em="1000" underline-position="-75.683594"
underline-thickness="49.316406" slope="0" x-height="522.94922"
cap-height="717.28516" ascent="770.01953" descent="-229.98047"
font-weight="500"><font-face-src><font-face-name
name="Helvetica"/></font-face-src></font-face><radialGradient cx="0" cy="0"
r="1" id="Gradient_2" gradientUnits="userSpaceOnUse"><stop offset="0"
stop-color="white" stop-opacity=".65"/><stop offset="1" stop-color="white"
stop-opacity=".65"/></radialGradient><radialGradient id="Obj_Gradient_2"
xl:href="#Gradient_2" gradientTransform="translate(243 378)
scale(111.19134)"/><font-face font-family="Helvetica" font-size="10"
units-per-em="1000" underline-position="-75.683594"
underline-thickness="49.316406" slope="0" x-height="522.94922"
cap-height="717.28516" ascent="770.01953" descent="-229.98047"
font-weight="500"><font-face-src><font-face-name
name="Helvetica"/></font-face-src></font-face><radialGradient cx="0" cy="0"
r="1" id="Gradient_3" gradientUnits="userSpaceOnUse"><stop offset="0"
stop-color="#e2edf3" stop-opacity=".65"/><stop offset="1" stop-color="#e2edf3"
stop-opacity=".65"/></radialGradient><radialGradient id="Obj_Gradient_3"
xl:href="#Gradient_3" gradientTransform="translate(169.31531 300.02344)
rotate(-90) scale(25.654718)"/><radialGradient id="Obj_Gradient_4"
xl:href="#Gradient_3" gradientTransform="translate(199.54969 300.02344)
rotate(-90) scale(25.654718)"/><radialGradient id="Obj_Gradient_5"
xl:href="#Gradient_3" gradientTransform="translate(229.78406 300.02344)
rotate(-90) scale(25.654718)"/><radialGradient id="Obj_Gradient_6"
xl:href="#Gradient" gradientTransform="translate(476.47125 396)
scale(162.99823)"/><radialGradient id="Obj_Gradient_7" xl:href="#Gradient_3"
gradientTransform="translate(169.31531 338.90625) rotate(-90)
scale(25.654718)"/><radialGradient id="Obj_Gradient_8" xl:href="#Gradient_3"
gradientTransform="translate(199.54969 338.90625) rotate(-90)
scale(25.654718)"/><radialGradient id="Obj_Gradient_9" xl:href="#Gradient_3"
gradientTransform="translate(229.78406 338.90625) rotate(-90)
scale(25.654718)"/><radialGradient id="Obj_Gradient_a" xl:href="#Gradient_2"
gradientTransform="translate(451.78875 378) scale(111.19134)"/><radialGradient
id="Obj_Gradient_b" xl:href="#Gradient_3"
gradientTransform="translate(378.10406 300.02344) rotate(-90)
scale(25.654718)"/><radialGradient id="Obj_Gradient_c" xl:href="#Gradient_3"
gradientTransform="translate(408.33844 300.02344) rotate(-90)
scale(25.654718)"/><radialGradient id="Obj_Gradient_d" xl:href="#Gradient_3"
gradientTransform="translate(438.5728 300.02344) rotate(-90)
scale(25.654718)"/><radialGradient id="Obj_Gradient_e" xl:href="#Gradient_3"
gradientTransform="translate(378.10406 338.90625) rotate(-90)
scale(25.654718)"/><radialGradient id="Obj_Gradient_f" xl:href="#Gradient_3"
gradientTransform="translate(408.33844 338.90625) rotate(-90)
scale(25.654718)"/><radialGradient id="Obj_Gradient_10" xl:href="#Gradient_3"
gradientTransform="translate(438.5728 338.90625) rotate(-90)
scale(25.654718)"/><radialGradient cx="0" cy="0" r="1" id="Gradient_4"
gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#a8c6d9"
stop-opacity=".65"/><stop offset="1" stop-color="white"
stop-opacity=".65"/></radialGradient><radialGradient id="Obj_Gradient_11"
xl:href="#Gradient_4" gradientTransform="translate(234 324)
scale(70.113256)"/><font-face font-family="Helvetica" font-size="10"
units-per-em="1000" underline-position="-75.683594"
underline-thickness="49.316406" slope="0" x-height="532.22656"
cap-height="719.72656" ascent="770.01953" descent="-229.98047"
font-weight="bold"><font-face-src><font-face-name
name="Helvetica-Bold"/></font-face-src></font-face><radialGradient
id="Obj_Gradient_12" xl:href="#Gradient_4"
gradientTransform="translate(234.59625 362.57304)
scale(70.113256)"/><radialGradient id="Obj_Gradient_13" xl:href="#Gradient_4"
gradientTransform="translate(442.1925 324) scale(70.113256)"/><radialGradient
id="Obj_Gradient_14" xl:href="#Gradient_4"
gradientTransform="translate(442.1925 361.28652) scale(70.113256)"/></defs><g
stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none"
fill-opacity="1"><title>custom_partitioning</title><g><title>Layer
1</title><g><xl:use xl:href="#id3_Graphic" filter="url(#Shadow)"/><xl:use
xl:href="#id4_Graphic" filter="url(#Shadow_2)"/><xl:use xl:href="#id5_Graphic"
filter="url(#Shadow)"/><xl:use xl:href="#id6_Graphic"
filter="url(#Shadow)"/><xl:use xl:href="#id7_Graphic"
filter="url(#Shadow)"/><xl:use xl:href="#id9_Graphic"
filter="url(#Shadow)"/><xl:use xl:href="#id10_Graphic"
filter="url(#Shadow)"/><xl:use xl:href="#id11_Graphic"
filter="url(#Shadow)"/><xl:use xl:href="#id12_Graphic"
filter="url(#Shadow)"/><xl:use xl:href="#id14_Graphic"
filter="url(#Shadow_2)"/><xl:use xl:href="#id15_Graphic"
filter="url(#Shadow)"/><xl:use xl:href="#id16_Graphic"
filter="url(#Shadow)"/><xl:use xl:href="#id17_Graphic"
filter="url(#Shadow)"/><xl:use xl:href="#id19_Graphic"
filter="url(#Shadow)"/><xl:use xl:href="#id20_Graphic"
filter="url(#Shadow)"/><xl:use xl:href="#id21_Graphic"
filter="url(#Shadow)"/><xl:use xl:href="#id23_Graphic"
filter="url(#Shadow_2)"/><xl:use xl:href="#id24_Graphic"
filter="url(#Shadow_2)"/><xl:use xl:href="#id25_Graphic"
filter="url(#Shadow_2)"/><xl:use xl:href="#id26_Graphic"
filter="url(#Shadow_2)"/></g><g id="id3_Graphic"><path d="M 122.4675 241.7175 L
262.215 241.7175 C 265.89322 241.7175 268.875 244.69928 268.875 248.3775 L
268.875 389.34 C 268.875 393.01822 265.89322 396 262.215 396 L 122.4675 396 C
118.78928 396 115.8075 393.01822 115.8075 389.34 L 115.8075 248.3775 C 115.8075
244.69928 118.78928 241.7175 122.4675 241.7175 Z"
fill="url(#Obj_Gradient)"/><path d="M 122.4675 241.7175 L 262.215 241.7175 C
265.89322 241.7175 268.875 244.69928 268.875 248.3775 L 268.875 389.34 C
268.875 393.01822 265.89322 396 262.215 396 L 122.4675 396 C 118.78928 396
115.8075 393.01822 115.8075 389.34 L 115.8075 248.3775 C 115.8075 244.69928
118.78928 241.7175 122.4675 241.7175 Z" stroke="#252525" stroke-linecap="round"
stroke-linejoin="round" stroke-width=".72000003"/><text
transform="translate(119.8075 245.7175)" fill="black"><tspan
font-family="Helvetica" font-size="14" font-weight="500" fill="black"
x="61.060664" y="14" textLength="84.006836">Member (M1)</tspan></text></g><g
id="id4_Graphic"><path d="M 140.4675 277.7175 L 236.34 277.7175 C 240.01822
277.7175 243 280.69928 243 284.3775 L 243 371.34 C 243 375.01822 240.01822 378
236.34 378 L 140.4675 378 C 136.78928 378 133.8075 375.01822 133.8075 371.34 L
133.8075 284.3775 C 133.8075 280.69928 136.78928 277.7175 140.4675 277.7175 Z"
fill="url(#Obj_Gradient_2)"/><path d="M 140.4675 277.7175 L 236.34 277.7175 C
240.01822 277.7175 243 280.69928 243 284.3775 L 243 371.34 C 243 375.01822
240.01822 378 236.34 378 L 140.4675 378 C 136.78928 378 133.8075 375.01822
133.8075 371.34 L 133.8075 284.3775 C 133.8075 280.69928 136.78928 277.7175
140.4675 277.7175 Z" stroke="#252525" stroke-linecap="round"
stroke-linejoin="round" stroke-width=".72000003"/><text
transform="translate(135.8075 279.7175)" fill="black"><tspan
font-family="Helvetica" font-size="10" font-weight="500" fill="black"
x="13.5693945" y="10" textLength="73.930664">Partition Region </tspan><tspan
font-family="Helvetica" font-size="10" font-weight="500" fill="black"
x="86.953184" y="10" textLength="6.669922">A</tspan></text></g><g
id="id5_Graphic"><path d="M 145.12781 317.55094 L 145.12781 306.68344 C
145.12781 303.00522 148.10959 300.02344 151.78781 300.02344 C 151.78781
300.02344 151.78781 300.02344 151.78781 300.02344 L 162.65531 300.02344 C
166.33353 300.02344 169.31531 303.00522 169.31531 306.68344 L 169.31531
317.55094 C 169.31531 321.22916 166.33353 324.21094 162.65531 324.21094 C
162.65531 324.21094 162.65531 324.21094 162.65531 324.21094 L 151.78781
324.21094 C 148.10959 324.21094 145.12781 321.22916 145.12781 317.55094 Z"
fill="url(#Obj_Gradient_3)"/><path d="M 145.12781 317.55094 L 145.12781
306.68344 C 145.12781 303.00522 148.10959 300.02344 151.78781 300.02344 C
151.78781 300.02344 151.78781 300.02344 151.78781 300.02344 L 162.65531
300.02344 C 166.33353 300.02344 169.31531 303.00522 169.31531 306.68344 L
169.31531 317.55094 C 169.31531 321.22916 166.33353 324.21094 162.65531
324.21094 C 162.65531 324.21094 162.65531 324.21094 162.65531 324.21094 L
151.78781 324.21094 C 148.10959 324.21094 145.12781 321.22916 145.12781
317.55094 Z" stroke="#252525" stroke-linecap="round" stroke-linejoin="round"
stroke-width=".72000003" stroke-dasharray="1,5"/></g><g id="id6_Graphic"><path
d="M 175.36219 317.55094 L 175.36219 306.68344 C 175.36219 303.00522 178.34397
300.02344 182.02219 300.02344 C 182.02219 300.02344 182.02219 300.02344
182.02219 300.02344 L 192.88969 300.02344 C 196.56791 300.02344 199.54969
303.00522 199.54969 306.68344 L 199.54969 317.55094 C 199.54969 321.22916
196.56791 324.21094 192.88969 324.21094 C 192.88969 324.21094 192.88969
324.21094 192.88969 324.21094 L 182.02219 324.21094 C 178.34397 324.21094
175.36219 321.22916 175.36219 317.55094 Z" fill="url(#Obj_Gradient_4)"/><path
d="M 175.36219 317.55094 L 175.36219 306.68344 C 175.36219 303.00522 178.34397
300.02344 182.02219 300.02344 C 182.02219 300.02344 182.02219 300.02344
182.02219 300.02344 L 192.88969 300.02344 C 196.56791 300.02344 199.54969
303.00522 199.54969 306.68344 L 199.54969 317.55094 C 199.54969 321.22916
196.56791 324.21094 192.88969 324.21094 C 192.88969 324.21094 192.88969
324.21094 192.88969 324.21094 L 182.02219 324.21094 C 178.34397 324.21094
175.36219 321.22916 175.36219 317.55094 Z" stroke="#252525"
stroke-linecap="round" stroke-linejoin="round" stroke-width=".72000003"
stroke-dasharray="1,5"/></g><g id="id7_Graphic"><path d="M 205.59656 317.55094
L 205.59656 306.68344 C 205.59656 303.00522 208.57834 300.02344 212.25656
300.02344 C 212.25656 300.02344 212.25656 300.02344 212.25656 300.02344 L
223.12406 300.02344 C 226.80228 300.02344 229.78406 303.00522 229.78406
306.68344 L 229.78406 317.55094 C 229.78406 321.22916 226.80228 324.21094
223.12406 324.21094 C 223.12406 324.21094 223.12406 324.21094 223.12406
324.21094 L 212.25656 324.21094 C 208.57834 324.21094 205.59656 321.22916
205.59656 317.55094 Z" fill="url(#Obj_Gradient_5)"/><path d="M 205.59656
317.55094 L 205.59656 306.68344 C 205.59656 303.00522 208.57834 300.02344
212.25656 300.02344 C 212.25656 300.02344 212.25656 300.02344 212.25656
300.02344 L 223.12406 300.02344 C 226.80228 300.02344 229.78406 303.00522
229.78406 306.68344 L 229.78406 317.55094 C 229.78406 321.22916 226.80228
324.21094 223.12406 324.21094 C 223.12406 324.21094 223.12406 324.21094
223.12406 324.21094 L 212.25656 324.21094 C 208.57834 324.21094 205.59656
321.22916 205.59656 317.55094 Z" stroke="#252525" stroke-linecap="round"
stroke-linejoin="round" stroke-width=".72000003"
stroke-dasharray="1,5"/></g><rect x="139.5" y="297" width="99"
height="30.234384" stroke="#252525" stroke-linecap="round"
stroke-linejoin="round" stroke-width=".72000003"/><g id="id9_Graphic"><path
d="M 330.06375 241.7175 L 469.81125 241.7175 C 473.48947 241.7175 476.47125
244.69928 476.47125 248.3775 L 476.47125 389.34 C 476.47125 393.01822 473.48947
396 469.81125 396 L 330.06375 396 C 326.38553 396 323.40375 393.01822 323.40375
389.34 L 323.40375 248.3775 C 323.40375 244.69928 326.38553 241.7175 330.06375
241.7175 Z" fill="url(#Obj_Gradient_6)"/><path d="M 330.06375 241.7175 L
469.81125 241.7175 C 473.48947 241.7175 476.47125 244.69928 476.47125 248.3775
L 476.47125 389.34 C 476.47125 393.01822 473.48947 396 469.81125 396 L
330.06375 396 C 326.38553 396 323.40375 393.01822 323.40375 389.34 L 323.40375
248.3775 C 323.40375 244.69928 326.38553 241.7175 330.06375 241.7175 Z"
stroke="#252525" stroke-linecap="round" stroke-linejoin="round"
stroke-width=".72000003"/><text transform="translate(327.40375 245.7175)"
fill="black"><tspan font-family="Helvetica" font-size="14" font-weight="500"
fill="black" x="61.060664" y="14" textLength="84.006836">Member
(M2)</tspan></text></g><g id="id10_Graphic"><path d="M 145.12781 356.43375 L
145.12781 345.56625 C 145.12781 341.88803 148.10959 338.90625 151.78781
338.90625 C 151.78781 338.90625 151.78781 338.90625 151.78781 338.90625 L
162.65531 338.90625 C 166.33353 338.90625 169.31531 341.88803 169.31531
345.56625 L 169.31531 356.43375 C 169.31531 360.11197 166.33353 363.09375
162.65531 363.09375 C 162.65531 363.09375 162.65531 363.09375 162.65531
363.09375 L 151.78781 363.09375 C 148.10959 363.09375 145.12781 360.11197
145.12781 356.43375 Z" fill="url(#Obj_Gradient_7)"/><path d="M 145.12781
356.43375 L 145.12781 345.56625 C 145.12781 341.88803 148.10959 338.90625
151.78781 338.90625 C 151.78781 338.90625 151.78781 338.90625 151.78781
338.90625 L 162.65531 338.90625 C 166.33353 338.90625 169.31531 341.88803
169.31531 345.56625 L 169.31531 356.43375 C 169.31531 360.11197 166.33353
363.09375 162.65531 363.09375 C 162.65531 363.09375 162.65531 363.09375
162.65531 363.09375 L 151.78781 363.09375 C 148.10959 363.09375 145.12781
360.11197 145.12781 356.43375 Z" stroke="#252525" stroke-linecap="round"
stroke-linejoin="round" stroke-width=".72000003" stroke-dasharray="1,5"/></g><g
id="id11_Graphic"><path d="M 175.36219 356.43375 L 175.36219 345.56625 C
175.36219 341.88803 178.34397 338.90625 182.02219 338.90625 C 182.02219
338.90625 182.02219 338.90625 182.02219 338.90625 L 192.88969 338.90625 C
196.56791 338.90625 199.54969 341.88803 199.54969 345.56625 L 199.54969
356.43375 C 199.54969 360.11197 196.56791 363.09375 192.88969 363.09375 C
192.88969 363.09375 192.88969 363.09375 192.88969 363.09375 L 182.02219
363.09375 C 178.34397 363.09375 175.36219 360.11197 175.36219 356.43375 Z"
fill="url(#Obj_Gradient_8)"/><path d="M 175.36219 356.43375 L 175.36219
345.56625 C 175.36219 341.88803 178.34397 338.90625 182.02219 338.90625 C
182.02219 338.90625 182.02219 338.90625 182.02219 338.90625 L 192.88969
338.90625 C 196.56791 338.90625 199.54969 341.88803 199.54969 345.56625 L
199.54969 356.43375 C 199.54969 360.11197 196.56791 363.09375 192.88969
363.09375 C 192.88969 363.09375 192.88969 363.09375 192.88969 363.09375 L
182.02219 363.09375 C 178.34397 363.09375 175.36219 360.11197 175.36219
356.43375 Z" stroke="#252525" stroke-linecap="round" stroke-linejoin="round"
stroke-width=".72000003" stroke-dasharray="1,5"/></g><g id="id12_Graphic"><path
d="M 205.59656 356.43375 L 205.59656 345.56625 C 205.59656 341.88803 208.57834
338.90625 212.25656 338.90625 C 212.25656 338.90625 212.25656 338.90625
212.25656 338.90625 L 223.12406 338.90625 C 226.80228 338.90625 229.78406
341.88803 229.78406 345.56625 L 229.78406 356.43375 C 229.78406 360.11197
226.80228 363.09375 223.12406 363.09375 C 223.12406 363.09375 223.12406
363.09375 223.12406 363.09375 L 212.25656 363.09375 C 208.57834 363.09375
205.59656 360.11197 205.59656 356.43375 Z" fill="url(#Obj_Gradient_9)"/><path
d="M 205.59656 356.43375 L 205.59656 345.56625 C 205.59656 341.88803 208.57834
338.90625 212.25656 338.90625 C 212.25656 338.90625 212.25656 338.90625
212.25656 338.90625 L 223.12406 338.90625 C 226.80228 338.90625 229.78406
341.88803 229.78406 345.56625 L 229.78406 356.43375 C 229.78406 360.11197
226.80228 363.09375 223.12406 363.09375 C 223.12406 363.09375 223.12406
363.09375 223.12406 363.09375 L 212.25656 363.09375 C 208.57834 363.09375
205.59656 360.11197 205.59656 356.43375 Z" stroke="#252525"
stroke-linecap="round" stroke-linejoin="round" stroke-width=".72000003"
stroke-dasharray="1,5"/></g><rect x="139.5" y="335.8828" width="99"
height="30.234384" stroke="#252525" stroke-linecap="round"
stroke-linejoin="round" stroke-width=".72000003"/><g id="id14_Graphic"><path
d="M 349.25625 277.7175 L 445.12875 277.7175 C 448.80697 277.7175 451.78875
280.69928 451.78875 284.3775 L 451.78875 371.34 C 451.78875 375.01822 448.80697
378 445.12875 378 L 349.25625 378 C 345.57803 378 342.59625 375.01822 342.59625
371.34 L 342.59625 284.3775 C 342.59625 280.69928 345.57803 277.7175 349.25625
277.7175 Z" fill="url(#Obj_Gradient_a)"/><path d="M 349.25625 277.7175 L
445.12875 277.7175 C 448.80697 277.7175 451.78875 280.69928 451.78875 284.3775
L 451.78875 371.34 C 451.78875 375.01822 448.80697 378 445.12875 378 L
349.25625 378 C 345.57803 378 342.59625 375.01822 342.59625 371.34 L 342.59625
284.3775 C 342.59625 280.69928 345.57803 277.7175 349.25625 277.7175 Z"
stroke="#252525" stroke-linecap="round" stroke-linejoin="round"
stroke-width=".72000003"/><text transform="translate(344.59625 279.7175)"
fill="black"><tspan font-family="Helvetica" font-size="10" font-weight="500"
fill="black" x="13.5693945" y="10" textLength="73.930664">Partition Region
</tspan><tspan font-family="Helvetica" font-size="10" font-weight="500"
fill="black" x="86.953184" y="10" textLength="6.669922">A</tspan></text></g><g
id="id15_Graphic"><path d="M 353.91656 317.55094 L 353.91656 306.68344 C
353.91656 303.00522 356.89834 300.02344 360.57656 300.02344 L 371.44406
300.02344 C 375.12228 300.02344 378.10406 303.00522 378.10406 306.68344 L
378.10406 317.55094 C 378.10406 321.22916 375.12228 324.21094 371.44406
324.21094 L 360.57656 324.21094 C 356.89834 324.21094 353.91656 321.22916
353.91656 317.55094 C 353.91656 317.55094 353.91656 317.55094 353.91656
317.55094 Z" fill="url(#Obj_Gradient_b)"/><path d="M 353.91656 317.55094 L
353.91656 306.68344 C 353.91656 303.00522 356.89834 300.02344 360.57656
300.02344 L 371.44406 300.02344 C 375.12228 300.02344 378.10406 303.00522
378.10406 306.68344 L 378.10406 317.55094 C 378.10406 321.22916 375.12228
324.21094 371.44406 324.21094 L 360.57656 324.21094 C 356.89834 324.21094
353.91656 321.22916 353.91656 317.55094 C 353.91656 317.55094 353.91656
317.55094 353.91656 317.55094 Z" stroke="#252525" stroke-linecap="round"
stroke-linejoin="round" stroke-width=".72000003" stroke-dasharray="1,5"/></g><g
id="id16_Graphic"><path d="M 384.15094 317.55094 L 384.15094 306.68344 C
384.15094 303.00522 387.13272 300.02344 390.81094 300.02344 L 401.67844
300.02344 C 405.35666 300.02344 408.33844 303.00522 408.33844 306.68344 L
408.33844 317.55094 C 408.33844 321.22916 405.35666 324.21094 401.67844
324.21094 L 390.81094 324.21094 C 387.13272 324.21094 384.15094 321.22916
384.15094 317.55094 C 384.15094 317.55094 384.15094 317.55094 384.15094
317.55094 Z" fill="url(#Obj_Gradient_c)"/><path d="M 384.15094 317.55094 L
384.15094 306.68344 C 384.15094 303.00522 387.13272 300.02344 390.81094
300.02344 L 401.67844 300.02344 C 405.35666 300.02344 408.33844 303.00522
408.33844 306.68344 L 408.33844 317.55094 C 408.33844 321.22916 405.35666
324.21094 401.67844 324.21094 L 390.81094 324.21094 C 387.13272 324.21094
384.15094 321.22916 384.15094 317.55094 C 384.15094 317.55094 384.15094
317.55094 384.15094 317.55094 Z" stroke="#252525" stroke-linecap="round"
stroke-linejoin="round" stroke-width=".72000003" stroke-dasharray="1,5"/></g><g
id="id17_Graphic"><path d="M 414.3853 317.55094 L 414.3853 306.68344 C 414.3853
303.00522 417.3671 300.02344 421.0453 300.02344 L 431.9128 300.02344 C
435.59103 300.02344 438.5728 303.00522 438.5728 306.68344 L 438.5728 317.55094
C 438.5728 321.22916 435.59103 324.21094 431.9128 324.21094 L 421.0453
324.21094 C 417.3671 324.21094 414.3853 321.22916 414.3853 317.55094 C 414.3853
317.55094 414.3853 317.55094 414.3853 317.55094 Z"
fill="url(#Obj_Gradient_d)"/><path d="M 414.3853 317.55094 L 414.3853 306.68344
C 414.3853 303.00522 417.3671 300.02344 421.0453 300.02344 L 431.9128 300.02344
C 435.59103 300.02344 438.5728 303.00522 438.5728 306.68344 L 438.5728
317.55094 C 438.5728 321.22916 435.59103 324.21094 431.9128 324.21094 L
421.0453 324.21094 C 417.3671 324.21094 414.3853 321.22916 414.3853 317.55094 C
414.3853 317.55094 414.3853 317.55094 414.3853 317.55094 Z" stroke="#252525"
stroke-linecap="round" stroke-linejoin="round" stroke-width=".72000003"
stroke-dasharray="1,5"/></g><rect x="348.28875" y="297" width="99"
height="30.234384" stroke="#252525" stroke-linecap="round"
stroke-linejoin="round" stroke-width=".72000003"/><g id="id19_Graphic"><path
d="M 353.91656 356.43375 L 353.91656 345.56625 C 353.91656 341.88803 356.89834
338.90625 360.57656 338.90625 L 371.44406 338.90625 C 375.12228 338.90625
378.10406 341.88803 378.10406 345.56625 L 378.10406 356.43375 C 378.10406
360.11197 375.12228 363.09375 371.44406 363.09375 L 360.57656 363.09375 C
356.89834 363.09375 353.91656 360.11197 353.91656 356.43375 C 353.91656
356.43375 353.91656 356.43375 353.91656 356.43375 Z"
fill="url(#Obj_Gradient_e)"/><path d="M 353.91656 356.43375 L 353.91656
345.56625 C 353.91656 341.88803 356.89834 338.90625 360.57656 338.90625 L
371.44406 338.90625 C 375.12228 338.90625 378.10406 341.88803 378.10406
345.56625 L 378.10406 356.43375 C 378.10406 360.11197 375.12228 363.09375
371.44406 363.09375 L 360.57656 363.09375 C 356.89834 363.09375 353.91656
360.11197 353.91656 356.43375 C 353.91656 356.43375 353.91656 356.43375
353.91656 356.43375 Z" stroke="#252525" stroke-linecap="round"
stroke-linejoin="round" stroke-width=".72000003" stroke-dasharray="1,5"/></g><g
id="id20_Graphic"><path d="M 384.15094 356.43375 L 384.15094 345.56625 C
384.15094 341.88803 387.13272 338.90625 390.81094 338.90625 L 401.67844
338.90625 C 405.35666 338.90625 408.33844 341.88803 408.33844 345.56625 L
408.33844 356.43375 C 408.33844 360.11197 405.35666 363.09375 401.67844
363.09375 L 390.81094 363.09375 C 387.13272 363.09375 384.15094 360.11197
384.15094 356.43375 C 384.15094 356.43375 384.15094 356.43375 384.15094
356.43375 Z" fill="url(#Obj_Gradient_f)"/><path d="M 384.15094 356.43375 L
384.15094 345.56625 C 384.15094 341.88803 387.13272 338.90625 390.81094
338.90625 L 401.67844 338.90625 C 405.35666 338.90625 408.33844 341.88803
408.33844 345.56625 L 408.33844 356.43375 C 408.33844 360.11197 405.35666
363.09375 401.67844 363.09375 L 390.81094 363.09375 C 387.13272 363.09375
384.15094 360.11197 384.15094 356.43375 C 384.15094 356.43375 384.15094
356.43375 384.15094 356.43375 Z" stroke="#252525" stroke-linecap="round"
stroke-linejoin="round" stroke-width=".72000003" stroke-dasharray="1,5"/></g><g
id="id21_Graphic"><path d="M 414.3853 356.43375 L 414.3853 345.56625 C 414.3853
341.88803 417.3671 338.90625 421.0453 338.90625 L 431.9128 338.90625 C
435.59103 338.90625 438.5728 341.88803 438.5728 345.56625 L 438.5728 356.43375
C 438.5728 360.11197 435.59103 363.09375 431.9128 363.09375 L 421.0453
363.09375 C 417.3671 363.09375 414.3853 360.11197 414.3853 356.43375 C 414.3853
356.43375 414.3853 356.43375 414.3853 356.43375 Z"
fill="url(#Obj_Gradient_10)"/><path d="M 414.3853 356.43375 L 414.3853
345.56625 C 414.3853 341.88803 417.3671 338.90625 421.0453 338.90625 L 431.9128
338.90625 C 435.59103 338.90625 438.5728 341.88803 438.5728 345.56625 L
438.5728 356.43375 C 438.5728 360.11197 435.59103 363.09375 431.9128 363.09375
L 421.0453 363.09375 C 417.3671 363.09375 414.3853 360.11197 414.3853 356.43375
C 414.3853 356.43375 414.3853 356.43375 414.3853 356.43375 Z" stroke="#252525"
stroke-linecap="round" stroke-linejoin="round" stroke-width=".72000003"
stroke-dasharray="1,5"/></g><rect x="348.28875" y="335.8828" width="99"
height="30.234384" stroke="#252525" stroke-linecap="round"
stroke-linejoin="round" stroke-width=".72000003"/><g id="id23_Graphic"><path
d="M 149.4675 303.42696 L 227.34 303.42696 C 231.01822 303.42696 234 306.40874
234 310.08696 L 234 317.34 C 234 321.01822 231.01822 324 227.34 324 L 149.4675
324 C 145.78928 324 142.8075 321.01822 142.8075 317.34 L 142.8075 310.08696 C
142.8075 306.40874 145.78928 303.42696 149.4675 303.42696 Z"
fill="url(#Obj_Gradient_11)"/><path d="M 149.4675 303.42696 L 227.34 303.42696
C 231.01822 303.42696 234 306.40874 234 310.08696 L 234 317.34 C 234 321.01822
231.01822 324 227.34 324 L 149.4675 324 C 145.78928 324 142.8075 321.01822
142.8075 317.34 L 142.8075 310.08696 C 142.8075 306.40874 145.78928 303.42696
149.4675 303.42696 Z" stroke="white" stroke-linecap="round"
stroke-linejoin="round" stroke-width=".72000003"/><text
transform="translate(144.8075 305.42696)" fill="black"><tspan
font-family="Helvetica" font-size="10" font-weight="bold" fill="black"
x="5.6948828" y="10" textLength="77.802734">customer X
data</tspan></text></g><g id="id24_Graphic"><path d="M 150.06375 342 L
227.93625 342 C 231.61447 342 234.59625 344.98178 234.59625 348.66 L 234.59625
355.91304 C 234.59625 359.59126 231.61447 362.57304 227.93625 362.57304 L
150.06375 362.57304 C 146.38553 362.57304 143.40375 359.59126 143.40375
355.91304 L 143.40375 348.66 C 143.40375 344.98178 146.38553 342 150.06375 342
Z" fill="url(#Obj_Gradient_12)"/><path d="M 150.06375 342 L 227.93625 342 C
231.61447 342 234.59625 344.98178 234.59625 348.66 L 234.59625 355.91304 C
234.59625 359.59126 231.61447 362.57304 227.93625 362.57304 L 150.06375
362.57304 C 146.38553 362.57304 143.40375 359.59126 143.40375 355.91304 L
143.40375 348.66 C 143.40375 344.98178 146.38553 342 150.06375 342 Z"
stroke="white" stroke-linecap="round" stroke-linejoin="round"
stroke-width=".72000003"/><text transform="translate(145.40375 344)"
fill="black"><tspan font-family="Helvetica" font-size="10" font-weight="bold"
fill="black" x="5.870664" y="10" textLength="47.79297">customer </tspan><tspan
font-family="Helvetica" font-size="10" font-weight="bold" fill="black"
x="53.48785" y="10" textLength="6.669922">Y</tspan><tspan
font-family="Helvetica" font-size="10" font-weight="bold" fill="black"
x="59.981992" y="10" textLength="23.339844"> data</tspan></text></g><g
id="id25_Graphic"><path d="M 357.66 303.42696 L 435.5325 303.42696 C 439.21072
303.42696 442.1925 306.40874 442.1925 310.08696 L 442.1925 317.34 C 442.1925
321.01822 439.21072 324 435.5325 324 L 357.66 324 C 353.98178 324 351 321.01822
351 317.34 L 351 310.08696 C 351 306.40874 353.98178 303.42696 357.66 303.42696
Z" fill="url(#Obj_Gradient_13)"/><path d="M 357.66 303.42696 L 435.5325
303.42696 C 439.21072 303.42696 442.1925 306.40874 442.1925 310.08696 L
442.1925 317.34 C 442.1925 321.01822 439.21072 324 435.5325 324 L 357.66 324 C
353.98178 324 351 321.01822 351 317.34 L 351 310.08696 C 351 306.40874
353.98178 303.42696 357.66 303.42696 Z" stroke="white" stroke-linecap="round"
stroke-linejoin="round" stroke-width=".72000003"/><text
transform="translate(353 305.42696)" fill="black"><tspan
font-family="Helvetica" font-size="10" font-weight="bold" fill="black"
x="5.7827734" y="10" textLength="54.46289">customer P</tspan><tspan
font-family="Helvetica" font-size="10" font-weight="bold" fill="black"
x="60.069883" y="10" textLength="23.339844"> data</tspan></text></g><g
id="id26_Graphic"><path d="M 357.66 340.71348 L 435.5325 340.71348 C 439.21072
340.71348 442.1925 343.69526 442.1925 347.37348 L 442.1925 354.62652 C 442.1925
358.30474 439.21072 361.28652 435.5325 361.28652 L 357.66 361.28652 C 353.98178
361.28652 351 358.30474 351 354.62652 L 351 347.37348 C 351 343.69526 353.98178
340.71348 357.66 340.71348 Z" fill="url(#Obj_Gradient_14)"/><path d="M 357.66
340.71348 L 435.5325 340.71348 C 439.21072 340.71348 442.1925 343.69526
442.1925 347.37348 L 442.1925 354.62652 C 442.1925 358.30474 439.21072
361.28652 435.5325 361.28652 L 357.66 361.28652 C 353.98178 361.28652 351
358.30474 351 354.62652 L 351 347.37348 C 351 343.69526 353.98178 340.71348
357.66 340.71348 Z" stroke="white" stroke-linecap="round"
stroke-linejoin="round" stroke-width=".72000003"/><text
transform="translate(353 342.71348)" fill="black"><tspan
font-family="Helvetica" font-size="10" font-weight="bold" fill="black"
x="5.1406836" y="10" textLength="78.911133">customer Q
data</tspan></text></g></g></g></svg>
diff --git a/geode-docs/tools_modules/gfsh/command-pages/create.html.md.erb
b/geode-docs/tools_modules/gfsh/command-pages/create.html.md.erb
index 5d972eebae..2988c2255c 100644
--- a/geode-docs/tools_modules/gfsh/command-pages/create.html.md.erb
+++ b/geode-docs/tools_modules/gfsh/command-pages/create.html.md.erb
@@ -959,7 +959,7 @@ See [Region Data Storage and
Distribution](../../../developing/region_options/ch
</tr>
<tr class="even">
<td><span class="keyword parmname">\-\-partition-resolver</span></td>
-<td>Specifies the full path to a custom partition resolver. To use the
provided default partition resolver, specify <code class="ph
codeph">org.apache.geode.cache.util.StringPrefixPartitionResolver</code>.</td>
+<td>Specifies the full path to a custom partition resolver. Specify <code
class="ph
codeph">org.apache.geode.cache.util.StringPrefixPartitionResolver</code> to use
the included string prefix partition resolver.</td>
<td></td>
</tbody>
</table>
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
> Improve docs on default string-based partition resolver
> -------------------------------------------------------
>
> Key: GEODE-3063
> URL: https://issues.apache.org/jira/browse/GEODE-3063
> Project: Geode
> Issue Type: Bug
> Components: docs
> Reporter: Karen Smoler Miller
> Assignee: Karen Smoler Miller
>
> The new default partition resolver at
> org.apache.geode.cache.util.StringPrefixPartitionResolver
> needs more detailed documentation.
> - An example of a string specifying a key in a region operation when this
> partition resolver is used.
> - What happens if the string specifying a key doesn't have a '|' delimiter.
> - An example of using this partition resolver to colocate two regions.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)