project 1如何通过呢? 很奇怪, 提交了然后编译通过了但是就是测试不了, 每个测试都显示test not run

1
zip project0-submission.zip src/include/primer/p0_starter.h

这次终于顺利将代码提交到了Gradescop, 但是测试没有通过, 好消息是有一部分通过了, 说明是代码实现出了一点问题, 想来改改还是可以过的.

执行命令将响应代码压缩为zip文件然后上传提交

1
zip project1-submission.zip src/include/buffer/lru_replacer.h src/buffer/lru_replacer.cpp src/include/buffer/buffer_pool_manager_instance.h src/buffer/buffer_pool_manager_instance.cpp src/include/buffer/parallel_buffer_pool_manager.h src/buffer/parallel_buffer_pool_manager.cpp

不管是standalone还是parallel, 测试都止步于 FetchPage, 之前的测试都通过了, 而之后的都没有通过, 没有通过的如下

  • Concurrency
  • FetchPage
  • DeletePage
  • IsDirty

image-20211027083141852

即使是最简单的LRUReplacer, 也有并发测试没有通过, 这个integrated叫做综合的, 应该通过了currency之后, 这个也能通过了

LRUReplacer类有三个临界区, 分别是: size_, frame_list_, frame_map_, 他们可能伴随着并发的读写, 但是注意不要形成死锁.

然后真的形成死锁了, 原因是实现size()时unlock写到return之后了, 四不四傻.

1
2
3
4
5
size_t LRUReplacer::Size() {
    latch_.lock();
    return size_;
    latch_.unlock();
}

然而这个测试还是没有通过, 并发那里是time out, 和没加锁前一样, 而且总分还从30变成20分了… 尴尬

将锁换成 scoped_lock 并且调整了锁的范围之后终于过了LRU的并发测试. scoped_lock 是我新学到的东西, 以前没学过, 发现知识还比较欠缺.

终于全部改好了!!!

image-20211027194617772

一下几点是我之前失误的

  • 没有加锁(预料之中过不了一些样例)
  • 在UnpinPgImp中, 理解错了它 is_dirty 的意思, 以为是要flush脏页, 但其实是让我设置标志位
  • 同样是在 UnpinPgImp中, 只对page->GetPinCount() == 0返回了true, 但其实count>0也需要返回true.
  • FlushPgImp中执行正常情况时漏掉了 return true(太粗心)