Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #3
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);
        }
Exemple #4
0
        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);
        }