func (q *Queue) getIndexId(name string, defaultValue uint64) uint64 { indexId := defaultValue if value, err := q.store.GetCF(q.store.ro, q.cfHandle, q.metaKey(name)); err != nil { log.Errorf("Failed to get the head key from the rocksdb, %s", err) } else { sValue := makeSlice(value) if len(sValue) > 0 { indexId = binary.BigEndian.Uint64(sValue) } } return indexId }
// ServeHTTP implements the Middleware interface, just recover from the panic. Would provide information on the web page // if in debug mode. func (m *RecoveryWare) ServeHTTP(ctx context.Context, w http.ResponseWriter, r *http.Request, next Handler) context.Context { defer func() { if err := recover(); err != nil { w.WriteHeader(http.StatusInternalServerError) stack := make([]byte, m.stackSize) stack = stack[:runtime.Stack(stack, m.stackAll)] log.Errorf("PANIC: %s\n%s", err, stack) if m.printStack { fmt.Fprintf(w, "PANIC: %s\n%s", err, stack) } } }() return next(ctx, w, r) }
// NewQueue will return a named queue using Column Family from RocksDB func (s *Store) NewQueue(name string) (*Queue, error) { s.Lock() defer s.Unlock() if q, ok := s.queues[name]; ok { return q, nil } var cfHandle *rocks.ColumnFamilyHandle if handle, ok := s.cfHandles[name]; ok { cfHandle = handle } else { if handle, err := s.CreateColumnFamily(s.dbOpts, name); err != nil { log.Errorf("Failed to create column family %q, %s", name, err) return nil, err } else { cfHandle = handle s.cfHandles[name] = cfHandle } } return newQueue(name, s, cfHandle, s.useTailing), nil }
// NewStore returns the Store a rocksdb wrapper func NewStore(options StoreOptions) (*Store, error) { options.SetDefaults() if options.Directory == "" { return nil, fmt.Errorf("Empty directory of store options") } if options.IsDebug { log.EnableDebug() } s := &Store{ directory: options.Directory, useTailing: !options.DisableTailing, cfHandles: make(map[string]*rocks.ColumnFamilyHandle), queues: make(map[string]*Queue), } opts := rocks.NewDefaultOptions() opts.SetCreateIfMissing(true) opts.IncreaseParallelism(options.Parallel) opts.SetMergeOperator(&_CountMerger{}) opts.SetMaxSuccessiveMerges(64) opts.SetWriteBufferSize(options.WriteBufferSize) opts.SetMaxWriteBufferNumber(options.WriteBufferNumber) opts.SetTargetFileSizeBase(options.FileSizeBase) opts.SetLevel0FileNumCompactionTrigger(8) opts.SetLevel0SlowdownWritesTrigger(16) opts.SetLevel0StopWritesTrigger(24) opts.SetNumLevels(4) opts.SetMaxBytesForLevelBase(512 * 1024 * 1024) opts.SetMaxBytesForLevelMultiplier(8) opts.SetCompression(options.Compression) opts.SetDisableAutoCompactions(options.DisableAutoCompaction) bbto := rocks.NewDefaultBlockBasedTableOptions() bbto.SetBlockCache(rocks.NewLRUCache(options.MemorySize)) bbto.SetFilterPolicy(rocks.NewBloomFilter(10)) opts.SetBlockBasedTableFactory(bbto) opts.SetMaxOpenFiles(-1) opts.SetMemtablePrefixBloomBits(8 * 1024 * 1024) var err error if err = os.MkdirAll(options.Directory, 0755); err != nil { log.Errorf("Failed to mkdir %q, %s", options.Directory, err) return nil, err } cfNames, err := rocks.ListColumnFamilies(opts, options.Directory) if err != nil { // FIXME: we need to be sure if this means the db does not exist for now // so that we cannot list the column families log.Errorf("Failed to collect the column family names, %s", err) } else { log.Debugf("Got column family names for the existing db, %+v", cfNames) } if len(cfNames) == 0 { // We create the default column family to get the column family handle cfNames = []string{"default"} } cfOpts := make([]*rocks.Options, len(cfNames)) for i := range cfNames { cfOpts[i] = opts } db, cfHandles, err := rocks.OpenDbColumnFamilies(opts, options.Directory, cfNames, cfOpts) if err != nil { log.Errorf("Failed to open rocks database, %s", err) return nil, err } s.DB = db s.dbOpts = opts s.ro = rocks.NewDefaultReadOptions() s.ro.SetFillCache(false) s.ro.SetTailing(!options.DisableTailing) s.wo = rocks.NewDefaultWriteOptions() s.wo.DisableWAL(options.DisableWAL) s.wo.SetSync(options.Sync) if len(cfNames) > 0 { for i := range cfNames { s.cfHandles[cfNames[i]] = cfHandles[i] } } return s, nil }