The following code can be used to show which member is hosting which primary piece of data in a partitioned region within GemFire. This was done with gemFire 7 but should work with GemFire 6.6 as well.
1. The server side cache.xml is as follows which pre populates some data into the region to save having to write a client to add data.
<?xml version="1.0"?>
<!DOCTYPE cache PUBLIC
"-//GemStone Systems, Inc.//GemFire Declarative Caching 7.0//EN"
"http://www.gemstone.com/dtd/cache7_0.dtd">
<cache>
<cache-server port="40001" notify-by-subscription="true"/>
<region name="exampleRegion">
<region-attributes refid="PARTITION_REDUNDANT"/>
<entry><key><string>1</string></key><value><string>MyValue1</string></value></entry>
<entry><key><string>2</string></key><value><string>MyValue2</string></value></entry>
<entry><key><string>3</string></key><value><string>MyValue3</string></value></entry>
<entry><key><string>4</string></key><value><string>MyValue4</string></value></entry>
<entry><key><string>5</string></key><value><string>MyValue5</string></value></entry>
<entry><key><string>6</string></key><value><string>MyValue6</string></value></entry>
<entry><key><string>7</string></key><value><string>MyValue7</string></value></entry>
<entry><key><string>8</string></key><value><string>MyValue8</string></value></entry>
<entry><key><string>9</string></key><value><string>MyValue9</string></value></entry>
<entry><key><string>10</string></key><value><string>MyValue10</string></value></entry>
<entry><key><string>11</string></key><value><string>MyValue11</string></value></entry>
<entry><key><string>12</string></key><value><string>MyValue12</string></value></entry>
<entry><key><string>13</string></key><value><string>MyValue13</string></value></entry>
<entry><key><string>14</string></key><value><string>MyValue14</string></value></entry>
<entry><key><string>15</string></key><value><string>MyValue15</string></value></entry>
<entry><key><string>16</string></key><value><string>MyValue16</string></value></entry>
<entry><key><string>17</string></key><value><string>MyValue17</string></value></entry>
<entry><key><string>18</string></key><value><string>MyValue18</string></value></entry>
<entry><key><string>19</string></key><value><string>MyValue19</string></value></entry>
<entry><key><string>20</string></key><value><string>MyValue20</string></value></entry>
<entry><key><string>21</string></key><value><string>MyValue21</string></value></entry>
<entry><key><string>22</string></key><value><string>MyValue22</string></value></entry>
<entry><key><string>23</string></key><value><string>MyValue23</string></value></entry>
<entry><key><string>24</string></key><value><string>MyValue24</string></value></entry>
<entry><key><string>25</string></key><value><string>MyValue25</string></value></entry>
<entry><key><string>26</string></key><value><string>MyValue26</string></value></entry>
<entry><key><string>27</string></key><value><string>MyValue27</string></value></entry>
<entry><key><string>28</string></key><value><string>MyValue28</string></value></entry>
<entry><key><string>29</string></key><value><string>MyValue29</string></value></entry>
<entry><key><string>30</string></key><value><string>MyValue30</string></value></entry>
</region>
</cache>
2. When listing members we have one locator and 2 cache servers.
gfsh>list members;
Name | Id
-------- | -------------------------------------------------------
server2 | Pas-Apicellas-MacBook-Pro(server2:78035)<v2>:4641
server1 | Pas-Apicellas-MacBook-Pro(server1:78002)<v1>:13379
locator1 | Pas-Apicellas-MacBook-Pro(locator1:77992:locator):23631
3. Get a query to ensure we indeed have 30 entries in the region.
gfsh>query --query="select count(*) from /exampleRegion";
Result : true
startCount : 0
endCount : 20
Rows : 1
Result
------
30
NEXT_STEP_NAME : END
4. Create an XML cache.xml file which will enable us to connect as a cache server to the Distributed System with storage disabled.
<?xml version="1.0"?>
<!DOCTYPE cache PUBLIC
"-//GemStone Systems, Inc.//GemFire Declarative Caching 7.0//EN"
"http://www.gemstone.com/dtd/cache7_0.dtd">
<cache>
<cache-server port="0" />
<region name="exampleRegion" >
<region-attributes data-policy="partition" >
<partition-attributes local-max-memory="0" redundant-copies="1"/>
<subscription-attributes interest-policy="all"/>
</region-attributes>
</region>
</cache>
5. Write a java client with code as follows
package vmware.au.gemfire.demos.deptemp;
import java.util.Map;
import java.util.Set;
import com.gemstone.gemfire.cache.Cache;
import com.gemstone.gemfire.cache.CacheFactory;
import com.gemstone.gemfire.cache.Region;
import com.gemstone.gemfire.cache.partition.PartitionRegionHelper;
import com.gemstone.gemfire.distributed.DistributedMember;
public class VerifyDataLocations
{
private Cache cache = null;
public VerifyDataLocations()
{
CacheFactory cf = new CacheFactory();
cf.set("cache-xml-file", "xml/datalocations-cache-no-storage.xml");
cf.set("locators", "localhost[10334]");
cache = cf.create();
}
public void run() throws InterruptedException
{
Region<String,String> exampleRegion = cache.getRegion("exampleRegion");
System.out.println("exampleRegion size = " + exampleRegion.size());
Set<Map.Entry<String, String>> entries = exampleRegion.entrySet();
for (Map.Entry entry: entries)
{
DistributedMember member =
PartitionRegionHelper.getPrimaryMemberForKey(exampleRegion, (String) entry.getKey());
System.out.println
(String.format("\"Primary Member [Host=%s, Id=%s - Key=%s, Value=%s]",
member.getHost(), member.getId(), entry.getKey(), (String) entry.getValue()));
}
System.out.println("Sleeping for 20 seconds..");
cache.close();
}
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException
{
// TODO Auto-generated method stub
VerifyDataLocations test = new VerifyDataLocations();
test.run();
}
}
6. Output as follows.
exampleRegion size = 30
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=20, Value=MyValue20]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=21, Value=MyValue21]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=22, Value=MyValue22]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=23, Value=MyValue23]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=24, Value=MyValue24]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=25, Value=MyValue25]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=26, Value=MyValue26]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=27, Value=MyValue27]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=28, Value=MyValue28]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=29, Value=MyValue29]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=30, Value=MyValue30]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=1, Value=MyValue1]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=2, Value=MyValue2]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=3, Value=MyValue3]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server2:78035):4641 - Key=4, Value=MyValue4]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=5, Value=MyValue5]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=6, Value=MyValue6]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=7, Value=MyValue7]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=8, Value=MyValue8]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=9, Value=MyValue9]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=10, Value=MyValue10]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=11, Value=MyValue11]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=12, Value=MyValue12]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=13, Value=MyValue13]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=14, Value=MyValue14]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=15, Value=MyValue15]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=16, Value=MyValue16]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=17, Value=MyValue17]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=18, Value=MyValue18]
"Primary Member [Host=Pas-Apicellas-MacBook-Pro.local, Id=Pas-Apicellas-MacBook-Pro(server1:78002):13379 - Key=19, Value=MyValue19]