1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.apache.hadoop.hbase.ipc;
22
23 import org.apache.hadoop.classification.InterfaceAudience;
24 import org.apache.hadoop.hbase.security.User;
25
26 import com.google.protobuf.BlockingService;
27
28 import org.apache.hadoop.hbase.util.Bytes;
29 import org.cloudera.htrace.Trace;
30
31 import java.net.InetAddress;
32
33
34
35
36
37
38
39 @InterfaceAudience.Private
40 public class RequestContext {
41 private static ThreadLocal<RequestContext> instance =
42 new ThreadLocal<RequestContext>() {
43 protected RequestContext initialValue() {
44 return new RequestContext(null, null, null);
45 }
46 };
47
48 public static RequestContext get() {
49 return instance.get();
50 }
51
52
53
54
55
56
57
58 public static User getRequestUser() {
59 RequestContext ctx = instance.get();
60 if (ctx != null) {
61 return ctx.getUser();
62 }
63 return null;
64 }
65
66
67
68
69
70 public static String getRequestUserName() {
71 User user = getRequestUser();
72 if (user != null) {
73 return user.getShortName();
74 }
75 return null;
76 }
77
78
79
80
81
82 public static boolean isInRequestContext() {
83 RequestContext ctx = instance.get();
84 if (ctx != null) {
85 return ctx.isInRequest();
86 }
87 return false;
88 }
89
90
91
92
93
94
95
96 public static void set(User user,
97 InetAddress remoteAddress, BlockingService service) {
98 RequestContext ctx = instance.get();
99 ctx.user = user;
100 ctx.remoteAddress = remoteAddress;
101 ctx.service = service;
102 ctx.inRequest = true;
103 if (Trace.isTracing()) {
104 if (user != null) {
105 Trace.currentSpan().addKVAnnotation(Bytes.toBytes("user"), Bytes.toBytes(user.getName()));
106 }
107 if (remoteAddress != null) {
108 Trace.currentSpan().addKVAnnotation(
109 Bytes.toBytes("remoteAddress"),
110 Bytes.toBytes(remoteAddress.getHostAddress()));
111 }
112 }
113 }
114
115
116
117
118 public static void clear() {
119 RequestContext ctx = instance.get();
120 ctx.user = null;
121 ctx.remoteAddress = null;
122 ctx.service = null;
123 ctx.inRequest = false;
124 }
125
126 private User user;
127 private InetAddress remoteAddress;
128 private BlockingService service;
129
130 private boolean inRequest;
131
132 private RequestContext(User user, InetAddress remoteAddr, BlockingService service) {
133 this.user = user;
134 this.remoteAddress = remoteAddr;
135 this.service = service;
136 }
137
138 public User getUser() {
139 return user;
140 }
141
142 public InetAddress getRemoteAddress() {
143 return remoteAddress;
144 }
145
146 public BlockingService getService() {
147 return this.service;
148 }
149
150 boolean isInRequest() {
151 return inRequest;
152 }
153 }