]> git.donarmstrong.com Git - debbugs-presentations.git/blob - debbugs.Rnw
plot bugs from the beginning of time and remove negative trends
[debbugs-presentations.git] / debbugs.Rnw
1
2 \usepackage{fontspec}
3 \setmainfont{FreeSerif}
4 \setsansfont{FreeSans}
5 \setmonofont{FreeMono}
6 \usepackage{url}
7 \usepackage{fancyhdr}
8 \usepackage{graphicx}
9 \usepackage[bf]{caption}
10 \usepackage{rotating}
11 \usepackage{wrapfig}
12 \usepackage{fancybox}
13 \usepackage{booktabs}
14 \usepackage{minted}
15 \usepackage{tcolorbox}
16 \usepackage{etoolbox}
17 \BeforeBeginEnvironment{minted}{\begin{tcolorbox}}%
18 \AfterEndEnvironment{minted}{\end{tcolorbox}}%
19 % \usepackage{multirow}
20 \usepackage{acronym}
21 \usepackage{qrcode}
22 \usepackage[backend=biber,natbib=true,hyperref=true,style=nature]{biblatex}
23 \addbibresource{references.bib}
24 % \usepackage[nomargin,inline,draft]{fixme}
25 % \newcommand{\DLA}[1]{\textcolor{red}{\fxnote{DLA: #1}}}
26 % \usepackage[hyperfigures,bookmarks,colorlinks,citecolor=black,filecolor=black,linkcolor=black,urlcolor=black]{hyperref}
27 \usepackage{texshade}
28 \usepackage{tikz}
29 \usepackage{nameref}
30 \usepackage{zref-xr,zref-user}
31 \renewcommand*{\bibfont}{\tiny}
32 \usepackage[absolute,overlay]{textpos}
33
34 \mode<presentation>
35 {
36   \usetheme{Montpellier}
37   %\useoutertheme[hideallsubsections]{debiansidebar}
38 %  \setbeamercovered{transparent}  
39 }
40
41 \setbeamertemplate{navigation symbols}{}%remove navigation symbols
42
43 \usepackage[nomargin,inline,draft]{fixme}
44 \usepackage{listings}
45
46
47 \logo{\begin{tikzpicture}% Pale figure
48     {\node[opacity=0.3] {\includegraphics[width=2cm,keepaspectratio]{figures/openlogo-crop.pdf}};}%
49     \end{tikzpicture}}
50 \author{Don Armstrong}
51 \title{Debbugs}
52 \subtitle{22 Years of Bugs}
53 \date{August 10th, 2017}
54 \titlegraphic{\includegraphics[height=0.2\textheight,keepaspectratio]{figures/openlogo-crop.pdf}}
55 \subject{BTS}
56
57 % State of the BTS: new features, changes and tips
58
59 % The bug tracking system is where all bugs that affect Debian are
60 % filed. New features, including the affects, summary, and local debbugs
61 % mirror will be presented and demonstrated. Some of the underlying
62 % architectural changes to the codebase in debbugs to make it more
63 % maintainable and deployable are also outlined. Finally, a set of tips
64 % and tricks that can be used to make the BTS easier to use are
65 % presented.
66
67 %  - New Features
68 %    - affects
69 %    - summary
70 %    - local debbugs mirror for offline work
71 %    - New SOAP
72 %      - full text search
73 %      - filtering bugs
74 %    - multi-distribution/arch status
75 %    - control changes at submit@ time
76 %  - Code Architecture Changes
77 %    - Modularization
78 %    - Control abstraction
79 %    - release to experimental
80
81
82 <<load.libraries,echo=FALSE,results="hide",error=FALSE,message=FALSE,cache=FALSE>>=
83 library(lattice)
84 library(xtable)
85 library(ggplot2)
86 library("scales")
87 library(reshape2)
88 library("data.table")
89 opts_chunk$set(dev="cairo_pdf",out.width="\\textwidth",out.height="0.8\\textheight",out.extra="keepaspectratio",fig.width=6/1.2,fig.height=4/1.2)
90 opts_chunk$set(cache=TRUE, autodep=TRUE)
91 options(device = function(file, width = 6/1.2, height = 4/1.2, ...) {
92   cairo_pdf(tempfile(), width = width, height = height, ...)
93 })
94
95
96
97 <<scientific_format,echo=FALSE>>=
98 scientific_10 <- function(x) {
99   parse(text=gsub("e", " %*% 10^", scientific_format()(x)))
100 }
101
102
103 \begin{document}
104
105 %\setbeamercolor{frametitle}[bg=-red!90!green!10,fg=black]
106
107 \frame[plain]{\titlepage
108   Code and slides are here: 
109   \qrcode[padding]{https://dla2.us/p/debbugs2017}
110   \url{https://dla2.us/p/debbugs2017}
111
112 }
113
114 % \begin{frame}{Debbugs}
115 %   \tableofcontents[subsectionstyle=hide]
116 % \end{frame}
117
118 \section{Introduction to Debbugs}
119
120 \subsection{Introduction}
121 \begin{frame}{Goals of this talk}
122   \begin{columns}
123     \column{0.5\textwidth}
124     \begin{itemize}
125     \item Bug Statistics
126     \item New features
127     \item Planned features
128     \item Places you can help
129     \end{itemize}
130     \column{0.5\textwidth}
131     \includegraphics[width=\textwidth,keepaspectratio]{images/rc_buggy}
132   \end{columns}
133 \end{frame}
134 \begin{frame}{Goals of the BTS}
135   \begin{columns}
136   \column{0.4\textwidth}
137     \includegraphics[width=\textwidth,keepaspectratio]{images/not_a_bug}
138   \column{0.6\textwidth}
139   \begin{itemize}
140   \item Reporting of \only<1>{Features}\only<2>{Bugs}
141   \item Evolution of \only<1>{Features}\only<2>{Bugs}
142   \item Fixing of \only<1>{Features}\only<2>{Bugs}
143   \item Reducing impact of \only<1>{Features}\only<2>{Bugs}
144   \end{itemize}
145 \end{columns}
146 \end{frame}
147
148 \section{Bugs in Debian}
149 \subsection{Bug Reporting Rate}
150 \begin{frame}{Bugs from the beginning of time}
151   \begin{center}
152 <<bug.growth,fig=TRUE,echo=FALSE,cache.extra=file.info("data/sorted_bug_growth_for_r_every_500.txt")[,"mtime"]>>=
153 bug.growth <- fread("data/sorted_bug_growth_for_r_every_500.txt")
154 colnames(bug.growth) <- c("time","bugs")
155 bug.growth <- bug.growth[pmax(bugs) <= as.numeric(bugs),]
156 bug.growth <- bug.growth[order(time),]
157 while (bug.growth[,any(c(0,diff(bugs)) < 0)]) {
158        bug.growth <-
159            bug.growth[c(0,diff(bugs))>=0,]
160 }
161 bug.growth[,date:=
162                 as.POSIXct(ISOdatetime(1970,1,1,0,0,0)+
163                            as.numeric(bug.growth$time))]
164 bug.growth[,`bugs per day`:=c(0,diff(bugs)/
165                                 as.double(diff(date),"days"))
166            ]
167 print(ggplot(bug.growth,#[date > as.POSIXct(ISOdatetime(2005,1,1,0,0,0)),],
168              aes(x=date,y=bugs))+
169       xlab("Time")+ylab("Bugs filed in Debian")+
170       scale_y_continuous(labels = scientific_10)+
171       geom_point())
172
173 \end{center}
174 \end{frame}
175
176 \begin{frame}{Bug Growth Rate}
177 <<bug_growth_rate,echo=FALSE>>=
178 print(ggplot(bug.growth[date > as.POSIXct(ISOdatetime(2014,1,1,0,0,0)),],
179              aes(x=date,y=`bugs per day`))+
180       xlab("Time")+ylab("Bugs filed per day")
181       + scale_y_log10(breaks=c(60,100,200,400,800))
182       + geom_line()+stat_smooth(method="lm")
183       + geom_label(data=data.table(date=as.POSIXct(ISOdatetime(2015,04,25,0,0,0)),"bugs per day"=400),label="Jessie",color="red")
184       + geom_label(data=data.table(date=as.POSIXct(ISOdatetime(2017,06,17,0,0,0)),"bugs per day"=400),label="Stretch",color="purple")
185       )
186
187 \end{frame}
188
189 \begin{frame}{My entries into Cristian's game}
190   \begin{columns}
191     \column{0.5\textwidth}
192   \begin{center}
193 <<bugs.filed,fig=TRUE,echo=FALSE,warning=FALSE,fig.width=3,fig.height=3>>=
194 print(ggplot(bug.growth[date > as.POSIXct(ISOdatetime(2015,1,1,0,0,0)),],
195              aes(x=date,y=bugs))+
196       xlab("Time")+ylab("Bugs filed in Debian")+
197       scale_y_continuous(labels = scientific_10)+
198       geom_point()+stat_smooth(method="lm"))
199 bugs.filed.per.day <-
200   lm(bugs~date,bug.growth)$coeff[2]*3600*24
201 temp.lm <- lm(date~bugs,bug.growth[date > as.POSIXct(ISOdatetime(2015,1,1,0,0,0)),])
202 bug.880000 <- 
203     as.POSIXct(ISOdatetime(1970,1,1,0,0,0)+as.numeric(predict(temp.lm,data.frame(bugs=880000,date=NA))))
204 bug.900000 <- 
205     as.POSIXct(ISOdatetime(1970,1,1,0,0,0)+as.numeric(predict(temp.lm,data.frame(bugs=900000,date=NA))))
206 bug.1000000 <- 
207     as.POSIXct(ISOdatetime(1970,1,1,0,0,0)+as.numeric(predict(temp.lm,data.frame(bugs=1000000,date=NA))))
208
209 \end{center}
210 \column{0.5\textwidth}
211 Roughly \Sexpr{format(bugs.filed.per.day,digits=1)} bugs are filed per
212 day. The 880000th bug will be filed at \Sexpr{bug.880000}, the
213 900000th bug will be filed at \Sexpr{bug.900000}, and bug one million will be filled 
214 \Sexpr{bug.1000000}.
215 \end{columns}
216 \end{frame}
217
218
219 \subsection{Bug Fixing Rate}
220 \begin{frame}
221   \begin{center}
222 <<bugs.closed,fig=TRUE,echo=FALSE,width=7,height=5,warning=FALSE,error=FALSE,cache.extra=file.info("data/bug_closed_time_series.txt")[,"mtime"]>>=
223 bug.closed.series <- fread(file="data/bug_closed_time_series.txt")
224 colnames(bug.closed.series) <- c("archived.bugs","year.week")
225 bug.closed.series[,week:=
226     gsub("(\\d+)-(\\d+)","\\2",year.week)]
227 bug.closed.series[,year:=
228     gsub("(\\d+)-(\\d+)","\\1",year.week)]
229 bug.closed.series[,doy:= as.numeric(week)*7]
230 bug.closed.series[,year.doy:=
231                        paste(sep="-",year,doy)]
232 bug.closed.series[,date:=
233                        as.POSIXct(strptime(year.doy,
234                                            format="%Y-%j"))]
235
236 # bug.closed.ts <- ts(bug.closed.series[,1],start=1,frequency=7)
237
238 print(ggplot(bug.closed.series[date > as.POSIXct(ISOdatetime(2008,1,1,0,0,0)),],
239              aes(x=date,y=archived.bugs/7))+geom_line()+stat_smooth(method="lm")+
240       ylab("Bugs archived Per Day")+xlab("Time"))
241 bugs.closed.per.day <-
242     bug.closed.series[,sum(archived.bugs)]/
243     as.numeric(bug.closed.series[nrow(bug.closed.series),date]-
244                bug.closed.series[1,date])
245
246   \end{center}
247 Roughly \Sexpr{format(bugs.closed.per.day,digits=1)} bugs are closed per day.
248 \end{frame}
249
250 \subsection{RC Bugs}
251 \begin{frame}{RC Bugs in the Past Year}
252   \begin{center}
253 <<rc.bugs,fig=TRUE,echo=FALSE,warning=FALSE,cache.extra=file.info("data/rc_bugs.txt")[,"mtime"]>>=
254 rc.bugs <-
255     data.table(read.table(file="data/rc_bugs.txt",
256                           header=TRUE,fill=TRUE))
257 rc.bugs[,date:=
258              as.POSIXct(strptime(date,
259                                  format="%Y%m%d%H%M"))]
260 rc.bugs[,unknown:=NULL]
261 rc.bugs[,unknown.1:=NULL]
262 for (i in 1:10) {
263     rc.bugs <- rc.bugs[c(0,diff(total)) > -1000,]
264 }
265 rc.bugs.long <-
266     data.table(melt(rc.bugs,id="date"))
267 print(ggplot(rc.bugs.long[date > 
268                           as.POSIXct(ISOdatetime(2016,08,1,0,0,0)),]
269             ,aes(x=date,y=value,color=variable))+
270       geom_line()+
271       ylab("# of Release Critical Bugs")+xlab("Time")+
272       theme(legend.position="top")+
273       scale_color_discrete("Measure"))
274
275 \end{center}
276   \setbeamercolor{postit}{fg=black,bg=yellow}
277   \begin{textblock}{4}(6,4)
278     \begin{onlyenv}<2>
279       \begin{beamercolorbox}[sep=1em,wd=5cm]{postit}
280         \centering \huge Too many RC bugs!
281       \end{beamercolorbox}
282     \end{onlyenv}
283   \end{textblock}
284
285 \end{frame}
286
287 \section{Debbugs Structure and Infrastructure}
288
289 \subsection{BTS System Diagram}
290 \begin{frame}{BTS system Diagram}
291   \begin{center}
292     \includegraphics[width=\textwidth,height=\textheight,keepaspectratio]{figures/bug_global_layout}
293   \end{center}
294 \end{frame}
295
296 \subsection{Debbugs Box Diagram}
297 \begin{frame}{Debbugs Box Diagram}
298   \begin{center}
299     \input{debbugs_layout}
300   \end{center}
301 \end{frame}
302
303 \section{Database Ho!}
304
305 \subsection{Overall Database Design}
306
307 \begin{frame}{Overall Database Design}
308   \begin{center}
309     \input{debbugs_layout_db}
310   \end{center}
311 \end{frame}
312
313 \subsection{Perl Database Infrastucture}
314 \begin{frame}{Perl Database Infrastructure}
315   \begin{itemize}
316   \item DBIx::Class
317   \item DBIx::Class::Schema::Loader -- SQL schema to DBIx::Class
318   \item DBIx::Class::DeploymentHandler -- Upgrades of Schema
319   \item Debbugs::DB -- Debbugs SQL Module
320   \end{itemize}
321 \end{frame}
322
323
324 \subsection{SQL Design}
325 \begin{frame}{SQL Schema}
326   \includegraphics[width=\textwidth,keepaspectratio]{figures/schema.png}
327   \begin{itemize}
328   \item Current Debbugs SQL Schema
329   \end{itemize}
330 \end{frame}
331
332 \subsubsection{dak SQL Design}
333 \begin{frame}{dak SQL Schema}
334   \includegraphics[width=\textwidth,keepaspectratio]{figures/dak_schema.png}
335   \begin{itemize}
336   \item Inspiration taken from dak SQL Schema where appropriate
337   \end{itemize}
338 \end{frame}
339
340 \subsection{SQL Loading}
341 \begin{frame}[fragile]{SQL Loading}
342   % SQL loading
343   \begin{itemize}
344   \item Load bugs
345 \begin{minted}{sh}
346 debbugs-loadsql bugs;
347 debbugs-loadsql bugs archive;
348 \end{minted}
349   \item Load Versioning information
350 \begin{minted}{sh}
351 debbugs-loadsql versions;
352 debbugs-loadsql debinfo;
353 \end{minted}
354   \end{itemize}
355 \end{frame}
356
357 \subsection{SQL Working}
358 \begin{frame}[fragile]{SQL Working}
359   % example SQL query
360 \begin{lstlisting}[language=SQL]
361 SELECT count(*) FROM bug
362 WHERE last_modified > '2014-07-01'
363 AND done IS NOT NULL
364 AND owner IS NOT NULL;
365 \end{lstlisting}
366 \begin{visibleenv}<2>
367 \begin{lstlisting}
368  count 
369 -------
370    521
371 \end{lstlisting}
372 \end{visibleenv}
373 \end{frame}
374
375 \subsection{Work still needed for SQL}
376 \begin{frame}{Work Still needed for SQL}
377 \begin{itemize}
378 \item Logfile loading (for full text searching)
379 \item Status Caching (for faster page loading)
380 \item Testing
381 \item Deployment
382 \end{itemize}
383 \end{frame}
384
385 \section{New(ish) Features}
386
387 \subsection{New Changes}
388 \begin{frame}{New Changes}
389   \begin{columns}
390     \column{0.5\textwidth}
391     \begin{itemize}
392   \item mailto links (demo)
393   \item forcemerge does the right thing
394   \item control at submit time
395   \end{itemize}
396     \column{0.5\textwidth}
397     \includegraphics[width=\textwidth,keepaspectratio]{images/telegraph_bug}
398 \end{columns}
399 \end{frame}
400
401 \section{Future features}
402
403 \subsection{Status Caching}
404 \begin{frame}{Status Caching}
405   \begin{itemize}
406   \item Cache status of bugs (presence/absence at all distributions)
407   \item Speed up display of \url{http://bugs.debian.org/src:linux-2.6}
408   \item Allows for reverse status lookup
409     \begin{itemize}
410     \item Enables finding bugs which are present in testing or unstable
411     \end{itemize}
412   \end{itemize}
413 \end{frame}
414
415 \subsection{Statistics}
416 \begin{frame}{Statistics}
417   \begin{columns}
418     \column{0.5\textwidth}
419     \begin{itemize}
420     \item Track status changes over time
421     \item Bugs found/fixed/absent in stable/testing/unstable over time
422     \item Bug submission times
423     \item Bug closure times
424     \item Bug mail rates
425     \item Per package, severity, maintainer tracking of the above
426     \end{itemize}
427     \column{0.5\textwidth}
428     \begin{center}
429       \includegraphics[width=\textwidth,height=0.35\textheight,keepaspectratio]{images/bug}
430     \end{center}
431   \end{columns}
432 \end{frame}
433
434
435 \subsection{Additional Planned Features}
436 \begin{frame}{More planned features}
437   \begin{columns}
438     \column{0.5\textwidth}
439     \begin{itemize}
440     \item HTTP based reporting system with e-mail roundtrip
441     \item Release Debbugs again
442     \item Bug mailing lists in Debbugs
443       \begin{itemize}
444       \item Avoid duplicate mail
445       \item Opt in/out of mail
446       \end{itemize}
447     \item Merging of merged bug reports
448     \item Threading in report
449     \end{itemize}
450     \column{0.5\textwidth}
451     \includegraphics[width=\textwidth,keepaspectratio]{images/fixed_bug}
452   \end{columns}
453 \end{frame}
454
455 \begin{frame}{Even More planned features}
456   \begin{columns}
457     \column{0.5\textwidth}
458     \begin{itemize}
459     \item Usercategory duplication and replay
460     \item Remote Attachments
461     \item New Spool Storage Format
462     \item Usertags visibility
463     \item Smarter CGI options
464     \end{itemize}
465     \column{0.5\textwidth}
466     \includegraphics[width=\textwidth,keepaspectratio]{images/fixed_bug}
467   \end{columns}
468 \end{frame}
469
470
471
472
473
474 \section{Places you can help}
475
476 \begin{frame}{7 tasks seeking contributors}
477   \begin{itemize}
478   \item Documentation of Usercategories
479   \item Implementation of rss feeds for packages and bugs
480   \item CGI options on pkgreport.cgi for usertags et al. \#536378)
481   \item Documentation of multipe-package reassign and when it or
482     affects should be used
483   \item Mailto link with subject, references, etc. all filled in
484   \item Documentation for local-debbugs configuration file (behaves
485     like bts select)
486   \end{itemize}
487 \end{frame}
488
489 \begin{frame}{Getting started on these tasks}
490   \begin{itemize}
491   \item Upstream branches: \url{http://bugs.debian.org/debbugs-source/}
492     \begin{itemize}
493     \item master (upstream debbugs): git clone \url{http://bugs.debian.org/debbugs-source/debbugs.git}
494     \item debian (debian branch): git clone -b debian \url{http://bugs.debian.org/debbugs-source/debbugs.git}
495     \item Checked out branches are also available at
496       \url{http://bugs.debian.org/debbugs-source/master} and
497       \url{http://bugs.debian.org/debbugs-source/debian}
498     \end{itemize}
499   \item My branches: \url{http://git.donarmstrong.com/debbugs.git}
500   \item Mailing list debian-debbugs@lists.debian.org
501   \item IRC \#debbugs or \#debian-bugs on irc.debian.org; I'm dondelelcaro
502   \end{itemize}
503 \end{frame}
504
505 \begin{frame}{The Debbugs Team}
506   \begin{itemize}
507   \item Current team
508     \begin{itemize}
509     \item Don Armstrong
510     \item Blars Blarson
511     \item Colin Watson
512     \end{itemize}
513   \item Emeritus Developers
514     \begin{itemize}
515     \item Steiner Gunderson
516     \item Adam Heath
517     \item Josip Rodin
518     \item Anthony Towns
519     \end{itemize}
520   \item You!
521   \end{itemize}
522 \end{frame}
523
524 \begin{frame}{Questions?}
525   \includegraphics[width=0.8\textwidth,height=0.8\textheight,keepaspectratio]{images/don_at_burning_man.jpg}
526 \end{frame}
527
528 \end{document}
529
530