Perform very detailed logging on unpack failures
If we catch an UnpackException it might be caused by a bug deep within the check connectivity code of ReceivePack. Log a lot more detail than we have in the past to try and narrow down the problem. Change-Id: I28b2e9e3183359eea6d0f33cb16ffc579f8a837e Signed-off-by: Shawn O. Pearce <sop@google.com>
This commit is contained in:
		| @@ -18,15 +18,22 @@ import com.google.gerrit.reviewdb.Account; | |||||||
| import com.google.gerrit.server.IdentifiedUser; | import com.google.gerrit.server.IdentifiedUser; | ||||||
| import com.google.gerrit.server.git.ReceiveCommits; | import com.google.gerrit.server.git.ReceiveCommits; | ||||||
| import com.google.gerrit.server.git.TransferConfig; | import com.google.gerrit.server.git.TransferConfig; | ||||||
|  | import com.google.gerrit.server.git.VisibleRefFilter; | ||||||
| import com.google.gerrit.sshd.AbstractGitCommand; | import com.google.gerrit.sshd.AbstractGitCommand; | ||||||
| import com.google.inject.Inject; | import com.google.inject.Inject; | ||||||
|  |  | ||||||
|  | import org.eclipse.jgit.errors.UnpackException; | ||||||
|  | import org.eclipse.jgit.lib.Ref; | ||||||
| import org.eclipse.jgit.transport.ReceivePack; | import org.eclipse.jgit.transport.ReceivePack; | ||||||
|  | import org.eclipse.jgit.transport.RefFilter; | ||||||
| import org.kohsuke.args4j.Option; | import org.kohsuke.args4j.Option; | ||||||
|  |  | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| import java.io.InterruptedIOException; | import java.io.InterruptedIOException; | ||||||
|  | import java.util.ArrayList; | ||||||
| import java.util.HashSet; | import java.util.HashSet; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
| import java.util.Set; | import java.util.Set; | ||||||
|  |  | ||||||
| /** Receives change upload over SSH using the Git receive-pack protocol. */ | /** Receives change upload over SSH using the Git receive-pack protocol. */ | ||||||
| @@ -82,6 +89,49 @@ final class Receive extends AbstractGitCommand { | |||||||
|       rp.receive(in, out, err); |       rp.receive(in, out, err); | ||||||
|     } catch (InterruptedIOException err) { |     } catch (InterruptedIOException err) { | ||||||
|       throw new Failure(128, "fatal: client IO read/write timeout", err); |       throw new Failure(128, "fatal: client IO read/write timeout", err); | ||||||
|  |  | ||||||
|  |     } catch (UnpackException badStream) { | ||||||
|  |       // This may have been triggered by branch level access controls. | ||||||
|  |       // Log what the heck is going on, as detailed as we can. | ||||||
|  |       // | ||||||
|  |       StringBuilder msg = new StringBuilder(); | ||||||
|  |       msg.append("Unpack error on project \"" | ||||||
|  |           + projectControl.getProject().getName() + "\":\n"); | ||||||
|  |  | ||||||
|  |       msg.append("  RefFilter: " + rp.getRefFilter()); | ||||||
|  |       if (rp.getRefFilter() == RefFilter.DEFAULT) { | ||||||
|  |         msg.append("DEFAULT"); | ||||||
|  |       } else if (rp.getRefFilter() instanceof VisibleRefFilter) { | ||||||
|  |         msg.append("VisibleRefFilter"); | ||||||
|  |       } else { | ||||||
|  |         msg.append(rp.getRefFilter().getClass()); | ||||||
|  |       } | ||||||
|  |       msg.append("\n"); | ||||||
|  |  | ||||||
|  |       if (rp.getRefFilter() instanceof VisibleRefFilter) { | ||||||
|  |         Map<String, Ref> adv = rp.getAdvertisedRefs(); | ||||||
|  |         msg.append("  Visible references (" + adv.size() + "):\n"); | ||||||
|  |         for (Ref ref : adv.values()) { | ||||||
|  |           msg.append("  - " + ref.getObjectId().abbreviate(8).name() + " " | ||||||
|  |               + ref.getName() + "\n"); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         List<Ref> hidden = new ArrayList<Ref>(); | ||||||
|  |         for (Ref ref : rp.getRepository().getAllRefs().values()) { | ||||||
|  |           if (!adv.containsKey(ref.getName())) { | ||||||
|  |             hidden.add(ref); | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         msg.append("  Hidden references (" + hidden.size() + "):\n"); | ||||||
|  |         for (Ref ref : hidden) { | ||||||
|  |           msg.append("  - " + ref.getObjectId().abbreviate(8).name() + " " | ||||||
|  |               + ref.getName() + "\n"); | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       IOException detail = new IOException(msg.toString(), badStream); | ||||||
|  |       throw new Failure(128, "fatal: Unpack error, check server log", detail); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Shawn O. Pearce
					Shawn O. Pearce