Example #1
0
func (sq *SqlQuery) allowQueries(dbconfig *eproto.DBConfigs) {
	sq.statemu.Lock()
	v := sq.state.Get()
	switch v {
	case ABORT, SERVING:
		sq.statemu.Unlock()
		log.Info("Ignoring allowQueries request, current state: %v", v)
		return
	case INITIALIZING, SHUTTING_DOWN:
		panic("unreachable")
	}
	// state is NOT_SERVING
	sq.setState(INITIALIZING)

	defer func() {
		if x := recover(); x != nil {
			log.Error("%s", x.(*TabletError).Message)
			sq.setState(NOT_SERVING)
			return
		}
		sq.setState(SERVING)
	}()

	sq.qe.Open(dbconfig)
	sq.dbconfig = dbconfig
	sq.sessionId = Rand()
	log.Info("Session id: %d", sq.sessionId)
}
Example #2
0
func (hh *httpHandler) ServeHTTP(c http.ResponseWriter, req *http.Request) {
	conn := &httpConnectionBroker{c, req.Body}
	codec := hh.cFactory(conn)
	if err := rpc.ServeRequestWithContext(codec, &proto.Context{RemoteAddr: req.RemoteAddr}); err != nil {
		log.Error("rpcwrap: %v", err)
	}
}
Example #3
0
func handleError(err *error, logStats *sqlQueryStats) {
	if logStats != nil {
		logStats.Send()
	}
	if x := recover(); x != nil {
		terr, ok := x.(*TabletError)
		if !ok {
			log.Error("Uncaught panic:\n%v\n%s", x, tb.Stack(4))
			*err = NewTabletError(FAIL, "%v: uncaught panic", x)
			errorStats.Add("Panic", 1)
			return
		}
		*err = terr
		terr.RecordStats()
		if terr.ErrorType == RETRY { // Retry errors are too spammy
			return
		}
		log.Error("%s", terr.Message)
	}
}
Example #4
0
func (h *rpcHandler) ServeHTTP(c http.ResponseWriter, req *http.Request) {
	conn, _, err := c.(http.Hijacker).Hijack()
	if err != nil {
		log.Error("rpc hijacking %s: %v", req.RemoteAddr, err)
		return
	}
	io.WriteString(conn, "HTTP/1.0 "+connected+"\n\n")
	codec := h.cFactory(NewBufferedConnection(conn))
	context := &proto.Context{RemoteAddr: req.RemoteAddr}
	if h.useAuth {
		if authenticated, err := auth.Authenticate(codec, context); !authenticated {
			if err != nil {
				log.Error("authentication erred at %s: %v", req.RemoteAddr, err)
			}
			codec.Close()
			return
		}
	}
	h.ServeCodecWithContext(codec, context)
}
Example #5
0
func handleExecError(query *proto.Query, err *error, logStats *sqlQueryStats) {
	if logStats != nil {
		logStats.Send()
	}
	if x := recover(); x != nil {
		terr, ok := x.(*TabletError)
		if !ok {
			log.Error("Uncaught panic for %v:\n%v\n%s", query, x, tb.Stack(4))
			*err = NewTabletError(FAIL, "%v: uncaught panic for %v", x, query)
			errorStats.Add("Panic", 1)
			return
		}
		*err = terr
		terr.RecordStats()
		// suppress these errors in logs
		// if terr.ErrorType == RETRY {
		// 	return
		// }
		log.Error("%s: %v", terr.Message, query)
	}
}
Example #6
0
func killPredecessor(port string) {
	resp, err := http.Get(fmt.Sprintf("http://localhost:%s%s", port, pidURL))
	if err != nil {
		if !strings.Contains(err.Error(), "connection refused") {
			log.Error("unexpected error on port %v: %v, trying to start anyway", port, err)
		}
		return
	}
	num, err := ioutil.ReadAll(resp.Body)
	resp.Body.Close()
	if err != nil {
		log.Error("could not read pid: %vd, trying to start anyway", err)
		return
	}
	pid, err := strconv.Atoi(string(num))
	if err != nil {
		log.Error("could not read pid: %vd, trying to start anyway", err)
		return
	}
	err = syscall.Kill(pid, syscall.SIGUSR1)
	if err != nil {
		log.Error("error killing %v: %v, trying to start anyway", pid, err)
	}
}
Example #7
0
func (connection *RocksDbConnection) Gets(options *proto.DbReadOptions, keys [][]byte) ([][]byte, error) {
	ro := ratgo.NewReadOptions()
	defer ro.Close()
	if options != nil {
		ro.SetFillCache(options.FillCache)
		ro.SetVerifyChecksums(options.VerifyChecksum)
		if options.Snapshot != nil {
			rocksdbSnapshot := options.Snapshot.Snapshot.(*ratgo.Snapshot)
			ro.SetSnapshot(rocksdbSnapshot)
		}
	}
	results, errors := connection.db.MultiGet(ro, keys)
	for _, err := range errors {
		if err != nil {
			log.Error("Get Key:%v error, error", err)
			return nil, err
		}
	}
	return results, nil
}
Example #8
0
func Init() {
	mu.Lock()
	defer mu.Unlock()
	if inited {
		log.Critical("servenv.Init called second time")
	}
	inited = true

	// Once you run as root, you pretty much destroy the chances of a
	// non-privileged user starting the program correctly.
	if uid := os.Getuid(); uid == 0 {
		log.Critical("servenv.Init: running this as root makes no sense")
	}

	runtime.MemProfileRate = *memProfileRate
	gomaxprocs := os.Getenv("GOMAXPROCS")
	if gomaxprocs == "" {
		gomaxprocs = "1"
	}

	// We used to set this limit directly, but you pretty much have to
	// use a root account to allow increasing a limit reliably. Dropping
	// privileges is also tricky. The best strategy is to make a shell
	// script set up the limits as root and switch users before starting
	// the server.
	fdLimit := &syscall.Rlimit{}
	if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, fdLimit); err != nil {
		log.Error("max-open-fds failed: %v", err)
	}
	fdl := stats.NewInt("MaxFds")
	fdl.Set(int64(fdLimit.Cur))

	if err := exportBinaryVersion(); err != nil {
		log.Critical("servenv.Init: exportBinaryVersion: %v", err)
	}

	onInitHooks.Fire()
}
Example #9
0
func logError() {
	if x := recover(); x != nil {
		log.Error("%s", x.(*TabletError).Message)
	}
}