public async Task InitializeVertexAsync( string vertexName, string vertexDefinition, string instanceName, ConcurrentDictionary <string, IVertex> table, IVertex vertex) { // INITIALIZE if ((VertexBase)vertex != null) { ((VertexBase)vertex).VertexName = vertexName; ((VertexBase)vertex).ClientLibrary = this; } // LATCH CALLBACKS TO POPULATE ENDPOINT TABLE vertex.OnAddInputEndpoint((name, endpt) => _endpointTableManager.AddEndpoint(vertexName, name, true, false)); vertex.OnAddOutputEndpoint((name, endpt) => _endpointTableManager.AddEndpoint(vertexName, name, false, false)); vertex.OnAddAsyncInputEndpoint((name, endpt) => _endpointTableManager.AddEndpoint(vertexName, name, true, true)); vertex.OnAddAsyncOutputEndpoint((name, endpt) => _endpointTableManager.AddEndpoint(vertexName, name, false, true)); //ADD TO TABLE if (table != null) { table.AddOrUpdate(vertexName, vertex, (procName, oldProc) => { oldProc.Dispose(); return(vertex); }); vertex.OnDispose(() => { // Delete all endpoints of the vertex foreach (var key in vertex.InputEndpoints) { _endpointTableManager.DeleteEndpoint(vertexName, key.Key); } foreach (var key in vertex.AsyncInputEndpoints) { _endpointTableManager.DeleteEndpoint(vertexName, key.Key); } foreach (var key in vertex.OutputEndpoints) { _endpointTableManager.DeleteEndpoint(vertexName, key.Key); } foreach (var key in vertex.AsyncOutputEndpoints) { _endpointTableManager.DeleteEndpoint(vertexName, key.Key); } IVertex old; if (!table.TryRemove(vertexName, out old)) { Console.WriteLine("Unable to remove vertex on disposal"); } Task.Run(() => _vertexManager.DeleteInstanceVertex( instanceName, vertexName)); }); } string blobName = vertexName + "-" + instanceName; string parameterString; using (var parametersStream = await _blobStorage.GetReadStream(vertexDefinition + "/" + blobName)) { byte[] parametersBytes = parametersStream.ReadByteArray(); parameterString = Encoding.UTF8.GetString(parametersBytes); } var par = SerializationHelper.DeserializeObject(parameterString); await vertex.InitializeAsync(par); // Activate vertex await ActivateVertexAsync(vertexName, instanceName); }
internal async Task <CRAErrorCode> InstantiateVertexAsync( string instanceName, string vertexName, string vertexDefinition, object vertexParameter, bool sharded) { var procDefRow = await _vertexManager.VertexInfoProvider.GetRowForVertexDefinition(vertexDefinition); string blobName = vertexName + "-" + instanceName; using (var blobStream = await _blobStorage.GetWriteStream(vertexDefinition + "/" + blobName)) { byte[] parameterBytes = Encoding.UTF8.GetBytes( SerializationHelper.SerializeObject(vertexParameter)); blobStream.WriteByteArray(parameterBytes); } var newInfo = new VertexInfo( instanceName: instanceName, address: "", port: 0, vertexName: vertexName, vertexDefinition: vertexDefinition, vertexCreateAction: procDefRow.Value.VertexCreateAction, vertexParameter: blobName, isActive: false, isSharded: sharded); await _vertexManager.VertexInfoProvider.InsertOrReplace(newInfo); CRAErrorCode result = CRAErrorCode.Success; // Send request to CRA instance VertexInfo instanceRow; try { instanceRow = (await _vertexManager.GetRowForInstance(instanceName)).Value; // Get a stream connection from the pool if available Stream stream; if (!TryGetSenderStreamFromPool(instanceRow.Address, instanceRow.Port.ToString(), out stream)) { TcpClient client = new TcpClient(instanceRow.Address, instanceRow.Port); client.NoDelay = true; stream = client.GetStream(); if (SecureStreamConnectionDescriptor != null) { stream = SecureStreamConnectionDescriptor.CreateSecureClient(stream, instanceName); } } stream.WriteInt32((int)CRATaskMessageType.LOAD_VERTEX); stream.WriteByteArray(Encoding.UTF8.GetBytes(vertexName)); stream.WriteByteArray(Encoding.UTF8.GetBytes(vertexDefinition)); stream.WriteByteArray(Encoding.UTF8.GetBytes(newInfo.VertexParameter)); result = (CRAErrorCode)stream.ReadInt32(); if (result != 0) { Console.WriteLine("Vertex was logically loaded. However, we received an error code from the hosting CRA instance: " + result); } // Add/Return stream connection to the pool TryAddSenderStreamToPool(instanceRow.Address, instanceRow.Port.ToString(), stream); } catch { Console.WriteLine("The CRA instance appears to be down. Restart it and this vertex will be instantiated automatically"); } return(result); }