client.py 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # filename: client.py
  4. """
  5. Client module for Fastdfs 3.08
  6. author: scott yuan scottzer8@gmail.com
  7. date: 2012-06-21
  8. """
  9. from fdfs_client.tracker_client import *
  10. from fdfs_client.storage_client import *
  11. from fdfs_client.exceptions import *
  12. def get_tracker_conf(conf_path='client.conf'):
  13. cf = Fdfs_ConfigParser()
  14. tracker = {}
  15. try:
  16. cf.read(conf_path)
  17. timeout = cf.getint('__config__', 'connect_timeout')
  18. tracker_list = cf.get('__config__', 'tracker_server')
  19. if isinstance(tracker_list, str):
  20. tracker_list = [tracker_list]
  21. tracker_ip_list = []
  22. for tr in tracker_list:
  23. tracker_ip, tracker_port = tr.split(':')
  24. tracker_ip_list.append((tracker_ip, tracker_port))
  25. tracker['host_tuple'] = tuple(tracker_ip_list)
  26. tracker['timeout'] = timeout
  27. tracker['name'] = 'Tracker Pool'
  28. except:
  29. raise
  30. return tracker
  31. class Fdfs_client(object):
  32. """
  33. Class Fdfs_client implemented Fastdfs client protol ver 3.08.
  34. It's useful upload, download, delete file to or from fdfs server, etc. It's uses
  35. connection pool to manage connection to server.
  36. """
  37. def __init__(self, conf_path='/etc/fdfs/client.conf', poolclass=ConnectionPool):
  38. self.trackers = get_tracker_conf(conf_path)
  39. self.tracker_pool = poolclass(**self.trackers)
  40. self.timeout = self.trackers['timeout']
  41. self.storages = {}
  42. return None
  43. def __del__(self):
  44. try:
  45. self.pool.destroy()
  46. self.pool = None
  47. except:
  48. pass
  49. def get_storage(self, store_serv):
  50. store = self.storages.get((store_serv.ip_addr, store_serv.port), None)
  51. if store is None:
  52. store = Storage_client(store_serv.ip_addr, store_serv.port, self.timeout)
  53. self.storages[(store_serv.ip_addr, store_serv.port)] = store
  54. return store
  55. def get_store_serv(self, remote_file_id):
  56. '''
  57. Get store server info by remote_file_id.
  58. @author: LeoTse
  59. @param remote_file_id: string, file_id of file that is on storage server
  60. @return Storage_server object
  61. '''
  62. tmp = split_remote_fileid(remote_file_id)
  63. if not tmp:
  64. raise DataError('[-] Error: remote_file_id is invalid.(in delete file)')
  65. group_name, remote_filename = tmp
  66. tc = Tracker_client(self.tracker_pool)
  67. store_serv = tc.tracker_query_storage_update(group_name, remote_filename)
  68. return store_serv
  69. def upload_by_filename(self, filename, meta_dict = None):
  70. """
  71. Upload a file to Storage server.
  72. arguments:
  73. @filename: string, name of file that will be uploaded
  74. @meta_dict: dictionary e.g.:{
  75. 'ext_name' : 'jpg',
  76. 'file_size' : '10240B',
  77. 'width' : '160px',
  78. 'hight' : '80px'
  79. } meta_dict can be null
  80. @return dict {
  81. 'Group name' : group_name,
  82. 'Remote file_id' : remote_file_id,
  83. 'Status' : 'Upload successed.',
  84. 'Local file name' : local_file_name,
  85. 'Uploaded size' : upload_size,
  86. 'Storage IP' : storage_ip
  87. } if success else None
  88. """
  89. isfile, errmsg = fdfs_check_file(filename)
  90. if not isfile:
  91. raise DataError(errmsg + '(uploading)')
  92. tc = Tracker_client(self.tracker_pool)
  93. store_serv = tc.tracker_query_storage_stor_without_group()
  94. return self.get_storage(store_serv).storage_upload_by_filename(tc, store_serv, filename, meta_dict)
  95. def upload_by_filename_with_group(self, filename, group_name, meta_dict = None):
  96. """
  97. Upload a file to Storage server.
  98. arguments:
  99. @filename: string, name of file that will be uploaded
  100. @group_name: string
  101. @meta_dict: dictionary e.g.:{
  102. 'ext_name' : 'jpg',
  103. 'file_size' : '10240B',
  104. 'width' : '160px',
  105. 'hight' : '80px'
  106. } meta_dict can be null
  107. @return dict {
  108. 'Group name' : group_name,
  109. 'Remote file_id' : remote_file_id,
  110. 'Status' : 'Upload successed.',
  111. 'Local file name' : local_file_name,
  112. 'Uploaded size' : upload_size,
  113. 'Storage IP' : storage_ip
  114. } if success else None
  115. """
  116. group_name = group_name.encode('utf-8')
  117. isfile, errmsg = fdfs_check_file(filename)
  118. if not isfile:
  119. raise DataError(errmsg + '(uploading)')
  120. tc = Tracker_client(self.tracker_pool)
  121. store_serv = tc.tracker_query_storage_stor_with_group(group_name)
  122. return self.get_storage(store_serv).storage_upload_by_filename(tc, store_serv, filename, meta_dict)
  123. def upload_by_file(self, filename, meta_dict=None):
  124. isfile, errmsg = fdfs_check_file(filename)
  125. if not isfile:
  126. raise DataError(errmsg + '(uploading)')
  127. tc = Tracker_client(self.tracker_pool)
  128. store_serv = tc.tracker_query_storage_stor_without_group()
  129. return self.get_storage(store_serv).storage_upload_by_file(tc, store_serv, filename, meta_dict)
  130. def upload_by_buffer(self, filebuffer, file_ext_name=None, meta_dict=None):
  131. """
  132. Upload a buffer to Storage server.
  133. arguments:
  134. @filebuffer: string, buffer
  135. @file_ext_name: string, file extend name
  136. @meta_dict: dictionary e.g.:{
  137. 'ext_name' : 'jpg',
  138. 'file_size' : '10240B',
  139. 'width' : '160px',
  140. 'hight' : '80px'
  141. }
  142. @return dict {
  143. 'Group name' : group_name,
  144. 'Remote file_id' : remote_file_id,
  145. 'Status' : 'Upload successed.',
  146. 'Local file name' : '',
  147. 'Uploaded size' : upload_size,
  148. 'Storage IP' : storage_ip
  149. } if success else None
  150. """
  151. if not filebuffer:
  152. raise DataError('[-] Error: argument filebuffer can not be null.')
  153. tc = Tracker_client(self.tracker_pool)
  154. store_serv = tc.tracker_query_storage_stor_without_group()
  155. return self.get_storage(store_serv).storage_upload_by_buffer(tc, store_serv, filebuffer, \
  156. file_ext_name, meta_dict)
  157. def upload_slave_by_filename(self, filename, remote_file_id, prefix_name, \
  158. meta_dict=None):
  159. """
  160. Upload slave file to Storage server.
  161. arguments:
  162. @filename: string, local file name
  163. @remote_file_id: string, remote file id
  164. @prefix_name: string
  165. @meta_dict: dictionary e.g.:{
  166. 'ext_name' : 'jpg',
  167. 'file_size' : '10240B',
  168. 'width' : '160px',
  169. 'hight' : '80px'
  170. }
  171. @return dictionary {
  172. 'Status' : 'Upload slave successed.',
  173. 'Local file name' : local_filename,
  174. 'Uploaded size' : upload_size,
  175. 'Remote file id' : remote_file_id,
  176. 'Storage IP' : storage_ip
  177. }
  178. """
  179. isfile, errmsg = fdfs_check_file(filename)
  180. if not isfile:
  181. raise DataError(errmsg + '(uploading slave)')
  182. tmp = split_remote_fileid(remote_file_id)
  183. if not tmp:
  184. raise DataError('[-] Error: remote_file_id is invalid.(uploading slave)')
  185. if not prefix_name:
  186. raise DataError('[-] Error: prefix_name can not be null.')
  187. group_name, remote_filename = tmp
  188. tc = Tracker_client(self.tracker_pool)
  189. store_serv = tc.tracker_query_storage_stor_with_group(group_name)
  190. store = self.get_storage(store_serv)
  191. try:
  192. ret_dict = store.storage_upload_slave_by_filename(tc, store_serv, filename, \
  193. prefix_name, remote_filename, \
  194. meta_dict=None)
  195. except:
  196. raise
  197. ret_dict['Status'] = 'Upload slave file successed.'
  198. return ret_dict
  199. def upload_slave_by_file(self, filename, remote_file_id, prefix_name, \
  200. meta_dict=None):
  201. """
  202. Upload slave file to Storage server.
  203. arguments:
  204. @filename: string, local file name
  205. @remote_file_id: string, remote file id
  206. @prefix_name: string
  207. @meta_dict: dictionary e.g.:{
  208. 'ext_name' : 'jpg',
  209. 'file_size' : '10240B',
  210. 'width' : '160px',
  211. 'hight' : '80px'
  212. }
  213. @return dictionary {
  214. 'Status' : 'Upload slave successed.',
  215. 'Local file name' : local_filename,
  216. 'Uploaded size' : upload_size,
  217. 'Remote file id' : remote_file_id,
  218. 'Storage IP' : storage_ip
  219. }
  220. """
  221. isfile, errmsg = fdfs_check_file(filename)
  222. if not isfile:
  223. raise DataError(errmsg + '(uploading slave)')
  224. tmp = split_remote_fileid(remote_file_id)
  225. if not tmp:
  226. raise DataError('[-] Error: remote_file_id is invalid.(uploading slave)')
  227. if not prefix_name:
  228. raise DataError('[-] Error: prefix_name can not be null.')
  229. group_name, remote_filename = tmp
  230. tc = Tracker_client(self.tracker_pool)
  231. store_serv = tc.tracker_query_storage_stor_with_group(group_name)
  232. store = self.get_storage(store_serv)
  233. try:
  234. ret_dict = store.storage_upload_slave_by_file(tc, store_serv, filename, \
  235. prefix_name, remote_filename, \
  236. meta_dict=None)
  237. except:
  238. raise
  239. ret_dict['Status'] = 'Upload slave file successed.'
  240. return ret_dict
  241. def upload_slave_by_buffer(self, filebuffer, remote_file_id, \
  242. meta_dict=None, file_ext_name=None):
  243. """
  244. Upload slave file by buffer
  245. arguments:
  246. @filebuffer: string
  247. @remote_file_id: string
  248. @meta_dict: dictionary e.g.:{
  249. 'ext_name' : 'jpg',
  250. 'file_size' : '10240B',
  251. 'width' : '160px',
  252. 'hight' : '80px'
  253. }
  254. @return dictionary {
  255. 'Status' : 'Upload slave successed.',
  256. 'Local file name' : local_filename,
  257. 'Uploaded size' : upload_size,
  258. 'Remote file id' : remote_file_id,
  259. 'Storage IP' : storage_ip
  260. }
  261. """
  262. if not filebuffer:
  263. raise DataError('[-] Error: argument filebuffer can not be null.')
  264. tmp = split_remote_fileid(remote_file_id)
  265. if not tmp:
  266. raise DataError('[-] Error: remote_file_id is invalid.(uploading slave)')
  267. group_name, remote_filename = tmp
  268. tc = Tracker_client(self.tracker_pool)
  269. store_serv = tc.tracker_query_storage_update(group_name, remote_filename)
  270. store = self.get_storage(store_serv)
  271. return store.storage_upload_slave_by_buffer(tc, store_serv, filebuffer, \
  272. remote_filename, meta_dict, \
  273. file_ext_name)
  274. def upload_appender_by_filename(self, local_filename, meta_dict=None):
  275. """
  276. Upload an appender file by filename.
  277. arguments:
  278. @local_filename: string
  279. @meta_dict: dictionary e.g.:{
  280. 'ext_name' : 'jpg',
  281. 'file_size' : '10240B',
  282. 'width' : '160px',
  283. 'hight' : '80px'
  284. } Notice: it can be null
  285. @return dict {
  286. 'Group name' : group_name,
  287. 'Remote file_id' : remote_file_id,
  288. 'Status' : 'Upload successed.',
  289. 'Local file name' : '',
  290. 'Uploaded size' : upload_size,
  291. 'Storage IP' : storage_ip
  292. } if success else None
  293. """
  294. isfile, errmsg = fdfs_check_file(local_filename)
  295. if not isfile:
  296. raise DataError(errmsg + '(uploading appender)')
  297. tc = Tracker_client(self.tracker_pool)
  298. store_serv = tc.tracker_query_storage_stor_without_group()
  299. store = self.get_storage(store_serv)
  300. return store.storage_upload_appender_by_filename(tc, store_serv, \
  301. local_filename, meta_dict)
  302. def upload_appender_by_file(self, local_filename, meta_dict=None):
  303. """
  304. Upload an appender file by file.
  305. arguments:
  306. @local_filename: string
  307. @meta_dict: dictionary e.g.:{
  308. 'ext_name' : 'jpg',
  309. 'file_size' : '10240B',
  310. 'width' : '160px',
  311. 'hight' : '80px'
  312. } Notice: it can be null
  313. @return dict {
  314. 'Group name' : group_name,
  315. 'Remote file_id' : remote_file_id,
  316. 'Status' : 'Upload successed.',
  317. 'Local file name' : '',
  318. 'Uploaded size' : upload_size,
  319. 'Storage IP' : storage_ip
  320. } if success else None
  321. """
  322. isfile, errmsg = fdfs_check_file(local_filename)
  323. if not isfile:
  324. raise DataError(errmsg + '(uploading appender)')
  325. tc = Tracker_client(self.tracker_pool)
  326. store_serv = tc.tracker_query_storage_stor_without_group()
  327. store = self.get_storage(store_serv)
  328. return store.storage_upload_appender_by_file(tc, store_serv, \
  329. local_filename, meta_dict)
  330. def upload_appender_by_buffer(self, filebuffer, file_ext_name=None, meta_dict=None):
  331. """
  332. Upload a buffer to Storage server.
  333. arguments:
  334. @filebuffer: string
  335. @file_ext_name: string, can be null
  336. @meta_dict: dictionary, can be null
  337. @return dict {
  338. 'Group name' : group_name,
  339. 'Remote file_id' : remote_file_id,
  340. 'Status' : 'Upload successed.',
  341. 'Local file name' : '',
  342. 'Uploaded size' : upload_size,
  343. 'Storage IP' : storage_ip
  344. } if success else None
  345. """
  346. if not filebuffer:
  347. raise DataError('[-] Error: argument filebuffer can not be null.')
  348. tc = Tracker_client(self.tracker_pool)
  349. store_serv = tc.tracker_query_storage_stor_without_group()
  350. store = self.get_storage(store_serv)
  351. return store.storage_upload_appender_by_buffer(tc, store_serv, \
  352. filebuffer, meta_dict, \
  353. file_ext_name)
  354. def delete_file(self, remote_file_id):
  355. """
  356. Delete a file from Storage server.
  357. arguments:
  358. @remote_file_id: string, file_id of file that is on storage server
  359. @return tuple ('Delete file successed.', remote_file_id, storage_ip)
  360. """
  361. tmp = split_remote_fileid(remote_file_id)
  362. if not tmp:
  363. raise DataError('[-] Error: remote_file_id is invalid.(in delete file)')
  364. group_name, remote_filename = tmp
  365. tc = Tracker_client(self.tracker_pool)
  366. store_serv = tc.tracker_query_storage_update(group_name, remote_filename)
  367. store = self.get_storage(store_serv)
  368. return store.storage_delete_file(tc, store_serv, remote_filename)
  369. def download_to_file(self, local_filename, remote_file_id, offset=0, down_bytes=0):
  370. """
  371. Download a file from Storage server.
  372. arguments:
  373. @local_filename: string, local name of file
  374. @remote_file_id: string, file_id of file that is on storage server
  375. @offset: long
  376. @downbytes: long
  377. @return dict {
  378. 'Remote file_id' : remote_file_id,
  379. 'Content' : local_filename,
  380. 'Download size' : downloaded_size,
  381. 'Storage IP' : storage_ip
  382. }
  383. """
  384. tmp = split_remote_fileid(remote_file_id)
  385. if not tmp:
  386. raise DataError('[-] Error: remote_file_id is invalid.(in download file)')
  387. group_name, remote_filename = tmp
  388. if not offset:
  389. file_offset = offset
  390. if not down_bytes:
  391. download_bytes = down_bytes
  392. tc = Tracker_client(self.tracker_pool)
  393. store_serv = tc.tracker_query_storage_fetch(group_name, remote_filename)
  394. store = Storage_client(store_serv.ip_addr, store_serv.port, self.timeout)
  395. return store.storage_download_to_file(tc, store_serv, local_filename, file_offset, download_bytes,
  396. remote_filename)
  397. def download_to_buffer(self, remote_file_id, offset=0, down_bytes=0):
  398. """
  399. Download a file from Storage server and store in buffer.
  400. arguments:
  401. @remote_file_id: string, file_id of file that is on storage server
  402. @offset: long
  403. @down_bytes: long
  404. @return dict {
  405. 'Remote file_id' : remote_file_id,
  406. 'Content' : file_buffer,
  407. 'Download size' : downloaded_size,
  408. 'Storage IP' : storage_ip
  409. }
  410. """
  411. tmp = split_remote_fileid(remote_file_id)
  412. if not tmp:
  413. raise DataError('[-] Error: remote_file_id is invalid.(in download file)')
  414. group_name, remote_filename = tmp
  415. if not offset:
  416. file_offset = offset
  417. if not down_bytes:
  418. download_bytes = down_bytes
  419. tc = Tracker_client(self.tracker_pool)
  420. store_serv = tc.tracker_query_storage_fetch(group_name, remote_filename)
  421. store = Storage_client(store_serv.ip_addr, store_serv.port, self.timeout)
  422. file_buffer = None
  423. return store.storage_download_to_buffer(tc, store_serv, file_buffer, \
  424. file_offset, download_bytes, \
  425. remote_filename)
  426. def list_one_group(self, group_name):
  427. """
  428. List one group information.
  429. arguments:
  430. @group_name: string, group name will be list
  431. @return Group_info, instance
  432. """
  433. tc = Tracker_client(self.tracker_pool)
  434. return tc.tracker_list_one_group(group_name)
  435. def list_servers(self, group_name, storage_ip=None):
  436. """
  437. List all storage servers information in a group
  438. arguments:
  439. @group_name: string
  440. @return dictionary {
  441. 'Group name' : group_name,
  442. 'Servers' : server list,
  443. }
  444. """
  445. tc = Tracker_client(self.tracker_pool)
  446. return tc.tracker_list_servers(group_name, storage_ip)
  447. def list_all_groups(self):
  448. """
  449. List all group information.
  450. @return dictionary {
  451. 'Groups count' : group_count,
  452. 'Groups' : list of groups
  453. }
  454. """
  455. tc = Tracker_client(self.tracker_pool)
  456. return tc.tracker_list_all_groups()
  457. def get_meta_data(self, remote_file_id):
  458. """
  459. Get meta data of remote file.
  460. arguments:
  461. @remote_fileid: string, remote file id
  462. @return dictionary, meta data
  463. """
  464. tmp = split_remote_fileid(remote_file_id)
  465. if not tmp:
  466. raise DataError('[-] Error: remote_file_id is invalid.(in get meta data)')
  467. group_name, remote_filename = tmp
  468. tc = Tracker_client(self.tracker_pool)
  469. store_serv = tc.tracker_query_storage_update(group_name, remote_filename)
  470. store = Storage_client(store_serv.ip_addr, store_serv.port, self.timeout)
  471. return store.storage_get_metadata(tc, store_serv, remote_filename)
  472. def set_meta_data(self, remote_file_id, meta_dict, op_flag=STORAGE_SET_METADATA_FLAG_OVERWRITE):
  473. """
  474. Set meta data of remote file.
  475. arguments:
  476. @remote_file_id: string
  477. @meta_dict: dictionary
  478. @op_flag: char, 'O' for overwrite, 'M' for merge
  479. @return dictionary {
  480. 'Status' : status,
  481. 'Storage IP' : storage_ip
  482. }
  483. """
  484. tmp = split_remote_fileid(remote_file_id)
  485. if not tmp:
  486. raise DataError('[-] Error: remote_file_id is invalid.(in set meta data)')
  487. group_name, remote_filename = tmp
  488. tc = Tracker_client(self.tracker_pool)
  489. try:
  490. store_serv = tc.tracker_query_storage_update(group_name, remote_filename)
  491. store = Storage_client(store_serv.ip_addr, store_serv.port, self.timeout)
  492. status = store.storage_set_metadata(tc, store_serv, remote_filename, meta_dict)
  493. except (ConnectionError, ResponseError, DataError):
  494. raise
  495. # if status == 2:
  496. # raise DataError('[-] Error: remote file %s is not exist.' % remote_file_id)
  497. if status != 0:
  498. raise DataError('[-] Error: %d, %s' % (status, os.strerror(status)))
  499. ret_dict = {'Status': 'Set meta data success.', 'Storage IP': store_serv.ip_addr}
  500. return ret_dict
  501. def append_by_filename(self, local_filename, remote_fileid):
  502. isfile, errmsg = fdfs_check_file(local_filename)
  503. if not isfile:
  504. raise DataError(errmsg + '(append)')
  505. tmp = split_remote_fileid(remote_fileid)
  506. if not tmp:
  507. raise DataError('[-] Error: remote_file_id is invalid.(append)')
  508. group_name, appended_filename = tmp
  509. tc = Tracker_client(self.tracker_pool)
  510. store_serv = tc.tracker_query_storage_update(group_name, appended_filename)
  511. store = Storage_client(store_serv.ip_addr, store_serv.port, self.timeout)
  512. return store.storage_append_by_filename(tc, store_serv, local_filename, \
  513. appended_filename)
  514. def append_by_file(self, local_filename, remote_fileid):
  515. isfile, errmsg = fdfs_check_file(local_filename)
  516. if not isfile:
  517. raise DataError(errmsg + '(append)')
  518. tmp = split_remote_fileid(remote_fileid)
  519. if not tmp:
  520. raise DataError('[-] Error: remote_file_id is invalid.(append)')
  521. group_name, appended_filename = tmp
  522. tc = Tracker_client(self.tracker_pool)
  523. store_serv = tc.tracker_query_storage_update(group_name, appended_filename)
  524. store = Storage_client(store_serv.ip_addr, store_serv.port, self.timeout)
  525. return store.storage_append_by_file(tc, store_serv, local_filename, \
  526. appended_filename)
  527. def append_by_buffer(self, file_buffer, remote_fileid):
  528. if not file_buffer:
  529. raise DataError('[-] Error: file_buffer can not be null.')
  530. tmp = split_remote_fileid(remote_fileid)
  531. if not tmp:
  532. raise DataError('[-] Error: remote_file_id is invalid.(append)')
  533. group_name, appended_filename = tmp
  534. tc = Tracker_client(self.tracker_pool)
  535. store_serv = tc.tracker_query_storage_update(group_name, appended_filename)
  536. store = Storage_client(store_serv.ip_addr, store_serv.port, self.timeout)
  537. return store.storage_append_by_buffer(tc, store_serv, file_buffer, \
  538. appended_filename)
  539. def truncate_file(self, truncated_filesize, appender_fileid):
  540. """
  541. Truncate file in Storage server.
  542. arguments:
  543. @truncated_filesize: long
  544. @appender_fileid: remote_fileid
  545. @return: dictionary {
  546. 'Status' : 'Truncate successed.',
  547. 'Storage IP' : storage_ip
  548. }
  549. """
  550. trunc_filesize = truncated_filesize
  551. tmp = split_remote_fileid(appender_fileid)
  552. if not tmp:
  553. raise DataError('[-] Error: appender_fileid is invalid.(truncate)')
  554. group_name, appender_filename = tmp
  555. tc = Tracker_client(self.tracker_pool)
  556. store_serv = tc.tracker_query_storage_update(group_name, appender_filename)
  557. store = Storage_client(store_serv.ip_addr, store_serv.port, self.timeout)
  558. return store.storage_truncate_file(tc, store_serv, trunc_filesize, \
  559. appender_filename)
  560. def modify_by_filename(self, filename, appender_fileid, offset=0):
  561. """
  562. Modify a file in Storage server by file.
  563. arguments:
  564. @filename: string, local file name
  565. @offset: long, file offset
  566. @appender_fileid: string, remote file id
  567. @return: dictionary {
  568. 'Status' : 'Modify successed.',
  569. 'Storage IP' : storage_ip
  570. }
  571. """
  572. isfile, errmsg = fdfs_check_file(filename)
  573. if not isfile:
  574. raise DataError(errmsg + '(modify)')
  575. filesize = os.stat(filename).st_size
  576. tmp = split_remote_fileid(appender_fileid)
  577. if not tmp:
  578. raise DataError('[-] Error: remote_fileid is invalid.(modify)')
  579. group_name, appender_filename = tmp
  580. if not offset:
  581. file_offset = offset
  582. else:
  583. file_offset = 0
  584. tc = Tracker_client(self.tracker_pool)
  585. store_serv = tc.tracker_query_storage_update(group_name, appender_filename)
  586. store = Storage_client(store_serv.ip_addr, store_serv.port, self.timeout)
  587. return store.storage_modify_by_filename(tc, store_serv, filename, file_offset, \
  588. filesize, appender_filename)
  589. def modify_by_file(self, filename, appender_fileid, offset=0):
  590. """
  591. Modify a file in Storage server by file.
  592. arguments:
  593. @filename: string, local file name
  594. @offset: long, file offset
  595. @appender_fileid: string, remote file id
  596. @return: dictionary {
  597. 'Status' : 'Modify successed.',
  598. 'Storage IP' : storage_ip
  599. }
  600. """
  601. isfile, errmsg = fdfs_check_file(filename)
  602. if not isfile:
  603. raise DataError(errmsg + '(modify)')
  604. filesize = os.stat(filename).st_size
  605. tmp = split_remote_fileid(appender_fileid)
  606. if not tmp:
  607. raise DataError('[-] Error: remote_fileid is invalid.(modify)')
  608. group_name, appender_filename = tmp
  609. if not offset:
  610. file_offset = offset
  611. else:
  612. file_offset = 0
  613. tc = Tracker_client(self.tracker_pool)
  614. store_serv = tc.tracker_query_storage_update(group_name, appender_filename)
  615. store = Storage_client(store_serv.ip_addr, store_serv.port, self.timeout)
  616. return store.storage_modify_by_file(tc, store_serv, filename, file_offset, \
  617. filesize, appender_filename)
  618. def modify_by_buffer(self, filebuffer, appender_fileid, offset=0):
  619. """
  620. Modify a file in Storage server by buffer.
  621. arguments:
  622. @filebuffer: string, file buffer
  623. @offset: long, file offset
  624. @appender_fileid: string, remote file id
  625. @return: dictionary {
  626. 'Status' : 'Modify successed.',
  627. 'Storage IP' : storage_ip
  628. }
  629. """
  630. if not filebuffer:
  631. raise DataError('[-] Error: filebuffer can not be null.(modify)')
  632. filesize = len(filebuffer)
  633. tmp = split_remote_fileid(appender_fileid)
  634. if not tmp:
  635. raise DataError('[-] Error: remote_fileid is invalid.(modify)')
  636. group_name, appender_filename = tmp
  637. if not offset:
  638. file_offset = offset
  639. else:
  640. file_offset = 0
  641. tc = Tracker_client(self.tracker_pool)
  642. store_serv = tc.tracker_query_storage_update(group_name, appender_filename)
  643. store = Storage_client(store_serv.ip_addr, store_serv.port, self.timeout)
  644. return store.storage_modify_by_buffer(tc, store_serv, filebuffer, file_offset, \
  645. filesize, appender_filename)