2014-01-26 3 views

답변

5

이동을위한 appengine의 blobstore API는이를 수행 할 방법이 없습니다. 대신 데이터 저장소를 사용하여 __BlobInfo__ 엔티티를 appengine.BlobInfo으로 가져 오십시오. API에 BlobKey field이 있다고 주장 되더라도 채워지지 않습니다. 대신 반환 된 키의 문자열 ID를 사용하여 appengine.BlobKey에 전송하면 blobstore.Delete으로 전달됩니다.

"/ tasks/delete-blobs"의 처리기는 루프에서 한 번에 20KB의 모양을 모두 삭제할 때까지 삭제합니다. 또한 커서는 여기에 사용되지 않습니다. 나는 __BlobInfo__이 특별하고 커서를 지원하지 않는다고 생각합니다. (사용하려고 시도했을 때 아무것도하지 않았습니다.)

func DeleteBlobs(w http.ResponseWriter, r *http.Request) { 
    c := appengine.NewContext(r) 
    c = appengine.Timeout(c, time.Minute) 
    q := datastore.NewQuery("__BlobInfo__").KeysOnly() 
    it := q.Run(ctx) 
    wg := sync.WaitGroup{} 
    something := false 
    for _i := 0; _i < 20; _i++ { 
     var bk []appengine.BlobKey 
     for i := 0; i < 1000; i++ { 
      k, err := it.Next(nil) 
      if err == datastore.Done { 
       break 
      } else if err != nil { 
       c.Errorf("err: %v", err) 
       continue 
      } 
      bk = append(bk, appengine.BlobKey(k.StringID())) 
     } 
     if len(bk) == 0 { 
      break 
     } 
     go func(bk []appengine.BlobKey) { 
      something = true 
      c.Errorf("deleteing %v blobs", len(bk)) 
      err := blobstore.DeleteMulti(ctx, bk) 
      if err != nil { 
       c.Errorf("blobstore delete err: %v", err) 
      } 
      wg.Done() 
     }(bk) 
     wg.Add(1) 
    } 
    wg.Wait() 
    if something { 
     taskqueue.Add(c, taskqueue.NewPOSTTask("/tasks/delete-blobs", nil), "") 
    } 
} 
관련 문제