diff --git a/datanode/data_partition_repair.go b/datanode/data_partition_repair.go index 425ecf2d3..791600e9d 100644 --- a/datanode/data_partition_repair.go +++ b/datanode/data_partition_repair.go @@ -39,17 +39,15 @@ type DataPartitionRepairTask struct { ExtentsToBeRepaired []*storage.ExtentInfo LeaderTinyDeleteRecordFileSize int64 LeaderAddr string - LeaderTinyExtentRealSize map[uint64]int64 } -func NewDataPartitionRepairTask(extentFiles []*storage.ExtentInfo, leaderTinyExtentRealSize map[uint64]int64, tinyDeleteRecordFileSize int64, source, leaderAddr string) (task *DataPartitionRepairTask) { +func NewDataPartitionRepairTask(extentFiles []*storage.ExtentInfo, tinyDeleteRecordFileSize int64, source, leaderAddr string) (task *DataPartitionRepairTask) { task = &DataPartitionRepairTask{ extents: make(map[uint64]*storage.ExtentInfo), ExtentsToBeCreated: make([]*storage.ExtentInfo, 0), ExtentsToBeRepaired: make([]*storage.ExtentInfo, 0), LeaderTinyDeleteRecordFileSize: tinyDeleteRecordFileSize, LeaderAddr: leaderAddr, - LeaderTinyExtentRealSize: leaderTinyExtentRealSize, } for _, extentFile := range extentFiles { extentFile.Source = source @@ -119,9 +117,6 @@ func (dp *DataPartition) repair(extentType uint8) { // every time we need to figureAnnotatef out which extents need to be repaired and which ones do not. dp.sendAllTinyExtentsToC(extentType, availableTinyExtents, brokenTinyExtents) - for extentId, extentSize := range repairTasks[0].LeaderTinyExtentRealSize { - dp.extentStore.UpdateTinyExtentRealSize(extentId, uint64(extentSize)) - } // error check if dp.extentStore.AvailableTinyExtentCnt()+dp.extentStore.BrokenTinyExtentCnt() > storage.TinyExtentCount { log.LogWarnf("action[repair] partition(%v) GoodTinyExtents(%v) "+ @@ -136,13 +131,13 @@ func (dp *DataPartition) repair(extentType uint8) { func (dp *DataPartition) buildDataPartitionRepairTask(repairTasks []*DataPartitionRepairTask, extentType uint8, tinyExtents []uint64) (err error) { // get the local extent info - extents, leaderTinyExtentRealSize, leaderTinyDeleteRecordFileSize, err := dp.getLocalExtentInfo(extentType, tinyExtents) + extents, leaderTinyDeleteRecordFileSize, err := dp.getLocalExtentInfo(extentType, tinyExtents) if err != nil { return err } // new repair task for the leader - repairTasks[0] = NewDataPartitionRepairTask(extents, leaderTinyExtentRealSize, leaderTinyDeleteRecordFileSize, dp.replicas[0], dp.replicas[0]) + repairTasks[0] = NewDataPartitionRepairTask(extents, leaderTinyDeleteRecordFileSize, dp.replicas[0], dp.replicas[0]) repairTasks[0].addr = dp.replicas[0] // new repair tasks for the followers @@ -152,14 +147,14 @@ func (dp *DataPartition) buildDataPartitionRepairTask(repairTasks []*DataPartiti log.LogErrorf("buildDataPartitionRepairTask partitionID(%v) on (%v) err(%v)", dp.partitionID, dp.replicas[index], err) continue } - repairTasks[index] = NewDataPartitionRepairTask(extents, leaderTinyExtentRealSize, leaderTinyDeleteRecordFileSize, dp.replicas[index], dp.replicas[0]) + repairTasks[index] = NewDataPartitionRepairTask(extents, leaderTinyDeleteRecordFileSize, dp.replicas[index], dp.replicas[0]) repairTasks[index].addr = dp.replicas[index] } return } -func (dp *DataPartition) getLocalExtentInfo(extentType uint8, tinyExtents []uint64) (extents []*storage.ExtentInfo, leaderTinyExtentRealSize map[uint64]int64, leaderTinyDeleteRecordFileSize int64, err error) { +func (dp *DataPartition) getLocalExtentInfo(extentType uint8, tinyExtents []uint64) (extents []*storage.ExtentInfo, leaderTinyDeleteRecordFileSize int64, err error) { localExtents := make([]*storage.ExtentInfo, 0) extents = make([]*storage.ExtentInfo, 0) @@ -181,7 +176,6 @@ func (dp *DataPartition) getLocalExtentInfo(extentType uint8, tinyExtents []uint if err = json.Unmarshal(data, &extents); err != nil { err = errors.Trace(err, "getLocalExtentInfo extent DataPartition(%v) GetAllWaterMark", dp.partitionID) } - leaderTinyExtentRealSize = dp.extentStore.GetTinyExtentsRealSize(tinyExtents) return } diff --git a/datanode/partition.go b/datanode/partition.go index 48b1d3d84..3c74ad8da 100644 --- a/datanode/partition.go +++ b/datanode/partition.go @@ -121,10 +121,7 @@ func CreateDataPartition(dpCfg *dataPartitionCfg, disk *Disk, request *proto.Cre if dp, err = newDataPartition(dpCfg, disk); err != nil { return } - - go dp.StartRaftLoggingSchedule() dp.ForceLoadHeader() - if request.CreateType == proto.NormalCreateDataPartition { err = dp.StartRaft() } else { @@ -135,6 +132,7 @@ func CreateDataPartition(dpCfg *dataPartitionCfg, disk *Disk, request *proto.Cre } // persist file metadata + go dp.StartRaftLoggingSchedule() err = dp.PersistMetadata(request.CreateType) disk.AddSize(uint64(dp.Size())) return @@ -278,6 +276,9 @@ func (dp *DataPartition) ReloadSnapshot() { return } dp.snapshotMutex.Lock() + for _, f := range dp.snapshot { + storage.PutSnapShotFileToPool(f) + } dp.snapshot = files dp.snapshotMutex.Unlock() } @@ -656,9 +657,6 @@ func (dp *DataPartition) DoExtentStoreRepair(repairTask *DataPartitionRepairTask } wg.Wait() dp.doStreamFixTinyDeleteRecord(repairTask, time.Now().Unix()-dp.FullSyncTinyDeleteTime > MaxFullSyncTinyDeleteTime) - for extentID, tinyExtentRealSize := range repairTask.LeaderTinyExtentRealSize { - dp.extentStore.UpdateTinyExtentRealSize(extentID, uint64(tinyExtentRealSize)) - } } func (dp *DataPartition) doStreamFixTinyDeleteRecord(repairTask *DataPartitionRepairTask, isFullSync bool) { diff --git a/datanode/server_handler.go b/datanode/server_handler.go index 7ec675a69..63424a63b 100644 --- a/datanode/server_handler.go +++ b/datanode/server_handler.go @@ -159,7 +159,6 @@ func (s *DataNode) getPartitionAPI(w http.ResponseWriter, r *http.Request) { FileCount int `json:"fileCount"` Replicas []string `json:"replicas"` TinyDeleteRecordSize int64 `json:"tinyDeleteRecordSize"` - TinyExtentRealSize map[uint64]int64 `json:"tinyExtentRealSize"` RaftStatus *raft.Status `json: "raftStatus"` }{ VolName: partition.volumeID, @@ -172,7 +171,6 @@ func (s *DataNode) getPartitionAPI(w http.ResponseWriter, r *http.Request) { FileCount: len(files), Replicas: partition.Replicas(), TinyDeleteRecordSize: tinyDeleteRecordSize, - TinyExtentRealSize: partition.extentStore.GetAllTinyExtentsRealSize(), RaftStatus: partition.raftPartition.Status(), } s.buildSuccessResp(w, result) diff --git a/datanode/space_manager.go b/datanode/space_manager.go index 1cfee3f56..ec31de2d6 100644 --- a/datanode/space_manager.go +++ b/datanode/space_manager.go @@ -283,13 +283,13 @@ func (manager *SpaceManager) CreatePartition(request *proto.CreateDataPartitionR // DeletePartition deletes a partition based on the partition id. func (manager *SpaceManager) DeletePartition(dpID uint64) { - manager.partitionMutex.Lock() - defer manager.partitionMutex.Unlock() - dp := manager.partitions[dpID] + dp := manager.Partition(dpID) if dp == nil { return } + manager.partitionMutex.Lock() delete(manager.partitions, dpID) + manager.partitionMutex.Unlock() dp.Stop() dp.Disk().DetachDataPartition(dp) os.RemoveAll(dp.Path()) diff --git a/docker/conf/client.json b/docker/conf/client.json index 7e99a6645..8f7f6208a 100644 --- a/docker/conf/client.json +++ b/docker/conf/client.json @@ -4,7 +4,6 @@ "volName": "ltptest", "owner": "ltptest", "logDir": "/cfs/log", - "warnLogDir":"/cfs/log", "logLevel": "info", "consulAddr": "http://192.168.0.100:8500", "exporterPort": 9500, diff --git a/docker/conf/datanode.json b/docker/conf/datanode.json index bb2803806..e4c7765a6 100644 --- a/docker/conf/datanode.json +++ b/docker/conf/datanode.json @@ -8,7 +8,6 @@ "exporterPort": 9500, "rack": "rack-01", "logDir": "/cfs/log", - "warnLogDir":"/cfs/log", "logLevel": "info", "disks": [ "/cfs/disk:10737418240" diff --git a/docker/conf/master1.json b/docker/conf/master1.json index d98f16afd..ace6329a6 100644 --- a/docker/conf/master1.json +++ b/docker/conf/master1.json @@ -12,6 +12,5 @@ "logLevel": "info", "logDir": "/cfs/log", "walDir": "/cfs/data/wal", - "warnLogDir":"/cfs/log", "storeDir": "/cfs/data/store" } diff --git a/docker/conf/master2.json b/docker/conf/master2.json index c9fa0177e..9fcf79cfe 100644 --- a/docker/conf/master2.json +++ b/docker/conf/master2.json @@ -12,6 +12,5 @@ "logLevel": "info", "logDir": "/cfs/log", "walDir": "/cfs/data/wal", - "warnLogDir":"/cfs/log", "storeDir": "/cfs/data/store" } diff --git a/docker/conf/master3.json b/docker/conf/master3.json index 84d6a235f..a30a156e1 100644 --- a/docker/conf/master3.json +++ b/docker/conf/master3.json @@ -12,6 +12,5 @@ "logLevel": "info", "logDir": "/cfs/log", "walDir": "/cfs/data/wal", - "warnLogDir":"/cfs/log", "storeDir": "/cfs/data/store" } diff --git a/docker/conf/metanode.json b/docker/conf/metanode.json index 156e12b3d..41e90104e 100644 --- a/docker/conf/metanode.json +++ b/docker/conf/metanode.json @@ -8,7 +8,6 @@ "exporterPort": 9500, "logLevel": "info", "logDir": "/cfs/log", - "warnLogDir":"/cfs/log", "totalMem":"6442450944", "metadataDir": "/cfs/data/meta", "raftDir": "/cfs/data/raft", diff --git a/docker/script/run_test.sh b/docker/script/run_test.sh index c9f26ed16..981254f78 100755 --- a/docker/script/run_test.sh +++ b/docker/script/run_test.sh @@ -109,7 +109,7 @@ wait_proc_done() { logfile=$2 logfile2=${logfile}-2 logfile3=${logfile}-3 - maxtime=${3:-29000} + maxtime=${3:-3000} checktime=${4:-60} retfile=${5:-"/tmp/ltpret"} timeout=1 diff --git a/docker/script/start_datanode.sh b/docker/script/start_datanode.sh index d257ae27b..7bba4846e 100755 --- a/docker/script/start_datanode.sh +++ b/docker/script/start_datanode.sh @@ -1,7 +1,6 @@ #!/bin/sh - +rm -rf /cfs/disk/* /cfs/log/* mkdir -p /cfs/bin /cfs/log /cfs/disk - sleep 10 echo "start datanode" /cfs/bin/cfs-server -c /cfs/conf/datanode.json diff --git a/docker/script/start_master.sh b/docker/script/start_master.sh index 3f4619270..65e0c3fa1 100755 --- a/docker/script/start_master.sh +++ b/docker/script/start_master.sh @@ -1,7 +1,6 @@ #!/bin/sh - +rm -rf /cfs/data* /cfs/log/* mkdir -p /cfs/log /cfs/data/wal /cfs/data/store /cfs/bin - echo "start master" /cfs/bin/cfs-server -c /cfs/conf/master.json diff --git a/docker/script/start_meta.sh b/docker/script/start_meta.sh index a12595ca5..6ae0dafdd 100755 --- a/docker/script/start_meta.sh +++ b/docker/script/start_meta.sh @@ -1,7 +1,6 @@ #!/bin/sh - +rm -rf /cfs/data/* /cfs/log/* mkdir -p /cfs/bin /cfs/log /cfs/data/meta /cfs/data/raft - echo "start metanode" /cfs/bin/cfs-server -c /cfs/conf/metanode.json diff --git a/storage/extent.go b/storage/extent.go index d171ffc17..4d7172954 100644 --- a/storage/extent.go +++ b/storage/extent.go @@ -63,7 +63,6 @@ type Extent struct { extentID uint64 modifyTime int64 dataSize int64 - realSize int64 hasClose int32 header []byte sync.Mutex @@ -413,33 +412,3 @@ func (e *Extent) tinyExtentAvaliOffset(offset int64) (newOffset, newEnd int64, e } return } - -func (e *Extent) tinyExtentUpdateRealSize(leaderFileSize int64) { - if !IsTinyExtent(e.extentID) { - return - } - if e.dataSize < leaderFileSize { - atomic.StoreInt64(&e.realSize, 0) - return - } - atomic.StoreInt64(&e.realSize, 0) - var ( - offset, realSize int64 - ) - for { - newOffset, err := e.file.Seek(int64(offset), SEEK_DATA) - if err != nil { - break - } - newEnd, err := e.file.Seek(int64(newOffset), SEEK_HOLE) - if err != nil { - break - } - if newOffset >= leaderFileSize || newEnd >= leaderFileSize { - break - } - realSize = realSize + (newEnd - newOffset) - offset = newEnd - } - atomic.StoreInt64(&e.realSize, realSize) -} diff --git a/storage/extent_store.go b/storage/extent_store.go index 4ea408ccf..7b3ed58cf 100644 --- a/storage/extent_store.go +++ b/storage/extent_store.go @@ -54,8 +54,20 @@ const ( var ( RegexpExtentFile, _ = regexp.Compile("^(\\d)+$") + SnapShotFilePool = &sync.Pool{New: func() interface{} { + return new(proto.File) + }} ) +func GetSnapShotFileFromPool() (f *proto.File) { + f = SnapShotFilePool.Get().(*proto.File) + return +} + +func PutSnapShotFileToPool(f *proto.File) { + SnapShotFilePool.Put(f) +} + type ExtentFilter func(info *ExtentInfo) bool // Filters @@ -182,7 +194,7 @@ func (s *ExtentStore) SnapShot() (files []*proto.File, err error) { files = make([]*proto.File, 0, len(normalExtentSnapshot)) for _, ei := range normalExtentSnapshot { - file := new(proto.File) + file := GetSnapShotFileFromPool() file.Name = strconv.FormatUint(ei.FileID, 10) file.Size = uint32(ei.Size) file.Modified = ei.ModifyTime @@ -191,7 +203,7 @@ func (s *ExtentStore) SnapShot() (files []*proto.File, err error) { } tinyExtentSnapshot = s.getTinyExtentInfo() for _, ei := range tinyExtentSnapshot { - file := new(proto.File) + file := GetSnapShotFileFromPool() file.Name = strconv.FormatUint(ei.FileID, 10) file.Size = uint32(ei.Size) file.Modified = ei.ModifyTime @@ -459,31 +471,6 @@ func (s *ExtentStore) GetAllWatermarks(filter ExtentFilter) (extents []*ExtentIn return } -func (s *ExtentStore) GetTinyExtentsRealSize(extentIDs []uint64) (tinyExtentRealSize map[uint64]int64) { - tinyExtentRealSize = make(map[uint64]int64, 0) - for _, extentID := range extentIDs { - e, err := s.extentWithHeaderByExtentID(extentID) - if err != nil { - continue - } - tinyExtentRealSize[extentID] = atomic.LoadInt64(&e.realSize) - } - return -} - -func (s *ExtentStore) GetAllTinyExtentsRealSize() (tinyExtentRealSize map[uint64]int64) { - tinyExtentRealSize = make(map[uint64]int64, 0) - var extentID uint64 - for extentID = TinyExtentStartID; extentID < TinyExtentCount+TinyExtentStartID; extentID++ { - e, err := s.extentWithHeaderByExtentID(extentID) - if err != nil { - continue - } - tinyExtentRealSize[extentID] = atomic.LoadInt64(&e.realSize) - } - return -} - func (s *ExtentStore) getTinyExtentInfo() (extents []*ExtentInfo) { extents = make([]*ExtentInfo, 0) s.eiMutex.RLock() @@ -843,7 +830,7 @@ func (s *ExtentStore) AutoComputeExtentCrc() { } ei.UpdateExtentInfo(e, extentCrc) } - time.Sleep(time.Millisecond * 50) + time.Sleep(time.Millisecond * 100) } } @@ -921,19 +908,3 @@ func (s *ExtentStore) TinyExtentAvaliOffset(extentID uint64, offset int64) (newO return } -func (s *ExtentStore) UpdateTinyExtentRealSize(extentID uint64, leaderSize uint64) { - var ( - e *Extent - err error - ) - if !IsTinyExtent(extentID) { - return - } - s.eiMutex.RLock() - ei := s.extentInfoMap[extentID] - s.eiMutex.RUnlock() - if e, err = s.extentWithHeader(ei); err != nil { - return - } - e.tinyExtentUpdateRealSize(int64(leaderSize)) -} diff --git a/util/exporter/alarm.go b/util/exporter/alarm.go index 5e3a52ff0..e0ba7e695 100644 --- a/util/exporter/alarm.go +++ b/util/exporter/alarm.go @@ -16,6 +16,7 @@ package exporter import ( "fmt" + "github.com/chubaofs/chubaofs/util/log" "github.com/chubaofs/chubaofs/util/ump" "sync" ) @@ -41,12 +42,14 @@ type Alarm struct { } func Warning(detail string) (a *Alarm) { - ump.Alarm(fmt.Sprintf("%v_%v_warning", clustername, modulename), detail) - if !enabled { + key := fmt.Sprintf("%v_%v_warning", clustername, modulename) + ump.Alarm(key, detail) + log.LogCriticalf(key, detail) + if !enabledPrometheus { return } a = AlarmPool.Get().(*Alarm) - a.name = metricsName(fmt.Sprintf("%s_%s_alarm", clustername, modulename)) + a.name = metricsName(key) a.Add(1) return } diff --git a/util/exporter/counter.go b/util/exporter/counter.go index 3d3b01936..20ae96d50 100644 --- a/util/exporter/counter.go +++ b/util/exporter/counter.go @@ -44,7 +44,7 @@ type Counter struct { } func NewCounter(name string) (c *Counter) { - if !enabled { + if !enabledPrometheus { return } c = CounterPool.Get().(*Counter) @@ -53,7 +53,7 @@ func NewCounter(name string) (c *Counter) { } func (c *Counter) Add(val int64) { - if !enabled { + if !enabledPrometheus { return } c.val = val @@ -68,7 +68,7 @@ func (c *Counter) publish() { } func (c *Counter) AddWithLabels(val int64, labels map[string]string) { - if !enabled { + if !enabledPrometheus { return } c.labels = labels diff --git a/util/exporter/exporter.go b/util/exporter/exporter.go index db61a8a2b..6e28498c6 100644 --- a/util/exporter/exporter.go +++ b/util/exporter/exporter.go @@ -35,11 +35,11 @@ const ( ) var ( - namespace string - clustername string - modulename string - enabled = false - replacer = strings.NewReplacer("-", "_", ".", "_", " ", "_", ",", "_") + namespace string + clustername string + modulename string + enabledPrometheus = false + replacer = strings.NewReplacer("-", "_", ".", "_", " ", "_", ",", "_") ) func metricsName(name string) string { @@ -55,7 +55,7 @@ func Init(cluster string, role string, cfg *config.Config) { log.LogInfof("exporter port not set") return } - enabled = true + enabledPrometheus = true http.Handle(PromHandlerPattern, promhttp.HandlerFor(prometheus.DefaultGatherer, promhttp.HandlerOpts{ Timeout: 5 * time.Second, })) @@ -82,7 +82,7 @@ func Init(cluster string, role string, cfg *config.Config) { } func collect() { - if !enabled { + if !enabledPrometheus { return } go collectCounter() diff --git a/util/exporter/gauge.go b/util/exporter/gauge.go index 742ff8289..2bc01752b 100644 --- a/util/exporter/gauge.go +++ b/util/exporter/gauge.go @@ -49,7 +49,7 @@ type Gauge struct { } func NewGauge(name string) (g *Gauge) { - if !enabled { + if !enabledPrometheus { return } g = GaugePool.Get().(*Gauge) @@ -85,7 +85,7 @@ func (c *Gauge) Metric() prometheus.Gauge { } func (g *Gauge) Set(val int64) { - if !enabled { + if !enabledPrometheus { return } g.val = val @@ -100,7 +100,7 @@ func (c *Gauge) publish() { } func (g *Gauge) SetWithLabels(val int64, labels map[string]string) { - if !enabled { + if !enabledPrometheus { return } g.labels = labels diff --git a/util/exporter/timepoint.go b/util/exporter/timepoint.go index 11e2157bb..975c4acb1 100644 --- a/util/exporter/timepoint.go +++ b/util/exporter/timepoint.go @@ -51,7 +51,7 @@ type TimePointCount struct { } func NewTP(name string) (tp *TimePoint) { - if !enabled { + if !enabledPrometheus { return } tp = TPPool.Get().(*TimePoint) @@ -61,7 +61,7 @@ func NewTP(name string) (tp *TimePoint) { } func (tp *TimePoint) Set() { - if !enabled { + if !enabledPrometheus { return } val := time.Since(tp.startTime).Nanoseconds() diff --git a/util/log/log.go b/util/log/log.go index 7be31e6af..98c1367d5 100644 --- a/util/log/log.go +++ b/util/log/log.go @@ -34,13 +34,14 @@ import ( type Level uint8 const ( - DebugLevel Level = 1 - InfoLevel = DebugLevel<<1 + 1 - WarnLevel = InfoLevel<<1 + 1 - ErrorLevel = WarnLevel<<1 + 1 - FatalLevel = ErrorLevel<<1 + 1 - ReadLevel = InfoLevel - UpdateLevel = InfoLevel + DebugLevel Level = 1 + InfoLevel = DebugLevel<<1 + 1 + WarnLevel = InfoLevel<<1 + 1 + ErrorLevel = WarnLevel<<1 + 1 + FatalLevel = ErrorLevel<<1 + 1 + CriticalLevel = FatalLevel << +1 + ReadLevel = InfoLevel + UpdateLevel = InfoLevel ) const ( @@ -60,6 +61,7 @@ var levelPrefixes = []string{ "[FATAL]", "[READ ]", "[WRITE]", + "[Critical]", } type RolledFile []os.FileInfo @@ -230,6 +232,7 @@ type Log struct { infoLogger *LogObject readLogger *LogObject updateLogger *LogObject + criticalLogger *LogObject level Level msgC chan string rotate *LogRotate @@ -237,12 +240,13 @@ type Log struct { } var ( - ErrLogFileName = "_error.log" - WarnLogFileName = "_warn.log" - InfoLogFileName = "_info.log" - DebugLogFileName = "_debug.log" - ReadLogFileName = "_read.log" - UpdateLogFileName = "_write.log" + ErrLogFileName = "_error.log" + WarnLogFileName = "_warn.log" + InfoLogFileName = "_info.log" + DebugLogFileName = "_debug.log" + ReadLogFileName = "_read.log" + UpdateLogFileName = "_write.log" + CriticalLogFileName = "_critical.log" ) var gLog *Log = nil @@ -297,8 +301,8 @@ func (l *Log) initLog(logDir, module string, level Level) error { return } var err error - logHandles := [...]**LogObject{&l.debugLogger, &l.infoLogger, &l.warnLogger, &l.errorLogger, &l.readLogger, &l.updateLogger} - logNames := [...]string{DebugLogFileName, InfoLogFileName, WarnLogFileName, ErrLogFileName, ReadLogFileName, UpdateLogFileName} + logHandles := [...]**LogObject{&l.debugLogger, &l.infoLogger, &l.warnLogger, &l.errorLogger, &l.readLogger, &l.updateLogger, &l.criticalLogger} + logNames := [...]string{DebugLogFileName, InfoLogFileName, WarnLogFileName, ErrLogFileName, ReadLogFileName, UpdateLogFileName, CriticalLogFileName} for i := range logHandles { if *logHandles[i], err = newLog(logNames[i]); err != nil { return err @@ -334,6 +338,7 @@ func (l *Log) Flush() { l.errorLogger, l.readLogger, l.updateLogger, + l.criticalLogger, } for _, logger := range loggers { if logger != nil { @@ -451,9 +456,6 @@ func LogFatal(v ...interface{}) { if gLog == nil { return } - if FatalLevel&gLog.level != gLog.level { - return - } s := fmt.Sprintln(v...) s = gLog.SetPrefix(s, levelPrefixes[4]) gLog.errorLogger.Output(2, s) @@ -465,15 +467,32 @@ func LogFatalf(format string, v ...interface{}) { if gLog == nil { return } - if FatalLevel&gLog.level != gLog.level { - return - } s := fmt.Sprintf(format, v...) s = gLog.SetPrefix(s, levelPrefixes[4]) gLog.errorLogger.Output(2, s) os.Exit(1) } +// LogFatal logs the fatal errors. +func LogCritical(v ...interface{}) { + if gLog == nil { + return + } + s := fmt.Sprintln(v...) + s = gLog.SetPrefix(s, levelPrefixes[4]) + gLog.criticalLogger.Output(2, s) +} + +// LogFatalf logs the fatal errors with specified format. +func LogCriticalf(format string, v ...interface{}) { + if gLog == nil { + return + } + s := fmt.Sprintf(format, v...) + s = gLog.SetPrefix(s, levelPrefixes[4]) + gLog.criticalLogger.Output(2, s) +} + // LogRead func LogRead(v ...interface{}) { if gLog == nil { diff --git a/util/ump/ump.go b/util/ump/ump.go index 2a6be2804..711ced625 100644 --- a/util/ump/ump.go +++ b/util/ump/ump.go @@ -15,6 +15,7 @@ package ump import ( + "os" "runtime" "strconv" "sync" @@ -54,12 +55,20 @@ var ( FunctionTpPool = &sync.Pool{New: func() interface{} { return new(FunctionTp) }} + enableUmp = true ) func InitUmp(module, dataDir string) (err error) { runtime.GOMAXPROCS(runtime.NumCPU()) - if err := initLogName(module, dataDir); err != nil { - return err + if _, err = os.Stat(dataDir); err != nil { + enableUmp = false + err=nil + return + } + if err = initLogName(module, dataDir); err != nil { + enableUmp = false + err=nil + return } backGroudWrite() @@ -67,6 +76,9 @@ func InitUmp(module, dataDir string) (err error) { } func BeforeTP(key string) (o *TpObject) { + if !enableUmp { + return + } o = TpObjectPool.Get().(*TpObject) o.StartTime = time.Now() tp := FunctionTpPool.Get().(*FunctionTp) @@ -80,6 +92,9 @@ func BeforeTP(key string) (o *TpObject) { } func AfterTP(o *TpObject, err error) { + if !enableUmp { + return + } tp := o.UmpType.(*FunctionTp) tp.ElapsedTime = strconv.FormatInt((int64)(time.Since(o.StartTime)/1e6), 10) TpObjectPool.Put(o) @@ -96,6 +111,9 @@ func AfterTP(o *TpObject, err error) { } func Alive(key string) { + if !enableUmp { + return + } alive := SystemAlivePool.Get().(*SystemAlive) alive.HostName = HostName alive.Key = key @@ -108,6 +126,9 @@ func Alive(key string) { } func Alarm(key, detail string) { + if !enableUmp { + return + } alarm := AlarmPool.Get().(*BusinessAlarm) alarm.Time = time.Now().Format(LogTimeForMat) alarm.Key = key diff --git a/vendor/github.com/tiglabs/raft/.gitignore b/vendor/github.com/tiglabs/raft/.gitignore deleted file mode 100644 index daf913b1b..000000000 --- a/vendor/github.com/tiglabs/raft/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe -*.test -*.prof