router.lua 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. local vshard = require('vshard')
  2. local log = require('log')
  3. -- Bootstrap the vshard router.
  4. while true do
  5. local ok, err = vshard.router.bootstrap({
  6. if_not_bootstrapped = true,
  7. })
  8. if ok then
  9. break
  10. end
  11. log.info(('Router bootstrap error: %s'):format(err))
  12. end
  13. -- functions for filer_metadata space
  14. local filer_metadata = {
  15. delete_by_directory_idx = function(directory)
  16. -- find all storages
  17. local storages = require('vshard').router.routeall()
  18. -- on each storage
  19. for _, storage in pairs(storages) do
  20. -- call local function
  21. local result, err = storage:callrw('filer_metadata.delete_by_directory_idx', { directory })
  22. -- check for error
  23. if err then
  24. error("Failed to call function on storage: " .. tostring(err))
  25. end
  26. end
  27. -- return
  28. return true
  29. end,
  30. find_by_directory_idx_and_name = function(dirPath, startFileName, includeStartFile, limit)
  31. -- init results
  32. local results = {}
  33. -- find all storages
  34. local storages = require('vshard').router.routeall()
  35. -- on each storage
  36. for _, storage in pairs(storages) do
  37. -- call local function
  38. local result, err = storage:callro('filer_metadata.find_by_directory_idx_and_name', {
  39. dirPath,
  40. startFileName,
  41. includeStartFile,
  42. limit
  43. })
  44. -- check for error
  45. if err then
  46. error("Failed to call function on storage: " .. tostring(err))
  47. end
  48. -- add to results
  49. for _, tuple in ipairs(result) do
  50. table.insert(results, tuple)
  51. end
  52. end
  53. -- sort
  54. table.sort(results, function(a, b) return a[3] < b[3] end)
  55. -- apply limit
  56. if #results > limit then
  57. local limitedResults = {}
  58. for i = 1, limit do
  59. table.insert(limitedResults, results[i])
  60. end
  61. results = limitedResults
  62. end
  63. -- return
  64. return results
  65. end,
  66. }
  67. rawset(_G, 'filer_metadata', filer_metadata)
  68. -- register functions for filer_metadata space, set grants
  69. for name, _ in pairs(filer_metadata) do
  70. box.schema.func.create('filer_metadata.' .. name, { if_not_exists = true })
  71. box.schema.user.grant('app', 'execute', 'function', 'filer_metadata.' .. name, { if_not_exists = true })
  72. box.schema.user.grant('client', 'execute', 'function', 'filer_metadata.' .. name, { if_not_exists = true })
  73. end