public async Task <bool> TryCreatePermanentReplicaAsync(IReplicaInfo replica) { var replicaPath = pathHelper.BuildReplicaPath(replica.Environment, replica.Application, replica.Replica); var createRequest = new CreateRequest(replicaPath, CreateMode.Persistent) { Data = ReplicaNodeDataSerializer.Serialize(replica) }; return((await zooKeeperClient.CreateAsync(createRequest).ConfigureAwait(false)).IsSuccessful); }
public static void ResolveItemNoData(IDbConnection connection, ISyncableItemInfo itemInfo, SyncStatus resolvedStatus, IReplicaInfo modifiedReplica) { var command = connection.CreateCommand(); command.CommandText = "UPDATE SyncItems SET SyncStatus=@SyncStatus, GlobalModifiedReplica=@ModifiedReplica, ModifiedTickCount=@ModifiedTick WHERE GlobalCreatedReplica=@CreatedReplica AND CreatedTickCount=@CreatedTick AND ItemType=@ItemType"; command.AddParameter("@SyncStatus", resolvedStatus); command.AddParameter("@ItemType", itemInfo.ItemType); command.AddParameter("@CreatedReplica", itemInfo.Created.ReplicaId); command.AddParameter("@CreatedTick", itemInfo.Created.ReplicaTickCount); command.AddParameter("@ModifiedReplica", modifiedReplica.ReplicaId); command.AddParameter("@ModifiedTick", modifiedReplica.ReplicaTickCount); command.ExecuteNonQuery(); }
public ISyncableItemInfo LocateCurrentItemInfo(ISyncableItemInfo source) { var typeHandler = HandlerForItemType(source.ItemType); IDbCommand command = _connection.CreateCommand(); command.CommandText = String.Format("SELECT CreatedReplica, CreatedTickCount, ModifiedReplica, ModifiedTickCount FROM {0} WHERE CreatedReplica=@CreatedReplica AND CreatedTickCount=@CreatedTick", typeHandler.DbTable); command.AddParameter("@CreatedReplica", GetLocalReplicaIdForGlobalReplicaId(source.Created.ReplicaId)); command.AddParameter("@CreatedTick", source.Created.ReplicaTickCount); using (IDataReader reader = command.ExecuteReader()) { if (reader.Read()) { IReplicaInfo createdReplicaInfo = ReplicaInfoFromDataReader(reader, "Created"); IReplicaInfo modifiedReplicaInfo = ReplicaInfoFromDataReader(reader, "Modified"); return(new SyncableItemInfo { ItemType = typeHandler.TypeName, Created = createdReplicaInfo, Modified = modifiedReplicaInfo, Deleted = false }); } } command = _connection.CreateCommand(); command.CommandText = String.Format("SELECT CreatedReplica, CreatedTickCount, ModifiedReplica, ModifiedTickCount FROM {0} WHERE CreatedReplica=@CreatedReplica AND CreatedTickCount=@CreatedTick AND ItemType={1}", "Tombstones", typeHandler.TypeId); command.AddParameter("@CreatedReplica", GetLocalReplicaIdForGlobalReplicaId(source.Created.ReplicaId)); command.AddParameter("@CreatedTick", source.Created.ReplicaTickCount); using (IDataReader reader = command.ExecuteReader()) { if (reader.Read()) { IReplicaInfo createdReplicaInfo = ReplicaInfoFromDataReader(reader, "Created"); IReplicaInfo modifiedReplicaInfo = ReplicaInfoFromDataReader(reader, "Modified"); return(new SyncableItemInfo { ItemType = typeHandler.TypeName, Created = createdReplicaInfo, Modified = modifiedReplicaInfo, Deleted = true }); } } return(null); }
public string GetDbState() { JObject state = new JObject(); var knowledge = GenerateLocalKnowledge().OrderBy((ri) => { return(ri.ReplicaId + ri.ReplicaTickCount.ToString()); }); state.Add("knowledge", SyncUtil.KnowledgeToJson(knowledge)); foreach (var itemType in GetItemTypes()) { var handler = HandlerForItemType(itemType); JArray items = new JArray(); IDbCommand selectCommand = _connection.CreateCommand(); selectCommand.CommandText = String.Format("SELECT CreatedReplica, CreatedTickCount, ModifiedReplica, ModifiedTickCount FROM {0}", handler.DbTable); IList <ISyncableItemInfo> itemInfos = new List <ISyncableItemInfo>(); using (IDataReader reader = selectCommand.ExecuteReader()) { while (reader.Read()) { IReplicaInfo createdReplicaInfo = ReplicaInfoFromDataReader(reader, "Created"); IReplicaInfo modifiedReplicaInfo = ReplicaInfoFromDataReader(reader, "Modified"); itemInfos.Add(new SyncableItemInfo { ItemType = handler.TypeName, Created = createdReplicaInfo, Modified = modifiedReplicaInfo, Deleted = false }); } } var sortedItemInfos = itemInfos.OrderBy((ii) => { return(ii.Created.ReplicaId + ii.Created.ReplicaTickCount.ToString()); }); foreach (var syncItemInfo in sortedItemInfos) { JObject builder = SyncUtil.JsonItemFromSyncableItemInfo(syncItemInfo); BuildItemData(syncItemInfo, builder); items.Add(builder); } state.Add(itemType, items); } return(state.ToString()); }
private IEnumerable <ISyncableItemInfo> LocateChangedOrDeletedItems(ISyncableTypeHandler typeHandler, IEnumerable <IReplicaInfo> remoteKnowledge) { List <ISyncableItemInfo> changes = new List <ISyncableItemInfo>(); IDbCommand select = _connection.CreateCommand(); select.CommandText = GenerateChangeDetectionSQL(remoteKnowledge, typeHandler.DbTable); using (IDataReader reader = select.ExecuteReader()) { while (reader.Read()) { IReplicaInfo createdReplicaInfo = ReplicaInfoFromDataReader(reader, "Created"); IReplicaInfo modifiedReplicaInfo = ReplicaInfoFromDataReader(reader, "Modified"); changes.Add(new SyncableItemInfo { ItemType = typeHandler.TypeName, Created = createdReplicaInfo, Modified = modifiedReplicaInfo, Deleted = false }); } } select.CommandText = GenerateChangeDetectionSQL(remoteKnowledge, "Tombstones"); select.CommandText += String.Format(" AND ItemType={0}", typeHandler.TypeId); using (IDataReader reader = select.ExecuteReader()) { while (reader.Read()) { IReplicaInfo createdReplicaInfo = ReplicaInfoFromDataReader(reader, "Created"); IReplicaInfo modifiedReplicaInfo = ReplicaInfoFromDataReader(reader, "Modified"); changes.Add(new SyncableItemInfo { ItemType = typeHandler.TypeName, Created = createdReplicaInfo, Modified = modifiedReplicaInfo, Deleted = true }); } } return(changes); }
public DevNullServiceBeacon(IReplicaInfo replicaInfo) => ReplicaInfo = replicaInfo;
private IEnumerable <SyncConflict> CheckForDuplicates(IDbConnection connection) { var conflicts = new List <SyncConflict>(); var changedItemInfos = _store.LocateChangedItems(_remoteKnowledge).ToList(); foreach (string itemType in _store.GetItemTypes()) { IDbCommand getInsertedItemsCommand = connection.CreateCommand(); getInsertedItemsCommand.CommandText = String.Format( "SELECT ItemID, SyncStatus, ItemType, GlobalCreatedReplica, CreatedTickCount, GlobalModifiedReplica, ModifiedTickCount, ItemData FROM SyncItems WHERE SyncStatus={0} AND ItemType='{1}'", (int)SyncStatus.Insert, itemType); using (IDataReader reader = getInsertedItemsCommand.ExecuteReader()) { while (reader != null && reader.Read()) { long itemId = Convert.ToInt64(reader["ItemID"]); IReplicaInfo createdReplicaInfo = SessionDbHelper.ReplicaInfoFromDataReader(reader, "Created"); IReplicaInfo modifiedReplicaInfo = SessionDbHelper.ReplicaInfoFromDataReader(reader, "Modified"); ISyncableItemInfo remoteItemInfo = new SyncableItemInfo { ItemType = itemType, Created = createdReplicaInfo, Modified = modifiedReplicaInfo, Deleted = false }; var remoteItemData = JObject.Parse((string)reader["ItemData"]); foreach (var changedItemInfo in changedItemInfos) { if (changedItemInfo.ItemType != remoteItemInfo.ItemType) { continue; } if (SyncUtil.KnowledgeContains(_remoteKnowledge, changedItemInfo.Created)) { continue; } // Inserted here without remote knowledge, could be a dup var builder = SyncUtil.JsonItemFromSyncableItemInfo(changedItemInfo); _store.BuildItemData(changedItemInfo, builder); var localItemData = new JObject { { "item", builder } }; DuplicateStatus dupStatus = _store.GetDuplicateStatus(remoteItemInfo.ItemType, localItemData, remoteItemData); if (dupStatus == DuplicateStatus.Exact) { SessionDbHelper.ReplaceAllItemRefs(connection, _store, remoteItemInfo, changedItemInfo); long tickCount = _store.IncrementLocalRepilcaTickCount(); IReplicaInfo modifiedReplica = new ReplicaInfo { ReplicaId = _store.GetLocalReplicaId(), ReplicaTickCount = tickCount }; SessionDbHelper.ResolveItemNoData(connection, remoteItemInfo, SyncStatus.DeleteNonExisting, modifiedReplica); break; } if (dupStatus == DuplicateStatus.Possible) { // TODO: clean this up, this call does more than we need SessionDbHelper.ResolveItemNoData(connection, remoteItemInfo, SyncStatus.InsertConflict, remoteItemInfo.Modified); conflicts.Add(new SyncConflict(itemId, SyncStatus.InsertConflict, changedItemInfo, remoteItemInfo)); break; } } } } } return(conflicts); }
/// <summary> /// Tries to parse absolute url from <see cref="IReplicaInfo.Replica"/>. /// </summary> public static bool TryGetUrl([NotNull] this IReplicaInfo replicaInfo, out Uri result) => Uri.TryCreate(replicaInfo.Replica, UriKind.Absolute, out result);
public static byte[] Serialize(IReplicaInfo replica) => SerializeProperties(replica.Properties);
public static bool KnowledgeContains(IEnumerable <IReplicaInfo> knowledge, IReplicaInfo replicaInfo) { return((from reposInfo in knowledge where reposInfo.ReplicaId == replicaInfo.ReplicaId select reposInfo.ReplicaTickCount >= replicaInfo.ReplicaTickCount).FirstOrDefault()); }