private void initializeSceneNode(ToMergeMessage toMergeMessege, Utils.ThreadLocalSceneBlob localSceneNode) { CloudBlockBlob flmBlob = null; CloudBlockBlob outputBlob = null; string sceneName = null; string guid = Guid.NewGuid().ToString(); sceneName = guid + ".png"; m_log.Info("Getting container"); BlobContainerPermissions permissions = renderStorage.Get().GetPermissions(BlobName.FILM_BLOB); permissions.PublicAccess = BlobContainerPublicAccessType.Container; renderStorage.Get().SetPermissions(BlobName.FILM_BLOB, permissions); m_log.Info("Getting blob reference"); flmBlob = renderStorage.Get().CreateBlob(BlobName.FILM_BLOB, toMergeMessege.Flm); //here new flm part(rendered by worker) is placed outputBlob = renderStorage.Get().CreateBlob(BlobName.IMAGE_BLOB, sceneName); //image will be stored here m_log.Info("/Getting blob reference"); localSceneNode.FlmBlob = flmBlob; //new worker's flm file(sent by worker to merge it into main file) localSceneNode.OutputBlob = outputBlob; //image will be stored here localSceneNode.SceneName = sceneName; //new GUID blob }
/// <summary> /// Occurs when merger gets message to merge flm /// </summary> /// <param name="merMessage">Message from worker</param> /// <returns>True is merging process should be ended</returns> private bool toMergeMessageEvent(MergerMessage merMessage) { try { while (true) { if (m_threadsCount < m_maxThreadsCount) { Thread thread = new Thread(() => updateMessageEvent(merMessage)); thread.Start(); m_log.Info("New thread started. Thread count: " + m_threadsCount.ToString()); break; } else { Thread.Sleep(3000); } } return(false); } catch (Exception ex) { m_log.Error("ToMergeMessage ex: " + ex.Message); ToMergeMessage toMergeMessege = merMessage as ToMergeMessage; MergerUpdateFailedMessage errMes = new MergerUpdateFailedMessage(ex.Message, m_scene.StartMessage.SessionId); m_dispatcherQueues[toMergeMessege.ID].AddMessage(errMes); return(true); } }
private void saveAndSendFlm() { try { m_log.Info("save flm start"); string flmName = saveFLM(); m_log.Info("save flm finish"); ToMergeMessage message = new ToMergeMessage(flmName, m_sceneUri, m_sceneID); m_mergerHandler.AddMessage(message); m_log.Info("Messege sent to merger"); } catch (Exception e) { m_log.Error("flm save UNHANDLED error: " + e.Message); } }
private void updateMessageEvent(MergerMessage merMessage) { m_log.Info("ToMergeMessage. ID: " + m_scene.SceneID.ToString()); lock (m_downloadFlmLock) { ++m_threadsCount; } ToMergeMessage toMergeMessege = merMessage as ToMergeMessage; Utils.ThreadLocalSceneBlob threadSceneNode = new Utils.ThreadLocalSceneBlob(); m_log.Info("InitializeSceneNode. ID: " + m_scene.SceneID.ToString()); initializeSceneNode(toMergeMessege, threadSceneNode); m_log.Info("/InitializeSceneNode. ID: " + m_scene.SceneID.ToString()); m_log.Info("Merge. ID: " + m_scene.SceneID.ToString()); merge(threadSceneNode); m_log.Info("/Merge. ID: " + m_scene.SceneID.ToString()); //scene name means .png blob uri lock (m_makePicLock) { if (!m_stopBySpp) { m_percentageCompleted += m_oneBatchInPercents; } if (m_makePicStopwatch.ElapsedMilliseconds > DocConstants.MAKE_PICTURE_HOLDUP) { createImage(threadSceneNode.OutputBlob); double spp = m_engine.GetSppOfLoadedFLM(); m_log.Info("SPP: " + spp); if (m_stopBySpp) { m_percentageCompleted = (float)((spp * 100.0) / m_scene.StartMessage.RequiredSpp); } m_log.Info("Completed " + m_percentageCompleted); MergerUpdateMessage updateMsg = new MergerUpdateMessage(threadSceneNode.SceneName, m_scene.StartMessage.SessionId, m_percentageCompleted, spp, m_requiredSpp); m_dispatcherQueues[toMergeMessege.ID].AddMessage(updateMsg); m_makePicStopwatch.Restart(); } --m_threadsCount; } }