@@ -1712,7 +1712,7 @@ ACTOR static Future<Void> startMoveShards(Database occ,
1712
1712
serverListEntries.push_back (tr.get (serverListKeyFor (servers[s])));
1713
1713
}
1714
1714
std::vector<Optional<Value>> serverListValues = wait (getAll (serverListEntries));
1715
-
1715
+ state std::unordered_map<std::string, std::vector<std::string>> dcServers;
1716
1716
for (int s = 0 ; s < serverListValues.size (); s++) {
1717
1717
if (!serverListValues[s].present ()) {
1718
1718
// Attempt to move onto a server that isn't in serverList (removed or never added to the
@@ -1721,6 +1721,13 @@ ACTOR static Future<Void> startMoveShards(Database occ,
1721
1721
// TODO(psm): Mark the data move as 'deleting'.
1722
1722
throw move_to_removed_server ();
1723
1723
}
1724
+ auto si = decodeServerListValue (serverListValues[s].get ());
1725
+ ASSERT (si.id () == servers[s]);
1726
+ auto it = dcServers.find (si.locality .describeDcId ());
1727
+ if (it == dcServers.end ()) {
1728
+ dcServers[si.locality .describeDcId ()] = std::vector<std::string>();
1729
+ }
1730
+ dcServers[si.locality .describeDcId ()].push_back (si.id ().shortString ());
1724
1731
}
1725
1732
1726
1733
currentKeys = KeyRangeRef (begin, keys.end );
@@ -1733,6 +1740,15 @@ ACTOR static Future<Void> startMoveShards(Database occ,
1733
1740
state Key endKey = old.back ().key ;
1734
1741
currentKeys = KeyRangeRef (currentKeys.begin , endKey);
1735
1742
1743
+ if (ranges.front () != currentKeys) {
1744
+ TraceEvent (" MoveShardsPartialRange" )
1745
+ .detail (" ExpectedRange" , ranges.front ())
1746
+ .detail (" ActualRange" , currentKeys)
1747
+ .detail (" DataMoveId" , dataMoveId)
1748
+ .detail (" RowLimit" , SERVER_KNOBS->MOVE_SHARD_KRM_ROW_LIMIT )
1749
+ .detail (" ByteLimit" , SERVER_KNOBS->MOVE_SHARD_KRM_BYTE_LIMIT );
1750
+ }
1751
+
1736
1752
// Check that enough servers for each shard are in the correct state
1737
1753
state RangeResult UIDtoTagMap = wait (tr.getRange (serverTagKeys, CLIENT_KNOBS->TOO_MANY ));
1738
1754
ASSERT (!UIDtoTagMap.more && UIDtoTagMap.size () < CLIENT_KNOBS->TOO_MANY );
@@ -1806,6 +1822,7 @@ ACTOR static Future<Void> startMoveShards(Database occ,
1806
1822
TraceEvent (
1807
1823
SevWarn, " StartMoveShardsCancelConflictingDataMove" , relocationIntervalId)
1808
1824
.detail (" Range" , rangeIntersectKeys)
1825
+ .detail (" CurrentDataMoveRange" , ranges[0 ])
1809
1826
.detail (" DataMoveID" , dataMoveId.toString ())
1810
1827
.detail (" ExistingDataMoveID" , destId.toString ());
1811
1828
wait (cleanUpDataMove (occ, destId, lock, startMoveKeysLock, keys, ddEnabledState));
@@ -1868,6 +1885,16 @@ ACTOR static Future<Void> startMoveShards(Database occ,
1868
1885
dataMove.ranges .clear ();
1869
1886
dataMove.ranges .push_back (KeyRangeRef (keys.begin , currentKeys.end ));
1870
1887
dataMove.dest .insert (servers.begin (), servers.end ());
1888
+ dataMove.dcTeamIds = std::unordered_map<std::string, std::string>();
1889
+ for (auto & [dc, serverIds] : dcServers) {
1890
+ std::sort (serverIds.begin (), serverIds.end ());
1891
+ std::string teamId;
1892
+ for (const auto & serverId : serverIds) {
1893
+ teamId += serverId;
1894
+ }
1895
+ // Use the concatenated server ids as the team id to avoid conflicts.
1896
+ dataMove.dcTeamIds .get ()[dc] = teamId;
1897
+ }
1871
1898
}
1872
1899
1873
1900
if (currentKeys.end == keys.end ) {
0 commit comments