 Wow, here we go. Welcome. This is the 5th, the 6th of July, 2022. This is Google Summer of Code, the Git Cash Maintenance Project. And Hushikash, one of the things that I've got is I have added your account to home.markweight.net with the minutes ago. Oh, okay. So and I didn't remember the account that you wanted. So I added one with this username. I put it in the chat. I was thinking today's meet we would do like, you know, find the Git versions, you know, on your computer itself, you know, so that we figure it out. Great. Because I haven't done anything the past one week. The only thing I added was, you know, getting the Git version and the Git plugin. And yeah, that was the only thing. Because I didn't have access to them. Yeah. All right. Well, so let's, let's be sure that you have access. My apologies that I blocked your work. Let's be sure that you have access and we'll do that during today's session. So tell me again, the username you prefer, I added one username, but if that username isn't the comfortable one that you're accustomed to, tell me the username you prefer and I'll create that one. I sent it. Okay, got it. And you're okay. You know, rather than creating username, can we like just figure it out on your computer right now? Because the idealized there are only three maintenance tasks version, which I would be needing because brief, because prefetch isn't supported for versions less than 2.30 according to like what I have seen. And lose objects also isn't supported. So the other commands which we would be needing are, you know, commit graph GC and multi-pack index. Okay, well, let's, let's do it then. Let's, let's take a moment. And if you're okay with it, I'm just going to, going to share my screen. And we're going to do the exercise you can, you can guide and we'll make it happen. Do you see, let's see, whoops, share screen. You should see my screen now. It should have a web browser on it. Yeah. Okay, good. All right. So let's go to, and prior to the meeting, I had prepped by starting a wide collection of agents. So we've got CentOS 7, Red Hat 8, Oracle Linux 8, Debian 11, Debian 10, FreeBSD 13, Suzy 15, Ubuntu 18, 20, 21 and 22, FreeBSD 12, Windows, Ubuntu something on PowerPC and Ubuntu something else on System 390 and a bunch of others, Raspberry Pies, et cetera. So we've got a pretty reason, oh, and Debian testing. So we've got a reasonable collection of operating systems. Okay, now what, what you wanted to, let's, let's walk through the, the, the tasks that you would like to do. So you want to iterate over every client, every agent, report the Git version number and then which, which, based on the version, you know, we can figure out what, you know, we can execute that maintenance task or not. Okay. All right. So, all right. So let's create, let's create a job that does that. And if I remember right, we had one, okay, it was, yes, get, get maintenance help. And this thing, and all we did, if I remember, right, was we copied this and made ourselves a job that would answer the questions we wanted so that we could iterate on it, right? Yeah. Okay. So let's do this. So get, get maintenance exploration. Okay. So pipeline and let's just use label as the stage name. And first things first, I want to watch it pass. So I'm just going to report Git version, nothing else. And we'll take J agent. So we'll take all the agents. Now let's see what agents it actually does. So it's collecting many. But why would that fail? Hmm. That's a strange thing to see. Failed in branch. Hmm. Well, we'll see soon enough. Okay. So where did it fail? I'm not seeing obviously where it failed. Okay. Failed in branch on Ubuntu 20d that I don't see that as an obvious failure. Because it says, okay, maybe we have to ask it a different question. Okay, it's still waiting to run on this computer. But that computer is rather busy right now, I suspect, because it's the only Windows computer in the set. So let's give it more executors. And it immediately took all of them. Or thing will have difficulty carrying that heavy of a load. But let's try it. There was another way of, you know, going through this process, like implementing this, I was thinking, you know, rather than using the versions, I can call each command using the Git client, you know, tool and if it throws an exception, then I can figure it out myself, whether I can, you know, you run that maintenance task or not. So I'm not sure which is the better way. So and, and either, either would be fine. I've because the, the knowledge of which versions implement, which, which, which commands is static. I've rather preferred to go the direction of having a table that tells me, or having code logic in the plug-in that tells me which thing is implemented and which is not. But, but I'm open to either that would, your, your technique would also be fine. The challenge with that is it means you're going to call, you will call command line Git to ask the same question over and over again on an agent where you, you probably know the answer. Oh, I just have a question. I, when we're trying to install a Git version on Jenkins, I believe we specify the version at the time when we're trying to install it. So isn't that stored in the context of the Git tool itself, the version in the installation of the Git tool? It's a good question. I don't remember. I, it's, that's a very good question because there certainly is a, let's look to see how it's implemented. I was checking the Git tool class to see if something like that. So I see that there's a name, there's an O associated to it, which is the directive, the directory where it would be installed. Then there is something called a concept of properties. Yeah, I need to investigate deeper if this, we could get those properties or we could get the version. So there's a, there's a function. There's a method get Git version. And it starts with a static, no, with a private value, Git version that is a long set to zero, then it gets computed. And if it's non-zero, it's not recomputed. So for the lifetime of this object, it calls once and remembers. Now it's not for the lifetime of an agent, just for the lifetime of this object. Does that answer your question, Rishabh? No, but here we are actually executing the version command to get the version, right, but not once. That's correct. Yeah, I mean, this works. My, I thought that we would have stored this information while we create a Git tool within the context. That is what I assume, but I don't see it. It's not as obvious because I don't see it declared anyway. Yeah. So when you say, when you say get to, you really mean get to this object, right? Yes. So this is an abstraction of the actual installation that I would have. I mean, it would contain the name. If it's a JGIT implementation or a Git implementation, CLI Git implementation, I would move from this object. Right. Well, but it doesn't know the Git version as far as I can see. It doesn't have anything that talks about version, does it? I mean, it could be taught to know about versions, but CLI, really there isn't a version concept on JGIT. So I had assumed that CLI Git was a reasonable place to put the version knowledge. But, and it certainly is cached there in the sense that anytime I instantiate CLI Git API implementation, it will call this once and then future use of that instance will remember the cached value. And when I add a new or get to another Git version, would this thing get updated or would it be the same? Well, so a CLI Git API implementation is using a specific Git tool, if I remember correctly, and therefore it will, it will for the lifetime of this object have one and only one Git version because it's assuming that you aren't changing the executable Git to which it is pointing to some different version. Did that answer your question? Yeah, because I added, I added the logic to get the Git version and this thing runs whenever I'm executing a maintenance task. So whenever I'm going to schedule a maintenance task, when it's added into the queue and when I'm removing it from the queue, then I go get the Git version, like what exactly is the version and then execute the task based on the version. So I mean, it would be, so if you have multiple Git tools in your environment, you would get the instances from those objects, you could get version for each rate, that would not be a problem. Here we decided to go with the default tool, like I and Mark, we discussed in the previous meet. Yeah, that makes sense. I saw that, I was just saying that even if you had multiple ones, you would get the CLI Git implementation for the tool that you're using. Dot Git X will give you that implementation and you would get the particular version for that implementation when you're trying to do it. Okay, wait, I have a doubt right now. Okay, after this, like the version which the logic which I have written, I'm not sure if that is the same tool which I am getting is I'm not sure whether that thing gives the default Git version present on Jenkins controller, because I've taken it from a test file, like and then I've added that logic. So I'm not sure if that's going to return the default tool which we are using. Let's do it. I think we can check that interactively, can't we? If we were to install a copy of your development copy of the plugin on this Jenkins installation, we should be able to watch the logs and see what it says. Does that seem okay? Yeah, yeah, yeah. Okay. So do we want to proceed with the attempt to determine which versions of Git have which capabilities? Because for me, I think there's some benefit to knowing that just to capture it even if you were to choose later to, oh, I'm going to determine it dynamically at runtime. I would be needing this information though, you know, under maintenance also. Okay. So then let's take a look at it. What we see now is here's the output. It shows us each of these is what it's running. Now we probably also need to know something like what the computer's operating system version number is, right? That kind of thing. So let's configure this job to give us a little more information like uname minus a. And then if, let's see, how do we do it? Is there a cat command that says ignore, ignore, don't fail if there are an ignore errors? There is not. Okay, unfortunate. All right. So cat, so let's do it like this. Uname minus a if minus f slash gtc slash os dash release then cat slash gtc slash os slash release. Okay, get minus minus version. Okay, what else? So get let's, shall we try that much? Let's see if we, oh, and then on the on the windows side, it'll always be windows. We know that. So that's easy. Build now. So here we are on Ubuntu 18. So are you okay if I start a table? Yeah, yeah. Sure. All right. So drive. So is there an easy way to do a table in our document table? Okay, what do we need? We need to know the operating system name, operating system version, command line get version. So I need a spreadsheet. Sorry. Let's just get a real spreadsheet so I don't have to worry about how many columns it has new sheet. Okay, so first operating system version get version. And then it's, you said the maintenance tasks include gc, gc all of them have, right? So there was prefetch, there was. Are you listing all the new stars? Just the ones that we need to, we need to decide is it implemented in this version or not. Okay, command graph and then incremental repack and gc. Okay, incremental repack. And we know that gc is implemented. Oh no, but you're right. The maintenance gc is the question. Is that right? The maintenance gc, I thought we would run the, you know, just run it gc. Yeah, yeah. Okay, so then that's implemented in all of them. There's no, there's no command line get that lacks it get gc as far as I know. Okay, and we have to, can we conform about the prefetch command once because when I tried it wasn't there so. Absolutely. Okay, so let's, and let's list our operating system. So we've got Ubuntu and it's 1804, 2004. Okay, then we've got Debian and here we've got 10 because nine is no longer supported. 11 and Debian version that they call testing. Silly thing. Right line. There we go. Okay. All right, now then we've got CentOS 7, Red Hat 8, Oracle Linux 8 and which others do we have in this mix? Oh, Raspbian 11. So we'll see. We may have more than that, but let's grab those. Okay, first Adamame is Ubuntu 18 if I remember correctly. So it's going to tell us Ubuntu 18 and the get version is 2.17.1. Okay, now, and then to decide do we have prefetch the way we would do that. Rishikesh, as we would call maintenance prefetch. Oh, no, no, get a prefetch, sorry, get fetch and then dash dash, you know, prefetch. Okay, I send the link in though. Oh, good. Thank you. Okay, excellent. Okay, so get fetch minus minus prefetch. Okay, so what we need is we're going to need a repository that we can use for this. So let's get one. Like, couldn't we just like run and check whether we'll get fetch dash dash prefetch exists or not? We can, but I think it will fail because fetch assumes the existence of a repository. I think, but let's try it. Yeah, good idea. Okay, how are we doing there? Open the ocean and the output says fatal, not a given repository. But that's still that should be pretty easy for us to fix that. Let's let's do that fix. Because we've got a working directory, we can just say get init and we can say get remote add origin. Now let's see if that was the right thing. Nope, apparently not. What mistake did I make? Unknown option prefetch. Oh, okay, well that's actually the expected thing. Okay, good. So we can look at this one and see if any, oh no, that's odd. None of them recognize get prefetch and the windows one even shows as a failure. Why would the cable or the windows one is not in my list? Ah, right, right, is it? There's no windows at all. So I've made a mistake in this job definition. Let's do a quick configuration. J agent or windows, say Linux or windows or free BSD. So get fetch minus minus prefetch. And so if that's the case, well, let's try it again. Why would I mean get fetch minus minus prefetch should have been successful. Shouldn't it on at least one of these? It should be running successfully or not 2.30 version. Yeah. Okay, so let's look for 2.30. So here's one that has 2.30. It says remote origin already exists. Oh, right, right, because I'm trying to, okay, that's okay. So we we need to make a minor change there to ignore the failure if remote if if origin already exists. We do that by saying like that. Okay, unknown option prefetch remote HTTP. Oh, how embarrassing. Look at that typo. Okay, so that's why it failed because I made a mistake. So here's what we do here is we use a real URL with a real protocol. And let's clean the workspace. I think it's clean WS, isn't clean WS. Okay, good. Okay, unknown option prefetch get minus minus version 2.31 unknown. Okay, but you said 2.30 should have prefetch. Yeah. Okay, so it says I don't see it there. Okay, well, let's keep looking. Here's 2.35. And 2.35 definitely does have it. So maybe it's not 2.30, 30, but let's let's see. Okay, so this says we've got that we should have at least a few pass. Show me blue ocean. Yes, here we go. Okay, so the brand new ones, the three that are on FreeBSD, we went to 21, 22, and FreeBSD 12 and Debian testing. So there are some that are passing. So that's a plus. So I think we can collect our data now, at least for prefetch. So let's let's do that with blue ocean. It's easy enough to see. So here with this Windows computer, I think the version, oh, 2.36, I don't, I didn't do the get prefetch. So we don't know that one yet, just a minute. So Windows, on Windows, it was 2.36. Oops, this is Windows 11. Refetch, we expect yes, right? Full support. And now back to our page. No, not this one. Okay. So Debian testing is running command line get version 2.35.1. Okay, so 2.35, and there it did the fetch. So 2.35.1. Yes, prefetch. And we're quite confident that, so AdaMama is 1804, it's get 2.17.1, and it has no get prefetch. Oh, because get maintenance, I think has been released in 2.30. So so that that's that's consistent with what you what you're expecting them. That's good. So let's look at others. So CentOS 7, the get version is 1.8 1.8.3.1. Oh, my sakes, that's ancient. Yes. Okay, so CentOS 7 is from the Dark Ages of get. Okay, 1.8.3.1. And we can easily put no, no, no, right? And if prefetch is not there, did commit, well, let's let's do the rest of the research. Okay, next stop then is Ubuntu 20. And an Ubuntu 20 machine like this one, here's Ubuntu 20. And it says it doesn't have prefetch and it's running get 2.25.1. These are the default get versions, right? Present on those machines. On on these, yeah, the Linux operating systems have a tend to have a tend to ship a version. And most of the ones that I've seen anyway, choose to not do major to changes to the minor number even they will do a 2.17.2 or 3, but they won't change the 2.18. That kind of thing. And we said no on prefetch here. Okay, now let's go the next level. So this was Ubuntu 21. Okay, so 21 is here. And it passed. And so we expect that it's okay, it's 2.32.0. And the answer there was yes. And we fully expect 22.04 to be the same thing. And it is 2.34.1. Okay, and the answer is yes, it has prefetch. Debian Debian 10. So here's Debian 10, it failed. So we expect that the answer here is no. And it is get 2.20.1. The expectation here is that we're going to include this information within the get plugin. That was that was my assumption so that we know whether or not we dare call for prefetch. Yeah, but but as get versions, so if that is going to be a reference point to decide if we want to execute the maintenance task or not a particular maintenance task then if I don't have version there because that list would grow as get versions come out, right? Or you would have some kind of, I mean, you would say that if it's greater than this, then you would all be executed. That's that's how it's been done elsewhere in the in the get client is it asks questions like is is at least is the get version at least this version and it's assumed that once a feature is added it is never removed. That's fair. Now, now, well, I thus far it's a fair assumption. I you know, we reserve the right to always have have them decide, hey, we've had to drop this capability because it was a total disaster or it was a it was unacceptably bad performance or who knows. Okay, so 2.30.2 on Debian 11 failed, didn't it? Yeah, it did. Okay, so that was a no for prefetch. Okay, and then red hat eight. And I don't think that Russia cash you need to encode the operating system at all. It's just all we care about is the get version. Okay, 2.31.1 also does not have prefetch. Now that's strange. So now we have to check whether it runs maintenance tasks like it would run right maintenance like the get maintenance command. I don't know. Yeah, that's that let's we'll do so we I think you're right we need to check for we need to put one more column in here right which is maintenance. So is maintenance even available? Yeah, the document does date it in 2.30 but still. Right, right. And and I thought I thought that I fully expected it would be there. Okay, so here's Oracle Linux 8 and it's running 2.31.1 as well. Okay, that's good because it's supposed to be a clone of red hat. Alright, and then Raspbian 11. Let's see if I've got one there. Do I have a pie? I don't. None of my pies were selected. Okay, because they are not listed as Linux. Just a minute. I have to do one more thing then. So the Raspberry Pis call themselves Oh, arm. Okay, good. Okay, let's look at it again. Here we go. So pie four which is running Debian Raspbian 11 and it's 2.30.2 and it told us no. Is that right? Yes and no. Okay. And then Oracle Linux was also a no. Okay, now we want to. Alright, so then we want to check get maintenance. Same trick, right? Yeah, and once we do maintenance, I think I can continue this process because now I have understood how to use it. So, yeah. Okay, so are you okay? That means we'll need to, during this session, we'll need to be sure we get you access to this machine. You're okay with that and we'll do that. Good. Alright. Okay, so let's do maintenance minus, minus help. And let's use a smaller repository for the clone, shall we? Just a minute. We don't really need to put that much load on GitHub. Find something small and public. Now is there a way to sort by size? No. Here's a small one. So back here to our, okay. Alright, so that ran something. So 36, yes. 1804, no. Cento seven, no. Debian 10, no. Debian 11, yes. So 18 was no. Debian 10 was no. Debian 11, we said was yes, right? Yeah. Interesting. So it doesn't have fetch minus, minus prefetch, but it does have get maintenance. Okay. So I think they added a command, you know, in the next version. Interesting. Okay. Yeah, that's okay. That's very interesting. Alright. Okay. So let's keep looking and about. So 1804 was, we went to 1804. It was no. Cento seven is no. Let's keep looking. Oh, oh, we didn't do Susie. Sorry. Another one. Susie 15a is what version it is. Get 2.34.1. And it was a yes. Oh, whoops, no. Yes. It was yes on both. Okay. Good. All right. Ubuntu 20 is a no. Is that correct? 18 and 20 are both no. 21 and 22 are yes. Okay. 20 is a no. 21 is a yes. 22 is a yes. And Debian testing is I'm confident a yes. Let's be sure of that. Yeah, it is. Okay. Red Hat is also a yes with its 2.31.1. Interesting. Another case where we have a yes to maintenance, but a no to prefetch. And Raspbian was yes. Alright. And we know that Windows, well, actually let's check it. That's a good question. Is Windows actually supporting Git maintenance? It does. It does. Okay. You've already verified that. Yeah. Yeah. Very good. Okay. Alright. So the next stop then was we wanted to try, you want to try Commit Graph? No, I can do that, you know, again, you know, okay, then let's let's then let's configure it. So I'm going to share this sheet with you, Rusha Kesh. And anyone with the link and give you editor permission and Rishabh. Alright. So now let's add that account for you. So that you have, okay, so let's give you an account. And for that, we do it in my SSH thing here. Okay, so add user. What username would you like? It was Rushi20. Yeah. Capital H. I've never used capital H on a Unix, or capital letter on a Unix login. I'm willing to try it. Let's see if it, so Rushi20, like that? Yeah. Yeah. Okay. Alright. Rusha Kesh. Rush. Kesh Rao. Okay. Empty for defaults. Login group that. Passes that. SH. Home directory. Default permissions. No password based authentication. No, we're not going to lock out the account. Yes. Okay. So this means we've created the account, but you can't log in yet because we haven't added your public key yet. I sent you the public key via mail. Right. So I'm now going to go ahead and add that. First things first, I'm going to do an SSH key gen minus TED25519 so that you've got something. And then, okay, what I'm checking now is to be sure that, all right. And it does know about it. All right. So now I'm going to put this off screen here because I don't want to show even your public key to others in the recording. It should be harmless, but why risk it? Okay. So public key and SSH into mark machine. There we go. Okay. So wrong window. Try again. So Roushikash, you should be able to log in now by doing SSH, and I'm going to stop sharing my screen. So you should be able to log in to SSH minus P for port number. I think it's a lowercase P. Let me check. So yes, lowercase P. So SSH minus lowercase P44022. Okay. space home dot mark wait dot net. M-A-R-K-E-W-A-I-T-E. M-A-R-K-W-A-I-T-E. Right. So no, no E-B after mark. Okay. Not net. Correct. Nothing. Uh-huh. And if your username is Krushi20 on your local computer, it should do it automatically. If it's not Krushi20, then you let's change the command line just a little. Then it's SSH minus P44022 space Krushi20 at home dot mark wait dot net. Okay. And be sure you get the capitalization correct because I think Unix logins are case sensitive. I think I am in. Do I open like port 8080 on my browser? Well for right now, yes, I definitely see you're in. So now you can log off because now we need to do the next step, which is configure that, do that same command, but use one, some additional arguments to cause it to create an SSH tunnel for you. So do I dominate this session? Yes. So in that session, I see that you're logged in right now from an IP address that starts with 122. Okay. Now I see you're logged off. So instead do in addition to the minus P argument that we had before, we're going to add one more argument, which is a, I think it's a minus L argument. Okay. Just a minute while I read it, I always have to read this to remember how to do it. It is minus capital L. And now we're going from, okay, minus capital L. So, oh, yes. 126, let's try this 127.0.0.1 colon 8080. Okay. And maybe it's, maybe it's best if I copy this all into the chat window because it'll be to all of our benefit if we have a copy of it. That way we can figure out what's going on if there's a problem. So this one 8080 to mark dash mark PC2.markweight.net 8080 minus P44022 home.markweight.net. Okay. Let me try that one myself just to see if it works the way I hope it should. Okay. So for this, we need get bash. Okay. And I've got an outdated key in mine. Interesting. Ah, there we go. Deleted the wrong line. So I have to be sure I do the same thing I told you to do. Login is M weight. And now, yep, that's right. Okay. So that syntax that I pasted is the correct syntax. No, I'll have to be adding my username right there. Yes. Oh, oh, yes. Sorry, I did my username, didn't I? Yes. Yes, you'll have to use your username instead of mine. I think I am. Okay, good. So now on your computer, in a local web browser, open localhost colon 8080. Oh, yeah, yeah, I can see it. Oh, yeah, it's coming. All right. So, and so now I need to give you a login on that system. And do you prefer Fushi 20? Yeah. Okay. All right. So let's give you a new account. And what I'll do is I'm going to send you a, I will send you a single use URL that contains the password. That way you, we don't have a big worry of the password that I generated for you. And can you remove like the right access kind of things, you know, or something like that? That I cannot. You'll just have to, if you destroy it, don't worry about it. If you destroy it, it would be kind if you tell me that you destroyed it, but it should be fully reconstructable. Everything is managed by code in it. Two years ago, Rishabh didn't do any really serious damage. Other, you know, so you'll be fine. Okay. Truly, you don't need to worry. If you do damage and don't tell me, that's okay too. It's just easier if you tell me I did damage mark, but even if you don't periodically throw it away and reconstruct it from scratch anyway. I guess he let it know, right? Even if I mess it up. Okay. So there is username. Let's get you a password. So while Mark is doing that, Rishikesh, I wanted to know since you implemented how to run these internet tasks while they get back in. What is your, how are you thinking to test this on Mark's machine? Do you have a plan on that? Yeah. Yeah. I was, that was what I wanted to discuss next. So basically I wrote all the, you know, maintenance, I wrote the code for executing the maintenance tasks along with logs. Okay. So now we have to see how efficient it is. That's the only way like logs were written. So I thought if we run it on Mark's machine and then check the logs based on I can add other logs like when did the process start and when did it end to, you know, know whether, you know, how much time is taking. Good. So Rishikesh, I'm actually going to paste the single use URL into the chat session. I know that's recorded and I know Rishab will see it, but I'm going to trust that you're going to be the one who clicks the link first. So Rishab, this means you shouldn't click it first, right? That would be really rude. And if Rishab does click it first, then Rishikesh, you tell me, Rishab clicked it first. Okay. So if you'll click that link, that hyperlink Rishikesh, what you'll see is it should open a web page and on that web page will be a text string of more than 15 characters that is your password. Okay. That is my password. That's your password on that Jenkins system and you can change it to whatever you'd like. But that's the password that I set there. If you do change it, please let me know because I will store your user configuration as part of my configuration as code so that when I reset, your user will come back. Okay. So have you been able to open up that password yet? I opened the thing. Now do I use it? Yes. Yes. So use it to log in as Rishi 20. Okay. Now I have to exit the session like I'm already logged in, right? So no, no. When you say you're logged in, I think you may, you may be misunderstanding. You need to, or I'm not being clear enough, in your web browser that's open the localhost colon 8080. Okay. On that, there you need to do a login as Rishi 20. Okay. With that password. Yeah. Oh, yeah. I'm logged in. Okay. So let me see if I can log in still. Yeah. And in all seriousness, if you do damage, if you accidentally delete my account, if you accidentally delete the entire thing, that's okay. Don't worry about it. Yeah. No need to worry. Okay. So now let me be sure that I've got a copy of your environment. Okay. There it is. So and where is Rishi 20? Ah, there we go. Okay. All right. So Rishi 20. Where would it put, where does it put the password that we just assigned? Ah, there it is. The hashed password is there. Okay. Good. So I have what I need. This is assuming that you don't choose to change your, your password from what I said. If, if you do choose to change it, please let me know so that I can capture it correctly then. Sure. All right. So now in terms of your welcome to upload your own copies of plugins, I have to forewarn you that I periodically erase all the plugins that are there and reset them to versions that I'm using. So in your, in, as you're working through a development session, you should be sure that you start always by uploading the plugin versions you want to use. Okay. Don't, don't assume that if you had installed the one you wanted to use yesterday that it's still there because frequently I will reset things. Does that sound all right to you? Yeah. Okay. And if we need, if we need, if you need access to a weekly version, the version that's running there isn't a long term support version. If you need a weekly version, I can pretty easily start and stop weekly versions on other hosts. Okay. All right. Anything else we need to go over today? Oh, we didn't see the execution of the maintenance task once or so, right? Like what I've written, like, can we do that once? Like, sure. Well, actually, how about, do you want to do it? Let's have you try to do it. Okay. So, like, wait, how do I do it? Like, do I share my screen or something? If you'd like to share your screen, that'd be great. If you don't want to share your screen, you can just execute it from your webpage. So on your webpage, on your webpage, just open up dash, go to the top level Jenkins dashboard. Okay. In the maintenance folder. Yeah. There's a job named get maintenance exploration. Yeah. Open that job and click the configure link. Okay. And you'll see as you scroll through it, it lists the steps that we were running. Okay. So now if you save that. Yeah. And press build now. Yes. I clicked on it. Okay. And I see build 11 running. And when I look in blue ocean, it will show me that it's finished and some of them passed and some of them failed. Oh, that's interesting. The windows one failed because apparently I did something wrong. Unknown option. Oh, apparently I need to learn how to write bash scripts or not bash batch files. Let's fix my mistake. I love windows. Okay. So and it still fails. What am I doing wrong? Could not instantiate. I'm sorry for Shakesh. You've just detected a that on the windows computer, it uses a minimum version of get that so that so that it doesn't have all of the parts and pieces. And that means that documentation for get maintenance is not available. So get maintenance minus minus help fails. So you'll have to do a little more exploring. Get me to be recognized. But the but help doesn't seem to be there. So we may have to do something different like try a command get maintenance prefetch or get maintenance. What? Let's see. What are some get maintenance commands list? Is there a list? Oh, commit graph. Okay. So commit. All right. So I save that build now. Oh, here comes number 13. No, it still fails. Well, so you can certainly do exploration like this. Are you comfortable doing that? Yes. The exploration and I'm going to go to sleep. Okay. Oh, before that, I have a few more questions. If you don't mind. Oh, go ahead. Yes. What other questions do you have? I have, I've written the logic for logging the files. Okay. And then I realized that, you know, there are a few logs which are written every minute because the crown scheduler runs every minute. And I think that would have an impact on the performance because when I was only using the software, I could feel it very slow on my computer. So are there any suggestions? Sure. So one suggestion is for that kind of logging, be sure that you set the level to something like fine so that by default users don't get it. And it doesn't matter if I keep logging that internally, right? Well, it would be same. Yeah. When you say when you say logger.log at level fine and then give a message, it will not place anything in the log unless that log is enabled for fine logging. Okay. So it'll be silent, even though you said write a log message, unless that has been explicitly configured to take that level of logging. Okay. Did that answer your question? Yes, yes, yes. So I added it as a fine, you know, the fine level. So I think. Oh, well, so then it shouldn't have been writing, but you say it was writing. No, it wasn't writing, but I could feel my system slow, you know, because I don't know why. Oh, well, so as far as that, well, so there are some techniques to keep the cost of logging as low as possible. And if you want to do a little bit of studying about those Java logging has some techniques that will let you by choosing which method you call, you can reduce the expense of a log message that is not being actually written to any log. Okay. I've never had to use those techniques. So I don't, I don't know them, but I know they exist. I'll look into that. Okay. And one last thing, can we try executing the maintenance task, like the entire thing on your computer ones? Oh, sure, you bet. So you want to, you want to upload of, should we upload a version of the plugin and watch it run? Yeah, the latest one itself. There is a failing test, but I think it should run successfully. Yeah, let's do it. So to be sure that you have a record of it, let's turn on screen sharing. You should see a terminal window. Do you see a terminal window? Yeah. Yes. Okay, so let's put that away. And now what we're going to do is we're going to go here, bring up this thing. Okay. So here is my Jenkins controller. And I assume that's readable enough for you. Yes. Okay. So now let's go on ci.jankins.io. We need the Git Client plugin, most recent build of your change. So this one. I think PR862 is the one you needed, right? Yeah, get cash maintenance. Okay, so let's download that. I think you would need only the Git plugin, right? See, I don't know. You didn't make any dependencies on your new version of the Git Client plugin? No, there are no dependencies. I added the incremental build version into it. I think now you have updated it so I'm not sure if it's going to run or not. Okay, well, so let's try it and see. And so let's take download download from ci, Git plugin, and we want to see your build, which should be a request 1277, maybe. Yes, good. Okay. So we download this one. And then what we're going to do is I'm going to go to manage Jenkins. Oh, I've got an even better technique. Oh, yes. Sorry, I'm going to show the best way to do this. Forgive my mistake here. The best way to do this is we go to ci.jankins.io, Git Client plugin on the branch that we need. This one, I'm going to copy this URL. And then on the Jenkins instance here, I'm going to manage Jenkins, manage plugins, advanced, and notice this very nice URL field to deploy a plugin. Okay. Notice that it says deploy plugin and I can enter a URL deploy. So it's now downloading that version of the Git Client. Okay, now I'm going to do that one more time with the Git plugin. So go to the Jenkins job that has exactly the pull request that I want to take. It was 1277, right? Yeah. Okay. And we copy that, paste it here. So again, that's deploy plugin here. I've pasted in the path to that one. And now it says I need to restart. So I'm going to go ahead and restart by placing the magic command in the URL restart. And here it goes. Now we'll see if it comes back. You don't have to update the version of the Git Client plugin and the Git plugin. The incremental build. That's what I just did is I just uploaded. So what I did was this is the incremental version of the Git plugin. And I told Jenkins download that one. Okay. And if I'm lucky, this is going to just work. We'll see. I was telling to do this just so that we are all on the same page, like how things are executing so that, you know, we'll have a clear picture of what things, what exactly is happening. So let's take a quick look here. See if there's anything in the logs that causes us worry. I don't see anything there. Looks pretty good. All right. So now, if that was successful, I would expect us to manage Jenkins find a new thing which is... Yeah, the Git maintenance. You obviously see it and I'm not seeing it. Oh, there it is. Good. Okay. So Git maintenance. Can you open the terminal and see where exactly these caches are present in the path so that we can look whether the maintenance command is running or not? You bet. So here are some caches. Okay. I think it'll run on all caches. Can we see any command where, you know, we know something is written to the .git folder because when I run the maintenance task, a log file is added. So... Okay. So ask your question again. When I run the maintenance command, a log file is written to one of the caches. So is there any chance that we can keep watching that so that when we run the maintenance command, we know that thing... Sure. So how about, how about let's look at one of the large directories. Wait a sec. That says it's non-trivial size. You have to go into that directly and then there's a .git. Oh, my, that is really strange. Yeah. So they're not maintained as bare repositories. Oh, that's interesting. All right. Well, I did... So now if you go, yeah. So now if you go into the .git directory and keep looking at it, the watch commander... Watch. Okay. Every once, if you do it like 0.1 second, I'm not sure if it finishes very fast with the maintenance task. Oh, you think it will be removed again? So the log file? Yeah. Yes. Yes. Yes. Okay. I think it will... Particularly if I run GC, it's going to take more than two seconds to complete. Yeah. I'm not sure if it would run in the same order as the thing displayed in your tournament. Yeah. And I'm okay with that. Right? I think... Okay. Save. And now if I say execute... Yeah. It should be executing. Can you look into the logs of... I think I added logs, right? So let's see what's written to the... If anything's written to the log here. I don't see anything in the log here. So let's look at Jenkins logs. So manage Jenkins, system log. Okay. So now let's add a new log recorder and give me a good choice of name. I think a task executor or a task scheduler. You know. All right. So I need a fully qualified path. So let's go find it. Something like well, let's find someplace where you wrote a logger. Or I think a task executor would have one name. Okay. So all right. So task executor rather than maintenance task configuration. Yeah. Yeah. This is only during saving the data into the Jenkins. So in maintenance UI, task executor. Okay. So we need Jenkins plugins get maintenance task executor. Let's borrow this. Jenkins dot plugins dot get dot maintenance dot task executor. Yeah. Jenkins dot back to where I was. It is Jenkins plugins. Oh, here we go. We'll cheat and just take that. Oh, oh, this is just the name. Sorry. I need to read more carefully. Now we add a logger and this one will do the look up for us. Yeah. Task executor. And we would like finest. Oh, okay. You really want all. Yeah. Very good. All right. Okay. So now let's execute again. I think it's executed. It's executed. Oh, oops. Okay. Save. Now we'll have to wait. We'll have to wait until the clock when your computer turns 24. Like that's the next time it's going to run the maintenance task. So it will run every minute, right? Yeah. Yeah. Okay. Oh, I see what you're saying. So we've got to wait here. Okay. So it's doing some work in this one or it did some work in that one. Is it very slow or something? No. Well, let's go see. This one, I think, let's go look at this and see if we can see evidence that it did something. Ah, yeah. So where was our watch? Here was our watch. No, no, no. Can you like go to that for a dot get folder in that cache and, you know, just look into all the, yeah, all the files, you know, dot get. Can you like go into them? Yeah. Okay. Down here when you go into objects, right? I think, like, do you have a tree command like to see everything in a tree view? Like that? No. LS tree? Like, so you're looking for a recursive listing or? Yeah, yeah, yeah. Let's see. LS minus big R, I think does it. Like that? Yeah. Like, can you do it in the dot get like directory, like the main directory? Uh-huh. Yeah. So there we would be finding our prefetch. Like, okay, it's not completely showing the thing. I think it's only showing directory, right? We need to, I won't like, can you see the files as well? So is that what you were looking for? Okay. Is there anything in the pack file like the objects and then pack file, you know, I think this. So it looks like this one is empty. Let's go back here and, and let's check to see if it's got something else to tell us. So let's grab, here we go. So we've got some more that are making progress. This one has been processed and I need to get that extra text just a minute. I was in the wrong directory. Okay. Oh, no, there's no dot did in this directory. Okay. So it says it processed something and, but the directory it was operating on was empty. So there was nothing to do. Oh, can you see any other, you know, cache just in case? Sure. Hang on. But it looks like it's only operating for right now on the TMP suffix directory names. And as far as I know, they're all empty. Yeah. So none of them have a dot get directory in them. Okay. Now I could remove those TMP directories. They're empty. Hmm. Like that. And can we now check it? These would have it, right? They should. Yes, these all should have content. So let's Oh, yeah. Okay. Yeah, they all look like they've got content. So now, now we want to do let's whoops. Okay. So here it is gathering the logs gathering. Okay. So let's clear that log because it was only doing the TMPs. Oh, we'll have to wait and no one and no. So, okay. So this shows this is telling you with the terminate button that it's actually running. Oh, yeah. If you click on the terminate, it'll stop running. Okay. So let's try the stop and let's just do GC. Okay. Or is that okay? You're okay if we try just a garbage collection? Yeah. But I think I have, I realize there's a bug right now. Okay. Because I think I didn't clear the queue when I do click on the terminate button. So I think the previous question would be in the Okay. Well, we'll see. This should tell us something, right? Yeah. Okay. So we're at 29. So we wait till 30. And Rishabh, you're welcome to disconnect. You don't have to continue with this. We're just we're experimenting now. You probably have work to do and an employer that needs your attention, etc. I will disconnect in some time. Okay. So when you clear the schedule there, do you need to de-select an individual task? Because when you're clearing, so if you just want to choose one, you will have to de-select. Oh, right. I see. So it wasn't enough to clear the schedule. I really needed to say, hey, blank this. And you'll have to click the save button as well. Right. Right. That makes sense. I can improve the UI. That's just an initial version. So if I de-select a task, the schedule should also should also be removed, right? I don't need to de-select and remove this schedule as well, right? So I would assume that if I de-select, it will no longer be active, but I don't want to actually lose the schedule. Do I? I would think I want to keep it. Yeah, it would be saved internally, but it is disabled right now. If you take it, like check it, it would run. Okay. So I'm going to and are we at a point where I could say terminate or, all right, here we go. So now why is it locking those temp directories again? Oh, because they're back. Oh, that's great. Okay. And is it because of the logic of getting all the caches on the Jenkins controller? I don't know why it's using a temp directory, but I assume there's some logic behind it. I just don't know what that logic might be. I haven't looked. I don't remember. Okay. I mean, if I think if I go into that directory and do a git status, it will tell me there's not a repository there. Whereas if I go to this one, there is a repository there. So are we creating some kind of temp whenever I'm trying to read the caches? Something like that. And that I don't know. I'm not sure what's causing it to be created, but something is causing it to be created. It could just be the branch source. Branch source is periodically generating that thing. It could be pipeline that's doing it. There could be lots of things that are creating it. Oh, so then I'll have to again look into, you know, not using the temp directory or something like that. Well, I would say just go ahead and run your action. If the directory is empty, I would assume the action will fail. You try to do maintenance on something that's not got anything in it, and it won't find any work to do. Because on my computer, on my machine or the running, I didn't find any temp source. Oh, interesting. Okay, so this is a well garbage collected. And this is from March 12. We're now in June, right? Yeah. Why would that be from that long ago when this thing I thought was reset long ago? So Ruchakesh, oh, okay, we've got no, it's still processing the temp directories. Can you tell me? Well, and look at what it's doing. It's doing a maintenance run. Now, okay, I have to ask a different question. I thought that command line git on Debian 11 did not have, what did our table tell us? Did it tell us that there was, Debian 11, oops, wrong one. Sorry. Okay, Debian 11 has the git maintenance command but cannot do prefetch. Okay, so it can run git maintenance, but what is this running? This is running loose objects. So this is the issue because I told you, right, I didn't clear the maintenance queue when I click the dominate button. So that's why even though we didn't configure the loose objects, it's getting executed. Okay. Yeah, I'll have to fix that. Well, and let's take a look at this. So if I do that command inside, oh, no, wrong one. Where was it? It was, is it this one? No, no. Ruchakesh, where did it, was it in the maintenance folder? Yeah, and then just scroll a bit. There it is. Okay, thank you. All right, thanks very much. Okay, so if I put in here, instead of maintenance minus, minus help, if I do this, maintenance run task equals loose objects. Well, and let's, let's try it and see, because this isn't very expensive to try it. And considering how small that repository is, it shouldn't be too terribly harmful. And we just blown it, right? So I think there wouldn't be any loose objects as well. There shouldn't be, right? Yeah. Okay, so it says on 2.17 that get maintenance is not a get command. Good. Now if we look at Debian testing, this one says get maintenance run task equals loose objects. And it succeeded. Yeah. Okay, now what about Debian 11? Because that's where the controller is running. It succeeded. Yes. Okay, good. So the controller should be able to do this. So it should be able to run a get maintenance run task loose objects. Now in this particular repository, there'll be no loose objects, right? So it should be very fast. So this one is going to 20. This one is going to 20. Yeah, good. So we're seeing, we're seeing, I think, the results we hoped for in that job. Now I don't know if this log has more things to tell us. It's doing commit graph and iterating over the temp or temp folders still. So Hushikesh, are you comfortable that this gives you a way to continue exploring and to see things on this computer? Oh, yeah. This is the same computer, right? It is. This is Mark PC2. Yes. Okay. Yeah. I think this would be more beneficial for me. I can check it out. All right. And I apologize. I really do need to get some sleep now. Yeah, fine. Yeah, sure. Sorry, my bad. All right. Oh, no, thanks very much. Thank you. Thank you. And it will be tomorrow before this is done processing. And I'll upload the recording when it is. Yeah, thank you.