I'm Mark Waite. We're recording, this is a Google Summer of Code office hours session for the Jenkins Git plug-ins. Thanks very much for being here. What we'll start with is, we want the bulk of this session to be question and answer. We want it to, you ask a question, I'll give an answer, or I'll declare that I don't know the answer, and that's okay too. But we'll do mostly question and answer. Before we get to the question and answer, what we'll do is we will first, each of us will introduce themselves, where are you from, name, et cetera, where you are at in school, those things so that we get to know each other. Then I will do a brief overview of the two project ideas. Those are not the only things that could be project plans, but those are the two that I had in mind. Then we can talk about questions that you have. Let's go first. I'm Mark Waite. I am, let's see, a Jenkins contributor. I maintain the Git plug-in and the Git client plug-in and have done so for a number of years, so you understand my sort of biases.  And they did, and so I became a maintainer, and as I kept maintaining, they sort of faded into the background to do other things, till it became that I was the primary maintainer. And yes, I'm still fixated on tests. I still carry very deeply about not breaking things, and that means that I will bias towards actually not taking changes rather than taking changes that don't have tests. If a change is proposed and it has no tests, I'm very likely, unless it's a very compelling change, I'm unlikely to write the tests myself because I expect an author to write the tests as part of their exercise of writing. I've spent some years in programming, but I spent about 20, 25 years managing, so I'm also imperfect and still learning about programming. So don't be surprised if you learn something, and I learned something in the interaction. It's perfectly fine. We've shaken our heads. I've shaken my head personally and dismayed with some things that, for instance, Rishabh had submitted something, and I realized, oh, this is a longtime bug that I had left in the tests that I had not fixed, and it's really embarrassing, but I'm going to be embarrassed and just admit I made a mistake. So let's go ahead. Why don't we have Rishabh, do you want to introduce yourself next? Uh-oh. Your video's off and I don't have a microphone for you, so well, so let's go. And I don't know how to pronounce your names. Yash. Yeah, you're right. You're correct. Yeah. Go ahead. Could you do the next, please? So, my name is Yash Jain, and currently I'm pursuing my master's at St. Diego State University, and I'm from India, but currently I'm in St. Diego, U.S., so usually I got asked, why did I decide to pursue master's? So I was looking to increase my knowledge set, so yeah, I came here to get a new different set of new challenges, and yeah, I mean, it's been good till now, it's been six months for me in the U.S. right now, so yeah, I've got a lot of new challenges that I hadn't faced back in India. That was like six months of a complete rollercoaster, I would say, for me. So yeah, that's all about me. Thank you, Yash. Thanks very much, and that's great. I understand the weather in San Diego is pretty much perfect all the time. I have colleagues who live in San Diego, and it's spectacular. Good choice, excellent location. Yeah. Sumit, would you like to introduce yourself? Yeah, so I'm Sumit. I'm currently pursuing bachelor's in control engineering in New Delhi, so like my degree is in control engineering, but I realized my interest was in computer programming, so I took a lot of electives and I will try to build my path towards computer programming and did internships and so slowly, slowly I think I've been able to make that shift. I have started contributing to Jenkins since I think December. A few of my changes were in Jenkins core mostly, so and I love the community so far. The community is absolutely amazing. Everybody is so welcoming, and I really liked your story about how you started contributing. It was really nice. Love it. Excellent, thank you. Well, so you and I have a shared history in one part then. My degree is actually in mechanical engineering, and as I was graduating from the university recruiting, I had to tell the recruiter I had no desire to do mechanical engineering. I wanted to play with computers for the rest of my life, and it turned out that that company wanted someone who wanted to play with computers with a degree in mechanical engineering, so a degree in control engineering is a good choice. There are lots of places we do software. Rishabh, do you want to go next? Hey, yeah. What is happening? I'm sorry, I left the meeting because of the internet connection issue. So we're doing introductions. We're doing introductions. Tell us your name, tell us your background, where you are in school, where you're physically located, and some of your interests. So I'm Rishabh Boudhalia, and I've been studying computer science engineering. Basically, it's a dual degree, computer science engineering and MBA, a five-year course in Thapur Institute of Engineering and Technology. It's in Patiala, India. Right now, I'm based in Noida, where I just completed my internship recently in a big data analytics company. So my interests. So I started open source contribution at the company where I was interning. I was not aware about open source contribution. I always thought that whatever contributions we made was either a client request for the company or for the benefit of the company's software. But as one of the mentors I had in the company motivated me to one of the features we had in-house to contribute it to the open source software we are using as well. So that is really the moment where I started to understand the benefit, how the the way I code it, it changed drastically because I kind of learned how the open source community helps you to improve the way you code and the style of code being everything. So that was the point I started open source contribution. In February, I started contributing to Jenkins in the Git Plugin and Git Client Plugin. I started associating with you and I have been working and I've been really impressed with the Jenkins community in the way they've been teaching me, the way you've been helping me and contributing to this company. Yeah. Great. Thank you. Thanks very much. All right. So I think the next topic then should be let's do a quick review of the project ideas. There are two and I'm going to share my screen for this because I think it may help us just to remind me and remind everybody, okay, here are the things that we had in mind. So let me find Google Summer of Code and I'll bring it on to my screen and then share my screen. While I'm getting that brought up, one of the reminders that Oleg Nanashov suggested to me was to remind that be sure that all student submissions make sure that they have used all of this, provide all the sections that are mandated by the Google Summer of Code outline. Be sure you're very careful as you're preparing your proposals and Rishabh, I haven't read, reviewed your proposal yet to look for that specifically, but I will be looking for it specifically within the next one or two days. But be sure it includes all the sections because they expect every section is there, that you've read the details and that you've followed the description rigorously. So don't miss the opportunity to use those hints. And as a reviewer, this is my first year doing being a mentor. So I will tend to make mistakes as well. So you'll have to watch for yourself to assure that your proposal is in as good a condition as possible as you're getting it ready. Okay. So although I did follow the guideline, but I will check the proposal. Yeah, excellent. And that's, that's, that's what I would hope that's, that's great to hear. So I'm going to share my screen now. And here we go. Okay, so the two, the two project ideas that I had offered were get plug-in performance improvements and get repository caching on agents. Let's look at plug-in performance improvements first. So here the idea is that the, the get plugin has, or the get client plugin has two implementations inside of it. One that uses command line get and one that uses a Java based implementation of get command line get must be invoked from Java by forking a new process, by creating a new process, starting that process, communicating with that process and getting its information back. And on windows, especially there have been times in the past at least where that the cost of starting a process and running it has been quite a bit higher than the cost of starting and running a process on Linux. So my thought was there may be real benefits just to on some of the things where the, the cost of the call to the command line get is overshadowed by the cost of starting the process. J get might be faster. And so the idea was take the Java micro benchmark harness and use it to test comparing the command line get implementation and the J get implementation. Now, in addition to that, there's one big glaring known issue, which is that we've got a case where we do two fetch calls when it should be sufficient to do one call to get fetch. And so that was, that was the first example, but this is not quite micro benchmarking. This is just there's an optimization thing that needs to be done here. And then the, the, the other talks about performance comparison using, using JMH and some quick start ideas, some newbie friendly issues that are available and who we are. So before we do any questions, I wanted to, well, maybe the best is do we want to, are there questions on this one specifically that you'd like to ask and we should discuss before we go to the next set of questions? I actually, I have some questions, but they are related to the proposal I've proposed solutions and the implementations. Would you like to discuss that right now? But I think it's going to be a, I don't know, maybe a 10 minute or maybe a 15 minute discussion. So I don't want to overshadow other people. So that's a fair question. I think I would like to get to your questions, your shop, but I would offer rather, let's, let's look at high level before we talk about specific details. We will get to your questions. Absolutely. I think that's the right thing to do for this session. But implementation details. I wasn't sure we should do here before I review the other one. Okay. Sure. Okay. So Yash, no questions from you in terms of, of this particular topic? No. Okay. Yeah. Okay. Great. All right. Well, so then, then let me do the next overview and then we'll, then we'll do open questions on both of them. So get repository caching on agents is, is looking at the, the realization that a single workspace on a Jenkins agent is probably mostly a copy of other workspaces that are on the same agent, particularly multi branch plugins, for instance, where we use a multi branch plugin to test the, or the multi branch jobs to test the Jenkins get plugin. So the master branch, the stable, stable 3.x branch and every pull request are all derived from the same basic repository and cloning that full copy of the repository for every workspace seems like it's wasteful. And there are things that we might do to avoid a full clone of every, every time we need it, because there are probably existing copies of that repository somewhere on that disk already that we could use as a reference repository. And when get uses a reference repository, a reference repository allows the local copy to be updated from local objects instead of always copying the objects over the network from the remote. So there's a pull request that was proposed a few years ago, pull request 502, which offers one, one variant of this, but I think there are several different ways this could be, this could be done, it could be done by, for instance, following, following a technique where we cash things always to the local agent in some central cash, in some central cash. It could be done by looking on the local agent for through an index of repositories that are in workspaces, trying to find an existing workspace. There are several different ways this one could be done, where your, your ideas are welcomed and encouraged. All right, so we've finished the, we've finished the introductions. Now I would propose, let's go with questions on the, on the projects or questions on your, your questions. Yes, would you like to go first? Yes, sure. And I'm going to stop sharing so that we can see each other. Go ahead, Yash. So going through and doing a bit of analysis on the code base and checking out the mercurial plugin. So what I see over there has been done is using a master cash on the master agent and using that as a mechanism to update all the local copies. Okay, so I was, I was thinking if we have a reference repository, like the clone feature, would, would there be overlap on both of these? If we like, would there, would there be a sort of overlap between these two functionalities of using reference, the reference repository in advanced clone behavior and using having this functionality as well? Well, so do you see any overlap happening? There certainly is overlap potential and that's, those are two very good concepts. So the mercurial plugin, I love its, its concept. The person who wrote it is brilliant. Jesse Glick's work on it is, is absolutely brilliant. So what, what the concept that came to me was if, if we, if we use the cash on the master and copied to the agent, the agent and the master distance is probably much shorter, they're probably much nearer than the agent to the get repository, right, than to the central get repo. So there's benefit there. However, the, the copy from master to agent is probably still not, not as fast as copy on the local disc of the agent. So the thought I had was, okay, we might use copy from master to agent as, as the beginning, prime it, prime the cash by going from master to agent. We then got to ask the remote repository, okay, give me the real objects and that will, that will populate them. So that would be one approach would be master to agent and then go ask the remote repository to give us the latest objects. So that, so in case if we have like 15 jobs on this, on the same machine, then we'll be requesting like 15 different, different remote requests would be going into the, into our remote repo. Instead, I was, I was more keen on going to the mouse, how the material have done it using like taking, updating the master first, like, if, if you see a request that, that is making a, that is making a, that is making, that has changes and needs a copy, new copy. So it would update the master cash first, then use the local update the local cash parallely and then use it from there. So then all the, all the local, all the local agents that have the, that cash would have been updated. So the rest of the 14 jobs can use that cash instead of making another request. So, so I was wondering if there would be any concurrency issues hidden behind that I'm not able to visualize or maybe like on, think upon. I like the way you're thinking. So that's, let me see if I can say it back to you to be sure that I've understood it. So I think your, your vision was if there are many jobs running on an agent, they would each make a request to the central cash, to the master saying, I want this repository. They know they, and they would tell the master, I want this repository that is this location, but they're actually asking the master. The master then performs the request to the, the actual remote repository and then delivers the, to the many requesters that are out. Yeah, that, that seems, that seems viable. You would then have a single reader from the master to the remote repository that populates the cash on the master and many, many readers to the agents. And, and since there's only one real repository, master repository off on GitHub or Bitbucket, that seems like a very reasonable way to, to consider approaching it. But I was just hoping that this doesn't break the underlying architecture because if we see how the reference, reference repository has been used, like in the existing advanced clone behavior, we already have a functionality of giving reference repository on every, on every agent. So I was hoping it doesn't break this or somewhere it might break it or it would be an overlap maybe somewhere. I, I don't think it would break it because the reference repository concept is built right into Git. And so Git itself does, does those reference repositories. We're just using a facility that Git already has. Now it may not, it may not give you the maximum disk savings or the maximum data transfer savings. If you don't use a reference repository on the agent. So, so the, the, the one to one to many that you, you described where Git repository to master was one, one chain of, of requests, and then many requests to the agent will tend to copy all of the objects many times to the agent. You could consider one to one to one to many, where you say, I'm going to go from master, from Git repository to master one request, master to agent, cash repository, one request, and then, then spread that use, have those agent jobs, use a reference repository on the agent. Yeah, yeah. But, and that then is using what that's doing is that's even further minimizing the, the amount of data stored on the local agent, and the amount of network traffic between the master and the agent. Now, I don't know if I don't know what point we'd, you'd say, wow, that's, that's too complicated. I'm not going to bother with something that complicated, because there, you're, you're concerned about concurrency issues is a valid concern. PR 502, one of its blocking points was that when I did interactive testing with it, it had concurrency issues that I did not know how to solve. All I saw was I saw that it had concurrency problems and those concurrency problems were serious enough that I would not release it to production. And that was just me and I'm, I'm, okay, I know how to stress the thing, but I am certainly not a thousand people using it. I, I was just one person running a set of tests. And I was able to show concurrency problems in that PR, just by my testing. So I was wondering if, like, what would be a good proposal? Because laying out this architecture of having one to hear, like, from remote to master to master to agent, then agent to other, agent to other job instances and other agents on the parallel running on the, running on the level of that particular agent. So giving out the architecture, giving out the architecture or writing some template code, like code, like using some sort of coding mechanism to display what you're trying to achieve. So for me, architecturally, this one might fit with the, the Git plugin has a way of checking for, checking for updates on the, on the, the central repository on the GitHub or BitBucket repository. It uses Git LS remote, remote naturally as its technique to check it or it will check with a local workspace. That method call might be exact because, and that thing happens on the master, not on the agents. So that method call might be the exact place to start with a small prototype that says, if I detect a change, I'm going to pull that change into a local cache on the master. That, that might be one, one approach to say, okay, Git LS remote is the command and find the places where Git LS remote is called, where it's, where a remote list is done. The other matching architectural concept is that multi branch pipeline in the Git plugin already has a concept of caches on the master. And so between LS remote and caches on the master that are already there, it may be that you'd say, okay, every time the master asks LS remote, it should consider, does it need to pull down more, more change, pull down the recent, recent changes instead of just doing an LS remote. That might be one approach say, okay, somebody pulled the remote and odd changes were detected, bring them in. Yeah. So we need to, then we'd need to communicate that change right now that we don't have the agent level. Or because the jobs are defined centrally at the mat, because the master invokes all of the tasks on agents, I would suspect what you would want to do is consider asking or knowing where the caches are on the master and telling the agent, ask this location on the master for a clone first. So when, when you're about to, when the, when the master is about to send a request to the agent, which says go perform this fetch. The first thing would be go perform this fetch, but instead of fetching from the actual central repository, fetch from the master. I had in my mind was, yeah, using the, like, how do we decide since if a master has a initial copy that was made as a shallow, shallow fetch. So would that be, would that cause any issue or down the line? So the master caches, the master caches, if we would want to safety check that the master caches are in fact full copies, right? Because we don't want a narrow ref spec. We don't want a shallow clone it's not a checkout. So we don't have to work about sparse checkout, but it should, if it's, if it's shallow, then one of the actions should probably be deep in it, right? Switch it from being shallow to not shallow. And if it's, if it's using a narrow ref spec, we probably should on the master admit where you're going to widen the ref spec, even if the user specified a narrow ref spec. Okay. So another output that I had in my mind was to make a, make a bare repository on a given location or a location given by the user that would be used as a single source of references for any, any operation to be performed instead, like that would be, that wouldn't have that would override the sparse checkout, shallow copy, whatever the user had requested, and that would clone the complete repository on the, on the master at a particular given location by the user and all the agents and everybody would know that this would always be the single point of source where they can pull to get the updates instead of having it modules, having it defined, having it randomly or maybe generated somewhere on the workspace directly of the, of the master. And that's, that's certainly also, however, I believe, and I could be wrong on this because the, that, that section of the code was actually implemented by Stephen Connolly with inputs from Jesse Glick. So I'm not as fluent in the, in the multi branch code as I'd like to be, but my, I think what you're describing is only a slight variation on the caches that are already in the get plugin from on the, sitting on the master. So all you're doing, what you just described would be just be changing the storage location of those caches that are already there. So I'm not sure that that'll give you the gain that you're hoping for. It's just altering, what's the name of the cache directory? It's because I had this in mind to avoid the shallow and check out, but okay. Yeah. Right. And, and, and that, that's your, your point is valid. And you may want to put that into the plan saying, Hey, the, the intent is safety check that the cached copies are not shallow and not, not, let's see, not shallow, not narrow ref spec.  You may have to then say, I've got to create a new cache concept. I've got to have a new cache on the master, which is not under user control. They don't get to narrow the ref spec. They don't get to make it shallow. And, and then your idea of, ask the user, where shall I put it? You could also on the, alternatively just say, I'm going to create a new one, a new cache, give it a new directory name on the Jenkins master. Yeah. So we have a one level of check over here. That first makes a check. If we have a narrow, narrow respect or something. And, oh, so then it's in, even then that would be that. Okay. Rishabh. I have a question related to the discussion. When you said, Mark, that we could have a different cache, which the user doesn't know about, wouldn't that create problems for the users who have large repositories? Because the cache would be growing bigger and they would not know what is occupying their disk space. And if you're not able to maintain it, I am not sure how we maintain our cache, but if you're not, if you're not maintaining it optimally, then it would probably be an issue of over exercising of disk space for the user. Or is that, is that a wrong assumption? No, your assumption is valid. It's actually, it certainly is a valid concern.  And that, that's an accepted, accepted reality. Now, if, if let's take the example I had with a private employer, where we didn't, we didn't like it.  And a 20 gigabyte Git repository mattered a lot where we put that thing, right? It was, and, and we, we had to make sure we never, never cloned at anything other than shallow. We never did anything but use a narrow ref spec. And, and it created all sorts of limitations on us for disk space. So yes, we do have to be aware that as an example, the, the testing, the test, the base test repository for the, the repository caching should probably be the Linux kernel. It's an excellent choice. And it starts at a gigabyte. That's, that's, and it's got great history. You figure Linus when he created Git, created it so he could do Git work, so he could do kernel work. And therefore the history in the Linux kernel, and it's got one of the highest volumes of change of any project anywhere in the world. So the, the Linux kernel is the poster child of a big, big repositories with lots and lots of commits. And so yes, it's an excellent choice. And it reminds us that it's not unreasonable to have a one or two gigabyte repository that is maintained by people who are very serious about using Git. Now the 20 gig repository that I had, we were, we were actually not serious about using Git. We had people who are checking large binaries into it, but Linus does not typically check large binaries into that repository. The Linux kernel is big just because it's got a lot of changes. Okay. So I would like to share my screen to discuss the implementation I want to. Is that okay with everyone? Yes, please. Go ahead. So the first thing I would like to discuss, oh, one second. I'm not sure why it's hanging. Yeah. So the first question is that what if tried with benchmarking is that I want to give it as an option, as an additional behavior to the Git plugin user. And the rationale behind this decision is that Git plugin and Git client, they both have a very broad audience. And whatever performance changes we're doing because of the study, because of the tests we'll have, performance tests we'll have, I don't want, possibly we cannot create test cases for every end of use case the users will have because, of course, because we have a broad audience. So what I thought was that initially we could have it as an additional behavior. And here I've created an implementation and there's this prototype. And after maybe a release or two, once we know that from the user feedback that what we think is replacing Git with Git CLI Git with JKit is actually giving them a considerable boost in performance, then maybe we could shift it from an additional behavior to something which is happening inside and they don't know about it as a mandatory feature. Although it makes sense that performance improvement should not be a concern for the user, but what I thought was since this is a GSOC project with a person and I am implementing the changes who doesn't have a considerable experience with this plugin, I would I would want to have a safe, it has a safe feature first and then maybe consolidated after having some user feedback. I'm not sure if this is the right approach. You described brilliantly the conservative approach that I've taken. I don't like introducing new features without an escape hatch. There must be a way to get out of the thing if I've made a some mistake in the implementation and with a way to understand this is very good. There are also techniques in the community that kind of could allow us to gather data from users if you're interested in that. There are ways to to actually allow us to do telemetry where that they could optionally report back to us for a fixed period on their experience automatically. So your technique is not only good, it's very, very well suited. Okay, so would you I would just briefly explain what how I'm going to implement the addition behavior. So it's going to be and get a get a CM extension a class and implementation which we call performance improvement option. What it will basically do is it will decorate the environment variable the environment global environment variable we'll have basically add one flag of get performance flag Boolean flag. So if a user chooses to enable performance, wherever we have modified the code through the results of our benchmarking study, wherever we have modified the code, we will we will have checks if this flag is true, we'll basically implement the implement our we'll select the implementation which is performing better according to us. And if if the Boolean says no, then we'll we'll we'll use the default code path. So it's basically how every decorate function works. And then I've just showed how I'm just so short four steps how I'm implementing and I'm short when once you review the proposal you'll you'll see the implementation mode. So would you think this is the right way to do it or would you would you have some concerns or criticism regarding this approach? I think this is a fine way to do it. I'm not sure I would use an environment variable because the mere existence of existence of the decorator in this case is already a flag you probably I mean if you look, I believe there are other other decorators available already implemented like wipe workspace or like shallow clone, which they they don't use an environment variable to record the state of the decorator the true or falseness of it, they just use an internal variable. Is there a is there was there something specifically that was motivating you to use the environment variable is that you want it available to the user inside the workspace when they're running the shell or tell me more about the environment variable choice. Okay, I think it was the first thing which came into my mind. I thought this is the easiest thing to do that I would because I I think I thought that this variable will be shared everywhere and I would not have issues where I would of course if I have an internal variable as the easiest thing to do that would be shared everywhere so I wouldn't have that problem but when at the time when I was thinking about the solution, I thought that I can actually environment variable everywhere so wherever I need to create a check to if selectively implement jget or get I would just access the environment variable and for and check the flag. Okay, so it's I see so it's a way of of transmitting that state without making every without making every place that references it aware of the specific extension. Okay, yeah, yeah, yeah, that's and I I'm not sure that that the the code you you insert then will be any less aware of of get performance flag than it is it would be of any of an internal variable so a very a method a field on the class so the the extension could just as easy I mean either way every time you want to ask a question of the extension you're going to have to see is the extension there and so I think I think the overhead for you will be about the same in this case you're storing it in a way that it does have the benefit that inside the shell steps of a pipeline or inside the the the job steps of a freestyle job this environment variable would be available and they could see if if it was changing from using jget to get back and forth so so there is there is some communication with the user benefit by use choosing to use an environment variable I'm not sure that it's I'm not sure that's healthy because we may not want the user to actually know which one we're doing we may want to hide that from them but but oftentimes I've made the mistake of thinking I should hide things from the users and then later coming back and demanding that I make them visible okay so would you recommend using an internal variable instead of using this approach using environment variable I think my personal tendency would have been to use an internal variable inside the decorator instead of an environment variable because I my first thought was toward not towards telling the user about it but rather just being sure the code can get to it easily because because then it's a a getter and a setter on the decorator okay so I can change the implementation of what are you done yeah now now and again this is I don't know that if you've already done testing and already assured you'll you'll you'll get a much better answer during implementation phase than I could offer right now because I'm just offering my guess right you'll that's it so it's this is a plan does not require that you have the code if I understand correctly a pan does not require that you're proposing final code it's rather you're proposing yes this is a proof that you've thought carefully about these steps and you've thought enough to realize oh I could do it this way or this way and it doesn't it doesn't have to be one thing or the other it's that rather here's here are my proposed steps okay okay okay that's that's good okay the second thing I would like to ask is I think I guess once you read the proposal you'll be right because I performed performance benchmarking on git fetched and I'm not sure if the results I'm getting are correct I'm seeing change I've seen I used a 320 md repository for git fetched and I compared ckligit with the jgit and I have seen a one more than one minute difference in execution time is that is that correct is that it is quite believable so so considering the investment that is made in the code that is git that is git and and jgit um the community behind git is dramatically larger than the community behind jgit there's there's just no no no kidding ourselves that they are not very different size communities the community that is behind git includes people who have who have worked on linux file systems and have worked on on at the kernel level for a very long time and therefore they tend to choose things and linus chose things in initial implementation that were in fact very very well tuned to the linux file system so if command line git is dramatically faster than jgit I am not the least surprised particularly on large repositories now if it's the other direction where you find oh on large repositories jgit is significantly faster than command line git that is a very interesting result that I got a wonder oh why what what would motivate that because the people who do work on git are so so committed to fast it's it's very very hard to write a second implementation that's better than than what the git implementers did so I did find one observation which is interesting to me when when I was performing this git fetch so for repository size which are very low I have a 34 kb repository jgit was performing better than git in terms of average execution time and for a 4 mb repository as well I I saw that jgit was performing better than git but then I was since this is kind of an anomalous behavior I wanted to check if this is if this finding is right or not so what I did I was I was a little apprehensive of the fact that since we are user the jmh framework applies jvm bombing before they run the performance benchmark so I was I was a little I had a doubt that if the warm-up session is actually giving jgit this boost of performance so what I did was to check if this to confirm if this was the right behavior I tried a different mode of performance benchmark which is called a cold start performance benchmarking which basically means that I don't warm up the jvm enough I actually don't warm up I just I just start counting the execution time right from the the test I've written the git fetched and I actually found that jgit was then slower when there was no warm up jgit was not faster so then I was a little confused so I could only understand that if the jvm is sufficiently warm up when I'm using jgit then only jgit can perform faster than git under the condition that the repository is maybe below 5 mb or probably in the size of kb or maybe one or two mb I'm not sure I haven't tested it that much but but that is what I found out but if the jvm is not warmed up then jgit is not performing better than git and and I am not sure right now currently how would I get to know if the jvm in the real code how would I get to know if the jvm is warmed I would assume the jvm is warmed up when I reach to the git fetch part so basically I think it's a fair assumption to assume that jgit would perform better than git under a certain size of repository so they would yeah what what you just described is exactly the kind of sensitivity analysis that that I was hoping for in this and and what you described aligns very well with what I what I assumed would be the result because what what what happens in your test was let's see there's a cost to fork a new process the cost to fork a new process is relatively constant and on small repositories it may actually dominate the the cost of the the operation now you used an operation which is a network operation so it introduces the network variability and the network slowdown in addition so so and yet still you saw that the the cost of the fork and the cost of communicating between processes was a significant portion of the total cost up to a certain threshold now for me that may lobby that that we would consider in choosing these tune-ups to to use some form of local estimate of the size of the remote repository and yeah I was also thinking about that I don't know how you would do that local estimate of sizes but there there's it seems like if you've got a local copy somewhere in a cache there's an easy estimate or if you've got you could use heuristics about hey if well yeah you you can imagine all sorts of guesses as to how big is the remote repository to tune which which implementation should I use should I use yeah so that that might be a feature we could implement to actually check the size and then implement the performance it just cannot be just an environment variable check there it has to be more checks to actually enable the implementation which would perform better I think so well then and now you did not mention anything about platform as a variable here and I would assume that platform should be included as one of the variables that you check for sensitivity I agree actually yeah sorry I could check it for I did check it for two platforms it was my macOS my local system and one EC2 machine which was a Linux instance I could not do it in a windows I probably well before I submitted I maybe I'll add one more study I don't think you need to do it even before you submit just put it into your plan that the plan will do it and let me offer two more platforms that you should consider as part of your plan IBM series 390 so IBM mainframe and IBM power pc 64 and maybe a fourth is arm 64 and the reason I'm offering those is they are three different places where the Jenkins platform special interest group is right now looking at them adding adding support so and they have very different characteristics the IBM mainframe is a completely different way of looking at things actually and so this very interesting in terms of oh I'm on a or arm 64 is my raspberry pi and and then its file system has a completely different behavior than the file systems you have on your mac for instance so we won't run Jenkins on a Raspberry Pi I run Jenkins agents on a Raspberry Pi all the time absolutely and how I don't understand why why would you do that oh if I if I need to evaluate tests or code that I'm intending to target to a raspberry pi the best way to do it is run the agent on a Raspberry Pi and and run the test right on the Pi okay okay so I feel like these platforms in my proposal yes I someone someone I know my son actually works for robotics company and they use they use this device a it's a an NVIDIA Jetson which is an embedded device with a GPU on the board and and I can see very much putting a Jenkins agent on this device would you do that oh yeah I fully intend to that one I I haven't hooked that with him but I've got several Raspberry Pies already running okay I didn't know about that okay so one for me as well and but you're on the right track right you're you're doing exactly the right thing and thinking about what are the what are the axes of performance evaluation and what is the sensitivity along that axis and repository size is clearly one the architecture or the the operating system of the computer seems like another one particularly with windows where the the cost to fork a process at least at one time was much higher on windows than it was on Linux okay yeah and I think I have apart from platform and size of repository I have also would the jvm parameters affect the performance of jgrid or that's that's a very good insight they certainly could I had not thought of that and I think that's that's a valid thing to check I know that the cloudv support team has published recommended guidelines based on their experience of what the best jvm settings are for the Jenkins master so jvm parameters is a very good item to evaluate okay I have added that as well okay and the next question I had was okay the git double fetch issue which is one of the performance issues we have known performance issue the fix I provided was basically a flag which kind of avoided the second fetch would you didn't say that you had additional tests to test if that if that solution is not creating any kind of loss of information so would you give me because I've included the solution in this proposal would you give me some more pointers so that I can maybe test the efficiency of the solution more or would you recommend me to look for another solution maybe some kind of an argument matcher which basically a class which matches the argument like we have a clone command initially and then we check if that if we have the same clone command if you have the same clone commands then we would avoid the second patch if that's not the case maybe we do something else I am happy to share the the the things that I created to do my initial testing and it's not completed but my initial the thing I created to do my initial testing was more about me doing interactive testing not doing automated testing I have a strong personal bias towards first explore something interactively and then I'll express it as automation but I'm happy to share the automation the setup that I use to do my interactive testing because it's just a docker image and I'll happily I'll post where that is in the in the Gitter channel so that you've got you can see it you can see how I do it it is it is a public github repository that I use that defines a full and complete Jenkins with a number of interesting jobs in it and some of those jobs are exactly to test for this case and so I can I'll post that in the Gitter channel that's that's a very good one we're saying hey look here are here is this job this job and this job that can can be used as checks for that specific the double fetch okay sure here I'd love to see that docker image okay I think the last thing I would I would want to ask is I think it's seven that it's about yeah so I also wrote a bench micro benchmark test for for the solution I implemented for this redundant fetch and when so I had two baseline tests where I had one test which had a narrow respect and then I tested gift get I I had to get fetch basically I had to get fetches in that in that test and and one with narrow respect one with wider respect so and after that I removed one get fetch to basically show that if we just have one get fetched with a narrow respect and with a wide respect and then compare those four tests to see if there's there's a reasonable increase in the performance when we remove one get fetched so what I found out was that for the for three of the repositories I chose which are which are basically the order of size for kb for mb and then I think the last one is 40 mb or 50 mb for those three repositories when I when I used when I removed the the the second get fetched there was always there was the time the execution time was it reduced by 50% all the most and I so I was I was a little apprehensive with that would it would that actually happen because initially when I was looking at the issue I thought okay if I just remove one get fetch I would have I would improve the performance in the order twice basically in the order of but I don't understand is this correct I correct correct is correct is a hard thing to say but is it what you observed yes is it believable to me yes so yeah but okay one thing I did notice as well was for for the large repository of the order of 324 mb the test did not give me a very remarkable difference between all the four tests they did not give me a remarkable difference which was a little confusing to me because it should I think this should not depend on the size of repository if I'm removing one get fetched oh no no it very much it does depend on the size of the repository it is it does it should anyway so so I'm not sure I'm reading your graph correctly so on the graph is it that the is the group of four bars maybe zoom closer so I can see what the the axi or just describe it you don't have to zoom in even just just go ahead and describe yeah so the bars are basically the repositories I used okay so so so and and each of the groupings is whether there is a redundant fetch or not yeah the first two tests include double factors and the last two tests they they don't have the redundant fetch wait a sec okay so it's so the the top most the top most rows are without the double fetch and the bottom most rows are with the double no I'll give an example so for the first test which is known as a benchmark baseline with narrow depth spec it has both the git fetches and for the first repository which was of 4kd the execution type was 79 mb for operation the average and for for the scene for the same thing when I when I honor that spec and I used a narrow spec for that and I have I have removed one git fetch I have redundant I've removed the redundant git fetch I I saw the average execution time to be 162 milliseconds per operation okay so I think I am confused myself here it's the I think it's the reverse it's the reverse yes those the first two tests they don't have the the second git fetch they just have one git fetch command and the last two tests they have both the git fetch command that is what is happening because of course the time is increased so both of those tests would have both git fetches got it okay so and and so what that the way I'm interpreting the data is that the top most group of four and the second most group of four are probably both without a redundant fetch where and then the next group of four and the bottom most group of four is are both with a redundant fetch yeah okay and and I'm I can't I am I would have expected the results that are shown for the tiny small and medium sized repositories let's call those the the dark blue less blue a little bit less blue but not the green one those those results those seem expected but of course they're their sizes of repositories that aren't aren't the example for this particular right 40 megabyte repository okay that's getting interesting and I can't explain why the the removal of the redundant fetches did not dramatically improve the oh no no wait a sec I sure can yes right of course because maybe let's let's let's try this let's let's discuss so fetching a 40 a 40 megabyte repository is probably dominated by data transfer on the first fetch by data transfer of the objects right it's getting 40 megabytes of data so it may be that we need to have you tune this this benchmark to say because most fetches into Jenkins get get workspaces are not the first populated this is the this is the populated case right this is yes starting from an empty directory fill it up and and that is a that is an interesting case but it's not the 90 percent case 90 percent of the cases or 50 percent at least are okay incrementally bringing new changes into an existing workspace okay and so this is and so that may be something you need to consider in your in your proposal is add the additional attribute of first fetch versus update an existing existing workspace okay sure sure I'll do that I'll change that okay great yeah so I think this is the questions I had thank you for all right well thank you we have we have run out of time Sumit I didn't ask you for any questions are there any questions you wanted to ask Sumit before we close actually I was just an observer because I have another project that I'm right now focusing on but you know and just gathering knowledge because who knows something this might click for me so great all right well thanks everyone I'm going to end the recording I will upload the recording to the Jenkins YouTube channel and post a link to that recording to the Gitter chat thanks very very much thank you thank you I'll get in there you too bye bye


With Haiti having been taken over by gangs and roaming bands of cannibals, I wanted to take you all back to a time when Trump sent the entire media into hysteric fits of outrage. By simply asking the question, why are we taking all of these immigrants from so-called shithole countries like Haiti? When talk turned to Haiti and countries in Africa at that meeting, he apparently said, this is a quote, why are we having all these people from shithole countries come here? Oh my god! Oh no! We offered Haitians their own version of Make America Great Again hats. It's a hat that says, Haiti is great already. We offered it to them and they were quite happy to have it. A human! The president of the United States is racist. You get what I'm saying? I'm saying I'm a racist? Are you getting that parts? I don't think, I think he was taken out of context, I'm not sure. How many examples do you need of this? It just shows that, you know, the president has racist views. But the president seems to harbor racist feelings about people of color. What is he even talking about? Trump never even brought race up. But as we well know, this is their typical strategy for silencing dissent, which we now know was true. If this is not a president in the early stages of dementia, uninformed, uneducated, ignorant response. Plenty of others have something to say about Donald Trump's crude remarks about immigrants. But some suggesting parents hit the mute button if children are watching too. Jesus. The White House has not denied these words. In fact, here's what a deputy White House press secretary said. Certain Washington politicians choose to fight for foreign countries, but President Trump will always fight for the American people. No, no, no, no, no, no, no. I mean this was disgraceful, it was disturbing, it was vulgar, it was alarming in every way. Well it was also true, and Trump was right. I'm a proud shithole. The president is growing this country on the backbone of bigotry that comes from when I saw my family called spicks, wops and mackerel eaters, slan eyes, spicks and wet backs. He offered an alternative. He thinks the United States should instead bring more people from countries like Norway. Oh my god! Again, it's so strange because Trump never said anything about race, much less used any slur whatsoever. Unlike this apparent CNN racial slur expert who listed off most of them, and as we all know by now, that's what this is all about. Shutting down questions by calling the people asking them racist monsters. Trump's questions had nothing to do with race, and everything to do with the stability of those countries. Since Biden took over and got rid of all the protections that Trump put in, there's been over 8 million people to illegally enter the country. From all over, including Iran and China. Which dwarfs our all-time Norwegian population, which is around 4.5 million. Trump says things brashly and off the top of his head, which actually cuts through the BS, unlike the Democrats in the left, who hide the truth in deceptive Orwellian language. Trump was right, but they just cannot allow reality to stop their plans to swell this country with dependence. Who will count on the Democrats to get what they need and therefore be dependable voters. Thereby giving Democrats permanent control. An unrelenting stream of immigration. Non-stop. Fewer than 50% of the people in America, from then and on, will be white European stuff. White people will be replaced as the majority of the people in the country. That's not racist to say that, just a fact. The question becomes, why are you so upset about that? The census that just came out especially drives home the point that Texas is next. It's a state where the demographics are changing in ways that are favorable to the Democratic Party. Demographic changes that help the Democrats. Democrats for a decade now, along with Arizona and Texas, have had on this sort of long-term project of trying to take some red states across the Sun Belt and flip them blue as demographic changes are taking place. Alright folks, that's all I have for that one. Let me know what you think in the comments. If you're still here, might as well hit that like button, which really helps this channel. Thanks a lot for watching and make sure to keep checking back for more. Thank you.


Oh, yeah, get you a sleeping bag. Yeah, I got a little high right here. Just got to get my sleeping bag. I think you need a light. Oh, yeah. Welcome back to the Lake Forge Channel, everybody. Oh, man. We have some beautiful conditions right now, but a cold front on the way. I have a special video for you, my fishing freaks. And for all you general outdoorsmen, we're combining some great things today. Today's Bass Venture is what we're calling it, is brought to you by the longtime partner of the channel, Mystery Tackle Box. For all you newbies to the channel that haven't heard me talk about Mystery Tackle Box, it is a subscription-based service that sends you Primo Tackle to your doorstep every month. All you have to do is sign up for the subscription and let the lures fly in. Use the code MONDO down below. That is MONDO. You know it. You hear it a lot on this channel. And you can get your first box for as low as five bucks. Mystery Tackle Box is the perfect solution if you're not quite sure what to throw that month. They've been around for so long now. They've got it dialed each month sending you lures that are going to work in that particular weather situation for the typical almanac of weather conditions that month. I mean, not the part about the almanac, but you get the idea. You can watch this channel. You can learn the specific techniques to use every month, and you can dial it in with MTB as well. So sign up if you want to get hooked up. Y'all, link is down in the description. And I will be taking this box out with me into the wilderness. Me, myself. Me and myself. That's two peeps. Myself, the man, the miss, the mullet, the mullet man, and Dr. Andrew Fleer, Doctor of the Wilderness Eating Habits. Just gave him that title. He loves to eat things out in the woods though. Two perfect companions to go out into the wilderness with. We're going to be out on a river adventure, y'all. There's some bass out there. There's some other species of fish, so it's going to be primitive camping style. Hopefully find something to eat out there and just have a good time catching fish and enjoy the great outdoors. Let's talk about some gear. On my person, I'm going to be carrying a hammock to camp out in, a sleeping bag, and then just a rucksack. I'm taking my free range bag, and then I'm stuffing that with my mystery taco box. Can't really fit my rods in there, but you know what I'm saying. Some extra clothes because the cold front is coming in. Some blades, some tools. You know guys, I'm always packing a belt knife. Belt knife is essential. Carrying a morna today. Carrying a machete to chop down anything for making other firewood. And a few fire starting cooking essentials. That's it. Minimalistic. I've been getting all geared up for truck camping and going on some big adventure fishing trips for the spring and the summer, but this is going to be kind of dialed back. Let's go meet up with the boys and get our danglers and our anglers ready. Walk around the farm and who do we find? The man. The myth. The mullet. Out on his party tune right here. It is really clear out here on your pond. When's the last party you had on this party tune? Man, like 1995. Back when Run DMC was hot. I brought you a special, special gift, man.  I kept them in my cooler for about a week. They're still on ice. So they're fairly, fairly in good condition, but I'm sure these mullet man turtles, visiviraceous turtles are going to love it. Big old bass. That's the big one there. So apparently there are some big bass in here from Eons ago. A big old bass would like to just eat that. Oh, look how clear that is. They're schooling. You can see them swimming down there on the bottom. Look at them gliding down. It's a glide bait. That's a pretty nice white bass. Dude, look at that bass coming up to it. I'm dead serious. Look at the bass right there. Where? Oh yeah. See it behind me? That's a three pounder. That's a three pounder. There's another two pounder coming in. Dude, let's get some scraps. Let's get some other scraps. We're going to eat it. There's a two pounder and a three pounder that came in. There's usually a big one under this. Dude, just toss that thing out there. Let that little glider go down. Tasty croppy meat. Kind of staying back. I don't know about that mullet.  They smelt the crappies. They saw the glitter. They came over. They said no. I ain't got nothing to do with that mullet. Look at this. Are you dead serious right now? Dude, I want a hand dangling. Are you hand dangling a micro spook in the water? You must be kidding me. Oh man. Look at that reach. That was some extension on that pole. Can't really work it like you want to. You can't really work it like you want to. Yeah, because you don't have a rod. That's fun times. You should put that on. That's postcard worthy right there. Just mic with a hand line. It just says eat good. Eat good. Eat good. Whatever it takes. Flair's taking too long. Oh yeah. Here's the, okay. So we're waiting on Flair. Flair's coming. What are we going to the river for? We got dangling opportunities right here. So while we're waiting on Flair, I'll give you guys a little update on what's going on here. This is right here. That's one of the options for the box. Just gave Mulletman one. He's already giving it a good dangle. We have other options. Look at these. I've got some crank bases. It's going to be good for the river. Good river situation. Wow. Bam. The jig rig. I'm liking this. I'm liking it a lot. Hooked up. What do you got? There you go. There's a fish on it. Man. It's not healthy at all. You need to feed these suckers some bigger crappies. I'm going to try to catch one here on this, on this runt is what it's called. Oh, I just had a bluegill or that's a small bass. Dang you. It's not going well right now. Well, no luck on the dock for me. I had a couple bites. I had one fish on and it got off where I could reach the red record button on the camera. Got me. That YouTube life. Trying to do it. Trying to save some battery. That's what happened. And we got some bad news while we were out there on the dock. There is a massive amount of water that is now gushing out of the above lake of the river that we were going to fish. Too dangerous to take out the airboat. So we've got another river that we're going to go out on. Hopefully there's bass out there. I know this is the time of year where the white bass went up there. So if we got into that, that would be awesome. The man we've been waiting on is here, Flare. I can't show you what's going on over there with him right now because he's got a biker helmet on and oh, he just took it off. Okay, now he's here. There he is. I couldn't show them that over there. I know. It's been so hard to film. I know. Rob showed a little bit of it. Just a peek.  Oh my gosh. It's a muffler. It's bad. You guys will see it eventually at the Google twine channel. All right. At some point Wes will edit that video and it'll be up there. It's going to be a doozy as always. It's a good one. Are you ready? I'm ready. I don't know what I'm ready for. Exactly. And we got John here. He's good. He's along for the adventure as well. I just came from the fields, killing pigs. I'm going dangling now. This video has turned into just, it's crazy.  Just stay tuned and hit the like button so that way we survive. I'm just backing us up. We are loaded down in the cat. Yeah. Have you ever seen a more loaded down kitty cat in your life? I don't even know what the, we're probably over the weight. 100%. Oh, 100%. Look, this is like a cargo plane right now. I've never navigated these waters up here and there's trees everywhere. So I'm going to definitely let Mike take over his own vessel here and I'm just along for the ride. I'm just, I'm here. I can hug Flair if I get scared. Oh, it's a six passenger. We're good. Y'all, you have tuned in to an absolute doozy today. Yes, you have. We're going to make it, folks. We're going to make it. Hopefully we're going to get on some fish. But for sure, we've got grease. We have a means of making a fire. It's going to be okay. We're going to be all right. 100% sure we put the plug in? Yeah. Okay. I hope there's a beaver around. Flair can just skin it out real quick. Make me a better hat. This is a cheap hat right here. It's only 20% beaver. I'd like to get 100% beaver. I don't know, folks. We're sitting amongst right now the most oak trees, every kind of species of trees that have just tipped over and come down the river. That means there's a lot of log jams up in here and there could be some bass up in those log jams. Getting them out. I'm not really prepared for it, but it sure is going to be fun to try. Let's get a little breastplate on and give it a dang. Okay, folks. I have this runt on right here. Look at that. It looks like a peanut. Did you just get thumped? Dude, what? Wow. There's bass in here. There's white bass. There's crappie. There's multiple species to go after. This runt is a sort of a square bill suspending slow sinking. Actually, it's a super, super slow sink. A good little spot right here in the river where a couple of tributaries meet each other.  You're good. Oh, got him. Fish, fish, fish, fish. What's your big large mouth? Big large mouth. Biggie. Dude, crush that runt, dude. Almost got the trolling motor, bro. Dude, that's a big bass. I know. Totally caught me off guard. Oh my gosh. All right. Flare, you got it? No, no. I got like 10 pound test. If that is coming, always going back in the logs. Come here, buddy. Come on now. Come on. Always coming up. Oh yeah. That's a good fish. He has one hook. He has one hook. Go slow play this guy on the light tackle. Light line with a soft. I'm so confused that you were like, yeah, I'm going to go for a crappie real quick. I was going for a one hook. Oh my God. Look at that. Look at that. Look at this. Look at this. I have face. Oh, here we go. Come on, Akinel. You got it. Come on. Yeah. There you go, son. Yeah. Let's see. Oh, son.  Oh my God. Dude, that's a tag. Look at that chunk, dude. God, we're going to keep fishing. That's awesome. I think we need to throw him back. That's not bad. Yeah, this is not for the pan. Not for the grease. Holy cow. What? Dude, she's got eggs. Look. That just happened. That baby is ready to pop. Let me get a picture. Wow. I'm going to strip my reel out four times. Wow, guys. The runt in no lie. Wow. One hook. We're not going to put him in the pan. That are her in the pan because she's going to make some beautiful babies. It smells delicious. I was not expecting to catch fish that big, but that is awesome.  You just made mine straw. You might need to run this bank with a square reel. Yeah, dude. Yeah, I'd say so. So I hadn't really fished this runt a whole lot, but that's what it looks like right there. It looks like a peanut, literally. It's like a bluegill color. This water is real clear that we're fishing, so I thought this might be a halfway decent color. And this doesn't quite suspend.   It doesn't float up to the top. So I like the way that thing works. Cold water. Yeah. And it's got a feathered treble on the end. Cool little feathered treble like a topwater. So unique lure only available at Carl's. So you guys can get that. But came in the box this month. Good choice. Good job, NTB. All right. The rest is gravy. We've been fishing for five to 10 minutes. I've caught one close to five pounds. What I really want to catch is some white bass. I know this sounds crazy. Like you just caught a five-pounder or almost a five-pounder. What are you doing? But you don't have any food and we're going camping. So we literally need to go catch some fish before the sun goes down. It's late in the day. It's already four o'clock. So that is the mission right now. Neatall. Neatall mission. I love fishing. Every species. Love it. Gotta do it. Gotta have it in my life. Hope you guys love it too. Yeah. I'm ready for flight. Trying to balance us out up here. Oh we're about to we're about to roll into them. You guys missed the excitement. Everyone's super excited because this is dinner. Okay y'all one fish to put into a taco. Texas style here on the run again. We also have in here a square bill by Max Lewer. That looks like a shad. We have a bluegill colored crankbait which you guys might have seen me catch some fish on this the other day when I was with Jonathan from the Make-A-Wish Foundation trip and that right there is good for this color condition. Here's actually another colored run but I've got the I think the better color on right now it's for clear water. We've got the Rear Loader. It's more of a bass lure you know. I don't know. Really? Yeah it's like boom, boom, boom. Okay so I don't know. Probably a couple. I'm just trying to cast out there and get some. Nicely done Flare. Okay we are we have two now. I think that's gonna be camped up there. That looks really juicy. Little rocky island. There's some good sandy bank where we can set up some hammocks and some trees. I want to dangle over the water. We're not gonna be able to sleep a whole lot. Why? I don't know. Oh god I'm right here. Yes, yes, yes. Yeah with clutch fish, clutch fish. There we go. Right when we get to camp. Ah yes dinner is on the line. Oh I think I think we ran over my crankbait. Here's the trick ladies and gentlemen. We're gonna have to find some trees for hammocks. Flare is hooked. Oh baby. We are good. Yeah. Oh my gosh. Okay we're good. We're golden. Coming in clutch here at the end of the day. Step one to start getting your wood ready. Okay I have my Chate. So we're gonna have a series of sticks and then we're gonna make uh we're gonna make some small tin here. Oh yeah we're making the TP of life here. Oh just trying to chop it like halfway through and then crack it with the machete. Just make a bunch of these guys. Got my steel knife in the log and then I'm just taking this and I really should probably round it off.   Put them in a pile. Put the old zippo to it and we'll be good to go. Got another fish. I haven't done this hardly ever. I've only done it for just for fun practice a little bit in the backyard but I think this way of doing it like putting your knife into the another log is a little bit easier. You have a little bit more control I think but the key is just to have dry wood. I think more importantly this is definitely dry so what this does when you make the feather sticks it just creates a you know a very thin surface for when you throw a spark on it. If you wanted to throw a spark on it it can catch. You can take all your your shavings all your tender put it in a pile then I'm just going to take a lighter to it. That way it'll it'll hold the flame and then you have your other sticks ready to go above that and you are in badness. Juice on our turkey here. Burn out a little too quick. Is that ever happened to you? This might be our best bat boys.  Yeah get it get it get it get it get it get it. Oh gosh this is not good. This is not good. Is this wind in the forecast? Oh that's cold front definitely is. This is not good. Come on baby. Oh wow that thing rips. Get up in there. Oh dude it's a sparkler like from 4th of July. Why didn't I think about bringing something like that? Let's be serious. Just let it just let it go.  Yeah yep good idea. I like it. Pyro technician, Rackley to the rescue here. Here we go. Watch your face. Yeah sparkler bombing. Now we're talking. Why didn't Bear Girls bring one of these? A little barrier over it. Okay we're on fire now. Now we're cooking. It only took about you know a whole box of emergency matches. I've got to get the old blade out and get to clean it and some fish geese. You got any fillet knives? I don't know. I didn't bring the fillet knives so I'm just going to be using the uh the old steely knife. Not the perfect knife for doing this but it's not terrible. Well we told you guys at the beginning it was going to be one of them doozy adventure videos and it has been a lot of hard work. Cold front has rolled in. It's gotten windy. Luckily we got the fire going. Flare has blazed it up. You got enough wood buddy? I think we're okay for now. Uh step two is going to be hanging the hammock. I've got a hammock in my bag and we're going to need to find two trees to get that baby on so we can have a good place to sleep. Primitive camping on the river catching almost a five pound bass. Y'all you better hit the like button. This morning when I woke up buddy called me from Oklahoma. He said it was 21 degrees where he was. All that is working down. It was 71 this afternoon here so gonna get cold. Yeah it's just getting getting in there is going to be the trick. Um so we have we have a hammock here. Someone sent me this a long time ago. A legit camping. Just looking at that sloth makes me smile. It's just funny. But anyways this right here is a hammock. It's a little portable hammock. I think I've got my two trees right here. There and there. We'll give it a shot. I've never slept in a hammock outside overnight so uh could get interesting. Here let's see if I could get in it.  I think you need to lay that. Like did you roll out? I've got a great bedding of vines with thorns all over here. Yeah you're protected from the cougars. Yeah that's why you need to lay. Oh yeah cocooned. Ladies and gentlemen this is going to be our residence for the night. Isn't this awesome? I'm gonna throw my sleeping bag in here and somehow wiggle my way in. It's probably gonna be dark when I do that but that should be interesting to watch. I already feel that once. I have a tarp bag put over but if you don't have any rain and it's kind of dry conditions this could be really comfortable if it's not like super freezing. Yes this is a I love days like this where I don't exactly know what's gonna happen but it just ends up being a fun outdoor day with your buddy so we're gonna get some delicious fishes in our mouth and get ready for the bed. The hammock. My man Mullet man rolling in frosty. He doesn't eat seasoning. He doesn't eat seasoning. Potatoes, onions and portobello mushrooms.  You can check out Mullet man over at his channel linked down below. He's always eating the tasty stuff. We actually ate some fresh flounder that he gigged literally last night today so we're having fresh fish all the way around baby. It's good. Sounded like Michael Jackson right there. I get elevated in my voice when I get really excited about fishing and outdoors and just camping. I just love it. Everybody has got their hammocks set up here. It's working great guys. If you've never checked out these hammocks they're pretty cool. Okay well I caught the first white bass and then Flair just turned on the magnum mode and cleaned it up. I think we all actually caught some but we have the elements of success right here. The sizzle is going on and we actually have a little bit of tortilla, some craft cheese. You know how we do it in Texas. We got to have ourselves some fish tacos. It ain't Baja style but we love ourselves fish tacos. I'm so proud of our outdoor team here today because we rolled out at like 3.30 got started late. We went from a pond to going all the way out here and then we got into these guys set up camp, got our fire started, got our our hammocks all set up and we're ready for camping for real. We did good. We did we had good teamwork here today so put me one right on there sir thank you.  You bet her hit the like button because today just covered all the outdoor bases and that is it my fishing freaks. If you want to go check out Flair's channel as well. Flair and Mullet Man they're going to be linked down below and Flair's always got some crazy adventures. I'm just glad he didn't kill a beaver and bringing us track that sucker up on George start jobbing it up but I love you guys thanks for coming along on every single adventure and if you want to stay tuned for the next one where we camp out overnight wake up I don't I don't know how this night's gonna go uh just stay tuned so grab it out here for that and I'll see you guys in the next one.


Good morning, good morning, good morning It's time to rise and shine Good morning, good morning, good morning I hope you're feeling fine Good morning, get up, get out of bed It's time to wake up, you sleepyhead Pick up is a brand new day And we can't miss out on that day to decay Get your day planned out to be at your best And you gotta make sure you got the right back test Like this sleep away makes sure you're awake Cause we don't have time for fat finger mistakes And ratio condos will pay the bills But you gotta be quick to get those bills Follow your plan to keep your pockets thick If that market gap's up, look for Uncle Rick Small gap down means it's time for a duck But while we came here today, now let's get to it Good morning everyone, happy Thursday Today is November 2nd Welcome to today's Zero DTE live stream It's gonna be a quick one Only thing setting up this morning is Our buddy Uncle Rick So And that's assuming it does set up Looks like it should We've only got a 23-ish expected move for the day So typically it's going to set up well S&P is up 37 NASDAQ up 178 Brussels up 23 Dow up 200 Gold and silver both higher Notes and bonds Big move higher Notes and bonds Ten-year yield down almost 3% Back down to 4.644 Oil up half percent Natty gas down a couple percent Grains a little bit mixed Euro and the pound higher So the US dollar weaker And the in Bitcoin Staying above that $35,000 level VIX down over 3.5% Back in the low 16 handle Two and a half minutes until the market opens We've got our remaining VXX verticals That I'll most likely be taking off today Getting another big contraction And volatility So took half off at 50% of max We'll take the other half off Most likely today I'm also going to be taking off my oil strangle Either today or tomorrow Where the trade is profitable after adjustments We're not quite to profit target But we're getting kind of in that down into that Once we get down to around 40 DTE I like to start finding a place to Take those off to kind of Reduce risk Those are really designed as longer duration With very, you know, a lot lower gamma If you start getting down in that range I like to just peel them off So finally getting some contraction in oil volatility We are very light on positions right now Just been kind of scaling out The last week or so We've had implied volatility spikes We've had implied volatility contractions Two-sided price action Can't ask for much more I don't think there's a limit, Krish On the ratio I've got some portfolio margin positions That I do eight by fives That works just fine For toss And then tomorrow's head issues on Interactive brokers with that With different ratios Yep, LaSosa just doing a RIC this morning S&P pushing at the open So the 10 wide RICs trading at about 14, 25 I'm going to move up a strike here 42, 80 43, 100 42, 70 42, 35 And I'm just trading up to 15 Price going up But a little initial IV pump going in So I'm going to be patient Getting in here Just trading closer to 14, 15, 14, 25 Right at the open You'd have been pretty quick to enter Or while we're waiting on that We've got our time fly that we did a double adjustment to And prices continue to push higher Still got a very flat T zero line So I'm not looking to do anything at this point Probably most likely end up holding this one Until at least Monday Unless it keeps pushing higher I mean, if it gets up to kind of 43, 15 area I will probably just kill it Just bail S&P up 47 Interesting how Markets rallying but not getting Rick is not coming down in price Got an ES hedgehog It's up a little bit What's up more when the market was down Got a gold reverse hedgehog that's doing good Old benefit from a continued move higher Got a It was a good exit on the TGIF yesterday Still have this single calendar with my Downside vertical hedge That one's now with this push It's kind of moved Up to the upper end of the range I'll be closing this one today We do get a little pullback Might be able to scratch out a profit Yeah, the other thing I may do today Is add another time fly In a different expiration cycle Obviously we've got volatility contracting Which is not the most ideal time to be buying butterflies But I'd be doing it with a little bit of a I mean like I always do It's got a little bit of a bearish tint So if we do get a pullback after this big rally A lot of times you'll see After a big one directional move after the Fed It'll move there for a day or two And then you get some little bit of reversion It's just kind of that overreaction that you see a lot of times Yeah, and then I'll be looking at Either a single calendar or a TGIF as well All right, now Rick's trading back down to about 1450 That's more in line where I wanted it If it strikes up as well See what that's looked like All right, I'm going to put my order in for Rick at 1440 Here's the Rick I'm trying to get filled in And just got filled So what's your question on that back test, Krish? Well, I mean when I look at a back test The numbers kind of speak for themselves 67% win rate 12% drawdown 18% more So this is opening a trade at 255 p.m So this is power hour So this is a 5-4 power hour trade Yeah, not bad I mean, I don't like it as well I mean if you compare it apples to You know, try to compare it as close as you can apples to apples To the other tranche one it's not Not as good, but not too shabby Vicks down 4 over 4% Well, do the side-by-side comparison, Krish You know, I mean some, you know You may like the win percentage better But the drawdown not as much You might, you know, you just got to compare those different things and decide what you like better I mean, I can tell just by looking at the P&L graph that it's not as not as smooth Looks like it might have a little bit higher win rate It's got a higher drawdown I mean depends on the starting capital Comparison so you'd have to do that too, but Yeah, you just need to You just need to look at them side-by-side and decide what you like better Some people are more comfortable with a higher win rate Some people are more comfortable with a lower drawdown Some people focus mostly on mar You know, so that's something that you've got to decide It's not this it's not going to be the same for everybody So vxx let's see it's up about 18 730 So we're at about over 65% of max profit I'm going to go ahead and take that off Build at 515 All right, so just posted that in the premium selling Option selling channel That's a nice winner Bumblebee what does drawdown mean? So that means the or if you're looking at your P&L So for example looking at this This back test here, can you see my screen? So a on the option omega back test it shows max drawdown So that's the peak to valley The biggest peak to valley of your of your P&L So for example, I would assume that relates to right here So you can see you're checking along you're checking along You hit a you know new high P&L, you know in this case it says 207,000 and then you go through a drawdown Your P&L is drawing down You know now it's down to 1883,000 so from 207,183 I would assume that's where that 12.3% comes from Because that looks just eyeballing it that looks like the biggest drawdown Of this back test right there So that that's what that's what you're they refer to when you hear the word drawdown Yeah, or yeah, technically it'd be from here to this point here got a little bit lower So from here to here That would be the drawdown And then once you retake the new highs of P&L Then you're then you're out of your drawdown So the Mars your compound annual growth divided by your max drawdown So let's see if that's so 226 divided by 12 equals 18 Yeah, so it's your it's your compound annual growth divided by your max drawdown Gives you a mar so it's kind of a quick quick reference to to determine Compound annual growth rate divided by your max drawdown Gives you a figure that helps it just kind of it's kind of a just a quick metric So you don't have to do that calculation yourself Data list I think yeah, that's that's correct. That's why you'll see You'll see a back test that has a hundred percent win rate But it still has it there's still a max drawdown because Yeah, because there's there's an interday drawdown Even though you closed every single trade for a winner based on the back test parameters Which is which is a good thing. I'm glad they did that because it it helps give you a little bit more reasonable expectations that Okay. Yeah, they were all winners, but there's still a drawdown Yeah, and very important Kelvin mentioned I I did a podcast episode on this too and that has to do with the the drawdown of It it kind of relates to the sequence of returns is another way to think about it You know, this is a specific test starting January 1 through November 1 So that drawdown is based on that time frame Well, what if you what if you got in and started trading it right here? in The beginning of july right when you see the p&l start to peak right before that drawdown Well, your your drawdown is going to be more than 12.3 percent Right because this is based on this all these profits that you've already accumulated Then you have that drawdown so, uh, so it's of a higher, you know your Your dollar amount came down on a higher value So the percentage of drawdown is less, but if you started right here Then you had that drawdown right away. It's going to be quite about higher than 12 12 percent Yeah, I talked I talked a lot about that in, um When I was doing some of my earlier power hour videos as well Um You know where I was I was trying to get people to make sure you're going through the trade log Find find those areas where you have strings of losers You know, uh, this one was what was that? July Starting around July 5th So if we go to July 5th So We had a couple winners. So then starting Yeah, starting say july 11th.  So you've you've had, um You've had five Six seven eight nine ten eleven so nine out of 11 trades have lost Most people most people hang up hang it up after that I said, yeah, this is this is a this is not a good strategy The back test failed me The back test didn't fail you you you're your mental understanding Of how back tests work Failed you You know, you can also look at that and say well, that was that's the biggest drawdown that this back test has has had. Yep But we all we also experienced that right if you all remember in july and august Trunch one was I think it was more august trunch one was struggling There's a lot of talk about is Trunch one's just not working anymore. It just doesn't work. No It's just going through a drawdown Every every strategy has a drawdown Yeah, that's right. We had five. You know five straight red days So the yeah, so bumblebee that's the magic question, right? So the question is When do you decide to move on from a strategy? And when do you decide to Keep plugging away through the drawdown And the the biggest factor comes down to your position size Are you position sized appropriately to withstand? A Call it normal drawdown Or you or or you could even think, you know, are you position sized to withstand a Bigger drawdown than the back test has ever had You know, so that's that's something that you have to decide, you know, for example If you saw my november plan I ended up cutting ducks Out of my Out of my trade plan a zero DTE ducks Now this was for a couple of reasons Not just related to the duck performance itself But Let me just update this So, you know, I mean, but look at this. Look at this drawdown We're seeing on these zero-day ducks, right? It's just getting hammered and this as, you know, pretty strict criteria That's basically we're looking for a small gap down And traditionally when that happened We would, you know, kind of there's a high probability we'd kind of stay steady to hire Well, what's happened in the last A couple months is we've seen small gap downs and those And the markets continue to run lower, right? Stopping you out Now even with this drawdown this Trade still has an 81 wind rate still I still think it's a really good strategy part of the reason That I ended up cutting it is because This exact same criteria is used for the JSP's And so Part of my issue Wasn't necessarily that this is a terrible strategy and that, you know, I couldn't hold through that drawdown But it was because my position size based on two Extremely correlated positions Was just was just too much So I ended up just deciding to cut one of them and I just decided to cut the duck and I'm going to still trade the JSP's but there's, you know, my my uh My assumption would be that this is this is a drawdown and then this will continue to Go back up eventually. I think I still think it's a good strategy, but that was just my My decision that I made based on my Allocation between positions and that kind of thing Yeah, I mean ken, you know Let's get, you know, we're we're we're human. We like to celebrate the winds, right? We don't necessarily celebrate the losses.   I mean, that's a different story. I there that's garbage, but When I see you all, you know Pumped and posting your profit for the day. I don't I don't have anything against that whatsoever. I think yeah I think you got to celebrate the winds The x had that little push that's been kind of chopping the last 15 20 minutes Bumblebee what causes drawdowns iv changes. I mean, yeah Depends on the test Just let's just go back to this example What causes what caused the drawdown on these decks? Well Price gap down just a little bit between 0.1 and 0.5 percent that day You entered because that's the criteria And then price continued to run down so that in that case it wasn't necessarily implied volatility That was the issue for this drawdown. It was big outsized moves and and You you know, you've probably noticed over this period of time that we've seen this drawdown You know for me every day I draw the expected move on my chart, which I haven't moved the lines yet today But I look at what the expected move is to start the day and I always plot these lines Well, we've had we've seen more moves outside of the expected move in the last month then Usually you see in a year Sometimes I could be exaggerating a little bit on that But we've seen a lot of moves outside the expected range outside the expected daily range And in this case we had a lot of moves Outside the expected range to the downside so these were getting stopped out So it depends on the test sometimes it's market, you know, like power hour same thing You know whenever we take losses in power hours because price moved too much Implied volatility obviously has something to do with that because the higher the implied volatility of those zero-day options The wider your range is going to be so that helps, you know, let's price move around more without getting stopped out So just it depends completely depends on the strategy you're you're trading Yes, sir So the total premium Is all of all of your trades added up during this back test So for example Let's see on october 26 We took in a premium of seven ninety seven dollars and ninety cents We're doing eight contracts So seven ninety times eight Whatever that is that that's the that's the total premium that we Took in on this date Well, the total premium just all those added up between You know may 2nd through november 1st the entire back test And then the capture rate is how much how much of that total premium that you Sold in this case, you know, we're collecting a credit Uh, so how much of that premium do we actually capture? And that's what ends up being our profit by the way, um Bumblebee and anyone else really so matt from option omega put out a backtesting boot camp It's a free boot camp or free class on their option omega academy platform that they just rolled out um, kind of If you want to go if you want to do a little bit of a deep dive on on the back tester Kind of understand not only some of the basics, but some of the other Criteria that you can use to to build your back tests It's not on youtube. Just go to uh See, I think it's academy.  Uh, I haven't had I haven't done much with trade steward yet. I set up, uh I set up one it's not it's not functional yet, but It's just uh, it's just a matter of time figure out which strategies I want to I want to I want to try it with but I haven't done it yet Nice and Neil you know that end of october 26 and 27th was a painful one. I bet so those that's mostly JSP's so just so puts in short puts and short calls based on NT trend cool I got a question for you all something that's been kind of weighing on me something that's I've been trying to kind of think through especially after this last month of performance and we're talking about posting posting profits and losses I'm kind of I'm kind of concerned as these numbers continue to get bigger about posting publicly My trade performance You know like especially if we if we start going into a like a Real depression, you know a real recession You know people are losing their jobs and stuff like that and and you know and I'm I'm posting Hey, I made six figures this month. You know, I just I don't I'm starting to feel very I've always kind of felt weird about posting my profit and loss, but I I'm starting to feel even more uncomfortable You know trading Is such an interesting thing, right? It's all about making profits and so You know if I if I worked in the Whatever some other industry, you know, I'm not I'm not going around Telling people how much I made right nobody else does that except for us right and so A You know, I don't know I it It just it just doesn't it's it it's starting to feel uncomfortable and so I'm trying to figure out What I like I want to on one hand. I want to show people what the potential is But on the other hand, I don't want to be a douche If that makes sense So yeah, I mean percentage, you know, so That and that and then so percentages is an option. I mean I could show percentage of my total account I guess but like Some of the you know a bunch of the positions that I trade now are portfolio margins So some of those positions that I put on Literally take almost zero buying power So if I make a $10,000 profit on something that uses zero buying power, how do I calculate that as a percentage? You know, so I can't So I can't you know, I want to show all the different trades and all the different strategies And you know kind of how good they did I mean, I guess I could show only win rate and then only Profit as a percentage of my account value. It's kind of What I started thinking about but Anyway, I just wanted to kind of hear your you all's feedback Yeah, e-allison. I thought about that too.  Maybe I maybe I post You know all the a little bit more detail As far as you know, the dollar amounts and stuff like that Well, like I said Kelvin, I mean, I I also want to be able to Show people I mean the whole reason I started posting my performance to begin with is because I didn't when I first Started trading I didn't do that. But I got so many requests from people Wanting to know the performance So it just I was just like, all right. Well, I guess I'll just post my performance Trader Bianca. I felt for a while that posting dollar amounts is a bad idea I think it's awesome that some people do make a bow low but for new traders It can have a number of negative effects.  But it still happens.  So, you know, that's the other thing It's like no matter what my intent is that, you know, I'm being 100% transparent way more transparent than any other Joker out there. I'm doing the right thing. I'm, you know I'm teaching people how to trade the right way and stuff like that But there's always the loser out there who can't make it on his own Who's going to try to find a way to get what somebody else has and they, you know Now they're seeing me post, you know, six figure wins in a month You know, that just that's the other part that kind of makes me uncomfortable Yeah, like that that idiot who tried to blackmail me a few weeks ago I mean, you know, the guy like that Meanwhile, spx fell asleep Yeah, I mean, I think I think what I've Kind of what I'm leaning towards is, you know, I still want to I still want to That's just, you know, on our performance page Uh on our website, I still want to I still want to continue posting every month But I think I'll just do that Based on a percent Total total profit based on a percent of account value I just won't be able to go through each position Or each strategy and kind of show How each one did because it's just not it's just not possible with portfolio margin Um And then internally to you all I'll just I'll still continue to Kind of show the more detailed I think that's kind of what I'm leaning towards Appreciate that lassoza opt for dollar any trader hawk news What kind of news are you looking for? I Been continuing to trade on it I got some t-shirts left Opt for dollar will go to it if cs kills toss Sorry, brother. You're gonna have to expand I'm I'm not sure what you're asking Appreciate that fast 57 31 Appreciate it trader Bianca well, the only the the main issue with charles schwaab is um The margin requirements for calendars at this point So I've I've enjoyed trading calendars on trade hawk So if that's your if that's your concern, I mean, I don't I don't I don't see charles schwaab killing toss It better not kill toss That'd be a That'd be devastating, but Yeah, the margin on calendars is kind of the big issue at least right now Yallison, you're not you're not getting any margin issues trading calendars on schwaab, huh? I've heard I've heard both sides. I think annette. I don't annette. I don't know if you're on here, but she She's trying to post calendars and she's trying to trade calendars on schwaab and she's you know They're treating it like naked options. So it's kind of odd. I've heard this now from multiple people multiple traders having Both sides of the equation Some haven't some say no issues some saying issues Up for dollar my accounts are still with td. So no, I have not I have not experienced the charles schwaab experience yet Appreciate it. Kelvin. Yeah execution on trade hawk's been great Yeah, tasty is another option I would just say they're you know the risk graphs for calendar. I any kind of calendarized strategy is pretty Pretty worthless, but you can always use option strat for that as well Yeah, I was told I was going to be moved in 2024 Somebody else was told they were going to be moved in I think it was annette She was going to be moved in 2024 and then all of a sudden they got and then all of a sudden she got moved So I've also been told I'm getting moved in 2024. So hopefully They do stick with that I've heard um I've heard some of it now has to do with Trading futures. I don't think schwaab is ready for futures I don't know if it's just I assume they trade futures, but maybe it's just futures on toss or something like that. So if you If you trade futures, then you'll You'll be one of the last to get pushed over They tried to they tried to push you to schwaab krisch and you and then they switched you back Yep, only power hour for me a rick and power hour today the Kind of the retail stated commissions on TDA Elliott are 65 cents a contract But they you know depending on your trading volume you can negotiate I'm not sure what uh, I'm not sure how schwaab will be Negotiating, but I think I'm I think I'm doing I think I'm getting 35 or 40 cents a contract I hope they grandfather us I would That would be the smart thing to do, but who knows Well, this was supposed to be a quick little uh Get in rick and be done session, but good conversation. I appreciate you guys Feedback and just uh Appreciate everything. Love hanging out with you guys But I think I will get off here Get some other stuff done Then we'll come back for power hour. All right, I'll have a good day chat with you soon