Exemplo n.º 1
0
        private FileData ReadFileData(int fileRegisterIndex, Helper.Semantics semantics)
        {
            // gets latest version
            LatestVersion latestVersion = ReadVersion(fileRegisterIndex, semantics);

            // requests file data to dataServer with latest version
            List <string> dataServersIds = latestVersion.DataServerIds;

            // loops until  we get something from a read from any dataServer
            while (true)
            {
                foreach (string id in dataServersIds)
                {
                    string location      = fileRegister.FileMetadataAt(fileRegisterIndex).Locations[id];
                    string localFilename = fileRegister.FileMetadataAt(fileRegisterIndex).LocalFilenames[id];

                    IDataServerToClient dataServer = (IDataServerToClient)Activator.GetObject(
                        typeof(IDataServerToClient),
                        location);

                    try
                    {
                        FileData fileData = dataServer.Read(localFilename);

                        // update file registers
                        fileRegister.SetFileDataAt(fileRegisterIndex, fileData);
                        return(fileData);
                    }
                    catch (ProcessFailedException) { }
                    catch (ProcessFreezedException) { }
                }
            }
        }
Exemplo n.º 2
0
        public static void CopyFile(string id, int fileRegister1, string semantics, int fileRegister2, string salt)
        {
            Helper.Semantics semanticsId = getSemanticsId(semantics);
            IClientToPM      client      = (IClientToPM)GetProcess(id);

            client.Copy(fileRegister1, semanticsId, fileRegister2, Helper.StringToBytes(salt));
        }
Exemplo n.º 3
0
        public static void ReadFile(string id, int fileRegister, string semantics, int byteRegister)
        {
            Helper.Semantics semanticsId = getSemanticsId(semantics);
            IClientToPM      client      = (IClientToPM)GetProcess(id);

            client.Read(fileRegister, semanticsId, byteRegister);
        }
Exemplo n.º 4
0
        public void Read(int fileRegisterIndex, Helper.Semantics semantics, int byteRegisterIndex)
        {
            Console.WriteLine("READ FILE = " + fileRegisterIndex);

            try
            {
                FileData fileData = ReadFileData(fileRegisterIndex, semantics);
                byteRegister[byteRegisterIndex] = fileData.Contents;
            }
            catch (FileDoesNotExistException e)
            {
                Console.WriteLine(e.Message);
                return;
            }
        }
Exemplo n.º 5
0
        public void Copy(int fileRegisterIndex1, Helper.Semantics semantics, int fileRegisterIndex2, byte[] salt)
        {
            Console.WriteLine("COPY FILE " + fileRegisterIndex1 + " TO " + fileRegisterIndex2);

            try
            {
                FileData fileData       = ReadFileData(fileRegisterIndex1, semantics);
                byte[]   saltedContents = Helper.AppendBytes(fileData.Contents, salt);
                Write(fileRegisterIndex2, saltedContents);
            }
            catch (FileDoesNotExistException e)
            {
                Console.WriteLine(e.Message);
                return;
            }
        }
Exemplo n.º 6
0
        private LatestVersion ReadVersion(int fileRegisterIndex, Helper.Semantics semantics)
        {
            Console.WriteLine("READ VERSION " + fileRegisterIndex);

            string       filename     = fileRegister.FilenameAt(fileRegisterIndex);
            FileVersion  original     = fileRegister.FileDataAt(fileRegisterIndex).Version;
            FileMetadata fileMetadata = fileRegister.FileMetadataAt(fileRegisterIndex);
            // data server id / file data
            ConcurrentDictionary <string, FileVersion> reads = new ConcurrentDictionary <string, FileVersion>();
            int           requests      = 0;
            LatestVersion quorumVersion = null;


            //QUORUM
            while (true)
            {
                // voting
                ReadQuorum quorum = new ReadQuorum(fileMetadata.ReadQuorum, semantics);
                foreach (var entry in reads)
                {
                    FileVersion vote         = entry.Value;
                    string      dataServerId = entry.Key;

                    quorum.AddVote(vote, dataServerId);
                    if (quorum.CheckQuorum(vote, original))
                    {
                        quorumVersion = new LatestVersion(vote, quorum.DataServersIds(vote));
                        break;
                    }
                }

                // found the quorum file
                if (quorumVersion != null)
                {
                    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 data 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);
                            FileVersion fileVersion = null;
                            try
                            {
                                fileVersion = dataServer.Version(localFilename);
                            }
                            catch (ProcessFailedException) { }
                            catch (ProcessFreezedException) { }
                            finally
                            {
                                reads[id] = fileVersion;
                                Interlocked.Decrement(ref requests);
                            }
                        });
                        request.Start();
                    }
                }
            }

            return(quorumVersion);
        }
Exemplo n.º 7
0
 public ReadQuorum(int quorumSize, Helper.Semantics semantics)
 {
     this.quorumSize = quorumSize;
     this.semantics  = semantics;
 }
Exemplo n.º 8
0
 public ReadQuorum(int quorumSize, Helper.Semantics semantics)
 {
     this.quorumSize = quorumSize;
     this.semantics = semantics;
 }