/// <summary>
        /// Load balancing algorithm is using this function to update the snapshot after its done
        /// </summary>
        /// <param name="snapshot"></param>

        public void updateMachineData(Dictionary <string, ZNodesDataStructures.MachineNode> snapshot)
        {
            Dictionary <String, ZNodesDataStructures.MachineNode> oldMachineData = new Dictionary <string, ZNodesDataStructures.MachineNode>(tree.Machines);

            calculatedSnapshot = snapshot; // TODO: remove this someday, (funny, huh ?)
            // Update Machines local tree
            foreach (var machine in snapshot)
            {
                var currentMachineRecord = machine.Value;
                var previousMachineValue = tree.Machines[machine.Key];

                bool updateZKTree = false;
                if (machine.Key == MachineName)
                {
                    updateZKTree = true;
                }


                if (updateZKTree)
                {
                    zk.SetData(id, currentMachineRecord);
                }
                tree.Machines[machine.Key] = currentMachineRecord;

                var addPrimaries    = currentMachineRecord.primaryOf.Except(previousMachineValue.primaryOf);
                var removePrimaries = previousMachineValue.primaryOf.Except(currentMachineRecord.primaryOf);

                var addBackup    = currentMachineRecord.backsUp.Except(previousMachineValue.backsUp);
                var removeBackup = previousMachineValue.backsUp.Except(currentMachineRecord.backsUp);

                foreach (var pToAdd in addPrimaries)
                {
                    ZNodesDataStructures.SellerNode primaryRecord = new ZNodesDataStructures.SellerNode()
                    {
                        machineName = machine.Key,
                        role        = ZNodesDataStructures.SellerNode.NodeRole.Main,
                        uri         = currentMachineRecord.uri,
                        version     = -1
                    };
                    tree.SetPrimaryOf(pToAdd, primaryRecord);
                    if (updateZKTree)
                    {
                        zk.Create(SellersPath + "/" + pToAdd + "/" + machine.Key, primaryRecord, Ids.OPEN_ACL_UNSAFE, CreateMode.Ephemeral);
                    }
                }

                foreach (var pToRemove in removePrimaries)
                {
                    tree.RemovePrimaryOf(pToRemove, machine.Key);
                    if (updateZKTree)
                    {
                        zk.Delete(SellersPath + "/" + pToRemove + "/" + machine.Key);
                    }
                }

                foreach (var bToAdd in addBackup)
                {
                    ZNodesDataStructures.SellerNode primaryRecord = new ZNodesDataStructures.SellerNode()
                    {
                        machineName = machine.Key,
                        role        = ZNodesDataStructures.SellerNode.NodeRole.Backup,
                        uri         = currentMachineRecord.uri,
                        version     = -1
                    };
                    tree.SetBackupOf(bToAdd, primaryRecord);
                    if (updateZKTree)
                    {
                        zk.Create(SellersPath + "/" + bToAdd + "/" + machine.Key, primaryRecord, Ids.OPEN_ACL_UNSAFE, CreateMode.Ephemeral);
                    }
                }

                foreach (var bToRemove in removeBackup)
                {
                    tree.RemoveBackupOf(bToRemove, machine.Key);
                    if (updateZKTree)
                    {
                        zk.Delete(SellersPath + "/" + bToRemove + "/" + machine.Key);
                    }
                }


                //tree.Machines[machine.Key] = machine.Value;
            }
            // STOP HERE
        }