我正在觀看一個會議演講(無需觀看即可理解我的問題,但如果您好奇,它是從 35 平方米到 36 平方米)。顯示了以下測驗:
TEST(Foo, StorageTest){
StorageServer* server = GetStorageServerHandle();
auto my_val = rand();
server -> Store("testKey", my_val);
EXPECT_EQ(my_val, server->Load("testKey"));
}
一位發言者說:“你只能期望將資料存盤到生產服務中,如果一次只運行一個測驗副本。”
另一位發言者說:“一旦你在混合中添加持續集成,測驗就會開始失敗”。我對 CI/CD 了解不多。
我在理解索賠 1 和 2 時遇到了一些麻煩。有什么幫助嗎?
uj5u.com熱心網友回復:
一位發言者說:“你只能期望將資料存盤到生產服務中,如果一次只運行一個測驗副本。”
對。想象一下,如果這段代碼的兩個實體正在運行。如果兩個操作都在其中一個操作發生Store之前執行,那么首先執行的操作將加載錯誤的值。LoadStore
考慮這種模式,其中兩個實體被稱為“第一”和“第二”:
- 首先
Store執行,存盤第一個隨機值。 - Second
Store開始執行,開始存盤第二個隨機值。 - 由于資料庫內部的鎖,第一個在第二個完成時被
Load阻止Store - 由于資料庫的本地內部,第二個
Load在完成時被阻止。Store - 第二次
Store完成并釋放內部鎖。 - 第一個
Load現在可以執行,它得到第二個隨機值。 EXPECT_EQ失敗,因為第一個和第二個隨機值不同。
另一位發言者說:“一旦你在混合中添加持續集成,測驗就會開始失敗”。
如果 CI 系統同時測驗代碼的多個實體,則可能會發生類似上面示例的競爭條件,并導致測驗失敗,因為多個實體相互競爭。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/424115.html
