Mercurial > hg > Database > Cassandra
annotate src/java/org/apache/cassandra/service/DatacenterWriteResponseHandler.java @ 0:d485154379c8 default tip
apache-cassandra-0.6.0-rc1-src
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 02 Apr 2010 13:36:02 +0900 |
parents | |
children |
rev | line source |
---|---|
0
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1 /** |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
2 * |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3 */ |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4 package org.apache.cassandra.service; |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
5 /* |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 * |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 * Licensed to the Apache Software Foundation (ASF) under one |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
8 * or more contributor license agreements. See the NOTICE file |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
9 * distributed with this work for additional information |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
10 * regarding copyright ownership. The ASF licenses this file |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
11 * to you under the Apache License, Version 2.0 (the |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
12 * "License"); you may not use this file except in compliance |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
13 * with the License. You may obtain a copy of the License at |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
14 * |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
15 * http://www.apache.org/licenses/LICENSE-2.0 |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
16 * |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
17 * Unless required by applicable law or agreed to in writing, |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
18 * software distributed under the License is distributed on an |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
19 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
20 * KIND, either express or implied. See the License for the |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
21 * specific language governing permissions and limitations |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
22 * under the License. |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
23 * |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
24 */ |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
25 |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
26 |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
27 import java.net.InetAddress; |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
28 import java.net.UnknownHostException; |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
29 import java.util.concurrent.atomic.AtomicInteger; |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
30 |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
31 import org.apache.cassandra.config.DatabaseDescriptor; |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
32 import org.apache.cassandra.locator.IEndPointSnitch; |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
33 import org.apache.cassandra.locator.DatacenterEndPointSnitch; |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
34 import org.apache.cassandra.net.Message; |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
35 import org.apache.cassandra.utils.FBUtilities; |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
36 |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
37 /** |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
38 * This class will basically will block for the replication factor which is |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
39 * provided in the input map. it will block till we recive response from (DC, n) |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
40 * nodes. |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
41 */ |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
42 public class DatacenterWriteResponseHandler extends WriteResponseHandler |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
43 { |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
44 private final AtomicInteger blockFor; |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
45 private final DatacenterEndPointSnitch endpointsnitch; |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
46 private final InetAddress localEndpoint; |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
47 |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
48 public DatacenterWriteResponseHandler(int blockFor, String table) |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
49 { |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
50 // Response is been managed by the map so the waitlist size really doesnt matter. |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
51 super(blockFor, table); |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
52 this.blockFor = new AtomicInteger(blockFor); |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
53 endpointsnitch = (DatacenterEndPointSnitch) DatabaseDescriptor.getEndPointSnitch(table); |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
54 localEndpoint = FBUtilities.getLocalAddress(); |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
55 } |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
56 |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
57 @Override |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
58 public void response(Message message) |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
59 { |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
60 //Is optimal to check if same datacenter than comparing Arrays. |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
61 int b = -1; |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
62 try |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
63 { |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
64 if (endpointsnitch.isInSameDataCenter(localEndpoint, message.getFrom())) |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
65 { |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
66 b = blockFor.decrementAndGet(); |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
67 } |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
68 } |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
69 catch (UnknownHostException e) |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
70 { |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
71 throw new RuntimeException(e); |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
72 } |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
73 responses.add(message); |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
74 if (b == 0) |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
75 { |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
76 //Singnal when Quorum is recived. |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
77 condition.signal(); |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
78 } |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
79 if (logger.isDebugEnabled()) |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
80 logger.debug("Processed Message: " + message.toString()); |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
81 } |
d485154379c8
apache-cassandra-0.6.0-rc1-src
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
82 } |