Address some race conditions
This commit is contained in:
		
							parent
							
								
									21e58b57a1
								
							
						
					
					
						commit
						e28c05ae56
					
				| 
						 | 
					@ -77,6 +77,13 @@ func (s *Server) Config() *Configuration {
 | 
				
			||||||
	return &s.cfg
 | 
						return &s.cfg
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *Configuration) GetUuid() string {
 | 
				
			||||||
 | 
						c.mu.RLock()
 | 
				
			||||||
 | 
						defer c.mu.RUnlock()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return c.Uuid
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (c *Configuration) SetSuspended(s bool) {
 | 
					func (c *Configuration) SetSuspended(s bool) {
 | 
				
			||||||
	c.mu.Lock()
 | 
						c.mu.Lock()
 | 
				
			||||||
	c.Suspended = s
 | 
						c.Suspended = s
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -54,6 +54,15 @@ func (s *Server) Proc() *ResourceUsage {
 | 
				
			||||||
	return &s.resources
 | 
						return &s.resources
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Returns the servers current state.
 | 
				
			||||||
 | 
					func (ru *ResourceUsage) getInternalState() string {
 | 
				
			||||||
 | 
						ru.mu.RLock()
 | 
				
			||||||
 | 
						defer ru.mu.RUnlock()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ru.State
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Sets the new state for the server.
 | 
				
			||||||
func (ru *ResourceUsage) setInternalState(state string) {
 | 
					func (ru *ResourceUsage) setInternalState(state string) {
 | 
				
			||||||
	ru.mu.Lock()
 | 
						ru.mu.Lock()
 | 
				
			||||||
	ru.State = state
 | 
						ru.State = state
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -68,7 +68,7 @@ type InstallerDetails struct {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Returns the UUID for the server instance.
 | 
					// Returns the UUID for the server instance.
 | 
				
			||||||
func (s *Server) Id() string {
 | 
					func (s *Server) Id() string {
 | 
				
			||||||
	return s.Config().Uuid
 | 
						return s.Config().GetUuid()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Returns all of the environment variables that should be assigned to a running
 | 
					// Returns all of the environment variables that should be assigned to a running
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -126,7 +126,7 @@ func (s *Server) SetState(state string) error {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Returns the current state of the server in a race-safe manner.
 | 
					// Returns the current state of the server in a race-safe manner.
 | 
				
			||||||
func (s *Server) GetState() string {
 | 
					func (s *Server) GetState() string {
 | 
				
			||||||
	return s.Proc().State
 | 
						return s.Proc().getInternalState()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Determines if the server state is running or not. This is different than the
 | 
					// Determines if the server state is running or not. This is different than the
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,7 +28,14 @@ func (s *Server) UpdateDataStructure(data []byte, background bool) error {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Grab a copy of the configuration to work on.
 | 
						// Grab a copy of the configuration to work on.
 | 
				
			||||||
	c := s.Config()
 | 
						c := *s.Config()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Lock our copy of the configuration since the defered unlock will end up acting upon this
 | 
				
			||||||
 | 
						// new memory address rather than the old one. If we don't lock this, the defered unlock will
 | 
				
			||||||
 | 
						// cause a panic when it goes to run. However, since we only update s.cfg at the end, if there
 | 
				
			||||||
 | 
						// is an error before that point we'll still properly unlock the original configuration for the
 | 
				
			||||||
 | 
						// server.
 | 
				
			||||||
 | 
						c.mu.Lock()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Lock the server configuration while we're doing this merge to avoid anything
 | 
						// Lock the server configuration while we're doing this merge to avoid anything
 | 
				
			||||||
	// trying to overwrite it or make modifications while we're sorting out what we
 | 
						// trying to overwrite it or make modifications while we're sorting out what we
 | 
				
			||||||
| 
						 | 
					@ -38,7 +45,7 @@ func (s *Server) UpdateDataStructure(data []byte, background bool) error {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Merge the new data object that we have received with the existing server data object
 | 
						// Merge the new data object that we have received with the existing server data object
 | 
				
			||||||
	// and then save it to the disk so it is persistent.
 | 
						// and then save it to the disk so it is persistent.
 | 
				
			||||||
	if err := mergo.Merge(c, src, mergo.WithOverride); err != nil {
 | 
						if err := mergo.Merge(&c, src, mergo.WithOverride); err != nil {
 | 
				
			||||||
		return errors.WithStack(err)
 | 
							return errors.WithStack(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -87,7 +94,7 @@ func (s *Server) UpdateDataStructure(data []byte, background bool) error {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Update the configuration once we have a lock on the configuration object.
 | 
						// Update the configuration once we have a lock on the configuration object.
 | 
				
			||||||
	s.cfg = *c
 | 
						s.cfg = c
 | 
				
			||||||
	s.Uuid = c.Uuid
 | 
						s.Uuid = c.Uuid
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if background {
 | 
						if background {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user