@@ -3,6 +3,7 @@ package server
33import  (
44	"context" 
55	"fmt" 
6+ 	"path" 
67	"sync" 
78	"time" 
89
@@ -29,13 +30,15 @@ type MessagesServer struct {
2930	oplogBackupRunning     bool 
3031	err                    error 
3132	// 
33+ 	workDir                string 
34+ 	lastBackupMetadata     * BackupMetadata 
3235	clientDisconnetedChan  chan  string 
3336	dbBackupFinishChan     chan  interface {}
3437	oplogBackupFinishChan  chan  interface {}
3538	logger                 * logrus.Logger 
3639}
3740
38- func  NewMessagesServer (logger  * logrus.Logger ) * MessagesServer  {
41+ func  NewMessagesServer (workDir   string ,  logger  * logrus.Logger ) * MessagesServer  {
3942	if  logger  ==  nil  {
4043		logger  =  logrus .New ()
4144		logger .SetLevel (logrus .StandardLogger ().Level )
@@ -53,6 +56,7 @@ func NewMessagesServer(logger *logrus.Logger) *MessagesServer {
5356		dbBackupFinishChan :    bfc ,
5457		oplogBackupFinishChan : ofc ,
5558		replicasRunningBackup : make (map [string ]bool ),
59+ 		workDir :               workDir ,
5660		logger :                logger ,
5761	}
5862
@@ -186,6 +190,17 @@ func (s *MessagesServer) StartBackup(opts *pb.StartBackup) error {
186190	if  s .isBackupRunning () {
187191		return  fmt .Errorf ("Backup is already running" )
188192	}
193+ 
194+ 	s .lastBackupMetadata  =  NewBackupMetadata ()
195+ 
196+ 	s .lastBackupMetadata .StartTs  =  time .Now ()
197+ 	s .lastBackupMetadata .Replicasets  =  make (map [string ]ReplicasetMetadata )
198+ 	s .lastBackupMetadata .BackupType  =  opts .GetBackupType ()
199+ 	s .lastBackupMetadata .DestinationType  =  opts .GetDestinationType ()
200+ 	s .lastBackupMetadata .DestinationDir  =  opts .GetDestinationDir ()
201+ 	s .lastBackupMetadata .CompressionType  =  opts .GetCompressionType ()
202+ 	s .lastBackupMetadata .Cypher  =  opts .GetCypher ()
203+ 
189204	clients , err  :=  s .BackupSourceByReplicaset ()
190205	if  err  !=  nil  {
191206		return  errors .Wrapf (err , "Cannot start backup. Cannot find backup source for replicas" )
@@ -198,7 +213,10 @@ func (s *MessagesServer) StartBackup(opts *pb.StartBackup) error {
198213	for  replName , client  :=  range  clients  {
199214		s .logger .Printf ("Starting backup for replicaset %q on client %s %s %s" , replName , client .ID , client .NodeName , client .NodeType )
200215		s .replicasRunningBackup [replName ] =  true 
201- 		destinationName  :=  fmt .Sprintf ("%s_%s_%s" , time .Now ().Format ("2006-01-02_15.04.05" ), client .ReplicasetName , opts .GetDestinationName ())
216+ 		destinationName  :=  fmt .Sprintf ("%s_%s_%s" , s .lastBackupMetadata .StartTs .Format ("2006-01-02_15.04.05" ), client .ReplicasetName , opts .GetDestinationName ())
217+ 
218+ 		s .lastBackupMetadata .AddReplicaset (client .ReplicasetName , client .ReplicasetUUID , destinationName )
219+ 
202220		client .startBackup (& pb.StartBackup {
203221			BackupType :      opts .GetBackupType (),
204222			DestinationType : opts .GetDestinationType (),
@@ -210,9 +228,28 @@ func (s *MessagesServer) StartBackup(opts *pb.StartBackup) error {
210228		})
211229	}
212230
231+ 	metadataFilename  :=  path .Join (s .workDir , fmt .Sprintf ("%s.json" , s .lastBackupMetadata .StartTs .Format ("2006-01-02_15.04.05" )))
232+ 	err  =  s .lastBackupMetadata .WriteMetadataToFile (metadataFilename )
233+ 	if  err  !=  nil  {
234+ 		log .Warn ("Cannot write metadata file %s: %s" , metadataFilename , err )
235+ 	}
213236	return  nil 
214237}
215238
239+ // StartBalancer restarts the balancer if this is a sharded system 
240+ func  (s  * MessagesServer ) StartBalancer () error  {
241+ 	s .lock .Lock ()
242+ 	defer  s .lock .Unlock ()
243+ 	for  _ , client  :=  range  s .clients  {
244+ 		if  client .NodeType  ==  pb .NodeType_MONGOS  {
245+ 			return  client .startBalancer ()
246+ 		}
247+ 	}
248+ 	// This is not a sharded system. There is nothing to do. 
249+ 	return  nil 
250+ }
251+ 
252+ // StopBalancer stops the balancer if this is a sharded system 
216253func  (s  * MessagesServer ) StopBalancer () error  {
217254	s .lock .Lock ()
218255	defer  s .lock .Unlock ()
@@ -221,7 +258,8 @@ func (s *MessagesServer) StopBalancer() error {
221258			return  client .stopBalancer ()
222259		}
223260	}
224- 	return  fmt .Errorf ("No MongoS server found to stop the balancer" )
261+ 	// This is not a sharded system. There is nothing to do. 
262+ 	return  nil 
225263}
226264
227265func  (s  * MessagesServer ) cancelBackup () error  {
0 commit comments