A Bug

· 309 words · 1 minute read

今天碰到一个单元测试中的 bug,有点意思,不妨记录如下。

我有一个 Azure CloudTable,用来存放一些需要后台执行的操作内容。其 PartitionKey 和 RowKey 分别设为订阅号和当时的时钟滴答(Tick)。这样设计的用意在于,尽量使得针对某个订阅和,基于时间的查询将会很快。但也有一个隐含的假设:在一个Tick之内只会有一个操作需要被记录。这应该是一个合理的假设,因为操作是由前台Web页面提交的。

var tick = DateTime.UtcNow.Ticks;

我在单元测试中循环添加了一系列记录(显然,不是通过网页),插入记录时发生了冲突 - 因为 PK + RK 不能唯一识别一条记录,因为 DateTime 本身远非精确到每个Tick。

long now = DateTime.Now.Ticks;
long cur;
long cnt = 1;

while ((cur = DateTime.Now.Ticks) == now)
{
    ++cnt;
}

Console.WriteLine("delta: {0}, cnt: {1}", cur - now, cnt);

我的机器上,cnt 大致处于一万至十万之间。

comments powered by Disqus