CAS-1377 create/register OSD before mounting so we can use a mountpoint that contains the OSD's true cluster ID

This commit is contained in:
Jared Watts committed 2016-09-02 16:01:11 -07:00
1 parent 2a6d7ad63d
commit 6129a77942
2 files changed
+39 -30

No files matched your search

+26 -24
View File
@@ -233,6 +233,22 @@ func mountOSD(device string, mountPath string, executor util.Executor) error {
return nil
}
func registerOSDWithCluster(device string, bootstrapConn *cephd.Conn) (int, uuid.UUID, error) {
osdUUID, err := uuid.NewRandom()
if err != nil {
return 0, uuid.UUID{}, fmt.Errorf("failed to generate UUID for %s: %+v", device, err)
}
// create the OSD instance via a mon_command, this assigns a cluster wide ID to the OSD
osdID, err := createOSD(bootstrapConn, osdUUID)
if err != nil {
return 0, uuid.UUID{}, err
}
log.Printf("successfully created OSD %s with ID %d for %s", osdUUID.String(), osdID, device)
return osdID, osdUUID, nil
}
// looks for an existing OSD data path under the given root
func findOSDDataPath(osdRoot, clusterName string) (string, error) {
var osdDataPath string
@@ -281,63 +297,49 @@ func getOSDInfo(osdDataPath string) (int, uuid.UUID, error) {
return osdID, osdUUID, nil
}
func initializeOSD(osdDataDir string, bootstrapConn *cephd.Conn, cluster *clusterInfo) (string, int, uuid.UUID, error) {
log.Printf("initializing the osd directory %s", osdDataDir)
osdUUID, err := uuid.NewRandom()
if err != nil {
return "", 0, uuid.UUID{}, fmt.Errorf("failed to generate UUID for %s: %+v", osdDataDir, err)
}
// create the OSD instance via a mon_command, this assigns a cluster wide ID to the OSD
osdID, err := createOSD(bootstrapConn, osdUUID)
if err != nil {
return "", 0, uuid.UUID{}, err
}
log.Printf("successfully created OSD %s with ID %d at %s", osdUUID.String(), osdID, osdDataDir)
func initializeOSD(osdDataDir string, osdID int, osdUUID uuid.UUID, bootstrapConn *cephd.Conn, cluster *clusterInfo) (string, error) {
// ensure that the OSD data directory is created
osdDataPath := filepath.Join(osdDataDir, fmt.Sprintf("%s-%d", cluster.Name, osdID))
if err := os.MkdirAll(osdDataPath, 0777); err != nil {
return "", 0, uuid.UUID{}, fmt.Errorf("failed to create OSD data dir at %s, %+v", osdDataPath, err)
return "", fmt.Errorf("failed to create OSD data dir at %s, %+v", osdDataPath, err)
}
// write the OSD config file to disk
keyringPath := getOSDKeyringPath(osdDataPath)
_, err = generateConfigFile(cluster, osdDataPath, fmt.Sprintf("osd.%d", osdID), keyringPath)
_, err := generateConfigFile(cluster, osdDataPath, fmt.Sprintf("osd.%d", osdID), keyringPath)
if err != nil {
return "", 0, uuid.UUID{}, fmt.Errorf("failed to write OSD %d config file: %+v", osdID, err)
return "", fmt.Errorf("failed to write OSD %d config file: %+v", osdID, err)
}
// get the current monmap, it will be needed for creating the OSD file system
monMapRaw, err := getMonMap(bootstrapConn)
if err != nil {
return "", 0, uuid.UUID{}, fmt.Errorf("failed to get mon map: %+v", err)
return "", fmt.Errorf("failed to get mon map: %+v", err)
}
// create/initalize the OSD file system and journal
if err := createOSDFileSystem(cluster.Name, osdID, osdUUID, osdDataPath, monMapRaw); err != nil {
return "", 0, uuid.UUID{}, err
return "", err
}
// add auth privileges for the OSD, the bootstrap-osd privileges were very limited
if err := addOSDAuth(bootstrapConn, osdID, osdDataPath); err != nil {
return "", 0, uuid.UUID{}, err
return "", err
}
// open a connection to the cluster using the OSDs creds
osdConn, err := connectToCluster(cluster, osdDataDir, fmt.Sprintf("osd.%d", osdID), keyringPath)
if err != nil {
return "", 0, uuid.UUID{}, err
return "", err
}
defer osdConn.Shutdown()
// add the new OSD to the cluster crush map
if err := addOSDToCrushMap(osdConn, osdID, osdDataDir); err != nil {
return "", 0, uuid.UUID{}, err
return "", err
}
return osdDataPath, osdID, osdUUID, nil
return osdDataPath, nil
}
// creates the OSD identity in the cluster via a mon_command
+13 -6
View File
@@ -80,7 +80,10 @@ func (a *osdAgent) createOSDs(adminConn *cephd.Conn, context *orchestrator.Clust
defer bootstrapConn.Shutdown()
// initialize all the desired OSD volumes
for i, device := range a.devices {
for _, device := range a.devices {
var osdID int
var osdUUID uuid.UUID
mountPoint, err := getDeviceMountPoint(device, context.Executor)
if err != nil {
return fmt.Errorf("unable to get mount point for device %s: %+v", device, err)
@@ -93,7 +96,14 @@ func (a *osdAgent) createOSDs(adminConn *cephd.Conn, context *orchestrator.Clust
return err
}
mountPoint = fmt.Sprintf("/tmp/osd%d", i)
// register the OSD with the cluster now to get an official ID
osdID, osdUUID, err = registerOSDWithCluster(device, bootstrapConn)
if err != nil {
}
// mount the device using a mount point that reflects the OSD's ID
mountPoint = fmt.Sprintf("/tmp/osd%d", osdID)
if err := mountOSD(device, mountPoint, context.Executor); err != nil {
return err
}
@@ -107,12 +117,9 @@ func (a *osdAgent) createOSDs(adminConn *cephd.Conn, context *orchestrator.Clust
return err
}
var osdID int
var osdUUID uuid.UUID
if _, err := os.Stat(filepath.Join(osdDataPath, "whoami")); os.IsNotExist(err) {
// osd_data_dir/whoami does not exist yet, create/initialize the OSD
osdDataPath, osdID, osdUUID, err = initializeOSD(osdDataDir, bootstrapConn, a.cluster)
osdDataPath, err = initializeOSD(osdDataDir, osdID, osdUUID, bootstrapConn, a.cluster)
if err != nil {
return fmt.Errorf("failed to initialize OSD at %s: %+v", osdDataDir, err)
}