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 if (fileName == null) {
57 LOG.warn("Environment variable HBASE_ZNODE_FILE not set; znodes will not be cleared " +
58 "on crash by start scripts (Longer MTTR!)");
59 return;
60 }
61
62 FileWriter fstream;
63 try {
64 fstream = new FileWriter(fileName);
65 } catch (IOException e) {
66 LOG.warn("Can't write znode file "+fileName, e);
67 return;
68 }
69
70 BufferedWriter out = new BufferedWriter(fstream);
71
72 try {
73 try {
74 out.write(fileContent + "\n");
75 } finally {
76 try {
77 out.close();
78 } finally {
79 fstream.close();
80 }
81 }
82 } catch (IOException e) {
83 LOG.warn("Can't write znode file "+fileName, e);
84 }
85 }
86
87
88
89
90 public static String readMyEphemeralNodeOnDisk() throws IOException {
91 String fileName = getMyEphemeralNodeFileName();
92 if (fileName == null){
93 throw new IOException("No filename");
94 }
95 FileReader znodeFile = new FileReader(fileName);
96 BufferedReader br = new BufferedReader(znodeFile);
97 String file_content = br.readLine();
98 br.close();
99 return file_content;
100 }
101
102
103
104
105 public static String getMyEphemeralNodeFileName() {
106 return System.getenv().get("HBASE_ZNODE_FILE");
107 }
108
109
110
111
112 public static void deleteMyEphemeralNodeOnDisk() {
113 String fileName = getMyEphemeralNodeFileName();
114
115 if (fileName != null) {
116 new File(fileName).delete();
117 }
118 }
119
120
121
122
123
124
125 public static boolean clear(Configuration conf) {
126 Configuration tempConf = new Configuration(conf);
127 tempConf.setInt("zookeeper.recovery.retry", 0);
128
129 ZooKeeperWatcher zkw;
130 try {
131 zkw = new ZooKeeperWatcher(tempConf, "clean znode for master",
132 new Abortable() {
133 @Override public void abort(String why, Throwable e) {}
134 @Override public boolean isAborted() { return false; }
135 });
136 } catch (IOException e) {
137 LOG.warn("Can't connect to zookeeper to read the master znode", e);
138 return false;
139 }
140
141 String znodeFileContent;
142 try {
143 znodeFileContent = ZNodeClearer.readMyEphemeralNodeOnDisk();
144 } catch (IOException e) {
145 LOG.warn("Can't read the content of the znode file", e);
146 return false;
147 }
148
149 return MasterAddressTracker.deleteIfEquals(zkw, znodeFileContent);
150 }
151 }