2016-11-30 83 views
1

過期鍵的兄弟姐妹,我一直在使用multi後端存儲,有以下配置的服務器了Riak:了Riak正在打造bitcask桶類型

... 
storage_backend = multi 
multi_backend.bitcask_mult.storage_backend = bitcask 
multi_backend.bitcask_mult.bitcask.expiry = 10s 
... 

我已經檢查,步驟如下順序正常工作。

  1. 用鑰匙key-1提出新的值。
  2. 用密鑰key-1獲得數值返回期望值。
  3. 等15秒鐘。
  4. 嘗試使用key-1得到值。由於密鑰已過期,因此不會返回任何內容。

到目前爲止好。

但是,如果現在我把與再次相同的密鑰值...

  • 將與主要key-1
  • 一個新值key-1返回兩個獲得的價值兄弟姐妹!
  • 我已經在步驟#4和#5之間等待了幾個小時(以防萬一到期必須刷新或類似的東西),沒有運氣。

    我可以處理這種情況處理兄弟姐妹,這是我爲其他一些桶工作,但我並不期望必須處理「過期的兄弟姐妹」!

    我已閱讀了一些關於automatic expiration and Riak Search的內容,但我不認爲是這種情況。

    我做錯了什麼?我錯過了什麼嗎?

    感謝。

    回答

    2

    無效,失效正在運行,但您遇到了一個問題,我將稱之爲「失效<>刪除」。當一個對象在Bitcask中到期時,由Bitcask創建一個墓碑,並且後端返回not_found來對該對象的任何請求但是該對象不被刪除。當Bitcask數據文件中最舊的對象到期並且整個文件過期時,該對象將被「刪除」。此時會創建一個新文件。

    直到在Bitcask中創建一個新文件時,即使Bitcask返回not_found,該對象實際上仍然存在。當你寫入「已刪除」鍵Bitcask時,最後修改的時間正在更新,基本上重新生成它。

    要測試這個理論,你可以實際上停止Riak並重新啓動它。重新啓動Riak會導致Bitcask創建一個新的數據文件,並使您不會得到兄弟姐妹。

    長話短說,你仍然需要在這種情況下處理兄弟姐妹。

    +0

    我不認爲這是相當準確的。從我讀的源代碼中,bitcask後端處理過期,而上面的riak_kv_vnode層決定是否有兄弟。Riak_kv_vnode調用bitcask:找到任何預先存在的值,並且如果它已經過期,bitcask應該返回notfound。如果我錯了什麼,請指出。 – Joe