From dc26012a3bbd00b072bf606383e855d93bd78bf9 Mon Sep 17 00:00:00 2001
From: Konstantin Lebedev <lebedev_k@tochka.com>
Date: Wed, 11 Nov 2020 15:03:47 +0500
Subject: [PATCH] initial

---
 weed/pb/master_pb/master.pb.go    |  3 ++-
 weed/server/master_grpc_server.go | 10 ++++++----
 weed/topology/topology_map.go     |  5 +++--
 weed/wdclient/masterclient.go     |  5 +++--
 weed/wdclient/vid_map.go          |  5 +++--
 5 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/weed/pb/master_pb/master.pb.go b/weed/pb/master_pb/master.pb.go
index d23366ade..e96af6abe 100644
--- a/weed/pb/master_pb/master.pb.go
+++ b/weed/pb/master_pb/master.pb.go
@@ -783,7 +783,8 @@ type VolumeLocation struct {
 	PublicUrl   string   `protobuf:"bytes,2,opt,name=public_url,json=publicUrl,proto3" json:"public_url,omitempty"`
 	NewVids     []uint32 `protobuf:"varint,3,rep,packed,name=new_vids,json=newVids,proto3" json:"new_vids,omitempty"`
 	DeletedVids []uint32 `protobuf:"varint,4,rep,packed,name=deleted_vids,json=deletedVids,proto3" json:"deleted_vids,omitempty"`
-	Leader      string   `protobuf:"bytes,5,opt,name=leader,proto3" json:"leader,omitempty"` // optional when leader is not itself
+	Leader      string   `protobuf:"bytes,5,opt,name=leader,proto3" json:"leader,omitempty"`          // optional when leader is not itself
+	DataCenter  string   `protobuf:"bytes,6,opt,name=data_center,proto3" json:"dataCenter,omitempty"` // optional when DataCenter is in use
 }
 
 func (x *VolumeLocation) Reset() {
diff --git a/weed/server/master_grpc_server.go b/weed/server/master_grpc_server.go
index e8fa3995d..0a69a70e1 100644
--- a/weed/server/master_grpc_server.go
+++ b/weed/server/master_grpc_server.go
@@ -29,8 +29,9 @@ func (ms *MasterServer) SendHeartbeat(stream master_pb.Seaweed_SendHeartbeatServ
 			glog.V(0).Infof("unregister disconnected volume server %s:%d", dn.Ip, dn.Port)
 
 			message := &master_pb.VolumeLocation{
-				Url:       dn.Url(),
-				PublicUrl: dn.PublicUrl,
+				Url:        dn.Url(),
+				PublicUrl:  dn.PublicUrl,
+				DataCenter: dn.GetDataCenter().String(),
 			}
 			for _, v := range dn.GetVolumes() {
 				message.DeletedVids = append(message.DeletedVids, uint32(v.Id))
@@ -86,8 +87,9 @@ func (ms *MasterServer) SendHeartbeat(stream master_pb.Seaweed_SendHeartbeatServ
 
 		glog.V(4).Infof("master received heartbeat %s", heartbeat.String())
 		message := &master_pb.VolumeLocation{
-			Url:       dn.Url(),
-			PublicUrl: dn.PublicUrl,
+			Url:        dn.Url(),
+			PublicUrl:  dn.PublicUrl,
+			DataCenter: dn.GetDataCenter().String(),
 		}
 		if len(heartbeat.NewVolumes) > 0 || len(heartbeat.DeletedVolumes) > 0 {
 			// process delta volume ids if exists for fast volume id updates
diff --git a/weed/topology/topology_map.go b/weed/topology/topology_map.go
index 73c55d77d..f25858848 100644
--- a/weed/topology/topology_map.go
+++ b/weed/topology/topology_map.go
@@ -62,8 +62,9 @@ func (t *Topology) ToVolumeLocations() (volumeLocations []*master_pb.VolumeLocat
 			for _, d := range rack.Children() {
 				dn := d.(*DataNode)
 				volumeLocation := &master_pb.VolumeLocation{
-					Url:       dn.Url(),
-					PublicUrl: dn.PublicUrl,
+					Url:        dn.Url(),
+					PublicUrl:  dn.PublicUrl,
+					DataCenter: dn.GetDataCenter().String(),
 				}
 				for _, v := range dn.GetVolumes() {
 					volumeLocation.NewVids = append(volumeLocation.NewVids, uint32(v.Id))
diff --git a/weed/wdclient/masterclient.go b/weed/wdclient/masterclient.go
index df8c186f2..e91e6f28e 100644
--- a/weed/wdclient/masterclient.go
+++ b/weed/wdclient/masterclient.go
@@ -130,8 +130,9 @@ func (mc *MasterClient) tryConnectToMaster(master string) (nextHintedLeader stri
 
 			// process new volume location
 			loc := Location{
-				Url:       volumeLocation.Url,
-				PublicUrl: volumeLocation.PublicUrl,
+				Url:        volumeLocation.Url,
+				PublicUrl:  volumeLocation.PublicUrl,
+				DataCenter: volumeLocation.DataCenter,
 			}
 			for _, newVid := range volumeLocation.NewVids {
 				glog.V(1).Infof("%s: %s masterClient adds volume %d", mc.clientType, loc.Url, newVid)
diff --git a/weed/wdclient/vid_map.go b/weed/wdclient/vid_map.go
index cee2da6e1..b72ac3f55 100644
--- a/weed/wdclient/vid_map.go
+++ b/weed/wdclient/vid_map.go
@@ -16,8 +16,9 @@ const (
 )
 
 type Location struct {
-	Url       string `json:"url,omitempty"`
-	PublicUrl string `json:"publicUrl,omitempty"`
+	Url        string `json:"url,omitempty"`
+	PublicUrl  string `json:"publicUrl,omitempty"`
+	DataCenter string `json:"dataCenter,omitempty"`
 }
 
 type vidMap struct {