天天看點

OSS crc64 出現不一緻

作者:張醫博

用戶端的循環備援校驗和服務端不一緻,可以上傳成功

OSS crc64 出現不一緻

排查

出現類似問題,需要先收集資訊,經常發生在 Java sdk 上傳的過程中。

  • requestID 出現 checksum 不一緻的情況一定會伴随有 requestID 資訊。
  • 上傳方式是通過 SDK 還是自己調 API 上傳,需要明确 SDK 的版本資訊。
  • 問題能否穩定複現,能複現最好提供網絡抓包便于問題分析。
  • tcpdump -i <出口網卡> -s0 host -w checksum.pcap

分析:

  • 收集到 requestID 後,先更新到阿裡雲确認是否已經上傳成功,一般 checksum 不一緻并不會導緻上傳失敗, checksum 是對檔案進行循環備援計算的方法,和 MD5 不一樣,如果 MD5 不一緻,檔案上傳一定失敗。如果日志記錄上傳成功,可以校驗檔案的 MD5 是否一緻,如果一緻的話請忽略 checksum 不一緻的情況。
  • 出現 checksum 不一緻的情況和網絡以及系統主機都有關系,先通過網絡抓包分析下,用戶端發起 request header 中的 crc64 是否和 requestID 查到的 crc64,如果一緻的話說明使用者上傳網絡傳輸中被篡改了,如果不一緻的話說明客戶本地寫入到記憶體後就出現問題。
  • 如果使用者本地計算寫入到記憶體和服務端的不一緻,需要使用者在本地代碼中進行 debug ,在上傳請求發起前,先列印出 crc64 記錄到本地,看看與 SDK 計算的是否一緻,確定檔案在上傳前不要有其他進行在占用,或者讀寫。如果本地計算的 crc64 和 SDK 一緻 說明不是計算問題,而是寫入到記憶體後出現了問題,說明是用戶端的系統導緻的異常。

建議:

  • 如果出現 checksum 不一緻,但是檔案 MD5 一緻的話客戶可以将 crc64 關掉,替換成 MD5 的校驗方式,在 header 增加 Content-MD5 頭,MD5 值要全部大寫,然後在 base64 編碼。
  • Java SDK 關閉 crc64 的方法

    關閉 crc 的方法如下:

https://help.aliyun.com/document_detail/32010.html?spm=a2c4g.11186623.6.702.5bb84b4eKVgJfk
String endpoint = "<yourEndpoint>";
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
ClientConfiguration conf = new ClientConfiguration();
conf.setCrcCheckEnabled(false);

// 建立OSSClient執行個體。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret, conf);           
  • 使用 https 協定上傳,将 endpoint 協定頭改為 https 即可,看下更換為 https 協定後問題是否還能複現。