1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.hadoop.hbase;
20
21 import org.apache.commons.logging.Log;
22 import org.apache.commons.logging.LogFactory;
23 import org.apache.hadoop.conf.Configuration;
24 import org.apache.hadoop.hbase.zookeeper.MasterAddressTracker;
25 import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher;
26
27 import java.io.BufferedReader;
28 import java.io.BufferedWriter;
29 import java.io.File;
30 import java.io.FileReader;
31 import java.io.FileWriter;
32 import java.io.IOException;
33
34
35
36
37
38
39
40
41
42
43
44
45
46 public class ZNodeClearer {
47 public static final Log LOG = LogFactory.getLog(ZNodeClearer.class);
48
49 private ZNodeClearer() {}
50
51
52
53
54 public static void writeMyEphemeralNodeOnDisk(String fileContent) {
55 String fileName = ZNodeClearer.getMyEphemeralNodeFileName();
56
57 if (fileName == null) {
58 LOG.warn("No filename given to save the znode used, it won't be saved " +
59 "(Environment variable HBASE_ZNODE_FILE is not set).");
60 return;
61 }
62
63 FileWriter fstream;
64 try {
65 fstream = new FileWriter(fileName);
66 } catch (IOException e) {
67 LOG.warn("Can't write znode file "+fileName, e);
68 return;
69 }
70
71 BufferedWriter out = new BufferedWriter(fstream);
72
73 try {
74 try {
75 out.write(fileContent + "\n");
76 } finally {
77 try {
78 out.close();
79 } finally {
80 fstream.close();
81 }
82 }
83 } catch (IOException e) {
84 LOG.warn("Can't write znode file "+fileName, e);
85 }
86 }
87
88
89
90
91 public static String readMyEphemeralNodeOnDisk() throws IOException {
92 String fileName = getMyEphemeralNodeFileName();
93 if (fileName == null){
94 throw new IOException("No filename");
95 }
96 FileReader znodeFile = new FileReader(fileName);
97 BufferedReader br = new BufferedReader(znodeFile);
98 String file_content = br.readLine();
99 br.close();
100 return file_content;
101 }
102
103
104
105
106 public static String getMyEphemeralNodeFileName() {
107 return System.getenv().get("HBASE_ZNODE_FILE");
108 }
109
110
111
112
113 public static void deleteMyEphemeralNodeOnDisk() {
114 String fileName = getMyEphemeralNodeFileName();
115
116 if (fileName != null) {
117 new File(fileName).delete();
118 }
119 }
120
121
122
123
124
125
126 public static boolean clear(Configuration conf) {
127 Configuration tempConf = new Configuration(conf);
128 tempConf.setInt("zookeeper.recovery.retry", 0);
129
130 ZooKeeperWatcher zkw;
131 try {
132 zkw = new ZooKeeperWatcher(tempConf, "clean znode for master",
133 new Abortable() {
134 @Override public void abort(String why, Throwable e) {}
135 @Override public boolean isAborted() { return false; }
136 });
137 } catch (IOException e) {
138 LOG.warn("Can't connect to zookeeper to read the master znode", e);
139 return false;
140 }
141
142 String znodeFileContent;
143 try {
144 znodeFileContent = ZNodeClearer.readMyEphemeralNodeOnDisk();
145 } catch (IOException e) {
146 LOG.warn("Can't read the content of the znode file", e);
147 return false;
148 }
149
150 return MasterAddressTracker.deleteIfEquals(zkw, znodeFileContent);
151 }
152 }