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