From: David Zafman Date: Thu, 6 Jul 2017 02:14:36 +0000 (-0700) Subject: osd: Add whether shard is primary in list-inconsistent-obj X-Git-Tag: v12.2.0~26^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7d2f48106ef9ac09ad58c029df05c8222be9897b;p=ceph.git osd: Add whether shard is primary in list-inconsistent-obj Add new field in the client interface Update test case Fixes: http://tracker.ceph.com/issues/18836 Signed-off-by: David Zafman (cherry picked from commit 8ad4b291131058bbdb4267f4cad35a40fb905bb4) --- diff --git a/doc/rados/command/list-inconsistent-obj.json b/doc/rados/command/list-inconsistent-obj.json index b9ee1793ff2b..a7c17ace9be5 100644 --- a/doc/rados/command/list-inconsistent-obj.json +++ b/doc/rados/command/list-inconsistent-obj.json @@ -104,6 +104,9 @@ "osd": { "type": "integer" }, + "primary": { + "type": "boolean" + }, "size": { "type": "integer" }, @@ -164,6 +167,7 @@ }, "required": [ "osd", + "primary", "errors" ] } diff --git a/qa/standalone/scrub/osd-scrub-repair.sh b/qa/standalone/scrub/osd-scrub-repair.sh index 28db9476b1b8..74b9b8a29202 100755 --- a/qa/standalone/scrub/osd-scrub-repair.sh +++ b/qa/standalone/scrub/osd-scrub-repair.sh @@ -630,14 +630,16 @@ function TEST_corrupt_scrub_replicated() { { "size": 7, "errors": [], - "osd": 0 + "osd": 0, + "primary": false }, { "size": 9, "errors": [ "size_mismatch_oi" ], - "osd": 1 + "osd": 1, + "primary": true } ], "selected_object_info": "3:ce3f1d6a:::ROBJ1:head(47'54 osd.0.0:53 dirty|omap|data_digest|omap_digest s 7 uv 3 dd 2ddbf8f5 od f5fba2c6 alloc_hint [0 0 0])", @@ -661,12 +663,14 @@ function TEST_corrupt_scrub_replicated() { "errors": [ "stat_error" ], - "osd": 0 + "osd": 0, + "primary": false }, { "size": 7, "errors": [], - "osd": 1 + "osd": 1, + "primary": true } ], "selected_object_info": "3:bc819597:::ROBJ12:head(47'52 osd.0.0:51 dirty|omap|data_digest|omap_digest s 7 uv 36 dd 2ddbf8f5 od 67f306a alloc_hint [0 0 0])", @@ -688,12 +692,14 @@ function TEST_corrupt_scrub_replicated() { "errors": [ "stat_error" ], - "osd": 0 + "osd": 0, + "primary": false }, { "size": 7, "errors": [], - "osd": 1 + "osd": 1, + "primary": true } ], "selected_object_info": "3:d60617f9:::ROBJ13:head(47'55 osd.0.0:54 dirty|omap|data_digest|omap_digest s 7 uv 39 dd 2ddbf8f5 od 6441854d alloc_hint [0 0 0])", @@ -716,14 +722,16 @@ function TEST_corrupt_scrub_replicated() { "errors": [ "oi_attr_corrupted" ], - "osd": 0 + "osd": 0, + "primary": false }, { "size": 7, "errors": [ "oi_attr_missing" ], - "osd": 1 + "osd": 1, + "primary": true } ], "union_shard_errors": [ @@ -756,7 +764,8 @@ function TEST_corrupt_scrub_replicated() { ], "size": 7, "errors": [], - "osd": 0 + "osd": 0, + "primary": false }, { "attrs": [ @@ -770,7 +779,8 @@ function TEST_corrupt_scrub_replicated() { "errors": [ "oi_attr_missing" ], - "osd": 1 + "osd": 1, + "primary": true } ], "selected_object_info": "3:30259878:::ROBJ15:head(47'46 osd.0.0:45 dirty|omap|data_digest|omap_digest s 7 uv 45 dd 2ddbf8f5 od 2d2a4d6e alloc_hint [0 0 0])", @@ -793,13 +803,15 @@ function TEST_corrupt_scrub_replicated() { { "size": 7, "errors": [], - "osd": 0 + "osd": 0, + "primary": false }, { "errors": [ "missing" ], - "osd": 1 + "osd": 1, + "primary": true } ], "selected_object_info": "3:f2a5b2a4:::ROBJ3:head(47'57 osd.0.0:56 dirty|omap|data_digest|omap_digest s 7 uv 9 dd 2ddbf8f5 od b35dfd alloc_hint [0 0 0])", @@ -842,7 +854,8 @@ function TEST_corrupt_scrub_replicated() { ], "size": 7, "errors": [], - "osd": 0 + "osd": 0, + "primary": false }, { "attrs": [ @@ -869,7 +882,8 @@ function TEST_corrupt_scrub_replicated() { ], "size": 7, "errors": [], - "osd": 1 + "osd": 1, + "primary": true } ], "selected_object_info": "3:86586531:::ROBJ8:head(82'62 client.4351.0:1 dirty|omap|data_digest|omap_digest s 7 uv 62 dd 2ddbf8f5 od d6be81dc alloc_hint [0 0 0])", @@ -904,7 +918,8 @@ function TEST_corrupt_scrub_replicated() { "object_info": "3:ffdb2004:::ROBJ9:head(102'63 client.4433.0:1 dirty|omap|data_digest|omap_digest s 1 uv 63 dd 2b63260d od 2eecc539 alloc_hint [0 0 0])", "size": 1, "errors": [], - "osd": 0 + "osd": 0, + "primary": false }, { "attrs": [ @@ -922,7 +937,8 @@ function TEST_corrupt_scrub_replicated() { "object_info": "3:ffdb2004:::ROBJ9:head(47'60 osd.0.0:59 dirty|omap|data_digest|omap_digest s 7 uv 27 dd 2ddbf8f5 od 2eecc539 alloc_hint [0 0 0])", "size": 1, "errors": [], - "osd": 1 + "osd": 1, + "primary": true } ], "selected_object_info": "3:ffdb2004:::ROBJ9:head(102'63 client.4433.0:1 dirty|omap|data_digest|omap_digest s 1 uv 63 dd 2b63260d od 2eecc539 alloc_hint [0 0 0])", @@ -1003,7 +1019,8 @@ EOF "omap_digest": "0xf5fba2c6", "size": 7, "errors": [], - "osd": 0 + "osd": 0, + "primary": false }, { "data_digest": "0x2d4a11c2", @@ -1013,7 +1030,8 @@ EOF "data_digest_mismatch_oi", "size_mismatch_oi" ], - "osd": 1 + "osd": 1, + "primary": true } ], "selected_object_info": "3:ce3f1d6a:::ROBJ1:head(47'54 osd.0.0:53 dirty|omap|data_digest|omap_digest s 7 uv 3 dd 2ddbf8f5 od f5fba2c6 alloc_hint [0 0 0])", @@ -1042,7 +1060,8 @@ EOF "errors": [ "omap_digest_mismatch_oi" ], - "osd": 0 + "osd": 0, + "primary": false }, { "data_digest": "0x2ddbf8f5", @@ -1051,7 +1070,8 @@ EOF "errors": [ "omap_digest_mismatch_oi" ], - "osd": 1 + "osd": 1, + "primary": true } ], "selected_object_info": "3:b1f19cbd:::ROBJ10:head(47'51 osd.0.0:50 dirty|omap|data_digest|omap_digest s 7 uv 30 dd 2ddbf8f5 od c2025a24 alloc_hint [0 0 0])", @@ -1074,14 +1094,16 @@ EOF "omap_digest": "0xa03cef03", "size": 7, "errors": [], - "osd": 0 + "osd": 0, + "primary": false }, { "size": 7, "errors": [ "read_error" ], - "osd": 1 + "osd": 1, + "primary": true } ], "selected_object_info": "3:87abbf36:::ROBJ11:head(47'48 osd.0.0:47 dirty|omap|data_digest|omap_digest s 7 uv 33 dd 2ddbf8f5 od a03cef03 alloc_hint [0 0 0])", @@ -1103,14 +1125,16 @@ EOF "errors": [ "stat_error" ], - "osd": 0 + "osd": 0, + "primary": false }, { "data_digest": "0x2ddbf8f5", "omap_digest": "0x067f306a", "size": 7, "errors": [], - "osd": 1 + "osd": 1, + "primary": true } ], "selected_object_info": "3:bc819597:::ROBJ12:head(47'52 osd.0.0:51 dirty|omap|data_digest|omap_digest s 7 uv 36 dd 2ddbf8f5 od 67f306a alloc_hint [0 0 0])", @@ -1132,14 +1156,16 @@ EOF "errors": [ "stat_error" ], - "osd": 0 + "osd": 0, + "primary": false }, { "size": 7, "errors": [ "read_error" ], - "osd": 1 + "osd": 1, + "primary": true } ], "union_shard_errors": [ @@ -1164,7 +1190,8 @@ EOF "errors": [ "oi_attr_corrupted" ], - "osd": 0 + "osd": 0, + "primary": false }, { "data_digest": "0x2ddbf8f5", @@ -1173,7 +1200,8 @@ EOF "errors": [ "oi_attr_missing" ], - "osd": 1 + "osd": 1, + "primary": true } ], "union_shard_errors": [ @@ -1208,7 +1236,8 @@ EOF "omap_digest": "0x2d2a4d6e", "size": 7, "errors": [], - "osd": 0 + "osd": 0, + "primary": false }, { "attrs": [ @@ -1224,7 +1253,8 @@ EOF "errors": [ "oi_attr_missing" ], - "osd": 1 + "osd": 1, + "primary": true } ], "selected_object_info": "3:30259878:::ROBJ15:head(47'46 osd.0.0:45 dirty|omap|data_digest|omap_digest s 7 uv 45 dd 2ddbf8f5 od 2d2a4d6e alloc_hint [0 0 0])", @@ -1251,14 +1281,16 @@ EOF "errors": [ "data_digest_mismatch_oi" ], - "osd": 0 + "osd": 0, + "primary": false }, { "data_digest": "0x2ddbf8f5", "omap_digest": "0xf8e11918", "size": 7, "errors": [], - "osd": 1 + "osd": 1, + "primary": true } ], "selected_object_info": "3:e97ce31e:::ROBJ2:head(47'56 osd.0.0:55 dirty|omap|data_digest|omap_digest s 7 uv 6 dd 2ddbf8f5 od f8e11918 alloc_hint [0 0 0])", @@ -1283,13 +1315,15 @@ EOF "omap_digest": "0x00b35dfd", "size": 7, "errors": [], - "osd": 0 + "osd": 0, + "primary": false }, { "errors": [ "missing" ], - "osd": 1 + "osd": 1, + "primary": true } ], "selected_object_info": "3:f2a5b2a4:::ROBJ3:head(47'57 osd.0.0:56 dirty|omap|data_digest|omap_digest s 7 uv 9 dd 2ddbf8f5 od b35dfd alloc_hint [0 0 0])", @@ -1314,14 +1348,16 @@ EOF "errors": [ "omap_digest_mismatch_oi" ], - "osd": 0 + "osd": 0, + "primary": false }, { "data_digest": "0x2ddbf8f5", "omap_digest": "0xe2d46ea4", "size": 7, "errors": [], - "osd": 1 + "osd": 1, + "primary": true } ], "selected_object_info": "3:f4981d31:::ROBJ4:head(47'58 osd.0.0:57 dirty|omap|data_digest|omap_digest s 7 uv 12 dd 2ddbf8f5 od e2d46ea4 alloc_hint [0 0 0])", @@ -1346,7 +1382,8 @@ EOF "omap_digest": "0x1a862a41", "size": 7, "errors": [], - "osd": 0 + "osd": 0, + "primary": false }, { "data_digest": "0x2ddbf8f5", @@ -1355,7 +1392,8 @@ EOF "errors": [ "omap_digest_mismatch_oi" ], - "osd": 1 + "osd": 1, + "primary": true } ], "selected_object_info": "3:f4bfd4d1:::ROBJ5:head(47'59 osd.0.0:58 dirty|omap|data_digest|omap_digest s 7 uv 15 dd 2ddbf8f5 od 1a862a41 alloc_hint [0 0 0])", @@ -1382,14 +1420,16 @@ EOF "errors": [ "omap_digest_mismatch_oi" ], - "osd": 0 + "osd": 0, + "primary": false }, { "data_digest": "0x2ddbf8f5", "omap_digest": "0x179c919f", "size": 7, "errors": [], - "osd": 1 + "osd": 1, + "primary": true } ], "selected_object_info": "3:a53c12e8:::ROBJ6:head(47'50 osd.0.0:49 dirty|omap|data_digest|omap_digest s 7 uv 18 dd 2ddbf8f5 od 179c919f alloc_hint [0 0 0])", @@ -1414,7 +1454,8 @@ EOF "omap_digest": "0xefced57a", "size": 7, "errors": [], - "osd": 0 + "osd": 0, + "primary": false }, { "data_digest": "0x2ddbf8f5", @@ -1423,7 +1464,8 @@ EOF "errors": [ "omap_digest_mismatch_oi" ], - "osd": 1 + "osd": 1, + "primary": true } ], "selected_object_info": "3:8b55fa4b:::ROBJ7:head(47'49 osd.0.0:48 dirty|omap|data_digest|omap_digest s 7 uv 21 dd 2ddbf8f5 od efced57a alloc_hint [0 0 0])", @@ -1470,7 +1512,8 @@ EOF "omap_digest": "0xd6be81dc", "size": 7, "errors": [], - "osd": 0 + "osd": 0, + "primary": false }, { "attrs": [ @@ -1499,7 +1542,8 @@ EOF "omap_digest": "0xd6be81dc", "size": 7, "errors": [], - "osd": 1 + "osd": 1, + "primary": true } ], "selected_object_info": "3:86586531:::ROBJ8:head(82'62 client.4351.0:1 dirty|omap|data_digest|omap_digest s 7 uv 62 dd 2ddbf8f5 od d6be81dc alloc_hint [0 0 0])", @@ -1536,7 +1580,8 @@ EOF "omap_digest": "0x2eecc539", "size": 3, "errors": [], - "osd": 0 + "osd": 0, + "primary": false }, { "attrs": [ @@ -1556,7 +1601,8 @@ EOF "omap_digest": "0x2eecc539", "size": 3, "errors": [], - "osd": 1 + "osd": 1, + "primary": true } ], "selected_object_info": "3:ffdb2004:::ROBJ9:head(122'64 client.4532.0:1 dirty|omap|data_digest|omap_digest s 3 uv 64 dd 1f26fb26 od 2eecc539 alloc_hint [0 0 0])", @@ -1690,7 +1736,8 @@ function corrupt_scrub_erasure() { "size": 2048, "errors": [], "shard": 2, - "osd": 0 + "osd": 0, + "primary": false }, { "size": 9, @@ -1698,13 +1745,15 @@ function corrupt_scrub_erasure() { "errors": [ "size_mismatch_oi" ], - "osd": 1 + "osd": 1, + "primary": true }, { "size": 2048, "shard": 1, "errors": [], - "osd": 2 + "osd": 2, + "primary": false } ], "selected_object_info": "3:9175b684:::EOBJ1:head(21'1 client.4179.0:1 dirty|data_digest|omap_digest s 7 uv 1 dd 2ddbf8f5 od ffffffff alloc_hint [0 0 0])", @@ -1728,20 +1777,23 @@ function corrupt_scrub_erasure() { "size": 2048, "errors": [], "shard": 2, - "osd": 0 + "osd": 0, + "primary": false }, { "shard": 0, "errors": [ "missing" ], - "osd": 1 + "osd": 1, + "primary": true }, { "size": 2048, "shard": 1, "errors": [], - "osd": 2 + "osd": 2, + "primary": false } ], "selected_object_info": "3:b197b25d:::EOBJ3:head(37'3 client.4251.0:1 dirty|data_digest|omap_digest s 7 uv 3 dd 2ddbf8f5 od ffffffff alloc_hint [0 0 0])", @@ -1790,10 +1842,12 @@ function corrupt_scrub_erasure() { "size": 2048, "errors": [], "shard": 2, - "osd": 0 + "osd": 0, + "primary": false }, { "osd": 1, + "primary": true, "shard": 0, "errors": [], "size": 2048, @@ -1827,6 +1881,7 @@ function corrupt_scrub_erasure() { }, { "osd": 2, + "primary": false, "shard": 1, "errors": [], "size": 2048, @@ -1879,7 +1934,8 @@ function corrupt_scrub_erasure() { "size": 2048, "errors": [], "shard": 2, - "osd": 0 + "osd": 0, + "primary": false }, { "size": 4096, @@ -1887,13 +1943,15 @@ function corrupt_scrub_erasure() { "errors": [ "size_mismatch_oi" ], - "osd": 1 + "osd": 1, + "primary": true }, { "size": 2048, "shard": 1, "errors": [], - "osd": 2 + "osd": 2, + "primary": false } ], "selected_object_info": "3:8549dfb5:::EOBJ5:head(65'7 client.4441.0:1 dirty|data_digest|omap_digest s 7 uv 7 dd 2ddbf8f5 od ffffffff alloc_hint [0 0 0])", @@ -1953,7 +2011,8 @@ EOF "size": 2048, "errors": [], "shard": 2, - "osd": 0 + "osd": 0, + "primary": false }, { "size": 9, @@ -1962,7 +2021,8 @@ EOF "read_error", "size_mismatch_oi" ], - "osd": 1 + "osd": 1, + "primary": true }, { "data_digest": "0x00000000", @@ -1970,7 +2030,8 @@ EOF "size": 2048, "shard": 1, "errors": [], - "osd": 2 + "osd": 2, + "primary": false } ], "selected_object_info": "3:9175b684:::EOBJ1:head(27'1 client.4155.0:1 dirty|data_digest|omap_digest s 7 uv 1 dd 2ddbf8f5 od ffffffff alloc_hint [0 0 0])", @@ -1997,14 +2058,16 @@ EOF "size": 2048, "errors": [], "shard": 2, - "osd": 0 + "osd": 0, + "primary": false }, { "shard": 0, "errors": [ "missing" ], - "osd": 1 + "osd": 1, + "primary": true }, { "data_digest": "0x00000000", @@ -2012,7 +2075,8 @@ EOF "size": 2048, "shard": 1, "errors": [], - "osd": 2 + "osd": 2, + "primary": false } ], "selected_object_info": "3:b197b25d:::EOBJ3:head(41'3 client.4199.0:1 dirty|data_digest|omap_digest s 7 uv 3 dd 2ddbf8f5 od ffffffff alloc_hint [0 0 0])", @@ -2063,7 +2127,8 @@ EOF "size": 2048, "errors": [], "shard": 2, - "osd": 0 + "osd": 0, + "primary": false }, { "attrs": [ @@ -2098,7 +2163,8 @@ EOF "size": 2048, "errors": [], "shard": 0, - "osd": 1 + "osd": 1, + "primary": true }, { "attrs": [ @@ -2133,7 +2199,8 @@ EOF "size": 2048, "errors": [], "shard": 1, - "osd": 2 + "osd": 2, + "primary": false } ], "selected_object_info": "3:5e723e06:::EOBJ4:head(48'6 client.4223.0:1 dirty|data_digest|omap_digest s 7 uv 6 dd 2ddbf8f5 od ffffffff alloc_hint [0 0 0])", @@ -2158,7 +2225,8 @@ EOF "size": 2048, "errors": [], "shard": 2, - "osd": 0 + "osd": 0, + "primary": false }, { "data_digest": "0x00000000", @@ -2168,7 +2236,8 @@ EOF "size_mismatch_oi" ], "shard": 0, - "osd": 1 + "osd": 1, + "primary": true }, { "data_digest": "0x00000000", @@ -2176,7 +2245,8 @@ EOF "size": 2048, "errors": [], "shard": 1, - "osd": 2 + "osd": 2, + "primary": false } ], "selected_object_info": "3:8549dfb5:::EOBJ5:head(65'7 client.4288.0:1 dirty|data_digest|omap_digest s 7 uv 7 dd 2ddbf8f5 od ffffffff alloc_hint [0 0 0])", @@ -2212,7 +2282,8 @@ EOF "size": 2048, "errors": [], "shard": 2, - "osd": 0 + "osd": 0, + "primary": false }, { "size": 9, @@ -2221,7 +2292,8 @@ EOF "read_error", "size_mismatch_oi" ], - "osd": 1 + "osd": 1, + "primary": true }, { "data_digest": "0x04cfa72f", @@ -2229,7 +2301,8 @@ EOF "size": 2048, "shard": 1, "errors": [], - "osd": 2 + "osd": 2, + "primary": false } ], "selected_object_info": "3:9175b684:::EOBJ1:head(21'1 client.4179.0:1 dirty|data_digest|omap_digest s 7 uv 1 dd 2ddbf8f5 od ffffffff alloc_hint [0 0 0])", @@ -2256,7 +2329,8 @@ EOF "ec_hash_error" ], "shard": 2, - "osd": 0 + "osd": 0, + "primary": false }, { "data_digest": "0x04cfa72f", @@ -2264,7 +2338,8 @@ EOF "size": 2048, "errors": [], "shard": 0, - "osd": 1 + "osd": 1, + "primary": true }, { "data_digest": "0x04cfa72f", @@ -2272,7 +2347,8 @@ EOF "size": 2048, "errors": [], "shard": 1, - "osd": 2 + "osd": 2, + "primary": false } ], "selected_object_info": "3:9babd184:::EOBJ2:head(29'2 client.4217.0:1 dirty|data_digest|omap_digest s 7 uv 2 dd 2ddbf8f5 od ffffffff alloc_hint [0 0 0])", @@ -2296,10 +2372,12 @@ EOF "size": 2048, "errors": [], "shard": 2, - "osd": 0 + "osd": 0, + "primary": false }, { "osd": 1, + "primary": true, "shard": 0, "errors": [ "missing" @@ -2311,7 +2389,8 @@ EOF "size": 2048, "shard": 1, "errors": [], - "osd": 2 + "osd": 2, + "primary": false } ], "selected_object_info": "3:b197b25d:::EOBJ3:head(37'3 client.4251.0:1 dirty|data_digest|omap_digest s 7 uv 3 dd 2ddbf8f5 od ffffffff alloc_hint [0 0 0])", @@ -2362,10 +2441,12 @@ EOF "size": 2048, "errors": [], "shard": 2, - "osd": 0 + "osd": 0, + "primary": false }, { "osd": 1, + "primary": true, "shard": 0, "errors": [], "size": 2048, @@ -2401,6 +2482,7 @@ EOF }, { "osd": 2, + "primary": false, "shard": 1, "errors": [], "size": 2048, @@ -2457,7 +2539,8 @@ EOF "size": 2048, "errors": [], "shard": 2, - "osd": 0 + "osd": 0, + "primary": false }, { "size": 4096, @@ -2466,7 +2549,8 @@ EOF "size_mismatch_oi", "ec_size_error" ], - "osd": 1 + "osd": 1, + "primary": true }, { "data_digest": "0x04cfa72f", @@ -2474,7 +2558,8 @@ EOF "size": 2048, "shard": 1, "errors": [], - "osd": 2 + "osd": 2, + "primary": false } ], "selected_object_info": "3:8549dfb5:::EOBJ5:head(65'7 client.4441.0:1 dirty|data_digest|omap_digest s 7 uv 7 dd 2ddbf8f5 od ffffffff alloc_hint [0 0 0])", diff --git a/src/common/scrub_types.cc b/src/common/scrub_types.cc index f53d8ea3f93d..abc575d7a0db 100644 --- a/src/common/scrub_types.cc +++ b/src/common/scrub_types.cc @@ -70,8 +70,9 @@ void shard_info_wrapper::set_object(const ScrubMap::object& object) void shard_info_wrapper::encode(bufferlist& bl) const { - ENCODE_START(2, 1, bl); + ENCODE_START(3, 3, bl); ::encode(errors, bl); + ::encode(primary, bl); if (has_shard_missing()) { return; } @@ -87,8 +88,9 @@ void shard_info_wrapper::encode(bufferlist& bl) const void shard_info_wrapper::decode(bufferlist::iterator& bp) { - DECODE_START(2, bp); + DECODE_START(3, bp); ::decode(errors, bp); + ::decode(primary, bp); if (has_shard_missing()) { return; } @@ -98,8 +100,7 @@ void shard_info_wrapper::decode(bufferlist::iterator& bp) ::decode(omap_digest, bp); ::decode(data_digest_present, bp); ::decode(data_digest, bp); - if (struct_v > 1) - ::decode(selected_oi, bp); + ::decode(selected_oi, bp); DECODE_FINISH(bp); } @@ -120,10 +121,12 @@ void inconsistent_obj_wrapper::set_auth_missing(const hobject_t& hoid, const map& maps, map &shard_map, - int &shallow_errors, int &deep_errors) + int &shallow_errors, int &deep_errors, + const pg_shard_t &primary) { for (auto pg_map : maps) { auto oid_object = pg_map.second->objects.find(hoid); + shard_map[pg_map.first].primary = (pg_map.first == primary); if (oid_object == pg_map.second->objects.end()) shard_map[pg_map.first].set_missing(); else diff --git a/src/common/scrub_types.h b/src/common/scrub_types.h index 39a265671c24..21e557b98aa4 100644 --- a/src/common/scrub_types.h +++ b/src/common/scrub_types.h @@ -116,7 +116,8 @@ struct inconsistent_obj_wrapper : librados::inconsistent_obj_t { void set_auth_missing(const hobject_t& hoid, const map&, map&, - int &shallow_errors, int &deep_errors); + int &shallow_errors, int &deep_errors, + const pg_shard_t &primary); void set_version(uint64_t ver) { version = ver; } void encode(bufferlist& bl) const; void decode(bufferlist::iterator& bp); diff --git a/src/include/rados/rados_types.hpp b/src/include/rados/rados_types.hpp index 9b79f8780ee6..1d5aca85beac 100644 --- a/src/include/rados/rados_types.hpp +++ b/src/include/rados/rados_types.hpp @@ -121,6 +121,7 @@ struct shard_info_t : err_t { bool data_digest_present = false; uint32_t data_digest = 0; bool selected_oi = false; + bool primary = false; }; struct osd_shard_t { diff --git a/src/osd/PGBackend.cc b/src/osd/PGBackend.cc index 157b2422ab39..d73bcd30c1a2 100644 --- a/src/osd/PGBackend.cc +++ b/src/osd/PGBackend.cc @@ -782,6 +782,8 @@ map::const_iterator } string error_string; auto& shard_info = shard_map[j->first]; + if (j->first == get_parent()->whoami_shard()) + shard_info.primary = true; if (i->second.read_error) { shard_info.set_read_error(); error_string += " read_error"; @@ -929,7 +931,8 @@ void PGBackend::be_compare_scrubmaps( set object_errors; if (auth == maps.end()) { object_error.set_version(0); - object_error.set_auth_missing(*k, maps, shard_map, shallow_errors, deep_errors); + object_error.set_auth_missing(*k, maps, shard_map, shallow_errors, + deep_errors, get_parent()->whoami_shard()); if (object_error.has_deep_errors()) ++deep_errors; else if (object_error.has_shallow_errors()) @@ -982,6 +985,7 @@ void PGBackend::be_compare_scrubmaps( } else { cur_missing.insert(j->first); shard_map[j->first].set_missing(); + shard_map[j->first].primary = (j->first == get_parent()->whoami_shard()); // Can't have any other errors if there is no information available ++shallow_errors; errorstream << pgid << " shard " << j->first << " missing " << *k diff --git a/src/tools/rados/rados.cc b/src/tools/rados/rados.cc index 9d00403033ed..5e8684deccd1 100644 --- a/src/tools/rados/rados.cc +++ b/src/tools/rados/rados.cc @@ -1448,6 +1448,7 @@ static void dump_inconsistent(const inconsistent_obj_t& inc, f.open_object_section("shard"); auto& osd_shard = shard_info.first; f.dump_int("osd", osd_shard.osd); + f.dump_bool("primary", shard_info.second.primary); auto shard = osd_shard.shard; if (shard != shard_id_t::NO_SHARD) f.dump_unsigned("shard", shard);