Ver Fonte

add size function for each persitor

Henrique Santos há 10 anos atrás
pai
commit
1f20744a68

+ 2 - 1
services/filestore/app.coffee

@@ -4,6 +4,7 @@ logger.initialize("filestore")
 settings = require("settings-sharelatex")
 request = require("request")
 fileController = require("./app/js/FileController")
+projectController = require("./app/js/ProjectController")
 keyBuilder = require("./app/js/KeyBuilder")
 domain = require("domain")
 appIsOk = true
@@ -85,7 +86,7 @@ app.post "/project/:project_id/public/:public_file_id", keyBuilder.publicFileKey
 app.put "/project/:project_id/public/:public_file_id", keyBuilder.publicFileKey, express.bodyParser(), fileController.copyFile
 app.del "/project/:project_id/public/:public_file_id", keyBuilder.publicFileKey, fileController.deleteFile
 
-app.get "project/:project_id/size", keyBuilder.publicProjectKey, projectController.projectSize
+app.get "/project/:project_id/size", keyBuilder.publicProjectKey, projectController.projectSize
 
 app.get "/heapdump", (req, res)->
 	require('heapdump').writeSnapshot '/tmp/' + Date.now() + '.filestore.heapsnapshot', (err, filename)->

+ 11 - 1
services/filestore/app/coffee/AWSSDKPersistorManager.coffee

@@ -87,5 +87,15 @@ module.exports =
 
 	getProjectSize:(bucketName, key, callback)->
 		logger.log bucketName:bucketName, key:key, "get project size in s3"
-		callback null, 1024
+		s3.listObjects {Bucket: bucketName, Prefix: key}, (err, data) ->
+			if err?
+				logger.err err:err, bucketName:bucketName, key:key, "something went wrong listing prefix in s3"
+				return callback err
+			if data.Contents.length == 0
+				logger.log bucketName:bucketName, key:key, "the directory is empty"
+				return callback()
+			totalSize = 0
+			_.each data.Contents, (entry)->
+				totalSize += entry.Size
+			callback null, totalSize
 

+ 14 - 2
services/filestore/app/coffee/FSPersistorManager.coffee

@@ -89,5 +89,17 @@ module.exports =
       callback null, exists
 
   getProjectSize:(location, name, callback)->
-    logger.log location:location, name:name, "get project size in file system"
-    callback null, 1024
+    filteredName = filterName name.replace(/\/$/,'')
+    logger.log location:location, name:filteredName, "get project size in file system"
+    fs.readdir "#{location}/#{filteredName}", (err, files) ->
+      if err?
+        logger.err err:err, location:location, name:filteredName, "something went wrong listing prefix in aws"
+        return callback(err)
+      totalSize = 0
+      _.each files, (entry)->
+        fd = fs.openSync "#{location}/#{filteredName}/#{entry}", 'r'
+        fileStats = fs.fstatSync(fd)
+        totalSize += fileStats.size
+        fs.closeSync fd
+      logger.log totalSize:totalSize, "total size", files:files
+      callback null, totalSize

+ 2 - 2
services/filestore/app/coffee/ProjectController.coffee

@@ -2,7 +2,7 @@ settings = require("settings-sharelatex")
 logger = require("logger-sharelatex")
 metrics = require("metrics-sharelatex")
 Errors = require('./Errors')
-
+ProjectHandler = require("./ProjectHandler")
 
 module.exports = projectController =
 
@@ -10,7 +10,7 @@ module.exports = projectController =
 		metrics.inc "projectSize"
 		{project_id, bucket} = req
 		logger.log project_id:project_id, bucket:bucket, "reciving request to project size"
-		ProjectHandler.getSize bucket, project_id, req, (err, size)->
+		ProjectHandler.getSize bucket, project_id, (err, size)->
 			if err?
 				logger.log err: err, project_id: project_id, bucket: bucket, "error inserting file"
 				res.send 500

+ 4 - 4
services/filestore/app/coffee/ProjectHandler.coffee

@@ -5,9 +5,9 @@ async = require("async")
 
 module.exports =
 
-	getSize: (bucket, project_id, opts = {}, callback)->
-		logger.log bucket:bucket, project_id:project_id, opts:opts, "getting project size"
-		PersistorManager.getProjectSize bucket, project_id, opts, (err, size)->
+	getSize: (bucket, project_id, callback)->
+		logger.log bucket:bucket, project_id:project_id, "getting project size"
+		PersistorManager.getProjectSize bucket, project_id, (err, size)->
 			if err?
-				logger.err  bucket:bucket, project_id:project_id, opts:opts, "error getting size"
+				logger.err  bucket:bucket, project_id:project_id, "error getting size"
 			callback err, size

+ 13 - 1
services/filestore/app/coffee/S3PersistorManager.coffee

@@ -140,4 +140,16 @@ module.exports =
 
 	getProjectSize:(bucketName, key, callback)->
 		logger.log bucketName:bucketName, key:key, "get project size in s3"
-		callback null, 1024
+		s3Client = knox.createClient
+			key: settings.filestore.s3.key
+			secret: settings.filestore.s3.secret
+			bucket: bucketName
+		s3Client.list prefix:key, (err, data)->
+			if err?
+				logger.err err:err, bucketName:bucketName, key:key, "something went wrong listing prefix in aws"
+				return callback(err)
+			totalSize = 0
+			_.each data.Contents, (entry)->
+				totalSize += entry.Size
+			logger.log totalSize:totalSize, "total size"
+			callback null, totalSize