You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							77 lines
						
					
					
						
							2.6 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							77 lines
						
					
					
						
							2.6 KiB
						
					
					
				| local vshard = require('vshard') | |
| local log = require('log') | |
| 
 | |
| -- Bootstrap the vshard router. | |
| while true do | |
|     local ok, err = vshard.router.bootstrap({ | |
|         if_not_bootstrapped = true, | |
|     }) | |
|     if ok then | |
|         break | |
|     end | |
|     log.info(('Router bootstrap error: %s'):format(err)) | |
| end | |
| 
 | |
| -- functions for filer_metadata space | |
| local filer_metadata = { | |
|     delete_by_directory_idx = function(directory) | |
|         -- find all storages | |
|         local storages = require('vshard').router.routeall() | |
|         -- on each storage | |
|         for _, storage in pairs(storages) do | |
|             -- call local function | |
|             local result, err = storage:callrw('filer_metadata.delete_by_directory_idx', { directory }) | |
|             -- check for error | |
|             if err then | |
|                 error("Failed to call function on storage: " .. tostring(err)) | |
|             end | |
|         end | |
|         -- return | |
|         return true | |
|     end, | |
|     find_by_directory_idx_and_name = function(dirPath, startFileName, includeStartFile, limit) | |
|         -- init results | |
|         local results = {} | |
|         -- find all storages | |
|         local storages = require('vshard').router.routeall() | |
|         -- on each storage | |
|         for _, storage in pairs(storages) do | |
|             -- call local function | |
|             local result, err = storage:callro('filer_metadata.find_by_directory_idx_and_name', { | |
|                 dirPath, | |
|                 startFileName, | |
|                 includeStartFile, | |
|                 limit | |
|             }) | |
|             -- check for error | |
|             if err then | |
|                 error("Failed to call function on storage: " .. tostring(err)) | |
|             end | |
|             -- add to results | |
|             for _, tuple in ipairs(result) do | |
|                 table.insert(results, tuple) | |
|             end | |
|         end | |
|         -- sort | |
|         table.sort(results, function(a, b) return a[3] < b[3] end) | |
|         -- apply limit | |
|         if #results > limit then | |
|             local limitedResults = {} | |
|             for i = 1, limit do | |
|                 table.insert(limitedResults, results[i]) | |
|             end | |
|             results = limitedResults | |
|         end | |
|         -- return | |
|         return results | |
|     end, | |
| } | |
| 
 | |
| rawset(_G, 'filer_metadata', filer_metadata) | |
| 
 | |
| -- register functions for filer_metadata space, set grants | |
| for name, _ in pairs(filer_metadata) do | |
|     box.schema.func.create('filer_metadata.' .. name, { if_not_exists = true }) | |
|     box.schema.user.grant('app', 'execute', 'function', 'filer_metadata.' .. name, { if_not_exists = true }) | |
|     box.schema.user.grant('client', 'execute', 'function', 'filer_metadata.' .. name, { if_not_exists = true }) | |
| end
 |