Esempio n. 1
0
        public void Write(string localFilename, FileData newFile)
        {
            if (fail) throw new ProcessFailedException(id);
            if (freeze)
            {
                freezed.Enqueue(() => Write(localFilename, newFile));
                throw new ProcessFreezedException(id);
            }

            Console.WriteLine("WRITE " + localFilename
                + " : CONTENTS " + Helper.BytesToString(newFile.Contents)
                + " : VERSION " + newFile.Version);

            if (!files.ContainsKey(localFilename))
            {
                Console.WriteLine("CREATE FILE " + localFilename);
                files[localFilename] = newFile;
                weights[localFilename] = new Weight();
            }
            else
            {
                files[localFilename] = FileData.Latest(files[localFilename], newFile);
            }

            weights[localFilename].Writes++;
            Console.WriteLine("STORED = " + files[localFilename].Version);
        }
Esempio n. 2
0
        public FileData Read(string localFilename)
        {
            if (fail) throw new ProcessFailedException(id);
            if (freeze)
            {
                freezed.Enqueue(() => Read(localFilename));
                throw new ProcessFreezedException(id);
            }

            Console.WriteLine("READ " + localFilename);
            if (!files.ContainsKey(localFilename))
            {
                Console.WriteLine("CREATE FILE " + localFilename);
                files[localFilename] = new FileData();
                weights[localFilename] = new Weight();
            }

            weights[localFilename].Reads++;
            return files[localFilename];
        }
Esempio n. 3
0
        /**
         * IDataServerToClient Methods
         */
        public FileVersion Version(string localFilename)
        {
            if (fail) throw new ProcessFailedException(id);
            if (freeze)
            {
                freezed.Enqueue(() => Version(localFilename));
                throw new ProcessFreezedException(id);
            }

            Console.WriteLine("VERSION " + localFilename);

            if (!files.ContainsKey(localFilename))
            {
                Console.WriteLine("CREATE FILE " + localFilename);
                files[localFilename] = new FileData();
                weights[localFilename] = new Weight();
            }

            return files[localFilename].Version;
        }
Esempio n. 4
0
        public void MigrationWrite(string localFilename, FileData newFile, Weight weight)
        {
            if (fail) throw new ProcessFailedException(id);
            if (freeze)
            {
                freezed.Enqueue(() => MigrationWrite(localFilename, newFile, weight));
                throw new ProcessFreezedException(id);
            }

            Console.WriteLine("MIGRATION WRITE " + localFilename);

            files[localFilename] = newFile;
            weights[localFilename] = weight;
        }
Esempio n. 5
0
        public void Write(int fileRegisterIndex, byte[] contents)
        {
            Console.WriteLine("WRITE FILE = " + fileRegisterIndex);

            try
            {
                // forces to get always the most recent file
                FileVersion latest = ReadVersion(fileRegisterIndex, Helper.Semantics.MONOTONIC).Version;
                latest.Increment(Client.id);
                FileData fileData = new FileData(latest, contents);

                string filename = fileRegister.FilenameAt(fileRegisterIndex);
                FileMetadata fileMetadata = fileRegister.FileMetadataAt(fileRegisterIndex);
                // data server id / bool write
                ConcurrentDictionary<string, bool> writes = new ConcurrentDictionary<string, bool>();
                int requests = 0;
                bool quorumReached = false;

                //QUORUM
                while (true)
                {
                    // voting
                    WriteQuorum quorum = new WriteQuorum(fileMetadata.WriteQuorum);
                    foreach (var entry in writes)
                    {
                        bool vote = entry.Value;

                        quorum.AddVote(vote);
                        if (quorum.CheckQuorum())
                        {
                            quorumReached = true;
                            break;
                        }
                    }

                    // found the quorum file
                    if (quorumReached) break;

                    // if there are still pending requests
                    // dont create new ones
                    if (requests > 0) continue;

                    // if all the votes arrived at the quorum
                    // stops when all requests are counted (requests = 0)
                    if (quorum.Count == (requests + quorum.Count))
                    {
                        // get possible new fileMetadata locations
                        // possible optimization
                        // check if there are no dataa servers
                        fileMetadata = OpenFileMetadata(filename);

                        // broadcast to all dataServers that have that file
                        foreach (var entry in fileMetadata.Locations)
                        {
                            string id = entry.Key;
                            string location = entry.Value;
                            string localFilename = fileMetadata.LocalFilenames[id];

                            // increment right away so it doesn't request untill its decremented
                            Interlocked.Increment(ref requests);
                            Thread request = new Thread(() =>
                            {
                                IDataServerToClient dataServer = (IDataServerToClient)Activator.GetObject(
                                    typeof(IDataServerToClient),
                                    location);
                                bool vote = false;
                                try
                                {
                                    dataServer.Write(localFilename, fileData);
                                    vote = true;
                                }
                                catch (ProcessFailedException) { }
                                catch (ProcessFreezedException) { }
                                finally
                                {
                                    writes[id] = vote;
                                    Interlocked.Decrement(ref requests);
                                }
                            });
                            request.Start();
                        }
                    }
                }

                // update file registers
                fileRegister.SetFileDataAt(fileRegisterIndex, fileData);
            }
            catch (FileDoesNotExistException e)
            {
                Console.WriteLine(e.Message);
                return;
            }
        }
Esempio n. 6
0
        public void SetFileDataAt(int index, FileData newFileData)
        {
            if (!filenames.ContainsKey(index))
                throw new Exception("Index does not exist");

            infos[filenames[index]].fileData = newFileData;
        }
Esempio n. 7
0
 public static FileData Latest(FileData f1, FileData f2)
 {
     return (FileVersion.MostRecent(f1.version, f2.version) >= 0) ? f1 : f2;
 }
Esempio n. 8
0
 public static FileData Latest(FileData f1, FileData f2)
 {
     return((FileVersion.MostRecent(f1.version, f2.version) >= 0) ? f1 : f2);
 }