// pushTxn attempts to abort the txn via push. The wait group is signaled on // completion. func pushTxn( ctx context.Context, db *client.DB, now hlc.Timestamp, txn *roachpb.Transaction, typ roachpb.PushTxnType, ) { // Attempt to push the transaction which created the intent. pushArgs := &roachpb.PushTxnRequest{ Span: roachpb.Span{ Key: txn.Key, }, Now: now, PusherTxn: roachpb.Transaction{TxnMeta: enginepb.TxnMeta{Priority: math.MaxInt32}}, PusheeTxn: txn.TxnMeta, PushType: typ, } b := &client.Batch{} b.AddRawRequest(pushArgs) if err := db.Run(ctx, b); err != nil { log.Warningf(ctx, "push of txn %s failed: %s", txn, err) return } br := b.RawResponse() // Update the supplied txn on successful push. *txn = br.Responses[0].GetInner().(*roachpb.PushTxnResponse).PusheeTxn }
// pruneTimeSeries will prune data for the supplied set of time series. Time // series series are identified by name and resolution. // // For each time series supplied, the pruning operation will delete all data // older than a constant threshold. The threshold is different depending on the // resolution; typically, lower-resolution time series data will be retained for // a longer period. // // If data is stored at a resolution which is not known to the system, it is // assumed that the resolution has been deprecated and all data for that time // series at that resolution will be deleted. // // As range deletion of inline data is an idempotent operation, it is safe to // run this operation concurrently on multiple nodes at the same time. func pruneTimeSeries( ctx context.Context, db *client.DB, timeSeriesList []timeSeriesResolutionInfo, now hlc.Timestamp, ) error { thresholds := computeThresholds(now.WallTime) for _, timeSeries := range timeSeriesList { // Time series data for a specific resolution falls in a contiguous key // range, and can be deleted with a DelRange command. // The start key is the prefix unique to this name/resolution pair. start := makeDataKeySeriesPrefix(timeSeries.Name, timeSeries.Resolution) // The end key can be created by generating a time series key with the // threshold timestamp for the resolution. If the resolution is not // supported, the start key's PrefixEnd is used instead (which will clear // the time series entirely). var end roachpb.Key threshold, ok := thresholds[timeSeries.Resolution] if ok { end = MakeDataKey(timeSeries.Name, "", timeSeries.Resolution, threshold) } else { end = start.PrefixEnd() } // TODO(mrtracy): There is no reason not to execute the individual // deletes in parallel, although the best way to do that is not clear. // See the RFC PR #9343 for details. b := &client.Batch{} b.AddRawRequest(&roachpb.DeleteRangeRequest{ Span: roachpb.Span{ Key: start, EndKey: end, }, Inline: true, }) if err := db.Run(ctx, b); err != nil { return err } } return nil }
// pruneTimeSeries will prune data for the supplied set of time series. Time // series series are identified by name and resolution. // // For each time series supplied, the pruning operation will delete all data // older than a constant threshold. The threshold is different depending on the // resolution; typically, lower-resolution time series data will be retained for // a longer period. // // If data is stored at a resolution which is not known to the system, it is // assumed that the resolution has been deprecated and all data for that time // series at that resolution will be deleted. // // As range deletion of inline data is an idempotent operation, it is safe to // run this operation concurrently on multiple nodes at the same time. func pruneTimeSeries( ctx context.Context, db *client.DB, timeSeriesList []timeSeriesResolutionInfo, now hlc.Timestamp, ) error { thresholds := computeThresholds(now.WallTime) b := &client.Batch{} for _, timeSeries := range timeSeriesList { // Time series data for a specific resolution falls in a contiguous key // range, and can be deleted with a DelRange command. // The start key is the prefix unique to this name/resolution pair. start := makeDataKeySeriesPrefix(timeSeries.Name, timeSeries.Resolution) // The end key can be created by generating a time series key with the // threshold timestamp for the resolution. If the resolution is not // supported, the start key's PrefixEnd is used instead (which will clear // the time series entirely). var end roachpb.Key threshold, ok := thresholds[timeSeries.Resolution] if ok { end = MakeDataKey(timeSeries.Name, "", timeSeries.Resolution, threshold) } else { end = start.PrefixEnd() } b.AddRawRequest(&roachpb.DeleteRangeRequest{ Span: roachpb.Span{ Key: start, EndKey: end, }, Inline: true, }) } return db.Run(ctx, b) }