diff options
| author | Selvam <selvam@gluster.com> | 2011-04-29 15:04:18 +0530 |
|---|---|---|
| committer | Selvam <selvam@gluster.com> | 2011-04-29 15:04:18 +0530 |
| commit | 3149b18d24539f5680848c25064f447c15bbbcc4 (patch) | |
| tree | 4f6b3ef9fcb7a8951511324697752528191fc49e /src/com.gluster.storage.management.server | |
| parent | e4b86192d443e968cf2ad417a46c203ab2751418 (diff) | |
| parent | 276118b6d207bb49905d1e9c19a7f08c33f9ed8d (diff) | |
Merge remote branch 'upstream/master'
Conflicts:
src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java
src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java
src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java
Diffstat (limited to 'src/com.gluster.storage.management.server')
3 files changed, 87 insertions, 44 deletions
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java index 73d2eee4..d3bdec8b 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java @@ -74,7 +74,7 @@ import com.sun.jersey.spi.resource.Singleton; public class VolumesResource { private static final String PREPARE_BRICK_SCRIPT = "create_volume_directory.py"; private static final String VOLUME_DIRECTORY_CLEANUP_SCRIPT = "clear_volume_directory.py"; - private static final String VOLUME_DISK_LOG_SCRIPT = "get_volume_disk_log.py"; + private static final String VOLUME_BRICK_LOG_SCRIPT = "get_volume_brick_log.py"; @InjectParam private static ServerUtil serverUtil; @@ -268,28 +268,32 @@ public class VolumesResource { return new Status(Status.STATUS_CODE_SUCCESS, "Directories cleaned up successfully!"); } - private List<LogMessage> getDiskLogs(String volumeName, String diskName, Integer lineCount) + private List<LogMessage> getBrickLogs(Volume volume, String brickName, Integer lineCount) throws GlusterRuntimeException { - String[] diskParts = diskName.split(":"); - String server = diskParts[0]; - String disk = diskParts[1]; + // brick name format is <serverName>:<brickDirectory> + String[] brickParts = brickName.split(":"); + String serverName = brickParts[0]; + String brickDir = brickParts[1]; + + String logDir = glusterUtil.getLogLocation(volume.getName(), brickName); + String logFileName = glusterUtil.getLogFileNameForBrickDir(brickDir); + String logFilePath = logDir + CoreConstants.FILE_SEPARATOR + logFileName; // Usage: get_volume_disk_log.py <volumeName> <diskName> <lineCount> - Status logStatus = (Status) serverUtil.executeOnServer(true, server, VOLUME_DISK_LOG_SCRIPT + " " + volumeName - + " " + disk + " " + lineCount, Status.class); - if (!logStatus.isSuccess()) { - throw new GlusterRuntimeException(logStatus.toString()); + LogMessageListResponse response = ((LogMessageListResponse) serverUtil.executeOnServer(true, serverName, VOLUME_BRICK_LOG_SCRIPT + + " " + logFilePath + " " + lineCount, LogMessageListResponse.class)); + Status status = response.getStatus(); + if (!response.getStatus().isSuccess()) { + throw new GlusterRuntimeException(status.toString()); } - return extractLogMessages(logStatus.getMessage()); - } - - private List<LogMessage> extractLogMessages(String logContent) { - List<LogMessage> logMessages = new ArrayList<LogMessage>(); - for (String logMessage : logContent.split(CoreConstants.NEWLINE)) { - logMessages.add(new LogMessage(logMessage)); + // populate disk and trim other fields + List<LogMessage> logMessages = response.getLogMessages(); + for(LogMessage logMessage : logMessages) { + logMessage.setDisk(getDiskForBrick(volume, brickName)); + logMessage.setMessage(logMessage.getMessage().trim()); + logMessage.setSeverity(logMessage.getSeverity().trim()); } - return logMessages; } @@ -300,16 +304,16 @@ public class VolumesResource { List<LogMessage> logMessages = null; try { + Volume volume = getVolume(volumeName); if (diskName == null || diskName.isEmpty()) { logMessages = new ArrayList<LogMessage>(); // fetch logs for every brick of the volume - Volume volume = getVolume(volumeName); - for (String volumeDisk : volume.getDisks()) { - logMessages.addAll(getDiskLogs(volumeName, volumeDisk, lineCount)); + for (String brick : volume.getBricks()) { + logMessages.addAll(getBrickLogs(volume, brick, lineCount)); } } else { // fetch logs for given brick of the volume - logMessages = getDiskLogs(volumeName, diskName, lineCount); + logMessages = getBrickLogs(volume, getBrickForDisk(volume, diskName), lineCount); } } catch (Exception e) { return new LogMessageListResponse(new Status(e), null); @@ -338,6 +342,16 @@ public class VolumesResource { return status; } + private String getBrickForDisk(Volume volume, String diskName) { + int index = volume.getDisks().indexOf(diskName); + return volume.getBricks().get(index); + } + + private String getDiskForBrick(Volume volume, String brickName) { + int index = volume.getBricks().indexOf(brickName); + return volume.getDisks().get(index); + } + public static void main(String[] args) throws ClassNotFoundException { VolumesResource vr = new VolumesResource(); // VolumeListResponse response = vr.getAllVolumes(); diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java index 8b2e13f1..aaedb3d4 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java @@ -53,6 +53,7 @@ public class GlusterUtil { private static final String VOLUME_BRICKS_GROUP_PFX = "Bricks"; private static final String VOLUME_OPTIONS_RECONFIG_PFX = "Options Reconfigured"; private static final String VOLUME_OPTION_AUTH_ALLOW = "auth.allow:"; + private static final String VOLUME_LOG_LOCATION_PFX = "log file location:"; private static final ProcessUtil processUtil = new ProcessUtil(); @@ -261,10 +262,10 @@ public class GlusterUtil { volume.setVolumeType(VOLUME_TYPE.PLAIN_DISTRIBUTE); } else if (volumeType.equals("Replicate")) { volume.setVolumeType(VOLUME_TYPE.DISTRIBUTED_MIRROR); - volume.setReplicaCount(Volume.DEFAULT_REPLICA_COUNT ); + volume.setReplicaCount(Volume.DEFAULT_REPLICA_COUNT); } else { volume.setVolumeType(VOLUME_TYPE.DISTRIBUTED_STRIPE); - volume.setStripeCount(Volume.DEFAULT_STRIPE_COUNT ); + volume.setStripeCount(Volume.DEFAULT_STRIPE_COUNT); } return true; } @@ -276,12 +277,11 @@ public class GlusterUtil { int count = Integer.parseInt(line.split("x")[1].split("=")[0].trim()); if (volume.getVolumeType() == VOLUME_TYPE.DISTRIBUTED_STRIPE) { volume.setStripeCount(count); - } - else if ( volume.getVolumeType() == VOLUME_TYPE.DISTRIBUTED_MIRROR) { - volume.setReplicaCount( count ); + } else if (volume.getVolumeType() == VOLUME_TYPE.DISTRIBUTED_MIRROR) { + volume.setReplicaCount(count); volume.setStripeCount(0); } else { - volume.setStripeCount(0); + volume.setStripeCount(0); volume.setReplicaCount(0); } } @@ -312,26 +312,32 @@ public class GlusterUtil { String[] brickParts = line.split(":"); String serverName = brickParts[1].trim(); String brickDir = brickParts[2].trim(); - // brick directory should be of the form /export/<diskname>/volume-name - try { - volume.addDisk(serverName + ":" + brickDir.split("/")[2].trim()); - } catch (ArrayIndexOutOfBoundsException e) { - // brick directory of a different form, most probably created manually - // connect to the server and get disk for the brick directory - Status status = new ServerUtil().getDiskForDir(serverName, brickDir); - if (status.isSuccess()) { - volume.addDisk(serverName + ":" + status.getMessage()); - } else { - // Couldn't fetch disk for the brick directory. Log error and add "unknown" as disk name. - System.out.println("Couldn't fetch disk name for brick [" + serverName + ":" + brickDir + "]"); - volume.addDisk(serverName + ":unknown"); - } - } + + volume.addBrick(serverName + ":" + brickDir); + detectAndAddDiskToVolume(volume, serverName, brickDir); return true; } return false; } + private void detectAndAddDiskToVolume(Volume volume, String serverName, String brickDir) { + // brick directory should be of the form /export/<diskname>/volume-name + try { + volume.addDisk(serverName + ":" + brickDir.split("/")[2].trim()); + } catch (ArrayIndexOutOfBoundsException e) { + // brick directory of a different form, most probably created manually + // connect to the server and get disk for the brick directory + Status status = new ServerUtil().getDiskForDir(serverName, brickDir); + if (status.isSuccess()) { + volume.addDisk(serverName + ":" + status.getMessage()); + } else { + // Couldn't fetch disk for the brick directory. Log error and add "unknown" as disk name. + System.out.println("Couldn't fetch disk name for brick [" + serverName + ":" + brickDir + "]"); + volume.addDisk(serverName + ":unknown"); + } + } + } + private boolean readBrickGroup(String line) { return extractToken(line, VOLUME_BRICKS_GROUP_PFX) != null; } @@ -433,6 +439,31 @@ public class GlusterUtil { return new Status(processUtil.executeCommand(command)); } + public String getLogLocation(String volumeName, String brickName) { + ProcessResult result = new ProcessUtil().executeCommand("gluster", "volume", "log", "locate", volumeName, + brickName); + if (!result.isSuccess()) { + throw new GlusterRuntimeException("Command [gluster volume info] failed with error: [" + + result.getExitValue() + "][" + result.getOutput() + "]"); + } + String output = result.getOutput(); + if (output.startsWith(VOLUME_LOG_LOCATION_PFX)) { + return output.substring(VOLUME_LOG_LOCATION_PFX.length()).trim(); + } + + throw new GlusterRuntimeException("Couldn't parse output of [volume log locate] command. [" + output + + "] doesn't start with prefix [" + VOLUME_LOG_LOCATION_PFX + "]"); + } + + public String getLogFileNameForBrickDir(String brickDir) { + String logFileName = brickDir; + if (logFileName.startsWith(CoreConstants.FILE_SEPARATOR)) { + logFileName = logFileName.replaceFirst(CoreConstants.FILE_SEPARATOR, ""); + } + logFileName = logFileName.replaceAll(CoreConstants.FILE_SEPARATOR, "-") + ".log"; + return logFileName; + } + public static void main(String args[]) { // List<String> names = new GlusterUtil().getGlusterServerNames(); // System.out.println(names); diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java index 47657c2a..5e423f1c 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java @@ -93,8 +93,6 @@ public class ServerUtil { } connection.close(); - System.out.println("The ouput string is : " + output.toString()); - return unmarshal(expectedClass, output.toString(), expectedClass != Status.class); } catch(Exception e) { // any other exception means unexpected error. return status with error from exception. |
