1717
1818use std:: fmt:: Debug ;
1919use std:: fmt:: Formatter ;
20+ use std:: sync:: Arc ;
2021
21- use tikv_client:: Config ;
22- use tikv_client:: RawClient ;
2322use tokio:: sync:: OnceCell ;
2423
25- use crate :: Builder ;
26- use crate :: Capability ;
27- use crate :: Error ;
28- use crate :: ErrorKind ;
29- use crate :: Scheme ;
30- use crate :: raw:: Access ;
31- use crate :: raw:: adapters:: kv;
32- use crate :: services:: TikvConfig ;
24+ use super :: config:: TikvConfig ;
25+ use super :: core:: * ;
26+ use super :: deleter:: TikvDeleter ;
27+ use super :: writer:: TikvWriter ;
28+ use crate :: raw:: * ;
3329use crate :: * ;
3430
3531/// TiKV backend builder
@@ -112,7 +108,7 @@ impl Builder for TikvBuilder {
112108 ) ?;
113109 }
114110
115- Ok ( TikvBackend :: new ( Adapter {
111+ Ok ( TikvBackend :: new ( TikvCore {
116112 client : OnceCell :: new ( ) ,
117113 endpoints,
118114 insecure : self . config . insecure ,
@@ -124,107 +120,86 @@ impl Builder for TikvBuilder {
124120}
125121
126122/// Backend for TiKV service
127- pub type TikvBackend = kv:: Backend < Adapter > ;
128-
129- #[ derive( Clone ) ]
130- pub struct Adapter {
131- client : OnceCell < RawClient > ,
132- endpoints : Vec < String > ,
133- insecure : bool ,
134- ca_path : Option < String > ,
135- cert_path : Option < String > ,
136- key_path : Option < String > ,
123+ #[ derive( Clone , Debug ) ]
124+ pub struct TikvBackend {
125+ core : Arc < TikvCore > ,
126+ root : String ,
127+ info : Arc < AccessorInfo > ,
137128}
138129
139- impl Debug for Adapter {
140- fn fmt ( & self , f : & mut Formatter < ' _ > ) -> std:: fmt:: Result {
141- let mut ds = f. debug_struct ( "Adapter" ) ;
142-
143- ds. field ( "endpoints" , & self . endpoints ) ;
144- ds. finish ( )
145- }
146- }
147-
148- impl Adapter {
149- async fn get_connection ( & self ) -> Result < RawClient > {
150- if let Some ( client) = self . client . get ( ) {
151- return Ok ( client. clone ( ) ) ;
130+ impl TikvBackend {
131+ fn new ( core : TikvCore ) -> Self {
132+ let info = AccessorInfo :: default ( ) ;
133+ info. set_scheme ( Scheme :: Tikv . into_static ( ) ) ;
134+ info. set_name ( "TiKV" ) ;
135+ info. set_root ( "/" ) ;
136+ info. set_native_capability ( Capability {
137+ read : true ,
138+ stat : true ,
139+ write : true ,
140+ write_can_empty : true ,
141+ delete : true ,
142+ shared : true ,
143+ ..Default :: default ( )
144+ } ) ;
145+
146+ Self {
147+ core : Arc :: new ( core) ,
148+ root : "/" . to_string ( ) ,
149+ info : Arc :: new ( info) ,
152150 }
153- let client = if self . insecure {
154- RawClient :: new ( self . endpoints . clone ( ) )
155- . await
156- . map_err ( parse_tikv_config_error) ?
157- } else if self . ca_path . is_some ( ) && self . key_path . is_some ( ) && self . cert_path . is_some ( ) {
158- let ( ca_path, key_path, cert_path) = (
159- self . ca_path . clone ( ) . unwrap ( ) ,
160- self . key_path . clone ( ) . unwrap ( ) ,
161- self . cert_path . clone ( ) . unwrap ( ) ,
162- ) ;
163- let config = Config :: default ( ) . with_security ( ca_path, cert_path, key_path) ;
164- RawClient :: new_with_config ( self . endpoints . clone ( ) , config)
165- . await
166- . map_err ( parse_tikv_config_error) ?
167- } else {
168- return Err (
169- Error :: new ( ErrorKind :: ConfigInvalid , "invalid configuration" )
170- . with_context ( "service" , Scheme :: Tikv )
171- . with_context ( "endpoints" , format ! ( "{:?}" , self . endpoints) ) ,
172- ) ;
173- } ;
174- self . client . set ( client. clone ( ) ) . ok ( ) ;
175- Ok ( client)
176151 }
177152}
178153
179- impl kv:: Adapter for Adapter {
180- type Scanner = ( ) ;
181-
182- fn info ( & self ) -> kv:: Info {
183- kv:: Info :: new (
184- Scheme :: Tikv ,
185- "TiKV" ,
186- Capability {
187- read : true ,
188- write : true ,
189- shared : true ,
190- ..Default :: default ( )
191- } ,
192- )
154+ impl Access for TikvBackend {
155+ type Reader = Buffer ;
156+ type Writer = TikvWriter ;
157+ type Lister = ( ) ;
158+ type Deleter = oio:: OneShotDeleter < TikvDeleter > ;
159+
160+ fn info ( & self ) -> Arc < AccessorInfo > {
161+ self . info . clone ( )
193162 }
194163
195- async fn get ( & self , path : & str ) -> Result < Option < Buffer > > {
196- let result = self
197- . get_connection ( )
198- . await ?
199- . get ( path. to_owned ( ) )
200- . await
201- . map_err ( parse_tikv_error) ?;
202- Ok ( result. map ( Buffer :: from) )
164+ async fn stat ( & self , path : & str , _: OpStat ) -> Result < RpStat > {
165+ let p = build_abs_path ( & self . root , path) ;
166+
167+ if p == build_abs_path ( & self . root , "" ) {
168+ Ok ( RpStat :: new ( Metadata :: new ( EntryMode :: DIR ) ) )
169+ } else {
170+ let bs = self . core . get ( & p) . await ?;
171+ match bs {
172+ Some ( bs) => Ok ( RpStat :: new (
173+ Metadata :: new ( EntryMode :: FILE ) . with_content_length ( bs. len ( ) as u64 ) ,
174+ ) ) ,
175+ None => Err ( Error :: new ( ErrorKind :: NotFound , "kv not found in tikv" ) ) ,
176+ }
177+ }
203178 }
204179
205- async fn set ( & self , path : & str , value : Buffer ) -> Result < ( ) > {
206- self . get_connection ( )
207- . await ?
208- . put ( path. to_owned ( ) , value. to_vec ( ) )
209- . await
210- . map_err ( parse_tikv_error)
180+ async fn read ( & self , path : & str , args : OpRead ) -> Result < ( RpRead , Self :: Reader ) > {
181+ let p = build_abs_path ( & self . root , path) ;
182+ let bs = match self . core . get ( & p) . await ? {
183+ Some ( bs) => bs,
184+ None => return Err ( Error :: new ( ErrorKind :: NotFound , "kv not found in tikv" ) ) ,
185+ } ;
186+ Ok ( ( RpRead :: new ( ) , bs. slice ( args. range ( ) . to_range_as_usize ( ) ) ) )
211187 }
212188
213- async fn delete ( & self , path : & str ) -> Result < ( ) > {
214- self . get_connection ( )
215- . await ?
216- . delete ( path. to_owned ( ) )
217- . await
218- . map_err ( parse_tikv_error)
189+ async fn write ( & self , path : & str , _: OpWrite ) -> Result < ( RpWrite , Self :: Writer ) > {
190+ let p = build_abs_path ( & self . root , path) ;
191+ Ok ( ( RpWrite :: new ( ) , TikvWriter :: new ( self . core . clone ( ) , p) ) )
219192 }
220- }
221193
222- fn parse_tikv_error ( e : tikv_client:: Error ) -> Error {
223- Error :: new ( ErrorKind :: Unexpected , "error from tikv" ) . set_source ( e)
224- }
194+ async fn delete ( & self ) -> Result < ( RpDelete , Self :: Deleter ) > {
195+ Ok ( (
196+ RpDelete :: default ( ) ,
197+ oio:: OneShotDeleter :: new ( TikvDeleter :: new ( self . core . clone ( ) , self . root . clone ( ) ) ) ,
198+ ) )
199+ }
225200
226- fn parse_tikv_config_error ( e : tikv_client :: Error ) -> Error {
227- Error :: new ( ErrorKind :: ConfigInvalid , "invalid configuration" )
228- . with_context ( "service" , Scheme :: Tikv )
229- . set_source ( e )
201+ async fn list ( & self , path : & str , _ : OpList ) -> Result < ( RpList , Self :: Lister ) > {
202+ let _ = build_abs_path ( & self . root , path ) ;
203+ Ok ( ( RpList :: default ( ) , ( ) ) )
204+ }
230205}
0 commit comments