/* Synchronized method to add file for given client id
         * Throws exception if the user for present
         */
        public bool addFileSynchronized(string clientid, UserFile file)
        {
            Logger.Debug("Adding file :" + file.filepath + " for client : " + clientid);
            UserFileSystem fs = getUserFSFromMapSynchronized(clientid);

            if (fs != null)
            {
                return(fs.addFileSynchronized(file));
            }
            else
            {
                throw new UserNotLoadedInMemoryException("Add file failed for user :"******" and file name :" + file.filepath);
            }
        }
Example #2
0
        //Merge the user file system
        private UserFileSystem mergeUserFileSystems(UserFileSystem newfs, UserFileSystem oldfs)
        {
            Logger.Debug ("Merging user file systems for user id : " + newfs.metadata.clientId);

            /*
             * Rule of Fight Club ( UserFile system merge)
             *
             * 1) User meta data- The one with higher version number wins, although it will be mostly the
             * newer file system object since user meta data is always maintained in memory
             *
             * 2) SharedFileList - This will be picked from the newer file system object since we don't have versioning for it
             * and it is maintained in the memory always
             *
             * 3) File map -
             * 		a) If there is a new file which is not present in the old file system
             * 				If its marked for deletion  - Don't add it
             * 				If its not marked for deletion  - Add it
             * 		b) If there is file present in the new file system which is also present in the old file system
             * 				If the version number of the new file is higher
             * 						If its marked for deletion in the new file system delete that file
             * 						If its not marked for deletion, replace the file
             * 				If its version number is lower
             * 						TOO BAD
             * 		c) If there are files which are not present in the new file system which are present in old file system
             * 				Ideally this should not happen since the all file names will always remain in memory. In any case, take the file on disk.
             *
             *
             */

            if (newfs.metadata.versionNumber >= oldfs.metadata.versionNumber) {
                oldfs.metadata = newfs.metadata; //replace
            } else {
                Logger.Warn ("The version number for the new user metadata is lower than the old, FIX ME FIX ME");
            }

            oldfs.sharedFiles = newfs.sharedFiles; //replace the shared file list

            //now iterate over the file map, don't f**k up man
            foreach (KeyValuePair<string, UserFile> entry in newfs.filemap) {

                UserFile newfile = entry.Value;
                UserFile oldfile = null;
                string filename = entry.Key;

                if (oldfs.filemap.ContainsKey (filename)) {
                    oldfile = oldfs.filemap [filename];
                }

                if (oldfile == null) {  //case when there is new file and NO old file

                    if (newfile.filemetadata.markedForDeletion == false) {
                        oldfs.addFileSynchronized (newfile);
                    } else {
                        Logger.Debug ("File found marked for deleting, skipping it : " + filename);
                    }

                } else { // case where there is old file and new file

                    if (newfile.filemetadata.versionNumber >= oldfile.filemetadata.versionNumber) { //lets roll
                        if (newfile.filemetadata.markedForDeletion == true) { //remove this file now
                            Logger.Debug ("File marked for deletion, removing : " + filename);
                            oldfs.removeFromMap (filename); //this will decrement the size
                        } else {
                            //long sizediff = newfile.filemetadata.filesize - oldfile.filemetadata.filesize;
                            oldfs.filemap [filename] = newfile;
                            //oldfs.incrementTotalFileSystemSize (sizediff);
                        }
                    }
                }

            }

            return oldfs;
        }
Example #3
0
        //Merge the user file system
        private UserFileSystem mergeUserFileSystems(UserFileSystem newfs, UserFileSystem oldfs)
        {
            Logger.Debug("Merging user file systems for user id : " + newfs.metadata.clientId);

            /*
             * Rule of Fight Club ( UserFile system merge)
             *
             * 1) User meta data- The one with higher version number wins, although it will be mostly the
             * newer file system object since user meta data is always maintained in memory
             *
             * 2) SharedFileList - This will be picked from the newer file system object since we don't have versioning for it
             * and it is maintained in the memory always
             *
             * 3) File map -
             *      a) If there is a new file which is not present in the old file system
             *              If its marked for deletion  - Don't add it
             *              If its not marked for deletion  - Add it
             *      b) If there is file present in the new file system which is also present in the old file system
             *              If the version number of the new file is higher
             *                      If its marked for deletion in the new file system delete that file
             *                      If its not marked for deletion, replace the file
             *              If its version number is lower
             *                      TOO BAD
             *      c) If there are files which are not present in the new file system which are present in old file system
             *              Ideally this should not happen since the all file names will always remain in memory. In any case, take the file on disk.
             *
             *
             */

            if (newfs.metadata.versionNumber >= oldfs.metadata.versionNumber)
            {
                oldfs.metadata = newfs.metadata;                 //replace
            }
            else
            {
                Logger.Warn("The version number for the new user metadata is lower than the old, FIX ME FIX ME");
            }

            oldfs.sharedFiles = newfs.sharedFiles;             //replace the shared file list

            //now iterate over the file map, don't f**k up man
            foreach (KeyValuePair <string, UserFile> entry in newfs.filemap)
            {
                UserFile newfile  = entry.Value;
                UserFile oldfile  = null;
                string   filename = entry.Key;

                if (oldfs.filemap.ContainsKey(filename))
                {
                    oldfile = oldfs.filemap [filename];
                }

                if (oldfile == null)                    //case when there is new file and NO old file

                {
                    if (newfile.filemetadata.markedForDeletion == false)
                    {
                        oldfs.addFileSynchronized(newfile);
                    }
                    else
                    {
                        Logger.Debug("File found marked for deleting, skipping it : " + filename);
                    }
                }
                else                     // case where there is old file and new file

                {
                    if (newfile.filemetadata.versionNumber >= oldfile.filemetadata.versionNumber)     //lets roll
                    {
                        if (newfile.filemetadata.markedForDeletion == true)                           //remove this file now
                        {
                            Logger.Debug("File marked for deletion, removing : " + filename);
                            oldfs.removeFromMap(filename);                              //this will decrement the size
                        }
                        else
                        {
                            //long sizediff = newfile.filemetadata.filesize - oldfile.filemetadata.filesize;
                            oldfs.filemap [filename] = newfile;
                            //oldfs.incrementTotalFileSystemSize (sizediff);
                        }
                    }
                }
            }

            return(oldfs);
        }