|
18 | 18 | import logging |
19 | 19 | import socket |
20 | 20 | import time |
| 21 | +from functools import cached_property |
21 | 22 | from types import TracebackType |
22 | 23 | from typing import ( |
23 | 24 | TYPE_CHECKING, |
|
141 | 142 | class _HiveClient: |
142 | 143 | """Helper class to nicely open and close the transport.""" |
143 | 144 |
|
144 | | - _transport: TTransport |
145 | | - _client: Client |
146 | | - _ugi: Optional[List[str]] |
147 | | - |
148 | 145 | def __init__(self, uri: str, ugi: Optional[str] = None, kerberos_auth: Optional[bool] = HIVE_KERBEROS_AUTH_DEFAULT): |
149 | 146 | self._uri = uri |
150 | 147 | self._kerberos_auth = kerberos_auth |
151 | 148 | self._ugi = ugi.split(":") if ugi else None |
152 | 149 |
|
153 | | - self._init_thrift_client() |
154 | | - |
155 | | - def _init_thrift_client(self) -> None: |
| 150 | + def _init_thrift_transport(self) -> TTransport: |
156 | 151 | url_parts = urlparse(self._uri) |
157 | | - |
158 | 152 | socket = TSocket.TSocket(url_parts.hostname, url_parts.port) |
159 | | - |
160 | 153 | if not self._kerberos_auth: |
161 | | - self._transport = TTransport.TBufferedTransport(socket) |
| 154 | + return TTransport.TBufferedTransport(socket) |
162 | 155 | else: |
163 | | - self._transport = TTransport.TSaslClientTransport(socket, host=url_parts.hostname, service="hive") |
| 156 | + return TTransport.TSaslClientTransport(socket, host=url_parts.hostname, service="hive") |
164 | 157 |
|
| 158 | + @cached_property |
| 159 | + def _client(self) -> Client: |
| 160 | + self._transport = self._init_thrift_transport() |
165 | 161 | protocol = TBinaryProtocol.TBinaryProtocol(self._transport) |
166 | | - |
167 | | - self._client = Client(protocol) |
168 | | - |
169 | | - def __enter__(self) -> Client: |
170 | | - """Ensure transport is open before returning the client.""" |
171 | | - if self._transport is None or not self._transport.isOpen(): |
172 | | - self._init_thrift_client() # Reinitialize transport if closed |
173 | | - |
174 | | - if not self._transport.isOpen(): |
175 | | - self._transport.open() |
176 | | - |
| 162 | + client = Client(protocol) |
177 | 163 | if self._ugi: |
178 | | - self._client.set_ugi(*self._ugi) |
| 164 | + client.set_ugi(*self._ugi) |
| 165 | + return client |
179 | 166 |
|
| 167 | + def __enter__(self) -> Client: |
| 168 | + """Reinitialize transport if was closed.""" |
| 169 | + if self._transport and not self._transport.isOpen(): |
| 170 | + self._transport = self._init_thrift_transport() |
180 | 171 | return self._client |
181 | 172 |
|
182 | 173 | def __exit__( |
183 | 174 | self, exctype: Optional[Type[BaseException]], excinst: Optional[BaseException], exctb: Optional[TracebackType] |
184 | 175 | ) -> None: |
185 | 176 | """Close transport if it was opened.""" |
186 | | - if self._transport: |
| 177 | + if self._transport and self._transport.isOpen(): |
187 | 178 | self._transport.close() |
188 | | - self._transport = None # Reset transport so a new one is created next time |
189 | | - self._client = None |
190 | 179 |
|
191 | 180 |
|
192 | 181 | def _construct_hive_storage_descriptor( |
|
0 commit comments