@@ -10,7 +10,7 @@ import (
1010 "runtime/debug"
1111 "strconv"
1212
13- yaml "gopkg.in/yaml.v2"
13+ "gopkg.in/yaml.v2"
1414
1515 "github.com/douban/gobeansdb/cmem"
1616 "github.com/douban/gobeansdb/config"
@@ -55,7 +55,6 @@ func init() {
5555
5656 http .HandleFunc ("/statgetset" , handleStatGetSet )
5757 http .HandleFunc ("/freememory" , handleFreeMemory )
58-
5958}
6059
6160func initWeb () {
@@ -314,6 +313,15 @@ func handleGC(w http.ResponseWriter, r *http.Request) {
314313 var err error
315314 var bucketID int64
316315 var pretend bool
316+
317+ isQuery := getGCQuery (r )
318+ if isQuery {
319+ gcResult := storage .hstore .GCBuckets ()
320+ w .Header ().Set ("Content-Type" , "application/json" )
321+ json .NewEncoder (w ).Encode (gcResult )
322+ return
323+ }
324+
317325 defer func () {
318326 if err != nil {
319327 e := fmt .Sprintf ("<p> err : %s </p>" , err .Error ())
@@ -328,17 +336,16 @@ func handleGC(w http.ResponseWriter, r *http.Request) {
328336 }
329337 }()
330338
331- isQuery := getGCQuery (r )
332- if isQuery {
333- result = storage .hstore .GCBuckets ()
339+ bucketID , err = getBucket (r )
340+ if err != nil {
334341 return
335342 }
343+ bktID := int (bucketID )
336344
337- bucketID , err = getBucket ( r )
345+ err = r . ParseForm ( )
338346 if err != nil {
339347 return
340348 }
341- r .ParseForm ()
342349 start , err := getFormValueInt (r , "start" , - 1 )
343350 if err != nil {
344351 return
@@ -353,16 +360,27 @@ func handleGC(w http.ResponseWriter, r *http.Request) {
353360 }
354361
355362 s := r .FormValue ("run" )
356- pretend = ( s != "true" )
363+ pretend = s != "true"
357364
358365 s = r .FormValue ("merge" )
359- merge := (s == "true" )
366+ merge := s == "true"
367+
368+ s = r .FormValue ("cancel" )
369+ gcCancel := s == "true"
360370
361- start , end , err = storage .hstore .GC (int (bucketID ), start , end , noGCDays , merge , pretend )
362- if err == nil {
371+ if gcCancel {
372+ src , dst := storage .hstore .CancelGC (bktID )
373+ if src == - 1 {
374+ result = fmt .Sprintf ("bucket %d is not gcing" , bktID )
375+ } else {
376+ result = fmt .Sprintf ("cancel gc on bucket %d, src: %d -> dst: %d" , bktID , src , dst )
377+ }
378+ } else {
379+ start , end , err = storage .hstore .GC (bktID , start , end , noGCDays , merge , pretend )
363380 result = fmt .Sprintf ("<p/> bucket %d, start %d, end %d, merge %v, pretend %v <p/>" ,
364381 bucketID , start , end , merge , pretend )
365382 }
383+ return
366384}
367385
368386func handleDU (w http.ResponseWriter , r * http.Request ) {
0 commit comments