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 java.io.BufferedReader;
22 import java.io.BufferedWriter;
23 import java.io.File;
24 import java.io.FileNotFoundException;
25 import java.io.FileReader;
26 import java.io.FileWriter;
27 import java.io.IOException;
28
29 import org.apache.commons.logging.Log;
30 import org.apache.commons.logging.LogFactory;
31 import org.apache.hadoop.conf.Configuration;
32 import org.apache.hadoop.hbase.zookeeper.MasterAddressTracker;
33 import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher;
34
35
36
37
38
39
40
41
42
43
44
45
46
47 public class ZNodeClearer {
48 private static final Log LOG = LogFactory.getLog(ZNodeClearer.class);
49
50 private ZNodeClearer() {}
51
52
53
54
55 public static void writeMyEphemeralNodeOnDisk(String fileContent) {
56 String fileName = ZNodeClearer.getMyEphemeralNodeFileName();
57 if (fileName == null) {
58 LOG.warn("Environment variable HBASE_ZNODE_FILE not set; znodes will not be cleared " +
59 "on crash by start scripts (Longer MTTR!)");
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 FileNotFoundException("No filename; set environment variable HBASE_ZNODE_FILE");
95 }
96 FileReader znodeFile = new FileReader(fileName);
97 BufferedReader br = null;
98 try {
99 br = new BufferedReader(znodeFile);
100 String file_content = br.readLine();
101 return file_content;
102 } finally {
103 if (br != null) br.close();
104 }
105 }
106
107
108
109
110 public static String getMyEphemeralNodeFileName() {
111 return System.getenv().get("HBASE_ZNODE_FILE");
112 }
113
114
115
116
117 public static void deleteMyEphemeralNodeOnDisk() {
118 String fileName = getMyEphemeralNodeFileName();
119
120 if (fileName != null) {
121 new File(fileName).delete();
122 }
123 }
124
125
126
127
128
129
130 public static boolean clear(Configuration conf) {
131 Configuration tempConf = new Configuration(conf);
132 tempConf.setInt("zookeeper.recovery.retry", 0);
133
134 ZooKeeperWatcher zkw;
135 try {
136 zkw = new ZooKeeperWatcher(tempConf, "clean znode for master",
137 new Abortable() {
138 @Override public void abort(String why, Throwable e) {}
139 @Override public boolean isAborted() { return false; }
140 });
141 } catch (IOException e) {
142 LOG.warn("Can't connect to zookeeper to read the master znode", e);
143 return false;
144 }
145
146 String znodeFileContent;
147 try {
148 znodeFileContent = ZNodeClearer.readMyEphemeralNodeOnDisk();
149 return MasterAddressTracker.deleteIfEquals(zkw, znodeFileContent);
150 } catch (FileNotFoundException fnfe) {
151
152 LOG.warn("Can't find the znode file; presume non-fatal", fnfe);
153 return true;
154 } catch (IOException e) {
155 LOG.warn("Can't read the content of the znode file", e);
156 return false;
157 } finally {
158 zkw.close();
159 }
160 }
161 }