@@ -112,7 +112,7 @@ private Answer handleQueryLockState(ClvmLockTransferCommand cmd, String lvPath,
112112 script .add ("--noheadings" );
113113 script .add (lvPath );
114114
115- OutputInterpreter .OneLineParser parser = new OutputInterpreter .OneLineParser ();
115+ OutputInterpreter .AllLinesParser parser = new OutputInterpreter .AllLinesParser ();
116116 String result = script .execute (parser );
117117
118118 if (result != null ) {
@@ -121,13 +121,37 @@ private Answer handleQueryLockState(ClvmLockTransferCommand cmd, String lvPath,
121121 String .format ("lvs command failed: %s" , result ));
122122 }
123123
124- // Parse output: " -wi-a-e--- host5.example.com"
125- String output = parser .getLine ();
126- if (output == null || output .trim ().isEmpty ()) {
127- return new ClvmLockTransferAnswer (cmd , false , "No output from lvs command" );
124+ // We need to find the line that contains the actual lv_attr (starts with '-' or other attr chars)
125+ String [] lines = parser .getLines ().split ("\n " );
126+ String dataLine = null ;
127+
128+ for (String line : lines ) {
129+ String trimmed = line .trim ();
130+ // Skip empty lines and warning messages
131+ // lv_attr always starts with '-', 'w', 'r', etc. and is at least 10 characters
132+ if (!trimmed .isEmpty () &&
133+ trimmed .length () >= 10 &&
134+ (trimmed .charAt (0 ) == '-' || trimmed .charAt (0 ) == 'w' ||
135+ trimmed .charAt (0 ) == 'r' || trimmed .charAt (0 ) == 's' ||
136+ trimmed .charAt (0 ) == 'v' || trimmed .charAt (0 ) == 'm' ||
137+ trimmed .charAt (0 ) == 'p' || trimmed .charAt (0 ) == 'c' ||
138+ trimmed .charAt (0 ) == 'o' )) {
139+ dataLine = trimmed ;
140+ break ;
141+ }
128142 }
129143
130- String [] parts = output .trim ().split ("\\ s+" );
144+ if (dataLine == null ) {
145+ String allOutput = parser .getLines ();
146+ logger .warn ("Could not find lv_attr data line in lvs output for volume {}: {}" ,
147+ volumeUuid , allOutput );
148+ return new ClvmLockTransferAnswer (cmd , false ,
149+ String .format ("Could not parse lvs output. Full output: %s" , allOutput ));
150+ }
151+
152+ logger .debug ("Parsed lv_attr data line for volume {}: {}" , volumeUuid , dataLine );
153+
154+ String [] parts = dataLine .split ("\\ s+" );
131155 if (parts .length < 1 ) {
132156 return new ClvmLockTransferAnswer (cmd , false , "Invalid lvs output format" );
133157 }
0 commit comments