public async ValueTask <List <SplitCollectionInfo> > GetCollectionList(DateTime?startTime = null) { List <SplitCollectionInfo> list = null; if (startTime == null) { list = AllSplitCollections; } else { var collectionTask = GetCollection(startTime.Value); if (!collectionTask.IsCompleted) { await collectionTask; } list = AllSplitCollections.Where(c => c.Version >= collectionTask.Result.Version).ToList(); } if (list == null || list.Count == 0) { var collectionTask = GetCollection(DateTime.UtcNow); if (!collectionTask.IsCompleted) { await collectionTask; } list = new List <SplitCollectionInfo>() { collectionTask.Result }; } return(list); }
public int GetVersion(long eventTimestamp) { var firstTable = AllSplitCollections.FirstOrDefault(); //如果不需要分表,直接返回 if (firstTable != null && !sharding) { return(0); } var nowUtcTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); var subMinutes = (eventTimestamp - (firstTable != null ? firstTable.CreateTime : nowUtcTime)) / (60 * 1000); return(subMinutes > 0 ? (int)(subMinutes / shardingMinutes) : 0); }
public async ValueTask <SplitCollectionInfo> GetCollection(DateTime eventTime) { SplitCollectionInfo lastCollection = null; if (AllSplitCollections.Count > 0) { lastCollection = AllSplitCollections.Last(); } //如果不需要分表,直接返回 if (lastCollection != null && !sharding) { return(lastCollection); } var subTime = eventTime.Subtract(SplitStartTime); var newVersion = subTime.TotalDays > 0 ? Convert.ToInt32(Math.Floor(subTime.TotalDays / shardingDays)) : 0; if (lastCollection == null || newVersion > lastCollection.Version) { if (lastCollection == null || newVersion > lastCollection.Version) { var collection = new SplitCollectionInfo { Id = ObjectId.GenerateNewId().ToString(), Version = newVersion, Type = EventCollection, CreateTime = DateTime.UtcNow, Name = EventCollection + "_" + newVersion }; try { await Storage.GetCollection <SplitCollectionInfo>(DataBase, SplitCollectionName).InsertOneAsync(collection); AllSplitCollections.Add(collection); lastCollection = collection; await CreateEventIndex(collection.Name); } catch (MongoWriteException ex) { if (ex.WriteError.Category == ServerErrorCategory.DuplicateKey) { AllSplitCollections = await(await Storage.GetCollection <SplitCollectionInfo>(DataBase, SplitCollectionName).FindAsync(c => c.Type == EventCollection)).ToListAsync(); return(await GetCollection(eventTime)); } } } } return(lastCollection); }
public async ValueTask <SplitCollectionInfo> GetCollection(long eventTimestamp) { var firstCollection = AllSplitCollections.FirstOrDefault(); //如果不需要分表,直接返回 if (firstCollection != null && !sharding) { return(firstCollection); } var nowUtcTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); var subMinutes = (eventTimestamp - (firstCollection != null ? firstCollection.CreateTime : nowUtcTime)) / (60 * 1000); var version = subMinutes > 0 ? Convert.ToInt32((subMinutes / shardingMinutes)) : 0; var resultTable = AllSplitCollections.FirstOrDefault(t => t.Version == version); if (resultTable == default) { var collection = new SplitCollectionInfo { Id = ObjectId.GenerateNewId().ToString(), Version = version, Type = EventCollection, CreateTime = nowUtcTime, Name = EventCollection + "_" + version }; try { await Storage.GetCollection <SplitCollectionInfo>(DataBase, SplitCollectionName).InsertOneAsync(collection); AllSplitCollections.Add(collection); resultTable = collection; await CreateEventIndex(collection.Name); } catch (MongoWriteException ex) { if (ex.WriteError.Category == ServerErrorCategory.DuplicateKey) { AllSplitCollections = await(await Storage.GetCollection <SplitCollectionInfo>(DataBase, SplitCollectionName).FindAsync(c => c.Type == EventCollection)).ToListAsync(); return(await GetCollection(eventTimestamp)); } resultTable = AllSplitCollections.First(t => t.Version == version); } } return(resultTable); }