Пример #1
0
        private static void PrepareCommonData(string sessionId)
        {
            if (common_data_size > 0)
            {
#if HPCPACK
                byte[] common_data = new byte[common_data_size];
                Random r           = new Random();
                r.NextBytes(common_data);
                commonData_dataClientId = sessionId.ToString();
                Log("Begin to write common data.");
                data.CreateDataClientStart = DateTime.Now;
                using (DataClient dataClient = DataClient.Create(headnode, commonData_dataClientId, null, !onDemand))
                {
                    data.CreateDataClientEnd = DateTime.Now;
                    dataClient.SetDataLifeCycle(new DataLifeCycle(sessionId));
                    data.WriteDataClientStart = DateTime.Now;
                    dataClient.WriteRawBytesAll(common_data, common_data_compress);
                    data.WriteDataClientEnd = DateTime.Now;
                    dataClient.Close();
                }
                Log("Common data written done.");
#else
                throw new NotSupportedException("No common data support yet.");
#endif
            }
            else
            {
                Log("Common data size is 0, skip creating common data.");
            }
        }
Пример #2
0
        static void Main(string[] args)
        {
            //create prime number table of prime numbers between 1 and 200000
            Console.WriteLine("Generating prime number table...");
            List <int> PrimeNumberTable = GeneratePrimeNumberTable(200000);

            const string headnode = "head.contoso.com";
            string       dataId   = "PRIME_NUMBER_TABLE";

            Console.WriteLine("Creating data client {0}", dataId);

            try
            {
                //create DataClient to send data
                using (DataClient dataClient = DataClient.Create(headnode, dataId))
                {
                    //WriteAll can be called only once per data client
                    dataClient.WriteAll <List <int> >(PrimeNumberTable);
                }
            }
            catch (DataException ex)
            {
                //If data client already exists, delete it and try again
                if (ex.ErrorCode == 103809028)
                {
                    Console.WriteLine("{0} already exists, delete it and send again.", dataId);
                    DataClient.Delete(headnode, dataId);

                    using (DataClient dataClient = DataClient.Create(headnode, dataId))
                    {
                        dataClient.WriteAll <List <int> >(PrimeNumberTable);
                    }
                }
            }

            Console.WriteLine("{0} has been sent to cluster", dataId);

            Console.WriteLine("Press any key to exit");
            Console.ReadKey();
        }
        /// <summary>
        /// Upload Azure files
        /// </summary>
        /// <param name="startInfo">The session start info</param>
        private IList <string> UploadAzureFiles(SessionStartInfo startInfo)
        {
            List <string> newClientIdList = null;

            if (startInfo.DependFiles != null && startInfo.DependFiles.Count > 0)
            {
                bool allUploaded = false;
                SessionBase.TraceSource.TraceEvent(TraceEventType.Verbose, 0, "Start to upload data files to Azure blob");
                newClientIdList = new List <string>();
                List <string> depList = new List <string>();
                try
                {
                    foreach (string srcfile in startInfo.DependFiles.Keys)
                    {
                        if (!File.Exists(srcfile))
                        {
                            throw new IOException(string.Format("The file {0} doesn't exist", srcfile));
                        }

                        string md5ByteStr   = string.Empty;
                        string md5base64Str = string.Empty;
                        using (var md5 = MD5.Create())
                        {
                            using (var stream = File.OpenRead(srcfile))
                            {
                                var hashBytes = md5.ComputeHash(stream);
                                md5base64Str = Convert.ToBase64String(hashBytes);
                                md5ByteStr   = BitConverter.ToString(hashBytes).Replace("-", string.Empty);
                                SessionBase.TraceSource.TraceEvent(TraceEventType.Verbose, 0, "Source file {0} md5: {1}", srcfile, md5ByteStr);
                            }
                        }

                        string     clientId     = string.Format("{0}_{1}", startInfo.Username.Replace(@"\", "-").ToLower(), md5ByteStr);
                        bool       removeClient = false;
                        DataClient client       = null;
                        try
                        {
                            client = DataClient.Open(startInfo, clientId);
                            string contentMd5 = client.GetContentMd5();
                            if (contentMd5 != md5base64Str)
                            {
                                SessionBase.TraceSource.TraceEvent(TraceEventType.Information, 0, "The content of data client {0} is not correct: expected md5 {1}, real md5 {2}", clientId, md5base64Str, contentMd5);
                                removeClient = true;
                            }
                        }
                        catch (DataException e)
                        {
                            if (e.ErrorCode == DataErrorCode.DataTransferToAzureFailed || e.ErrorCode == DataErrorCode.DataInconsistent)
                            {
                                // DataTransferToAzureFailed: Blob primary data container and the data transfer to blob failed.
                                // DataInconsistent: The data is inconsistent
                                SessionBase.TraceSource.TraceEvent(TraceEventType.Warning, 0, "The data client {0} already exists but data corrupt: {1}", clientId, e);
                                removeClient = true;
                            }
                            else if (e.ErrorCode == DataErrorCode.ConnectDataServiceFailure)
                            {
                                SessionBase.TraceSource.TraceEvent(TraceEventType.Warning, 0, "Open data client {0} failed due to communication failure: {1}", clientId, e);
                                if (e.InnerException is MessageSecurityException)
                                {
                                    // If caused by MessageSecurityException, we shall throw InnerException, so that prompt for username/password
                                    throw e.InnerException;
                                }
                                else
                                {
                                    throw;
                                }
                            }
                            else if (e.ErrorCode != DataErrorCode.DataClientNotFound)
                            {
                                SessionBase.TraceSource.TraceEvent(TraceEventType.Error, 0, "Open data client {0} failed: {1}", clientId, e);
                                throw;
                            }
                        }

                        try
                        {
                            if (removeClient)
                            {
                                DataClient.Delete(startInfo, clientId);
                                client = null;
                            }

                            if (client == null)
                            {
                                SessionBase.TraceSource.TraceEvent(TraceEventType.Information, 0, "Create data client {0} for file {1}", clientId, srcfile);
                                client = DataClient.Create(startInfo, clientId, true);
                                newClientIdList.Add(clientId);
                                client.WriteRawBytesAll(File.ReadAllBytes(srcfile));
                            }

                            depList.Add(string.Format("{0}={1}", clientId, startInfo.DependFiles[srcfile]));
                        }
                        catch (Exception e)
                        {
                            SessionBase.TraceSource.TraceEvent(TraceEventType.Error, 0, "Failed to create data client {0}: {1}", clientId, e);
                            throw;
                        }
                    }

                    allUploaded = true;
                }
                finally
                {
                    if (!allUploaded && newClientIdList.Count > 0)
                    {
                        SessionBase.TraceSource.TraceEvent(TraceEventType.Information, 0, "Failed to upload some files, remove the files already uploaded");
                        CleanUpDataClients(startInfo, newClientIdList);
                        newClientIdList = null;
                    }
                }

                startInfo.Data.DependFiles = string.Join(";", depList.ToArray());
            }

            return(newClientIdList);
        }
Пример #4
0
        static void Main(string[] args)
        {
            string hostname = "[headnode]";

            // DataClient Id used to identify the data, this should be unique across the cluster
            string raw_data_id        = "raw_data_id";
            string dictionary_data_id = "dictionary_data_id";

            Console.WriteLine("Start. " + DateTime.Now.ToLongTimeString());

            // Create a DataClient to store a Dictionary data
            using (DataClient client = DataClient.Create(hostname, dictionary_data_id))
            {
                Console.WriteLine("Data {0} Created. {1} ", dictionary_data_id, DateTime.Now.ToLongTimeString());
                // Here we have a DataClient whose life cycle is not managed by SOA
                Dictionary <string, string> objects = new Dictionary <string, string>();
                objects.Add("key1", "value1");
                objects.Add("key2", "value2");
                // WriteAll() can only be called once on a data client.
                client.WriteAll <Dictionary <string, string> >(objects);
            }

            SessionStartInfo sessionStartInfo = new SessionStartInfo(hostname, "CommonDataService");

            // Pass DataClient Id in SOA session's environment variable so that it could be read from service code
            sessionStartInfo.Environments.Add("DICTIONARY_DATA_ID", dictionary_data_id);

            using (Session session = Session.CreateSession(sessionStartInfo))
            {
                Console.WriteLine("Session {0} Created. {1} ", session.Id, DateTime.Now.ToLongTimeString());

                // Create a DataClient to store the raw data read from the file
                using (DataClient client = DataClient.Create(hostname, raw_data_id))
                {
                    Console.WriteLine("Data {0} Created {1}. ", client.Id, DateTime.Now.ToLongTimeString());
                    // Add a data life cycle management so that it'll be deleted when session is done
                    // Otherwise, the data will have to be cleaned up by client
                    client.SetDataLifeCycle(new DataLifeCycle(session.Id));
                    // WriteRawBytesAll() doesn't serialize the object and will write the byte stream directly.
                    // Use this when you want to transport a file or have non-.Net code that cannot handle .net serialization.
                    client.WriteRawBytesAll(File.ReadAllBytes("DataFile.txt"));
                }

                // Send/Receive SOA requests
                using (BrokerClient <ICommonDataService> client = new BrokerClient <ICommonDataService>(session))
                {
                    Console.WriteLine("Send Requests. " + DateTime.Now.ToLongTimeString());
                    client.SendRequest <GetDataRequest>(new GetDataRequest(raw_data_id));
                    client.EndRequests();
                    Console.WriteLine("Get Response. " + DateTime.Now.ToLongTimeString());
                    foreach (BrokerResponse <GetDataResponse> resp in client.GetResponses <GetDataResponse>())
                    {
                        string result = resp.Result.GetDataResult;
                        Console.WriteLine(result);
                    }
                }
                Console.WriteLine("Start closing session. " + DateTime.Now.ToLongTimeString());
            }
            Console.WriteLine("Session Closed. " + DateTime.Now.ToLongTimeString());

            Console.WriteLine("Start cleaning up the Data {0}. {1} ", dictionary_data_id, DateTime.Now.ToLongTimeString());
            // We should delete the DataClient "dictionary_data_id" here since it's not managed by SOA
            DataClient.Delete(hostname, dictionary_data_id);

            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }