/* 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); } }
//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; }
//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); }